chainlib-eth

Ethereum implementation of the chainlib interface
Log | Files | Refs | README | LICENSE

commit 78320715121cb48bd7170b133e52c95625fef98c
parent 5cfb6a7dda1cbcf9fa92268674afd7d9ec1dcc35
Author: nolash <dev@holbrook.no>
Date:   Tue, 21 Dec 2021 14:52:35 +0000

Merge branch 'lash/funga'

Diffstat:
MCHANGELOG | 4+++-
Mchainlib/eth/address.py | 2+-
Mchainlib/eth/block.py | 14++++++++++++++
Mchainlib/eth/cli/encode.py | 14++++++++++++++
Mchainlib/eth/cli/rpc.py | 1+
Mchainlib/eth/cli/wallet.py | 5+++--
Mchainlib/eth/connection.py | 16+++++++++++-----
Mchainlib/eth/data/config/config.ini | 4++--
Mchainlib/eth/gas.py | 4++--
Mchainlib/eth/nonce.py | 2+-
Mchainlib/eth/pytest/fixtures_ethtester.py | 4++--
Mchainlib/eth/pytest/fixtures_signer.py | 1-
Mchainlib/eth/runnable/balance.py | 2+-
Mchainlib/eth/runnable/count.py | 6+++---
Mchainlib/eth/runnable/encode.py | 13++++++-------
Mchainlib/eth/runnable/gas.py | 15+++++++++++----
Mchainlib/eth/runnable/get.py | 3++-
Mchainlib/eth/runnable/info.py | 76+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mchainlib/eth/runnable/raw.py | 4++--
Achainlib/eth/runnable/wait.py | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mchainlib/eth/tx.py | 10+++++++---
Mchainlib/eth/unittest/base.py | 10++++++++--
Mchainlib/eth/unittest/ethtester.py | 4++--
Mrequirements.txt | 10+++++-----
Msetup.cfg | 5++++-
Mtest_requirements.txt | 1+
Mtests/test_sign.py | 8++++----
27 files changed, 281 insertions(+), 71 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG @@ -1,3 +1,5 @@ -- 0.0.5-pending +- 0.0.15: + * Correct inverted addess checksum check for gas cli +- 0.0.5-unreleased: * Receive all ethereum components from chainlib package * Make settings configurable diff --git a/chainlib/eth/address.py b/chainlib/eth/address.py @@ -4,7 +4,7 @@ from hexathon import ( strip_0x, uniform, ) -from crypto_dev_signer.encoding import ( +from funga.eth.encoding import ( is_address, is_checksum_address, to_checksum_address, diff --git a/chainlib/eth/block.py b/chainlib/eth/block.py @@ -60,6 +60,20 @@ def transaction_count(block_hash, id_generator=None): return j.finalize(o) +def syncing(id_generator=None): + """Request the syncing state of the node + + :param id_generator: JSONRPC id generator + :type id_generator: JSONRPCIdGenerator + :rtype: dict + :returns: rpc query object + """ + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_syncing' + return j.finalize(o) + + class Block(BaseBlock): """Encapsulates an Ethereum block diff --git a/chainlib/eth/cli/encode.py b/chainlib/eth/cli/encode.py @@ -16,10 +16,12 @@ class CLIEncoder(ABIContractEncoder): __re_uint = r'^([uU])[int]*([0-9]+)?$' __re_bytes = r'^([bB])[ytes]*([0-9]+)?$' __re_string = r'^([sS])[tring]*$' + __re_address = r'^([aA])[ddress]*?$' __translations = [ 'to_uint', 'to_bytes', 'to_string', + 'to_address', ] def __init__(self, signature=None): @@ -58,6 +60,18 @@ class CLIEncoder(ABIContractEncoder): return (s, a) + def to_address(self, typ): + s = None + a = None + m = re.match(self.__re_address, typ) + if m == None: + return None + + s = 'ADDRESS' + a = getattr(ABIContractType, s) + return (s, a) + + def to_string(self, typ): m = re.match(self.__re_string, typ) if m == None: diff --git a/chainlib/eth/cli/rpc.py b/chainlib/eth/cli/rpc.py @@ -13,6 +13,7 @@ from chainlib.eth.nonce import ( ) +# TODO: how is the keystore implemented in rpc here? class Rpc(BaseRpc): """Convenience constructor to set Ethereum defaults for chainlib cli Rpc object diff --git a/chainlib/eth/cli/wallet.py b/chainlib/eth/cli/wallet.py @@ -1,5 +1,6 @@ # external imports -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer +from funga.eth.signer import EIP155Signer +from funga.eth.keystore.dict import DictKeystore from chainlib.cli import Wallet as BaseWallet # local imports @@ -13,7 +14,7 @@ class Wallet(BaseWallet): :type checksummer: Implementation of chainlib.eth.address.AddressChecksum """ def __init__(self, checksummer=AddressChecksum): - super(Wallet, self).__init__(EIP155Signer, checksummer=checksummer) + super(Wallet, self).__init__(EIP155Signer, checksummer=checksummer, keystore=DictKeystore()) diff --git a/chainlib/eth/connection.py b/chainlib/eth/connection.py @@ -36,6 +36,7 @@ from chainlib.jsonrpc import ( from chainlib.eth.tx import ( unpack, ) +from potaahto.symbols import snake_and_camel logg = logging.getLogger(__name__) @@ -88,11 +89,16 @@ class EthHTTPConnection(JSONRPCHTTPConnection): e = jsonrpc_result(r, error_parser) if e != None: - logg.debug('({}) poll receipt completed {}'.format(str(self), r)) - logg.debug('e {}'.format(strip_0x(e['status']))) - if strip_0x(e['status']) == '00': - raise RevertEthException(tx_hash_hex) - return e + e = snake_and_camel(e) + # In openethereum we encounter receipts that have NONE block hashes and numbers. WTF... + logg.debug('({}) poll receipt received {}'.format(str(self), r)) + if e['block_hash'] == None: + logg.warning('poll receipt attempt {} returned receipt but with a null block hash value!'.format(i)) + else: + logg.debug('e {}'.format(strip_0x(e['status']))) + if strip_0x(e['status']) == '00': + raise RevertEthException(tx_hash_hex) + return e if timeout > 0.0: delta = (datetime.datetime.utcnow() - t) + datetime.timedelta(seconds=delay) diff --git a/chainlib/eth/data/config/config.ini b/chainlib/eth/data/config/config.ini @@ -1,13 +1,13 @@ [rpc] -http_provider = http://localhost:8545 provider = http://localhost:8545 auth = credentials = dialect = default scheme = http +verify = 1 [chain] -spec = evm:ethereum:1 +spec = evm:berlin:1:ethereum [wallet] key_file = diff --git a/chainlib/eth/gas.py b/chainlib/eth/gas.py @@ -6,7 +6,7 @@ from hexathon import ( add_0x, strip_0x, ) -from crypto_dev_signer.eth.transaction import EIP155Transaction +from funga.eth.transaction import EIP155Transaction # local imports from chainlib.fee import FeeOracle @@ -55,7 +55,7 @@ def balance(address, id_generator=None, height=BlockSpec.LATEST): j = JSONRPCRequest(id_generator) o = j.template() o['method'] = 'eth_getBalance' - o['params'].append(address) + o['params'].append(add_0x(address)) height = to_blockheight_param(height) o['params'].append(height) return j.finalize(o) diff --git a/chainlib/eth/nonce.py b/chainlib/eth/nonce.py @@ -44,7 +44,7 @@ class NonceOracle(BaseNonceOracle): """ def __init__(self, address, id_generator=None): self.id_generator = id_generator - super(NonceOracle, self).__init__(address) + super(NonceOracle, self).__init__(add_0x(address)) def get_nonce(self): diff --git a/chainlib/eth/pytest/fixtures_ethtester.py b/chainlib/eth/pytest/fixtures_ethtester.py @@ -5,8 +5,8 @@ import logging # external imports import eth_tester import pytest -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 # local imports from chainlib.eth.unittest.base import * diff --git a/chainlib/eth/pytest/fixtures_signer.py b/chainlib/eth/pytest/fixtures_signer.py @@ -3,7 +3,6 @@ # external imports import pytest -#from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer @pytest.fixture(scope='function') diff --git a/chainlib/eth/runnable/balance.py b/chainlib/eth/runnable/balance.py @@ -24,7 +24,7 @@ from chainlib.eth.gas import ( balance, ) from chainlib.chain import ChainSpec -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer +from funga.eth.signer import EIP155Signer logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() diff --git a/chainlib/eth/runnable/count.py b/chainlib/eth/runnable/count.py @@ -15,8 +15,8 @@ from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import count from chainlib.chain import ChainSpec from chainlib.jsonrpc import IntSequenceGenerator -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 add_0x logging.basicConfig(level=logging.WARNING) @@ -43,7 +43,7 @@ conn = rpc.connect_by_config(config) def main(): # TODO: should tolerate if address not prefixed with 0x - o = count(holder_address, id_generator=rpc.id_generator) + o = count(add_0x(holder_address), id_generator=rpc.id_generator) r = conn.do(o) count_result = None try: diff --git a/chainlib/eth/runnable/encode.py b/chainlib/eth/runnable/encode.py @@ -13,8 +13,8 @@ import sha3 # external imports import chainlib.eth.cli from chainlib.eth.cli.encode import CLIEncoder -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 hexathon import ( add_0x, strip_0x, @@ -45,10 +45,7 @@ from chainlib.error import SignerMissingException from chainlib.chain import ChainSpec from chainlib.eth.runnable.util import decode_for_puny_humans from chainlib.eth.jsonrpc import to_blockheight_param -<<<<<<< HEAD from chainlib.eth.address import to_checksum_address -======= ->>>>>>> d6b258f2140f5ce555f765a90c14a65a5f3fc6de logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() @@ -58,12 +55,14 @@ config_dir = os.path.join(script_dir, '..', 'data', 'config') arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser.add_argument('--notx', action='store_true', help='Network send is not a transaction') argparser.add_argument('--signature', type=str, help='Method signature to encode') argparser.add_argument('contract_args', type=str, nargs='*', help='arguments to encode') args = argparser.parse_args() extra_args = { 'signature': None, 'contract_args': None, + 'notx': None, } config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_config_dir=config_dir) @@ -112,7 +111,7 @@ def main(): exec_address = add_0x(to_checksum_address(config.get('_EXEC_ADDRESS'))) - if signer == None: + if signer == None or config.true('_NOTX'): c = TxFactory(chain_spec) j = JSONRPCRequest(id_generator=rpc.id_generator) o = j.template() @@ -147,7 +146,7 @@ def main(): tx_format = TxFormat.RLP_SIGNED (tx_hash_hex, o) = c.finalize(tx, tx_format=tx_format) if send: - r = conn.do(r) + r = conn.do(o) print(r) else: if config.get('_RAW'): diff --git a/chainlib/eth/runnable/gas.py b/chainlib/eth/runnable/gas.py @@ -26,7 +26,10 @@ from chainlib.eth.gas import Gas from chainlib.eth.gas import balance as gas_balance from chainlib.chain import ChainSpec from chainlib.eth.runnable.util import decode_for_puny_humans -from chainlib.eth.address import is_same_address +from chainlib.eth.address import ( + is_same_address, + is_checksum_address, + ) import chainlib.eth.cli logging.basicConfig(level=logging.WARNING) @@ -63,8 +66,12 @@ send = config.true('_RPC_SEND') def balance(address, id_generator): o = gas_balance(address, id_generator=id_generator) r = conn.do(o) - hx = strip_0x(r) - return int(hx, 16) + try: + balance = int(r) + except ValueError: + balance = strip_0x(r) + balance = int(balance, 16) + return balance def main(): @@ -74,7 +81,7 @@ def main(): g = Gas(chain_spec, signer=signer, gas_oracle=rpc.get_gas_oracle(), nonce_oracle=rpc.get_nonce_oracle()) recipient = to_checksum_address(config.get('_RECIPIENT')) - if not config.true('_UNSAFE') and is_checksum_address(recipient): + if not config.true('_UNSAFE') and not is_checksum_address(recipient): raise ValueError('invalid checksum address') logg.info('gas transfer from {} to {} value {}'.format(signer_address, recipient, value)) diff --git a/chainlib/eth/runnable/get.py b/chainlib/eth/runnable/get.py @@ -63,6 +63,7 @@ item = add_0x(args.item) def get_transaction(conn, tx_hash, id_generator): + tx_hash = add_0x(tx_hash) j = JSONRPCRequest(id_generator=id_generator) o = j.template() o['method'] = 'eth_getTransactionByHash' @@ -97,13 +98,13 @@ def get_transaction(conn, tx_hash, id_generator): r = conn.do(o) block = Block(r) tx.apply_block(block) - logg.debug('foo {}'.format(tx_src)) tx.generate_wire(chain_spec) return tx def get_address(conn, address, id_generator, height): + address = add_0x(address) j = JSONRPCRequest(id_generator=id_generator) o = j.template() o['method'] = 'eth_getCode' diff --git a/chainlib/eth/runnable/info.py b/chainlib/eth/runnable/info.py @@ -16,7 +16,7 @@ from hexathon import ( even, ) import sha3 -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer +from funga.eth.signer import EIP155Signer # local imports from chainlib.eth.address import AddressChecksum @@ -24,6 +24,7 @@ from chainlib.eth.chain import network_id from chainlib.eth.block import ( block_latest, block_by_number, + syncing, Block, ) from chainlib.eth.tx import count @@ -43,21 +44,35 @@ logg = logging.getLogger() script_dir = os.path.dirname(os.path.realpath(__file__)) config_dir = os.path.join(script_dir, '..', 'data', 'config') +results_translation = { + 'network_id': 'Network Id', + 'block': 'Block', + 'syncing': 'Syncing', + 'gas_limit': 'Gas Limit', + 'gas_price': 'Gas Price', + 'block_time': 'Block time', + } + + arg_flags = chainlib.eth.cli.argflag_std_read argparser = chainlib.eth.cli.ArgumentParser(arg_flags) -argparser.add_positional('address', type=str, help='Address to retrieve info for', required=False) argparser.add_argument('--long', action='store_true', help='Calculate averages through sampling of blocks and txs') +argparser.add_argument('--local', action='store_true', help='Include local info') +argparser.add_positional('entry', required=False, help='Output single item') args = argparser.parse_args() -config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args={'long': None}, default_config_dir=config_dir) +extra_args = { + 'local': None, + 'long': None, + 'entry': None, + } +config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_config_dir=config_dir) -holder_address = args.address -wallet = chainlib.eth.cli.Wallet() -wallet.from_config(config) -if wallet.get_signer_address() == None and holder_address != None: - wallet.from_address(holder_address) +if config.get('_ENTRY') != None: + if config.get('_ENTRY') not in results_translation.keys(): + raise ValueError('Unknown entry {}'.format(config.get('_ENTRY'))) -rpc = chainlib.eth.cli.Rpc(wallet=wallet) +rpc = chainlib.eth.cli.Rpc() conn = rpc.connect_by_config(config) token_symbol = 'eth' @@ -68,12 +83,25 @@ human = not config.true('_RAW') longmode = config.true('_LONG') +def set_result(results, k, v, w=sys.stdout): + kt = results_translation[k] + if str(config.get('_ENTRY')) == k: + w.write('{}'.format(v)) + return True + logg.info('{}: {}\n'.format(kt, v)) + results[k] = v + return False + + def main(): + results = {} + o = network_id(id_generator=rpc.id_generator) r = conn.do(o) #if human: # n = format(n, ',') - sys.stdout.write('Network id: {}\n'.format(r)) + if set_result(results, 'network_id', r): + return o = block_latest(id_generator=rpc.id_generator) r = conn.do(o) @@ -81,7 +109,8 @@ def main(): first_block_number = n if human: n = format(n, ',') - sys.stdout.write('Block: {}\n'.format(n)) + if set_result(results, 'block', n): + return o = block_by_number(first_block_number, False, id_generator=rpc.id_generator) r = conn.do(o) @@ -107,22 +136,31 @@ def main(): if human: n = format(n, ',') - sys.stdout.write('Gaslimit: {}\n'.format(n)) - sys.stdout.write('Blocktime: {}\n'.format(aggr_time / BLOCK_SAMPLES)) + if set_result(results, 'gas_limit', n): + return + if set_result(results, 'block_time', aggr_time / BLOCK_SAMPLES): + return o = price(id_generator=rpc.id_generator) r = conn.do(o) n = int(r, 16) if human: n = format(n, ',') - sys.stdout.write('Gasprice: {}\n'.format(n)) + if set_result(results, 'gas_price', n): + return - if holder_address != None: - o = count(holder_address) + if config.get('_LOCAL'): + o = syncing() r = conn.do(o) - n = int(r, 16) - sys.stdout.write('Address: {}\n'.format(holder_address)) - sys.stdout.write('Nonce: {}\n'.format(n)) + if set_result(results, 'syncing', r): + return + + if config.get('_ENTRY') != None: + raise RuntimeError('entry {} ({}) not processed, please review the flag settings'.format(config.get('_ENTRY'), results_translation[config.get('_ENTRY')])) + + for k in results.keys(): + kt = results_translation[k] + sys.stdout.write('{}: {}\n'.format(kt, results[k])) if __name__ == '__main__': diff --git a/chainlib/eth/runnable/raw.py b/chainlib/eth/runnable/raw.py @@ -11,8 +11,8 @@ import urllib # external imports import chainlib.eth.cli -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 hexathon import ( add_0x, strip_0x, diff --git a/chainlib/eth/runnable/wait.py b/chainlib/eth/runnable/wait.py @@ -0,0 +1,114 @@ +# SPDX-License-Identifier: GPL-3.0-or-later + +# standard imports +import io +import sys +import os +import json +import argparse +import logging +import urllib + +# external imports +import chainlib.eth.cli +from funga.eth.signer import EIP155Signer +from funga.eth.keystore.dict import DictKeystore +from hexathon import ( + add_0x, + strip_0x, + uniform as hex_uniform, + ) + +# local imports +from chainlib.eth.address import to_checksum +from chainlib.eth.connection import EthHTTPConnection +from chainlib.jsonrpc import ( + JSONRPCRequest, + IntSequenceGenerator, + ) +from chainlib.eth.nonce import ( + RPCNonceOracle, + OverrideNonceOracle, + ) +from chainlib.eth.gas import ( + RPCGasOracle, + OverrideGasOracle, + ) +from chainlib.eth.tx import ( + TxFactory, + raw, + ) +from chainlib.eth.error import RevertEthException +from chainlib.chain import ChainSpec +from chainlib.eth.runnable.util import decode_for_puny_humans +from chainlib.eth.jsonrpc import to_blockheight_param + +logging.basicConfig(level=logging.WARNING) +logg = logging.getLogger() + +script_dir = os.path.dirname(os.path.realpath(__file__)) +config_dir = os.path.join(script_dir, '..', 'data', 'config') + +arg_flags = chainlib.eth.cli.argflag_std_read +argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser.add_argument('--ignore', type=str, action='append', default=[], help='Ignore error from the given transaction') +argparser.add_argument('--ignore-all', action='store_true', dest='ignore_all', help='Ignore errors from all transactions') +argparser.add_positional('hashes', append=True, type=str, help='Transaction hashes to wait for') +args = argparser.parse_args() +extra_args = { + 'ignore': None, + 'ignore_all': None, + 'hashes': None, + } +config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_config_dir=config_dir) + +rpc = chainlib.eth.cli.Rpc() +conn = rpc.connect_by_config(config) + +chain_spec = None +try: + chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) +except AttributeError: + pass + + +def main(): + + hashes_ready = [] + hashes_ignore = [] + + for hsh in config.get('_IGNORE'): + hashes_ignore.append(add_0x(hex_uniform(strip_0x(hsh)))) + + if len(config.get('_HASHES')) == 1: + try: + hsh = add_0x(hex_uniform(strip_0x(config.get('_HASHES')[0]))) + hashes_ready = [hsh] + except ValueError: + logg.debug('hash argument not a hash, will try it as a file name') + f = open(config.get('_HASHES')[0]) + for hsh in f: + logg.debug('hshs {}'.format(hsh)) + hashes_ready.append(add_0x(hex_uniform(strip_0x(hsh.rstrip())))) + f.close() + else: + for hsh in config.get('_HASHES'): + logg.debug('hsh {}'.format(hsh)) + hashes_ready.append(add_0x(hex_uniform(strip_0x(hsh)))) + + for hsh in hashes_ready: + logg.debug('processing transaction hash {}'.format(hsh)) + try: + r = conn.wait(hsh) + except RevertEthException: + if config.get('_IGNORE_ALL') or hsh in hashes_ignore: + logg.info('ignoring revert in transaction hash {}'.format(hsh)) + continue + sys.stderr.write('revert in transaction hash {}\n'.format(hsh)) + sys.exit(1) + + +if __name__ == '__main__': + main() + + diff --git a/chainlib/eth/tx.py b/chainlib/eth/tx.py @@ -13,9 +13,11 @@ from hexathon import ( ) from rlp import decode as rlp_decode from rlp import encode as rlp_encode -from crypto_dev_signer.eth.transaction import EIP155Transaction -from crypto_dev_signer.encoding import public_key_to_address -from crypto_dev_signer.eth.encoding import chain_id_to_v +from funga.eth.transaction import EIP155Transaction +from funga.eth.encoding import ( + public_key_to_address, + chain_id_to_v, + ) from potaahto.symbols import snake_and_camel from chainlib.hash import keccak256_hex_to_hex from chainlib.status import Status @@ -418,6 +420,8 @@ class TxFactory: return self.build(tx, id_generator=id_generator) elif tx_format == TxFormat.RLP_SIGNED: return self.build_raw(tx) + elif tx_format == TxFormat.RAW_ARGS: + return strip_0x(tx['data']) raise NotImplementedError('tx formatting {} not implemented'.format(tx_format)) diff --git a/chainlib/eth/unittest/base.py b/chainlib/eth/unittest/base.py @@ -23,9 +23,10 @@ from hexathon import ( add_0x, strip_0x, ) +from chainlib.eth.tx import receipt -from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer -from crypto_dev_signer.encoding import private_key_to_address +from funga.eth.signer import EIP155Signer +from funga.eth.encoding import private_key_to_address logg = logging.getLogger().getChild(__name__) @@ -81,6 +82,11 @@ class TestRPCConnection(RPCConnection): return jsonrpc_result(r, error_parser) + def wait(self, tx_hash_hex): + o = receipt(tx_hash_hex) + return self.do(o) + + def eth_blockNumber(self, p): block = self.backend.get_block_by_number('latest') return block['number'] diff --git a/chainlib/eth/unittest/ethtester.py b/chainlib/eth/unittest/ethtester.py @@ -5,8 +5,8 @@ import logging # external imports import eth_tester -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 hexathon import ( strip_0x, add_0x, diff --git a/requirements.txt b/requirements.txt @@ -1,7 +1,7 @@ -crypto-dev-signer>=0.4.15rc2,<=0.4.15 +funga-eth~=0.5.1 pysha3==1.0.2 -hexathon~=0.0.1a8 +hexathon~=0.1.0 websocket-client==0.57.0 -potaahto~=0.0.1a1 -chainlib==0.0.10a2 -confini>=0.4.1a1,<0.5.0 +potaahto~=0.1.0 +chainlib~=0.0.14 +confini~=0.5.2 diff --git a/setup.cfg b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = chainlib-eth -version = 0.0.9rc5 +version = 0.0.15 description = Ethereum implementation of the chainlib interface author = Louis Holbrook author_email = dev@holbrook.no @@ -14,6 +14,7 @@ classifiers = Programming Language :: Python :: 3 Operating System :: OS Independent Development Status :: 3 - Alpha + Topic :: Software Development :: Libraries Environment :: Console Intended Audience :: Developers License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) @@ -36,6 +37,7 @@ packages = [options.entry_points] console_scripts = + eth-count = chainlib.eth.runnable.count:main eth-balance = chainlib.eth.runnable.balance:main eth-checksum = chainlib.eth.runnable.checksum:main eth-gas = chainlib.eth.runnable.gas:main @@ -45,4 +47,5 @@ console_scripts = eth-encode = chainlib.eth.runnable.encode:main eth-info = chainlib.eth.runnable.info:main eth-nonce = chainlib.eth.runnable.count:main + eth-wait = chainlib.eth.runnable.wait:main eth = chainlib.eth.runnable.info:main diff --git a/test_requirements.txt b/test_requirements.txt @@ -2,3 +2,4 @@ eth_tester==0.5.0b3 py-evm==0.3.0a20 rlp==2.0.1 pytest==6.0.1 +coverage==5.5 diff --git a/tests/test_sign.py b/tests/test_sign.py @@ -7,9 +7,9 @@ import logging import json # external imports -from crypto_dev_signer.eth.transaction import EIP155Transaction -from crypto_dev_signer.eth.signer.defaultsigner import ReferenceSigner -from crypto_dev_signer.keystore.dict import DictKeystore +from funga.eth.transaction import EIP155Transaction +from funga.eth.signer.defaultsigner import EIP155Signer +from funga.eth.keystore.dict import DictKeystore # local imports import chainlib @@ -97,7 +97,7 @@ class TestSign(TestBase): logg.debug('alice {}'.format(alice)) logg.debug('bob {}'.format(bob)) - self.signer = ReferenceSigner(keystore) + self.signer = EIP155Signer(keystore) Mocket.signer = self.signer