erc20-demurrage-token

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

commit 025ef614a59b58d8aa04768785ae6af48f518f40
parent 43b3d2b488058f1636955f5e6d1ae0ffeea64214
Author: nolash <dev@holbrook.no>
Date:   Mon, 15 Nov 2021 14:45:46 +0100

WIP test rehabilitations

Diffstat:
Mpython/erc20_demurrage_token/runnable/deploy.py | 4++--
Mpython/erc20_demurrage_token/sim/sim.py | 4++--
Mpython/requirements.txt | 6+++---
Mpython/setup.cfg | 2+-
Mpython/tests/test_basic.py | 490++++++++++++++++++++++++++++++++++++++++----------------------------------------
5 files changed, 253 insertions(+), 253 deletions(-)

diff --git a/python/erc20_demurrage_token/runnable/deploy.py b/python/erc20_demurrage_token/runnable/deploy.py @@ -14,8 +14,8 @@ import logging # external imports import confini -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer -from crypto_dev_signer.keystore.dict import DictKeystore +from funga.eth.signer import EIP155Signer +from funga.eth.keystore.dict import DictKeystore from chainlib.chain import ChainSpec from chainlib.eth.nonce import ( RPCNonceOracle, diff --git a/python/erc20_demurrage_token/sim/sim.py b/python/erc20_demurrage_token/sim/sim.py @@ -20,8 +20,8 @@ from chainlib.eth.block import ( block_by_number, block_by_hash, ) -from crypto_dev_signer.keystore.dict import DictKeystore -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer +from funga.eth.keystore.dict import DictKeystore +from funga.eth.signer import EIP155Signer from hexathon import ( strip_0x, add_0x, diff --git a/python/requirements.txt b/python/requirements.txt @@ -1,3 +1,3 @@ -chainlib>=0.0.9a3,<=0.1.0 -eth-erc20>=0.1.2a1,<0.2.0 -crypto-dev-signer>=0.4.15a1,<=0.4.15 +chainlib-eth~=0.0.12 +eth-erc20~=0.1.2 +funga-eth~=0.5.1a1 diff --git a/python/setup.cfg b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.0.5a2 +version = 0.0.5a4 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -28,179 +28,179 @@ testdir = os.path.dirname(__file__) class TestBasic(TestDemurrageDefault): -# def test_hello(self): -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# o = c.actual_period(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# -# self.backend.time_travel(self.start_time + self.period_seconds + 1) -# o = c.actual_period(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# -# -# def test_balance(self): -# 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) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 1024) -# -# -# def test_apply_demurrage(self): -# modifier = (10 ** 38) -# -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# -# o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage_amount = c.parse_demurrage_amount(r) -# self.assertEqual(modifier, demurrage_amount) -# -# o = block_latest() -# r = self.rpc.do(o) -# o = block_by_number(r) -# b = self.rpc.do(o) -# logg.debug('block {} start {}'.format(b['timestamp'], self.start_time)) -# -# self.backend.time_travel(self.start_time + 2) -# (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage_amount = c.parse_demurrage_amount(r) -# self.assertEqual(modifier, demurrage_amount) -# -# self.backend.time_travel(self.start_time + 61) -# (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage_amount = c.parse_demurrage_amount(r) -# modifier_base = 1000000 - self.tax_level -# logg.debug('modifier base {}'.format(modifier_base)) -# modifier = int(modifier_base * (10 ** 32)) # 38 decimal places minus 6 (1000000) -# self.assertEqual(modifier, demurrage_amount) -# -# self.backend.time_travel(self.start_time + 601) -# (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage_amount = c.parse_demurrage_amount(r) -# modifier_base = ((1000000 - self.tax_level) / 1000000) ** 10 -# modifier = int(modifier_base * (10 ** 12)) -# -# rounding_tolerance_nano = 4000000 # 0.000004% precision -# demurrage_amount_truncate = int(demurrage_amount / (10 ** 26)) # equals 12 decimal places -# self.assertGreaterEqual(modifier, demurrage_amount_truncate - rounding_tolerance_nano) -# self.assertLessEqual(modifier, demurrage_amount_truncate) -# -# -# def test_mint(self): -# 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) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 1024) -# -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 976) -# r = self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 2000) -# -# -# self.backend.time_travel(self.start_time + 61) -# (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, int(2000 * 0.98)) -# -# -# def test_minter_control(self): -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# -# (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 0) -# -# (tx_hash, o) = c.add_minter(self.address, self.accounts[1], self.accounts[1]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 0) -# -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.accounts[1]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# (tx_hash, o) = c.add_minter(self.address, self.accounts[1], self.accounts[2]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 0) -# -# (tx_hash, o) = c.remove_minter(self.address, self.accounts[1], self.accounts[1]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 0) -# -# + def test_hello(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + o = c.actual_period(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + + self.backend.time_travel(self.start_time + self.period_seconds + 1) + o = c.actual_period(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + + + def test_balance(self): + 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) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 1024) + + + def test_apply_demurrage(self): + modifier = (10 ** 28) + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_amount = c.parse_demurrage_amount(r) + self.assertEqual(modifier, demurrage_amount) + + o = block_latest() + r = self.rpc.do(o) + o = block_by_number(r) + b = self.rpc.do(o) + logg.debug('block {} start {}'.format(b['timestamp'], self.start_time)) + + self.backend.time_travel(self.start_time + 2) + (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_amount = c.parse_demurrage_amount(r) + self.assertEqual(modifier, demurrage_amount) + + self.backend.time_travel(self.start_time + 61) + (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_amount = c.parse_demurrage_amount(r) + modifier_base = 1000000 - self.tax_level + logg.debug('modifier base {}'.format(modifier_base)) + modifier = int(modifier_base * (10 ** 22)) # 38 decimal places minus 6 (1000000) + self.assertEqual(modifier, demurrage_amount) + + self.backend.time_travel(self.start_time + 601) + (tx_hash, o) = c.apply_demurrage(self.address, sender_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.demurrage_amount(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_amount = c.parse_demurrage_amount(r) + modifier_base = ((1000000 - self.tax_level) / 1000000) ** 10 + modifier = int(modifier_base * (10 ** 12)) + + rounding_tolerance_nano = 4000000 # 0.000004% precision + demurrage_amount_truncate = int(demurrage_amount / (10 ** 26)) # equals 12 decimal places + self.assertGreaterEqual(modifier, demurrage_amount_truncate - rounding_tolerance_nano) + self.assertLessEqual(modifier, demurrage_amount_truncate) + + + def test_mint(self): + 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) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 1024) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 976) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 2000) + + + self.backend.time_travel(self.start_time + 61) + (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, int(2000 * 0.98)) + + + def test_minter_control(self): + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + (tx_hash, o) = c.add_minter(self.address, self.accounts[1], self.accounts[1]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.accounts[1]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.add_minter(self.address, self.accounts[1], self.accounts[2]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + (tx_hash, o) = c.remove_minter(self.address, self.accounts[1], self.accounts[1]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[2], 1024) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + def test_base_amount(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -216,78 +216,78 @@ class TestBasic(TestDemurrageDefault): amount = c.parse_to_base_amount(r) self.assertEqual(amount, 1020) -# -# def test_transfer(self): -# 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) -# self.rpc.do(o) -# -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[1], self.accounts[2], 500) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 524) -# -# o = c.balance_of(self.address, self.accounts[2], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 500) -# -# nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[2], self.accounts[1], 500) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# -# -# def test_transfer_from(self): -# 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) -# self.rpc.do(o) -# -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.approve(self.address, self.accounts[1], self.accounts[2], 500) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 1024) -# -# nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer_from(self.address, self.accounts[2], self.accounts[1], self.accounts[3], 500) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 524) -# -# o = c.balance_of(self.address, self.accounts[3], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, 500) + + def test_transfer(self): + 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) + self.rpc.do(o) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.accounts[1], self.accounts[2], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 524) + + o = c.balance_of(self.address, self.accounts[2], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 500) + + nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.accounts[2], self.accounts[1], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + + + def test_transfer_from(self): + 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) + self.rpc.do(o) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[1], self.accounts[2], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 1024) + + nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer_from(self.address, self.accounts[2], self.accounts[1], self.accounts[3], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 524) + + o = c.balance_of(self.address, self.accounts[3], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance_of(r) + self.assertEqual(balance, 500) if __name__ == '__main__':