Compare commits

..

1 Commits

Author SHA1 Message Date
0ef2a9b247 changed Nyuma to Rudi 2021-10-06 10:07:04 +00:00
69 changed files with 273 additions and 1222 deletions

1
.gitignore vendored
View File

@@ -15,4 +15,3 @@ build/
.idea .idea
**/.vim **/.vim
**/*secret.yaml **/*secret.yaml
**/*.bash_history

View File

@@ -19,11 +19,6 @@ Run app/contract-migration to deploy contracts
RUN_MASK=3 docker-compose up contract-migration RUN_MASK=3 docker-compose up contract-migration
``` ```
View container status
```
docker ps --filter network=cic-network --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" --all
```
stop cluster stop cluster
``` ```
docker-compose down docker-compose down

View File

@@ -1,10 +0,0 @@
#! /bin/bash
set -e
set -u
echo "fetching migration variables from $CONTRACT_MIGRATION_URL"
for s in $(curl -s "$CONTRACT_MIGRATION_URL/readyz" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
echo "exporting $s"
export $s
done

View File

@@ -1,23 +0,0 @@
#!/bin/bash
set -e
set -u
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600}
. ./db.sh
if [ $? -ne "0" ]; then
>&2 echo db migrate fail
exit 1
fi
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint
/usr/local/bin/uwsgi --wsgi-file /root/cic_cache/runnable/daemons/server.py --http :8000 --pyargv "-vv"
else
/usr/local/bin/uwsgi --wsgi-file /root/cic_cache/runnable/daemons/server.py --http :8000 --pyargv "-vv"
fi

View File

@@ -1,23 +0,0 @@
#!/bin/bash
set -e
set -u
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600}
. ./db.sh
if [ $? -ne "0" ]; then
>&2 echo db migrate fail
exit 1
fi
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint
/usr/local/bin/cic-cache-taskerd -vv
else
/usr/local/bin/cic-cache-taskerd -vv
fi

View File

@@ -1,10 +1,5 @@
#!/bin/bash #!/bin/bash
set -e
set -u
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600}
. ./db.sh . ./db.sh
if [ $? -ne "0" ]; then if [ $? -ne "0" ]; then
@@ -12,12 +7,4 @@ if [ $? -ne "0" ]; then
exit 1 exit 1
fi fi
if [[ "$CONTRACT_MIGRATION_URL" ]]; then /usr/local/bin/cic-cache-trackerd $@
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
docker/wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source docker/get_readyz.sh # set env vars form endpoint
/usr/local/bin/cic-cache-trackerd $@
else
/usr/local/bin/cic-cache-trackerd $@
fi

View File

@@ -1,182 +0,0 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi

View File

@@ -1,5 +1,5 @@
SQLAlchemy==1.3.20 SQLAlchemy==1.3.20
cic-eth-registry>=0.6.1a3,<0.7.0 cic-eth-registry>=0.6.1a2,<0.7.0
hexathon~=0.0.1a8 hexathon~=0.0.1a8
chainqueue>=0.0.4a6,<0.1.0 chainqueue>=0.0.4a6,<0.1.0
eth-erc20>=0.1.2a2,<0.2.0 eth-erc20>=0.1.2a2,<0.2.0

View File

@@ -9,7 +9,6 @@ import logging
# external imports # external imports
import celery import celery
from chainlib.chain import ChainSpec from chainlib.chain import ChainSpec
from hexathon import strip_0x
# local imports # local imports
from cic_eth.api.base import ApiBase from cic_eth.api.base import ApiBase
@@ -255,8 +254,6 @@ class Api(ApiBase):
:returns: uuid of root task :returns: uuid of root task
:rtype: celery.Task :rtype: celery.Task
""" """
#from_address = strip_0x(from_address)
#to_address = strip_0x(to_address)
s_check = celery.signature( s_check = celery.signature(
'cic_eth.admin.ctrl.check_lock', 'cic_eth.admin.ctrl.check_lock',
[ [

View File

@@ -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, is_address from chainlib.eth.address import to_checksum_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,7 +31,6 @@ 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,
@@ -50,7 +49,6 @@ from cic_eth.queue.tx import (
from cic_eth.encode import ( from cic_eth.encode import (
unpack_normal, unpack_normal,
ZERO_ADDRESS_NORMAL, ZERO_ADDRESS_NORMAL,
tx_normalize,
) )
logg = logging.getLogger() logg = logging.getLogger()
@@ -86,7 +84,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
@@ -177,9 +175,6 @@ 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')
@@ -253,9 +248,8 @@ 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 is_address(address): if not to_checksum_address(address):
raise ValueError('invalid address {}'.format(address)) raise ValueError('invalid checksum 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)
@@ -304,15 +298,13 @@ def cache_gift_data(
tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex)) tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex))
tx = unpack_normal(tx_signed_raw_bytes, chain_spec) tx = unpack_normal(tx_signed_raw_bytes, chain_spec)
tx_data = Faucet.parse_give_to_request(tx['data']) 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() session = self.create_session()
tx_dict = { tx_dict = {
'hash': tx['hash'], 'hash': tx['hash'],
'from': sender_address, 'from': tx['from'],
'to': recipient_address, 'to': tx['to'],
'source_token': ZERO_ADDRESS_NORMAL, 'source_token': ZERO_ADDRESS_NORMAL,
'destination_token': ZERO_ADDRESS_NORMAL, 'destination_token': ZERO_ADDRESS_NORMAL,
'from_value': 0, 'from_value': 0,
@@ -346,14 +338,12 @@ def cache_account_data(
tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex)) tx_signed_raw_bytes = bytes.fromhex(strip_0x(tx_signed_raw_hex))
tx = unpack_normal(tx_signed_raw_bytes, chain_spec) tx = unpack_normal(tx_signed_raw_bytes, chain_spec)
tx_data = AccountsIndex.parse_add_request(tx['data']) 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() session = SessionBase.create_session()
tx_dict = { tx_dict = {
'hash': tx['hash'], 'hash': tx['hash'],
'from': sender_address, 'from': tx['from'],
'to': recipient_address, 'to': tx['to'],
'source_token': ZERO_ADDRESS_NORMAL, 'source_token': ZERO_ADDRESS_NORMAL,
'destination_token': ZERO_ADDRESS_NORMAL, 'destination_token': ZERO_ADDRESS_NORMAL,
'from_value': 0, 'from_value': 0,

View File

@@ -12,10 +12,7 @@ from chainlib.eth.tx import (
) )
from cic_eth_registry import CICRegistry from cic_eth_registry import CICRegistry
from cic_eth_registry.erc20 import ERC20Token from cic_eth_registry.erc20 import ERC20Token
from hexathon import ( from hexathon import strip_0x
strip_0x,
add_0x,
)
from chainqueue.error import NotLocalTxError from chainqueue.error import NotLocalTxError
from eth_erc20 import ERC20 from eth_erc20 import ERC20
from chainqueue.sql.tx import cache_tx_dict from chainqueue.sql.tx import cache_tx_dict
@@ -41,7 +38,6 @@ from cic_eth.task import (
CriticalSQLAlchemyAndSignerTask, CriticalSQLAlchemyAndSignerTask,
) )
from cic_eth.eth.nonce import CustodialTaskNonceOracle from cic_eth.eth.nonce import CustodialTaskNonceOracle
from cic_eth.encode import tx_normalize
celery_app = celery.current_app celery_app = celery.current_app
logg = logging.getLogger() logg = logging.getLogger()
@@ -66,8 +62,7 @@ def balance(tokens, holder_address, chain_spec_dict):
for t in tokens: for t in tokens:
address = t['address'] address = t['address']
logg.debug('address {} {}'.format(address, holder_address)) token = ERC20Token(chain_spec, rpc, address)
token = ERC20Token(chain_spec, rpc, add_0x(address))
c = ERC20(chain_spec) c = ERC20(chain_spec)
o = c.balance_of(address, holder_address, sender_address=caller_address) o = c.balance_of(address, holder_address, sender_address=caller_address)
r = rpc.do(o) r = rpc.do(o)
@@ -376,15 +371,13 @@ def cache_transfer_data(
tx = unpack(tx_signed_raw_bytes, chain_spec) tx = unpack(tx_signed_raw_bytes, chain_spec)
tx_data = ERC20.parse_transfer_request(tx['data']) tx_data = ERC20.parse_transfer_request(tx['data'])
sender_address = tx_normalize.wallet_address(tx['from']) recipient_address = tx_data[0]
recipient_address = tx_normalize.wallet_address(tx_data[0])
token_value = tx_data[1] token_value = tx_data[1]
session = SessionBase.create_session() session = SessionBase.create_session()
tx_dict = { tx_dict = {
'hash': tx_hash_hex, 'hash': tx_hash_hex,
'from': sender_address, 'from': tx['from'],
'to': recipient_address, 'to': recipient_address,
'source_token': tx['to'], 'source_token': tx['to'],
'destination_token': tx['to'], 'destination_token': tx['to'],
@@ -455,14 +448,13 @@ def cache_approve_data(
tx = unpack(tx_signed_raw_bytes, chain_spec) tx = unpack(tx_signed_raw_bytes, chain_spec)
tx_data = ERC20.parse_approve_request(tx['data']) tx_data = ERC20.parse_approve_request(tx['data'])
sender_address = tx_normalize.wallet_address(tx['from']) recipient_address = tx_data[0]
recipient_address = tx_normalize.wallet_address(tx_data[0])
token_value = tx_data[1] token_value = tx_data[1]
session = SessionBase.create_session() session = SessionBase.create_session()
tx_dict = { tx_dict = {
'hash': tx_hash_hex, 'hash': tx_hash_hex,
'from': sender_address, 'from': tx['from'],
'to': recipient_address, 'to': recipient_address,
'source_token': tx['to'], 'source_token': tx['to'],
'destination_token': tx['to'], 'destination_token': tx['to'],

View File

@@ -9,11 +9,7 @@ from hexathon import (
) )
#from chainlib.eth.constant import ZERO_ADDRESS #from chainlib.eth.constant import ZERO_ADDRESS
from chainlib.chain import ChainSpec from chainlib.chain import ChainSpec
from chainlib.eth.address import ( from chainlib.eth.address import is_checksum_address
is_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
from chainqueue.sql.tx import cache_tx_dict from chainqueue.sql.tx import cache_tx_dict
@@ -78,6 +74,7 @@ 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.
@@ -182,9 +179,8 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga
:return: Signed raw transaction data list :return: Signed raw transaction data list
:rtype: param txs, unchanged :rtype: param txs, unchanged
""" """
rpc_format_address = None
if address != None: if address != None:
if not is_address(address): if not is_checksum_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)
@@ -199,6 +195,7 @@ def check_gas(self, tx_hashes_hex, chain_spec_dict, txs_hex=[], address=None, ga
txs.append(tx) txs.append(tx)
chain_spec = ChainSpec.from_dict(chain_spec_dict) chain_spec = ChainSpec.from_dict(chain_spec_dict)
logg.debug('txs {} tx_hashes {}'.format(txs, tx_hashes))
addresspass = None addresspass = None
if len(txs) == 0: if len(txs) == 0:
@@ -214,15 +211,13 @@ 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'])) raise ValueError('txs passed to check gas must all have same sender; had {} got {}'.format(address, tx['from']))
addresspass.append(address) addresspass.append(address)
rpc_format_address = add_0x(to_checksum_address(address))
queue = self.request.delivery_info.get('routing_key') queue = self.request.delivery_info.get('routing_key')
conn = RPCConnection.connect(chain_spec) conn = RPCConnection.connect(chain_spec)
gas_balance = 0 gas_balance = 0
try: try:
o = balance(rpc_format_address) o = balance(address)
r = conn.do(o) r = conn.do(o)
conn.disconnect() conn.disconnect()
gas_balance = abi_decode_single(ABIContractType.UINT256, r) gas_balance = abi_decode_single(ABIContractType.UINT256, r)

View File

@@ -2,9 +2,8 @@
from chainlib.eth.constant import ZERO_ADDRESS from chainlib.eth.constant import ZERO_ADDRESS
from chainlib.status import Status as TxStatus from chainlib.status import Status as TxStatus
from cic_eth_registry.erc20 import ERC20Token from cic_eth_registry.erc20 import ERC20Token
from hexathon import add_0x
# local impor:ts # local imports
from cic_eth.ext.address import translate_address from cic_eth.ext.address import translate_address
@@ -45,8 +44,8 @@ class ExtendedTx:
destination = source destination = source
if destination_value == None: if destination_value == None:
destination_value = source_value destination_value = source_value
st = ERC20Token(self.chain_spec, self.rpc, add_0x(source)) st = ERC20Token(self.chain_spec, self.rpc, source)
dt = ERC20Token(self.chain_spec, self.rpc, add_0x(destination)) dt = ERC20Token(self.chain_spec, self.rpc, destination)
self.source_token = source self.source_token = source
self.source_token_symbol = st.symbol self.source_token_symbol = st.symbol
self.source_token_name = st.name self.source_token_name = st.name

View File

@@ -3,12 +3,11 @@ import logging
# external imports # external imports
import celery import celery
from chainlib.eth.address import is_checksum_address, is_address, strip_0x from chainlib.eth.address import is_checksum_address
# 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,
@@ -43,8 +42,7 @@ class CustodialTaskNonceOracle():
:returns: Nonce :returns: Nonce
:rtype: number :rtype: number
""" """
address = tx_normalize.wallet_address(self.address) r = NonceReservation.release(self.address, self.uuid, session=self.session)
r = NonceReservation.release(address, self.uuid, session=self.session)
return r[1] return r[1]
@@ -60,18 +58,17 @@ 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_address(signer_address): if is_checksum_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_address(address): if not is_checksum_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]))

View File

@@ -32,7 +32,6 @@ from potaahto.symbols import snake_and_camel
from cic_eth.queue.time import tx_times from cic_eth.queue.time import tx_times
from cic_eth.task import BaseTask from cic_eth.task import BaseTask
from cic_eth.db.models.base import SessionBase from cic_eth.db.models.base import SessionBase
from cic_eth.encode import tx_normalize
celery_app = celery.current_app celery_app = celery.current_app
logg = logging.getLogger() logg = logging.getLogger()
@@ -135,7 +134,7 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
tx_address = transfer_data[0] tx_address = transfer_data[0]
tx_token_value = transfer_data[1] tx_token_value = transfer_data[1]
if tx_normalize.wallet_address(address) == tx_normalize.wallet_address(tx_address): if address == tx_address:
status = StatusEnum.SENT status = StatusEnum.SENT
try: try:
o = receipt(tx['hash']) o = receipt(tx['hash'])
@@ -153,8 +152,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_normalize.wallet_address(tx['from']), 'sender': tx['from'],
'recipient': tx_normalize.wallet_address(tx_address), 'recipient': 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'],
@@ -165,12 +164,12 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
tx_r['date_created'] = times['queue'] tx_r['date_created'] = times['queue']
else: else:
tx_r['date_created'] = times['network'] tx_r['date_created'] = times['network']
txs[strip_0x(tx['hash'])] = tx_r txs[tx['hash']] = tx_r
break break
return txs return txs
# TODO: Surely it must be possible to optimize this # TODO: Surely it must be possible to optimize this
# TODO: DRY this with callback filter in cic_eth/runnable/manager # TODO: DRY this with callback filter in cic_eth/runnable/manager
# TODO: Remove redundant fields from end representation (timestamp, tx_hash) # TODO: Remove redundant fields from end representation (timestamp, tx_hash)
@@ -231,8 +230,6 @@ 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

View File

@@ -58,7 +58,6 @@ def get_tx_local(chain_spec, tx_hash, session=None):
@celery_app.task(base=CriticalSQLAlchemyTask) @celery_app.task(base=CriticalSQLAlchemyTask)
def get_account_tx(chain_spec_dict, address, as_sender=True, as_recipient=True, counterpart=None): 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) 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) return get_account_tx_local(chain_spec, address, as_sender=as_sender, as_recipient=as_recipient, counterpart=counterpart)

View File

@@ -21,7 +21,6 @@ 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__)
@@ -43,9 +42,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'] = tx_normalize.wallet_address(r[0]) transfer_data['to'] = r[0]
transfer_data['value'] = r[1] transfer_data['value'] = r[1]
transfer_data['from'] = tx_normalize.wallet_address(tx.outputs[0]) transfer_data['from'] = 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)
@@ -55,8 +54,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'] = tx_normalize.wallet_address(r[0]) transfer_data['from'] = r[0]
transfer_data['to'] = tx_normalize.wallet_address(r[1]) transfer_data['to'] = 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)
@@ -67,9 +66,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'] = tx_normalize.wallet_address(r[0]) transfer_data['to'] = r[0]
transfer_data['value'] = tx.value transfer_data['value'] = tx.value
transfer_data['from'] = tx_normalize.wallet_address(tx.outputs[0]) transfer_data['from'] = 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]

View File

@@ -12,8 +12,7 @@ from hexathon import (
# local imports # local imports
from .base import SyncFilter from .base import SyncFilter
#logg = logging.getLogger(__name__) logg = logging.getLogger(__name__)
logg = logging.getLogger()
account_registry_add_log_hash = '0x9cc987676e7d63379f176ea50df0ae8d2d9d1141d1231d4ce15b5965f73c9430' account_registry_add_log_hash = '0x9cc987676e7d63379f176ea50df0ae8d2d9d1141d1231d4ce15b5965f73c9430'

View File

@@ -17,7 +17,6 @@ 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
@@ -53,9 +52,9 @@ class TransferAuthFilter(SyncFilter):
r = TransferAuthorization.parse_create_request_request(tx.payload) r = TransferAuthorization.parse_create_request_request(tx.payload)
sender = tx_normalize.wallet_address(r[0]) sender = r[0]
recipient = tx_normalize.wallet_address(r[1]) recipient = r[1]
token = tx_normalize.executable_address(r[2]) token = r[2]
value = r[3] value = r[3]
token_data = { token_data = {

View File

@@ -206,7 +206,7 @@ def main():
BaseTask.default_token_symbol = config.get('CIC_DEFAULT_TOKEN_SYMBOL') BaseTask.default_token_symbol = config.get('CIC_DEFAULT_TOKEN_SYMBOL')
BaseTask.default_token_address = registry.by_name(BaseTask.default_token_symbol) BaseTask.default_token_address = registry.by_name(BaseTask.default_token_symbol)
default_token = ERC20Token(chain_spec, conn, add_0x(BaseTask.default_token_address)) default_token = ERC20Token(chain_spec, conn, BaseTask.default_token_address)
default_token.load(conn) default_token.load(conn)
BaseTask.default_token_decimals = default_token.decimals BaseTask.default_token_decimals = default_token.decimals
BaseTask.default_token_name = default_token.name BaseTask.default_token_name = default_token.name

View File

@@ -1,10 +0,0 @@
#! /bin/bash
set -e
set -u
echo "fetching migration variables from $CONTRACT_MIGRATION_URL"
for s in $(curl -s "$CONTRACT_MIGRATION_URL/readyz" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
echo "exporting $s"
export $s
done

View File

@@ -1,17 +1,5 @@
#!/bin/bash #!/bin/bash
set -e
set -u
. ./db.sh . ./db.sh
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600} /usr/local/bin/cic-eth-dispatcherd $@
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint
/usr/local/bin/cic-eth-dispatcherd $@
else
/usr/local/bin/cic-eth-dispatcherd $@
fi

View File

@@ -1,18 +1,5 @@
#!/bin/bash #!/bin/bash
set -e
set -u
. ./db.sh . ./db.sh
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600} /usr/local/bin/cic-eth-retrierd $@
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint
/usr/local/bin/cic-eth-retrierd $@
else
/usr/local/bin/cic-eth-retrierd $@
fi

View File

@@ -1,18 +1,31 @@
#!/bin/bash #!/bin/bash
set -e set -e
set -u
. ./db.sh . ./db.sh
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600} # set CONFINI_ENV_PREFIX to override the env prefix to override env vars
#echo "!!! starting signer"
#python /usr/local/bin/crypto-dev-daemon -c /usr/local/etc/crypto-dev-signer -vv 2> /tmp/signer.log &
if [[ "$CONTRACT_MIGRATION_URL" ]]; then echo "!!! starting taskerd"
echo "waiting for $CONTRACT_MIGRATION_URL/readyz" /usr/local/bin/cic-eth-taskerd $@
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint # thanks! https://docs.docker.com/config/containers/multi-service_container/
/usr/local/bin/cic-eth-taskerd $@ #sleep 1;
else #echo "!!! entering monitor loop"
/usr/local/bin/cic-eth-taskerd $@ #while true; do
fi # ps aux | grep crypto-dev-daemon | grep -q -v grep
# PROCESS_1_STATUS=$?
# ps aux | grep cic-eth-tasker |grep -q -v grep
# PROCESS_2_STATUS=$?
# # If the greps above find anything, they exit with 0 status
# # If they are not both 0, then something is wrong
# if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
# echo "One of the processes has already exited."
# exit 1
# fi
# sleep 15;
#done
#
set +e

View File

@@ -1,17 +1,5 @@
#!/bin/bash #!/bin/bash
set -e
set -u
. ./db.sh . ./db.sh
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600} /usr/local/bin/cic-eth-trackerd $@
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./get_readyz.sh # set env vars form endpoint
/usr/local/bin/cic-eth-trackerd $@
else
/usr/local/bin/cic-eth-trackerd $@
fi

View File

@@ -1,182 +0,0 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi

View File

@@ -1,4 +1,3 @@
celery==4.4.7 celery==4.4.7
chainlib-eth>=0.0.9rc2,<0.1.0 chainlib-eth>=0.0.9a14,<0.1.0
semver==2.13.0 semver==2.13.0
crypto-dev-signer>=0.4.15rc2,<0.5.0

View File

@@ -8,7 +8,7 @@ pycryptodome==3.10.1
liveness~=0.0.1a7 liveness~=0.0.1a7
eth-address-index>=0.2.3a4,<0.3.0 eth-address-index>=0.2.3a4,<0.3.0
eth-accounts-index>=0.1.2a3,<0.2.0 eth-accounts-index>=0.1.2a3,<0.2.0
cic-eth-registry>=0.6.1a3,<0.7.0 cic-eth-registry>=0.6.1a2,<0.7.0
erc20-faucet>=0.3.2a2,<0.4.0 erc20-faucet>=0.3.2a2,<0.4.0
erc20-transfer-authorization>=0.3.5a2,<0.4.0 erc20-transfer-authorization>=0.3.5a2,<0.4.0
sarafu-faucet>=0.0.7a2,<0.1.0 sarafu-faucet>=0.0.7a2,<0.1.0

View File

@@ -18,10 +18,7 @@ from eth_erc20 import ERC20
from sarafu_faucet import MinterFaucet from sarafu_faucet import MinterFaucet
from eth_accounts_index.registry import AccountRegistry from eth_accounts_index.registry import AccountRegistry
from potaahto.symbols import snake_and_camel from potaahto.symbols import snake_and_camel
from hexathon import ( from hexathon import add_0x
add_0x,
strip_0x,
)
# local imports # local imports
from cic_eth.runnable.daemons.filters.callback import CallbackFilter from cic_eth.runnable.daemons.filters.callback import CallbackFilter
@@ -163,7 +160,7 @@ def test_faucet_gift_to_tx(
assert transfer_data['token_address'] == foo_token assert transfer_data['token_address'] == foo_token
def test_callback_filter_filter( def test_callback_filter(
default_chain_spec, default_chain_spec,
init_database, init_database,
eth_rpc, eth_rpc,
@@ -216,7 +213,6 @@ def test_callback_filter_filter(
def call_back(self, transfer_type, result): def call_back(self, transfer_type, result):
self.results[transfer_type] = result self.results[transfer_type] = result
logg.debug('result {}'.format(result))
return self return self
mock = CallbackMock() mock = CallbackMock()
@@ -225,4 +221,4 @@ def test_callback_filter_filter(
fltr.filter(eth_rpc, mockblock, tx, init_database) fltr.filter(eth_rpc, mockblock, tx, init_database)
assert mock.results.get('transfer') != None assert mock.results.get('transfer') != None
assert mock.results['transfer']['destination_token'] == strip_0x(foo_token) assert mock.results['transfer']['destination_token'] == foo_token

View File

@@ -17,9 +17,6 @@ from chainlib.eth.block import (
block_by_number, block_by_number,
Block, Block,
) )
from chainlib.eth.address import (
to_checksum_address,
)
from erc20_faucet import Faucet from erc20_faucet import Faucet
from hexathon import ( from hexathon import (
strip_0x, strip_0x,
@@ -28,6 +25,7 @@ from hexathon import (
# local imports # local imports
from cic_eth.runnable.daemons.filters.register import RegistrationFilter 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 from cic_eth.queue.query import get_account_tx_local
logg = logging.getLogger() logg = logging.getLogger()
@@ -72,13 +70,12 @@ def test_register_filter(
tx = Tx(tx_src, block=block, rcpt=rcpt) tx = Tx(tx_src, block=block, rcpt=rcpt)
tx.apply_receipt(rcpt) tx.apply_receipt(rcpt)
fltr = RegistrationFilter(default_chain_spec, to_checksum_address(os.urandom(20).hex()), queue=None) fltr = RegistrationFilter(default_chain_spec, add_0x(os.urandom(20).hex()), queue=None)
t = fltr.filter(eth_rpc, block, tx, db_session=init_database) t = fltr.filter(eth_rpc, block, tx, db_session=init_database)
assert t == None assert t == None
fltr = RegistrationFilter(default_chain_spec, to_checksum_address(account_registry), queue=None) fltr = RegistrationFilter(default_chain_spec, account_registry, queue=None)
t = fltr.filter(eth_rpc, block, tx, db_session=init_database) t = fltr.filter(eth_rpc, block, tx, db_session=init_database)
logg.debug('t {}'.format(t))
t.get_leaf() t.get_leaf()
assert t.successful() assert t.successful()
@@ -92,4 +89,4 @@ def test_register_filter(
gift_tx = unpack(tx_raw_signed_bytes, default_chain_spec) gift_tx = unpack(tx_raw_signed_bytes, default_chain_spec)
gift = Faucet.parse_give_to_request(gift_tx['data']) gift = Faucet.parse_give_to_request(gift_tx['data'])
assert add_0x(gift[0]) == agent_roles['ALICE'] assert gift[0] == agent_roles['ALICE']

View File

@@ -19,7 +19,6 @@ from chainqueue.sql.query import get_account_tx
# local imports # local imports
from cic_eth.runnable.daemons.filters.transferauth import TransferAuthFilter from cic_eth.runnable.daemons.filters.transferauth import TransferAuthFilter
from cic_eth.encode import tx_normalize
def test_filter_transferauth( def test_filter_transferauth(
@@ -67,8 +66,7 @@ def test_filter_transferauth(
t.get_leaf() t.get_leaf()
assert t.successful() 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()) ks = list(approve_txs.keys())
assert len(ks) == 1 assert len(ks) == 1
@@ -78,4 +76,4 @@ def test_filter_transferauth(
c = ERC20(default_chain_spec) c = ERC20(default_chain_spec)
approve = c.parse_approve_request(approve_tx['data']) approve = c.parse_approve_request(approve_tx['data'])
assert approve[0] == strip_0x(agent_roles['BOB']) assert approve[0] == agent_roles['BOB']

View File

@@ -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) == tx_normalize.wallet_address(agent_roles['ALICE']) assert AccountRole.get_address('foo', init_database) == agent_roles['ALICE']
assert AccountRole.get_address('bar', init_database) == tx_normalize.wallet_address(agent_roles['CAROL']) assert AccountRole.get_address('bar', init_database) == agent_roles['CAROL']
def test_tx( def test_tx(

View File

@@ -10,7 +10,6 @@ from cic_eth_registry.erc20 import ERC20Token
from chainlib.chain import ChainSpec from chainlib.chain import ChainSpec
from eth_accounts_index import AccountsIndex from eth_accounts_index import AccountsIndex
from chainlib.eth.tx import ( from chainlib.eth.tx import (
receipt,
transaction, transaction,
) )
from chainqueue.sql.state import ( from chainqueue.sql.state import (
@@ -30,7 +29,6 @@ def test_account_api(
init_database, init_database,
init_eth_rpc, init_eth_rpc,
account_registry, account_registry,
cic_registry,
custodial_roles, custodial_roles,
celery_session_worker, celery_session_worker,
): ):
@@ -51,7 +49,6 @@ def test_account_api_register(
eth_rpc, eth_rpc,
celery_session_worker, celery_session_worker,
): ):
api = Api(str(default_chain_spec), callback_param='accounts', callback_task='cic_eth.callbacks.noop.noop', queue=None) api = Api(str(default_chain_spec), callback_param='accounts', callback_task='cic_eth.callbacks.noop.noop', queue=None)
t = api.create_account('') t = api.create_account('')
register_tx_hash = t.get_leaf() register_tx_hash = t.get_leaf()
@@ -72,18 +69,12 @@ def test_account_api_register(
r = t.get_leaf() r = t.get_leaf()
assert t.successful() assert t.successful()
o = receipt(register_tx_hash)
r = eth_rpc.do(o)
assert r['status'] == 1
o = transaction(register_tx_hash) o = transaction(register_tx_hash)
tx_src = eth_rpc.do(o) tx_src = eth_rpc.do(o)
c = AccountsIndex(default_chain_spec) c = AccountsIndex(default_chain_spec)
address = c.parse_add_request(tx_src['data']) 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']) o = c.have(account_registry, address[0], sender_address=custodial_roles['CONTRACT_DEPLOYER'])
logg.debug('o {}'.format(o))
r = eth_rpc.do(o) r = eth_rpc.do(o)
assert c.parse_have(r) assert c.parse_have(r)

View File

@@ -3,22 +3,18 @@ import os
import logging import logging
# external imports # external imports
import pytest
from chainlib.eth.address import to_checksum_address from chainlib.eth.address import to_checksum_address
from hexathon import add_0x
# local imports # local imports
from cic_eth.api.api_task import Api from cic_eth.api.api_task import Api
logg = logging.getLogger() logg = logging.getLogger()
def test_balance_simple_api( def test_balance_simple_api(
default_chain_spec, default_chain_spec,
init_database, init_database,
cic_registry, cic_registry,
foo_token, foo_token,
register_lookups,
register_tokens, register_tokens,
api, api,
celery_session_worker, celery_session_worker,
@@ -26,7 +22,7 @@ def test_balance_simple_api(
chain_str = str(default_chain_spec) chain_str = str(default_chain_spec)
a = add_0x(to_checksum_address(os.urandom(20).hex())) a = to_checksum_address('0x' + os.urandom(20).hex())
t = api.balance(a, 'FOO', include_pending=False) t = api.balance(a, 'FOO', include_pending=False)
r = t.get_leaf() r = t.get_leaf()
assert t.successful() assert t.successful()
@@ -40,7 +36,6 @@ def test_balance_complex_api(
init_database, init_database,
cic_registry, cic_registry,
foo_token, foo_token,
register_lookups,
register_tokens, register_tokens,
api, api,
celery_session_worker, celery_session_worker,
@@ -48,7 +43,7 @@ def test_balance_complex_api(
chain_str = str(default_chain_spec) chain_str = str(default_chain_spec)
a = add_0x(to_checksum_address(os.urandom(20).hex())) a = to_checksum_address('0x' + os.urandom(20).hex())
t = api.balance(a, 'FOO', include_pending=True) t = api.balance(a, 'FOO', include_pending=True)
r = t.get_leaf() r = t.get_leaf()
assert t.successful() assert t.successful()

View File

@@ -6,7 +6,6 @@ import pytest
from chainlib.eth.nonce import RPCNonceOracle from chainlib.eth.nonce import RPCNonceOracle
from eth_erc20 import ERC20 from eth_erc20 import ERC20
from chainlib.eth.tx import receipt from chainlib.eth.tx import receipt
from hexathon import strip_0x
# local imports # local imports
from cic_eth.api.api_task import Api from cic_eth.api.api_task import Api
@@ -24,6 +23,7 @@ from cic_eth.pytest.mock.filter import (
logg = logging.getLogger() logg = logging.getLogger()
@pytest.mark.xfail()
def test_list_tx( def test_list_tx(
default_chain_spec, default_chain_spec,
init_database, init_database,
@@ -34,10 +34,8 @@ def test_list_tx(
agent_roles, agent_roles,
foo_token, foo_token,
register_tokens, register_tokens,
register_lookups,
init_eth_tester, init_eth_tester,
celery_session_worker, celery_session_worker,
init_celery_tasks,
): ):
tx_hashes = [] tx_hashes = []
@@ -65,16 +63,13 @@ def test_list_tx(
o = receipt(tx_hash_hex) o = receipt(tx_hash_hex)
r = eth_rpc.do(o) r = eth_rpc.do(o)
assert r['status'] == 1 assert r['status'] == 1
a = r['block_number'] a = r['block_number']
ab = a.to_bytes(4, 'big') block_filter.add(a.to_bytes(4, 'big'))
block_filter.add(ab)
bb = r['transaction_index'].to_bytes(4, 'big') a = r['block_number'] + r['transaction_index']
cb = ab + bb tx_filter.add(a.to_bytes(4, 'big'))
tx_filter.add(cb)
tx_hashes.append(strip_0x(tx_hash_hex)) tx_hashes.append(tx_hash_hex)
# external tx two # external tx two
Nonce.next(agent_roles['ALICE'], 'foo', session=init_database) Nonce.next(agent_roles['ALICE'], 'foo', session=init_database)
@@ -88,29 +83,26 @@ def test_list_tx(
o = receipt(tx_hash_hex) o = receipt(tx_hash_hex)
r = eth_rpc.do(o) r = eth_rpc.do(o)
assert r['status'] == 1 assert r['status'] == 1
a = r['block_number'] a = r['block_number']
ab = a.to_bytes(4, 'big') block_filter.add(a.to_bytes(4, 'big'))
block_filter.add(ab)
bb = r['transaction_index'].to_bytes(4, 'big') a = r['block_number'] + r['transaction_index']
cb = ab + bb tx_filter.add(a.to_bytes(4, 'big'))
tx_filter.add(cb)
tx_hashes.append(strip_0x(tx_hash_hex)) tx_hashes.append(tx_hash_hex)
init_eth_tester.mine_blocks(28) init_eth_tester.mine_blocks(28)
# custodial tx 1 # custodial tx 1
api = Api(str(default_chain_spec), queue=None) api = Api(str(default_chain_spec), queue=None)
t = api.transfer(agent_roles['ALICE'], agent_roles['CAROL'], 64, 'FOO') t = api.transfer(agent_roles['ALICE'], agent_roles['CAROL'], 64, 'FOO') #, 'blinky')
r = t.get_leaf() r = t.get_leaf()
assert t.successful() assert t.successful()
tx_hashes.append(r) tx_hashes.append(r)
# custodial tx 2 # custodial tx 2
api = Api(str(default_chain_spec), queue=None) api = Api(str(default_chain_spec), queue=None)
t = api.transfer(agent_roles['ALICE'], agent_roles['DAVE'], 16, 'FOO') t = api.transfer(agent_roles['ALICE'], agent_roles['DAVE'], 16, 'FOO') #, 'blinky')
r = t.get_leaf() r = t.get_leaf()
assert t.successful() assert t.successful()
tx_hashes.append(r) tx_hashes.append(r)
@@ -125,8 +117,7 @@ def test_list_tx(
assert len(r) == 3 assert len(r) == 3
logg.debug('rrrr {}'.format(r)) logg.debug('rrrr {}'.format(r))
logg.debug('testing against hashes {}'.format(tx_hashes))
for tx in r: for tx in r:
logg.debug('have tx {}'.format(tx)) logg.debug('have tx {}'.format(tx))
tx_hashes.remove(strip_0x(tx['hash'])) tx_hashes.remove(tx['hash'])
assert len(tx_hashes) == 1 assert len(tx_hashes) == 1

View File

@@ -10,7 +10,6 @@ from chainlib.eth.tx import (
) )
from eth_erc20 import ERC20 from eth_erc20 import ERC20
from chainlib.eth.nonce import RPCNonceOracle from chainlib.eth.nonce import RPCNonceOracle
from hexathon import add_0x
# local imports # local imports
from cic_eth.db.models.nonce import ( from cic_eth.db.models.nonce import (
@@ -92,5 +91,5 @@ def test_filter_process(
assert len(r) == 2 assert len(r) == 2
for tx_hash in r.keys(): for tx_hash in r.keys():
tx_hashes.remove(add_0x(tx_hash)) tx_hashes.remove(tx_hash)
assert len(tx_hashes) == 0 assert len(tx_hashes) == 0

View File

@@ -1,6 +1,6 @@
crypto-dev-signer>=0.4.15a7,<=0.4.15 crypto-dev-signer>=0.4.15a7,<=0.4.15
chainqueue>=0.0.5a1,<0.1.0 chainqueue>=0.0.5a1,<0.1.0
cic-eth-registry>=0.6.1a3,<0.7.0 cic-eth-registry>=0.6.1a2,<0.7.0
redis==3.5.3 redis==3.5.3
hexathon~=0.0.1a8 hexathon~=0.0.1a8
pycryptodome==3.10.1 pycryptodome==3.10.1

View File

@@ -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) identifier = bytes.fromhex(blockchain_address[2:])
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:

View File

@@ -4,6 +4,7 @@ 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
@@ -19,7 +20,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(blockchain_address) identifier = bytes.fromhex(strip_0x(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:

View File

@@ -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 statement for address: {blockchain_address}') logg.debug(f'retrieving balance 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,

View File

@@ -2,6 +2,7 @@
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
@@ -100,7 +101,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 'Pin reset successful.' return f'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
@@ -108,7 +109,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(self.blockchain_address) identifier = bytes.fromhex(strip_0x(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:

View File

@@ -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) self.identifier = bytes.fromhex(self.account.blockchain_address[2:])
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

View File

@@ -5,6 +5,7 @@ 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
@@ -54,7 +55,6 @@ 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(param) identifier = bytes.fromhex(strip_0x(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,10 +113,8 @@ 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)

View File

@@ -3,6 +3,7 @@ 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
@@ -20,7 +21,7 @@ def query_person_metadata(blockchain_address: str):
:return: :return:
:rtype: :rtype:
""" """
identifier = bytes.fromhex(blockchain_address) identifier = bytes.fromhex(strip_0x(blockchain_address))
person_metadata_client = PersonMetadata(identifier=identifier) person_metadata_client = PersonMetadata(identifier=identifier)
person_metadata_client.query() person_metadata_client.query()
@@ -35,14 +36,14 @@ def create_person_metadata(blockchain_address: str, data: dict):
:return: :return:
:rtype: :rtype:
""" """
identifier = bytes.fromhex(blockchain_address) identifier = bytes.fromhex(strip_0x(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(blockchain_address) identifier = bytes.fromhex(strip_0x(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)
@@ -50,21 +51,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 = blockchain_address stripped_address = strip_0x(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(blockchain_address) identifier = bytes.fromhex(strip_0x(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(blockchain_address) identifier = bytes.fromhex(strip_0x(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)
@@ -75,7 +76,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(blockchain_address) identifier = bytes.fromhex(strip_0x(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()

View File

@@ -5,6 +5,7 @@ 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
@@ -23,13 +24,17 @@ 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_parse_transaction, s_cache_statement).apply_async() celery.chain(s_preferences, s_parse_transaction, s_cache_statement).apply_async()
@celery_app.task @celery_app.task
@@ -48,7 +53,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(querying_party) identifier = bytes.fromhex(strip_0x(querying_party))
key = cache_data_key(identifier, ':cic.statement') key = cache_data_key(identifier, ':cic.statement')
cache_data(key, data) cache_data(key, data)

View File

@@ -1,10 +0,0 @@
#! /bin/bash
set -e
set -u
echo "fetching migration variables from $CONTRACT_MIGRATION_URL"
for s in $(curl -s "$CONTRACT_MIGRATION_URL/readyz" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
echo "exporting $s"
export $s
done

View File

@@ -1,182 +0,0 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi

View File

@@ -28,6 +28,7 @@ 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,
@@ -36,22 +37,22 @@ def test_generate(activated_account,
preferences, preferences,
preferences_metadata_url, preferences_metadata_url,
transactions_list): transactions_list):
statement_transactions = filter_statement_transactions(transactions_list) with requests_mock.Mocker(real_http=False) as request_mocker:
for transaction in statement_transactions: request_mocker.register_uri('GET', preferences_metadata_url, status_code=200, reason='OK', json=preferences)
querying_party = activated_account.blockchain_address statement_transactions = filter_statement_transactions(transactions_list)
recipient_transaction, sender_transaction = transaction_actors(transaction) for transaction in statement_transactions:
if recipient_transaction.get('blockchain_address') == querying_party: querying_party = activated_account.blockchain_address
recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address') recipient_transaction, sender_transaction = transaction_actors(transaction)
generate(querying_party, None, recipient_transaction) if recipient_transaction.get('blockchain_address') == querying_party:
if sender_transaction.get('blockchain_address') == querying_party: generate(querying_party, None, recipient_transaction)
sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address') if sender_transaction.get('blockchain_address') == querying_party:
generate(querying_party, None, sender_transaction) generate(querying_party, None, sender_transaction)
time.sleep(2) time.sleep(2)
identifier = bytes.fromhex(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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)
assert len(statement) == 1 assert len(statement) == 1
def test_get_cached_statement(activated_account, cache_statement, statement): def test_get_cached_statement(activated_account, cache_statement, statement):

View File

@@ -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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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)

View File

@@ -114,7 +114,6 @@ 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')

View File

@@ -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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(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(activated_account.blockchain_address) identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address))
statement = json.dumps(statement) preferences = json.dumps(statement)
key = cache_data_key(identifier, ':cic.statement') key = cache_data_key(identifier, ':cic.statement')
cache_data(key, statement) cache_data(key, preferences)
@pytest.fixture(scope='function') @pytest.fixture(scope='function')

View File

@@ -7,7 +7,6 @@ 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
@@ -104,8 +103,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': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', 'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A', 'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A',
'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',
@@ -123,8 +122,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': 'b41BfEE260693A473254D62b81aE1ADCC9E51AFb', 'sender': '0xb41BfEE260693A473254D62b81aE1ADCC9E51AFb',
'recipient': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', 'recipient': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
'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',
@@ -143,8 +142,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': '367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8', 'sender': '0x367cB0F65137b0A845c1DB4B7Ca47D3DEF32dDe8',
'recipient': '103d1ed6e370dBa6267045c70d4999384c18a04A', 'recipient': '0x103d1ed6e370dBa6267045c70d4999384c18a04A',
'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',
@@ -153,3 +152,4 @@ def transactions_list(activated_account, valid_recipient):
'timestamp': 1626272015, 'timestamp': 1626272015,
'hash': '0x32ca3dd3bef06463b452f4d32f5f563d083cb4759219eed90f3d2a9c1791c5fc'} 'hash': '0x32ca3dd3bef06463b452f4d32f5f563d083cb4759219eed90f3d2a9c1791c5fc'}
] ]

View File

@@ -4,6 +4,7 @@ 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
@@ -20,7 +21,7 @@ def phone_number() -> str:
def blockchain_address() -> str: def blockchain_address() -> str:
return os.urandom(20).hex().lower() return to_checksum_address('0x' + os.urandom(20).hex())
def session_id() -> str: def session_id() -> str:

View File

@@ -13,22 +13,22 @@ sw:
CON Weka jina lako la kwanza CON Weka jina lako la kwanza
enter_family_name: |- enter_family_name: |-
CON Weka jina lako la mwisho CON Weka jina lako la mwisho
0. Nyuma 0. Rudi
enter_date_of_birth: |- enter_date_of_birth: |-
CON Weka mwaka wa kuzaliwa CON Weka mwaka wa kuzaliwa
0. Nyuma 0. Rudi
enter_gender: |- enter_gender: |-
CON Weka jinsia yako CON Weka jinsia yako
1. Mwanaume 1. Mwanaume
2. Mwanamke 2. Mwanamke
3. Nyngine 3. Nyngine
0. Nyuma 0. Rudi
enter_location: |- enter_location: |-
CON Weka eneo lako CON Weka eneo lako
0. Nyuma 0. Rudi
enter_products: |- enter_products: |-
CON Weka bidhaa ama huduma unauza CON Weka bidhaa ama huduma unauza
0. Nyuma 0. Rudi
start: |- start: |-
CON Salio %{account_balance} %{account_token_name} CON Salio %{account_balance} %{account_token_name}
1. Tuma 1. Tuma
@@ -36,10 +36,10 @@ sw:
3. Usaidizi 3. Usaidizi
enter_transaction_recipient: |- enter_transaction_recipient: |-
CON Weka nambari ya simu CON Weka nambari ya simu
0. Nyuma 0. Rudi
enter_transaction_amount: |- enter_transaction_amount: |-
CON Weka kiwango CON Weka kiwango
0. Nyuma 0. Rudi
account_management: |- account_management: |-
CON Akaunti yangu CON Akaunti yangu
1. Wasifu wangu 1. Wasifu wangu
@@ -47,7 +47,7 @@ sw:
3. Angalia salio 3. Angalia salio
4. Angalia taarifa ya matumizi 4. Angalia taarifa ya matumizi
5. Badilisha nambari ya siri 5. Badilisha nambari ya siri
0. Nyuma 0. Rudi
metadata_management: |- metadata_management: |-
CON Wasifu wangu CON Wasifu wangu
1. Weka jina 1. Weka jina
@@ -56,7 +56,7 @@ sw:
4. Weka eneo 4. Weka eneo
5. Weka bidhaa 5. Weka bidhaa
6. Angalia wasifu wako 6. Angalia wasifu wako
0. Nyuma 0. Rudi
display_user_metadata: |- display_user_metadata: |-
CON Wasifu wako una maelezo yafuatayo: CON Wasifu wako una maelezo yafuatayo:
Jina: %{full_name} Jina: %{full_name}
@@ -64,98 +64,98 @@ sw:
Umri: %{age} Umri: %{age}
Eneo: %{location} Eneo: %{location}
Unauza: %{products} Unauza: %{products}
0. Nyuma 0. Rudi
select_preferred_language: |- select_preferred_language: |-
CON Chagua lugha CON Chagua lugha
1. Kingereza 1. Kingereza
2. Kiswahili 2. Kiswahili
0. Nyuma 0. Rudi
retry_pin_entry: |- retry_pin_entry: |-
CON Nambari uliyoweka si sahihi, jaribu tena. Una majaribio %{remaining_attempts} yaliyobaki. CON Nambari uliyoweka si sahihi, jaribu tena. Una majaribio %{remaining_attempts} yaliyobaki.
0. Back 0. Back
enter_current_pin: enter_current_pin:
first: |- first: |-
CON Weka nambari ya siri. CON Weka nambari ya siri.
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
enter_new_pin: |- enter_new_pin: |-
CON Weka nambari ya siri mpya CON Weka nambari ya siri mpya
0. Nyuma 0. Rudi
new_pin_confirmation: |- new_pin_confirmation: |-
CON Weka nambari yako ya siri tena CON Weka nambari yako ya siri tena
0. Nyuma 0. Rudi
transaction_pin_authorization: transaction_pin_authorization:
first: |- first: |-
CON %{recipient_information} atapokea %{transaction_amount} %{token_symbol} kutoka kwa %{sender_information}. CON %{recipient_information} atapokea %{transaction_amount} %{token_symbol} kutoka kwa %{sender_information}.
Tafadhali weka nambari yako ya siri kudhibitisha. Tafadhali weka nambari yako ya siri kudhibitisha.
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
display_metadata_pin_authorization: display_metadata_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
account_balances_pin_authorization: account_balances_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako kuona salio. CON Tafadhali weka PIN yako kuona salio.
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
account_statement_pin_authorization: account_statement_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako kuona taarifa ya matumizi. CON Tafadhali weka PIN yako kuona taarifa ya matumizi.
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
name_edit_pin_authorization: name_edit_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
dob_edit_pin_authorization: dob_edit_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
gender_edit_pin_authorization: gender_edit_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
location_edit_pin_authorization: location_edit_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
products_edit_pin_authorization: products_edit_pin_authorization:
first: |- first: |-
CON Tafadhali weka PIN yako CON Tafadhali weka PIN yako
0. Nyuma 0. Rudi
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
account_balances: account_balances:
available_balance: |- available_balance: |-
CON Salio zako ni zifuatazo: CON Salio zako ni zifuatazo:
salio: %{available_balance} %{token_symbol} salio: %{available_balance} %{token_symbol}
0. Nyuma 0. Rudi
with_fees: |- with_fees: |-
CON Salio zako ni zifuatazo: CON Salio zako ni zifuatazo:
salio: %{available_balance} %{token_symbol} salio: %{available_balance} %{token_symbol}
ushuru: %{tax} %{token_symbol} ushuru: %{tax} %{token_symbol}
0. Nyuma 0. Rudi
with_rewards: |- with_rewards: |-
CON Salio zako ni zifuatazo: CON Salio zako ni zifuatazo:
salio: %{available_balance} %{token_symbol} salio: %{available_balance} %{token_symbol}
ushuru: %{tax} %{token_symbol} ushuru: %{tax} %{token_symbol}
tuzo: %{bonus} %{token_symbol} tuzo: %{bonus} %{token_symbol}
0. Nyuma 0. Rudi
first_transaction_set: |- first_transaction_set: |-
CON %{first_transaction_set} CON %{first_transaction_set}
1. Mbele 1. Mbele
@@ -163,54 +163,54 @@ sw:
middle_transaction_set: |- middle_transaction_set: |-
CON %{middle_transaction_set} CON %{middle_transaction_set}
1. Mbele 1. Mbele
2. Nyuma 2. Rudi
00. Ondoka 00. Ondoka
last_transaction_set: |- last_transaction_set: |-
CON %{last_transaction_set} CON %{last_transaction_set}
2. Nyuma 2. Rudi
00. Ondoka 00. Ondoka
exit: |- exit: |-
END Asante kwa kutumia huduma. END Asante kwa kutumia huduma
exit_invalid_request: |- exit_invalid_request: |-
END Chaguo si sahihi. END Chaguo si sahihi.
exit_invalid_menu_option: |- exit_invalid_menu_option: |-
CON Chaguo lako sio sahihi. Kwa usaidizi piga simu %{support_phone} CON Chaguo lako sio sahihi. Kwa usaidizi piga simu %{support_phone}
00. Nyuma 00. Rudi
99. Ondoka 99. Ondoka
exit_invalid_input: |- exit_invalid_input: |-
CON Chaguo lako halipatikani. Hakuna kilichochaguliwa. CON Chaguo lako halipatikani. Hakuna kilichochaguliwa
00. Nyuma 00. Rudi
99. Ondoka 99. Ondoka
exit_pin_blocked: |- exit_pin_blocked: |-
END PIN yako imefungwa. Kwa usaidizi tafadhali piga simu %{support_phone}. END PIN yako imefungwa. Kwa usaidizi tafadhali piga simu %{support_phone}
exit_invalid_pin: |- exit_invalid_pin: |-
END PIN uliyobonyeza sio sahihi. PIN lazima iwe na nambari nne. Kwa usaidizi piga simu %{support_phone}. END PIN uliyobonyeza sio sahihi. PIN lazima iwe na nambari nne. Kwa usaidizi piga simu %{support_phone}
exit_invalid_new_pin: |- exit_invalid_new_pin: |-
END PIN uliyobonyeza sio sahihi. PIN lazima iwe tofauti na pin yako ya sasa. Kwa usaidizi piga simu %{support_phone}. END PIN uliyobonyeza sio sahihi. PIN lazima iwe tofauti na pin yako ya sasa. Kwa usaidizi piga simu %{support_phone}
exit_pin_mismatch: |- exit_pin_mismatch: |-
END PIN mpya na udhibitisho wa pin mpya hazilingani. Tafadhali jaribu tena. Kwa usaidizi piga simu %{support_phone}. END PIN mpya na udhibitisho wa pin mpya hazilingani. Tafadhali jaribu tena. Kwa usaidizi piga simu %{support_phone}
exit_invalid_recipient: |- exit_invalid_recipient: |-
CON Mpokeaji wa nambari hapatikani au sio sahihi. CON Mpokeaji wa nambari hapatikani au sio sahihi.
00. Jaribu tena 00. Jaribu tena
99. Ondoka 99. Ondoka
exit_successful_transaction: |- exit_successful_transaction: |-
CON Ombi lako limetumwa. %{recipient_information} atapokea %{transaction_amount} %{token_symbol} kutoka kwa %{sender_information}. CON Ombi lako limetumwa. %{recipient_information} atapokea %{transaction_amount} %{token_symbol} kutoka kwa %{sender_information}
00. Nyuma 00. Rudi
99. Ondoka 99. Ondoka
exit_insufficient_balance: |- exit_insufficient_balance: |-
CON Malipo ya %{amount} %{token_symbol} kwa %{recipient_information} halijakamilika kwa sababu salio lako haitoshi. CON Malipo ya %{amount} %{token_symbol} kwa %{recipient_information} halijakamilika kwa sababu salio lako haitoshi
Akaunti yako ya Sarafu ina salio ifuatayo: %{token_balance} Akaunti yako ya Sarafu ina salio ifuatayo: %{token_balance}
00. Nyuma 00. Rudi
99. Ondoka 99. Ondoka
invalid_service_code: |- invalid_service_code: |-
Bonyeza %{valid_service_code} kutumia mtandao wa Sarafu Bonyeza %{valid_service_code} kutumia mtandao wa Sarafu
help: |- help: |-
CON Kwa usaidizi piga simu %{support_phone} CON Kwa usaidizi piga simu %{support_phone}
0. Nyuma 0. Rudi
9. Ondoka 9. Ondoka
complete: |- complete: |-
CON Ombi lako limetumwa. Utapokea uthibitishaji wa SMS kwa muda mfupi. CON Ombi lako limetumwa. Utapokea uthibitishaji wa SMS kwa muda mfupi.
00. Nyuma 00. Rudi
99. Ondoka 99. Ondoka
account_creation_prompt: |- account_creation_prompt: |-
END Akaunti yako ya Sarafu inatayarishwa. Utapokea ujumbe wa SMS akaunti yako ikiwa tayari. END Akaunti yako ya Sarafu inatayarishwa. Utapokea ujumbe wa SMS akaunti yako ikiwa tayari.

0
apps/contract-migration/config.sh Executable file → Normal file
View File

View File

@@ -1,25 +0,0 @@
#! /bin/bash
set -e
set -a
mkdir -p $DEV_DATA_DIR/health
source $DEV_DATA_DIR/env_reset
jq --arg CIC_REGISTRY_ADDRESS "$CIC_REGISTRY_ADDRESS" \
--arg CIC_TRUST_ADDRESS "$CIC_TRUST_ADDRESS" \
--arg CIC_DEFAULT_TOKEN_SYMBOL "$CIC_DEFAULT_TOKEN_SYMBOL"\
--arg TOKEN_NAME "$TOKEN_NAME"\
--arg RUN_MASK "$RUN_MASK" \
-n '{"CIC_REGISTRY_ADDRESS": $CIC_REGISTRY_ADDRESS,
"CIC_TRUST_ADDRESS": $CIC_TRUST_ADDRESS,
"CIC_DEFAULT_TOKEN_SYMBOL": $CIC_DEFAULT_TOKEN_SYMBOL,
"TOKEN_NAME": $TOKEN_NAME,
"RUN_MASK": $RUN_MASK}' > $DEV_DATA_DIR/health/readyz
cd $DEV_DATA_DIR/health
echo "starting health endpoint on :8000/readyz"
python -m http.server 8000 &> /dev/null

View File

@@ -1,16 +0,0 @@
export DEV_ETH_ACCOUNT_CONTRACT_DEPLOYER=0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
export DEV_ETH_ACCOUNT_RESERVE_MINTER=0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
export DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER=0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
export DEV_RESERVE_AMOUNT=10000000000000000000000000000000000
export DEV_FAUCET_AMOUNT=50000000
export DEV_GAS_AMOUNT=100000000000000000000000
export DEV_TOKEN_AMOUNT=100000000000000000000000
export DEV_ETH_GAS_PRICE=
export DEV_DATA_DIR=.
export DEV_PIP_EXTRA_INDEX_URL=https://pip.grassrootseconomics.net:8433
export DEV_ETH_PROVIDER_HOST=
export DEV_ETH_PROVIDER_PORT=
export CIC_TRUST_ADDRESS=0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
export CIC_DEFAULT_TOKEN_SYMBOL=GFT
export WALLET_KEY_FILE=/root/keystore/UTC--2021-01-08T17-18-44.521011372Z--eb3907ecad74a0013c259d5874ae7f22dcbcc95c

0
apps/contract-migration/from_env.sh Executable file → Normal file
View File

0
apps/contract-migration/nvm.sh Executable file → Normal file
View File

View File

@@ -112,16 +112,10 @@ export CIC_DEFAULT_TOKEN_SYMBOL=$TOKEN_SYMBOL
echo "Writing env_reset file ..." echo "Writing env_reset file ..."
# note these are also written in init_readyz.sh echo "export CIC_REGISTRY_ADDRESS=$CIC_REGISTRY_ADDRESS
cat <<EOF > $DEV_DATA_DIR/env_reset
export CIC_REGISTRY_ADDRESS=$CIC_REGISTRY_ADDRESS
export CIC_TRUST_ADDRESS=$CIC_TRUST_ADDRESS
export CIC_DEFAULT_TOKEN_SYMBOL=$CIC_DEFAULT_TOKEN_SYMBOL export CIC_DEFAULT_TOKEN_SYMBOL=$CIC_DEFAULT_TOKEN_SYMBOL
export TOKEN_NAME=$TOKEN_NAME export TOKEN_NAME=$TOKEN_NAME
EOF " >> "${DEV_DATA_DIR}"/env_reset
confini-dump -vv --schema-module chainlib.eth.data.config --schema-module cic_eth.data.config --schema-dir ./config --prefix export > ${DEV_DATA_DIR}/env_reset
confini-dump --schema-module chainlib.eth.data.config --schema-module cic_eth.data.config --schema-dir ./config
set +a set +a
set +e set +e

6
apps/contract-migration/run_job.sh Executable file → Normal file
View File

@@ -12,10 +12,6 @@ if [[ $((RUN_MASK & 1)) -eq 1 ]]
then then
>&2 echo -e "\033[;96mRUNNING\033[;39m RUN_MASK 1 - contract deployment" >&2 echo -e "\033[;96mRUNNING\033[;39m RUN_MASK 1 - contract deployment"
./reset.sh ./reset.sh
# cic-eth-xxx services rely on
export RUN_MASK_PHASE=1
./docker/init_readyz.sh &
echo 0
if [ $? -ne "0" ]; then if [ $? -ne "0" ]; then
>&2 echo -e "\033[;31mFAILED\033[;39m RUN_MASK 1 - contract deployment" >&2 echo -e "\033[;31mFAILED\033[;39m RUN_MASK 1 - contract deployment"
exit 1; exit 1;
@@ -33,5 +29,3 @@ then
fi fi
>&2 echo -e "\033[;32mSUCCEEDED\033[;39m RUN_MASK 2 - custodial service initialization" >&2 echo -e "\033[;32mSUCCEEDED\033[;39m RUN_MASK 2 - custodial service initialization"
fi fi
# this will leave the container up and serving the results of the migration
wait

View File

@@ -82,7 +82,7 @@ cic-eth-ctl -i $CHAIN_SPEC unlock INIT
cic-eth-ctl -i $CHAIN_SPEC unlock SEND cic-eth-ctl -i $CHAIN_SPEC unlock SEND
cic-eth-ctl -i $CHAIN_SPEC unlock QUEUE cic-eth-ctl -i $CHAIN_SPEC unlock QUEUE
confini-dump --schema-module chainlib.eth.data.config --schema-module cic_eth.data.config --schema-dir ./config #confini-dump --schema-module chainlib.eth.data.config --schema-module cic_eth.data.config --schema-dir ./config
set +a set +a
set +e set +e

0
apps/data-seeding/import_ussd.sh Executable file → Normal file
View File

View File

@@ -1,10 +0,0 @@
#! /bin/bash
set -e
set -u
echo "fetching migration variables from $CONTRACT_MIGRATION_URL"
for s in $(curl -s "$CONTRACT_MIGRATION_URL/readyz" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
echo "exporting $s"
export $s
done

View File

@@ -1,15 +0,0 @@
#! /bin/bash
set -e
set -u
env
WAIT_FOR_TIMEOUT=${WAIT_FOR_TIMEOUT:-600}
if [[ "$CONTRACT_MIGRATION_URL" ]]; then
echo "waiting for $CONTRACT_MIGRATION_URL/readyz"
./scripts/wait-for-it.sh $CONTRACT_MIGRATION_URL -t $WAIT_FOR_TIMEOUT
source ./scripts/get_readyz.sh # set env vars form endpoint
./import_ussd.sh
else
./import_ussd.sh
fi

0
apps/data-seeding/scripts/run_ussd_user_imports.sh Executable file → Normal file
View File

View File

@@ -1,182 +0,0 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi

View File

@@ -60,8 +60,6 @@ services:
contract-migration: contract-migration:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/contract-migration:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/contract-migration:${TAG:-latest}
ports:
- 8012:8000
build: build:
context: apps/contract-migration context: apps/contract-migration
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -70,6 +68,7 @@ services:
pip_extra_args: $PIP_EXTRA_ARGS pip_extra_args: $PIP_EXTRA_ARGS
EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
EXTRA_PIP_ARGS: $EXTRA_PIP_ARGS EXTRA_PIP_ARGS: $EXTRA_PIP_ARGS
# image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/contract-migration:latest
environment: environment:
RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545}
ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545}
@@ -94,14 +93,9 @@ services:
RUN_MASK: ${RUN_MASK:-0} # bit flags; 1: contract migrations 2: seed data RUN_MASK: ${RUN_MASK:-0} # bit flags; 1: contract migrations 2: seed data
DEV_FAUCET_AMOUNT: ${DEV_FAUCET_AMOUNT:-50000000} DEV_FAUCET_AMOUNT: ${DEV_FAUCET_AMOUNT:-50000000}
DEV_ETH_GAS_PRICE: $DEV_ETH_GAS_PRICE DEV_ETH_GAS_PRICE: $DEV_ETH_GAS_PRICE
#DEV_GAS_AMOUNT: "100000000000000000000000" # removed from env_reset
#WALLET_KEY_FILE: ./keystore/UTC--2021-01-08T17-18-44.521011372Z--eb3907ecad74a0013c259d5874ae7f22dcbcc95c #removed from env_reset
TOKEN_NAME: ${TOKEN_NAME:-Giftable Token} TOKEN_NAME: ${TOKEN_NAME:-Giftable Token}
TOKEN_SYMBOL: ${TOKEN_SYMBOL:-GFT} TOKEN_SYMBOL: ${TOKEN_SYMBOL:-GFT}
TOKEN_TYPE: ${TOKEN_TYPE:-giftable_erc20_token} TOKEN_TYPE: ${TOKEN_TYPE:-giftable_erc20_token}
#TOKEN_NAME: ${TOKEN_NAME:-Demurrage Token}
#TOKEN_SYMBOL: ${TOKEN_SYMBOL:-DET}
#TOKEN_TYPE: ${TOKEN_TYPE:-erc20_demurrage_token }
TOKEN_DECIMALS: $TOKEN_DECIMALS TOKEN_DECIMALS: $TOKEN_DECIMALS
TOKEN_REDISTRIBUTION_PERIOD: $TOKEN_DEMURRAGE_REDISTRIBUTION_PERIOD TOKEN_REDISTRIBUTION_PERIOD: $TOKEN_DEMURRAGE_REDISTRIBUTION_PERIOD
TASKS_TRANSFER_CALLBACKS: ${TASKS_TRANSFER_CALLBACKS:-"cic-eth:cic_eth.callbacks.noop.noop,cic-ussd:cic_ussd.tasks.callback_handler.transaction_callback"} TASKS_TRANSFER_CALLBACKS: ${TASKS_TRANSFER_CALLBACKS:-"cic-eth:cic_eth.callbacks.noop.noop,cic-ussd:cic_ussd.tasks.callback_handler.transaction_callback"}
@@ -109,8 +103,9 @@ services:
TOKEN_DEMURRAGE_LEVEL: $TOKEN_DEMURRAGE_LEVEL TOKEN_DEMURRAGE_LEVEL: $TOKEN_DEMURRAGE_LEVEL
TOKEN_SINK_ADDRESS: $TOKEN_SINK_ADDRESS TOKEN_SINK_ADDRESS: $TOKEN_SINK_ADDRESS
SIGNER_PROVIDER: ${SIGNER_SOCKET_PATH:-http://cic-eth-signer:8000} SIGNER_PROVIDER: ${SIGNER_SOCKET_PATH:-http://cic-eth-signer:8000}
restart: on-failure
command: ["./run_job.sh"] command: ["./run_job.sh"]
#command: bash -c "while true; do sleep 1; done" # Infinite loop to keep container live doing nothing #command: ["./reset.sh"]
depends_on: depends_on:
- eth - eth
- postgres - postgres
@@ -118,7 +113,7 @@ services:
- cic-eth-tasker - cic-eth-tasker
volumes: volumes:
- contract-config:/tmp/cic/config - contract-config:/tmp/cic/config
- ./apps/contract-migration:/root
data-seeding: data-seeding:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/data-seeding:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/data-seeding:${TAG:-latest}
@@ -158,11 +153,9 @@ services:
USSD_PROVIDER: http://cic-user-ussd-server:9000 USSD_PROVIDER: http://cic-user-ussd-server:9000
CELERY_QUEUE: cic-import-ussd CELERY_QUEUE: cic-import-ussd
EXCLUSIONS: ussd EXCLUSIONS: ussd
CONTRACT_MIGRATION_URL: contract-migration:8000 command: bash import_ussd.sh
command: bash ./scripts/run_job.sh
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
#- ./apps/data-seeding:/root
cic-cache-tracker: cic-cache-tracker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest}
@@ -188,13 +181,17 @@ services:
CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996} CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996}
CELERY_BROKER_URL: redis://redis:6379 CELERY_BROKER_URL: redis://redis:6379
CELERY_RESULT_URL: redis://redis:6379 CELERY_RESULT_URL: redis://redis:6379
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: on-failure restart: on-failure
depends_on: depends_on:
- redis - redis
- postgres - postgres
- eth - eth
command: ./start_tracker.sh -c /usr/local/etc/cic-cache -vv command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
./start_tracker.sh -c /usr/local/etc/cic-cache -vv
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
@@ -221,13 +218,17 @@ services:
CIC_CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996} CIC_CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996}
CELERY_BROKER_URL: redis://redis:6379 CELERY_BROKER_URL: redis://redis:6379
CELERY_RESULT_URL: redis://redis:6379 CELERY_RESULT_URL: redis://redis:6379
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- redis - redis
- postgres - postgres
- eth - eth
command: bash docker/start_tasker.sh command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
/usr/local/bin/cic-cache-taskerd -vv
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
@@ -242,10 +243,10 @@ services:
DATABASE_USER: ${DATABASE_USER:-grassroots} DATABASE_USER: ${DATABASE_USER:-grassroots}
DATABASE_HOST: ${DATABASE_HOST:-postgres} DATABASE_HOST: ${DATABASE_HOST:-postgres}
DATABASE_PORT: ${DATABASE_PORT:-5432} DATABASE_PORT: ${DATABASE_PORT:-5432}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} #DATABASE_PASSWORD: ${DATABASE_PASSWORD:-
DATABASE_NAME: ${DATABASE_NAME_CIC_CACHE:-cic_cache} DATABASE_NAME: ${DATABASE_NAME_CIC_CACHE:-cic_cache}
DATABASE_DEBUG: 1 DATABASE_DEBUG: 1
CONTRACT_MIGRATION_URL: contract-migration:8000 #PGPASSWORD: $DATABASE_PASSWORD
SERVER_PORT: 8000 SERVER_PORT: 8000
restart: on-failure restart: on-failure
ports: ports:
@@ -254,7 +255,16 @@ services:
- postgres - postgres
- cic-cache-tasker - cic-cache-tasker
- cic-cache-tracker - cic-cache-tracker
command: bash docker/start_server.sh command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
"/usr/local/bin/uwsgi" \
--wsgi-file /root/cic_cache/runnable/daemons/server.py \
--http :8000 \
--pyargv "-vv"
cic-eth-tasker: cic-eth-tasker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest}
@@ -292,7 +302,6 @@ services:
ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER: ${DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER:-0xACB0BC74E1686D62dE7DC6414C999EA60C09F0eA} ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER: ${DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER:-0xACB0BC74E1686D62dE7DC6414C999EA60C09F0eA}
TASKS_TRACE_QUEUE_STATUS: ${TASKS_TRACE_QUEUE_STATUS:-1} TASKS_TRACE_QUEUE_STATUS: ${TASKS_TRACE_QUEUE_STATUS:-1}
CIC_DEFAULT_TOKEN_SYMBOL: ${CIC_DEFAULT_TOKEN_SYMBOL:-GFT} CIC_DEFAULT_TOKEN_SYMBOL: ${CIC_DEFAULT_TOKEN_SYMBOL:-GFT}
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- eth - eth
@@ -304,7 +313,12 @@ services:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
#command: ["/usr/local/bin/cic-eth-taskerd"] #command: ["/usr/local/bin/cic-eth-taskerd"]
#command: ["sleep", "3600"] #command: ["sleep", "3600"]
command: ./start_tasker.sh --aux-all -q cic-eth -vv command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
./start_tasker.sh --aux-all -q cic-eth -vv
cic-eth-signer: cic-eth-signer:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest}
@@ -351,6 +365,13 @@ services:
- signer-data:/run/crypto-dev-signer - signer-data:/run/crypto-dev-signer
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: ["python", "/usr/local/bin/crypto-dev-daemon", "-c", "/usr/local/etc/crypto-dev-signer", "-vv"] command: ["python", "/usr/local/bin/crypto-dev-daemon", "-c", "/usr/local/etc/crypto-dev-signer", "-vv"]
#command:
# - /bin/bash
# - -c
# - |
# if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
# ./start_tasker.sh --aux-all -q cic-eth -vv
# command: [/bin/sh, "./start_tasker.sh", -q, cic-eth, -vv ]
cic-eth-tracker: cic-eth-tracker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest}
@@ -363,7 +384,6 @@ services:
environment: environment:
RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545}
ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545}
RPC_HTTP_PROVIDER: ${RPC_PROVIDER:-http://eth:8545}
DATABASE_USER: ${DATABASE_USER:-grassroots} DATABASE_USER: ${DATABASE_USER:-grassroots}
DATABASE_HOST: ${DATABASE_HOST:-postgres} DATABASE_HOST: ${DATABASE_HOST:-postgres}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala}
@@ -378,7 +398,6 @@ services:
CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis} CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis}
CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis} CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis}
TASKS_TRANSFER_CALLBACKS: ${TASKS_TRANSFER_CALLBACKS:-"cic-eth:cic_eth.callbacks.noop.noop,cic-ussd:cic_ussd.tasks.callback_handler.transaction_callback"} TASKS_TRANSFER_CALLBACKS: ${TASKS_TRANSFER_CALLBACKS:-"cic-eth:cic_eth.callbacks.noop.noop,cic-ussd:cic_ussd.tasks.callback_handler.transaction_callback"}
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: on-failure restart: on-failure
depends_on: depends_on:
- eth - eth
@@ -386,7 +405,15 @@ services:
- redis - redis
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: bash ./start_tracker.sh -vv command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
#./start_tracker.sh -vv -c /usr/local/etc/cic-eth
./start_tracker.sh -vv
# command: "/root/start_manager.sh head -vv"
cic-eth-dispatcher: cic-eth-dispatcher:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-eth:${TAG:-latest}
@@ -409,12 +436,12 @@ services:
CIC_CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996} CIC_CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996}
CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996} CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996}
CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
#BANCOR_DIR: $BANCOR_DIR
CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis} CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis}
CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis} CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis}
TASKS_TRANSFER_CALLBACKS: $TASKS_TRANSFER_CALLBACKS TASKS_TRANSFER_CALLBACKS: $TASKS_TRANSFER_CALLBACKS
DATABASE_DEBUG: ${DATABASE_DEBUG:-false} DATABASE_DEBUG: ${DATABASE_DEBUG:-false}
#DATABASE_DEBUG: 1 #DATABASE_DEBUG: 1
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: on-failure restart: on-failure
depends_on: depends_on:
- eth - eth
@@ -422,7 +449,13 @@ services:
- redis - redis
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: bash start_dispatcher.sh -q cic-eth -vv command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
./start_dispatcher.sh -q cic-eth -vv
# command: "/root/start_dispatcher.sh -q cic-eth -vv"
@@ -455,7 +488,6 @@ services:
CIC_TX_RETRY_DELAY: 60 CIC_TX_RETRY_DELAY: 60
BATCH_SIZE: ${RETRIER_BATCH_SIZE:-50} BATCH_SIZE: ${RETRIER_BATCH_SIZE:-50}
#DATABASE_DEBUG: 1 #DATABASE_DEBUG: 1
CONTRACT_MIGRATION_URL: contract-migration:8000
restart: on-failure restart: on-failure
depends_on: depends_on:
- eth - eth
@@ -463,7 +495,15 @@ services:
- redis - redis
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: bash start_retry.sh -vv command:
- /bin/bash
- -c
- |
if [[ -f /tmp/cic/config/env_reset ]]; then source /tmp/cic/config/env_reset; fi
./start_retry.sh -vv
# command: "/root/start_retry.sh -q cic-eth -vv"
cic-notify-tasker: cic-notify-tasker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-notify:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-notify:${TAG:-latest}

View File

@@ -1 +1 @@
docker run --rm -v cic-internal-integration_contract-config:/tmp/cic/config busybox cat /tmp/cic/config/env_reset docker run -t -v --rm cic-internal-integration_contract-config:/tmp/cic/config busybox cat /tmp/cic/config/env_reset