UNPKG

@chorus-one/ethereum

Version:

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

80 lines (79 loc) 2.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildUnstakeTx = void 0; const viem_1 = require("viem"); const keeperAbi_1 = require("../contracts/keeperAbi"); const vaultAbi_1 = require("../contracts/vaultAbi"); const getHarvestParams_1 = require("../utils/getHarvestParams"); async function buildUnstakeTx(request) { const { userAccount, connector, vault, amount } = request; const isCollateralized = await connector.eth.readContract({ abi: keeperAbi_1.keeperABI, address: connector.keeper, functionName: 'isCollateralized', args: [vault] }); const shares = await connector.eth.readContract({ abi: vaultAbi_1.VaultABI, address: vault, functionName: 'convertToShares', args: [amount] }); let tx; if (isCollateralized) { // This branch of logic is invoked when the stake locked in vault // is collateralized in form of beacon chain validators const canHarvest = await connector.eth.readContract({ abi: keeperAbi_1.keeperABI, address: connector.keeper, functionName: 'canHarvest', args: [vault] }); if (canHarvest) { const harvestParams = await (0, getHarvestParams_1.getHarvestParams)(connector, vault); const updateStateTx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'updateState', args: [ { proof: harvestParams.proof, rewardsRoot: harvestParams.rewardsRoot, reward: harvestParams.reward, unlockedMevReward: harvestParams.unlockedMevReward } ] }); const enterExitQueueTx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'enterExitQueue', args: [shares, userAccount] }); tx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'multicall', args: [[updateStateTx, enterExitQueueTx]] }); } else { tx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'enterExitQueue', args: [shares, userAccount] }); } } else { // This branch of logic is invoked when the stake locked in vault // does not actually power any validators tx = (0, viem_1.encodeFunctionData)({ abi: vaultAbi_1.VaultABI, functionName: 'redeem', args: [shares, userAccount] }); } return { to: vault, data: tx }; } exports.buildUnstakeTx = buildUnstakeTx;