From cdb26b558fff26d5423ebc9a9ae759a2e2bee416 Mon Sep 17 00:00:00 2001 From: lash Date: Sat, 23 Apr 2022 07:09:48 +0000 Subject: [PATCH] Pass tests with new uniform filter constructor signature --- cic_sync_filter/__init__.py | 2 +- cic_sync_filter/base.py | 10 +++++- cic_sync_filter/callback.py | 14 ++------ cic_sync_filter/filter.py | 21 ----------- cic_sync_filter/gas.py | 6 ---- cic_sync_filter/register.py | 11 +++--- cic_sync_filter/straggler.py | 11 +++--- cic_sync_filter/token.py | 7 ---- cic_sync_filter/tx.py | 8 +---- setup.py | 1 + tests/test_bogus_filter.py | 19 ++++++---- tests/test_callback_filter.py | 2 +- tests/test_gas_filter.py | 4 ++- tests/test_register_filter.py | 64 +++++++++++++++++++++++++++++----- tests/test_straggler_filter.py | 11 ++++-- tests/test_token_filter.py | 9 +++-- tests/test_tx_filter.py | 3 +- 17 files changed, 115 insertions(+), 88 deletions(-) delete mode 100644 cic_sync_filter/filter.py diff --git a/cic_sync_filter/__init__.py b/cic_sync_filter/__init__.py index 1e78c9b..9b5ed21 100644 --- a/cic_sync_filter/__init__.py +++ b/cic_sync_filter/__init__.py @@ -1 +1 @@ -from .filter import * +from .base import * diff --git a/cic_sync_filter/base.py b/cic_sync_filter/base.py index 6d129e1..1d722a5 100644 --- a/cic_sync_filter/base.py +++ b/cic_sync_filter/base.py @@ -1,8 +1,16 @@ +# external imports +from chainlib.eth.constant import ZERO_ADDRESS + + class SyncFilter: - def __init__(self): + def __init__(self, chain_spec, registry, queue, caller_address=ZERO_ADDRESS): self.exec_count = 0 self.match_count = 0 + self.queue = queue + self.chain_spec = chain_spec + self.registry = registry + self.caller_address = caller_address def filter(self, conn, block, tx, db_session): diff --git a/cic_sync_filter/callback.py b/cic_sync_filter/callback.py index 31ec150..fdfef11 100644 --- a/cic_sync_filter/callback.py +++ b/cic_sync_filter/callback.py @@ -25,7 +25,7 @@ from cic_sync_filter.parse import ( parse_transferfrom, parse_giftto, ) -from cic_sync_filter import SyncFilter +from .base import SyncFilter logg = logging.getLogger(__name__) @@ -34,14 +34,6 @@ class CallbackFilter(SyncFilter): trusted_addresses = [] - def __init__(self, chain_spec, method, queue, caller_address=ZERO_ADDRESS): - super(CallbackFilter, self).__init__() - self.queue = queue - self.method = method - self.chain_spec = chain_spec - self.caller_address = caller_address - - def call_back(self, transfer_type, result): result['chain_spec'] = result['chain_spec'].asdict() s = celery.signature( @@ -88,8 +80,8 @@ class CallbackFilter(SyncFilter): return (transfer_type, transfer_data) - def filter(self, conn, block, tx): - super(CallbackFilter, self).filter(conn, block, tx) + def filter(self, conn, block, tx, db_session=None): + super(CallbackFilter, self).filter(conn, block, tx, db_session) transfer_data = None transfer_type = None try: diff --git a/cic_sync_filter/filter.py b/cic_sync_filter/filter.py deleted file mode 100644 index a5db482..0000000 --- a/cic_sync_filter/filter.py +++ /dev/null @@ -1,21 +0,0 @@ -# external imports -from chainsyncer.filter import SyncFilter as BaseSyncFilter - - -class SyncFilter(BaseSyncFilter): - - def __init__(self): - self.exec_count = 0 - self.match_count = 0 - - - def filter(self, conn, block, tx): - self.exec_count += 1 - - - def register_match(self): - self.match_count += 1 - - - def to_logline(self, block, tx, v): - return '{} exec {} match {} block {} tx {}: {}'.format(self, self.exec_count, self.match_count, block.number, tx.index, v) diff --git a/cic_sync_filter/gas.py b/cic_sync_filter/gas.py index d672b79..7716c96 100644 --- a/cic_sync_filter/gas.py +++ b/cic_sync_filter/gas.py @@ -24,12 +24,6 @@ logg = logging.getLogger() class GasFilter(SyncFilter): - def __init__(self, chain_spec, queue=None): - super(GasFilter, self).__init__() - self.queue = queue - self.chain_spec = chain_spec - - def filter(self, conn, block, tx, db_session): super(GasFilter, self).filter(conn, block, tx, db_session) if tx.value > 0 or len(tx.payload) == 0: diff --git a/cic_sync_filter/register.py b/cic_sync_filter/register.py index 72c2a10..a86da6c 100644 --- a/cic_sync_filter/register.py +++ b/cic_sync_filter/register.py @@ -1,8 +1,9 @@ # standard imports import logging -# third-party imports +# external imports import celery +from chainlib.eth.constant import ZERO_ADDRESS from chainlib.eth.address import to_checksum_address from hexathon import ( add_0x, @@ -19,11 +20,9 @@ account_registry_add_log_hash = '0x9cc987676e7d63379f176ea50df0ae8d2d9d1141d1231 class RegistrationFilter(SyncFilter): - def __init__(self, chain_spec, contract_address, queue=None): - super(RegistrationFilter, self).__init__() - self.chain_spec = chain_spec - self.queue = queue - self.contract_address = contract_address + def __init__(self, chain_spec, registry, queue, caller_address=ZERO_ADDRESS): + super(RegistrationFilter, self).__init__(chain_spec, registry, queue, caller_address=caller_address) + self.contract_address = registry.by_name('AccountRegistry', sender_address=caller_address) def filter(self, conn, block, tx, db_session=None): diff --git a/cic_sync_filter/straggler.py b/cic_sync_filter/straggler.py index 05ed953..80218ad 100644 --- a/cic_sync_filter/straggler.py +++ b/cic_sync_filter/straggler.py @@ -13,16 +13,15 @@ from chainlib.eth.gas import balance from chainqueue.sql.query import get_tx_cache from chainqueue.enum import StatusBits +# local imports +from .base import SyncFilter + logg = logging.getLogger() -class StragglerFilter: - - def __init__(self, chain_spec, gas_balance_threshold, queue='cic-eth'): - self.chain_spec = chain_spec - self.queue = queue - self.gas_balance_threshold = gas_balance_threshold +class StragglerFilter(SyncFilter): + gas_balance_threshold = 0 def filter(self, conn, block, tx, db_session=None): txc = get_tx_cache(self.chain_spec, tx.hash, session=db_session) diff --git a/cic_sync_filter/token.py b/cic_sync_filter/token.py index 3750e38..e72b439 100644 --- a/cic_sync_filter/token.py +++ b/cic_sync_filter/token.py @@ -24,13 +24,6 @@ logg = logging.getLogger(__name__) class TokenFilter(SyncFilter): - def __init__(self, chain_spec, queue, call_address=ZERO_ADDRESS): - super(TokenFilter, self).__init__() - self.queue = queue - self.chain_spec = chain_spec - self.caller_address = call_address - - def filter(self, conn, block, tx, db_session=None): super(TokenFilter, self).filter(conn, block, tx, db_session) if not tx.payload: diff --git a/cic_sync_filter/tx.py b/cic_sync_filter/tx.py index 72b7b61..07b5959 100644 --- a/cic_sync_filter/tx.py +++ b/cic_sync_filter/tx.py @@ -18,14 +18,8 @@ logg = logging.getLogger(__name__) class TxFilter(SyncFilter): - def __init__(self, chain_spec, queue): - super(TxFilter, self).__init__() - self.queue = queue - self.chain_spec = chain_spec - - def filter(self, conn, block, tx, db_session=None): - super(TxFilter, self).filter(conn, block, tx, db_session) + super(TxFilter, self).filter(conn, block, tx, db_session=db_session) try: get_tx_local(self.chain_spec, tx.hash) diff --git a/setup.py b/setup.py index bc71993..85a1043 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,7 @@ f.close() setup( + include_package_data=True, install_requires=requirements, tests_require=test_requirements, ) diff --git a/tests/test_bogus_filter.py b/tests/test_bogus_filter.py index 648180b..dacf479 100644 --- a/tests/test_bogus_filter.py +++ b/tests/test_bogus_filter.py @@ -1,3 +1,6 @@ +# external imports +from cic_eth_registry import CICRegistry + # local imports from cic_sync_filter.gas import GasFilter from cic_sync_filter.transferauth import TransferAuthFilter @@ -21,13 +24,17 @@ def test_filter_bogus( account_registry, ): + queue = None + + registry = CICRegistry(default_chain_spec, eth_rpc) + fltrs = [ - TransferAuthFilter(cic_registry, default_chain_spec, eth_rpc, call_address=contract_roles['CONTRACT_DEPLOYER']), - GasFilter(default_chain_spec, queue=None), - TxFilter(default_chain_spec, None), - CallbackFilter(default_chain_spec, None, None, caller_address=contract_roles['CONTRACT_DEPLOYER']), - StragglerFilter(default_chain_spec, None), - RegistrationFilter(default_chain_spec, account_registry, queue=None), + #TransferAuthFilter(registry, default_chain_spec, eth_rpc, call_address=contract_roles['CONTRACT_DEPLOYER']), + GasFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']), + TxFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']), + CallbackFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']), + StragglerFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']), + RegistrationFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']), ] for fltr in fltrs: diff --git a/tests/test_callback_filter.py b/tests/test_callback_filter.py index 8c1b9b7..131dc81 100644 --- a/tests/test_callback_filter.py +++ b/tests/test_callback_filter.py @@ -229,7 +229,7 @@ def test_callback_filter_filter( mock = CallbackMock() fltr.call_back = mock.call_back - fltr.filter(eth_rpc, mockblock, tx) #, init_database) + fltr.filter(eth_rpc, mockblock, tx) assert mock.results.get('transfer') != None assert mock.results['transfer']['destination_token'] == strip_0x(foo_token) diff --git a/tests/test_gas_filter.py b/tests/test_gas_filter.py index 8b3722a..7384c30 100644 --- a/tests/test_gas_filter.py +++ b/tests/test_gas_filter.py @@ -41,6 +41,7 @@ def test_filter_gas( eth_signer, agent_roles, celery_session_worker, + contract_roles, ): rpc = RPCConnection.connect(default_chain_spec, 'default') @@ -87,7 +88,8 @@ def test_filter_gas( ) init_database.commit() - fltr = GasFilter(default_chain_spec, queue=None) + queue = None + fltr = GasFilter(default_chain_spec, None, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']) o = block_latest() r = eth_rpc.do(o) diff --git a/tests/test_register_filter.py b/tests/test_register_filter.py index cfc8419..707fadc 100644 --- a/tests/test_register_filter.py +++ b/tests/test_register_filter.py @@ -6,11 +6,15 @@ import os from eth_accounts_index.registry import AccountRegistry from chainlib.connection import RPCConnection from chainlib.eth.nonce import RPCNonceOracle -from chainlib.eth.gas import OverrideGasOracle +from chainlib.eth.gas import ( + OverrideGasOracle, + Gas, + ) from chainlib.eth.tx import( receipt, unpack, Tx, + TxFormat, ) from chainlib.eth.block import ( block_latest, @@ -26,6 +30,7 @@ from hexathon import ( add_0x, ) from cic_eth.queue.query import get_account_tx_local +from cic_eth_registry import CICRegistry # local imports from cic_sync_filter.register import RegistrationFilter @@ -72,14 +77,11 @@ def test_register_filter( tx = Tx(tx_src, block=block, rcpt=rcpt) tx.apply_receipt(rcpt) - fltr = RegistrationFilter(default_chain_spec, to_checksum_address(os.urandom(20).hex()), queue=None) + registry = CICRegistry(default_chain_spec, eth_rpc) + queue = None + fltr = RegistrationFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']) t = fltr.filter(eth_rpc, block, tx, db_session=init_database) - assert t == None - - fltr = RegistrationFilter(default_chain_spec, to_checksum_address(account_registry), queue=None) - t = fltr.filter(eth_rpc, block, tx, db_session=init_database) - logg.debug('t {}'.format(t)) - + assert t != None t.get_leaf() assert t.successful() @@ -93,3 +95,49 @@ def test_register_filter( gift = Faucet.parse_give_to_request(gift_tx['data']) assert add_0x(gift[0]) == agent_roles['ALICE'] + + +def test_register_filter_nomatch( + default_chain_spec, + init_database, + eth_rpc, + eth_signer, + account_registry, + faucet, + register_lookups, + contract_roles, + agent_roles, + cic_registry, + init_celery_tasks, + celery_session_worker, + caplog, + ): + + nonce_oracle = RPCNonceOracle(contract_roles['ACCOUNT_REGISTRY_WRITER'], conn=eth_rpc) + gas_oracle = OverrideGasOracle(limit=AccountRegistry.gas(), conn=eth_rpc) + + c = Gas(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) + (tx_hash_hex, o) = c.create(agent_roles['ALICE'], agent_roles['BOB'], 100 * (10 ** 6)) + r = eth_rpc.do(o) + tx_signed_raw_bytes = bytes.fromhex(strip_0x(o['params'][0])) + + o = receipt(tx_hash_hex) + rcpt = eth_rpc.do(o) + assert rcpt['status'] == 1 + + o = block_latest() + r = eth_rpc.do(o) + o = block_by_number(r, include_tx=False) + r = eth_rpc.do(o) + block = Block(r) + block.txs = [tx_hash_hex] + + tx_src = unpack(tx_signed_raw_bytes, default_chain_spec) + tx = Tx(tx_src, block=block, rcpt=rcpt) + tx.apply_receipt(rcpt) + + registry = CICRegistry(default_chain_spec, eth_rpc) + queue = None + fltr = RegistrationFilter(default_chain_spec, registry, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']) + t = fltr.filter(eth_rpc, block, tx, db_session=init_database) + assert t == None diff --git a/tests/test_straggler_filter.py b/tests/test_straggler_filter.py index 9049978..c252170 100644 --- a/tests/test_straggler_filter.py +++ b/tests/test_straggler_filter.py @@ -2,6 +2,7 @@ import logging # external imports +import pytest from chainlib.connection import RPCConnection from chainlib.eth.nonce import ( OverrideNonceOracle, @@ -31,6 +32,7 @@ from chainqueue.sql.state import ( set_sent, set_waitforgas, ) +from cic_eth.error import OutOfGasError from hexathon import ( strip_0x, @@ -55,6 +57,7 @@ def test_straggler_tx( eth_signer, agent_roles, celery_session_worker, + contract_roles, ): rpc = RPCConnection.connect(default_chain_spec, 'default') @@ -80,7 +83,8 @@ def test_straggler_tx( set_reserved(default_chain_spec, tx_hash_hex, session=init_database) set_sent(default_chain_spec, tx_hash_hex, session=init_database) - fltr = StragglerFilter(default_chain_spec, 0, queue=None) + queue = None + fltr = StragglerFilter(default_chain_spec, None, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']) o = block_latest() r = eth_rpc.do(o) @@ -117,6 +121,7 @@ def test_waitforgas_tx( agent_roles, celery_session_worker, whoever, + contract_roles, ): safe_gas = 1000000000000000000 @@ -143,7 +148,9 @@ def test_waitforgas_tx( set_ready(default_chain_spec, tx_hash_hex, session=init_database) set_waitforgas(default_chain_spec, tx_hash_hex, session=init_database) - fltr = StragglerFilter(default_chain_spec, safe_gas, queue=None) + queue = None + StragglerFilter.gas_balance_threshold = safe_gas + fltr = StragglerFilter(default_chain_spec, None, queue, caller_address=contract_roles['CONTRACT_DEPLOYER']) o = block_latest() r = eth_rpc.do(o) diff --git a/tests/test_token_filter.py b/tests/test_token_filter.py index 733500e..56c9b96 100644 --- a/tests/test_token_filter.py +++ b/tests/test_token_filter.py @@ -26,6 +26,7 @@ from eth_token_index import TokenUniqueSymbolIndex from cic_eth_registry.error import UnknownContractError from cic_eth.db.models.gas_cache import GasCache from cic_eth.db.models.base import SessionBase +from cic_eth_registry import CICRegistry # local imports from cic_sync_filter.token import TokenFilter @@ -58,7 +59,8 @@ def test_filter_gas( rcpt = eth_rpc.do(o) assert rcpt['status'] == 1 - fltr = TokenFilter(default_chain_spec, queue=None, call_address=agent_roles['ALICE']) + registry = CICRegistry(default_chain_spec, eth_rpc) + fltr = TokenFilter(default_chain_spec, registry, queue=None, caller_address=agent_roles['ALICE']) o = block_latest() r = eth_rpc.do(o) @@ -119,8 +121,9 @@ def test_filter_unknown_contract_error( gas_oracle = OverrideGasOracle(price=1000000000, limit=1000000) c = ERC20(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) (tx_hash_hex, tx_signed_raw_hex) = c.transfer(foo_token, token_roles['FOO_TOKEN_OWNER'], agent_roles['ALICE'], 100, tx_format=TxFormat.RLP_SIGNED) - - fltr = TokenFilter(default_chain_spec, queue=None, call_address=agent_roles['ALICE']) + + registry = CICRegistry(default_chain_spec, eth_rpc) + fltr = TokenFilter(default_chain_spec, registry, queue=None, caller_address=agent_roles['ALICE']) tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex)) tx_src = unpack(tx_signed_raw_bytes, default_chain_spec) tx = Tx(tx_src) diff --git a/tests/test_tx_filter.py b/tests/test_tx_filter.py index 1a4a5d9..339f66b 100644 --- a/tests/test_tx_filter.py +++ b/tests/test_tx_filter.py @@ -84,7 +84,8 @@ def test_filter_tx( set_reserved(default_chain_spec, tx_hash_hex, session=init_database) set_sent(default_chain_spec, tx_hash_hex, session=init_database) - fltr = TxFilter(default_chain_spec, None) + queue = None + fltr = TxFilter(default_chain_spec, None, queue) o = block_latest() r = eth_rpc.do(o)