@daostack/arc-experimental
Version:
A platform for building DAOs
171 lines (156 loc) • 8.97 kB
JavaScript
const helpers = require("./helpers");
const SignalScheme = artifacts.require("./SignalScheme.sol");
class SignalSchemeParams {
constructor() {
}
}
var registration;
const setupSignalSchemeParam = async function(
accounts,
genesisProtocol,
token
) {
var signalSchemeParams = new SignalSchemeParams();
if (genesisProtocol === true) {
signalSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS);
signalSchemeParams.initdata = await new web3.eth.Contract(registration.signalScheme.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
1234,
helpers.NULL_HASH,
signalSchemeParams.votingMachine.genesisProtocol.address,
signalSchemeParams.votingMachine.uintArray,
signalSchemeParams.votingMachine.voteOnBehalf)
.encodeABI();
} else {
signalSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50);
signalSchemeParams.initdata = await new web3.eth.Contract(registration.signalScheme.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
1234,
signalSchemeParams.votingMachine.params,
signalSchemeParams.votingMachine.absoluteVote.address,
[],
helpers.NULL_ADDRESS)
.encodeABI();
}
return signalSchemeParams;
};
const setup = async function (accounts,genesisProtocol = false,tokenAddress = helpers.NULL_ADDRESS) {
var testSetup = new helpers.TestSetup();
registration = await helpers.registerImplementation();
if (genesisProtocol) {
testSetup.reputationArray = [1000,100,5000];
} else {
testSetup.reputationArray = [2000,4000,7000];
}
testSetup.proxyAdmin = accounts[5];
testSetup.signalSchemeParams= await setupSignalSchemeParam(
accounts,
genesisProtocol,
tokenAddress);
var permissions = "0x00000000";
[] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin,
accounts,
registration,
[],
accounts[1],
accounts[2]],
[],
testSetup.reputationArray,
0,
[],
testSetup.signalSchemeParams.initdata,
[],
[],
"metaData");
testSetup.signalScheme = await SignalScheme.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx));
return testSetup;
};
contract('SignalScheme', accounts => {
it("proposeSignal log", async function() {
var testSetup = await setup(accounts);
var parameters = await testSetup.signalScheme.params();
var avatar = await testSetup.signalScheme.avatar();
assert.equal(avatar,testSetup.org.avatar.address);
assert.equal(parameters.signalType,1234);
assert.equal(parameters.voteApproveParams,testSetup.signalSchemeParams.votingMachine.params);
assert.equal(parameters.intVote,testSetup.signalSchemeParams.votingMachine.absoluteVote.address);
var tx = await testSetup.signalScheme.proposeSignal("description-hash");
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "NewSignalProposal");
assert.equal(await helpers.getValueFromLogs(tx, '_avatar',0), testSetup.org.avatar.address, "Wrong log: _avatar");
assert.equal(await helpers.getValueFromLogs(tx, '_descriptionHash',15), "description-hash", "Wrong log: _contributionDescription");
assert.equal(await helpers.getValueFromLogs(tx, '_signalType',0), 1234, "Wrong log: _signalType");
});
it("execute signalScheme yes ", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.signalScheme.proposeSignal(web3.utils.asciiToHex("description"));
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
tx = await testSetup.signalSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]});
await testSetup.signalScheme.getPastEvents('Signal', {
fromBlock: tx.blockNumber,
toBlock: 'latest'
})
.then(function(events){
assert.equal(events[0].event,"Signal");
assert.equal(events[0].args._avatar, testSetup.org.avatar.address);
assert.equal(events[0].args._proposalId, proposalId);
assert.equal(events[0].args._signalType, 1234);
assert.equal(events[0].args._descriptionHash, web3.utils.asciiToHex("description"));
});
var proposal = await testSetup.signalScheme.proposals(proposalId);
assert.equal(proposal.executed,true);
});
it("execute signalScheme yes + genesisProtocol", async function() {
var testSetup = await setup(accounts,true);
var tx = await testSetup.signalScheme.proposeSignal(web3.utils.asciiToHex("description"));
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
tx = await testSetup.signalSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]});
await testSetup.signalScheme.getPastEvents('Signal', {
fromBlock: tx.blockNumber,
toBlock: 'latest'
})
.then(function(events){
assert.equal(events[0].event,"Signal");
assert.equal(events[0].args._avatar, testSetup.org.avatar.address);
assert.equal(events[0].args._proposalId, proposalId);
assert.equal(events[0].args._signalType, 1234);
assert.equal(events[0].args._descriptionHash, web3.utils.asciiToHex("description"));
});
var proposal = await testSetup.signalScheme.proposals(proposalId);
assert.equal(proposal.executed,true);
});
it("execute signalScheme no ", async function() {
var testSetup = await setup(accounts);
var tx = await testSetup.signalScheme.proposeSignal(web3.utils.asciiToHex("description"));
//Vote with reputation to trigger execution
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
tx = await testSetup.signalSchemeParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]});
await testSetup.signalScheme.getPastEvents('Signal', {
fromBlock: tx.blockNumber,
toBlock: 'latest'
})
.then(function(events){
assert.equal(events.length , 0);
});
var proposal = await testSetup.signalScheme.proposals(proposalId);
assert.equal(proposal.executed,true);
});
it("cannot initialize twice", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.signalScheme.initialize(testSetup.org.avatar.address,
1234,
testSetup.signalSchemeParams.votingMachine.params,
testSetup.signalSchemeParams.votingMachine.absoluteVote.address,
[],
helpers.NULL_ADDRESS);
assert(false, "cannot initialize twice");
} catch(error) {
helpers.assertVMException(error);
}
});
});