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
46 changes: 22 additions & 24 deletions contracts/utils/Redeemer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,6 @@ import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
contract Redeemer {
using SafeMath for uint;

ContributionReward public contributionReward;
GenesisProtocol public genesisProtocol;

constructor(address _contributionReward, address _genesisProtocol) public {
contributionReward = ContributionReward(_contributionReward);
genesisProtocol = GenesisProtocol(_genesisProtocol);
}

/**
* @dev helper to redeem rewards for a proposal
* It calls execute on the proposal if it is not yet executed.
Expand All @@ -24,6 +16,8 @@ contract Redeemer {
* This function does not emit events.
* A client should listen to GenesisProtocol and ContributionReward redemption events
* to monitor redemption operations.
* @param _contributionReward contributionReward
* @param _genesisProtocol genesisProtocol
* @param _proposalId the ID of the voting in the voting machine
* @param _avatar address of the controller
* @param _beneficiary beneficiary
Expand All @@ -44,7 +38,11 @@ contract Redeemer {
* @return int256 crEthReward Ether - from ContributionReward
* @return int256 crExternalTokenReward ExternalToken - from ContributionReward
*/
function redeem(bytes32 _proposalId, Avatar _avatar, address _beneficiary)
function redeem(ContributionReward _contributionReward,
GenesisProtocol _genesisProtocol,
bytes32 _proposalId,
Avatar _avatar,
address _beneficiary)
external
returns(uint[3] memory gpRewards,
uint[2] memory gpDaoBountyReward,
Expand All @@ -55,56 +53,56 @@ contract Redeemer {
uint256 crEthReward,
uint256 crExternalTokenReward)
{
GenesisProtocol.ProposalState pState = genesisProtocol.state(_proposalId);
GenesisProtocol.ProposalState pState = _genesisProtocol.state(_proposalId);

if ((pState == GenesisProtocolLogic.ProposalState.Queued)||
(pState == GenesisProtocolLogic.ProposalState.PreBoosted)||
(pState == GenesisProtocolLogic.ProposalState.Boosted)||
(pState == GenesisProtocolLogic.ProposalState.QuietEndingPeriod)) {
executed = genesisProtocol.execute(_proposalId);
executed = _genesisProtocol.execute(_proposalId);
}
pState = genesisProtocol.state(_proposalId);
pState = _genesisProtocol.state(_proposalId);
if ((pState == GenesisProtocolLogic.ProposalState.Executed) ||
(pState == GenesisProtocolLogic.ProposalState.ExpiredInQueue)) {
gpRewards = genesisProtocol.redeem(_proposalId, _beneficiary);
gpRewards = _genesisProtocol.redeem(_proposalId, _beneficiary);
if (pState == GenesisProtocolLogic.ProposalState.Executed) {
(gpDaoBountyReward[0], gpDaoBountyReward[1]) =
genesisProtocol.redeemDaoBounty(_proposalId, _beneficiary);
_genesisProtocol.redeemDaoBounty(_proposalId, _beneficiary);
}
winningVote = genesisProtocol.winningVote(_proposalId);
winningVote = _genesisProtocol.winningVote(_proposalId);
//redeem from contributionReward only if it executed
if (contributionReward.getProposalExecutionTime(_proposalId, address(_avatar)) > 0) {
if (_contributionReward.getProposalExecutionTime(_proposalId, address(_avatar)) > 0) {
(crReputationReward, crNativeTokenReward, crEthReward, crExternalTokenReward) =
contributionRewardRedeem(_proposalId, _avatar);
contributionRewardRedeem(_contributionReward, _proposalId, _avatar);
}
}
}

function contributionRewardRedeem(bytes32 _proposalId, Avatar _avatar)
function contributionRewardRedeem(ContributionReward _contributionReward, bytes32 _proposalId, Avatar _avatar)
private
returns (int256 reputation, uint256 nativeToken, uint256 eth, uint256 externalToken)
{
bool[4] memory whatToRedeem;
whatToRedeem[0] = true; //reputation
whatToRedeem[1] = true; //nativeToken
uint256 periodsToPay = contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 2);
uint256 ethReward = contributionReward.getProposalEthReward(_proposalId, address(_avatar));
uint256 externalTokenReward = contributionReward.getProposalExternalTokenReward(_proposalId, address(_avatar));
address externalTokenAddress = contributionReward.getProposalExternalToken(_proposalId, address(_avatar));
uint256 periodsToPay = _contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 2);
uint256 ethReward = _contributionReward.getProposalEthReward(_proposalId, address(_avatar));
uint256 externalTokenReward = _contributionReward.getProposalExternalTokenReward(_proposalId, address(_avatar));
address externalTokenAddress = _contributionReward.getProposalExternalToken(_proposalId, address(_avatar));
ethReward = periodsToPay.mul(ethReward);
if ((ethReward == 0) || (address(_avatar).balance < ethReward)) {
whatToRedeem[2] = false;
} else {
whatToRedeem[2] = true;
}
periodsToPay = contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 3);
periodsToPay = _contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 3);
externalTokenReward = periodsToPay.mul(externalTokenReward);
if ((externalTokenReward == 0) ||
(IERC20(externalTokenAddress).balanceOf(address(_avatar)) < externalTokenReward)) {
whatToRedeem[3] = false;
} else {
whatToRedeem[3] = true;
}
(reputation, nativeToken, eth, externalToken) = contributionReward.redeem(_proposalId, _avatar, whatToRedeem);
(reputation, nativeToken, eth, externalToken) = _contributionReward.redeem(_proposalId, _avatar, whatToRedeem);
}
}
39 changes: 29 additions & 10 deletions test/contributionreward.js
Original file line number Diff line number Diff line change
Expand Up @@ -490,8 +490,11 @@ 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[0]});
await helpers.increaseTime(periodLength+1);
var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address);
var redeemRewards = await arcUtils.redeem.call(proposalId,testSetup.org.avatar.address,accounts[0]);
var arcUtils = await Redeemer.new();
var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,testSetup.org.avatar.address,
accounts[0]);
assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards
assert.equal(redeemRewards[0][2],60);
assert.equal(redeemRewards[1][0],0); //daoBountyRewards
Expand All @@ -503,7 +506,10 @@ contract('ContributionReward', accounts => {
assert.equal(redeemRewards[6],ethReward); //crEthReward
assert.equal(redeemRewards[7],0); //crExternalTokenReward

await arcUtils.redeem(proposalId,testSetup.org.avatar.address,accounts[0]);
await arcUtils.redeem(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,testSetup.org.avatar.address,
accounts[0]);

var eth = await web3.eth.getBalance(otherAvatar.address);
assert.equal(eth,ethReward);
Expand Down Expand Up @@ -541,8 +547,11 @@ contract('ContributionReward', accounts => {
await standardTokenMock.approve(testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,1000);
await testSetup.contributionRewardParams.votingMachine.genesisProtocol.stake(proposalId,1,1000);
await helpers.increaseTime(60+1);
var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address);
var redeemRewards = await arcUtils.redeem.call(proposalId,testSetup.org.avatar.address,accounts[0]);
var arcUtils = await Redeemer.new();
var redeemRewards = await arcUtils.redeem.call(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,testSetup.org.avatar.address,
accounts[0]);
assert.equal(redeemRewards[0][1],0); //redeemRewards[0] gpRewards
assert.equal(redeemRewards[0][2],60);
assert.equal(redeemRewards[1][0],0); //daoBountyRewards
Expand All @@ -554,7 +563,10 @@ contract('ContributionReward', accounts => {
assert.equal(redeemRewards[6],ethReward); //crEthReward
assert.equal(redeemRewards[7],0); //crExternalTokenReward

await arcUtils.redeem(proposalId,testSetup.org.avatar.address,accounts[0]);
await arcUtils.redeem(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,testSetup.org.avatar.address,
accounts[0]);

var eth = await web3.eth.getBalance(otherAvatar.address);
assert.equal(eth,ethReward);
Expand Down Expand Up @@ -589,8 +601,12 @@ contract('ContributionReward', accounts => {
var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1);
await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]});
await helpers.increaseTime(periodLength+1);
var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address);
await arcUtils.redeem(proposalId,testSetup.org.avatar.address,accounts[0]);
var arcUtils = await Redeemer.new();
await arcUtils.redeem(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,
testSetup.org.avatar.address,
accounts[0]);
var eth = await web3.eth.getBalance(otherAvatar.address);
assert.equal(eth,0);
assert.equal(await testSetup.org.reputation.balanceOf(otherAvatar.address),0);
Expand Down Expand Up @@ -622,8 +638,11 @@ contract('ContributionReward', accounts => {

await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[1]});
await helpers.increaseTime(60+1);
var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address);
await arcUtils.redeem(proposalId,testSetup.org.avatar.address,accounts[1]);
var arcUtils = await Redeemer.new();
await arcUtils.redeem(testSetup.contributionReward.address,
testSetup.contributionRewardParams.votingMachine.genesisProtocol.address,
proposalId,testSetup.org.avatar.address,
accounts[1]);
var proposal = await testSetup.contributionRewardParams.votingMachine.genesisProtocol.proposals(proposalId);
assert.equal(proposal.state,1); //ExpiredInQueue
var reputation = await testSetup.org.reputation.balanceOf(accounts[1]);
Expand Down