diff --git a/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py b/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py index dc1bd778..23953229 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py @@ -50,7 +50,8 @@ class RegistrationFilter(SyncFilter): queue=self.queue, ) s_nonce.link(s_gift) - s_nonce.apply_async() + t = s_nonce.apply_async() + return t def __str__(self): diff --git a/apps/cic-eth/tests/conftest.py b/apps/cic-eth/tests/conftest.py index acac0433..169a6c71 100644 --- a/apps/cic-eth/tests/conftest.py +++ b/apps/cic-eth/tests/conftest.py @@ -21,6 +21,7 @@ from tests.fixtures_config import * from tests.fixtures_database import * from tests.fixtures_celery import * from tests.fixtures_role import * +from tests.fixtures_contract import * from chainlib.eth.pytest import * from eth_contract_registry.pytest import * from cic_eth_registry.pytest.fixtures_contracts import * @@ -80,3 +81,5 @@ def have_redis( return e return None + + diff --git a/apps/cic-eth/tests/filters/test_filter_bogus.py b/apps/cic-eth/tests/filters/test_filter_bogus.py new file mode 100644 index 00000000..30edbc70 --- /dev/null +++ b/apps/cic-eth/tests/filters/test_filter_bogus.py @@ -0,0 +1,38 @@ +# local imports +from cic_eth.runnable.daemons.filters.gas import GasFilter +from cic_eth.runnable.daemons.filters.transferauth import TransferAuthFilter +from cic_eth.runnable.daemons.filters.callback import CallbackFilter +from cic_eth.runnable.daemons.filters.straggler import StragglerFilter +from cic_eth.runnable.daemons.filters.tx import TxFilter +from cic_eth.runnable.daemons.filters.register import RegistrationFilter + + +# Hit tx mismatch paths on all filters +def test_filter_bogus( + init_database, + bogus_tx_block, + default_chain_spec, + eth_rpc, + eth_signer, + transfer_auth, + cic_registry, + contract_roles, + register_lookups, + ): + + 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, queue=None), + ] + + for fltr in fltrs: + r = None + try: + r = fltr.filter(eth_rpc, bogus_tx_block[0], bogus_tx_block[1], db_session=init_database) + except: + pass + assert not r diff --git a/apps/cic-eth/tests/filters/test_register_filter.py b/apps/cic-eth/tests/filters/test_register_filter.py new file mode 100644 index 00000000..9842bc00 --- /dev/null +++ b/apps/cic-eth/tests/filters/test_register_filter.py @@ -0,0 +1,78 @@ +# external imports +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.tx import( + receipt, + unpack, + Tx, + ) +from chainlib.eth.block import ( + block_latest, + block_by_number, + Block, + ) +from erc20_faucet import Faucet +from hexathon import strip_0x +from chainqueue.query import get_account_tx + +# local imports +from cic_eth.runnable.daemons.filters.register import RegistrationFilter + + +def test_register_filter( + 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 = AccountRegistry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle) + (tx_hash_hex, o) = c.add(account_registry, contract_roles['ACCOUNT_REGISTRY_WRITER'], agent_roles['ALICE']) + 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) + + fltr = RegistrationFilter(default_chain_spec, queue=None) + t = fltr.filter(eth_rpc, block, tx, db_session=init_database) + + t.get_leaf() + assert t.successful() + + gift_txs = get_account_tx(default_chain_spec.asdict(), agent_roles['ALICE'], as_sender=True, session=init_database) + ks = list(gift_txs.keys()) + assert len(ks) == 1 + + tx_raw_signed_hex = strip_0x(gift_txs[ks[0]]) + tx_raw_signed_bytes = bytes.fromhex(tx_raw_signed_hex) + gift_tx = unpack(tx_raw_signed_bytes, default_chain_spec) + + gift = Faucet.parse_give_to_request(gift_tx['data']) + assert gift[0] == agent_roles['ALICE'] diff --git a/apps/cic-eth/tests/filters/test_transferauth_filter.py b/apps/cic-eth/tests/filters/test_transferauth_filter.py index f1a9bcb0..25822b83 100644 --- a/apps/cic-eth/tests/filters/test_transferauth_filter.py +++ b/apps/cic-eth/tests/filters/test_transferauth_filter.py @@ -31,6 +31,7 @@ def test_filter_transferauth( transfer_auth, foo_token, celery_session_worker, + register_lookups, init_custodial, cic_registry, ): diff --git a/apps/cic-eth/tests/fixtures_contract.py b/apps/cic-eth/tests/fixtures_contract.py new file mode 100644 index 00000000..b09b551b --- /dev/null +++ b/apps/cic-eth/tests/fixtures_contract.py @@ -0,0 +1,77 @@ +# standard imports +import os + +# external imports +import pytest +from chainlib.eth.contract import ( + ABIContractEncoder, + ABIContractType, + ) +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.gas import OverrideGasOracle +from chainlib.eth.block import ( + block_latest, + block_by_number, + Block, + ) +from chainlib.eth.tx import ( + receipt, + TxFactory, + TxFormat, + unpack, + Tx, + ) +from hexathon import strip_0x + +script_dir = os.path.dirname(os.path.realpath(__file__)) +root_dir = os.path.dirname(script_dir) + + +@pytest.fixture(scope='function') +def bogus_tx_block( + default_chain_spec, + eth_rpc, + eth_signer, + contract_roles, + ): + + nonce_oracle = RPCNonceOracle(contract_roles['CONTRACT_DEPLOYER'], conn=eth_rpc) + gas_oracle = OverrideGasOracle(limit=2000000, conn=eth_rpc) + + f = open(os.path.join(script_dir, 'testdata', 'Bogus.bin'), 'r') + bytecode = f.read() + f.close() + + c = TxFactory(default_chain_spec, signer=eth_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) + tx = c.template(contract_roles['CONTRACT_DEPLOYER'], None, use_nonce=True) + tx = c.set_code(tx, bytecode) + (tx_hash_hex, o) = c.build(tx) + + r = eth_rpc.do(o) + + o = receipt(tx_hash_hex) + r = eth_rpc.do(o) + + contract_address = r['contract_address'] + + enc = ABIContractEncoder() + enc.method('poke') + data = enc.get() + tx = c.template(contract_roles['CONTRACT_DEPLOYER'], contract_address, use_nonce=True) + tx = c.set_code(tx, data) + (tx_hash_hex, o) = c.finalize(tx, TxFormat.JSONRPC) + r = eth_rpc.do(o) + tx_signed_raw_hex = strip_0x(o['params'][0]) + + 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_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, block=block) + + return (block, tx) diff --git a/apps/cic-eth/tests/task/test_task_account.py b/apps/cic-eth/tests/task/test_task_account.py index a384babb..d1c1c3d2 100644 --- a/apps/cic-eth/tests/task/test_task_account.py +++ b/apps/cic-eth/tests/task/test_task_account.py @@ -156,6 +156,7 @@ def test_gift( eth_signer, init_celery_tasks, cic_registry, + register_lookups, celery_session_worker, ): diff --git a/apps/cic-eth/tests/testdata/Bogus.bin b/apps/cic-eth/tests/testdata/Bogus.bin new file mode 100644 index 00000000..eacfe1b4 --- /dev/null +++ b/apps/cic-eth/tests/testdata/Bogus.bin @@ -0,0 +1 @@ +60806040526000805534801561001457600080fd5b50610181806100246000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c0100000000000000000000000000000000000000000000000000000000900480630dbe671f146100585780631817835814610076575b600080fd5b610060610080565b60405161006d91906100ae565b60405180910390f35b61007e610086565b005b60005481565b600080815480929190610098906100d3565b9190505550565b6100a8816100c9565b82525050565b60006020820190506100c3600083018461009f565b92915050565b6000819050919050565b60006100de826100c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156101115761011061011c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122034ad8e91e864f030d47f5b93e281869206c1b203c36dc79a209ac9c9c16e577564736f6c63430008040033 \ No newline at end of file diff --git a/apps/cic-eth/tests/testdata/Bogus.sol b/apps/cic-eth/tests/testdata/Bogus.sol new file mode 100644 index 00000000..17e3bb88 --- /dev/null +++ b/apps/cic-eth/tests/testdata/Bogus.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.8.0; + +contract Bogus { + + uint256 public a = 0; + + function poke() public { + a++; + } +}