eth-erc20

ERC20 interface and example giftable token contract
Log | Files | Refs | LICENSE

commit 2fb7143956b8889fdc124a11e610911da4bc68d0
parent d1e5b84cfb4fedfb3193d5100844ae3b834433bc
Author: lash <dev@holbrook.no>
Date:   Thu, 29 Jun 2023 20:55:52 +0100

Add unittest for static token

Diffstat:
M.gitignore | 5+++--
Mpython/eth_erc20/unittest/base.py | 8++++----
Apython/static_token/__init__.py | 1+
Apython/static_token/data/__init__.py | 3+++
Apython/static_token/factory.py | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apython/static_token/unittest/__init__.py | 1+
Apython/static_token/unittest/base.py | 36++++++++++++++++++++++++++++++++++++
Apython/tests/test_static.py | 38++++++++++++++++++++++++++++++++++++++
8 files changed, 146 insertions(+), 6 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -5,4 +5,6 @@ build/ gmon.out *.egg-info .venv/ -.idea -\ No newline at end of file +.idea +solidity/*.json +solidity/*.bin diff --git a/python/eth_erc20/unittest/base.py b/python/eth_erc20/unittest/base.py @@ -12,7 +12,6 @@ from chainlib.eth.tx import ( from hexathon import strip_0x # local imports -from giftable_erc20_token.unittest import TestGiftableToken from eth_erc20 import ERC20 logging.basicConfig(level=logging.DEBUG) @@ -53,12 +52,13 @@ class TestInterface: self.assertEqual(self.symbol, symbol) - def test_transfer(self): + def test_direct_transfer(self): nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn) gas_oracle = OverrideGasOracle(limit=100000, conn=self.conn) c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) + (tx_hash, o) = c.transfer(self.address, self.accounts[0], self.accounts[1], 1000) - r = self.rpc.do(o) + self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) @@ -85,7 +85,7 @@ class TestInterface: gas_oracle = OverrideGasOracle(limit=100000, conn=self.conn) c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 1000) - r = self.rpc.do(o) + self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) diff --git a/python/static_token/__init__.py b/python/static_token/__init__.py @@ -0,0 +1 @@ +from .factory import * diff --git a/python/static_token/data/__init__.py b/python/static_token/data/__init__.py @@ -0,0 +1,3 @@ +import os + +data_dir = os.path.realpath(os.path.dirname(__file__)) diff --git a/python/static_token/factory.py b/python/static_token/factory.py @@ -0,0 +1,60 @@ +# standard imports +import os +import logging + +# external imports +from chainlib.eth.tx import ( + TxFactory, + TxFormat, + ) +from chainlib.hash import keccak256_string_to_hex +from chainlib.eth.contract import ( + ABIContractEncoder, + ABIContractType, + ) + +# local imports +from static_token.data import data_dir + +logg = logging.getLogger(__name__) + + +class StaticToken(TxFactory): + + __abi = None + __bytecode = None + + def constructor(self, sender_address, name, symbol, decimals, supply, tx_format=TxFormat.JSONRPC): + code = StaticToken.bytecode() + enc = ABIContractEncoder() + enc.string(name) + enc.string(symbol) + enc.uint256(decimals) + enc.uint256(supply) + code += enc.get() + tx = self.template(sender_address, None, use_nonce=True) + tx = self.set_code(tx, code) + return self.finalize(tx, tx_format) + + + @staticmethod + def gas(code=None): + return 2000000 + + + @staticmethod + def abi(): + if StaticToken.__abi == None: + f = open(os.path.join(data_dir, 'StaticToken.json'), 'r') + StaticToken.__abi = json.load(f) + f.close() + return StaticToken.__abi + + + @staticmethod + def bytecode(): + if StaticToken.__bytecode == None: + f = open(os.path.join(data_dir, 'StaticToken.bin')) + StaticToken.__bytecode = f.read() + f.close() + return StaticToken.__bytecode diff --git a/python/static_token/unittest/__init__.py b/python/static_token/unittest/__init__.py @@ -0,0 +1 @@ +from .base import TestStaticToken diff --git a/python/static_token/unittest/base.py b/python/static_token/unittest/base.py @@ -0,0 +1,36 @@ +# standard imports +import logging +import time + +# external imports +from chainlib.eth.unittest.ethtester import EthTesterCase +from chainlib.connection import RPCConnection +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.address import to_checksum_address + +# local imports +from static_token import StaticToken +from eth_erc20.unittest import TestInterface + +logg = logging.getLogger(__name__) + + +class TestStaticToken(EthTesterCase, TestInterface): + + def setUp(self): + super(TestStaticToken, self).setUp() + self.conn = RPCConnection.connect(self.chain_spec, 'default') + nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn) + c = StaticToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + self.symbol = 'FOO' + self.name = 'Foo Token' + self.decimals = 16 + self.initial_supply = 1 << 24 + (tx_hash, o) = c.constructor(self.accounts[0], self.name, self.symbol, self.decimals, self.initial_supply) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.address = to_checksum_address(r['contract_address']) + logg.debug('published statictoken on address {} with hash {}'.format(self.address, tx_hash)) diff --git a/python/tests/test_static.py b/python/tests/test_static.py @@ -0,0 +1,38 @@ +# standard imports +import os +import unittest +import json +import logging +import datetime + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) + +# local imports +from static_token import StaticToken +from static_token.unittest import TestStaticToken + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + + +class TestExpire(TestStaticToken): + + def setUp(self): + super(TestExpire, self).setUp() + + + def test_static_interface(self): + pass + + +if __name__ == '__main__': + unittest.main()