UNPKG

@chorus-one/ethereum

Version:

All-in-one toolkit for building staking dApps on Ethereum network

42 lines (38 loc) 1.34 kB
import { Hex, parseEther } from 'viem' import { MintTokenControllerAbi } from '../contracts/mintCotrollerAbi' import { StakewiseConnector } from '../connector' import { getBaseData } from '../utils/getBaseData' import { getStake } from './getStake' import { getMint } from './getMint' export const getMaxUnstake = async (params: { connector: StakewiseConnector userAccount: Hex vault: Hex }): Promise<bigint> => { const { connector, vault, userAccount } = params const min = parseEther('0.00001') const { ltvPercent } = await getBaseData(connector, vault) const { assets } = await getStake({ connector, userAccount, vaultAddress: vault }) const { minted } = await getMint({ connector, userAccount, vaultAddress: vault }) if (ltvPercent <= 0 || assets < min) { return 0n } const avgRewardPerSecond = (await connector.eth.readContract({ abi: MintTokenControllerAbi, functionName: 'avgRewardPerSecond', address: connector.mintTokenController })) as bigint const secondsInHour = 60n * 60n const gap = (avgRewardPerSecond * secondsInHour * minted.assets) / 1000000000000000000n const lockedAssets = ((minted.assets + gap) * 1000000000000000000n) / ltvPercent const maxWithdrawAssets = assets - lockedAssets return maxWithdrawAssets > min ? maxWithdrawAssets : 0n }