mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
Chore: update dependencies and remove demon-mode (#1417)
* update dependencies and remove demon-mode * make timeout issues more clear * more clever waiting for mining
This commit is contained in:
parent
149f5d653d
commit
d05140d55a
7 changed files with 77 additions and 147 deletions
|
|
@ -1,4 +1,3 @@
|
|||
[python: src/**/**.py]
|
||||
[jinja2: src/**/templates/**.html]
|
||||
[jinja2: src/**/templates/**.jinja]
|
||||
extensions=jinja2.ext.autoescape,jinja2.ext.with_
|
||||
[jinja2: src/**/templates/**.jinja]
|
||||
|
|
@ -1,25 +1,24 @@
|
|||
certifi==2019.9.11
|
||||
chardet==3.0.4
|
||||
Click==7.1.2
|
||||
daemonize==2.5.0
|
||||
Flask==1.1.2
|
||||
Flask==1.1.4
|
||||
Flask-Babel==2.0.0
|
||||
Flask-Cors==3.0.9
|
||||
Flask-Cors==3.0.10
|
||||
Flask-Login==0.5.0
|
||||
Flask-RESTful==0.3.8
|
||||
Flask-HTTPAuth==4.2.0
|
||||
Flask-RESTful==0.3.9
|
||||
Flask-HTTPAuth==4.4.0
|
||||
hwi==2.0.1
|
||||
importlib_metadata==2.0.0
|
||||
importlib_metadata==4.8.1
|
||||
pyserial==3.4
|
||||
python-dotenv==0.13.0
|
||||
requests==2.25.0
|
||||
requests==2.26.0
|
||||
pysocks==1.7.1
|
||||
six==1.12.0
|
||||
six==1.16.0
|
||||
stem==1.8.0
|
||||
embit==0.4.10
|
||||
psutil==5.7.3
|
||||
pyopenssl==20.0.1
|
||||
flask_wtf==0.14.3
|
||||
pgpy==0.5.3
|
||||
pgpy==0.5.4
|
||||
cbor==1.0.0
|
||||
mnemonic==0.19
|
||||
mnemonic==0.20
|
||||
|
|
|
|||
|
|
@ -81,7 +81,11 @@ cffi==1.14.5 \
|
|||
chardet==3.0.4 \
|
||||
--hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \
|
||||
--hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 \
|
||||
# via -r requirements.in, requests
|
||||
# via -r requirements.in
|
||||
charset-normalizer==2.0.6 \
|
||||
--hash=sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6 \
|
||||
--hash=sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f \
|
||||
# via requests
|
||||
click==7.1.2 \
|
||||
--hash=sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a \
|
||||
--hash=sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc \
|
||||
|
|
@ -100,10 +104,6 @@ cryptography==3.4.7 \
|
|||
--hash=sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d \
|
||||
--hash=sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9 \
|
||||
# via noiseprotocol, pgpy, pyopenssl
|
||||
daemonize==2.5.0 \
|
||||
--hash=sha256:9b6b91311a9d934ff3f5f766666635ca280d3de8e7137e4cd7d3f052543b989f \
|
||||
--hash=sha256:dd026e4ff8d22cb016ed2130bc738b7d4b1da597ef93c074d2adb9e4dea08bc3 \
|
||||
# via -r requirements.in
|
||||
ecdsa==0.17.0 \
|
||||
--hash=sha256:5cf31d5b33743abe0dfc28999036c849a69d548f994b535e527ee3cb7f3ef676 \
|
||||
--hash=sha256:b9f500bb439e4153d0330610f5d26baaf18d17b8ced1bc54410d189385ea68aa \
|
||||
|
|
@ -115,25 +115,25 @@ flask-babel==2.0.0 \
|
|||
--hash=sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468 \
|
||||
--hash=sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d \
|
||||
# via -r requirements.in
|
||||
flask-cors==3.0.9 \
|
||||
--hash=sha256:6bcfc100288c5d1bcb1dbb854babd59beee622ffd321e444b05f24d6d58466b8 \
|
||||
--hash=sha256:cee4480aaee421ed029eaa788f4049e3e26d15b5affb6a880dade6bafad38324 \
|
||||
flask-cors==3.0.10 \
|
||||
--hash=sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438 \
|
||||
--hash=sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de \
|
||||
# via -r requirements.in
|
||||
flask-httpauth==4.2.0 \
|
||||
--hash=sha256:3fcedb99a03985915335a38c35bfee6765cbd66d7f46440fa3b42ae94a90fac7 \
|
||||
--hash=sha256:8c7e49e53ce7dc14e66fe39b9334e4b7ceb8d0b99a6ba1c3562bb528ef9da84a \
|
||||
flask-httpauth==4.4.0 \
|
||||
--hash=sha256:bcaaa7a35a3cba0b2eafd4f113b3016bf70eb78087456d96484c3c18928b813a \
|
||||
--hash=sha256:d9131122cdc5709dda63790f6e9b3142d8101447d424b0b95ffd4ee279f49539 \
|
||||
# via -r requirements.in
|
||||
flask-login==0.5.0 \
|
||||
--hash=sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b \
|
||||
--hash=sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0 \
|
||||
# via -r requirements.in
|
||||
flask-restful==0.3.8 \
|
||||
--hash=sha256:5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915 \
|
||||
--hash=sha256:d891118b951921f1cec80cabb4db98ea6058a35e6404788f9e70d5b243813ec2 \
|
||||
flask-restful==0.3.9 \
|
||||
--hash=sha256:4970c49b6488e46c520b325f54833374dc2b98e211f1b272bd4b0c516232afe2 \
|
||||
--hash=sha256:ccec650b835d48192138c85329ae03735e6ced58e9b2d9c2146d6c84c06fa53e \
|
||||
# via -r requirements.in
|
||||
flask==1.1.2 \
|
||||
--hash=sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060 \
|
||||
--hash=sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557 \
|
||||
flask==1.1.4 \
|
||||
--hash=sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196 \
|
||||
--hash=sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22 \
|
||||
# via -r requirements.in, flask-babel, flask-cors, flask-httpauth, flask-login, flask-restful, flask-wtf
|
||||
flask_wtf==0.14.3 \
|
||||
--hash=sha256:57b3faf6fe5d6168bda0c36b0df1d05770f8e205e18332d0376ddb954d17aef2 \
|
||||
|
|
@ -170,17 +170,17 @@ idna==2.10 \
|
|||
--hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \
|
||||
--hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 \
|
||||
# via requests
|
||||
importlib_metadata==2.0.0 \
|
||||
--hash=sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da \
|
||||
--hash=sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3 \
|
||||
importlib_metadata==4.8.1 \
|
||||
--hash=sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15 \
|
||||
--hash=sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1 \
|
||||
# via -r requirements.in
|
||||
itsdangerous==2.0.1 \
|
||||
--hash=sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c \
|
||||
--hash=sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0 \
|
||||
itsdangerous==1.1.0 \
|
||||
--hash=sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19 \
|
||||
--hash=sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749 \
|
||||
# via flask, flask-wtf
|
||||
jinja2==3.0.1 \
|
||||
--hash=sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4 \
|
||||
--hash=sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4 \
|
||||
jinja2==2.11.3 \
|
||||
--hash=sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419 \
|
||||
--hash=sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6 \
|
||||
# via flask, flask-babel
|
||||
libusb1==1.9.2 \
|
||||
--hash=sha256:27aec6aa1ff9ca845d0035023f3cf39710afac56903c51cd96a95404d064189e \
|
||||
|
|
@ -227,17 +227,17 @@ markupsafe==2.0.1 \
|
|||
--hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \
|
||||
--hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 \
|
||||
# via jinja2, wtforms
|
||||
mnemonic==0.19 \
|
||||
--hash=sha256:4e37eb02b2cbd56a0079cabe58a6da93e60e3e4d6e757a586d9f23d96abea931 \
|
||||
--hash=sha256:a8d78c5100acfa7df9bab6b9db7390831b0e54490934b718ff9efd68f0d731a6 \
|
||||
mnemonic==0.20 \
|
||||
--hash=sha256:7c6fb5639d779388027a77944680aee4870f0fcd09b1e42a5525ee2ce4c625f6 \
|
||||
--hash=sha256:acd2168872d0379e7a10873bb3e12bf6c91b35de758135c4fbd1015ef18fafc5 \
|
||||
# via -r requirements.in, hwi
|
||||
noiseprotocol==0.3.1 \
|
||||
--hash=sha256:2e1a603a38439636cf0ffd8b3e8b12cee27d368a28b41be7dbe568b2abb23111 \
|
||||
--hash=sha256:b092a871b60f6a8f07f17950dc9f7098c8fe7d715b049bd4c24ee3752b90d645 \
|
||||
# via bitbox02
|
||||
pgpy==0.5.3 \
|
||||
--hash=sha256:a49c269cedcaf82ac6999bcae5fd3f543ecb1c759f9d48a15ad8d8fa4ac03987 \
|
||||
--hash=sha256:cba6fbbb44a896a8a4f5807b3d8d4943a8f7a6607be11587f4a27734c711c1dd \
|
||||
pgpy==0.5.4 \
|
||||
--hash=sha256:bdd3da1e006fc8e81cc02232969924d6e8c98a4af1621a925d99bba09164183b \
|
||||
--hash=sha256:c29ad9b2bcba6575c3773410894e77a7552b6a3de184fd99b4da3995986f26a9 \
|
||||
# via -r requirements.in
|
||||
protobuf==3.17.3 \
|
||||
--hash=sha256:13ee7be3c2d9a5d2b42a1030976f760f28755fcf5863c55b1460fd205e6cd637 \
|
||||
|
|
@ -309,17 +309,17 @@ pytz==2021.1 \
|
|||
--hash=sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da \
|
||||
--hash=sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798 \
|
||||
# via babel, flask-babel, flask-restful
|
||||
requests==2.25.0 \
|
||||
--hash=sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8 \
|
||||
--hash=sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998 \
|
||||
requests==2.26.0 \
|
||||
--hash=sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24 \
|
||||
--hash=sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7 \
|
||||
# via -r requirements.in
|
||||
semver==2.13.0 \
|
||||
--hash=sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4 \
|
||||
--hash=sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f \
|
||||
# via bitbox02
|
||||
six==1.12.0 \
|
||||
--hash=sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c \
|
||||
--hash=sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73 \
|
||||
six==1.16.0 \
|
||||
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
|
||||
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 \
|
||||
# via -r requirements.in, ecdsa, flask-cors, flask-restful, pgpy, protobuf, pyopenssl
|
||||
stem==1.8.0 \
|
||||
--hash=sha256:a0b48ea6224e95f22aa34c0bc3415f0eb4667ddeae3dfb5e32a6920c185568c2 \
|
||||
|
|
@ -333,9 +333,9 @@ urllib3==1.26.5 \
|
|||
--hash=sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c \
|
||||
--hash=sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098 \
|
||||
# via requests
|
||||
werkzeug==2.0.1 \
|
||||
--hash=sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42 \
|
||||
--hash=sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8 \
|
||||
werkzeug==1.0.1 \
|
||||
--hash=sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43 \
|
||||
--hash=sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c \
|
||||
# via flask
|
||||
wtforms==2.3.3 \
|
||||
--hash=sha256:7b504fc724d0d1d4d5d5c114e778ec88c37ea53144683e084215eed5155ada4c \
|
||||
|
|
|
|||
|
|
@ -24,26 +24,6 @@ def cli():
|
|||
|
||||
|
||||
@cli.command()
|
||||
@click.option(
|
||||
"--daemon",
|
||||
is_flag=True,
|
||||
help="Deprecated, don't use this options and expect future removal.",
|
||||
)
|
||||
@click.option(
|
||||
"--stop",
|
||||
is_flag=True,
|
||||
help="Deprecated, don't use this options and expect future removal.",
|
||||
)
|
||||
@click.option(
|
||||
"--restart",
|
||||
is_flag=True,
|
||||
help="Deprecated, don't use this options and expect future removal.",
|
||||
)
|
||||
@click.option(
|
||||
"--force",
|
||||
is_flag=True,
|
||||
help="Deprecated, don't use this options and expect future removal.",
|
||||
)
|
||||
# options below can help to run it on a remote server,
|
||||
# but better use nginx
|
||||
@click.option(
|
||||
|
|
@ -89,10 +69,6 @@ def cli():
|
|||
help="A class from the config.py which sets reasonable default values.",
|
||||
)
|
||||
def server(
|
||||
daemon,
|
||||
stop,
|
||||
restart,
|
||||
force,
|
||||
port,
|
||||
host,
|
||||
cert,
|
||||
|
|
@ -147,41 +123,7 @@ def server(
|
|||
fh.setFormatter(formatter)
|
||||
logging.getLogger().addHandler(fh)
|
||||
|
||||
# This stuff here is deprecated
|
||||
# When we remove it, we should imho keep the pid_file thing which can be very useful!
|
||||
# we will store our daemon PID here
|
||||
pid_file = path.join(app.specter.data_folder, "daemon.pid")
|
||||
|
||||
toraddr_file = path.join(app.specter.data_folder, "onion.txt")
|
||||
# check if pid file exists
|
||||
if path.isfile(pid_file):
|
||||
# if we need to stop daemon
|
||||
if stop or restart:
|
||||
print("Stopping the Specter server...")
|
||||
with open(pid_file) as f:
|
||||
pid = int(f.read())
|
||||
os.kill(pid, signal.SIGTERM)
|
||||
time.sleep(0.3)
|
||||
try:
|
||||
os.remove(pid_file)
|
||||
except OSError:
|
||||
pass
|
||||
elif daemon:
|
||||
if not force:
|
||||
print(
|
||||
f'PID file "{pid_file}" already exists. \
|
||||
Use --force to overwrite'
|
||||
)
|
||||
return
|
||||
else:
|
||||
os.remove(pid_file)
|
||||
if stop:
|
||||
return
|
||||
else:
|
||||
if stop or restart:
|
||||
print(f'Can\'t find PID file "{pid_file}"')
|
||||
if stop:
|
||||
return
|
||||
|
||||
# watch templates folder to reload when something changes
|
||||
extra_dirs = ["templates"]
|
||||
|
|
@ -253,31 +195,10 @@ def server(
|
|||
# no reason to break startup here
|
||||
logger.error("Could not initialize tor-system")
|
||||
|
||||
# check if we should run a daemon or not
|
||||
if daemon or restart:
|
||||
print("Starting server in background...")
|
||||
protocol = "http"
|
||||
if "ssl_context" in kwargs:
|
||||
protocol = "https"
|
||||
print(" * Running on %s://%s:%d/" % (protocol, host, app.config["PORT"]))
|
||||
# macOS + python3.7 is buggy
|
||||
if sys.platform == "darwin" and (
|
||||
sys.version_info.major == 3 and sys.version_info.minor < 8
|
||||
):
|
||||
raise Exception(
|
||||
" ERROR: --daemon mode is no longer \
|
||||
supported in Python 3.7 and lower \
|
||||
on MacOS. Upgrade to Python 3.8+. (Might not work anyway.)"
|
||||
)
|
||||
from daemonize import Daemonize
|
||||
|
||||
d = Daemonize(app="specter", pid=pid_file, action=run)
|
||||
d.start()
|
||||
else:
|
||||
# if not a daemon we can use DEBUG
|
||||
if debug is None:
|
||||
debug = app.config["DEBUG"]
|
||||
run(debug=debug)
|
||||
# if not a daemon we can use DEBUG
|
||||
if debug is None:
|
||||
debug = app.config["DEBUG"]
|
||||
run(debug=debug)
|
||||
|
||||
|
||||
def configure_ssl(kwargs, app_config, ssl):
|
||||
|
|
|
|||
|
|
@ -1,17 +1,15 @@
|
|||
import random, traceback, socket, threading, os
|
||||
from datetime import datetime
|
||||
import random, traceback
|
||||
from binascii import unhexlify
|
||||
from flask import make_response
|
||||
from flask_wtf.csrf import CSRFError
|
||||
from werkzeug.exceptions import MethodNotAllowed
|
||||
from flask import render_template, request, redirect, url_for, flash, Markup
|
||||
from flask import render_template, request, redirect, url_for, flash
|
||||
from flask_babel import lazy_gettext as _
|
||||
from flask_login import login_required, current_user
|
||||
from ..helpers import (
|
||||
generate_mnemonic,
|
||||
notify_upgrade,
|
||||
)
|
||||
from ..specter import Specter
|
||||
from ..specter_error import SpecterError, ExtProcTimeoutException
|
||||
from pathlib import Path
|
||||
|
||||
|
|
|
|||
|
|
@ -1524,7 +1524,7 @@ class Wallet:
|
|||
]
|
||||
self._addresses.add(addresses, check_rpc=False)
|
||||
except Exception as e:
|
||||
logger.warn(f"Error while calculating addresses: {e}")
|
||||
logger.warning(f"Error while calculating addresses: {e}")
|
||||
|
||||
# Descriptor wallets were introduced in v0.21.0, but upgraded nodes may
|
||||
# still have legacy wallets. Use getwalletinfo to check the wallet type.
|
||||
|
|
|
|||
|
|
@ -22,11 +22,14 @@ from cryptoadvance.specter.process_controller.elementsd_controller import (
|
|||
from cryptoadvance.specter.rpc import BitcoinRPC
|
||||
from cryptoadvance.specter.server import create_app, init_app
|
||||
from cryptoadvance.specter.specter import Specter
|
||||
from cryptoadvance.specter.specter_error import SpecterError
|
||||
from cryptoadvance.specter.user import User
|
||||
from cryptoadvance.specter.util.wallet_importer import WalletImporter
|
||||
from cryptoadvance.specter.util.common import str2bool
|
||||
import code, traceback, signal
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
pytest_plugins = ["ghost_machine"]
|
||||
|
||||
# This is from https://stackoverflow.com/questions/132058/showing-the-stack-trace-from-a-running-python-application
|
||||
|
|
@ -396,12 +399,22 @@ def specter_regtest_configured(bitcoin_regtest, devices_filled_data_folder):
|
|||
)
|
||||
dm: DeviceManager = someuser.device_manager
|
||||
wallet = wallet_importer.create_wallet(someuser.wallet_manager)
|
||||
# fund it with some coins
|
||||
bitcoin_regtest.testcoin_faucet(address=wallet.getnewaddress())
|
||||
# make sure it's confirmed
|
||||
bitcoin_regtest.mine()
|
||||
# Realize that the wallet has funds:
|
||||
wallet.update()
|
||||
try:
|
||||
# fund it with some coins
|
||||
bitcoin_regtest.testcoin_faucet(address=wallet.getnewaddress())
|
||||
# make sure it's confirmed
|
||||
bitcoin_regtest.mine()
|
||||
# Realize that the wallet has funds:
|
||||
wallet.update()
|
||||
except SpecterError as se:
|
||||
if str(se).startswith("Timeout"):
|
||||
pytest.fail(
|
||||
"We got a Bitcoin-RPC timeout while setting up the test, minting some coins. Test Error! Check cpu/mem utilastion and btc/elem logs!"
|
||||
)
|
||||
return
|
||||
else:
|
||||
raise se
|
||||
|
||||
assert wallet.fullbalance >= 20
|
||||
assert not specter.wallet_manager.working_folder is None
|
||||
try:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue