WIP Add role fixture, rehabilitate account register task, test
This commit is contained in:
parent
318615751c
commit
41731b5e96
@ -10,16 +10,22 @@ from cic_eth.db.models.base import SessionBase
|
|||||||
from cic_eth.db.models.otx import Otx
|
from cic_eth.db.models.otx import Otx
|
||||||
from cic_eth.db.models.tx import TxCache
|
from cic_eth.db.models.tx import TxCache
|
||||||
from cic_eth.db.models.nonce import Nonce
|
from cic_eth.db.models.nonce import Nonce
|
||||||
from cic_eth.admin.ctrl import lock_send
|
from cic_eth.admin.ctrl import (
|
||||||
from cic_eth.admin.ctrl import unlock_send
|
lock_send,
|
||||||
from cic_eth.admin.ctrl import lock_queue
|
unlock_send,
|
||||||
from cic_eth.admin.ctrl import unlock_queue
|
lock_queue,
|
||||||
from cic_eth.queue.tx import get_tx
|
unlock_queue,
|
||||||
from cic_eth.queue.tx import set_cancel
|
)
|
||||||
|
from cic_eth.queue.tx import (
|
||||||
|
get_tx,
|
||||||
|
set_cancel,
|
||||||
|
)
|
||||||
from cic_eth.queue.tx import create as queue_create
|
from cic_eth.queue.tx import create as queue_create
|
||||||
from cic_eth.eth.util import unpack_signed_raw_tx
|
from cic_eth.eth.util import unpack_signed_raw_tx
|
||||||
from cic_eth.eth.task import sign_tx
|
from cic_eth.eth.task import (
|
||||||
from cic_eth.eth.task import create_check_gas_and_send_task
|
sign_tx,
|
||||||
|
create_check_gas_task,
|
||||||
|
)
|
||||||
|
|
||||||
celery_app = celery.current_app
|
celery_app = celery.current_app
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
@ -10,6 +10,7 @@ from cic_registry import zero_content
|
|||||||
from cic_registry import CICRegistry
|
from cic_registry import CICRegistry
|
||||||
from crypto_dev_signer.eth.web3ext import Web3 as Web3Ext
|
from crypto_dev_signer.eth.web3ext import Web3 as Web3Ext
|
||||||
from cic_registry.error import UnknownContractError
|
from cic_registry.error import UnknownContractError
|
||||||
|
from chainlib.eth.address import to_checksum_address
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
@ -93,7 +94,8 @@ class AdminApi:
|
|||||||
:type address_hex: str, 0x-hex
|
:type address_hex: str, 0x-hex
|
||||||
:raises ValueError: Invalid checksum address
|
:raises ValueError: Invalid checksum address
|
||||||
"""
|
"""
|
||||||
if not web3.Web3.isChecksumAddress(address_hex):
|
#if not web3.Web3.isChecksumAddress(address_hex):
|
||||||
|
if not to_checksum_address(address_hex):
|
||||||
raise ValueError('invalid address')
|
raise ValueError('invalid address')
|
||||||
session = SessionBase.create_session()
|
session = SessionBase.create_session()
|
||||||
role = AccountRole.set(tag, address_hex)
|
role = AccountRole.set(tag, address_hex)
|
||||||
|
@ -13,13 +13,18 @@ from chainlib.eth.sign import (
|
|||||||
sign_message,
|
sign_message,
|
||||||
)
|
)
|
||||||
from chainlib.eth.address import to_checksum_address
|
from chainlib.eth.address import to_checksum_address
|
||||||
|
from chainlib.eth.tx import TxFormat
|
||||||
|
from eth_accounts_index import AccountRegistry
|
||||||
|
|
||||||
# local import
|
# local import
|
||||||
from cic_eth.registry import safe_registry
|
#from cic_eth.registry import safe_registry
|
||||||
from cic_eth.eth import RpcClient
|
#from cic_eth.eth import RpcClient
|
||||||
|
from cic_eth_registry import CICRegistry
|
||||||
from cic_eth.eth import registry_extra_identifiers
|
from cic_eth.eth import registry_extra_identifiers
|
||||||
from cic_eth.eth.task import sign_and_register_tx
|
from cic_eth.eth.task import (
|
||||||
from cic_eth.eth.task import create_check_gas_and_send_task
|
register_tx,
|
||||||
|
create_check_gas_task,
|
||||||
|
)
|
||||||
from cic_eth.eth.factory import TxFactory
|
from cic_eth.eth.factory import TxFactory
|
||||||
from cic_eth.db.models.nonce import Nonce
|
from cic_eth.db.models.nonce import Nonce
|
||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
@ -39,6 +44,8 @@ from cic_eth.task import (
|
|||||||
#logg = logging.getLogger(__name__)
|
#logg = logging.getLogger(__name__)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
celery_app = celery.current_app
|
celery_app = celery.current_app
|
||||||
|
#celery_app.log.setup_task_loggers(loglevel=logging.DEBUG)
|
||||||
|
#celery_app.log.redirect_stdouts_to_logger(logg, loglevel=logging.DEBUG)
|
||||||
|
|
||||||
|
|
||||||
class AccountTxFactory(TxFactory):
|
class AccountTxFactory(TxFactory):
|
||||||
@ -214,7 +221,7 @@ def register(self, account_address, chain_str, writer_address=None):
|
|||||||
raise RoleMissingError(account_address)
|
raise RoleMissingError(account_address)
|
||||||
|
|
||||||
logg.debug('adding account address {} to index; writer {}'.format(account_address, writer_address))
|
logg.debug('adding account address {} to index; writer {}'.format(account_address, writer_address))
|
||||||
queue = self.request.delivery_info['routing_key']
|
queue = self.request.delivery_info.get('routing_key')
|
||||||
|
|
||||||
# c = RpcClient(chain_spec, holder_address=writer_address)
|
# c = RpcClient(chain_spec, holder_address=writer_address)
|
||||||
# registry = safe_registry(c.w3)
|
# registry = safe_registry(c.w3)
|
||||||
@ -222,11 +229,29 @@ def register(self, account_address, chain_str, writer_address=None):
|
|||||||
# tx_add = txf.add(account_address, chain_spec, self.request.root_id, session=session)
|
# tx_add = txf.add(account_address, chain_spec, self.request.root_id, session=session)
|
||||||
# (tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_account_data', session=session)
|
# (tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_account_data', session=session)
|
||||||
|
|
||||||
|
# Retrieve account index address
|
||||||
|
rpc = RPCConnection.connect(chain_spec, 'default')
|
||||||
|
reg = CICRegistry(chain_spec, rpc)
|
||||||
|
call_address = AccountRole.get_address('DEFAULT', session=session)
|
||||||
|
account_registry_address = reg.by_name('AccountRegistry', sender_address=call_address)
|
||||||
|
|
||||||
|
# Generate and sign transaction
|
||||||
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
|
nonce_oracle = self.create_nonce_oracle(writer_address, rpc)
|
||||||
|
gas_oracle = self.create_gas_oracle(rpc)
|
||||||
|
account_registry = AccountRegistry(signer=rpc_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
||||||
|
(tx_hash_hex, tx_signed_raw_hex) = account_registry.add(account_registry_address, writer_address, account_address, tx_format=TxFormat.RLP_SIGNED)
|
||||||
|
#cache_task = 'cic_eth.eth.account.cache_account_data'
|
||||||
|
cache_task = None
|
||||||
|
|
||||||
|
# add transaction to queue
|
||||||
|
register_tx(tx_hash_hex, tx_signed_raw_hex, chain_str, queue, cache_task=cache_task, session=session)
|
||||||
session.commit()
|
session.commit()
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
gas_budget = tx_add['gas'] * tx_add['gasPrice']
|
return tx_hash_hex
|
||||||
|
|
||||||
|
#gas_budget = tx_add['gas'] * tx_add['gasPrice']
|
||||||
|
|
||||||
logg.debug('register user tx {}'.format(tx_hash_hex))
|
logg.debug('register user tx {}'.format(tx_hash_hex))
|
||||||
s = create_check_gas_and_send_task(
|
s = create_check_gas_and_send_task(
|
||||||
|
@ -7,6 +7,7 @@ import celery
|
|||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
from chainlib.eth.sign import sign_transaction
|
from chainlib.eth.sign import sign_transaction
|
||||||
from chainlib.connection import RPCConnection
|
from chainlib.connection import RPCConnection
|
||||||
|
from chainlib.eth.tx import unpack
|
||||||
from hexathon import (
|
from hexathon import (
|
||||||
strip_0x,
|
strip_0x,
|
||||||
add_0x,
|
add_0x,
|
||||||
@ -52,7 +53,8 @@ def sign_tx(tx, chain_str):
|
|||||||
return (tx_hash_hex, tx_transfer_signed['raw'],)
|
return (tx_hash_hex, tx_transfer_signed['raw'],)
|
||||||
|
|
||||||
|
|
||||||
def sign_and_register_tx(tx, chain_str, queue, cache_task=None, session=None):
|
#def sign_and_register_tx(tx, chain_str, queue, cache_task=None, session=None):
|
||||||
|
def register_tx(tx_hash_hex, tx_signed_raw_hex, chain_str, queue, cache_task=None, session=None):
|
||||||
"""Signs the provided transaction, and adds it to the transaction queue cache (with status PENDING).
|
"""Signs the provided transaction, and adds it to the transaction queue cache (with status PENDING).
|
||||||
|
|
||||||
:param tx: Standard ethereum transaction data
|
:param tx: Standard ethereum transaction data
|
||||||
@ -67,9 +69,11 @@ def sign_and_register_tx(tx, chain_str, queue, cache_task=None, session=None):
|
|||||||
:returns: Tuple; Transaction hash, signed raw transaction data
|
:returns: Tuple; Transaction hash, signed raw transaction data
|
||||||
:rtype: tuple
|
:rtype: tuple
|
||||||
"""
|
"""
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = sign_tx(tx, chain_str)
|
#(tx_hash_hex, tx_signed_raw_hex) = sign_tx(tx, chain_str)
|
||||||
|
|
||||||
logg.debug('adding queue tx {}'.format(tx_hash_hex))
|
logg.debug('adding queue tx {}'.format(tx_hash_hex))
|
||||||
|
tx_signed_raw = bytes.fromhex(strip_0x(tx_signed_raw_hex))
|
||||||
|
tx = unpack(tx_signed_raw)
|
||||||
|
|
||||||
queue_create(
|
queue_create(
|
||||||
tx['nonce'],
|
tx['nonce'],
|
||||||
@ -97,7 +101,7 @@ def sign_and_register_tx(tx, chain_str, queue, cache_task=None, session=None):
|
|||||||
|
|
||||||
|
|
||||||
# TODO: rename as we will not be sending task in the chain, this is the responsibility of the dispatcher
|
# TODO: rename as we will not be sending task in the chain, this is the responsibility of the dispatcher
|
||||||
def create_check_gas_and_send_task(tx_signed_raws_hex, chain_str, holder_address, gas, tx_hashes_hex=None, queue=None):
|
def create_check_gas_task(tx_signed_raws_hex, chain_str, holder_address, gas, tx_hashes_hex=None, queue=None):
|
||||||
"""Creates a celery task signature for a check_gas task that adds the task to the outgoing queue to be processed by the dispatcher.
|
"""Creates a celery task signature for a check_gas task that adds the task to the outgoing queue to be processed by the dispatcher.
|
||||||
|
|
||||||
If tx_hashes_hex is not spefified, a preceding task chained to check_gas must supply the transaction hashes as its return value.
|
If tx_hashes_hex is not spefified, a preceding task chained to check_gas must supply the transaction hashes as its return value.
|
||||||
|
@ -16,8 +16,10 @@ from cic_eth.db.models.tx import TxCache
|
|||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
from cic_eth.eth import RpcClient
|
from cic_eth.eth import RpcClient
|
||||||
from cic_eth.error import TokenCountError, PermanentTxError, OutOfGasError, NotLocalTxError
|
from cic_eth.error import TokenCountError, PermanentTxError, OutOfGasError, NotLocalTxError
|
||||||
from cic_eth.eth.task import sign_and_register_tx
|
from cic_eth.eth.task import (
|
||||||
from cic_eth.eth.task import create_check_gas_and_send_task
|
register_tx,
|
||||||
|
create_check_gas_task,
|
||||||
|
)
|
||||||
from cic_eth.eth.factory import TxFactory
|
from cic_eth.eth.factory import TxFactory
|
||||||
from cic_eth.eth.util import unpack_signed_raw_tx
|
from cic_eth.eth.util import unpack_signed_raw_tx
|
||||||
from cic_eth.ext.address import translate_address
|
from cic_eth.ext.address import translate_address
|
||||||
|
@ -17,6 +17,7 @@ from chainlib.eth.tx import (
|
|||||||
receipt,
|
receipt,
|
||||||
)
|
)
|
||||||
from chainlib.hash import keccak256_hex_to_hex
|
from chainlib.hash import keccak256_hex_to_hex
|
||||||
|
from hexathon import add_0x
|
||||||
|
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
@ -39,8 +40,11 @@ from cic_eth.queue.tx import get_nonce_tx
|
|||||||
from cic_eth.error import OutOfGasError
|
from cic_eth.error import OutOfGasError
|
||||||
from cic_eth.error import LockedError
|
from cic_eth.error import LockedError
|
||||||
from cic_eth.eth.util import unpack_signed_raw_tx
|
from cic_eth.eth.util import unpack_signed_raw_tx
|
||||||
from cic_eth.eth.task import sign_and_register_tx, create_check_gas_and_send_task
|
from cic_eth.eth.task import (
|
||||||
from cic_eth.eth.task import sign_tx
|
register_tx,
|
||||||
|
create_check_gas_task,
|
||||||
|
sign_tx,
|
||||||
|
)
|
||||||
from cic_eth.eth.nonce import NonceOracle
|
from cic_eth.eth.nonce import NonceOracle
|
||||||
from cic_eth.error import (
|
from cic_eth.error import (
|
||||||
AlreadyFillingGasError,
|
AlreadyFillingGasError,
|
||||||
@ -409,13 +413,11 @@ def send(self, txs, chain_str):
|
|||||||
tx_hex = txs[0]
|
tx_hex = txs[0]
|
||||||
logg.debug('send transaction {}'.format(tx_hex))
|
logg.debug('send transaction {}'.format(tx_hex))
|
||||||
|
|
||||||
tx_hash = add_0x(keccak256_hex_to_hex())
|
tx_hash_hex = add_0x(keccak256_hex_to_hex(tx_hex))
|
||||||
#tx_hash = web3.Web3.keccak(hexstr=tx_hex)
|
|
||||||
#tx_hash_hex = tx_hash.hex()
|
|
||||||
|
|
||||||
queue = self.request.delivery_info.get('routing_key', None)
|
queue = self.request.delivery_info.get('routing_key')
|
||||||
|
|
||||||
c = RpcClient(chain_spec)
|
#c = RpcClient(chain_spec)
|
||||||
r = None
|
r = None
|
||||||
s_set_sent = celery.signature(
|
s_set_sent = celery.signature(
|
||||||
'cic_eth.queue.tx.set_sent_status',
|
'cic_eth.queue.tx.set_sent_status',
|
||||||
@ -425,6 +427,9 @@ def send(self, txs, chain_str):
|
|||||||
],
|
],
|
||||||
queue=queue,
|
queue=queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
return txs[1:]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
#r = c.w3.eth.send_raw_transaction(tx_hex)
|
#r = c.w3.eth.send_raw_transaction(tx_hex)
|
||||||
r = c.w3.eth.sendRawTransaction(tx_hex)
|
r = c.w3.eth.sendRawTransaction(tx_hex)
|
||||||
|
@ -7,6 +7,9 @@ import uuid
|
|||||||
# external imports
|
# external imports
|
||||||
import celery
|
import celery
|
||||||
import sqlalchemy
|
import sqlalchemy
|
||||||
|
from chainlib.eth.constant import ZERO_ADDRESS
|
||||||
|
from chainlib.eth.nonce import RPCNonceOracle
|
||||||
|
from chainlib.eth.gas import RPCGasOracle
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.error import (
|
from cic_eth.error import (
|
||||||
@ -23,9 +26,11 @@ celery_app = celery.current_app
|
|||||||
class BaseTask(celery.Task):
|
class BaseTask(celery.Task):
|
||||||
|
|
||||||
session_func = SessionBase.create_session
|
session_func = SessionBase.create_session
|
||||||
|
call_address = ZERO_ADDRESS
|
||||||
|
create_nonce_oracle = RPCNonceOracle
|
||||||
|
create_gas_oracle = RPCGasOracle
|
||||||
|
|
||||||
def create_session(self):
|
def create_session(self):
|
||||||
logg.warning('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> session from base {}'.format(id(self.session_func)))
|
|
||||||
return BaseTask.session_func()
|
return BaseTask.session_func()
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ logg = logging.getLogger(__name__)
|
|||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
def celery_includes():
|
def celery_includes():
|
||||||
return [
|
return [
|
||||||
'cic_eth.eth.bancor',
|
# 'cic_eth.eth.bancor',
|
||||||
'cic_eth.eth.token',
|
'cic_eth.eth.token',
|
||||||
'cic_eth.eth.tx',
|
'cic_eth.eth.tx',
|
||||||
'cic_eth.ext.tx',
|
'cic_eth.ext.tx',
|
||||||
|
38
apps/cic-eth/tests/fixtures_role.py
Normal file
38
apps/cic-eth/tests/fixtures_role.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# standard imports
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
import pytest
|
||||||
|
from hexathon import add_0x
|
||||||
|
from chainlib.eth.address import to_checksum_address
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from cic_eth.db.models.role import AccountRole
|
||||||
|
|
||||||
|
logg = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def custodial_roles(
|
||||||
|
contract_roles,
|
||||||
|
eth_accounts,
|
||||||
|
init_database,
|
||||||
|
):
|
||||||
|
r = {}
|
||||||
|
r.update(contract_roles)
|
||||||
|
r.update({
|
||||||
|
'DEFAULT': eth_accounts[0],
|
||||||
|
})
|
||||||
|
for k in r.keys():
|
||||||
|
role = AccountRole.set(k, r[k])
|
||||||
|
init_database.add(role)
|
||||||
|
logg.info('adding role {} -> {}'.format(k, r[k]))
|
||||||
|
init_database.commit()
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def whoever(
|
||||||
|
init_eth_tester,
|
||||||
|
):
|
||||||
|
return init_eth_tester.new_account()
|
@ -7,6 +7,8 @@ import time
|
|||||||
import pytest
|
import pytest
|
||||||
import celery
|
import celery
|
||||||
from chainlib.connection import RPCConnection
|
from chainlib.connection import RPCConnection
|
||||||
|
from eth_accounts_index import AccountRegistry
|
||||||
|
from hexathon import strip_0x
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.error import OutOfGasError
|
from cic_eth.error import OutOfGasError
|
||||||
@ -21,6 +23,7 @@ from cic_eth.eth.account import AccountTxFactory
|
|||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip()
|
||||||
def test_create_account(
|
def test_create_account(
|
||||||
default_chain_spec,
|
default_chain_spec,
|
||||||
eth_rpc,
|
eth_rpc,
|
||||||
@ -60,11 +63,14 @@ def test_register_account(
|
|||||||
default_chain_spec,
|
default_chain_spec,
|
||||||
account_registry,
|
account_registry,
|
||||||
init_database,
|
init_database,
|
||||||
|
init_eth_tester,
|
||||||
eth_accounts,
|
eth_accounts,
|
||||||
eth_rpc,
|
eth_rpc,
|
||||||
registry,
|
cic_registry,
|
||||||
celery_session_worker,
|
celery_session_worker,
|
||||||
eth_empty_accounts,
|
eth_empty_accounts,
|
||||||
|
custodial_roles,
|
||||||
|
call_sender,
|
||||||
):
|
):
|
||||||
|
|
||||||
logg.debug('chainspec {}'.format(str(default_chain_spec)))
|
logg.debug('chainspec {}'.format(str(default_chain_spec)))
|
||||||
@ -110,9 +116,13 @@ def test_register_account(
|
|||||||
|
|
||||||
init_eth_tester.mine_block()
|
init_eth_tester.mine_block()
|
||||||
|
|
||||||
assert account_registry.have(eth_empty_accounts[0])
|
c = AccountRegistry()
|
||||||
|
o = c.have(account_registry, eth_empty_accounts[0], sender_address=call_sender)
|
||||||
|
r = eth_rpc.do(o)
|
||||||
|
assert int(strip_0x(r), 16) == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip()
|
||||||
def test_role_task(
|
def test_role_task(
|
||||||
init_database,
|
init_database,
|
||||||
celery_session_worker,
|
celery_session_worker,
|
||||||
|
Loading…
Reference in New Issue
Block a user