diff --git a/contracts/controller/Avatar.sol b/contracts/controller/Avatar.sol index 4ee0ee45..2568fe39 100644 --- a/contracts/controller/Avatar.sol +++ b/contracts/controller/Avatar.sol @@ -17,7 +17,7 @@ contract Avatar is Ownable { DAOToken public nativeToken; Reputation public nativeReputation; - event GenericCall(address indexed _contract, bytes _params); + event GenericCall(address indexed _contract, bytes _params, bool _success); event SendEther(uint256 _amountInWei, address indexed _to); event ExternalTokenTransfer(address indexed _externalToken, address indexed _to, uint256 _value); event ExternalTokenTransferFrom(address indexed _externalToken, address _from, address _to, uint256 _value); @@ -45,14 +45,16 @@ contract Avatar is Ownable { * @dev perform a generic call to an arbitrary contract * @param _contract the contract's address to call * @param _data ABI-encoded contract call to call `_contract` address. - * @return the return bytes of the called contract's function. + * @return bool success or fail + * bytes - the return bytes of the called contract's function. */ - function genericCall(address _contract, bytes memory _data) public onlyOwner returns(bytes memory) { - emit GenericCall(_contract, _data); - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returnValue) = _contract.call(_data); - require(success); - return returnValue; + function genericCall(address _contract, bytes memory _data) + public + onlyOwner + returns(bool success, bytes memory returnValue) { + // solhint-disable-next-line avoid-low-level-calls + (success, returnValue) = _contract.call(_data); + emit GenericCall(_contract, _data, success); } /** diff --git a/contracts/controller/Controller.sol b/contracts/controller/Controller.sol index 7250b7bd..35a6b995 100644 --- a/contracts/controller/Controller.sol +++ b/contracts/controller/Controller.sol @@ -373,14 +373,15 @@ contract Controller is ControllerInterface { * @param _contract the contract's address to call * @param _data ABI-encoded contract call to call `_contract` address. * @param _avatar the controller's avatar address - * @return bytes32 - the return value of the called _contract's function. + * @return bool -success + * bytes - the return value of the called _contract's function. */ function genericCall(address _contract, bytes calldata _data, Avatar _avatar) external onlyGenericCallScheme onlySubjectToConstraint("genericCall") isAvatarValid(address(_avatar)) - returns (bytes memory returnValue) + returns (bool, bytes memory) { return avatar.genericCall(_contract, _data); } diff --git a/contracts/controller/ControllerInterface.sol b/contracts/controller/ControllerInterface.sol index 2f35c066..1f4c54cf 100644 --- a/contracts/controller/ControllerInterface.sol +++ b/contracts/controller/ControllerInterface.sol @@ -105,11 +105,12 @@ interface ControllerInterface { * @param _contract the contract's address to call * @param _data ABI-encoded contract call to call `_contract` address. * @param _avatar the controller's avatar address - * @return bytes32 - the return value of the called _contract's function. + * @return bool -success + * bytes - the return value of the called _contract's function. */ function genericCall(address _contract, bytes calldata _data, Avatar _avatar) external - returns(bytes memory); + returns(bool, bytes memory); /** * @dev send some ether diff --git a/contracts/controller/UController.sol b/contracts/controller/UController.sol index f3f29afa..6580e5b8 100644 --- a/contracts/controller/UController.sol +++ b/contracts/controller/UController.sol @@ -366,13 +366,14 @@ contract UController is ControllerInterface { * @dev perform a generic call to an arbitrary contract * @param _contract the contract's address to call * @param _data ABI-encoded contract call to call `_contract` address. - * @return bytes32 - the return value of the called _contract's function. + * @return bool -success + * bytes - the return value of the called _contract's function. */ function genericCall(address _contract, bytes calldata _data, Avatar _avatar) external onlyGenericCallScheme(address(_avatar)) onlySubjectToConstraint("genericCall", address(_avatar)) - returns (bytes memory returnValue) + returns (bool, bytes memory) { return _avatar.genericCall(_contract, _data); } diff --git a/contracts/test/ActionMock.sol b/contracts/test/ActionMock.sol index 0f00dbf7..c2ab518f 100644 --- a/contracts/test/ActionMock.sol +++ b/contracts/test/ActionMock.sol @@ -7,6 +7,8 @@ contract ActionMock { event WithoutReturnValue(address _addr); + uint public activationTime; + function test(uint256 _a, address _b, bytes32 _c) public view returns(uint256) { require(_a == 7); require(_b == address(this)); @@ -24,4 +26,13 @@ contract ActionMock { emit WithoutReturnValue(_addr); } + function setActivationTime(uint _activationTime) public { + activationTime = _activationTime; + } + + function test3() public view { + // solhint-disable-next-line not-rely-on-time + require(now > activationTime, "now should be greater than the activation time"); + } + } diff --git a/contracts/test/UniversalSchemeMock.sol b/contracts/test/UniversalSchemeMock.sol index 7475d896..13c477df 100644 --- a/contracts/test/UniversalSchemeMock.sol +++ b/contracts/test/UniversalSchemeMock.sol @@ -7,7 +7,7 @@ import "../controller/ControllerInterface.sol"; contract UniversalSchemeMock is UniversalScheme { function genericCall(Avatar _avatar, address _contract, uint256 _a, address _b, bytes32 _c) - public returns(bytes memory) + public returns(bool, bytes memory) { address controller = _avatar.owner(); @@ -16,7 +16,7 @@ contract UniversalSchemeMock is UniversalScheme { } function genericCallDirect(Avatar _avatar, address _contract, uint256 _a, address _b, bytes32 _c) - public returns(bytes memory) + public returns(bool, bytes memory) { return _avatar.genericCall(_contract, abi.encodeWithSignature("test(uint256,address,bytes32)", _a, _b, _c)); } diff --git a/contracts/universalSchemes/GenericScheme.sol b/contracts/universalSchemes/GenericScheme.sol index 661b5a23..78440bb4 100644 --- a/contracts/universalSchemes/GenericScheme.sol +++ b/contracts/universalSchemes/GenericScheme.sol @@ -15,22 +15,29 @@ contract GenericScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu event NewCallProposal( address indexed _avatar, bytes32 indexed _proposalId, - bytes callData + bytes _callData, + bytes32 _descriptionHash ); event ProposalExecuted( address indexed _avatar, bytes32 indexed _proposalId, - int256 _param, bytes _genericCallReturnValue ); + event ProposalExecutedByVotingMachine( + address indexed _avatar, + bytes32 indexed _proposalId, + int256 _param + ); + event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); // Details of a voting proposal: struct CallProposal { bytes callData; bool exist; + bool passed; } // A mapping from the organization (Avatar) address to the saved data of the organization: @@ -48,25 +55,52 @@ contract GenericScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu /** * @dev execution of proposals, can only be called by the voting machine in which the vote is held. * @param _proposalId the ID of the voting in the voting machine - * @param _param a parameter of the voting result, 1 yes and 2 is no. + * @param _decision a parameter of the voting result, 1 yes and 2 is no. + * @return bool success */ - function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + function executeProposal(bytes32 _proposalId, int256 _decision) + external + onlyVotingMachine(_proposalId) + returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; + CallProposal storage proposal = organizationsProposals[address(avatar)][_proposalId]; + require(proposal.exist, "must be a live proposal"); + require(proposal.passed == false, "cannot execute twice"); + + if (_decision == 1) { + proposal.passed = true; + execute(_proposalId); + } else { + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); + } + + emit ProposalExecutedByVotingMachine(address(avatar), _proposalId, _decision); + return true; + } + + /** + * @dev execution of proposals after it has been decided by the voting machine + * @param _proposalId the ID of the voting in the voting machine + */ + function execute(bytes32 _proposalId) public { Avatar avatar = proposalsInfo[_proposalId].avatar; Parameters memory params = parameters[getParametersFromController(avatar)]; - // Save proposal to memory and delete from storage: - CallProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; + CallProposal storage proposal = organizationsProposals[address(avatar)][_proposalId]; require(proposal.exist, "must be a live proposal"); - delete organizationsProposals[address(avatar)][_proposalId]; - emit ProposalDeleted(address(avatar), _proposalId); + require(proposal.passed, "proposal must passed by voting machine"); + proposal.exist = false; bytes memory genericCallReturnValue; - // Check decision: - if (_param == 1) { - // Define controller and get the params: - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); - genericCallReturnValue = controller.genericCall(params.contractToCall, proposal.callData, avatar); + bool success; + ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); + (success, genericCallReturnValue) = controller.genericCall(params.contractToCall, proposal.callData, avatar); + if (success) { + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); + emit ProposalExecuted(address(avatar), _proposalId, genericCallReturnValue); + } else { + proposal.exist = true; } - emit ProposalExecuted(address(avatar), _proposalId, _param, genericCallReturnValue); - return true; } /** @@ -108,9 +142,10 @@ contract GenericScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu * The function trigger NewCallProposal event * @param _callData - The abi encode data for the call * @param _avatar avatar of the organization + * @param _descriptionHash proposal description hash * @return an id which represents the proposal */ - function proposeCall(Avatar _avatar, bytes memory _callData) + function proposeCall(Avatar _avatar, bytes memory _callData, bytes32 _descriptionHash) public returns(bytes32) { @@ -121,14 +156,15 @@ contract GenericScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu organizationsProposals[address(_avatar)][proposalId] = CallProposal({ callData: _callData, - exist: true + exist: true, + passed: false }); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, avatar:_avatar, votingMachine:address(params.intVote) }); - emit NewCallProposal(address(_avatar), proposalId, _callData); + emit NewCallProposal(address(_avatar), proposalId, _callData, _descriptionHash); return proposalId; } diff --git a/contracts/universalSchemes/GlobalConstraintRegistrar.sol b/contracts/universalSchemes/GlobalConstraintRegistrar.sol index be2bfcf6..65941103 100644 --- a/contracts/universalSchemes/GlobalConstraintRegistrar.sol +++ b/contracts/universalSchemes/GlobalConstraintRegistrar.sol @@ -18,14 +18,16 @@ contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, P address indexed _intVoteInterface, address _gc, bytes32 _params, - bytes32 _voteToRemoveParams + bytes32 _voteToRemoveParams, + bytes32 _descriptionHash ); event RemoveGlobalConstraintsProposal( address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, - address _gc + address _gc, + bytes32 _descriptionHash ); event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); @@ -124,10 +126,16 @@ contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, P * @param _gc the address of the global constraint that is being proposed * @param _params the parameters for the global constraint * @param _voteToRemoveParams the conditions (on the voting machine) for removing this global constraint + * @param _descriptionHash proposal's description hash * @return bytes32 -the proposal id */ // TODO: do some checks on _voteToRemoveParams - it is very easy to make a mistake and not be able to remove the GC - function proposeGlobalConstraint(Avatar _avatar, address _gc, bytes32 _params, bytes32 _voteToRemoveParams) + function proposeGlobalConstraint( + Avatar _avatar, + address _gc, + bytes32 _params, + bytes32 _voteToRemoveParams, + bytes32 _descriptionHash) public returns(bytes32) { @@ -150,7 +158,8 @@ contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, P address(intVote), _gc, _params, - _voteToRemoveParams + _voteToRemoveParams, + _descriptionHash ); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, @@ -164,9 +173,10 @@ contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, P * @dev propose to remove a global constraint: * @param _avatar the avatar of the organization that the constraint is proposed for * @param _gc the address of the global constraint that is being proposed + * @param _descriptionHash proposal's description hash * @return bytes32 -the proposal id */ - function proposeToRemoveGC(Avatar _avatar, address _gc) public returns(bytes32) { + function proposeToRemoveGC(Avatar _avatar, address _gc, bytes32 _descriptionHash) public returns(bytes32) { Controller controller = Controller(_avatar.owner()); require(controller.isGlobalConstraintRegistered(_gc, address(_avatar))); Parameters memory params = parameters[getParametersFromController(_avatar)]; @@ -186,7 +196,7 @@ contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, P }); organizationsProposals[address(_avatar)][proposalId] = proposal; - emit RemoveGlobalConstraintsProposal(address(_avatar), proposalId, address(intVote), _gc); + emit RemoveGlobalConstraintsProposal(address(_avatar), proposalId, address(intVote), _gc, _descriptionHash); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, avatar:_avatar, diff --git a/contracts/universalSchemes/SchemeRegistrar.sol b/contracts/universalSchemes/SchemeRegistrar.sol index 3402b579..acd3ecf0 100644 --- a/contracts/universalSchemes/SchemeRegistrar.sol +++ b/contracts/universalSchemes/SchemeRegistrar.sol @@ -18,13 +18,15 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe address indexed _intVoteInterface, address _scheme, bytes32 _parametersHash, - bytes4 _permissions + bytes4 _permissions, + bytes32 _descriptionHash ); event RemoveSchemeProposal(address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, - address _scheme + address _scheme, + bytes32 _descriptionHash ); event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); @@ -115,6 +117,7 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe * @param _scheme the address of the scheme to be registered * @param _parametersHash a hash of the configuration of the _scheme * @param _permissions the permission of the scheme to be registered + * @param _descriptionHash proposal's description hash * @return a proposal Id * @dev NB: not only proposes the vote, but also votes for it */ @@ -122,7 +125,8 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe Avatar _avatar, address _scheme, bytes32 _parametersHash, - bytes4 _permissions + bytes4 _permissions, + bytes32 _descriptionHash ) public returns(bytes32) @@ -149,7 +153,8 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe proposalId, address(controllerParams.intVote), _scheme, _parametersHash, - _permissions + _permissions, + _descriptionHash ); organizationsProposals[address(_avatar)][proposalId] = proposal; proposalsInfo[proposalId] = ProposalInfo({ @@ -164,10 +169,10 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe * @dev propose to remove a scheme for a controller * @param _avatar the address of the controller from which we want to remove a scheme * @param _scheme the address of the scheme we want to remove - * + * @param _descriptionHash proposal description hash * NB: not only registers the proposal, but also votes for it */ - function proposeToRemoveScheme(Avatar _avatar, address _scheme) + function proposeToRemoveScheme(Avatar _avatar, address _scheme, bytes32 _descriptionHash) public returns(bytes32) { @@ -179,7 +184,7 @@ contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExe organizationsProposals[address(_avatar)][proposalId].proposalType = 2; organizationsProposals[address(_avatar)][proposalId].scheme = _scheme; - emit RemoveSchemeProposal(address(_avatar), proposalId, address(intVote), _scheme); + emit RemoveSchemeProposal(address(_avatar), proposalId, address(intVote), _scheme, _descriptionHash); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, avatar:_avatar, diff --git a/contracts/universalSchemes/UpgradeScheme.sol b/contracts/universalSchemes/UpgradeScheme.sol index 2ec40a25..2bd5ec8e 100644 --- a/contracts/universalSchemes/UpgradeScheme.sol +++ b/contracts/universalSchemes/UpgradeScheme.sol @@ -17,7 +17,8 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, - address _newController + address _newController, + bytes32 _descriptionHash ); event ChangeUpgradeSchemeProposal( @@ -25,7 +26,8 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu bytes32 indexed _proposalId, address indexed _intVoteInterface, address _newUpgradeScheme, - bytes32 _params + bytes32 _params, + bytes32 _descriptionHash ); event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); @@ -114,9 +116,10 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu * @dev propose an upgrade of the organization's controller * @param _avatar avatar of the organization * @param _newController address of the new controller that is being proposed + * @param _descriptionHash proposal description hash * @return an id which represents the proposal */ - function proposeUpgrade(Avatar _avatar, address _newController) + function proposeUpgrade(Avatar _avatar, address _newController, bytes32 _descriptionHash) public returns(bytes32) { @@ -128,7 +131,13 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu params: bytes32(0) }); organizationsProposals[address(_avatar)][proposalId] = proposal; - emit NewUpgradeProposal(address(_avatar), proposalId, address(params.intVote), _newController); + emit NewUpgradeProposal( + address(_avatar), + proposalId, + address(params.intVote), + _newController, + _descriptionHash + ); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, avatar:_avatar, @@ -142,12 +151,14 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu * @param _avatar avatar of the organization * @param _scheme address of the new upgrading scheme * @param _params the parameters of the new upgrading scheme + * @param _descriptionHash proposal description hash * @return an id which represents the proposal */ function proposeChangeUpgradingScheme( Avatar _avatar, address _scheme, - bytes32 _params + bytes32 _params, + bytes32 _descriptionHash ) public returns(bytes32) @@ -169,7 +180,8 @@ contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu proposalId, address(params.intVote), _scheme, - _params + _params, + _descriptionHash ); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, diff --git a/contracts/universalSchemes/VestingScheme.sol b/contracts/universalSchemes/VestingScheme.sol index ef6da524..c3785293 100644 --- a/contracts/universalSchemes/VestingScheme.sol +++ b/contracts/universalSchemes/VestingScheme.sol @@ -16,7 +16,7 @@ contract VestingScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); - event AgreementProposal(address indexed _avatar, bytes32 indexed _proposalId); + event AgreementProposal(address indexed _avatar, bytes32 indexed _proposalId, bytes32 _descriptionHash); event NewVestedAgreement(uint256 indexed _agreementId); event ProposedVestedAgreement(uint256 indexed _agreementId, bytes32 indexed _proposalId); event SignToCancelAgreement(uint256 indexed _agreementId, address indexed _signer); @@ -109,6 +109,7 @@ contract VestingScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu * @param _signaturesReqToCancel number of signatures required to cancel agreement. * @param _signersArray avatar array of addresses that can sign to cancel agreement. * @param _avatar avatar of the organization. + * @param _descriptionHash proposal description hash * @return bytes32 the proposalId */ function proposeVestingAgreement( @@ -121,7 +122,8 @@ contract VestingScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu uint256 _cliffInPeriods, uint256 _signaturesReqToCancel, address[] calldata _signersArray, - Avatar _avatar + Avatar _avatar, + bytes32 _descriptionHash ) external returns(bytes32) @@ -152,7 +154,7 @@ contract VestingScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecu avatar:_avatar, votingMachine:address(params.intVote) }); - emit AgreementProposal(address(_avatar), proposalId); + emit AgreementProposal(address(_avatar), proposalId, _descriptionHash); return proposalId; } diff --git a/contracts/universalSchemes/VoteInOrganizationScheme.sol b/contracts/universalSchemes/VoteInOrganizationScheme.sol index e939904e..e5c52342 100644 --- a/contracts/universalSchemes/VoteInOrganizationScheme.sol +++ b/contracts/universalSchemes/VoteInOrganizationScheme.sol @@ -17,7 +17,8 @@ contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, Pr address indexed _intVoteInterface, IntVoteInterface _originalIntVote, bytes32 _originalProposalId, - uint256 _vote + uint256 _vote, + bytes32 _descriptionHash ); event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param, bytes _callReturnValue); @@ -56,11 +57,12 @@ contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, Pr delete organizationsProposals[address(avatar)][_proposalId]; emit ProposalDeleted(address(avatar), _proposalId); bytes memory callReturnValue; + bool success; // If no decision do nothing: if (_param == 1) { ControllerInterface controller = ControllerInterface(avatar.owner()); - callReturnValue = controller.genericCall( + (success, callReturnValue) = controller.genericCall( address(proposal.originalIntVote), abi.encodeWithSignature("vote(bytes32,uint256,uint256,address)", proposal.originalProposalId, @@ -69,6 +71,7 @@ contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, Pr address(this)), avatar ); + require(success); } emit ProposalExecuted(address(avatar), _proposalId, _param, callReturnValue); return true; @@ -112,9 +115,15 @@ contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, Pr * @param _originalIntVote the other organization voting machine * @param _originalProposalId the other organization proposal id * @param _vote - which value to vote in the destination organization + * @param _descriptionHash proposal description hash * @return an id which represents the proposal */ - function proposeVote(Avatar _avatar, IntVoteInterface _originalIntVote, bytes32 _originalProposalId, uint256 _vote) + function proposeVote( + Avatar _avatar, + IntVoteInterface _originalIntVote, + bytes32 _originalProposalId, + uint256 _vote, + bytes32 _descriptionHash) public returns(bytes32) { @@ -139,7 +148,8 @@ contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, Pr address(params.intVote), _originalIntVote, _originalProposalId, - _vote + _vote, + _descriptionHash ); proposalsInfo[proposalId] = ProposalInfo({ blockNumber:block.number, diff --git a/package.json b/package.json index cb00e1ee..76b8378f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@daostack/arc", - "version": "0.0.1-rc.2", + "version": "0.0.1-rc.3", "description": "A platform for building DAOs", "files": [ "contracts/", diff --git a/test/avatar.js b/test/avatar.js index 4fcd2204..d231feb6 100644 --- a/test/avatar.js +++ b/test/avatar.js @@ -37,10 +37,10 @@ contract('Avatar', accounts => { let b = actionMock.address; let c = "0x1234"; var result = await scheme.genericCallDirect.call(avatar.address,actionMock.address,a,b,c); - assert.equal(result,a*2); + assert.equal(result[1],a*2); }); - it("generic call should revert if action revert", async () => { + it("generic call should not revert if action revert", async () => { avatar = await setup(accounts); let actionMock = await ActionMock.new(); var scheme = await UniversalSchemeMock.new(); @@ -48,13 +48,7 @@ contract('Avatar', accounts => { let a = 7; let b = actionMock.address; let c = "0x4567"; //the action test function require 0x1234 - try{ - await scheme.genericCallDirect.call(avatar.address,actionMock.address,a,b,c); - assert(false,"generic call should revert if action revert "); - } - catch(ex){ - helpers.assertVMException(ex); - } + await scheme.genericCallDirect.call(avatar.address,actionMock.address,a,b,c); }); it("pay ether to avatar", async () => { diff --git a/test/controller.js b/test/controller.js index 2661df4d..f3ff3918 100644 --- a/test/controller.js +++ b/test/controller.js @@ -333,7 +333,7 @@ contract('Controller', accounts => { let c = "0x1234"; const encodeABI = await new web3.eth.Contract(actionMock.abi).methods.test(a,b,c).encodeABI(); var result = await controller.genericCall.call(actionMock.address,encodeABI,avatar.address); - assert.equal(result, 14); + assert.equal(result[1], 14); }); it("generic call withoutReturnValue", async () => { diff --git a/test/forwarder.js b/test/forwarder.js index 64ee5e0e..2fafabaa 100644 --- a/test/forwarder.js +++ b/test/forwarder.js @@ -79,15 +79,18 @@ contract('Forwarder', accounts => { methods. registerScheme(accounts[1],helpers.NULL_HASH,"0x0000001f",testSetupA.org.avatar.address). encodeABI(); - await helpers.increaseTime(301); - - try { - await controllerB.genericCall(testSetupA.forwarder.address,encodeABI,testSetupB.org.avatar.address); + //expiered + await helpers.increaseTime(301); - assert(false, "expired"); - } catch(error) { - helpers.assertVMException(error); - } + let tx = await controllerB.genericCall(testSetupA.forwarder.address,encodeABI,testSetupB.org.avatar.address); + await testSetupB.org.avatar.getPastEvents('GenericCall', { + fromBlock: tx.blockNumber, + toBlock: 'latest' + }) + .then(function(events){ + assert.equal(events[0].event,"GenericCall"); + assert.equal(events[0].args._success,false); + }); }); @@ -102,13 +105,16 @@ contract('Forwarder', accounts => { methods. registerScheme(accounts[1],helpers.NULL_HASH,"0x0000001f",testSetupA.org.avatar.address). encodeABI(); - try { - await controllerB.genericCall(testSetupA.forwarder.address,encodeABI,testSetupB.org.avatar.address); + let tx = await controllerB.genericCall(testSetupA.forwarder.address,encodeABI,testSetupB.org.avatar.address); + await testSetupB.org.avatar.getPastEvents('GenericCall', { + fromBlock: tx.blockNumber, + toBlock: 'latest' + }) + .then(function(events){ + assert.equal(events[0].event,"GenericCall"); + assert.equal(events[0].args._success,false); + }); - assert(false, "forwardCall is onlyOwner"); - } catch(error) { - helpers.assertVMException(error); - } }); it("unregisterSelf", async () => { diff --git a/test/genericscheme.js b/test/genericscheme.js index f920e942..23697dd7 100644 --- a/test/genericscheme.js +++ b/test/genericscheme.js @@ -86,7 +86,7 @@ contract('genericScheme', function(accounts) { var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address, - callData); + callData,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewCallProposal"); }); @@ -95,11 +95,12 @@ contract('genericScheme', function(accounts) { 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 tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal.passed,false); assert.equal(organizationProposal.callData,null); }); @@ -107,56 +108,108 @@ contract('genericScheme', function(accounts) { 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 tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],callData); + assert.equal(organizationProposal[0],callData,helpers.NULL_HASH); await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{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() { + it("execute proposeVote -positive decision - destination reverts", async function() { var actionMock =await ActionMock.new(); var testSetup = await setup(accounts,actionMock.address); var callData = await createCallToActionMock(helpers.NULL_ADDRESS,actionMock); - var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData); + var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); + + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + //actionMock revert because msg.sender is not the _addr param at actionMock thpugh the generic scheme not . + var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal.exist,true);//new contract address + assert.equal(organizationProposal.passed,true);//new contract address + //can call execute + await testSetup.genericScheme.execute(proposalId); + + }); + + + it("execute proposeVote -positive decision - destination reverts and then active", async function() { + var actionMock =await ActionMock.new(); + var testSetup = await setup(accounts,actionMock.address); + var activationTime = (await web3.eth.getBlock("latest")).timestamp + 1000; + await actionMock.setActivationTime(activationTime); + var callData = await new web3.eth.Contract(actionMock.abi).methods.test3().encodeABI(); + var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); + + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + //actionMock revert because msg.sender is not the _addr param at actionMock thpugh the generic scheme not . + var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal.exist,true);//new contract address + assert.equal(organizationProposal.passed,true);//new contract address + //can call execute + await testSetup.genericScheme.execute(proposalId); + await helpers.increaseTime(1001); + await testSetup.genericScheme.execute(proposalId); + + organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal.exist,false);//new contract address + assert.equal(organizationProposal.passed,false);//new contract address try { - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - assert(false, "should revert in actionMock because msg.sender is not the _addr param at actionMock"); + await testSetup.genericScheme.execute(proposalId); + assert(false, "cannot call execute after it been executed"); } 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 tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,encodeABI,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); + it("execute should fail if not executed from votingMachine", 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,helpers.NULL_HASH); + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); + + try { + await testSetup.genericScheme.execute(proposalId); + assert(false, "execute should fail if not executed from votingMachine"); + } catch(error) { + helpers.assertVMException(error); + } + + }); + it("execute proposeVote -positive decision - check action - with GenesisProtocol", async function() { var actionMock =await ActionMock.new(); var standardTokenMock = await ERC20Mock.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 tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.genericScheme.getPastEvents('ProposalExecuted', { + await testSetup.genericScheme.getPastEvents('ProposalExecutedByVotingMachine', { fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ProposalExecuted"); + assert.equal(events[0].event,"ProposalExecutedByVotingMachine"); assert.equal(events[0].args._param,1); }); }); @@ -167,15 +220,15 @@ contract('genericScheme', function(accounts) { 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 tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.genericScheme.getPastEvents('ProposalExecuted', { + await testSetup.genericScheme.getPastEvents('ProposalExecutedByVotingMachine', { fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ProposalExecuted"); + assert.equal(events[0].event,"ProposalExecutedByVotingMachine"); assert.equal(events[0].args._param,2); }); }); diff --git a/test/globalconstraintregistrar.js b/test/globalconstraintregistrar.js index 039f8275..5f10861d 100644 --- a/test/globalconstraintregistrar.js +++ b/test/globalconstraintregistrar.js @@ -72,7 +72,7 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - "0x1235"); + "0x1235",helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var voteToRemoveParams = await testSetup.globalConstraintRegistrar.voteToRemoveParams(testSetup.org.avatar.address, globalConstraintMock.address); @@ -86,7 +86,7 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - "0x1234"); + "0x1234",helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var organizationProposal = await testSetup.globalConstraintRegistrar.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],globalConstraintMock.address); @@ -99,7 +99,7 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - "0x1234"); + "0x1234",helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); }); @@ -115,7 +115,7 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); + testSetup.globalConstraintRegistrarParams.votingMachine.params,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); @@ -135,11 +135,11 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); + testSetup.globalConstraintRegistrarParams.votingMachine.params,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address); + globalConstraintMock.address,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); }); @@ -151,7 +151,7 @@ contract('GlobalConstraintRegistrar', accounts => { try{ await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, globalConstraintMock.address, - ); + helpers.NULL_HASH); assert(false,"proposeGlobalConstraint should fail - due to no registration !"); }catch(ex){ helpers.assertVMException(ex); @@ -167,12 +167,13 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); + testSetup.globalConstraintRegistrarParams.votingMachine.params,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await controller.isGlobalConstraintRegistered(globalConstraintMock.address,testSetup.org.avatar.address),true); tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address); + globalConstraintMock.address, + helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); @@ -192,7 +193,7 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); + testSetup.globalConstraintRegistrarParams.votingMachine.params,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let count = await controller.globalConstraintsCount(testSetup.org.avatar.address); @@ -212,7 +213,8 @@ contract('GlobalConstraintRegistrar', accounts => { var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); + testSetup.globalConstraintRegistrarParams.votingMachine.params, + helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); @@ -220,7 +222,8 @@ contract('GlobalConstraintRegistrar', accounts => { tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, globalConstraintMock.address, - ); + helpers.NULL_HASH); + proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var rep = await testSetup.org.reputation.balanceOf(accounts[2]); diff --git a/test/schemeregistrar.js b/test/schemeregistrar.js index 690ef77b..1c818f86 100644 --- a/test/schemeregistrar.js +++ b/test/schemeregistrar.js @@ -51,7 +51,11 @@ contract('SchemeRegistrar', accounts => { it("proposeScheme log", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address,helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address, + testSetup.schemeRegistrar.address, + helpers.NULL_HASH, + "0x00000000", + helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewSchemeProposal"); }); @@ -59,7 +63,9 @@ contract('SchemeRegistrar', accounts => { it("proposeToRemoveScheme log", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.schemeRegistrar.proposeToRemoveScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address); + var tx = await testSetup.schemeRegistrar.proposeToRemoveScheme(testSetup.org.avatar.address, + testSetup.schemeRegistrar.address, + helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RemoveSchemeProposal"); }); @@ -68,7 +74,7 @@ contract('SchemeRegistrar', accounts => { it("execute proposeScheme and execute -yes - fee > 0 ", async function() { var testSetup = await setup(accounts); var universalScheme = await UniversalScheme.new(); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -80,7 +86,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var permissions = "0x00000001"; - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -93,7 +99,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var permissions = "0x00000002"; - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -106,7 +112,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var permissions = "0x00000003"; - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -119,7 +125,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var permissions = "0x00000008"; - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -132,7 +138,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var permissions = "0x00000010"; - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -144,7 +150,7 @@ contract('SchemeRegistrar', accounts => { it("execute proposeScheme and execute -yes - isRegistering==FALSE ", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,"0x00000000",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -158,7 +164,7 @@ contract('SchemeRegistrar', accounts => { it("execute proposeScheme - no decision (same for remove scheme) - proposal data delete", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,"0x00000000",helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution var organizationProposal = await testSetup.schemeRegistrar.organizationsProposals(testSetup.org.avatar.address,proposalId); @@ -177,7 +183,7 @@ contract('SchemeRegistrar', accounts => { it("execute proposeToRemoveScheme ", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.schemeRegistrar.proposeToRemoveScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address); + var tx = await testSetup.schemeRegistrar.proposeToRemoveScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address,testSetup.org.avatar.address),true); @@ -192,7 +198,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var universalScheme = await UniversalScheme.new(); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -202,7 +208,7 @@ contract('SchemeRegistrar', accounts => { var testSetup = await setup(accounts); var universalScheme = await UniversalScheme.new(); - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); + var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); diff --git a/test/ucontroller.js b/test/ucontroller.js index 80638bf3..af4caead 100644 --- a/test/ucontroller.js +++ b/test/ucontroller.js @@ -341,7 +341,7 @@ contract('UController',accounts => { let c = "0x1234"; const encodeABI = await new web3.eth.Contract(actionMock.abi).methods.test(a,b,c).encodeABI(); var result = await controller.genericCall.call(actionMock.address,encodeABI,avatar.address); - assert.equal(result, 14); + assert.equal(result[1], 14); }); it("generic call withoutReturnValue", async () => { @@ -368,7 +368,7 @@ contract('UController',accounts => { let b = actionMock.address; let c = "0x1234"; let result = await scheme.genericCall.call(avatar.address,actionMock.address, a,b,c); - assert.equal(result, 14); + assert.equal(result[1], 14); }); diff --git a/test/upgradescheme.js b/test/upgradescheme.js index a5ec7338..eea99d04 100644 --- a/test/upgradescheme.js +++ b/test/upgradescheme.js @@ -84,7 +84,7 @@ contract('UpgradeScheme', accounts => { var testSetup = await setup(accounts); var newController = await setupNewController(accounts); - var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); + var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewUpgradeProposal"); var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1); @@ -94,7 +94,7 @@ contract('UpgradeScheme', accounts => { it("proposeChangeUpgradingScheme log", async function() { var testSetup = await setup(accounts); - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000000"); + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000000",helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "ChangeUpgradeSchemeProposal"); var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1); @@ -106,7 +106,7 @@ contract('UpgradeScheme', 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); + var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution @@ -125,7 +125,7 @@ contract('UpgradeScheme', accounts => { var testSetup = await setup(accounts); var newController = await setupNewController(accounts); - var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); + var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); @@ -146,7 +146,7 @@ contract('UpgradeScheme', accounts => { var testSetup = await setup(accounts); - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); @@ -176,7 +176,7 @@ contract('UpgradeScheme', accounts => { var testSetup = await setup(accounts); - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); @@ -206,7 +206,7 @@ contract('UpgradeScheme', accounts => { var testSetup = await setup(accounts); - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,testSetup.upgradeScheme.address,"0x00000002"); + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,testSetup.upgradeScheme.address,"0x00000002",helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); diff --git a/test/vestingscheme.js b/test/vestingscheme.js index a0a25fe8..2b0f2476 100644 --- a/test/vestingscheme.js +++ b/test/vestingscheme.js @@ -70,7 +70,8 @@ contract('VestingScheme', accounts => { 11, 3, signatures, - testSetup.org.avatar.address); + testSetup.org.avatar.address, + helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "AgreementProposal"); var avatarAddress = await helpers.getValueFromLogs(tx, '_avatar',1); @@ -96,7 +97,8 @@ contract('VestingScheme', accounts => { 11, _signaturesReqToCancel, _signersArray, - testSetup.org.avatar.address); + testSetup.org.avatar.address, + helpers.NULL_HASH); assert(false,"proposeVestingAgreement should fail - due to _signaturesReqToCancel > _signersArray.length !"); }catch(ex){ helpers.assertVMException(ex); @@ -116,7 +118,7 @@ contract('VestingScheme', accounts => { 0, 11, 3, [accounts[0], accounts[1], accounts[2]], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); assert(false, "proposeVestingAgreement should fail - due to _numOfAgreedPeriods > 0 !"); } catch (ex) { helpers.assertVMException(ex); @@ -137,7 +139,7 @@ contract('VestingScheme', accounts => { 11, 0, [], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); @@ -165,7 +167,7 @@ contract('VestingScheme', accounts => { 11, 0, [], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution @@ -190,7 +192,7 @@ contract('VestingScheme', accounts => { 11, 0, [], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution var organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); @@ -216,7 +218,7 @@ contract('VestingScheme', accounts => { 11, 0, [], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution var organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); @@ -245,7 +247,7 @@ contract('VestingScheme', accounts => { 11, 0, [], - testSetup.org.avatar.address); + testSetup.org.avatar.address,helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //check organizationsProposals before execution diff --git a/test/voteinorganization.js b/test/voteinorganization.js index 11af9977..347b0160 100644 --- a/test/voteinorganization.js +++ b/test/voteinorganization.js @@ -102,7 +102,7 @@ contract('VoteInOrganizationScheme', accounts => { const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - proposalId,1); + 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); @@ -123,7 +123,7 @@ contract('VoteInOrganizationScheme', accounts => { tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId,1); + 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 @@ -149,7 +149,7 @@ contract('VoteInOrganizationScheme', accounts => { tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId,1); + originalProposalId,1,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); var organizationProposal = await testSetup.voteInOrganization.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);//new contract address @@ -174,7 +174,7 @@ contract('VoteInOrganizationScheme', accounts => { const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId,1); + 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]]); @@ -200,7 +200,7 @@ contract('VoteInOrganizationScheme', accounts => { var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address, - originalProposalId,1); + 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]);