Compare commits

..

2 Commits

Author SHA1 Message Date
nolash
5b8ea95a8e Bump chainlib to take dynamic arg vector for argparse 2021-09-17 08:12:51 +02:00
nolash
32b15d6d04 Update signer to fill in missing sign to wire symbol 2021-09-15 21:19:05 +02:00
46 changed files with 279 additions and 410 deletions

1
.gitignore vendored
View File

@@ -14,4 +14,3 @@ build/
**/.venv **/.venv
.idea .idea
**/.vim **/.vim
**/*secret.yaml

View File

@@ -26,7 +26,7 @@ docker-compose down
stop cluster and delete data stop cluster and delete data
``` ```
docker-compose down -v --remove-orphans docker-compose down -v
``` ```
rebuild an images rebuild an images
@@ -34,7 +34,4 @@ rebuild an images
docker-compose up --build <service_name> docker-compose up --build <service_name>
``` ```
to delete the buildkit cache
```
docker builder prune --filter type=exec.cachemount
```

View File

@@ -27,11 +27,11 @@ class RPC:
@staticmethod @staticmethod
def from_config(config): def from_config(config):
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
RPCConnection.register_location(config.get('RPC_PROVIDER'), chain_spec, 'default') RPCConnection.register_location(config.get('RPC_HTTP_PROVIDER'), chain_spec, 'default')
if config.get('SIGNER_PROVIDER'): if config.get('SIGNER_PROVIDER'):
RPCConnection.register_constructor(ConnType.UNIX, EthUnixSignerConnection, tag='signer') RPCConnection.register_constructor(ConnType.UNIX, EthUnixSignerConnection, tag='signer')
RPCConnection.register_location(config.get('SIGNER_PROVIDER'), chain_spec, 'signer') RPCConnection.register_location(config.get('SIGNER_PROVIDER'), chain_spec, 'signer')
rpc = RPC(chain_spec, config.get('RPC_PROVIDER'), signer_provider=config.get('SIGNER_PROVIDER')) rpc = RPC(chain_spec, config.get('RPC_HTTP_PROVIDER'), signer_provider=config.get('SIGNER_PROVIDER'))
logg.info('set up rpc: {}'.format(rpc)) logg.info('set up rpc: {}'.format(rpc))
return rpc return rpc

View File

@@ -9,6 +9,7 @@ psycopg2==2.8.6
celery==4.4.7 celery==4.4.7
redis==3.5.3 redis==3.5.3
chainsyncer[sql]>=0.0.6a3,<0.1.0 chainsyncer[sql]>=0.0.6a3,<0.1.0
erc20-faucet>=0.3.2a2, <0.4.0 erc20-faucet>=0.3.2a1, <0.4.0
chainlib-eth>=0.0.9a14,<0.1.0 chainlib-eth>=0.0.9a7,<0.1.0
eth-address-index>=0.2.3a4,<0.3.0 chainlib>=0.0.9a3,<0.1.0
eth-address-index>=0.2.3a1,<0.3.0

View File

@@ -1,4 +1,5 @@
celery==4.4.7 celery==4.4.7
erc20-demurrage-token~=0.0.3a1 erc20-demurrage-token~=0.0.3a1
cic-eth-registry>=0.6.1a2,<0.7.0 cic-eth-registry~=0.5.8a1
cic-eth[services]~=0.12.4a8 chainlib~=0.0.7a1
cic_eth~=0.12.2a4

View File

@@ -72,6 +72,12 @@ from cic_eth.task import BaseTask
logging.basicConfig(level=logging.WARNING) logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger() logg = logging.getLogger()
env = list(os.environ.keys())
env.sort()
for k in env:
logg.debug("env {} {}".format(k, os.environ[k]))
arg_flags = cic_eth.cli.argflag_std_read arg_flags = cic_eth.cli.argflag_std_read
local_arg_flags = cic_eth.cli.argflag_local_task local_arg_flags = cic_eth.cli.argflag_local_task
argparser = cic_eth.cli.ArgumentParser(arg_flags) argparser = cic_eth.cli.ArgumentParser(arg_flags)

View File

@@ -1,3 +1,3 @@
celery==4.4.7 celery==4.4.7
chainlib-eth>=0.0.9a14,<0.1.0 chainlib-eth>=0.0.9a11,<0.1.0
semver==2.13.0 semver==2.13.0

View File

@@ -1,4 +1,4 @@
crypto-dev-signer>=0.4.15a7,<=0.4.15 crypto-dev-signer>=0.4.15a4,<=0.4.15
chainqueue>=0.0.5a1,<0.1.0 chainqueue>=0.0.5a1,<0.1.0
cic-eth-registry>=0.6.1a2,<0.7.0 cic-eth-registry>=0.6.1a2,<0.7.0
redis==3.5.3 redis==3.5.3

View File

@@ -1,12 +1,10 @@
# standard imports # standard imports
import json import json
import logging import logging
from typing import Optional from typing import Optional
# third-party imports # third-party imports
from cic_eth.api import Api from cic_eth.api import Api
from cic_eth_aux.erc20_demurrage_token.api import Api as DemurrageApi
# local imports # local imports
from cic_ussd.account.transaction import from_wei from cic_ussd.account.transaction import from_wei
@@ -75,24 +73,6 @@ def calculate_available_balance(balances: dict) -> float:
return from_wei(value=available_balance) return from_wei(value=available_balance)
def get_adjusted_balance(balance: int, chain_str: str, timestamp: int, token_symbol: str):
"""
:param balance:
:type balance:
:param chain_str:
:type chain_str:
:param timestamp:
:type timestamp:
:param token_symbol:
:type token_symbol:
:return:
:rtype:
"""
logg.debug(f'retrieving adjusted balance on chain: {chain_str}')
demurrage_api = DemurrageApi(chain_str=chain_str)
return demurrage_api.get_adjusted_balance(token_symbol, balance, timestamp).result
def get_cached_available_balance(blockchain_address: str) -> float: def get_cached_available_balance(blockchain_address: str) -> float:
"""This function attempts to retrieve balance data from the redis cache. """This function attempts to retrieve balance data from the redis cache.
:param blockchain_address: Ethereum address of an account. :param blockchain_address: Ethereum address of an account.
@@ -108,14 +88,3 @@ def get_cached_available_balance(blockchain_address: str) -> float:
return calculate_available_balance(json.loads(cached_balances)) return calculate_available_balance(json.loads(cached_balances))
else: else:
raise CachedDataNotFoundError(f'No cached available balance for address: {blockchain_address}') raise CachedDataNotFoundError(f'No cached available balance for address: {blockchain_address}')
def get_cached_adjusted_balance(identifier: bytes):
"""
:param identifier:
:type identifier:
:return:
:rtype:
"""
key = cache_data_key(identifier, ':cic.adjusted_balance')
return get_cached_data(key)

View File

@@ -1,17 +1,13 @@
# standard imports # standard imports
import json import json
import logging import logging
from datetime import datetime, timedelta
# external imports # external imports
import i18n.config import i18n.config
from sqlalchemy.orm.session import Session
# local imports # local imports
from cic_ussd.account.balance import (calculate_available_balance, from cic_ussd.account.balance import calculate_available_balance, get_balances, get_cached_available_balance
get_adjusted_balance,
get_balances,
get_cached_adjusted_balance,
get_cached_available_balance)
from cic_ussd.account.chain import Chain from cic_ussd.account.chain import Chain
from cic_ussd.account.metadata import get_cached_preferred_language from cic_ussd.account.metadata import get_cached_preferred_language
from cic_ussd.account.statement import ( from cic_ussd.account.statement import (
@@ -20,15 +16,14 @@ from cic_ussd.account.statement import (
query_statement, query_statement,
statement_transaction_set statement_transaction_set
) )
from cic_ussd.account.tokens import get_default_token_symbol
from cic_ussd.account.transaction import from_wei, to_wei from cic_ussd.account.transaction import from_wei, to_wei
from cic_ussd.account.tokens import get_default_token_symbol
from cic_ussd.cache import cache_data_key, cache_data from cic_ussd.cache import cache_data_key, cache_data
from cic_ussd.db.models.account import Account from cic_ussd.db.models.account import Account
from cic_ussd.metadata import PersonMetadata from cic_ussd.metadata import PersonMetadata
from cic_ussd.phone_number import Support from cic_ussd.phone_number import Support
from cic_ussd.processor.util import parse_person_metadata from cic_ussd.processor.util import latest_input, parse_person_metadata
from cic_ussd.translation import translation_for from cic_ussd.translation import translation_for
from sqlalchemy.orm.session import Session
logg = logging.getLogger(__name__) logg = logging.getLogger(__name__)
@@ -48,26 +43,21 @@ class MenuProcessor:
:rtype: :rtype:
""" """
available_balance = get_cached_available_balance(self.account.blockchain_address) available_balance = get_cached_available_balance(self.account.blockchain_address)
adjusted_balance = get_cached_adjusted_balance(self.identifier) logg.debug('Requires call to retrieve tax and bonus amounts')
tax = ''
bonus = ''
token_symbol = get_default_token_symbol() token_symbol = get_default_token_symbol()
preferred_language = get_cached_preferred_language(self.account.blockchain_address) preferred_language = get_cached_preferred_language(self.account.blockchain_address)
if not preferred_language: if not preferred_language:
preferred_language = i18n.config.get('fallback') preferred_language = i18n.config.get('fallback')
with_available_balance = f'{self.display_key}.available_balance' return translation_for(
with_fees = f'{self.display_key}.with_fees' key=self.display_key,
if not adjusted_balance:
return translation_for(key=with_available_balance,
preferred_language=preferred_language,
available_balance=available_balance,
token_symbol=token_symbol)
adjusted_balance = json.loads(adjusted_balance)
tax_wei = to_wei(int(available_balance)) - int(adjusted_balance)
tax = from_wei(int(tax_wei))
return translation_for(key=with_fees,
preferred_language=preferred_language, preferred_language=preferred_language,
available_balance=available_balance, available_balance=available_balance,
tax=tax, tax=tax,
token_symbol=token_symbol) bonus=bonus,
token_symbol=token_symbol
)
def account_statement(self) -> str: def account_statement(self) -> str:
""" """
@@ -159,22 +149,12 @@ class MenuProcessor:
:return: :return:
:rtype: :rtype:
""" """
chain_str = Chain.spec.__str__()
token_symbol = get_default_token_symbol() token_symbol = get_default_token_symbol()
blockchain_address = self.account.blockchain_address blockchain_address = self.account.blockchain_address
balances = get_balances(blockchain_address, chain_str, token_symbol, False)[0] balances = get_balances(blockchain_address, Chain.spec.__str__(), token_symbol, False)[0]
key = cache_data_key(self.identifier, ':cic.balances') key = cache_data_key(self.identifier, ':cic.balances')
cache_data(key, json.dumps(balances)) cache_data(key, json.dumps(balances))
available_balance = calculate_available_balance(balances) available_balance = calculate_available_balance(balances)
now = datetime.now()
if (now - self.account.created).days >= 30:
if available_balance <= 0:
logg.info(f'Not retrieving adjusted balance, available balance: {available_balance} is insufficient.')
else:
timestamp = int((now - timedelta(30)).timestamp())
adjusted_balance = get_adjusted_balance(to_wei(int(available_balance)), chain_str, timestamp, token_symbol)
key = cache_data_key(self.identifier, ':cic.adjusted_balance')
cache_data(key, json.dumps(adjusted_balance))
query_statement(blockchain_address) query_statement(blockchain_address)

View File

@@ -63,7 +63,7 @@ elif ssl == 0:
else: else:
ssl = True ssl = True
valid_service_codes = config.get('USSD_SERVICE_CODE').split(",")
def main(): def main():
# TODO: improve url building # TODO: improve url building
@@ -79,9 +79,9 @@ def main():
session = uuid.uuid4().hex session = uuid.uuid4().hex
data = { data = {
'sessionId': session, 'sessionId': session,
'serviceCode': valid_service_codes[0], 'serviceCode': config.get('APP_SERVICE_CODE'),
'phoneNumber': args.phone, 'phoneNumber': args.phone,
'text': "", 'text': config.get('APP_SERVICE_CODE'),
} }
state = "_BEGIN" state = "_BEGIN"

View File

@@ -154,14 +154,15 @@ def parse_person_metadata(account: Account, metadata: dict):
phone_number = account.phone_number phone_number = account.phone_number
date_registered = int(account.created.replace().timestamp()) date_registered = int(account.created.replace().timestamp())
blockchain_address = account.blockchain_address blockchain_address = account.blockchain_address
chain_str = Chain.spec.__str__() chain_spec = f'{Chain.spec.common_name()}:{Chain.spec.engine()}: {Chain.spec.chain_id()}'
if isinstance(metadata.get('identities'), dict): if isinstance(metadata.get('identities'), dict):
identities = metadata.get('identities') identities = metadata.get('identities')
else: else:
identities = manage_identity_data( identities = manage_identity_data(
blockchain_address=blockchain_address, blockchain_address=blockchain_address,
chain_str=chain_str blockchain_type=Chain.spec.engine(),
chain_spec=chain_spec
) )
return { return {

View File

@@ -24,8 +24,7 @@ def transaction(notification_data: dict):
:rtype: :rtype:
""" """
role = notification_data.get('role') role = notification_data.get('role')
token_value = notification_data.get('token_value') amount = from_wei(notification_data.get('token_value'))
amount = token_value if token_value == 0 else from_wei(token_value)
balance = notification_data.get('available_balance') balance = notification_data.get('available_balance')
phone_number = notification_data.get('phone_number') phone_number = notification_data.get('phone_number')
preferred_language = notification_data.get('preferred_language') preferred_language = notification_data.get('preferred_language')

View File

@@ -1,7 +1,7 @@
# standard imports # standard imports
import semver import semver
version = (0, 3, 1, 'alpha.5') version = (0, 3, 1, 'alpha.4')
version_object = semver.VersionInfo( version_object = semver.VersionInfo(
major=version[0], major=version[0],

View File

@@ -0,0 +1,2 @@
[app]
service_code = *483*46#

View File

@@ -1,4 +1,3 @@
[ussd] [ussd]
service_code = *483*46#
user = user =
pass = pass =

View File

@@ -10,13 +10,6 @@ RUN mkdir -vp data
ARG EXTRA_INDEX_URL="https://pip.grassrootseconomics.net:8433" ARG EXTRA_INDEX_URL="https://pip.grassrootseconomics.net:8433"
ARG GITLAB_PYTHON_REGISTRY="https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple" ARG GITLAB_PYTHON_REGISTRY="https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple"
RUN --mount=type=cache,mode=0755,target=/root/.cache/pip \
pip install --index-url https://pypi.org/simple \
--extra-index-url $GITLAB_PYTHON_REGISTRY \
--extra-index-url $EXTRA_INDEX_URL \
cic-eth-aux-erc20-demurrage-token~=0.0.2a6
COPY requirements.txt . COPY requirements.txt .
RUN --mount=type=cache,mode=0755,target=/root/.cache/pip \ RUN --mount=type=cache,mode=0755,target=/root/.cache/pip \

View File

@@ -1,12 +1,9 @@
alembic==1.4.2 alembic==1.4.2
attrs==21.2.0
billiard==3.6.4.0
bcrypt==3.2.0 bcrypt==3.2.0
celery==4.4.7 celery==4.4.7
cffi==1.14.6
cic-eth[services]~=0.12.4a7 cic-eth[services]~=0.12.4a7
cic-notify~=0.4.0a10 cic-notify~=0.4.0a10
cic-types~=0.1.0a15 cic-types~=0.1.0a14
confini>=0.4.1a1,<0.5.0 confini>=0.4.1a1,<0.5.0
phonenumbers==8.12.12 phonenumbers==8.12.12
psycopg2==2.8.6 psycopg2==2.8.6

View File

@@ -43,13 +43,10 @@ def test_sync_get_balances(activated_account,
(5000000, 89000000, 67000000, 27.00) (5000000, 89000000, 67000000, 27.00)
]) ])
def test_calculate_available_balance(activated_account, def test_calculate_available_balance(activated_account,
available_balance,
balance_incoming, balance_incoming,
balance_network, balance_network,
balance_outgoing, balance_outgoing,
cache_balances, available_balance):
cache_default_token_data,
load_chain_spec):
balances = { balances = {
'address': activated_account.blockchain_address, 'address': activated_account.blockchain_address,
'converters': [], 'converters': [],
@@ -60,11 +57,7 @@ def test_calculate_available_balance(activated_account,
assert calculate_available_balance(balances) == available_balance assert calculate_available_balance(balances) == available_balance
def test_get_cached_available_balance(activated_account, def test_get_cached_available_balance(activated_account, cache_balances, balances):
balances,
cache_balances,
cache_default_token_data,
load_chain_spec):
cached_available_balance = get_cached_available_balance(activated_account.blockchain_address) cached_available_balance = get_cached_available_balance(activated_account.blockchain_address)
available_balance = calculate_available_balance(balances[0]) available_balance = calculate_available_balance(balances[0])
assert cached_available_balance == available_balance assert cached_available_balance == available_balance

View File

@@ -27,8 +27,6 @@ def test_filter_statement_transactions(transactions_list):
def test_generate(activated_account, def test_generate(activated_account,
cache_default_token_data,
cache_statement,
cache_preferences, cache_preferences,
celery_session_worker, celery_session_worker,
init_cache, init_cache,
@@ -62,7 +60,7 @@ def test_get_cached_statement(activated_account, cache_statement, statement):
assert cached_statement[0].get('blockchain_address') == statement[0].get('blockchain_address') assert cached_statement[0].get('blockchain_address') == statement[0].get('blockchain_address')
def test_parse_statement_transactions(cache_default_token_data, statement): def test_parse_statement_transactions(statement):
parsed_transactions = parse_statement_transactions(statement) parsed_transactions = parse_statement_transactions(statement)
parsed_transaction = parsed_transactions[0] parsed_transaction = parsed_transactions[0]
parsed_transaction.startswith('Sent') parsed_transaction.startswith('Sent')
@@ -78,7 +76,7 @@ def test_query_statement(blockchain_address, limit, load_chain_spec, activated_a
assert mock_transaction_list_query.get('limit') == limit assert mock_transaction_list_query.get('limit') == limit
def test_statement_transaction_set(cache_default_token_data, load_chain_spec, preferences, set_locale_files, statement): def test_statement_transaction_set(preferences, set_locale_files, statement):
parsed_transactions = parse_statement_transactions(statement) parsed_transactions = parse_statement_transactions(statement)
preferred_language = preferences.get('preferred_language') preferred_language = preferences.get('preferred_language')
transaction_set = statement_transaction_set(preferred_language, parsed_transactions) transaction_set = statement_transaction_set(preferred_language, parsed_transactions)

View File

@@ -36,19 +36,19 @@ def test_aux_transaction_data(preferences, set_locale_files, transactions_list):
check_aux_data('helpers.sent', 'helpers.to', preferred_language, sender_tx_aux_data) check_aux_data('helpers.sent', 'helpers.to', preferred_language, sender_tx_aux_data)
@pytest.mark.parametrize("value, expected_result", [ @pytest.mark.parametrize("wei, expected_result", [
(50000000, Decimal('50.00')), (50000000, Decimal('50.00')),
(100000, Decimal('0.10')) (100000, Decimal('0.10'))
]) ])
def test_from_wei(cache_default_token_data, expected_result, value): def test_from_wei(wei, expected_result):
assert from_wei(value) == expected_result assert from_wei(wei) == expected_result
@pytest.mark.parametrize("value, expected_result", [ @pytest.mark.parametrize("value, expected_result", [
(50, 50000000), (50, 50000000),
(0.10, 100000) (0.10, 100000)
]) ])
def test_to_wei(cache_default_token_data, expected_result, value): def test_to_wei(value, expected_result):
assert to_wei(value) == expected_result assert to_wei(value) == expected_result
@@ -96,7 +96,6 @@ def test_validate_transaction_account(activated_account, init_database, transact
@pytest.mark.parametrize("amount", [50, 0.10]) @pytest.mark.parametrize("amount", [50, 0.10])
def test_outgoing_transaction_processor(activated_account, def test_outgoing_transaction_processor(activated_account,
amount, amount,
cache_default_token_data,
celery_session_worker, celery_session_worker,
load_config, load_config,
load_chain_spec, load_chain_spec,

View File

@@ -1,6 +1,5 @@
# standard imports # standard imports
import json import json
import datetime
# external imports # external imports
from chainlib.hash import strip_0x from chainlib.hash import strip_0x
@@ -15,7 +14,6 @@ from cic_ussd.account.statement import (
) )
from cic_ussd.account.tokens import get_default_token_symbol from cic_ussd.account.tokens import get_default_token_symbol
from cic_ussd.account.transaction import from_wei, to_wei from cic_ussd.account.transaction import from_wei, to_wei
from cic_ussd.cache import cache_data, cache_data_key
from cic_ussd.menu.ussd_menu import UssdMenu from cic_ussd.menu.ussd_menu import UssdMenu
from cic_ussd.metadata import PersonMetadata from cic_ussd.metadata import PersonMetadata
from cic_ussd.phone_number import Support from cic_ussd.phone_number import Support
@@ -40,34 +38,24 @@ def test_menu_processor(activated_account,
load_chain_spec, load_chain_spec,
load_support_phone, load_support_phone,
load_ussd_menu, load_ussd_menu,
mock_get_adjusted_balance,
mock_sync_balance_api_query, mock_sync_balance_api_query,
mock_transaction_list_query, mock_transaction_list_query,
valid_recipient): valid_recipient):
preferred_language = get_cached_preferred_language(activated_account.blockchain_address) preferred_language = get_cached_preferred_language(activated_account.blockchain_address)
available_balance = get_cached_available_balance(activated_account.blockchain_address) available_balance = get_cached_available_balance(activated_account.blockchain_address)
token_symbol = get_default_token_symbol() token_symbol = get_default_token_symbol()
with_available_balance = 'ussd.kenya.account_balances.available_balance'
with_fees = 'ussd.kenya.account_balances.with_fees' tax = ''
bonus = ''
display_key = 'ussd.kenya.account_balances'
ussd_menu = UssdMenu.find_by_name('account_balances') ussd_menu = UssdMenu.find_by_name('account_balances')
name = ussd_menu.get('name') name = ussd_menu.get('name')
resp = response(activated_account, 'ussd.kenya.account_balances', name, init_database, generic_ussd_session) resp = response(activated_account, display_key, name, init_database, generic_ussd_session)
assert resp == translation_for(with_available_balance, assert resp == translation_for(display_key,
preferred_language, preferred_language,
available_balance=available_balance, available_balance=available_balance,
token_symbol=token_symbol)
identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address))
key = cache_data_key(identifier, ':cic.adjusted_balance')
adjusted_balance = 45931650.64654012
cache_data(key, json.dumps(adjusted_balance))
resp = response(activated_account, 'ussd.kenya.account_balances', name, init_database, generic_ussd_session)
tax_wei = to_wei(int(available_balance)) - int(adjusted_balance)
tax = from_wei(int(tax_wei))
assert resp == translation_for(key=with_fees,
preferred_language=preferred_language,
available_balance=available_balance,
tax=tax, tax=tax,
bonus=bonus,
token_symbol=token_symbol) token_symbol=token_symbol)
cached_statement = get_cached_statement(activated_account.blockchain_address) cached_statement = get_cached_statement(activated_account.blockchain_address)
@@ -135,15 +123,6 @@ def test_menu_processor(activated_account,
account_balance=available_balance, account_balance=available_balance,
account_token_name=token_symbol) account_token_name=token_symbol)
display_key = 'ussd.kenya.start'
ussd_menu = UssdMenu.find_by_name('start')
name = ussd_menu.get('name')
older_timestamp = (activated_account.created - datetime.timedelta(days=35))
activated_account.created = older_timestamp
init_database.flush()
response(activated_account, display_key, name, init_database, generic_ussd_session)
assert mock_get_adjusted_balance['timestamp'] == int((datetime.datetime.now() - datetime.timedelta(days=30)).timestamp())
display_key = 'ussd.kenya.transaction_pin_authorization' display_key = 'ussd.kenya.transaction_pin_authorization'
ussd_menu = UssdMenu.find_by_name('transaction_pin_authorization') ussd_menu = UssdMenu.find_by_name('transaction_pin_authorization')
name = ussd_menu.get('name') name = ussd_menu.get('name')

View File

@@ -49,7 +49,6 @@ def test_is_valid_transaction_amount(activated_account, amount, expected_result,
]) ])
def test_has_sufficient_balance(activated_account, def test_has_sufficient_balance(activated_account,
cache_balances, cache_balances,
cache_default_token_data,
expected_result, expected_result,
generic_ussd_session, generic_ussd_session,
init_database, init_database,

View File

@@ -121,7 +121,6 @@ def test_statement_callback(activated_account, mocker, transactions_list):
def test_transaction_balances_callback(activated_account, def test_transaction_balances_callback(activated_account,
balances, balances,
cache_balances, cache_balances,
cache_default_token_data,
cache_person_metadata, cache_person_metadata,
cache_preferences, cache_preferences,
load_chain_spec, load_chain_spec,

View File

@@ -13,8 +13,7 @@ from cic_ussd.translation import translation_for
# tests imports # tests imports
def test_transaction(cache_default_token_data, def test_transaction(celery_session_worker,
celery_session_worker,
load_support_phone, load_support_phone,
mock_notifier_api, mock_notifier_api,
notification_data, notification_data,

View File

@@ -30,11 +30,10 @@ def test_generate_statement(activated_account,
def test_cache_statement(activated_account, def test_cache_statement(activated_account,
cache_default_token_data,
cache_person_metadata, cache_person_metadata,
cache_preferences,
celery_session_worker, celery_session_worker,
init_database, init_database,
preferences,
transaction_result): transaction_result):
recipient_transaction, sender_transaction = transaction_actors(transaction_result) recipient_transaction, sender_transaction = transaction_actors(transaction_result)
identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address)) identifier = bytes.fromhex(strip_0x(activated_account.blockchain_address))
@@ -42,7 +41,7 @@ def test_cache_statement(activated_account,
cached_statement = get_cached_data(key) cached_statement = get_cached_data(key)
assert cached_statement is None assert cached_statement is None
s_parse_transaction = celery.signature( s_parse_transaction = celery.signature(
'cic_ussd.tasks.processor.parse_transaction', [sender_transaction]) 'cic_ussd.tasks.processor.parse_transaction', [preferences, sender_transaction])
result = s_parse_transaction.apply_async().get() result = s_parse_transaction.apply_async().get()
s_cache_statement = celery.signature( s_cache_statement = celery.signature(
'cic_ussd.tasks.processor.cache_statement', [result, activated_account.blockchain_address] 'cic_ussd.tasks.processor.cache_statement', [result, activated_account.blockchain_address]
@@ -62,15 +61,15 @@ def test_cache_statement(activated_account,
def test_parse_transaction(activated_account, def test_parse_transaction(activated_account,
cache_person_metadata, cache_person_metadata,
cache_preferences,
celery_session_worker, celery_session_worker,
init_database, init_database,
preferences,
transaction_result): transaction_result):
recipient_transaction, sender_transaction = transaction_actors(transaction_result) recipient_transaction, sender_transaction = transaction_actors(transaction_result)
assert sender_transaction.get('metadata_id') is None assert sender_transaction.get('metadata_id') is None
assert sender_transaction.get('phone_number') is None assert sender_transaction.get('phone_number') is None
s_parse_transaction = celery.signature( s_parse_transaction = celery.signature(
'cic_ussd.tasks.processor.parse_transaction', [sender_transaction]) 'cic_ussd.tasks.processor.parse_transaction', [preferences, sender_transaction])
result = s_parse_transaction.apply_async().get() result = s_parse_transaction.apply_async().get()
assert result.get('metadata_id') == activated_account.standard_metadata_id() assert result.get('metadata_id') == activated_account.standard_metadata_id()
assert result.get('phone_number') == activated_account.phone_number assert result.get('phone_number') == activated_account.phone_number

View File

@@ -41,22 +41,6 @@ def mock_async_balance_api_query(mocker):
return query_args return query_args
@pytest.fixture(scope='function')
def mock_get_adjusted_balance(mocker, task_uuid):
query_args = {}
def get_adjusted_balance(self, token_symbol, balance, timestamp):
sync_res = mocker.patch('celery.result.AsyncResult')
sync_res.id = task_uuid
sync_res.result = 45931650.64654012
query_args['balance'] = balance
query_args['timestamp'] = timestamp
query_args['token_symbol'] = token_symbol
return sync_res
mocker.patch('cic_eth_aux.erc20_demurrage_token.api.Api.get_adjusted_balance', get_adjusted_balance)
return query_args
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def mock_notifier_api(mocker): def mock_notifier_api(mocker):
sms = {} sms = {}

View File

@@ -141,17 +141,7 @@ en:
0. Back 0. Back
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
account_balances: account_balances: |-
available_balance: |-
CON Your balances are as follows:
balance: %{available_balance} %{token_symbol}
0. Back
with_fees: |-
CON Your balances are as follows:
balances: %{available_balance} %{token_symbol}
fees: %{tax} %{token_symbol}
0. Back
with_rewards: |-
CON Your balances are as follows: CON Your balances are as follows:
balance: %{available_balance} %{token_symbol} balance: %{available_balance} %{token_symbol}
fees: %{tax} %{token_symbol} fees: %{tax} %{token_symbol}

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. Rudi 0. Nyuma
enter_date_of_birth: |- enter_date_of_birth: |-
CON Weka mwaka wa kuzaliwa CON Weka mwaka wa kuzaliwa
0. Rudi 0. Nyuma
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. Rudi 0. Nyuma
enter_location: |- enter_location: |-
CON Weka eneo lako CON Weka eneo lako
0. Rudi 0. Nyuma
enter_products: |- enter_products: |-
CON Weka bidhaa ama huduma unauza CON Weka bidhaa ama huduma unauza
0. Rudi 0. Nyuma
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. Rudi 0. Nyuma
enter_transaction_amount: |- enter_transaction_amount: |-
CON Weka kiwango CON Weka kiwango
0. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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,88 @@ sw:
Umri: %{age} Umri: %{age}
Eneo: %{location} Eneo: %{location}
Unauza: %{products} Unauza: %{products}
0. Rudi 0. Nyuma
select_preferred_language: |- select_preferred_language: |-
CON Chagua lugha CON Chagua lugha
1. Kingereza 1. Kingereza
2. Kiswahili 2. Kiswahili
0. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
new_pin_confirmation: |- new_pin_confirmation: |-
CON Weka nambari yako ya siri tena CON Weka nambari yako ya siri tena
0. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
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. Rudi 0. Nyuma
retry: |- retry: |-
%{retry_pin_entry} %{retry_pin_entry}
account_balances: account_balances: |-
available_balance: |-
CON Salio zako ni zifuatazo:
salio: %{available_balance} %{token_symbol}
0. Rudi
with_fees: |-
CON Salio zako ni zifuatazo:
salio: %{available_balance} %{token_symbol}
ushuru: %{tax} %{token_symbol}
0. Rudi
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. Rudi 0. Nyuma
first_transaction_set: |- first_transaction_set: |-
CON %{first_transaction_set} CON %{first_transaction_set}
1. Mbele 1. Mbele
@@ -163,54 +153,54 @@ sw:
middle_transaction_set: |- middle_transaction_set: |-
CON %{middle_transaction_set} CON %{middle_transaction_set}
1. Mbele 1. Mbele
2. Rudi 2. Nyuma
00. Ondoka 00. Ondoka
last_transaction_set: |- last_transaction_set: |-
CON %{last_transaction_set} CON %{last_transaction_set}
2. Rudi 2. Nyuma
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. Rudi 00. Nyuma
99. Ondoka 99. Ondoka
exit_invalid_input: |- exit_invalid_input: |-
CON Chaguo lako halipatikani. Hakuna kilichochaguliwa CON Chaguo lako halipatikani. Hakuna kilichochaguliwa.
00. Rudi 00. Nyuma
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. Rudi 00. Nyuma
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. Rudi 00. Nyuma
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. Rudi 0. Nyuma
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. Rudi 00. Nyuma
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.

View File

@@ -35,11 +35,8 @@ export TOKEN_SINK_ADDRESS=${TOKEN_SINK_ADDRESS:-$DEV_ETH_ACCOUNT_CONTRACT_DEPLOY
# Migration variable processing # Migration variable processing
confini-dump --schema-dir ./config --prefix export > ${DEV_DATA_DIR}/env_reset
echo "export CIC_TRUST_ADDRESS=$CIC_TRUST_ADDRESS 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
export CIC_DEFAULT_TOKEN_SYMBOL=$CIC_DEFAULT_TOKEN_SYMBOL
export WALLET_KEY_FILE=$WALLET_KEY_FILE
" >> ${DEV_DATA_DIR}/env_reset
cat ${DEV_DATA_DIR}/env_reset cat ${DEV_DATA_DIR}/env_reset

View File

@@ -1,3 +1,13 @@
[token]
name = Giftable Token
symbol = GFT
type = giftable_erc20_token
demurrage_level = 196454828847045000000000000000000
redistribution_period =
supply_limit =
sink_address =
[dev] [dev]
eth_account_contract_deployer = eth_account_contract_deployer =
eth_account_reserve_minter = eth_account_reserve_minter =

View File

@@ -110,12 +110,8 @@ giftable-token-minter -s -u $fee_price_arg -w -y $WALLET_KEY_FILE -e $DEV_RESERV
#echo "export CIC_DEFAULT_TOKEN_SYMBOL=$TOKEN_SYMBOL" >> ${DEV_DATA_DIR}/env_reset #echo "export CIC_DEFAULT_TOKEN_SYMBOL=$TOKEN_SYMBOL" >> ${DEV_DATA_DIR}/env_reset
export CIC_DEFAULT_TOKEN_SYMBOL=$TOKEN_SYMBOL export CIC_DEFAULT_TOKEN_SYMBOL=$TOKEN_SYMBOL
echo "Writing env_reset file ..." 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
echo "export CIC_REGISTRY_ADDRESS=$CIC_REGISTRY_ADDRESS
export CIC_DEFAULT_TOKEN_SYMBOL=$CIC_DEFAULT_TOKEN_SYMBOL
export TOKEN_NAME=$TOKEN_NAME
" >> "${DEV_DATA_DIR}"/env_reset
set +a set +a
set +e set +e

View File

@@ -78,11 +78,12 @@ export DEV_ETH_SARAFU_TOKEN_ADDRESS=$DEV_ETH_RESERVE_ADDRESS
>&2 erc20-transfer -s -u -y $WALLET_KEY_FILE -i $CHAIN_SPEC -p $RPC_PROVIDER --fee-limit 100000 -e $reserve_address -w $debug -a $DEV_ETH_ACCOUNT_SARAFU_GIFTER ${DEV_TOKEN_AMOUNT:0:-1} >&2 erc20-transfer -s -u -y $WALLET_KEY_FILE -i $CHAIN_SPEC -p $RPC_PROVIDER --fee-limit 100000 -e $reserve_address -w $debug -a $DEV_ETH_ACCOUNT_SARAFU_GIFTER ${DEV_TOKEN_AMOUNT:0:-1}
# Remove the SEND (8), QUEUE (16) and INIT (2) locks (or'ed), set by default at migration # Remove the SEND (8), QUEUE (16) and INIT (2) locks (or'ed), set by default at migration
echo "cic-eth-ctl -i $CHAIN_SPEC unlock INIT"
cic-eth-ctl -i $CHAIN_SPEC unlock INIT 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

View File

@@ -16,7 +16,7 @@ from crypto_dev_signer.keystore.dict import DictKeystore
from import_util import BalanceProcessor, get_celery_worker_status from import_util import BalanceProcessor, get_celery_worker_status
from import_task import ImportTask, MetadataTask from import_task import ImportTask, MetadataTask
default_config_dir = '/usr/local/etc/data-seeding/' default_config_dir = './config'
logg = logging.getLogger() logg = logging.getLogger()
arg_parser = argparse.ArgumentParser(description='Daemon worker that handles data seeding tasks.') arg_parser = argparse.ArgumentParser(description='Daemon worker that handles data seeding tasks.')

View File

@@ -1,10 +1,11 @@
[cic] [cic]
registry_address = registry_address = 0x32E860c2A0645d1B7B005273696905F5D6DC5D05
token_index_address = token_index_address =
accounts_index_address = accounts_index_address =
declarator_address = declarator_address =
approval_escrow_address = approval_escrow_address =
chain_spec = chain_spec = evm:bloxberg:8996
tx_retry_delay = tx_retry_delay =
trust_address = trust_address = 0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
user_ussd_svc_service_port = user_ussd_svc_service_port =

View File

@@ -28,11 +28,12 @@ logg = logging.getLogger()
fake = Faker(['sl', 'en_US', 'no', 'de', 'ro']) fake = Faker(['sl', 'en_US', 'no', 'de', 'ro'])
default_config_dir = './config' script_dir = os.path.realpath(os.path.dirname(__file__))
# config_dir = os.environ.get('CONFINI_DIR', '/usr/local/etc/cic')
config_dir = os.environ.get('CONFINI_DIR', os.path.join(script_dir, 'config'))
argparser = argparse.ArgumentParser() argparser = argparse.ArgumentParser()
argparser.add_argument('-c', type=str, default=default_config_dir, help='Config dir') argparser.add_argument('-c', type=str, default=config_dir, help='Config dir')
argparser.add_argument('--tag', type=str, action='append', argparser.add_argument('--tag', type=str, action='append',
help='Tags to add to record') help='Tags to add to record')
argparser.add_argument('--gift-threshold', type=int, argparser.add_argument('--gift-threshold', type=int,
@@ -52,7 +53,7 @@ elif args.vv:
config = confini.Config(args.c, os.environ.get('CONFINI_ENV_PREFIX')) config = confini.Config(args.c, os.environ.get('CONFINI_ENV_PREFIX'))
config.process() config.process()
logg.debug('loaded config\n{}'.format(config)) logg.info('loaded config\n{}'.format(config))
dt_now = datetime.datetime.utcnow() dt_now = datetime.datetime.utcnow()

View File

@@ -14,7 +14,6 @@ RUN npm ci --production
#RUN --mount=type=cache,mode=0755,target=/root/node_modules npm install #RUN --mount=type=cache,mode=0755,target=/root/node_modules npm install
COPY requirements.txt . COPY requirements.txt .
COPY config/ /usr/local/etc/data-seeding
ARG EXTRA_INDEX_URL="https://pip.grassrootseconomics.net:8433" ARG EXTRA_INDEX_URL="https://pip.grassrootseconomics.net:8433"
ARG GITLAB_PYTHON_REGISTRY="https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple" ARG GITLAB_PYTHON_REGISTRY="https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple"

View File

@@ -0,0 +1,24 @@
# syntax = docker/dockerfile:1.2
FROM registry.gitlab.com/grassrootseconomics/cic-base-images:python-3.8.6-dev-5ab8bf45
WORKDIR /root
RUN mkdir -vp /usr/local/etc/cic
COPY package.json \
package-lock.json \
.
RUN npm install
COPY requirements.txt .
ARG EXTRA_INDEX_URL="https://pip.grassrootseconomics.net:8433"
ARG GITLAB_PYTHON_REGISTRY="https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple"
RUN pip install \
--extra-index-url $GITLAB_PYTHON_REGISTRY \
--extra-index-url $EXTRA_INDEX_URL -r requirements.txt
COPY . .
ENTRYPOINT [ ]

View File

@@ -1,94 +1,60 @@
#!/bin/bash #!/usr/bin/env bash
if [[ -d "$OUT_DIR" ]] set -e
then
echo "found existing IMPORT DIR cleaning up..."
rm -rf "$OUT_DIR"
mkdir -p "$OUT_DIR"
else
echo "IMPORT DIR does not exist creating it."
mkdir -p "$OUT_DIR"
fi
# using timeout because the timeout flag for celery inspect does not work
timeout 5 celery inspect ping -b "$CELERY_BROKER_URL"
if [[ $? -eq 124 ]]
then
>&2 echo "Celery workers not available. Is the CELERY_BROKER_URL ($CELERY_BROKER_URL) correct?"
exit 1
fi
echo "Creating seed data..." echo "Creating seed data..."
python create_import_users.py -vv -c "$CONFIG" --dir "$OUT_DIR" "$NUMBER_OF_USERS" python create_import_users.py -vv --dir "$IMPORT_DIR" "$ACCOUNT_COUNT"
wait $! wait $!
echo "Check for running celery workers ..."
if [ -f ./cic-ussd-import.pid ];
then
echo "Found a running worker. Killing ..."
kill -9 $(<cic-ussd-import.pid)
fi
echo "Purge tasks from celery worker" echo "Purge tasks from celery worker"
celery -A cic_ussd.import_task purge -Q "$CELERY_QUEUE" --broker redis://"$REDIS_HOST":"$REDIS_PORT" -f celery -A cic_ussd.import_task purge -Q "$CELERY_QUEUE" --broker redis://"$REDIS_HOST":"$REDIS_PORT" -f
echo "Start celery work and import balance job" echo "Start celery work and import balance job"
if [ "$INCLUDE_BALANCES" != "y" ] if [ "$INCLUDE_BALANCES" != "y" ]
then then
echo "Running worker without opening balance transactions" echo "Running worker without opening balance transactions"
TARGET_TX_COUNT=$NUMBER_OF_USERS TARGET_TX_COUNT=$ACCOUNT_COUNT
nohup python cic_ussd/import_balance.py -vv -c "$CONFIG" -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --token-symbol "$TOKEN_SYMBOL" -y "$KEYSTORE_PATH" "$OUT_DIR" > nohup.out 2> nohup.err < /dev/null & python cic_ussd/import_balance.py -vv -c "$CONFIG" -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --token-symbol "$TOKEN_SYMBOL" -y "$KEYSTORE_PATH" "$IMPORT_DIR" &
else else
echo "Running worker with opening balance transactions" echo "Running worker with opening balance transactions"
TARGET_TX_COUNT=$((NUMBER_OF_USERS*2)) TARGET_TX_COUNT=$((ACCOUNT_COUNT*2))
nohup python cic_ussd/import_balance.py -vv -c "$CONFIG" -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --include-balances --token-symbol "$TOKEN_SYMBOL" -y "$KEYSTORE_PATH" "$OUT_DIR" & python cic_ussd/import_balance.py -vv -c "$CONFIG" -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --include-balances --token-symbol "$TOKEN_SYMBOL" -y "$KEYSTORE_PATH" "$IMPORT_DIR" &
fi fi
echo "Target count set to ${TARGET_TX_COUNT}"
until [ -f ./cic-import-ussd.pid ] until [ -f ./cic-import-ussd.pid ]
do do
echo "Polling for celery worker pid file..." echo "Polling for celery worker pid file..."
sleep 1 sleep 1
done done
IMPORT_BALANCE_JOB=$(<cic-import-ussd.pid) IMPORT_BALANCE_JOB=$(<cic-import-ussd.pid)
echo "Start import users job" echo "Start import users job"
if [ "$USSD_SSL" == "y" ] if [ "$USSD_SSL" == "y" ]
then then
echo "Targeting secure ussd-user server" echo "Targeting secure ussd-user server"
python cic_ussd/import_users.py -vv -c "$CONFIG" --ussd-host "$USSD_HOST" --ussd-port "$USSD_PORT" "$OUT_DIR" python cic_ussd/import_users.py -vv -c "$CONFIG" --ussd-host "$USSD_HOST" --ussd-port "$USSD_PORT" "$IMPORT_DIR"
else else
python cic_ussd/import_users.py -vv -c "$CONFIG" --ussd-host "$USSD_HOST" --ussd-port "$USSD_PORT" --ussd-no-ssl "$OUT_DIR" python cic_ussd/import_users.py -vv -c "$CONFIG" --ussd-host "$USSD_HOST" --ussd-port "$USSD_PORT" --ussd-no-ssl "$IMPORT_DIR"
fi fi
echo "Waiting for import balance job to complete ..." echo "Waiting for import balance job to complete ..."
tail --pid="$IMPORT_BALANCE_JOB" -f /dev/null tail --pid="$IMPORT_BALANCE_JOB" -f /dev/null
set -e set -e
echo "Importing pins" echo "Importing pins"
python cic_ussd/import_pins.py -c "$CONFIG" -vv "$OUT_DIR" python cic_ussd/import_pins.py -c "$CONFIG" -vv "$IMPORT_DIR"
set +e set +e
wait $! wait $!
set -e set -e
echo "Importing ussd data" echo "Importing ussd data"
python cic_ussd/import_ussd_data.py -c "$CONFIG" -vv "$OUT_DIR" python cic_ussd/import_ussd_data.py -c "$CONFIG" -vv "$IMPORT_DIR"
set +e set +e
wait $! wait $!
echo "Importing person metadata" echo "Importing person metadata"
node cic_meta/import_meta.js "$OUT_DIR" "$NUMBER_OF_USERS" node cic_meta/import_meta.js "$IMPORT_DIR" "$ACCOUNT_COUNT"
echo "Import preferences metadata" echo "Import preferences metadata"
node cic_meta/import_meta_preferences.js "$OUT_DIR" "$NUMBER_OF_USERS" node cic_meta/import_meta_preferences.js "$IMPORT_DIR" "$ACCOUNT_COUNT"
CIC_NOTIFY_DATABASE=postgres://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST:$DATABASE_PORT/$NOTIFY_DATABASE_NAME CIC_NOTIFY_DATABASE=postgres://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST:$DATABASE_PORT/$NOTIFY_DATABASE_NAME
NOTIFICATION_COUNT=$(psql -qtA "$CIC_NOTIFY_DATABASE" -c 'SELECT COUNT(message) FROM notification WHERE message IS NOT NULL') NOTIFICATION_COUNT=$(psql -qtA "$CIC_NOTIFY_DATABASE" -c 'SELECT COUNT(message) FROM notification WHERE message IS NOT NULL')
while [[ "$NOTIFICATION_COUNT" < "$TARGET_TX_COUNT" ]] while [[ "$NOTIFICATION_COUNT" < "$TARGET_TX_COUNT" ]]
do do
NOTIFICATION_COUNT=$(psql -qtA "$CIC_NOTIFY_DATABASE" -c 'SELECT COUNT(message) FROM notification WHERE message IS NOT NULL') NOTIFICATION_COUNT=$(psql -qtA "$CIC_NOTIFY_DATABASE" -c 'SELECT COUNT(message) FROM notification WHERE message IS NOT NULL')
sleep 5 sleep 5
echo "Notification count is: ${NOTIFICATION_COUNT} of ${TARGET_TX_COUNT}. Checking after 5 ..." echo "Notification count is: ${NOTIFICATION_COUNT}. Checking after 5 ..."
done done
echo "Running verify script." python verify.py -c "$CONFIG" -v -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --exclude "$EXCLUSIONS" --token-symbol "$TOKEN_SYMBOL" "$IMPORT_DIR"
python verify.py -c "$CONFIG" -v -p "$ETH_PROVIDER" -r "$CIC_REGISTRY_ADDRESS" --exclude "$EXCLUSIONS" --meta-provider "$META_URL" --token-symbol "$TOKEN_SYMBOL" --ussd-provider "$USSD_PROVIDER" "$OUT_DIR"

View File

@@ -1,14 +1,13 @@
sarafu-faucet~=0.0.7a2 sarafu-faucet~=0.0.7a1
cic-eth[tools]~=0.12.4a8 cic-eth[tools]~=0.12.4a8
cic-types~=0.1.0a15 cic-types~=0.1.0a14
crypto-dev-signer~=0.4.15a7 crypto-dev-signer>=0.4.15a4,<=0.4.15
faker==4.17.1 faker==4.17.1
chainsyncer~=0.0.6a3 chainsyncer~=0.0.6a3
chainlib-eth~=0.0.9a14 chainlib-eth~=0.0.9a13
eth-address-index~=0.2.3a4 eth-address-index~=0.2.3a4
eth-contract-registry~=0.6.3a3 eth-contract-registry~=0.6.3a3
eth-accounts-index~=0.1.2a3 eth-accounts-index~=0.1.2a3
eth-erc20~=0.1.2a3 eth-erc20~=0.1.2a2
erc20-faucet~=0.3.2a2 erc20-faucet~=0.3.2a2
psycopg2==2.8.6 psycopg2==2.8.6
liveness~=0.0.1a7

View File

@@ -164,7 +164,19 @@ for t in custodial_tests:
logg.info('activating custodial module'.format(t)) logg.info('activating custodial module'.format(t))
break break
cols = os.get_terminal_size().columns
def to_terminalwidth(s):
ss = s.ljust(int(cols)-1)
ss += "\r"
return ss
def default_outfunc(s):
ss = to_terminalwidth(s)
sys.stdout.write(ss)
outfunc = default_outfunc
if logg.isEnabledFor(logging.DEBUG):
outfunc = logg.debug outfunc = logg.debug

View File

@@ -1,12 +1,12 @@
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
variables: variables:
KANIKO_CACHE_ARGS: "--cache=true --cache-copy-layers=true --cache-ttl=24h" KANIKO_CACHE_ARGS: "--cache=true --cache-copy-layers=true --cache-ttl=24h"
MR_IMAGE_TAG: $CI_REGISTRY_IMAGE/mergerequest/$APP_NAME:$CI_COMMIT_SHORT_SHA MR_IMAGE_TAG: $CI_REGISTRY_IMAGE/mergerequest/$APP_NAME:$CI_COMMIT_SHORT_SHA
.py_build_merge_request: .py_build_merge_request:
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
stage: build stage: build
script: script:
- mkdir -p /kaniko/.docker - mkdir -p /kaniko/.docker
@@ -16,9 +16,6 @@ variables:
--cache-repo $CI_REGISTRY_IMAGE --destination $MR_IMAGE_TAG --cache-repo $CI_REGISTRY_IMAGE --destination $MR_IMAGE_TAG
.py_build_target_dev: .py_build_target_dev:
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
stage: build stage: build
variables: variables:
IMAGE_TAG_BASE: $CI_REGISTRY_IMAGE/$APP_NAME:mr-unittest-$CI_COMMIT_SHORT_SHA IMAGE_TAG_BASE: $CI_REGISTRY_IMAGE/$APP_NAME:mr-unittest-$CI_COMMIT_SHORT_SHA
@@ -31,9 +28,6 @@ variables:
--destination $MR_IMAGE_TAG --destination $MR_IMAGE_TAG
.py_build_push: .py_build_push:
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
stage: build stage: build
variables: variables:
IMAGE_TAG_BASE: $CI_REGISTRY_IMAGE/$APP_NAME:$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA IMAGE_TAG_BASE: $CI_REGISTRY_IMAGE/$APP_NAME:$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA

View File

@@ -60,6 +60,8 @@ 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}
profiles:
- migrations
build: build:
context: apps/contract-migration context: apps/contract-migration
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -72,7 +74,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}
DEV_USE_DOCKER_WAIT_SCRIPT: 1 DEV_USE_DOCKER_WAIT_SCRIPT: 1
CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996} CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996}
CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996} CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996}
@@ -91,19 +92,17 @@ services:
CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis:6379} CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis:6379}
DEV_PIP_EXTRA_INDEX_URL: ${DEV_PIP_EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} DEV_PIP_EXTRA_INDEX_URL: ${DEV_PIP_EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
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:-0}
DEV_ETH_GAS_PRICE: $DEV_ETH_GAS_PRICE DEV_ETH_GAS_PRICE: $DEV_ETH_GAS_PRICE
TOKEN_NAME: ${TOKEN_NAME:-Giftable Token} CIC_DEFAULT_TOKEN_SYMBOL: ${CIC_DEFAULT_TOKEN_SYMBOL:-SARAFU}
TOKEN_SYMBOL: ${TOKEN_SYMBOL:-GFT} TOKEN_NAME: ${TOKEN_NAME:-Sarafu Token}
TOKEN_TYPE: ${TOKEN_TYPE:-giftable_erc20_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"}
TOKEN_SUPPLY_LIMIT: $TOKEN_SUPPLY_LIMIT TOKEN_SUPPLY_LIMIT: $TOKEN_SUPPLY_LIMIT
TOKEN_DEMURRAGE_LEVEL: $TOKEN_DEMURRAGE_LEVEL TOKEN_DEMURRAGE_LEVEL: $TOKEN_DEMURRAGE_LEVEL
TOKEN_SINK_ADDRESS: $TOKEN_SINK_ADDRESS TOKEN_SINK_ADDRESS: $TOKEN_SINK_ADDRESS
TOKEN_TYPE: $TOKEN_TYPE
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: ["./reset.sh"] #command: ["./reset.sh"]
depends_on: depends_on:
@@ -114,51 +113,10 @@ services:
volumes: volumes:
- contract-config:/tmp/cic/config - contract-config:/tmp/cic/config
data-seeding:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/data-seeding:${TAG:-latest}
build:
context: apps/data-seeding
dockerfile: docker/Dockerfile
args:
pip_index_url: ${PIP_DEFAULT_INDEX_URL:-https://pypi.org/simple}
pip_extra_args: $PIP_EXTRA_ARGS
environment:
CIC_REGISTRY_ADDRESS: ${CIC_REGISTRY_ADDRESS:-0xea6225212005e86a4490018ded4bf37f3e772161}
OUT_DIR: out
NUMBER_OF_USERS: 10
CONFIG: /usr/local/etc/data-seeding
CIC_CHAIN_SPEC: ${CIC_CHAIN_SPEC:-evm:bloxberg:8996}
ETH_PROVIDER: ${CIC_HTTP_PROVIDER:-http://eth:8545}
TOKEN_SYMBOL: GFT
KEYSTORE_PATH: keystore/UTC--2021-01-08T17-18-44.521011372Z--eb3907ecad74a0013c259d5874ae7f22dcbcc95c
USSD_HOST: cic-user-ussd-server
USSD_PORT: 9000
INCLUDE_BALANCES: y
USSD_SSL: n
DATABASE_NAME: ${DATABASE_NAME:-cic_ussd}
DATABASE_USER: ${DATABASE_USER:-grassroots}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} # this is is set at initdb see: postgres/initdb/create_db.sql
DATABASE_HOST: ${DATABASE_HOST:-postgres}
DATABASE_PORT: ${DATABASE_PORT:-5432}
CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis:6379}
CELERY_RESULT_URL: ${CELERY_RESULT_URL:-redis://redis:6379}
NOTIFY_DATABASE_NAME: cic_notify
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_DB: 0
META_HOST: meta
META_PORT: 8000
META_URL: http://meta:8000
USSD_PROVIDER: http://cic-user-ussd-server:9000
CELERY_QUEUE: cic-import-ussd
EXCLUSIONS: ussd
command: bash import_ussd.sh
volumes:
- contract-config:/tmp/cic/config/:ro
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}
profiles:
- cache
build: build:
context: apps/cic-cache context: apps/cic-cache
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -166,8 +124,8 @@ services:
EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
environment: environment:
CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS # supplied at contract-config after contract provisioning CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS # supplied at contract-config after contract provisioning
ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${RPC_HTTP_PROVIDER:-http://eth:8545}
RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} RPC_HTTP_PROVIDER: ${RPC_HTTP_PROVIDER:-http://eth:8545}
DATABASE_USER: ${DATABASE_USER:-grassroots} DATABASE_USER: ${DATABASE_USER:-grassroots}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} # this is is set at initdb see: postgres/initdb/create_db.sql DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} # this is is set at initdb see: postgres/initdb/create_db.sql
DATABASE_HOST: ${DATABASE_HOST:-postgres} DATABASE_HOST: ${DATABASE_HOST:-postgres}
@@ -181,7 +139,9 @@ 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
restart: on-failure deploy:
restart_policy:
condition: on-failure
depends_on: depends_on:
- redis - redis
- postgres - postgres
@@ -197,6 +157,8 @@ services:
cic-cache-tasker: cic-cache-tasker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest}
profiles:
- cache
build: build:
context: apps/cic-cache context: apps/cic-cache
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -218,7 +180,9 @@ 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
restart: unless-stopped deploy:
restart_policy:
condition: on-failure
depends_on: depends_on:
- redis - redis
- postgres - postgres
@@ -234,6 +198,8 @@ services:
cic-cache-server: cic-cache-server:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-cache:${TAG:-latest}
profiles:
- cache
build: build:
context: apps/cic-cache context: apps/cic-cache
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -248,13 +214,13 @@ services:
DATABASE_DEBUG: 1 DATABASE_DEBUG: 1
#PGPASSWORD: $DATABASE_PASSWORD #PGPASSWORD: $DATABASE_PASSWORD
SERVER_PORT: 8000 SERVER_PORT: 8000
restart: on-failure
ports: ports:
- ${HTTP_PORT_CIC_CACHE:-63313}:8000 - ${HTTP_PORT_CIC_CACHE:-63313}:8000
depends_on: depends_on:
- postgres - postgres
- cic-cache-tasker deploy:
- cic-cache-tracker restart_policy:
condition: on-failure
command: command:
- /bin/bash - /bin/bash
- -c - -c
@@ -278,7 +244,7 @@ services:
CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
ETH_GAS_PROVIDER_ADDRESS: $DEV_ETH_ACCOUNT_GAS_PROVIDER ETH_GAS_PROVIDER_ADDRESS: $DEV_ETH_ACCOUNT_GAS_PROVIDER
ETH_PROVIDER: ${ETH_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${ETH_PROVIDER:-http://eth:8545}
RPC_PROVIDER: ${ETH_PROVIDER:-http://eth:8545} RPC_HTTP_PROVIDER: ${ETH_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}
@@ -298,16 +264,19 @@ services:
CELERY_DEBUG: ${CELERY_DEBUG:-1} CELERY_DEBUG: ${CELERY_DEBUG:-1}
#SIGNER_SOCKET_PATH: ${SIGNER_SOCKET_PATH:-http://cic-eth-signer:8000} #SIGNER_SOCKET_PATH: ${SIGNER_SOCKET_PATH:-http://cic-eth-signer:8000}
SIGNER_PROVIDER: ${SIGNER_PROVIDER:-http://cic-eth-signer:8000} SIGNER_PROVIDER: ${SIGNER_PROVIDER:-http://cic-eth-signer:8000}
SIGNER_PROVIDER: http://cic-eth-signer:8000
SIGNER_SECRET: ${SIGNER_SECRET:-deadbeef} SIGNER_SECRET: ${SIGNER_SECRET:-deadbeef}
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}
restart: unless-stopped
depends_on: depends_on:
- eth - eth
- postgres - postgres
- redis - redis
- cic-eth-signer - cic-eth-signer
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- signer-data:/run/crypto-dev-signer - signer-data:/run/crypto-dev-signer
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
@@ -332,7 +301,7 @@ services:
CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
ETH_GAS_PROVIDER_ADDRESS: $DEV_ETH_ACCOUNT_GAS_PROVIDER ETH_GAS_PROVIDER_ADDRESS: $DEV_ETH_ACCOUNT_GAS_PROVIDER
ETH_PROVIDER: ${ETH_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${ETH_PROVIDER:-http://eth:8545}
RPC_PROVIDER: ${ETH_PROVIDER:-http://eth:8545} RPC_HTTP_PROVIDER: ${ETH_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}
@@ -356,11 +325,13 @@ 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}
restart: on-failure
depends_on: depends_on:
- eth - eth
- postgres - postgres
- redis - redis
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- signer-data:/run/crypto-dev-signer - signer-data:/run/crypto-dev-signer
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
@@ -382,8 +353,8 @@ services:
args: args:
EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
environment: environment:
RPC_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} RPC_HTTP_PROVIDER: ${RPC_HTTP_PROVIDER:-http://eth:8545}
ETH_PROVIDER: ${RPC_PROVIDER:-http://eth:8545} ETH_PROVIDER: ${RPC_HTTP_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}
@@ -395,14 +366,17 @@ services:
CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996} CIC_CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996}
CHAIN_SPEC: ${CHAIN_SPEC:-evm:bloxberg:8996} CHAIN_SPEC: ${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:-"cic-eth:cic_eth.callbacks.noop.noop,cic-ussd:cic_ussd.tasks.callback_handler.transaction_callback"} TASKS_TRANSFER_CALLBACKS: $TASKS_TRANSFER_CALLBACKS
restart: on-failure
depends_on: depends_on:
- eth - eth
- postgres - postgres
- redis - redis
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: command:
@@ -425,7 +399,7 @@ services:
EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
environment: environment:
ETH_PROVIDER: http://eth:8545 ETH_PROVIDER: http://eth:8545
RPC_PROVIDER: http://eth:8545 RPC_HTTP_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}
@@ -442,11 +416,13 @@ services:
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
restart: on-failure
depends_on: depends_on:
- eth - eth
- postgres - postgres
- redis - redis
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: command:
@@ -469,7 +445,7 @@ services:
EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433} EXTRA_INDEX_URL: ${EXTRA_INDEX_URL:-https://pip.grassrootseconomics.net:8433}
environment: environment:
ETH_PROVIDER: http://eth:8545 ETH_PROVIDER: http://eth:8545
RPC_PROVIDER: http://eth:8545 RPC_HTTP_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}
@@ -488,11 +464,13 @@ 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
restart: on-failure
depends_on: depends_on:
- eth - eth
- postgres - postgres
- redis - redis
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- contract-config:/tmp/cic/config/:ro - contract-config:/tmp/cic/config/:ro
command: command:
@@ -525,15 +503,19 @@ services:
AFRICASTALKING_API_USERNAME: $AFRICASTALKING_API_USERNAME AFRICASTALKING_API_USERNAME: $AFRICASTALKING_API_USERNAME
AFRICASTALKING_API_KEY: $AFRICASTALKING_API_KEY AFRICASTALKING_API_KEY: $AFRICASTALKING_API_KEY
AFRICASTALKING_API_SENDER_ID: $AFRICASTALKING_API_SENDER_ID AFRICASTALKING_API_SENDER_ID: $AFRICASTALKING_API_SENDER_ID
restart: unless-stopped
depends_on: depends_on:
- postgres - postgres
- redis - redis
deploy:
restart_policy:
condition: on-failure
command: "/root/start_tasker.sh -q cic-notify -vv" command: "/root/start_tasker.sh -q cic-notify -vv"
cic-meta-server: cic-meta-server:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-meta:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-meta:${TAG:-latest}
profiles:
- custodial-meta
hostname: meta hostname: meta
build: build:
context: apps/cic-meta context: apps/cic-meta
@@ -555,17 +537,21 @@ services:
PGP_PUBLICKEY_ACTIVE_FILE: publickeys.asc PGP_PUBLICKEY_ACTIVE_FILE: publickeys.asc
PGP_PUBLICKEY_ENCRYPT_FILE: publickeys.asc PGP_PUBLICKEY_ENCRYPT_FILE: publickeys.asc
SCHEMA_SQL_PATH: scripts/initdb/server.postgres.sql SCHEMA_SQL_PATH: scripts/initdb/server.postgres.sql
restart: on-failure
ports: ports:
- ${HTTP_PORT_CIC_META:-63380}:8000 - ${HTTP_PORT_CIC_META:-63380}:8000
depends_on: depends_on:
- postgres - postgres
deploy:
restart_policy:
condition: on-failure
volumes: volumes:
- ./apps/contract-migration/testdata/pgp/:/tmp/cic/pgp - ./apps/contract-migration/testdata/pgp/:/tmp/cic/pgp
# command: "/root/start_server.sh -vv" # command: "/root/start_server.sh -vv"
cic-user-ussd-server: cic-user-ussd-server:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest}
profiles:
- custodial-ussd
build: build:
context: apps/cic-ussd context: apps/cic-ussd
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -583,7 +569,6 @@ services:
PGP_PASSPHRASE: merman PGP_PASSPHRASE: merman
SERVER_PORT: 9000 SERVER_PORT: 9000
CIC_META_URL: ${CIC_META_URL:-http://meta:8000} CIC_META_URL: ${CIC_META_URL:-http://meta:8000}
restart: on-failure
ports: ports:
- ${HTTP_PORT_CIC_USER_USSD_SERVER:-63315}:9000 - ${HTTP_PORT_CIC_USER_USSD_SERVER:-63315}:9000
depends_on: depends_on:
@@ -591,10 +576,15 @@ services:
- redis - redis
volumes: volumes:
- ./apps/contract-migration/testdata/pgp/:/usr/src/secrets/ - ./apps/contract-migration/testdata/pgp/:/usr/src/secrets/
deploy:
restart_policy:
condition: on-failure
command: "/root/start_cic_user_ussd_server.sh -vv" command: "/root/start_cic_user_ussd_server.sh -vv"
cic-user-server: cic-user-server:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest}
profiles:
- custodial-ussd
build: build:
context: apps/cic-ussd context: apps/cic-ussd
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -608,15 +598,19 @@ services:
DATABASE_ENGINE: postgresql DATABASE_ENGINE: postgresql
DATABASE_DRIVER: psycopg2 DATABASE_DRIVER: psycopg2
DATABASE_POOL_SIZE: 0 DATABASE_POOL_SIZE: 0
restart: on-failure
ports: ports:
- ${HTTP_PORT_CIC_USER_SERVER:-63415}:9500 - ${HTTP_PORT_CIC_USER_SERVER:-63415}:9500
depends_on: depends_on:
- postgres - postgres
deploy:
restart_policy:
condition: on-failure
command: "/root/start_cic_user_server.sh -vv" command: "/root/start_cic_user_server.sh -vv"
cic-user-tasker: cic-user-tasker:
image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest} image: registry.gitlab.com/grassrootseconomics/cic-internal-integration/cic-ussd:${TAG:-latest}
profiles:
- custodial-ussd
build: build:
context: apps/cic-ussd/ context: apps/cic-ussd/
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
@@ -634,10 +628,12 @@ services:
CELERY_RESULT_URL: ${CELERY_BROKER_URL:-redis://redis} CELERY_RESULT_URL: ${CELERY_BROKER_URL:-redis://redis}
PGP_PASSPHRASE: merman PGP_PASSPHRASE: merman
CIC_META_URL: ${CIC_META_URL:-http://meta:8000} CIC_META_URL: ${CIC_META_URL:-http://meta:8000}
restart: unless-stopped
depends_on: depends_on:
- postgres - postgres
- redis - redis
volumes: volumes:
- ./apps/contract-migration/testdata/pgp/:/usr/src/secrets/ - ./apps/contract-migration/testdata/pgp/:/usr/src/secrets/
deploy:
restart_policy:
condition: on-failure
command: "/root/start_cic_user_tasker.sh -q cic-ussd -vv" command: "/root/start_cic_user_tasker.sh -q cic-ussd -vv"

1
dump.sh Normal file
View File

@@ -0,0 +1 @@
docker run -t -v cic-internal-integration_contract-config:/tmp/cic/config cic-internal-integration_contract-migration cat /tmp/cic/config/env_reset

View File

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