diff --git a/.env.example b/.env.example index f47e8a7..ab03ce0 100644 --- a/.env.example +++ b/.env.example @@ -7,9 +7,6 @@ SUPPORT_ACCOUNT='' CYBERLINK_CREATION_QUERY='expect src/create_cyberlink.exp' ACCOUNT_CREATION_QUERY='expect src/create_account.exp' TRANSFER_QUERY='expect src/transfer_tokens.exp' -DELEGATE_QUERY='expect src/delegate_tokens.exp' -INVESTMINT_QUERY='expect src/investmint_tokens.exp' -UNJAIL_VALIDATOR_QUERY='expect src/unjail_validator.exp' IPFS_RESTART_QUERY='expect src/restart_ipfs_node.exp' IPFS_HOST='http://localhost:5001' VALIDATOR_ADDRESS='' \ No newline at end of file diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 9ba86a2..e6bdca5 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v1 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d3dd8c8 --- /dev/null +++ b/Makefile @@ -0,0 +1,31 @@ +default: help + +all : help install_venv clean_venv test start_main start_dev_mode_main +.PHONY : all + +help: # show help for each of the makefile recipes + @grep -E '^[a-zA-Z0-9 -_]+:.*#' Makefile | while read -r l; do printf "\033[1;32m$$(echo $$l | cut -f 1 -d':')\033[00m:$$(echo $$l | cut -f 2- -d'#')\n"; done + +install_venv: # install python virtual environment and requirements in it + test -d venv || python3 -m venv venv + . venv/bin/activate; pip install -Ur requirements.txt + +clean_venv: # clean python virtual environment and requirements in it + rm -rf venv + +test: # test cyberdBot + . venv/bin/activate; python3 -m pytest -s -v *.py src/*.py + +start_main: # start main bot + . venv/bin/activate; python3 main.py + +start_dev_mode_main: export VALIDATOR_QUERY=cat\ .\/tests\/validators_query_test +start_dev_mode_main: # start main bot in development mode for easy bot stop + . venv/bin/activate; python3 main.py --dev_mode + +start_scheduler: # start scheduler + . venv/bin/activate; python3 monitoring_scheduler.py + +start_dev_mode_scheduler: export VALIDATOR_QUERY=cat\ .\/tests\/validators_query_test +start_dev_mode_scheduler: # start scheduler in development mode for easy bot stop + . venv/bin/activate; python3 monitoring_scheduler.py --dev_mode diff --git a/README.md b/README.md index 233a990..0d74aeb 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,36 @@ # cyberdBot [t.me/cyberdbot](https://t.me/cyberdbot) Telegram bot for creation cyberLinks on the cyberd knoledge graph, upload content to IPFS and monitoring [cyberd](https://github.com/cybercongress/cyberd/) node status data ## Install -Install [IPFS node](https://docs-beta.ipfs.io/install/command-line-quick-start/) -Install [cyberd node](https://cybercongress.ai/docs/cyberd/run_validator/) -Clone repository: +- Install [IPFS node](https://docs-beta.ipfs.io/install/command-line-quick-start/) +- Install [cyberd node](https://cybercongress.ai/docs/cyberd/run_validator/) +- Clone repository: ```bash git clone https://github.com/Snedashkovsky/cyberdBot ``` -Install requirements +- Install requirements ```bash -pip3 install --user -r cyberdBot/requirements.txt +make install_venv sudo apt-get install expect ``` -Add your Telegram Bot Token, cyberd key name and cyberd passphrase into `start_bot.sh` +- Add your Telegram Bot Token, cyberd key name and cyberd passphrase into `.env` ## Run +### Main Bot ```bash -./start_bot.sh m|main|s|scheduler [d|dev] - -Using: - m|main - Main Bot - s|scheduler - Monitoring Scheduler - [d|dev] - Development Mode +# Development Mode +make start_dev_mode_main +# Production mode +make start_main +``` +### Monitoring Scheduler +```bash +# Development Mode +make start_dev_mode_scheduler +# Production mode +make start_scheduler ``` ## Test ``` -python3 -m pytest -s -v *.py src/*.py +make test ``` ## Commands @@ -40,7 +46,7 @@ issue - Create issue or send feedback ``` ## Requirements -Python 3.6 or higher +Python 3.9 or higher ## Data for the Bostrom Genesis [Bot user addresses with the number of created cyberlinks](https://ipfs.io/ipfs/QmWLoxH5F1tFvoiMEq8JEGjHsrT7JSkRxzhUGV1Lrn1GWk) as of 10/08/2021. diff --git a/config.py b/config.py index 3a5031d..e80239d 100644 --- a/config.py +++ b/config.py @@ -1,9 +1,9 @@ -import os from enum import Enum from telebot.types import ReplyKeyboardMarkup from telebot import TeleBot from dotenv import dotenv_values import logging +from sys import stdout from src.sql_utils import SQLighter @@ -14,7 +14,16 @@ SUPPORT_ACCOUNT = dotenv_values('.env')['SUPPORT_ACCOUNT'] # Set logging format -logging.basicConfig(filename='cyberdbot.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +LOG_FILE = 'cyberdbot.log' +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(module)s - %(message)s', + datefmt='%d-%m-%Y %H:%M:%S', + handlers=[ + logging.FileHandler(LOG_FILE), + logging.StreamHandler(stdout) + ] +) # cyberdBot key name in the cyber CYBER_KEY_NAME = dotenv_values('.env')['CYBER_KEY_NAME'] @@ -32,25 +41,12 @@ # Shell query for transfer main tokens to new account TRANSFER_QUERY = dotenv_values('.env')['TRANSFER_QUERY'] -# Shell query for delegate main tokens to validator -DELEGATE_QUERY = dotenv_values('.env')['DELEGATE_QUERY'] -VALIDATOR_ADDRESS = dotenv_values('.env')['VALIDATOR_ADDRESS'] - -# Shell query for investmint stake tokens for amper or volt -INVESTMINT_QUERY = dotenv_values('.env')['INVESTMINT_QUERY'] - -# Shell query for unjail validator -UNJAIL_VALIDATOR_QUERY = dotenv_values('.env')['UNJAIL_VALIDATOR_QUERY'] - # Shell query for IPFS node restart IPFS_RESTART_QUERY = dotenv_values('.env')['IPFS_RESTART_QUERY'] # IPFS HOST IPFS_HOST = dotenv_values('.env')['IPFS_HOST'] -# Development mode for easy bot stop (set in start_bot.sh) -DEV_MODE = int(os.getenv('DEV_MODE', 0)) - # SQLite file name and DB worker DB_FILE = 'db_sqlite.vdb' db_worker = SQLighter(DB_FILE) @@ -74,23 +70,23 @@ TOKEN_NAME = 'BOOT' # List of commands -COMMAND_LIST = ['search', 'cyberlink', 'ipfs', 'tweet', 'check', 'validators', 'issue'] +COMMAND_LIST = ['search', 'cyberlink', 'ipfs', 'check', 'validators', 'issue'] # Base Menu -BASE_MENU = ['Search', 'Create cyberLink', 'Upload to IPFS', 'Sign up', +BASE_MENU = ['Search a content in Bostrom', 'Create cyberLink', 'Upload to IPFS', 'Jail check', 'Validator list', 'Jail check settings'] BASE_KEYBOARD = ReplyKeyboardMarkup(True, True) BASE_KEYBOARD.add(BASE_MENU[0]) -BASE_KEYBOARD.add(BASE_MENU[1], BASE_MENU[2], BASE_MENU[3]) -BASE_KEYBOARD.add(BASE_MENU[4], BASE_MENU[5], BASE_MENU[6]) +BASE_KEYBOARD.add(BASE_MENU[2]) +BASE_KEYBOARD.add(BASE_MENU[3], BASE_MENU[4], BASE_MENU[5]) # BASE Menu after Sign up -BASE_AFTER_SIGN_UP_MENU = ['Search', 'Create cyberLink', 'Upload to IPFS', 'Tweet', +BASE_AFTER_SIGN_UP_MENU = ['Search a content in Bostrom', 'Create cyberLink', 'Upload to IPFS', 'Jail check', 'Validator list', 'Jail check settings'] BASE_AFTER_SIGN_UP_KEYBOARD = ReplyKeyboardMarkup(True, True) BASE_AFTER_SIGN_UP_KEYBOARD.add(BASE_AFTER_SIGN_UP_MENU[0]) -BASE_AFTER_SIGN_UP_KEYBOARD.add(BASE_AFTER_SIGN_UP_MENU[1], BASE_AFTER_SIGN_UP_MENU[2], BASE_AFTER_SIGN_UP_MENU[3]) -BASE_AFTER_SIGN_UP_KEYBOARD.add(BASE_AFTER_SIGN_UP_MENU[4], BASE_AFTER_SIGN_UP_MENU[5], BASE_AFTER_SIGN_UP_MENU[6]) +BASE_AFTER_SIGN_UP_KEYBOARD.add(BASE_AFTER_SIGN_UP_MENU[2]) +BASE_AFTER_SIGN_UP_KEYBOARD.add(BASE_AFTER_SIGN_UP_MENU[3], BASE_AFTER_SIGN_UP_MENU[4], BASE_AFTER_SIGN_UP_MENU[5]) BASE_MENU_LOWER = set(map(str.lower, BASE_MENU + BASE_AFTER_SIGN_UP_MENU + ['/' + item for item in COMMAND_LIST])) @@ -121,7 +117,7 @@ class States(Enum): S_SEARCH = 1 # Search a content S_UPLOAD_IPFS = 2 # Upload a content to IPFS S_STARTPOINT_CYBERLINK = 3 # Set a starting point of cyberlink - S_ENDPOINT_CYBERLINK = 4 # Set a endpoint of cyberlink + S_ENDPOINT_CYBERLINK = 4 # Set an endpoint of cyberlink S_MONITORING = 5 # Jail checker S_SIGNUP = 6 # Sign up a new cyberd account S_NEW_TWEET = 7 # Upload a New Tweet diff --git a/main.py b/main.py index b589bef..c67957a 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,17 @@ from collections import defaultdict -import time import re +from argparse import ArgumentParser + +from cyberutils.bash import display_sleep from src.bot_utils import create_temp_directory, send_ipfs_notification, jail_check, dict_to_md_list, \ message_upload_to_ipfs, base_keyboard_reply_markup from src.lcd_utils import validators_state, search_cid -from src.bash_utils import create_cyberlink, create_account, transfer_tokens +from src.bash_utils import create_cyberlink, create_account from config import CYBER_KEY_NAME, BASE_MENU_LOWER, MONITORING_MENU_LOWER, TWEETER_MENU_LOWER, MONITORING_KEYBOARD, \ - TWEETER_KEYBOARD, TWEET_HASH, AVATAR_HASH, FOLLOW_HASH, DEV_MODE, States, bot, db_worker, CYBERPAGE_URL, \ - CYBERPAGE_BASE_URL, TOKEN_NAME, COMMAND_LIST, SUPPORT_ACCOUNT, logging + TWEETER_KEYBOARD, TWEET_HASH, AVATAR_HASH, FOLLOW_HASH, States, bot, db_worker, CYBERPAGE_URL, \ + CYBERPAGE_BASE_URL, COMMAND_LIST, SUPPORT_ACCOUNT, logging + # Create directory for temporary files create_temp_directory() @@ -86,9 +89,9 @@ def search(message, number_of_search_results: int = 5): search_list = search_list[:min(len(search_list), number_of_search_results)] message_text = \ f'Top {number_of_search_results} search results:\n' + ''.join( - f'{item["particle"]}\n' + f'{item["particle"]}\n' for item in search_list) + \ - f'\nother results on the cyb.ai' + f'\nother results on the cyb.ai' elif search_error == 'CID not found': message_text = 'The content identifier not found in the cyber graph' else: @@ -167,9 +170,9 @@ def endpoint_cyberlink(message): reply_markup=base_keyboard_reply_markup(message.from_user.id)) bot.send_message( message.chat.id, - f'from: ' + f'from: ' f'{cyberlink_startpoint_ipfs_hash[message.chat.id]}\n' - f'to: {ipfs_hash}', + f'to: {ipfs_hash}', parse_mode='HTML', reply_markup=base_keyboard_reply_markup(message.from_user.id)) db_worker.write_cyberlink( @@ -306,14 +309,14 @@ def main_menu(message): parse_mode="HTML", reply_markup=base_keyboard_reply_markup(message.from_user.id)) - elif message.text.lower() == 'jail check settings': + elif message.text.lower() in ['jail check settings', '/settings']: state[message.chat.id] = States.S_MONITORING bot.send_message( message.chat.id, 'Enter a validator moniker', reply_markup=MONITORING_KEYBOARD) - elif message.text.lower() in ['search', '/search']: + elif message.text.lower() in ['search a content in bostrom', '/search']: state[message.chat.id] = States.S_SEARCH bot.send_message( message.chat.id, @@ -543,8 +546,12 @@ def tweet_menu(message): if __name__ == '__main__': - if DEV_MODE: - print('DEV_MODE') + parser = ArgumentParser() + parser.add_argument("--dev_mode", action='store_true') + args = parser.parse_args() + + if args.dev_mode: + print('DEV MODE') bot.polling( none_stop=True, timeout=100) @@ -555,7 +562,11 @@ def tweet_menu(message): bot.polling( none_stop=True, timeout=100) + display_sleep(30) + except KeyboardInterrupt: + logging.info('Stopped by Owner') + break except Exception as e: - logging.error(f'Error in the main: {e}. Restart in 15 sec') - # restart in 15 sec - time.sleep(15) + logging.error(f'Error: {e}. Restart in 30 sec') + display_sleep(30) + diff --git a/monitoring_scheduler.py b/monitoring_scheduler.py index 250a64e..4c58762 100644 --- a/monitoring_scheduler.py +++ b/monitoring_scheduler.py @@ -1,7 +1,9 @@ -import time +from argparse import ArgumentParser + +from cyberutils.bash import display_sleep from src.bot_utils import jail_check -from config import SCHEDULER_TIME, DEV_MODE, db_worker, logging +from config import SCHEDULER_TIME, db_worker, logging # Create tables @@ -14,19 +16,27 @@ def check_send_messages(): for chat_id in chat_id_list: jail_check(chat_id, pressed_button=False) logging.info(f'Validators status sent for {len(chat_id_list)} users') - time.sleep(SCHEDULER_TIME) + display_sleep(SCHEDULER_TIME) if __name__ == '__main__': - if DEV_MODE: - print('DEV_MODE') + parser = ArgumentParser() + parser.add_argument("--dev_mode", action='store_true') + args = parser.parse_args() + + if args.dev_mode: + print('DEV MODE') check_send_messages() else: # Handler to avoid disconnection while True: try: check_send_messages() + display_sleep(30) + except KeyboardInterrupt: + logging.info(f'Stopped by Owner') + break except Exception as e: - logging.error(f'Error {e}. It will be restarting in 15 sec') - time.sleep(15) + logging.error(f'Error: {e}. Restart in 30 sec') + display_sleep(30) diff --git a/requirements.txt b/requirements.txt index 5033a9c..d3b1729 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,11 @@ -pytelegrambotapi -cyberpy~=1.0.5 -pandas~=1.1.4 -pysqlite3 -requests~=2.25.1 +pytelegrambotapi~=4.14.0 +cyberpy~=1.0.9 +cyberutils~=0.0.5 +pandas~=1.3.5 +pysqlite3~=0.4.8 +requests~=2.28.2 gql[all]~=3.0.0a5 -python-dotenv~=0.17.1 -cachetools~=4.2.1 -numpy~=1.19.4 \ No newline at end of file +python-dotenv~=0.21.1 +cachetools~=4.2.4 +numpy~=1.22.4 +pytest~=7.4.2 \ No newline at end of file diff --git a/src/bash_utils.py b/src/bash_utils.py index 765bcd2..8b7f1d4 100644 --- a/src/bash_utils.py +++ b/src/bash_utils.py @@ -1,26 +1,9 @@ -from subprocess import Popen, PIPE import re +from cyberutils.bash import execute_bash + from config import CYBERLINK_CREATION_QUERY, ACCOUNT_CREATION_QUERY, TRANSFER_QUERY, IPFS_RESTART_QUERY, \ - UNJAIL_VALIDATOR_QUERY, DELEGATE_QUERY, INVESTMINT_QUERY, VALIDATOR_ADDRESS, TOKEN_NAME, logging - - -def execute_bash(bash_command: str): - if len(bash_command.split('"')) == 1: - _bash_command_list = bash_command.split() - elif len(bash_command.split('"')) == 2: - _bash_command_list = \ - bash_command.split('"')[0].split() + \ - [bash_command.split('"')[1]] - elif len(bash_command.split('"')) > 2: - _bash_command_list = \ - bash_command.split('"')[0].split() + \ - [bash_command.split('"')[1]] + \ - [item for items in bash_command.split('"')[2:] for item in items.split()] - else: - return None, f'Cannot split bash command {bash_command}' - popen_process = Popen(_bash_command_list, stdout=PIPE) - return popen_process.communicate(timeout=15) + TOKEN_NAME, logging def extract_from_console(console_output: bytes, keys: list) -> list: @@ -123,63 +106,6 @@ def transfer_tokens(account_address: str, value: int, token_name: str = TOKEN_NA return None, error_transfer_tokens -def delegate_tokens(account_address: str, value: int, validator: str = VALIDATOR_ADDRESS, query: str = DELEGATE_QUERY): - try: - _output, error_execute_bash = \ - execute_bash(f'{query} {account_address} {str(value) + TOKEN_NAME.lower()} {validator}') - if len(extract_from_console(_output, ['txhash'])[0][1]) > 0 \ - or len(extract_from_console(_output, ['txhash'])[0][1]) > 0: - logging.info( - f"Tokens was delegated from {account_address} value {value}{TOKEN_NAME} " - f"txhash {extract_from_console(_output, ['txhash'])[0][1]}") - return True, None - logging.error( - f"Tokens was not delegated from {account_address} value {value}{TOKEN_NAME}. Error {error_execute_bash}") - return None, error_execute_bash - except Exception as error_transfer_tokens: - logging.error( - f"Tokens was not delegated from {account_address} value {value}{TOKEN_NAME}. Error {error_transfer_tokens}") - return None, error_transfer_tokens - - -def investmint_tokens(account_address: str, value: int, investmint_token: str = 'amper', query: str = INVESTMINT_QUERY): - try: - _output, error_execute_bash = \ - execute_bash(f'{query} {account_address} {str(value) + "s" + TOKEN_NAME.lower()} {investmint_token}') - if len(extract_from_console(_output, ['txhash'])[0][1]) > 0: - logging.info( - f"Tokens was investminted from {account_address} to {investmint_token} value {value}s{TOKEN_NAME} " - f"txhash {extract_from_console(_output, ['txhash'])[0][1]}") - return True, None - logging.error( - f"Tokens was not investminted from {account_address} to {investmint_token} value {value}s{TOKEN_NAME}. " - f"Error {error_execute_bash}") - return None, error_execute_bash - except Exception as error_transfer_tokens: - logging.error( - f"Tokens was not investminted from {account_address} to {investmint_token} value {value}s{TOKEN_NAME}. " - f"Error {error_transfer_tokens}") - return None, error_transfer_tokens - - -def unjail_validator(query: str = UNJAIL_VALIDATOR_QUERY): - try: - _output, error_execute_bash = \ - execute_bash(f'{query}') - if len(extract_from_console(_output, ['txhash'])[0][1]) > 0: - logging.info( - f"Unjail transaction was completed successfully" - f"txhash {extract_from_console(_output, ['txhash'])[0][1]}") - return True, None - logging.error( - f"Unjail transaction was not completed successfully. Error {error_execute_bash}") - return None, error_execute_bash - except Exception as error_transfer_tokens: - logging.error( - f"Unjail transaction was not completed successfully. Error {error_transfer_tokens}") - return None, error_transfer_tokens - - def restart_ipfs_node(query: str = IPFS_RESTART_QUERY): try: output, error_execute_bash = \ diff --git a/src/bot_utils.py b/src/bot_utils.py index 45f6b86..9ddb504 100644 --- a/src/bot_utils.py +++ b/src/bot_utils.py @@ -6,7 +6,8 @@ from src.lcd_utils import validators_state from src.ipfs_utils import upload_text, upload_file -from config import BASE_KEYBOARD, BASE_AFTER_SIGN_UP_KEYBOARD, TELEBOT_TOKEN, db_worker, bot, logging +from config import BASE_KEYBOARD, BASE_AFTER_SIGN_UP_KEYBOARD, TELEBOT_TOKEN, CYBERPAGE_BASE_URL, db_worker, bot, \ + logging def base_keyboard_reply_markup(user_id: int): @@ -128,7 +129,7 @@ def send_ipfs_notification(message, ipfs_hash: str, error: str, message_text: st bot.send_message( message.chat.id, f'{str(message.content_type).capitalize()} successfully uploaded\n' - f'IPFS Hash: {ipfs_hash}', + f'IPFS Hash: {ipfs_hash}', parse_mode='HTML', reply_markup=base_keyboard_reply_markup(message.from_user.id)) if message_text: diff --git a/src/delegate_tokens.exp b/src/delegate_tokens.exp deleted file mode 100644 index 0d553f7..0000000 --- a/src/delegate_tokens.exp +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/expect -f - -set account_address [lindex $argv 0] -set value [lindex $argv 1] -set validator [lindex $argv 2] -set timeout -1 -spawn docker exec -ti $env(CYBER_DOCKER) cyber tx staking delegate $validator $value --from $account_address --chain-id $env(CYBER_CHAIN_ID) --gas 261000 --gas-prices 0.01boot --yes -expect "* passphrase:" {send -- "$env(CYBER_PASS)\r"} - -expect eof \ No newline at end of file diff --git a/src/investmint_tokens.exp b/src/investmint_tokens.exp deleted file mode 100644 index c16f456..0000000 --- a/src/investmint_tokens.exp +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/expect -f - -set account_address [lindex $argv 0] -set value [lindex $argv 1] -set investmint_token [lindex $argv 2] -set timeout -1 -set investmint_period 604800 -spawn docker exec -ti $env(CYBER_DOCKER) cyber tx resources investmint $value $investmint_token $investmint_period --from $account_address --chain-id $env(CYBER_CHAIN_ID) --gas 160000 --gas-prices 0.01boot --yes -expect "* passphrase:" {send -- "$env(CYBER_PASS)\r"} - -expect eof \ No newline at end of file diff --git a/src/unjail_validator.exp b/src/unjail_validator.exp deleted file mode 100755 index 1da3595..0000000 --- a/src/unjail_validator.exp +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/expect -f - -set timeout -1 -spawn docker exec -ti $env(CYBER_DOCKER) cyber tx slashing unjail --from=$env(VALIDATOR_KEY_NAME) --chain-id $env(CYBER_CHAIN_ID) --gas-prices 0.01boot --gas 150000 -expect "* passphrase:" {send -- "$env(CYBER_PASS)\r"} -expect "* broadcasting *" {send -- "y\r"} - -expect eof \ No newline at end of file diff --git a/start_bot.sh b/start_bot.sh deleted file mode 100755 index 6fd872a..0000000 --- a/start_bot.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -SERVICE=$1 -MODE=$2 - -# Check for Development Mode -case "$MODE" in - d|dev|development) - export DEV_MODE=1 - export VALIDATOR_QUERY=cat\ .\/tests\/validators_query_test - ;; - "") - export DEV_MODE=0 - ;; - *) - echo $"Usage: $0 {m|main|s|scheduler} {null|d|dev|development}" - exit 1 - ;; -esac - -# Chose of service main or scheduler -case "$SERVICE" in - m|main) - python3 main.py - ;; - s|scheduler) - python3 monitoring_scheduler.py - ;; - *) - echo $"Usage: $0 {m|main|s|scheduler} {null|d|dev|development}" - exit 1 - ;; -esac \ No newline at end of file diff --git a/transfer_additional_tokens.py b/transfer_tokens/transfer_additional_tokens.py similarity index 100% rename from transfer_additional_tokens.py rename to transfer_tokens/transfer_additional_tokens.py diff --git a/transfer_tokens_bostrom.py b/transfer_tokens/transfer_tokens_bostrom.py similarity index 99% rename from transfer_tokens_bostrom.py rename to transfer_tokens/transfer_tokens_bostrom.py index 29f83b7..9eb43ab 100644 --- a/transfer_tokens_bostrom.py +++ b/transfer_tokens/transfer_tokens_bostrom.py @@ -19,7 +19,7 @@ TOCYB_TOKEN_NAME = 'TOCYB' TOTAL_GOL_GIFT = 1_178_234_463 NEW_USER_MESSAGE = '' -GENESIS_PATH = 'data/genesis_bostrom.json' +GENESIS_PATH = '../data/genesis_bostrom.json' def message_genesis(bostrom_address: str, genesis_balance: int) -> str: diff --git a/transfer_tokens_bostrom_testnet_4.py b/transfer_tokens/transfer_tokens_bostrom_testnet_4.py similarity index 99% rename from transfer_tokens_bostrom_testnet_4.py rename to transfer_tokens/transfer_tokens_bostrom_testnet_4.py index 4578a53..001b1ae 100644 --- a/transfer_tokens_bostrom_testnet_4.py +++ b/transfer_tokens/transfer_tokens_bostrom_testnet_4.py @@ -147,7 +147,7 @@ def compute_users_and_links(load_new_data: bool = LOAD_NEW_DATA): if load_new_data: _users_and_links_df = get_users_and_links() - with open("data/genesis_bostrom_testnet_4.json") as _jsonFile: + with open("../data/genesis_bostrom_testnet_4.json") as _jsonFile: _genesis_json = json.load(_jsonFile) _jsonFile.close() diff --git a/transfer_tokens_bostrom_testnet_5.py b/transfer_tokens/transfer_tokens_bostrom_testnet_5.py similarity index 99% rename from transfer_tokens_bostrom_testnet_5.py rename to transfer_tokens/transfer_tokens_bostrom_testnet_5.py index 5ed8fd0..a1bda33 100644 --- a/transfer_tokens_bostrom_testnet_5.py +++ b/transfer_tokens/transfer_tokens_bostrom_testnet_5.py @@ -168,7 +168,7 @@ def get_users_and_links() -> pd.DataFrame: def compute_users_and_links(load_new_data: bool = LOAD_NEW_DATA) -> pd.DataFrame: if load_new_data: _users_and_links_df = get_users_and_links() - with open("data/genesis_bostrom_testnet_5.json") as _jsonFile: + with open("../data/genesis_bostrom_testnet_5.json") as _jsonFile: _genesis_json = json.load(_jsonFile) _jsonFile.close()