From f5bfc8ace26b1227664b37b84d50927834da41c5 Mon Sep 17 00:00:00 2001 From: Louis Holbrook Date: Thu, 7 Oct 2021 15:12:35 +0000 Subject: [PATCH] bug: cic-eth transaction listings --- apps/cic-eth/admin_requirements.txt | 2 +- apps/cic-eth/cic_eth/api/api_task.py | 3 ++ apps/cic-eth/cic_eth/eth/account.py | 26 ++++++++++----- apps/cic-eth/cic_eth/eth/erc20.py | 20 +++++++---- apps/cic-eth/cic_eth/eth/gas.py | 15 ++++++--- apps/cic-eth/cic_eth/eth/meta.py | 7 ++-- apps/cic-eth/cic_eth/eth/nonce.py | 11 ++++--- apps/cic-eth/cic_eth/ext/tx.py | 13 +++++--- apps/cic-eth/cic_eth/queue/query.py | 1 + .../runnable/daemons/filters/callback.py | 13 ++++---- .../runnable/daemons/filters/register.py | 3 +- .../runnable/daemons/filters/transferauth.py | 7 ++-- .../cic_eth/runnable/daemons/tasker.py | 2 +- apps/cic-eth/requirements.txt | 3 +- apps/cic-eth/services_requirements.txt | 2 +- .../tests/filters/test_callback_filter.py | 10 ++++-- .../tests/filters/test_register_filter.py | 11 ++++--- .../tests/filters/test_transferauth_filter.py | 6 ++-- apps/cic-eth/tests/task/api/test_admin.py | 4 +-- apps/cic-eth/tests/task/api/test_app.py | 9 +++++ apps/cic-eth/tests/task/api/test_balance.py | 9 +++-- apps/cic-eth/tests/task/api/test_list.py | 33 ++++++++++++------- apps/cic-eth/tests/task/test_ext_tx.py | 3 +- apps/cic-eth/tools_requirements.txt | 2 +- apps/cic-ussd/cic_ussd/account/balance.py | 2 +- apps/cic-ussd/cic_ussd/account/metadata.py | 3 +- apps/cic-ussd/cic_ussd/account/statement.py | 2 +- apps/cic-ussd/cic_ussd/db/models/account.py | 5 ++- apps/cic-ussd/cic_ussd/processor/menu.py | 2 +- .../cic_ussd/tasks/callback_handler.py | 6 ++-- apps/cic-ussd/cic_ussd/tasks/metadata.py | 15 ++++----- apps/cic-ussd/cic_ussd/tasks/processor.py | 9 ++--- .../tests/cic_ussd/account/test_statement.py | 33 +++++++++---------- .../tests/cic_ussd/processor/test_menu.py | 4 +-- .../cic_ussd/tasks/test_callback_handler.py | 1 + apps/cic-ussd/tests/fixtures/account.py | 12 +++---- apps/cic-ussd/tests/fixtures/transaction.py | 14 ++++---- apps/cic-ussd/tests/helpers/accounts.py | 3 +- 38 files changed, 195 insertions(+), 131 deletions(-) diff --git a/apps/cic-eth/admin_requirements.txt b/apps/cic-eth/admin_requirements.txt index 03f27205..4e9b1a16 100644 --- a/apps/cic-eth/admin_requirements.txt +++ b/apps/cic-eth/admin_requirements.txt @@ -1,5 +1,5 @@ SQLAlchemy==1.3.20 -cic-eth-registry>=0.6.1a2,<0.7.0 +cic-eth-registry>=0.6.1a3,<0.7.0 hexathon~=0.0.1a8 chainqueue>=0.0.4a6,<0.1.0 eth-erc20>=0.1.2a2,<0.2.0 diff --git a/apps/cic-eth/cic_eth/api/api_task.py b/apps/cic-eth/cic_eth/api/api_task.py index 79501d30..1ae14123 100644 --- a/apps/cic-eth/cic_eth/api/api_task.py +++ b/apps/cic-eth/cic_eth/api/api_task.py @@ -9,6 +9,7 @@ import logging # external imports import celery from chainlib.chain import ChainSpec +from hexathon import strip_0x # local imports from cic_eth.api.base import ApiBase @@ -254,6 +255,8 @@ class Api(ApiBase): :returns: uuid of root task :rtype: celery.Task """ + #from_address = strip_0x(from_address) + #to_address = strip_0x(to_address) s_check = celery.signature( 'cic_eth.admin.ctrl.check_lock', [ diff --git a/apps/cic-eth/cic_eth/eth/account.py b/apps/cic-eth/cic_eth/eth/account.py index 42bccec5..9f4916c7 100644 --- a/apps/cic-eth/cic_eth/eth/account.py +++ b/apps/cic-eth/cic_eth/eth/account.py @@ -13,7 +13,7 @@ from chainlib.eth.sign import ( new_account, sign_message, ) -from chainlib.eth.address import to_checksum_address +from chainlib.eth.address import to_checksum_address, is_address from chainlib.eth.tx import TxFormat from chainlib.chain import ChainSpec from chainlib.error import JSONRPCException @@ -31,6 +31,7 @@ from cic_eth.eth.gas import ( from cic_eth.db.models.nonce import Nonce from cic_eth.db.models.base import SessionBase from cic_eth.db.models.role import AccountRole +from cic_eth.encode import tx_normalize from cic_eth.error import ( RoleMissingError, SignerError, @@ -49,6 +50,7 @@ from cic_eth.queue.tx import ( from cic_eth.encode import ( unpack_normal, ZERO_ADDRESS_NORMAL, + tx_normalize, ) logg = logging.getLogger() @@ -84,7 +86,7 @@ def create(self, password, chain_spec_dict): # TODO: It seems infeasible that a can be None in any case, verify if a == None: raise SignerError('create account') - + a = tx_normalize.wallet_address(a) logg.debug('created account {}'.format(a)) # Initialize nonce provider record for account @@ -175,6 +177,9 @@ def gift(self, account_address, chain_spec_dict): """ chain_spec = ChainSpec.from_dict(chain_spec_dict) + if is_address(account_address): + account_address = tx_normalize.wallet_address(account_address) + logg.debug('gift account address {} to index'.format(account_address)) queue = self.request.delivery_info.get('routing_key') @@ -248,8 +253,9 @@ def have(self, account, chain_spec_dict): @celery_app.task(bind=True, base=CriticalSQLAlchemyTask) def set_role(self, tag, address, chain_spec_dict): - if not to_checksum_address(address): - raise ValueError('invalid checksum address {}'.format(address)) + if not is_address(address): + raise ValueError('invalid address {}'.format(address)) + address = tx_normalize.wallet_address(address) session = SessionBase.create_session() role = AccountRole.set(tag, address, session=session) session.add(role) @@ -298,13 +304,15 @@ def cache_gift_data( tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex)) tx = unpack_normal(tx_signed_raw_bytes, chain_spec) tx_data = Faucet.parse_give_to_request(tx['data']) + sender_address = tx_normalize.wallet_address(tx['from']) + recipient_address = tx_normalize.wallet_address(tx['to']) session = self.create_session() tx_dict = { 'hash': tx['hash'], - 'from': tx['from'], - 'to': tx['to'], + 'from': sender_address, + 'to': recipient_address, 'source_token': ZERO_ADDRESS_NORMAL, 'destination_token': ZERO_ADDRESS_NORMAL, 'from_value': 0, @@ -338,12 +346,14 @@ def cache_account_data( tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex)) tx = unpack_normal(tx_signed_raw_bytes, chain_spec) tx_data = AccountsIndex.parse_add_request(tx['data']) + sender_address = tx_normalize.wallet_address(tx['from']) + recipient_address = tx_normalize.wallet_address(tx['to']) session = SessionBase.create_session() tx_dict = { 'hash': tx['hash'], - 'from': tx['from'], - 'to': tx['to'], + 'from': sender_address, + 'to': recipient_address, 'source_token': ZERO_ADDRESS_NORMAL, 'destination_token': ZERO_ADDRESS_NORMAL, 'from_value': 0, diff --git a/apps/cic-eth/cic_eth/eth/erc20.py b/apps/cic-eth/cic_eth/eth/erc20.py index 1a1448a7..cf433c9e 100644 --- a/apps/cic-eth/cic_eth/eth/erc20.py +++ b/apps/cic-eth/cic_eth/eth/erc20.py @@ -12,7 +12,10 @@ from chainlib.eth.tx import ( ) from cic_eth_registry import CICRegistry from cic_eth_registry.erc20 import ERC20Token -from hexathon import strip_0x +from hexathon import ( + strip_0x, + add_0x, + ) from chainqueue.error import NotLocalTxError from eth_erc20 import ERC20 from chainqueue.sql.tx import cache_tx_dict @@ -38,6 +41,7 @@ from cic_eth.task import ( CriticalSQLAlchemyAndSignerTask, ) from cic_eth.eth.nonce import CustodialTaskNonceOracle +from cic_eth.encode import tx_normalize celery_app = celery.current_app logg = logging.getLogger() @@ -62,7 +66,8 @@ def balance(tokens, holder_address, chain_spec_dict): for t in tokens: address = t['address'] - token = ERC20Token(chain_spec, rpc, address) + logg.debug('address {} {}'.format(address, holder_address)) + token = ERC20Token(chain_spec, rpc, add_0x(address)) c = ERC20(chain_spec) o = c.balance_of(address, holder_address, sender_address=caller_address) r = rpc.do(o) @@ -371,13 +376,15 @@ def cache_transfer_data( tx = unpack(tx_signed_raw_bytes, chain_spec) tx_data = ERC20.parse_transfer_request(tx['data']) - recipient_address = tx_data[0] + sender_address = tx_normalize.wallet_address(tx['from']) + recipient_address = tx_normalize.wallet_address(tx_data[0]) token_value = tx_data[1] + session = SessionBase.create_session() tx_dict = { 'hash': tx_hash_hex, - 'from': tx['from'], + 'from': sender_address, 'to': recipient_address, 'source_token': tx['to'], 'destination_token': tx['to'], @@ -448,13 +455,14 @@ def cache_approve_data( tx = unpack(tx_signed_raw_bytes, chain_spec) tx_data = ERC20.parse_approve_request(tx['data']) - recipient_address = tx_data[0] + sender_address = tx_normalize.wallet_address(tx['from']) + recipient_address = tx_normalize.wallet_address(tx_data[0]) token_value = tx_data[1] session = SessionBase.create_session() tx_dict = { 'hash': tx_hash_hex, - 'from': tx['from'], + 'from': sender_address, 'to': recipient_address, 'source_token': tx['to'], 'destination_token': tx['to'], diff --git a/apps/cic-eth/cic_eth/eth/gas.py b/apps/cic-eth/cic_eth/eth/gas.py index 40f569af..435949fc 100644 --- a/apps/cic-eth/cic_eth/eth/gas.py +++ b/apps/cic-eth/cic_eth/eth/gas.py @@ -9,7 +9,11 @@ from hexathon import ( ) #from chainlib.eth.constant import ZERO_ADDRESS from chainlib.chain import ChainSpec -from chainlib.eth.address import is_checksum_address +from chainlib.eth.address import ( + is_checksum_address, + to_checksum_address, + is_address + ) from chainlib.connection import RPCConnection from chainqueue.db.enum import StatusBits from chainqueue.sql.tx import cache_tx_dict @@ -74,7 +78,6 @@ class MaxGasOracle: return MAXIMUM_FEE_UNITS -#def create_check_gas_task(tx_signed_raws_hex, chain_spec, holder_address, gas=None, tx_hashes_hex=None, queue=None): def create_check_gas_task(tx_signed_raws_hex, chain_spec, holder_address, gas=None, 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. @@ -179,8 +182,9 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga :return: Signed raw transaction data list :rtype: param txs, unchanged """ + rpc_format_address = None if address != None: - if not is_checksum_address(address): + if not is_address(address): raise ValueError('invalid address {}'.format(address)) address = tx_normalize.wallet_address(address) address = add_0x(address) @@ -195,7 +199,6 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga txs.append(tx) chain_spec = ChainSpec.from_dict(chain_spec_dict) - logg.debug('txs {} tx_hashes {}'.format(txs, tx_hashes)) addresspass = None if len(txs) == 0: @@ -211,13 +214,15 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga raise ValueError('txs passed to check gas must all have same sender; had {} got {}'.format(address, tx['from'])) addresspass.append(address) + rpc_format_address = add_0x(to_checksum_address(address)) + queue = self.request.delivery_info.get('routing_key') conn = RPCConnection.connect(chain_spec) gas_balance = 0 try: - o = balance(address) + o = balance(rpc_format_address) r = conn.do(o) conn.disconnect() gas_balance = abi_decode_single(ABIContractType.UINT256, r) diff --git a/apps/cic-eth/cic_eth/eth/meta.py b/apps/cic-eth/cic_eth/eth/meta.py index 21ab8295..881fad66 100644 --- a/apps/cic-eth/cic_eth/eth/meta.py +++ b/apps/cic-eth/cic_eth/eth/meta.py @@ -2,8 +2,9 @@ from chainlib.eth.constant import ZERO_ADDRESS from chainlib.status import Status as TxStatus from cic_eth_registry.erc20 import ERC20Token +from hexathon import add_0x -# local imports +# local impor:ts from cic_eth.ext.address import translate_address @@ -44,8 +45,8 @@ class ExtendedTx: destination = source if destination_value == None: destination_value = source_value - st = ERC20Token(self.chain_spec, self.rpc, source) - dt = ERC20Token(self.chain_spec, self.rpc, destination) + st = ERC20Token(self.chain_spec, self.rpc, add_0x(source)) + dt = ERC20Token(self.chain_spec, self.rpc, add_0x(destination)) self.source_token = source self.source_token_symbol = st.symbol self.source_token_name = st.name diff --git a/apps/cic-eth/cic_eth/eth/nonce.py b/apps/cic-eth/cic_eth/eth/nonce.py index 412e18ee..6e493ff5 100644 --- a/apps/cic-eth/cic_eth/eth/nonce.py +++ b/apps/cic-eth/cic_eth/eth/nonce.py @@ -3,11 +3,12 @@ import logging # external imports import celery -from chainlib.eth.address import is_checksum_address +from chainlib.eth.address import is_checksum_address, is_address, strip_0x # local imports from cic_eth.db.models.role import AccountRole from cic_eth.db.models.base import SessionBase +from cic_eth.encode import tx_normalize from cic_eth.task import CriticalSQLAlchemyTask from cic_eth.db.models.nonce import ( Nonce, @@ -42,7 +43,8 @@ class CustodialTaskNonceOracle(): :returns: Nonce :rtype: number """ - r = NonceReservation.release(self.address, self.uuid, session=self.session) + address = tx_normalize.wallet_address(self.address) + r = NonceReservation.release(address, self.uuid, session=self.session) return r[1] @@ -58,17 +60,18 @@ def reserve_nonce(self, chained_input, chain_spec_dict, signer_address=None): address = chained_input logg.debug('non-explicit address for reserve nonce, using arg head {}'.format(chained_input)) else: - if is_checksum_address(signer_address): + if is_address(signer_address): address = signer_address logg.debug('explicit address for reserve nonce {}'.format(signer_address)) else: address = AccountRole.get_address(signer_address, session=session) logg.debug('role for reserve nonce {} -> {}'.format(signer_address, address)) - if not is_checksum_address(address): + if not is_address(address): raise ValueError('invalid result when resolving address for nonce {}'.format(address)) root_id = self.request.root_id + address = tx_normalize.wallet_address(address) r = NonceReservation.next(address, root_id, session=session) logg.debug('nonce {} reserved for address {} task {}'.format(r[1], address, r[0])) diff --git a/apps/cic-eth/cic_eth/ext/tx.py b/apps/cic-eth/cic_eth/ext/tx.py index 3adefa2e..62f44d2d 100644 --- a/apps/cic-eth/cic_eth/ext/tx.py +++ b/apps/cic-eth/cic_eth/ext/tx.py @@ -32,6 +32,7 @@ from potaahto.symbols import snake_and_camel from cic_eth.queue.time import tx_times from cic_eth.task import BaseTask from cic_eth.db.models.base import SessionBase +from cic_eth.encode import tx_normalize celery_app = celery.current_app logg = logging.getLogger() @@ -134,7 +135,7 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict): tx_address = transfer_data[0] tx_token_value = transfer_data[1] - if address == tx_address: + if tx_normalize.wallet_address(address) == tx_normalize.wallet_address(tx_address): status = StatusEnum.SENT try: o = receipt(tx['hash']) @@ -152,8 +153,8 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict): times = tx_times(tx['hash'], chain_spec) tx_r = { 'hash': tx['hash'], - 'sender': tx['from'], - 'recipient': tx_address, + 'sender': tx_normalize.wallet_address(tx['from']), + 'recipient': tx_normalize.wallet_address(tx_address), 'source_value': tx_token_value, 'destination_value': tx_token_value, 'source_token': tx['to'], @@ -164,10 +165,10 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict): tx_r['date_created'] = times['queue'] else: tx_r['date_created'] = times['network'] - txs[tx['hash']] = tx_r + txs[strip_0x(tx['hash'])] = tx_r break - return txs + return txs # TODO: Surely it must be possible to optimize this @@ -230,6 +231,8 @@ def tx_collate(self, tx_batches, chain_spec_dict, offset, limit, newest_first=Tr except UnknownContractError: logg.error('verify failed on tx {}, skipping'.format(tx['hash'])) continue + tx['recipient'] = tx_normalize.wallet_address(tx['recipient']) + tx['sender'] = tx_normalize.wallet_address(tx['sender']) txs.append(tx) return txs diff --git a/apps/cic-eth/cic_eth/queue/query.py b/apps/cic-eth/cic_eth/queue/query.py index aa0b2504..3d941599 100644 --- a/apps/cic-eth/cic_eth/queue/query.py +++ b/apps/cic-eth/cic_eth/queue/query.py @@ -58,6 +58,7 @@ def get_tx_local(chain_spec, tx_hash, session=None): @celery_app.task(base=CriticalSQLAlchemyTask) def get_account_tx(chain_spec_dict, address, as_sender=True, as_recipient=True, counterpart=None): + address = tx_normalize.wallet_address(address) chain_spec = ChainSpec.from_dict(chain_spec_dict) return get_account_tx_local(chain_spec, address, as_sender=as_sender, as_recipient=as_recipient, counterpart=counterpart) diff --git a/apps/cic-eth/cic_eth/runnable/daemons/filters/callback.py b/apps/cic-eth/cic_eth/runnable/daemons/filters/callback.py index 4852ab65..c834d053 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/filters/callback.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/filters/callback.py @@ -21,6 +21,7 @@ from erc20_faucet import Faucet # local imports from .base import SyncFilter from cic_eth.eth.meta import ExtendedTx +from cic_eth.encode import tx_normalize logg = logging.getLogger().getChild(__name__) @@ -42,9 +43,9 @@ class CallbackFilter(SyncFilter): return (None, None) r = ERC20.parse_transfer_request(tx.payload) transfer_data = {} - transfer_data['to'] = r[0] + transfer_data['to'] = tx_normalize.wallet_address(r[0]) transfer_data['value'] = r[1] - transfer_data['from'] = tx.outputs[0] + transfer_data['from'] = tx_normalize.wallet_address(tx.outputs[0]) transfer_data['token_address'] = tx.inputs[0] return ('transfer', transfer_data) @@ -54,8 +55,8 @@ class CallbackFilter(SyncFilter): return (None, None) r = ERC20.parse_transfer_from_request(tx.payload) transfer_data = {} - transfer_data['from'] = r[0] - transfer_data['to'] = r[1] + transfer_data['from'] = tx_normalize.wallet_address(r[0]) + transfer_data['to'] = tx_normalize.wallet_address(r[1]) transfer_data['value'] = r[2] transfer_data['token_address'] = tx.inputs[0] return ('transferfrom', transfer_data) @@ -66,9 +67,9 @@ class CallbackFilter(SyncFilter): return (None, None) r = Faucet.parse_give_to_request(tx.payload) transfer_data = {} - transfer_data['to'] = r[0] + transfer_data['to'] = tx_normalize.wallet_address(r[0]) transfer_data['value'] = tx.value - transfer_data['from'] = tx.outputs[0] + transfer_data['from'] = tx_normalize.wallet_address(tx.outputs[0]) #transfer_data['token_address'] = tx.inputs[0] faucet_contract = tx.inputs[0] 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 54b8ad58..03cd774e 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/filters/register.py @@ -12,7 +12,8 @@ from hexathon import ( # local imports from .base import SyncFilter -logg = logging.getLogger(__name__) +#logg = logging.getLogger(__name__) +logg = logging.getLogger() account_registry_add_log_hash = '0x9cc987676e7d63379f176ea50df0ae8d2d9d1141d1231d4ce15b5965f73c9430' diff --git a/apps/cic-eth/cic_eth/runnable/daemons/filters/transferauth.py b/apps/cic-eth/cic_eth/runnable/daemons/filters/transferauth.py index 3ba77791..7288d349 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/filters/transferauth.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/filters/transferauth.py @@ -17,6 +17,7 @@ from cic_eth_registry import CICRegistry from erc20_transfer_authorization import TransferAuthorization # local imports +from cic_eth.encode import tx_normalize from .base import SyncFilter @@ -52,9 +53,9 @@ class TransferAuthFilter(SyncFilter): r = TransferAuthorization.parse_create_request_request(tx.payload) - sender = r[0] - recipient = r[1] - token = r[2] + sender = tx_normalize.wallet_address(r[0]) + recipient = tx_normalize.wallet_address(r[1]) + token = tx_normalize.executable_address(r[2]) value = r[3] token_data = { diff --git a/apps/cic-eth/cic_eth/runnable/daemons/tasker.py b/apps/cic-eth/cic_eth/runnable/daemons/tasker.py index 52e8e1d9..d9d7a7f8 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/tasker.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/tasker.py @@ -206,7 +206,7 @@ def main(): BaseTask.default_token_symbol = config.get('CIC_DEFAULT_TOKEN_SYMBOL') BaseTask.default_token_address = registry.by_name(BaseTask.default_token_symbol) - default_token = ERC20Token(chain_spec, conn, BaseTask.default_token_address) + default_token = ERC20Token(chain_spec, conn, add_0x(BaseTask.default_token_address)) default_token.load(conn) BaseTask.default_token_decimals = default_token.decimals BaseTask.default_token_name = default_token.name diff --git a/apps/cic-eth/requirements.txt b/apps/cic-eth/requirements.txt index 61fb0011..542580c9 100644 --- a/apps/cic-eth/requirements.txt +++ b/apps/cic-eth/requirements.txt @@ -1,3 +1,4 @@ celery==4.4.7 -chainlib-eth>=0.0.9a14,<0.1.0 +chainlib-eth>=0.0.9rc2,<0.1.0 semver==2.13.0 +crypto-dev-signer>=0.4.15rc2,<0.5.0 diff --git a/apps/cic-eth/services_requirements.txt b/apps/cic-eth/services_requirements.txt index 7f129268..64b23722 100644 --- a/apps/cic-eth/services_requirements.txt +++ b/apps/cic-eth/services_requirements.txt @@ -8,7 +8,7 @@ pycryptodome==3.10.1 liveness~=0.0.1a7 eth-address-index>=0.2.3a4,<0.3.0 eth-accounts-index>=0.1.2a3,<0.2.0 -cic-eth-registry>=0.6.1a2,<0.7.0 +cic-eth-registry>=0.6.1a3,<0.7.0 erc20-faucet>=0.3.2a2,<0.4.0 erc20-transfer-authorization>=0.3.5a2,<0.4.0 sarafu-faucet>=0.0.7a2,<0.1.0 diff --git a/apps/cic-eth/tests/filters/test_callback_filter.py b/apps/cic-eth/tests/filters/test_callback_filter.py index 695155cb..4b99de12 100644 --- a/apps/cic-eth/tests/filters/test_callback_filter.py +++ b/apps/cic-eth/tests/filters/test_callback_filter.py @@ -18,7 +18,10 @@ from eth_erc20 import ERC20 from sarafu_faucet import MinterFaucet from eth_accounts_index.registry import AccountRegistry from potaahto.symbols import snake_and_camel -from hexathon import add_0x +from hexathon import ( + add_0x, + strip_0x, + ) # local imports from cic_eth.runnable.daemons.filters.callback import CallbackFilter @@ -160,7 +163,7 @@ def test_faucet_gift_to_tx( assert transfer_data['token_address'] == foo_token -def test_callback_filter( +def test_callback_filter_filter( default_chain_spec, init_database, eth_rpc, @@ -213,6 +216,7 @@ def test_callback_filter( def call_back(self, transfer_type, result): self.results[transfer_type] = result + logg.debug('result {}'.format(result)) return self mock = CallbackMock() @@ -221,4 +225,4 @@ def test_callback_filter( fltr.filter(eth_rpc, mockblock, tx, init_database) assert mock.results.get('transfer') != None - assert mock.results['transfer']['destination_token'] == foo_token + assert mock.results['transfer']['destination_token'] == strip_0x(foo_token) diff --git a/apps/cic-eth/tests/filters/test_register_filter.py b/apps/cic-eth/tests/filters/test_register_filter.py index 34ec09c1..ce81b43a 100644 --- a/apps/cic-eth/tests/filters/test_register_filter.py +++ b/apps/cic-eth/tests/filters/test_register_filter.py @@ -17,6 +17,9 @@ from chainlib.eth.block import ( block_by_number, Block, ) +from chainlib.eth.address import ( + to_checksum_address, + ) from erc20_faucet import Faucet from hexathon import ( strip_0x, @@ -25,7 +28,6 @@ from hexathon import ( # local imports from cic_eth.runnable.daemons.filters.register import RegistrationFilter -from cic_eth.encode import tx_normalize from cic_eth.queue.query import get_account_tx_local logg = logging.getLogger() @@ -70,12 +72,13 @@ def test_register_filter( tx = Tx(tx_src, block=block, rcpt=rcpt) tx.apply_receipt(rcpt) - fltr = RegistrationFilter(default_chain_spec, add_0x(os.urandom(20).hex()), queue=None) + fltr = RegistrationFilter(default_chain_spec, to_checksum_address(os.urandom(20).hex()), queue=None) t = fltr.filter(eth_rpc, block, tx, db_session=init_database) assert t == None - fltr = RegistrationFilter(default_chain_spec, account_registry, queue=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)) t.get_leaf() assert t.successful() @@ -89,4 +92,4 @@ def test_register_filter( 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'] + assert add_0x(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 4d2266c1..ac84139a 100644 --- a/apps/cic-eth/tests/filters/test_transferauth_filter.py +++ b/apps/cic-eth/tests/filters/test_transferauth_filter.py @@ -19,6 +19,7 @@ from chainqueue.sql.query import get_account_tx # local imports from cic_eth.runnable.daemons.filters.transferauth import TransferAuthFilter +from cic_eth.encode import tx_normalize def test_filter_transferauth( @@ -66,7 +67,8 @@ def test_filter_transferauth( t.get_leaf() assert t.successful() - approve_txs = get_account_tx(default_chain_spec.asdict(), agent_roles['ALICE'], as_sender=True, session=init_database) + #approve_txs = get_account_tx(default_chain_spec.asdict(), agent_roles['ALICE'], as_sender=True, session=init_database) + approve_txs = get_account_tx(default_chain_spec.asdict(), tx_normalize.wallet_address(agent_roles['ALICE']), as_sender=True, session=init_database) ks = list(approve_txs.keys()) assert len(ks) == 1 @@ -76,4 +78,4 @@ def test_filter_transferauth( c = ERC20(default_chain_spec) approve = c.parse_approve_request(approve_tx['data']) - assert approve[0] == agent_roles['BOB'] + assert approve[0] == strip_0x(agent_roles['BOB']) diff --git a/apps/cic-eth/tests/task/api/test_admin.py b/apps/cic-eth/tests/task/api/test_admin.py index 71ac61f4..363fb8d7 100644 --- a/apps/cic-eth/tests/task/api/test_admin.py +++ b/apps/cic-eth/tests/task/api/test_admin.py @@ -110,8 +110,8 @@ def test_tag_account( t = api.tag_account('bar', agent_roles['CAROL'], default_chain_spec) t.get() - assert AccountRole.get_address('foo', init_database) == agent_roles['ALICE'] - assert AccountRole.get_address('bar', init_database) == agent_roles['CAROL'] + assert AccountRole.get_address('foo', init_database) == tx_normalize.wallet_address(agent_roles['ALICE']) + assert AccountRole.get_address('bar', init_database) == tx_normalize.wallet_address(agent_roles['CAROL']) def test_tx( diff --git a/apps/cic-eth/tests/task/api/test_app.py b/apps/cic-eth/tests/task/api/test_app.py index 1e081584..acc6161d 100644 --- a/apps/cic-eth/tests/task/api/test_app.py +++ b/apps/cic-eth/tests/task/api/test_app.py @@ -10,6 +10,7 @@ from cic_eth_registry.erc20 import ERC20Token from chainlib.chain import ChainSpec from eth_accounts_index import AccountsIndex from chainlib.eth.tx import ( + receipt, transaction, ) from chainqueue.sql.state import ( @@ -29,6 +30,7 @@ def test_account_api( init_database, init_eth_rpc, account_registry, + cic_registry, custodial_roles, celery_session_worker, ): @@ -49,6 +51,7 @@ def test_account_api_register( eth_rpc, celery_session_worker, ): + api = Api(str(default_chain_spec), callback_param='accounts', callback_task='cic_eth.callbacks.noop.noop', queue=None) t = api.create_account('') register_tx_hash = t.get_leaf() @@ -69,12 +72,18 @@ def test_account_api_register( r = t.get_leaf() assert t.successful() + o = receipt(register_tx_hash) + r = eth_rpc.do(o) + assert r['status'] == 1 + o = transaction(register_tx_hash) tx_src = eth_rpc.do(o) c = AccountsIndex(default_chain_spec) address = c.parse_add_request(tx_src['data']) + logg.debug('address {} '.format(address)) o = c.have(account_registry, address[0], sender_address=custodial_roles['CONTRACT_DEPLOYER']) + logg.debug('o {}'.format(o)) r = eth_rpc.do(o) assert c.parse_have(r) diff --git a/apps/cic-eth/tests/task/api/test_balance.py b/apps/cic-eth/tests/task/api/test_balance.py index 650c2b10..0a72a62c 100644 --- a/apps/cic-eth/tests/task/api/test_balance.py +++ b/apps/cic-eth/tests/task/api/test_balance.py @@ -3,18 +3,22 @@ import os import logging # external imports +import pytest from chainlib.eth.address import to_checksum_address +from hexathon import add_0x # local imports from cic_eth.api.api_task import Api logg = logging.getLogger() + def test_balance_simple_api( default_chain_spec, init_database, cic_registry, foo_token, + register_lookups, register_tokens, api, celery_session_worker, @@ -22,7 +26,7 @@ def test_balance_simple_api( chain_str = str(default_chain_spec) - a = to_checksum_address('0x' + os.urandom(20).hex()) + a = add_0x(to_checksum_address(os.urandom(20).hex())) t = api.balance(a, 'FOO', include_pending=False) r = t.get_leaf() assert t.successful() @@ -36,6 +40,7 @@ def test_balance_complex_api( init_database, cic_registry, foo_token, + register_lookups, register_tokens, api, celery_session_worker, @@ -43,7 +48,7 @@ def test_balance_complex_api( chain_str = str(default_chain_spec) - a = to_checksum_address('0x' + os.urandom(20).hex()) + a = add_0x(to_checksum_address(os.urandom(20).hex())) t = api.balance(a, 'FOO', include_pending=True) r = t.get_leaf() assert t.successful() diff --git a/apps/cic-eth/tests/task/api/test_list.py b/apps/cic-eth/tests/task/api/test_list.py index 22c07ae8..7f0bdf0f 100644 --- a/apps/cic-eth/tests/task/api/test_list.py +++ b/apps/cic-eth/tests/task/api/test_list.py @@ -6,6 +6,7 @@ import pytest from chainlib.eth.nonce import RPCNonceOracle from eth_erc20 import ERC20 from chainlib.eth.tx import receipt +from hexathon import strip_0x # local imports from cic_eth.api.api_task import Api @@ -23,7 +24,6 @@ from cic_eth.pytest.mock.filter import ( logg = logging.getLogger() -@pytest.mark.xfail() def test_list_tx( default_chain_spec, init_database, @@ -34,8 +34,10 @@ def test_list_tx( agent_roles, foo_token, register_tokens, + register_lookups, init_eth_tester, celery_session_worker, + init_celery_tasks, ): tx_hashes = [] @@ -63,13 +65,16 @@ def test_list_tx( 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')) + ab = a.to_bytes(4, 'big') + block_filter.add(ab) - a = r['block_number'] + r['transaction_index'] - tx_filter.add(a.to_bytes(4, 'big')) + bb = r['transaction_index'].to_bytes(4, 'big') + cb = ab + bb + tx_filter.add(cb) - tx_hashes.append(tx_hash_hex) + tx_hashes.append(strip_0x(tx_hash_hex)) # external tx two Nonce.next(agent_roles['ALICE'], 'foo', session=init_database) @@ -83,26 +88,29 @@ def test_list_tx( 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')) + ab = a.to_bytes(4, 'big') + block_filter.add(ab) - a = r['block_number'] + r['transaction_index'] - tx_filter.add(a.to_bytes(4, 'big')) + bb = r['transaction_index'].to_bytes(4, 'big') + cb = ab + bb + tx_filter.add(cb) - tx_hashes.append(tx_hash_hex) + tx_hashes.append(strip_0x(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') + t = api.transfer(agent_roles['ALICE'], agent_roles['CAROL'], 64, 'FOO') 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') + t = api.transfer(agent_roles['ALICE'], agent_roles['DAVE'], 16, 'FOO') r = t.get_leaf() assert t.successful() tx_hashes.append(r) @@ -117,7 +125,8 @@ def test_list_tx( assert len(r) == 3 logg.debug('rrrr {}'.format(r)) + logg.debug('testing against hashes {}'.format(tx_hashes)) for tx in r: logg.debug('have tx {}'.format(tx)) - tx_hashes.remove(tx['hash']) + tx_hashes.remove(strip_0x(tx['hash'])) assert len(tx_hashes) == 1 diff --git a/apps/cic-eth/tests/task/test_ext_tx.py b/apps/cic-eth/tests/task/test_ext_tx.py index 2740bf20..dba1562a 100644 --- a/apps/cic-eth/tests/task/test_ext_tx.py +++ b/apps/cic-eth/tests/task/test_ext_tx.py @@ -10,6 +10,7 @@ from chainlib.eth.tx import ( ) from eth_erc20 import ERC20 from chainlib.eth.nonce import RPCNonceOracle +from hexathon import add_0x # local imports from cic_eth.db.models.nonce import ( @@ -91,5 +92,5 @@ def test_filter_process( assert len(r) == 2 for tx_hash in r.keys(): - tx_hashes.remove(tx_hash) + tx_hashes.remove(add_0x(tx_hash)) assert len(tx_hashes) == 0 diff --git a/apps/cic-eth/tools_requirements.txt b/apps/cic-eth/tools_requirements.txt index f10c88e9..401bdc8b 100644 --- a/apps/cic-eth/tools_requirements.txt +++ b/apps/cic-eth/tools_requirements.txt @@ -1,6 +1,6 @@ crypto-dev-signer>=0.4.15a7,<=0.4.15 chainqueue>=0.0.5a1,<0.1.0 -cic-eth-registry>=0.6.1a2,<0.7.0 +cic-eth-registry>=0.6.1a3,<0.7.0 redis==3.5.3 hexathon~=0.0.1a8 pycryptodome==3.10.1 diff --git a/apps/cic-ussd/cic_ussd/account/balance.py b/apps/cic-ussd/cic_ussd/account/balance.py index e8563a9f..838f8bbb 100644 --- a/apps/cic-ussd/cic_ussd/account/balance.py +++ b/apps/cic-ussd/cic_ussd/account/balance.py @@ -101,7 +101,7 @@ def get_cached_available_balance(blockchain_address: str) -> float: :return: Operational balance of an account. :rtype: float """ - identifier = bytes.fromhex(blockchain_address[2:]) + identifier = bytes.fromhex(blockchain_address) key = cache_data_key(identifier, salt=':cic.balances') cached_balances = get_cached_data(key=key) if cached_balances: diff --git a/apps/cic-ussd/cic_ussd/account/metadata.py b/apps/cic-ussd/cic_ussd/account/metadata.py index d2f8581b..e32b17de 100644 --- a/apps/cic-ussd/cic_ussd/account/metadata.py +++ b/apps/cic-ussd/cic_ussd/account/metadata.py @@ -4,7 +4,6 @@ import logging from typing import Optional # external imports -from chainlib.hash import strip_0x from cic_types.models.person import Person # local imports @@ -20,7 +19,7 @@ def get_cached_preferred_language(blockchain_address: str) -> Optional[str]: :return: Account's set preferred language | Fallback preferred language. :rtype: str """ - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) preferences_metadata_handler = PreferencesMetadata(identifier) cached_preferences_metadata = preferences_metadata_handler.get_cached_metadata() if cached_preferences_metadata: diff --git a/apps/cic-ussd/cic_ussd/account/statement.py b/apps/cic-ussd/cic_ussd/account/statement.py index 94cde296..584f526c 100644 --- a/apps/cic-ussd/cic_ussd/account/statement.py +++ b/apps/cic-ussd/cic_ussd/account/statement.py @@ -86,7 +86,7 @@ def query_statement(blockchain_address: str, limit: int = 9): :param limit: Number of transactions to be returned. :type limit: int """ - logg.debug(f'retrieving balance for address: {blockchain_address}') + logg.debug(f'retrieving statement for address: {blockchain_address}') chain_str = Chain.spec.__str__() cic_eth_api = Api( chain_str=chain_str, diff --git a/apps/cic-ussd/cic_ussd/db/models/account.py b/apps/cic-ussd/cic_ussd/db/models/account.py index c9d36b6d..2eb9291b 100644 --- a/apps/cic-ussd/cic_ussd/db/models/account.py +++ b/apps/cic-ussd/cic_ussd/db/models/account.py @@ -2,7 +2,6 @@ import json # external imports -from chainlib.hash import strip_0x from cic_eth.api import Api # local imports @@ -101,7 +100,7 @@ class Account(SessionBase): session.add(self) session.flush() SessionBase.release_session(session=session) - return f'Pin reset successful.' + return 'Pin reset successful.' def standard_metadata_id(self) -> str: """This function creates an account's standard metadata identification information that contains an account owner's @@ -109,7 +108,7 @@ class Account(SessionBase): :return: Standard metadata identification information | e164 formatted phone number. :rtype: str """ - identifier = bytes.fromhex(strip_0x(self.blockchain_address)) + identifier = bytes.fromhex(self.blockchain_address) key = cache_data_key(identifier, ':cic.person') account_metadata = get_cached_data(key) if not account_metadata: diff --git a/apps/cic-ussd/cic_ussd/processor/menu.py b/apps/cic-ussd/cic_ussd/processor/menu.py index 042f8680..568409c8 100644 --- a/apps/cic-ussd/cic_ussd/processor/menu.py +++ b/apps/cic-ussd/cic_ussd/processor/menu.py @@ -37,7 +37,7 @@ class MenuProcessor: def __init__(self, account: Account, display_key: str, menu_name: str, session: Session, ussd_session: dict): self.account = account self.display_key = display_key - self.identifier = bytes.fromhex(self.account.blockchain_address[2:]) + self.identifier = bytes.fromhex(self.account.blockchain_address) self.menu_name = menu_name self.session = session self.ussd_session = ussd_session diff --git a/apps/cic-ussd/cic_ussd/tasks/callback_handler.py b/apps/cic-ussd/cic_ussd/tasks/callback_handler.py index f3a80caf..30bce11f 100644 --- a/apps/cic-ussd/cic_ussd/tasks/callback_handler.py +++ b/apps/cic-ussd/cic_ussd/tasks/callback_handler.py @@ -5,7 +5,6 @@ from datetime import timedelta # third-party imports import celery -from chainlib.hash import strip_0x # local imports from cic_ussd.account.balance import get_balances, calculate_available_balance @@ -55,6 +54,7 @@ def account_creation_callback(self, result: str, url: str, status_code: int): session.add(account) session.commit() session.close() + logg.debug(f'recorded account with identifier: {result}') queue = self.request.delivery_info.get('routing_key') s_phone_pointer = celery.signature( @@ -86,7 +86,7 @@ def balances_callback(result: list, param: str, status_code: int): raise ValueError(f'Unexpected status code: {status_code}.') balances = result[0] - identifier = bytes.fromhex(strip_0x(param)) + identifier = bytes.fromhex(param) key = cache_data_key(identifier, ':cic.balances') cache_data(key, json.dumps(balances)) @@ -113,8 +113,10 @@ def statement_callback(self, result, param: str, status_code: int): for transaction in statement_transactions: recipient_transaction, sender_transaction = transaction_actors(transaction) if recipient_transaction.get('blockchain_address') == param: + recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address') generate(param, queue, recipient_transaction) if sender_transaction.get('blockchain_address') == param: + sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address') generate(param, queue, sender_transaction) diff --git a/apps/cic-ussd/cic_ussd/tasks/metadata.py b/apps/cic-ussd/cic_ussd/tasks/metadata.py index ff16970d..bd3b4d1b 100644 --- a/apps/cic-ussd/cic_ussd/tasks/metadata.py +++ b/apps/cic-ussd/cic_ussd/tasks/metadata.py @@ -3,7 +3,6 @@ import logging # third-party imports import celery -from hexathon import strip_0x # local imports from cic_ussd.metadata import CustomMetadata, PersonMetadata, PhonePointerMetadata, PreferencesMetadata @@ -21,7 +20,7 @@ def query_person_metadata(blockchain_address: str): :return: :rtype: """ - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) person_metadata_client = PersonMetadata(identifier=identifier) person_metadata_client.query() @@ -36,14 +35,14 @@ def create_person_metadata(blockchain_address: str, data: dict): :return: :rtype: """ - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) person_metadata_client = PersonMetadata(identifier=identifier) person_metadata_client.create(data=data) @celery_app.task def edit_person_metadata(blockchain_address: str, data: dict): - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) person_metadata_client = PersonMetadata(identifier=identifier) person_metadata_client.edit(data=data) @@ -51,21 +50,21 @@ def edit_person_metadata(blockchain_address: str, data: dict): @celery_app.task(bind=True, base=CriticalMetadataTask) def add_phone_pointer(self, blockchain_address: str, phone_number: str): identifier = phone_number.encode('utf-8') - stripped_address = strip_0x(blockchain_address) + stripped_address = blockchain_address phone_metadata_client = PhonePointerMetadata(identifier=identifier) phone_metadata_client.create(data=stripped_address) @celery_app.task() def add_custom_metadata(blockchain_address: str, data: dict): - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) custom_metadata_client = CustomMetadata(identifier=identifier) custom_metadata_client.create(data=data) @celery_app.task() def add_preferences_metadata(blockchain_address: str, data: dict): - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) preferences_metadata_client = PreferencesMetadata(identifier=identifier) preferences_metadata_client.create(data=data) @@ -76,7 +75,7 @@ def query_preferences_metadata(blockchain_address: str): :param blockchain_address: Blockchain address of an account. :type blockchain_address: str | Ox-hex """ - identifier = bytes.fromhex(strip_0x(blockchain_address)) + identifier = bytes.fromhex(blockchain_address) logg.debug(f'Retrieving preferences metadata for address: {blockchain_address}.') person_metadata_client = PreferencesMetadata(identifier=identifier) return person_metadata_client.query() diff --git a/apps/cic-ussd/cic_ussd/tasks/processor.py b/apps/cic-ussd/cic_ussd/tasks/processor.py index 8a188f54..04440ee4 100644 --- a/apps/cic-ussd/cic_ussd/tasks/processor.py +++ b/apps/cic-ussd/cic_ussd/tasks/processor.py @@ -5,7 +5,6 @@ import logging # third-party imports import celery import i18n -from chainlib.hash import strip_0x # local imports from cic_ussd.account.metadata import get_cached_preferred_language @@ -24,17 +23,13 @@ logg = logging.getLogger(__file__) def generate_statement(self, querying_party: str, transaction: dict): """""" queue = self.request.delivery_info.get('routing_key') - - s_preferences = celery.signature( - 'cic_ussd.tasks.metadata.query_preferences_metadata', [querying_party], queue=queue - ) s_parse_transaction = celery.signature( 'cic_ussd.tasks.processor.parse_transaction', [transaction], queue=queue ) s_cache_statement = celery.signature( 'cic_ussd.tasks.processor.cache_statement', [querying_party], queue=queue ) - celery.chain(s_preferences, s_parse_transaction, s_cache_statement).apply_async() + celery.chain(s_parse_transaction, s_cache_statement).apply_async() @celery_app.task @@ -53,7 +48,7 @@ def cache_statement(parsed_transaction: dict, querying_party: str): statement_transactions = json.loads(cached_statement) statement_transactions.append(parsed_transaction) data = json.dumps(statement_transactions) - identifier = bytes.fromhex(strip_0x(querying_party)) + identifier = bytes.fromhex(querying_party) key = cache_data_key(identifier, ':cic.statement') cache_data(key, data) diff --git a/apps/cic-ussd/tests/cic_ussd/account/test_statement.py b/apps/cic-ussd/tests/cic_ussd/account/test_statement.py index 0e05c383..82468fec 100644 --- a/apps/cic-ussd/tests/cic_ussd/account/test_statement.py +++ b/apps/cic-ussd/tests/cic_ussd/account/test_statement.py @@ -28,7 +28,6 @@ def test_filter_statement_transactions(transactions_list): def test_generate(activated_account, cache_default_token_data, - cache_statement, cache_preferences, celery_session_worker, init_cache, @@ -37,22 +36,22 @@ def test_generate(activated_account, preferences, preferences_metadata_url, transactions_list): - with requests_mock.Mocker(real_http=False) as request_mocker: - request_mocker.register_uri('GET', preferences_metadata_url, status_code=200, reason='OK', json=preferences) - statement_transactions = filter_statement_transactions(transactions_list) - for transaction in statement_transactions: - querying_party = activated_account.blockchain_address - recipient_transaction, sender_transaction = transaction_actors(transaction) - if recipient_transaction.get('blockchain_address') == querying_party: - generate(querying_party, None, recipient_transaction) - if sender_transaction.get('blockchain_address') == querying_party: - generate(querying_party, None, sender_transaction) - time.sleep(2) - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) - key = cache_data_key(identifier, ':cic.statement') - statement = get_cached_data(key) - statement = json.loads(statement) - assert len(statement) == 1 + statement_transactions = filter_statement_transactions(transactions_list) + for transaction in statement_transactions: + querying_party = activated_account.blockchain_address + recipient_transaction, sender_transaction = transaction_actors(transaction) + if recipient_transaction.get('blockchain_address') == querying_party: + recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address') + generate(querying_party, None, recipient_transaction) + if sender_transaction.get('blockchain_address') == querying_party: + sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address') + generate(querying_party, None, sender_transaction) + time.sleep(2) + identifier = bytes.fromhex(activated_account.blockchain_address) + key = cache_data_key(identifier, ':cic.statement') + statement = get_cached_data(key) + statement = json.loads(statement) + assert len(statement) == 1 def test_get_cached_statement(activated_account, cache_statement, statement): diff --git a/apps/cic-ussd/tests/cic_ussd/processor/test_menu.py b/apps/cic-ussd/tests/cic_ussd/processor/test_menu.py index 422c4829..a343647b 100644 --- a/apps/cic-ussd/tests/cic_ussd/processor/test_menu.py +++ b/apps/cic-ussd/tests/cic_ussd/processor/test_menu.py @@ -57,7 +57,7 @@ def test_menu_processor(activated_account, available_balance=available_balance, token_symbol=token_symbol) - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) + identifier = bytes.fromhex(activated_account.blockchain_address) key = cache_data_key(identifier, ':cic.adjusted_balance') adjusted_balance = 45931650.64654012 cache_data(key, json.dumps(adjusted_balance)) @@ -108,7 +108,7 @@ def test_menu_processor(activated_account, display_key = 'ussd.kenya.display_user_metadata' ussd_menu = UssdMenu.find_by_name('display_user_metadata') name = ussd_menu.get('name') - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) + identifier = bytes.fromhex(activated_account.blockchain_address) person_metadata = PersonMetadata(identifier) cached_person_metadata = person_metadata.get_cached_metadata() resp = response(activated_account, display_key, name, init_database, generic_ussd_session) diff --git a/apps/cic-ussd/tests/cic_ussd/tasks/test_callback_handler.py b/apps/cic-ussd/tests/cic_ussd/tasks/test_callback_handler.py index b08472b0..fa017add 100644 --- a/apps/cic-ussd/tests/cic_ussd/tasks/test_callback_handler.py +++ b/apps/cic-ussd/tests/cic_ussd/tasks/test_callback_handler.py @@ -114,6 +114,7 @@ def test_statement_callback(activated_account, mocker, transactions_list): s_statement_callback.apply_async().get() statement_transactions = filter_statement_transactions(transactions_list) recipient_transaction, sender_transaction = transaction_actors(statement_transactions[0]) + sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address') mock_statement_generate.assert_called_with( (activated_account.blockchain_address, sender_transaction), {}, queue='cic-ussd') diff --git a/apps/cic-ussd/tests/fixtures/account.py b/apps/cic-ussd/tests/fixtures/account.py index e2703877..48034a03 100644 --- a/apps/cic-ussd/tests/fixtures/account.py +++ b/apps/cic-ussd/tests/fixtures/account.py @@ -54,7 +54,7 @@ def cache_account_creation_data(init_cache, account_creation_data): @pytest.fixture(scope='function') def cache_balances(activated_account, balances, init_cache): - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) + identifier = bytes.fromhex(activated_account.blockchain_address) balances = json.dumps(balances[0]) key = cache_data_key(identifier, ':cic.balances') cache_data(key, balances) @@ -70,7 +70,7 @@ def cache_default_token_data(default_token_data, init_cache, load_chain_spec): @pytest.fixture(scope='function') def cache_person_metadata(activated_account, init_cache, person_metadata): - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) + identifier = bytes.fromhex(activated_account.blockchain_address) person = json.dumps(person_metadata) key = cache_data_key(identifier, ':cic.person') cache_data(key, person) @@ -78,7 +78,7 @@ def cache_person_metadata(activated_account, init_cache, person_metadata): @pytest.fixture(scope='function') def cache_preferences(activated_account, init_cache, preferences): - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) + identifier = bytes.fromhex(activated_account.blockchain_address) preferences = json.dumps(preferences) key = cache_data_key(identifier, ':cic.preferences') cache_data(key, preferences) @@ -86,10 +86,10 @@ def cache_preferences(activated_account, init_cache, preferences): @pytest.fixture(scope='function') def cache_statement(activated_account, init_cache, statement): - identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) - preferences = json.dumps(statement) + identifier = bytes.fromhex(activated_account.blockchain_address) + statement = json.dumps(statement) key = cache_data_key(identifier, ':cic.statement') - cache_data(key, preferences) + cache_data(key, statement) @pytest.fixture(scope='function') diff --git a/apps/cic-ussd/tests/fixtures/transaction.py b/apps/cic-ussd/tests/fixtures/transaction.py index 78953da4..dbdfe901 100644 --- a/apps/cic-ussd/tests/fixtures/transaction.py +++ b/apps/cic-ussd/tests/fixtures/transaction.py @@ -7,6 +7,7 @@ import pytest # local import from cic_ussd.account.balance import get_cached_available_balance + # tests imports @@ -103,8 +104,8 @@ def transactions_list(activated_account, valid_recipient): 'destination_token': '0x0000000000000000000000000000000000000000', 'block_number': 80, 'tx_index': 0, - 'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', - 'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A', + 'sender': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', + 'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A', 'from_value': 0, 'to_value': 0, 'date_created': '2021-07-14T14:13:46.036198', @@ -122,8 +123,8 @@ def transactions_list(activated_account, valid_recipient): 'destination_token': '0x0000000000000000000000000000000000000000', 'block_number': 78, 'tx_index': 0, - 'sender': '0xb41BfEE260693A473254D62b81aE1ADCC9E51AFb', - 'recipient': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', + 'sender': 'b41BfEE260693A473254D62b81aE1ADCC9E51AFb', + 'recipient': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', 'from_value': 1800000000000000, 'to_value': 1800000000000000, 'date_created': '2021-07-14T14:13:35.839638', @@ -142,8 +143,8 @@ def transactions_list(activated_account, valid_recipient): 'destination_token': '0x0000000000000000000000000000000000000000', 'block_number': 79, 'tx_index': 0, - 'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', - 'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A', + 'sender': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', + 'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A', 'from_value': 0, 'to_value': 0, 'date_created': '2021-07-14T14:13:35.638355', @@ -152,4 +153,3 @@ def transactions_list(activated_account, valid_recipient): 'timestamp': 1626272015, 'hash': '0x32ca3dd3bef06463b452f4d32f5f563d083cb4759219eed90f3d2a9c1791c5fc'} ] - diff --git a/apps/cic-ussd/tests/helpers/accounts.py b/apps/cic-ussd/tests/helpers/accounts.py index 93f175a7..8c432719 100644 --- a/apps/cic-ussd/tests/helpers/accounts.py +++ b/apps/cic-ussd/tests/helpers/accounts.py @@ -4,7 +4,6 @@ import random import uuid # external imports -from chainlib.eth.address import to_checksum_address from faker import Faker from faker_e164.providers import E164Provider @@ -21,7 +20,7 @@ def phone_number() -> str: def blockchain_address() -> str: - return to_checksum_address('0x' + os.urandom(20).hex()) + return os.urandom(20).hex().lower() def session_id() -> str: