2021-03-29 15:27:53 +02:00
|
|
|
# standard imports
|
|
|
|
import logging
|
|
|
|
|
2021-04-02 23:26:13 +02:00
|
|
|
# external imports
|
|
|
|
import pytest
|
2021-03-29 15:27:53 +02:00
|
|
|
from chainlib.eth.nonce import RPCNonceOracle
|
|
|
|
from chainlib.eth.erc20 import ERC20
|
|
|
|
from chainlib.eth.tx import receipt
|
2021-04-02 23:26:13 +02:00
|
|
|
|
|
|
|
# local imports
|
2021-03-29 15:27:53 +02:00
|
|
|
from cic_eth.api.api_task import Api
|
|
|
|
from cic_eth.db.models.nonce import (
|
|
|
|
Nonce,
|
|
|
|
NonceReservation,
|
|
|
|
)
|
|
|
|
|
2021-04-02 23:26:13 +02:00
|
|
|
# test imports
|
|
|
|
from tests.mock.filter import (
|
|
|
|
block_filter,
|
|
|
|
tx_filter,
|
|
|
|
)
|
|
|
|
|
2021-03-29 15:27:53 +02:00
|
|
|
logg = logging.getLogger()
|
|
|
|
|
|
|
|
|
2021-04-02 23:26:13 +02:00
|
|
|
@pytest.mark.xfail()
|
2021-03-29 15:27:53 +02:00
|
|
|
def test_list_tx(
|
|
|
|
default_chain_spec,
|
|
|
|
init_database,
|
|
|
|
cic_registry,
|
|
|
|
eth_rpc,
|
|
|
|
eth_signer,
|
|
|
|
custodial_roles,
|
|
|
|
agent_roles,
|
|
|
|
foo_token,
|
|
|
|
register_tokens,
|
|
|
|
init_eth_tester,
|
2021-04-02 23:26:13 +02:00
|
|
|
celery_worker,
|
2021-03-29 15:27:53 +02:00
|
|
|
):
|
|
|
|
|
|
|
|
chain_id = default_chain_spec.chain_id()
|
|
|
|
|
|
|
|
tx_hashes = []
|
|
|
|
|
|
|
|
# external tx
|
|
|
|
nonce_oracle = RPCNonceOracle(custodial_roles['FOO_TOKEN_GIFTER'], eth_rpc)
|
|
|
|
nonce = nonce_oracle.get_nonce()
|
|
|
|
|
|
|
|
q = init_database.query(Nonce)
|
|
|
|
q = q.filter(Nonce.address_hex==agent_roles['ALICE'])
|
|
|
|
o = q.first()
|
|
|
|
o.nonce = nonce
|
|
|
|
init_database.add(o)
|
|
|
|
init_database.commit()
|
|
|
|
|
|
|
|
# TODO: implement cachenonceoracle instead, this is useless
|
|
|
|
# external tx one
|
|
|
|
Nonce.next(custodial_roles['FOO_TOKEN_GIFTER'], 'foo', session=init_database)
|
|
|
|
init_database.commit()
|
|
|
|
|
|
|
|
init_eth_tester.mine_blocks(13)
|
|
|
|
c = ERC20(signer=eth_signer, nonce_oracle=nonce_oracle, chain_id=chain_id)
|
|
|
|
(tx_hash_hex, o) = c.transfer(foo_token, custodial_roles['FOO_TOKEN_GIFTER'], agent_roles['ALICE'], 1024)
|
|
|
|
eth_rpc.do(o)
|
|
|
|
o = receipt(tx_hash_hex)
|
|
|
|
r = eth_rpc.do(o)
|
|
|
|
assert r['status'] == 1
|
|
|
|
a = r['block_number']
|
|
|
|
block_filter.add(a.to_bytes(4, 'big'))
|
|
|
|
|
|
|
|
a = r['block_number'] + r['transaction_index']
|
|
|
|
tx_filter.add(a.to_bytes(4, 'big'))
|
|
|
|
|
|
|
|
tx_hashes.append(tx_hash_hex)
|
|
|
|
|
|
|
|
# external tx two
|
|
|
|
Nonce.next(agent_roles['ALICE'], 'foo', session=init_database)
|
|
|
|
init_database.commit()
|
|
|
|
|
|
|
|
init_eth_tester.mine_blocks(13)
|
|
|
|
nonce_oracle = RPCNonceOracle(agent_roles['ALICE'], eth_rpc)
|
|
|
|
c = ERC20(signer=eth_signer, nonce_oracle=nonce_oracle, chain_id=chain_id)
|
|
|
|
(tx_hash_hex, o) = c.transfer(foo_token, agent_roles['ALICE'], agent_roles['BOB'], 256)
|
|
|
|
eth_rpc.do(o)
|
|
|
|
o = receipt(tx_hash_hex)
|
|
|
|
r = eth_rpc.do(o)
|
|
|
|
assert r['status'] == 1
|
|
|
|
a = r['block_number']
|
|
|
|
block_filter.add(a.to_bytes(4, 'big'))
|
|
|
|
|
|
|
|
a = r['block_number'] + r['transaction_index']
|
|
|
|
tx_filter.add(a.to_bytes(4, 'big'))
|
|
|
|
|
|
|
|
tx_hashes.append(tx_hash_hex)
|
|
|
|
|
|
|
|
init_eth_tester.mine_blocks(28)
|
|
|
|
|
|
|
|
# custodial tx 1
|
|
|
|
api = Api(str(default_chain_spec), queue=None)
|
|
|
|
t = api.transfer(agent_roles['ALICE'], agent_roles['CAROL'], 64, 'FOO') #, 'blinky')
|
|
|
|
r = t.get_leaf()
|
|
|
|
assert t.successful()
|
|
|
|
tx_hashes.append(r)
|
|
|
|
|
|
|
|
# custodial tx 2
|
|
|
|
api = Api(str(default_chain_spec), queue=None)
|
|
|
|
t = api.transfer(agent_roles['ALICE'], agent_roles['DAVE'], 16, 'FOO') #, 'blinky')
|
|
|
|
r = t.get_leaf()
|
|
|
|
assert t.successful()
|
|
|
|
tx_hashes.append(r)
|
|
|
|
|
|
|
|
logg.debug('r {}'.format(r))
|
|
|
|
|
|
|
|
# test the api
|
|
|
|
t = api.list(agent_roles['ALICE'], external_task='tests.mock.filter.filter')
|
|
|
|
r = t.get_leaf()
|
|
|
|
assert t.successful()
|
|
|
|
|
|
|
|
assert len(r) == 3
|
|
|
|
logg.debug('rrrr {}'.format(r))
|
|
|
|
|
|
|
|
for tx in r:
|
|
|
|
logg.debug('have tx {}'.format(tx))
|
|
|
|
tx_hashes.remove(tx['hash'])
|
|
|
|
assert len(tx_hashes) == 1
|