@consensys-software/permissioning-smart-contracts
Version:
Smart contracts and dapp implementing EEA spec onchain permissioning
175 lines (133 loc) • 7.35 kB
JavaScript
const IngressContract = artifacts.require('AccountIngress.sol');
const RulesContract = artifacts.require('AccountRules.sol');
const AdminContract = artifacts.require('Admin.sol');
const RulesStorage = artifacts.require('AccountStorage.sol');
// Contract keys
const RULES_NAME = "0x72756c6573000000000000000000000000000000000000000000000000000000";
const ADMIN_NAME = "0x61646d696e697374726174696f6e000000000000000000000000000000000000";
var address1 = "0xde3422671d38ecdd7a75702db7f54d4b30c022ea";
var address2 = "0x470f4787c58eeec8be0282e1cdf7534b1a095201";
var address3 = "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73";
var address4 = "0xc8381e432a2840308697029c23bb0a2d81563b94";
const newAdmin = "f17f52151EbEF6C7334FAD080c5704D77216b732";
var txValue = 12345;
var txGasLimit = 3000;
var txGasPrice = 1200;
var txPayload = "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73";
contract("Account Rules (Permissioning)", (accounts) => {
let ingressContract;
let rulesContract;
let adminContract;
let storageContract;
before(async () => {
ingressContract = await IngressContract.new();
adminContract = await AdminContract.new();
await ingressContract.setContractAddress(ADMIN_NAME, adminContract.address);
// initialize the storage
storageContract = await RulesStorage.new(ingressContract.address);
console.log(" >>> Storage contract deployed with address = " + storageContract.address);
// set rules -> storage
rulesContract = await RulesContract.new(ingressContract.address, storageContract.address);
// set storage -> rules
await storageContract.upgradeVersion(rulesContract.address);
console.log(" >>> Set storage owner to Rules.address " + rulesContract.address);
await ingressContract.setContractAddress(RULES_NAME, rulesContract.address);
// TODO this is duplicated in event test file
// assert initial state
let size = await rulesContract.getSize();
assert.equal(size, 1, "Allowlist initializes with 1 account");
let initialAccount = await rulesContract.getByIndex(0);
assert.equal(initialAccount, accounts[0], "Allowlist initializes allowing deploying account");
await rulesContract.removeAccount(initialAccount);
});
it('should NOT permit account when allowlist is empty', async () => {
let size = await rulesContract.getSize();
assert.equal(size, 0, "expected empty allowlist");
let permitted = await rulesContract.accountPermitted(address1);
assert.notOk(permitted, 'expected node NOT permitted');
});
it('Should NOT fail when removing account from empty list', async () => {
let size = await rulesContract.getSize();
assert.equal(size, 0, "expected empty allowlist");
let tx = await rulesContract.removeAccount(address1);
assert.ok(tx.receipt.status);
});
it('should add multiple accounts to allowlist', async () => {
await rulesContract.addAccount(address1);
await rulesContract.addAccount(address2);
await rulesContract.addAccount(address3);
permitted = await rulesContract.accountPermitted(address1);
assert.ok(permitted, 'expected account 1 added to be in allowlist');
permitted = await rulesContract.accountPermitted(address2);
assert.ok(permitted, 'expected account 2 added to be in allowlist');
permitted = await rulesContract.accountPermitted(address3);
assert.ok(permitted, 'expected account 3 added to be in allowlist');
});
it("getByIndex returns expected order", async () => {
let result = await rulesContract.getByIndex(0);
assert.equal(result.toLowerCase(), address1.toLowerCase());
result = await rulesContract.getByIndex(1);
assert.equal(result.toLowerCase(), address2.toLowerCase());
result = await rulesContract.getByIndex(2);
assert.equal(result.toLowerCase(), address3.toLowerCase());
});
it('should allow a transaction from account added to the allowlist', async () => {
let permitted = await rulesContract.transactionAllowed(address1, address2, txValue, txGasPrice, txGasLimit, txPayload);
assert.equal(permitted, true, 'expected permitted address1');
permitted = await rulesContract.transactionAllowed(address2, address1, txValue, txGasPrice, txGasLimit, txPayload);
assert.equal(permitted, true, 'expected permitted address2');
});
it('should NOT allow transaction from account removed from allowlist', async () => {
await rulesContract.removeAccount(address3);
let permitted = await rulesContract.accountPermitted(address3);
assert.notOk(permitted, 'expected removed account NOT permitted');
permitted = await rulesContract.transactionAllowed(address3, address1, txValue, txGasPrice, txGasLimit, txPayload);
assert.equal(permitted, false, 'expected source disallowed since it was removed');
let result = await rulesContract.getSize();
assert.equal(result, 2, "expected number of nodes");
});
it('should permit an account added back to the allowlist', async () => {
let permitted = await rulesContract.accountPermitted(address3);
assert.notOk(permitted, 'expected removed account NOT permitted');
await rulesContract.addAccount(address3);
permitted = await rulesContract.accountPermitted(address3);
assert.ok(permitted, 'expected added account permitted');
permitted = await rulesContract.transactionAllowed(address3, address2, txValue, txGasPrice, txGasLimit, txPayload);
assert.equal(permitted, true, 'expected transaction allowed since account was added back to allowlist');
});
it('should not allow non-admin account to add to allowlist', async () => {
try {
await rulesContract.addAccount(address1, { from: accounts[1] });
expect.fail(null, null, "Modifier was not enforced")
} catch(err) {
expect(err.reason).to.contain('Sender not authorized');
}
});
it('should not allow non-admin account to remove from allowlist', async () => {
try {
await rulesContract.removeAccount(address1, { from: accounts[1] });
expect.fail(null, null, "Modifier was not enforced")
} catch(err) {
expect(err.reason).to.contain('Sender not authorized');
}
});
it('should allow new admin account to remove from allowlist', async () => {
await adminContract.addAdmin(accounts[1]);
await rulesContract.removeAccount(address1, { from: accounts[1] });
let permitted = await rulesContract.accountPermitted(address1);
assert.notOk(permitted, 'expected added node NOT permitted');
});
it('should allow new admin account to add to allowlist', async () => {
await adminContract.addAdmin(accounts[2]);
await rulesContract.addAccount(address1, { from: accounts[2] });
let permitted = await rulesContract.accountPermitted(address1);
assert.ok(permitted, 'expected added account permitted');
});
it('should allow transactions from an admin account that is not on the allow list', async () => {
await adminContract.addAdmin(address4);
let permitted = await rulesContract.accountPermitted(address4);
assert.notOk(permitted, 'expected account not permitted since it is not on the allow list');
permitted = await rulesContract.transactionAllowed(address4, address2, txValue, txGasPrice, txGasLimit, txPayload);
assert.ok(permitted, 'expected transaction allowed since account is an admin');
});
});