mirror of
git://holbrook.no/erc20-demurrage-token
synced 2024-11-25 17:26:45 +01:00
Add redistribution execution
This commit is contained in:
parent
b5d30e12ef
commit
ea6990a84c
@ -20,7 +20,7 @@ testdir = os.path.dirname(__file__)
|
|||||||
#BLOCKTIME = 5 # seconds
|
#BLOCKTIME = 5 # seconds
|
||||||
TAX_LEVEL = 10000 * 2 # 2%
|
TAX_LEVEL = 10000 * 2 # 2%
|
||||||
#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month
|
#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month
|
||||||
PERIOD = 2
|
PERIOD = 10
|
||||||
|
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
@ -57,9 +57,9 @@ class Test(unittest.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
def test_hello(self):
|
def test_hello(self):
|
||||||
self.assertEqual(self.contract.functions.actualPeriod().call(), 0)
|
|
||||||
self.eth_tester.mine_blocks(PERIOD)
|
|
||||||
self.assertEqual(self.contract.functions.actualPeriod().call(), 1)
|
self.assertEqual(self.contract.functions.actualPeriod().call(), 1)
|
||||||
|
self.eth_tester.mine_blocks(PERIOD)
|
||||||
|
self.assertEqual(self.contract.functions.actualPeriod().call(), 2)
|
||||||
|
|
||||||
|
|
||||||
def test_mint(self):
|
def test_mint(self):
|
||||||
@ -148,5 +148,6 @@ class Test(unittest.TestCase):
|
|||||||
balance_bob_trunc = int(balance_bob/1000)*1000
|
balance_bob_trunc = int(balance_bob/1000)*1000
|
||||||
self.assertEqual(balance_bob_trunc, 500000)
|
self.assertEqual(balance_bob_trunc, 500000)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -7,6 +7,8 @@ all:
|
|||||||
|
|
||||||
test: all
|
test: all
|
||||||
python ../python/tests/test_basic.py
|
python ../python/tests/test_basic.py
|
||||||
|
python ../python/tests/test_period.py
|
||||||
|
python ../python/tests/test_redistribution.py
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
cp -v RedistributedDemurrageToken.{json,bin} ../python/eth_address_declarator/data/
|
cp -v RedistributedDemurrageToken.{json,bin} ../python/eth_address_declarator/data/
|
||||||
|
@ -21,10 +21,10 @@ contract RedistributedDemurrageToken {
|
|||||||
|
|
||||||
event Transfer(address indexed _from, address indexed _to, uint256 _value);
|
event Transfer(address indexed _from, address indexed _to, uint256 _value);
|
||||||
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
|
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
|
||||||
event Mint(address indexed _minter, address indexed _beneficiary, uint256 _amount);
|
event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);
|
||||||
event Debug(uint256 _foo);
|
//event Debug(uint256 _foo);
|
||||||
event Taxed(uint256 indexed _period);
|
event Taxed(uint256 indexed _period);
|
||||||
event Redistribution(address indexed _account, uint256 indexed _period, uint256 _amount);
|
event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value);
|
||||||
|
|
||||||
constructor(string memory _name, string memory _symbol, uint32 _taxLevel, uint256 _period) {
|
constructor(string memory _name, string memory _symbol, uint32 _taxLevel, uint256 _period) {
|
||||||
owner = msg.sender;
|
owner = msg.sender;
|
||||||
@ -126,7 +126,7 @@ contract RedistributedDemurrageToken {
|
|||||||
currentRedistribution &= 0x0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff;
|
currentRedistribution &= 0x0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff;
|
||||||
currentRedistribution |= participants << 216;
|
currentRedistribution |= participants << 216;
|
||||||
|
|
||||||
emit Debug(participants);
|
//emit Debug(participants);
|
||||||
redistributions[redistributions.length-1] = bytes32(currentRedistribution);
|
redistributions[redistributions.length-1] = bytes32(currentRedistribution);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,29 +183,41 @@ contract RedistributedDemurrageToken {
|
|||||||
return demurrageModifier;
|
return demurrageModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toReward(address _amount, uint256 _period) public view returns (uint256) {
|
function toTaxPeriodAmount(uint256 _value, uint256 _period) public view returns (uint256) {
|
||||||
return 1000000 * (((1000000-taxLevel)/1000000) ** _period);
|
uint256 valueFactor;
|
||||||
|
|
||||||
|
// TODO: doesn't work for solidity as floats are missing and using ints linearly increases the order of magnitude
|
||||||
|
// valueFactor = 1000000 * (((1000000-taxLevel)/1000000) ** _period);
|
||||||
|
valueFactor = 1000000;
|
||||||
|
for (uint256 i = 0; i < _period; i++) {
|
||||||
|
valueFactor = (valueFactor * taxLevel) / 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (valueFactor * _value) / 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyRedistributionOnAccount(address _account) public returns (bool) {
|
function applyRedistributionOnAccount(address _account) public returns (bool) {
|
||||||
bytes32 periodRedistribution;
|
bytes32 periodRedistribution;
|
||||||
uint256 supply;
|
uint256 supply;
|
||||||
uint256 participants;
|
uint256 participants;
|
||||||
|
uint256 baseValue;
|
||||||
uint256 value;
|
uint256 value;
|
||||||
uint256 period;
|
uint256 period;
|
||||||
|
|
||||||
period = accountPeriod(_account);
|
period = accountPeriod(_account);
|
||||||
if (period >= actualPeriod()) {
|
if (period == 0 || period >= actualPeriod()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
periodRedistribution = redistributions[period-1];
|
||||||
participants = toRedistributionParticipants(periodRedistribution);
|
participants = toRedistributionParticipants(periodRedistribution);
|
||||||
if (participants == 0) {
|
if (participants == 0) {
|
||||||
// TODO: In this case we need to give back to everyone, so we need a total accounts counter
|
// TODO: In this case we need to give back to everyone, so we need a total accounts counter
|
||||||
revert('0 participants');
|
revert('0 participants');
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
supply = toRedistributionSupply(periodRedistribution);
|
supply = toRedistributionSupply(periodRedistribution);
|
||||||
value = supply / participants;
|
// TODO: Make sure value for balance increases round down, and that we can do a single allocation to a sink account with the difference. We can use the highest bit in "participants" for that.
|
||||||
|
baseValue = supply / participants;
|
||||||
|
value = toTaxPeriodAmount(baseValue, period);
|
||||||
|
|
||||||
account[_account] &= bytes32(0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff);
|
account[_account] &= bytes32(0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff);
|
||||||
increaseBalance(_account, value);
|
increaseBalance(_account, value);
|
||||||
@ -219,27 +231,26 @@ contract RedistributedDemurrageToken {
|
|||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
applyTax();
|
applyTax();
|
||||||
|
applyRedistributionOnAccount(msg.sender);
|
||||||
|
|
||||||
// TODO: Prefer to truncate the result, instead it seems to round to nearest :/
|
// TODO: Prefer to truncate the result, instead it seems to round to nearest :/
|
||||||
baseValue = (_value * 1000000) / demurrageModifier;
|
baseValue = (_value * 1000000) / demurrageModifier;
|
||||||
result = transferBase(msg.sender, _to, baseValue);
|
result = transferBase(msg.sender, _to, baseValue);
|
||||||
|
|
||||||
applyRedistributionOnAccount(msg.sender);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function transferBase(address _from, address _to, uint256 _value) private returns (bool) {
|
function transferBase(address _from, address _to, uint256 _value) private returns (bool) {
|
||||||
uint256 period;
|
uint256 period;
|
||||||
|
|
||||||
if (!decreaseBalance(msg.sender, _value)) {
|
if (!decreaseBalance(_from, _value)) {
|
||||||
revert('ERR_TX_DECREASEBALANCE');
|
revert('ERR_TX_DECREASEBALANCE');
|
||||||
}
|
}
|
||||||
if (!increaseBalance(_to, _value)) {
|
if (!increaseBalance(_to, _value)) {
|
||||||
revert('ERR_TX_INCREASEBALANCE');
|
revert('ERR_TX_INCREASEBALANCE');
|
||||||
}
|
}
|
||||||
period = actualPeriod();
|
period = actualPeriod();
|
||||||
if (accountPeriod(_from) != period) {
|
if (_value > 0 && accountPeriod(_from) != period) {
|
||||||
registerAccountPeriod(_from, period);
|
registerAccountPeriod(_from, period);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user