Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
f18934d854 | |||
1c3b5f8601 | |||
3c768b6722 | |||
a06295f4de | |||
84504a135e | |||
4ecac371cf | |||
d5a1809733 | |||
cbef99704f | |||
ce38e6c6f7 | |||
86946b4c38 | |||
228a39ad8c | |||
84f6039da5 |
29
.drone.yml
Normal file
29
.drone.yml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
kind: pipeline
|
||||||
|
name: default
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: fetch
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git fetch --tags
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
image: kamikazechaser/docker-build:latest
|
||||||
|
environment:
|
||||||
|
DOCKER_BUILDKIT: 1
|
||||||
|
COMPOSE_DOCKER_CLI_BUILD: 1
|
||||||
|
IMAGE_BASE_URL: docker.grassecon.net/cic-stack
|
||||||
|
PASSWORD:
|
||||||
|
from_secret: docker_password
|
||||||
|
volumes:
|
||||||
|
- name: docker_sock
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
commands:
|
||||||
|
- echo $PASSWORD | docker login docker.grassecon.net --username ci --password-stdin
|
||||||
|
- export TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
|
||||||
|
- docker-compose -f docker-compose.build.yml build --progress plain
|
||||||
|
- docker-compose -f docker-compose.build.yml push
|
||||||
|
volumes:
|
||||||
|
- name: docker_sock
|
||||||
|
host:
|
||||||
|
path: /var/run/docker.sock
|
@ -26,6 +26,7 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainqueue.db.models.otx import Otx
|
from chainqueue.db.models.otx import Otx
|
||||||
from cic_eth_registry.error import UnknownContractError
|
from cic_eth_registry.error import UnknownContractError
|
||||||
from cic_eth_registry.erc20 import ERC20Token
|
from cic_eth_registry.erc20 import ERC20Token
|
||||||
|
from cic_eth.eth.util import MAXIMUM_FEE_UNITS
|
||||||
from hexathon import add_0x
|
from hexathon import add_0x
|
||||||
import liveness.linux
|
import liveness.linux
|
||||||
|
|
||||||
@ -232,6 +233,7 @@ def main():
|
|||||||
if config.get('ETH_MIN_FEE_PRICE'):
|
if config.get('ETH_MIN_FEE_PRICE'):
|
||||||
BaseTask.min_fee_price = int(config.get('ETH_MIN_FEE_PRICE'))
|
BaseTask.min_fee_price = int(config.get('ETH_MIN_FEE_PRICE'))
|
||||||
CriticalWeb3Task.safe_gas_threshold_amount *= BaseTask.min_fee_price
|
CriticalWeb3Task.safe_gas_threshold_amount *= BaseTask.min_fee_price
|
||||||
|
CriticalWeb3Task.safe_gas_refill_amount = CriticalWeb3Task.safe_gas_refill_amount + MAXIMUM_FEE_UNITS
|
||||||
CriticalWeb3Task.safe_gas_refill_amount *= BaseTask.min_fee_price
|
CriticalWeb3Task.safe_gas_refill_amount *= BaseTask.min_fee_price
|
||||||
CriticalWeb3Task.safe_gas_gifter_balance *= BaseTask.min_fee_price
|
CriticalWeb3Task.safe_gas_gifter_balance *= BaseTask.min_fee_price
|
||||||
|
|
||||||
|
@ -12,4 +12,4 @@ erc20-faucet~=0.3.2
|
|||||||
erc20-transfer-authorization~=0.3.6
|
erc20-transfer-authorization~=0.3.6
|
||||||
sarafu-faucet~=0.0.7
|
sarafu-faucet~=0.0.7
|
||||||
moolb~=0.2.0
|
moolb~=0.2.0
|
||||||
okota~=0.2.5
|
okota~=0.2.6
|
||||||
|
@ -66,14 +66,15 @@ def parse_statement_transactions(statement: list):
|
|||||||
:rtype:
|
:rtype:
|
||||||
"""
|
"""
|
||||||
parsed_transactions = []
|
parsed_transactions = []
|
||||||
|
statement.sort(key=lambda d: d['timestamp'], reverse=True)
|
||||||
for transaction in statement:
|
for transaction in statement:
|
||||||
action_tag = transaction.get('action_tag')
|
action_tag = transaction.get('action_tag')
|
||||||
decimals = transaction.get('token_decimals')
|
decimals = transaction.get('token_decimals')
|
||||||
amount = from_wei(decimals, transaction.get('token_value'))
|
amount = from_wei(decimals, transaction.get('token_value'))
|
||||||
direction_tag = transaction.get('direction_tag')
|
direction_tag = transaction.get('direction_tag')
|
||||||
token_symbol = transaction.get('token_symbol')
|
token_symbol = transaction.get('token_symbol')
|
||||||
metadata_id = transaction.get('metadata_id')
|
metadata_id = transaction.get('alt_metadata_id')
|
||||||
timestamp = datetime.datetime.now().strftime('%d/%m/%y, %H:%M')
|
timestamp = transaction.get('timestamp')
|
||||||
transaction_repr = f'{action_tag} {amount} {token_symbol} {direction_tag} {metadata_id} {timestamp}'
|
transaction_repr = f'{action_tag} {amount} {token_symbol} {direction_tag} {metadata_id} {timestamp}'
|
||||||
parsed_transactions.append(transaction_repr)
|
parsed_transactions.append(transaction_repr)
|
||||||
return parsed_transactions
|
return parsed_transactions
|
||||||
|
@ -265,8 +265,9 @@ def process_token_data(blockchain_address: str, token_symbol: str):
|
|||||||
query_token_metadata(identifier=identifier)
|
query_token_metadata(identifier=identifier)
|
||||||
token_info = query_token_info(identifier=identifier)
|
token_info = query_token_info(identifier=identifier)
|
||||||
hashed_token_info = hashed_token_proof(token_proof=token_info)
|
hashed_token_info = hashed_token_proof(token_proof=token_info)
|
||||||
|
hashed_token_symbol = hashed_token_proof(token_symbol)
|
||||||
query_token_data(blockchain_address=blockchain_address,
|
query_token_data(blockchain_address=blockchain_address,
|
||||||
hashed_proofs=[hashed_token_info],
|
hashed_proofs=[[hashed_token_info, hashed_token_symbol]],
|
||||||
token_symbols=[token_symbol])
|
token_symbols=[token_symbol])
|
||||||
|
|
||||||
|
|
||||||
|
@ -540,5 +540,8 @@ def response(account: Account, display_key: str, menu_name: str, session: Sessio
|
|||||||
if menu_name == 'exit_successful_token_selection':
|
if menu_name == 'exit_successful_token_selection':
|
||||||
return menu_processor.exit_successful_token_selection()
|
return menu_processor.exit_successful_token_selection()
|
||||||
|
|
||||||
|
preferred_language = i18n.config.get('fallback')
|
||||||
|
if account:
|
||||||
preferred_language = get_cached_preferred_language(account.blockchain_address)
|
preferred_language = get_cached_preferred_language(account.blockchain_address)
|
||||||
|
|
||||||
return translation_for(display_key, preferred_language)
|
return translation_for(display_key, preferred_language)
|
||||||
|
@ -16,6 +16,7 @@ from cic_ussd.processor.menu import response
|
|||||||
from cic_ussd.processor.util import latest_input, resume_last_ussd_session
|
from cic_ussd.processor.util import latest_input, resume_last_ussd_session
|
||||||
from cic_ussd.session.ussd_session import create_or_update_session, persist_ussd_session
|
from cic_ussd.session.ussd_session import create_or_update_session, persist_ussd_session
|
||||||
from cic_ussd.state_machine import UssdStateMachine
|
from cic_ussd.state_machine import UssdStateMachine
|
||||||
|
from cic_ussd.state_machine.logic.manager import States
|
||||||
from cic_ussd.validator import is_valid_response
|
from cic_ussd.validator import is_valid_response
|
||||||
|
|
||||||
|
|
||||||
@ -123,7 +124,16 @@ def handle_no_account_menu_operations(account: Optional[Account],
|
|||||||
:return:
|
:return:
|
||||||
:rtype:
|
:rtype:
|
||||||
"""
|
"""
|
||||||
menu = UssdMenu.find_by_name('initial_language_selection')
|
initial_language_selection = 'initial_language_selection'
|
||||||
|
menu = UssdMenu.find_by_name(initial_language_selection)
|
||||||
|
last_ussd_session: UssdSession = UssdSession.last_ussd_session(phone_number, session)
|
||||||
|
if last_ussd_session:
|
||||||
|
menu_name = menu.get('name')
|
||||||
|
if user_input:
|
||||||
|
state = next_state(account, session, user_input, last_ussd_session.to_json())
|
||||||
|
menu = UssdMenu.find_by_name(state)
|
||||||
|
elif menu_name not in States.non_resumable_states and menu_name != initial_language_selection:
|
||||||
|
menu = resume_last_ussd_session(last_ussd_session.state)
|
||||||
ussd_session = create_or_update_session(
|
ussd_session = create_or_update_session(
|
||||||
external_session_id=external_session_id,
|
external_session_id=external_session_id,
|
||||||
msisdn=phone_number,
|
msisdn=phone_number,
|
||||||
@ -132,15 +142,6 @@ def handle_no_account_menu_operations(account: Optional[Account],
|
|||||||
session=session,
|
session=session,
|
||||||
user_input=user_input)
|
user_input=user_input)
|
||||||
persist_ussd_session(external_session_id, queue)
|
persist_ussd_session(external_session_id, queue)
|
||||||
last_ussd_session: UssdSession = UssdSession.last_ussd_session(phone_number, session)
|
|
||||||
if last_ussd_session:
|
|
||||||
if not user_input:
|
|
||||||
menu = resume_last_ussd_session(last_ussd_session.state)
|
|
||||||
else:
|
|
||||||
session = SessionBase.bind_session(session)
|
|
||||||
state = next_state(account, session, user_input, last_ussd_session.to_json())
|
|
||||||
menu = UssdMenu.find_by_name(state)
|
|
||||||
|
|
||||||
return response(account=account,
|
return response(account=account,
|
||||||
display_key=menu.get('display_key'),
|
display_key=menu.get('display_key'),
|
||||||
menu_name=menu.get('name'),
|
menu_name=menu.get('name'),
|
||||||
|
@ -6,13 +6,12 @@ import time
|
|||||||
from typing import List, Union
|
from typing import List, Union
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from cic_types.condiments import MetadataPointer
|
|
||||||
from cic_types.models.person import get_contact_data_from_vcard
|
from cic_types.models.person import get_contact_data_from_vcard
|
||||||
from tinydb.table import Document
|
from tinydb.table import Document
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_ussd.cache import cache_data_key, get_cached_data
|
|
||||||
from cic_ussd.menu.ussd_menu import UssdMenu
|
from cic_ussd.menu.ussd_menu import UssdMenu
|
||||||
|
from cic_ussd.state_machine.logic.manager import States
|
||||||
from cic_ussd.translation import translation_for
|
from cic_ussd.translation import translation_for
|
||||||
|
|
||||||
logg = logging.getLogger(__file__)
|
logg = logging.getLogger(__file__)
|
||||||
@ -66,19 +65,8 @@ def resume_last_ussd_session(last_state: str) -> Document:
|
|||||||
:return:
|
:return:
|
||||||
:rtype:
|
:rtype:
|
||||||
"""
|
"""
|
||||||
# TODO [Philip]: This can be cleaned further
|
|
||||||
non_reusable_states = [
|
if last_state in States.non_resumable_states:
|
||||||
'account_creation_prompt',
|
|
||||||
'exit',
|
|
||||||
'exit_invalid_pin',
|
|
||||||
'exit_invalid_new_pin',
|
|
||||||
'exit_invalid_recipient',
|
|
||||||
'exit_invalid_request',
|
|
||||||
'exit_pin_blocked',
|
|
||||||
'exit_pin_mismatch',
|
|
||||||
'exit_successful_transaction'
|
|
||||||
]
|
|
||||||
if last_state in non_reusable_states:
|
|
||||||
return UssdMenu.find_by_name('start')
|
return UssdMenu.find_by_name('start')
|
||||||
return UssdMenu.find_by_name(last_state)
|
return UssdMenu.find_by_name(last_state)
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ from cic_ussd.db import dsn_from_config
|
|||||||
from cic_ussd.db.models.base import SessionBase
|
from cic_ussd.db.models.base import SessionBase
|
||||||
from cic_ussd.phone_number import Support
|
from cic_ussd.phone_number import Support
|
||||||
from cic_ussd.session.ussd_session import UssdSession as InMemoryUssdSession
|
from cic_ussd.session.ussd_session import UssdSession as InMemoryUssdSession
|
||||||
|
from cic_ussd.state_machine.logic.manager import States
|
||||||
from cic_ussd.translation import generate_locale_files
|
from cic_ussd.translation import generate_locale_files
|
||||||
from cic_ussd.validator import validate_presence
|
from cic_ussd.validator import validate_presence
|
||||||
|
|
||||||
@ -94,6 +95,9 @@ i18n.set('fallback', config.get('LOCALE_FALLBACK'))
|
|||||||
|
|
||||||
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
||||||
|
|
||||||
|
# make non-resumable states accessible globally
|
||||||
|
States.load_non_resumable_states(config.get("MACHINE_NON_RESUMABLE_STATES"))
|
||||||
|
|
||||||
|
|
||||||
Chain.spec = chain_spec
|
Chain.spec = chain_spec
|
||||||
Support.phone_number = config.get('OFFICE_SUPPORT_PHONE')
|
Support.phone_number = config.get('OFFICE_SUPPORT_PHONE')
|
||||||
|
@ -34,6 +34,7 @@ from cic_ussd.processor.ussd import handle_menu_operations
|
|||||||
from cic_ussd.runnable.server_base import exportable_parser, logg
|
from cic_ussd.runnable.server_base import exportable_parser, logg
|
||||||
from cic_ussd.session.ussd_session import UssdSession as InMemoryUssdSession
|
from cic_ussd.session.ussd_session import UssdSession as InMemoryUssdSession
|
||||||
from cic_ussd.state_machine import UssdStateMachine
|
from cic_ussd.state_machine import UssdStateMachine
|
||||||
|
from cic_ussd.state_machine.logic.manager import States
|
||||||
from cic_ussd.translation import generate_locale_files, Languages, translation_for
|
from cic_ussd.translation import generate_locale_files, Languages, translation_for
|
||||||
from cic_ussd.validator import check_ip, check_request_content_length, validate_phone_number, validate_presence
|
from cic_ussd.validator import check_ip, check_request_content_length, validate_phone_number, validate_presence
|
||||||
|
|
||||||
@ -94,6 +95,9 @@ celery.Celery(backend=config.get('CELERY_RESULT_URL'), broker=config.get('CELERY
|
|||||||
states = json_file_parser(filepath=config.get('MACHINE_STATES'))
|
states = json_file_parser(filepath=config.get('MACHINE_STATES'))
|
||||||
transitions = json_file_parser(filepath=config.get('MACHINE_TRANSITIONS'))
|
transitions = json_file_parser(filepath=config.get('MACHINE_TRANSITIONS'))
|
||||||
|
|
||||||
|
# make non-resumable states accessible globally
|
||||||
|
States.load_non_resumable_states(config.get("MACHINE_NON_RESUMABLE_STATES"))
|
||||||
|
|
||||||
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
||||||
|
|
||||||
Chain.spec = chain_spec
|
Chain.spec = chain_spec
|
||||||
|
15
apps/cic-ussd/cic_ussd/state_machine/logic/manager.py
Normal file
15
apps/cic-ussd/cic_ussd/state_machine/logic/manager.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# standard imports
|
||||||
|
import json
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
|
||||||
|
|
||||||
|
class States:
|
||||||
|
non_resumable_states = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load_non_resumable_states(cls, file_path):
|
||||||
|
with open(file_path, 'r') as states_file:
|
||||||
|
cls.non_resumable_states = json.load(states_file)
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from datetime import timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
import celery
|
import celery
|
||||||
@ -143,9 +143,11 @@ def statement_callback(self, result, param: str, status_code: int):
|
|||||||
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')
|
recipient_transaction['alt_blockchain_address'] = sender_transaction.get('blockchain_address')
|
||||||
|
recipient_transaction['timestamp'] = datetime.utcfromtimestamp(transaction.get('timestamp')).strftime('%d/%m/%y, %H:%M')
|
||||||
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')
|
sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address')
|
||||||
|
sender_transaction['timestamp'] = datetime.utcfromtimestamp(transaction.get('timestamp')).strftime('%d/%m/%y, %H:%M')
|
||||||
generate(param, queue, sender_transaction)
|
generate(param, queue, sender_transaction)
|
||||||
|
|
||||||
|
|
||||||
@ -231,6 +233,10 @@ def transaction_callback(result: dict, param: str, status_code: int):
|
|||||||
if status_code != 0:
|
if status_code != 0:
|
||||||
raise ValueError(f'Unexpected status code: {status_code}.')
|
raise ValueError(f'Unexpected status code: {status_code}.')
|
||||||
|
|
||||||
|
print(f'THE RETURNING TRANSACTION IS: {result}')
|
||||||
|
print(f'STATUS CODE: {status_code}')
|
||||||
|
print(f'WITH PARAM: {param}')
|
||||||
|
|
||||||
chain_str = Chain.spec.__str__()
|
chain_str = Chain.spec.__str__()
|
||||||
destination_token_symbol = result.get('destination_token_symbol')
|
destination_token_symbol = result.get('destination_token_symbol')
|
||||||
destination_token_value = result.get('destination_token_value')
|
destination_token_value = result.get('destination_token_value')
|
||||||
|
@ -4,6 +4,7 @@ max_body_length=1024
|
|||||||
password_pepper=
|
password_pepper=
|
||||||
|
|
||||||
[machine]
|
[machine]
|
||||||
|
non_resumable_states=states/non_resumable_states.json
|
||||||
states=states/
|
states=states/
|
||||||
transitions=transitions/
|
transitions=transitions/
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ max_body_length=1024
|
|||||||
password_pepper=QYbzKff6NhiQzY3ygl2BkiKOpER8RE/Upqs/5aZWW+I=
|
password_pepper=QYbzKff6NhiQzY3ygl2BkiKOpER8RE/Upqs/5aZWW+I=
|
||||||
|
|
||||||
[machine]
|
[machine]
|
||||||
|
non_resumable_states=states/non_resumable_states.json
|
||||||
states=states/
|
states=states/
|
||||||
transitions=transitions/
|
transitions=transitions/
|
||||||
|
|
||||||
|
11
apps/cic-ussd/states/non_resumable_states.json
Normal file
11
apps/cic-ussd/states/non_resumable_states.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
"account_creation_prompt",
|
||||||
|
"exit",
|
||||||
|
"exit_invalid_pin",
|
||||||
|
"exit_invalid_new_pin",
|
||||||
|
"exit_invalid_recipient",
|
||||||
|
"exit_invalid_request",
|
||||||
|
"exit_pin_blocked",
|
||||||
|
"exit_pin_mismatch",
|
||||||
|
"exit_successful_transaction"
|
||||||
|
]
|
@ -1,4 +1,5 @@
|
|||||||
# standard imports
|
# standard imports
|
||||||
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
@ -119,8 +120,11 @@ def test_statement_callback(activated_account, mocker, transactions_list):
|
|||||||
[transactions_list, activated_account.blockchain_address, status_code])
|
[transactions_list, activated_account.blockchain_address, status_code])
|
||||||
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)
|
||||||
|
timestamp = transactions_list[0].get('timestamp')
|
||||||
|
timestamp = datetime.datetime.utcfromtimestamp(timestamp).strftime('%d/%m/%y, %H:%M')
|
||||||
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')
|
sender_transaction['alt_blockchain_address'] = recipient_transaction.get('blockchain_address')
|
||||||
|
sender_transaction['timestamp'] = timestamp
|
||||||
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')
|
||||||
|
|
||||||
|
6
apps/cic-ussd/tests/fixtures/config.py
vendored
6
apps/cic-ussd/tests/fixtures/config.py
vendored
@ -16,6 +16,7 @@ from cic_ussd.files.local_files import create_local_file_data_stores, json_file_
|
|||||||
from cic_ussd.menu.ussd_menu import UssdMenu
|
from cic_ussd.menu.ussd_menu import UssdMenu
|
||||||
from cic_ussd.phone_number import E164Format, Support
|
from cic_ussd.phone_number import E164Format, Support
|
||||||
from cic_ussd.state_machine import UssdStateMachine
|
from cic_ussd.state_machine import UssdStateMachine
|
||||||
|
from cic_ussd.state_machine.logic.manager import States
|
||||||
from cic_ussd.translation import generate_locale_files, Languages
|
from cic_ussd.translation import generate_locale_files, Languages
|
||||||
from cic_ussd.validator import validate_presence
|
from cic_ussd.validator import validate_presence
|
||||||
|
|
||||||
@ -69,6 +70,11 @@ def load_e164_region(load_config):
|
|||||||
E164Format.region = load_config.get('E164_REGION')
|
E164Format.region = load_config.get('E164_REGION')
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session', autouse=True)
|
||||||
|
def load_non_resumable_states(load_config):
|
||||||
|
States.load_non_resumable_states(load_config.get('MACHINE_NON_RESUMABLE_STATES'))
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='session')
|
@pytest.fixture(scope='session')
|
||||||
def load_support_phone(load_config):
|
def load_support_phone(load_config):
|
||||||
Support.phone_number = load_config.get('OFFICE_SUPPORT_PHONE')
|
Support.phone_number = load_config.get('OFFICE_SUPPORT_PHONE')
|
||||||
|
4
apps/cic-ussd/tests/fixtures/transaction.py
vendored
4
apps/cic-ussd/tests/fixtures/transaction.py
vendored
@ -1,6 +1,5 @@
|
|||||||
# standard import
|
# standard import
|
||||||
import random
|
from datetime import datetime
|
||||||
|
|
||||||
# external import
|
# external import
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@ -46,6 +45,7 @@ def statement(activated_account):
|
|||||||
'direction_tag': 'To',
|
'direction_tag': 'To',
|
||||||
'metadata_id': activated_account.standard_metadata_id(),
|
'metadata_id': activated_account.standard_metadata_id(),
|
||||||
'phone_number': activated_account.phone_number,
|
'phone_number': activated_account.phone_number,
|
||||||
|
'timestamp': datetime.now().strftime('%d/%m/%y, %H:%M')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "first_transaction_set",
|
"source": "first_transaction_set",
|
||||||
"dest": "middle_transaction_set",
|
"dest": "middle_transaction_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_one_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
@ -20,13 +20,13 @@
|
|||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_transaction_set",
|
"source": "middle_transaction_set",
|
||||||
"dest": "last_transaction_set",
|
"dest": "last_transaction_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_one_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_transaction_set",
|
"source": "middle_transaction_set",
|
||||||
"dest": "first_transaction_set",
|
"dest": "first_transaction_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_two_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
@ -43,7 +43,7 @@
|
|||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "last_transaction_set",
|
"source": "last_transaction_set",
|
||||||
"dest": "middle_transaction_set",
|
"dest": "middle_transaction_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_two_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
|
@ -9,130 +9,160 @@
|
|||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_language_selection",
|
"source": "initial_language_selection",
|
||||||
"dest": "initial_middle_language_set",
|
"dest": "exit",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless":"cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_language_selection",
|
"source": "initial_language_selection",
|
||||||
"dest": "exit",
|
"dest": "initial_middle_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "initial_language_selection",
|
||||||
|
"dest": "exit_invalid_menu_option"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_middle_language_set",
|
"source": "initial_middle_language_set",
|
||||||
"dest": "initial_language_selection",
|
"dest": "account_creation_prompt",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
"after": "cic_ussd.state_machine.logic.account.process_account_creation",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "initial_middle_language_set",
|
||||||
|
"dest": "exit",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_middle_language_set",
|
"source": "initial_middle_language_set",
|
||||||
"dest": "initial_last_language_set",
|
"dest": "initial_last_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_middle_language_set",
|
"source": "initial_middle_language_set",
|
||||||
|
"dest": "initial_language_selection",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "initial_middle_language_set",
|
||||||
|
"dest": "exit_invalid_menu_option"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "initial_last_language_set",
|
||||||
|
"dest": "account_creation_prompt",
|
||||||
|
"after": "cic_ussd.state_machine.logic.account.process_account_creation",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "initial_last_language_set",
|
||||||
"dest": "exit",
|
"dest": "exit",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_last_language_set",
|
"source": "initial_last_language_set",
|
||||||
"dest": "initial_middle_language_set",
|
"dest": "initial_middle_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "initial_last_language_set",
|
"source": "initial_last_language_set",
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "initial_middle_language_set",
|
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "initial_language_selection",
|
|
||||||
"dest": "exit_invalid_menu_option"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "middle_language_set",
|
|
||||||
"dest": "exit_invalid_menu_option"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "last_language_set",
|
|
||||||
"dest": "exit_invalid_menu_option"
|
"dest": "exit_invalid_menu_option"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "select_preferred_language",
|
"source": "select_preferred_language",
|
||||||
"dest": "exit",
|
"dest": "complete",
|
||||||
"after": "cic_ussd.state_machine.logic.language.change_preferred_language",
|
"after": "cic_ussd.state_machine.logic.language.change_preferred_language",
|
||||||
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "select_preferred_language",
|
"source": "select_preferred_language",
|
||||||
"dest": "middle_language_set",
|
"dest": "exit",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless":"cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "select_preferred_language",
|
"source": "select_preferred_language",
|
||||||
"dest": "exit",
|
"dest": "middle_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "select_preferred_language",
|
||||||
|
"dest": "exit_invalid_menu_option"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_language_set",
|
"source": "middle_language_set",
|
||||||
"dest": "select_preferred_language",
|
"dest": "complete",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
"after": "cic_ussd.state_machine.logic.language.change_preferred_language",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "middle_language_set",
|
||||||
|
"dest": "exit",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_language_set",
|
"source": "middle_language_set",
|
||||||
"dest": "last_language_set",
|
"dest": "last_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_language_set",
|
"source": "middle_language_set",
|
||||||
|
"dest": "select_preferred_language",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "middle_language_set",
|
||||||
|
"dest": "exit_invalid_menu_option"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "last_language_set",
|
||||||
|
"dest": "complete",
|
||||||
|
"after": "cic_ussd.state_machine.logic.language.change_preferred_language",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "last_language_set",
|
||||||
"dest": "exit",
|
"dest": "exit",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected",
|
||||||
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "last_language_set",
|
"source": "last_language_set",
|
||||||
"dest": "middle_language_set",
|
"dest": "middle_language_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected",
|
||||||
},
|
"unless": "cic_ussd.state_machine.logic.language.is_valid_language_selection"
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "last_language_set",
|
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "middle_language_set",
|
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "select_preferred_language",
|
|
||||||
"dest": "exit_invalid_menu_option"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "middle_language_set",
|
|
||||||
"dest": "exit_invalid_menu_option"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
|
@ -1,16 +1,4 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "first_account_tokens_set",
|
|
||||||
"dest": "middle_account_tokens_set",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "first_account_tokens_set",
|
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "first_account_tokens_set",
|
"source": "first_account_tokens_set",
|
||||||
@ -18,11 +6,36 @@
|
|||||||
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
||||||
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "first_account_tokens_set",
|
||||||
|
"dest": "exit",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "first_account_tokens_set",
|
||||||
|
"dest": "middle_account_tokens_set",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_eleven_selected"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "first_account_tokens_set",
|
"source": "first_account_tokens_set",
|
||||||
"dest": "exit_invalid_menu_option"
|
"dest": "exit_invalid_menu_option"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "middle_account_tokens_set",
|
||||||
|
"dest": "token_selection_pin_authorization",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
||||||
|
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"trigger": "scan_data",
|
||||||
|
"source": "middle_account_tokens_set",
|
||||||
|
"dest": "exit",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_account_tokens_set",
|
"source": "middle_account_tokens_set",
|
||||||
@ -38,20 +51,20 @@
|
|||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_account_tokens_set",
|
"source": "middle_account_tokens_set",
|
||||||
"dest": "exit",
|
"dest": "exit_invalid_menu_option"
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_account_tokens_set",
|
"source": "last_account_tokens_set",
|
||||||
"dest": "token_selection_pin_authorization",
|
"dest": "token_selection_pin_authorization",
|
||||||
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
||||||
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "middle_account_tokens_set",
|
"source": "last_account_tokens_set",
|
||||||
"dest": "exit_invalid_menu_option"
|
"dest": "exit",
|
||||||
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
@ -59,19 +72,6 @@
|
|||||||
"dest": "middle_account_tokens_set",
|
"dest": "middle_account_tokens_set",
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
"conditions": "cic_ussd.state_machine.logic.menu.menu_twenty_two_selected"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "last_account_tokens_set",
|
|
||||||
"dest": "exit",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.menu.menu_zero_zero_selected"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"trigger": "scan_data",
|
|
||||||
"source": "last_account_tokens_set",
|
|
||||||
"dest": "token_selection_pin_authorization",
|
|
||||||
"conditions": "cic_ussd.state_machine.logic.tokens.is_valid_token_selection",
|
|
||||||
"after": "cic_ussd.state_machine.logic.tokens.process_token_selection"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"trigger": "scan_data",
|
"trigger": "scan_data",
|
||||||
"source": "last_account_tokens_set",
|
"source": "last_account_tokens_set",
|
||||||
|
@ -9,4 +9,4 @@ erc20-faucet==0.3.2
|
|||||||
sarafu-faucet==0.0.7
|
sarafu-faucet==0.0.7
|
||||||
confini~=0.5.3
|
confini~=0.5.3
|
||||||
eth-token-index==0.2.4
|
eth-token-index==0.2.4
|
||||||
okota==0.2.5a1
|
okota==0.2.6
|
||||||
|
@ -1,52 +1,52 @@
|
|||||||
version: '3.2'
|
version: "3.2"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
cic-cache:
|
cic-cache:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-cache:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-cache:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-cache
|
context: apps/cic-cache
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-cache:latest
|
- docker.grassecon.net/cic-stack/cic-cache:${TAG:-latest}
|
||||||
cic-eth:
|
cic-eth:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-eth:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-eth:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-eth
|
context: apps/cic-eth
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-eth:latest
|
- docker.grassecon.net/cic-stack/cic-eth:${TAG:-latest}
|
||||||
cic-meta:
|
cic-meta:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-meta:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-meta:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-meta
|
context: apps/cic-meta
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-meta:latest
|
- docker.grassecon.net/cic-stack/cic-meta:${TAG:-latest}
|
||||||
cic-notify:
|
cic-notify:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-notify:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-notify:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-notify
|
context: apps/cic-notify
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-notify:latest
|
- docker.grassecon.net/cic-stack/cic-notify:${TAG:-latest}
|
||||||
funga-eth:
|
funga-eth:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/funga-eth:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/funga-eth:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-signer
|
context: apps/cic-signer
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/funga-eth:latest
|
- docker.grassecon.net/cic-stack/funga-eth:${TAG:-latest}
|
||||||
cic-ussd:
|
cic-ussd:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-ussd:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-ussd:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/cic-ussd
|
context: apps/cic-ussd
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-ussd:latest
|
- docker.grassecon.net/cic-stack/cic-ussd:${TAG:-latest}
|
||||||
cic-contract-bootstrap:
|
cic-contract-bootstrap:
|
||||||
image: ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-contract-bootstrap:${TAG:-latest}
|
image: docker.grassecon.net/cic-stack/cic-contract-bootstrap:${TAG:-latest}
|
||||||
build:
|
build:
|
||||||
context: apps/contract-migration
|
context: apps/contract-migration
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
cache_from:
|
cache_from:
|
||||||
- ${IMAGE_BASE_URL:-registry.gitlab.com/grassrootseconomics/cic-internal-integration}/cic-ussd:latest
|
- docker.grassecon.net/cic-stack/cic-ussd:${TAG:-latest}
|
||||||
|
Loading…
Reference in New Issue
Block a user