UNPKG

@chorus-one/ethereum

Version:

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

63 lines (62 loc) 2.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildWithdrawTx = void 0; const viem_1 = require("viem"); const vaultAbi_1 = require("../contracts/vaultAbi"); const getUnstakeQueue_1 = require("./getUnstakeQueue"); async function buildWithdrawTx(request) { const { userAccount, connector, vault, positionTickets } = request; const queueItems = await (0, getUnstakeQueue_1.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 = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.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 (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'claimExitedAssets', args: [item.positionTicket, BigInt(timestamp), item.exitQueueIndex] }); }); if (!multicallArgs.length) { throw new Error('No withdrawable positions found'); } const tx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'multicall', args: [multicallArgs] }); return { to: vault, data: tx }; } exports.buildWithdrawTx = buildWithdrawTx;