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