UNPKG

@chorus-one/ethereum

Version:

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

59 lines (58 loc) 2.05 kB
import { encodeFunctionData } from 'viem'; import { VaultABI } from '../contracts/vaultAbi'; import { getUnstakeQueue } from './getUnstakeQueue'; export async function buildWithdrawTx(request) { const { userAccount, connector, vault, positionTickets } = request; const queueItems = await getUnstakeQueue({ connector, userAccount, vault }); if (positionTickets && positionTickets.length === 1) { const item = queueItems.find((item) => item.positionTicket.toString() === positionTickets[0]); if (!item || !item.isWithdrawable || item.exitQueueIndex === undefined) { throw new Error(`Position #${positionTickets[0]} is not withdrawable`); } const tx = encodeFunctionData({ abi: VaultABI, functionName: 'claimExitedAssets', args: [item.positionTicket, BigInt(item.timestamp / 1000), item.exitQueueIndex] }); return { to: vault, data: tx }; } const multicallArgs = queueItems .filter((item) => { if (!positionTickets) return item.isWithdrawable; return positionTickets.includes(item.positionTicket.toString()); }) .map((item) => { const timestamp = item.timestamp / 1000; if (item.exitQueueIndex === undefined) { throw new Error('Exit queue index is missing'); } if (!item.isWithdrawable) { throw new Error(`Position #${item.positionTicket} is not withdrawable`); } return encodeFunctionData({ abi: VaultABI, functionName: 'claimExitedAssets', args: [item.positionTicket, BigInt(timestamp), item.exitQueueIndex] }); }); if (!multicallArgs.length) { throw new Error('No withdrawable positions found'); } const tx = encodeFunctionData({ abi: VaultABI, functionName: 'multicall', args: [multicallArgs] }); return { to: vault, data: tx }; }