mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
* Feature: time measuring for RPC-tracing * Performance warnings and hints * adjust treshold to 7 seconds * refactor api wallets endpoints to own file * more consistent error-handling * fee endpoint * refactoring tx-table to hide columns and add customaction * replace coin_selection with webcomponent * fix fee-test * fix fee-test * fix fee-estimation * fee selection web-component * bugfixes * fix test * using events to communicate changes * tidy up * fix selectedCoins * fix tests * no fee_rate calc in send_new endpoint and GET for fetchAssetBalances * refactor estimate_fee out from send_new * fix assetLabel * Do not use assetBalances-endpoint but pass as property * Typos corrected, RBF functionality restored, bugs in fee selection fixed and fee default settings improved. Co-authored-by: moneymanolis <moneymanolis@protonmail.com> Co-authored-by: Manolis <70536101+moneymanolis@users.noreply.github.com>
194 lines
6.6 KiB
Python
194 lines
6.6 KiB
Python
""" A config module contains static configuration """
|
|
import configparser
|
|
import datetime
|
|
import os
|
|
import random
|
|
import secrets
|
|
from pathlib import Path
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
# BASEDIR = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
# Loading env-vars from .flaskenv (4 levels above this file)
|
|
env_path = Path("../../../..") / ".flaskenv"
|
|
load_dotenv(env_path)
|
|
|
|
|
|
def _get_bool_env_var(varname, default=None):
|
|
|
|
value = os.environ.get(varname, default)
|
|
|
|
if value is None:
|
|
return False
|
|
elif isinstance(value, str) and value.lower() == "false":
|
|
return False
|
|
elif bool(value) is False:
|
|
return False
|
|
else:
|
|
return bool(value)
|
|
|
|
|
|
DEFAULT_CONFIG = "cryptoadvance.specter.config.DevelopmentConfig"
|
|
|
|
|
|
class BaseConfig(object):
|
|
PORT = os.getenv("PORT", 25441)
|
|
CONNECT_TOR = _get_bool_env_var(os.getenv("CONNECT_TOR", "False"))
|
|
SPECTER_DATA_FOLDER = os.path.expanduser(
|
|
os.getenv("SPECTER_DATA_FOLDER", "~/.specter")
|
|
)
|
|
SPECTER_API_ACTIVE = _get_bool_env_var("SPECTER_API_ACTIVE", "False")
|
|
# Logging
|
|
# SPECTER_LOGFILE will get created dynamically in server.py
|
|
# using:
|
|
SPECTER_LOGFORMAT = os.getenv(
|
|
"SPECTER_LOGFORMAT", "[%(asctime)s] %(levelname)s in %(module)s: %(message)s"
|
|
)
|
|
|
|
# CERT and KEY is for running self-signed-ssl-certs. Check cli_server for details
|
|
CERT = os.getenv("CERT", None)
|
|
KEY = os.getenv("KEY", None)
|
|
# This will get passed to initialize the specter-object
|
|
DEFAULT_SPECTER_CONFIG = {}
|
|
|
|
# only used by cli_bitcoind.py, we want to have that static for the same reason
|
|
BTCD_REGTEST_DATA_DIR = os.getenv(
|
|
"BTCD_REGTEST_DATA_DIR", "/tmp/specter_btc_regtest_plain_datadir"
|
|
)
|
|
|
|
# only used by cli_node.py, we want to have that static for the same reason
|
|
ELMD_REGTEST_DATA_DIR = os.getenv(
|
|
"ELMD_REGTEST_DATA_DIR", "/tmp/specter_elm_regtest_plain_datadir"
|
|
)
|
|
|
|
# the default timeout for Bitcoin/Liquid RPC-calls
|
|
BITCOIN_RPC_TIMEOUT = int(os.getenv("BITCOIN_RPC_TIMEOUT", "10"))
|
|
LIQUID_RPC_TIMEOUT = int(os.getenv("LIQUID_RPC_TIMEOUT", "10"))
|
|
|
|
# The self-signed ssl-certificate which is lazily created is configurable to a certain extent
|
|
SPECTER_SSL_CERT_SUBJECT_C = os.getenv("SPECTER_SSL_CERT_SUBJECT_C", "DE")
|
|
SPECTER_SSL_CERT_SUBJECT_ST = os.getenv("SPECTER_SSL_CERT_SUBJECT_ST", "BDW")
|
|
SPECTER_SSL_CERT_SUBJECT_L = os.getenv("SPECTER_SSL_CERT_SUBJECT_L", "Freiburg")
|
|
SPECTER_SSL_CERT_SUBJECT_O = os.getenv(
|
|
"SPECTER_SSL_CERT_SUBJECT_O", "Specter Citadel Cert"
|
|
)
|
|
SPECTER_SSL_CERT_SUBJECT_OU = os.getenv(
|
|
"SPECTER_SSL_CERT_SUBJECT_OU", "Specter Citadel Cert"
|
|
)
|
|
SPECTER_SSL_CERT_SUBJECT_CN = os.getenv(
|
|
"SPECTER_SSL_CERT_SUBJECT_CN", "Specter Citadel Cert"
|
|
)
|
|
# For self-signed certs, serial-number collision is a risk, so let's do a random one by default
|
|
SPECTER_SSL_CERT_SERIAL_NUMBER = int(
|
|
os.getenv("SPECTER_SSL_CERT_SERIAL_NUMBER", random.randrange(1, 100000))
|
|
)
|
|
INTERNAL_BITCOIND_VERSION = os.getenv("INTERNAL_BITCOIND_VERSION", "0.21.1")
|
|
|
|
# Block explorers URLs
|
|
EXPLORERS_LIST = {
|
|
"MEMPOOL_SPACE": {
|
|
"name": "Mempool.space",
|
|
"url": "https://mempool.space/",
|
|
},
|
|
"MEMPOOL_SPACE_ONION": {
|
|
"name": "Mempool.space Tor hidden service",
|
|
"url": "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/",
|
|
},
|
|
"BLOCKSTREAM_INFO": {
|
|
"name": "Blockstream.info",
|
|
"url": "https://blockstream.info/",
|
|
},
|
|
"BLOCKSTREAM_INFO_ONION": {
|
|
"name": "Blockstream.info Tor hidden service",
|
|
"url": "http://explorerzydxu5ecjrkwceayqybizmpjjznk5izmitf2modhcusuqlid.onion/",
|
|
},
|
|
"CUSTOM": {
|
|
"name": "Custom",
|
|
"url": "",
|
|
},
|
|
}
|
|
# in seconds, tor is slow, so let's choose 10 seconds
|
|
FEEESTIMATION_REQUEST_TIMEOUT = int(
|
|
os.getenv("FEEESTIMATION_REQUEST_TIMEOUT", "10")
|
|
)
|
|
|
|
# Babel integration. English listed first; other alphabetical by language code
|
|
LANGUAGES = {
|
|
"en": "English",
|
|
"bg": "Български",
|
|
"de": "Deutsch",
|
|
"el": "Ελληνικά",
|
|
"es": "Español",
|
|
"fr": "Français",
|
|
"he": "עברית",
|
|
"hi": "हिंदी",
|
|
"nl": "Nederlands",
|
|
"pl": "Polski",
|
|
"pt": "Português",
|
|
"ru": "Русский",
|
|
"sv": "Svenska",
|
|
"zh_Hans_CN": "简体中文",
|
|
"zh_Hant_TW": "繁體中文",
|
|
}
|
|
|
|
# Babel integration. List of languages written from right to left for RTL support in the UI
|
|
RTL_LANGUAGES = ["he"]
|
|
|
|
# The user will get a warning if a request takes longer than this threshold
|
|
REQUEST_TIME_WARNING_THRESHOLD = int(
|
|
os.getenv("REQUEST_TIME_WARNING_THRESHOLD", "20")
|
|
)
|
|
|
|
|
|
class DevelopmentConfig(BaseConfig):
|
|
# https://stackoverflow.com/questions/22463939/demystify-flask-app-secret-key
|
|
SECRET_KEY = "development key"
|
|
SPECTER_DATA_FOLDER = os.path.expanduser(
|
|
os.getenv("SPECTER_DATA_FOLDER", "~/.specter_dev")
|
|
)
|
|
# API active by default in dev-mode
|
|
SPECTER_API_ACTIVE = _get_bool_env_var("SPECTER_API_ACTIVE", "True")
|
|
|
|
|
|
class TestConfig(BaseConfig):
|
|
SECRET_KEY = "test key"
|
|
# This should never be used as the data-folder is injected at runtime
|
|
# But let's be sure before something horrible happens:
|
|
SPECTER_DATA_FOLDER = os.path.expanduser(
|
|
os.getenv("SPECTER_DATA_FOLDER", "~/.specter_testing")
|
|
)
|
|
# API active by default in test-mode
|
|
SPECTER_API_ACTIVE = _get_bool_env_var("SPECTER_API_ACTIVE", "True")
|
|
|
|
# See #1316 since Bitcoin v0.21.1 (not only) the importmulti-call takes longer than 10 seconds on cirrus
|
|
BITCOIN_RPC_TIMEOUT = 60
|
|
LIQUID_RPC_TIMEOUT = 60
|
|
|
|
|
|
class CypressTestConfig(TestConfig):
|
|
SPECTER_DATA_FOLDER = os.path.expanduser(
|
|
os.getenv("SPECTER_DATA_FOLDER", "~/.specter_cypress")
|
|
)
|
|
PORT = os.getenv("PORT", 25444)
|
|
|
|
# need to be static in order to (un-)tar bitcoind-dirs reliable
|
|
DEFAULT_SPECTER_CONFIG = {"uid": "123456"}
|
|
|
|
BTCD_REGTEST_DATA_DIR = os.getenv(
|
|
"BTCD_REGTEST_DATA_DIR", "/tmp/specter_cypress_btc_regtest_plain_datadir"
|
|
)
|
|
|
|
BTCD_REGTEST_DATA_DIR = os.getenv(
|
|
"BTCD_REGTEST_DATA_DIR", "/tmp/specter_cypress_elm_regtest_plain_datadir"
|
|
)
|
|
BITCOIN_RPC_TIMEOUT = 30
|
|
LIQUID_RPC_TIMEOUT = 40
|
|
|
|
|
|
class ProductionConfig(BaseConfig):
|
|
SECRET_KEY = secrets.token_urlsafe(16)
|
|
# There are some really slow machines out there. Creating a 2/4 multisig on an older MacBookAir
|
|
# Take already >30secs
|
|
BITCOIN_RPC_TIMEOUT = 60
|
|
LIQUID_RPC_TIMEOUT = 120
|