arc_dx
Version:
A platform for building DAOs
158 lines (133 loc) • 8.77 kB
JavaScript
import * as helpers from './helpers';
const constants = require('./constants');
const AbsoluteVote = artifacts.require('./AbsoluteVote.sol');
const GenericScheme = artifacts.require('./GenericScheme.sol');
const DaoCreator = artifacts.require("./DaoCreator.sol");
const ControllerCreator = artifacts.require("./ControllerCreator.sol");
const StandardTokenMock = artifacts.require("./StandardTokenMock.sol");
const ActionMock = artifacts.require("./ActionMock.sol");
export class GenericSchemeParams {
constructor() {
}
}
const setupGenericSchemeParams = async function(
genericScheme,
accounts,
contractToCall,
genesisProtocol = false,
tokenAddress = 0
) {
var genericSchemeParams = new GenericSchemeParams();
if (genesisProtocol === true){
genericSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,0,0);
await genericScheme.setParameters(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.genesisProtocol.address,contractToCall);
genericSchemeParams.paramsHash = await genericScheme.getParametersHash(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.genesisProtocol.address,contractToCall);
}
else {
genericSchemeParams.votingMachine = await helpers.setupAbsoluteVote(true,50,genericScheme.address);
await genericScheme.setParameters(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.absoluteVote.address,contractToCall);
genericSchemeParams.paramsHash = await genericScheme.getParametersHash(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.absoluteVote.address,contractToCall);
}
return genericSchemeParams;
};
const setup = async function (accounts,contractToCall = 0,reputationAccount=0,genesisProtocol = false,tokenAddress=0) {
var testSetup = new helpers.TestSetup();
testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100);
testSetup.genericScheme = await GenericScheme.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,10,70];
if (reputationAccount === 0) {
testSetup.org = await helpers.setupOrganizationWithArrays(testSetup.daoCreator,[accounts[0],accounts[1],accounts[2]],[1000,1000,1000],testSetup.reputationArray);
} else {
testSetup.org = await helpers.setupOrganizationWithArrays(testSetup.daoCreator,[accounts[0],accounts[1],reputationAccount],[1000,1000,1000],testSetup.reputationArray);
}
testSetup.genericSchemeParams= await setupGenericSchemeParams(testSetup.genericScheme,accounts,contractToCall,genesisProtocol,tokenAddress);
var permissions = "0x00000010";
await testSetup.daoCreator.setSchemes(testSetup.org.avatar.address,
[testSetup.genericScheme.address],
[testSetup.genericSchemeParams.paramsHash],[permissions]);
return testSetup;
};
const createCallToActionMock = async function(_avatar,_actionMock) {
return await new web3.eth.Contract(_actionMock.abi).methods.test2(_avatar).encodeABI();
};
contract('genericScheme', function(accounts) {
before(function() {
helpers.etherForEveryone(accounts);
});
it("setParameters", async function() {
var genericScheme = await GenericScheme.new();
var absoluteVote = await AbsoluteVote.new();
await genericScheme.setParameters("0x1234",absoluteVote.address,accounts[0]);
var paramHash = await genericScheme.getParametersHash("0x1234",absoluteVote.address,accounts[0]);
var parameters = await genericScheme.parameters(paramHash);
assert.equal(parameters[0],absoluteVote.address);
assert.equal(parameters[2],accounts[0]);
});
it("proposeCall log", async function() {
var actionMock =await ActionMock.new();
var testSetup = await setup(accounts,actionMock.address);
var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock);
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,
callData);
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "NewCallProposal");
});
it("execute proposeCall -no decision - proposal data delete", async function() {
var actionMock =await ActionMock.new();
var testSetup = await setup(accounts,actionMock.address);
var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock);
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]});
//check organizationsProposals after execution
var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal.callData,null);
});
it("execute proposeVote -positive decision - proposal data delete", async function() {
var actionMock =await ActionMock.new();
var testSetup = await setup(accounts,actionMock.address);
var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock);
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal[0],callData);
await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
//check organizationsProposals after execution
organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId);
assert.equal(organizationProposal.callData,null);//new contract address
});
it("execute proposeVote -positive decision - check action", async function() {
var actionMock =await ActionMock.new();
var testSetup = await setup(accounts,actionMock.address);
var callData = await createCallToActionMock(0,actionMock);
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
try {
await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
assert(false, "should revert in actionMock because msg.sender is not the _addr param at actionMock");
} catch(error) {
helpers.assertVMException(error);
}
});
it("execute proposeVote without return value-positive decision - check action", async function() {
var actionMock =await ActionMock.new();
var testSetup = await setup(accounts,actionMock.address);
const encodeABI = await new web3.eth.Contract(actionMock.abi).methods.withoutReturnValue(testSetup.org.avatar.address).encodeABI();
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,encodeABI);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]});
});
it("execute proposeVote -positive decision - check action - with GenesisProtocol", async function() {
var actionMock =await ActionMock.new();
var standardTokenMock = await StandardTokenMock.new(accounts[0],1000);
var testSetup = await setup(accounts,actionMock.address,0,true,standardTokenMock.address);
var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock);
var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[2]});
assert.equal(tx.logs.length, 3);
assert.equal(tx.logs[1].event, "ExecuteProposal");
});
});