UNPKG

@moonwell-fi/moonwell-sdk

Version:

TypeScript Interface for Moonwell

140 lines (123 loc) 4.51 kB
import { type Address, zeroAddress } from "viem"; import type { MoonwellClient } from "../../client/createMoonwellClient.js"; import { Amount, getEnvironmentsFromArgs } from "../../common/index.js"; import type { OptionalNetworkParameterType } from "../../common/types.js"; import type { Chain, GovernanceToken } from "../../environments/index.js"; import type { UserVotingPowers } from "../../types/userVotingPowers.js"; export type GetUserVotingPowersParameters< environments, network extends Chain | undefined, > = OptionalNetworkParameterType<environments, network> & { /** Governance token */ governanceToken: GovernanceToken; /** User address*/ userAddress: Address; }; export type GetUserVotingPowersReturnType = Promise<UserVotingPowers[]>; export async function getUserVotingPowers< environments, Network extends Chain | undefined, >( client: MoonwellClient, args: GetUserVotingPowersParameters<environments, Network>, ): GetUserVotingPowersReturnType { const { governanceToken, userAddress } = args; const environments = getEnvironmentsFromArgs(client, args); const tokenEnvironments = environments.filter( (env) => env.custom?.governance?.token === governanceToken, ); const environmentsUserVotingPowers = await Promise.all( tokenEnvironments.map((environment) => environment.contracts.views?.read.getUserVotingPower([userAddress]), ), ); return tokenEnvironments.map((environment, index) => { const votingPowers = environmentsUserVotingPowers[index]!; return { chainId: environment.chainId, //Claims balances claimsDelegates: votingPowers.claimsVotes.delegates, claimsBalance: new Amount(votingPowers.claimsVotes.votingPower, 18), claimsDelegated: new Amount( votingPowers.claimsVotes.delegatedVotingPower, 18, ), claimsDelegatedOthers: new Amount( votingPowers.claimsVotes.delegatedVotingPower - (votingPowers.claimsVotes.delegates === userAddress ? votingPowers.claimsVotes.votingPower : 0n), 18, ), claimsDelegatedSelf: new Amount( votingPowers.claimsVotes.delegates === userAddress ? votingPowers.claimsVotes.votingPower : 0n, 18, ), claimsUndelegated: new Amount( votingPowers.claimsVotes.delegates === zeroAddress ? votingPowers.claimsVotes.votingPower : 0n, 18, ), //Token balances tokenDelegates: votingPowers.tokenVotes.delegates, tokenBalance: new Amount(votingPowers.tokenVotes.votingPower, 18), tokenDelegated: new Amount( votingPowers.tokenVotes.delegatedVotingPower, 18, ), tokenDelegatedOthers: new Amount( votingPowers.tokenVotes.delegatedVotingPower - (votingPowers.tokenVotes.delegates === userAddress ? votingPowers.tokenVotes.votingPower : 0n), 18, ), tokenDelegatedSelf: new Amount( votingPowers.tokenVotes.delegates === userAddress ? votingPowers.tokenVotes.votingPower : 0n, 18, ), tokenUndelegated: new Amount( votingPowers.tokenVotes.delegates === zeroAddress ? votingPowers.tokenVotes.votingPower : 0n, 18, ), stakingDelegated: new Amount( votingPowers.stakingVotes.delegatedVotingPower, 18, ), totalDelegated: new Amount( votingPowers.claimsVotes.delegatedVotingPower + votingPowers.tokenVotes.delegatedVotingPower + votingPowers.stakingVotes.delegatedVotingPower, 18, ), totalDelegatedOthers: new Amount( votingPowers.claimsVotes.delegatedVotingPower - (votingPowers.claimsVotes.delegates === userAddress ? votingPowers.claimsVotes.votingPower : 0n) + (votingPowers.tokenVotes.delegatedVotingPower - (votingPowers.tokenVotes.delegates === userAddress ? votingPowers.tokenVotes.votingPower : 0n)), 18, ), totalDelegatedSelf: new Amount( (votingPowers.claimsVotes.delegates === userAddress ? votingPowers.claimsVotes.votingPower : 0n) + (votingPowers.tokenVotes.delegates === userAddress ? votingPowers.tokenVotes.votingPower : 0n) + votingPowers.stakingVotes.delegatedVotingPower, 18, ), }; }); }