2021-02-02 11:26:44 +01:00
# standard imports
import os
import unittest
import json
import logging
2021-02-06 15:18:30 +01:00
import datetime
2021-02-02 11:26:44 +01:00
2021-06-04 09:05:08 +02:00
# external imports
from chainlib . eth . constant import ZERO_ADDRESS
from chainlib . eth . nonce import RPCNonceOracle
2021-06-04 09:24:05 +02:00
from chainlib . eth . tx import receipt
2021-06-07 12:08:04 +02:00
from chainlib . eth . block import (
block_latest ,
block_by_number ,
)
2021-02-05 09:44:15 +01:00
2021-06-04 09:05:08 +02:00
# local imports
from erc20_demurrage_token import DemurrageToken
2021-02-05 09:44:15 +01:00
2021-06-04 09:05:08 +02:00
# test imports
2021-07-05 10:26:39 +02:00
from erc20_demurrage_token . unittest . base import TestDemurrageDefault
2021-02-02 11:26:44 +01:00
2021-06-05 11:58:35 +02:00
logging . basicConfig ( level = logging . DEBUG )
2021-06-04 09:05:08 +02:00
logg = logging . getLogger ( )
2021-02-06 15:18:30 +01:00
2021-06-04 09:05:08 +02:00
testdir = os . path . dirname ( __file__ )
2021-02-02 11:26:44 +01:00
2021-06-04 09:05:08 +02:00
class TestBasic ( TestDemurrageDefault ) :
2021-02-02 11:26:44 +01:00
2021-11-15 14:45:46 +01:00
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 )
2022-03-02 10:01:50 +01:00
def test_apply_demurrage_limited ( 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 )
self . backend . time_travel ( self . start_time + 120 )
( tx_hash , o ) = c . apply_demurrage ( self . address , sender_address = self . accounts [ 0 ] , limit = 1 )
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
modifier = int ( modifier_base * ( 10 * * 22 ) ) # 38 decimal places minus 6 (1000000)
self . assertEqual ( modifier , demurrage_amount )
2021-11-15 14:45:46 +01:00
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
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
2022-03-02 10:01:50 +01:00
logg . warning ( ' mod base {} ' . format ( modifier_base ) )
2021-11-15 14:45:46 +01:00
modifier = int ( modifier_base * ( 10 * * 12 ) )
rounding_tolerance_nano = 4000000 # 0.000004% precision
2022-03-02 10:01:50 +01:00
demurrage_amount_truncate = int ( demurrage_amount / ( 10 * * 16 ) ) # equals 38 decimal places - 14 for the modifier magniture - 2 for percent int calc + 6 for token decimals <- TODO verify this calc
2021-11-15 14:45:46 +01:00
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 )
2021-06-08 11:16:56 +02:00
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 )
( tx_hash , o ) = c . mint_to ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 1024 )
self . rpc . do ( o )
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 . to_base_amount ( self . address , 1000 , sender_address = self . accounts [ 0 ] )
r = self . rpc . do ( o )
amount = c . parse_to_base_amount ( r )
self . assertEqual ( amount , 1020 )
2021-11-15 14:45:46 +01:00
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 )
2023-02-08 09:44:37 +01:00
def test_approve ( 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 . approve ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 500 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
( tx_hash , o ) = c . approve ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 600 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 0 )
( tx_hash , o ) = c . approve ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 0 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
( tx_hash , o ) = c . approve ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 600 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
( tx_hash , o ) = c . increase_allowance ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 200 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
( tx_hash , o ) = c . decrease_allowance ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 800 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
( tx_hash , o ) = c . approve ( self . address , self . accounts [ 0 ] , self . accounts [ 1 ] , 42 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 1 )
2021-11-15 14:45:46 +01:00
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 )
2021-02-05 09:22:36 +01:00
2023-02-08 09:44:37 +01:00
( tx_hash , o ) = c . transfer_from ( self . address , self . accounts [ 2 ] , self . accounts [ 1 ] , self . accounts [ 3 ] , 1 )
self . rpc . do ( o )
o = receipt ( tx_hash )
r = self . rpc . do ( o )
self . assertEqual ( r [ ' status ' ] , 0 )
2021-02-05 09:22:36 +01:00
2021-02-02 11:26:44 +01:00
if __name__ == ' __main__ ' :
unittest . main ( )