@nodeset/contracts
Version:
Protocol for accessing NodeSet's Constellation Ethereum staking network
101 lines (82 loc) • 3.85 kB
JavaScript
import { printTitle } from '../_utils/formatting';
import { shouldRevert } from '../_utils/testing';
import { nodeStakeRPL, registerNode, setNodeTrusted } from '../_helpers/node';
import {
RocketDAONodeTrustedSettingsProposals,
RocketMinipoolPenalty
} from '../_utils/artifacts';
import { setDAONodeTrustedBootstrapSetting } from '../dao/scenario-dao-node-trusted-bootstrap'
import { createMinipool, getMinipoolMinimumRPLStake } from '../_helpers/minipool';
import { submitPenalty } from './scenario-submit-penalties';
import { mintRPL } from '../_helpers/tokens';
import { userDeposit } from '../_helpers/deposit';
export default function() {
contract('RocketNetworkPenalties', async (accounts) => {
// Accounts
const [
owner,
node,
trustedNode1,
trustedNode2,
trustedNode3,
trustedNode4,
random
] = accounts;
let minipool;
// Constants
let proposalCooldown = 10;
let proposalVoteBlocks = 10;
// Setup
before(async () => {
// Register node
await registerNode({from: node});
// Register trusted nodes
await registerNode({from: trustedNode1});
await registerNode({from: trustedNode2});
await registerNode({from: trustedNode3});
await setNodeTrusted(trustedNode1, 'saas_1', 'node@home.com', owner);
await setNodeTrusted(trustedNode2, 'saas_2', 'node@home.com', owner);
await setNodeTrusted(trustedNode3, 'saas_3', 'node@home.com', owner);
// Set a small proposal cooldown
await setDAONodeTrustedBootstrapSetting(RocketDAONodeTrustedSettingsProposals, 'proposal.cooldown', proposalCooldown, { from: owner });
await setDAONodeTrustedBootstrapSetting(RocketDAONodeTrustedSettingsProposals, 'proposal.vote.blocks', proposalVoteBlocks, { from: owner });
// Set a small vote delay
await setDAONodeTrustedBootstrapSetting(RocketDAONodeTrustedSettingsProposals, 'proposal.vote.delay.blocks', 4, { from: owner });
// Set max penalty rate
let rocketMinipoolPenalty = await RocketMinipoolPenalty.deployed();
rocketMinipoolPenalty.setMaxPenaltyRate('1'.ether, {from: owner})
// Stake RPL to cover minipools
let minipoolRplStake = await getMinipoolMinimumRPLStake();
let rplStake = minipoolRplStake.mul('1'.BN);
await mintRPL(owner, node, rplStake);
await nodeStakeRPL(rplStake, {from: node});
// Create a minipool
await userDeposit({from: random, value: '16'.ether})
minipool = await createMinipool({from: node, value: '16'.ether}, 0);
});
it(printTitle('trusted nodes', 'can submit penalties'), async () => {
// Set parameters
let minipoolAddress = minipool.address;
for (let block = 1; block < 5; block++) {
await submitPenalty(minipoolAddress, block, {
from: trustedNode1,
});
await submitPenalty(minipoolAddress, block, {
from: trustedNode2,
});
await submitPenalty(minipoolAddress, block, {
from: trustedNode3,
});
}
});
it(printTitle('node operator', 'cannot submit penalties'), async () => {
// Set parameters
let block = 1;
let minipoolAddress = minipool.address;
// Submit different balances
await shouldRevert(submitPenalty(minipoolAddress, block, {
from: node,
}), 'Was able to submit penalty', 'Invalid trusted node');
});
});
}