2021-03-29 15:27:53 +02:00
|
|
|
|
# standard imports
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
# external imports
|
|
|
|
|
import pytest
|
|
|
|
|
import celery
|
2021-05-27 17:16:48 +02:00
|
|
|
|
from chainlib.eth.gas import (
|
|
|
|
|
OverrideGasOracle,
|
|
|
|
|
Gas,
|
|
|
|
|
)
|
2021-03-29 15:27:53 +02:00
|
|
|
|
from chainlib.eth.nonce import RPCNonceOracle
|
|
|
|
|
from chainlib.eth.tx import (
|
|
|
|
|
TxFormat,
|
|
|
|
|
unpack,
|
|
|
|
|
transaction,
|
|
|
|
|
receipt,
|
2021-05-27 17:16:48 +02:00
|
|
|
|
raw,
|
2021-03-29 15:27:53 +02:00
|
|
|
|
)
|
2021-04-02 15:16:27 +02:00
|
|
|
|
from hexathon import strip_0x
|
2021-04-04 14:40:59 +02:00
|
|
|
|
from chainqueue.db.models.otx import Otx
|
2021-05-27 17:16:48 +02:00
|
|
|
|
from chainqueue.tx import create as queue_create
|
|
|
|
|
from chainqueue.state import (
|
|
|
|
|
set_reserved,
|
|
|
|
|
set_ready,
|
|
|
|
|
set_sent,
|
|
|
|
|
)
|
|
|
|
|
from chainqueue.db.enum import StatusBits
|
2021-03-29 15:27:53 +02:00
|
|
|
|
|
|
|
|
|
# local imports
|
|
|
|
|
from cic_eth.queue.tx import register_tx
|
2021-04-04 14:40:59 +02:00
|
|
|
|
from cic_eth.eth.gas import cache_gas_data
|
2021-03-29 15:27:53 +02:00
|
|
|
|
|
|
|
|
|
logg = logging.getLogger()
|
|
|
|
|
|
|
|
|
|
|
2021-05-27 17:16:48 +02:00
|
|
|
|
@pytest.mark.skip()
|
2021-03-29 15:27:53 +02:00
|
|
|
|
def test_tx_send(
|
|
|
|
|
init_database,
|
|
|
|
|
default_chain_spec,
|
|
|
|
|
eth_rpc,
|
|
|
|
|
eth_signer,
|
|
|
|
|
agent_roles,
|
|
|
|
|
contract_roles,
|
|
|
|
|
celery_session_worker,
|
|
|
|
|
):
|
|
|
|
|
|
|
|
|
|
nonce_oracle = RPCNonceOracle(agent_roles['ALICE'], eth_rpc)
|
2021-04-04 14:40:59 +02:00
|
|
|
|
c = Gas(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle)
|
2021-03-29 15:27:53 +02:00
|
|
|
|
(tx_hash_hex, tx_signed_raw_hex) = c.create(agent_roles['ALICE'], agent_roles['BOB'], 1024, tx_format=TxFormat.RLP_SIGNED)
|
|
|
|
|
register_tx(tx_hash_hex, tx_signed_raw_hex, default_chain_spec, None, session=init_database)
|
|
|
|
|
cache_gas_data(tx_hash_hex, tx_signed_raw_hex, default_chain_spec.asdict())
|
|
|
|
|
|
|
|
|
|
s_send = celery.signature(
|
|
|
|
|
'cic_eth.eth.tx.send',
|
|
|
|
|
[
|
|
|
|
|
[tx_signed_raw_hex],
|
|
|
|
|
default_chain_spec.asdict(),
|
|
|
|
|
],
|
|
|
|
|
queue=None,
|
|
|
|
|
)
|
|
|
|
|
t = s_send.apply_async()
|
|
|
|
|
r = t.get()
|
|
|
|
|
assert t.successful()
|
|
|
|
|
|
|
|
|
|
o = transaction(tx_hash_hex)
|
|
|
|
|
tx = eth_rpc.do(o)
|
|
|
|
|
assert r == tx['hash']
|
|
|
|
|
|
|
|
|
|
o = receipt(tx_hash_hex)
|
|
|
|
|
rcpt = eth_rpc.do(o)
|
|
|
|
|
assert rcpt['status'] == 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sync_tx(
|
2021-05-27 17:16:48 +02:00
|
|
|
|
init_database,
|
2021-03-29 15:27:53 +02:00
|
|
|
|
default_chain_spec,
|
|
|
|
|
eth_rpc,
|
|
|
|
|
eth_signer,
|
2021-05-27 17:16:48 +02:00
|
|
|
|
agent_roles,
|
2021-04-04 14:40:59 +02:00
|
|
|
|
celery_session_worker,
|
2021-03-29 15:27:53 +02:00
|
|
|
|
):
|
2021-05-27 17:16:48 +02:00
|
|
|
|
|
|
|
|
|
nonce_oracle = RPCNonceOracle(agent_roles['ALICE'], conn=eth_rpc)
|
|
|
|
|
gas_oracle = OverrideGasOracle(price=1000000000, limit=21000)
|
|
|
|
|
c = Gas(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
|
|
|
|
(tx_hash_hex, tx_signed_raw_hex) = c.create(agent_roles['ALICE'], agent_roles['BOB'], 100 * (10 ** 6), tx_format=TxFormat.RLP_SIGNED)
|
|
|
|
|
|
|
|
|
|
queue_create(
|
|
|
|
|
default_chain_spec,
|
|
|
|
|
42,
|
|
|
|
|
agent_roles['ALICE'],
|
|
|
|
|
tx_hash_hex,
|
|
|
|
|
tx_signed_raw_hex,
|
|
|
|
|
session=init_database,
|
|
|
|
|
)
|
|
|
|
|
cache_gas_data(
|
|
|
|
|
tx_hash_hex,
|
|
|
|
|
tx_signed_raw_hex,
|
|
|
|
|
default_chain_spec.asdict(),
|
|
|
|
|
)
|
|
|
|
|
set_ready(default_chain_spec, tx_hash_hex, session=init_database)
|
|
|
|
|
set_reserved(default_chain_spec, tx_hash_hex, session=init_database)
|
|
|
|
|
set_sent(default_chain_spec, tx_hash_hex, session=init_database)
|
|
|
|
|
|
|
|
|
|
o = raw(tx_signed_raw_hex)
|
|
|
|
|
r = eth_rpc.do(o)
|
|
|
|
|
|
|
|
|
|
o = receipt(tx_hash_hex)
|
|
|
|
|
r = eth_rpc.do(o)
|
|
|
|
|
assert r['status'] == 1
|
|
|
|
|
|
|
|
|
|
s = celery.signature(
|
|
|
|
|
'cic_eth.eth.tx.sync_tx',
|
|
|
|
|
[
|
|
|
|
|
tx_hash_hex,
|
|
|
|
|
default_chain_spec.asdict(),
|
|
|
|
|
],
|
|
|
|
|
queue=None
|
|
|
|
|
)
|
|
|
|
|
t = s.apply_async()
|
|
|
|
|
r = t.get_leaf()
|
|
|
|
|
assert t.successful()
|
|
|
|
|
|
|
|
|
|
init_database.commit()
|
|
|
|
|
|
|
|
|
|
o = Otx.load(tx_hash_hex, session=init_database)
|
|
|
|
|
assert o.status & StatusBits.FINAL == StatusBits.FINAL
|
2021-04-02 15:16:27 +02:00
|
|
|
|
|
|
|
|
|
|
2021-05-27 17:16:48 +02:00
|
|
|
|
@pytest.mark.skip()
|
2021-04-02 15:16:27 +02:00
|
|
|
|
def test_resend_with_higher_gas(
|
|
|
|
|
init_database,
|
|
|
|
|
default_chain_spec,
|
|
|
|
|
eth_rpc,
|
|
|
|
|
eth_signer,
|
|
|
|
|
agent_roles,
|
2021-04-04 14:40:59 +02:00
|
|
|
|
celery_session_worker,
|
2021-04-02 15:16:27 +02:00
|
|
|
|
):
|
|
|
|
|
|
|
|
|
|
nonce_oracle = RPCNonceOracle(agent_roles['ALICE'], eth_rpc)
|
2021-04-04 14:40:59 +02:00
|
|
|
|
c = Gas(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle)
|
2021-04-02 15:16:27 +02:00
|
|
|
|
(tx_hash_hex, tx_signed_raw_hex) = c.create(agent_roles['ALICE'], agent_roles['BOB'], 1024, tx_format=TxFormat.RLP_SIGNED)
|
|
|
|
|
register_tx(tx_hash_hex, tx_signed_raw_hex, default_chain_spec, None, session=init_database)
|
|
|
|
|
cache_gas_data(tx_hash_hex, tx_signed_raw_hex, default_chain_spec.asdict())
|
2021-04-04 14:40:59 +02:00
|
|
|
|
tx_before = unpack(bytes.fromhex(strip_0x(tx_signed_raw_hex)), default_chain_spec)
|
2021-04-02 15:16:27 +02:00
|
|
|
|
|
|
|
|
|
s = celery.signature(
|
2021-04-04 14:40:59 +02:00
|
|
|
|
'cic_eth.eth.gas.resend_with_higher_gas',
|
2021-04-02 15:16:27 +02:00
|
|
|
|
[
|
|
|
|
|
tx_hash_hex,
|
|
|
|
|
default_chain_spec.asdict(),
|
|
|
|
|
],
|
|
|
|
|
queue=None,
|
|
|
|
|
)
|
|
|
|
|
t = s.apply_async()
|
|
|
|
|
r = t.get_leaf()
|
|
|
|
|
|
|
|
|
|
q = init_database.query(Otx)
|
2021-04-04 14:40:59 +02:00
|
|
|
|
q = q.filter(Otx.tx_hash==strip_0x(r))
|
2021-04-02 15:16:27 +02:00
|
|
|
|
otx = q.first()
|
|
|
|
|
if otx == None:
|
|
|
|
|
raise NotLocalTxError(r)
|
|
|
|
|
|
2021-04-04 14:40:59 +02:00
|
|
|
|
tx_after = unpack(bytes.fromhex(strip_0x(otx.signed_tx)), default_chain_spec)
|
2021-04-02 15:16:27 +02:00
|
|
|
|
logg.debug('gasprices before {} after {}'.format(tx_before['gasPrice'], tx_after['gasPrice']))
|
|
|
|
|
assert tx_after['gasPrice'] > tx_before['gasPrice']
|
|
|
|
|
|