@daostack/arc-experimental
Version:
A platform for building DAOs
277 lines (242 loc) • 16.6 kB
JavaScript
const helpers = require("./helpers");
const VoteInOrganization = artifacts.require('./VoteInOrganizationScheme.sol');
const ERC20Mock = artifacts.require('./test/ERC20Mock.sol');
const AbsoluteVoteExecuteMock = artifacts.require("./AbsoluteVoteExecuteMock.sol");
const GenesisProtocolCallbacksMock = artifacts.require("./GenesisProtocolCallbacksMock.sol");
const Reputation = artifacts.require("./Reputation.sol");
class VoteInOrganizationParams {
constructor() {
}
}
var registration;
const setupVoteInOrganizationParams = async function(
accounts,
genesisProtocol = false,
tokenAddress = helpers.NULL_ADDRESS
) {
var voteInOrganizationParams = new VoteInOrganizationParams();
voteInOrganizationParams.paramsHash = helpers.NULL_HASH;
if (genesisProtocol === true){
voteInOrganizationParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,helpers.NULL_ADDRESS);
voteInOrganizationParams.initdata = await new web3.eth.Contract(registration.voteInOrganization.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
voteInOrganizationParams.votingMachine.genesisProtocol.address,
voteInOrganizationParams.votingMachine.uintArray,
voteInOrganizationParams.votingMachine.voteOnBehalf,
helpers.NULL_HASH)
.encodeABI();
}
else {
voteInOrganizationParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50);
voteInOrganizationParams.initdata = await new web3.eth.Contract(registration.voteInOrganization.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
voteInOrganizationParams.votingMachine.absoluteVote.address,
[0,0,0,0,0,0,0,0,0,0,0],
helpers.NULL_ADDRESS,
voteInOrganizationParams.votingMachine.params)
.encodeABI();
}
return voteInOrganizationParams;
};
const setup = async function (accounts,reputationAccount=helpers.NULL_ADDRESS,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS) {
var testSetup = new helpers.TestSetup();
testSetup.fee = 10;
testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100);
registration = await helpers.registerImplementation();
testSetup.reputationArray = [200,100,700];
testSetup.proxyAdmin = accounts[5];
if (reputationAccount === helpers.NULL_ADDRESS) {
reputationAccount = accounts[2];
}
testSetup.voteInOrganizationParams= await setupVoteInOrganizationParams(
accounts,
genesisProtocol,
tokenAddress);
var permissions = "0x00000010";
[testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin,
accounts,
registration,
[accounts[0],accounts[1],reputationAccount],
[1000,1000,1000],
testSetup.reputationArray,0,
[web3.utils.fromAscii("VoteInOrganization")],
testSetup.voteInOrganizationParams.initdata,
[helpers.getBytesLength(testSetup.voteInOrganizationParams.initdata)],
[permissions],
"metaData");
testSetup.voteInOrganization = await VoteInOrganization.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx));
return testSetup;
};
contract('VoteInOrganizationScheme', accounts => {
before(function() {
this.timeout(50000); //50 second timeout for setup
helpers.etherForEveryone(accounts);
});
it("proposeVote log", async function() {
var testSetup = await setup(accounts);
var anotherTestSetup = await setup(accounts);
var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new();
await absoluteVoteExecuteMock.initialize(testSetup.org.reputation.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);
var tx = await absoluteVoteExecuteMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],helpers.NULL_ADDRESS);
const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal');
tx = await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address,
proposalId,1,helpers.NULL_HASH);
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "NewVoteProposal");
assert.equal(tx.logs[0].args._vote, 1);
});
it("proposeVote vote not an option", async function() {
var testSetup = await setup(accounts);
var anotherTestSetup = await setup(accounts);
var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new();
await absoluteVoteExecuteMock.initialize(testSetup.org.reputation.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);
var tx = await absoluteVoteExecuteMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],helpers.NULL_ADDRESS);
const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal');
try {
await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address,
proposalId,3,helpers.NULL_HASH
);
assert(false, "vote not an option");
} catch(error) {
helpers.assertVMException(error);
}
});
it("proposeVote vote not in range", async function() {
var standardTokenMock = await ERC20Mock.new(accounts[0],1000);
var testSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address);
var anotherTestSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address);
var reputation = await Reputation.new();
await reputation.initialize(accounts[0]);
await reputation.mint(testSetup.org.avatar.address,100);
var genesisProtocolCallbacksMock = await GenesisProtocolCallbacksMock.new();
await genesisProtocolCallbacksMock.initialize(reputation.address,
standardTokenMock.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address);
await reputation.transferOwnership(genesisProtocolCallbacksMock.address);
var tx = await genesisProtocolCallbacksMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],
helpers.NULL_ADDRESS);
var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId');
try {
await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address,
originalProposalId,3,helpers.NULL_HASH
);
assert(false, "vote out of range (too high)");
} catch(error) {
helpers.assertVMException(error);
}
try {
await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address,
originalProposalId,0,helpers.NULL_HASH
);
assert(false, "vote out of range (too low)");
} catch(error) {
helpers.assertVMException(error);
}
});
it("execute proposeVote -no decision - proposal data delete", async function() {
var testSetup = await setup(accounts);
var anotherTestSetup = await setup(accounts);
var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new();
await absoluteVoteExecuteMock.initialize(testSetup.org.reputation.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);
var tx = await absoluteVoteExecuteMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],
helpers.NULL_ADDRESS);
const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal');
tx = await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address,
originalProposalId,1,helpers.NULL_HASH);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]});
//check organizationsProposals after execution
var organizationProposal = await testSetup.voteInOrganization.organizationProposals(proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
});
it("execute proposeVote -positive decision - proposal data delete", async function() {
var testSetup = await setup(accounts);
var anotherTestSetup = await setup(accounts,testSetup.org.avatar.address);
//mint reputation to avatar in the other dao.
var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new();
await absoluteVoteExecuteMock.initialize(anotherTestSetup.org.reputation.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);
var tx = await absoluteVoteExecuteMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],
helpers.NULL_ADDRESS);
const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal');
tx = await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address,
originalProposalId,1,helpers.NULL_HASH);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
var organizationProposal = await testSetup.voteInOrganization.organizationProposals(proposalId);
assert.equal(organizationProposal[0],anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);//new contract address
await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]});
//check organizationsProposals after execution
organizationProposal = await testSetup.voteInOrganization.organizationProposals(proposalId);
assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address
});
it("execute proposeVote -positive decision - check action", async function() {
var testSetup = await setup(accounts);
var anotherTestSetup = await setup(accounts,testSetup.org.avatar.address);
var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new();
await absoluteVoteExecuteMock.initialize(anotherTestSetup.org.reputation.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);
var tx = await absoluteVoteExecuteMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],
helpers.NULL_ADDRESS);
const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal');
tx = await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address,
originalProposalId,1,helpers.NULL_HASH);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]});
await helpers.checkVoteInfo(anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote,originalProposalId, testSetup.org.avatar.address, [1, anotherTestSetup.reputationArray[2]]);
});
it("execute proposeVote -positive decision - check action - with GenesisProtocol", async function() {
var standardTokenMock = await ERC20Mock.new(accounts[0],1000);
var testSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address);
var anotherTestSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address);
var reputation = await Reputation.new();
await reputation.initialize(accounts[0]);
await reputation.mint(testSetup.org.avatar.address,100);
var genesisProtocolCallbacksMock = await GenesisProtocolCallbacksMock.new();
await genesisProtocolCallbacksMock.initialize(reputation.address,
standardTokenMock.address,
anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address);
await reputation.transferOwnership(genesisProtocolCallbacksMock.address);
var tx = await genesisProtocolCallbacksMock.propose(2,
anotherTestSetup.voteInOrganizationParams.votingMachine.params,
anotherTestSetup.org.avatar.address,
accounts[0],
helpers.NULL_ADDRESS);
var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId');
tx = await testSetup.voteInOrganization.proposeVote(
anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address,
originalProposalId,1,helpers.NULL_HASH);
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId');
await testSetup.voteInOrganizationParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]});
await helpers.checkVoteInfo(anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol,originalProposalId, testSetup.org.avatar.address, [1, 100]);
});
});