@chorus-one/ethereum
Version:
All-in-one toolkit for building staking dApps on Ethereum network
63 lines (62 loc) • 2.28 kB
JavaScript
;
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;