erc20-demurrage-token

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

commit 3471229ae6b5d26dbc70655045ea221882b55e98
parent 71e94b5afb960280221678392f13eb9b74a549b2
Author: nolash <dev@holbrook.no>
Date:   Fri,  4 Jun 2021 13:14:26 +0200

Refactor actual period

Diffstat:
Mpython/erc20_demurrage_token/token.py | 42++++++++++++++++++++++++++++++++++++++++++
Mpython/tests/test_basic.py | 1-
Mpython/tests/test_period.py | 112+++++++++++++++++++++++++++++++++++--------------------------------------------
3 files changed, 92 insertions(+), 63 deletions(-)

diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py @@ -152,10 +152,44 @@ class DemurrageToken(ERC20): return o + def redistributions(self, contract_address, idx, sender_address=ZERO_ADDRESS): + o = jsonrpc_template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('redistributions') + enc.typ(ABIContractType.UINT256) + enc.uint256(idx) + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + return o + + + def to_redistribution_period(self, contract_address, redistribution, sender_address=ZERO_ADDRESS): + o = jsonrpc_template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('toRedistributionPeriod') + enc.typ(ABIContractType.BYTES32) + enc.bytes32(redistribution) + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + return o + + def apply_demurrage(self, contract_address, sender_address): return self.transact_noarg('applyDemurrage', contract_address, sender_address) + def change_period(self, contract_address, sender_address): + return self.transact_noarg('changePeriod', contract_address, sender_address) + + def actual_period(self, contract_address, sender_address=ZERO_ADDRESS): return self.call_noarg('actualPeriod', contract_address, sender_address=sender_address) @@ -179,4 +213,12 @@ class DemurrageToken(ERC20): def parse_to_base_amount(self, v): return abi_decode_single(ABIContractType.UINT256, v) + + def parse_redistributions(self, v): + return abi_decode_single(ABIContractType.BYTES32, v) + + + def parse_to_redistribution_period(self, v): + return abi_decode_single(ABIContractType.UINT256, v) + diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -9,7 +9,6 @@ import datetime from chainlib.eth.constant import ZERO_ADDRESS from chainlib.eth.nonce import RPCNonceOracle from chainlib.eth.tx import receipt -import eth_tester # local imports from erc20_demurrage_token import DemurrageToken diff --git a/python/tests/test_period.py b/python/tests/test_period.py @@ -4,76 +4,64 @@ import unittest import json import logging -# third-party imports -import web3 -import eth_tester -import eth_abi +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from tests.base import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() -logging.getLogger('web3').setLevel(logging.WARNING) -logging.getLogger('eth.vm').setLevel(logging.WARNING) - testdir = os.path.dirname(__file__) -#BLOCKTIME = 5 # seconds -TAX_LEVEL = 10000 * 2 # 2% -#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month -PERIOD = 1 - - -class Test(unittest.TestCase): - - contract = None - - def setUp(self): - eth_params = eth_tester.backends.pyevm.main.get_default_genesis_params({ - 'gas_limit': 9000000, - }) - - f = open(os.path.join(testdir, '../../solidity/RedistributedDemurrageToken.bin'), 'r') - self.bytecode = f.read() - f.close() - - f = open(os.path.join(testdir, '../../solidity/RedistributedDemurrageToken.json'), 'r') - self.abi = json.load(f) - f.close() - - backend = eth_tester.PyEVMBackend(eth_params) - self.eth_tester = eth_tester.EthereumTester(backend) - provider = web3.Web3.EthereumTesterProvider(self.eth_tester) - self.w3 = web3.Web3(provider) - self.sink_address = self.w3.eth.accounts[9] - - c = self.w3.eth.contract(abi=self.abi, bytecode=self.bytecode) - tx_hash = c.constructor('Foo Token', 'FOO', 6, TAX_LEVEL * (10 ** 32), PERIOD, self.sink_address).transact({'from': self.w3.eth.accounts[0]}) - - r = self.w3.eth.getTransactionReceipt(tx_hash) - self.contract = self.w3.eth.contract(abi=self.abi, address=r.contractAddress) - - self.start_block = self.w3.eth.blockNumber - b = self.w3.eth.getBlock(self.start_block) - self.start_time = b['timestamp'] - - - def tearDown(self): - pass - +class TestPeriod(TestDemurrageDefault): 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.time_travel(self.start_time + 61) - tx_hash = self.contract.functions.changePeriod().transact() - r = self.w3.eth.getTransactionReceipt(tx_hash) - self.assertEqual(r.status, 1) - - redistribution = self.contract.functions.redistributions(1).call() - self.assertEqual(2, self.contract.functions.toRedistributionPeriod(redistribution).call()) - self.assertEqual(2, self.contract.functions.actualPeriod().call()) + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + self.backend.time_travel(self.start_time + 61) + + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) + r = self.rpc.do(o) + redistribution = c.parse_redistributions(r) + + o = c.to_redistribution_period(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + period = c.parse_to_redistribution_period(r) + self.assertEqual(2, period) + + o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) + r = self.rpc.do(o) + redistribution = c.parse_redistributions(r) + + o = c.to_redistribution_period(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + period = c.parse_to_redistribution_period(r) + self.assertEqual(2, period) + + o = c.actual_period(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + period = c.parse_actual_period(r) + self.assertEqual(2, period) if __name__ == '__main__':