Merge remote-tracking branch 'origin/master' into lash/okota
This commit is contained in:
commit
1add4d615c
@ -13,7 +13,7 @@ from chainlib.eth.sign import (
|
|||||||
new_account,
|
new_account,
|
||||||
sign_message,
|
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.eth.tx import TxFormat
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
from chainlib.error import JSONRPCException
|
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.nonce import Nonce
|
||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
from cic_eth.db.models.role import AccountRole
|
from cic_eth.db.models.role import AccountRole
|
||||||
|
from cic_eth.encode import tx_normalize
|
||||||
from cic_eth.error import (
|
from cic_eth.error import (
|
||||||
RoleMissingError,
|
RoleMissingError,
|
||||||
SignerError,
|
SignerError,
|
||||||
@ -85,7 +86,7 @@ def create(self, password, chain_spec_dict):
|
|||||||
# TODO: It seems infeasible that a can be None in any case, verify
|
# TODO: It seems infeasible that a can be None in any case, verify
|
||||||
if a == None:
|
if a == None:
|
||||||
raise SignerError('create account')
|
raise SignerError('create account')
|
||||||
|
a = tx_normalize.wallet_address(a)
|
||||||
logg.debug('created account {}'.format(a))
|
logg.debug('created account {}'.format(a))
|
||||||
|
|
||||||
# Initialize nonce provider record for account
|
# Initialize nonce provider record for account
|
||||||
@ -176,6 +177,9 @@ def gift(self, account_address, chain_spec_dict):
|
|||||||
"""
|
"""
|
||||||
chain_spec = ChainSpec.from_dict(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))
|
logg.debug('gift account address {} to index'.format(account_address))
|
||||||
queue = self.request.delivery_info.get('routing_key')
|
queue = self.request.delivery_info.get('routing_key')
|
||||||
|
|
||||||
@ -249,8 +253,9 @@ def have(self, account, chain_spec_dict):
|
|||||||
|
|
||||||
@celery_app.task(bind=True, base=CriticalSQLAlchemyTask)
|
@celery_app.task(bind=True, base=CriticalSQLAlchemyTask)
|
||||||
def set_role(self, tag, address, chain_spec_dict):
|
def set_role(self, tag, address, chain_spec_dict):
|
||||||
if not to_checksum_address(address):
|
if not is_address(address):
|
||||||
raise ValueError('invalid checksum address {}'.format(address))
|
raise ValueError('invalid address {}'.format(address))
|
||||||
|
address = tx_normalize.wallet_address(address)
|
||||||
session = SessionBase.create_session()
|
session = SessionBase.create_session()
|
||||||
role = AccountRole.set(tag, address, session=session)
|
role = AccountRole.set(tag, address, session=session)
|
||||||
session.add(role)
|
session.add(role)
|
||||||
|
@ -12,6 +12,7 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainlib.eth.address import (
|
from chainlib.eth.address import (
|
||||||
is_checksum_address,
|
is_checksum_address,
|
||||||
to_checksum_address,
|
to_checksum_address,
|
||||||
|
is_address
|
||||||
)
|
)
|
||||||
from chainlib.connection import RPCConnection
|
from chainlib.connection import RPCConnection
|
||||||
from chainqueue.db.enum import StatusBits
|
from chainqueue.db.enum import StatusBits
|
||||||
@ -77,7 +78,6 @@ class MaxGasOracle:
|
|||||||
return MAXIMUM_FEE_UNITS
|
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):
|
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.
|
"""Creates a celery task signature for a check_gas task that adds the task to the outgoing queue to be processed by the dispatcher.
|
||||||
|
|
||||||
@ -184,7 +184,7 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga
|
|||||||
"""
|
"""
|
||||||
rpc_format_address = None
|
rpc_format_address = None
|
||||||
if address != None:
|
if address != None:
|
||||||
if not is_checksum_address(address):
|
if not is_address(address):
|
||||||
raise ValueError('invalid address {}'.format(address))
|
raise ValueError('invalid address {}'.format(address))
|
||||||
address = tx_normalize.wallet_address(address)
|
address = tx_normalize.wallet_address(address)
|
||||||
address = add_0x(address)
|
address = add_0x(address)
|
||||||
|
@ -3,11 +3,12 @@ import logging
|
|||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
import celery
|
import celery
|
||||||
from chainlib.eth.address import is_checksum_address
|
from chainlib.eth.address import is_checksum_address, is_address, strip_0x
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.db.models.role import AccountRole
|
from cic_eth.db.models.role import AccountRole
|
||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
|
from cic_eth.encode import tx_normalize
|
||||||
from cic_eth.task import CriticalSQLAlchemyTask
|
from cic_eth.task import CriticalSQLAlchemyTask
|
||||||
from cic_eth.db.models.nonce import (
|
from cic_eth.db.models.nonce import (
|
||||||
Nonce,
|
Nonce,
|
||||||
@ -42,7 +43,8 @@ class CustodialTaskNonceOracle():
|
|||||||
:returns: Nonce
|
:returns: Nonce
|
||||||
:rtype: number
|
: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]
|
return r[1]
|
||||||
|
|
||||||
|
|
||||||
@ -58,17 +60,18 @@ def reserve_nonce(self, chained_input, chain_spec_dict, signer_address=None):
|
|||||||
address = chained_input
|
address = chained_input
|
||||||
logg.debug('non-explicit address for reserve nonce, using arg head {}'.format(chained_input))
|
logg.debug('non-explicit address for reserve nonce, using arg head {}'.format(chained_input))
|
||||||
else:
|
else:
|
||||||
if is_checksum_address(signer_address):
|
if is_address(signer_address):
|
||||||
address = signer_address
|
address = signer_address
|
||||||
logg.debug('explicit address for reserve nonce {}'.format(signer_address))
|
logg.debug('explicit address for reserve nonce {}'.format(signer_address))
|
||||||
else:
|
else:
|
||||||
address = AccountRole.get_address(signer_address, session=session)
|
address = AccountRole.get_address(signer_address, session=session)
|
||||||
logg.debug('role for reserve nonce {} -> {}'.format(signer_address, address))
|
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))
|
raise ValueError('invalid result when resolving address for nonce {}'.format(address))
|
||||||
|
|
||||||
root_id = self.request.root_id
|
root_id = self.request.root_id
|
||||||
|
address = tx_normalize.wallet_address(address)
|
||||||
r = NonceReservation.next(address, root_id, session=session)
|
r = NonceReservation.next(address, root_id, session=session)
|
||||||
logg.debug('nonce {} reserved for address {} task {}'.format(r[1], address, r[0]))
|
logg.debug('nonce {} reserved for address {} task {}'.format(r[1], address, r[0]))
|
||||||
|
|
||||||
|
@ -153,8 +153,8 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
|||||||
times = tx_times(tx['hash'], chain_spec)
|
times = tx_times(tx['hash'], chain_spec)
|
||||||
tx_r = {
|
tx_r = {
|
||||||
'hash': tx['hash'],
|
'hash': tx['hash'],
|
||||||
'sender': tx['from'],
|
'sender': tx_normalize.wallet_address(tx['from']),
|
||||||
'recipient': tx_address,
|
'recipient': tx_normalize.wallet_address(tx_address),
|
||||||
'source_value': tx_token_value,
|
'source_value': tx_token_value,
|
||||||
'destination_value': tx_token_value,
|
'destination_value': tx_token_value,
|
||||||
'source_token': tx['to'],
|
'source_token': tx['to'],
|
||||||
@ -231,6 +231,8 @@ def tx_collate(self, tx_batches, chain_spec_dict, offset, limit, newest_first=Tr
|
|||||||
except UnknownContractError:
|
except UnknownContractError:
|
||||||
logg.error('verify failed on tx {}, skipping'.format(tx['hash']))
|
logg.error('verify failed on tx {}, skipping'.format(tx['hash']))
|
||||||
continue
|
continue
|
||||||
|
tx['recipient'] = tx_normalize.wallet_address(tx['recipient'])
|
||||||
|
tx['sender'] = tx_normalize.wallet_address(tx['sender'])
|
||||||
txs.append(tx)
|
txs.append(tx)
|
||||||
|
|
||||||
return txs
|
return txs
|
||||||
|
@ -21,6 +21,7 @@ from erc20_faucet import Faucet
|
|||||||
# local imports
|
# local imports
|
||||||
from .base import SyncFilter
|
from .base import SyncFilter
|
||||||
from cic_eth.eth.meta import ExtendedTx
|
from cic_eth.eth.meta import ExtendedTx
|
||||||
|
from cic_eth.encode import tx_normalize
|
||||||
|
|
||||||
logg = logging.getLogger().getChild(__name__)
|
logg = logging.getLogger().getChild(__name__)
|
||||||
|
|
||||||
@ -42,9 +43,9 @@ class CallbackFilter(SyncFilter):
|
|||||||
return (None, None)
|
return (None, None)
|
||||||
r = ERC20.parse_transfer_request(tx.payload)
|
r = ERC20.parse_transfer_request(tx.payload)
|
||||||
transfer_data = {}
|
transfer_data = {}
|
||||||
transfer_data['to'] = r[0]
|
transfer_data['to'] = tx_normalize.wallet_address(r[0])
|
||||||
transfer_data['value'] = r[1]
|
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]
|
transfer_data['token_address'] = tx.inputs[0]
|
||||||
return ('transfer', transfer_data)
|
return ('transfer', transfer_data)
|
||||||
|
|
||||||
@ -54,8 +55,8 @@ class CallbackFilter(SyncFilter):
|
|||||||
return (None, None)
|
return (None, None)
|
||||||
r = ERC20.parse_transfer_from_request(tx.payload)
|
r = ERC20.parse_transfer_from_request(tx.payload)
|
||||||
transfer_data = {}
|
transfer_data = {}
|
||||||
transfer_data['from'] = r[0]
|
transfer_data['from'] = tx_normalize.wallet_address(r[0])
|
||||||
transfer_data['to'] = r[1]
|
transfer_data['to'] = tx_normalize.wallet_address(r[1])
|
||||||
transfer_data['value'] = r[2]
|
transfer_data['value'] = r[2]
|
||||||
transfer_data['token_address'] = tx.inputs[0]
|
transfer_data['token_address'] = tx.inputs[0]
|
||||||
return ('transferfrom', transfer_data)
|
return ('transferfrom', transfer_data)
|
||||||
@ -66,9 +67,9 @@ class CallbackFilter(SyncFilter):
|
|||||||
return (None, None)
|
return (None, None)
|
||||||
r = Faucet.parse_give_to_request(tx.payload)
|
r = Faucet.parse_give_to_request(tx.payload)
|
||||||
transfer_data = {}
|
transfer_data = {}
|
||||||
transfer_data['to'] = r[0]
|
transfer_data['to'] = tx_normalize.wallet_address(r[0])
|
||||||
transfer_data['value'] = tx.value
|
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]
|
#transfer_data['token_address'] = tx.inputs[0]
|
||||||
faucet_contract = tx.inputs[0]
|
faucet_contract = tx.inputs[0]
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from cic_eth_registry import CICRegistry
|
|||||||
from erc20_transfer_authorization import TransferAuthorization
|
from erc20_transfer_authorization import TransferAuthorization
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
|
from cic_eth.encode import tx_normalize
|
||||||
from .base import SyncFilter
|
from .base import SyncFilter
|
||||||
|
|
||||||
|
|
||||||
@ -52,9 +53,9 @@ class TransferAuthFilter(SyncFilter):
|
|||||||
|
|
||||||
r = TransferAuthorization.parse_create_request_request(tx.payload)
|
r = TransferAuthorization.parse_create_request_request(tx.payload)
|
||||||
|
|
||||||
sender = r[0]
|
sender = tx_normalize.wallet_address(r[0])
|
||||||
recipient = r[1]
|
recipient = tx_normalize.wallet_address(r[1])
|
||||||
token = r[2]
|
token = tx_normalize.executable_address(r[2])
|
||||||
value = r[3]
|
value = r[3]
|
||||||
|
|
||||||
token_data = {
|
token_data = {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
celery==4.4.7
|
celery==4.4.7
|
||||||
chainlib-eth>=0.0.9a14,<0.1.0
|
chainlib-eth>=0.0.9rc2,<0.1.0
|
||||||
semver==2.13.0
|
semver==2.13.0
|
||||||
crypto-dev-signer>=0.4.15rc2,<0.5.0
|
crypto-dev-signer>=0.4.15rc2,<0.5.0
|
||||||
|
@ -110,8 +110,8 @@ def test_tag_account(
|
|||||||
t = api.tag_account('bar', agent_roles['CAROL'], default_chain_spec)
|
t = api.tag_account('bar', agent_roles['CAROL'], default_chain_spec)
|
||||||
t.get()
|
t.get()
|
||||||
|
|
||||||
assert AccountRole.get_address('foo', init_database) == agent_roles['ALICE']
|
assert AccountRole.get_address('foo', init_database) == tx_normalize.wallet_address(agent_roles['ALICE'])
|
||||||
assert AccountRole.get_address('bar', init_database) == agent_roles['CAROL']
|
assert AccountRole.get_address('bar', init_database) == tx_normalize.wallet_address(agent_roles['CAROL'])
|
||||||
|
|
||||||
|
|
||||||
def test_tx(
|
def test_tx(
|
||||||
|
@ -101,7 +101,7 @@ def get_cached_available_balance(blockchain_address: str) -> float:
|
|||||||
:return: Operational balance of an account.
|
:return: Operational balance of an account.
|
||||||
:rtype: float
|
:rtype: float
|
||||||
"""
|
"""
|
||||||
identifier = bytes.fromhex(blockchain_address[2:])
|
identifier = bytes.fromhex(blockchain_address)
|
||||||
key = cache_data_key(identifier, salt=':cic.balances')
|
key = cache_data_key(identifier, salt=':cic.balances')
|
||||||
cached_balances = get_cached_data(key=key)
|
cached_balances = get_cached_data(key=key)
|
||||||
if cached_balances:
|
if cached_balances:
|
||||||
|
@ -4,7 +4,6 @@ import logging
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from chainlib.hash import strip_0x
|
|
||||||
from cic_types.models.person import Person
|
from cic_types.models.person import Person
|
||||||
|
|
||||||
# local imports
|
# 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.
|
:return: Account's set preferred language | Fallback preferred language.
|
||||||
:rtype: str
|
:rtype: str
|
||||||
"""
|
"""
|
||||||
identifier = bytes.fromhex(strip_0x(blockchain_address))
|
identifier = bytes.fromhex(blockchain_address)
|
||||||
preferences_metadata_handler = PreferencesMetadata(identifier)
|
preferences_metadata_handler = PreferencesMetadata(identifier)
|
||||||
cached_preferences_metadata = preferences_metadata_handler.get_cached_metadata()
|
cached_preferences_metadata = preferences_metadata_handler.get_cached_metadata()
|
||||||
if cached_preferences_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.
|
:param limit: Number of transactions to be returned.
|
||||||
:type limit: int
|
: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__()
|
chain_str = Chain.spec.__str__()
|
||||||
cic_eth_api = Api(
|
cic_eth_api = Api(
|
||||||
chain_str=chain_str,
|
chain_str=chain_str,
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from chainlib.hash import strip_0x
|
|
||||||
from cic_eth.api import Api
|
from cic_eth.api import Api
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
@ -101,7 +100,7 @@ class Account(SessionBase):
|
|||||||
session.add(self)
|
session.add(self)
|
||||||
session.flush()
|
session.flush()
|
||||||
SessionBase.release_session(session=session)
|
SessionBase.release_session(session=session)
|
||||||
return f'Pin reset successful.'
|
return 'Pin reset successful.'
|
||||||
|
|
||||||
def standard_metadata_id(self) -> str:
|
def standard_metadata_id(self) -> str:
|
||||||
"""This function creates an account's standard metadata identification information that contains an account owner's
|
"""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.
|
:return: Standard metadata identification information | e164 formatted phone number.
|
||||||
:rtype: str
|
:rtype: str
|
||||||
"""
|
"""
|
||||||
identifier = bytes.fromhex(strip_0x(self.blockchain_address))
|
identifier = bytes.fromhex(self.blockchain_address)
|
||||||
key = cache_data_key(identifier, ':cic.person')
|
key = cache_data_key(identifier, ':cic.person')
|
||||||
account_metadata = get_cached_data(key)
|
account_metadata = get_cached_data(key)
|
||||||
if not account_metadata:
|
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):
|
def __init__(self, account: Account, display_key: str, menu_name: str, session: Session, ussd_session: dict):
|
||||||
self.account = account
|
self.account = account
|
||||||
self.display_key = display_key
|
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.menu_name = menu_name
|
||||||
self.session = session
|
self.session = session
|
||||||
self.ussd_session = ussd_session
|
self.ussd_session = ussd_session
|
||||||
|
@ -5,7 +5,6 @@ from datetime import timedelta
|
|||||||
|
|
||||||
# third-party imports
|
# third-party imports
|
||||||
import celery
|
import celery
|
||||||
from chainlib.hash import strip_0x
|
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_ussd.account.balance import get_balances, calculate_available_balance
|
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.add(account)
|
||||||
session.commit()
|
session.commit()
|
||||||
session.close()
|
session.close()
|
||||||
|
logg.debug(f'recorded account with identifier: {result}')
|
||||||
|
|
||||||
queue = self.request.delivery_info.get('routing_key')
|
queue = self.request.delivery_info.get('routing_key')
|
||||||
s_phone_pointer = celery.signature(
|
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}.')
|
raise ValueError(f'Unexpected status code: {status_code}.')
|
||||||
|
|
||||||
balances = result[0]
|
balances = result[0]
|
||||||
identifier = bytes.fromhex(strip_0x(param))
|
identifier = bytes.fromhex(param)
|
||||||
key = cache_data_key(identifier, ':cic.balances')
|
key = cache_data_key(identifier, ':cic.balances')
|
||||||
cache_data(key, json.dumps(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:
|
for transaction in statement_transactions:
|
||||||
recipient_transaction, sender_transaction = transaction_actors(transaction)
|
recipient_transaction, sender_transaction = transaction_actors(transaction)
|
||||||
if recipient_transaction.get('blockchain_address') == param:
|
if recipient_transaction.get('blockchain_address') == param:
|
||||||
|
recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address')
|
||||||
generate(param, queue, recipient_transaction)
|
generate(param, queue, recipient_transaction)
|
||||||
if sender_transaction.get('blockchain_address') == param:
|
if sender_transaction.get('blockchain_address') == param:
|
||||||
|
sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address')
|
||||||
generate(param, queue, sender_transaction)
|
generate(param, queue, sender_transaction)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ import logging
|
|||||||
|
|
||||||
# third-party imports
|
# third-party imports
|
||||||
import celery
|
import celery
|
||||||
from hexathon import strip_0x
|
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_ussd.metadata import CustomMetadata, PersonMetadata, PhonePointerMetadata, PreferencesMetadata
|
from cic_ussd.metadata import CustomMetadata, PersonMetadata, PhonePointerMetadata, PreferencesMetadata
|
||||||
@ -21,7 +20,7 @@ def query_person_metadata(blockchain_address: str):
|
|||||||
:return:
|
:return:
|
||||||
:rtype:
|
:rtype:
|
||||||
"""
|
"""
|
||||||
identifier = bytes.fromhex(strip_0x(blockchain_address))
|
identifier = bytes.fromhex(blockchain_address)
|
||||||
person_metadata_client = PersonMetadata(identifier=identifier)
|
person_metadata_client = PersonMetadata(identifier=identifier)
|
||||||
person_metadata_client.query()
|
person_metadata_client.query()
|
||||||
|
|
||||||
@ -36,14 +35,14 @@ def create_person_metadata(blockchain_address: str, data: dict):
|
|||||||
:return:
|
:return:
|
||||||
:rtype:
|
:rtype:
|
||||||
"""
|
"""
|
||||||
identifier = bytes.fromhex(strip_0x(blockchain_address))
|
identifier = bytes.fromhex(blockchain_address)
|
||||||
person_metadata_client = PersonMetadata(identifier=identifier)
|
person_metadata_client = PersonMetadata(identifier=identifier)
|
||||||
person_metadata_client.create(data=data)
|
person_metadata_client.create(data=data)
|
||||||
|
|
||||||
|
|
||||||
@celery_app.task
|
@celery_app.task
|
||||||
def edit_person_metadata(blockchain_address: str, data: dict):
|
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 = PersonMetadata(identifier=identifier)
|
||||||
person_metadata_client.edit(data=data)
|
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)
|
@celery_app.task(bind=True, base=CriticalMetadataTask)
|
||||||
def add_phone_pointer(self, blockchain_address: str, phone_number: str):
|
def add_phone_pointer(self, blockchain_address: str, phone_number: str):
|
||||||
identifier = phone_number.encode('utf-8')
|
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 = PhonePointerMetadata(identifier=identifier)
|
||||||
phone_metadata_client.create(data=stripped_address)
|
phone_metadata_client.create(data=stripped_address)
|
||||||
|
|
||||||
|
|
||||||
@celery_app.task()
|
@celery_app.task()
|
||||||
def add_custom_metadata(blockchain_address: str, data: dict):
|
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 = CustomMetadata(identifier=identifier)
|
||||||
custom_metadata_client.create(data=data)
|
custom_metadata_client.create(data=data)
|
||||||
|
|
||||||
|
|
||||||
@celery_app.task()
|
@celery_app.task()
|
||||||
def add_preferences_metadata(blockchain_address: str, data: dict):
|
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 = PreferencesMetadata(identifier=identifier)
|
||||||
preferences_metadata_client.create(data=data)
|
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.
|
:param blockchain_address: Blockchain address of an account.
|
||||||
:type blockchain_address: str | Ox-hex
|
: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}.')
|
logg.debug(f'Retrieving preferences metadata for address: {blockchain_address}.')
|
||||||
person_metadata_client = PreferencesMetadata(identifier=identifier)
|
person_metadata_client = PreferencesMetadata(identifier=identifier)
|
||||||
return person_metadata_client.query()
|
return person_metadata_client.query()
|
||||||
|
@ -5,7 +5,6 @@ import logging
|
|||||||
# third-party imports
|
# third-party imports
|
||||||
import celery
|
import celery
|
||||||
import i18n
|
import i18n
|
||||||
from chainlib.hash import strip_0x
|
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_ussd.account.metadata import get_cached_preferred_language
|
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):
|
def generate_statement(self, querying_party: str, transaction: dict):
|
||||||
""""""
|
""""""
|
||||||
queue = self.request.delivery_info.get('routing_key')
|
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(
|
s_parse_transaction = celery.signature(
|
||||||
'cic_ussd.tasks.processor.parse_transaction', [transaction], queue=queue
|
'cic_ussd.tasks.processor.parse_transaction', [transaction], queue=queue
|
||||||
)
|
)
|
||||||
s_cache_statement = celery.signature(
|
s_cache_statement = celery.signature(
|
||||||
'cic_ussd.tasks.processor.cache_statement', [querying_party], queue=queue
|
'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
|
@celery_app.task
|
||||||
@ -53,7 +48,7 @@ def cache_statement(parsed_transaction: dict, querying_party: str):
|
|||||||
statement_transactions = json.loads(cached_statement)
|
statement_transactions = json.loads(cached_statement)
|
||||||
statement_transactions.append(parsed_transaction)
|
statement_transactions.append(parsed_transaction)
|
||||||
data = json.dumps(statement_transactions)
|
data = json.dumps(statement_transactions)
|
||||||
identifier = bytes.fromhex(strip_0x(querying_party))
|
identifier = bytes.fromhex(querying_party)
|
||||||
key = cache_data_key(identifier, ':cic.statement')
|
key = cache_data_key(identifier, ':cic.statement')
|
||||||
cache_data(key, data)
|
cache_data(key, data)
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ def test_filter_statement_transactions(transactions_list):
|
|||||||
|
|
||||||
def test_generate(activated_account,
|
def test_generate(activated_account,
|
||||||
cache_default_token_data,
|
cache_default_token_data,
|
||||||
cache_statement,
|
|
||||||
cache_preferences,
|
cache_preferences,
|
||||||
celery_session_worker,
|
celery_session_worker,
|
||||||
init_cache,
|
init_cache,
|
||||||
@ -37,18 +36,18 @@ def test_generate(activated_account,
|
|||||||
preferences,
|
preferences,
|
||||||
preferences_metadata_url,
|
preferences_metadata_url,
|
||||||
transactions_list):
|
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)
|
statement_transactions = filter_statement_transactions(transactions_list)
|
||||||
for transaction in statement_transactions:
|
for transaction in statement_transactions:
|
||||||
querying_party = activated_account.blockchain_address
|
querying_party = activated_account.blockchain_address
|
||||||
recipient_transaction, sender_transaction = transaction_actors(transaction)
|
recipient_transaction, sender_transaction = transaction_actors(transaction)
|
||||||
if recipient_transaction.get('blockchain_address') == querying_party:
|
if recipient_transaction.get('blockchain_address') == querying_party:
|
||||||
|
recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address')
|
||||||
generate(querying_party, None, recipient_transaction)
|
generate(querying_party, None, recipient_transaction)
|
||||||
if sender_transaction.get('blockchain_address') == querying_party:
|
if sender_transaction.get('blockchain_address') == querying_party:
|
||||||
|
sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address')
|
||||||
generate(querying_party, None, sender_transaction)
|
generate(querying_party, None, sender_transaction)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address))
|
identifier = bytes.fromhex(activated_account.blockchain_address)
|
||||||
key = cache_data_key(identifier, ':cic.statement')
|
key = cache_data_key(identifier, ':cic.statement')
|
||||||
statement = get_cached_data(key)
|
statement = get_cached_data(key)
|
||||||
statement = json.loads(statement)
|
statement = json.loads(statement)
|
||||||
|
@ -57,7 +57,7 @@ def test_menu_processor(activated_account,
|
|||||||
available_balance=available_balance,
|
available_balance=available_balance,
|
||||||
token_symbol=token_symbol)
|
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')
|
key = cache_data_key(identifier, ':cic.adjusted_balance')
|
||||||
adjusted_balance = 45931650.64654012
|
adjusted_balance = 45931650.64654012
|
||||||
cache_data(key, json.dumps(adjusted_balance))
|
cache_data(key, json.dumps(adjusted_balance))
|
||||||
@ -108,7 +108,7 @@ def test_menu_processor(activated_account,
|
|||||||
display_key = 'ussd.kenya.display_user_metadata'
|
display_key = 'ussd.kenya.display_user_metadata'
|
||||||
ussd_menu = UssdMenu.find_by_name('display_user_metadata')
|
ussd_menu = UssdMenu.find_by_name('display_user_metadata')
|
||||||
name = ussd_menu.get('name')
|
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)
|
person_metadata = PersonMetadata(identifier)
|
||||||
cached_person_metadata = person_metadata.get_cached_metadata()
|
cached_person_metadata = person_metadata.get_cached_metadata()
|
||||||
resp = response(activated_account, display_key, name, init_database, generic_ussd_session)
|
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()
|
s_statement_callback.apply_async().get()
|
||||||
statement_transactions = filter_statement_transactions(transactions_list)
|
statement_transactions = filter_statement_transactions(transactions_list)
|
||||||
recipient_transaction, sender_transaction = transaction_actors(statement_transactions[0])
|
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(
|
mock_statement_generate.assert_called_with(
|
||||||
(activated_account.blockchain_address, sender_transaction), {}, queue='cic-ussd')
|
(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')
|
@pytest.fixture(scope='function')
|
||||||
def cache_balances(activated_account, balances, init_cache):
|
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])
|
balances = json.dumps(balances[0])
|
||||||
key = cache_data_key(identifier, ':cic.balances')
|
key = cache_data_key(identifier, ':cic.balances')
|
||||||
cache_data(key, 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')
|
@pytest.fixture(scope='function')
|
||||||
def cache_person_metadata(activated_account, init_cache, person_metadata):
|
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)
|
person = json.dumps(person_metadata)
|
||||||
key = cache_data_key(identifier, ':cic.person')
|
key = cache_data_key(identifier, ':cic.person')
|
||||||
cache_data(key, person)
|
cache_data(key, person)
|
||||||
@ -78,7 +78,7 @@ def cache_person_metadata(activated_account, init_cache, person_metadata):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def cache_preferences(activated_account, init_cache, preferences):
|
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)
|
preferences = json.dumps(preferences)
|
||||||
key = cache_data_key(identifier, ':cic.preferences')
|
key = cache_data_key(identifier, ':cic.preferences')
|
||||||
cache_data(key, preferences)
|
cache_data(key, preferences)
|
||||||
@ -86,10 +86,10 @@ def cache_preferences(activated_account, init_cache, preferences):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def cache_statement(activated_account, init_cache, statement):
|
def cache_statement(activated_account, init_cache, statement):
|
||||||
identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address))
|
identifier = bytes.fromhex(activated_account.blockchain_address)
|
||||||
preferences = json.dumps(statement)
|
statement = json.dumps(statement)
|
||||||
key = cache_data_key(identifier, ':cic.statement')
|
key = cache_data_key(identifier, ':cic.statement')
|
||||||
cache_data(key, preferences)
|
cache_data(key, statement)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@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
|
# local import
|
||||||
from cic_ussd.account.balance import get_cached_available_balance
|
from cic_ussd.account.balance import get_cached_available_balance
|
||||||
|
|
||||||
|
|
||||||
# tests imports
|
# tests imports
|
||||||
|
|
||||||
|
|
||||||
@ -103,8 +104,8 @@ def transactions_list(activated_account, valid_recipient):
|
|||||||
'destination_token': '0x0000000000000000000000000000000000000000',
|
'destination_token': '0x0000000000000000000000000000000000000000',
|
||||||
'block_number': 80,
|
'block_number': 80,
|
||||||
'tx_index': 0,
|
'tx_index': 0,
|
||||||
'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
'sender': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
||||||
'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A',
|
'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A',
|
||||||
'from_value': 0,
|
'from_value': 0,
|
||||||
'to_value': 0,
|
'to_value': 0,
|
||||||
'date_created': '2021-07-14T14:13:46.036198',
|
'date_created': '2021-07-14T14:13:46.036198',
|
||||||
@ -122,8 +123,8 @@ def transactions_list(activated_account, valid_recipient):
|
|||||||
'destination_token': '0x0000000000000000000000000000000000000000',
|
'destination_token': '0x0000000000000000000000000000000000000000',
|
||||||
'block_number': 78,
|
'block_number': 78,
|
||||||
'tx_index': 0,
|
'tx_index': 0,
|
||||||
'sender': '0xb41BfEE260693A473254D62b81aE1ADCC9E51AFb',
|
'sender': 'b41BfEE260693A473254D62b81aE1ADCC9E51AFb',
|
||||||
'recipient': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
'recipient': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
||||||
'from_value': 1800000000000000,
|
'from_value': 1800000000000000,
|
||||||
'to_value': 1800000000000000,
|
'to_value': 1800000000000000,
|
||||||
'date_created': '2021-07-14T14:13:35.839638',
|
'date_created': '2021-07-14T14:13:35.839638',
|
||||||
@ -142,8 +143,8 @@ def transactions_list(activated_account, valid_recipient):
|
|||||||
'destination_token': '0x0000000000000000000000000000000000000000',
|
'destination_token': '0x0000000000000000000000000000000000000000',
|
||||||
'block_number': 79,
|
'block_number': 79,
|
||||||
'tx_index': 0,
|
'tx_index': 0,
|
||||||
'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
'sender': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
|
||||||
'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A',
|
'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A',
|
||||||
'from_value': 0,
|
'from_value': 0,
|
||||||
'to_value': 0,
|
'to_value': 0,
|
||||||
'date_created': '2021-07-14T14:13:35.638355',
|
'date_created': '2021-07-14T14:13:35.638355',
|
||||||
@ -152,4 +153,3 @@ def transactions_list(activated_account, valid_recipient):
|
|||||||
'timestamp': 1626272015,
|
'timestamp': 1626272015,
|
||||||
'hash': '0x32ca3dd3bef06463b452f4d32f5f563d083cb4759219eed90f3d2a9c1791c5fc'}
|
'hash': '0x32ca3dd3bef06463b452f4d32f5f563d083cb4759219eed90f3d2a9c1791c5fc'}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import random
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from chainlib.eth.address import to_checksum_address
|
|
||||||
from faker import Faker
|
from faker import Faker
|
||||||
from faker_e164.providers import E164Provider
|
from faker_e164.providers import E164Provider
|
||||||
|
|
||||||
@ -21,7 +20,7 @@ def phone_number() -> str:
|
|||||||
|
|
||||||
|
|
||||||
def blockchain_address() -> str:
|
def blockchain_address() -> str:
|
||||||
return to_checksum_address('0x' + os.urandom(20).hex())
|
return os.urandom(20).hex().lower()
|
||||||
|
|
||||||
|
|
||||||
def session_id() -> str:
|
def session_id() -> str:
|
||||||
|
Loading…
Reference in New Issue
Block a user