@nodeset/contracts
Version:
Protocol for accessing NodeSet's Constellation Ethereum staking network
104 lines (85 loc) • 3.54 kB
JavaScript
import { RocketDAONodeTrusted, RocketNetworkPrices, RocketStorage } from '../_utils/artifacts';
import { assertBN } from '../_helpers/bn';
// Submit network prices
export async function submitPrices(block, rplPrice, txOptions) {
// Load contracts
const [
rocketDAONodeTrusted,
rocketNetworkPrices,
rocketStorage,
] = await Promise.all([
RocketDAONodeTrusted.deployed(),
RocketNetworkPrices.deployed(),
RocketStorage.deployed(),
]);
// Get parameters
let trustedNodeCount = await rocketDAONodeTrusted.getMemberCount.call();
// Get submission keys
let nodeSubmissionKey = web3.utils.soliditySha3('network.prices.submitted.node.key', txOptions.from, block, rplPrice);
let submissionCountKey = web3.utils.soliditySha3('network.prices.submitted.count', block, rplPrice);
// Get submission details
function getSubmissionDetails() {
return Promise.all([
rocketStorage.getBool.call(nodeSubmissionKey),
rocketStorage.getUint.call(submissionCountKey),
]).then(
([nodeSubmitted, count]) =>
({nodeSubmitted, count})
);
}
// Get prices
function getPrices() {
return Promise.all([
rocketNetworkPrices.getPricesBlock.call(),
rocketNetworkPrices.getRPLPrice.call(),
]).then(
([block, rplPrice]) =>
({block, rplPrice})
);
}
// Get initial submission details
let submission1 = await getSubmissionDetails();
// Submit prices
await rocketNetworkPrices.submitPrices(block, rplPrice, txOptions);
// Get updated submission details & prices
let [submission2, prices] = await Promise.all([
getSubmissionDetails(),
getPrices(),
]);
// Check if prices should be updated
let expectUpdatedPrices = submission2.count.mul('2'.BN).gt(trustedNodeCount);
// Check submission details
assert.isFalse(submission1.nodeSubmitted, 'Incorrect initial node submitted status');
assert.isTrue(submission2.nodeSubmitted, 'Incorrect updated node submitted status');
assertBN.equal(submission2.count, submission1.count.add('1'.BN), 'Incorrect updated submission count');
// Check prices
if (expectUpdatedPrices) {
assertBN.equal(prices.block, block, 'Incorrect updated network prices block');
assertBN.equal(prices.rplPrice, rplPrice, 'Incorrect updated network RPL price');
} else {
assertBN.notEqual(prices.block, block, 'Incorrectly updated network prices block');
assertBN.notEqual(prices.rplPrice, rplPrice, 'Incorrectly updated network RPL price');
}
}
// Execute price update
export async function executeUpdatePrices(block, rplPrice, txOptions) {
// Load contracts
const rocketNetworkPrices = await RocketNetworkPrices.deployed();
// Get prices
function getPrices() {
return Promise.all([
rocketNetworkPrices.getPricesBlock.call(),
rocketNetworkPrices.getRPLPrice.call(),
]).then(
([block, rplPrice]) =>
({block, rplPrice})
);
}
// Submit prices
await rocketNetworkPrices.executeUpdatePrices(block, rplPrice, txOptions);
// Get updated submission details & prices
let prices = await getPrices();
// Check the prices
assertBN.equal(prices.block, block, 'Incorrect updated network prices block');
assertBN.equal(prices.rplPrice, rplPrice, 'Incorrect updated network RPL price');
}