diff --git a/contracts/schemes/ArcScheme.sol b/contracts/schemes/ArcScheme.sol index 96133b6f..f7814272 100644 --- a/contracts/schemes/ArcScheme.sol +++ b/contracts/schemes/ArcScheme.sol @@ -4,12 +4,20 @@ import "../controller/Avatar.sol"; import "@daostack/infra-experimental/contracts/votingMachines/GenesisProtocol.sol"; import "@daostack/infra-experimental/contracts/votingMachines/IntVoteInterface.sol"; import "@openzeppelin/upgrades/contracts/Initializable.sol"; +import "../utils/DAOFactory.sol"; +import "../libs/StringUtil.sol"; contract ArcScheme is Initializable { + using StringUtil for string; Avatar public avatar; IntVoteInterface public votingMachine; - bytes32 public voteParamsHash; + + string public constant GENESIS_PROTOCOL_INIT_FUNC_SIGNATURE = + "initialize(address,uint256[11],address,address,address,address)"; + + string public constant ABSOLUTE_VOTE_INIT_FUNC_SIGNATURE = + "initialize(uint256,address,address,address,address)"; /** * @dev _initialize @@ -24,35 +32,60 @@ contract ArcScheme is Initializable { /** * @dev _initializeGovernance * @param _avatar the scheme avatar - * @param _votingMachine the scheme voting machine - * @param _voteParamsHash the scheme vote params * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _callbacks should fulfill voting callbacks interface + * @param _authorizedToPropose only this address allow to propose (unless it is zero) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function _initializeGovernance( Avatar _avatar, - IntVoteInterface _votingMachine, - bytes32 _voteParamsHash, uint256[11] memory _votingParams, - address _voteOnBehalf + address _voteOnBehalf, + DAOFactory _daoFactory, + address _stakingToken, + address _callbacks, + address _authorizedToPropose, + uint64[3] memory _packageVersion, + string memory _votingMachineName ) internal { - require(_votingMachine != IntVoteInterface(0), "votingMachine cannot be zero"); + + require(_daoFactory != DAOFactory(0), "daoFactory cannot be zero"); + require( + _daoFactory.getImplementation(_packageVersion, _votingMachineName) != address(0), + "votingMachine name does not exist in ArcHive" + ); _initialize(_avatar); - votingMachine = _votingMachine; - if (_voteParamsHash == bytes32(0)) { - //genesisProtocol - GenesisProtocol genesisProtocol = GenesisProtocol(address(_votingMachine)); - voteParamsHash = genesisProtocol.getParametersHash(_votingParams, _voteOnBehalf); - (uint256 queuedVoteRequiredPercentage, , , , , , , , , , , ,) = - genesisProtocol.parameters(voteParamsHash); - if (queuedVoteRequiredPercentage == 0) { - //params not set already - genesisProtocol.setParameters(_votingParams, _voteOnBehalf); - } + + bytes memory initData; + if (_votingMachineName.hashCompareWithLengthCheck("GenesisProtocol")) { + initData = abi.encodeWithSignature( + GENESIS_PROTOCOL_INIT_FUNC_SIGNATURE, + _stakingToken, + _votingParams, + _voteOnBehalf, + avatar, + _callbacks, + _authorizedToPropose); } else { - //for other voting machines - voteParamsHash = _voteParamsHash; + initData = abi.encodeWithSignature( + ABSOLUTE_VOTE_INIT_FUNC_SIGNATURE, + _votingParams[0], + _voteOnBehalf, + avatar, + _callbacks, + _authorizedToPropose); } + + votingMachine = IntVoteInterface(address(_daoFactory.createInstance( + _packageVersion, + _votingMachineName, + address(avatar), + initData))); + } } diff --git a/contracts/schemes/Auction4Reputation.sol b/contracts/schemes/Auction4Reputation.sol index 847f0ef5..12ed94fc 100644 --- a/contracts/schemes/Auction4Reputation.sol +++ b/contracts/schemes/Auction4Reputation.sol @@ -34,7 +34,6 @@ contract Auction4Reputation is Agreement, ArcScheme { uint256 public auctionPeriod; uint256 public redeemEnableTime; IERC20 public token; - address public wallet; /** * @dev initialize @@ -49,9 +48,6 @@ contract Auction4Reputation is Agreement, ArcScheme { * @param _redeemEnableTime redeem enable time . * redeem reputation can be done after this time. * @param _token the bidding token - * @param _wallet the address of the wallet the token will be transfer to. - * Please note that _wallet address should be a trusted account. - * Normally this address should be set as the DAO's avatar address. * @param _agreementHash is a hash of agreement required to be added to the TX by participants */ function initialize( @@ -62,7 +58,6 @@ contract Auction4Reputation is Agreement, ArcScheme { uint256 _numberOfAuctions, uint256 _redeemEnableTime, IERC20 _token, - address _wallet, bytes32 _agreementHash ) external { @@ -76,7 +71,6 @@ contract Auction4Reputation is Agreement, ArcScheme { token = _token; auctionsStartTime = _auctionsStartTime; numberOfAuctions = _numberOfAuctions; - wallet = _wallet; auctionReputationReward = _auctionReputationReward; reputationRewardLeft = _auctionReputationReward.mul(_numberOfAuctions); redeemEnableTime = _redeemEnableTime; @@ -133,14 +127,14 @@ contract Auction4Reputation is Agreement, ArcScheme { } /** - * @dev transferToWallet transfer the tokens to the wallet. + * @dev transferToWallet transfer the tokens to the avatar. * can be called only after auctionsEndTime */ function transferToWallet() public { // solhint-disable-next-line not-rely-on-time require(now > auctionsEndTime, "now > auctionsEndTime"); uint256 tokenBalance = token.balanceOf(address(this)); - token.safeTransfer(wallet, tokenBalance); + token.safeTransfer(address(avatar), tokenBalance); } /** diff --git a/contracts/schemes/ContributionReward.sol b/contracts/schemes/ContributionReward.sol index e1c49020..6a0e75bf 100644 --- a/contracts/schemes/ContributionReward.sol +++ b/contracts/schemes/ContributionReward.sol @@ -65,22 +65,35 @@ contract ContributionReward is /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external initializer { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); } /** @@ -127,7 +140,7 @@ contract ContributionReward is returns(bytes32) { validateProposalParams(_reputationChange, _rewards); - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); address payable beneficiary = _beneficiary; if (beneficiary == address(0)) { beneficiary = msg.sender; diff --git a/contracts/schemes/ContributionRewardExt.sol b/contracts/schemes/ContributionRewardExt.sol index 455d181b..b8eaf895 100644 --- a/contracts/schemes/ContributionRewardExt.sol +++ b/contracts/schemes/ContributionRewardExt.sol @@ -83,33 +83,40 @@ contract ContributionRewardExt is VotingMachineCallbacks, ProposalExecuteInterfa /** * @dev initialize - * @param _avatar the avatar to mint reputation from - * @param _votingMachine the voting machines address - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters - * @param _daoFactory DAOFactory instance to instance a rewarder. - * if _daoFactory is zero so no rewarder will be set. - * @param _packageVersion packageVersion to instance the rewarder from. + * @param _avatar the avatar this scheme referring to. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. * @param _rewarderName the rewarder contract name. - */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, - uint[11] calldata _votingParams, + uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, DAOFactory _daoFactory, + address _stakingToken, uint64[3] calldata _packageVersion, + string calldata _votingMachineName, string calldata _rewarderName ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); vault = new Vault(); vault.initialize(address(this)); - if (_daoFactory != DAOFactory(0)) { + if (bytes(_rewarderName).length != 0) { rewarder = address(_daoFactory.createInstance( _packageVersion, _rewarderName, @@ -163,7 +170,7 @@ contract ContributionRewardExt is VotingMachineCallbacks, ProposalExecuteInterfa if (proposer == address(0)) { proposer = msg.sender; } - proposalId = votingMachine.propose(2, voteParamsHash, proposer, address(avatar)); + proposalId = votingMachine.propose(2, proposer); address payable beneficiary = _beneficiary; if (beneficiary == address(0)) { beneficiary = msg.sender; diff --git a/contracts/schemes/ControllerUpgradeScheme.sol b/contracts/schemes/ControllerUpgradeScheme.sol index 47df3d12..635a3301 100644 --- a/contracts/schemes/ControllerUpgradeScheme.sol +++ b/contracts/schemes/ControllerUpgradeScheme.sol @@ -41,21 +41,34 @@ contract ControllerUpgradeScheme is VotingMachineCallbacks, ProposalExecuteInter /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); } /** @@ -103,7 +116,7 @@ contract ControllerUpgradeScheme is VotingMachineCallbacks, ProposalExecuteInter public returns(bytes32) { - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); UpgradeProposal memory proposal = UpgradeProposal({ proposalType: 1, upgradeContract: _newController @@ -135,7 +148,7 @@ contract ControllerUpgradeScheme is VotingMachineCallbacks, ProposalExecuteInter public returns(bytes32) { - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); require(organizationProposals[proposalId].proposalType == 0); UpgradeProposal memory proposal = UpgradeProposal({ diff --git a/contracts/schemes/FundingRequest.sol b/contracts/schemes/FundingRequest.sol index ec99430b..3665a490 100644 --- a/contracts/schemes/FundingRequest.sol +++ b/contracts/schemes/FundingRequest.sol @@ -46,23 +46,36 @@ contract FundingRequest is /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. * @param _fundingToken token to transfer to funding requests. 0x0 address for the native coin */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, IERC20 _fundingToken ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); fundingToken = _fundingToken; } @@ -104,7 +117,7 @@ contract FundingRequest is avatar.db(FUNDED_BEFORE_DEADLINE_KEY).hashCompareWithLengthCheck(FUNDED_BEFORE_DEADLINE_VALUE), "funding is not allowed yet" ); - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); address payable beneficiary = _beneficiary; if (beneficiary == address(0)) { beneficiary = msg.sender; diff --git a/contracts/schemes/GenericScheme.sol b/contracts/schemes/GenericScheme.sol index 229ee307..5a4c2fe6 100644 --- a/contracts/schemes/GenericScheme.sol +++ b/contracts/schemes/GenericScheme.sol @@ -47,24 +47,37 @@ contract GenericScheme is VotingMachineCallbacks, ProposalExecuteInterface { /** * @dev initialize - * @param _avatar the avatar to mint reputation from - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _avatar the avatar this scheme referring to. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. * @param _contractToCall the target contract this scheme will call to */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, address _contractToCall ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); contractToCall = _contractToCall; } @@ -129,7 +142,7 @@ contract GenericScheme is VotingMachineCallbacks, ProposalExecuteInterface { public returns(bytes32) { - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); organizationProposals[proposalId] = CallProposal({ callData: _callData, diff --git a/contracts/schemes/GlobalConstraintRegistrar.sol b/contracts/schemes/GlobalConstraintRegistrar.sol index 1d44d503..4ae6ae56 100644 --- a/contracts/schemes/GlobalConstraintRegistrar.sol +++ b/contracts/schemes/GlobalConstraintRegistrar.sol @@ -10,12 +10,12 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @dev The scheme is used to register or remove new global constraints */ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInterface { + event NewGlobalConstraintsProposal( address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, address _gc, - bytes32 _voteToRemoveParams, string _descriptionHash ); @@ -29,39 +29,47 @@ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInt event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); - event D(bool x); // The struct that holds the information of a global constraint proposed to be added or removed. struct GCProposal { address gc; // The address of the global constraint contract. bool addGC; // true: add a GC, false: remove a GC. - bytes32 voteToRemoveParams; // Voting parameters for removing this GC. } // GCProposal by avatar and proposalId mapping(bytes32=>GCProposal) public organizationProposals; - // voteToRemoveParams hash by avatar and proposal.gc - mapping(address=>bytes32) public voteToRemoveParams; - /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); } /** @@ -91,7 +99,6 @@ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInt // Adding a GC if (proposal.addGC) { retVal = controller.addGlobalConstraint(proposal.gc); - voteToRemoveParams[proposal.gc] = proposal.voteToRemoveParams; } // Removing a GC if (!proposal.addGC) { @@ -105,23 +112,21 @@ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInt /** * @dev propose to add a new global constraint: * @param _gc the address of the global constraint that is being proposed - * @param _voteToRemoveParams the conditions (on the voting machine) for removing this global constraint * @param _descriptionHash proposal's description hash * @return bytes32 -the proposal id */ function proposeGlobalConstraint( address _gc, - bytes32 _voteToRemoveParams, - string memory _descriptionHash) - public + string calldata _descriptionHash + ) + external returns(bytes32) { - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, msg.sender); GCProposal memory proposal = GCProposal({ gc: _gc, - addGC: true, - voteToRemoveParams: _voteToRemoveParams + addGC: true }); organizationProposals[proposalId] = proposal; @@ -130,7 +135,6 @@ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInt proposalId, address(votingMachine), _gc, - _voteToRemoveParams, _descriptionHash ); proposalsBlockNumber[proposalId] = block.number; @@ -146,17 +150,11 @@ contract GlobalConstraintRegistrar is VotingMachineCallbacks, ProposalExecuteInt function proposeToRemoveGC(address _gc, string memory _descriptionHash) public returns(bytes32) { Controller controller = Controller(avatar.owner()); require(controller.isGlobalConstraintRegistered(_gc), "proposed gc is not register"); - bytes32 proposalId = votingMachine.propose( - 2, - voteToRemoveParams[_gc], - msg.sender, - address(avatar) - ); + bytes32 proposalId = votingMachine.propose(2, msg.sender); GCProposal memory proposal = GCProposal({ gc: _gc, - addGC: false, - voteToRemoveParams: 0 + addGC: false }); organizationProposals[proposalId] = proposal; diff --git a/contracts/schemes/JoinAndQuit.sol b/contracts/schemes/JoinAndQuit.sol index 97d1be7f..2fb09d0b 100644 --- a/contracts/schemes/JoinAndQuit.sol +++ b/contracts/schemes/JoinAndQuit.sol @@ -1,4 +1,5 @@ pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; import "../votingMachines/VotingMachineCallbacks.sol"; import "../libs/StringUtil.sol"; @@ -66,51 +67,72 @@ contract JoinAndQuit is mapping(bytes32=>Proposal) public proposals; mapping(address=>MemberFund) public fundings; - IERC20 public fundingToken; - uint256 public minFeeToJoin; - uint256 public memberReputation; - uint256 public fundingGoal; - uint256 public fundingGoalDeadline; + struct JoinAndQuitParams { + IERC20 fundingToken; //the funding token - if this is zero the donation will be in native token ETH + uint256 minFeeToJoin; //minimum fee required to join + uint256 memberReputation; //the repution which will be allocated for members + //if this param is zero so the repution will be + //allocated proportional to the fee paid + uint256 fundingGoal; //the funding goal + uint256 fundingGoalDeadline; //the funding goal deadline + bool rageQuitEnable; //rageQuit enabling flag + } + + JoinAndQuitParams public joinAndQuitParams; uint256 public totalDonation; - bool public rageQuitEnable; /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. - * @param _fundingToken the funding token - if this is zero the donation will be in native token ETH - * @param _minFeeToJoin minimum fee required to join - * @param _memberReputation the repution which will be allocated for members - if this param is zero so the repution will be allocated proportional to the fee paid - * @param _fundingGoal the funding goal - * @param _fundingGoalDeadline the funding goal deadline - * @param _rageQuitEnable rageQuit enabling flag + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. + * @param _encodedJoinAndQuitParams encoded JoinAndQuitParams */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, - IERC20 _fundingToken, - uint256 _minFeeToJoin, - uint256 _memberReputation, - uint256 _fundingGoal, - uint256 _fundingGoalDeadline, - bool _rageQuitEnable + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, + bytes calldata _encodedJoinAndQuitParams ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); - fundingToken = _fundingToken; - minFeeToJoin = _minFeeToJoin; - memberReputation = _memberReputation; - fundingGoal = _fundingGoal; - fundingGoalDeadline = _fundingGoalDeadline; - rageQuitEnable = _rageQuitEnable; + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); + + ( + address fundingToken, + uint256 minFeeToJoin, + uint256 memberReputation, + uint256 fundingGoal, + uint256 fundingGoalDeadline, + bool rageQuitEnable + ) = + abi.decode(_encodedJoinAndQuitParams, (address, uint256, uint256, uint256, uint256, bool)); + + joinAndQuitParams = JoinAndQuitParams({ + fundingToken: IERC20(fundingToken), + minFeeToJoin: minFeeToJoin, + memberReputation: memberReputation, + fundingGoal: fundingGoal, + fundingGoalDeadline: fundingGoalDeadline, + rageQuitEnable: rageQuitEnable + }); } /** @@ -129,23 +151,23 @@ contract JoinAndQuit is // Check if vote was successful: if ((_decision == 1) && (avatar.nativeReputation().balanceOf(proposal.proposedMember) == 0)) { proposals[_proposalId].accepted = true; - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { // solhint-disable-next-line avoid-call-value (success, ) = address(avatar).call.value(proposal.funding)(""); require(success, "sendEther to avatar failed"); } else { - fundingToken.safeTransfer(address(avatar), proposal.funding); + joinAndQuitParams.fundingToken.safeTransfer(address(avatar), proposal.funding); } fundings[proposal.proposedMember].funding = proposal.funding; totalDonation = totalDonation.add(proposal.funding); setFundingGoalReachedFlag(); } else { - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { // solhint-disable-next-line avoid-call-value (success, ) = proposal.proposedMember.call.value(proposal.funding)(""); require(success, "sendEther to avatar failed"); } else { - fundingToken.safeTransfer(proposal.proposedMember, proposal.funding); + joinAndQuitParams.fundingToken.safeTransfer(proposal.proposedMember, proposal.funding); } } fundings[proposal.proposedMember].candidate = false; @@ -170,14 +192,14 @@ contract JoinAndQuit is address proposer = msg.sender; require(!fundings[proposer].candidate, "already a candidate"); require(avatar.nativeReputation().balanceOf(proposer) == 0, "already a member"); - require(_feeAmount >= minFeeToJoin, "_feeAmount should be >= then the minFeeToJoin"); + require(_feeAmount >= joinAndQuitParams.minFeeToJoin, "_feeAmount should be >= then the minFeeToJoin"); fundings[proposer].candidate = true; - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { require(_feeAmount == msg.value, "ETH received shoul match the _feeAmount"); } else { - fundingToken.safeTransferFrom(proposer, address(this), _feeAmount); + joinAndQuitParams.fundingToken.safeTransferFrom(proposer, address(this), _feeAmount); } - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, proposer, address(avatar)); + bytes32 proposalId = votingMachine.propose(2, proposer); Proposal memory proposal = Proposal({ accepted: false, @@ -211,10 +233,10 @@ contract JoinAndQuit is //set proposal proposedMember to zero to prevent reentrancy attack. proposal.proposedMember = address(0); require(proposal.accepted == true, " proposal not accepted"); - if (memberReputation == 0) { + if (joinAndQuitParams.memberReputation == 0) { reputation = _proposal.funding; } else { - reputation = memberReputation; + reputation = joinAndQuitParams.memberReputation; } require( Controller( @@ -228,7 +250,7 @@ contract JoinAndQuit is */ function refund() public returns(uint256 refundAmount) { // solhint-disable-next-line not-rely-on-time - require(now > fundingGoalDeadline, "can refund only after fundingGoalDeadline"); + require(now > joinAndQuitParams.fundingGoalDeadline, "can refund only after fundingGoalDeadline"); require( (avatar.db(FUNDED_BEFORE_DEADLINE_KEY).hashCompareWithLengthCheck(FUNDED_BEFORE_DEADLINE_VALUE) == false), "can refund only if funding goal not reached"); @@ -246,15 +268,16 @@ contract JoinAndQuit is * @return refundAmount the refund amount */ function rageQuit() public returns(uint256 refundAmount) { - require(rageQuitEnable, "RageQuit disabled"); + require(joinAndQuitParams.rageQuitEnable, "RageQuit disabled"); require(fundings[msg.sender].funding > 0, "no fund to RageQuit"); uint256 userDonation = fundings[msg.sender].funding; fundings[msg.sender].funding = 0; fundings[msg.sender].rageQuit = true; - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { refundAmount = userDonation.mul(address(avatar.vault()).balance).div(totalDonation); } else { - refundAmount = userDonation.mul(fundingToken.balanceOf(address(avatar))).div(totalDonation); + refundAmount = + userDonation.mul(joinAndQuitParams.fundingToken.balanceOf(address(avatar))).div(totalDonation); } sendToBeneficiary(refundAmount, msg.sender); uint256 msgSenderReputation = avatar.nativeReputation().balanceOf(msg.sender); @@ -270,16 +293,16 @@ contract JoinAndQuit is */ function setFundingGoalReachedFlag() public { uint256 avatarBalance; - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { avatarBalance = (address(avatar.vault())).balance; } else { - avatarBalance = fundingToken.balanceOf(address(avatar)); + avatarBalance = joinAndQuitParams.fundingToken.balanceOf(address(avatar)); } if ((avatar.db(CommonInterface.FUNDED_BEFORE_DEADLINE_KEY) .hashCompareWithLengthCheck(CommonInterface.FUNDED_BEFORE_DEADLINE_VALUE) == false) && - (avatarBalance >= fundingGoal) && + (avatarBalance >= joinAndQuitParams.fundingGoal) && // solhint-disable-next-line not-rely-on-time - (now < fundingGoalDeadline)) { + (now < joinAndQuitParams.fundingGoalDeadline)) { require( Controller( avatar.owner()). @@ -294,14 +317,15 @@ contract JoinAndQuit is * @param _beneficiary the beneficiary */ function sendToBeneficiary(uint256 _amount, address payable _beneficiary) private { - if (fundingToken == IERC20(0)) { + if (joinAndQuitParams.fundingToken == IERC20(0)) { require( Controller( avatar.owner()).sendEther(_amount, _beneficiary), "send ether failed"); } else { require( Controller( - avatar.owner()).externalTokenTransfer(fundingToken, _beneficiary, _amount), "send token failed"); + avatar.owner()).externalTokenTransfer(joinAndQuitParams.fundingToken, _beneficiary, _amount), + "send token failed"); } } diff --git a/contracts/schemes/SchemeFactory.sol b/contracts/schemes/SchemeFactory.sol index cc805d79..7e925014 100644 --- a/contracts/schemes/SchemeFactory.sol +++ b/contracts/schemes/SchemeFactory.sol @@ -42,23 +42,35 @@ contract SchemeFactory is VotingMachineCallbacks, ProposalExecuteInterface { /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters to register scheme. - * @param _daoFactory daoFactory contract + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, - DAOFactory _daoFactory + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); daoFactory = _daoFactory; } @@ -132,12 +144,7 @@ contract SchemeFactory is VotingMachineCallbacks, ProposalExecuteInterface { revert("proposal must have a scheme name to reister or address to unregister"); } - bytes32 proposalId = votingMachine.propose( - 2, - voteParamsHash, - msg.sender, - address(avatar) - ); + bytes32 proposalId = votingMachine.propose(2, msg.sender); Proposal memory proposal = Proposal({ schemeName: _schemeName, diff --git a/contracts/schemes/SchemeRegistrar.sol b/contracts/schemes/SchemeRegistrar.sol index e22608c0..c9cba51d 100644 --- a/contracts/schemes/SchemeRegistrar.sol +++ b/contracts/schemes/SchemeRegistrar.sol @@ -43,57 +43,34 @@ contract SchemeRegistrar is VotingMachineCallbacks, ProposalExecuteInterface { /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParamsRegister genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalfRegister genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteRegisterParamsHash voting machine parameters to register scheme. - * @param _votingParamsRemove genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalfRemove genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteRemoveParamsHash voting machine parameters to remove scheme. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, - uint[11] calldata _votingParamsRegister, - address _voteOnBehalfRegister, - bytes32 _voteRegisterParamsHash, - uint[11] calldata _votingParamsRemove, - address _voteOnBehalfRemove, - bytes32 _voteRemoveParamsHash + uint256[11] calldata _votingParams, + address _voteOnBehalf, + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external { - super._initialize(_avatar); - votingMachine = _votingMachine; - if (_voteRegisterParamsHash == bytes32(0)) { - //genesisProtocol - GenesisProtocol genesisProtocol = GenesisProtocol(address(_votingMachine)); - voteRegisterParamsHash = genesisProtocol.getParametersHash(_votingParamsRegister, _voteOnBehalfRegister); - (uint256 queuedVoteRequiredPercentage, , , , , , , , , , , ,) = - genesisProtocol.parameters(voteRegisterParamsHash); - if (queuedVoteRequiredPercentage == 0) { - //params not set already - genesisProtocol.setParameters(_votingParamsRegister, _voteOnBehalfRegister); - } - } else { - //for other voting machines - voteRegisterParamsHash = _voteRegisterParamsHash; - } - - if (_voteRemoveParamsHash == bytes32(0)) { - //genesisProtocol - GenesisProtocol genesisProtocol = GenesisProtocol(address(_votingMachine)); - voteRemoveParamsHash = genesisProtocol.getParametersHash(_votingParamsRemove, _voteOnBehalfRemove); - (uint256 queuedVoteRequiredPercentage, , , , , , , , , , , ,) = - genesisProtocol.parameters(voteRemoveParamsHash); - if (queuedVoteRequiredPercentage == 0) { - //params not set already - genesisProtocol.setParameters(_votingParamsRemove, _voteOnBehalfRemove); - } - } else { - //for other voting machines - voteRemoveParamsHash = _voteRemoveParamsHash; - } + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); } /** @@ -144,17 +121,12 @@ contract SchemeRegistrar is VotingMachineCallbacks, ProposalExecuteInterface { string memory _descriptionHash ) public - returns(bytes32) + returns(bytes32 proposalId) { // propose require(_scheme != address(0), "scheme cannot be zero"); - bytes32 proposalId = votingMachine.propose( - 2, - voteRegisterParamsHash, - msg.sender, - address(avatar) - ); + proposalId = votingMachine.propose(2, msg.sender); SchemeProposal memory proposal = SchemeProposal({ scheme: _scheme, @@ -171,7 +143,6 @@ contract SchemeRegistrar is VotingMachineCallbacks, ProposalExecuteInterface { ); organizationProposals[proposalId] = proposal; proposalsBlockNumber[proposalId] = block.number; - return proposalId; } /** @@ -182,14 +153,13 @@ contract SchemeRegistrar is VotingMachineCallbacks, ProposalExecuteInterface { */ function proposeToRemoveScheme(address _scheme, string memory _descriptionHash) public - returns(bytes32) + returns(bytes32 proposalId) { require(_scheme != address(0), "scheme cannot be zero"); - bytes32 proposalId = votingMachine.propose(2, voteRemoveParamsHash, msg.sender, address(avatar)); + proposalId = votingMachine.propose(2, msg.sender); organizationProposals[proposalId].scheme = _scheme; emit RemoveSchemeProposal(address(avatar), proposalId, address(votingMachine), _scheme, _descriptionHash); proposalsBlockNumber[proposalId] = block.number; - return proposalId; } } diff --git a/contracts/schemes/SignalScheme.sol b/contracts/schemes/SignalScheme.sol index 3312855d..9178ccfc 100644 --- a/contracts/schemes/SignalScheme.sol +++ b/contracts/schemes/SignalScheme.sol @@ -30,41 +30,43 @@ contract SignalScheme is VotingMachineCallbacks, ProposalExecuteInterface { bool executed; } - struct Parameters { - bytes32 voteApproveParams; - IntVoteInterface intVote; - uint256 signalType; - Avatar avatar; - } + uint256 public signalType; mapping(bytes32 => Proposal) public proposals; - Parameters public params; - /** * @dev initialize - * @param _avatar the scheme avatar + * @param _avatar the avatar this scheme referring to. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. * @param _signalType - signal types - * @param _voteApproveParams voting machine params - * @param _votingMachine voting machine address - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero */ - function initialize(Avatar _avatar, - uint256 _signalType, - bytes32 _voteApproveParams, - IntVoteInterface _votingMachine, - uint256[11] calldata _votingParams, - address _voteOnBehalf) + function initialize( + Avatar _avatar, + uint256[11] calldata _votingParams, + address _voteOnBehalf, + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, + uint256 _signalType) external initializer { - super._initializeGovernance(_avatar, _votingMachine, _voteApproveParams, _votingParams, _voteOnBehalf); - params = Parameters({ - voteApproveParams: voteParamsHash, - signalType: _signalType, - intVote: _votingMachine, - avatar: _avatar - }); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); + signalType = _signalType; } /** @@ -75,29 +77,23 @@ contract SignalScheme is VotingMachineCallbacks, ProposalExecuteInterface { string calldata _descriptionHash ) external - returns(bytes32) + returns(bytes32 proposalId) { - require(Controller(params.avatar.owner()).isSchemeRegistered(address(this)), + require(Controller(avatar.owner()).isSchemeRegistered(address(this)), "scheme is not registered"); - bytes32 proposalId = params.intVote.propose( - 2, - params.voteApproveParams, - msg.sender, - address(params.avatar) - ); + proposalId = votingMachine.propose(2, msg.sender); proposals[proposalId].descriptionHash = _descriptionHash; emit NewSignalProposal( - address(params.avatar), + address(avatar), proposalId, - params.signalType, + signalType, _descriptionHash ); proposalsBlockNumber[proposalId] = block.number; - return proposalId; } /** @@ -110,9 +106,9 @@ contract SignalScheme is VotingMachineCallbacks, ProposalExecuteInterface { proposals[_proposalId].executed = true; // Check if vote was successful: if (_param == 1) { - emit Signal(address(params.avatar), + emit Signal(address(avatar), _proposalId, - params.signalType, + signalType, proposals[_proposalId].descriptionHash); } return true; diff --git a/contracts/schemes/UpgradeScheme.sol b/contracts/schemes/UpgradeScheme.sol index c38ae0ed..2f50fcb7 100644 --- a/contracts/schemes/UpgradeScheme.sol +++ b/contracts/schemes/UpgradeScheme.sol @@ -46,23 +46,38 @@ contract UpgradeScheme is VotingMachineCallbacks, ProposalExecuteInterface { /** * @dev initialize - * @param _avatar the avatar to mint reputation from - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _avatar the avatar this scheme referring to. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. + * @param _arcPackage the arc package to upgrade from */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, - Package _package + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, + Package _arcPackage ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); - arcPackage = _package; + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); + arcPackage = _arcPackage; } /** @@ -118,7 +133,7 @@ contract UpgradeScheme is VotingMachineCallbacks, ProposalExecuteInterface { address[] memory _contractsToUpgrade, string memory _descriptionHash) public - returns(bytes32) + returns(bytes32 proposalId) { require(_contractsNames.length <= 60, "can upgrade up to 60 contracts at a time"); require( @@ -135,7 +150,7 @@ contract UpgradeScheme is VotingMachineCallbacks, ProposalExecuteInterface { ); } - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + proposalId = votingMachine.propose(2, msg.sender); organizationProposals[proposalId] = Proposal({ packageVersion: _packageVersion, @@ -152,6 +167,5 @@ contract UpgradeScheme is VotingMachineCallbacks, ProposalExecuteInterface { _contractsToUpgrade, _descriptionHash ); - return proposalId; } } diff --git a/contracts/schemes/VoteInOrganizationScheme.sol b/contracts/schemes/VoteInOrganizationScheme.sol index 3b18d9d9..bd7111f7 100644 --- a/contracts/schemes/VoteInOrganizationScheme.sol +++ b/contracts/schemes/VoteInOrganizationScheme.sol @@ -34,21 +34,34 @@ contract VoteInOrganizationScheme is VotingMachineCallbacks, ProposalExecuteInte /** * @dev initialize * @param _avatar the avatar this scheme referring to. - * @param _votingMachine the voting machines address to - * @param _votingParams genesisProtocol parameters - valid only if _voteParamsHash is zero - * @param _voteOnBehalf genesisProtocol parameter - valid only if _voteParamsHash is zero - * @param _voteParamsHash voting machine parameters. + * @param _votingParams genesisProtocol parameters + * @param _voteOnBehalf parameter + * @param _daoFactory DAOFactory instance to instance a votingMachine. + * @param _stakingToken (for GenesisProtocol) + * @param _packageVersion packageVersion to instance the votingMachine from. + * @param _votingMachineName the votingMachine contract name. */ function initialize( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); } /** @@ -102,14 +115,14 @@ contract VoteInOrganizationScheme is VotingMachineCallbacks, ProposalExecuteInte uint256 _vote, string memory _descriptionHash) public - returns(bytes32) + returns(bytes32 proposalId) { (uint256 minVote, uint256 maxVote) = _originalIntVote.getAllowedRangeOfChoices(); require(_vote <= maxVote && _vote >= minVote, "vote should be in the allowed range"); require(_vote <= _originalIntVote.getNumberOfChoices(_originalProposalId), "vote should be <= original proposal number of choices"); - bytes32 proposalId = votingMachine.propose(2, voteParamsHash, msg.sender, address(avatar)); + proposalId = votingMachine.propose(2, msg.sender); organizationProposals[proposalId] = VoteProposal({ originalIntVote: _originalIntVote, @@ -127,6 +140,5 @@ contract VoteInOrganizationScheme is VotingMachineCallbacks, ProposalExecuteInte _descriptionHash ); proposalsBlockNumber[proposalId] = block.number; - return proposalId; } } diff --git a/contracts/test/SchemeMock.sol b/contracts/test/SchemeMock.sol index e5aac255..8bb53037 100644 --- a/contracts/test/SchemeMock.sol +++ b/contracts/test/SchemeMock.sol @@ -16,14 +16,25 @@ contract SchemeMock is ArcScheme { function initializeGovernance( Avatar _avatar, - IntVoteInterface _votingMachine, uint256[11] calldata _votingParams, address _voteOnBehalf, - bytes32 _voteParamsHash, + DAOFactory _daoFactory, + address _stakingToken, + uint64[3] calldata _packageVersion, + string calldata _votingMachineName, uint256 _testData ) external { - super._initializeGovernance(_avatar, _votingMachine, _voteParamsHash, _votingParams, _voteOnBehalf); + super._initializeGovernance( + _avatar, + _votingParams, + _voteOnBehalf, + _daoFactory, + _stakingToken, + address(this), + address(this), + _packageVersion, + _votingMachineName); testData = _testData; } diff --git a/contracts/utils/DAOFactory.sol b/contracts/utils/DAOFactory.sol index 4a26d715..0feeeee6 100644 --- a/contracts/utils/DAOFactory.sol +++ b/contracts/utils/DAOFactory.sol @@ -1,4 +1,5 @@ pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; import "@openzeppelin/upgrades/contracts/Initializable.sol"; import "../registry/App.sol"; @@ -40,8 +41,6 @@ contract DAOFactory is Initializable { mapping(address=>Locks) public locks; App public app; string public constant PACKAGE_NAME = "DAOstack"; - //this is here due to "stack too deep issue" - uint64[3] private packageVersion; function initialize(address _appContractAddress) external initializer { app = App(_appContractAddress); @@ -49,26 +48,58 @@ contract DAOFactory is Initializable { /** * @dev Create a new organization - * @param _orgName The name of the new organization - * @param _tokenInitData the DAOToken init data (tokenName,tokenSymbol,cap) - * @param _founders An array with the addresses of the founders of the organization - * @param _foundersTokenAmount An array of amount of tokens that the founders - * receive in the new organization - * @param _foundersReputationAmount An array of amount of reputation that the - * founders receive in the new organization + * @param _encodedForgeOrgParams encoded ForgeOrgParams + * orgName - The name of the new organization + * tokenInitData - the DAOToken init data (tokenName,tokenSymbol,cap) + * founders - An array with the addresses of the founders of the organization + * foundersTokenAmount - An array of amount of tokens that the founders + * receive in the new organization + * foundersReputationAmount - An array of amount of reputation that the + * founders receive in the new organization + * version - the arc version to forgeOrg from. + * @param _encodedSetSchemesParams encoded SetSchemesParams - + * if there is a need to add more than 100 founders: + * encodedSetSchemesParams should be zero and then do : + * forgeOrg,addFounders,setSchemes. this will result in 3 transactions. * @return The address of the avatar of the controller */ function forgeOrg ( - string calldata _orgName, - bytes calldata _tokenInitData, - address[] calldata _founders, - uint[] calldata _foundersTokenAmount, - uint[] calldata _foundersReputationAmount, - uint64[3] calldata _version) + bytes calldata _encodedForgeOrgParams, + bytes calldata _encodedSetSchemesParams) external returns(address) { - packageVersion = getPackageVersion(_version); - return _forgeOrg(_orgName, _tokenInitData, _founders, _foundersTokenAmount, _foundersReputationAmount); + ( + string memory orgName, + bytes memory tokenInitData, + address[] memory founders, + uint256[] memory foundersTokenAmount, + uint256[] memory foundersReputationAmount, + uint64[3] memory version) = + /* solhint-disable */ + abi.decode( + _encodedForgeOrgParams, + (string, bytes, address[], uint256[], uint256[], uint64[3]) + ); + /* solhint-enable */ + uint64[3] memory packageVersion = getPackageVersion(version); + Avatar avatar =_forgeOrg( + orgName, + tokenInitData, + founders, + foundersTokenAmount, + foundersReputationAmount, + packageVersion); + if (_encodedSetSchemesParams.length > 0) { + + _setSchemes( + address(avatar), + _encodedSetSchemesParams, + packageVersion); + } else { + locks[address(avatar)].sender = msg.sender; + locks[address(avatar)].packageVersion = packageVersion; + } + return address(avatar); } /** @@ -115,28 +146,22 @@ contract DAOFactory is Initializable { /** * @dev Set initial schemes for the organization. * @param _avatar organization avatar (returns from forgeOrg) - * @param _schemesNames the schemes name to register for the organization - * @param _schemesData the schemes initilization data - * @param _schemesInitilizeDataLens the schemes initilization data lens (at _schemesData) - * @param _permissions the schemes permissions. - * @param _metaData dao meta data hash + * @param _encodedSetSchemesParams encoded SetSchemesParams - */ function setSchemes ( Avatar _avatar, - bytes32[] calldata _schemesNames, - bytes calldata _schemesData, - uint256[] calldata _schemesInitilizeDataLens, - bytes4[] calldata _permissions, - string calldata _metaData + bytes calldata _encodedSetSchemesParams ) external { + // this action can only be executed by the account that holds the lock + // for this controller + require(locks[address(_avatar)].sender == msg.sender, "sender is not holding the lock"); _setSchemes( address(_avatar), - _schemesNames, - _schemesData, - _schemesInitilizeDataLens, - _permissions, - _metaData); + _encodedSetSchemesParams, + locks[address(_avatar)].packageVersion); + // Remove lock: + delete locks[address(_avatar)]; } /** @@ -193,42 +218,52 @@ contract DAOFactory is Initializable { /** * @dev Set initial schemes for the organization. * @param _avatar organization avatar (returns from forgeOrg) - * @param _schemesNames the schemes name to register for the organization - * @param _schemesData the schemes initilization data - * @param _schemesInitilizeDataLens the schemes initilization data lens (at _schemesData) - * @param _permissions the schemes permissions. - * @param _metaData dao meta data hash + * @param _encodedSetSchemesParams _setSchemes parameters + * @param _packageVersion package version */ function _setSchemes ( address payable _avatar, - bytes32[] memory _schemesNames, - bytes memory _schemesData, - uint256[] memory _schemesInitilizeDataLens, - bytes4[] memory _permissions, - string memory _metaData + bytes memory _encodedSetSchemesParams, + uint64[3] memory _packageVersion ) private { - // this action can only be executed by the account that holds the lock - // for this controller - require(locks[_avatar].sender == msg.sender, "sender is not holding the lock"); + ( + bytes32[] memory schemesNames, + bytes memory schemesData, + uint256[] memory schemesInitilizeDataLens, + bytes4[] memory permissions, + string memory metaData + ) = + /* solhint-disable */ + abi.decode( + _encodedSetSchemesParams, + (bytes32[], bytes, uint256[], bytes4[], string) + ); + /* solhint-enable */ // register initial schemes: Controller controller = Controller(Avatar(_avatar).owner()); uint256 startIndex = 0; - for (uint256 i = 0; i < _schemesNames.length; i++) { - address scheme = address(createInstance(locks[_avatar].packageVersion, - _schemesNames[i].toStr(), + for (uint256 i = 0; i < schemesNames.length; i++) { + //add avatar to encoded data and encode the call to initilize + // functionSignature + encodedAvatar+ encodedRestOfData + bytes memory schemeEncodedData = (schemesData.slice(startIndex, schemesInitilizeDataLens[i])).slice(0, 4); + schemeEncodedData = schemeEncodedData.concat(abi.encode(_avatar)); + schemeEncodedData = + schemeEncodedData + .concat((schemesData.slice(startIndex, schemesInitilizeDataLens[i])) + .slice(36, schemesInitilizeDataLens[i]-36)); + address scheme = address(createInstance(_packageVersion, + schemesNames[i].toStr(), _avatar, - _schemesData.slice(startIndex, _schemesInitilizeDataLens[i]))); - emit SchemeInstance(scheme, _schemesNames[i].toStr()); - controller.registerScheme(scheme, _permissions[i]); - startIndex = startIndex.add(_schemesInitilizeDataLens[i]); + schemeEncodedData)); + emit SchemeInstance(scheme, schemesNames[i].toStr()); + controller.registerScheme(scheme, permissions[i]); + startIndex = startIndex.add(schemesInitilizeDataLens[i]); } - controller.metaData(_metaData); + controller.metaData(metaData); // Unregister self: controller.unregisterSelf(); - // Remove lock: - delete locks[_avatar]; emit InitialSchemesSet(_avatar); } @@ -248,22 +283,23 @@ contract DAOFactory is Initializable { bytes memory _tokenInitData, address[] memory _founders, uint256[] memory _foundersTokenAmount, - uint256[] memory _foundersReputationAmount + uint256[] memory _foundersReputationAmount, + uint64[3] memory _packageVersion ) private - returns(address) { + returns(Avatar) { // Create Token, Reputation and Avatar: require(_founders.length == _foundersTokenAmount.length, "_founderlength != _foundersTokenAmount.length"); require(_founders.length == _foundersReputationAmount.length, "_founderlength != _foundersReputationAmount.length"); AdminUpgradeabilityProxy nativeToken = - createInstance(packageVersion, "DAOToken", address(this), _tokenInitData); + createInstance(_packageVersion, "DAOToken", address(this), _tokenInitData); AdminUpgradeabilityProxy nativeReputation = - createInstance(packageVersion, "Reputation", address(this), + createInstance(_packageVersion, "Reputation", address(this), abi.encodeWithSignature("initialize(address)", address(this))); - AdminUpgradeabilityProxy avatar = createInstance(packageVersion, "Avatar", address(this), + AdminUpgradeabilityProxy avatar = createInstance(_packageVersion, "Avatar", address(this), abi.encodeWithSignature( "initialize(string,address,address,address)", _orgName, @@ -286,7 +322,7 @@ contract DAOFactory is Initializable { // Create Controller: Controller controller = Controller(address(createInstance( - packageVersion, + _packageVersion, "Controller", address(avatar), abi.encodeWithSignature("initialize(address,address)", address(avatar), address(this))))); @@ -295,11 +331,8 @@ contract DAOFactory is Initializable { DAOToken(address(nativeToken)).transferOwnership(address(controller)); Reputation(address(nativeReputation)).transferOwnership(address(controller)); - locks[address(avatar)].sender = msg.sender; - locks[address(avatar)].packageVersion = packageVersion; - emit NewOrg (address(avatar), address(controller), address(nativeReputation), address(nativeToken)); - return (address(avatar)); + return (Avatar(address(avatar))); } } diff --git a/package-lock.json b/package-lock.json index 0b80913b..4ca921f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "@daostack/arc-experimental", - "version": "0.1.1-rc.21", + "version": "0.1.1-rc.22", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/cli": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.4.tgz", - "integrity": "sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.10.1.tgz", + "integrity": "sha512-cVB+dXeGhMOqViIaZs3A9OUAe4pKw4SBNdMw6yHJMYR7s4TB+Cei7ThquV/84O19PdIFWuwe03vxxES0BHUm5g==", "dev": true, "requires": { "chokidar": "^2.1.8", @@ -46,101 +46,101 @@ } }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, "@babel/generator": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "dev": true, "requires": { - "@babel/types": "^7.9.6", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", "dev": true }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -164,30 +164,30 @@ } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, "@daostack/infra-experimental": { - "version": "0.0.1-rc.16", - "resolved": "https://registry.npmjs.org/@daostack/infra-experimental/-/infra-experimental-0.0.1-rc.16.tgz", - "integrity": "sha512-8toFOgE8pN7yN/y+eqZS6y0b5HWJa492GecoqmU6mFIOjL3JiM1M47mhQ6BlOZQAznLZ5UAz0SVZriM2RxU9Fw==", + "version": "0.1.1-rc.18", + "resolved": "https://registry.npmjs.org/@daostack/infra-experimental/-/infra-experimental-0.1.1-rc.18.tgz", + "integrity": "sha512-vTTb1EPI+tK5ovLnItgYBMxDab1thOFNgmVgY4rrQI+Xl9CTVD0xbA7qBZTHDGGKBWFEwoPtb1pCvyodm/hx0Q==", "requires": { - "@openzeppelin/contracts-ethereum-package": "2.3.0", + "@openzeppelin/contracts-ethereum-package": "2.5.0", "@openzeppelin/upgrades": "2.5.3", "ethereumjs-abi": "^0.6.5" }, "dependencies": { "@openzeppelin/contracts-ethereum-package": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-ethereum-package/-/contracts-ethereum-package-2.3.0.tgz", - "integrity": "sha512-voAH5uPmfZ0bpMHV6JgXoaWqkp0YIMmAino04nvJWso4S9di/rrWr8nnJB+b5bwQEz06u1rN9O3nXM9vIiHBlw==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-ethereum-package/-/contracts-ethereum-package-2.5.0.tgz", + "integrity": "sha512-14CijdTyy4Y/3D3UUeFC2oW12nt1Yq1M8gFOtkuODEvSYPe3YSAKnKyhUeGf0UDNCZzwfGr15KdiFK6AoJjoSQ==" }, "@openzeppelin/upgrades": { "version": "2.5.3", @@ -234,6 +234,35 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "web3-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.0.tgz", + "integrity": "sha512-tI1low8ICoaWU2c53cikH0rsksKuIskI2nycH5E5sEXxxl9/BOD3CeDDBFbxgNPQ+bpDevbR7gXNEDB7Ud4G9g==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.9.1", + "utf8": "3.0.0" + } } } }, @@ -264,9 +293,9 @@ } }, "@nomiclabs/buidler": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@nomiclabs/buidler/-/buidler-1.3.4.tgz", - "integrity": "sha512-WfYzETXvoVAtmWYIxEcWWxP/hY+qQLFrEs4PtLVu1dX0fZYnhO8RyuK/nLgdeA5tbE+pPZ6rcdh1Kx+P8DTsHQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler/-/buidler-1.3.5.tgz", + "integrity": "sha512-XhVH2ZjhahXLfS16WnTz058OcyqoaK+TD4UON+AiZ5dN9DdBh1A0XQRAg5MNdvVVo8IQZSGZ+Fp0Qde4fgIDKw==", "dev": true, "requires": { "@nomiclabs/ethereumjs-vm": "^4.1.1", @@ -622,9 +651,9 @@ } }, "@nomiclabs/buidler-truffle5": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-truffle5/-/buidler-truffle5-1.3.3.tgz", - "integrity": "sha512-8gAKei3RjRcgepfbCS10BlSPXNng+UI8mOvl5lTh6q0VQs+c7f/r2mORVgbwI3gwKMWmzyXixvkfO4+7bVoQCw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-truffle5/-/buidler-truffle5-1.3.4.tgz", + "integrity": "sha512-aPbkdbNUF4R/hbb2B8BULlsQ5AUB5l4baIHFmLQ/fdRmFrkWBx+53tjpf+XOv8g8RZTJstpkxFSBRWD/U1EahA==", "dev": true, "requires": { "@nomiclabs/truffle-contract": "^4.1.2", @@ -648,9 +677,9 @@ } }, "@nomiclabs/buidler-web3": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-web3/-/buidler-web3-1.3.3.tgz", - "integrity": "sha512-rESg1mQoQuAHyqfhE+XNnR2KcFvCl3HJFNW/Cfi41jIlYN/dUTkhV0F/BXrbMifW+J3+BXjRtRNKMQZ6BjF9zw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@nomiclabs/buidler-web3/-/buidler-web3-1.3.4.tgz", + "integrity": "sha512-fVJczSfZBp1xDJA2Bdh49P6mhaAO8vGY7kbi6uoMLO8J288O6s/Ldw36kb7iRebifNbKP69MJsUu2nXLaklqdg==", "dev": true, "requires": { "@types/bignumber.js": "^5.0.0" @@ -1385,9 +1414,9 @@ } }, "eventemitter2": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.1.tgz", - "integrity": "sha512-x4TgZ3j6tfLGzAJ4MD7M7qTdAiDlfKdssgFENVpW0csJKdlXTpE27SWUDEDb5eNS/HBWQtiDFPKiO6oHokYDqg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.2.tgz", + "integrity": "sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw==", "dev": true }, "ms": { @@ -1442,9 +1471,9 @@ } }, "eventemitter2": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.1.tgz", - "integrity": "sha512-x4TgZ3j6tfLGzAJ4MD7M7qTdAiDlfKdssgFENVpW0csJKdlXTpE27SWUDEDb5eNS/HBWQtiDFPKiO6oHokYDqg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.2.tgz", + "integrity": "sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw==", "dev": true }, "ms": { @@ -1647,9 +1676,9 @@ "dev": true }, "@truffle/interface-adapter": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.8.tgz", - "integrity": "sha512-pTD4Vr5vfYcMTCUPefznA2mM060vKScn24o1QhfUYyBbas/fc0dDstrnCv886l0dhqnV/q2ebSzaxVWUyPSfgg==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.9.tgz", + "integrity": "sha512-2dYccf7lAwx90NVYmn89QABpd3dx7BxvDAaHgzVa2YVOUkTUpkZiaIsD2YlsVQ1rew17wMNi5WXH2RFnmzQ82A==", "dev": true, "requires": { "bn.js": "^4.11.8", @@ -2162,9 +2191,9 @@ "dev": true }, "@types/node": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", - "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==" + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.6.tgz", + "integrity": "sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==" }, "@types/pbkdf2": { "version": "3.0.0", @@ -3798,9 +3827,9 @@ "dev": true }, "dayjs": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.27.tgz", - "integrity": "sha512-Jpa2acjWIeOkg8KURUHICk0EqnEFSSF5eMEscsOgyJ92ZukXwmpmRkPSUka7KHSfbj5eKH30ieosYip+ky9emQ==", + "version": "1.8.28", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", + "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==", "dev": true }, "death": { @@ -5011,9 +5040,9 @@ } }, "ignore": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz", - "integrity": "sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "semver": { @@ -7253,9 +7282,9 @@ }, "dependencies": { "ignore": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz", - "integrity": "sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "slash": { @@ -7327,9 +7356,9 @@ "dev": true }, "uglify-js": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.3.tgz", - "integrity": "sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", "dev": true, "optional": true, "requires": { @@ -7752,9 +7781,9 @@ } }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.3.0.tgz", + "integrity": "sha512-RDVhhDkycLoSQtE9o0vpK/vOccVDsCbWVzRxArGYnlQLcihPl2loFbPyiH7CM0m2/ijOJU3+PZbnBPaB6NJ1MA==", "dev": true }, "into-stream": { @@ -11079,9 +11108,9 @@ } }, "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.5.tgz", + "integrity": "sha512-y1QxTQOp0OZnjn19FxBmped4p+BSKPHwGndaqrESseyd2xXZtcgR3yuTIosh8CaMaOii9SKIYerBXnV/CpJ3qw==", "requires": { "bn.js": "^4.11.1" } @@ -13375,9 +13404,9 @@ } }, "systeminformation": { - "version": "4.26.4", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.26.4.tgz", - "integrity": "sha512-4+AYe0SfjdQPHEFL0nAyFMWyBUe8c5DZdSHApeJrdAvem5yoE/eS7/dGChnKLAkr+AKAoKcnqucPv302jy2+aA==", + "version": "4.26.5", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.26.5.tgz", + "integrity": "sha512-hTVhCYNIsoDtL8brW6wg/UTHmyRfMRItd/+6f6JZtXjmx06FHKBGCyBe7WN6J+FiDIiDfTK7mvMq7hljM6r5OA==", "dev": true, "optional": true }, @@ -13799,9 +13828,9 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unbzip2-stream": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz", - "integrity": "sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -13964,9 +13993,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { @@ -14790,15 +14819,17 @@ } }, "web3-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.0.tgz", - "integrity": "sha512-tI1low8ICoaWU2c53cikH0rsksKuIskI2nycH5E5sEXxxl9/BOD3CeDDBFbxgNPQ+bpDevbR7gXNEDB7Ud4G9g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.8.tgz", + "integrity": "sha512-9SIVGFLajwlmo5joC4DGxuy2OeDkRCXVWT8JWcDQ+BayNVHyAWGvn0oGkQ0ys14Un0KK6bjjKoD0xYs4k+FaVw==", + "dev": true, "requires": { "bn.js": "4.11.8", "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", - "randomhex": "0.1.5", + "randombytes": "^2.1.0", "underscore": "1.9.1", "utf8": "3.0.0" }, @@ -14806,12 +14837,14 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true }, "eth-lib": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", diff --git a/package.json b/package.json index 2d3f8ad6..94c6febb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@daostack/arc-experimental", - "version": "0.1.1-rc.21", + "version": "0.1.1-rc.22", "description": "A platform for building DAOs", "files": [ "contracts/", @@ -44,7 +44,8 @@ "rimraf": "^2.6.2", "run-with-ganache": "^0.1.1", "solidity-coverage": "^0.7.0-beta.3", - "uint32": "^0.2.1" + "uint32": "^0.2.1", + "web3-utils": "^1.2.8" }, "repository": { "type": "git", @@ -69,7 +70,7 @@ }, "homepage": "https://daostack.io", "dependencies": { - "@daostack/infra-experimental": "0.0.1-rc.16", + "@daostack/infra-experimental": "0.1.1-rc.18", "@openzeppelin/contracts-ethereum-package": "2.4.0", "@openzeppelin/upgrades": "2.7.1", "math": "0.0.3", diff --git a/test/arcscheme.js b/test/arcscheme.js index e214f994..88e04070 100644 --- a/test/arcscheme.js +++ b/test/arcscheme.js @@ -1,78 +1,110 @@ const helpers = require("./helpers"); const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); - const SchemeMock = artifacts.require('./test/SchemeMock.sol'); - var registration; -const setup = async function (accounts, initGov=true, avatarZero=false, vmZero=false, gpParamsHash=true) { + +var registration; +const setup = async function (accounts, initGov=true) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); - testSetup.standardTokenMock = await ERC20Mock.new(testSetup.org.avatar.address,100); - var schemeMockData; if (!initGov) { schemeMockData = await new web3.eth.Contract(registration.schemeMock.abi) .methods .initialize( - avatarZero ? helpers.NULL_ADDRESS : testSetup.org.avatar.address, + helpers.NULL_ADDRESS, 1 ) .encodeABI(); + } else { var standardTokenMock = await ERC20Mock.new(accounts[0],1000); testSetup.votingMachine = await helpers.setupGenesisProtocol(accounts,standardTokenMock.address,helpers.NULL_ADDRESS); + schemeMockData = await new web3.eth.Contract(registration.schemeMock.abi) .methods .initializeGovernance( - avatarZero ? helpers.NULL_ADDRESS : testSetup.org.avatar.address, - vmZero ? helpers.NULL_ADDRESS : testSetup.votingMachine.genesisProtocol.address, + helpers.NULL_ADDRESS, testSetup.votingMachine.uintArray, testSetup.votingMachine.voteOnBehalf, - gpParamsHash ? testSetup.votingMachine.params : helpers.NULL_HASH, + registration.daoFactory.address, + standardTokenMock.address, + [0,1,0], + "GenesisProtocol", 1 ) .encodeABI(); } - - var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("SchemeMock")], - schemeMockData, - [helpers.getBytesLength(schemeMockData)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); - - if (!avatarZero && !vmZero) { - testSetup.schemeMock = await SchemeMock.at(tx.logs[1].args._scheme); - - return testSetup; + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000], + 0, + [web3.utils.fromAscii("SchemeMock")], + schemeMockData, + [helpers.getBytesLength(schemeMockData)], + [permissions], + "metaData"); + testSetup.standardTokenMock = await ERC20Mock.new(testSetup.org.avatar.address,100); + + if (!initGov) { + testSetup.schemeMock = await SchemeMock.at(tx.logs[6].args._scheme); + } else { + testSetup.schemeMock = await SchemeMock.at(tx.logs[7].args._scheme); + testSetup.votingMachine = tx.logs[5].args._proxy; + } + return testSetup; + }; -contract('VotingMachineCallbacks', function(accounts) { +contract('ArcScheme', function(accounts) { it("avatar address cannot be 0 ", async function() { + var schemeMock = await SchemeMock.new(); + try { - await setup(accounts, false, true); + await schemeMock.initialize(helpers.NULL_ADDRESS,1); assert(false, "avatar 0 address should revert"); } catch(error) { // revert } + await schemeMock.initialize(accounts[0],1); + + var params = await helpers.setupGenesisProtocol(accounts,helpers.NULL_ADDRESS,helpers.NULL_ADDRESS); + + schemeMock = await SchemeMock.new(); + try { + await schemeMock.initializeGovernance(accounts[0], + params.uintArray, + params.voteOnBehalf, + helpers.NULL_ADDRESS, + helpers.NULL_ADDRESS, + [0,1,0], + "GenesisProtocol", + 1); + assert(false, "daoFactory cannot be zero"); + } catch(error) { + // revert + } + var registration = await helpers.registerImplementation(); + await schemeMock.initializeGovernance(accounts[0], + params.uintArray, + params.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "GenesisProtocol", + 1); }); it("vm address cannot be 0 ", async function() { try { - await setup(accounts, true, false, true); + await setup(accounts, true); assert(false, "vm 0 address should revert"); } catch(error) { // revert @@ -88,14 +120,7 @@ contract('VotingMachineCallbacks', function(accounts) { it("initializeGovernance ", async function() { var testSetup = await setup(accounts); assert.equal(await testSetup.schemeMock.avatar(), testSetup.org.avatar.address); - assert.equal(await testSetup.schemeMock.votingMachine(), testSetup.votingMachine.genesisProtocol.address); - assert.equal(await testSetup.schemeMock.voteParamsHash(), testSetup.votingMachine.params); + assert.equal(await testSetup.schemeMock.votingMachine(), testSetup.votingMachine); }); - it("initializeGovernance gp set params", async function() { - var testSetup = await setup(accounts, true, false, false, false); - assert.equal(await testSetup.schemeMock.avatar(), testSetup.org.avatar.address); - assert.equal(await testSetup.schemeMock.votingMachine(), testSetup.votingMachine.genesisProtocol.address); - assert.equal(await testSetup.schemeMock.voteParamsHash(), testSetup.votingMachine.params); - }); }); diff --git a/test/auction4reputation.js b/test/auction4reputation.js index 6c131308..99e5f844 100644 --- a/test/auction4reputation.js +++ b/test/auction4reputation.js @@ -20,16 +20,6 @@ const setup = async function (accounts, testSetup.proxyAdmin = accounts[5]; var registration = await helpers.registerImplementation(); testSetup.biddingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory( - testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000] - ); - - testSetup.auctionsEndTime = (await web3.eth.getBlock("latest")).timestamp + _auctionsEndTime; testSetup.auctionsStartTime = (await web3.eth.getBlock("latest")).timestamp + _auctionsStartTime; testSetup.redeemEnableTime = (await web3.eth.getBlock("latest")).timestamp + _redeemEnableTime; @@ -37,29 +27,35 @@ const setup = async function (accounts, testSetup.auctionPeriod = (testSetup.auctionsEndTime - testSetup.auctionsStartTime)/3; testSetup.agreementHash = _agreementHash; testSetup.auction4ReputationParams = new Auction4ReputationParams(); - testSetup.auction4ReputationParams.initdata = await new web3.eth.Contract(registration.auction4Reputation.abi) .methods - .initialize(testSetup.org.avatar.address, + .initialize(helpers.NULL_ADDRESS, _auctionReputationReward, testSetup.auctionsStartTime, testSetup.auctionPeriod, _numberOfAuctions, testSetup.redeemEnableTime, testSetup.biddingToken.address, - testSetup.org.avatar.address, testSetup.agreementHash) .encodeABI(); var permissions = "0x00000000"; + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory( + testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000], + helpers.NULL_ADDRESS, + [web3.utils.fromAscii("Auction4Reputation")], + testSetup.auction4ReputationParams.initdata, + [helpers.getBytesLength(testSetup.auction4ReputationParams.initdata)], + [permissions], + "metaData" + ); + - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("Auction4Reputation")], - testSetup.auction4ReputationParams.initdata, - [helpers.getBytesLength(testSetup.auction4ReputationParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.auction4Reputation = await Auction4Reputation.at(tx.logs[1].args._scheme); + testSetup.auction4Reputation = await Auction4Reputation.at(tx.logs[6].args._scheme); await testSetup.biddingToken.approve(testSetup.auction4Reputation.address,web3.utils.toWei('100', "ether")); return testSetup; }; @@ -74,7 +70,6 @@ contract('Auction4Reputation', accounts => { assert.equal(await testSetup.auction4Reputation.redeemEnableTime(),testSetup.redeemEnableTime); assert.equal(await testSetup.auction4Reputation.token(),testSetup.biddingToken.address); assert.equal(await testSetup.auction4Reputation.numberOfAuctions(),3); - assert.equal(await testSetup.auction4Reputation.wallet(),testSetup.org.avatar.address); assert.equal(await testSetup.auction4Reputation.auctionPeriod(),testSetup.auctionPeriod); assert.equal(await testSetup.auction4Reputation.getAgreementHash(),testSetup.agreementHash); }); @@ -89,7 +84,6 @@ contract('Auction4Reputation', accounts => { 0, 3000, accounts[0], - accounts[0], helpers.SOME_HASH, {gas :constants.ARC_GAS_LIMIT}); assert(false, "numberOfAuctions = 0 is not allowed"); @@ -108,7 +102,6 @@ contract('Auction4Reputation', accounts => { 3, 3000, accounts[0], - accounts[0], helpers.SOME_HASH, {gas :constants.ARC_GAS_LIMIT}); assert(false, "numberOfAuctions = 0 is not allowed"); @@ -127,7 +120,6 @@ contract('Auction4Reputation', accounts => { 1, 1000-1, accounts[0], - accounts[0], helpers.SOME_HASH, {gas :constants.ARC_GAS_LIMIT}); assert(false, "_redeemEnableTime < auctionsEndTime is not allowed"); @@ -146,7 +138,6 @@ contract('Auction4Reputation', accounts => { 1, 300, accounts[0], - accounts[0], helpers.SOME_HASH); assert(false, "auctionsEndTime = auctionsStartTime is not allowed"); } catch(error) { @@ -164,7 +155,6 @@ contract('Auction4Reputation', accounts => { 1, 100, accounts[0], - accounts[0], helpers.SOME_HASH); assert(false, "auctionsEndTime < auctionsStartTime is not allowed"); } catch(error) { @@ -352,7 +342,6 @@ contract('Auction4Reputation', accounts => { 1, 100, accounts[0], - accounts[0], helpers.SOME_HASH); assert(false, "cannot initialize twice"); } catch(error) { diff --git a/test/competition.js b/test/competition.js index 8e54f183..e7d5faf0 100644 --- a/test/competition.js +++ b/test/competition.js @@ -3,6 +3,7 @@ const helpers = require("./helpers"); const ContributionRewardExt = artifacts.require("./ContributionRewardExt.sol"); const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const Competition = artifacts.require("./Competition.sol"); +const DAOFactory = artifacts.require("./DAOFactory.sol"); class ContributionRewardParams { constructor() { @@ -13,24 +14,22 @@ const setupContributionRewardExt = async function( accounts, genesisProtocol, token, - avatarAddress, _daoFactoryAddress, _packageVersion = [0,1,0], _rewarderName = 'Competition' ) { var contributionRewardParams = new ContributionRewardParams(); - if (genesisProtocol === true) { contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) .methods - .initialize(avatarAddress, - contributionRewardParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, contributionRewardParams.votingMachine.uintArray, contributionRewardParams.votingMachine.voteOnBehalf, - helpers.NULL_ADDRESS, _daoFactoryAddress, + helpers.NULL_ADDRESS, _packageVersion, + "GenesisProtocol", _rewarderName ) .encodeABI(); @@ -38,13 +37,13 @@ const setupContributionRewardExt = async function( contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) .methods - .initialize(avatarAddress, - contributionRewardParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], - helpers.NULL_ADDRESS, - contributionRewardParams.votingMachine.params, + .initialize(helpers.NULL_ADDRESS, + contributionRewardParams.votingMachine.uintArray, + contributionRewardParams.votingMachine.voteOnBehalf, _daoFactoryAddress, + helpers.NULL_ADDRESS, _packageVersion, + "AbsoluteVote", _rewarderName) .encodeABI(); } @@ -63,35 +62,43 @@ const setup = async function (accounts,genesisProtocol = false,tokenAddress=0) { testSetup.reputationArray = [2000,5000,7000]; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + var permissions = "0x00000000"; + testSetup.contributionRewardExtParams= await setupContributionRewardExt( + accounts, + genesisProtocol, + tokenAddress, + registration.daoFactory.address); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, accounts, registration, [accounts[0], accounts[1], accounts[2]], [1000,0,0], - testSetup.reputationArray); - - - testSetup.contributionRewardExtParams= await setupContributionRewardExt( - accounts, - genesisProtocol, - tokenAddress, - testSetup.org.avatar.address, - registration.daoFactory.address); + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("ContributionRewardExt")], + testSetup.contributionRewardExtParams.initdata, + [helpers.getBytesLength(testSetup.contributionRewardExtParams.initdata)], + [permissions], + "metaData"); + + var daoFactory = await DAOFactory.at(registration.daoFactory.address); + var contributionRewardExtAddress; + await daoFactory.getPastEvents('SchemeInstance', { + fromBlock: tx.blockNumber, + toBlock: 'latest' + }) + .then(function(events){ + contributionRewardExtAddress = events[0].args._scheme; + }); + testSetup.contributionRewardExt = await ContributionRewardExt.at(contributionRewardExtAddress); - var permissions = "0x00000000"; - tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ContributionRewardExt")], - testSetup.contributionRewardExtParams.initdata, - [helpers.getBytesLength(testSetup.contributionRewardExtParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.contributionRewardExt = await ContributionRewardExt.at(tx.logs[2].args._scheme); var competitionAddress = await testSetup.contributionRewardExt.rewarder(); testSetup.competition = await Competition.at(competitionAddress); testSetup.admin = accounts[0]; + testSetup.contributionRewardExtParams.votingMachine = + await helpers.getVotingMachine(await testSetup.contributionRewardExt.votingMachine(),genesisProtocol); return testSetup; }; @@ -491,8 +498,8 @@ contract('Competition', accounts => { } catch (ex) { helpers.assertVMException(ex); } - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); await helpers.increaseTime(650); await testSetup.competition.vote(1,{from:accounts[1]}); @@ -575,8 +582,8 @@ contract('Competition', accounts => { await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); await helpers.increaseTime(650); await testSetup.competition.vote(1,{from:accounts[0]}); @@ -676,8 +683,8 @@ contract('Competition', accounts => { await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); await helpers.increaseTime(650); await testSetup.competition.vote(1,{from:accounts[2]}); @@ -716,8 +723,8 @@ contract('Competition', accounts => { await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); await testSetup.competition.suggest(proposalId,"suggestion",helpers.NULL_ADDRESS); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachine.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); await helpers.increaseTime(650); await testSetup.competition.vote(1,{from:accounts[1]}); diff --git a/test/continuouslockingtoken4reputation.js b/test/continuouslockingtoken4reputation.js index 2a538cff..5608c0d5 100644 --- a/test/continuouslockingtoken4reputation.js +++ b/test/continuouslockingtoken4reputation.js @@ -23,57 +23,53 @@ const setup = async function (accounts, testSetup.proxyAdmin = accounts[5]; var registration = await helpers.registerImplementation(); testSetup.lockingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory( + testSetup.startTime = (await web3.eth.getBlock("latest")).timestamp + _startTime; + testSetup.redeemEnableTime = (await web3.eth.getBlock("latest")).timestamp + _redeemEnableTime; + testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.new(); + testSetup.periodsUnit = _periodsUnit; + testSetup.agreementHash = _agreementHash; + testSetup.maxLockingPeriod = _maxLockingPeriod; + testSetup.repRewardConstA = _repRewardConstA; + testSetup.repRewardConstB = _repRewardConstB; + testSetup.reputationReward = _reputationReward; + testSetup.periodsCap = _periodsCap;testSetup.continuousLocking4ReputationParams = new ContinuousLocking4ReputationParams(); + if (_initialize === true) { + testSetup.continuousLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.continuousLocking4Reputation.abi) + .methods + .initialize(helpers.NULL_ADDRESS, + testSetup.reputationReward, + testSetup.startTime, + testSetup.periodsUnit, + testSetup.redeemEnableTime, + testSetup.maxLockingPeriod, + testSetup.repRewardConstA, + testSetup.repRewardConstB, + testSetup.periodsCap, + testSetup.lockingToken.address, + testSetup.agreementHash) + .encodeABI(); + } else { + testSetup.continuousLocking4ReputationParams.initdata = Buffer.from(''); + } + + var permissions = "0x00000000"; + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory( testSetup.proxyAdmin, accounts, registration, [accounts[0]], [1000], - [1000] + [1000], + 0, + [web3.utils.fromAscii("ContinuousLocking4Reputation")], + testSetup.continuousLocking4ReputationParams.initdata, + [helpers.getBytesLength(testSetup.continuousLocking4ReputationParams.initdata)], + [permissions], + "metaData" ); - - testSetup.startTime = (await web3.eth.getBlock("latest")).timestamp + _startTime; - testSetup.redeemEnableTime = (await web3.eth.getBlock("latest")).timestamp + _redeemEnableTime; - testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.new(); - testSetup.periodsUnit = _periodsUnit; - testSetup.agreementHash = _agreementHash; - testSetup.maxLockingPeriod = _maxLockingPeriod; - testSetup.repRewardConstA = _repRewardConstA; - testSetup.repRewardConstB = _repRewardConstB; - testSetup.reputationReward = _reputationReward; - testSetup.periodsCap = _periodsCap; - - testSetup.continuousLocking4ReputationParams = new ContinuousLocking4ReputationParams(); - if (_initialize === true) { - testSetup.continuousLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.continuousLocking4Reputation.abi) - .methods - .initialize(testSetup.org.avatar.address, - testSetup.reputationReward, - testSetup.startTime, - testSetup.periodsUnit, - testSetup.redeemEnableTime, - testSetup.maxLockingPeriod, - testSetup.repRewardConstA, - testSetup.repRewardConstB, - testSetup.periodsCap, - testSetup.lockingToken.address, - testSetup.agreementHash) - .encodeABI(); - } else { - testSetup.continuousLocking4ReputationParams.initdata = Buffer.from(''); - } - - var permissions = "0x00000000"; - - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ContinuousLocking4Reputation")], - testSetup.continuousLocking4ReputationParams.initdata, - [helpers.getBytesLength(testSetup.continuousLocking4ReputationParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.at(tx.logs[1].args._scheme); + testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); await testSetup.lockingToken.approve(testSetup.continuousLocking4Reputation.address,web3.utils.toWei('100', "ether")); return testSetup; }; diff --git a/test/contributionreward.js b/test/contributionreward.js index 61158ff0..892dd205 100644 --- a/test/contributionreward.js +++ b/test/contributionreward.js @@ -43,7 +43,9 @@ const setupContributionReward = async function( accounts, genesisProtocol, token, - avatarAddress + avatarAddress, + _daoFactoryAddress, + _packageVersion = [0,1,0] ) { var contributionRewardParams = new ContributionRewardParams(); @@ -51,27 +53,31 @@ const setupContributionReward = async function( contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionReward.abi) .methods - .initialize(avatarAddress, - contributionRewardParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, contributionRewardParams.votingMachine.uintArray, contributionRewardParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH) + _daoFactoryAddress, + token, + _packageVersion, + "GenesisProtocol") .encodeABI(); } else { contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionReward.abi) .methods - .initialize(avatarAddress, - contributionRewardParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], + .initialize(helpers.NULL_ADDRESS, + contributionRewardParams.votingMachine.uintArray, + contributionRewardParams.votingMachine.voteOnBehalf, + _daoFactoryAddress, helpers.NULL_ADDRESS, - contributionRewardParams.votingMachine.params) + _packageVersion, + "AbsoluteVote") .encodeABI(); } return contributionRewardParams; }; -const setup = async function (accounts,genesisProtocol = false,tokenAddress=0,setParameters = false) { +const setup = async function (accounts,genesisProtocol = false,tokenAddress=0) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); @@ -82,38 +88,34 @@ const setup = async function (accounts,genesisProtocol = false,tokenAddress=0,se testSetup.reputationArray = [2000,4000,7000]; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + testSetup.contributionRewardParams= await setupContributionReward( + accounts, + genesisProtocol, + tokenAddress, + helpers.NULL_ADDRESS, + registration.daoFactory.address); + var permissions = "0x00000000"; + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, accounts, registration, [accounts[0], accounts[1], accounts[2]], [1000,0,0], - testSetup.reputationArray); - testSetup.contributionRewardParams= await setupContributionReward( - accounts,genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); - var permissions = "0x00000000"; + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("ContributionReward")], + testSetup.contributionRewardParams.initdata, + [helpers.getBytesLength(testSetup.contributionRewardParams.initdata)], + [permissions], + "metaData"); - if ((genesisProtocol === true) && (setParameters === true)) { - await testSetup. - contributionRewardParams. - votingMachine. - genesisProtocol. - setParameters(testSetup.contributionRewardParams.votingMachine.uintArray, - testSetup.contributionRewardParams.votingMachine.voteOnBehalf); - } - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ContributionReward")], - testSetup.contributionRewardParams.initdata, - [helpers.getBytesLength(testSetup.contributionRewardParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.contributionReward = await ContributionReward.at(tx.logs[1].args._scheme); + testSetup.contributionReward = await ContributionReward.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.contributionRewardParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.contributionReward.votingMachine(),genesisProtocol); + return testSetup; }; contract('ContributionReward', accounts => { @@ -121,7 +123,7 @@ contract('ContributionReward', accounts => { it("initialize", async function() { var testSetup = await setup(accounts); assert.equal(await testSetup.contributionReward.votingMachine(), - testSetup.contributionRewardParams.votingMachine.absoluteVote.address); + testSetup.contributionRewardParams.votingMachineInstance.address); assert.equal(await testSetup.contributionReward.avatar(),testSetup.org.avatar.address); }); @@ -130,10 +132,12 @@ contract('ContributionReward', accounts => { try { await testSetup.contributionReward.initialize(testSetup.org.avatar.address, - testSetup.contributionRewardParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - testSetup.contributionRewardParams.votingMachine.params); + testSetup.contributionRewardParams.votingMachine.uintArray, + testSetup.contributionRewardParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "AbsoluteVote"); assert(false, 'cannot initialize twice'); } catch (ex) { helpers.assertVMException(ex); @@ -153,7 +157,7 @@ contract('ContributionReward', accounts => { assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewContributionProposal"); assert.equal(await helpers.getValueFromLogs(tx, '_avatar',0), testSetup.org.avatar.address, "Wrong log: _avatar"); - assert.equal(await helpers.getValueFromLogs(tx, '_intVoteInterface',0), testSetup.contributionRewardParams.votingMachine.absoluteVote.address, "Wrong log: _intVoteInterface"); + assert.equal(await helpers.getValueFromLogs(tx, '_intVoteInterface',0), testSetup.contributionRewardParams.votingMachineInstance.address, "Wrong log: _intVoteInterface"); assert.equal(await helpers.getValueFromLogs(tx, '_descriptionHash',15), "description-hash", "Wrong log: _contributionDescription"); assert.equal(await helpers.getValueFromLogs(tx, '_reputationChange',0), 10, "Wrong log: _reputationChange"); var arr = await helpers.getValueFromLogs(tx, '_rewards',0); @@ -192,7 +196,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.contributionReward.organizationProposals(proposalId); assert.notEqual(organizationProposal[8],0);//executionTime }); @@ -211,7 +215,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); @@ -236,7 +240,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,[false,true,false,false]); var tokens = await testSetup.org.token.balanceOf(accounts[1]); @@ -264,7 +268,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await testSetup.contributionReward.redeem(proposalId,[false,false,true,false]); var vault = await otherAvatar.vault(); @@ -296,7 +300,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await testSetup.contributionReward.redeem(proposalId,[false,false,false,true]); var tokens = await testSetup.standardTokenMock.balanceOf(otherAvatar.address); @@ -326,7 +330,7 @@ contract('ContributionReward', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var organizationProposal = await testSetup.contributionReward.organizationProposals(proposalId); assert.equal(organizationProposal[5],otherAvatar.address);//beneficiary - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); try { await testSetup.contributionReward.redeem(proposalId,[true,true,true,true]); @@ -357,7 +361,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await checkRedeemedPeriods(testSetup,proposalId,0,0,0,0); @@ -456,7 +460,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); @@ -538,11 +542,11 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards @@ -557,7 +561,7 @@ contract('ContributionReward', accounts => { assert.equal(redeemRewards[7],externalTokenReward); //crExternalTokenReward await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -595,11 +599,11 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards @@ -614,7 +618,7 @@ contract('ContributionReward', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -652,7 +656,7 @@ contract('ContributionReward', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],0); //redeemRewards[0] gpRewards @@ -667,9 +671,9 @@ contract('ContributionReward', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward }); - it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer + setParameters", async function() { + it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer", async function() { var standardTokenMock = await ERC20Mock.new(accounts[0],1000); - var testSetup = await setup(accounts,true,standardTokenMock.address,true); + var testSetup = await setup(accounts,true,standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; var ethReward = 12; @@ -688,11 +692,11 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards @@ -707,7 +711,7 @@ contract('ContributionReward', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -745,13 +749,13 @@ contract('ContributionReward', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); - await standardTokenMock.approve(testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,1000); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.stake(proposalId,1,1000); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); + await standardTokenMock.approve(testSetup.contributionRewardParams.votingMachineInstance.address,1000); + await testSetup.contributionRewardParams.votingMachineInstance.stake(proposalId,1,1000); await helpers.increaseTime(60+1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],0); //redeemRewards[0] gpRewards @@ -766,7 +770,7 @@ contract('ContributionReward', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -802,11 +806,11 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(); await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[0]); var eth = await web3.eth.getBalance(otherAvatar.address); @@ -839,14 +843,14 @@ contract('ContributionReward', accounts => { ); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); await helpers.increaseTime(60+1); var arcUtils = await Redeemer.new(); await arcUtils.redeem(testSetup.contributionReward.address, - testSetup.contributionRewardParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardParams.votingMachineInstance.address, proposalId, accounts[1]); - var proposal = await testSetup.contributionRewardParams.votingMachine.genesisProtocol.proposals(proposalId); + var proposal = await testSetup.contributionRewardParams.votingMachineInstance.proposals(proposalId); assert.equal(proposal.state,1); //ExpiredInQueue var reputation = await testSetup.org.reputation.balanceOf(accounts[1]); //accounts[1] redeems its deposit rep. @@ -882,7 +886,7 @@ contract('ContributionReward', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionReward.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RedeemReputation"); diff --git a/test/contributionrewardext.js b/test/contributionrewardext.js index d9e37295..7c7b5b96 100644 --- a/test/contributionrewardext.js +++ b/test/contributionrewardext.js @@ -6,7 +6,7 @@ const Redeemer = artifacts.require("./Redeemer.sol"); const RewarderMock = artifacts.require("./RewarderMock.sol"); -class ContributionRewardParams { +class ContributionRewardExtParams { constructor() { } } @@ -15,43 +15,43 @@ const setupContributionRewardExt = async function( accounts, genesisProtocol, token, - avatarAddress, - daoFactoryAddress = helpers.NULL_ADDRESS, + _daoFactoryAddress = helpers.NULL_ADDRESS, service = "", - vmZero=false + _packageVersion = [0,1,0] ) { - var contributionRewardParams = new ContributionRewardParams(); + var contributionRewardExtParams = new ContributionRewardExtParams(); if (genesisProtocol === true) { - contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); - contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) + contributionRewardExtParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); + contributionRewardExtParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) .methods - .initialize(avatarAddress, - contributionRewardParams.votingMachine.genesisProtocol.address, - contributionRewardParams.votingMachine.uintArray, - contributionRewardParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, - daoFactoryAddress, - [0,1,0], - service) + .initialize(helpers.NULL_ADDRESS, + contributionRewardExtParams.votingMachine.uintArray, + contributionRewardExtParams.votingMachine.voteOnBehalf, + _daoFactoryAddress, + token, + _packageVersion, + "GenesisProtocol", + service + ) .encodeABI(); } else { - contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); - contributionRewardParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) + contributionRewardExtParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); + contributionRewardExtParams.initdata = await new web3.eth.Contract(registration.contributionRewardExt.abi) .methods - .initialize(avatarAddress, - vmZero ? helpers.NULL_ADDRESS : contributionRewardParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], + .initialize(helpers.NULL_ADDRESS, + contributionRewardExtParams.votingMachine.uintArray, + contributionRewardExtParams.votingMachine.voteOnBehalf, + _daoFactoryAddress, helpers.NULL_ADDRESS, - contributionRewardParams.votingMachine.params, - daoFactoryAddress, - [0,1,0], + _packageVersion, + "AbsoluteVote", service) .encodeABI(); } - return contributionRewardParams; + return contributionRewardExtParams; }; var registration; -const setup = async function (accounts,genesisProtocol = false,tokenAddress=0,service="",vmZero=false) { +const setup = async function (accounts,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS,service="") { var testSetup = new helpers.TestSetup(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100000); registration = await helpers.registerImplementation(); @@ -62,41 +62,31 @@ const setup = async function (accounts,genesisProtocol = false,tokenAddress=0,se testSetup.reputationArray = [2000,4000,7000]; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - accounts[2]], - [1000,0,0], - testSetup.reputationArray); - var daoFactoryAddress = helpers.NULL_ADDRESS; - if (service !== "") { - daoFactoryAddress = registration.daoFactory.address; - } testSetup.contributionRewardExtParams= await setupContributionRewardExt( accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, - daoFactoryAddress, - service, - vmZero); + registration.daoFactory.address, + service); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ContributionRewardExt")], - testSetup.contributionRewardExtParams.initdata, - [helpers.getBytesLength(testSetup.contributionRewardExtParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - if (service !== "") { - testSetup.contributionRewardExt = await ContributionRewardExt.at(tx.logs[2].args._scheme); - } else { - testSetup.contributionRewardExt = await ContributionRewardExt.at(tx.logs[1].args._scheme); - } + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + accounts[2]], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("ContributionRewardExt")], + testSetup.contributionRewardExtParams.initdata, + [helpers.getBytesLength(testSetup.contributionRewardExtParams.initdata)], + [permissions], + "metaData"); + testSetup.contributionRewardExt = await ContributionRewardExt.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.contributionRewardExtParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.contributionRewardExt.votingMachine(),genesisProtocol); testSetup.admin = accounts[0]; @@ -106,12 +96,12 @@ contract('ContributionRewardExt', accounts => { it("initialize", async function() { var testSetup = await setup(accounts); - assert.equal(await testSetup.contributionRewardExt.votingMachine(),testSetup.contributionRewardExtParams.votingMachine.absoluteVote.address); + assert.equal(await testSetup.contributionRewardExt.votingMachine(),testSetup.contributionRewardExtParams.votingMachineInstance.address); }); it("initialize vm 0", async function() { try { - await setup(accounts,false,0,true); + await setup(accounts,false,helpers.NULL_ADDRESS,true); assert(false, 'votingMachine cannot be zero'); } catch (ex) { // revert @@ -130,7 +120,7 @@ contract('ContributionRewardExt', accounts => { assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewContributionProposal"); assert.equal(await helpers.getValueFromLogs(tx, '_avatar',0), testSetup.org.avatar.address, "Wrong log: _avatar"); - assert.equal(await helpers.getValueFromLogs(tx, '_intVoteInterface',0), testSetup.contributionRewardExtParams.votingMachine.absoluteVote.address, "Wrong log: _intVoteInterface"); + assert.equal(await helpers.getValueFromLogs(tx, '_intVoteInterface',0), testSetup.contributionRewardExtParams.votingMachineInstance.address, "Wrong log: _intVoteInterface"); assert.equal(await helpers.getValueFromLogs(tx, '_descriptionHash',15), "description-hash", "Wrong log: _contributionDescription"); assert.equal(await helpers.getValueFromLogs(tx, '_reputationChange',0), 10, "Wrong log: _reputationChange"); var arr = await helpers.getValueFromLogs(tx, '_rewards',0); @@ -197,7 +187,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.contributionRewardExt.organizationProposals(proposalId); assert.notEqual(organizationProposal.acceptedByVotingMachine,0);//acceptedByVotingMachine }); @@ -215,7 +205,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionRewardExt.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RedeemReputation"); @@ -238,7 +228,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionRewardExt.redeem(proposalId,[false,true,false,false]); var tokens = await testSetup.org.token.balanceOf(accounts[1]); assert.equal(tokens.toNumber(),nativeTokenReward); @@ -264,7 +254,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.contributionRewardExt.redeem(proposalId,[false,false,true,false]); var vault = await otherAvatar.vault(); var eth = await web3.eth.getBalance(vault); @@ -292,7 +282,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.contributionRewardExt.redeem(proposalId,[false,false,false,true]); var tokens = await testSetup.standardTokenMock.balanceOf(otherAvatar.address); assert.equal(tokens.toNumber(),externalTokenReward); @@ -320,7 +310,7 @@ contract('ContributionRewardExt', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var organizationProposal = await testSetup.contributionRewardExt.organizationProposals(proposalId); assert.equal(organizationProposal[5],otherAvatar.address);//beneficiary - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); try { await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); @@ -345,7 +335,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionRewardExt.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); @@ -404,11 +394,11 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeemFromCRExt.call(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards @@ -423,7 +413,7 @@ contract('ContributionRewardExt', accounts => { assert.equal(redeemRewards[7],externalTokenReward); //crExternalTokenReward await arcUtils.redeemFromCRExt(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -464,7 +454,7 @@ contract('ContributionRewardExt', accounts => { var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeemFromCRExt.call(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],0); //redeemRewards[0] gpRewards @@ -501,11 +491,11 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeemFromCRExt.call(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards @@ -520,7 +510,7 @@ contract('ContributionRewardExt', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward await arcUtils.redeemFromCRExt(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -555,15 +545,15 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); - await standardTokenMock.approve(testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address,1000); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.stake(proposalId,1,1000); + await standardTokenMock.approve(testSetup.contributionRewardExtParams.votingMachineInstance.address,1000); + await testSetup.contributionRewardExtParams.votingMachineInstance.stake(proposalId,1,1000); await helpers.increaseTime(60+1); var arcUtils = await Redeemer.new(); var redeemRewards = await arcUtils.redeemFromCRExt.call(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); @@ -579,7 +569,7 @@ contract('ContributionRewardExt', accounts => { assert.equal(redeemRewards[7],0); //crExternalTokenReward await arcUtils.redeemFromCRExt(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -616,11 +606,11 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]}); var arcUtils = await Redeemer.new(); await arcUtils.redeemFromCRExt(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[0]); var vault = await otherAvatar.vault(); @@ -654,14 +644,14 @@ contract('ContributionRewardExt', accounts => { ); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]}); await helpers.increaseTime(60+1); var arcUtils = await Redeemer.new(); await arcUtils.redeemFromCRExt(testSetup.contributionRewardExt.address, - testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.address, + testSetup.contributionRewardExtParams.votingMachineInstance.address, proposalId, accounts[1]); - var proposal = await testSetup.contributionRewardExtParams.votingMachine.genesisProtocol.proposals(proposalId); + var proposal = await testSetup.contributionRewardExtParams.votingMachineInstance.proposals(proposalId); assert.equal(proposal.state,1); //ExpiredInQueue var reputation = await testSetup.org.reputation.balanceOf(accounts[1]); //accounts[1] redeems its deposit rep. @@ -683,7 +673,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionRewardExt.redeem(proposalId,[true,false,false,false]); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RedeemReputation"); @@ -702,12 +692,12 @@ contract('ContributionRewardExt', accounts => { try { await testSetup.contributionRewardExt.initialize( testSetup.org.avatar.address, - testSetup.contributionRewardExtParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - helpers.NULL_HASH, + testSetup.contributionRewardExtParams.votingMachine.uintArray, + testSetup.contributionRewardExtParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, helpers.NULL_ADDRESS, [0,1,0], + "GenericProtocol", "" ); assert(false, 'cannot initialize twice'); @@ -734,7 +724,7 @@ contract('ContributionRewardExt', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardExtParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.contributionRewardExtParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.contributionRewardExt.redeem(proposalId,[true,true,true,true]); var contVault = await testSetup.contributionRewardExt.vault(); var eth = await web3.eth.getBalance(contVault); @@ -880,7 +870,7 @@ contract('ContributionRewardExt', accounts => { }); it("negativ rep change is not allowed for rewarder to set ", async function() { - var testSetup = await setup(accounts,false,0,"RewarderMock"); + var testSetup = await setup(accounts,false,helpers.NULL_ADDRESS,"RewarderMock"); var reputationReward = -12; var nativeTokenReward = 12; var ethReward = 12; diff --git a/test/controllerupgradescheme.js b/test/controllerupgradescheme.js index eddfd019..70ca8215 100644 --- a/test/controllerupgradescheme.js +++ b/test/controllerupgradescheme.js @@ -1,6 +1,5 @@ const helpers = require("./helpers"); const Controller = artifacts.require("./Controller.sol"); -const AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); const ControllerUpgradeScheme = artifacts.require('./ControllerUpgradeScheme.sol'); const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const Avatar = artifacts.require("./Avatar.sol"); @@ -16,28 +15,33 @@ const setupControllerUpgradeSchemeParams = async function( accounts, genesisProtocol, token, - avatarAddress + _daoFactoryAddress, + _packageVersion = [0,1,0] ) { var controllerUpgradeSchemeParams = new ControllerUpgradeSchemeParams(); if (genesisProtocol === true) { - controllerUpgradeSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,avatarAddress,helpers.NULL_ADDRESS); + controllerUpgradeSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,helpers.NULL_ADDRESS,helpers.NULL_ADDRESS); controllerUpgradeSchemeParams.initdata = await new web3.eth.Contract(registration.controllerUpgradeScheme.abi) .methods - .initialize(avatarAddress, - controllerUpgradeSchemeParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, controllerUpgradeSchemeParams.votingMachine.uintArray, controllerUpgradeSchemeParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH) + _daoFactoryAddress, + token, + _packageVersion, + "GenesisProtocol") .encodeABI(); } else { controllerUpgradeSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); controllerUpgradeSchemeParams.initdata = await new web3.eth.Contract(registration.controllerUpgradeScheme.abi) .methods - .initialize(avatarAddress, - controllerUpgradeSchemeParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], + .initialize(helpers.NULL_ADDRESS, + controllerUpgradeSchemeParams.votingMachine.uintArray, + controllerUpgradeSchemeParams.votingMachine.voteOnBehalf, + _daoFactoryAddress, helpers.NULL_ADDRESS, - controllerUpgradeSchemeParams.votingMachine.params) + _packageVersion, + "AbsoluteVote") .encodeABI(); } return controllerUpgradeSchemeParams; @@ -67,52 +71,42 @@ const setupNewController = async function (accounts,permission='0x00000000') { }; -const setup = async function (accounts,genesisProtocol=false,tokenAddress= helpers.NULL_HASH) { +const setup = async function (accounts,genesisProtocol=false,tokenAddress= helpers.NULL_ADDRESS) { var testSetup = new helpers.TestSetup(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); registration = await helpers.registerImplementation(); testSetup.reputationArray = [20,40,70]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + testSetup.controllerUpgradeSchemeParams= await setupControllerUpgradeSchemeParams( + accounts, + genesisProtocol, + tokenAddress, + registration.daoFactory.address); + var permissions = "0x0000000a"; + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, accounts, registration, [accounts[0], accounts[1], accounts[2]], [1000,0,0], - testSetup.reputationArray); - testSetup.controllerUpgradeSchemeParams= await setupControllerUpgradeSchemeParams( - accounts, - genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); - var permissions = "0x0000000a"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ControllerUpgradeScheme")], - testSetup.controllerUpgradeSchemeParams.initdata, - [helpers.getBytesLength(testSetup.controllerUpgradeSchemeParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.controllerUpgradeScheme = await ControllerUpgradeScheme.at(tx.logs[1].args._scheme); - return testSetup; + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("ControllerUpgradeScheme")], + testSetup.controllerUpgradeSchemeParams.initdata, + [helpers.getBytesLength(testSetup.controllerUpgradeSchemeParams.initdata)], + [permissions], + "metaData"); + +testSetup.controllerUpgradeScheme = await ControllerUpgradeScheme.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); +testSetup.controllerUpgradeSchemeParams.votingMachineInstance = +await helpers.getVotingMachine(await testSetup.controllerUpgradeScheme.votingMachine(),genesisProtocol); return testSetup; }; contract('ControllerUpgradeScheme', accounts => { before(function() { helpers.etherForEveryone(accounts); }); - it("initialize", async() => { - var controllerUpgradeScheme = await ControllerUpgradeScheme.new(); - var absoluteVote = await AbsoluteVote.new(); - await controllerUpgradeScheme.initialize(helpers.SOME_ADDRESS, - absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - "0x1234"); - assert.equal(await controllerUpgradeScheme.votingMachine(),absoluteVote.address); - }); - it("proposeUpgrade log", async() => { var testSetup = await setup(accounts); @@ -122,7 +116,7 @@ contract('ControllerUpgradeScheme', accounts => { assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewControllerUpgradeProposal"); var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1); - assert.equal(votingMachine,testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.address); + assert.equal(votingMachine,testSetup.controllerUpgradeSchemeParams.votingMachineInstance.address); }); it("proposeChangeControllerUpgradingScheme log", async function() { @@ -132,7 +126,7 @@ contract('ControllerUpgradeScheme', accounts => { assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "ChangeControllerUpgradeSchemeProposal"); var votingMachine = await helpers.getValueFromLogs(tx, '_intVoteInterface',1); - assert.equal(votingMachine,testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.address); + assert.equal(votingMachine,testSetup.controllerUpgradeSchemeParams.votingMachineInstance.address); }); it("execute proposal upgrade controller -yes - proposal data delete", async function() { @@ -147,7 +141,7 @@ contract('ControllerUpgradeScheme', accounts => { var organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal[0],newController.address);//new contract address assert.equal(organizationProposal[1].toNumber(),1);//proposalType - await testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(newController.address,await testSetup.org.avatar.owner()); //check organizationsProposals after execution organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); @@ -167,7 +161,7 @@ contract('ControllerUpgradeScheme', accounts => { var organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal[0],newController.address);//new contract address assert.equal(organizationProposal[1].toNumber(),1);//proposalType - await testSetup.controllerUpgradeSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(newController.address,await testSetup.org.avatar.owner()); //check organizationsProposals after execution organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); @@ -187,7 +181,7 @@ contract('ControllerUpgradeScheme', accounts => { assert.equal(organizationProposal[1].toNumber(),1);//proposalType //Vote with reputation to trigger execution - await testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //should not upgrade because the decision is "no" assert.notEqual(newController.address,await testSetup.org.avatar.owner()); //check organizationsProposals after execution @@ -214,7 +208,7 @@ contract('ControllerUpgradeScheme', accounts => { assert.equal(await controller.isSchemeRegistered(accounts[0]),false); assert.equal(await controller.isSchemeRegistered(testSetup.controllerUpgradeScheme.address),true); - await testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); @@ -244,7 +238,7 @@ contract('ControllerUpgradeScheme', accounts => { assert.equal(await controller.isSchemeRegistered(accounts[0]),false); assert.equal(await controller.isSchemeRegistered(testSetup.controllerUpgradeScheme.address),true); - await testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); @@ -268,7 +262,7 @@ contract('ControllerUpgradeScheme', accounts => { var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.controllerUpgradeScheme.address),true); - await testSetup.controllerUpgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.controllerUpgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.controllerUpgradeScheme.organizationProposals(proposalId); diff --git a/test/daofactory.js b/test/daofactory.js index bc095617..6b4c7461 100644 --- a/test/daofactory.js +++ b/test/daofactory.js @@ -20,7 +20,15 @@ const setup = async function (accounts,founderToken,founderReputation,cap=0) { .initialize("TEST","TST",cap,registration.daoFactory.address) .encodeABI(); - var tx = await registration.daoFactory.forgeOrg("testOrg",nativeTokenData,[accounts[0]],[founderToken],[founderReputation],[0,0,0],{gas:constants.ARC_GAS_LIMIT}); + + var encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,[accounts[0]],[founderToken],[founderReputation],[0,0,0]]); + + var encodedSetSchemesParams = '0x'; + + var tx = await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + encodedSetSchemesParams, + {gas:constants.ARC_GAS_LIMIT}); assert.equal(tx.logs.length, 5); assert.equal(tx.logs[4].event, "NewOrg"); var avatarAddress = tx.logs[4].args._avatar; @@ -31,6 +39,16 @@ const setup = async function (accounts,founderToken,founderReputation,cap=0) { reputation = await Reputation.at(reputationAddress); }; +const setSchemes = async function(_data) { + var encodedSetSchemesParams = web3.eth.abi.encodeParameters(['bytes32[]','bytes','uint256[]','bytes4[]','string'], + _data); + var tx = await registration.daoFactory.setSchemes( + avatar.address, + encodedSetSchemesParams); + return tx; + +}; + contract('DaoFactory', function(accounts) { it("forgeOrg check avatar", async function() { @@ -89,16 +107,17 @@ contract('DaoFactory', function(accounts) { .methods .initialize(avatar.address) .encodeABI(); - + var encodedSetSchemesParams = web3.eth.abi.encodeParameters(['bytes32[]','bytes','uint256[]','bytes4[]','string'], + [[web3.utils.fromAscii("Wallet"), + web3.utils.fromAscii("SchemeMock"), + web3.utils.fromAscii("SchemeMock")], + helpers.concatBytes(helpers.concatBytes(walletData,schemeMockData1),schemeMockData2), + [helpers.getBytesLength(walletData), helpers.getBytesLength(schemeMockData1),helpers.getBytesLength(schemeMockData2)], + ["0x0000000F","0x0000000F","0x0000000F"], + "metaData"]); var tx = await registration.daoFactory.setSchemes( avatar.address, - [web3.utils.fromAscii("Wallet"), - web3.utils.fromAscii("SchemeMock"), - web3.utils.fromAscii("SchemeMock")], - helpers.concatBytes(helpers.concatBytes(walletData,schemeMockData1),schemeMockData2), - [helpers.getBytesLength(walletData), helpers.getBytesLength(schemeMockData1),helpers.getBytesLength(schemeMockData2)], - ["0x0000000F","0x0000000F","0x0000000F"], - "metaData"); + encodedSetSchemesParams); assert.equal(tx.logs.length, 7); assert.equal(tx.logs[6].event, "InitialSchemesSet"); assert.equal(tx.logs[6].args._avatar, avatar.address); @@ -123,15 +142,17 @@ contract('DaoFactory', function(accounts) { .methods .initialize(avatar.address,2) .encodeABI(); - + var data = [[web3.utils.fromAscii("SchemeMock"),web3.utils.fromAscii("SchemeMock")], + helpers.concatBytes(schemeMockData1, schemeMockData2), + [helpers.getBytesLength(schemeMockData1), helpers.getBytesLength(schemeMockData2)], + ["0x0000000F","0x0000000F"], + "metaData"]; + var encodedSetSchemesParams = web3.eth.abi.encodeParameters(['bytes32[]','bytes','uint256[]','bytes4[]','string'],data); try { await registration.daoFactory.setSchemes( avatar.address, - [web3.utils.fromAscii("SchemeMock"),web3.utils.fromAscii("SchemeMock")], - helpers.concatBytes(schemeMockData1, schemeMockData2), - [helpers.getBytesLength(schemeMockData1), helpers.getBytesLength(schemeMockData2)], - ["0x0000000F","0x0000000F"], - "metaData",{from:accounts[1]}); + encodedSetSchemesParams, + {from:accounts[1]}); assert(false,"should fail because accounts[1] does not hold the lock"); } catch(ex){ @@ -147,14 +168,11 @@ contract('DaoFactory', function(accounts) { .methods .initialize(avatar.address,1) .encodeABI(); - - var tx = await registration.daoFactory.setSchemes( - avatar.address, - [web3.utils.fromAscii("SchemeMock")], - schemeMockData1, - [helpers.getBytesLength(schemeMockData1)], - ["0x0000000F"], - "metaData"); + var tx = await setSchemes([[web3.utils.fromAscii("SchemeMock")], + schemeMockData1, + [helpers.getBytesLength(schemeMockData1)], + ["0x0000000F"], + "metaData"]); controllerAddress = await avatar.owner({from:accounts[1]}); controller = await Controller.at(controllerAddress); var isSchemeRegistered = await controller.isSchemeRegistered(tx.logs[1].args._scheme,{from:accounts[1]}); @@ -174,14 +192,11 @@ contract('DaoFactory', function(accounts) { .methods .initialize(avatar.address,1) .encodeABI(); - - await registration.daoFactory.setSchemes( - avatar.address, - [web3.utils.fromAscii("SchemeMock")], - schemeMockData1, - [helpers.getBytesLength(schemeMockData1)], - ["0x0000000F"], - "metaData"); + await setSchemes([[web3.utils.fromAscii("SchemeMock")], + schemeMockData1, + [helpers.getBytesLength(schemeMockData1)], + ["0x0000000F"], + "metaData"]); isSchemeRegistered = await controller.isSchemeRegistered(registration.daoFactory.address,{from:accounts[1]}); assert.equal(isSchemeRegistered,false); }); @@ -193,22 +208,17 @@ contract('DaoFactory', function(accounts) { .methods .initialize(avatar.address,1) .encodeABI(); - - await registration.daoFactory.setSchemes( - avatar.address, - [web3.utils.fromAscii("SchemeMock")], - schemeMockData1, - [helpers.getBytesLength(schemeMockData1)], - ["0x0000000F"], - "metaData"); + await setSchemes([[web3.utils.fromAscii("SchemeMock")], + schemeMockData1, + [helpers.getBytesLength(schemeMockData1)], + ["0x0000000F"], + "metaData"]); try { - await registration.daoFactory.setSchemes( - avatar.address, - [web3.utils.fromAscii("SchemeMock")], - schemeMockData1, - [helpers.getBytesLength(schemeMockData1)], - ["0x0000000F"], - "metaData"); + await setSchemes([[web3.utils.fromAscii("SchemeMock")], + schemeMockData1, + [helpers.getBytesLength(schemeMockData1)], + ["0x0000000F"], + "metaData"]); assert(false,"should fail because lock for account[0] suppose to be deleted by the first call"); } catch(ex){ @@ -219,31 +229,45 @@ contract('DaoFactory', function(accounts) { it("forgeOrg with different params length should revert", async function() { var amountToMint = 10; await setup(accounts,amountToMint,amountToMint); + var encodedForgeOrgParams; + var encodedSetSchemesParams = '0x'; try { - await registration.daoFactory.forgeOrg("testOrg",nativeTokenData,[accounts[0]],[11],[],[0,0,0],{gas:constants.ARC_GAS_LIMIT}); - assert(false,"should revert because reputation array size is 0"); + + encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,[accounts[0]],[11],[],[0,0,0]]); + await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + encodedSetSchemesParams, + {gas:constants.ARC_GAS_LIMIT}); + assert(false,"should revert because reputation array size is 0"); } catch(ex){ helpers.assertVMException(ex); } try { - await registration.daoFactory.forgeOrg("testOrg",nativeTokenData,[accounts[0]],[],[11],[0,0,0],{gas:constants.ARC_GAS_LIMIT}); - assert(false,"should revert because token array size is 0"); + encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,[accounts[0]],[],[11],[0,0,0]]); + await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + encodedSetSchemesParams, + {gas:constants.ARC_GAS_LIMIT}); + assert(false,"should revert because token array size is 0"); } catch(ex){ helpers.assertVMException(ex); } try { - await registration.daoFactory.forgeOrg("testOrg", - nativeTokenData,[accounts[0], - helpers.NULL_ADDRESS], - [amountToMint,amountToMint], - [amountToMint,amountToMint], - [0,0,0], - {gas:constants.ARC_GAS_LIMIT}); + encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg", + nativeTokenData,[accounts[0], + helpers.NULL_ADDRESS], + [amountToMint,amountToMint], + [amountToMint,amountToMint], + [0,0,0]]); + await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + encodedSetSchemesParams, + {gas:constants.ARC_GAS_LIMIT}); assert(false,"should revert because account is 0"); } catch(ex){ @@ -283,13 +307,12 @@ contract('DaoFactory', function(accounts) { .initialize(avatar.address,1) .encodeABI(); - var tx = await registration.daoFactory.setSchemes( - avatar.address, - [web3.utils.fromAscii("SchemeMock")], + var tx = await setSchemes( + [[web3.utils.fromAscii("SchemeMock")], schemeMockData1, [helpers.getBytesLength(schemeMockData1)], ["0x0000000F"], - "metaData"); + "metaData"]); assert.equal(tx.logs.length, 3); assert.equal(tx.logs[2].event, "InitialSchemesSet"); assert.equal(tx.logs[2].args._avatar, avatar.address); @@ -363,8 +386,11 @@ contract('DaoFactory', function(accounts) { .methods .initialize("TEST","TST",0,registration.daoFactory.address) .encodeABI(); - - var tx = await registration.daoFactory.forgeOrg("testOrg",nativeTokenData,[accounts[0]],[amountToMint],[amountToMint],[0,1,0],{gas:constants.ARC_GAS_LIMIT}); + var encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,[accounts[0]],[amountToMint],[amountToMint],[0,1,0]]); + var tx = await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + "0x", + {gas:constants.ARC_GAS_LIMIT}); assert.equal(tx.logs.length, 5); var avatarAddress = tx.logs[4].args._avatar; assert.equal(tx.logs[2].event, "ProxyCreated"); @@ -372,8 +398,12 @@ contract('DaoFactory', function(accounts) { assert.equal(tx.logs[2].args._implementation, oldAvatarImplementation); assert.equal(tx.logs[2].args._contractName, "Avatar"); assert.equal(tx.logs[2].args._version[1].toNumber(),1); + encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,[accounts[0]],[amountToMint],[amountToMint],[0,2,0]]); + tx = await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + "0x", + {gas:constants.ARC_GAS_LIMIT}); - tx = await registration.daoFactory.forgeOrg("testOrg",nativeTokenData,[accounts[0]],[amountToMint],[amountToMint],[0,2,0],{gas:constants.ARC_GAS_LIMIT}); assert.equal(tx.logs.length, 5); avatarAddress = tx.logs[4].args._avatar; assert.equal(tx.logs[2].event, "ProxyCreated"); diff --git a/test/dictator.js b/test/dictator.js index 25dc84b3..86d0f2f1 100644 --- a/test/dictator.js +++ b/test/dictator.js @@ -19,40 +19,61 @@ const setupDictator = async function(_avatarAddress,_owner) { return dictatorParams; }; -const setup = async function (accounts) { +const setup = async function (accounts,permissions = "0x0000001f" ) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.reputationArray = [2000,4000,7000]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + + testSetup.owner = accounts[4]; + testSetup.dictatorParams= await setupDictator( + helpers.NULL_ADDRESS, + testSetup.owner + ); + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, accounts, registration, [accounts[0], accounts[1], accounts[2]], [1000,0,0], - testSetup.reputationArray); - testSetup.owner = accounts[4]; - testSetup.dictatorParams= await setupDictator( - testSetup.org.avatar.address, - testSetup.owner - ); - var permissions = "0x0000001f"; + testSetup.reputationArray,0, + [web3.utils.fromAscii("Dictator")], + testSetup.dictatorParams.initdata, + [helpers.getBytesLength(testSetup.dictatorParams.initdata)], + [permissions], + "metaData"); - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("Dictator")], - testSetup.dictatorParams.initdata, - [helpers.getBytesLength(testSetup.dictatorParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.dictator = await Dictator.at(tx.logs[1].args._scheme); + testSetup.dictator = await Dictator.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); return testSetup; }; contract('Dictator', accounts => { + it("avatar address cannot be 0 ", async function() { + var dictator = await Dictator.new(); + + try { + await dictator.initialize(helpers.NULL_ADDRESS,accounts[0]); + assert(false, "avatar 0 address should revert"); + } catch(error) { + // revert + } + await dictator.initialize(accounts[1],accounts[0]); + }); + + it("register scheme should fail without proper permission", async function() { + var testSetup = await setup(accounts,"0x00000000"); + try { + await testSetup.dictator.registerScheme(accounts[3],{from:testSetup.owner}); + assert(false, "register scheme should fail without proper permission"); + } catch(error) { + helpers.assertVMException(error); + } + + }); + it("register scheme", async function() { var testSetup = await setup(accounts); var controllerAddress = await testSetup.org.avatar.owner(); diff --git a/test/externallocking4reputation.js b/test/externallocking4reputation.js index 48e1b9bc..ce2ac707 100644 --- a/test/externallocking4reputation.js +++ b/test/externallocking4reputation.js @@ -18,54 +18,50 @@ const setup = async function (accounts, var testSetup = new helpers.TestSetup(); testSetup.proxyAdmin = accounts[5]; var registration = await helpers.registerImplementation(); - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory( + var block = await web3.eth.getBlock("latest"); + testSetup.lockingEndTime = block.timestamp + _claimingEndTime; + testSetup.lockingStartTime = block.timestamp + _claimingStartTime; + testSetup.redeemEnableTime = block.timestamp + _redeemEnableTime; + testSetup.extetnalTokenLockerMock = await ExternalTokenLockerMock.new(); + await testSetup.extetnalTokenLockerMock.initialize(accounts[0]); + await testSetup.extetnalTokenLockerMock.lock(100,accounts[0]); + await testSetup.extetnalTokenLockerMock.lock(200,accounts[1]); + await testSetup.extetnalTokenLockerMock.lock(300,accounts[2]); + testSetup.agreementHash = _agreementHash; + + testSetup.externalLocking4ReputationParams = new ExternalLocking4ReputationParams(); + if (_initialize === true) { + testSetup.externalLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.externalLocking4Reputation.abi) + .methods + .initialize(helpers.NULL_ADDRESS, + _repAllocation, + testSetup.lockingStartTime, + testSetup.lockingEndTime, + testSetup.redeemEnableTime, + testSetup.extetnalTokenLockerMock.address, + "lockedTokenBalances(address)", + testSetup.agreementHash) + .encodeABI(); + } else { + testSetup.externalLocking4ReputationParams.initdata = Buffer.from(''); + } + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory( testSetup.proxyAdmin, accounts, registration, [accounts[0]], [1000], - [1000] + [1000], + 0, + [web3.utils.fromAscii("ExternalLocking4Reputation")], + testSetup.externalLocking4ReputationParams.initdata, + [helpers.getBytesLength(testSetup.externalLocking4ReputationParams.initdata)], + ["0x0000000"], + "metaData" ); - - var block = await web3.eth.getBlock("latest"); - testSetup.lockingEndTime = block.timestamp + _claimingEndTime; - testSetup.lockingStartTime = block.timestamp + _claimingStartTime; - testSetup.redeemEnableTime = block.timestamp + _redeemEnableTime; - testSetup.extetnalTokenLockerMock = await ExternalTokenLockerMock.new(); - await testSetup.extetnalTokenLockerMock.initialize(accounts[0]); - await testSetup.extetnalTokenLockerMock.lock(100,accounts[0]); - await testSetup.extetnalTokenLockerMock.lock(200,accounts[1]); - await testSetup.extetnalTokenLockerMock.lock(300,accounts[2]); - testSetup.agreementHash = _agreementHash; - - testSetup.externalLocking4ReputationParams = new ExternalLocking4ReputationParams(); - if (_initialize === true) { - testSetup.externalLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.externalLocking4Reputation.abi) - .methods - .initialize(testSetup.org.avatar.address, - _repAllocation, - testSetup.lockingStartTime, - testSetup.lockingEndTime, - testSetup.redeemEnableTime, - testSetup.extetnalTokenLockerMock.address, - "lockedTokenBalances(address)", - testSetup.agreementHash) - .encodeABI(); - } else { - testSetup.externalLocking4ReputationParams.initdata = Buffer.from(''); - } - - var permissions = "0x00000000"; - - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ExternalLocking4Reputation")], - testSetup.externalLocking4ReputationParams.initdata, - [helpers.getBytesLength(testSetup.externalLocking4ReputationParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.externalLocking4Reputation = await ExternalLocking4Reputation.at(tx.logs[1].args._scheme); + testSetup.externalLocking4Reputation = await ExternalLocking4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); return testSetup; }; diff --git a/test/fixreputationallocation.js b/test/fixreputationallocation.js index a61bacab..08e876dd 100644 --- a/test/fixreputationallocation.js +++ b/test/fixreputationallocation.js @@ -14,42 +14,39 @@ const setup = async function (accounts, var testSetup = new helpers.TestSetup(); testSetup.proxyAdmin = accounts[5]; var registration = await helpers.registerImplementation(); - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory( + testSetup.fixedReputationAllocationParams = new FixedReputationAllocationParams(); + var block = await web3.eth.getBlock("latest"); + testSetup.redeemEnableTime = block.timestamp + _redeemEnableTime; + + if (_initialize === true) { + testSetup.fixedReputationAllocationParams.initdata = await new web3.eth.Contract(registration.fixedReputationAllocation.abi) + .methods + .initialize(helpers.NULL_ADDRESS, + _repAllocation, + testSetup.redeemEnableTime, + accounts[0]) + .encodeABI(); + } else { + testSetup.fixedReputationAllocationParams.initdata = Buffer.from(''); + } + + var permissions = "0x00000000"; + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory( testSetup.proxyAdmin, accounts, registration, [accounts[0]], [0], - [0] + [0], + 0, + [web3.utils.fromAscii("FixedReputationAllocation")], + testSetup.fixedReputationAllocationParams.initdata, + [helpers.getBytesLength(testSetup.fixedReputationAllocationParams.initdata)], + [permissions], + "metaData" ); - - testSetup.fixedReputationAllocationParams = new FixedReputationAllocationParams(); - var block = await web3.eth.getBlock("latest"); - testSetup.redeemEnableTime = block.timestamp + _redeemEnableTime; - - if (_initialize === true) { - testSetup.fixedReputationAllocationParams.initdata = await new web3.eth.Contract(registration.fixedReputationAllocation.abi) - .methods - .initialize(testSetup.org.avatar.address, - _repAllocation, - testSetup.redeemEnableTime, - accounts[0]) - .encodeABI(); - } else { - testSetup.fixedReputationAllocationParams.initdata = Buffer.from(''); - } - - var permissions = "0x00000000"; - - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("FixedReputationAllocation")], - testSetup.fixedReputationAllocationParams.initdata, - [helpers.getBytesLength(testSetup.fixedReputationAllocationParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.fixedReputationAllocation = await FixedReputationAllocation.at(tx.logs[1].args._scheme); - return testSetup; + testSetup.fixedReputationAllocation = await FixedReputationAllocation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + return testSetup; }; contract('FixedReputationAllocation', accounts => { diff --git a/test/fundingrequest.js b/test/fundingrequest.js index c27b3bb8..98fa18ac 100644 --- a/test/fundingrequest.js +++ b/test/fundingrequest.js @@ -17,46 +17,42 @@ const setupJoinAndQuit = async function( accounts, genesisProtocol, token, - avatarAddress, _fundingToken, _minFeeToJoin, _memberReputation, _fundingGoal, - _fundingGoalDeadline + _fundingGoalDeadline, + _packageVersion = [0,1,0] ) { var joinAndQuitParams = new JoinAndQuitParams(); + var encodedJoinAndQuitParams = web3.eth.abi.encodeParameters(['address','uint256','uint256','uint256','uint256','bool'], + [_fundingToken,_minFeeToJoin,_memberReputation,_fundingGoal,_fundingGoalDeadline,false]); if (genesisProtocol === true) { joinAndQuitParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); joinAndQuitParams.initdata = await new web3.eth.Contract(registration.joinAndQuit.abi) .methods - .initialize(avatarAddress, - joinAndQuitParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, joinAndQuitParams.votingMachine.uintArray, joinAndQuitParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, - _fundingToken, - _minFeeToJoin, - _memberReputation, - _fundingGoal, - _fundingGoalDeadline, - false) + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol", + encodedJoinAndQuitParams) .encodeABI(); } else { joinAndQuitParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); joinAndQuitParams.initdata = await new web3.eth.Contract(registration.joinAndQuit.abi) .methods - .initialize(avatarAddress, - joinAndQuitParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], - helpers.NULL_ADDRESS, - joinAndQuitParams.votingMachine.params, - _fundingToken, - _minFeeToJoin, - _memberReputation, - _fundingGoal, - _fundingGoalDeadline, - false) + .initialize(helpers.NULL_ADDRESS, + joinAndQuitParams.votingMachine.uintArray, + joinAndQuitParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote", + encodedJoinAndQuitParams) .encodeABI(); } return joinAndQuitParams; @@ -67,19 +63,21 @@ const setupFundingRequest = async function( accounts, genesisProtocol, token, - avatarAddress, - externalToken) { + externalToken, + _packageVersion = [0,1,0]) { var fundingRequestParams = new FundingRequestParams(); if (genesisProtocol === true) { fundingRequestParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); fundingRequestParams.initdata = await new web3.eth.Contract(registration.fundingRequest.abi) .methods - .initialize(avatarAddress, - fundingRequestParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, fundingRequestParams.votingMachine.uintArray, fundingRequestParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol", externalToken ) .encodeABI(); @@ -87,11 +85,13 @@ const setupFundingRequest = async function( fundingRequestParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); fundingRequestParams.initdata = await new web3.eth.Contract(registration.fundingRequest.abi) .methods - .initialize(avatarAddress, - fundingRequestParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], - helpers.NULL_ADDRESS, - fundingRequestParams.votingMachine.params, + .initialize(helpers.NULL_ADDRESS, + fundingRequestParams.votingMachine.uintArray, + fundingRequestParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote", externalToken ) .encodeABI(); @@ -116,14 +116,6 @@ const setup = async function (accounts, testSetup.reputationArray = [2000,4000,7000]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - accounts[2]], - [1000,0,0], - testSetup.reputationArray); testSetup.fundingGoalDeadline = (await web3.eth.getBlock("latest")).timestamp + fundingGoalDeadline; testSetup.minFeeToJoin = minFeeToJoin; testSetup.memberReputation = memberReputation; @@ -138,7 +130,6 @@ const setup = async function (accounts, accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, fundPath, minFeeToJoin, memberReputation, @@ -149,20 +140,31 @@ const setup = async function (accounts, accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, fundPath); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("JoinAndQuit"), web3.utils.fromAscii("FundingRequest")], - helpers.concatBytes(testSetup.joinAndQuitParams.initdata, testSetup.fundingRequestParams.initdata), - [helpers.getBytesLength(testSetup.joinAndQuitParams.initdata), helpers.getBytesLength(testSetup.fundingRequestParams.initdata)], - [permissions, permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.joinAndQuit = await JoinAndQuit.at(tx.logs[1].args._scheme); - testSetup.fundingRequest = await FundingRequest.at(tx.logs[3].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + accounts[2]], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("JoinAndQuit"), web3.utils.fromAscii("FundingRequest")], + helpers.concatBytes(testSetup.joinAndQuitParams.initdata, testSetup.fundingRequestParams.initdata), + [helpers.getBytesLength(testSetup.joinAndQuitParams.initdata), helpers.getBytesLength(testSetup.fundingRequestParams.initdata)], + [permissions, permissions], + "metaData"); + + testSetup.joinAndQuit = await JoinAndQuit.at(tx.logs[7].args._scheme); + testSetup.fundingRequest = await FundingRequest.at(tx.logs[10].args._scheme); + testSetup.joinAndQuitParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.joinAndQuit.votingMachine(),genesisProtocol); + + testSetup.fundingRequestParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.fundingRequest.votingMachine(),genesisProtocol); if(setupJAQProposal) { await testSetup.standardTokenMock.transfer(accounts[3],10000); @@ -176,11 +178,8 @@ const setup = async function (accounts, testSetup.fundingGoal, {value, from:accounts[3]}); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - if (genesisProtocol === false) { - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - } else { - await testSetup.joinAndQuitParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - } + + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); } return testSetup; }; @@ -188,10 +187,9 @@ contract('FundingRequest', accounts => { it("initialize", async function() { var testSetup = await setup(accounts, false); - assert.equal(await testSetup.fundingRequest.votingMachine(),testSetup.fundingRequestParams.votingMachine.absoluteVote.address); + assert.equal(await testSetup.fundingRequest.votingMachine(),testSetup.fundingRequestParams.votingMachineInstance.address); assert.equal(await testSetup.fundingRequest.fundingToken(),testSetup.standardTokenMock.address); }); - it("can't propose before funded", async() => { var testSetup = await setup(accounts, false); try { @@ -246,7 +244,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, (await web3.eth.getBlock("latest")).timestamp); }); @@ -261,7 +259,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, 0); }); @@ -275,7 +273,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, (await web3.eth.getBlock("latest")).timestamp); tx = await testSetup.fundingRequest.redeem(proposalId); @@ -299,7 +297,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, (await web3.eth.getBlock("latest")).timestamp); tx = await testSetup.fundingRequest.redeem(proposalId); @@ -324,7 +322,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, (await web3.eth.getBlock("latest")).timestamp); tx = await testSetup.fundingRequest.redeem(proposalId); @@ -370,7 +368,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, 0); try { @@ -391,7 +389,7 @@ contract('FundingRequest', accounts => { "description-hash"); let proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.fundingRequestParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.fundingRequestParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.fundingRequest.proposals(proposalId); assert.equal(proposal.executionTime, (await web3.eth.getBlock("latest")).timestamp); tx = await testSetup.fundingRequest.redeem(proposalId); diff --git a/test/genericscheme.js b/test/genericscheme.js index 9b697956..7f80729f 100644 --- a/test/genericscheme.js +++ b/test/genericscheme.js @@ -15,8 +15,8 @@ const setupGenericSchemeParams = async function( accounts, genesisProtocol, token, - avatarAddress, - contractToCall + contractToCall, + _packageVersion = [0,1,0] ) { var genericSchemeParams = new GenericSchemeParams(); @@ -24,29 +24,33 @@ const setupGenericSchemeParams = async function( genericSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); genericSchemeParams.initdata = await new web3.eth.Contract(registration.genericScheme.abi) .methods - .initialize(avatarAddress, - genericSchemeParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, genericSchemeParams.votingMachine.uintArray, genericSchemeParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol", contractToCall) .encodeABI(); } else { genericSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); genericSchemeParams.initdata = await new web3.eth.Contract(registration.genericScheme.abi) .methods - .initialize(avatarAddress, - genericSchemeParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - genericSchemeParams.votingMachine.params, + .initialize(helpers.NULL_ADDRESS, + genericSchemeParams.votingMachine.uintArray, + genericSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote", contractToCall) .encodeABI(); } return genericSchemeParams; }; -const setup = async function (accounts,contractToCall = 0,reputationAccount=0,genesisProtocol = false,tokenAddress=0) { +const setup = async function (accounts,contractToCall = 0,reputationAccount=0,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS) { var testSetup = new helpers.TestSetup(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); registration = await helpers.registerImplementation(); @@ -58,31 +62,33 @@ const setup = async function (accounts,contractToCall = 0,reputationAccount=0,ge account2 = reputationAccount; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - account2], - [1000,0,0], - testSetup.reputationArray); testSetup.genericSchemeParams= await setupGenericSchemeParams( accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, contractToCall ); var permissions = "0x0000001f"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("GenericScheme")], - testSetup.genericSchemeParams.initdata, - [helpers.getBytesLength(testSetup.genericSchemeParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.genericScheme = await GenericScheme.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + account2], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("GenericScheme")], + testSetup.genericSchemeParams.initdata, + [helpers.getBytesLength(testSetup.genericSchemeParams.initdata)], + [permissions], + "metaData" + ); + + testSetup.genericScheme = await GenericScheme.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.genericSchemeParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.genericScheme.votingMachine(),genesisProtocol); return testSetup; }; @@ -114,7 +120,7 @@ contract('GenericScheme', function(accounts) { var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(callData,0,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]}); + await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.genericScheme.organizationProposals(proposalId); assert.equal(organizationProposal.passed,false); @@ -129,7 +135,7 @@ contract('GenericScheme', function(accounts) { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); var organizationProposal = await testSetup.genericScheme.organizationProposals(proposalId); assert.equal(organizationProposal[0],callData,helpers.NULL_HASH); - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.genericScheme.organizationProposals(proposalId); assert.equal(organizationProposal.callData,null);//new contract address @@ -142,7 +148,7 @@ contract('GenericScheme', function(accounts) { var tx = await testSetup.genericScheme.proposeCall(callData,0,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]}); + await testSetup.genericSchemeParams.votingMachineInstance.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.organizationProposals(proposalId); assert.equal(organizationProposal.exist,true);//new contract address @@ -161,7 +167,7 @@ contract('GenericScheme', function(accounts) { var tx = await testSetup.genericScheme.proposeCall(callData,0,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]}); + await testSetup.genericSchemeParams.votingMachineInstance.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.organizationProposals(proposalId); assert.equal(organizationProposal.exist,true);//new contract address @@ -191,7 +197,7 @@ contract('GenericScheme', function(accounts) { var tx = await testSetup.genericScheme.proposeCall(encodeABI,0,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]}); + await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); @@ -222,7 +228,7 @@ contract('GenericScheme', function(accounts) { //transfer some eth to avatar await web3.eth.sendTransaction({from:accounts[0],to:testSetup.org.avatar.address, value: web3.utils.toWei('1', "ether")}); assert.equal(await web3.eth.getBalance(actionMock.address),0); - tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.genericScheme.getPastEvents('ProposalExecutedByVotingMachine', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -242,7 +248,7 @@ contract('GenericScheme', function(accounts) { var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(callData,0,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]}); + tx = await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.genericScheme.getPastEvents('ProposalExecutedByVotingMachine', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -263,7 +269,7 @@ contract('GenericScheme', function(accounts) { var tx = await testSetup.genericScheme.proposeCall(callData,0,helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); assert.equal(await web3.eth.getBalance(wallet.address),web3.utils.toWei('1', "ether")); - await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await web3.eth.getBalance(wallet.address),web3.utils.toWei('1', "ether")); await wallet.transferOwnership(testSetup.org.avatar.address); await testSetup.genericScheme.execute( proposalId); @@ -276,12 +282,14 @@ contract('GenericScheme', function(accounts) { try { await testSetup.genericScheme.initialize( - testSetup.org.avatar.address, - accounts[0], - [0,0,0,0,0,0,0,0,0,0,0], helpers.NULL_ADDRESS, - helpers.SOME_HASH, - accounts[0] + testSetup.genericSchemeParams.votingMachine.uintArray, + testSetup.genericSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "GenesisProtocol", + helpers.NULL_ADDRESS ); assert(false, "cannot init twice"); } catch(error) { diff --git a/test/globalconstraintregistrar.js b/test/globalconstraintregistrar.js index 22e9e46d..ab5010d9 100644 --- a/test/globalconstraintregistrar.js +++ b/test/globalconstraintregistrar.js @@ -14,94 +14,93 @@ const setupGlobalConstraintRegistrarParams = async function( accounts, genesisProtocol, token, - avatarAddress + _packageVersion = [0,1,0] ) { var globalConstraintRegistrarParams = new GlobalConstraintRegistrarParams(); if (genesisProtocol === true) { globalConstraintRegistrarParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); globalConstraintRegistrarParams.initdata = await new web3.eth.Contract(registration.globalConstraintRegistrar.abi) .methods - .initialize(avatarAddress, - globalConstraintRegistrarParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, globalConstraintRegistrarParams.votingMachine.uintArray, globalConstraintRegistrarParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH) + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol") .encodeABI(); } else { globalConstraintRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); globalConstraintRegistrarParams.initdata = await new web3.eth.Contract(registration.globalConstraintRegistrar.abi) .methods - .initialize(avatarAddress, - globalConstraintRegistrarParams.votingMachine.absoluteVote.address, - [1,1,1,1,1,1,1,1,1,1,1], - helpers.NULL_ADDRESS, - globalConstraintRegistrarParams.votingMachine.params) + .initialize(helpers.NULL_ADDRESS, + globalConstraintRegistrarParams.votingMachine.uintArray, + globalConstraintRegistrarParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote") .encodeABI(); } return globalConstraintRegistrarParams; }; -const setup = async function (accounts,genesisProtocol = false,tokenAddress=0) { +const setup = async function (accounts,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS) { var testSetup = new helpers.TestSetup(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100000); registration = await helpers.registerImplementation(); testSetup.reputationArray = [20,10,70]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - accounts[2]], - [1000,0,0], - testSetup.reputationArray); testSetup.globalConstraintRegistrarParams= await setupGlobalConstraintRegistrarParams(testSetup.globalConstraintRegistrar, accounts, genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); + tokenAddress); var permissions = "0x00000004"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("GlobalConstraintRegistrar")], - testSetup.globalConstraintRegistrarParams.initdata, - [helpers.getBytesLength(testSetup.globalConstraintRegistrarParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.globalConstraintRegistrar = await GlobalConstraintRegistrar.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + accounts[2]], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("GlobalConstraintRegistrar")], + testSetup.globalConstraintRegistrarParams.initdata, + [helpers.getBytesLength(testSetup.globalConstraintRegistrarParams.initdata)], + [permissions], + "metaData"); + testSetup.globalConstraintRegistrar = await GlobalConstraintRegistrar.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.globalConstraintRegistrarParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.globalConstraintRegistrar.votingMachine(),genesisProtocol); return testSetup; }; + +const propose = async function( + testSetup, + gc + ) { + var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( + gc, + "0x1234" + ); + return [await helpers.getValueFromLogs(tx, '_proposalId',1),tx]; +}; contract('GlobalConstraintRegistrar', accounts => { it("initialize", async ()=> { var testSetup = await setup(accounts); - assert.equal(await testSetup.globalConstraintRegistrar.votingMachine(),testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.address); - }); - - it("proposeGlobalConstraint voteToRemoveParams", async function() { - var testSetup = await setup(accounts); - var globalConstraintMock = await GlobalConstraintMock.new(); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - "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(globalConstraintMock.address); - assert.equal(voteToRemoveParams, "0x1235000000000000000000000000000000000000000000000000000000000000"); + assert.equal(await testSetup.globalConstraintRegistrar.votingMachine(),testSetup.globalConstraintRegistrarParams.votingMachineInstance.address); }); it("proposeGlobalConstraint organizationsProposals", async function() { var testSetup = await setup(accounts); var globalConstraintMock = await GlobalConstraintMock.new(); - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - "0x1234",helpers.NULL_HASH); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + [proposalId, tx] = await propose( testSetup, + globalConstraintMock.address); var organizationProposal = await testSetup.globalConstraintRegistrar.organizationProposals(proposalId); assert.equal(organizationProposal[0],globalConstraintMock.address); }); @@ -109,10 +108,7 @@ contract('GlobalConstraintRegistrar', accounts => { it("proposeGlobalConstraint log", async function() { var testSetup = await setup(accounts); var globalConstraintMock = await GlobalConstraintMock.new(); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - "0x1234",helpers.NULL_HASH); + [proposalId,tx] = await propose(testSetup,globalConstraintMock.address); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); }); @@ -125,16 +121,14 @@ contract('GlobalConstraintRegistrar', accounts => { - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - testSetup.globalConstraintRegistrarParams.votingMachine.params,helpers.NULL_HASH); + [proposalId, tx] = await propose( testSetup, + globalConstraintMock.address); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); let gcCount = await controller.globalConstraintsCount(); assert.equal(gcCount[0],0); assert.equal(gcCount[1],0); - tx = await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); gcCount = await controller.globalConstraintsCount(); assert.equal(gcCount[0],1); }); @@ -144,11 +138,9 @@ contract('GlobalConstraintRegistrar', accounts => { var globalConstraintMock =await GlobalConstraintMock.new(); await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - 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]}); + [proposalId,tx] = await propose(testSetup,globalConstraintMock.address); + + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC( globalConstraintMock.address,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); @@ -175,11 +167,9 @@ contract('GlobalConstraintRegistrar', accounts => { var globalConstraintMock =await GlobalConstraintMock.new(); await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - 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]}); + [proposalId,tx] = await propose(testSetup,globalConstraintMock.address); + + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await controller.isGlobalConstraintRegistered(globalConstraintMock.address),true); tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC( globalConstraintMock.address, @@ -189,7 +179,7 @@ contract('GlobalConstraintRegistrar', accounts => { proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); let count = await controller.globalConstraintsCount(); assert.equal(count[0],1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); count = await controller.globalConstraintsCount(); assert.equal(count[0],0); }); @@ -200,11 +190,8 @@ contract('GlobalConstraintRegistrar', accounts => { var globalConstraintMock =await GlobalConstraintMock.new(); await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - 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]}); + [proposalId,tx] = await propose(testSetup,globalConstraintMock.address); + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let count = await controller.globalConstraintsCount(); assert.equal(count[0],0); }); @@ -215,20 +202,15 @@ contract('GlobalConstraintRegistrar', accounts => { var globalConstraintMock =await GlobalConstraintMock.new(); //genesisProtocol use burn reputation. await globalConstraintMock.setConstraint(web3.utils.asciiToHex("burnReputation"),true,true); - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint( - globalConstraintMock.address, - testSetup.globalConstraintRegistrarParams.votingMachine.params, - helpers.NULL_HASH); - - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + [proposalId,tx] = await propose(testSetup,globalConstraintMock.address); + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC( globalConstraintMock.address, helpers.NULL_HASH); proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var rep = await testSetup.org.reputation.balanceOf(accounts[2]); - await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); - await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol,proposalId,accounts[2],[1,rep.toNumber()]); + await testSetup.globalConstraintRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachineInstance,proposalId,accounts[2],[1,rep.toNumber()]); }); }); diff --git a/test/helpers.js b/test/helpers.js index 618983ab..efcd1695 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -5,7 +5,6 @@ const Avatar = artifacts.require("./Avatar.sol"); const DAOToken = artifacts.require("./DAOToken.sol"); const Reputation = artifacts.require("./Reputation.sol"); const AbsoluteVote = artifacts.require("./AbsoluteVote.sol"); -const constants = require('./constants'); const GenesisProtocol = artifacts.require("./GenesisProtocol.sol"); const DAOFactory = artifacts.require("./DAOFactory.sol"); const SchemeMock = artifacts.require('./test/SchemeMock.sol'); @@ -38,7 +37,6 @@ const JoinAndQuit = artifacts.require("./JoinAndQuit.sol"); const FundingRequest = artifacts.require("./FundingRequest.sol"); const Dictator = artifacts.require("./Dictator.sol"); - const MAX_UINT_256 = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; const NULL_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000'; const SOME_HASH = '0x1000000000000000000000000000000000000000000000000000000000000000'; @@ -155,6 +153,8 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; registration.arcVotingMachineCallbacksMock = await ARCVotingMachineCallbacksMock.new(); registration.joinAndQuit = await JoinAndQuit.new(); registration.fundingRequest = await FundingRequest.new(); + registration.genesisProtocol = await GenesisProtocol.new(); + registration.absoluteVote = await AbsoluteVote.new(); registration.rewarderMock = await RewarderMock.new(); registration.dictator = await Dictator.new(); @@ -187,9 +187,10 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; await implementationDirectory.setImplementation("ARCVotingMachineCallbacksMock",registration.arcVotingMachineCallbacksMock.address); await implementationDirectory.setImplementation("JoinAndQuit",registration.joinAndQuit.address); await implementationDirectory.setImplementation("FundingRequest",registration.fundingRequest.address); + await implementationDirectory.setImplementation("GenesisProtocol",registration.genesisProtocol.address); + await implementationDirectory.setImplementation("AbsoluteVote",registration.absoluteVote.address); await implementationDirectory.setImplementation("Dictator",registration.dictator.address); - registration.implementationDirectory = implementationDirectory; return registration; @@ -205,15 +206,38 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; return registration; }; +const getVotingMachine = async function (votingMachine, genesisProtocol) { + if (genesisProtocol === true) { + return await GenesisProtocol.at(votingMachine); + } + return await AbsoluteVote.at(votingMachine); +}; + const setupAbsoluteVote = async function (voteOnBehalf=NULL_ADDRESS, precReq=50 ) { var votingMachine = new VotingMachine(); - votingMachine.absoluteVote = await AbsoluteVote.new(); // register some parameters - await votingMachine.absoluteVote.setParameters( precReq, voteOnBehalf); - votingMachine.params = await votingMachine.absoluteVote.getParametersHash( precReq, voteOnBehalf); + votingMachine.uintArray = [precReq, + 0,0,0,0,0,0,0,0,0,0]; + votingMachine.voteOnBehalf = voteOnBehalf; + + // register some parameters return votingMachine; }; +const getSchemeAddress = async function (daoFactoryAddress,daoFactoryTx) { +var daoFactory = await DAOFactory.at(daoFactoryAddress); +var address; + +await daoFactory.getPastEvents('SchemeInstance', { + fromBlock: daoFactoryTx.blockNumber, + toBlock: 'latest' + }) + .then(function(events){ + address = events[0].args._scheme; + }); + return address; +}; + const setupGenesisProtocol = async function ( accounts, token, @@ -232,7 +256,7 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; ) { var votingMachine = new VotingMachine(); - votingMachine.genesisProtocol = await GenesisProtocol.new(token,{gas: constants.ARC_GAS_LIMIT}); + //votingMachine.genesisProtocol = await GenesisProtocol.new(token,{gas: constants.ARC_GAS_LIMIT}); // set up a reputation system votingMachine.reputationArray = [20, 10 ,70]; @@ -249,18 +273,6 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; _daoBountyConst, _activationTime]; votingMachine.voteOnBehalf = voteOnBehalf; - votingMachine.params = await votingMachine.genesisProtocol.getParametersHash([_queuedVoteRequiredPercentage, - _queuedVotePeriodLimit, - _boostedVotePeriodLimit, - _preBoostedVotePeriodLimit, - _thresholdConst, - _quietEndingPeriod, - _proposingRepReward, - _votersReputationLossRatio, - _minimumDaoBounty, - _daoBountyConst, - _activationTime],voteOnBehalf); - return votingMachine; }; @@ -270,20 +282,28 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; daoFactoryOwner, founderToken, founderReputation, - cap=0) { + cap=0, + schemesNames, + schemesData, + schemesInitilizeDataLens, + permissions, + metaData) { + var org = new Organization(); var nativeTokenData = await new web3.eth.Contract(registration.daoToken.abi) .methods .initialize("TEST","TST",cap,registration.daoFactory.address) .encodeABI(); - var tx = await registration.daoFactory.forgeOrg("testOrg", - nativeTokenData, - daoFactoryOwner, - founderToken, - founderReputation, - [0,0,0], - {from:proxyAdmin,gas:constants.ARC_GAS_LIMIT}); - assert.equal(tx.logs.length, 5); + var encodedForgeOrgParams = web3.eth.abi.encodeParameters(['string','bytes','address[]','uint256[]','uint256[]','uint64[3]'], + ["testOrg",nativeTokenData,daoFactoryOwner,founderToken,founderReputation,[0,0,0]]); + var encodedSetSchemesParams = web3.eth.abi.encodeParameters(['bytes32[]','bytes','uint256[]','bytes4[]','string'], + [schemesNames,schemesData,schemesInitilizeDataLens,permissions,metaData]); + + var tx = await registration.daoFactory.forgeOrg(encodedForgeOrgParams, + encodedSetSchemesParams, + {from:proxyAdmin}); + + assert.equal(tx.logs[4].event, "NewOrg"); var avatarAddress = tx.logs[4].args._avatar; org.avatar = await Avatar.at(avatarAddress); @@ -291,7 +311,7 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; org.token = await DAOToken.at(tokenAddress); var reputationAddress = await org.avatar.nativeReputation(); org.reputation = await Reputation.at(reputationAddress); - return org; + return [org,tx]; }; const checkVoteInfo = async function(absoluteVote,proposalId, voterAddress, _voteInfo) { @@ -364,7 +384,7 @@ const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; }; const getBytesLength = function (bytes) { - return web3.utils.toBN(Number(bytes.slice(2).length) / 2); + return Number(web3.utils.toBN(Number(bytes.slice(2).length) / 2)); }; @@ -386,4 +406,6 @@ module.exports = { MAX_UINT_256, checkVoteInfo, registrationAddVersionToPackege, concatBytes, - getProposalId}; + getProposalId, + getVotingMachine, + getSchemeAddress}; diff --git a/test/joinandquit.js b/test/joinandquit.js index 7ef6cd32..cf9806ff 100644 --- a/test/joinandquit.js +++ b/test/joinandquit.js @@ -16,7 +16,7 @@ const addMember = async function(accounts,_testSetup,_fee,_from) { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await _testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await _testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); return tx; }; @@ -30,47 +30,42 @@ const setupJoinAndQuit = async function( accounts, genesisProtocol, token, - avatarAddress, _fundingToken, _minFeeToJoin, _memberReputation, _fundingGoal, _fundingGoalDeadline, _rageQuitEnable = true, + _packageVersion= [0,1,0] ) { var joinAndQuitParams = new JoinAndQuitParams(); - + var encodedJoinAndQuitParams = web3.eth.abi.encodeParameters(['address','uint256','uint256','uint256','uint256','bool'], + [_fundingToken,_minFeeToJoin,_memberReputation,_fundingGoal,_fundingGoalDeadline,_rageQuitEnable]); if (genesisProtocol === true) { joinAndQuitParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); joinAndQuitParams.initdata = await new web3.eth.Contract(registration.joinAndQuit.abi) .methods - .initialize(avatarAddress, - joinAndQuitParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, joinAndQuitParams.votingMachine.uintArray, joinAndQuitParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, - _fundingToken, - _minFeeToJoin, - _memberReputation, - _fundingGoal, - _fundingGoalDeadline, - _rageQuitEnable) + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol", + encodedJoinAndQuitParams) .encodeABI(); } else { joinAndQuitParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); joinAndQuitParams.initdata = await new web3.eth.Contract(registration.joinAndQuit.abi) .methods - .initialize(avatarAddress, - joinAndQuitParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - joinAndQuitParams.votingMachine.params, - _fundingToken, - _minFeeToJoin, - _memberReputation, - _fundingGoal, - _fundingGoalDeadline, - _rageQuitEnable) + .initialize(helpers.NULL_ADDRESS, + joinAndQuitParams.votingMachine.uintArray, + joinAndQuitParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote", + encodedJoinAndQuitParams) .encodeABI(); } return joinAndQuitParams; @@ -90,12 +85,6 @@ const setup = async function (accounts, registration = await helpers.registerImplementation(); testSetup.reputationArray = [7000]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[2]], - [0], - testSetup.reputationArray); testSetup.fundingGoalDeadline = (await web3.eth.getBlock("latest")).timestamp + fundingGoalDeadline; testSetup.minFeeToJoin = minFeeToJoin; testSetup.memberReputation = memberReputation; @@ -110,7 +99,6 @@ const setup = async function (accounts, accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, fundPath, minFeeToJoin, memberReputation, @@ -119,15 +107,24 @@ const setup = async function (accounts, rageQuitEnable); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("JoinAndQuit")], - testSetup.joinAndQuitParams.initdata, - [helpers.getBytesLength(testSetup.joinAndQuitParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[2]], + [0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("JoinAndQuit")], + testSetup.joinAndQuitParams.initdata, + [helpers.getBytesLength(testSetup.joinAndQuitParams.initdata)], + [permissions], + "metaData"); + + testSetup.joinAndQuit = await JoinAndQuit.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + await testSetup.standardTokenMock.transfer(accounts[3],10000); - testSetup.joinAndQuit = await JoinAndQuit.at(tx.logs[1].args._scheme); + testSetup.joinAndQuitParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.joinAndQuit.votingMachine(),genesisProtocol); return testSetup; }; @@ -135,8 +132,8 @@ contract('JoinAndQuit', accounts => { it("initialize", async function() { var testSetup = await setup(accounts); - assert.equal(await testSetup.joinAndQuit.votingMachine(),testSetup.joinAndQuitParams.votingMachine.absoluteVote.address); - assert.equal(await testSetup.joinAndQuit.fundingGoalDeadline(),testSetup.fundingGoalDeadline); + assert.equal(await testSetup.joinAndQuit.votingMachine(),testSetup.joinAndQuitParams.votingMachineInstance.address); + assert.equal((await testSetup.joinAndQuit.joinAndQuitParams()).fundingGoalDeadline,testSetup.fundingGoalDeadline); }); it("propose log", async function() { @@ -221,7 +218,7 @@ contract('JoinAndQuit', accounts => { {from:candidate}); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.joinAndQuit.redeemReputation(proposalId); @@ -273,7 +270,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.joinAndQuit.proposals(proposalId); assert.equal(proposal.accepted,true); assert.equal(await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address),testSetup.minFeeToJoin); @@ -290,7 +287,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.joinAndQuit.proposals(proposalId); assert.equal(proposal.accepted,true); assert.equal(await avatarBalance(testSetup),testSetup.minFeeToJoin); @@ -308,7 +305,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.joinAndQuit.proposals(proposalId); assert.equal(proposal.accepted,false); assert.equal(await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address),0); @@ -328,7 +325,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var balanceBefore = await web3.eth.getBalance(accounts[3]); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var proposal = await testSetup.joinAndQuit.proposals(proposalId); assert.equal(proposal.accepted,false); assert.equal(await avatarBalance(testSetup),0); @@ -351,7 +348,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.joinAndQuit.redeemReputation(proposalId); assert.equal(tx.logs[0].event, "RedeemReputation"); assert.equal(tx.logs[0].args._amount, testSetup.memberReputation); @@ -374,7 +371,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.joinAndQuit.redeemReputation(proposalId); assert.equal(tx.logs[0].event, "RedeemReputation"); assert.equal(tx.logs[0].args._amount, testSetup.minFeeToJoin); @@ -391,7 +388,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.joinAndQuit.redeemReputation(proposalId); assert.equal(tx.logs[0].event, "RedeemReputation"); assert.equal(tx.logs[0].args._amount, testSetup.memberReputation); @@ -414,7 +411,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); try { await testSetup.joinAndQuit.redeemReputation(proposalId); assert(false, 'reputation cannot redeemed'); @@ -433,7 +430,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address),testSetup.minFeeToJoin); assert.equal((await testSetup.joinAndQuit.fundings(accounts[3])).funding,testSetup.minFeeToJoin); await testSetup.joinAndQuit.rageQuit({from:accounts[3]}); @@ -486,7 +483,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await avatarBalance(testSetup),testSetup.minFeeToJoin); assert.equal((await testSetup.joinAndQuit.fundings(accounts[3])).funding,testSetup.minFeeToJoin); await testSetup.joinAndQuit.rageQuit({from:accounts[3]}); @@ -533,7 +530,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - tx = await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.joinAndQuit.getPastEvents('FundedBeforeDeadline', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -559,7 +556,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - tx = await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.joinAndQuit.getPastEvents('FundedBeforeDeadline', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -631,7 +628,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address),testSetup.minFeeToJoin); assert.equal((await testSetup.joinAndQuit.fundings(accounts[3])).funding,testSetup.minFeeToJoin); try { @@ -653,7 +650,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address),testSetup.minFeeToJoin); assert.equal((await testSetup.joinAndQuit.fundings(accounts[3])).funding,testSetup.minFeeToJoin); try { @@ -682,7 +679,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(testSetup.fundingGoalDeadline); try { @@ -702,7 +699,7 @@ contract('JoinAndQuit', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.joinAndQuitParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.joinAndQuitParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal((await testSetup.joinAndQuit.fundings(accounts[3])).funding,testSetup.minFeeToJoin); try { await testSetup.joinAndQuit.refund({from:accounts[3]}); diff --git a/test/lockingeth4reputation.js b/test/lockingeth4reputation.js index 5269ffe6..dd11e3b9 100644 --- a/test/lockingeth4reputation.js +++ b/test/lockingeth4reputation.js @@ -18,14 +18,9 @@ const setup = async function (accounts, _agreementHash = helpers.SOME_HASH) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); - + testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); + testSetup.lockingEndTime = (await web3.eth.getBlock("latest")).timestamp + _lockingEndTime; testSetup.lockingStartTime = (await web3.eth.getBlock("latest")).timestamp + _lockingStartTime; @@ -37,7 +32,7 @@ const setup = async function (accounts, testSetup.lockingEth4ReputationParams.initdata = await new web3.eth.Contract(registration.lockingEth4Reputation.abi) .methods - .initialize(testSetup.org.avatar.address, + .initialize(helpers.NULL_ADDRESS, _repAllocation, testSetup.lockingStartTime, testSetup.lockingEndTime, @@ -47,19 +42,23 @@ const setup = async function (accounts, .encodeABI(); - var permissions = "0x00000000"; - - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("LockingEth4Reputation")], - testSetup.lockingEth4ReputationParams.initdata, - [helpers.getBytesLength(testSetup.lockingEth4ReputationParams.initdata)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); + var permissions = "0x00000000"; - testSetup.lockingEth4Reputation = await LockingEth4Reputation.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000], + 0, + [web3.utils.fromAscii("LockingEth4Reputation")], + testSetup.lockingEth4ReputationParams.initdata, + [helpers.getBytesLength(testSetup.lockingEth4ReputationParams.initdata)], + [permissions], + "metaData" + ); + testSetup.lockingEth4Reputation = await LockingEth4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); return testSetup; }; diff --git a/test/lockingtoken4reputation.js b/test/lockingtoken4reputation.js index 2dd53a9f..42430e6b 100644 --- a/test/lockingtoken4reputation.js +++ b/test/lockingtoken4reputation.js @@ -22,16 +22,11 @@ const setup = async function (accounts, registration = await helpers.registerImplementation(); testSetup.lockingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); testSetup.lockingToken2 = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); - + testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); - + + testSetup.lockingEndTime = (await web3.eth.getBlock("latest")).timestamp + _lockingEndTime; testSetup.lockingStartTime = (await web3.eth.getBlock("latest")).timestamp + _lockingStartTime; testSetup.redeemEnableTime = (await web3.eth.getBlock("latest")).timestamp + _redeemEnableTime; @@ -47,7 +42,7 @@ const setup = async function (accounts, testSetup.lockingToken4ReputationParams.initdata = await new web3.eth.Contract(registration.lockingToken4Reputation.abi) .methods - .initialize(testSetup.org.avatar.address, + .initialize(helpers.NULL_ADDRESS, _repAllocation, testSetup.lockingStartTime, testSetup.lockingEndTime, @@ -60,17 +55,23 @@ const setup = async function (accounts, var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("LockingToken4Reputation")], - testSetup.lockingToken4ReputationParams.initdata, - [helpers.getBytesLength(testSetup.lockingToken4ReputationParams.initdata)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); - - testSetup.lockingToken4Reputation = await LockingToken4Reputation.at(tx.logs[1].args._scheme); - + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000], + 0, + [web3.utils.fromAscii("LockingToken4Reputation")], + testSetup.lockingToken4ReputationParams.initdata, + [helpers.getBytesLength(testSetup.lockingToken4ReputationParams.initdata)], + [permissions], + "metaData" + ); + + testSetup.lockingToken4Reputation = await LockingToken4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + await testSetup.lockingToken.approve(testSetup.lockingToken4Reputation.address,web3.utils.toWei('100', "ether")); return testSetup; }; diff --git a/test/reputationfromtoken.js b/test/reputationfromtoken.js index 8adf7e5f..265ece17 100644 --- a/test/reputationfromtoken.js +++ b/test/reputationfromtoken.js @@ -19,12 +19,7 @@ const setupNectar = async function (accounts) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); + testSetup.nectarToken = await NectarToken.new(); await testSetup.nectarToken.initialize(accounts[0]); await testSetup.nectarToken.mint(accounts[0],100); @@ -45,23 +40,28 @@ const setupNectar = async function (accounts) { testSetup.reputationFromTokenParams = new ReputationFromTokenParams(); testSetup.reputationFromTokenParams.initdata = await new web3.eth.Contract(registration.reputationFromToken.abi) .methods - .initialize(testSetup.org.avatar.address, + .initialize(helpers.NULL_ADDRESS, testSetup.nectarRepAllocation.address, helpers.NULL_ADDRESS) .encodeABI(); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ReputationFromToken")], - testSetup.reputationFromTokenParams.initdata, - [helpers.getBytesLength(testSetup.reputationFromTokenParams.initdata)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); - - testSetup.reputationFromToken = await ReputationFromToken.at(tx.logs[1].args._scheme); + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000],0, + [web3.utils.fromAscii("ReputationFromToken")], + testSetup.reputationFromTokenParams.initdata, + [helpers.getBytesLength(testSetup.reputationFromTokenParams.initdata)], + [permissions], + "metaData"); + + testSetup.reputationFromToken = await ReputationFromToken.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + return testSetup; }; @@ -69,12 +69,7 @@ const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); + testSetup.repAllocation = await RepAllocation.new(); await testSetup.repAllocation.initialize(accounts[0]); await testSetup.repAllocation.addBeneficiary(accounts[0],100); @@ -88,22 +83,27 @@ const setup = async function (accounts) { testSetup.reputationFromTokenParams.initdata = await new web3.eth.Contract(registration.reputationFromToken.abi) .methods - .initialize(testSetup.org.avatar.address, + .initialize(helpers.NULL_ADDRESS, testSetup.repAllocation.address, testSetup.curve.address) .encodeABI(); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ReputationFromToken")], - testSetup.reputationFromTokenParams.initdata, - [helpers.getBytesLength(testSetup.reputationFromTokenParams.initdata)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); - - testSetup.reputationFromToken = await ReputationFromToken.at(tx.logs[1].args._scheme); + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory( + testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000], + 0, + [web3.utils.fromAscii("ReputationFromToken")], + testSetup.reputationFromTokenParams.initdata, + [helpers.getBytesLength(testSetup.reputationFromTokenParams.initdata)], + [permissions], + "metaData"); + testSetup.reputationFromToken = await ReputationFromToken.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); return testSetup; }; const signatureType = 1; @@ -239,7 +239,7 @@ contract('ReputationFromToken and RepAllocation', accounts => { assert(false, "cannot redeem before initialize"); } catch(error) { helpers.assertVMException(error); - } + } }); it("cannot initialize twice", async () => { diff --git a/test/schemefactory.js b/test/schemefactory.js index 529d9101..65c78b27 100644 --- a/test/schemefactory.js +++ b/test/schemefactory.js @@ -12,66 +12,71 @@ const setupSchemeFactoryParams = async function( accounts, genesisProtocol, token, - avatarAddress + _packageVersion=[0,1,0] ) { var schemeFactoryParams = new SchemeFactoryParams(); if (genesisProtocol === true) { - schemeFactoryParams.votingMachine = await helpers.setupGenesisProtocol(accounts,avatarAddress,helpers.NULL_ADDRESS); + schemeFactoryParams.votingMachine = await helpers.setupGenesisProtocol(accounts,helpers.NULL_ADDRESS,helpers.NULL_ADDRESS); schemeFactoryParams.initdata = await new web3.eth.Contract(registration.schemeFactory.abi) .methods - .initialize(avatarAddress, - schemeFactoryParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, schemeFactoryParams.votingMachine.uintArray, schemeFactoryParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, - registration.daoFactory.address) + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol") .encodeABI(); } else { schemeFactoryParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); schemeFactoryParams.initdata = await new web3.eth.Contract(registration.schemeFactory.abi) .methods - .initialize(avatarAddress, - schemeFactoryParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - schemeFactoryParams.votingMachine.params, - registration.daoFactory.address) + .initialize(helpers.NULL_ADDRESS, + schemeFactoryParams.votingMachine.uintArray, + schemeFactoryParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote") .encodeABI(); } return schemeFactoryParams; }; -const setup = async function (accounts,genesisProtocol = false,tokenAddress=helpers.NULL_HASH) { +const setup = async function (accounts,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.reputationArray = [2000,4000,7000]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - accounts[2]], - [1000,0,0], - testSetup.reputationArray); + testSetup.schemeFactoryParams= await setupSchemeFactoryParams( accounts, genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); + tokenAddress); var permissions = "0x0000001f"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("SchemeFactory")], - testSetup.schemeFactoryParams.initdata, - [helpers.getBytesLength(testSetup.schemeFactoryParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - testSetup.schemeFactory = await SchemeFactory.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + accounts[2]], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("SchemeFactory")], + testSetup.schemeFactoryParams.initdata, + [helpers.getBytesLength(testSetup.schemeFactoryParams.initdata)], + [permissions], + "metaData" + ); + + testSetup.schemeFactory = await SchemeFactory.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.schemeFactoryParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.schemeFactory.votingMachine(),genesisProtocol); return testSetup; }; contract('SchemeFactory', accounts => { @@ -79,7 +84,7 @@ contract('SchemeFactory', accounts => { it("initialize", async() => { var testSetup = await setup(accounts); assert.equal(await testSetup.schemeFactory.votingMachine(), - testSetup.schemeFactoryParams.votingMachine.absoluteVote.address); + testSetup.schemeFactoryParams.votingMachineInstance.address); assert.equal(await testSetup.schemeFactory.avatar(),testSetup.org.avatar.address); assert.equal(await testSetup.schemeFactory.daoFactory(),registration.daoFactory.address); }); @@ -116,19 +121,29 @@ contract('SchemeFactory', accounts => { it("execute proposeScheme and execute -yes - permissions== 0x0000001f", async function() { var testSetup = await setup(accounts); + var initdata = await new web3.eth.Contract(registration.schemeFactory.abi) + .methods + .initialize(testSetup.org.avatar.address, + testSetup.schemeFactoryParams.votingMachine.uintArray, + testSetup.schemeFactoryParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "AbsoluteVote") + .encodeABI(); var tx = await testSetup.schemeFactory.proposeScheme( [0,1,0], 'SchemeFactory', - testSetup.schemeFactoryParams.initdata, + initdata, "0x0000001f", helpers.NULL_ADDRESS, helpers.NULL_HASH); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - tx = await testSetup.schemeFactoryParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.schemeFactoryParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let proxyEvents = await registration.daoFactory.getPastEvents("ProxyCreated", {fromBlock: tx.receipt.blockNumber, toBlock: tx.receipt.blockNumber}); - var schemeAddress = proxyEvents[0].returnValues._proxy; + var schemeAddress = proxyEvents[1].returnValues._proxy; var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(schemeAddress),true); assert.equal(await controller.schemesPermissions(schemeAddress),"0x0000001f"); @@ -136,10 +151,20 @@ contract('SchemeFactory', accounts => { it("execute proposeScheme and execute -yes - replace scheme", async function() { var testSetup = await setup(accounts); + var initdata = await new web3.eth.Contract(registration.schemeFactory.abi) + .methods + .initialize(testSetup.org.avatar.address, + testSetup.schemeFactoryParams.votingMachine.uintArray, + testSetup.schemeFactoryParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "AbsoluteVote") + .encodeABI(); var tx = await testSetup.schemeFactory.proposeScheme( [0,1,0], 'SchemeFactory', - testSetup.schemeFactoryParams.initdata, + initdata, "0x0000001f", testSetup.schemeFactory.address, helpers.NULL_HASH); @@ -148,9 +173,9 @@ contract('SchemeFactory', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),true); - tx = await testSetup.schemeFactoryParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.schemeFactoryParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let proxyEvents = await registration.daoFactory.getPastEvents("ProxyCreated", {fromBlock: tx.receipt.blockNumber, toBlock: tx.receipt.blockNumber}); - var schemeAddress = proxyEvents[0].returnValues._proxy; + var schemeAddress = proxyEvents[1].returnValues._proxy; assert.equal(await controller.isSchemeRegistered(schemeAddress),true); assert.equal(await controller.schemesPermissions(schemeAddress),"0x0000001f"); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),false); @@ -158,10 +183,20 @@ contract('SchemeFactory', accounts => { it("execute proposeScheme and execute -yes - replace scheme + genesisProtocol", async function() { var testSetup = await setup(accounts,true); + var initdata = await new web3.eth.Contract(registration.schemeFactory.abi) + .methods + .initialize(testSetup.org.avatar.address, + testSetup.schemeFactoryParams.votingMachine.uintArray, + testSetup.schemeFactoryParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "GenesisProtocol") + .encodeABI(); var tx = await testSetup.schemeFactory.proposeScheme( [0,1,0], 'SchemeFactory', - testSetup.schemeFactoryParams.initdata, + initdata, "0x0000001f", testSetup.schemeFactory.address, helpers.NULL_HASH); @@ -170,9 +205,9 @@ contract('SchemeFactory', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),true); - tx = await testSetup.schemeFactoryParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.schemeFactoryParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let proxyEvents = await registration.daoFactory.getPastEvents("ProxyCreated", {fromBlock: tx.receipt.blockNumber, toBlock: tx.receipt.blockNumber}); - var schemeAddress = proxyEvents[0].returnValues._proxy; + var schemeAddress = proxyEvents[1].returnValues._proxy; assert.equal(await controller.isSchemeRegistered(schemeAddress),true); assert.equal(await controller.schemesPermissions(schemeAddress),"0x0000001f"); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),false); @@ -192,7 +227,7 @@ contract('SchemeFactory', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),true); - tx = await testSetup.schemeFactoryParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.schemeFactoryParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); let proxyEvents = await registration.daoFactory.getPastEvents("ProxyCreated", {fromBlock: tx.receipt.blockNumber, toBlock: tx.receipt.blockNumber}); assert.equal(proxyEvents.length,0); assert.equal(await controller.isSchemeRegistered(testSetup.schemeFactory.address),false); @@ -212,7 +247,7 @@ contract('SchemeFactory', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); //Vote with reputation to trigger execution - tx = await testSetup.schemeFactoryParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.schemeFactoryParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //should not register because the decision is "no" let proxyEvents = await registration.daoFactory.getPastEvents("ProxyCreated", {fromBlock: tx.receipt.blockNumber, toBlock: tx.receipt.blockNumber}); assert.equal(proxyEvents.length,0); diff --git a/test/schemeregistrar.js b/test/schemeregistrar.js index a4b9c933..2fbd0f49 100644 --- a/test/schemeregistrar.js +++ b/test/schemeregistrar.js @@ -14,69 +14,68 @@ const setupSchemeRegistrarParams = async function( accounts, genesisProtocol, token, - avatarAddress, + _packageVersion = [0,1,0] ) { var schemeRegistrarParams = new SchemeRegistrarParams(); if (genesisProtocol === true) { schemeRegistrarParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); schemeRegistrarParams.initdata = await new web3.eth.Contract(registration.schemeRegistrar.abi) .methods - .initialize(avatarAddress, - schemeRegistrarParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, schemeRegistrarParams.votingMachine.uintArray, schemeRegistrarParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH, - schemeRegistrarParams.votingMachine.uintArray, - schemeRegistrarParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH) + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol") .encodeABI(); } else { schemeRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); schemeRegistrarParams.initdata = await new web3.eth.Contract(registration.schemeRegistrar.abi) .methods - .initialize(avatarAddress, - schemeRegistrarParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - schemeRegistrarParams.votingMachine.params, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - schemeRegistrarParams.votingMachine.params) + .initialize(helpers.NULL_ADDRESS, + schemeRegistrarParams.votingMachine.uintArray, + schemeRegistrarParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote") .encodeABI(); } return schemeRegistrarParams; }; -const setup = async function (accounts,genesisProtocol = false,tokenAddress=0) { +const setup = async function (accounts,genesisProtocol = false,tokenAddress=helpers.NULL_ADDRESS) { var testSetup = new helpers.TestSetup(); testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); registration = await helpers.registerImplementation(); testSetup.reputationArray = [2000,4000,7000]; testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + + testSetup.schemeRegistrarParams= await setupSchemeRegistrarParams( + accounts, + genesisProtocol, + tokenAddress); + + var permissions = "0x0000001f"; + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, accounts, registration, [accounts[0], accounts[1], accounts[2]], [1000,0,0], - testSetup.reputationArray); - testSetup.schemeRegistrarParams= await setupSchemeRegistrarParams( - accounts, - genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); - - var permissions = "0x0000001f"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("SchemeRegistrar")], - testSetup.schemeRegistrarParams.initdata, - [helpers.getBytesLength(testSetup.schemeRegistrarParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.schemeRegistrar = await SchemeRegistrar.at(tx.logs[1].args._scheme); + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("SchemeRegistrar")], + testSetup.schemeRegistrarParams.initdata, + [helpers.getBytesLength(testSetup.schemeRegistrarParams.initdata)], + [permissions], + "metaData"); + testSetup.schemeRegistrar = await SchemeRegistrar.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.schemeRegistrarParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.schemeRegistrar.votingMachine(),genesisProtocol); return testSetup; }; contract('SchemeRegistrar', accounts => { @@ -84,7 +83,7 @@ contract('SchemeRegistrar', accounts => { it("initialize", async() => { var testSetup = await setup(accounts); assert.equal(await testSetup.schemeRegistrar.votingMachine(), - testSetup.schemeRegistrarParams.votingMachine.absoluteVote.address); + testSetup.schemeRegistrarParams.votingMachineInstance.address); assert.equal(await testSetup.schemeRegistrar.avatar(),testSetup.org.avatar.address); }); @@ -137,7 +136,7 @@ contract('SchemeRegistrar', accounts => { //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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(universalScheme.address),true); }); @@ -149,7 +148,7 @@ contract('SchemeRegistrar', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(universalScheme.address),true); }); @@ -161,7 +160,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000001"); @@ -174,7 +173,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000003"); @@ -187,7 +186,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000003"); @@ -200,7 +199,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000009"); @@ -213,7 +212,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000011"); @@ -225,7 +224,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(accounts[0],"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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0]),true); assert.equal(await controller.schemesPermissions(accounts[0]),"0x00000001"); @@ -243,7 +242,7 @@ contract('SchemeRegistrar', accounts => { assert.equal(organizationProposal[1],true);//proposalType //Vote with reputation to trigger execution - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); //should not register because the decision is "no" assert.equal(await controller.isSchemeRegistered(accounts[0]),false); @@ -260,7 +259,7 @@ contract('SchemeRegistrar', accounts => { var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address),true); //Vote with reputation to trigger execution - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address),false); //check organizationsProposals after execution var organizationProposal = await testSetup.schemeRegistrar.organizationProposals(proposalId); @@ -275,7 +274,7 @@ contract('SchemeRegistrar', accounts => { var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address),true); //Vote with reputation to trigger execution - await testSetup.schemeRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address),false); //check organizationsProposals after execution var organizationProposal = await testSetup.schemeRegistrar.organizationProposals(proposalId); @@ -288,7 +287,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(universalScheme.address,"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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); it("execute proposeScheme and execute -yes - autoRegisterOrganization==FALSE arc scheme", async function() { @@ -298,6 +297,6 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(universalScheme.address,"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]}); + await testSetup.schemeRegistrarParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); }); diff --git a/test/signalscheme.js b/test/signalscheme.js index d420dd04..ce032766 100644 --- a/test/signalscheme.js +++ b/test/signalscheme.js @@ -13,30 +13,36 @@ const setupSignalSchemeParam = async function( accounts, genesisProtocol, token, - avatarAddress + _packageVersion = [0,1,0], + _type = 1234 ) { 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( avatarAddress, - 1234, - helpers.NULL_HASH, - signalSchemeParams.votingMachine.genesisProtocol.address, - signalSchemeParams.votingMachine.uintArray, - signalSchemeParams.votingMachine.voteOnBehalf) + .initialize( helpers.NULL_ADDRESS, + signalSchemeParams.votingMachine.uintArray, + signalSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "GenesisProtocol", + _type + ) .encodeABI(); } else { signalSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); signalSchemeParams.initdata = await new web3.eth.Contract(registration.signalScheme.abi) .methods - .initialize(avatarAddress, - 1234, - signalSchemeParams.votingMachine.params, - signalSchemeParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS) + .initialize(helpers.NULL_ADDRESS, + signalSchemeParams.votingMachine.uintArray, + signalSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + token, + _packageVersion, + "AbsoluteVote", + _type) .encodeABI(); } return signalSchemeParams; @@ -52,41 +58,39 @@ const setup = async function (accounts,genesisProtocol = false,tokenAddress = he testSetup.reputationArray = [2000,4000,7000]; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - accounts[2]], - [1000,0,0], - testSetup.reputationArray); + testSetup.signalSchemeParams= await setupSignalSchemeParam( accounts, genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); + tokenAddress); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("SignalScheme")], - testSetup.signalSchemeParams.initdata, - [helpers.getBytesLength(testSetup.signalSchemeParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.signalScheme = await SignalScheme.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + accounts[2]], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("SignalScheme")], + testSetup.signalSchemeParams.initdata, + [helpers.getBytesLength(testSetup.signalSchemeParams.initdata)], + [permissions], + "metaData"); + testSetup.signalScheme = await SignalScheme.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.signalSchemeParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.signalScheme.votingMachine(),genesisProtocol); return testSetup; }; contract('SignalScheme', accounts => { it("proposeSignal log", async function() { var testSetup = await setup(accounts); - var parameters = await testSetup.signalScheme.params(); - assert.equal(parameters.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); + assert.equal(await testSetup.signalScheme.avatar(),testSetup.org.avatar.address); + assert.equal(await testSetup.signalScheme.signalType(),1234); + assert.equal(await testSetup.signalScheme.votingMachine(),testSetup.signalSchemeParams.votingMachineInstance.address); var tx = await testSetup.signalScheme.proposeSignal("description-hash"); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewSignalProposal"); @@ -101,7 +105,7 @@ contract('SignalScheme', 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]}); + tx = await testSetup.signalSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.signalScheme.getPastEvents('Signal', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -122,7 +126,7 @@ contract('SignalScheme', 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.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.signalSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.signalScheme.getPastEvents('Signal', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -143,7 +147,7 @@ contract('SignalScheme', 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]}); + tx = await testSetup.signalSchemeParams.votingMachineInstance.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.signalScheme.getPastEvents('Signal', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -158,12 +162,14 @@ contract('SignalScheme', accounts => { 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, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS); + await testSetup.signalScheme.initialize( testSetup.org.avatar.address, + testSetup.signalSchemeParams.votingMachine.uintArray, + testSetup.signalSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "AbsoluteVote", + 1234); assert(false, "cannot initialize twice"); } catch(error) { helpers.assertVMException(error); diff --git a/test/upgradescheme.js b/test/upgradescheme.js index ec3de298..0c2e51b6 100644 --- a/test/upgradescheme.js +++ b/test/upgradescheme.js @@ -13,8 +13,7 @@ var registration; const setupUpgradeSchemeParams = async function( accounts, genesisProtocol, - token, - avatarAddress, + token ) { var upgradeSchemeParams = new UpgradeSchemeParams(); @@ -22,22 +21,26 @@ const setupUpgradeSchemeParams = async function( upgradeSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,helpers.NULL_ADDRESS); upgradeSchemeParams.initdata = await new web3.eth.Contract(registration.upgradeScheme.abi) .methods - .initialize(avatarAddress, - upgradeSchemeParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, upgradeSchemeParams.votingMachine.uintArray, upgradeSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, helpers.NULL_ADDRESS, + [0,1,0], + "GenesisProtocol", registration.packageInstance.address) .encodeABI(); } else { upgradeSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); upgradeSchemeParams.initdata = await new web3.eth.Contract(registration.upgradeScheme.abi) .methods - .initialize(avatarAddress, - upgradeSchemeParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], + .initialize(helpers.NULL_ADDRESS, + upgradeSchemeParams.votingMachine.uintArray, + upgradeSchemeParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, helpers.NULL_ADDRESS, - upgradeSchemeParams.votingMachine.params, + [0,1,0], + "AbsoluteVote", registration.packageInstance.address) .encodeABI(); } @@ -56,31 +59,33 @@ const setup = async function (accounts,reputationAccount=0,genesisProtocol = fal account2 = reputationAccount; } testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0], - accounts[1], - account2], - [1000,0,0], - testSetup.reputationArray); + testSetup.upgradeSchemeParams= await setupUpgradeSchemeParams( accounts, genesisProtocol, tokenAddress, - testSetup.org.avatar.address, ); var permissions = "0x0000001f"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("UpgradeScheme")], - testSetup.upgradeSchemeParams.initdata, - [helpers.getBytesLength(testSetup.upgradeSchemeParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); + + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0], + accounts[1], + account2], + [1000,0,0], + testSetup.reputationArray, + 0, + [web3.utils.fromAscii("UpgradeScheme")], + testSetup.upgradeSchemeParams.initdata, + [helpers.getBytesLength(testSetup.upgradeSchemeParams.initdata)], + [permissions], + "metaData"); testSetup.registration = registration; - testSetup.upgradeScheme = await UpgradeScheme.at(tx.logs[1].args._scheme); + testSetup.upgradeScheme = await UpgradeScheme.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); + testSetup.upgradeSchemeParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.upgradeScheme.votingMachine(),genesisProtocol); return testSetup; }; @@ -115,7 +120,7 @@ contract('UpgradeScheme', function(accounts) { helpers.NULL_HASH); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.upgradeSchemeParams.votingMachineInstance.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,false); @@ -137,7 +142,7 @@ contract('UpgradeScheme', function(accounts) { var organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,true); - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.upgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,false); @@ -245,7 +250,7 @@ contract('UpgradeScheme', function(accounts) { ); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.upgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,false); @@ -305,7 +310,7 @@ contract('UpgradeScheme', function(accounts) { ); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.upgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,false); @@ -365,7 +370,7 @@ contract('UpgradeScheme', function(accounts) { ); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.upgradeSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await testSetup.upgradeSchemeParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.upgradeScheme.organizationProposals(proposalId); assert.equal(organizationProposal,false); @@ -393,10 +398,12 @@ contract('UpgradeScheme', function(accounts) { try { await testSetup.upgradeScheme.initialize( testSetup.org.avatar.address, - testSetup.upgradeSchemeParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], - helpers.NULL_ADDRESS, - testSetup.upgradeSchemeParams.votingMachine.params, + testSetup.upgradeSchemeParams.votingMachine.uintArray, + testSetup.upgradeSchemeParams.votingMachine.voteOnBehalf, + testSetup.registration.daoFactory.address, + helpers.NULL_ADDRESS, + [0,1,0], + "AbsoluteVote", testSetup.registration.packageInstance.address ); assert(false, "cannot init twice"); diff --git a/test/voteinorganization.js b/test/voteinorganization.js index 408011b4..b8a676f2 100644 --- a/test/voteinorganization.js +++ b/test/voteinorganization.js @@ -5,6 +5,8 @@ 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"); +const AbsoluteVote = artifacts.require("./AbsoluteVote.sol"); +const GenesisProtocol = artifacts.require("./GenesisProtocol.sol"); class VoteInOrganizationParams { constructor() { @@ -15,78 +17,73 @@ var registration; const setupVoteInOrganizationParams = async function( accounts, genesisProtocol = false, - tokenAddress = 0, - avatarAddress + 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(avatarAddress, - voteInOrganizationParams.votingMachine.genesisProtocol.address, + .initialize(helpers.NULL_ADDRESS, voteInOrganizationParams.votingMachine.uintArray, voteInOrganizationParams.votingMachine.voteOnBehalf, - helpers.NULL_HASH) + registration.daoFactory.address, + tokenAddress, + [0,1,0], + "GenesisProtocol") .encodeABI(); } else { voteInOrganizationParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); voteInOrganizationParams.initdata = await new web3.eth.Contract(registration.voteInOrganization.abi) .methods - .initialize(avatarAddress, - voteInOrganizationParams.votingMachine.absoluteVote.address, - [0,0,0,0,0,0,0,0,0,0,0], + .initialize(helpers.NULL_ADDRESS, + voteInOrganizationParams.votingMachine.uintArray, + voteInOrganizationParams.votingMachine.voteOnBehalf, + registration.daoFactory.address, helpers.NULL_ADDRESS, - voteInOrganizationParams.votingMachine.params) + [0,1,0], + "AbsoluteVote") .encodeABI(); } return voteInOrganizationParams; }; -const setup = async function (accounts,reputationAccount=0,genesisProtocol = false,tokenAddress=0) { +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 === 0) { - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0],accounts[1],accounts[2]], - [1000,1000,1000], - testSetup.reputationArray); - } else { - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0],accounts[1],reputationAccount], - [1000,1000,1000], - testSetup.reputationArray); + if (reputationAccount === helpers.NULL_ADDRESS) { + reputationAccount = accounts[2]; } testSetup.voteInOrganizationParams= await setupVoteInOrganizationParams( accounts, genesisProtocol, - tokenAddress, - testSetup.org.avatar.address); + tokenAddress); var permissions = "0x00000010"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("VoteInOrganization")], - testSetup.voteInOrganizationParams.initdata, - [helpers.getBytesLength(testSetup.voteInOrganizationParams.initdata)], - [permissions], - "metaData",{from:testSetup.proxyAdmin}); - - testSetup.voteInOrganization = await VoteInOrganization.at(tx.logs[1].args._scheme); - - return testSetup; + [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)); + testSetup.voteInOrganizationParams.votingMachineInstance = + await helpers.getVotingMachine(await testSetup.voteInOrganization.votingMachine(),genesisProtocol); + + return testSetup; }; contract('VoteInOrganizationScheme', accounts => { @@ -97,19 +94,24 @@ contract('VoteInOrganizationScheme', accounts => { it("proposeVote log", async function() { var testSetup = await setup(accounts); - var anotherTestSetup = await setup(accounts); + await setup(accounts); + var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(); + var absoluteVote = await AbsoluteVote.new(); + await absoluteVote.initialize(50, + helpers.NULL_ADDRESS, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address); + await absoluteVoteExecuteMock.initialize(testSetup.org.reputation.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address); + absoluteVote.address); - var tx = await absoluteVoteExecuteMock.propose(2, - anotherTestSetup.voteInOrganizationParams.votingMachine.params, - anotherTestSetup.org.avatar.address, - accounts[0],helpers.NULL_ADDRESS); + var tx = await absoluteVoteExecuteMock.propose(2,helpers.NULL_ADDRESS); - const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); + const proposalId = await helpers.getProposalId(tx,absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, + absoluteVote.address, proposalId,1,helpers.NULL_HASH); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewVoteProposal"); @@ -119,20 +121,24 @@ contract('VoteInOrganizationScheme', accounts => { it("proposeVote vote not an option", async function() { var testSetup = await setup(accounts); - var anotherTestSetup = await setup(accounts); + await setup(accounts); var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(); + var absoluteVote = await AbsoluteVote.new(); + await absoluteVote.initialize(50, + helpers.NULL_ADDRESS, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address); await absoluteVoteExecuteMock.initialize(testSetup.org.reputation.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address); + absoluteVote.address); var tx = await absoluteVoteExecuteMock.propose(2, - anotherTestSetup.voteInOrganizationParams.votingMachine.params, - anotherTestSetup.org.avatar.address, - accounts[0],helpers.NULL_ADDRESS); + helpers.NULL_ADDRESS); - const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); + const proposalId = await helpers.getProposalId(tx,absoluteVote, 'NewProposal'); try { await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, + absoluteVote.address, proposalId,3,helpers.NULL_HASH ); assert(false, "vote not an option"); @@ -143,27 +149,31 @@ contract('VoteInOrganizationScheme', accounts => { it("proposeVote vote not in range", async function() { var standardTokenMock = await ERC20Mock.new(accounts[0],1000); - var testSetup = await setup(accounts,0,true,standardTokenMock.address); + var testSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address); - var anotherTestSetup = await setup(accounts,0,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(); + var genesisProtocol = await GenesisProtocol.new(); + await genesisProtocol.initialize(standardTokenMock.address, + anotherTestSetup.voteInOrganizationParams.votingMachine.uintArray, + anotherTestSetup.voteInOrganizationParams.votingMachine.voteOnBehalf, + genesisProtocolCallbacksMock.address, + genesisProtocolCallbacksMock.address, + genesisProtocolCallbacksMock.address); await genesisProtocolCallbacksMock.initialize(reputation.address, standardTokenMock.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address); + 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); + helpers.NULL_ADDRESS); var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId'); try { await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address, + genesisProtocol.address, originalProposalId,3,helpers.NULL_HASH ); assert(false, "vote out of range (too high)"); @@ -173,7 +183,7 @@ contract('VoteInOrganizationScheme', accounts => { try { await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address, + genesisProtocol.address, originalProposalId,0,helpers.NULL_HASH ); assert(false, "vote out of range (too low)"); @@ -181,26 +191,28 @@ contract('VoteInOrganizationScheme', accounts => { helpers.assertVMException(error); } }); - + it("execute proposeVote -no decision - proposal data delete", async function() { var testSetup = await setup(accounts); - var anotherTestSetup = await setup(accounts); + await setup(accounts); var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(); + var absoluteVote = await AbsoluteVote.new(); + await absoluteVote.initialize(50, + helpers.NULL_ADDRESS, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address); 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'); + absoluteVote.address); + var tx = await absoluteVoteExecuteMock.propose(2,helpers.NULL_ADDRESS); + const originalProposalId = await helpers.getProposalId(tx,absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, + 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]}); + await testSetup.voteInOrganizationParams.votingMachineInstance.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 @@ -212,22 +224,24 @@ contract('VoteInOrganizationScheme', accounts => { var anotherTestSetup = await setup(accounts,testSetup.org.avatar.address); //mint reputation to avatar in the other dao. var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(); + var absoluteVote = await AbsoluteVote.new(); + await absoluteVote.initialize(50, + helpers.NULL_ADDRESS, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address); 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'); + absoluteVote.address); + var tx = await absoluteVoteExecuteMock.propose(2,helpers.NULL_ADDRESS); + const originalProposalId = await helpers.getProposalId(tx,absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, + 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]}); + assert.equal(organizationProposal[0],absoluteVote.address);//new contract address + await testSetup.voteInOrganizationParams.votingMachineInstance.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 @@ -238,48 +252,53 @@ contract('VoteInOrganizationScheme', accounts => { var anotherTestSetup = await setup(accounts,testSetup.org.avatar.address); var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(); + var absoluteVote = await AbsoluteVote.new(); + await absoluteVote.initialize(50, + helpers.NULL_ADDRESS, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address, + absoluteVoteExecuteMock.address); 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'); + absoluteVote.address); + var tx = await absoluteVoteExecuteMock.propose(2,helpers.NULL_ADDRESS); + + const originalProposalId = await helpers.getProposalId(tx,absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, + 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]]); + await testSetup.voteInOrganizationParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await helpers.checkVoteInfo(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,0,true,standardTokenMock.address); + var testSetup = await setup(accounts,helpers.NULL_ADDRESS,true,standardTokenMock.address); - var anotherTestSetup = await setup(accounts,0,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(); + var genesisProtocol = await GenesisProtocol.new(); + await genesisProtocol.initialize(standardTokenMock.address, + anotherTestSetup.voteInOrganizationParams.votingMachine.uintArray, + anotherTestSetup.voteInOrganizationParams.votingMachine.voteOnBehalf, + genesisProtocolCallbacksMock.address, + genesisProtocolCallbacksMock.address, + genesisProtocolCallbacksMock.address); await genesisProtocolCallbacksMock.initialize(reputation.address, standardTokenMock.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address); + 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 tx = await genesisProtocolCallbacksMock.propose(2,helpers.NULL_ADDRESS); var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId'); tx = await testSetup.voteInOrganization.proposeVote( - anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address, + 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]); + await testSetup.voteInOrganizationParams.votingMachineInstance.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await helpers.checkVoteInfo(genesisProtocol,originalProposalId, testSetup.org.avatar.address, [1, 100]); }); }); diff --git a/test/votingmachinecallbacks.js b/test/votingmachinecallbacks.js index ced632d3..ec0e4fe0 100644 --- a/test/votingmachinecallbacks.js +++ b/test/votingmachinecallbacks.js @@ -7,47 +7,46 @@ const proposalId = "0x1234000000000000000000000000000000000000000000000000000000 var registration; -const setup = async function (accounts, avatarZero=false) { +const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); registration = await helpers.registerImplementation(); testSetup.proxyAdmin = accounts[5]; - testSetup.org = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, - accounts, - registration, - [accounts[0]], - [1000], - [1000]); - testSetup.standardTokenMock = await ERC20Mock.new(testSetup.org.avatar.address,100); + + testSetup.standardTokenMock = await ERC20Mock.new(accounts[0],100); + + var schemeMockData = await new web3.eth.Contract(registration.arcVotingMachineCallbacksMock.abi) .methods - .initialize((avatarZero ? helpers.NULL_ADDRESS : testSetup.org.avatar.address), accounts[0]) + .initialize(helpers.NULL_ADDRESS , accounts[0]) .encodeABI(); var permissions = "0x00000000"; - var tx = await registration.daoFactory.setSchemes( - testSetup.org.avatar.address, - [web3.utils.fromAscii("ARCVotingMachineCallbacksMock")], - schemeMockData, - [helpers.getBytesLength(schemeMockData)], - [permissions], - "metaData", - {from:testSetup.proxyAdmin}); - - if (!avatarZero) { - testSetup.arcVotingMachineCallbacksMock = await ARCVotingMachineCallbacksMock.at(tx.logs[1].args._scheme); + [testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(testSetup.proxyAdmin, + accounts, + registration, + [accounts[0]], + [1000], + [1000],0, + [web3.utils.fromAscii("ARCVotingMachineCallbacksMock")], + schemeMockData, + [helpers.getBytesLength(schemeMockData)], + [permissions], + "metaData"); + + testSetup.arcVotingMachineCallbacksMock = await ARCVotingMachineCallbacksMock.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx)); await testSetup.arcVotingMachineCallbacksMock.propose(proposalId); - - + await testSetup.standardTokenMock.transfer(testSetup.org.avatar.address,100); + return testSetup; - } + }; contract('VotingMachineCallbacks', function(accounts) { it("avatar address cannot be 0 ", async function() { try { - await setup(accounts, true); + await setup(accounts); assert(false, "avatar 0 address should revert"); } catch(error) { // revert