Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 1 addition & 15 deletions contracts/universalSchemes/ContributionReward.sol
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,7 @@ contract ContributionReward is UniversalScheme, VotingMachineCallbacks, Proposal
mapping(address=>mapping(bytes32=>ContributionProposal)) public organizationsProposals;

// A mapping from hashes to parameters (use to store a particular configuration on the controller)
// A contribution fee can be in the organization token or the scheme token or a combination
struct Parameters {
// a fee (in the organization's token) that is to be paid for submitting a contribution
uint256 orgNativeTokenFee;
bytes32 voteApproveParams;
IntVoteInterface intVote;
}
Expand Down Expand Up @@ -100,38 +97,31 @@ contract ContributionReward is UniversalScheme, VotingMachineCallbacks, Proposal
* @dev hash the parameters, save them if necessary, and return the hash value
*/
function setParameters(
uint256 _orgNativeTokenFee,
bytes32 _voteApproveParams,
IntVoteInterface _intVote
) public returns(bytes32)
{
bytes32 paramsHash = getParametersHash(
_orgNativeTokenFee,
_voteApproveParams,
_intVote
);
parameters[paramsHash].orgNativeTokenFee = _orgNativeTokenFee;
parameters[paramsHash].voteApproveParams = _voteApproveParams;
parameters[paramsHash].intVote = _intVote;
return paramsHash;
}

/**
* @dev return a hash of the given parameters
* @param _orgNativeTokenFee the fee for submitting a contribution in organizations native token
* @param _voteApproveParams parameters for the voting machine used to approve a contribution
* @param _intVote the voting machine used to approve a contribution
* @return a hash of the parameters
*/
// TODO: These fees are messy. Better to have a _fee and _feeToken pair,
//just as in some other contract (which one?) with some sane default
function getParametersHash(
uint256 _orgNativeTokenFee,
bytes32 _voteApproveParams,
IntVoteInterface _intVote
) public pure returns(bytes32)
{
return (keccak256(abi.encodePacked(_voteApproveParams, _orgNativeTokenFee, _intVote)));
return (keccak256(abi.encodePacked(_voteApproveParams, _intVote)));
}

/**
Expand Down Expand Up @@ -161,10 +151,6 @@ contract ContributionReward is UniversalScheme, VotingMachineCallbacks, Proposal
{
validateProposalParams(_reputationChange, _rewards);
Parameters memory controllerParams = parameters[getParametersFromController(_avatar)];
// Pay fees for submitting the contribution:
if (controllerParams.orgNativeTokenFee > 0) {
_avatar.nativeToken().transferFrom(msg.sender, address(_avatar), controllerParams.orgNativeTokenFee);
}

bytes32 contributionId = controllerParams.intVote.propose(
2,
Expand Down
4 changes: 2 additions & 2 deletions migrations/2_deploy_organization.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ module.exports = async function(deployer) {
await upgradeSchemeInst.setParameters(voteParametersHash, AbsoluteVoteInst.address);
var schemeUpgradeParams = await upgradeSchemeInst.getParametersHash(voteParametersHash, AbsoluteVoteInst.address);

await contributionRewardInst.setParameters(10,voteParametersHash, AbsoluteVoteInst.address);
var contributionRewardParams = await contributionRewardInst.getParametersHash(10,voteParametersHash, AbsoluteVoteInst.address);
await contributionRewardInst.setParameters(voteParametersHash, AbsoluteVoteInst.address);
var contributionRewardParams = await contributionRewardInst.getParametersHash(voteParametersHash, AbsoluteVoteInst.address);

var schemesArray = [schemeRegistrarInst.address,
globalConstraintRegistrarInst.address,
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@daostack/arc",
"version": "0.0.1-rc.12",
"version": "0.0.1-rc.13",
"description": "A platform for building DAOs",
"files": [
"contracts/",
Expand Down
44 changes: 8 additions & 36 deletions test/contributionreward.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,38 +44,34 @@ const checkRedeemedPeriodsLeft = async function(

const setupContributionRewardParams = async function(
contributionReward,
orgNativeTokenFee=0,
accounts,
genesisProtocol,
token,
avatar
) {
var contributionRewardParams = new ContributionRewardParams();
contributionRewardParams.orgNativeTokenFee = orgNativeTokenFee;
if (genesisProtocol === true) {
contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,avatar,helpers.NULL_ADDRESS);
await contributionReward.setParameters(
contributionRewardParams.orgNativeTokenFee,
contributionRewardParams.votingMachine.params,
contributionRewardParams.votingMachine.genesisProtocol.address);
contributionRewardParams.paramsHash = await contributionReward.getParametersHash(contributionRewardParams.orgNativeTokenFee,
contributionRewardParams.paramsHash = await contributionReward.getParametersHash(
contributionRewardParams.votingMachine.params,
contributionRewardParams.votingMachine.genesisProtocol.address);
} else {
contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,contributionReward.address);
await contributionReward.setParameters(contributionRewardParams.orgNativeTokenFee,
await contributionReward.setParameters(
contributionRewardParams.votingMachine.params,
contributionRewardParams.votingMachine.absoluteVote.address);
contributionRewardParams.paramsHash = await contributionReward.getParametersHash(contributionRewardParams.orgNativeTokenFee,
contributionRewardParams.paramsHash = await contributionReward.getParametersHash(
contributionRewardParams.votingMachine.params,
contributionRewardParams.votingMachine.absoluteVote.address);
}
return contributionRewardParams;
};

const setup = async function (accounts,orgNativeTokenFee=0,genesisProtocol = false,tokenAddress=0) {
const setup = async function (accounts,genesisProtocol = false,tokenAddress=0) {
var testSetup = new helpers.TestSetup();
testSetup.fee = 10;
testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100);
testSetup.contributionReward = await ContributionReward.new();
var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT});
Expand All @@ -88,7 +84,6 @@ const setup = async function (accounts,orgNativeTokenFee=0,genesisProtocol = fal
testSetup.org = await helpers.setupOrganizationWithArrays(testSetup.daoCreator,[accounts[0],accounts[1],accounts[2]],[1000,0,0],testSetup.reputationArray);
testSetup.contributionRewardParams= await setupContributionRewardParams(
testSetup.contributionReward,
orgNativeTokenFee,
accounts,genesisProtocol,
tokenAddress,
testSetup.org.avatar);
Expand All @@ -104,11 +99,11 @@ contract('ContributionReward', accounts => {
var contributionReward = await ContributionReward.new();
var params = await setupContributionRewardParams(contributionReward);
var parameters = await contributionReward.parameters(params.paramsHash);
assert.equal(parameters[2],params.votingMachine.absoluteVote.address);
assert.equal(parameters[1],params.votingMachine.absoluteVote.address);
});

it("proposeContributionReward log", async function() {
var testSetup = await setup(accounts,0);
var testSetup = await setup(accounts);
var periodLength = 1;
var tx = await testSetup.contributionReward.proposeContributionReward(testSetup.org.avatar.address,
"description-hash",
Expand All @@ -132,29 +127,6 @@ contract('ContributionReward', accounts => {
assert.equal(await helpers.getValueFromLogs(tx, '_beneficiary',0), accounts[0], "Wrong log: _beneficiary");
});

it("proposeContributionReward fees", async function() {
var testSetup = await setup(accounts,14);
var periodLength = 1;

var balanceBefore = await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address);
//give approval to scheme to do the fees transfer
await testSetup.org.token.approve(testSetup.contributionReward.address,100);
var tx = await testSetup.contributionReward.proposeContributionReward(testSetup.org.avatar.address,
web3.utils.asciiToHex("description"),
0,
[0,0,0,periodLength,0],
testSetup.standardTokenMock.address,
accounts[0],
{from:accounts[0]}
);
assert.equal(tx.logs.length, 1);
assert.equal(tx.logs[0].event, "NewContributionProposal");
var balance = await testSetup.org.token.balanceOf(testSetup.org.avatar.address);
assert.equal(balance.toNumber(),testSetup.contributionRewardParams.orgNativeTokenFee);
balance = await testSetup.standardTokenMock.balanceOf(testSetup.org.avatar.address);
assert.equal(balance.toNumber(),balanceBefore.toNumber());
});

it("proposeContributionReward check beneficiary==0", async() => {
var testSetup = await setup(accounts);
var beneficiary = helpers.NULL_ADDRESS;
Expand Down Expand Up @@ -498,7 +470,7 @@ contract('ContributionReward', accounts => {

it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer", async function() {
var standardTokenMock = await ERC20Mock.new(accounts[0],1000);
var testSetup = await setup(accounts,0,true,standardTokenMock.address);
var testSetup = await setup(accounts,true,standardTokenMock.address);
var reputationReward = 12;
var nativeTokenReward = 12;
var ethReward = 12;
Expand Down Expand Up @@ -545,7 +517,7 @@ contract('ContributionReward', accounts => {
});
it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer for negative proposal", async function() {
var standardTokenMock = await ERC20Mock.new(accounts[0],1000);
var testSetup = await setup(accounts,0,true,standardTokenMock.address);
var testSetup = await setup(accounts,true,standardTokenMock.address);
var reputationReward = 12;
var nativeTokenReward = 12;
var ethReward = 12;
Expand Down