@nodeset/contracts
Version:
Protocol for accessing NodeSet's Constellation Ethereum staking network
109 lines (95 loc) • 4.7 kB
JavaScript
import { RocketMinipoolManager, RocketDAOProtocolSettingsMinipool, RocketNetworkPrices, RocketDAOProtocolSettingsNode, RocketNodeStaking, RocketTokenRPL, RocketVault } from '../_utils/artifacts';
import { assertBN } from '../_helpers/bn';
// Withdraw RPL staked against the node
export async function withdrawRpl(amount, txOptions) {
// Load contracts
const [
rocketMinipoolManager,
rocketDAOProtocolSettingsMinipool,
rocketNetworkPrices,
rocketDAOProtocolSettingsNode,
rocketNodeStaking,
rocketTokenRPL,
rocketVault,
] = await Promise.all([
RocketMinipoolManager.deployed(),
RocketDAOProtocolSettingsMinipool.deployed(),
RocketNetworkPrices.deployed(),
RocketDAOProtocolSettingsNode.deployed(),
RocketNodeStaking.deployed(),
RocketTokenRPL.deployed(),
RocketVault.deployed(),
]);
// Get parameters
const [
depositUserAmount,
minPerMinipoolStake,
maxPerMinipoolStake,
rplPrice,
] = await Promise.all([
rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount.call(),
rocketDAOProtocolSettingsNode.getMinimumPerMinipoolStake.call(),
rocketDAOProtocolSettingsNode.getMaximumPerMinipoolStake.call(),
rocketNetworkPrices.getRPLPrice.call(),
]);
// Get token balances
function getTokenBalances(nodeAddress) {
return Promise.all([
rocketTokenRPL.balanceOf.call(nodeAddress),
rocketTokenRPL.balanceOf.call(rocketVault.address),
rocketVault.balanceOfToken.call('rocketNodeStaking', rocketTokenRPL.address),
]).then(
([nodeRpl, vaultRpl, stakingRpl]) =>
({nodeRpl, vaultRpl, stakingRpl})
);
}
// Get staking details
function getStakingDetails(nodeAddress) {
return Promise.all([
rocketNodeStaking.getTotalRPLStake.call(),
rocketNodeStaking.getNodeRPLStake.call(nodeAddress),
rocketNodeStaking.getNodeEffectiveRPLStake.call(nodeAddress),
rocketNodeStaking.getNodeETHMatched.call(nodeAddress),
rocketNodeStaking.getNodeETHMatchedLimit.call(nodeAddress),
]).then(
([totalStake, nodeStake, nodeEffectiveStake, nodeEthMatched, nodeEthMatchedLimit]) =>
({totalStake, nodeStake, nodeEffectiveStake, nodeEthMatched, nodeEthMatchedLimit})
);
}
// Get minipool counts
function getMinipoolCounts(nodeAddress) {
return Promise.all([
rocketMinipoolManager.getMinipoolCount.call(),
rocketMinipoolManager.getNodeMinipoolCount.call(nodeAddress),
]).then(
([total, node]) =>
({total, node})
);
}
// Get initial token balances & staking details
let [balances1, details1] = await Promise.all([
getTokenBalances(txOptions.from),
getStakingDetails(txOptions.from),
]);
// Withdraw RPL
await rocketNodeStaking.withdrawRPL(amount, txOptions);
// Get updated token balances, staking details & minipool counts
let [balances2, details2, minipoolCounts] = await Promise.all([
getTokenBalances(txOptions.from),
getStakingDetails(txOptions.from),
getMinipoolCounts(txOptions.from),
]);
// Calculate expected effective stakes & node minipool limit
const maxNodeEffectiveStake = details2.nodeEthMatched.mul(maxPerMinipoolStake).div(rplPrice);
const expectedNodeEffectiveStake = (details2.nodeStake.lt(maxNodeEffectiveStake)? details2.nodeStake : maxNodeEffectiveStake);
const expectedNodeEthMatchedLimit = details2.nodeStake.mul(rplPrice).div(minPerMinipoolStake);
// Check token balances
assertBN.equal(balances2.nodeRpl, balances1.nodeRpl.add(web3.utils.toBN(amount)), 'Incorrect updated node RPL balance');
assertBN.equal(balances2.vaultRpl, balances1.vaultRpl.sub(web3.utils.toBN(amount)), 'Incorrect updated vault RPL balance');
assertBN.equal(balances2.stakingRpl, balances1.stakingRpl.sub(web3.utils.toBN(amount)), 'Incorrect updated RocketNodeStaking contract RPL vault balance');
// Check staking details
assertBN.equal(details2.totalStake, details1.totalStake.sub(web3.utils.toBN(amount)), 'Incorrect updated total RPL stake');
assertBN.equal(details2.nodeStake, details1.nodeStake.sub(web3.utils.toBN(amount)), 'Incorrect updated node RPL stake');
assertBN.equal(details2.nodeEffectiveStake, expectedNodeEffectiveStake, 'Incorrect updated effective node RPL stake');
assertBN.equal(details2.nodeEthMatchedLimit, expectedNodeEthMatchedLimit, 'Incorrect updated node minipool limit');
}