@moonwell-fi/moonwell-sdk
Version:
TypeScript Interface for Moonwell
64 lines • 3.31 kB
JavaScript
import { base } from "viem/chains";
import { Amount, getEnvironmentsFromArgs } from "../../common/index.js";
import { publicEnvironments, } from "../../environments/index.js";
export async function getUserStakingInfo(client, args) {
const { userAddress } = args;
const environments = getEnvironmentsFromArgs(client, args);
const envsWithStaking = environments.filter((env) => env.contracts.stakingToken);
const envStakingInfo = await Promise.all(envsWithStaking.map((environment) => {
const homeEnvironment = Object.values(publicEnvironments).find((e) => e.custom?.governance?.chainIds?.includes(environment.chainId)) || environment;
const isBase = environment.chainId === base.id;
const promises = [
environment.contracts.views?.read.getUserStakingInfo([userAddress]),
environment.contracts.governanceToken?.read.balanceOf([userAddress]),
homeEnvironment.contracts.views?.read.getGovernanceTokenPrice(),
environment.contracts.views?.read.getStakingInfo(),
...(isBase
? [
environment.contracts.views?.read.getUserStakingInfo([userAddress], {
blockNumber: BigInt(34149941),
}),
]
: []),
];
return Promise.all(promises);
}));
const result = envsWithStaking.flatMap((curr, index) => {
const token = curr.config.tokens[curr.config.contracts.governanceToken];
const stakingToken = curr.config.tokens[curr.config.contracts.stakingToken];
const userStakingInfoData = envStakingInfo[index][0];
const { cooldown, pendingRewards, totalStaked } = userStakingInfoData;
// Pending rewards before the X28 proposal (only for base)
const isBase = curr.chainId === base.id;
const pendingRewardsBeforeX28Proposal = isBase
? envStakingInfo[index][4]
?.pendingRewards || 0n
: 0n;
const tokenBalance = envStakingInfo[index][1];
const governanceTokenPriceRaw = envStakingInfo[index]?.[2];
const stakingInfoData = envStakingInfo[index]?.[3];
const { cooldown: cooldownSeconds, unstakeWindow } = stakingInfoData;
const cooldownEnding = cooldown > 0n ? cooldown + cooldownSeconds : 0n;
const unstakingEnding = cooldown > 0n ? cooldown + cooldownSeconds + unstakeWindow : 0n;
const governanceTokenPrice = new Amount(governanceTokenPriceRaw, 18);
const userStakingInfo = {
chainId: curr.chainId,
cooldownActive: cooldown > 0n,
cooldownStart: Number(cooldown),
cooldownEnding: Number(cooldownEnding),
unstakingStart: Number(cooldownEnding),
unstakingEnding: Number(unstakingEnding),
pendingRewards: isBase
? new Amount(pendingRewardsBeforeX28Proposal, 18)
: new Amount(pendingRewards, 18),
token,
tokenBalance: new Amount(tokenBalance, 18),
tokenPrice: governanceTokenPrice.value,
stakingToken,
stakingTokenBalance: new Amount(totalStaked, 18),
};
return userStakingInfo;
});
return result;
}
//# sourceMappingURL=getUserStakingInfo.js.map