arc_dx
Version:
A platform for building DAOs
246 lines (193 loc) • 14.5 kB
JavaScript
import * as helpers from './helpers';
const constants = require('./constants');
const Controller = artifacts.require("./Controller.sol");
const AbsoluteVote = artifacts.require('./AbsoluteVote.sol');
const UpgradeScheme = artifacts.require('./UpgradeScheme.sol');
const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol');
const DaoCreator = artifacts.require("./DaoCreator.sol");
const Avatar = artifacts.require("./Avatar.sol");
const DAOToken = artifacts.require("./DAOToken.sol");
const Reputation = artifacts.require("./Reputation.sol");
const ControllerCreator = artifacts.require("./ControllerCreator.sol");
export class UpgradeSchemeParams {
constructor() {
}
}
const setupUpgradeSchemeParams = async function(
upgradeScheme,
) {
var upgradeSchemeParams = new UpgradeSchemeParams();
upgradeSchemeParams.votingMachine = await helpers.setupAbsoluteVote(true,50,upgradeScheme.address);
await upgradeScheme.setParameters(upgradeSchemeParams.votingMachine.params,upgradeSchemeParams.votingMachine.absoluteVote.address);
upgradeSchemeParams.paramsHash = await upgradeScheme.getParametersHash(upgradeSchemeParams.votingMachine.params,upgradeSchemeParams.votingMachine.absoluteVote.address);
return upgradeSchemeParams;
};
const setupNewController = async function (accounts,permission='0x00000000') {
var token = await DAOToken.new("TEST","TST",0);
// set up a reputation system
var reputation = await Reputation.new();
var avatar = await Avatar.new('name', token.address, reputation.address);
var _controller;
if (permission !== '0'){
_controller = await Controller.new(avatar.address,{from:accounts[1],gas: constants.ARC_GAS_LIMIT});
await _controller.registerScheme(accounts[0],helpers.NULL_HASH,permission,avatar.address,{from:accounts[1]});
await _controller.unregisterSelf(avatar.address,{from:accounts[1]});
}
else {
_controller = await Controller.new(avatar.address,{gas: constants.ARC_GAS_LIMIT});
}
return _controller;
};
const setup = async function (accounts) {
var testSetup = new helpers.TestSetup();
testSetup.fee = 10;
testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100);
testSetup.upgradeScheme = await UpgradeScheme.new();
var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT});
testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT});
testSetup.reputationArray = [20,40,70];
testSetup.org = await helpers.setupOrganizationWithArrays(testSetup.daoCreator,[accounts[0],accounts[1],accounts[2]],[1000,0,0],testSetup.reputationArray);
testSetup.upgradeSchemeParams= await setupUpgradeSchemeParams(testSetup.upgradeScheme);
var permissions = "0x0000000a";
await testSetup.daoCreator.setSchemes(testSetup.org.avatar.address,[testSetup.upgradeScheme.address],[testSetup.upgradeSchemeParams.paramsHash],[permissions]);
return testSetup;
};
contract('UpgradeScheme', accounts => {
before(function() {
helpers.etherForEveryone(accounts);
});
it("setParameters", async() => {
var upgradeScheme = await UpgradeScheme.new();
var absoluteVote = await AbsoluteVote.new();
await upgradeScheme.setParameters("0x1234",absoluteVote.address);
var paramHash = await upgradeScheme.getParametersHash("0x1234",absoluteVote.address);
var parameters = await upgradeScheme.parameters(paramHash);
assert.equal(parameters[1],absoluteVote.address);
});
it("proposeUpgrade log", async() => {
var testSetup = await setup(accounts);
var newController = await setupNewController(accounts);
var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address);
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "NewUpgradeProposal");
var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1);
assert.equal(votingMachine,testSetup.upgradeSchemeParams.votingMachine.absoluteVote.address);
});
it("proposeUpgrade check owner vote", async function() {
var testSetup = await setup(accounts);
var newController = await setupNewController(accounts);
var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
await helpers.checkVoteInfo(testSetup.upgradeSchemeParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]);
});
it("proposeChangeUpgradingScheme log", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000000");
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "ChangeUpgradeSchemeProposal");
var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1);
assert.equal(votingMachine,testSetup.upgradeSchemeParams.votingMachine.absoluteVote.address);
});
it("proposeChangeUpgradingScheme check owner vote", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002");
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
await helpers.checkVoteInfo(testSetup.upgradeSchemeParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]);
});
it("execute proposal upgrade controller -yes - proposal data delete", async function() {
var testSetup = await setup(accounts);
var newController = await setupNewController(accounts);
assert.notEqual(newController.address,await testSetup.org.avatar.owner());
var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address);
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
//check organizationsProposals before execution
var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],newController.address);//new contract address
assert.equal(organizationProposal[2].toNumber(),1);//proposalType
await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
assert.equal(newController.address,await testSetup.org.avatar.owner());
//check organizationsProposals after execution
organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
assert.equal(organizationProposal[2],0);//proposalType
});
it("execute proposal upgrade controller - no decision (same for update scheme) - proposal data delete", async function() {
var testSetup = await setup(accounts);
var newController = await setupNewController(accounts);
var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
//check organizationsProposals before execution
var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],newController.address);//new contract address
assert.equal(organizationProposal[2].toNumber(),1);//proposalType
//Vote with reputation to trigger execution
await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]});
//should not upgrade because the decision is "no"
assert.notEqual(newController.address,await testSetup.org.avatar.owner());
//check organizationsProposals after execution
organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
assert.equal(organizationProposal[2],0);//proposalType
});
it("execute proposal ChangeUpgradingScheme - yes decision - proposal data delete", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002");
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
//check organizationsProposals before execution
var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],accounts[0]);//new contract address
assert.equal(organizationProposal[2].toNumber(),2);//proposalType
//check schemes registration before execution
var controller = await Controller.at(await testSetup.org.avatar.owner());
assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false);
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true);
await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
//check organizationsProposals after execution
organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
assert.equal(organizationProposal[2],0);//proposalType
//check if scheme upgraded
assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true);
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false);
});
it("execute proposal ChangeUpgradingScheme - yes decision - check approve increase fee ", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002");
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
//check organizationsProposals before execution
var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],accounts[0]);//new contract address
assert.equal(organizationProposal[2].toNumber(),2);//proposalType
//check schemes registration before execution
var controller = await Controller.at(await testSetup.org.avatar.owner());
assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false);
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true);
await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
//check organizationsProposals after execution
organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
assert.equal(organizationProposal[2],0);//proposalType
//check if scheme upgraded
assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true);
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false);
});
it("execute proposal ChangeUpgradingScheme - yes decision - check upgrade it self. ", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,testSetup.upgradeScheme.address,"0x00000002");
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
//check schemes registration before execution
var controller = await Controller.at(await testSetup.org.avatar.owner());
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true);
await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
//check organizationsProposals after execution
var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
assert.equal(organizationProposal[2],0);//proposalType
//schemes should still be registered
assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true);
});
});