diff --git a/config-example.py b/config-example.py index b1b65e8..40f0eda 100644 --- a/config-example.py +++ b/config-example.py @@ -21,7 +21,7 @@ BLOCKBOOK_NETURL = "https://blockbook.ranchimall.net/" TOKENAPI_SSE_URL = "https://ranchimallflo.duckdns.org/" MAINNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook.ranchimall.net/"] TESTNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook-testnet.ranchimall.net/"] -IGNORE_BLOCK_LIST = 902446 +IGNORE_BLOCK_LIST = [902446] #IGNORE_TRANSACTION_LIST = "b4ac4ddb51188b28b39bcb3aa31357d5bfe562c21e8aaf8dde0ec560fc893174" """?NOT USED? diff --git a/main.py b/main.py index 95ff702..9278d04 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import sys import time +import threading from src.api.api_main import start_api_server from src.backend.backend_main import start_backend_process import config as config @@ -20,12 +21,16 @@ if __name__ == "__main__": # start the backend process (token scanner). pass reset=True if --reset is in command-line args if "--reset" in sys.argv or "-r" in sys.argv: - start_backend_process(config=_config, reset=True) + t1 = threading.Thread(target=lambda:start_backend_process(config=_config, reset=True)) else: - start_backend_process(config=_config) - + t1 = threading.Thread(target=lambda:start_backend_process(config=_config)) + t1.start() # sleep until backend is started, so that API server can function correctly (TODO: sleep until backend process returns some flag indicating its started) time.sleep(DELAY_API_SERVER_START) # start the API server - start_api_server(config=_config) + t2 = threading.Thread(target=lambda: start_api_server(config=_config)) + t2.start() + + t1.join() + t2.join() diff --git a/src/api/api_main.py b/src/api/api_main.py index 3b06cad..9a83e39 100644 --- a/src/api/api_main.py +++ b/src/api/api_main.py @@ -10,7 +10,7 @@ from quart import jsonify, make_response, Quart, render_template, request, flash from quart_cors import cors import asyncio from typing import Optional -import parsing +import src.api.parsing as parsing import subprocess from apscheduler.schedulers.background import BackgroundScheduler import atexit @@ -29,12 +29,6 @@ INTERNAL_ERROR = "Unable to process request, try again later" # Global values and configg internalTransactionTypes = [ 'tokenswapDepositSettlement', 'tokenswapParticipationSettlement', 'smartContractDepositReturn'] -if net == 'mainnet': - is_testnet = False -elif net == 'testnet': - is_testnet = True - - # Validation functionss def check_flo_address(floaddress, is_testnet=False): return pyflo.is_address_valid(floaddress, testnet=is_testnet) @@ -2883,7 +2877,7 @@ def initialize_db(): updatePrices() def set_configs(config): - global DATA_PATH, apiUrl, FLO_DATA_DIR, API_VERIFY, debug_status, HOST, PORT, APP_ADMIN + global DATA_PATH, apiUrl, FLO_DATA_DIR, API_VERIFY, debug_status, HOST, PORT, APP_ADMIN, NET, is_testnet DATA_PATH = config["DATA_PATH"] apiUrl = config["apiUrl"] FLO_DATA_DIR = config["FLO_DATA_DIR"] @@ -2892,6 +2886,11 @@ def set_configs(config): HOST = config["HOST"] PORT = config["PORT"] APP_ADMIN = config["APP_ADMIN"] + NET = config["NET"] + if NET == 'mainnet': + is_testnet = False + elif NET == 'testnet': + is_testnet = True def init_process(): initialize_db() @@ -2905,4 +2904,5 @@ def init_process(): def start_api_server(config): set_configs(config) init_process() + print("Starting API server at port=", PORT) app.run(debug=debug_status, host=HOST, port=PORT) \ No newline at end of file diff --git a/src/backend/backend_main.py b/src/backend/backend_main.py index 2922fc1..f80abdf 100644 --- a/src/backend/backend_main.py +++ b/src/backend/backend_main.py @@ -11,25 +11,24 @@ from sqlalchemy import create_engine, func, and_ from sqlalchemy.orm import sessionmaker import time import arrow -import parsing -from parsing import perform_decimal_operation +import src.backend.parsing as parsing +from src.backend.parsing import perform_decimal_operation import re from datetime import datetime from ast import literal_eval -from models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks -from statef_processing import process_stateF +from src.backend.models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks +from src.backend.statef_processing import process_stateF import asyncio import websockets from decimal import Decimal import pdb -from util_rollback import rollback_to_block +from src.backend.util_rollback import rollback_to_block RETRY_TIMEOUT_LONG = 30 * 60 # 30 mins RETRY_TIMEOUT_SHORT = 60 # 1 min DB_RETRY_TIMEOUT = 60 # 60 seconds - def newMultiRequest(apicall): current_server = serverlist[0] while True: @@ -2639,8 +2638,7 @@ def initiate_process(): serverlist = _config['TESTNET_BLOCKBOOK_SERVER_LIST'] APP_ADMIN = 'oWooGLbBELNnwq8Z5YmjoVjw8GhBGH3qSP' websocket_uri = get_websocket_uri(testnet=True) - serverlist = serverlist.split(',') - + #serverlist = serverlist.split(',') global neturl neturl = _config['BLOCKBOOK_NETURL'] global api_url @@ -2648,19 +2646,20 @@ def initiate_process(): global tokenapi_sse_url tokenapi_sse_url = _config['TOKENAPI_SSE_URL'] global API_VERIFY - API_VERIFY = _config['API_VERIFY'] - if API_VERIFY == 'False': - API_VERIFY = False - elif API_VERIFY == 'True': - API_VERIFY = True + if 'API_VERIFY' in _config: + if isinstance(_config['API_VERIFY'], bool): + API_VERIFY = _config['API_VERIFY'] + elif isinstance(_config['API_VERIFY'], str): + API_VERIFY = False if _config['API_VERIFY'] == 'False' else True + else: + API_VERIFY = bool(_config['API_VERIFY']) else: API_VERIFY = True - global IGNORE_BLOCK_LIST #, IGNORE_TRANSACTION_LIST - IGNORE_BLOCK_LIST = _config['IGNORE_BLOCK_LIST'].split(',') - IGNORE_BLOCK_LIST = [int(s) for s in IGNORE_BLOCK_LIST] - #IGNORE_TRANSACTION_LIST = _config['IGNORE_TRANSACTION_LIST'].split(',') + IGNORE_BLOCK_LIST = _config['IGNORE_BLOCK_LIST'] + #IGNORE_BLOCK_LIST = [int(s) for s in IGNORE_BLOCK_LIST] + #IGNORE_TRANSACTION_LIST = _config['IGNORE_TRANSACTION_LIST'] def start_backend_process(config, reset = False): global _config diff --git a/src/backend/util_rollback.py b/src/backend/util_rollback.py index c2293f4..17942eb 100644 --- a/src/backend/util_rollback.py +++ b/src/backend/util_rollback.py @@ -1,13 +1,13 @@ import argparse from sqlalchemy import create_engine, func from sqlalchemy.orm import sessionmaker -from models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, RejectedTransactionHistory, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks +from src.backend.models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, RejectedTransactionHistory, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks from ast import literal_eval import os import json import logging import sys -from parsing import perform_decimal_operation +from src.backend.parsing import perform_decimal_operation apppath = os.path.dirname(os.path.realpath(__file__))