Compare commits
32 Commits
v0.15.0
...
69f607d28f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69f607d28f | ||
|
|
e1bca8e384 | ||
|
|
6fd324ec9f | ||
|
|
b6af5ee93d | ||
|
|
289c66e2e5 | ||
|
|
bcec90feca | ||
|
|
543a8e32a4 | ||
|
|
c8be53068b | ||
|
|
0af7e79929 | ||
|
|
529402cff6 | ||
|
|
9a863a00b6 | ||
|
|
cd98a8eb64 | ||
|
|
0bc9d3a5db | ||
|
|
cd3c8e7c26 | ||
|
|
ff9bbbfe06 | ||
|
|
47aab3140f | ||
|
|
5512c9fd7f | ||
|
|
d0614fd7a3 | ||
|
|
84223fabb0 | ||
|
|
4938a203f2 | ||
|
|
2a641567ba | ||
|
|
fbeece4fc9 | ||
|
|
6906e8ac1b | ||
|
|
1a86d371c3 | ||
|
|
e6c1c86dff | ||
|
|
ee8ab69d57 | ||
|
|
2279ed84dc | ||
|
|
497793ae8c | ||
|
|
052c722d76 | ||
|
|
53b06859fc | ||
|
|
7755b4c505 | ||
|
|
95da26211b |
12
.github/workflows/ci.yml
vendored
@@ -1,6 +1,16 @@
|
||||
name: ci
|
||||
|
||||
on: [push, pull_request]
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'doc/**'
|
||||
- '**/README.md'
|
||||
- '**/LICENSE'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'doc/**'
|
||||
- '**/README.md'
|
||||
- '**/LICENSE'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
name = "basicswap"
|
||||
|
||||
__version__ = "0.15.0"
|
||||
__version__ = "0.15.1"
|
||||
|
||||
@@ -72,6 +72,7 @@ from .db_util import remove_expired_data
|
||||
from .http_server import HttpThread
|
||||
from .rpc import escape_rpcauth
|
||||
from .rpc_xmr import make_xmr_rpc2_func
|
||||
from .types import WatchedTransaction, WatchedScript, WatchedOutput
|
||||
from .ui.app import UIApp
|
||||
from .ui.util import getCoinName
|
||||
from .util import (
|
||||
@@ -287,37 +288,6 @@ def threadPollChainState(swap_client, coin_type):
|
||||
swap_client.chainstate_delay_event.wait(random.randrange(*poll_delay_range))
|
||||
|
||||
|
||||
class WatchedOutput: # Watch for spends
|
||||
__slots__ = ("bid_id", "txid_hex", "vout", "tx_type", "swap_type")
|
||||
|
||||
def __init__(self, bid_id: bytes, txid_hex: str, vout, tx_type, swap_type):
|
||||
self.bid_id = bid_id
|
||||
self.txid_hex = txid_hex
|
||||
self.vout = vout
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
|
||||
|
||||
class WatchedScript: # Watch for txns containing outputs
|
||||
__slots__ = ("bid_id", "script", "tx_type", "swap_type")
|
||||
|
||||
def __init__(self, bid_id: bytes, script: bytes, tx_type, swap_type):
|
||||
self.bid_id = bid_id
|
||||
self.script = script
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
|
||||
|
||||
class WatchedTransaction:
|
||||
# TODO
|
||||
# Watch for presence in mempool (getrawtransaction)
|
||||
def __init__(self, bid_id: bytes, txid_hex: str, tx_type, swap_type):
|
||||
self.bid_id = bid_id
|
||||
self.txid_hex = txid_hex
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
|
||||
|
||||
class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
ws_server = None
|
||||
protocolInterfaces = {
|
||||
@@ -530,7 +500,6 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
self.db_version = self.getIntKV("db_version", cursor, CURRENT_DB_VERSION)
|
||||
self.db_data_version = self.getIntKV("db_data_version", cursor, 0)
|
||||
self._contract_count = self.getIntKV("contract_count", cursor, 0)
|
||||
self.commitDB()
|
||||
finally:
|
||||
self.closeDB(cursor)
|
||||
|
||||
@@ -613,6 +582,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
def finalise(self):
|
||||
self.log.info("Finalising")
|
||||
|
||||
if self.ws_server:
|
||||
try:
|
||||
self.log.info("Stopping websocket server.")
|
||||
self.ws_server.shutdown_gracefully()
|
||||
except Exception as e: # noqa: F841
|
||||
traceback.print_exc()
|
||||
|
||||
self._price_fetch_running = False
|
||||
if self._price_fetch_thread and self._price_fetch_thread.is_alive():
|
||||
self._price_fetch_thread.join(timeout=5)
|
||||
@@ -745,6 +721,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
"rpcauth": rpcauth,
|
||||
"blocks_confirmed": chain_client_settings.get("blocks_confirmed", 6),
|
||||
"conf_target": chain_client_settings.get("conf_target", 2),
|
||||
"watched_transactions": [],
|
||||
"watched_outputs": [],
|
||||
"watched_scripts": [],
|
||||
"last_height_checked": last_height_checked,
|
||||
@@ -1509,6 +1486,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
|
||||
try:
|
||||
if version_tuple(latest_tag) > version_tuple(current_version):
|
||||
self._latest_version = latest_tag
|
||||
if not self._update_available:
|
||||
self._update_available = True
|
||||
self.log.info(
|
||||
@@ -1528,6 +1506,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
self.log.info(f"Update v{latest_tag} already notified")
|
||||
else:
|
||||
self._update_available = False
|
||||
self._latest_version = None
|
||||
self.log.info(f"BasicSwap is up to date (v{current_version})")
|
||||
except ValueError as e:
|
||||
self.log.warning(f"Error comparing versions: {e}")
|
||||
@@ -2026,6 +2005,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
|
||||
if self.ws_server and show_event:
|
||||
self.ws_server.send_message_to_all(json.dumps(event_data))
|
||||
elif event_type == NT.UPDATE_AVAILABLE:
|
||||
self.log.info(
|
||||
f"Update available: v{event_data.get('latest_version', 'unknown')}"
|
||||
)
|
||||
if self.ws_server and show_event:
|
||||
event_data["event"] = "update_available"
|
||||
self.ws_server.send_message_to_all(json.dumps(event_data))
|
||||
else:
|
||||
self.log.warning(f"Unknown notification {event_type}")
|
||||
|
||||
@@ -4444,17 +4430,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
xmr_swap.kbsf_dleag = ci_to.proveDLEAG(kbsf)
|
||||
xmr_swap.pkasf = xmr_swap.kbsf_dleag[0:33]
|
||||
elif ci_to.curve_type() == Curves.secp256k1:
|
||||
for i in range(10):
|
||||
xmr_swap.kbsf_dleag = ci_to.signRecoverable(
|
||||
kbsf, "proof kbsf owned for swap"
|
||||
)
|
||||
pk_recovered = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsf_dleag, "proof kbsf owned for swap"
|
||||
)
|
||||
if pk_recovered == xmr_swap.pkbsf:
|
||||
break
|
||||
self.log.debug("kbsl recovered pubkey mismatch, retrying.")
|
||||
assert pk_recovered == xmr_swap.pkbsf
|
||||
xmr_swap.kbsf_dleag = ci_to.signRecoverable(
|
||||
kbsf, "proof kbsf owned for swap"
|
||||
)
|
||||
pk_recovered = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsf_dleag, "proof kbsf owned for swap"
|
||||
)
|
||||
ensure(pk_recovered == xmr_swap.pkbsf, "kbsf recovered pubkey mismatch")
|
||||
xmr_swap.pkasf = xmr_swap.pkbsf
|
||||
else:
|
||||
raise ValueError("Unknown curve")
|
||||
@@ -4757,17 +4739,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
xmr_swap.kbsl_dleag = ci_to.proveDLEAG(kbsl)
|
||||
msg_buf.kbsl_dleag = xmr_swap.kbsl_dleag[:dleag_split_size_init]
|
||||
elif ci_to.curve_type() == Curves.secp256k1:
|
||||
for i in range(10):
|
||||
xmr_swap.kbsl_dleag = ci_to.signRecoverable(
|
||||
kbsl, "proof kbsl owned for swap"
|
||||
)
|
||||
pk_recovered = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsl_dleag, "proof kbsl owned for swap"
|
||||
)
|
||||
if pk_recovered == xmr_swap.pkbsl:
|
||||
break
|
||||
self.log.debug("kbsl recovered pubkey mismatch, retrying.")
|
||||
assert pk_recovered == xmr_swap.pkbsl
|
||||
xmr_swap.kbsl_dleag = ci_to.signRecoverable(
|
||||
kbsl, "proof kbsl owned for swap"
|
||||
)
|
||||
pk_recovered = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsl_dleag, "proof kbsl owned for swap"
|
||||
)
|
||||
ensure(pk_recovered == xmr_swap.pkbsl, "kbsl recovered pubkey mismatch")
|
||||
msg_buf.kbsl_dleag = xmr_swap.kbsl_dleag
|
||||
else:
|
||||
raise ValueError("Unknown curve")
|
||||
@@ -5577,7 +5555,11 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
block_header = ci.getBlockHeaderFromHeight(tx_height)
|
||||
block_time = block_header["time"]
|
||||
cc = self.coin_clients[coin_type]
|
||||
if len(cc["watched_outputs"]) == 0 and len(cc["watched_scripts"]) == 0:
|
||||
if (
|
||||
len(cc["watched_outputs"]) == 0
|
||||
and len(cc["watched_transactions"]) == 0
|
||||
and len(cc["watched_scripts"]) == 0
|
||||
):
|
||||
cc["last_height_checked"] = tx_height
|
||||
cc["block_check_min_time"] = block_time
|
||||
self.setIntKV("block_check_min_time_" + coin_name, block_time, cursor)
|
||||
@@ -6723,6 +6705,39 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def addWatchedTransaction(
|
||||
self, coin_type, bid_id, txid_hex, tx_type, swap_type=None
|
||||
):
|
||||
self.log.debug(
|
||||
f"Adding watched transaction {Coins(coin_type).name} bid {self.log.id(bid_id)} tx {self.log.id(txid_hex)} type {tx_type}"
|
||||
)
|
||||
|
||||
watched = self.coin_clients[coin_type]["watched_transactions"]
|
||||
|
||||
for wo in watched:
|
||||
if wo.bid_id == bid_id and wo.txid_hex == txid_hex:
|
||||
self.log.debug("Transaction already being watched.")
|
||||
return
|
||||
|
||||
watched.append(
|
||||
WatchedTransaction(bid_id, coin_type, txid_hex, tx_type, swap_type)
|
||||
)
|
||||
|
||||
def removeWatchedTransaction(self, coin_type, bid_id: bytes, txid_hex: str) -> None:
|
||||
# Remove all for bid if txid is None
|
||||
self.log.debug(
|
||||
f"Removing watched transaction {Coins(coin_type).name} {self.log.id(bid_id)} {self.log.id(txid_hex)}"
|
||||
)
|
||||
watched = self.coin_clients[coin_type]["watched_transactions"]
|
||||
old_len = len(watched)
|
||||
for i in range(old_len - 1, -1, -1):
|
||||
wo = watched[i]
|
||||
if wo.bid_id == bid_id and (txid_hex is None or wo.txid_hex == txid_hex):
|
||||
del watched[i]
|
||||
self.log.debug(
|
||||
f"Removed watched transaction {Coins(coin_type).name} {self.log.id(bid_id)} {self.log.id(wo.txid_hex)}"
|
||||
)
|
||||
|
||||
def addWatchedOutput(
|
||||
self, coin_type, bid_id, txid_hex, vout, tx_type, swap_type=None
|
||||
):
|
||||
@@ -6731,7 +6746,6 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
)
|
||||
|
||||
watched = self.coin_clients[coin_type]["watched_outputs"]
|
||||
|
||||
for wo in watched:
|
||||
if wo.bid_id == bid_id and wo.txid_hex == txid_hex and wo.vout == vout:
|
||||
self.log.debug("Output already being watched.")
|
||||
@@ -6742,13 +6756,14 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
def removeWatchedOutput(self, coin_type, bid_id: bytes, txid_hex: str) -> None:
|
||||
# Remove all for bid if txid is None
|
||||
self.log.debug(
|
||||
f"removeWatchedOutput {Coins(coin_type).name} {self.log.id(bid_id)} {self.log.id(txid_hex)}"
|
||||
f"Removing watched output {Coins(coin_type).name} {self.log.id(bid_id)} {self.log.id(txid_hex)}"
|
||||
)
|
||||
old_len = len(self.coin_clients[coin_type]["watched_outputs"])
|
||||
watched = self.coin_clients[coin_type]["watched_outputs"]
|
||||
old_len = len(watched)
|
||||
for i in range(old_len - 1, -1, -1):
|
||||
wo = self.coin_clients[coin_type]["watched_outputs"][i]
|
||||
wo = watched[i]
|
||||
if wo.bid_id == bid_id and (txid_hex is None or wo.txid_hex == txid_hex):
|
||||
del self.coin_clients[coin_type]["watched_outputs"][i]
|
||||
del watched[i]
|
||||
self.log.debug(
|
||||
f"Removed watched output {Coins(coin_type).name} {self.log.id(bid_id)} {self.log.id(wo.txid_hex)}"
|
||||
)
|
||||
@@ -6761,7 +6776,6 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
)
|
||||
|
||||
watched = self.coin_clients[coin_type]["watched_scripts"]
|
||||
|
||||
for ws in watched:
|
||||
if ws.bid_id == bid_id and ws.tx_type == tx_type and ws.script == script:
|
||||
self.log.debug("Script already being watched.")
|
||||
@@ -6774,21 +6788,22 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
) -> None:
|
||||
# Remove all for bid if script and type_ind is None
|
||||
self.log.debug(
|
||||
"removeWatchedScript {} {}{}".format(
|
||||
"Removing watched script {} {}{}".format(
|
||||
Coins(coin_type).name,
|
||||
{self.log.id(bid_id)},
|
||||
(" type " + str(tx_type)) if tx_type is not None else "",
|
||||
)
|
||||
)
|
||||
old_len = len(self.coin_clients[coin_type]["watched_scripts"])
|
||||
watched = self.coin_clients[coin_type]["watched_scripts"]
|
||||
old_len = len(watched)
|
||||
for i in range(old_len - 1, -1, -1):
|
||||
ws = self.coin_clients[coin_type]["watched_scripts"][i]
|
||||
ws = watched[i]
|
||||
if (
|
||||
ws.bid_id == bid_id
|
||||
and (script is None or ws.script == script)
|
||||
and (tx_type is None or ws.tx_type == tx_type)
|
||||
):
|
||||
del self.coin_clients[coin_type]["watched_scripts"][i]
|
||||
del watched[i]
|
||||
self.log.debug(
|
||||
f"Removed watched script {Coins(coin_type).name} {self.log.id(bid_id)}"
|
||||
)
|
||||
@@ -7166,6 +7181,17 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
finally:
|
||||
self.closeDB(cursor)
|
||||
|
||||
def processFoundTransaction(
|
||||
self,
|
||||
watched_txn: WatchedTransaction,
|
||||
block_hash_hex: str,
|
||||
block_height: int,
|
||||
chain_blocks: int,
|
||||
):
|
||||
self.log.warning(
|
||||
f"Unknown swap_type for found transaction: {self.logIDT(bytes.fromhex(watched_txn.txid_hex))}."
|
||||
)
|
||||
|
||||
def processSpentOutput(
|
||||
self, coin_type, watched_output, spend_txid_hex, spend_n, spend_txn
|
||||
) -> None:
|
||||
@@ -7428,6 +7454,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
continue
|
||||
|
||||
for tx in block["tx"]:
|
||||
for t in c["watched_transactions"]:
|
||||
if t.block_hash is not None:
|
||||
continue
|
||||
if tx["txid"] == t.txid_hex:
|
||||
self.processFoundTransaction(
|
||||
t, block_hash, block["height"], chain_blocks
|
||||
)
|
||||
for s in c["watched_scripts"]:
|
||||
for i, txo in enumerate(tx["vout"]):
|
||||
if "scriptPubKey" in txo and "hex" in txo["scriptPubKey"]:
|
||||
@@ -8737,20 +8770,18 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
|
||||
# Extract pubkeys from MSG1F DLEAG
|
||||
xmr_swap.pkasl = xmr_swap.kbsl_dleag[0:33]
|
||||
if not ci_from.verifyPubkey(xmr_swap.pkasl):
|
||||
raise ValueError("Invalid coin a pubkey.")
|
||||
xmr_swap.pkbsl = xmr_swap.kbsl_dleag[33 : 33 + 32]
|
||||
if not ci_to.verifyPubkey(xmr_swap.pkbsl):
|
||||
raise ValueError("Invalid coin b pubkey.")
|
||||
elif ci_to.curve_type() == Curves.secp256k1:
|
||||
xmr_swap.pkasl = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsl_dleag, "proof kbsl owned for swap"
|
||||
)
|
||||
if not ci_from.verifyPubkey(xmr_swap.pkasl):
|
||||
raise ValueError("Invalid coin a pubkey.")
|
||||
xmr_swap.pkbsl = xmr_swap.pkasl
|
||||
else:
|
||||
raise ValueError("Unknown curve")
|
||||
if not ci_from.verifyPubkey(xmr_swap.pkasl):
|
||||
raise ValueError("Invalid coin a pubkey.")
|
||||
if not ci_to.verifyPubkey(xmr_swap.pkbsl):
|
||||
raise ValueError("Invalid coin b pubkey.")
|
||||
|
||||
# vkbv and vkbvl are verified in processXmrBidAccept
|
||||
xmr_swap.pkbv = ci_to.sumPubkeys(xmr_swap.pkbvl, xmr_swap.pkbvf)
|
||||
@@ -10818,7 +10849,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
>= self.check_expiring_bids_offers_seconds
|
||||
):
|
||||
check_records = True
|
||||
self._last_checked_expiring_bids = now
|
||||
self._last_checked_expiring_bids_offers = now
|
||||
|
||||
if (
|
||||
len(bids_to_expire) == 0
|
||||
@@ -11260,6 +11291,16 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
settings_copy["notifications_outgoing_transactions"] = new_value
|
||||
settings_changed = True
|
||||
|
||||
if "notifications_swap_completed" in data:
|
||||
new_value = data["notifications_swap_completed"]
|
||||
ensure(
|
||||
isinstance(new_value, bool),
|
||||
"New notifications_swap_completed value not boolean",
|
||||
)
|
||||
if settings_copy.get("notifications_swap_completed", True) != new_value:
|
||||
settings_copy["notifications_swap_completed"] = new_value
|
||||
settings_changed = True
|
||||
|
||||
if "notifications_duration" in data:
|
||||
new_value = data["notifications_duration"]
|
||||
ensure(
|
||||
@@ -11274,6 +11315,15 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
||||
settings_copy["notifications_duration"] = new_value
|
||||
settings_changed = True
|
||||
|
||||
if "check_updates" in data:
|
||||
new_value = data["check_updates"]
|
||||
ensure(
|
||||
isinstance(new_value, bool), "New check_updates value not boolean"
|
||||
)
|
||||
if settings_copy.get("check_updates", True) != new_value:
|
||||
settings_copy["check_updates"] = new_value
|
||||
settings_changed = True
|
||||
|
||||
if settings_changed:
|
||||
settings_path = os.path.join(self.data_dir, cfg.CONFIG_FILENAME)
|
||||
settings_path_new = settings_path + ".new"
|
||||
|
||||
@@ -459,7 +459,7 @@ def describeEventEntry(event_type, event_msg):
|
||||
if event_type == EventLogTypes.LOCK_TX_B_INVALID:
|
||||
return "Detected invalid lock Tx B"
|
||||
if event_type == EventLogTypes.LOCK_TX_A_REFUND_TX_PUBLISHED:
|
||||
return "Lock tx A refund tx published"
|
||||
return "Lock tx A pre-refund tx published"
|
||||
if event_type == EventLogTypes.LOCK_TX_A_REFUND_SPEND_TX_PUBLISHED:
|
||||
return "Lock tx A refund spend tx published"
|
||||
if event_type == EventLogTypes.LOCK_TX_A_REFUND_SWIPE_TX_PUBLISHED:
|
||||
@@ -471,7 +471,7 @@ def describeEventEntry(event_type, event_msg):
|
||||
if event_type == EventLogTypes.LOCK_TX_B_SPEND_TX_PUBLISHED:
|
||||
return "Lock tx B spend tx published"
|
||||
if event_type == EventLogTypes.LOCK_TX_A_REFUND_TX_SEEN:
|
||||
return "Lock tx A refund tx seen in chain"
|
||||
return "Lock tx A pre-refund tx seen in chain"
|
||||
if event_type == EventLogTypes.LOCK_TX_A_REFUND_SPEND_TX_SEEN:
|
||||
return "Lock tx A refund spend tx seen in chain"
|
||||
if event_type == EventLogTypes.SYSTEM_WARNING:
|
||||
|
||||
@@ -51,7 +51,7 @@ from basicswap.bin.run import (
|
||||
|
||||
# Coin clients
|
||||
PARTICL_REPO = os.getenv("PARTICL_REPO", "tecnovert")
|
||||
PARTICL_VERSION = os.getenv("PARTICL_VERSION", "27.2.2.0")
|
||||
PARTICL_VERSION = os.getenv("PARTICL_VERSION", "27.2.3.0")
|
||||
PARTICL_VERSION_TAG = os.getenv("PARTICL_VERSION_TAG", "")
|
||||
PARTICL_LINUX_EXTRA = os.getenv("PARTICL_LINUX_EXTRA", "nousb")
|
||||
|
||||
@@ -67,10 +67,10 @@ DCR_VERSION_TAG = os.getenv("DCR_VERSION_TAG", "")
|
||||
NMC_VERSION = os.getenv("NMC_VERSION", "28.0")
|
||||
NMC_VERSION_TAG = os.getenv("NMC_VERSION_TAG", "")
|
||||
|
||||
MONERO_VERSION = os.getenv("MONERO_VERSION", "0.18.4.3")
|
||||
MONERO_VERSION = os.getenv("MONERO_VERSION", "0.18.4.4")
|
||||
MONERO_VERSION_TAG = os.getenv("MONERO_VERSION_TAG", "")
|
||||
XMR_SITE_COMMIT = (
|
||||
"df28b670cb3a174d7763dd6d22fb4ef20597d0ac" # Lock hashes.txt to monero version
|
||||
"a1bd4cd48a85b6012de20d9e490f83936f477be2" # Lock hashes.txt to monero version
|
||||
)
|
||||
|
||||
WOWNERO_VERSION = os.getenv("WOWNERO_VERSION", "0.11.3.0")
|
||||
@@ -85,7 +85,7 @@ PIVX_VERSION_TAG = os.getenv("PIVX_VERSION_TAG", "")
|
||||
DASH_VERSION = os.getenv("DASH_VERSION", "22.1.3")
|
||||
DASH_VERSION_TAG = os.getenv("DASH_VERSION_TAG", "")
|
||||
|
||||
FIRO_VERSION = os.getenv("FIRO_VERSION", "0.14.14.3")
|
||||
FIRO_VERSION = os.getenv("FIRO_VERSION", "0.14.15.0")
|
||||
FIRO_VERSION_TAG = os.getenv("FIRO_VERSION_TAG", "")
|
||||
|
||||
NAV_VERSION = os.getenv("NAV_VERSION", "7.0.3")
|
||||
|
||||
@@ -221,7 +221,7 @@ def startXmrDaemon(node_dir, bin_dir, daemon_bin, opts=[]):
|
||||
|
||||
def startXmrWalletDaemon(node_dir, bin_dir, wallet_bin, opts=[]):
|
||||
daemon_path = os.path.expanduser(os.path.join(bin_dir, wallet_bin))
|
||||
args = [daemon_path, "--non-interactive"]
|
||||
args = [daemon_path]
|
||||
|
||||
needs_rewrite: bool = False
|
||||
config_to_remove = [
|
||||
@@ -608,13 +608,6 @@ def runClient(
|
||||
except Exception as e: # noqa: F841
|
||||
traceback.print_exc()
|
||||
|
||||
if swap_client.ws_server:
|
||||
try:
|
||||
swap_client.log.info("Stopping websocket server.")
|
||||
swap_client.ws_server.shutdown_gracefully()
|
||||
except Exception as e: # noqa: F841
|
||||
traceback.print_exc()
|
||||
|
||||
swap_client.finalise()
|
||||
|
||||
closed_pids = []
|
||||
|
||||
@@ -792,8 +792,8 @@ class NetworkPortal(Table):
|
||||
created_at = Column("integer")
|
||||
|
||||
|
||||
def extract_schema() -> dict:
|
||||
g = globals().copy()
|
||||
def extract_schema(input_globals=None) -> dict:
|
||||
g = globals() if input_globals is None else input_globals
|
||||
tables = {}
|
||||
for name, obj in g.items():
|
||||
if not inspect.isclass(obj):
|
||||
|
||||
@@ -152,7 +152,94 @@ def upgradeDatabaseData(self, data_version):
|
||||
self.closeDB(cursor, commit=False)
|
||||
|
||||
|
||||
def upgradeDatabase(self, db_version):
|
||||
def upgradeDatabaseFromSchema(self, cursor, expect_schema):
|
||||
have_tables = {}
|
||||
|
||||
query = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"
|
||||
tables = cursor.execute(query).fetchall()
|
||||
for table in tables:
|
||||
table_name = table[0]
|
||||
if table_name in ("sqlite_sequence",):
|
||||
continue
|
||||
|
||||
have_table = {}
|
||||
have_columns = {}
|
||||
query = "SELECT * FROM PRAGMA_TABLE_INFO(:table_name) ORDER BY cid DESC;"
|
||||
columns = cursor.execute(query, {"table_name": table_name}).fetchall()
|
||||
for column in columns:
|
||||
cid, name, data_type, notnull, default_value, primary_key = column
|
||||
have_columns[name] = {"type": data_type, "primary_key": primary_key}
|
||||
|
||||
have_table["columns"] = have_columns
|
||||
|
||||
cursor.execute(f"PRAGMA INDEX_LIST('{table_name}');")
|
||||
indices = cursor.fetchall()
|
||||
for index in indices:
|
||||
seq, index_name, unique, origin, partial = index
|
||||
|
||||
if origin == "pk": # Created by a PRIMARY KEY constraint
|
||||
continue
|
||||
|
||||
cursor.execute(f"PRAGMA INDEX_INFO('{index_name}');")
|
||||
index_info = cursor.fetchall()
|
||||
|
||||
add_index = {"index_name": index_name}
|
||||
for index_columns in index_info:
|
||||
seqno, cid, name = index_columns
|
||||
if origin == "u": # Created by a UNIQUE constraint
|
||||
have_columns[name]["unique"] = 1
|
||||
else:
|
||||
if "column_1" not in add_index:
|
||||
add_index["column_1"] = name
|
||||
elif "column_2" not in add_index:
|
||||
add_index["column_2"] = name
|
||||
elif "column_3" not in add_index:
|
||||
add_index["column_3"] = name
|
||||
else:
|
||||
raise RuntimeError("Add more index columns.")
|
||||
if origin == "c":
|
||||
if "indices" not in table:
|
||||
have_table["indices"] = []
|
||||
have_table["indices"].append(add_index)
|
||||
|
||||
have_tables[table_name] = have_table
|
||||
|
||||
for table_name, table in expect_schema.items():
|
||||
if table_name not in have_tables:
|
||||
self.log.info(f"Creating table {table_name}.")
|
||||
create_table(cursor, table_name, table)
|
||||
continue
|
||||
|
||||
have_table = have_tables[table_name]
|
||||
have_columns = have_table["columns"]
|
||||
for colname, column in table["columns"].items():
|
||||
if colname not in have_columns:
|
||||
col_type = column["type"]
|
||||
self.log.info(f"Adding column {colname} to table {table_name}.")
|
||||
cursor.execute(
|
||||
f"ALTER TABLE {table_name} ADD COLUMN {colname} {col_type}"
|
||||
)
|
||||
indices = table.get("indices", [])
|
||||
have_indices = have_table.get("indices", [])
|
||||
for index in indices:
|
||||
index_name = index["index_name"]
|
||||
if not any(
|
||||
have_idx.get("index_name") == index_name for have_idx in have_indices
|
||||
):
|
||||
self.log.info(f"Adding index {index_name} to table {table_name}.")
|
||||
column_1 = index["column_1"]
|
||||
column_2 = index.get("column_2", None)
|
||||
column_3 = index.get("column_3", None)
|
||||
query: str = f"CREATE INDEX {index_name} ON {table_name} ({column_1}"
|
||||
if column_2:
|
||||
query += f", {column_2}"
|
||||
if column_3:
|
||||
query += f", {column_3}"
|
||||
query += ")"
|
||||
cursor.execute(query)
|
||||
|
||||
|
||||
def upgradeDatabase(self, db_version: int):
|
||||
if self._force_db_upgrade is False and db_version >= CURRENT_DB_VERSION:
|
||||
return
|
||||
|
||||
@@ -174,103 +261,15 @@ def upgradeDatabase(self, db_version):
|
||||
]
|
||||
|
||||
expect_schema = extract_schema()
|
||||
have_tables = {}
|
||||
try:
|
||||
cursor = self.openDB()
|
||||
|
||||
for rename_column in rename_columns:
|
||||
dbv, table_name, colname_from, colname_to = rename_column
|
||||
if db_version < dbv:
|
||||
cursor.execute(
|
||||
f"ALTER TABLE {table_name} RENAME COLUMN {colname_from} TO {colname_to}"
|
||||
)
|
||||
|
||||
query = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"
|
||||
tables = cursor.execute(query).fetchall()
|
||||
for table in tables:
|
||||
table_name = table[0]
|
||||
if table_name in ("sqlite_sequence",):
|
||||
continue
|
||||
|
||||
have_table = {}
|
||||
have_columns = {}
|
||||
query = "SELECT * FROM PRAGMA_TABLE_INFO(:table_name) ORDER BY cid DESC;"
|
||||
columns = cursor.execute(query, {"table_name": table_name}).fetchall()
|
||||
for column in columns:
|
||||
cid, name, data_type, notnull, default_value, primary_key = column
|
||||
have_columns[name] = {"type": data_type, "primary_key": primary_key}
|
||||
|
||||
have_table["columns"] = have_columns
|
||||
|
||||
cursor.execute(f"PRAGMA INDEX_LIST('{table_name}');")
|
||||
indices = cursor.fetchall()
|
||||
for index in indices:
|
||||
seq, index_name, unique, origin, partial = index
|
||||
|
||||
if origin == "pk": # Created by a PRIMARY KEY constraint
|
||||
continue
|
||||
|
||||
cursor.execute(f"PRAGMA INDEX_INFO('{index_name}');")
|
||||
index_info = cursor.fetchall()
|
||||
|
||||
add_index = {"index_name": index_name}
|
||||
for index_columns in index_info:
|
||||
seqno, cid, name = index_columns
|
||||
if origin == "u": # Created by a UNIQUE constraint
|
||||
have_columns[name]["unique"] = 1
|
||||
else:
|
||||
if "column_1" not in add_index:
|
||||
add_index["column_1"] = name
|
||||
elif "column_2" not in add_index:
|
||||
add_index["column_2"] = name
|
||||
elif "column_3" not in add_index:
|
||||
add_index["column_3"] = name
|
||||
else:
|
||||
raise RuntimeError("Add more index columns.")
|
||||
if origin == "c":
|
||||
if "indices" not in table:
|
||||
have_table["indices"] = []
|
||||
have_table["indices"].append(add_index)
|
||||
|
||||
have_tables[table_name] = have_table
|
||||
|
||||
for table_name, table in expect_schema.items():
|
||||
if table_name not in have_tables:
|
||||
self.log.info(f"Creating table {table_name}.")
|
||||
create_table(cursor, table_name, table)
|
||||
continue
|
||||
|
||||
have_table = have_tables[table_name]
|
||||
have_columns = have_table["columns"]
|
||||
for colname, column in table["columns"].items():
|
||||
if colname not in have_columns:
|
||||
col_type = column["type"]
|
||||
self.log.info(f"Adding column {colname} to table {table_name}.")
|
||||
cursor.execute(
|
||||
f"ALTER TABLE {table_name} ADD COLUMN {colname} {col_type}"
|
||||
)
|
||||
indices = table.get("indices", [])
|
||||
have_indices = have_table.get("indices", [])
|
||||
for index in indices:
|
||||
index_name = index["index_name"]
|
||||
if not any(
|
||||
have_idx.get("index_name") == index_name
|
||||
for have_idx in have_indices
|
||||
):
|
||||
self.log.info(f"Adding index {index_name} to table {table_name}.")
|
||||
column_1 = index["column_1"]
|
||||
column_2 = index.get("column_2", None)
|
||||
column_3 = index.get("column_3", None)
|
||||
query: str = (
|
||||
f"CREATE INDEX {index_name} ON {table_name} ({column_1}"
|
||||
)
|
||||
if column_2:
|
||||
query += f", {column_2}"
|
||||
if column_3:
|
||||
query += f", {column_3}"
|
||||
query += ")"
|
||||
cursor.execute(query)
|
||||
|
||||
upgradeDatabaseFromSchema(self, cursor, expect_schema)
|
||||
if CURRENT_DB_VERSION != db_version:
|
||||
self.db_version = CURRENT_DB_VERSION
|
||||
self.setIntKV("db_version", CURRENT_DB_VERSION, cursor)
|
||||
|
||||
@@ -235,6 +235,14 @@ class BTCInterface(Secp256k1Interface):
|
||||
def txoType():
|
||||
return CTxOut
|
||||
|
||||
@staticmethod
|
||||
def outpointType():
|
||||
return COutPoint
|
||||
|
||||
@staticmethod
|
||||
def txiType():
|
||||
return CTxIn
|
||||
|
||||
@staticmethod
|
||||
def getExpectedSequence(lockType: int, lockVal: int) -> int:
|
||||
ensure(lockVal >= 1, "Bad lockVal")
|
||||
@@ -1203,7 +1211,7 @@ class BTCInterface(Secp256k1Interface):
|
||||
ensure(C == Kaf, "Bad script pubkey")
|
||||
|
||||
fee_paid = swap_value - locked_coin
|
||||
assert fee_paid > 0
|
||||
ensure(fee_paid > 0, "negative fee_paid")
|
||||
|
||||
dummy_witness_stack = self.getScriptLockTxDummyWitness(prevout_script)
|
||||
witness_bytes = self.getWitnessStackSerialisedLength(dummy_witness_stack)
|
||||
@@ -1267,7 +1275,7 @@ class BTCInterface(Secp256k1Interface):
|
||||
tx_value = tx.vout[0].nValue
|
||||
|
||||
fee_paid = prevout_value - tx_value
|
||||
assert fee_paid > 0
|
||||
ensure(fee_paid > 0, "negative fee_paid")
|
||||
|
||||
dummy_witness_stack = self.getScriptLockRefundSpendTxDummyWitness(
|
||||
prevout_script
|
||||
@@ -2575,12 +2583,7 @@ class BTCInterface(Secp256k1Interface):
|
||||
self._log.id(bytes.fromhex(tx["txid"]))
|
||||
)
|
||||
)
|
||||
self.rpc(
|
||||
"sendrawtransaction",
|
||||
[
|
||||
tx_signed,
|
||||
],
|
||||
)
|
||||
self.publishTx(tx_signed)
|
||||
|
||||
return tx["txid"]
|
||||
|
||||
|
||||
@@ -952,6 +952,32 @@ def js_notifications(self, url_split, post_string, is_json) -> bytes:
|
||||
return bytes(json.dumps(swap_client.getNotifications()), "UTF-8")
|
||||
|
||||
|
||||
def js_updatestatus(self, url_split, post_string, is_json) -> bytes:
|
||||
swap_client = self.server.swap_client
|
||||
from basicswap import __version__
|
||||
|
||||
return bytes(
|
||||
json.dumps(
|
||||
{
|
||||
"update_available": swap_client._update_available,
|
||||
"current_version": __version__,
|
||||
"latest_version": swap_client._latest_version,
|
||||
"release_url": (
|
||||
f"https://github.com/basicswap/basicswap/releases/tag/v{swap_client._latest_version}"
|
||||
if swap_client._latest_version
|
||||
else None
|
||||
),
|
||||
"release_notes": (
|
||||
f"New version v{swap_client._latest_version} is available. Click to view details on GitHub."
|
||||
if swap_client._latest_version
|
||||
else None
|
||||
),
|
||||
}
|
||||
),
|
||||
"UTF-8",
|
||||
)
|
||||
|
||||
|
||||
def js_identities(self, url_split, post_string: str, is_json: bool) -> bytes:
|
||||
swap_client = self.server.swap_client
|
||||
swap_client.checkSystemStatus()
|
||||
@@ -1559,6 +1585,7 @@ endpoints = {
|
||||
"rateslist": js_rates_list,
|
||||
"generatenotification": js_generatenotification,
|
||||
"checkupdates": js_checkupdates,
|
||||
"updatestatus": js_updatestatus,
|
||||
"notifications": js_notifications,
|
||||
"identities": js_identities,
|
||||
"automationstrategies": js_automationstrategies,
|
||||
|
||||
@@ -191,17 +191,11 @@ def setDLEAG(xmr_swap, ci_to, kbsf: bytes) -> None:
|
||||
xmr_swap.kbsf_dleag = ci_to.proveDLEAG(kbsf)
|
||||
xmr_swap.pkasf = xmr_swap.kbsf_dleag[0:33]
|
||||
elif ci_to.curve_type() == Curves.secp256k1:
|
||||
for i in range(10):
|
||||
xmr_swap.kbsf_dleag = ci_to.signRecoverable(
|
||||
kbsf, "proof kbsf owned for swap"
|
||||
)
|
||||
pk_recovered: bytes = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsf_dleag, "proof kbsf owned for swap"
|
||||
)
|
||||
if pk_recovered == xmr_swap.pkbsf:
|
||||
break
|
||||
# self.log.debug('kbsl recovered pubkey mismatch, retrying.')
|
||||
assert pk_recovered == xmr_swap.pkbsf
|
||||
xmr_swap.kbsf_dleag = ci_to.signRecoverable(kbsf, "proof kbsf owned for swap")
|
||||
pk_recovered: bytes = ci_to.verifySigAndRecover(
|
||||
xmr_swap.kbsf_dleag, "proof kbsf owned for swap"
|
||||
)
|
||||
ensure(pk_recovered == xmr_swap.pkbsf, "kbsf recovered pubkey mismatch")
|
||||
xmr_swap.pkasf = xmr_swap.pkbsf
|
||||
else:
|
||||
raise ValueError("Unknown curve")
|
||||
|
||||
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 848 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 906 B |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 810 B |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 968 B |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 943 B |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 743 B After Width: | Height: | Size: 989 B |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 5.3 KiB |
@@ -321,6 +321,7 @@ function ensureToastContainer() {
|
||||
updateHistoryDropdown();
|
||||
|
||||
this.initializeBalanceTracking();
|
||||
this.checkForPendingUpdateNotification();
|
||||
|
||||
if (window.CleanupManager) {
|
||||
window.CleanupManager.registerResource('notificationManager', this, (mgr) => {
|
||||
@@ -331,6 +332,29 @@ function ensureToastContainer() {
|
||||
return this;
|
||||
},
|
||||
|
||||
checkForPendingUpdateNotification: function() {
|
||||
CleanupManager.setTimeout(async () => {
|
||||
try {
|
||||
const response = await fetch('/json/updatestatus');
|
||||
const updateStatus = await response.json();
|
||||
|
||||
if (updateStatus.update_available && config.showUpdateNotifications) {
|
||||
this.createToast(
|
||||
`Update Available: v${updateStatus.latest_version}`,
|
||||
'update_available',
|
||||
{
|
||||
subtitle: `Current: v${updateStatus.current_version} • Click to view release`,
|
||||
releaseUrl: updateStatus.release_url,
|
||||
releaseNotes: updateStatus.release_notes
|
||||
}
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error checking for pending update notification:', error);
|
||||
}
|
||||
}, 2000);
|
||||
},
|
||||
|
||||
updateSettings: function(newSettings) {
|
||||
saveConfig(newSettings);
|
||||
return this;
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
|
||||
<div class="py-2">
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" id="check_updates" name="check_updates" value="true" class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"{% if general_settings.check_updates %} checked{% endif %}>
|
||||
<input type="checkbox" id="check_updates" name="check_updates" value="true" class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"{% if notification_settings.check_updates %} checked{% endif %}>
|
||||
<label for="check_updates" class="ml-3 text-sm font-medium text-gray-700 dark:text-gray-300">Update Notifications</label>
|
||||
<button type="button" data-check-updates class="ml-3 text-xs bg-gray-600 hover:bg-gray-700 text-white font-medium py-1 px-3 rounded transition-colors focus:outline-none">
|
||||
Check Now
|
||||
|
||||
51
basicswap/types.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (c) 2025 The Basicswap developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
class WatchedOutput: # Watch for spends
|
||||
__slots__ = ("bid_id", "txid_hex", "vout", "tx_type", "swap_type")
|
||||
|
||||
def __init__(self, bid_id: bytes, txid_hex: str, vout, tx_type, swap_type):
|
||||
self.bid_id = bid_id
|
||||
self.txid_hex = txid_hex
|
||||
self.vout = vout
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
|
||||
|
||||
class WatchedScript: # Watch for txns containing outputs
|
||||
__slots__ = ("bid_id", "script", "tx_type", "swap_type")
|
||||
|
||||
def __init__(self, bid_id: bytes, script: bytes, tx_type, swap_type):
|
||||
self.bid_id = bid_id
|
||||
self.script = script
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
|
||||
|
||||
class WatchedTransaction:
|
||||
__slots__ = (
|
||||
"bid_id",
|
||||
"coin_type",
|
||||
"txid_hex",
|
||||
"tx_type",
|
||||
"swap_type",
|
||||
"block_hash",
|
||||
"depth",
|
||||
)
|
||||
|
||||
# TODO
|
||||
# Watch for presence in mempool (getrawtransaction)
|
||||
def __init__(
|
||||
self, bid_id: bytes, coin_type: int, txid_hex: str, tx_type, swap_type
|
||||
):
|
||||
self.bid_id = bid_id
|
||||
self.coin_type = coin_type
|
||||
self.txid_hex = txid_hex
|
||||
self.tx_type = tx_type
|
||||
self.swap_type = swap_type
|
||||
self.block_hash = None
|
||||
self.depth = -1
|
||||
@@ -92,7 +92,7 @@ def page_settings(self, url_split, post_string):
|
||||
get_data_entry_or(form_data, "notifications_duration", "20")
|
||||
),
|
||||
"check_updates": toBool(
|
||||
get_data_entry_or(form_data, "check_updates", "true")
|
||||
get_data_entry_or(form_data, "check_updates", "false")
|
||||
),
|
||||
}
|
||||
swap_client.editGeneralSettings(data)
|
||||
@@ -242,6 +242,7 @@ def page_settings(self, url_split, post_string):
|
||||
"notifications_duration": swap_client.settings.get(
|
||||
"notifications_duration", 20
|
||||
),
|
||||
"check_updates": swap_client.settings.get("check_updates", True),
|
||||
}
|
||||
|
||||
tor_control_password = (
|
||||
|
||||
@@ -168,7 +168,7 @@ Install Homebrew (See https://brew.sh/):
|
||||
|
||||
Dependencies:
|
||||
|
||||
brew install python git gnupg pkg-config jq
|
||||
brew install python git gnupg pkg-config jq zeromq
|
||||
|
||||
Close the terminal and open a new one to update the python symlinks.
|
||||
|
||||
|
||||
@@ -13,4 +13,4 @@ VOLUME $MONERO_DATA
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
CMD ["/monero/monero-wallet-rpc", "--non-interactive", "--config-file=/data/monero_wallet.conf", "--confirm-external-bind"]
|
||||
CMD ["/monero/monero-wallet-rpc", "--config-file=/data/monero_wallet.conf", "--confirm-external-bind"]
|
||||
|
||||
@@ -13,4 +13,4 @@ VOLUME $WOWNERO_DATA
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
CMD ["/wownero/wownero-wallet-rpc", "--non-interactive", "--config-file=/data/wownero-wallet-rpc.conf", "--confirm-external-bind"]
|
||||
CMD ["/wownero/wownero-wallet-rpc", "--config-file=/data/wownero-wallet-rpc.conf", "--confirm-external-bind"]
|
||||
|
||||
6
guix.scm
@@ -135,15 +135,15 @@
|
||||
(define-public basicswap
|
||||
(package
|
||||
(name "basicswap")
|
||||
(version "0.15.0")
|
||||
(version "0.15.1")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/basicswap/basicswap")
|
||||
(commit "336e92fff6faaf644d09438e4bcccffcea723cf0")))
|
||||
(commit "0bc9d3a5db40f54d79e2ab18be58b6bbc20740d1")))
|
||||
(sha256
|
||||
(base32
|
||||
"1x75jj7bf7f488dm77b3pb4pd7a50pxnwmp144mv9g2x455pjbc2"))
|
||||
"1x6c6hynvbayq4cyv9s6vwgsgdmhm7r1av6iy7pax103lj20habf"))
|
||||
(file-name (git-file-name name version))))
|
||||
(build-system pyproject-build-system)
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ dev = [
|
||||
"pre-commit",
|
||||
"pytest",
|
||||
"ruff",
|
||||
"black==25.9.0",
|
||||
"black==25.11.0",
|
||||
"selenium",
|
||||
]
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
pyzmq==26.2.1
|
||||
pyzmq==27.1.0
|
||||
python-gnupg==0.5.5
|
||||
Jinja2==3.1.6
|
||||
pycryptodome==3.23.0
|
||||
PySocks==1.7.1
|
||||
websocket-client==1.9.0
|
||||
coincurve@https://github.com/basicswap/coincurve/archive/refs/tags/basicswap_v0.2.zip
|
||||
coincurve@https://github.com/basicswap/coincurve/archive/refs/tags/basicswap_v0.3.zip
|
||||
|
||||
376
requirements.txt
@@ -4,81 +4,8 @@
|
||||
#
|
||||
# pip-compile --generate-hashes --output-file=requirements.txt requirements.in
|
||||
#
|
||||
asn1crypto==1.5.1 \
|
||||
--hash=sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c \
|
||||
--hash=sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67
|
||||
# via coincurve
|
||||
cffi==1.17.1 \
|
||||
--hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \
|
||||
--hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \
|
||||
--hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \
|
||||
--hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \
|
||||
--hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \
|
||||
--hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \
|
||||
--hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \
|
||||
--hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \
|
||||
--hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \
|
||||
--hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \
|
||||
--hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \
|
||||
--hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \
|
||||
--hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \
|
||||
--hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \
|
||||
--hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \
|
||||
--hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \
|
||||
--hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \
|
||||
--hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \
|
||||
--hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \
|
||||
--hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \
|
||||
--hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \
|
||||
--hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \
|
||||
--hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \
|
||||
--hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \
|
||||
--hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \
|
||||
--hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \
|
||||
--hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \
|
||||
--hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \
|
||||
--hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \
|
||||
--hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \
|
||||
--hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \
|
||||
--hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \
|
||||
--hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \
|
||||
--hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \
|
||||
--hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \
|
||||
--hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \
|
||||
--hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \
|
||||
--hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \
|
||||
--hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \
|
||||
--hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \
|
||||
--hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \
|
||||
--hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \
|
||||
--hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \
|
||||
--hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \
|
||||
--hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \
|
||||
--hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \
|
||||
--hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \
|
||||
--hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \
|
||||
--hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \
|
||||
--hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \
|
||||
--hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \
|
||||
--hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \
|
||||
--hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \
|
||||
--hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \
|
||||
--hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \
|
||||
--hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \
|
||||
--hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \
|
||||
--hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \
|
||||
--hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \
|
||||
--hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \
|
||||
--hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \
|
||||
--hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \
|
||||
--hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \
|
||||
--hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \
|
||||
--hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \
|
||||
--hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \
|
||||
--hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b
|
||||
# via coincurve
|
||||
coincurve @ https://github.com/basicswap/coincurve/archive/refs/tags/basicswap_v0.2.zip \
|
||||
--hash=sha256:c309deef22c929c9ab5b3adf7adbda940bffcea6c6ec7c66202d6c3d4e3ceb79
|
||||
coincurve @ https://github.com/basicswap/coincurve/archive/refs/tags/basicswap_v0.3.zip \
|
||||
--hash=sha256:41e40a335994112938984097b089142acceb24324d76a7e35d8b9d14c2cfa8b5
|
||||
# via -r requirements.in
|
||||
jinja2==3.1.6 \
|
||||
--hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \
|
||||
@@ -147,10 +74,6 @@ markupsafe==3.0.2 \
|
||||
--hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \
|
||||
--hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50
|
||||
# via jinja2
|
||||
pycparser==2.22 \
|
||||
--hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \
|
||||
--hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc
|
||||
# via cffi
|
||||
pycryptodome==3.23.0 \
|
||||
--hash=sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4 \
|
||||
--hash=sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c \
|
||||
@@ -203,116 +126,191 @@ python-gnupg==0.5.5 \
|
||||
--hash=sha256:3fdcaf76f60a1b948ff8e37dc398d03cf9ce7427065d583082b92da7a4ff5a63 \
|
||||
--hash=sha256:51fa7b8831ff0914bc73d74c59b99c613de7247b91294323c39733bb85ac3fc1
|
||||
# via -r requirements.in
|
||||
pyzmq==26.2.1 \
|
||||
--hash=sha256:000760e374d6f9d1a3478a42ed0c98604de68c9e94507e5452951e598ebecfba \
|
||||
--hash=sha256:004837cb958988c75d8042f5dac19a881f3d9b3b75b2f574055e22573745f841 \
|
||||
--hash=sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e \
|
||||
--hash=sha256:03719e424150c6395b9513f53a5faadcc1ce4b92abdf68987f55900462ac7eec \
|
||||
--hash=sha256:0995fd3530f2e89d6b69a2202e340bbada3191014352af978fa795cb7a446331 \
|
||||
--hash=sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23 \
|
||||
--hash=sha256:09dac387ce62d69bec3f06d51610ca1d660e7849eb45f68e38e7f5cf1f49cbcb \
|
||||
--hash=sha256:0b2007f28ce1b8acebdf4812c1aab997a22e57d6a73b5f318b708ef9bcabbe95 \
|
||||
--hash=sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3 \
|
||||
--hash=sha256:0f50db737d688e96ad2a083ad2b453e22865e7e19c7f17d17df416e91ddf67eb \
|
||||
--hash=sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf \
|
||||
--hash=sha256:1238c2448c58b9c8d6565579393148414a42488a5f916b3f322742e561f6ae0d \
|
||||
--hash=sha256:160194d1034902937359c26ccfa4e276abffc94937e73add99d9471e9f555dd6 \
|
||||
--hash=sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca \
|
||||
--hash=sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460 \
|
||||
--hash=sha256:1c6ae0e95d0a4b0cfe30f648a18e764352d5415279bdf34424decb33e79935b8 \
|
||||
--hash=sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a \
|
||||
--hash=sha256:1fd4b3efc6f62199886440d5e27dd3ccbcb98dfddf330e7396f1ff421bfbb3c2 \
|
||||
--hash=sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e \
|
||||
--hash=sha256:269c14904da971cb5f013100d1aaedb27c0a246728c341d5d61ddd03f463f2f3 \
|
||||
--hash=sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a \
|
||||
--hash=sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435 \
|
||||
--hash=sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6 \
|
||||
--hash=sha256:31fff709fef3b991cfe7189d2cfe0c413a1d0e82800a182cfa0c2e3668cd450f \
|
||||
--hash=sha256:361edfa350e3be1f987e592e834594422338d7174364763b7d3de5b0995b16f3 \
|
||||
--hash=sha256:36d4e7307db7c847fe37413f333027d31c11d5e6b3bacbb5022661ac635942ba \
|
||||
--hash=sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8 \
|
||||
--hash=sha256:380816d298aed32b1a97b4973a4865ef3be402a2e760204509b52b6de79d755d \
|
||||
--hash=sha256:3ef584f13820d2629326fe20cc04069c21c5557d84c26e277cfa6235e523b10f \
|
||||
--hash=sha256:3fe6e28a8856aea808715f7a4fc11f682b9d29cac5d6262dd8fe4f98edc12d53 \
|
||||
--hash=sha256:44dba28c34ce527cf687156c81f82bf1e51f047838d5964f6840fd87dfecf9fe \
|
||||
--hash=sha256:45fad32448fd214fbe60030aa92f97e64a7140b624290834cc9b27b3a11f9473 \
|
||||
--hash=sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4 \
|
||||
--hash=sha256:49135bb327fca159262d8fd14aa1f4a919fe071b04ed08db4c7c37d2f0647162 \
|
||||
--hash=sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a \
|
||||
--hash=sha256:4eb3197f694dfb0ee6af29ef14a35f30ae94ff67c02076eef8125e2d98963cd0 \
|
||||
--hash=sha256:51431f6b2750eb9b9d2b2952d3cc9b15d0215e1b8f37b7a3239744d9b487325d \
|
||||
--hash=sha256:574b285150afdbf0a0424dddf7ef9a0d183988eb8d22feacb7160f7515e032cb \
|
||||
--hash=sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399 \
|
||||
--hash=sha256:59660e15c797a3b7a571c39f8e0b62a1f385f98ae277dfe95ca7eaf05b5a0f12 \
|
||||
--hash=sha256:5b4fc44f5360784cc02392f14235049665caaf7c0fe0b04d313e763d3338e463 \
|
||||
--hash=sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7 \
|
||||
--hash=sha256:637536c07d2fb6a354988b2dd1d00d02eb5dd443f4bbee021ba30881af1c28aa \
|
||||
--hash=sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be \
|
||||
--hash=sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce \
|
||||
--hash=sha256:6d75fcb00a1537f8b0c0bb05322bc7e35966148ffc3e0362f0369e44a4a1de99 \
|
||||
--hash=sha256:70b3a46ecd9296e725ccafc17d732bfc3cdab850b54bd913f843a0a54dfb2c04 \
|
||||
--hash=sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da \
|
||||
--hash=sha256:7c6160fe513654e65665332740f63de29ce0d165e053c0c14a161fa60dd0da01 \
|
||||
--hash=sha256:7ebdd96bd637fd426d60e86a29ec14b8c1ab64b8d972f6a020baf08a30d1cf46 \
|
||||
--hash=sha256:7f18ce33f422d119b13c1363ed4cce245b342b2c5cbbb76753eabf6aa6f69c7d \
|
||||
--hash=sha256:80a00370a2ef2159c310e662c7c0f2d030f437f35f478bb8b2f70abd07e26b24 \
|
||||
--hash=sha256:817fcd3344d2a0b28622722b98500ae9c8bfee0f825b8450932ff19c0b15bebd \
|
||||
--hash=sha256:8531ed35dfd1dd2af95f5d02afd6545e8650eedbf8c3d244a554cf47d8924459 \
|
||||
--hash=sha256:866c12b7c90dd3a86983df7855c6f12f9407c8684db6aa3890fc8027462bda82 \
|
||||
--hash=sha256:88812b3b257f80444a986b3596e5ea5c4d4ed4276d2b85c153a6fbc5ca457ae7 \
|
||||
--hash=sha256:8b0f5bab40a16e708e78a0c6ee2425d27e1a5d8135c7a203b4e977cee37eb4aa \
|
||||
--hash=sha256:8bacc1a10c150d58e8a9ee2b2037a70f8d903107e0f0b6e079bf494f2d09c091 \
|
||||
--hash=sha256:8ec8e3aea6146b761d6c57fcf8f81fcb19f187afecc19bf1701a48db9617a217 \
|
||||
--hash=sha256:8eddb3784aed95d07065bcf94d07e8c04024fdb6b2386f08c197dfe6b3528fda \
|
||||
--hash=sha256:9027a7fcf690f1a3635dc9e55e38a0d6602dbbc0548935d08d46d2e7ec91f454 \
|
||||
--hash=sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a \
|
||||
--hash=sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e \
|
||||
--hash=sha256:95f5728b367a042df146cec4340d75359ec6237beebf4a8f5cf74657c65b9257 \
|
||||
--hash=sha256:95f7b01b3f275504011cf4cf21c6b885c8d627ce0867a7e83af1382ebab7b3ff \
|
||||
--hash=sha256:97cbb368fd0debdbeb6ba5966aa28e9a1ae3396c7386d15569a6ca4be4572b99 \
|
||||
--hash=sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891 \
|
||||
--hash=sha256:9fbdb90b85c7624c304f72ec7854659a3bd901e1c0ffb2363163779181edeb68 \
|
||||
--hash=sha256:a003200b6cd64e89b5725ff7e284a93ab24fd54bbac8b4fa46b1ed57be693c27 \
|
||||
--hash=sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13 \
|
||||
--hash=sha256:a23948554c692df95daed595fdd3b76b420a4939d7a8a28d6d7dea9711878641 \
|
||||
--hash=sha256:a4bffcadfd40660f26d1b3315a6029fd4f8f5bf31a74160b151f5c577b2dc81b \
|
||||
--hash=sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3 \
|
||||
--hash=sha256:a7ad34a2921e8f76716dc7205c9bf46a53817e22b9eec2e8a3e08ee4f4a72468 \
|
||||
--hash=sha256:abf7b5942c6b0dafcc2823ddd9154f419147e24f8df5b41ca8ea40a6db90615c \
|
||||
--hash=sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad \
|
||||
--hash=sha256:baa1da72aecf6a490b51fba7a51f1ce298a1e0e86d0daef8265c8f8f9848eb77 \
|
||||
--hash=sha256:bd8fdee945b877aa3bffc6a5a8816deb048dab0544f9df3731ecd0e54d8c84c9 \
|
||||
--hash=sha256:bdbc78ae2065042de48a65f1421b8af6b76a0386bb487b41955818c3c1ce7bed \
|
||||
--hash=sha256:c059883840e634a21c5b31d9b9a0e2b48f991b94d60a811092bc37992715146a \
|
||||
--hash=sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e \
|
||||
--hash=sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09 \
|
||||
--hash=sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab \
|
||||
--hash=sha256:cdb69710e462a38e6039cf17259d328f86383a06c20482cc154327968712273c \
|
||||
--hash=sha256:ceb0d78b7ef106708a7e2c2914afe68efffc0051dc6a731b0dbacd8b4aee6d68 \
|
||||
--hash=sha256:d14f50d61a89b0925e4d97a0beba6053eb98c426c5815d949a43544f05a0c7ec \
|
||||
--hash=sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9 \
|
||||
--hash=sha256:d9da0289d8201c8a29fd158aaa0dfe2f2e14a181fd45e2dc1fbf969a62c1d594 \
|
||||
--hash=sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5 \
|
||||
--hash=sha256:e76ad4729c2f1cf74b6eb1bdd05f6aba6175999340bd51e6caee49a435a13bf5 \
|
||||
--hash=sha256:e7eeaef81530d0b74ad0d29eec9997f1c9230c2f27242b8d17e0ee67662c8f6e \
|
||||
--hash=sha256:e8e47050412f0ad3a9b2287779758073cbf10e460d9f345002d4779e43bb0136 \
|
||||
--hash=sha256:ed038a921df836d2f538e509a59cb638df3e70ca0fcd70d0bf389dfcdf784d2a \
|
||||
--hash=sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb \
|
||||
--hash=sha256:ee7152f32c88e0e1b5b17beb9f0e2b14454235795ef68c0c120b6d3d23d12833 \
|
||||
--hash=sha256:eeb37f65350d5c5870517f02f8bbb2ac0fbec7b416c0f4875219fef305a89a45 \
|
||||
--hash=sha256:ef29630fde6022471d287c15c0a2484aba188adbfb978702624ba7a54ddfa6c1 \
|
||||
--hash=sha256:ef5479fac31df4b304e96400fc67ff08231873ee3537544aa08c30f9d22fce38 \
|
||||
--hash=sha256:f0019cc804ac667fb8c8eaecdb66e6d4a68acf2e155d5c7d6381a5645bd93ae4 \
|
||||
--hash=sha256:f0f19c2097fffb1d5b07893d75c9ee693e9cbc809235cf3f2267f0ef6b015f24 \
|
||||
--hash=sha256:f19dae58b616ac56b96f2e2290f2d18730a898a171f447f491cc059b073ca1fa \
|
||||
--hash=sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce \
|
||||
--hash=sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9 \
|
||||
--hash=sha256:f32718ee37c07932cc336096dc7403525301fd626349b6eff8470fe0f996d8d7 \
|
||||
--hash=sha256:f39d1227e8256d19899d953e6e19ed2ccb689102e6d85e024da5acf410f301eb \
|
||||
--hash=sha256:f5eeeb82feec1fc5cbafa5ee9022e87ffdb3a8c48afa035b356fcd20fc7f533f \
|
||||
--hash=sha256:f92a002462154c176dac63a8f1f6582ab56eb394ef4914d65a9417f5d9fde218 \
|
||||
--hash=sha256:f9ba5def063243793dec6603ad1392f735255cbc7202a3a484c14f99ec290705 \
|
||||
--hash=sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8
|
||||
pyzmq==27.1.0 \
|
||||
--hash=sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d \
|
||||
--hash=sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d \
|
||||
--hash=sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8 \
|
||||
--hash=sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8 \
|
||||
--hash=sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e \
|
||||
--hash=sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e \
|
||||
--hash=sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba \
|
||||
--hash=sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba \
|
||||
--hash=sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581 \
|
||||
--hash=sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581 \
|
||||
--hash=sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05 \
|
||||
--hash=sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05 \
|
||||
--hash=sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386 \
|
||||
--hash=sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386 \
|
||||
--hash=sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db \
|
||||
--hash=sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db \
|
||||
--hash=sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28 \
|
||||
--hash=sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28 \
|
||||
--hash=sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e \
|
||||
--hash=sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e \
|
||||
--hash=sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea \
|
||||
--hash=sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea \
|
||||
--hash=sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b \
|
||||
--hash=sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b \
|
||||
--hash=sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066 \
|
||||
--hash=sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066 \
|
||||
--hash=sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97 \
|
||||
--hash=sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97 \
|
||||
--hash=sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0 \
|
||||
--hash=sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0 \
|
||||
--hash=sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113 \
|
||||
--hash=sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113 \
|
||||
--hash=sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92 \
|
||||
--hash=sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92 \
|
||||
--hash=sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3 \
|
||||
--hash=sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3 \
|
||||
--hash=sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86 \
|
||||
--hash=sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86 \
|
||||
--hash=sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd \
|
||||
--hash=sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd \
|
||||
--hash=sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc \
|
||||
--hash=sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc \
|
||||
--hash=sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233 \
|
||||
--hash=sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233 \
|
||||
--hash=sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345 \
|
||||
--hash=sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345 \
|
||||
--hash=sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31 \
|
||||
--hash=sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31 \
|
||||
--hash=sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74 \
|
||||
--hash=sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74 \
|
||||
--hash=sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc \
|
||||
--hash=sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc \
|
||||
--hash=sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429 \
|
||||
--hash=sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429 \
|
||||
--hash=sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381 \
|
||||
--hash=sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381 \
|
||||
--hash=sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172 \
|
||||
--hash=sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172 \
|
||||
--hash=sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b \
|
||||
--hash=sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b \
|
||||
--hash=sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556 \
|
||||
--hash=sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556 \
|
||||
--hash=sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4 \
|
||||
--hash=sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4 \
|
||||
--hash=sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27 \
|
||||
--hash=sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27 \
|
||||
--hash=sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c \
|
||||
--hash=sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c \
|
||||
--hash=sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd \
|
||||
--hash=sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd \
|
||||
--hash=sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e \
|
||||
--hash=sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e \
|
||||
--hash=sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526 \
|
||||
--hash=sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526 \
|
||||
--hash=sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e \
|
||||
--hash=sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e \
|
||||
--hash=sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f \
|
||||
--hash=sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f \
|
||||
--hash=sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128 \
|
||||
--hash=sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128 \
|
||||
--hash=sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96 \
|
||||
--hash=sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96 \
|
||||
--hash=sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f \
|
||||
--hash=sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f \
|
||||
--hash=sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027 \
|
||||
--hash=sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027 \
|
||||
--hash=sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa \
|
||||
--hash=sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa \
|
||||
--hash=sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f \
|
||||
--hash=sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f \
|
||||
--hash=sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50 \
|
||||
--hash=sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50 \
|
||||
--hash=sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c \
|
||||
--hash=sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c \
|
||||
--hash=sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2 \
|
||||
--hash=sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2 \
|
||||
--hash=sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146 \
|
||||
--hash=sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146 \
|
||||
--hash=sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d \
|
||||
--hash=sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d \
|
||||
--hash=sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97 \
|
||||
--hash=sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97 \
|
||||
--hash=sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5 \
|
||||
--hash=sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5 \
|
||||
--hash=sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098 \
|
||||
--hash=sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098 \
|
||||
--hash=sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb \
|
||||
--hash=sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb \
|
||||
--hash=sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32 \
|
||||
--hash=sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32 \
|
||||
--hash=sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62 \
|
||||
--hash=sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62 \
|
||||
--hash=sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf \
|
||||
--hash=sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf \
|
||||
--hash=sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312 \
|
||||
--hash=sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312 \
|
||||
--hash=sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda \
|
||||
--hash=sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda \
|
||||
--hash=sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540 \
|
||||
--hash=sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540 \
|
||||
--hash=sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604 \
|
||||
--hash=sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604 \
|
||||
--hash=sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0 \
|
||||
--hash=sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0 \
|
||||
--hash=sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db \
|
||||
--hash=sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db \
|
||||
--hash=sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78 \
|
||||
--hash=sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78 \
|
||||
--hash=sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f \
|
||||
--hash=sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f \
|
||||
--hash=sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef \
|
||||
--hash=sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef \
|
||||
--hash=sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2 \
|
||||
--hash=sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2 \
|
||||
--hash=sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78 \
|
||||
--hash=sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78 \
|
||||
--hash=sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b \
|
||||
--hash=sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b \
|
||||
--hash=sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f \
|
||||
--hash=sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f \
|
||||
--hash=sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6 \
|
||||
--hash=sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6 \
|
||||
--hash=sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39 \
|
||||
--hash=sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39 \
|
||||
--hash=sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f \
|
||||
--hash=sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f \
|
||||
--hash=sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355 \
|
||||
--hash=sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355 \
|
||||
--hash=sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a \
|
||||
--hash=sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a \
|
||||
--hash=sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a \
|
||||
--hash=sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a \
|
||||
--hash=sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856 \
|
||||
--hash=sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856 \
|
||||
--hash=sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9 \
|
||||
--hash=sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9 \
|
||||
--hash=sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968 \
|
||||
--hash=sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968 \
|
||||
--hash=sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7 \
|
||||
--hash=sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7 \
|
||||
--hash=sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1 \
|
||||
--hash=sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1 \
|
||||
--hash=sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266 \
|
||||
--hash=sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266 \
|
||||
--hash=sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831 \
|
||||
--hash=sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831 \
|
||||
--hash=sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f \
|
||||
--hash=sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f \
|
||||
--hash=sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7 \
|
||||
--hash=sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7 \
|
||||
--hash=sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394 \
|
||||
--hash=sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394 \
|
||||
--hash=sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07 \
|
||||
--hash=sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07 \
|
||||
--hash=sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496 \
|
||||
--hash=sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496 \
|
||||
--hash=sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90 \
|
||||
--hash=sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90 \
|
||||
--hash=sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271 \
|
||||
--hash=sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271 \
|
||||
--hash=sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6 \
|
||||
--hash=sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6 \
|
||||
--hash=sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9 \
|
||||
--hash=sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9
|
||||
# via -r requirements.in
|
||||
websocket-client==1.9.0 \
|
||||
--hash=sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98 \
|
||||
|
||||
@@ -94,6 +94,7 @@ class Test(unittest.TestCase):
|
||||
time_val = 48 * 60 * 60
|
||||
encoded = ci.getExpectedSequence(TxLockTypes.SEQUENCE_LOCK_TIME, time_val)
|
||||
decoded = ci.decodeSequence(encoded)
|
||||
assert encoded == 4194642
|
||||
assert decoded >= time_val
|
||||
assert decoded <= time_val + 512
|
||||
|
||||
|
||||
@@ -319,6 +319,7 @@ class Test(BaseTest):
|
||||
test_coin_from = Coins.PART
|
||||
# p2wpkh
|
||||
logging.info("---------- Test {} segwit".format(test_coin_from.name))
|
||||
|
||||
ci = self.swap_clients[0].ci(test_coin_from)
|
||||
|
||||
addr_native = ci.rpc_wallet("getnewaddress", ["p2pkh segwit test"])
|
||||
@@ -329,9 +330,11 @@ class Test(BaseTest):
|
||||
],
|
||||
)
|
||||
assert addr_info["iswitness"] is False # address is p2pkh, not p2wpkh
|
||||
|
||||
addr_segwit = ci.rpc_wallet(
|
||||
"getnewaddress", ["p2wpkh segwit test", True, False, False, "bech32"]
|
||||
)
|
||||
|
||||
addr_info = ci.rpc_wallet(
|
||||
"getaddressinfo",
|
||||
[
|
||||
@@ -351,6 +354,7 @@ class Test(BaseTest):
|
||||
],
|
||||
],
|
||||
)
|
||||
|
||||
assert len(txid) == 64
|
||||
tx_wallet = ci.rpc_wallet(
|
||||
"gettransaction",
|
||||
|
||||