bug: cic-eth transaction listings
This commit is contained in:
		
							parent
							
								
									8a9d2ee0be
								
							
						
					
					
						commit
						f5bfc8ace2
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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',
 | 
			
		||||
                [
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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'],
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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 = {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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']
 | 
			
		||||
 | 
			
		||||
@ -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'])
 | 
			
		||||
 | 
			
		||||
@ -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(
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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):
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								apps/cic-ussd/tests/fixtures/account.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								apps/cic-ussd/tests/fixtures/account.py
									
									
									
									
										vendored
									
									
								
							@ -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')
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								apps/cic-ussd/tests/fixtures/transaction.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								apps/cic-ussd/tests/fixtures/transaction.py
									
									
									
									
										vendored
									
									
								
							@ -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'}
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user