@nodeset/contracts
Version:
Protocol for accessing NodeSet's Constellation Ethereum staking network
105 lines (91 loc) • 4.15 kB
JavaScript
import {
RocketDAOProtocolSettingsDeposit,
RocketMinipoolQueue,
RocketDAOProtocolSettingsMinipool,
RocketVault,
RocketDepositPool,
} from '../_utils/artifacts';
// Assign deposits to minipools
export async function assignDeposits(txOptions) {
// Load contracts
const [
rocketDepositPool,
rocketDAOProtocolSettingsDeposit,
rocketMinipoolQueue,
rocketDAOProtocolSettingsMinipool,
rocketVault,
] = await Promise.all([
RocketDepositPool.deployed(),
RocketDAOProtocolSettingsDeposit.deployed(),
RocketMinipoolQueue.deployed(),
RocketDAOProtocolSettingsMinipool.deployed(),
RocketVault.deployed(),
]);
// Get parameters
let [
depositPoolBalance,
maxDepositAssignments,
fullMinipoolQueueLength, halfMinipoolQueueLength, emptyMinipoolQueueLength,
fullDepositUserAmount, halfDepositUserAmount, emptyDepositUserAmount,
] = await Promise.all([
rocketDepositPool.getBalance.call(),
rocketDAOProtocolSettingsDeposit.getMaximumDepositAssignments.call(),
rocketMinipoolQueue.getLength.call(1), rocketMinipoolQueue.getLength.call(2), rocketMinipoolQueue.getLength.call(3),
rocketDAOProtocolSettingsMinipool.getDepositUserAmount(1), rocketDAOProtocolSettingsMinipool.getDepositUserAmount(2), rocketDAOProtocolSettingsMinipool.getDepositUserAmount(3),
]);
// Get queued minipool capacities
let minipoolCapacities = [];
for (let i = 0; i < halfMinipoolQueueLength; ++i) minipoolCapacities.push(halfDepositUserAmount);
for (let i = 0; i < fullMinipoolQueueLength; ++i) minipoolCapacities.push(fullDepositUserAmount);
for (let i = 0; i < emptyMinipoolQueueLength; ++i) minipoolCapacities.push(emptyDepositUserAmount);
// Get expected deposit assignment parameters
let expectedDepositAssignments = 0;
let expectedEthAssigned = '0'.BN;
let depositBalanceRemaining = depositPoolBalance;
let depositAssignmentsRemaining = maxDepositAssignments;
while (minipoolCapacities.length > 0 && depositBalanceRemaining.gte(minipoolCapacities[0]) && depositAssignmentsRemaining > 0) {
let capacity = minipoolCapacities.shift();
++expectedDepositAssignments;
expectedEthAssigned = expectedEthAssigned.add(capacity);
depositBalanceRemaining = depositBalanceRemaining.sub(capacity);
--depositAssignmentsRemaining;
}
// Get balances
function getBalances() {
return Promise.all([
rocketDepositPool.getBalance.call(),
web3.eth.getBalance(rocketVault.address).then(value => value.BN),
]).then(
([depositPoolEth, vaultEth]) =>
({depositPoolEth, vaultEth})
);
}
// Get minipool queue details
function getMinipoolQueueDetails() {
return Promise.all([
rocketMinipoolQueue.getTotalLength.call(),
rocketMinipoolQueue.getTotalCapacity.call(),
]).then(
([totalLength, totalCapacity]) =>
({totalLength, totalCapacity})
);
}
// Get initial balances & minipool queue details
let [balances1, queue1] = await Promise.all([
getBalances(),
getMinipoolQueueDetails(),
]);
// Assign deposits
await rocketDepositPool.assignDeposits(txOptions);
// Get updated balances & minipool queue details
let [balances2, queue2] = await Promise.all([
getBalances(),
getMinipoolQueueDetails(),
]);
// Check balances
assertBN.equal(balances2.depositPoolEth, balances1.depositPoolEth.sub(expectedEthAssigned), 'Incorrect updated deposit pool ETH balance');
assertBN.equal(balances2.vaultEth, balances1.vaultEth.sub(expectedEthAssigned), 'Incorrect updated vault ETH balance');
// Check minipool queues
assertBN.equal(queue2.totalLength, queue1.totalLength.sub(expectedDepositAssignments.BN), 'Incorrect updated minipool queue length');
assertBN.equal(queue2.totalCapacity, queue1.totalCapacity.sub(expectedEthAssigned), 'Incorrect updated minipool queue capacity');
}