Skip to content

Commit 24507bf

Browse files
committed
Colony-specific decay rates
1 parent 3e04965 commit 24507bf

15 files changed

Lines changed: 214 additions & 25 deletions

File tree

contracts/colony/Colony.sol

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@ contract Colony is BasicMetaTransaction, Multicall, ColonyStorage, PatriciaTreeP
332332
tokenReputationRates[token] = WAD;
333333
tokensWithReputationRatesLinkedList[address(0x00)] = token;
334334
nTokensWithReputationRates = 1;
335+
336+
sig = bytes4(keccak256("setReputationDecayRate(uint256,uint256)"));
337+
colonyAuthority.setRoleCapability(uint8(ColonyRole.Root), address(this), sig, true);
335338
}
336339

337340
function setTokenReputationRate(address _prevToken, address _token, uint256 _rate) public stoppable {
@@ -379,10 +382,6 @@ contract Colony is BasicMetaTransaction, Multicall, ColonyStorage, PatriciaTreeP
379382
return tokensWithReputationRatesLinkedList[_token];
380383
}
381384

382-
function setReputationDecayRate(uint256 _numerator, uint256 _denominator) stoppable auth public {
383-
IColonyNetwork(colonyNetworkAddress).setColonyReputationDecayRate(_numerator, _denominator);
384-
}
385-
386385
function getMetatransactionNonce(address _user) override public view returns (uint256 nonce){
387386
return metatransactionNonces[_user];
388387
}

contracts/colony/ColonyAuthority.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ contract ColonyAuthority is CommonAuthority {
132132

133133
// Added in colony v xxxxx
134134
addRoleCapability(ROOT_ROLE, "setDomainReputationScaling(uint256,bool,uint256)");
135+
addRoleCapability(ROOT_ROLE, "setReputationDecayRate(uint256,uint256)");
135136

136137
}
137138

contracts/colony/IColony.sol

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,7 +1117,6 @@ interface IColony is ColonyDataTypes, IRecovery, IBasicMetaTransaction, IMultica
11171117
/// @param factor The scale factor to apply, as a WAD
11181118
function setDomainReputationScaling(uint256 domainId, bool enabled, uint256 factor) external;
11191119

1120-
11211120
/// @notice Call to set the reputation scaling applied to payouts made in a particular token
11221121
/// @param _prevToken The token before where the token being added (_rate > 0) or removed (_rate ==0) in
11231122
/// the list of tokens that have reputation scaling applied
@@ -1140,9 +1139,4 @@ interface IColony is ColonyDataTypes, IRecovery, IBasicMetaTransaction, IMultica
11401139
/// @return address The address of the next token. If 0x00, queried token is either not in the
11411140
/// list or is the last entry in the list.
11421141
function getNextTokenWithReputationRate(address _token) external view returns (address);
1143-
1144-
/// @notice Call to set the rate at which reputation in this colony decays
1145-
/// @param _numerator The numerator of the fraction reputation does down by every reputation cycle
1146-
/// @param _denominator The denominator of the fraction reputation does down by every reputation cycle
1147-
function setReputationDecayRate(uint256 _numerator, uint256 _denominator) external;
11481142
}

contracts/colonyNetwork/ColonyNetwork.sol

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,48 @@ contract ColonyNetwork is ColonyDataTypes, BasicMetaTransaction, ColonyNetworkSt
332332
return factor;
333333
}
334334

335+
function setColonyReputationDecayRate(uint256 _numerator, uint256 _denominator) public calledByColony stoppable {
336+
require(_numerator < 10**15, "colony-network-decay-numerator-too-big");
337+
require(_numerator <= _denominator, "colony-network-decay-rate-over-1");
338+
339+
ColonyDecayRate storage decayRate = colonyDecayRates[msgSender()];
340+
341+
if (activeReputationMiningCycle != decayRate.afterMiningCycle) {
342+
// Move the old-next values to current, as they are in effect
343+
decayRate.currentNumerator = decayRate.nextNumerator;
344+
decayRate.currentDenominator = decayRate.nextDenominator;
345+
346+
// Update afterMiningCycle
347+
decayRate.afterMiningCycle = activeReputationMiningCycle;
348+
}
349+
350+
// Whether we've updated the current decays rates or not, we update the next values
351+
decayRate.nextNumerator = _numerator;
352+
decayRate.nextDenominator = _denominator;
353+
354+
emit ColonyReputationDecayRateToChange(msgSender(), activeReputationMiningCycle, _numerator, _denominator);
355+
}
356+
357+
function getColonyReputationDecayRate(address _colony) public view returns (uint256, uint256) {
358+
uint256 numerator;
359+
uint256 denominator;
360+
361+
if (activeReputationMiningCycle != colonyDecayRates[_colony].afterMiningCycle) {
362+
// Then the values of interest is whatever's in nextNumerator/nextDenominator
363+
numerator = colonyDecayRates[_colony].nextNumerator;
364+
denominator = colonyDecayRates[_colony].nextDenominator;
365+
} else {
366+
numerator = colonyDecayRates[_colony].currentNumerator;
367+
denominator = colonyDecayRates[_colony].currentDenominator;
368+
}
369+
370+
if (denominator == 0) {
371+
// Then we return the 'default' decay rate
372+
(numerator, denominator) = IReputationMiningCycle(activeReputationMiningCycle).getDecayConstant();
373+
}
374+
return (numerator, denominator);
375+
}
376+
335377
function incrementMetatransactionNonce(address _user) override internal {
336378
// We need to protect the metatransaction nonce slots, otherwise those with recovery
337379
// permissions could replay metatransactions, which would be a disaster.

contracts/colonyNetwork/ColonyNetworkDataTypes.sol

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,14 @@ interface ColonyNetworkDataTypes {
145145
/// @param tokenAuthorityAddress The address of the token authority deployed
146146
event TokenAuthorityDeployed(address tokenAuthorityAddress);
147147

148+
/// @notice Event logged when a colony sets what its next decay rate is going to be
149+
/// @param colony The colony changing its decay rate
150+
/// @param fromCycleCompleted When this mining cycle is completed, the new rate will be in effect
151+
/// @param numerator The new numerator of the decay rate
152+
/// @param denominator The new denominator of the decay rate
153+
event ColonyReputationDecayRateToChange(address colony, address fromCycleCompleted, uint256 numerator, uint256 denominator);
154+
155+
148156
struct Skill {
149157
// total number of parent skills
150158
uint128 nParents;
@@ -183,4 +191,12 @@ interface ColonyNetworkDataTypes {
183191
uint256 amount;
184192
uint256 timestamp;
185193
}
194+
195+
struct ColonyDecayRate {
196+
uint256 currentNumerator;
197+
uint256 currentDenominator;
198+
uint256 nextNumerator;
199+
uint256 nextDenominator;
200+
address afterMiningCycle;
201+
}
186202
}

contracts/colonyNetwork/ColonyNetworkStorage.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ contract ColonyNetworkStorage is ColonyNetworkDataTypes, DSMath, CommonStorage {
106106
// Mining delegation mapping
107107
mapping(address => address) miningDelegators; // Storage slot 42
108108

109+
mapping(address => ColonyDecayRate) colonyDecayRates; // Storage slot 43
110+
109111
modifier calledByColony() {
110112
require(_isColony[msgSender()], "colony-caller-must-be-colony");
111113
assert(msgSender() == msg.sender);

contracts/colonyNetwork/IColonyNetwork.sol

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,4 +476,16 @@ interface IColonyNetwork is ColonyNetworkDataTypes, IRecovery, IBasicMetaTransac
476476
/// If disabling, bool must be false
477477
/// @param _factor The scale factor to apply, as a WAD
478478
function setDomainReputationScaling(uint256 _domainId, bool _enabled, uint256 _factor) external;
479+
480+
481+
/// @notice Called by a colony to set the rate at which reputation in that colony decays
482+
/// @param _numerator The numerator of the fraction reputation does down by every reputation cycle
483+
/// @param _denominator The denominator of the fraction reputation does down by every reputation cycle
484+
function setColonyReputationDecayRate(uint256 _numerator, uint256 _denominator) external;
485+
486+
/// @notice Called to get the rate at which reputation in a colony decays
487+
/// @param _colony The address of the colony in question
488+
/// @return numerator The numerator of the fraction reputation does down by every reputation cycle
489+
/// @return denominator The denominator of the fraction reputation does down by every reputation cycle
490+
function getColonyReputationDecayRate(address _colony) external view returns (uint256 numerator, uint256 denominator);
479491
}

contracts/reputationMiningCycle/ReputationMiningCycleRespond.sol

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,11 @@ contract ReputationMiningCycleRespond is ReputationMiningCycleCommon {
531531
// We don't care about underflows for the purposes of comparison, but for the calculation we deem 'correct'.
532532
// i.e. a reputation can't be negative.
533533
if (u[U_DECAY_TRANSITION] == 1) {
534-
require(uint256(_disagreeStateReputationValue) == (uint256(_agreeStateReputationValue)*DECAY_NUMERATOR)/DECAY_DENOMINATOR, "colony-reputation-mining-decay-incorrect");
534+
uint256 numerator;
535+
uint256 denominator;
536+
537+
(numerator, denominator) = IColonyNetwork(colonyNetworkAddress).getColonyReputationDecayRate(logEntry.colony);
538+
require(uint256(_disagreeStateReputationValue) == (uint256(_agreeStateReputationValue)*numerator)/denominator, "colony-reputation-mining-decay-incorrect");
535539
} else {
536540
if (logEntry.amount >= 0) {
537541
// Don't allow reputation to overflow

docs/interfaces/icolony.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,19 @@ Sets the skill on an existing payment. Secured function to authorised members.
17751775
|_skillId|uint256|Id of the new skill to set
17761776

17771777

1778+
### `setReputationDecayRate(uint256 _numerator, uint256 _denominator)`
1779+
1780+
Call to set the rate at which reputation in this colony decays
1781+
1782+
1783+
**Parameters**
1784+
1785+
|Name|Type|Description|
1786+
|---|---|---|
1787+
|_numerator|uint256|The numerator of the fraction reputation does down by every reputation cycle
1788+
|_denominator|uint256|The denominator of the fraction reputation does down by every reputation cycle
1789+
1790+
17781791
### `setRewardInverse(uint256 _rewardInverse)`
17791792

17801793
Set the reward inverse to pay out from revenue. e.g. if the fee is 1% (or 0.01), set 100.

docs/interfaces/icolonynetwork.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,24 @@ Get the number of colonies in the network.
379379
|---|---|---|
380380
|_count|uint256|The colony count
381381

382+
### `getColonyReputationDecayRate(address _colony):uint256 numerator, uint256 denominator`
383+
384+
Called to get the rate at which reputation in a colony decays
385+
386+
387+
**Parameters**
388+
389+
|Name|Type|Description|
390+
|---|---|---|
391+
|_colony|address|The address of the colony in question
392+
393+
**Return Parameters**
394+
395+
|Name|Type|Description|
396+
|---|---|---|
397+
|numerator|uint256|The numerator of the fraction reputation does down by every reputation cycle
398+
|denominator|uint256|The denominator of the fraction reputation does down by every reputation cycle
399+
382400
### `getColonyVersionResolver(uint256 _version):address _resolverAddress`
383401

384402
Get the `Resolver` address for Colony contract version `_version`.
@@ -885,6 +903,19 @@ Used to track that a user is eligible to claim a reward
885903
|_amount|uint256|The amount of CLNY to be awarded
886904

887905

906+
### `setColonyReputationDecayRate(uint256 _numerator, uint256 _denominator)`
907+
908+
Called by a colony to set the rate at which reputation in that colony decays
909+
910+
911+
**Parameters**
912+
913+
|Name|Type|Description|
914+
|---|---|---|
915+
|_numerator|uint256|The numerator of the fraction reputation does down by every reputation cycle
916+
|_denominator|uint256|The denominator of the fraction reputation does down by every reputation cycle
917+
918+
888919
### `setDomainReputationScaling(uint256 _domainId, bool _enabled, uint256 _factor)`
889920

890921
Call to set the reputation scaling applied to reputation earned in a domain.

0 commit comments

Comments
 (0)