erc20-demurrage-token

ERC20 token with redistributed continual demurrage
Log | Files | Refs | README

commit 64a6bdcabe0137979871bcd8743b084aecb0f230
parent 68a7e3e1db53768c99678d79700d037477fdc7ec
Author: nolash <dev@holbrook.no>
Date:   Tue,  2 Feb 2021 16:46:27 +0100

Add period to account word

Diffstat:
Mpython/tests/test_basic.py | 19++++++++++++++-----
Msolidity/RedistributedDemurrageToken.sol | 36+++++++++++++++++++++++++++++-------
2 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -56,14 +56,12 @@ class Test(unittest.TestCase): pass - @unittest.skip('foo') def test_period(self): self.assertEqual(self.contract.functions.actualPeriod().call(), 0) self.eth_tester.mine_blocks(PERIOD) self.assertEqual(self.contract.functions.actualPeriod().call(), 1) - @unittest.skip('foo') def test_mint(self): tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1024).transact(); r = self.w3.eth.getTransactionReceipt(tx_hash); @@ -96,7 +94,6 @@ class Test(unittest.TestCase): self.assertEqual(balance_bob, 500); - @unittest.skip('foo') def test_apply_tax(self): self.eth_tester.mine_blocks(PERIOD) tx_hash = self.contract.functions.applyTax().transact() @@ -111,7 +108,6 @@ class Test(unittest.TestCase): self.assertEqual(self.contract.functions.demurrageModifier().call(), 960400) - @unittest.skip('foo') def test_tax_balance(self): tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1000).transact() r = self.w3.eth.getTransactionReceipt(tx_hash) @@ -152,7 +148,20 @@ class Test(unittest.TestCase): balance_bob_trunc = int(balance_bob/1000)*1000 self.assertEqual(balance_bob_trunc, 500000) - + + def test_period(self): + tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1024).transact(); + r = self.w3.eth.getTransactionReceipt(tx_hash); + self.assertEqual(r.status, 1); + + self.eth_tester.mine_blocks(PERIOD*10) + + tx_hash = self.contract.functions.transfer(self.w3.eth.accounts[2], 500).transact({'from': self.w3.eth.accounts[1]}); + r = self.w3.eth.getTransactionReceipt(tx_hash); + self.assertEqual(r.status, 1); + + period = self.contract.functions.accountPeriod(self.w3.eth.accounts[1]).call(); + self.assertEqual(period, 11); if __name__ == '__main__': diff --git a/solidity/RedistributedDemurrageToken.sol b/solidity/RedistributedDemurrageToken.sol @@ -122,17 +122,39 @@ contract RedistributedDemurrageToken { return demurrageModifier; } - function transfer(address _to, uint256 _value) public returns (bool ) { - //&uint256 baseValue = (_value * 1000000) / demurrageModifier; - uint256 baseValue = (_value * 1000000) / demurrageModifier; - bool result = transferBase(_to, baseValue); + function accountPeriod(address _account) public returns (uint256) { + return (uint256(account[_account]) & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000) >> 160; + } + + function saveAccountPeriod(address _account, uint256 _period) private returns (bool) { + account[_account] &= 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff; + account[_account] |= bytes32(_period << 160); + } + + function transfer(address _to, uint256 _value) public returns (bool) { + // TODO: Prefer to truncate the result, instead it seems to round to nearest :/ + uint256 baseValue; + bool result; + + baseValue = (_value * 1000000) / demurrageModifier; + result = transferBase(msg.sender, _to, baseValue); emit Transfer(msg.sender, _to, _value); return result; } - function transferBase(address _to, uint256 _value) private returns (bool) { - decreaseBalance(msg.sender, _value); - increaseBalance(_to, _value); + function transferBase(address _from, address _to, uint256 _value) private returns (bool) { + uint256 period; + + if (!decreaseBalance(msg.sender, _value)) { + revert('ERR_TX_DECREASEBALANCE'); + } + if (!increaseBalance(_to, _value)) { + revert('ERR_TX_INCREASEBALANCE'); + } + period = actualPeriod(); + if (accountPeriod(_from) != period) { + saveAccountPeriod(_from, period); + } return true; } }