diff --git a/src-xmr-btc-swap/.backupg.git/COMMIT_EDITMSG b/src-xmr-btc-swap/.backupg.git/COMMIT_EDITMSG deleted file mode 100644 index d3d6a7af..00000000 --- a/src-xmr-btc-swap/.backupg.git/COMMIT_EDITMSG +++ /dev/null @@ -1 +0,0 @@ -feat: Prototype connecting frontend and backend diff --git a/src-xmr-btc-swap/.backupg.git/FETCH_HEAD b/src-xmr-btc-swap/.backupg.git/FETCH_HEAD deleted file mode 100644 index a17d90a1..00000000 --- a/src-xmr-btc-swap/.backupg.git/FETCH_HEAD +++ /dev/null @@ -1,62 +0,0 @@ -2824ebc893958513539363da17bfa905d5ed1223 branch 'cooperative-release-of-funds' of https://github.com/patrini32/xmr-btc-swap -53c80609af588edf69f3726db5ecbc1f37528ed9 not-for-merge branch '0.11.x' of https://github.com/patrini32/xmr-btc-swap -35f206ca12040f5c834c3e98baec1b672cf3953a not-for-merge branch 'asb-systemd-setup' of https://github.com/patrini32/xmr-btc-swap -2290f82e16123599503ebea6ae130a5ec50f87df not-for-merge branch 'bump-rustc-version-for-release-bins-ci' of https://github.com/patrini32/xmr-btc-swap -22cdad338bdc89ec0ef94a97789e9e4993915b53 not-for-merge branch 'bungy-corrupted-database' of https://github.com/patrini32/xmr-btc-swap -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 not-for-merge branch 'change-xmr-node-moneroworld' of https://github.com/patrini32/xmr-btc-swap -a2d12b6eab7b1cec31d1e45d27a1d8e3d204d99d not-for-merge branch 'ci' of https://github.com/patrini32/xmr-btc-swap -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 not-for-merge branch 'cleanup-module-boundaries' of https://github.com/patrini32/xmr-btc-swap -fa3b252f76b68bdcb4533968b86c9761db521366 not-for-merge branch 'cooperative-release-of-funds-CI' of https://github.com/patrini32/xmr-btc-swap -4f6ff205802eccf4ca2ab7f124bdf202122085d9 not-for-merge branch 'cooperative-xmr-redeem' of https://github.com/patrini32/xmr-btc-swap -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 not-for-merge branch 'debug-remodel-tor' of https://github.com/patrini32/xmr-btc-swap -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 not-for-merge branch 'debug-remodel-tor-same-port' of https://github.com/patrini32/xmr-btc-swap -7248af949837b1b4afaaae517530b08f5b90f9a8 not-for-merge branch 'demo' of https://github.com/patrini32/xmr-btc-swap -6d6bd93315ef16917e12c268f855fadd05fec71e not-for-merge branch 'dependabot/cargo/bdk-0.29.0' of https://github.com/patrini32/xmr-btc-swap -1594bcb170bf6e85ceb967df73bc894c5e0e35ad not-for-merge branch 'dependabot/cargo/ed25519-dalek-2.1.1' of https://github.com/patrini32/xmr-btc-swap -7e5282c30d420284ee508367c650b6067ee66961 not-for-merge branch 'dependabot/cargo/jsonrpsee-0.22.5' of https://github.com/patrini32/xmr-btc-swap -9059e8bc955ae2cdb77407b73ca6d116a977563c not-for-merge branch 'dependabot/cargo/jsonrpsee-core-0.22.5' of https://github.com/patrini32/xmr-btc-swap -9a1df270cb394c516f474be094ddf9c4f8e6fa19 not-for-merge branch 'dependabot/cargo/libp2p-0.48.0' of https://github.com/patrini32/xmr-btc-swap -1d7f9dfd894cec3d7cad9f84daa63095e5d9eeaf not-for-merge branch 'dependabot/cargo/mockito-1.3.1' of https://github.com/patrini32/xmr-btc-swap -4f58539ca9c3e9bdd0c7286385aec891b4ed8fbb not-for-merge branch 'dependabot/cargo/tokio-1.38.0' of https://github.com/patrini32/xmr-btc-swap -281e83a00bf82fedb780f413dec6dd8d59349e4e not-for-merge branch 'discover-makers-cli' of https://github.com/patrini32/xmr-btc-swap -44570ff5984ee80807e5c7cb05fd84101e61a19a not-for-merge branch 'docs' of https://github.com/patrini32/xmr-btc-swap -427e37d97745089ceffe95a426b8d69c889e14a2 not-for-merge branch 'early-tracing-init' of https://github.com/patrini32/xmr-btc-swap -641274019d956f8bcba3c1c89e55649f6a3a832f not-for-merge branch 'feature/libp2p-release' of https://github.com/patrini32/xmr-btc-swap -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f not-for-merge branch 'fix-confirmations' of https://github.com/patrini32/xmr-btc-swap -2921d61ebc9211d4e0bda3f3dadd42d7e63b572a not-for-merge branch 'kill-monero-rpc-on-signal-receive' of https://github.com/patrini32/xmr-btc-swap -82d75588baddcb515ca989930aa023ed1fda5a2e not-for-merge branch 'manual-sync' of https://github.com/patrini32/xmr-btc-swap -c3b8186c26f395f451f1e09796b23bd60311ddad not-for-merge branch 'master' of https://github.com/patrini32/xmr-btc-swap -427e37d97745089ceffe95a426b8d69c889e14a2 not-for-merge branch 'monero-wallet-rpc-update' of https://github.com/patrini32/xmr-btc-swap -17a4ca0ebb24c234364ca699d089144bca2c43a2 not-for-merge branch 'no-transfer-proof-failure' of https://github.com/patrini32/xmr-btc-swap -7aabc8703d4423aac02b4b09b078786e09e9712e not-for-merge branch 'on-chain-protocol' of https://github.com/patrini32/xmr-btc-swap -e6686b7aa12bbff0d10f5ebeb8fcd7466066cf01 not-for-merge branch 'pr/1427' of https://github.com/patrini32/xmr-btc-swap -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 not-for-merge branch 'print-priv-view-key' of https://github.com/patrini32/xmr-btc-swap -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 not-for-merge branch 'quad9-dns' of https://github.com/patrini32/xmr-btc-swap -4c9372575543d0071950381e5005be77fbca43fc not-for-merge branch 'quote-protocol-libp2p-relay' of https://github.com/patrini32/xmr-btc-swap -de642e542fef00a6c287c8dd760ecc9d51d50e7c not-for-merge branch 'quote-protocol-refactor' of https://github.com/patrini32/xmr-btc-swap -bd943e69616d5b8d39776c0873767f41ec2b678e not-for-merge branch 'quote-websocket' of https://github.com/patrini32/xmr-btc-swap -dd624b1df9cdb709004327f6d12d94b1ca52d86a not-for-merge branch 'random-branch' of https://github.com/patrini32/xmr-btc-swap -c6db22d8822b7d1ad5d7d29d383245d568a14c91 not-for-merge branch 'refactor-network-code' of https://github.com/patrini32/xmr-btc-swap -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f not-for-merge branch 'relay-fee-debug' of https://github.com/patrini32/xmr-btc-swap -a9e0a68e68ccfd5c7a0af9335451db656d672766 not-for-merge branch 'remodel-tor' of https://github.com/patrini32/xmr-btc-swap -971eabf4c2e0506639df6fa18bca2c6c30195c3a not-for-merge branch 'remove-bytes-serde-module' of https://github.com/patrini32/xmr-btc-swap -b0645bb96eb712c947b8b9863eba00a66c445291 not-for-merge branch 'rendezvous-asb-refactor' of https://github.com/patrini32/xmr-btc-swap -0e3e0fb4cb20a810dc864c6b0abba9abfe076add not-for-merge branch 'rendezvous-cli' of https://github.com/patrini32/xmr-btc-swap -7fba6e8fbf4303b26045ab739f7971ae594f0451 not-for-merge branch 'rendezvous-demo' of https://github.com/patrini32/xmr-btc-swap -a3455d6032a6e407769ef9af818dd7f9f1914763 not-for-merge branch 'roc' of https://github.com/patrini32/xmr-btc-swap -3eb4c0db433f78dd65647bf355464959eb5492aa not-for-merge branch 'rpc-server' of https://github.com/patrini32/xmr-btc-swap -24cb1d25209cfad2f1dda3543cb598d5386f6d98 not-for-merge branch 'rpc-server-tracing-log-files' of https://github.com/patrini32/xmr-btc-swap -f1b115b5630672c63dc87c41c53933ec98412d94 not-for-merge branch 'small-ux-improvements' of https://github.com/patrini32/xmr-btc-swap -7be6655d73b415a5307893d5eb4528933ba13d6a not-for-merge branch 'sqlite' of https://github.com/patrini32/xmr-btc-swap -f12879782f6487850814cfa11a14255fbf958415 not-for-merge branch 'sqlite2' of https://github.com/patrini32/xmr-btc-swap -e1c3a5d991b888b70ebfb75a1f3782b4b2013975 not-for-merge branch 'staging' of https://github.com/patrini32/xmr-btc-swap -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 not-for-merge branch 'swap-setup-proto' of https://github.com/patrini32/xmr-btc-swap -832d960543377fd0dfe45902ed02bbcfe32bece4 not-for-merge branch 'swap-setup-proto-rishab' of https://github.com/patrini32/xmr-btc-swap -9e6b56564d7c37e0e8f93990a360155345c74909 not-for-merge branch 'test-refactor' of https://github.com/patrini32/xmr-btc-swap -f3cf0045910b9c26b148e7d193207f8b0751e61a not-for-merge branch 'transfer-proof-acknowledgement' of https://github.com/patrini32/xmr-btc-swap -3d9b984c5ed442966501b65e6f68a9a7104327eb not-for-merge branch 'trying' of https://github.com/patrini32/xmr-btc-swap -f0b4735163528add8d0b651ba482f205e6dbc134 not-for-merge branch 'wait-for-cancel-timelock-when-enc-sig-fails' of https://github.com/patrini32/xmr-btc-swap -2e181dac9cb479883aa7139636188d23acb8f1de not-for-merge branch 'wallet-force-sync-on-first-subscribe' of https://github.com/patrini32/xmr-btc-swap -58fc70e8371247ebaf3aa1b8353a748d3332fe0f not-for-merge branch 'wallet-refresh' of https://github.com/patrini32/xmr-btc-swap -0c501ba2cc94ed7d6982604ede26d349d115f0e3 not-for-merge branch 'xmr-adaptor-signatures' of https://github.com/patrini32/xmr-btc-swap -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 not-for-merge branch 'xmr-adaptor-signatures-publish-on-testnet' of https://github.com/patrini32/xmr-btc-swap diff --git a/src-xmr-btc-swap/.backupg.git/HEAD b/src-xmr-btc-swap/.backupg.git/HEAD deleted file mode 100644 index 346353b6..00000000 --- a/src-xmr-btc-swap/.backupg.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/pr/1676 diff --git a/src-xmr-btc-swap/.backupg.git/ORIG_HEAD b/src-xmr-btc-swap/.backupg.git/ORIG_HEAD deleted file mode 100644 index c7eacc1f..00000000 --- a/src-xmr-btc-swap/.backupg.git/ORIG_HEAD +++ /dev/null @@ -1 +0,0 @@ -5638fd1a51b42573b6c55e24b7978d2b4c2eb19a diff --git a/src-xmr-btc-swap/.backupg.git/REBASE_HEAD b/src-xmr-btc-swap/.backupg.git/REBASE_HEAD deleted file mode 100644 index 3285826b..00000000 --- a/src-xmr-btc-swap/.backupg.git/REBASE_HEAD +++ /dev/null @@ -1 +0,0 @@ -3fb6e284ba6022231abc29d47f0029f19ae45088 diff --git a/src-xmr-btc-swap/.backupg.git/config b/src-xmr-btc-swap/.backupg.git/config deleted file mode 100644 index cd25b46d..00000000 --- a/src-xmr-btc-swap/.backupg.git/config +++ /dev/null @@ -1,112 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true - precomposeunicode = true -[submodule] - active = . -[remote "origin"] - url = https://github.com/comit-network/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[lfs] - repositoryformatversion = 0 -[branch "0.11.x"] - remote = origin - merge = refs/heads/0.11.x -[branch "immediately-fetch-tx-2"] - remote = origin - merge = refs/heads/immediately-fetch-tx-2 -[remote "yama"] - url = https://github.com/yamabiiko/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/yama/* -[branch "rpc-server"] - remote = yama - merge = refs/heads/rpc-server -[branch "monero-rpc-download-0.11x-m1m2"] - remote = origin - merge = refs/heads/monero-rpc-download-0.11x-m1m2 -[remote "delta1upstream"] - url = https://github.com/delta1/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/delta1upstream/* -[branch "sqlx"] - remote = delta1upstream - merge = refs/heads/sqlx -[branch "pr/1417"] - remote = delta1upstream - merge = refs/heads/multi-rendezvous -[branch "multi-rendezvous"] - remote = delta1upstream - merge = refs/heads/multi-rendezvous -[branch "rpc-server-tracing-log-files"] - remote = origin - merge = refs/heads/rpc-server-tracing-log-files -[branch "kill-monero-rpc-on-signal-receive"] - remote = origin - merge = refs/heads/kill-monero-rpc-on-signal-receive -[branch "change-xmr-node-moneroworld"] - remote = origin - merge = refs/heads/change-xmr-node-moneroworld -[branch "cooperative-xmr-redeem"] - remote = origin - merge = refs/heads/cooperative-xmr-redeem -[branch "monero-wallet-refresh-fix"] - remote = origin - merge = refs/heads/monero-wallet-refresh-fix -[remote "delta12"] - url = https://github.com/delta1/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/delta12/* -[branch "issues-1459"] - remote = delta12 - merge = refs/heads/issues-1459 -[branch "wallet-refresh"] - remote = origin - merge = refs/heads/wallet-refresh -[branch "blocking-log-appender"] - remote = origin - merge = refs/heads/blocking-log-appender -[branch "early-tracing-init"] - remote = origin - merge = refs/heads/early-tracing-init -[branch "monero-wallet-rpc-update"] - remote = origin - merge = refs/heads/monero-wallet-rpc-update -[branch "transfer-proof-acknowledgement"] - remote = origin - merge = refs/heads/transfer-proof-acknowledgement -[remote "pokkst"] - url = https://github.com/pokkst/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/pokkst/* -[branch "pr/1427"] - remote = pokkst - merge = refs/heads/bugfix/bob-xmrlocked-redeemed -[branch "bob-buffer-transfer-proofs"] - vscode-merge-base = origin/master - remote = origin - merge = refs/heads/bob-buffer-transfer-proofs -[branch "reduce-check-interval-monero-alice"] - remote = origin - merge = refs/heads/reduce-check-interval-monero-alice -[branch "reduce-check-interval-monero-asb"] - remote = origin - merge = refs/heads/reduce-check-interval-monero-asb -[branch "reduce-check-interval-asb-alice"] - remote = origin - merge = refs/heads/reduce-check-interval-asb-alice -[remote "github-desktop-patrini32"] - url = https://github.com/patrini32/xmr-btc-swap.git - fetch = +refs/heads/*:refs/remotes/github-desktop-patrini32/* -[branch "pr/1668"] - remote = github-desktop-patrini32 - merge = refs/heads/master -[branch "pr/1676"] - remote = github-desktop-patrini32 - merge = refs/heads/cooperative-release-of-funds - vscode-merge-base = origin/master -[branch "transfer-proof-buffer-sqlx-own-migration-script"] - remote = origin - merge = refs/heads/transfer-proof-buffer-sqlx-own-migration-script diff --git a/src-xmr-btc-swap/.backupg.git/description b/src-xmr-btc-swap/.backupg.git/description deleted file mode 100644 index 498b267a..00000000 --- a/src-xmr-btc-swap/.backupg.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/src-xmr-btc-swap/.backupg.git/hooks/applypatch-msg.sample b/src-xmr-btc-swap/.backupg.git/hooks/applypatch-msg.sample deleted file mode 100755 index a5d7b84a..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/applypatch-msg.sample +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message taken by -# applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. The hook is -# allowed to edit the commit message file. -# -# To enable this hook, rename this file to "applypatch-msg". - -. git-sh-setup -commitmsg="$(git rev-parse --git-path hooks/commit-msg)" -test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} -: diff --git a/src-xmr-btc-swap/.backupg.git/hooks/commit-msg.sample b/src-xmr-btc-swap/.backupg.git/hooks/commit-msg.sample deleted file mode 100755 index b58d1184..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/commit-msg.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# An example hook script to check the commit log message. -# Called by "git commit" with one argument, the name of the file -# that has the commit message. The hook should exit with non-zero -# status after issuing an appropriate message if it wants to stop the -# commit. The hook is allowed to edit the commit message file. -# -# To enable this hook, rename this file to "commit-msg". - -# Uncomment the below to add a Signed-off-by line to the message. -# Doing this in a hook is a bad idea in general, but the prepare-commit-msg -# hook is more suited to it. -# -# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" - -# This example catches duplicate Signed-off-by lines. - -test "" = "$(grep '^Signed-off-by: ' "$1" | - sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { - echo >&2 Duplicate Signed-off-by lines. - exit 1 -} diff --git a/src-xmr-btc-swap/.backupg.git/hooks/fsmonitor-watchman.sample b/src-xmr-btc-swap/.backupg.git/hooks/fsmonitor-watchman.sample deleted file mode 100755 index 14ed0aa4..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/fsmonitor-watchman.sample +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use IPC::Open2; - -# An example hook script to integrate Watchman -# (https://facebook.github.io/watchman/) with git to speed up detecting -# new and modified files. -# -# The hook is passed a version (currently 2) and last update token -# formatted as a string and outputs to stdout a new update token and -# all files that have been modified since the update token. Paths must -# be relative to the root of the working tree and separated by a single NUL. -# -# To enable this hook, rename this file to "query-watchman" and set -# 'git config core.fsmonitor .git/hooks/query-watchman' -# -my ($version, $last_update_token) = @ARGV; - -# Uncomment for debugging -# print STDERR "$0 $version $last_update_token\n"; - -# Check the hook interface version -if ($version ne 2) { - die "Unsupported query-fsmonitor hook version '$version'.\n" . - "Falling back to scanning...\n"; -} - -my $git_work_tree = get_working_dir(); - -my $retry = 1; - -my $json_pkg; -eval { - require JSON::XS; - $json_pkg = "JSON::XS"; - 1; -} or do { - require JSON::PP; - $json_pkg = "JSON::PP"; -}; - -launch_watchman(); - -sub launch_watchman { - my $o = watchman_query(); - if (is_work_tree_watched($o)) { - output_result($o->{clock}, @{$o->{files}}); - } -} - -sub output_result { - my ($clockid, @files) = @_; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # binmode $fh, ":utf8"; - # print $fh "$clockid\n@files\n"; - # close $fh; - - binmode STDOUT, ":utf8"; - print $clockid; - print "\0"; - local $, = "\0"; - print @files; -} - -sub watchman_clock { - my $response = qx/watchman clock "$git_work_tree"/; - die "Failed to get clock id on '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - - return $json_pkg->new->utf8->decode($response); -} - -sub watchman_query { - my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') - or die "open2() failed: $!\n" . - "Falling back to scanning...\n"; - - # In the query expression below we're asking for names of files that - # changed since $last_update_token but not from the .git folder. - # - # To accomplish this, we're using the "since" generator to use the - # recency index to select candidate nodes and "fields" to limit the - # output to file names only. Then we're using the "expression" term to - # further constrain the results. - if (substr($last_update_token, 0, 1) eq "c") { - $last_update_token = "\"$last_update_token\""; - } - my $query = <<" END"; - ["query", "$git_work_tree", { - "since": $last_update_token, - "fields": ["name"], - "expression": ["not", ["dirname", ".git"]] - }] - END - - # Uncomment for debugging the watchman query - # open (my $fh, ">", ".git/watchman-query.json"); - # print $fh $query; - # close $fh; - - print CHLD_IN $query; - close CHLD_IN; - my $response = do {local $/; }; - - # Uncomment for debugging the watch response - # open ($fh, ">", ".git/watchman-response.json"); - # print $fh $response; - # close $fh; - - die "Watchman: command returned no output.\n" . - "Falling back to scanning...\n" if $response eq ""; - die "Watchman: command returned invalid output: $response\n" . - "Falling back to scanning...\n" unless $response =~ /^\{/; - - return $json_pkg->new->utf8->decode($response); -} - -sub is_work_tree_watched { - my ($output) = @_; - my $error = $output->{error}; - if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { - $retry--; - my $response = qx/watchman watch "$git_work_tree"/; - die "Failed to make watchman watch '$git_work_tree'.\n" . - "Falling back to scanning...\n" if $? != 0; - $output = $json_pkg->new->utf8->decode($response); - $error = $output->{error}; - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - # Uncomment for debugging watchman output - # open (my $fh, ">", ".git/watchman-output.out"); - # close $fh; - - # Watchman will always return all files on the first query so - # return the fast "everything is dirty" flag to git and do the - # Watchman query just to get it over with now so we won't pay - # the cost in git to look up each individual file. - my $o = watchman_clock(); - $error = $output->{error}; - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - output_result($o->{clock}, ("/")); - $last_update_token = $o->{clock}; - - eval { launch_watchman() }; - return 0; - } - - die "Watchman: $error.\n" . - "Falling back to scanning...\n" if $error; - - return 1; -} - -sub get_working_dir { - my $working_dir; - if ($^O =~ 'msys' || $^O =~ 'cygwin') { - $working_dir = Win32::GetCwd(); - $working_dir =~ tr/\\/\//; - } else { - require Cwd; - $working_dir = Cwd::cwd(); - } - - return $working_dir; -} diff --git a/src-xmr-btc-swap/.backupg.git/hooks/post-update.sample b/src-xmr-btc-swap/.backupg.git/hooks/post-update.sample deleted file mode 100755 index ec17ec19..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/post-update.sample +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare a packed repository for use over -# dumb transports. -# -# To enable this hook, rename this file to "post-update". - -exec git update-server-info diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-applypatch.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-applypatch.sample deleted file mode 100755 index 4142082b..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-applypatch.sample +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed -# by applypatch from an e-mail message. -# -# The hook should exit with non-zero status after issuing an -# appropriate message if it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-applypatch". - -. git-sh-setup -precommit="$(git rev-parse --git-path hooks/pre-commit)" -test -x "$precommit" && exec "$precommit" ${1+"$@"} -: diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-commit.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-commit.sample deleted file mode 100755 index e144712c..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-commit.sample +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. -# -# To enable this hook, rename this file to "pre-commit". - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(git hash-object -t tree /dev/null) -fi - -# If you want to allow non-ASCII filenames set this variable to true. -allownonascii=$(git config --type=bool hooks.allownonascii) - -# Redirect output to stderr. -exec 1>&2 - -# Cross platform projects tend to avoid non-ASCII filenames; prevent -# them from being added to the repository. We exploit the fact that the -# printable range starts at the space character and ends with tilde. -if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff --cached --name-only --diff-filter=A -z $against | - LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 -then - cat <<\EOF -Error: Attempt to add a non-ASCII file name. - -This can cause problems if you want to work with people on other platforms. - -To be portable it is advisable to rename the file. - -If you know what you are doing you can disable this check using: - - git config hooks.allownonascii true -EOF - exit 1 -fi - -# If there are whitespace errors, print the offending file names and fail. -exec git diff-index --check --cached $against -- diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-merge-commit.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-merge-commit.sample deleted file mode 100755 index 399eab19..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-merge-commit.sample +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# An example hook script to verify what is about to be committed. -# Called by "git merge" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message to -# stderr if it wants to stop the merge commit. -# -# To enable this hook, rename this file to "pre-merge-commit". - -. git-sh-setup -test -x "$GIT_DIR/hooks/pre-commit" && - exec "$GIT_DIR/hooks/pre-commit" -: diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-push.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-push.sample deleted file mode 100755 index 4ce688d3..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-push.sample +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh - -# An example hook script to verify what is about to be pushed. Called by "git -# push" after it has checked the remote status, but before anything has been -# pushed. If this script exits with a non-zero status nothing will be pushed. -# -# This hook is called with the following parameters: -# -# $1 -- Name of the remote to which the push is being done -# $2 -- URL to which the push is being done -# -# If pushing without using a named remote those arguments will be equal. -# -# Information about the commits which are being pushed is supplied as lines to -# the standard input in the form: -# -# -# -# This sample shows how to prevent push of commits where the log message starts -# with "WIP" (work in progress). - -remote="$1" -url="$2" - -zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" - exit 1 - fi - fi -done - -exit 0 diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-rebase.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-rebase.sample deleted file mode 100755 index 6cbef5c3..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-rebase.sample +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2006, 2008 Junio C Hamano -# -# The "pre-rebase" hook is run just before "git rebase" starts doing -# its job, and can prevent the command from running by exiting with -# non-zero status. -# -# The hook is called with the following parameters: -# -# $1 -- the upstream the series was forked from. -# $2 -- the branch being rebased (or empty when rebasing the current branch). -# -# This sample shows how to prevent topic branches that are already -# merged to 'next' branch from getting rebased, because allowing it -# would result in rebasing already published history. - -publish=next -basebranch="$1" -if test "$#" = 2 -then - topic="refs/heads/$2" -else - topic=`git symbolic-ref HEAD` || - exit 0 ;# we do not interrupt rebasing detached HEAD -fi - -case "$topic" in -refs/heads/??/*) - ;; -*) - exit 0 ;# we do not interrupt others. - ;; -esac - -# Now we are dealing with a topic branch being rebased -# on top of master. Is it OK to rebase it? - -# Does the topic really exist? -git show-ref -q "$topic" || { - echo >&2 "No such branch $topic" - exit 1 -} - -# Is topic fully merged to master? -not_in_master=`git rev-list --pretty=oneline ^master "$topic"` -if test -z "$not_in_master" -then - echo >&2 "$topic is fully merged to master; better remove it." - exit 1 ;# we could allow it, but there is no point. -fi - -# Is topic ever merged to next? If so you should not be rebasing it. -only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` -only_next_2=`git rev-list ^master ${publish} | sort` -if test "$only_next_1" = "$only_next_2" -then - not_in_topic=`git rev-list "^$topic" master` - if test -z "$not_in_topic" - then - echo >&2 "$topic is already up to date with master" - exit 1 ;# we could allow it, but there is no point. - else - exit 0 - fi -else - not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /usr/bin/perl -e ' - my $topic = $ARGV[0]; - my $msg = "* $topic has commits already merged to public branch:\n"; - my (%not_in_next) = map { - /^([0-9a-f]+) /; - ($1 => 1); - } split(/\n/, $ARGV[1]); - for my $elem (map { - /^([0-9a-f]+) (.*)$/; - [$1 => $2]; - } split(/\n/, $ARGV[2])) { - if (!exists $not_in_next{$elem->[0]}) { - if ($msg) { - print STDERR $msg; - undef $msg; - } - print STDERR " $elem->[1]\n"; - } - } - ' "$topic" "$not_in_next" "$not_in_master" - exit 1 -fi - -<<\DOC_END - -This sample hook safeguards topic branches that have been -published from being rewound. - -The workflow assumed here is: - - * Once a topic branch forks from "master", "master" is never - merged into it again (either directly or indirectly). - - * Once a topic branch is fully cooked and merged into "master", - it is deleted. If you need to build on top of it to correct - earlier mistakes, a new topic branch is created by forking at - the tip of the "master". This is not strictly necessary, but - it makes it easier to keep your history simple. - - * Whenever you need to test or publish your changes to topic - branches, merge them into "next" branch. - -The script, being an example, hardcodes the publish branch name -to be "next", but it is trivial to make it configurable via -$GIT_DIR/config mechanism. - -With this workflow, you would want to know: - -(1) ... if a topic branch has ever been merged to "next". Young - topic branches can have stupid mistakes you would rather - clean up before publishing, and things that have not been - merged into other branches can be easily rebased without - affecting other people. But once it is published, you would - not want to rewind it. - -(2) ... if a topic branch has been fully merged to "master". - Then you can delete it. More importantly, you should not - build on top of it -- other people may already want to - change things related to the topic as patches against your - "master", so if you need further changes, it is better to - fork the topic (perhaps with the same name) afresh from the - tip of "master". - -Let's look at this example: - - o---o---o---o---o---o---o---o---o---o "next" - / / / / - / a---a---b A / / - / / / / - / / c---c---c---c B / - / / / \ / - / / / b---b C \ / - / / / / \ / - ---o---o---o---o---o---o---o---o---o---o---o "master" - - -A, B and C are topic branches. - - * A has one fix since it was merged up to "next". - - * B has finished. It has been fully merged up to "master" and "next", - and is ready to be deleted. - - * C has not merged to "next" at all. - -We would want to allow C to be rebased, refuse A, and encourage -B to be deleted. - -To compute (1): - - git rev-list ^master ^topic next - git rev-list ^master next - - if these match, topic has not merged in next at all. - -To compute (2): - - git rev-list master..topic - - if this is empty, it is fully merged to "master". - -DOC_END diff --git a/src-xmr-btc-swap/.backupg.git/hooks/pre-receive.sample b/src-xmr-btc-swap/.backupg.git/hooks/pre-receive.sample deleted file mode 100755 index a1fd29ec..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/pre-receive.sample +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -# -# An example hook script to make use of push options. -# The example simply echoes all push options that start with 'echoback=' -# and rejects all pushes when the "reject" push option is used. -# -# To enable this hook, rename this file to "pre-receive". - -if test -n "$GIT_PUSH_OPTION_COUNT" -then - i=0 - while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" - do - eval "value=\$GIT_PUSH_OPTION_$i" - case "$value" in - echoback=*) - echo "echo from the pre-receive-hook: ${value#*=}" >&2 - ;; - reject) - exit 1 - esac - i=$((i + 1)) - done -fi diff --git a/src-xmr-btc-swap/.backupg.git/hooks/prepare-commit-msg.sample b/src-xmr-btc-swap/.backupg.git/hooks/prepare-commit-msg.sample deleted file mode 100755 index 10fa14c5..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/prepare-commit-msg.sample +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -# -# An example hook script to prepare the commit log message. -# Called by "git commit" with the name of the file that has the -# commit message, followed by the description of the commit -# message's source. The hook's purpose is to edit the commit -# message file. If the hook fails with a non-zero status, -# the commit is aborted. -# -# To enable this hook, rename this file to "prepare-commit-msg". - -# This hook includes three examples. The first one removes the -# "# Please enter the commit message..." help message. -# -# The second includes the output of "git diff --name-status -r" -# into the message, just before the "git status" output. It is -# commented because it doesn't cope with --amend or with squashed -# commits. -# -# The third example adds a Signed-off-by line to the message, that can -# still be edited. This is rarely a good idea. - -COMMIT_MSG_FILE=$1 -COMMIT_SOURCE=$2 -SHA1=$3 - -/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" - -# case "$COMMIT_SOURCE,$SHA1" in -# ,|template,) -# /usr/bin/perl -i.bak -pe ' -# print "\n" . `git diff --cached --name-status -r` -# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; -# *) ;; -# esac - -# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') -# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" -# if test -z "$COMMIT_SOURCE" -# then -# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" -# fi diff --git a/src-xmr-btc-swap/.backupg.git/hooks/push-to-checkout.sample b/src-xmr-btc-swap/.backupg.git/hooks/push-to-checkout.sample deleted file mode 100755 index af5a0c00..00000000 --- a/src-xmr-btc-swap/.backupg.git/hooks/push-to-checkout.sample +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -# An example hook script to update a checked-out tree on a git push. -# -# This hook is invoked by git-receive-pack(1) when it reacts to git -# push and updates reference(s) in its repository, and when the push -# tries to update the branch that is currently checked out and the -# receive.denyCurrentBranch configuration variable is set to -# updateInstead. -# -# By default, such a push is refused if the working tree and the index -# of the remote repository has any difference from the currently -# checked out commit; when both the working tree and the index match -# the current commit, they are updated to match the newly pushed tip -# of the branch. This hook is to be used to override the default -# behaviour; however the code below reimplements the default behaviour -# as a starting point for convenient modification. -# -# The hook receives the commit with which the tip of the current -# branch is going to be updated: -commit=$1 - -# It can exit with a non-zero status to refuse the push (when it does -# so, it must not modify the index or the working tree). -die () { - echo >&2 "$*" - exit 1 -} - -# Or it can make any necessary changes to the working tree and to the -# index to bring them to the desired state when the tip of the current -# branch is updated to the new commit, and exit with a zero status. -# -# For example, the hook can simply run git read-tree -u -m HEAD "$1" -# in order to emulate git fetch that is run in the reverse direction -# with git push, as the two-tree form of git read-tree -u -m is -# essentially the same as git switch or git checkout that switches -# branches while keeping the local changes in the working tree that do -# not interfere with the difference between the branches. - -# The below is a more-or-less exact translation to shell of the C code -# for the default behaviour for git's push-to-checkout hook defined in -# the push_to_deploy() function in builtin/receive-pack.c. -# -# Note that the hook will be executed from the repository directory, -# not from the working tree, so if you want to perform operations on -# the working tree, you will have to adapt your code accordingly, e.g. -# by adding "cd .." or using relative paths. - -if ! git update-index -q --ignore-submodules --refresh -then - die "Up-to-date check failed" -fi - -if ! git diff-files --quiet --ignore-submodules -- -then - die "Working directory has unstaged changes" -fi - -# This is a rough translation of: -# -# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX -if git cat-file -e HEAD 2>/dev/null -then - head=HEAD -else - head=$(git hash-object -t tree --stdin &2 - echo " (if you want, you could supply GIT_DIR then run" >&2 - echo " $0 )" >&2 - exit 1 -fi - -if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "usage: $0 " >&2 - exit 1 -fi - -# --- Config -allowunannotated=$(git config --type=bool hooks.allowunannotated) -allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) -denycreatebranch=$(git config --type=bool hooks.denycreatebranch) -allowdeletetag=$(git config --type=bool hooks.allowdeletetag) -allowmodifytag=$(git config --type=bool hooks.allowmodifytag) - -# check for no description -projectdesc=$(sed -e '1q' "$GIT_DIR/description") -case "$projectdesc" in -"Unnamed repository"* | "") - echo "*** Project description file hasn't been set" >&2 - exit 1 - ;; -esac - -# --- Check types -# if $newrev is 0000...0000, it's a commit to delete a ref. -zero=$(git hash-object --stdin &2 - echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 - exit 1 - fi - ;; - refs/tags/*,delete) - # delete tag - if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/tags/*,tag) - # annotated tag - if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 - then - echo "*** Tag '$refname' already exists." >&2 - echo "*** Modifying a tag is not allowed in this repository." >&2 - exit 1 - fi - ;; - refs/heads/*,commit) - # branch - if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then - echo "*** Creating a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/heads/*,delete) - # delete branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/remotes/*,commit) - # tracking branch - ;; - refs/remotes/*,delete) - # delete tracking branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a tracking branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - *) - # Anything else (is there anything else?) - echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 - exit 1 - ;; -esac - -# --- Finished -exit 0 diff --git a/src-xmr-btc-swap/.backupg.git/index b/src-xmr-btc-swap/.backupg.git/index deleted file mode 100644 index 630eb173..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/index and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/info/exclude b/src-xmr-btc-swap/.backupg.git/info/exclude deleted file mode 100644 index a5196d1b..00000000 --- a/src-xmr-btc-swap/.backupg.git/info/exclude +++ /dev/null @@ -1,6 +0,0 @@ -# git ls-files --others --exclude-from=.git/info/exclude -# Lines that start with '#' are comments. -# For a project mostly in C, the following would be a good set of -# exclude patterns (uncomment them if you want to use them): -# *.[oa] -# *~ diff --git a/src-xmr-btc-swap/.backupg.git/info/refs b/src-xmr-btc-swap/.backupg.git/info/refs deleted file mode 100644 index 07659075..00000000 --- a/src-xmr-btc-swap/.backupg.git/info/refs +++ /dev/null @@ -1,350 +0,0 @@ -0fe29f85569d41fcf3801ae459fee0c7e1e67c4f refs/heads/0.11.x -eeea9d3927668680fbc291e9e769d8861adcf9f4 refs/heads/blocking-log-appender -74c89aa1f7206fbdca76236b6ee26d1aebdb9720 refs/heads/bob-buffer-transfer-proofs -d664f1e71d292819fb30bbfa6e94d2e87cbe37bf refs/heads/change-monero-node-moneroworld -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/heads/change-xmr-node-moneroworld -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/heads/cooperative-xmr-redeem -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/early-tracing-init -1fdead9e0a8ab5ff9b1b4c6edf7cfa0b02af97fc refs/heads/immediately-fetch-tx -5662f7fe81b1d93eed73621dd102f0fac3d59811 refs/heads/immediately-fetch-tx-2 -fb12cb7c26609fad0ca0eb1a08506e4f5d9e4347 refs/heads/issues-1459 -78049a9cb7a4d45e7016a2056f41fc3e0d06e180 refs/heads/kill-monero-rpc-on-signal-receive -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/list -4e631759b23f7abc6dff1a44e3b7b549d482bfae refs/heads/lock -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/ls -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/heads/master -fe2275e15a8524cd8f91c0f2c83a7e01d1667454 refs/heads/master-major-release-bb -01fa359ee58c96f20ae380d5d62fc2615eb87618 refs/heads/monero-rpc-download-0.11x-m1m2 -29beb49332e8dc2793db5db5d848d8b5cc841694 refs/heads/monero-wallet-refresh-fix -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/monero-wallet-rpc-update -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/monero-wallet-rpc-upgrade -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/heads/multi-rendezvous -c93eaa8057a78086c7ea4209a298e71ac4cce6fb refs/heads/notify-monero-wallet-sync-progress -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/heads/pr/1417 -6a125776ad5a9e1a813d4579ce3e95c09ce9248e refs/heads/pr/1427 -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/pr/1668 -cac2badb41e957761cf3ce93f97b56bdf284ba10 refs/heads/pr/1676 -a4c40979904c834317a9c4eb556030b25b8e3a8a refs/heads/reduce-check-interval-asb-alice -664bc29e40cfc2ab1b8fc447fc6854a762eae112 refs/heads/reduce-check-interval-monero-alice -40e35e65d731fca8fcd6e6560b291a56794eefc8 refs/heads/reduce-check-interval-monero-asb -9d52a8b7f19f230e33c9844006b3f4367e07c573 refs/heads/rpc-server -9b503f336767bab202ca44c8213883ea20c7efcb refs/heads/rpc-server-combine-method-request -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/heads/rpc-server-tracing-log-files -03b94d4b7488a39897a585cb0dbd95fc1d4741d8 refs/heads/sqlx -80e03e3f0b91b8d57b407d510c414b99ce12e4a0 refs/heads/transfer-proof-acknowledgement -f804254f9436287a9b3925784c5feac2a0cf8661 refs/heads/upgrade-jsonrpsee -611d09e5a2dd35e59adc146f2c6981a13190d7da refs/heads/wallet-refresh -344c303613d47ec00bc3210ce1fbed1cd962bc7e refs/remotes/delta12/0.11.x -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/delta12/asb-systemd-setup -7aa6227cbeb78e5eca3bad1bac828564c8bb9544 refs/remotes/delta12/base64-vergen-bdk -8a994807328f36602f462033ccf9fc94d49187f2 refs/remotes/delta12/bdk-hacking -4c16367d9e08b5ac4393f10a1e5df72457b16bc6 refs/remotes/delta12/ci-armv7-cross -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/delta12/cleanup-module-boundaries -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/delta12/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/delta12/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/delta12/demo -41aa1b301e146b4915c3f819102c303cacda1a21 refs/remotes/delta12/dependabot/cargo/backoff-0.4.0 -cff4e0296866e35e06a5427f3fd751ddc4218f25 refs/remotes/delta12/dependabot/cargo/bdk-0.16.0 -eddfd526782572e900cc75031feae5f8920434f2 refs/remotes/delta12/dependabot/cargo/comfy-table-5.0.0 -b79c057320059d64a1a4dd541b11d6c3cdd21245 refs/remotes/delta12/dependabot/cargo/dialoguer-0.9.0 -563a7ccf3ae531b0a31e8e10ade6188569f4ef48 refs/remotes/delta12/dependabot/cargo/rust_decimal-1.21.0 -afff5e12cee53e695a6608e4553167e0d68a4837 refs/remotes/delta12/dependabot/cargo/sha2-0.10.1 -2b22a38eae92c79c2a86de10bf58483ef377731e refs/remotes/delta12/dependabot/cargo/tempfile-3.3.0 -30991818a7cb0bb5fb89d61c05866213a79c068f refs/remotes/delta12/dependabot/cargo/time-0.3.7 -0da442411275726932ce682f0e678d5869c329f5 refs/remotes/delta12/dependabot/cargo/tokio-1.16.1 -df3f91c994e92ac825087c055316f5faaea9d1df refs/remotes/delta12/dependabot/cargo/torut-0.2.1 -5c6fafb50648f19593583d8f143d0bef097ea499 refs/remotes/delta12/dependabot/github_actions/actions/setup-python-2.3.2 -dc9b9b9778a7fe329b2cdea0ab480fb703888474 refs/remotes/delta12/dependabot/github_actions/thomaseizinger/keep-a-changelog-new-release-1.3.0 -6bf472fc126582529013a001756b9d3e5d637a8f refs/remotes/delta12/dependencies -139a9d8ce122f2f9eae2696d85e6d61fd9419b41 refs/remotes/delta12/deps1 -5a3675a06fcafe2dcc2ab9ff2c0096423362431c refs/remotes/delta12/dev -8a0ccc08dcd13c4b31af52f46f3345ff25db6d12 refs/remotes/delta12/dev2 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/delta12/discover-makers-cli -10e503a3ae016d46f7174f497ecbf7a106afd9c0 refs/remotes/delta12/docker-asb -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/delta12/docs -00cfce57c77f251467f204e05bea5c50f9767cc0 refs/remotes/delta12/dprint-fix -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/delta12/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/delta12/fix-confirmations -9e96ef64d3d5c6444dcf8cda92eba232186614e4 refs/remotes/delta12/identify-protocol -9346cb7baf17f56eb8dd8ace5edd98d0c9583159 refs/remotes/delta12/issues-1273 -fb12cb7c26609fad0ca0eb1a08506e4f5d9e4347 refs/remotes/delta12/issues-1459 -eacfe79b4a810dff47698fd51c07cdd6f173535a refs/remotes/delta12/issues-1459-ci -7dcd9fe20a8fca3dcfc6d88b4592a8cc4493a63d refs/remotes/delta12/libp2p -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/delta12/manual-sync -b7347da27a2cb5e0fb9e7ab1dc96b53ca96f2d55 refs/remotes/delta12/master -a99efa09dd0d3b2b1c7a8d1a94737895e0601458 refs/remotes/delta12/monero2 -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/delta12/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/delta12/on-chain-protocol -39e34a608b93e3960e43b49c96f58318ea0e59e0 refs/remotes/delta12/overflow-fix -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/delta12/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/delta12/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/delta12/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/delta12/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/delta12/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/delta12/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/delta12/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/delta12/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/delta12/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/delta12/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/delta12/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/delta12/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/delta12/rendezvous-demo -f066c2a1a155341b6956c6d1c9a9c2468d74787b refs/remotes/delta12/rpc-server -acdba8474bf52787ef4bfd02e6fd7017ba4ca0e4 refs/remotes/delta12/rust-1.65 -dbb66fe6b743edc8dc769602f48cea4b1f6448a5 refs/remotes/delta12/rust-1.70 -2c2fb7f35058edbc52d0a53b1ecbc373404e316a refs/remotes/delta12/secp256kfun -651e2a91e5f1769d6f6ed02d32815760b8f40b7f refs/remotes/delta12/sha2 -7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 refs/remotes/delta12/sha256sum -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/delta12/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/delta12/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/delta12/sqlite2 -db039b022a5327524832e5e6aa06200726b5ca75 refs/remotes/delta12/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/delta12/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/delta12/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/delta12/test-refactor -237a9dcec5046393b6fd199adc6bc5bb09dc0780 refs/remotes/delta12/testcontainers -8eff499a630f951bbcca563268eed7b5d7b06fcc refs/remotes/delta12/tracing -e7e68b07af41224217c7cdaa0e0e89498784b18e refs/remotes/delta12/windows-ci -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/delta12/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/delta12/xmr-adaptor-signatures-publish-on-testnet -344c303613d47ec00bc3210ce1fbed1cd962bc7e refs/remotes/delta1upstream/0.11.x -4ca1f8da5ef7e6964bfd02fd8859bba56084afff refs/remotes/delta1upstream/HEAD -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/delta1upstream/asb-systemd-setup -7aa6227cbeb78e5eca3bad1bac828564c8bb9544 refs/remotes/delta1upstream/base64-vergen-bdk -8a994807328f36602f462033ccf9fc94d49187f2 refs/remotes/delta1upstream/bdk-hacking -4c16367d9e08b5ac4393f10a1e5df72457b16bc6 refs/remotes/delta1upstream/ci-armv7-cross -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/delta1upstream/cleanup-module-boundaries -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/delta1upstream/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/delta1upstream/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/delta1upstream/demo -41aa1b301e146b4915c3f819102c303cacda1a21 refs/remotes/delta1upstream/dependabot/cargo/backoff-0.4.0 -cff4e0296866e35e06a5427f3fd751ddc4218f25 refs/remotes/delta1upstream/dependabot/cargo/bdk-0.16.0 -eddfd526782572e900cc75031feae5f8920434f2 refs/remotes/delta1upstream/dependabot/cargo/comfy-table-5.0.0 -b79c057320059d64a1a4dd541b11d6c3cdd21245 refs/remotes/delta1upstream/dependabot/cargo/dialoguer-0.9.0 -563a7ccf3ae531b0a31e8e10ade6188569f4ef48 refs/remotes/delta1upstream/dependabot/cargo/rust_decimal-1.21.0 -afff5e12cee53e695a6608e4553167e0d68a4837 refs/remotes/delta1upstream/dependabot/cargo/sha2-0.10.1 -2b22a38eae92c79c2a86de10bf58483ef377731e refs/remotes/delta1upstream/dependabot/cargo/tempfile-3.3.0 -30991818a7cb0bb5fb89d61c05866213a79c068f refs/remotes/delta1upstream/dependabot/cargo/time-0.3.7 -0da442411275726932ce682f0e678d5869c329f5 refs/remotes/delta1upstream/dependabot/cargo/tokio-1.16.1 -df3f91c994e92ac825087c055316f5faaea9d1df refs/remotes/delta1upstream/dependabot/cargo/torut-0.2.1 -5c6fafb50648f19593583d8f143d0bef097ea499 refs/remotes/delta1upstream/dependabot/github_actions/actions/setup-python-2.3.2 -dc9b9b9778a7fe329b2cdea0ab480fb703888474 refs/remotes/delta1upstream/dependabot/github_actions/thomaseizinger/keep-a-changelog-new-release-1.3.0 -6bf472fc126582529013a001756b9d3e5d637a8f refs/remotes/delta1upstream/dependencies -139a9d8ce122f2f9eae2696d85e6d61fd9419b41 refs/remotes/delta1upstream/deps1 -5a3675a06fcafe2dcc2ab9ff2c0096423362431c refs/remotes/delta1upstream/dev -8a0ccc08dcd13c4b31af52f46f3345ff25db6d12 refs/remotes/delta1upstream/dev2 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/delta1upstream/discover-makers-cli -10e503a3ae016d46f7174f497ecbf7a106afd9c0 refs/remotes/delta1upstream/docker-asb -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/delta1upstream/docs -00cfce57c77f251467f204e05bea5c50f9767cc0 refs/remotes/delta1upstream/dprint-fix -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/delta1upstream/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/delta1upstream/fix-confirmations -9e96ef64d3d5c6444dcf8cda92eba232186614e4 refs/remotes/delta1upstream/identify-protocol -9346cb7baf17f56eb8dd8ace5edd98d0c9583159 refs/remotes/delta1upstream/issues-1273 -7dcd9fe20a8fca3dcfc6d88b4592a8cc4493a63d refs/remotes/delta1upstream/libp2p -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/delta1upstream/manual-sync -4ca1f8da5ef7e6964bfd02fd8859bba56084afff refs/remotes/delta1upstream/master -a99efa09dd0d3b2b1c7a8d1a94737895e0601458 refs/remotes/delta1upstream/monero2 -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/remotes/delta1upstream/multi-rendezvous -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/delta1upstream/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/delta1upstream/on-chain-protocol -39e34a608b93e3960e43b49c96f58318ea0e59e0 refs/remotes/delta1upstream/overflow-fix -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/delta1upstream/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/delta1upstream/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/delta1upstream/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/delta1upstream/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/delta1upstream/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/delta1upstream/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/delta1upstream/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/delta1upstream/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/delta1upstream/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/delta1upstream/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/delta1upstream/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/delta1upstream/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/delta1upstream/rendezvous-demo -acdba8474bf52787ef4bfd02e6fd7017ba4ca0e4 refs/remotes/delta1upstream/rust-1.65 -2c2fb7f35058edbc52d0a53b1ecbc373404e316a refs/remotes/delta1upstream/secp256kfun -651e2a91e5f1769d6f6ed02d32815760b8f40b7f refs/remotes/delta1upstream/sha2 -7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 refs/remotes/delta1upstream/sha256sum -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/delta1upstream/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/delta1upstream/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/delta1upstream/sqlite2 -f0e059c814a257f6593cb6c354b2d084f36f58d5 refs/remotes/delta1upstream/sqlx -db039b022a5327524832e5e6aa06200726b5ca75 refs/remotes/delta1upstream/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/delta1upstream/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/delta1upstream/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/delta1upstream/test-refactor -8eff499a630f951bbcca563268eed7b5d7b06fcc refs/remotes/delta1upstream/tracing -e7e68b07af41224217c7cdaa0e0e89498784b18e refs/remotes/delta1upstream/windows-ci -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/delta1upstream/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/delta1upstream/xmr-adaptor-signatures-publish-on-testnet -53c80609af588edf69f3726db5ecbc1f37528ed9 refs/remotes/github-desktop-patrini32/0.11.x -c3b8186c26f395f451f1e09796b23bd60311ddad refs/remotes/github-desktop-patrini32/HEAD -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/github-desktop-patrini32/asb-systemd-setup -2290f82e16123599503ebea6ae130a5ec50f87df refs/remotes/github-desktop-patrini32/bump-rustc-version-for-release-bins-ci -22cdad338bdc89ec0ef94a97789e9e4993915b53 refs/remotes/github-desktop-patrini32/bungy-corrupted-database -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/remotes/github-desktop-patrini32/change-xmr-node-moneroworld -a2d12b6eab7b1cec31d1e45d27a1d8e3d204d99d refs/remotes/github-desktop-patrini32/ci -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/github-desktop-patrini32/cleanup-module-boundaries -cac2badb41e957761cf3ce93f97b56bdf284ba10 refs/remotes/github-desktop-patrini32/cooperative-release-of-funds -fa3b252f76b68bdcb4533968b86c9761db521366 refs/remotes/github-desktop-patrini32/cooperative-release-of-funds-CI -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/remotes/github-desktop-patrini32/cooperative-xmr-redeem -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/github-desktop-patrini32/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/github-desktop-patrini32/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/github-desktop-patrini32/demo -6d6bd93315ef16917e12c268f855fadd05fec71e refs/remotes/github-desktop-patrini32/dependabot/cargo/bdk-0.29.0 -1594bcb170bf6e85ceb967df73bc894c5e0e35ad refs/remotes/github-desktop-patrini32/dependabot/cargo/ed25519-dalek-2.1.1 -7e5282c30d420284ee508367c650b6067ee66961 refs/remotes/github-desktop-patrini32/dependabot/cargo/jsonrpsee-0.22.5 -9059e8bc955ae2cdb77407b73ca6d116a977563c refs/remotes/github-desktop-patrini32/dependabot/cargo/jsonrpsee-core-0.22.5 -9a1df270cb394c516f474be094ddf9c4f8e6fa19 refs/remotes/github-desktop-patrini32/dependabot/cargo/libp2p-0.48.0 -1d7f9dfd894cec3d7cad9f84daa63095e5d9eeaf refs/remotes/github-desktop-patrini32/dependabot/cargo/mockito-1.3.1 -4f58539ca9c3e9bdd0c7286385aec891b4ed8fbb refs/remotes/github-desktop-patrini32/dependabot/cargo/tokio-1.38.0 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/github-desktop-patrini32/discover-makers-cli -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/github-desktop-patrini32/docs -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/github-desktop-patrini32/early-tracing-init -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/github-desktop-patrini32/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/github-desktop-patrini32/fix-confirmations -2921d61ebc9211d4e0bda3f3dadd42d7e63b572a refs/remotes/github-desktop-patrini32/kill-monero-rpc-on-signal-receive -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/github-desktop-patrini32/manual-sync -c3b8186c26f395f451f1e09796b23bd60311ddad refs/remotes/github-desktop-patrini32/master -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/github-desktop-patrini32/monero-wallet-rpc-update -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/github-desktop-patrini32/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/github-desktop-patrini32/on-chain-protocol -e6686b7aa12bbff0d10f5ebeb8fcd7466066cf01 refs/remotes/github-desktop-patrini32/pr/1427 -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/github-desktop-patrini32/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/github-desktop-patrini32/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/github-desktop-patrini32/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/github-desktop-patrini32/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/github-desktop-patrini32/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/github-desktop-patrini32/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/github-desktop-patrini32/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/github-desktop-patrini32/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/github-desktop-patrini32/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/github-desktop-patrini32/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/github-desktop-patrini32/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/github-desktop-patrini32/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/github-desktop-patrini32/rendezvous-demo -a3455d6032a6e407769ef9af818dd7f9f1914763 refs/remotes/github-desktop-patrini32/roc -3eb4c0db433f78dd65647bf355464959eb5492aa refs/remotes/github-desktop-patrini32/rpc-server -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/remotes/github-desktop-patrini32/rpc-server-tracing-log-files -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/github-desktop-patrini32/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/github-desktop-patrini32/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/github-desktop-patrini32/sqlite2 -e1c3a5d991b888b70ebfb75a1f3782b4b2013975 refs/remotes/github-desktop-patrini32/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/github-desktop-patrini32/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/github-desktop-patrini32/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/github-desktop-patrini32/test-refactor -f3cf0045910b9c26b148e7d193207f8b0751e61a refs/remotes/github-desktop-patrini32/transfer-proof-acknowledgement -3d9b984c5ed442966501b65e6f68a9a7104327eb refs/remotes/github-desktop-patrini32/trying -f0b4735163528add8d0b651ba482f205e6dbc134 refs/remotes/github-desktop-patrini32/wait-for-cancel-timelock-when-enc-sig-fails -2e181dac9cb479883aa7139636188d23acb8f1de refs/remotes/github-desktop-patrini32/wallet-force-sync-on-first-subscribe -58fc70e8371247ebaf3aa1b8353a748d3332fe0f refs/remotes/github-desktop-patrini32/wallet-refresh -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/github-desktop-patrini32/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/github-desktop-patrini32/xmr-adaptor-signatures-publish-on-testnet -53c80609af588edf69f3726db5ecbc1f37528ed9 refs/remotes/origin/0.11.x -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/remotes/origin/HEAD -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/origin/asb-systemd-setup -2290f82e16123599503ebea6ae130a5ec50f87df refs/remotes/origin/bump-rustc-version-for-release-bins-ci -22cdad338bdc89ec0ef94a97789e9e4993915b53 refs/remotes/origin/bungy-corrupted-database -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/remotes/origin/change-xmr-node-moneroworld -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/origin/cleanup-module-boundaries -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/remotes/origin/cooperative-xmr-redeem -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/origin/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/origin/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/origin/demo -6d6bd93315ef16917e12c268f855fadd05fec71e refs/remotes/origin/dependabot/cargo/bdk-0.29.0 -1594bcb170bf6e85ceb967df73bc894c5e0e35ad refs/remotes/origin/dependabot/cargo/ed25519-dalek-2.1.1 -82178afa0447666619242c0180186164d2b2d99f refs/remotes/origin/dependabot/cargo/jsonrpsee-0.22.5 -d5a10b1c57e92c7343812c1541418501d89c242e refs/remotes/origin/dependabot/cargo/jsonrpsee-core-0.23.2 -9a1df270cb394c516f474be094ddf9c4f8e6fa19 refs/remotes/origin/dependabot/cargo/libp2p-0.48.0 -3fb08be449250ff1584857ea2b80850b1f2c2b95 refs/remotes/origin/dependabot/cargo/serde_json-1.0.119 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/origin/discover-makers-cli -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/origin/docs -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/origin/early-tracing-init -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/origin/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/origin/fix-confirmations -2921d61ebc9211d4e0bda3f3dadd42d7e63b572a refs/remotes/origin/kill-monero-rpc-on-signal-receive -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/origin/manual-sync -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/remotes/origin/master -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/origin/monero-wallet-rpc-update -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/origin/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/origin/on-chain-protocol -e6686b7aa12bbff0d10f5ebeb8fcd7466066cf01 refs/remotes/origin/pr/1427 -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/origin/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/origin/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/origin/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/origin/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/origin/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/origin/random-branch -664bc29e40cfc2ab1b8fc447fc6854a762eae112 refs/remotes/origin/reduce-check-interval-monero-alice -40e35e65d731fca8fcd6e6560b291a56794eefc8 refs/remotes/origin/reduce-check-interval-monero-asb -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/origin/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/origin/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/origin/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/origin/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/origin/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/origin/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/origin/rendezvous-demo -a3455d6032a6e407769ef9af818dd7f9f1914763 refs/remotes/origin/roc -3eb4c0db433f78dd65647bf355464959eb5492aa refs/remotes/origin/rpc-server -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/remotes/origin/rpc-server-tracing-log-files -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/origin/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/origin/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/origin/sqlite2 -e1c3a5d991b888b70ebfb75a1f3782b4b2013975 refs/remotes/origin/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/origin/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/origin/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/origin/test-refactor -f3cf0045910b9c26b148e7d193207f8b0751e61a refs/remotes/origin/transfer-proof-acknowledgement -3d9b984c5ed442966501b65e6f68a9a7104327eb refs/remotes/origin/trying -f0b4735163528add8d0b651ba482f205e6dbc134 refs/remotes/origin/wait-for-cancel-timelock-when-enc-sig-fails -2e181dac9cb479883aa7139636188d23acb8f1de refs/remotes/origin/wallet-force-sync-on-first-subscribe -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/origin/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/origin/xmr-adaptor-signatures-publish-on-testnet -8d2f417c262f573eafdbf7a7e09bb8cb7e3deff8 refs/remotes/pokkst/HEAD -828038949521fa9bb0828ed25046b36d812fabe1 refs/remotes/pokkst/bugfix/asb-sync-startup -6a125776ad5a9e1a813d4579ce3e95c09ce9248e refs/remotes/pokkst/bugfix/bob-xmrlocked-redeemed -5182b4f53a741eebc3b734e980904d2e5a8113d1 refs/remotes/pokkst/bugfix/lock-tx-timeout-issue -d7d87d96ac438746838aab86c52f1e05fc596ef3 refs/remotes/pokkst/bugfix/windows-asb-xmr-tx-locking -019fbbbea67d0533ce9aa17cb664918b6822a1ec refs/remotes/pokkst/develop -82cbea49186b3c39463ca0aa14879498a67b5171 refs/remotes/pokkst/feature/asb-tor -8d2f417c262f573eafdbf7a7e09bb8cb7e3deff8 refs/remotes/pokkst/master -7d5a6043843a9154d62252af5178fa6c269ea085 refs/remotes/yama/HEAD -7d5a6043843a9154d62252af5178fa6c269ea085 refs/remotes/yama/master -9d52a8b7f19f230e33c9844006b3f4367e07c573 refs/remotes/yama/rpc-server -81688fe6239b71daad51e4c19d6d457149f77bc8 refs/stash -490c1d2ec133a899d0f0f11987c8abb9caa3f56c refs/tags/0.10.0 -83f12e17c0838751432b84e8dc1bfda808ea563d refs/tags/0.10.1 -3ce4dffb84d0c2e01b011864cd36dabc64faf25c refs/tags/0.10.2 -9c688cf7783883fc3b9b7e8b040342e86f5a6a5b refs/tags/0.11.0 -0672e3548a7db4ed6a80060067eec79933cdfac8 refs/tags/0.11.1 -59f3775d42a371f2060ed4ecc989e309c162ee76 refs/tags/0.11.2 -d098a898618f533d3b68aa43a0f97196b95fd761 refs/tags/0.11.2^{} -f825dea69f9169db73a3640f4055eeaad5df0a6e refs/tags/0.11.3 -f4a5bef50bfed1aca49cb4451c932132296a7304 refs/tags/0.11.3^{} -de18f7dab8ef039c50e8ddae1480590f493cdb6d refs/tags/0.11.4 -f7c15fa9d0010585d6ba6ca0b5dd00f3c3b7b30a refs/tags/0.11.4^{} -421252ffc47c531cbab72659ec23432669cc2b8c refs/tags/0.11.5 -7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 refs/tags/0.11.5^{} -26e44400835572cadb93c7d1dc5db39f27663542 refs/tags/0.12.0 -b75b3e64a9c798820b1005b747f4a82a84dc75b7 refs/tags/0.12.1 -20afb35d5b39d983cc08f82d54b5a76946526b0d refs/tags/0.12.2 -2de492f23a8e30594b423aa89e2ad7f0aec34507 refs/tags/0.12.3 -2932abc9ec2475717944afa02aeaad73f3c98f16 refs/tags/0.13.0 -a3b1e772b2700ce0b4b8f2d932c84b9902fd9f11 refs/tags/0.13.1 -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/tags/0.13.2 -22fe24f54d8cfd163dc1bb6156ea692596b22087 refs/tags/0.4.0 -822997c0c354226f94a8e87246e4d4e4ec77e582 refs/tags/0.5.0 -ca6cb0a76ad5207f335adeeed9e0aa4c91f57286 refs/tags/0.6.0 -4a5e9d47b722297b0439167c9c29feef30fcf758 refs/tags/0.7.0 -21f4295e94e4b2cb5259461617e7b87efb69d76c refs/tags/0.8.0 -cdb2939746e941b335fa8c7bbdc0f43a83c13013 refs/tags/0.8.1 -699b16bc43ac05fb48cbc0ec4c8c900361af40b6 refs/tags/0.8.2 -def03b0c957861769eb0206795ba39b8c83f8c80 refs/tags/0.8.3 -72e75c6e022c1429d039bff6d248474848a7c172 refs/tags/0.9.0 -d483651ef4032121ec115d01c5b1222b259fd0fa refs/tags/preview -1de3fa486e9825141270a07d94da81c6cc4c2d9d refs/tags/v0.1 -3ad2d4b90fb778b16d3c486e7c85561e16ca03f8 refs/tags/v0.11.1 -0519221f3fffdd361fa173609fef36d188fef5c3 refs/tags/v0.11.1^{} -52483a5a43e10f76bce92d97cb9b0b3f444c39dd refs/tags/v0.2 -bd82ae9e98a17e499e53d8f758fde44870e8b047 refs/tags/v0.3 diff --git a/src-xmr-btc-swap/.backupg.git/objects/02/dd98a5b73ebd42f3d618463542fd19481d110b b/src-xmr-btc-swap/.backupg.git/objects/02/dd98a5b73ebd42f3d618463542fd19481d110b deleted file mode 100644 index 05ff56ee..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/02/dd98a5b73ebd42f3d618463542fd19481d110b +++ /dev/null @@ -1 +0,0 @@ -x­KnÄ ³æ½É‚æk)Šr•cF€sûx™dWªEé½ÔjÝ'àŠ³3ƒ4^Ú¬°”h”†ÉG´ˆ ³Î!I/c+^Ôùœ`y%VÙ› T‰-f¢hݨè´Òµ²NÐ5Ÿ­CÜOêïH½ðœt&ÿøc¿¯Á},gëü:Þ˶Ïç—Ôê(R¢]Wy£¸í=~ò?gE¥†£mPy Úx@:øþÛÅ/ç7^Á \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/03/d6ba71fc6c6cfb0bc1422c2bc31fb5e2ac1b5e b/src-xmr-btc-swap/.backupg.git/objects/03/d6ba71fc6c6cfb0bc1422c2bc31fb5e2ac1b5e deleted file mode 100644 index 2e18dc6f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/03/d6ba71fc6c6cfb0bc1422c2bc31fb5e2ac1b5e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/04/18024178b1634d3c9ed187550f57259d2a78e0 b/src-xmr-btc-swap/.backupg.git/objects/04/18024178b1634d3c9ed187550f57259d2a78e0 deleted file mode 100644 index 931acea5..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/04/18024178b1634d3c9ed187550f57259d2a78e0 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/04/705d12ffb41ef204ea7b2522c2d3d8c07046e5 b/src-xmr-btc-swap/.backupg.git/objects/04/705d12ffb41ef204ea7b2522c2d3d8c07046e5 deleted file mode 100644 index 3eb20124..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/04/705d12ffb41ef204ea7b2522c2d3d8c07046e5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/05/8690b643170ca279bf4ba94689b8761f0e052c b/src-xmr-btc-swap/.backupg.git/objects/05/8690b643170ca279bf4ba94689b8761f0e052c deleted file mode 100644 index 87f1f9a7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/05/8690b643170ca279bf4ba94689b8761f0e052c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/07/0c4a51a032026707ca4ef58860f5a04e292cb6 b/src-xmr-btc-swap/.backupg.git/objects/07/0c4a51a032026707ca4ef58860f5a04e292cb6 deleted file mode 100644 index 04b79d40..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/07/0c4a51a032026707ca4ef58860f5a04e292cb6 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/07/584b64148a3fc7987e9de4490dd2fc29f54fbf b/src-xmr-btc-swap/.backupg.git/objects/07/584b64148a3fc7987e9de4490dd2fc29f54fbf deleted file mode 100644 index 6b739056..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/07/584b64148a3fc7987e9de4490dd2fc29f54fbf and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/07/f788eb81c1c32ac097f9ae2e4e313b8d751bac b/src-xmr-btc-swap/.backupg.git/objects/07/f788eb81c1c32ac097f9ae2e4e313b8d751bac deleted file mode 100644 index 6d7470ba..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/07/f788eb81c1c32ac097f9ae2e4e313b8d751bac and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/09/0d4a7c75510655f12c9ed6b1f7d1fb69ccfd85 b/src-xmr-btc-swap/.backupg.git/objects/09/0d4a7c75510655f12c9ed6b1f7d1fb69ccfd85 deleted file mode 100644 index 7c457a23..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/09/0d4a7c75510655f12c9ed6b1f7d1fb69ccfd85 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/09/582f0a848b643c5b2d446ccd0750dc8e3ae1bf b/src-xmr-btc-swap/.backupg.git/objects/09/582f0a848b643c5b2d446ccd0750dc8e3ae1bf deleted file mode 100644 index 94ba1417..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/09/582f0a848b643c5b2d446ccd0750dc8e3ae1bf and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/0a/267aac1cb44a4860bb36ea26b2083c4dcb8ff9 b/src-xmr-btc-swap/.backupg.git/objects/0a/267aac1cb44a4860bb36ea26b2083c4dcb8ff9 deleted file mode 100644 index f60b869f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/0a/267aac1cb44a4860bb36ea26b2083c4dcb8ff9 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/0c/a4f27198838968bd60ed7d371bfa23496b7fe5 b/src-xmr-btc-swap/.backupg.git/objects/0c/a4f27198838968bd60ed7d371bfa23496b7fe5 deleted file mode 100644 index 3db8da24..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/0c/a4f27198838968bd60ed7d371bfa23496b7fe5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/0d/10dcc0ae113d3470f7b0a5ddd74c88a47748f8 b/src-xmr-btc-swap/.backupg.git/objects/0d/10dcc0ae113d3470f7b0a5ddd74c88a47748f8 deleted file mode 100644 index c91ee799..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/0d/10dcc0ae113d3470f7b0a5ddd74c88a47748f8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/0d/60a04d3e23ed2ceb02f8bad0d0226cf3c90272 b/src-xmr-btc-swap/.backupg.git/objects/0d/60a04d3e23ed2ceb02f8bad0d0226cf3c90272 deleted file mode 100644 index cbd7abc4..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/0d/60a04d3e23ed2ceb02f8bad0d0226cf3c90272 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/0f/20e4dfa74b57fb8b3ddf193c3f9eaa4cf7c5cb b/src-xmr-btc-swap/.backupg.git/objects/0f/20e4dfa74b57fb8b3ddf193c3f9eaa4cf7c5cb deleted file mode 100644 index 71353c64..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/0f/20e4dfa74b57fb8b3ddf193c3f9eaa4cf7c5cb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/10/850d199a2340efda940984b4ed15fcf2d49098 b/src-xmr-btc-swap/.backupg.git/objects/10/850d199a2340efda940984b4ed15fcf2d49098 deleted file mode 100644 index 354e2d45..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/10/850d199a2340efda940984b4ed15fcf2d49098 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/11/4e628a79e774d0763b4612183dd644c4d5a134 b/src-xmr-btc-swap/.backupg.git/objects/11/4e628a79e774d0763b4612183dd644c4d5a134 deleted file mode 100644 index 3f6a3b23..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/11/4e628a79e774d0763b4612183dd644c4d5a134 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/12/50feb07f6fbde5def3cf9800a932c6948b3fa3 b/src-xmr-btc-swap/.backupg.git/objects/12/50feb07f6fbde5def3cf9800a932c6948b3fa3 deleted file mode 100644 index a79eabe8..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/12/50feb07f6fbde5def3cf9800a932c6948b3fa3 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/12/a5bcee268851fdab744ec4a31f75d3d008e031 b/src-xmr-btc-swap/.backupg.git/objects/12/a5bcee268851fdab744ec4a31f75d3d008e031 deleted file mode 100644 index ef07459b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/12/a5bcee268851fdab744ec4a31f75d3d008e031 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/12/c31070c8e1519a776fc3f2bedd2c1e1efaee89 b/src-xmr-btc-swap/.backupg.git/objects/12/c31070c8e1519a776fc3f2bedd2c1e1efaee89 deleted file mode 100644 index 19b72547..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/12/c31070c8e1519a776fc3f2bedd2c1e1efaee89 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/12/f030b2034dd4084918837af90d30042419ddd5 b/src-xmr-btc-swap/.backupg.git/objects/12/f030b2034dd4084918837af90d30042419ddd5 deleted file mode 100644 index dcbe53c9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/12/f030b2034dd4084918837af90d30042419ddd5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/13/c6c3c2861821a26c7d3801ce56952691afcfad b/src-xmr-btc-swap/.backupg.git/objects/13/c6c3c2861821a26c7d3801ce56952691afcfad deleted file mode 100644 index 24bcb5e7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/13/c6c3c2861821a26c7d3801ce56952691afcfad and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/13/f5d4a86be32528ffd14eee84539219347c5b9f b/src-xmr-btc-swap/.backupg.git/objects/13/f5d4a86be32528ffd14eee84539219347c5b9f deleted file mode 100644 index 438bdb55..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/13/f5d4a86be32528ffd14eee84539219347c5b9f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/15/2ced4badf6b3fd20f69d782287b84bff061039 b/src-xmr-btc-swap/.backupg.git/objects/15/2ced4badf6b3fd20f69d782287b84bff061039 deleted file mode 100644 index 393e4898..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/15/2ced4badf6b3fd20f69d782287b84bff061039 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/15/471e3ca25ad110eff74ce5d1e2b15a0709c5b3 b/src-xmr-btc-swap/.backupg.git/objects/15/471e3ca25ad110eff74ce5d1e2b15a0709c5b3 deleted file mode 100644 index 847f348b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/15/471e3ca25ad110eff74ce5d1e2b15a0709c5b3 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/16/d8ab1cff22e6f8864170b05b0143b8a40765eb b/src-xmr-btc-swap/.backupg.git/objects/16/d8ab1cff22e6f8864170b05b0143b8a40765eb deleted file mode 100644 index 5d61c975..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/16/d8ab1cff22e6f8864170b05b0143b8a40765eb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/1f/bb706725ad2043c757b090062e7713db1eb738 b/src-xmr-btc-swap/.backupg.git/objects/1f/bb706725ad2043c757b090062e7713db1eb738 deleted file mode 100644 index a6fe1ee0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/1f/bb706725ad2043c757b090062e7713db1eb738 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/1f/cfb8d430acb38bf7c12442a00b08001265d2a8 b/src-xmr-btc-swap/.backupg.git/objects/1f/cfb8d430acb38bf7c12442a00b08001265d2a8 deleted file mode 100644 index 881ab39d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/1f/cfb8d430acb38bf7c12442a00b08001265d2a8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/1f/fd1631eca658f903ed36bb0ce667a5eccbb684 b/src-xmr-btc-swap/.backupg.git/objects/1f/fd1631eca658f903ed36bb0ce667a5eccbb684 deleted file mode 100644 index e6f39d16..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/1f/fd1631eca658f903ed36bb0ce667a5eccbb684 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/20/d9589f7544ecc4a7c04b64ad18599e8f8922ec b/src-xmr-btc-swap/.backupg.git/objects/20/d9589f7544ecc4a7c04b64ad18599e8f8922ec deleted file mode 100644 index 2d7990fe..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/20/d9589f7544ecc4a7c04b64ad18599e8f8922ec and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/21/1263fb225705021e5ecc0c5f7e5e810cc60104 b/src-xmr-btc-swap/.backupg.git/objects/21/1263fb225705021e5ecc0c5f7e5e810cc60104 deleted file mode 100644 index 088527ef..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/21/1263fb225705021e5ecc0c5f7e5e810cc60104 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/21/7053858e37aa34f668e941c72facf253f259cb b/src-xmr-btc-swap/.backupg.git/objects/21/7053858e37aa34f668e941c72facf253f259cb deleted file mode 100644 index 5a204f22..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/21/7053858e37aa34f668e941c72facf253f259cb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/21/77b1882ba0c686a8abff0699e9da622b47bfc1 b/src-xmr-btc-swap/.backupg.git/objects/21/77b1882ba0c686a8abff0699e9da622b47bfc1 deleted file mode 100644 index 230a005d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/21/77b1882ba0c686a8abff0699e9da622b47bfc1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/21/9f99dae6094ef8a691d92c48278673735f003e b/src-xmr-btc-swap/.backupg.git/objects/21/9f99dae6094ef8a691d92c48278673735f003e deleted file mode 100644 index c22253f1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/21/9f99dae6094ef8a691d92c48278673735f003e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/23/2ed9a736532bd59b98f679155620f05a106e8c b/src-xmr-btc-swap/.backupg.git/objects/23/2ed9a736532bd59b98f679155620f05a106e8c deleted file mode 100644 index 858be5a1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/23/2ed9a736532bd59b98f679155620f05a106e8c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/24/76d39ee8af697d2636ff51c832131be0d6f4f4 b/src-xmr-btc-swap/.backupg.git/objects/24/76d39ee8af697d2636ff51c832131be0d6f4f4 deleted file mode 100644 index e53d6e84..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/24/76d39ee8af697d2636ff51c832131be0d6f4f4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/25/e8f68c5a8924aacec4209f5c099e37557ac2da b/src-xmr-btc-swap/.backupg.git/objects/25/e8f68c5a8924aacec4209f5c099e37557ac2da deleted file mode 100644 index e7eb4fa6..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/25/e8f68c5a8924aacec4209f5c099e37557ac2da and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/26/109d6d8a5e90536ec92dd86a0546ffb5970ff7 b/src-xmr-btc-swap/.backupg.git/objects/26/109d6d8a5e90536ec92dd86a0546ffb5970ff7 deleted file mode 100644 index 2945768d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/26/109d6d8a5e90536ec92dd86a0546ffb5970ff7 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/26/1c0c238931d627e3558dd97d5251ad066f9afe b/src-xmr-btc-swap/.backupg.git/objects/26/1c0c238931d627e3558dd97d5251ad066f9afe deleted file mode 100644 index e3af4f13..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/26/1c0c238931d627e3558dd97d5251ad066f9afe and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/26/e66ce9b95b6f84a9dce459e98cf1fbbac1c37d b/src-xmr-btc-swap/.backupg.git/objects/26/e66ce9b95b6f84a9dce459e98cf1fbbac1c37d deleted file mode 100644 index 180b88e2..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/26/e66ce9b95b6f84a9dce459e98cf1fbbac1c37d +++ /dev/null @@ -1,2 +0,0 @@ -x­ŽK -Â0@]çÙ %™æ3/áf’©lSÒñövéÜ=ÞâñR™ç©i@{jUD2%£÷Îöý`³³Æ2q¦`ƒ ®7>€Z©ÊÒtŽÜÀ‘ˆ}ÊÀÞûÄBhl% É{tQÑÞž¥jžª¦Z}Á`‚CŒç{Û7©[·”*ëëÓ=¦öܹKe¾jÁ"8}6ªÃóMþœU÷5S½½iíꦾB–[ \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/28/24ebc893958513539363da17bfa905d5ed1223 b/src-xmr-btc-swap/.backupg.git/objects/28/24ebc893958513539363da17bfa905d5ed1223 deleted file mode 100644 index 9e4846eb..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/28/24ebc893958513539363da17bfa905d5ed1223 +++ /dev/null @@ -1,3 +0,0 @@ -x­ŽA -Â0E]çÙ %“‰ÉD¼„˜¤S-ئ¤)ÒÛÛ¥p÷x<>?—i›¶§VE4c¶ˆÎ™äû€)XGÈrá ž"‹ïapè(ª…«ÌM›0"I2ZÎ&†á­8AÀD}¸@â¬xk¯Rug®{âZf}%o¼# -ç{ßV©k7—*Ë{ïžc{m©ËeºiÖ„HQŸÍê°Çù&žU¥ç&zýðÒÕU}2Ù[ \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/29/3a0bd49bfcb93fb6e48c4fbb0dc6c1c9278d47 b/src-xmr-btc-swap/.backupg.git/objects/29/3a0bd49bfcb93fb6e48c4fbb0dc6c1c9278d47 deleted file mode 100644 index 7b9557c0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/29/3a0bd49bfcb93fb6e48c4fbb0dc6c1c9278d47 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2a/31895cd1bfeefbd2249314c293a59b4ebd1fec b/src-xmr-btc-swap/.backupg.git/objects/2a/31895cd1bfeefbd2249314c293a59b4ebd1fec deleted file mode 100644 index df5f85b0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2a/31895cd1bfeefbd2249314c293a59b4ebd1fec and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2a/7c234fb1315545e8a2561002739fc3ce39606a b/src-xmr-btc-swap/.backupg.git/objects/2a/7c234fb1315545e8a2561002739fc3ce39606a deleted file mode 100644 index 660e2faf..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2a/7c234fb1315545e8a2561002739fc3ce39606a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2c/7b4eaa8d4ef37f77e8859b8034f3e731480652 b/src-xmr-btc-swap/.backupg.git/objects/2c/7b4eaa8d4ef37f77e8859b8034f3e731480652 deleted file mode 100644 index ad36d64c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2c/7b4eaa8d4ef37f77e8859b8034f3e731480652 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2d/55cd3f59f858c10781b0b63a2a9ebcf89c7994 b/src-xmr-btc-swap/.backupg.git/objects/2d/55cd3f59f858c10781b0b63a2a9ebcf89c7994 deleted file mode 100644 index 9e27769e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2d/55cd3f59f858c10781b0b63a2a9ebcf89c7994 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2e/82136b4ebf885e74ad76fe3584785279ea26bd b/src-xmr-btc-swap/.backupg.git/objects/2e/82136b4ebf885e74ad76fe3584785279ea26bd deleted file mode 100644 index 5cb7f406..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2e/82136b4ebf885e74ad76fe3584785279ea26bd and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/2e/9cd07a3ec14fd6b47f46b616c925faddf7f154 b/src-xmr-btc-swap/.backupg.git/objects/2e/9cd07a3ec14fd6b47f46b616c925faddf7f154 deleted file mode 100644 index f6c1adfb..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/2e/9cd07a3ec14fd6b47f46b616c925faddf7f154 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/30/8f9c3c36a30193486117919f01a5f37d307889 b/src-xmr-btc-swap/.backupg.git/objects/30/8f9c3c36a30193486117919f01a5f37d307889 deleted file mode 100644 index 73c19f87..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/30/8f9c3c36a30193486117919f01a5f37d307889 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/30/dcb61509f44f2f55e6aa5d363fd439fb8b26dc b/src-xmr-btc-swap/.backupg.git/objects/30/dcb61509f44f2f55e6aa5d363fd439fb8b26dc deleted file mode 100644 index b4659a47..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/30/dcb61509f44f2f55e6aa5d363fd439fb8b26dc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/31/cd1691dd566d28942cf0a3e948ed5cd5b006e2 b/src-xmr-btc-swap/.backupg.git/objects/31/cd1691dd566d28942cf0a3e948ed5cd5b006e2 deleted file mode 100644 index 36793e54..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/31/cd1691dd566d28942cf0a3e948ed5cd5b006e2 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/32/ac7e341af7c15a15dfe6045b29ba2f27839371 b/src-xmr-btc-swap/.backupg.git/objects/32/ac7e341af7c15a15dfe6045b29ba2f27839371 deleted file mode 100644 index f068ed94..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/32/ac7e341af7c15a15dfe6045b29ba2f27839371 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/32/d2c918c495a4d9a83934e711050016d53d89ee b/src-xmr-btc-swap/.backupg.git/objects/32/d2c918c495a4d9a83934e711050016d53d89ee deleted file mode 100644 index 2e4f9518..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/32/d2c918c495a4d9a83934e711050016d53d89ee and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/34/1768e11b280ae7bc730ebf4e9b112f321a1f1e b/src-xmr-btc-swap/.backupg.git/objects/34/1768e11b280ae7bc730ebf4e9b112f321a1f1e deleted file mode 100644 index d5e23e7f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/34/1768e11b280ae7bc730ebf4e9b112f321a1f1e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/34/683253e629960416e1135a67be240d1941ad01 b/src-xmr-btc-swap/.backupg.git/objects/34/683253e629960416e1135a67be240d1941ad01 deleted file mode 100644 index 06577569..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/34/683253e629960416e1135a67be240d1941ad01 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/35/792b4974ca9559950e4bf8d68dd8d18dd14a9b b/src-xmr-btc-swap/.backupg.git/objects/35/792b4974ca9559950e4bf8d68dd8d18dd14a9b deleted file mode 100644 index 4d774db4..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/35/792b4974ca9559950e4bf8d68dd8d18dd14a9b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/36/7b1dd74ff91e3b1c57f96c9c8421bbd6959f73 b/src-xmr-btc-swap/.backupg.git/objects/36/7b1dd74ff91e3b1c57f96c9c8421bbd6959f73 deleted file mode 100644 index 5c0ff9d2..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/36/7b1dd74ff91e3b1c57f96c9c8421bbd6959f73 +++ /dev/null @@ -1,2 +0,0 @@ -x­KŠÃ0D³Ö)´ýÕ†0Ì%f=tK­Ä[F–rûÑ2È®x‹âU¥º®K—â¥7fɤKv&YÊÙ{ž=4 "RrÊGÇ¡À¬Š;6ÞºÌÊ–¨Ø`ÉêÙhÌÖ…d -ºHrÌl‚ç,ðìÚ$-¶a«›¼APÁÄëý>nÇ´ÕÆûó5Ý—þ8iJuý’:¥ X¯åU(ò?\+~öŒ}|ñ7þ>kݧvˆ7^C \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/38/78765f2af2340c54916e2d0c79fd601eb8041d b/src-xmr-btc-swap/.backupg.git/objects/38/78765f2af2340c54916e2d0c79fd601eb8041d deleted file mode 100644 index 54dfc216..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/38/78765f2af2340c54916e2d0c79fd601eb8041d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/39/352f72d7ba1ecf2fd40c44f68582891dae4d92 b/src-xmr-btc-swap/.backupg.git/objects/39/352f72d7ba1ecf2fd40c44f68582891dae4d92 deleted file mode 100644 index a46c297d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/39/352f72d7ba1ecf2fd40c44f68582891dae4d92 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/3b/7319c69aae73e5e9425e0dda61205d39a6a667 b/src-xmr-btc-swap/.backupg.git/objects/3b/7319c69aae73e5e9425e0dda61205d39a6a667 deleted file mode 100644 index bee6a70f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/3b/7319c69aae73e5e9425e0dda61205d39a6a667 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/3b/b4af8f08bd7a561bd8354d054b479f50b9758b b/src-xmr-btc-swap/.backupg.git/objects/3b/b4af8f08bd7a561bd8354d054b479f50b9758b deleted file mode 100644 index de9bbc48..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/3b/b4af8f08bd7a561bd8354d054b479f50b9758b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/3e/14ccb9659a18a0fb13cd4eb1da6388b2d016d8 b/src-xmr-btc-swap/.backupg.git/objects/3e/14ccb9659a18a0fb13cd4eb1da6388b2d016d8 deleted file mode 100644 index 1377efad..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/3e/14ccb9659a18a0fb13cd4eb1da6388b2d016d8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/3f/31fbb84e8aa66dd4a0c060502a2be7c05e1463 b/src-xmr-btc-swap/.backupg.git/objects/3f/31fbb84e8aa66dd4a0c060502a2be7c05e1463 deleted file mode 100644 index 886650d1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/3f/31fbb84e8aa66dd4a0c060502a2be7c05e1463 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/3f/b6e284ba6022231abc29d47f0029f19ae45088 b/src-xmr-btc-swap/.backupg.git/objects/3f/b6e284ba6022231abc29d47f0029f19ae45088 deleted file mode 100644 index fd5cd3fd..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/3f/b6e284ba6022231abc29d47f0029f19ae45088 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/41/a6e4a624523ac04a4e439ef4ed7e94011d868e b/src-xmr-btc-swap/.backupg.git/objects/41/a6e4a624523ac04a4e439ef4ed7e94011d868e deleted file mode 100644 index 82bf7cba..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/41/a6e4a624523ac04a4e439ef4ed7e94011d868e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/42/031007b22acacceb2d0fa385cdecf2a52a71a4 b/src-xmr-btc-swap/.backupg.git/objects/42/031007b22acacceb2d0fa385cdecf2a52a71a4 deleted file mode 100644 index 2fca792f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/42/031007b22acacceb2d0fa385cdecf2a52a71a4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/42/e5bd8f81acce19061ffb0e7838076cadd1431e b/src-xmr-btc-swap/.backupg.git/objects/42/e5bd8f81acce19061ffb0e7838076cadd1431e deleted file mode 100644 index 53f54b26..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/42/e5bd8f81acce19061ffb0e7838076cadd1431e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/43/c54e4b814db73bc293677b1e19f31128d5efeb b/src-xmr-btc-swap/.backupg.git/objects/43/c54e4b814db73bc293677b1e19f31128d5efeb deleted file mode 100644 index 1b6eca03..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/43/c54e4b814db73bc293677b1e19f31128d5efeb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/43/eff948b1771b967aee30ba02e53fdf70ad402c b/src-xmr-btc-swap/.backupg.git/objects/43/eff948b1771b967aee30ba02e53fdf70ad402c deleted file mode 100644 index ba91e31a..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/43/eff948b1771b967aee30ba02e53fdf70ad402c +++ /dev/null @@ -1 +0,0 @@ -x­ŽKjÄ0³Ö)z?`$µõBÈr}Z3&±d4í…o-s€,ÖÏéÖ–knç4’­©ävõ”–zzÎ1ÝNðXÈx…'LˆûžpWçêáááü›yþÉ\¡Z7aóíŒh \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/6f/1db6564fa108108b7167e10b5860c9a2ca764d b/src-xmr-btc-swap/.backupg.git/objects/6f/1db6564fa108108b7167e10b5860c9a2ca764d deleted file mode 100644 index 92f5d224..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/6f/1db6564fa108108b7167e10b5860c9a2ca764d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/6f/5c5fc8d5d34430aad0aa808a9cd252b7cf84a2 b/src-xmr-btc-swap/.backupg.git/objects/6f/5c5fc8d5d34430aad0aa808a9cd252b7cf84a2 deleted file mode 100644 index 2944ee1f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/6f/5c5fc8d5d34430aad0aa808a9cd252b7cf84a2 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/6f/ed2116508299106a2856b765ec3ebddf2a88c7 b/src-xmr-btc-swap/.backupg.git/objects/6f/ed2116508299106a2856b765ec3ebddf2a88c7 deleted file mode 100644 index 3e2e64d7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/6f/ed2116508299106a2856b765ec3ebddf2a88c7 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/72/17e27a30074662b38724f75d40d38848d8861a b/src-xmr-btc-swap/.backupg.git/objects/72/17e27a30074662b38724f75d40d38848d8861a deleted file mode 100644 index a1c2de27..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/72/17e27a30074662b38724f75d40d38848d8861a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/72/4fe03d4fcccb838b3a3b44b55b0151bc7c18f1 b/src-xmr-btc-swap/.backupg.git/objects/72/4fe03d4fcccb838b3a3b44b55b0151bc7c18f1 deleted file mode 100644 index aea8191b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/72/4fe03d4fcccb838b3a3b44b55b0151bc7c18f1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/72/6ffba691063c1837c2053efdfaa977d020fc54 b/src-xmr-btc-swap/.backupg.git/objects/72/6ffba691063c1837c2053efdfaa977d020fc54 deleted file mode 100644 index 0f6a69f0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/72/6ffba691063c1837c2053efdfaa977d020fc54 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/72/dc5891a74a400a0246dfda6e6af309ec944360 b/src-xmr-btc-swap/.backupg.git/objects/72/dc5891a74a400a0246dfda6e6af309ec944360 deleted file mode 100644 index 73f4e3ed..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/72/dc5891a74a400a0246dfda6e6af309ec944360 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/73/487cc02fc10314b3331cb0ed99cb66210548c1 b/src-xmr-btc-swap/.backupg.git/objects/73/487cc02fc10314b3331cb0ed99cb66210548c1 deleted file mode 100644 index 2cee1466..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/73/487cc02fc10314b3331cb0ed99cb66210548c1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/74/f44b5eb5a505fc606fe2b1338fa6985f3afacd b/src-xmr-btc-swap/.backupg.git/objects/74/f44b5eb5a505fc606fe2b1338fa6985f3afacd deleted file mode 100644 index 90ac0553..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/74/f44b5eb5a505fc606fe2b1338fa6985f3afacd and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/75/42ffaa872893611bdceaf1811bc26a3c2bce81 b/src-xmr-btc-swap/.backupg.git/objects/75/42ffaa872893611bdceaf1811bc26a3c2bce81 deleted file mode 100644 index 49fb5bb9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/75/42ffaa872893611bdceaf1811bc26a3c2bce81 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/77/2a5d9981c8d49df4351b2ae1120d4d88a5ba89 b/src-xmr-btc-swap/.backupg.git/objects/77/2a5d9981c8d49df4351b2ae1120d4d88a5ba89 deleted file mode 100644 index 754853e8..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/77/2a5d9981c8d49df4351b2ae1120d4d88a5ba89 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/77/720b7a18e487bf2bd831e1d5c09024e650e440 b/src-xmr-btc-swap/.backupg.git/objects/77/720b7a18e487bf2bd831e1d5c09024e650e440 deleted file mode 100644 index f8b540e7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/77/720b7a18e487bf2bd831e1d5c09024e650e440 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/77/ecc1791d301ca2cae9fa94c5af4616ec158500 b/src-xmr-btc-swap/.backupg.git/objects/77/ecc1791d301ca2cae9fa94c5af4616ec158500 deleted file mode 100644 index 7cd591b6..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/77/ecc1791d301ca2cae9fa94c5af4616ec158500 +++ /dev/null @@ -1,2 +0,0 @@ -x­Knà †»æ³äò0 TUÕ«ÀxÜXŠÁÁXjn_’E”t7ú4ú_TÖui`”yk•ì$½7Ú[îGtÉ*”ÊS@=Id)vÄ+çýA§8¥Qq°ˆNÑlˆƒ™&ëÒ4k?¦¨¤ˆG;— -iɱÞR¬%çwÒÞãé…~;×}È¥òv¹ ?K;i ²~Bž5!ñÃo¿^àîÞ'ØÅû€fr \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/79/33d9997b448077093f8775931c88fff95ba14b b/src-xmr-btc-swap/.backupg.git/objects/79/33d9997b448077093f8775931c88fff95ba14b deleted file mode 100644 index ce262cb2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/79/33d9997b448077093f8775931c88fff95ba14b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/79/364732ddab9a68d7c1393a05cb8bc8a7d7844d b/src-xmr-btc-swap/.backupg.git/objects/79/364732ddab9a68d7c1393a05cb8bc8a7d7844d deleted file mode 100644 index 8d04e8c9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/79/364732ddab9a68d7c1393a05cb8bc8a7d7844d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/79/41edeb68866f8fe398b7bd38e8e4edb760dbe8 b/src-xmr-btc-swap/.backupg.git/objects/79/41edeb68866f8fe398b7bd38e8e4edb760dbe8 deleted file mode 100644 index 8ca0a98d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/79/41edeb68866f8fe398b7bd38e8e4edb760dbe8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/7a/b4e4b05ff23d3fc455663539b4a3fd371e4fa4 b/src-xmr-btc-swap/.backupg.git/objects/7a/b4e4b05ff23d3fc455663539b4a3fd371e4fa4 deleted file mode 100644 index 2de892ce..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/7a/b4e4b05ff23d3fc455663539b4a3fd371e4fa4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/7e/7968ffbea28b4da471dde60eb438aa2c12ac58 b/src-xmr-btc-swap/.backupg.git/objects/7e/7968ffbea28b4da471dde60eb438aa2c12ac58 deleted file mode 100644 index 36f0901e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/7e/7968ffbea28b4da471dde60eb438aa2c12ac58 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/7f/623f861f2f50a45671790a7d6269b1cf9d2883 b/src-xmr-btc-swap/.backupg.git/objects/7f/623f861f2f50a45671790a7d6269b1cf9d2883 deleted file mode 100644 index 7dc2369a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/7f/623f861f2f50a45671790a7d6269b1cf9d2883 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/7f/c1856c6828f03c958cb63909d9100af622b45e b/src-xmr-btc-swap/.backupg.git/objects/7f/c1856c6828f03c958cb63909d9100af622b45e deleted file mode 100644 index f437266d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/7f/c1856c6828f03c958cb63909d9100af622b45e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/80/a67cfd72d1b971d33d02d647ee0ab8d3c16b67 b/src-xmr-btc-swap/.backupg.git/objects/80/a67cfd72d1b971d33d02d647ee0ab8d3c16b67 deleted file mode 100644 index 5e3421d9..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/80/a67cfd72d1b971d33d02d647ee0ab8d3c16b67 +++ /dev/null @@ -1,2 +0,0 @@ -x­ÁNÄ E]÷+˜õ¤(f2qa¢;?Áð€7CœB¥4:o]˜¸5qyϽ9ÉõešRcJŠ»VcdJp'‚Ñ,á4éÑr@O´uƒ3C7»scƒ•ŽcPÉ£•„:*ðŠyðÚ oA™Ÿ½&¤B­ -´ ˆNnÚ-gGRƒéÜÚ.¥2LÙÕºZ2;‚æZ˜ý/ú°.±.‡\jœ¯·Ã9µËŠ_¦FXËåh,Ûóón£ÛÙÿYÛ½dÖªË ÅÚϵêq¥ï°¼_?ûò‘û)«k©ä~ñ5ÍížívO©=¯øú—·Væã §/ëšÑ \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/81/fa1e82ede8643695e15277fb335115ac2934b9 b/src-xmr-btc-swap/.backupg.git/objects/81/fa1e82ede8643695e15277fb335115ac2934b9 deleted file mode 100644 index ce6e65d2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/81/fa1e82ede8643695e15277fb335115ac2934b9 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/82/0950413c0004cde35e60bb2a214dd946b4b012 b/src-xmr-btc-swap/.backupg.git/objects/82/0950413c0004cde35e60bb2a214dd946b4b012 deleted file mode 100644 index 22313515..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/82/0950413c0004cde35e60bb2a214dd946b4b012 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/83/e0302d67edddacc9050294e8c34228106f19fc b/src-xmr-btc-swap/.backupg.git/objects/83/e0302d67edddacc9050294e8c34228106f19fc deleted file mode 100644 index 34f53e09..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/83/e0302d67edddacc9050294e8c34228106f19fc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/86/2f5ef7edc958c5a638cb0031026ba71c1dc009 b/src-xmr-btc-swap/.backupg.git/objects/86/2f5ef7edc958c5a638cb0031026ba71c1dc009 deleted file mode 100644 index c09a75ae..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/86/2f5ef7edc958c5a638cb0031026ba71c1dc009 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/86/be483d67c11cbd86f24d3c20f8450c95ed37bb b/src-xmr-btc-swap/.backupg.git/objects/86/be483d67c11cbd86f24d3c20f8450c95ed37bb deleted file mode 100644 index a558cb66..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/86/be483d67c11cbd86f24d3c20f8450c95ed37bb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/87/3c6750ad17e4e7baf78470e150a13cf861f2af b/src-xmr-btc-swap/.backupg.git/objects/87/3c6750ad17e4e7baf78470e150a13cf861f2af deleted file mode 100644 index 4f26f8ad..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/87/3c6750ad17e4e7baf78470e150a13cf861f2af and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/88/89a49fd35ef378e3e05d7649c9311849ea7f52 b/src-xmr-btc-swap/.backupg.git/objects/88/89a49fd35ef378e3e05d7649c9311849ea7f52 deleted file mode 100644 index 0840d514..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/88/89a49fd35ef378e3e05d7649c9311849ea7f52 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/88/c5a4d903ea958430bffeee025e50dcd1230aae b/src-xmr-btc-swap/.backupg.git/objects/88/c5a4d903ea958430bffeee025e50dcd1230aae deleted file mode 100644 index 262ab03a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/88/c5a4d903ea958430bffeee025e50dcd1230aae and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/88/d35cb58af6ef7c782dfc6997d37fb76acc3fcd b/src-xmr-btc-swap/.backupg.git/objects/88/d35cb58af6ef7c782dfc6997d37fb76acc3fcd deleted file mode 100644 index 0ae485e0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/88/d35cb58af6ef7c782dfc6997d37fb76acc3fcd and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/89/fb5fa06c94dba1d22bc4536bfb7c17b87d828c b/src-xmr-btc-swap/.backupg.git/objects/89/fb5fa06c94dba1d22bc4536bfb7c17b87d828c deleted file mode 100644 index 3acd411c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/89/fb5fa06c94dba1d22bc4536bfb7c17b87d828c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8a/c818ed4dd396267eb58ac1ae1d90581100bd64 b/src-xmr-btc-swap/.backupg.git/objects/8a/c818ed4dd396267eb58ac1ae1d90581100bd64 deleted file mode 100644 index 3cc94bb2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8a/c818ed4dd396267eb58ac1ae1d90581100bd64 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8b/b2da796659b7ccac77a55e0d3bb9d2cc6b2d12 b/src-xmr-btc-swap/.backupg.git/objects/8b/b2da796659b7ccac77a55e0d3bb9d2cc6b2d12 deleted file mode 100644 index b5559195..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8b/b2da796659b7ccac77a55e0d3bb9d2cc6b2d12 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8c/a188773ac9ed4c724cf1018ffc85804007e8c5 b/src-xmr-btc-swap/.backupg.git/objects/8c/a188773ac9ed4c724cf1018ffc85804007e8c5 deleted file mode 100644 index 41645549..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8c/a188773ac9ed4c724cf1018ffc85804007e8c5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8d/dc1d3fffa055f489b009625e615c38369fb1eb b/src-xmr-btc-swap/.backupg.git/objects/8d/dc1d3fffa055f489b009625e615c38369fb1eb deleted file mode 100644 index 05301778..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8d/dc1d3fffa055f489b009625e615c38369fb1eb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8e/32e6cb85f6a4d8d336da90036437b9a81f1cc4 b/src-xmr-btc-swap/.backupg.git/objects/8e/32e6cb85f6a4d8d336da90036437b9a81f1cc4 deleted file mode 100644 index d594fe41..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8e/32e6cb85f6a4d8d336da90036437b9a81f1cc4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8e/3ac4c3431fa43e5ed62d8c3d659c205571986f b/src-xmr-btc-swap/.backupg.git/objects/8e/3ac4c3431fa43e5ed62d8c3d659c205571986f deleted file mode 100644 index 17143484..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8e/3ac4c3431fa43e5ed62d8c3d659c205571986f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8f/2e8e6054548beeed19ff353bdd2daa7545c878 b/src-xmr-btc-swap/.backupg.git/objects/8f/2e8e6054548beeed19ff353bdd2daa7545c878 deleted file mode 100644 index 84af2fbc..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8f/2e8e6054548beeed19ff353bdd2daa7545c878 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8f/b64671d37fd8294f4174832af5c66d7464cf0e b/src-xmr-btc-swap/.backupg.git/objects/8f/b64671d37fd8294f4174832af5c66d7464cf0e deleted file mode 100644 index 93e30f80..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8f/b64671d37fd8294f4174832af5c66d7464cf0e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/8f/e5ca32ebf8800ad23a2fb368ebeefbfb2426ef b/src-xmr-btc-swap/.backupg.git/objects/8f/e5ca32ebf8800ad23a2fb368ebeefbfb2426ef deleted file mode 100644 index 9eab4184..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/8f/e5ca32ebf8800ad23a2fb368ebeefbfb2426ef and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/91/3b0537194b30b151e4f1dd0089f7402b28def6 b/src-xmr-btc-swap/.backupg.git/objects/91/3b0537194b30b151e4f1dd0089f7402b28def6 deleted file mode 100644 index 2365807d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/91/3b0537194b30b151e4f1dd0089f7402b28def6 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/91/4e1f1e9281748524fba897f9453b776c791ad3 b/src-xmr-btc-swap/.backupg.git/objects/91/4e1f1e9281748524fba897f9453b776c791ad3 deleted file mode 100644 index e8e652b9..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/91/4e1f1e9281748524fba897f9453b776c791ad3 +++ /dev/null @@ -1 +0,0 @@ -x­MjÃ0…»Ö)´ýk ¥ä]—™É¨1Ä–‘å@n_-{€À[<¾ÅÇ{\×uéÚAþèMDS4ÂHŒG‹`©Ø˜JàXBòN¨Ì2«›l]Sq`Š3‰½+AFxN,ìs²Äqš½Â³ßkÓ´lØ^„­nú’I _þÑëyH;¦­6Ù¯éwé÷“&®ë—¶Ùã†3ê‹U :Æwy³V}ï7ì¢å9þÍ^= \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/91/d6aa9f64414f6e447a7a3491ef7f00fac8b3d7 b/src-xmr-btc-swap/.backupg.git/objects/91/d6aa9f64414f6e447a7a3491ef7f00fac8b3d7 deleted file mode 100644 index 394e5ca1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/91/d6aa9f64414f6e447a7a3491ef7f00fac8b3d7 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/91/dc5ce412b5bb78c959cebc34362322995f7cd4 b/src-xmr-btc-swap/.backupg.git/objects/91/dc5ce412b5bb78c959cebc34362322995f7cd4 deleted file mode 100644 index 4409dbc1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/91/dc5ce412b5bb78c959cebc34362322995f7cd4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/92/04039a57a504ea19a2aa4cc733abc1b71f8d10 b/src-xmr-btc-swap/.backupg.git/objects/92/04039a57a504ea19a2aa4cc733abc1b71f8d10 deleted file mode 100644 index 07b7c8e2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/92/04039a57a504ea19a2aa4cc733abc1b71f8d10 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/95/798e84aa95788cb8e76f459bfc068f67f03b4a b/src-xmr-btc-swap/.backupg.git/objects/95/798e84aa95788cb8e76f459bfc068f67f03b4a deleted file mode 100644 index 3285240e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/95/798e84aa95788cb8e76f459bfc068f67f03b4a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/95/f79512d1e0d0e8f7c2a760b0091a3b3719761c b/src-xmr-btc-swap/.backupg.git/objects/95/f79512d1e0d0e8f7c2a760b0091a3b3719761c deleted file mode 100644 index 582da16d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/95/f79512d1e0d0e8f7c2a760b0091a3b3719761c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/96/080ff8771acb5bb1a5da9fe925aa00fea4b5de b/src-xmr-btc-swap/.backupg.git/objects/96/080ff8771acb5bb1a5da9fe925aa00fea4b5de deleted file mode 100644 index cb0d1a4a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/96/080ff8771acb5bb1a5da9fe925aa00fea4b5de and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/96/7c6ce4c42501602e13d3344f8cb22898f67e1a b/src-xmr-btc-swap/.backupg.git/objects/96/7c6ce4c42501602e13d3344f8cb22898f67e1a deleted file mode 100644 index e2f5f31e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/96/7c6ce4c42501602e13d3344f8cb22898f67e1a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/98/4354550042db0171b558c1f6c90c62cb9e0115 b/src-xmr-btc-swap/.backupg.git/objects/98/4354550042db0171b558c1f6c90c62cb9e0115 deleted file mode 100644 index d74605b6..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/98/4354550042db0171b558c1f6c90c62cb9e0115 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/98/cf4635225da770f173973566ec67309618a144 b/src-xmr-btc-swap/.backupg.git/objects/98/cf4635225da770f173973566ec67309618a144 deleted file mode 100644 index e18c9dc1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/98/cf4635225da770f173973566ec67309618a144 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9a/2baf4546e93cecbd5917901892225fc670ed7e b/src-xmr-btc-swap/.backupg.git/objects/9a/2baf4546e93cecbd5917901892225fc670ed7e deleted file mode 100644 index dd646645..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9a/2baf4546e93cecbd5917901892225fc670ed7e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9a/c4d183451c4efe7c1fc7b07b7650cc1eb72a7b b/src-xmr-btc-swap/.backupg.git/objects/9a/c4d183451c4efe7c1fc7b07b7650cc1eb72a7b deleted file mode 100644 index f85d1259..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9a/c4d183451c4efe7c1fc7b07b7650cc1eb72a7b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9b/9cf3ab95d97a07e784ca0b4ef1c924264cae2e b/src-xmr-btc-swap/.backupg.git/objects/9b/9cf3ab95d97a07e784ca0b4ef1c924264cae2e deleted file mode 100644 index 1330cbcf..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9b/9cf3ab95d97a07e784ca0b4ef1c924264cae2e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9e/00a1a109638db369afa1d9fab90f76b5844b8e b/src-xmr-btc-swap/.backupg.git/objects/9e/00a1a109638db369afa1d9fab90f76b5844b8e deleted file mode 100644 index 7ca57dfd..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9e/00a1a109638db369afa1d9fab90f76b5844b8e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9e/8c405bab9df78935a5d9844f1e37c70579b5cc b/src-xmr-btc-swap/.backupg.git/objects/9e/8c405bab9df78935a5d9844f1e37c70579b5cc deleted file mode 100644 index 36dfb737..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9e/8c405bab9df78935a5d9844f1e37c70579b5cc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9e/cc7a023cbf7402e70014be6cba134c7909d49d b/src-xmr-btc-swap/.backupg.git/objects/9e/cc7a023cbf7402e70014be6cba134c7909d49d deleted file mode 100644 index dd1a19e3..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9e/cc7a023cbf7402e70014be6cba134c7909d49d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/9f/9b27e7af6c5c9ce404e929b5c7aa9aad2f04d0 b/src-xmr-btc-swap/.backupg.git/objects/9f/9b27e7af6c5c9ce404e929b5c7aa9aad2f04d0 deleted file mode 100644 index d8638b6b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/9f/9b27e7af6c5c9ce404e929b5c7aa9aad2f04d0 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a0/0ae892f3d6a1675fe461c6e87130ca71a7a335 b/src-xmr-btc-swap/.backupg.git/objects/a0/0ae892f3d6a1675fe461c6e87130ca71a7a335 deleted file mode 100644 index d2d220c4..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a0/0ae892f3d6a1675fe461c6e87130ca71a7a335 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a0/a9bc9f2861469170a377c5a88e460679a5149e b/src-xmr-btc-swap/.backupg.git/objects/a0/a9bc9f2861469170a377c5a88e460679a5149e deleted file mode 100644 index de965d49..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a0/a9bc9f2861469170a377c5a88e460679a5149e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a1/4ae91a696aeda7acd678beb1fd23a7b0cb906c b/src-xmr-btc-swap/.backupg.git/objects/a1/4ae91a696aeda7acd678beb1fd23a7b0cb906c deleted file mode 100644 index 8e7cbea9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a1/4ae91a696aeda7acd678beb1fd23a7b0cb906c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a2/2b6ded7924e2b86c1d1fa8d54639e55543d82d b/src-xmr-btc-swap/.backupg.git/objects/a2/2b6ded7924e2b86c1d1fa8d54639e55543d82d deleted file mode 100644 index 0f8a74a6..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a2/2b6ded7924e2b86c1d1fa8d54639e55543d82d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a2/548da5ecf0ab2d5f8ab9b72467a941a07cdaa4 b/src-xmr-btc-swap/.backupg.git/objects/a2/548da5ecf0ab2d5f8ab9b72467a941a07cdaa4 deleted file mode 100644 index 49d66781..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a2/548da5ecf0ab2d5f8ab9b72467a941a07cdaa4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a3/c233440b6d73b72483ae5ac1689ae6d1f43489 b/src-xmr-btc-swap/.backupg.git/objects/a3/c233440b6d73b72483ae5ac1689ae6d1f43489 deleted file mode 100644 index 06c72630..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a3/c233440b6d73b72483ae5ac1689ae6d1f43489 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a4/3306bd350c849359ab2eda8f1634923c4461d2 b/src-xmr-btc-swap/.backupg.git/objects/a4/3306bd350c849359ab2eda8f1634923c4461d2 deleted file mode 100644 index 8336466e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a4/3306bd350c849359ab2eda8f1634923c4461d2 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a4/37dd51741e9e56e14b5d6024493cb2abfd5259 b/src-xmr-btc-swap/.backupg.git/objects/a4/37dd51741e9e56e14b5d6024493cb2abfd5259 deleted file mode 100644 index 5e522358..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a4/37dd51741e9e56e14b5d6024493cb2abfd5259 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a4/e431bd37897f78823fce51b65f30ee233c95b1 b/src-xmr-btc-swap/.backupg.git/objects/a4/e431bd37897f78823fce51b65f30ee233c95b1 deleted file mode 100644 index ffb3821d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a4/e431bd37897f78823fce51b65f30ee233c95b1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a5/81d3475173c1d6ed816da6b1f13ddd932cb992 b/src-xmr-btc-swap/.backupg.git/objects/a5/81d3475173c1d6ed816da6b1f13ddd932cb992 deleted file mode 100644 index 2b5eda5f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a5/81d3475173c1d6ed816da6b1f13ddd932cb992 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a6/565004ace3e4101bf60a9fb3cb06e56ceaf150 b/src-xmr-btc-swap/.backupg.git/objects/a6/565004ace3e4101bf60a9fb3cb06e56ceaf150 deleted file mode 100644 index 55f8a4b2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a6/565004ace3e4101bf60a9fb3cb06e56ceaf150 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/a9/7330950335d8d8984ea233ba01320e8ed1b39b b/src-xmr-btc-swap/.backupg.git/objects/a9/7330950335d8d8984ea233ba01320e8ed1b39b deleted file mode 100644 index 73b72582..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/a9/7330950335d8d8984ea233ba01320e8ed1b39b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/aa/9b3c46871258ec8b4cf30adfe52c860ec40889 b/src-xmr-btc-swap/.backupg.git/objects/aa/9b3c46871258ec8b4cf30adfe52c860ec40889 deleted file mode 100644 index 15ef5a9d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/aa/9b3c46871258ec8b4cf30adfe52c860ec40889 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ac/c22b335e24d3954cb4d32a3d8f35ce79adf965 b/src-xmr-btc-swap/.backupg.git/objects/ac/c22b335e24d3954cb4d32a3d8f35ce79adf965 deleted file mode 100644 index f284f68d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ac/c22b335e24d3954cb4d32a3d8f35ce79adf965 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ad/b7ce623bf018d59d6efc128b9b76bbfbb70727 b/src-xmr-btc-swap/.backupg.git/objects/ad/b7ce623bf018d59d6efc128b9b76bbfbb70727 deleted file mode 100644 index e571bd31..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ad/b7ce623bf018d59d6efc128b9b76bbfbb70727 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ae/84ea6299f397cbb254ed670532f348fc9aef78 b/src-xmr-btc-swap/.backupg.git/objects/ae/84ea6299f397cbb254ed670532f348fc9aef78 deleted file mode 100644 index 0fdb70b7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ae/84ea6299f397cbb254ed670532f348fc9aef78 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/af/a10277a4964fedacc5a4450fa99aac5530121b b/src-xmr-btc-swap/.backupg.git/objects/af/a10277a4964fedacc5a4450fa99aac5530121b deleted file mode 100644 index e628fcf4..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/af/a10277a4964fedacc5a4450fa99aac5530121b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/af/f3817d71cfb5847dcab7cf0dbf874374dec6ca b/src-xmr-btc-swap/.backupg.git/objects/af/f3817d71cfb5847dcab7cf0dbf874374dec6ca deleted file mode 100644 index 34cc513c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/af/f3817d71cfb5847dcab7cf0dbf874374dec6ca and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b1/d59c76c115e2ec7e3dd7f76fa1688b62245330 b/src-xmr-btc-swap/.backupg.git/objects/b1/d59c76c115e2ec7e3dd7f76fa1688b62245330 deleted file mode 100644 index a4e2302a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b1/d59c76c115e2ec7e3dd7f76fa1688b62245330 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b2/1bd681d99748c046b14202ab79bd8da0143302 b/src-xmr-btc-swap/.backupg.git/objects/b2/1bd681d99748c046b14202ab79bd8da0143302 deleted file mode 100644 index ff23ab3b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b2/1bd681d99748c046b14202ab79bd8da0143302 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b3/636e4b22ba65db9061cd60a77b02c92022dfd6 b/src-xmr-btc-swap/.backupg.git/objects/b3/636e4b22ba65db9061cd60a77b02c92022dfd6 deleted file mode 100644 index de39469f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b3/636e4b22ba65db9061cd60a77b02c92022dfd6 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b4/5962ec80362e0269409fc9a303b52c77a4879d b/src-xmr-btc-swap/.backupg.git/objects/b4/5962ec80362e0269409fc9a303b52c77a4879d deleted file mode 100644 index d6b957ec..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b4/5962ec80362e0269409fc9a303b52c77a4879d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b4/c9a8a5dd46eb723c0608943e3a2300a25d220c b/src-xmr-btc-swap/.backupg.git/objects/b4/c9a8a5dd46eb723c0608943e3a2300a25d220c deleted file mode 100644 index 3893b7a6..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b4/c9a8a5dd46eb723c0608943e3a2300a25d220c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b5/0ecaba403a1a81bf156f4c5f4632eabbf9087c b/src-xmr-btc-swap/.backupg.git/objects/b5/0ecaba403a1a81bf156f4c5f4632eabbf9087c deleted file mode 100644 index 22d2a194..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b5/0ecaba403a1a81bf156f4c5f4632eabbf9087c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b5/d2a9d2a1f98cf85d30f5948b02a7a9ff4dbd26 b/src-xmr-btc-swap/.backupg.git/objects/b5/d2a9d2a1f98cf85d30f5948b02a7a9ff4dbd26 deleted file mode 100644 index 727556c0..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b5/d2a9d2a1f98cf85d30f5948b02a7a9ff4dbd26 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/b8/1f820394d1504ff4b4091473a8263542c9edc4 b/src-xmr-btc-swap/.backupg.git/objects/b8/1f820394d1504ff4b4091473a8263542c9edc4 deleted file mode 100644 index fddd7bc7..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/b8/1f820394d1504ff4b4091473a8263542c9edc4 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ba/130311ded4327f9dc03df46bab783ea1ed1a17 b/src-xmr-btc-swap/.backupg.git/objects/ba/130311ded4327f9dc03df46bab783ea1ed1a17 deleted file mode 100644 index 1ba1e58a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ba/130311ded4327f9dc03df46bab783ea1ed1a17 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/bf/280f206c32fc58e58ec96cea8c376148e2c693 b/src-xmr-btc-swap/.backupg.git/objects/bf/280f206c32fc58e58ec96cea8c376148e2c693 deleted file mode 100644 index 3d19b6a6..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/bf/280f206c32fc58e58ec96cea8c376148e2c693 +++ /dev/null @@ -1 +0,0 @@ -x­;nÃ0DSóÛÈå0‚\eI­d!’hTáÛ› Ýàofr9Ž­Füê•\`çú †¬ÙI$µ'mäâgCFy4„âI•Ï–#±š½ J- “Å™(Y-:­tB­¬tõG©¶“ê+Q-'܃“΄àoèÏÕ¸¶é,•ŸûkZ·þ¸Ò”Ëñ £YJ´1:¸ÉÅ c|çÿÐ:)?ZqÐ/Ã^V8¸5Z¹AÞyü­â dí^4 \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/c0/21d2ba76619c08969ab688db3b27f29257aa6f b/src-xmr-btc-swap/.backupg.git/objects/c0/21d2ba76619c08969ab688db3b27f29257aa6f deleted file mode 100644 index 313e11a5..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c0/21d2ba76619c08969ab688db3b27f29257aa6f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c1/3670aa1c18d5af5305d687e70ebd4159be8d79 b/src-xmr-btc-swap/.backupg.git/objects/c1/3670aa1c18d5af5305d687e70ebd4159be8d79 deleted file mode 100644 index d29e13a8..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c1/3670aa1c18d5af5305d687e70ebd4159be8d79 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c1/d8d7d20363f18de1a85d851f45da7bc4391589 b/src-xmr-btc-swap/.backupg.git/objects/c1/d8d7d20363f18de1a85d851f45da7bc4391589 deleted file mode 100644 index 119a12e3..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c1/d8d7d20363f18de1a85d851f45da7bc4391589 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c2/f378dae71a274d655423e787f48d637aabbd4f b/src-xmr-btc-swap/.backupg.git/objects/c2/f378dae71a274d655423e787f48d637aabbd4f deleted file mode 100644 index efaba953..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c2/f378dae71a274d655423e787f48d637aabbd4f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c5/aa7edb6b55c31014a3110dd23061d68941d022 b/src-xmr-btc-swap/.backupg.git/objects/c5/aa7edb6b55c31014a3110dd23061d68941d022 deleted file mode 100644 index eadd5f78..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c5/aa7edb6b55c31014a3110dd23061d68941d022 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c7/24290b0b9d1ef47a97badb2d79dac6a6b3e525 b/src-xmr-btc-swap/.backupg.git/objects/c7/24290b0b9d1ef47a97badb2d79dac6a6b3e525 deleted file mode 100644 index ebdd00be..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c7/24290b0b9d1ef47a97badb2d79dac6a6b3e525 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c9/167d393d4332212c8f8ce2ccdc3cb615310c20 b/src-xmr-btc-swap/.backupg.git/objects/c9/167d393d4332212c8f8ce2ccdc3cb615310c20 deleted file mode 100644 index d1990cf9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c9/167d393d4332212c8f8ce2ccdc3cb615310c20 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/c9/c20e30e08e192b396f13eb732278e5b7064f67 b/src-xmr-btc-swap/.backupg.git/objects/c9/c20e30e08e192b396f13eb732278e5b7064f67 deleted file mode 100644 index c107fd5e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/c9/c20e30e08e192b396f13eb732278e5b7064f67 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ca/928e3cd9caf9ed8e11035e98f73068fe6f172c b/src-xmr-btc-swap/.backupg.git/objects/ca/928e3cd9caf9ed8e11035e98f73068fe6f172c deleted file mode 100644 index a79551cf..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ca/928e3cd9caf9ed8e11035e98f73068fe6f172c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/cc/d2b35fbf203c1ee761fe8199176de3652d0174 b/src-xmr-btc-swap/.backupg.git/objects/cc/d2b35fbf203c1ee761fe8199176de3652d0174 deleted file mode 100644 index 8bfd224b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/cc/d2b35fbf203c1ee761fe8199176de3652d0174 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ce/01e2542dec599951db94ea606f65925304bf64 b/src-xmr-btc-swap/.backupg.git/objects/ce/01e2542dec599951db94ea606f65925304bf64 deleted file mode 100644 index fbc59898..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ce/01e2542dec599951db94ea606f65925304bf64 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/cf/0e6bcaa0d59508851b1609165994af84dc49d1 b/src-xmr-btc-swap/.backupg.git/objects/cf/0e6bcaa0d59508851b1609165994af84dc49d1 deleted file mode 100644 index 1be7bcab..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/cf/0e6bcaa0d59508851b1609165994af84dc49d1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/cf/644503a8da75e5a4cafece4583b925b7be6621 b/src-xmr-btc-swap/.backupg.git/objects/cf/644503a8da75e5a4cafece4583b925b7be6621 deleted file mode 100644 index 43ce35ce..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/cf/644503a8da75e5a4cafece4583b925b7be6621 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/cf/6a32265ffefc1892631a0873ec9703b3b8e313 b/src-xmr-btc-swap/.backupg.git/objects/cf/6a32265ffefc1892631a0873ec9703b3b8e313 deleted file mode 100644 index f7e7f398..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/cf/6a32265ffefc1892631a0873ec9703b3b8e313 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d0/3fc6bf363b31921ad346c2fa47b18d7de265ed b/src-xmr-btc-swap/.backupg.git/objects/d0/3fc6bf363b31921ad346c2fa47b18d7de265ed deleted file mode 100644 index 1f139308..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d0/3fc6bf363b31921ad346c2fa47b18d7de265ed and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d1/9220e41db7b6435b248663489300ba216ac5fb b/src-xmr-btc-swap/.backupg.git/objects/d1/9220e41db7b6435b248663489300ba216ac5fb deleted file mode 100644 index ee9f5131..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d1/9220e41db7b6435b248663489300ba216ac5fb and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d1/bb9c752ebfa5791ce09f4e559cf758210e4ff8 b/src-xmr-btc-swap/.backupg.git/objects/d1/bb9c752ebfa5791ce09f4e559cf758210e4ff8 deleted file mode 100644 index c8b4821e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d1/bb9c752ebfa5791ce09f4e559cf758210e4ff8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d2/54e06b47a3cb151d3198efbd346ba995881292 b/src-xmr-btc-swap/.backupg.git/objects/d2/54e06b47a3cb151d3198efbd346ba995881292 deleted file mode 100644 index 27b7b168..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d2/54e06b47a3cb151d3198efbd346ba995881292 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d2/8092147e4ca150c9353a8877e7621aa82c057d b/src-xmr-btc-swap/.backupg.git/objects/d2/8092147e4ca150c9353a8877e7621aa82c057d deleted file mode 100644 index 7a745f51..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d2/8092147e4ca150c9353a8877e7621aa82c057d and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d3/ce69d5b267ed373cc868e553af4137ff170ef5 b/src-xmr-btc-swap/.backupg.git/objects/d3/ce69d5b267ed373cc868e553af4137ff170ef5 deleted file mode 100644 index fc10596c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d3/ce69d5b267ed373cc868e553af4137ff170ef5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d4/3296f092642961a4bbea178c951e41f7900f1a b/src-xmr-btc-swap/.backupg.git/objects/d4/3296f092642961a4bbea178c951e41f7900f1a deleted file mode 100644 index d28a410b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d4/3296f092642961a4bbea178c951e41f7900f1a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d4/6abd08d78c7a4cddb27ad902463d16be1c1969 b/src-xmr-btc-swap/.backupg.git/objects/d4/6abd08d78c7a4cddb27ad902463d16be1c1969 deleted file mode 100644 index d6f7d1b8..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d4/6abd08d78c7a4cddb27ad902463d16be1c1969 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d4/b44c333e61eb0c6e93078c805fb36ba3d225e9 b/src-xmr-btc-swap/.backupg.git/objects/d4/b44c333e61eb0c6e93078c805fb36ba3d225e9 deleted file mode 100644 index 90ff43d1..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d4/b44c333e61eb0c6e93078c805fb36ba3d225e9 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d5/fbfb2ab4e57e8a75620cded43bddc1a15daa99 b/src-xmr-btc-swap/.backupg.git/objects/d5/fbfb2ab4e57e8a75620cded43bddc1a15daa99 deleted file mode 100644 index dd2bba72..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d5/fbfb2ab4e57e8a75620cded43bddc1a15daa99 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d6/423a4a512be7ee2f65d36108d6fb3ced8a1005 b/src-xmr-btc-swap/.backupg.git/objects/d6/423a4a512be7ee2f65d36108d6fb3ced8a1005 deleted file mode 100644 index 259cb527..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d6/423a4a512be7ee2f65d36108d6fb3ced8a1005 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d6/aa99d415027f2487d9a4f81309179ad7bd1109 b/src-xmr-btc-swap/.backupg.git/objects/d6/aa99d415027f2487d9a4f81309179ad7bd1109 deleted file mode 100644 index 6220c5ec..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d6/aa99d415027f2487d9a4f81309179ad7bd1109 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d7/209e278f20c5ab02cf2d611bf98bfec93838dc b/src-xmr-btc-swap/.backupg.git/objects/d7/209e278f20c5ab02cf2d611bf98bfec93838dc deleted file mode 100644 index 33344fca..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d7/209e278f20c5ab02cf2d611bf98bfec93838dc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d7/798e31dec0de04246e08baa08f0e3c71e67986 b/src-xmr-btc-swap/.backupg.git/objects/d7/798e31dec0de04246e08baa08f0e3c71e67986 deleted file mode 100644 index 93130081..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d7/798e31dec0de04246e08baa08f0e3c71e67986 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d7/81e50bb66fea42b6a05bed9a578a202b5e5cda b/src-xmr-btc-swap/.backupg.git/objects/d7/81e50bb66fea42b6a05bed9a578a202b5e5cda deleted file mode 100644 index 5e3d210a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d7/81e50bb66fea42b6a05bed9a578a202b5e5cda and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d7/b649b7a682f83cd2b555cbea801dfec9c55847 b/src-xmr-btc-swap/.backupg.git/objects/d7/b649b7a682f83cd2b555cbea801dfec9c55847 deleted file mode 100644 index fd1c0cee..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d7/b649b7a682f83cd2b555cbea801dfec9c55847 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d7/fe91c6815a74520a1c58d00fadba6511850755 b/src-xmr-btc-swap/.backupg.git/objects/d7/fe91c6815a74520a1c58d00fadba6511850755 deleted file mode 100644 index a96db68e..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/d7/fe91c6815a74520a1c58d00fadba6511850755 +++ /dev/null @@ -1 +0,0 @@ -x­MJ1…]÷)2ë1•tR‰ ƒ AwA*Õ•™Fû‡tz1·7 àîñ½—i«²jQnÐ!Xœ´@ž‰ †ÀM¶šÙ15»•ŠÌU5Á$R¢Ζ%Ú19Ÿ†lBŸô¯(Ì€«É0IÌ{v”{^\pZw´×ÛRTg*÷De™Õ9xíûðø‡>ï›”í4/EÖ¯ûé:ÖÛžN¼L1 3V«£6m³Ñv¶Ê?Ïvï³ZË#xôOêpxëÛž>^dû¬Ëzþi.ß`po \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/d8/60e1e6a7cac333c3cc0bc9cb67faf286b07d69 b/src-xmr-btc-swap/.backupg.git/objects/d8/60e1e6a7cac333c3cc0bc9cb67faf286b07d69 deleted file mode 100644 index 7e8a2370..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d8/60e1e6a7cac333c3cc0bc9cb67faf286b07d69 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/d9/5901a46164e7a479c9628872ba18501fe5b996 b/src-xmr-btc-swap/.backupg.git/objects/d9/5901a46164e7a479c9628872ba18501fe5b996 deleted file mode 100644 index 968256c2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/d9/5901a46164e7a479c9628872ba18501fe5b996 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/da/dd5af4fea01711a21d484a2a024ac9e49767b2 b/src-xmr-btc-swap/.backupg.git/objects/da/dd5af4fea01711a21d484a2a024ac9e49767b2 deleted file mode 100644 index 2a3c4838..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/da/dd5af4fea01711a21d484a2a024ac9e49767b2 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/dc/581906544083bb8f9355427c8e094901f9b020 b/src-xmr-btc-swap/.backupg.git/objects/dc/581906544083bb8f9355427c8e094901f9b020 deleted file mode 100644 index f9800e4c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/dc/581906544083bb8f9355427c8e094901f9b020 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/dd/9d465b41d5e4b6bbbdb71601d00886be690b6b b/src-xmr-btc-swap/.backupg.git/objects/dd/9d465b41d5e4b6bbbdb71601d00886be690b6b deleted file mode 100644 index f5f077f3..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/dd/9d465b41d5e4b6bbbdb71601d00886be690b6b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/df/6ab55017c6715f8694c2ff9a18d44ee68b1788 b/src-xmr-btc-swap/.backupg.git/objects/df/6ab55017c6715f8694c2ff9a18d44ee68b1788 deleted file mode 100644 index 37f093fe..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/df/6ab55017c6715f8694c2ff9a18d44ee68b1788 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/e0/fc0c99aff3bc42c919a8c1979f215f207e99f3 b/src-xmr-btc-swap/.backupg.git/objects/e0/fc0c99aff3bc42c919a8c1979f215f207e99f3 deleted file mode 100644 index e77963dd..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/e0/fc0c99aff3bc42c919a8c1979f215f207e99f3 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/e1/152ee9444c9ca8371c46f875c436e5bede53db b/src-xmr-btc-swap/.backupg.git/objects/e1/152ee9444c9ca8371c46f875c436e5bede53db deleted file mode 100644 index 719a5e56..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/e1/152ee9444c9ca8371c46f875c436e5bede53db and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/e1/454512228086ef6dfc528fd61311a9fc099337 b/src-xmr-btc-swap/.backupg.git/objects/e1/454512228086ef6dfc528fd61311a9fc099337 deleted file mode 100644 index a5b499b6..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/e1/454512228086ef6dfc528fd61311a9fc099337 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/e1/4ca1d8a211af41c302676968d9375fe263af86 b/src-xmr-btc-swap/.backupg.git/objects/e1/4ca1d8a211af41c302676968d9375fe263af86 deleted file mode 100644 index 698220ca..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/e1/4ca1d8a211af41c302676968d9375fe263af86 +++ /dev/null @@ -1 +0,0 @@ -x]Ž»Â0 E™ûQÄ-RW>1¸­K y)N©âßqÉ‚²%çøúº3¾SÇÓaó®”Ò[î'´ [¥ëº¹¡k2àf@~$öù_ßÙ;½[#4 K4Æ55à³IYI¦ɬ¸3èÈPz©ÑG•&TÈ©…Üà—Éo–ñ‹^¥¾þJFK̲觤Wš¤©ý/†O¹¦„yiI!„‘…–0"û9öÈ¥°èæ’¥¯’ñ„Æ´`Œ_ö> ÓrþµúT_G$ÚÝÞÕ¹…W©Ÿ¢ÿ^,•˜×Æà ¼}ÄD"Z–k+GF/ÓŒzÞ<¢·á˜8ð{JWsç“!¹¯,"W=¢¥žU¶U•û˜¢=`×Kß«j–¿Lïç¹ÙfŒHç׆XÊ$émiõèh•¢QË®]Þ+ÜwWßÊjÒ»{•èìà:¾äõèVèzà¼d"ÿJ™à=˜ë˜úßþzs'¾±süÌî5£·“)ó†µ!<ˆIG˜§"; 1µÐνì¹$‡^|.ä;­7õiS—ƒïfÛz{âûèG}ú•ôÏ¿ô´‡¬8!ô,#-.‹¿wCå$ \ No newline at end of file diff --git a/src-xmr-btc-swap/.backupg.git/objects/ea/d55667c39a66b66245fd1a1ba40edcb0911c19 b/src-xmr-btc-swap/.backupg.git/objects/ea/d55667c39a66b66245fd1a1ba40edcb0911c19 deleted file mode 100644 index cd571c9d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ea/d55667c39a66b66245fd1a1ba40edcb0911c19 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/eb/1fd42c3bdd55e958fa2807abc40574e6f890f3 b/src-xmr-btc-swap/.backupg.git/objects/eb/1fd42c3bdd55e958fa2807abc40574e6f890f3 deleted file mode 100644 index 72bd2ffa..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/eb/1fd42c3bdd55e958fa2807abc40574e6f890f3 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/eb/81b2857f0cf61ec443679cd08bb15f6c8faf64 b/src-xmr-btc-swap/.backupg.git/objects/eb/81b2857f0cf61ec443679cd08bb15f6c8faf64 deleted file mode 100644 index 9eb55ac5..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/eb/81b2857f0cf61ec443679cd08bb15f6c8faf64 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/eb/ce9f6741a7dc22ba1d0d6612e22cb3ed5576f8 b/src-xmr-btc-swap/.backupg.git/objects/eb/ce9f6741a7dc22ba1d0d6612e22cb3ed5576f8 deleted file mode 100644 index 0cc747cf..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/eb/ce9f6741a7dc22ba1d0d6612e22cb3ed5576f8 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ed/51c030ab91cba5985590054391428e8eeb80d0 b/src-xmr-btc-swap/.backupg.git/objects/ed/51c030ab91cba5985590054391428e8eeb80d0 deleted file mode 100644 index 32b9058b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ed/51c030ab91cba5985590054391428e8eeb80d0 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ef/75019ac6446f7acd979b2b2241ce7ef8a5c37f b/src-xmr-btc-swap/.backupg.git/objects/ef/75019ac6446f7acd979b2b2241ce7ef8a5c37f deleted file mode 100644 index cd241f93..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ef/75019ac6446f7acd979b2b2241ce7ef8a5c37f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ef/9dc36dbe97ad8aba4769690a68177f3b3ade5a b/src-xmr-btc-swap/.backupg.git/objects/ef/9dc36dbe97ad8aba4769690a68177f3b3ade5a deleted file mode 100644 index f3d0ac5e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ef/9dc36dbe97ad8aba4769690a68177f3b3ade5a and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ef/9f11010a0bbab2f701a271fc9570086586ec3e b/src-xmr-btc-swap/.backupg.git/objects/ef/9f11010a0bbab2f701a271fc9570086586ec3e deleted file mode 100644 index 540670db..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ef/9f11010a0bbab2f701a271fc9570086586ec3e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f0/55f47400d6c5972c38d7e080c657e9571fa5a5 b/src-xmr-btc-swap/.backupg.git/objects/f0/55f47400d6c5972c38d7e080c657e9571fa5a5 deleted file mode 100644 index c8c5820c..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f0/55f47400d6c5972c38d7e080c657e9571fa5a5 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f1/26fdd380a2069438ce94a51817e2eb4c3b9ba1 b/src-xmr-btc-swap/.backupg.git/objects/f1/26fdd380a2069438ce94a51817e2eb4c3b9ba1 deleted file mode 100644 index 89c7a1c2..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f1/26fdd380a2069438ce94a51817e2eb4c3b9ba1 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f1/7251c93d4d4fda28e92e4607c96ed487625505 b/src-xmr-btc-swap/.backupg.git/objects/f1/7251c93d4d4fda28e92e4607c96ed487625505 deleted file mode 100644 index b2c3635a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f1/7251c93d4d4fda28e92e4607c96ed487625505 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f2/91db7f4e90491da8a7c51023b86ae0641353dc b/src-xmr-btc-swap/.backupg.git/objects/f2/91db7f4e90491da8a7c51023b86ae0641353dc deleted file mode 100644 index ebea28db..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f2/91db7f4e90491da8a7c51023b86ae0641353dc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f3/f705af2f2e044682ac042b37dba6682a0c8a6b b/src-xmr-btc-swap/.backupg.git/objects/f3/f705af2f2e044682ac042b37dba6682a0c8a6b deleted file mode 100644 index 178de59f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f3/f705af2f2e044682ac042b37dba6682a0c8a6b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f6/cba50212cef2de3c98a0c312deee4fd65c0531 b/src-xmr-btc-swap/.backupg.git/objects/f6/cba50212cef2de3c98a0c312deee4fd65c0531 deleted file mode 100644 index 73972e67..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f6/cba50212cef2de3c98a0c312deee4fd65c0531 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f7/484a9b393affd06d5bf7a28211a80bb46d1f6e b/src-xmr-btc-swap/.backupg.git/objects/f7/484a9b393affd06d5bf7a28211a80bb46d1f6e deleted file mode 100644 index 015cce5d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f7/484a9b393affd06d5bf7a28211a80bb46d1f6e and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f7/58ab03d72060a0cb463d02ee9fbb713a220b98 b/src-xmr-btc-swap/.backupg.git/objects/f7/58ab03d72060a0cb463d02ee9fbb713a220b98 deleted file mode 100644 index fc3ef69b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f7/58ab03d72060a0cb463d02ee9fbb713a220b98 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f7/bc51a443d95def341140550f1c274bfdff5609 b/src-xmr-btc-swap/.backupg.git/objects/f7/bc51a443d95def341140550f1c274bfdff5609 deleted file mode 100644 index a401f015..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f7/bc51a443d95def341140550f1c274bfdff5609 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/f9/bc04839491e66c07b16ab03743c0c53b4109cc b/src-xmr-btc-swap/.backupg.git/objects/f9/bc04839491e66c07b16ab03743c0c53b4109cc deleted file mode 100644 index eda0c816..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/f9/bc04839491e66c07b16ab03743c0c53b4109cc and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fa/31fc7dac5e9a6383f3b68303199df09da0cf57 b/src-xmr-btc-swap/.backupg.git/objects/fa/31fc7dac5e9a6383f3b68303199df09da0cf57 deleted file mode 100644 index 94ecdc42..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fa/31fc7dac5e9a6383f3b68303199df09da0cf57 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fa/4f5cb7542ee6219c554b8797724b152890487c b/src-xmr-btc-swap/.backupg.git/objects/fa/4f5cb7542ee6219c554b8797724b152890487c deleted file mode 100644 index c17c940b..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fa/4f5cb7542ee6219c554b8797724b152890487c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fa/675d5b38173964c9611de426f21aec1a739f2c b/src-xmr-btc-swap/.backupg.git/objects/fa/675d5b38173964c9611de426f21aec1a739f2c deleted file mode 100644 index 1d3423bc..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fa/675d5b38173964c9611de426f21aec1a739f2c and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fa/b0ca240a172c7c69001ae8d3b80376f5147e11 b/src-xmr-btc-swap/.backupg.git/objects/fa/b0ca240a172c7c69001ae8d3b80376f5147e11 deleted file mode 100644 index 3300eb61..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fa/b0ca240a172c7c69001ae8d3b80376f5147e11 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fb/9149e25c5d50fa23248520e4fb632474c0456f b/src-xmr-btc-swap/.backupg.git/objects/fb/9149e25c5d50fa23248520e4fb632474c0456f deleted file mode 100644 index 2d96e0d9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fb/9149e25c5d50fa23248520e4fb632474c0456f and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fb/b3d433ef9370f859bdc7cb7633303a8fcd0185 b/src-xmr-btc-swap/.backupg.git/objects/fb/b3d433ef9370f859bdc7cb7633303a8fcd0185 deleted file mode 100644 index b2e4fc12..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fb/b3d433ef9370f859bdc7cb7633303a8fcd0185 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fd/2dacef755413391d4101b82abda61646430562 b/src-xmr-btc-swap/.backupg.git/objects/fd/2dacef755413391d4101b82abda61646430562 deleted file mode 100644 index 1ef8d71a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fd/2dacef755413391d4101b82abda61646430562 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/fd/79aacc4eb16a7e5f0e56300423d058f8c52c34 b/src-xmr-btc-swap/.backupg.git/objects/fd/79aacc4eb16a7e5f0e56300423d058f8c52c34 deleted file mode 100644 index c2d53e67..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/fd/79aacc4eb16a7e5f0e56300423d058f8c52c34 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ff/273a6179ad5dd768ad57f635a62612f953936b b/src-xmr-btc-swap/.backupg.git/objects/ff/273a6179ad5dd768ad57f635a62612f953936b deleted file mode 100644 index 5bd0573a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ff/273a6179ad5dd768ad57f635a62612f953936b and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/ff/6f5b9ad1f1676219f029a8143b4d585e167a59 b/src-xmr-btc-swap/.backupg.git/objects/ff/6f5b9ad1f1676219f029a8143b4d585e167a59 deleted file mode 100644 index 22604532..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/ff/6f5b9ad1f1676219f029a8143b4d585e167a59 and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/info/commit-graph b/src-xmr-btc-swap/.backupg.git/objects/info/commit-graph deleted file mode 100644 index cb80a21d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/info/commit-graph and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/info/packs b/src-xmr-btc-swap/.backupg.git/objects/info/packs deleted file mode 100644 index 05d38fff..00000000 --- a/src-xmr-btc-swap/.backupg.git/objects/info/packs +++ /dev/null @@ -1,12 +0,0 @@ -P pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.pack -P pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.pack -P pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.pack -P pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.pack -P pack-f69c7eebf688c4d20486169e39e447b07c0e67af.pack -P pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.pack -P pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.pack -P pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.pack -P pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.pack -P pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.pack -P pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.pack - diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.idx deleted file mode 100644 index ef950438..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.pack deleted file mode 100644 index 9c54aaee..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.rev deleted file mode 100644 index 6d4bd28f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-1cfc5c2ae9066a3f45880b1cffb436870ce8f242.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.idx deleted file mode 100644 index c75595ea..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.pack deleted file mode 100644 index 32a35f4a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-420dcc5a294e9a4e8c0c6d6146bc334081e516c4.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.idx deleted file mode 100644 index b984e038..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.pack deleted file mode 100644 index e4a0caf3..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.rev deleted file mode 100644 index 57c52630..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-69299ad93d03eeeda8f868c40e6e3c52c919edeb.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.idx deleted file mode 100644 index f06b627a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.pack deleted file mode 100644 index 7fea110a..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.rev deleted file mode 100644 index 63bd3201..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-795bcc28607f7bdf1a73867d08c5cb3e74d266cd.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.idx deleted file mode 100644 index 5d3c796f..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.pack deleted file mode 100644 index 58409108..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7b36ed3eabf0bc67b1cf0bcbe6e837edc2e1e1ee.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.idx deleted file mode 100644 index 57894f39..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.pack deleted file mode 100644 index 4a1ee163..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-7fba253ae7bc96b776464ec87f50284bf60f72b7.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.idx deleted file mode 100644 index 0850c6ec..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.pack deleted file mode 100644 index 387e2996..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.rev deleted file mode 100644 index 28bdf279..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1515c50f30c862f4730591a1bfbc3bb67c000fa.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.idx deleted file mode 100644 index 755798ea..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.pack deleted file mode 100644 index e63eda50..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.rev deleted file mode 100644 index 522539af..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-a1c70b2b1e7ad0ec70d03cf9bf54a1ca3bb82485.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.idx deleted file mode 100644 index d237f71e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.pack deleted file mode 100644 index 5467fcff..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.rev deleted file mode 100644 index 928220bb..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bb4dabe25a4c7dc5b590e0635b438865ec98278c.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.idx deleted file mode 100644 index 0919523d..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.pack deleted file mode 100644 index 053973a9..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-bd2a07623e907b837713797b7ee8a4d14b2dea72.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.idx b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.idx deleted file mode 100644 index 2c89da13..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.idx and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.pack b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.pack deleted file mode 100644 index f00c9465..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.pack and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.rev b/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.rev deleted file mode 100644 index 8c3c0b6e..00000000 Binary files a/src-xmr-btc-swap/.backupg.git/objects/pack/pack-f69c7eebf688c4d20486169e39e447b07c0e67af.rev and /dev/null differ diff --git a/src-xmr-btc-swap/.backupg.git/packed-refs b/src-xmr-btc-swap/.backupg.git/packed-refs deleted file mode 100644 index df948979..00000000 --- a/src-xmr-btc-swap/.backupg.git/packed-refs +++ /dev/null @@ -1,345 +0,0 @@ -# pack-refs with: peeled fully-peeled sorted -0fe29f85569d41fcf3801ae459fee0c7e1e67c4f refs/heads/0.11.x -eeea9d3927668680fbc291e9e769d8861adcf9f4 refs/heads/blocking-log-appender -74c89aa1f7206fbdca76236b6ee26d1aebdb9720 refs/heads/bob-buffer-transfer-proofs -d664f1e71d292819fb30bbfa6e94d2e87cbe37bf refs/heads/change-monero-node-moneroworld -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/heads/change-xmr-node-moneroworld -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/heads/cooperative-xmr-redeem -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/early-tracing-init -1fdead9e0a8ab5ff9b1b4c6edf7cfa0b02af97fc refs/heads/immediately-fetch-tx -5662f7fe81b1d93eed73621dd102f0fac3d59811 refs/heads/immediately-fetch-tx-2 -fb12cb7c26609fad0ca0eb1a08506e4f5d9e4347 refs/heads/issues-1459 -78049a9cb7a4d45e7016a2056f41fc3e0d06e180 refs/heads/kill-monero-rpc-on-signal-receive -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/list -4e631759b23f7abc6dff1a44e3b7b549d482bfae refs/heads/lock -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/ls -23a27680a48535ee9a92b613e322e7eff398bc29 refs/heads/master -fe2275e15a8524cd8f91c0f2c83a7e01d1667454 refs/heads/master-major-release-bb -01fa359ee58c96f20ae380d5d62fc2615eb87618 refs/heads/monero-rpc-download-0.11x-m1m2 -29beb49332e8dc2793db5db5d848d8b5cc841694 refs/heads/monero-wallet-refresh-fix -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/monero-wallet-rpc-update -427e37d97745089ceffe95a426b8d69c889e14a2 refs/heads/monero-wallet-rpc-upgrade -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/heads/multi-rendezvous -c93eaa8057a78086c7ea4209a298e71ac4cce6fb refs/heads/notify-monero-wallet-sync-progress -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/heads/pr/1417 -6a125776ad5a9e1a813d4579ce3e95c09ce9248e refs/heads/pr/1427 -c3b8186c26f395f451f1e09796b23bd60311ddad refs/heads/pr/1668 -cac2badb41e957761cf3ce93f97b56bdf284ba10 refs/heads/pr/1676 -a4c40979904c834317a9c4eb556030b25b8e3a8a refs/heads/reduce-check-interval-asb-alice -664bc29e40cfc2ab1b8fc447fc6854a762eae112 refs/heads/reduce-check-interval-monero-alice -40e35e65d731fca8fcd6e6560b291a56794eefc8 refs/heads/reduce-check-interval-monero-asb -9d52a8b7f19f230e33c9844006b3f4367e07c573 refs/heads/rpc-server -9b503f336767bab202ca44c8213883ea20c7efcb refs/heads/rpc-server-combine-method-request -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/heads/rpc-server-tracing-log-files -03b94d4b7488a39897a585cb0dbd95fc1d4741d8 refs/heads/sqlx -80e03e3f0b91b8d57b407d510c414b99ce12e4a0 refs/heads/transfer-proof-acknowledgement -f804254f9436287a9b3925784c5feac2a0cf8661 refs/heads/upgrade-jsonrpsee -611d09e5a2dd35e59adc146f2c6981a13190d7da refs/heads/wallet-refresh -344c303613d47ec00bc3210ce1fbed1cd962bc7e refs/remotes/delta12/0.11.x -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/delta12/asb-systemd-setup -7aa6227cbeb78e5eca3bad1bac828564c8bb9544 refs/remotes/delta12/base64-vergen-bdk -8a994807328f36602f462033ccf9fc94d49187f2 refs/remotes/delta12/bdk-hacking -4c16367d9e08b5ac4393f10a1e5df72457b16bc6 refs/remotes/delta12/ci-armv7-cross -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/delta12/cleanup-module-boundaries -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/delta12/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/delta12/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/delta12/demo -41aa1b301e146b4915c3f819102c303cacda1a21 refs/remotes/delta12/dependabot/cargo/backoff-0.4.0 -cff4e0296866e35e06a5427f3fd751ddc4218f25 refs/remotes/delta12/dependabot/cargo/bdk-0.16.0 -eddfd526782572e900cc75031feae5f8920434f2 refs/remotes/delta12/dependabot/cargo/comfy-table-5.0.0 -b79c057320059d64a1a4dd541b11d6c3cdd21245 refs/remotes/delta12/dependabot/cargo/dialoguer-0.9.0 -563a7ccf3ae531b0a31e8e10ade6188569f4ef48 refs/remotes/delta12/dependabot/cargo/rust_decimal-1.21.0 -afff5e12cee53e695a6608e4553167e0d68a4837 refs/remotes/delta12/dependabot/cargo/sha2-0.10.1 -2b22a38eae92c79c2a86de10bf58483ef377731e refs/remotes/delta12/dependabot/cargo/tempfile-3.3.0 -30991818a7cb0bb5fb89d61c05866213a79c068f refs/remotes/delta12/dependabot/cargo/time-0.3.7 -0da442411275726932ce682f0e678d5869c329f5 refs/remotes/delta12/dependabot/cargo/tokio-1.16.1 -df3f91c994e92ac825087c055316f5faaea9d1df refs/remotes/delta12/dependabot/cargo/torut-0.2.1 -5c6fafb50648f19593583d8f143d0bef097ea499 refs/remotes/delta12/dependabot/github_actions/actions/setup-python-2.3.2 -dc9b9b9778a7fe329b2cdea0ab480fb703888474 refs/remotes/delta12/dependabot/github_actions/thomaseizinger/keep-a-changelog-new-release-1.3.0 -6bf472fc126582529013a001756b9d3e5d637a8f refs/remotes/delta12/dependencies -139a9d8ce122f2f9eae2696d85e6d61fd9419b41 refs/remotes/delta12/deps1 -5a3675a06fcafe2dcc2ab9ff2c0096423362431c refs/remotes/delta12/dev -8a0ccc08dcd13c4b31af52f46f3345ff25db6d12 refs/remotes/delta12/dev2 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/delta12/discover-makers-cli -10e503a3ae016d46f7174f497ecbf7a106afd9c0 refs/remotes/delta12/docker-asb -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/delta12/docs -00cfce57c77f251467f204e05bea5c50f9767cc0 refs/remotes/delta12/dprint-fix -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/delta12/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/delta12/fix-confirmations -9e96ef64d3d5c6444dcf8cda92eba232186614e4 refs/remotes/delta12/identify-protocol -9346cb7baf17f56eb8dd8ace5edd98d0c9583159 refs/remotes/delta12/issues-1273 -fb12cb7c26609fad0ca0eb1a08506e4f5d9e4347 refs/remotes/delta12/issues-1459 -eacfe79b4a810dff47698fd51c07cdd6f173535a refs/remotes/delta12/issues-1459-ci -7dcd9fe20a8fca3dcfc6d88b4592a8cc4493a63d refs/remotes/delta12/libp2p -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/delta12/manual-sync -b7347da27a2cb5e0fb9e7ab1dc96b53ca96f2d55 refs/remotes/delta12/master -a99efa09dd0d3b2b1c7a8d1a94737895e0601458 refs/remotes/delta12/monero2 -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/delta12/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/delta12/on-chain-protocol -39e34a608b93e3960e43b49c96f58318ea0e59e0 refs/remotes/delta12/overflow-fix -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/delta12/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/delta12/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/delta12/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/delta12/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/delta12/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/delta12/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/delta12/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/delta12/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/delta12/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/delta12/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/delta12/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/delta12/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/delta12/rendezvous-demo -f066c2a1a155341b6956c6d1c9a9c2468d74787b refs/remotes/delta12/rpc-server -acdba8474bf52787ef4bfd02e6fd7017ba4ca0e4 refs/remotes/delta12/rust-1.65 -dbb66fe6b743edc8dc769602f48cea4b1f6448a5 refs/remotes/delta12/rust-1.70 -2c2fb7f35058edbc52d0a53b1ecbc373404e316a refs/remotes/delta12/secp256kfun -651e2a91e5f1769d6f6ed02d32815760b8f40b7f refs/remotes/delta12/sha2 -7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 refs/remotes/delta12/sha256sum -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/delta12/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/delta12/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/delta12/sqlite2 -db039b022a5327524832e5e6aa06200726b5ca75 refs/remotes/delta12/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/delta12/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/delta12/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/delta12/test-refactor -237a9dcec5046393b6fd199adc6bc5bb09dc0780 refs/remotes/delta12/testcontainers -8eff499a630f951bbcca563268eed7b5d7b06fcc refs/remotes/delta12/tracing -e7e68b07af41224217c7cdaa0e0e89498784b18e refs/remotes/delta12/windows-ci -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/delta12/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/delta12/xmr-adaptor-signatures-publish-on-testnet -344c303613d47ec00bc3210ce1fbed1cd962bc7e refs/remotes/delta1upstream/0.11.x -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/delta1upstream/asb-systemd-setup -7aa6227cbeb78e5eca3bad1bac828564c8bb9544 refs/remotes/delta1upstream/base64-vergen-bdk -8a994807328f36602f462033ccf9fc94d49187f2 refs/remotes/delta1upstream/bdk-hacking -4c16367d9e08b5ac4393f10a1e5df72457b16bc6 refs/remotes/delta1upstream/ci-armv7-cross -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/delta1upstream/cleanup-module-boundaries -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/delta1upstream/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/delta1upstream/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/delta1upstream/demo -41aa1b301e146b4915c3f819102c303cacda1a21 refs/remotes/delta1upstream/dependabot/cargo/backoff-0.4.0 -cff4e0296866e35e06a5427f3fd751ddc4218f25 refs/remotes/delta1upstream/dependabot/cargo/bdk-0.16.0 -eddfd526782572e900cc75031feae5f8920434f2 refs/remotes/delta1upstream/dependabot/cargo/comfy-table-5.0.0 -b79c057320059d64a1a4dd541b11d6c3cdd21245 refs/remotes/delta1upstream/dependabot/cargo/dialoguer-0.9.0 -563a7ccf3ae531b0a31e8e10ade6188569f4ef48 refs/remotes/delta1upstream/dependabot/cargo/rust_decimal-1.21.0 -afff5e12cee53e695a6608e4553167e0d68a4837 refs/remotes/delta1upstream/dependabot/cargo/sha2-0.10.1 -2b22a38eae92c79c2a86de10bf58483ef377731e refs/remotes/delta1upstream/dependabot/cargo/tempfile-3.3.0 -30991818a7cb0bb5fb89d61c05866213a79c068f refs/remotes/delta1upstream/dependabot/cargo/time-0.3.7 -0da442411275726932ce682f0e678d5869c329f5 refs/remotes/delta1upstream/dependabot/cargo/tokio-1.16.1 -df3f91c994e92ac825087c055316f5faaea9d1df refs/remotes/delta1upstream/dependabot/cargo/torut-0.2.1 -5c6fafb50648f19593583d8f143d0bef097ea499 refs/remotes/delta1upstream/dependabot/github_actions/actions/setup-python-2.3.2 -dc9b9b9778a7fe329b2cdea0ab480fb703888474 refs/remotes/delta1upstream/dependabot/github_actions/thomaseizinger/keep-a-changelog-new-release-1.3.0 -6bf472fc126582529013a001756b9d3e5d637a8f refs/remotes/delta1upstream/dependencies -139a9d8ce122f2f9eae2696d85e6d61fd9419b41 refs/remotes/delta1upstream/deps1 -5a3675a06fcafe2dcc2ab9ff2c0096423362431c refs/remotes/delta1upstream/dev -8a0ccc08dcd13c4b31af52f46f3345ff25db6d12 refs/remotes/delta1upstream/dev2 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/delta1upstream/discover-makers-cli -10e503a3ae016d46f7174f497ecbf7a106afd9c0 refs/remotes/delta1upstream/docker-asb -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/delta1upstream/docs -00cfce57c77f251467f204e05bea5c50f9767cc0 refs/remotes/delta1upstream/dprint-fix -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/delta1upstream/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/delta1upstream/fix-confirmations -9e96ef64d3d5c6444dcf8cda92eba232186614e4 refs/remotes/delta1upstream/identify-protocol -9346cb7baf17f56eb8dd8ace5edd98d0c9583159 refs/remotes/delta1upstream/issues-1273 -7dcd9fe20a8fca3dcfc6d88b4592a8cc4493a63d refs/remotes/delta1upstream/libp2p -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/delta1upstream/manual-sync -4ca1f8da5ef7e6964bfd02fd8859bba56084afff refs/remotes/delta1upstream/master -a99efa09dd0d3b2b1c7a8d1a94737895e0601458 refs/remotes/delta1upstream/monero2 -4520708bc83859a6b538aeac4a7d46532ed2cfc5 refs/remotes/delta1upstream/multi-rendezvous -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/delta1upstream/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/delta1upstream/on-chain-protocol -39e34a608b93e3960e43b49c96f58318ea0e59e0 refs/remotes/delta1upstream/overflow-fix -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/delta1upstream/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/delta1upstream/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/delta1upstream/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/delta1upstream/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/delta1upstream/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/delta1upstream/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/delta1upstream/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/delta1upstream/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/delta1upstream/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/delta1upstream/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/delta1upstream/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/delta1upstream/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/delta1upstream/rendezvous-demo -acdba8474bf52787ef4bfd02e6fd7017ba4ca0e4 refs/remotes/delta1upstream/rust-1.65 -2c2fb7f35058edbc52d0a53b1ecbc373404e316a refs/remotes/delta1upstream/secp256kfun -651e2a91e5f1769d6f6ed02d32815760b8f40b7f refs/remotes/delta1upstream/sha2 -7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 refs/remotes/delta1upstream/sha256sum -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/delta1upstream/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/delta1upstream/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/delta1upstream/sqlite2 -f0e059c814a257f6593cb6c354b2d084f36f58d5 refs/remotes/delta1upstream/sqlx -db039b022a5327524832e5e6aa06200726b5ca75 refs/remotes/delta1upstream/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/delta1upstream/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/delta1upstream/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/delta1upstream/test-refactor -8eff499a630f951bbcca563268eed7b5d7b06fcc refs/remotes/delta1upstream/tracing -e7e68b07af41224217c7cdaa0e0e89498784b18e refs/remotes/delta1upstream/windows-ci -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/delta1upstream/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/delta1upstream/xmr-adaptor-signatures-publish-on-testnet -53c80609af588edf69f3726db5ecbc1f37528ed9 refs/remotes/github-desktop-patrini32/0.11.x -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/github-desktop-patrini32/asb-systemd-setup -2290f82e16123599503ebea6ae130a5ec50f87df refs/remotes/github-desktop-patrini32/bump-rustc-version-for-release-bins-ci -22cdad338bdc89ec0ef94a97789e9e4993915b53 refs/remotes/github-desktop-patrini32/bungy-corrupted-database -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/remotes/github-desktop-patrini32/change-xmr-node-moneroworld -a2d12b6eab7b1cec31d1e45d27a1d8e3d204d99d refs/remotes/github-desktop-patrini32/ci -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/github-desktop-patrini32/cleanup-module-boundaries -cac2badb41e957761cf3ce93f97b56bdf284ba10 refs/remotes/github-desktop-patrini32/cooperative-release-of-funds -fa3b252f76b68bdcb4533968b86c9761db521366 refs/remotes/github-desktop-patrini32/cooperative-release-of-funds-CI -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/remotes/github-desktop-patrini32/cooperative-xmr-redeem -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/github-desktop-patrini32/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/github-desktop-patrini32/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/github-desktop-patrini32/demo -6d6bd93315ef16917e12c268f855fadd05fec71e refs/remotes/github-desktop-patrini32/dependabot/cargo/bdk-0.29.0 -1594bcb170bf6e85ceb967df73bc894c5e0e35ad refs/remotes/github-desktop-patrini32/dependabot/cargo/ed25519-dalek-2.1.1 -7e5282c30d420284ee508367c650b6067ee66961 refs/remotes/github-desktop-patrini32/dependabot/cargo/jsonrpsee-0.22.5 -9059e8bc955ae2cdb77407b73ca6d116a977563c refs/remotes/github-desktop-patrini32/dependabot/cargo/jsonrpsee-core-0.22.5 -9a1df270cb394c516f474be094ddf9c4f8e6fa19 refs/remotes/github-desktop-patrini32/dependabot/cargo/libp2p-0.48.0 -1d7f9dfd894cec3d7cad9f84daa63095e5d9eeaf refs/remotes/github-desktop-patrini32/dependabot/cargo/mockito-1.3.1 -4f58539ca9c3e9bdd0c7286385aec891b4ed8fbb refs/remotes/github-desktop-patrini32/dependabot/cargo/tokio-1.38.0 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/github-desktop-patrini32/discover-makers-cli -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/github-desktop-patrini32/docs -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/github-desktop-patrini32/early-tracing-init -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/github-desktop-patrini32/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/github-desktop-patrini32/fix-confirmations -2921d61ebc9211d4e0bda3f3dadd42d7e63b572a refs/remotes/github-desktop-patrini32/kill-monero-rpc-on-signal-receive -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/github-desktop-patrini32/manual-sync -c3b8186c26f395f451f1e09796b23bd60311ddad refs/remotes/github-desktop-patrini32/master -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/github-desktop-patrini32/monero-wallet-rpc-update -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/github-desktop-patrini32/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/github-desktop-patrini32/on-chain-protocol -e6686b7aa12bbff0d10f5ebeb8fcd7466066cf01 refs/remotes/github-desktop-patrini32/pr/1427 -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/github-desktop-patrini32/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/github-desktop-patrini32/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/github-desktop-patrini32/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/github-desktop-patrini32/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/github-desktop-patrini32/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/github-desktop-patrini32/random-branch -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/github-desktop-patrini32/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/github-desktop-patrini32/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/github-desktop-patrini32/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/github-desktop-patrini32/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/github-desktop-patrini32/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/github-desktop-patrini32/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/github-desktop-patrini32/rendezvous-demo -a3455d6032a6e407769ef9af818dd7f9f1914763 refs/remotes/github-desktop-patrini32/roc -3eb4c0db433f78dd65647bf355464959eb5492aa refs/remotes/github-desktop-patrini32/rpc-server -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/remotes/github-desktop-patrini32/rpc-server-tracing-log-files -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/github-desktop-patrini32/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/github-desktop-patrini32/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/github-desktop-patrini32/sqlite2 -e1c3a5d991b888b70ebfb75a1f3782b4b2013975 refs/remotes/github-desktop-patrini32/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/github-desktop-patrini32/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/github-desktop-patrini32/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/github-desktop-patrini32/test-refactor -f3cf0045910b9c26b148e7d193207f8b0751e61a refs/remotes/github-desktop-patrini32/transfer-proof-acknowledgement -3d9b984c5ed442966501b65e6f68a9a7104327eb refs/remotes/github-desktop-patrini32/trying -f0b4735163528add8d0b651ba482f205e6dbc134 refs/remotes/github-desktop-patrini32/wait-for-cancel-timelock-when-enc-sig-fails -2e181dac9cb479883aa7139636188d23acb8f1de refs/remotes/github-desktop-patrini32/wallet-force-sync-on-first-subscribe -58fc70e8371247ebaf3aa1b8353a748d3332fe0f refs/remotes/github-desktop-patrini32/wallet-refresh -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/github-desktop-patrini32/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/github-desktop-patrini32/xmr-adaptor-signatures-publish-on-testnet -53c80609af588edf69f3726db5ecbc1f37528ed9 refs/remotes/origin/0.11.x -35f206ca12040f5c834c3e98baec1b672cf3953a refs/remotes/origin/asb-systemd-setup -2290f82e16123599503ebea6ae130a5ec50f87df refs/remotes/origin/bump-rustc-version-for-release-bins-ci -22cdad338bdc89ec0ef94a97789e9e4993915b53 refs/remotes/origin/bungy-corrupted-database -2e7954fcbb5b9d47549ec4c9bf1c4fe97c47c348 refs/remotes/origin/change-xmr-node-moneroworld -a11c9d9c038c3cc3b4a90cc3f483a22f39001b43 refs/remotes/origin/cleanup-module-boundaries -4f6ff205802eccf4ca2ab7f124bdf202122085d9 refs/remotes/origin/cooperative-xmr-redeem -f892efc0ac238b32ece43a71cca93f8b5b14f5b0 refs/remotes/origin/debug-remodel-tor -e6818f9dee858e3ac4b43bb77c4bd10b190fdd52 refs/remotes/origin/debug-remodel-tor-same-port -7248af949837b1b4afaaae517530b08f5b90f9a8 refs/remotes/origin/demo -6d6bd93315ef16917e12c268f855fadd05fec71e refs/remotes/origin/dependabot/cargo/bdk-0.29.0 -1594bcb170bf6e85ceb967df73bc894c5e0e35ad refs/remotes/origin/dependabot/cargo/ed25519-dalek-2.1.1 -82178afa0447666619242c0180186164d2b2d99f refs/remotes/origin/dependabot/cargo/jsonrpsee-0.22.5 -d5a10b1c57e92c7343812c1541418501d89c242e refs/remotes/origin/dependabot/cargo/jsonrpsee-core-0.23.2 -9a1df270cb394c516f474be094ddf9c4f8e6fa19 refs/remotes/origin/dependabot/cargo/libp2p-0.48.0 -281e83a00bf82fedb780f413dec6dd8d59349e4e refs/remotes/origin/discover-makers-cli -44570ff5984ee80807e5c7cb05fd84101e61a19a refs/remotes/origin/docs -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/origin/early-tracing-init -641274019d956f8bcba3c1c89e55649f6a3a832f refs/remotes/origin/feature/libp2p-release -d4d42ae3ae8e19d0e2e185b2a19c5eb1aabd437f refs/remotes/origin/fix-confirmations -2921d61ebc9211d4e0bda3f3dadd42d7e63b572a refs/remotes/origin/kill-monero-rpc-on-signal-receive -82d75588baddcb515ca989930aa023ed1fda5a2e refs/remotes/origin/manual-sync -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/remotes/origin/master -427e37d97745089ceffe95a426b8d69c889e14a2 refs/remotes/origin/monero-wallet-rpc-update -17a4ca0ebb24c234364ca699d089144bca2c43a2 refs/remotes/origin/no-transfer-proof-failure -7aabc8703d4423aac02b4b09b078786e09e9712e refs/remotes/origin/on-chain-protocol -e6686b7aa12bbff0d10f5ebeb8fcd7466066cf01 refs/remotes/origin/pr/1427 -8f9824d58e045c33b1dbf6a70c1986f2a71b22f4 refs/remotes/origin/print-priv-view-key -08c5d1c12e6807b5fe1ecf0fa8102d1a9794f678 refs/remotes/origin/quad9-dns -4c9372575543d0071950381e5005be77fbca43fc refs/remotes/origin/quote-protocol-libp2p-relay -de642e542fef00a6c287c8dd760ecc9d51d50e7c refs/remotes/origin/quote-protocol-refactor -bd943e69616d5b8d39776c0873767f41ec2b678e refs/remotes/origin/quote-websocket -dd624b1df9cdb709004327f6d12d94b1ca52d86a refs/remotes/origin/random-branch -664bc29e40cfc2ab1b8fc447fc6854a762eae112 refs/remotes/origin/reduce-check-interval-monero-alice -40e35e65d731fca8fcd6e6560b291a56794eefc8 refs/remotes/origin/reduce-check-interval-monero-asb -c6db22d8822b7d1ad5d7d29d383245d568a14c91 refs/remotes/origin/refactor-network-code -23c2e6d5abfa849466cd8fd7c330602c9ca6de4f refs/remotes/origin/relay-fee-debug -a9e0a68e68ccfd5c7a0af9335451db656d672766 refs/remotes/origin/remodel-tor -971eabf4c2e0506639df6fa18bca2c6c30195c3a refs/remotes/origin/remove-bytes-serde-module -b0645bb96eb712c947b8b9863eba00a66c445291 refs/remotes/origin/rendezvous-asb-refactor -0e3e0fb4cb20a810dc864c6b0abba9abfe076add refs/remotes/origin/rendezvous-cli -7fba6e8fbf4303b26045ab739f7971ae594f0451 refs/remotes/origin/rendezvous-demo -a3455d6032a6e407769ef9af818dd7f9f1914763 refs/remotes/origin/roc -3eb4c0db433f78dd65647bf355464959eb5492aa refs/remotes/origin/rpc-server -24cb1d25209cfad2f1dda3543cb598d5386f6d98 refs/remotes/origin/rpc-server-tracing-log-files -f1b115b5630672c63dc87c41c53933ec98412d94 refs/remotes/origin/small-ux-improvements -7be6655d73b415a5307893d5eb4528933ba13d6a refs/remotes/origin/sqlite -f12879782f6487850814cfa11a14255fbf958415 refs/remotes/origin/sqlite2 -e1c3a5d991b888b70ebfb75a1f3782b4b2013975 refs/remotes/origin/staging -63cfcf22e0f3d5992dd81cfd428c07ac27101e12 refs/remotes/origin/swap-setup-proto -832d960543377fd0dfe45902ed02bbcfe32bece4 refs/remotes/origin/swap-setup-proto-rishab -9e6b56564d7c37e0e8f93990a360155345c74909 refs/remotes/origin/test-refactor -f3cf0045910b9c26b148e7d193207f8b0751e61a refs/remotes/origin/transfer-proof-acknowledgement -3d9b984c5ed442966501b65e6f68a9a7104327eb refs/remotes/origin/trying -f0b4735163528add8d0b651ba482f205e6dbc134 refs/remotes/origin/wait-for-cancel-timelock-when-enc-sig-fails -2e181dac9cb479883aa7139636188d23acb8f1de refs/remotes/origin/wallet-force-sync-on-first-subscribe -0c501ba2cc94ed7d6982604ede26d349d115f0e3 refs/remotes/origin/xmr-adaptor-signatures -d3e5bdcb59eed212b5c80a4ee5beaf0f0f017fa4 refs/remotes/origin/xmr-adaptor-signatures-publish-on-testnet -828038949521fa9bb0828ed25046b36d812fabe1 refs/remotes/pokkst/bugfix/asb-sync-startup -6a125776ad5a9e1a813d4579ce3e95c09ce9248e refs/remotes/pokkst/bugfix/bob-xmrlocked-redeemed -5182b4f53a741eebc3b734e980904d2e5a8113d1 refs/remotes/pokkst/bugfix/lock-tx-timeout-issue -d7d87d96ac438746838aab86c52f1e05fc596ef3 refs/remotes/pokkst/bugfix/windows-asb-xmr-tx-locking -019fbbbea67d0533ce9aa17cb664918b6822a1ec refs/remotes/pokkst/develop -82cbea49186b3c39463ca0aa14879498a67b5171 refs/remotes/pokkst/feature/asb-tor -8d2f417c262f573eafdbf7a7e09bb8cb7e3deff8 refs/remotes/pokkst/master -7d5a6043843a9154d62252af5178fa6c269ea085 refs/remotes/yama/master -9d52a8b7f19f230e33c9844006b3f4367e07c573 refs/remotes/yama/rpc-server -81688fe6239b71daad51e4c19d6d457149f77bc8 refs/stash -490c1d2ec133a899d0f0f11987c8abb9caa3f56c refs/tags/0.10.0 -83f12e17c0838751432b84e8dc1bfda808ea563d refs/tags/0.10.1 -3ce4dffb84d0c2e01b011864cd36dabc64faf25c refs/tags/0.10.2 -9c688cf7783883fc3b9b7e8b040342e86f5a6a5b refs/tags/0.11.0 -0672e3548a7db4ed6a80060067eec79933cdfac8 refs/tags/0.11.1 -59f3775d42a371f2060ed4ecc989e309c162ee76 refs/tags/0.11.2 -^d098a898618f533d3b68aa43a0f97196b95fd761 -f825dea69f9169db73a3640f4055eeaad5df0a6e refs/tags/0.11.3 -^f4a5bef50bfed1aca49cb4451c932132296a7304 -de18f7dab8ef039c50e8ddae1480590f493cdb6d refs/tags/0.11.4 -^f7c15fa9d0010585d6ba6ca0b5dd00f3c3b7b30a -421252ffc47c531cbab72659ec23432669cc2b8c refs/tags/0.11.5 -^7b2eeb02eba7ac6cc80ae0d3061cecc1d58a4ae9 -26e44400835572cadb93c7d1dc5db39f27663542 refs/tags/0.12.0 -b75b3e64a9c798820b1005b747f4a82a84dc75b7 refs/tags/0.12.1 -20afb35d5b39d983cc08f82d54b5a76946526b0d refs/tags/0.12.2 -2de492f23a8e30594b423aa89e2ad7f0aec34507 refs/tags/0.12.3 -2932abc9ec2475717944afa02aeaad73f3c98f16 refs/tags/0.13.0 -a3b1e772b2700ce0b4b8f2d932c84b9902fd9f11 refs/tags/0.13.1 -415323e4fcebc81e7e6ad0fdc50c600914575a36 refs/tags/0.13.2 -22fe24f54d8cfd163dc1bb6156ea692596b22087 refs/tags/0.4.0 -822997c0c354226f94a8e87246e4d4e4ec77e582 refs/tags/0.5.0 -ca6cb0a76ad5207f335adeeed9e0aa4c91f57286 refs/tags/0.6.0 -4a5e9d47b722297b0439167c9c29feef30fcf758 refs/tags/0.7.0 -21f4295e94e4b2cb5259461617e7b87efb69d76c refs/tags/0.8.0 -cdb2939746e941b335fa8c7bbdc0f43a83c13013 refs/tags/0.8.1 -699b16bc43ac05fb48cbc0ec4c8c900361af40b6 refs/tags/0.8.2 -def03b0c957861769eb0206795ba39b8c83f8c80 refs/tags/0.8.3 -72e75c6e022c1429d039bff6d248474848a7c172 refs/tags/0.9.0 -d483651ef4032121ec115d01c5b1222b259fd0fa refs/tags/preview -1de3fa486e9825141270a07d94da81c6cc4c2d9d refs/tags/v0.1 -3ad2d4b90fb778b16d3c486e7c85561e16ca03f8 refs/tags/v0.11.1 -^0519221f3fffdd361fa173609fef36d188fef5c3 -52483a5a43e10f76bce92d97cb9b0b3f444c39dd refs/tags/v0.2 -bd82ae9e98a17e499e53d8f758fde44870e8b047 refs/tags/v0.3 diff --git a/src-xmr-btc-swap/.backupg.git/refs/heads/master b/src-xmr-btc-swap/.backupg.git/refs/heads/master deleted file mode 100644 index 596cb75a..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -c5aa7edb6b55c31014a3110dd23061d68941d022 diff --git a/src-xmr-btc-swap/.backupg.git/refs/heads/pr/1676 b/src-xmr-btc-swap/.backupg.git/refs/heads/pr/1676 deleted file mode 100644 index ef6d5647..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/heads/pr/1676 +++ /dev/null @@ -1 +0,0 @@ -43eff948b1771b967aee30ba02e53fdf70ad402c diff --git a/src-xmr-btc-swap/.backupg.git/refs/heads/transfer-proof-buffer-sqlx-own-migration-script b/src-xmr-btc-swap/.backupg.git/refs/heads/transfer-proof-buffer-sqlx-own-migration-script deleted file mode 100644 index d2dd4977..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/heads/transfer-proof-buffer-sqlx-own-migration-script +++ /dev/null @@ -1 +0,0 @@ -293a0bd49bfcb93fb6e48c4fbb0dc6c1c9278d47 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/delta1upstream/HEAD b/src-xmr-btc-swap/.backupg.git/refs/remotes/delta1upstream/HEAD deleted file mode 100644 index c6cda889..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/delta1upstream/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/delta1upstream/master diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/HEAD b/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/HEAD deleted file mode 100644 index b32de93b..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/github-desktop-patrini32/master diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/cooperative-release-of-funds b/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/cooperative-release-of-funds deleted file mode 100644 index 4379fdd7..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/github-desktop-patrini32/cooperative-release-of-funds +++ /dev/null @@ -1 +0,0 @@ -2824ebc893958513539363da17bfa905d5ed1223 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/HEAD b/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/HEAD deleted file mode 100644 index 6efe28ff..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/origin/master diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/hyper-1.4.0 b/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/hyper-1.4.0 deleted file mode 100644 index c15f6316..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/hyper-1.4.0 +++ /dev/null @@ -1 +0,0 @@ -3b7319c69aae73e5e9425e0dda61205d39a6a667 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/serde_json-1.0.120 b/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/serde_json-1.0.120 deleted file mode 100644 index daca3d8f..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/dependabot/cargo/serde_json-1.0.120 +++ /dev/null @@ -1 +0,0 @@ -ba130311ded4327f9dc03df46bab783ea1ed1a17 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/master b/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/master deleted file mode 100644 index 596cb75a..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/master +++ /dev/null @@ -1 +0,0 @@ -c5aa7edb6b55c31014a3110dd23061d68941d022 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/pr/1676 b/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/pr/1676 deleted file mode 100644 index c9052b6e..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/origin/pr/1676 +++ /dev/null @@ -1 +0,0 @@ -d7b649b7a682f83cd2b555cbea801dfec9c55847 diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/pokkst/HEAD b/src-xmr-btc-swap/.backupg.git/refs/remotes/pokkst/HEAD deleted file mode 100644 index 9959c3d4..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/pokkst/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/pokkst/master diff --git a/src-xmr-btc-swap/.backupg.git/refs/remotes/yama/HEAD b/src-xmr-btc-swap/.backupg.git/refs/remotes/yama/HEAD deleted file mode 100644 index 4469f46e..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/remotes/yama/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/remotes/yama/master diff --git a/src-xmr-btc-swap/.backupg.git/refs/stash b/src-xmr-btc-swap/.backupg.git/refs/stash deleted file mode 100644 index bbcbbb41..00000000 --- a/src-xmr-btc-swap/.backupg.git/refs/stash +++ /dev/null @@ -1 +0,0 @@ -80a67cfd72d1b971d33d02d647ee0ab8d3c16b67 diff --git a/src-xmr-btc-swap/Cargo.lock b/src-xmr-btc-swap/Cargo.lock index 6cde2b39..7cf215c3 100644 --- a/src-xmr-btc-swap/Cargo.lock +++ b/src-xmr-btc-swap/Cargo.lock @@ -2886,6 +2886,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "jsonrpc_client" version = "0.7.1" @@ -4261,6 +4272,40 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.69", +] + +[[package]] +name = "pest_meta" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.8", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -6574,9 +6619,9 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "2.0.0-beta.23" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68725c4f17f62f0fb1fa2eecaf391200bf00a9414c84f30783ddca10570690c3" +checksum = "7e2200ca115a6812984431f07fb0daa00afcd68b09d3ca24941b470f79462aa6" dependencies = [ "anyhow", "bytes", @@ -6623,9 +6668,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-beta.18" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1822847744f663babbfc8b7532a104734e9cf99e3408bba7109018bf9177917" +checksum = "be3ff85695ade2315c82a7c04ac8904b12c0cc9981187cf4cd38700a6c739bfd" dependencies = [ "anyhow", "cargo_toml", @@ -6645,9 +6690,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-beta.18" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e36fa3c2e3bd935827fef1eed459885414fb27c82f687d8b9a15112c8a5c8f0" +checksum = "ba3751f726e0180dfe43e66d6a73fe891eb898a06118b59547228ce8d331a0df" dependencies = [ "base64 0.22.1", "brotli", @@ -6672,9 +6717,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-beta.18" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aba4bed4648c3cb17d421af5783c7c29a033a94ab8597ef3791dadea69289d" +checksum = "b03b174fc38ac96701f57fa1a8cfcc0686b10d1112e1ed98e9788689745c61e2" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -6686,9 +6731,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.0-beta.18" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431ac9636bf81e7a04042399918ffa6b9d2413926dabc9366a24f6b487f64653" +checksum = "51a5c65ab8536a7e27b70ecbb0713ab42e8508acd9af1bc4a0817ccf7caf3165" dependencies = [ "anyhow", "glob", @@ -6703,9 +6748,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.0-beta.8" +version = "2.0.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f0347c4d056cca543b5f2dd74c33b64182553e03d1dba2738fe2a95f0ec9ef" +checksum = "9209f6c32caec61e156a5616f7d80ba7683ca4a0a5641cbe5d3086ab371aaab2" dependencies = [ "encoding_rs", "log", @@ -6724,9 +6769,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.0-beta.19" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fa872242a432195b814e87f91ce10f293ae5b01fbd1eb139455496260aa7c9" +checksum = "68b0586932e7fd72778fb1067c16b5edf0d0d23c3fe1a1d9a6d9b212e7ab8394" dependencies = [ "dpi", "gtk", @@ -6743,9 +6788,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.0.0-beta.19" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad6d5ef3c05d1c4b6cf97b9eac1ca1ad8ff2a7057ad0a92b3e4c476f009341e" +checksum = "0ebb9ec03b2418a29f56da626da9c1b00ce085effd48bc7444bd864d889fe7ae" dependencies = [ "cocoa", "gtk", @@ -6767,9 +6812,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-beta.18" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f81a672883c9a67eb24727c99cce583625c919a5fb696c661603b426c463c72" +checksum = "a640df6551e1d47f3c05c5296aa6c8b41ffad0f6fdcd42e244c2eaec160cb428" dependencies = [ "brotli", "cargo_metadata", @@ -6779,6 +6824,7 @@ dependencies = [ "html5ever", "infer", "json-patch", + "json5", "kuchikiki", "log", "memchr", diff --git a/src-xmr-btc-swap/src-gui/.gitignore b/src-xmr-btc-swap/src-gui/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src-xmr-btc-swap/src-gui/README.md b/src-xmr-btc-swap/src-gui/README.md new file mode 100644 index 00000000..102e3668 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/README.md @@ -0,0 +1,7 @@ +# Tauri + React + Typescript + +This template should help get you started developing with Tauri, React and Typescript in Vite. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/src-xmr-btc-swap/src-gui/index.html b/src-xmr-btc-swap/src-gui/index.html new file mode 100644 index 00000000..70cdab17 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/index.html @@ -0,0 +1,14 @@ + + + + + + + Tauri + React + Typescript + + + +
+ + + diff --git a/src-xmr-btc-swap/src-gui/package.json b/src-xmr-btc-swap/src-gui/package.json new file mode 100644 index 00000000..70c0f0e7 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/package.json @@ -0,0 +1,49 @@ +{ + "name": "unstoppableswap-gui-rs", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@material-ui/core": "^4.12.4", + "@material-ui/icons": "^4.11.3", + "@material-ui/lab": "^4.0.0-alpha.61", + "@open-rpc/client-js": "^1.8.1", + "@reduxjs/toolkit": "^2.2.6", + "@tauri-apps/api": ">=2.0.0-beta.0", + "@tauri-apps/plugin-shell": ">=2.0.0-beta.0", + "humanize-duration": "^3.32.1", + "jayson": "^4.1.1", + "lodash": "^4.17.21", + "multiaddr": "^10.0.1", + "notistack": "^3.0.1", + "pino": "^9.2.0", + "pino-pretty": "^11.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-qr-code": "^2.0.15", + "react-redux": "^9.1.2", + "react-router-dom": "^6.24.1", + "semver": "^7.6.2", + "virtua": "^0.33.2" + }, + "devDependencies": { + "@tauri-apps/cli": ">=2.0.0-beta.0", + "@types/humanize-duration": "^3.27.4", + "@types/lodash": "^4.17.6", + "@types/node": "^20.14.10", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@types/semver": "^7.5.8", + "@vitejs/plugin-react": "^4.2.1", + "internal-ip": "^7.0.0", + "typescript": "^5.2.2", + "vite": "^5.3.1", + "vite-tsconfig-paths": "^4.3.2" + } +} diff --git a/src-xmr-btc-swap/src-gui/public/tauri.svg b/src-xmr-btc-swap/src-gui/public/tauri.svg new file mode 100644 index 00000000..31b62c92 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src-xmr-btc-swap/src-gui/public/vite.svg b/src-xmr-btc-swap/src-gui/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src-xmr-btc-swap/src-gui/src/models/apiModel.ts b/src-xmr-btc-swap/src-gui/src/models/apiModel.ts new file mode 100644 index 00000000..bc89c619 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/models/apiModel.ts @@ -0,0 +1,28 @@ +export interface ExtendedProviderStatus extends ProviderStatus { + uptime?: number; + age?: number; + relevancy?: number; + version?: string; + recommended?: boolean; +} + +export interface ProviderStatus extends ProviderQuote, Provider {} + +export interface ProviderQuote { + price: number; + minSwapAmount: number; + maxSwapAmount: number; +} + +export interface Provider { + multiAddr: string; + testnet: boolean; + peerId: string; +} + +export interface Alert { + id: number; + title: string; + body: string; + severity: 'info' | 'warning' | 'error'; +} diff --git a/src-xmr-btc-swap/src-gui/src/models/cliModel.ts b/src-xmr-btc-swap/src-gui/src/models/cliModel.ts new file mode 100644 index 00000000..7c713fce --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/models/cliModel.ts @@ -0,0 +1,406 @@ +export enum SwapSpawnType { + INIT = 'init', + RESUME = 'resume', + CANCEL_REFUND = 'cancel-refund', +} + +export type CliLogSpanType = string | 'BitcoinWalletSubscription'; + +export interface CliLog { + timestamp: string; + level: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'TRACE'; + fields: { + message: string; + [index: string]: unknown; + }; + spans?: { + name: CliLogSpanType; + [index: string]: unknown; + }[]; +} + +export function isCliLog(log: unknown): log is CliLog { + if (log && typeof log === 'object') { + return ( + 'timestamp' in (log as CliLog) && + 'level' in (log as CliLog) && + 'fields' in (log as CliLog) && + typeof (log as CliLog).fields?.message === 'string' + ); + } + return false; +} + +export interface CliLogStartedRpcServer extends CliLog { + fields: { + message: 'Started RPC server'; + addr: string; + }; +} + +export function isCliLogStartedRpcServer( + log: CliLog, +): log is CliLogStartedRpcServer { + return log.fields.message === 'Started RPC server'; +} + +export interface CliLogReleasingSwapLockLog extends CliLog { + fields: { + message: 'Releasing swap lock'; + swap_id: string; + }; +} + +export function isCliLogReleasingSwapLockLog( + log: CliLog, +): log is CliLogReleasingSwapLockLog { + return log.fields.message === 'Releasing swap lock'; +} + +export interface CliLogApiCallError extends CliLog { + fields: { + message: 'API call resulted in an error'; + err: string; + }; +} + +export function isCliLogApiCallError(log: CliLog): log is CliLogApiCallError { + return log.fields.message === 'API call resulted in an error'; +} + +export interface CliLogAcquiringSwapLockLog extends CliLog { + fields: { + message: 'Acquiring swap lock'; + swap_id: string; + }; +} + +export function isCliLogAcquiringSwapLockLog( + log: CliLog, +): log is CliLogAcquiringSwapLockLog { + return log.fields.message === 'Acquiring swap lock'; +} + +export interface CliLogReceivedQuote extends CliLog { + fields: { + message: 'Received quote'; + price: string; + minimum_amount: string; + maximum_amount: string; + }; +} + +export function isCliLogReceivedQuote(log: CliLog): log is CliLogReceivedQuote { + return log.fields.message === 'Received quote'; +} + +export interface CliLogWaitingForBtcDeposit extends CliLog { + fields: { + message: 'Waiting for Bitcoin deposit'; + deposit_address: string; + min_deposit_until_swap_will_start: string; + max_deposit_until_maximum_amount_is_reached: string; + max_giveable: string; + minimum_amount: string; + maximum_amount: string; + min_bitcoin_lock_tx_fee: string; + price: string; + }; +} + +export function isCliLogWaitingForBtcDeposit( + log: CliLog, +): log is CliLogWaitingForBtcDeposit { + return log.fields.message === 'Waiting for Bitcoin deposit'; +} + +export interface CliLogReceivedBtc extends CliLog { + fields: { + message: 'Received Bitcoin'; + max_giveable: string; + new_balance: string; + }; +} + +export function isCliLogReceivedBtc(log: CliLog): log is CliLogReceivedBtc { + return log.fields.message === 'Received Bitcoin'; +} + +export interface CliLogDeterminedSwapAmount extends CliLog { + fields: { + message: 'Determined swap amount'; + amount: string; + fees: string; + }; +} + +export function isCliLogDeterminedSwapAmount( + log: CliLog, +): log is CliLogDeterminedSwapAmount { + return log.fields.message === 'Determined swap amount'; +} + +export interface CliLogStartedSwap extends CliLog { + fields: { + message: 'Starting new swap'; + swap_id: string; + }; +} + +export function isCliLogStartedSwap(log: CliLog): log is CliLogStartedSwap { + return log.fields.message === 'Starting new swap'; +} + +export interface CliLogPublishedBtcTx extends CliLog { + fields: { + message: 'Published Bitcoin transaction'; + txid: string; + kind: 'lock' | 'cancel' | 'withdraw' | 'refund'; + }; +} + +export function isCliLogPublishedBtcTx( + log: CliLog, +): log is CliLogPublishedBtcTx { + return log.fields.message === 'Published Bitcoin transaction'; +} + +export interface CliLogBtcTxFound extends CliLog { + fields: { + message: 'Found relevant Bitcoin transaction'; + txid: string; + status: string; + }; +} + +export function isCliLogBtcTxFound(log: CliLog): log is CliLogBtcTxFound { + return log.fields.message === 'Found relevant Bitcoin transaction'; +} + +export interface CliLogBtcTxStatusChanged extends CliLog { + fields: { + message: 'Bitcoin transaction status changed'; + txid: string; + new_status: string; + }; +} + +export function isCliLogBtcTxStatusChanged( + log: CliLog, +): log is CliLogBtcTxStatusChanged { + return log.fields.message === 'Bitcoin transaction status changed'; +} + +export interface CliLogAliceLockedXmr extends CliLog { + fields: { + message: 'Alice locked Monero'; + txid: string; + }; +} + +export function isCliLogAliceLockedXmr( + log: CliLog, +): log is CliLogAliceLockedXmr { + return log.fields.message === 'Alice locked Monero'; +} + +export interface CliLogReceivedXmrLockTxConfirmation extends CliLog { + fields: { + message: 'Received new confirmation for Monero lock tx'; + txid: string; + seen_confirmations: string; + needed_confirmations: string; + }; +} + +export function isCliLogReceivedXmrLockTxConfirmation( + log: CliLog, +): log is CliLogReceivedXmrLockTxConfirmation { + return log.fields.message === 'Received new confirmation for Monero lock tx'; +} + +export interface CliLogAdvancingState extends CliLog { + fields: { + message: 'Advancing state'; + state: + | 'quote has been requested' + | 'execution setup done' + | 'btc is locked' + | 'XMR lock transaction transfer proof received' + | 'xmr is locked' + | 'encrypted signature is sent' + | 'btc is redeemed' + | 'cancel timelock is expired' + | 'btc is cancelled' + | 'btc is refunded' + | 'xmr is redeemed' + | 'btc is punished' + | 'safely aborted'; + }; +} + +export function isCliLogAdvancingState( + log: CliLog, +): log is CliLogAdvancingState { + return log.fields.message === 'Advancing state'; +} + +export interface CliLogRedeemedXmr extends CliLog { + fields: { + message: 'Successfully transferred XMR to wallet'; + monero_receive_address: string; + txid: string; + }; +} + +export function isCliLogRedeemedXmr(log: CliLog): log is CliLogRedeemedXmr { + return log.fields.message === 'Successfully transferred XMR to wallet'; +} + +export interface YouHaveBeenPunishedCliLog extends CliLog { + fields: { + message: 'You have been punished for not refunding in time'; + }; +} + +export function isYouHaveBeenPunishedCliLog( + log: CliLog, +): log is YouHaveBeenPunishedCliLog { + return ( + log.fields.message === 'You have been punished for not refunding in time' + ); +} + +function getCliLogSpanAttribute(log: CliLog, key: string): T | null { + const span = log.spans?.find((s) => s[key]); + if (!span) { + return null; + } + return span[key] as T; +} + +export function getCliLogSpanSwapId(log: CliLog): string | null { + return getCliLogSpanAttribute(log, 'swap_id'); +} + +export function getCliLogSpanLogReferenceId(log: CliLog): string | null { + return ( + getCliLogSpanAttribute(log, 'log_reference_id')?.replace( + /"/g, + '', + ) || null + ); +} + +export function hasCliLogOneOfMultipleSpans( + log: CliLog, + spanNames: string[], +): boolean { + return log.spans?.some((s) => spanNames.includes(s.name)) ?? false; +} + +export interface CliLogStartedSyncingMoneroWallet extends CliLog { + fields: { + message: 'Syncing Monero wallet'; + current_sync_height?: boolean; + }; +} + +export function isCliLogStartedSyncingMoneroWallet( + log: CliLog, +): log is CliLogStartedSyncingMoneroWallet { + return log.fields.message === 'Syncing Monero wallet'; +} + +export interface CliLogFinishedSyncingMoneroWallet extends CliLog { + fields: { + message: 'Synced Monero wallet'; + }; +} + +export interface CliLogFailedToSyncMoneroWallet extends CliLog { + fields: { + message: 'Failed to sync Monero wallet'; + error: string; + }; +} + +export function isCliLogFailedToSyncMoneroWallet( + log: CliLog, +): log is CliLogFailedToSyncMoneroWallet { + return log.fields.message === 'Failed to sync Monero wallet'; +} + +export function isCliLogFinishedSyncingMoneroWallet( + log: CliLog, +): log is CliLogFinishedSyncingMoneroWallet { + return log.fields.message === 'Monero wallet synced'; +} + +export interface CliLogDownloadingMoneroWalletRpc extends CliLog { + fields: { + message: 'Downloading monero-wallet-rpc'; + progress: string; + size: string; + download_url: string; + }; +} + +export function isCliLogDownloadingMoneroWalletRpc( + log: CliLog, +): log is CliLogDownloadingMoneroWalletRpc { + return log.fields.message === 'Downloading monero-wallet-rpc'; +} + +export interface CliLogStartedSyncingMoneroWallet extends CliLog { + fields: { + message: 'Syncing Monero wallet'; + current_sync_height?: boolean; + }; +} + +export interface CliLogDownloadingMoneroWalletRpc extends CliLog { + fields: { + message: 'Downloading monero-wallet-rpc'; + progress: string; + size: string; + download_url: string; + }; +} + +export interface CliLogGotNotificationForNewBlock extends CliLog { + fields: { + message: 'Got notification for new block'; + block_height: string; + }; +} + +export function isCliLogGotNotificationForNewBlock( + log: CliLog, +): log is CliLogGotNotificationForNewBlock { + return log.fields.message === 'Got notification for new block'; +} + +export interface CliLogAttemptingToCooperativelyRedeemXmr extends CliLog { + fields: { + message: 'Attempting to cooperatively redeem XMR after being punished'; + }; +} + +export function isCliLogAttemptingToCooperativelyRedeemXmr( + log: CliLog, +): log is CliLogAttemptingToCooperativelyRedeemXmr { + return log.fields.message === 'Attempting to cooperatively redeem XMR after being punished'; +} + +export interface CliLogAliceHasAcceptedOurRequestToCooperativelyRedeemTheXmr extends CliLog { + fields: { + message: 'Alice has accepted our request to cooperatively redeem the XMR'; + }; +} + +export function isCliLogAliceHasAcceptedOurRequestToCooperativelyRedeemTheXmr( + log: CliLog, +): log is CliLogAliceHasAcceptedOurRequestToCooperativelyRedeemTheXmr { + return log.fields.message === 'Alice has accepted our request to cooperatively redeem the XMR'; +} \ No newline at end of file diff --git a/src-xmr-btc-swap/src-gui/src/models/downloaderModel.ts b/src-xmr-btc-swap/src-gui/src/models/downloaderModel.ts new file mode 100644 index 00000000..779d4378 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/models/downloaderModel.ts @@ -0,0 +1,4 @@ +export interface Binary { + dirPath: string; // Path without filename appended + fileName: string; +} diff --git a/src-xmr-btc-swap/src-gui/src/models/rpcModel.ts b/src-xmr-btc-swap/src-gui/src/models/rpcModel.ts new file mode 100644 index 00000000..506fb399 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/models/rpcModel.ts @@ -0,0 +1,336 @@ +import { piconerosToXmr, satsToBtc } from 'utils/conversionUtils'; +import { exhaustiveGuard } from 'utils/typescriptUtils'; + +export enum RpcMethod { + GET_BTC_BALANCE = 'get_bitcoin_balance', + WITHDRAW_BTC = 'withdraw_btc', + BUY_XMR = 'buy_xmr', + RESUME_SWAP = 'resume_swap', + LIST_SELLERS = 'list_sellers', + CANCEL_REFUND_SWAP = 'cancel_refund_swap', + GET_SWAP_INFO = 'get_swap_info', + SUSPEND_CURRENT_SWAP = 'suspend_current_swap', + GET_HISTORY = 'get_history', + GET_MONERO_RECOVERY_KEYS = 'get_monero_recovery_info', +} + +export enum RpcProcessStateType { + STARTED = 'starting...', + LISTENING_FOR_CONNECTIONS = 'running', + EXITED = 'exited', + NOT_STARTED = 'not started', +} + +export type RawRpcResponseSuccess = { + jsonrpc: string; + id: string; + result: T; +}; + +export type RawRpcResponseError = { + jsonrpc: string; + id: string; + error: { code: number; message: string }; +}; + +export type RawRpcResponse = RawRpcResponseSuccess | RawRpcResponseError; + +export function isSuccessResponse( + response: RawRpcResponse, +): response is RawRpcResponseSuccess { + return 'result' in response; +} + +export function isErrorResponse( + response: RawRpcResponse, +): response is RawRpcResponseError { + return 'error' in response; +} + +export interface RpcSellerStatus { + status: + | { + Online: { + price: number; + min_quantity: number; + max_quantity: number; + }; + } + | 'Unreachable'; + multiaddr: string; +} + +export interface WithdrawBitcoinResponse { + txid: string; +} + +export interface BuyXmrResponse { + swapId: string; +} + +export type SwapTimelockInfoNone = { + None: { + blocks_left: number; + }; +}; + +export type SwapTimelockInfoCancelled = { + Cancel: { + blocks_left: number; + }; +}; + +export type SwapTimelockInfoPunished = 'Punish'; + +export type SwapTimelockInfo = + | SwapTimelockInfoNone + | SwapTimelockInfoCancelled + | SwapTimelockInfoPunished; + +export function isSwapTimelockInfoNone( + info: SwapTimelockInfo, +): info is SwapTimelockInfoNone { + return typeof info === 'object' && 'None' in info; +} + +export function isSwapTimelockInfoCancelled( + info: SwapTimelockInfo, +): info is SwapTimelockInfoCancelled { + return typeof info === 'object' && 'Cancel' in info; +} + +export function isSwapTimelockInfoPunished( + info: SwapTimelockInfo, +): info is SwapTimelockInfoPunished { + return info === 'Punish'; +} + +export type SwapSellerInfo = { + peerId: string; + addresses: string[]; +}; + +export interface GetSwapInfoResponse { + swapId: string; + completed: boolean; + seller: SwapSellerInfo; + startDate: string; + stateName: SwapStateName; + timelock: null | SwapTimelockInfo; + txLockId: string; + txCancelFee: number; + txRefundFee: number; + txLockFee: number; + btcAmount: number; + xmrAmount: number; + btcRefundAddress: string; + cancelTimelock: number; + punishTimelock: number; +} + +export type MoneroRecoveryResponse = { + address: string; + spend_key: string; + view_key: string; + restore_height: number; +}; + +export interface BalanceBitcoinResponse { + balance: number; +} + +export interface GetHistoryResponse { + swaps: [swapId: string, stateName: SwapStateName][]; +} + +export enum SwapStateName { + Started = 'quote has been requested', + SwapSetupCompleted = 'execution setup done', + BtcLocked = 'btc is locked', + XmrLockProofReceived = 'XMR lock transaction transfer proof received', + XmrLocked = 'xmr is locked', + EncSigSent = 'encrypted signature is sent', + BtcRedeemed = 'btc is redeemed', + CancelTimelockExpired = 'cancel timelock is expired', + BtcCancelled = 'btc is cancelled', + BtcRefunded = 'btc is refunded', + XmrRedeemed = 'xmr is redeemed', + BtcPunished = 'btc is punished', + SafelyAborted = 'safely aborted', +} + +export type SwapStateNameRunningSwap = Exclude< + SwapStateName, + | SwapStateName.Started + | SwapStateName.SwapSetupCompleted + | SwapStateName.BtcRefunded + | SwapStateName.BtcPunished + | SwapStateName.SafelyAborted + | SwapStateName.XmrRedeemed +>; + +export type GetSwapInfoResponseRunningSwap = GetSwapInfoResponse & { + stateName: SwapStateNameRunningSwap; +}; + +export function isSwapStateNameRunningSwap( + state: SwapStateName, +): state is SwapStateNameRunningSwap { + return ![ + SwapStateName.Started, + SwapStateName.SwapSetupCompleted, + SwapStateName.BtcRefunded, + SwapStateName.BtcPunished, + SwapStateName.SafelyAborted, + SwapStateName.XmrRedeemed, + ].includes(state); +} + +export type SwapStateNameCompletedSwap = + | SwapStateName.XmrRedeemed + | SwapStateName.BtcRefunded + | SwapStateName.BtcPunished + | SwapStateName.SafelyAborted; + +export function isSwapStateNameCompletedSwap( + state: SwapStateName, +): state is SwapStateNameCompletedSwap { + return [ + SwapStateName.XmrRedeemed, + SwapStateName.BtcRefunded, + SwapStateName.BtcPunished, + SwapStateName.SafelyAborted, + ].includes(state); +} + +export type SwapStateNamePossiblyCancellableSwap = + | SwapStateName.BtcLocked + | SwapStateName.XmrLockProofReceived + | SwapStateName.XmrLocked + | SwapStateName.EncSigSent + | SwapStateName.CancelTimelockExpired; + +/** +Checks if a swap is in a state where it can possibly be cancelled + +The following conditions must be met: + - The bitcoin must be locked + - The bitcoin must not be redeemed + - The bitcoin must not be cancelled + - The bitcoin must not be refunded + - The bitcoin must not be punished + +See: https://github.com/comit-network/xmr-btc-swap/blob/7023e75bb51ab26dff4c8fcccdc855d781ca4b15/swap/src/cli/cancel.rs#L16-L35 + */ +export function isSwapStateNamePossiblyCancellableSwap( + state: SwapStateName, +): state is SwapStateNamePossiblyCancellableSwap { + return [ + SwapStateName.BtcLocked, + SwapStateName.XmrLockProofReceived, + SwapStateName.XmrLocked, + SwapStateName.EncSigSent, + SwapStateName.CancelTimelockExpired, + ].includes(state); +} + +export type SwapStateNamePossiblyRefundableSwap = + | SwapStateName.BtcLocked + | SwapStateName.XmrLockProofReceived + | SwapStateName.XmrLocked + | SwapStateName.EncSigSent + | SwapStateName.CancelTimelockExpired + | SwapStateName.BtcCancelled; + +/** +Checks if a swap is in a state where it can possibly be refunded (meaning it's not impossible) + +The following conditions must be met: + - The bitcoin must be locked + - The bitcoin must not be redeemed + - The bitcoin must not be refunded + - The bitcoin must not be punished + +See: https://github.com/comit-network/xmr-btc-swap/blob/7023e75bb51ab26dff4c8fcccdc855d781ca4b15/swap/src/cli/refund.rs#L16-L34 + */ +export function isSwapStateNamePossiblyRefundableSwap( + state: SwapStateName, +): state is SwapStateNamePossiblyRefundableSwap { + return [ + SwapStateName.BtcLocked, + SwapStateName.XmrLockProofReceived, + SwapStateName.XmrLocked, + SwapStateName.EncSigSent, + SwapStateName.CancelTimelockExpired, + SwapStateName.BtcCancelled, + ].includes(state); +} + +/** + * Type guard for GetSwapInfoResponseRunningSwap + * "running" means the swap is in progress and not yet completed + * If a swap is not "running" it means it is either completed or no Bitcoin have been locked yet + * @param response + */ +export function isGetSwapInfoResponseRunningSwap( + response: GetSwapInfoResponse, +): response is GetSwapInfoResponseRunningSwap { + return isSwapStateNameRunningSwap(response.stateName); +} + +export function isSwapMoneroRecoverable(swapStateName: SwapStateName): boolean { + return [SwapStateName.BtcRedeemed].includes(swapStateName); +} + +// See https://github.com/comit-network/xmr-btc-swap/blob/50ae54141255e03dba3d2b09036b1caa4a63e5a3/swap/src/protocol/bob/state.rs#L55 +export function getHumanReadableDbStateType(type: SwapStateName): string { + switch (type) { + case SwapStateName.Started: + return 'Quote has been requested'; + case SwapStateName.SwapSetupCompleted: + return 'Swap has been initiated'; + case SwapStateName.BtcLocked: + return 'Bitcoin has been locked'; + case SwapStateName.XmrLockProofReceived: + return 'Monero lock transaction transfer proof has been received'; + case SwapStateName.XmrLocked: + return 'Monero has been locked'; + case SwapStateName.EncSigSent: + return 'Encrypted signature has been sent'; + case SwapStateName.BtcRedeemed: + return 'Bitcoin has been redeemed'; + case SwapStateName.CancelTimelockExpired: + return 'Cancel timelock has expired'; + case SwapStateName.BtcCancelled: + return 'Swap has been cancelled'; + case SwapStateName.BtcRefunded: + return 'Bitcoin has been refunded'; + case SwapStateName.XmrRedeemed: + return 'Monero has been redeemed'; + case SwapStateName.BtcPunished: + return 'Bitcoin has been punished'; + case SwapStateName.SafelyAborted: + return 'Swap has been safely aborted'; + default: + return exhaustiveGuard(type); + } +} + +export function getSwapTxFees(swap: GetSwapInfoResponse): number { + return satsToBtc(swap.txLockFee); +} + +export function getSwapBtcAmount(swap: GetSwapInfoResponse): number { + return satsToBtc(swap.btcAmount); +} + +export function getSwapXmrAmount(swap: GetSwapInfoResponse): number { + return piconerosToXmr(swap.xmrAmount); +} + +export function getSwapExchangeRate(swap: GetSwapInfoResponse): number { + const btcAmount = getSwapBtcAmount(swap); + const xmrAmount = getSwapXmrAmount(swap); + + return btcAmount / xmrAmount; +} diff --git a/src-xmr-btc-swap/src-gui/src/models/storeModel.ts b/src-xmr-btc-swap/src-gui/src/models/storeModel.ts new file mode 100644 index 00000000..de6b8754 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/models/storeModel.ts @@ -0,0 +1,218 @@ +import { CliLog, SwapSpawnType } from './cliModel'; +import { Provider } from './apiModel'; + +export interface SwapSlice { + state: SwapState | null; + logs: CliLog[]; + processRunning: boolean; + provider: Provider | null; + spawnType: SwapSpawnType | null; + swapId: string | null; +} + +export type MoneroWalletRpcUpdateState = { + progress: string; + downloadUrl: string; +}; + +export interface SwapState { + type: SwapStateType; +} + +export enum SwapStateType { + INITIATED = 'initiated', + RECEIVED_QUOTE = 'received quote', + WAITING_FOR_BTC_DEPOSIT = 'waiting for btc deposit', + STARTED = 'started', + BTC_LOCK_TX_IN_MEMPOOL = 'btc lock tx is in mempool', + XMR_LOCK_TX_IN_MEMPOOL = 'xmr lock tx is in mempool', + XMR_LOCKED = 'xmr is locked', + BTC_REDEEMED = 'btc redeemed', + XMR_REDEEM_IN_MEMPOOL = 'xmr redeem tx is in mempool', + PROCESS_EXITED = 'process exited', + BTC_CANCELLED = 'btc cancelled', + BTC_REFUNDED = 'btc refunded', + BTC_PUNISHED = 'btc punished', + ATTEMPTING_COOPERATIVE_REDEEM = 'attempting cooperative redeem', + COOPERATIVE_REDEEM_REJECTED = 'cooperative redeem rejected', +} + +export function isSwapState(state?: SwapState | null): state is SwapState { + return state?.type != null; +} + +export interface SwapStateInitiated extends SwapState { + type: SwapStateType.INITIATED; +} + +export function isSwapStateInitiated( + state?: SwapState | null, +): state is SwapStateInitiated { + return state?.type === SwapStateType.INITIATED; +} + +export interface SwapStateReceivedQuote extends SwapState { + type: SwapStateType.RECEIVED_QUOTE; + price: number; + minimumSwapAmount: number; + maximumSwapAmount: number; +} + +export function isSwapStateReceivedQuote( + state?: SwapState | null, +): state is SwapStateReceivedQuote { + return state?.type === SwapStateType.RECEIVED_QUOTE; +} + +export interface SwapStateWaitingForBtcDeposit extends SwapState { + type: SwapStateType.WAITING_FOR_BTC_DEPOSIT; + depositAddress: string; + maxGiveable: number; + minimumAmount: number; + maximumAmount: number; + minDeposit: number; + maxDeposit: number; + minBitcoinLockTxFee: number; + price: number | null; +} + +export function isSwapStateWaitingForBtcDeposit( + state?: SwapState | null, +): state is SwapStateWaitingForBtcDeposit { + return state?.type === SwapStateType.WAITING_FOR_BTC_DEPOSIT; +} + +export interface SwapStateStarted extends SwapState { + type: SwapStateType.STARTED; + txLockDetails: { + amount: number; + fees: number; + } | null; +} + +export function isSwapStateStarted( + state?: SwapState | null, +): state is SwapStateStarted { + return state?.type === SwapStateType.STARTED; +} + +export interface SwapStateBtcLockInMempool extends SwapState { + type: SwapStateType.BTC_LOCK_TX_IN_MEMPOOL; + bobBtcLockTxId: string; + bobBtcLockTxConfirmations: number; +} + +export function isSwapStateBtcLockInMempool( + state?: SwapState | null, +): state is SwapStateBtcLockInMempool { + return state?.type === SwapStateType.BTC_LOCK_TX_IN_MEMPOOL; +} + +export interface SwapStateXmrLockInMempool extends SwapState { + type: SwapStateType.XMR_LOCK_TX_IN_MEMPOOL; + aliceXmrLockTxId: string; + aliceXmrLockTxConfirmations: number; +} + +export function isSwapStateXmrLockInMempool( + state?: SwapState | null, +): state is SwapStateXmrLockInMempool { + return state?.type === SwapStateType.XMR_LOCK_TX_IN_MEMPOOL; +} + +export interface SwapStateXmrLocked extends SwapState { + type: SwapStateType.XMR_LOCKED; +} + +export function isSwapStateXmrLocked( + state?: SwapState | null, +): state is SwapStateXmrLocked { + return state?.type === SwapStateType.XMR_LOCKED; +} + +export interface SwapStateBtcRedemeed extends SwapState { + type: SwapStateType.BTC_REDEEMED; +} + +export function isSwapStateBtcRedemeed( + state?: SwapState | null, +): state is SwapStateBtcRedemeed { + return state?.type === SwapStateType.BTC_REDEEMED; +} + +export interface SwapStateAttemptingCooperativeRedeeem extends SwapState { + type: SwapStateType.ATTEMPTING_COOPERATIVE_REDEEM; +} + +export function isSwapStateAttemptingCooperativeRedeeem( + state?: SwapState | null, +): state is SwapStateAttemptingCooperativeRedeeem { + return state?.type === SwapStateType.ATTEMPTING_COOPERATIVE_REDEEM; +} + +export interface SwapStateCooperativeRedeemRejected extends SwapState { + type: SwapStateType.COOPERATIVE_REDEEM_REJECTED; + reason: string; +} + +export function isSwapStateCooperativeRedeemRejected( + state?: SwapState | null, +): state is SwapStateCooperativeRedeemRejected { + return state?.type === SwapStateType.COOPERATIVE_REDEEM_REJECTED; +} + +export interface SwapStateXmrRedeemInMempool extends SwapState { + type: SwapStateType.XMR_REDEEM_IN_MEMPOOL; + bobXmrRedeemTxId: string; + bobXmrRedeemAddress: string; +} + +export function isSwapStateXmrRedeemInMempool( + state?: SwapState | null, +): state is SwapStateXmrRedeemInMempool { + return state?.type === SwapStateType.XMR_REDEEM_IN_MEMPOOL; +} + +export interface SwapStateBtcCancelled extends SwapState { + type: SwapStateType.BTC_CANCELLED; + btcCancelTxId: string; +} + +export function isSwapStateBtcCancelled( + state?: SwapState | null, +): state is SwapStateBtcCancelled { + return state?.type === SwapStateType.BTC_CANCELLED; +} + +export interface SwapStateBtcRefunded extends SwapState { + type: SwapStateType.BTC_REFUNDED; + bobBtcRefundTxId: string; +} + +export function isSwapStateBtcRefunded( + state?: SwapState | null, +): state is SwapStateBtcRefunded { + return state?.type === SwapStateType.BTC_REFUNDED; +} + +export interface SwapStateBtcPunished extends SwapState { + type: SwapStateType.BTC_PUNISHED; +} + +export function isSwapStateBtcPunished( + state?: SwapState | null, +): state is SwapStateBtcPunished { + return state?.type === SwapStateType.BTC_PUNISHED; +} + +export interface SwapStateProcessExited extends SwapState { + type: SwapStateType.PROCESS_EXITED; + prevState: SwapState | null; + rpcError: string | null; +} + +export function isSwapStateProcessExited( + state?: SwapState | null, +): state is SwapStateProcessExited { + return state?.type === SwapStateType.PROCESS_EXITED; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/api.ts b/src-xmr-btc-swap/src-gui/src/renderer/api.ts new file mode 100644 index 00000000..222d0307 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/api.ts @@ -0,0 +1,61 @@ +import { Alert, ExtendedProviderStatus } from 'models/apiModel'; + +const API_BASE_URL = 'https://api.unstoppableswap.net'; + +export async function fetchProvidersViaHttp(): Promise< + ExtendedProviderStatus[] +> { + const response = await fetch(`${API_BASE_URL}/api/list`); + return (await response.json()) as ExtendedProviderStatus[]; +} + +export async function fetchAlertsViaHttp(): Promise { + const response = await fetch(`${API_BASE_URL}/api/alerts`); + return (await response.json()) as Alert[]; +} + +export async function submitFeedbackViaHttp( + body: string, + attachedData: string, +): Promise { + type Response = { + feedbackId: string; + }; + + const response = await fetch(`${API_BASE_URL}/api/submit-feedback`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ body, attachedData }), + }); + + if (!response.ok) { + throw new Error(`Status: ${response.status}`); + } + + const responseBody = (await response.json()) as Response; + + return responseBody.feedbackId; +} + +async function fetchCurrencyUsdPrice(currency: string): Promise { + try { + const response = await fetch( + `https://api.coingecko.com/api/v3/simple/price?ids=${currency}&vs_currencies=usd`, + ); + const data = await response.json(); + return data[currency].usd; + } catch (error) { + console.error(`Error fetching ${currency} price:`, error); + throw error; + } +} + +export async function fetchBtcPrice(): Promise { + return fetchCurrencyUsdPrice('bitcoin'); +} + +export async function fetchXmrPrice(): Promise { + return fetchCurrencyUsdPrice('monero'); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/App.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/App.tsx new file mode 100644 index 00000000..1063537e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/App.tsx @@ -0,0 +1,67 @@ +import { Box, makeStyles, CssBaseline } from '@material-ui/core'; +import { createTheme, ThemeProvider } from '@material-ui/core/styles'; +import { indigo } from '@material-ui/core/colors'; +import { MemoryRouter as Router, Routes, Route } from 'react-router-dom'; +import Navigation, { drawerWidth } from './navigation/Navigation'; +import HistoryPage from './pages/history/HistoryPage'; +import SwapPage from './pages/swap/SwapPage'; +import WalletPage from './pages/wallet/WalletPage'; +import HelpPage from './pages/help/HelpPage'; +import GlobalSnackbarProvider from './snackbar/GlobalSnackbarProvider'; + +const useStyles = makeStyles((theme) => ({ + innerContent: { + padding: theme.spacing(4), + marginLeft: drawerWidth, + maxHeight: `100vh`, + flex: 1, + }, +})); + +const theme = createTheme({ + palette: { + type: 'dark', + primary: { + main: '#f4511e', + }, + secondary: indigo, + }, + transitions: { + create: () => 'none', + }, + props: { + MuiButtonBase: { + disableRipple: true, + }, + }, +}); + +function InnerContent() { + const classes = useStyles(); + + return ( + + + } /> + } /> + } /> + } /> + } /> + + + ); +} + +export default function App() { + return ( + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/IpcInvokeButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/IpcInvokeButton.tsx new file mode 100644 index 00000000..c2a39266 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/IpcInvokeButton.tsx @@ -0,0 +1,166 @@ +import { + Button, + ButtonProps, + CircularProgress, + IconButton, + Tooltip, +} from '@material-ui/core'; +import { ReactElement, ReactNode, useEffect, useState } from 'react'; +import { useSnackbar } from 'notistack'; +import { useAppSelector } from 'store/hooks'; +import { RpcProcessStateType } from 'models/rpcModel'; +import { isExternalRpc } from 'store/config'; + +function IpcButtonTooltip({ + requiresRpcAndNotReady, + children, + processType, + tooltipTitle, +}: { + requiresRpcAndNotReady: boolean; + children: ReactElement; + processType: RpcProcessStateType; + tooltipTitle?: string; +}) { + if (tooltipTitle) { + return {children}; + } + + const getMessage = () => { + if (!requiresRpcAndNotReady) return ''; + + switch (processType) { + case RpcProcessStateType.LISTENING_FOR_CONNECTIONS: + return ''; + case RpcProcessStateType.STARTED: + return 'Cannot execute this action because the Swap Daemon is still starting and not yet ready to accept connections. Please wait a moment and try again'; + case RpcProcessStateType.EXITED: + return 'Cannot execute this action because the Swap Daemon has been stopped. Please start the Swap Daemon again to continue'; + case RpcProcessStateType.NOT_STARTED: + return 'Cannot execute this action because the Swap Daemon has not been started yet. Please start the Swap Daemon first'; + default: + return ''; + } + }; + + return ( + + {children} + + ); +} + +interface IpcInvokeButtonProps { + ipcArgs: unknown[]; + ipcChannel: string; + onSuccess?: (data: T) => void; + isLoadingOverride?: boolean; + isIconButton?: boolean; + loadIcon?: ReactNode; + requiresRpc?: boolean; + disabled?: boolean; + displayErrorSnackbar?: boolean; + tooltipTitle?: string; +} + +const DELAY_BEFORE_SHOWING_LOADING_MS = 0; + +export default function IpcInvokeButton({ + disabled, + ipcChannel, + ipcArgs, + onSuccess, + onClick, + endIcon, + loadIcon, + isLoadingOverride, + isIconButton, + requiresRpc, + displayErrorSnackbar, + tooltipTitle, + ...rest +}: IpcInvokeButtonProps & ButtonProps) { + const { enqueueSnackbar } = useSnackbar(); + + const rpcProcessType = useAppSelector((state) => state.rpc.process.type); + const isRpcReady = + rpcProcessType === RpcProcessStateType.LISTENING_FOR_CONNECTIONS; + const [isPending, setIsPending] = useState(false); + const [hasMinLoadingTimePassed, setHasMinLoadingTimePassed] = useState(false); + + const isLoading = (isPending && hasMinLoadingTimePassed) || isLoadingOverride; + const actualEndIcon = isLoading + ? loadIcon || + : endIcon; + + useEffect(() => { + setHasMinLoadingTimePassed(false); + setTimeout( + () => setHasMinLoadingTimePassed(true), + DELAY_BEFORE_SHOWING_LOADING_MS, + ); + }, [isPending]); + + async function handleClick(event: React.MouseEvent) { + onClick?.(event); + + if (!isPending) { + setIsPending(true); + try { + // const result = await ipcRenderer.invoke(ipcChannel, ...ipcArgs); + throw new Error('Not implemented'); + // onSuccess?.(result); + } catch (e: unknown) { + if (displayErrorSnackbar) { + enqueueSnackbar((e as Error).message, { + autoHideDuration: 60 * 1000, + variant: 'error', + }); + } + } finally { + setIsPending(false); + } + } + } + + const requiresRpcAndNotReady = + !!requiresRpc && !isRpcReady && !isExternalRpc(); + const isDisabled = disabled || requiresRpcAndNotReady || isLoading; + + return ( + + + {isIconButton ? ( + + {actualEndIcon} + + ) : ( + + } + > + There are some Bitcoin left in your wallet + + ); + } + return null; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/MoneroWalletRpcUpdatingAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/MoneroWalletRpcUpdatingAlert.tsx new file mode 100644 index 00000000..d58a2dd1 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/MoneroWalletRpcUpdatingAlert.tsx @@ -0,0 +1,30 @@ +import { Alert } from '@material-ui/lab'; +import { Box, LinearProgress } from '@material-ui/core'; +import { useAppSelector } from 'store/hooks'; + +export default function MoneroWalletRpcUpdatingAlert() { + const updateState = useAppSelector( + (s) => s.rpc.state.moneroWalletRpc.updateState, + ); + + if (updateState === false) { + return null; + } + + const progress = Number.parseFloat( + updateState.progress.substring(0, updateState.progress.length - 1), + ); + + return ( + + + The Monero wallet is updating. This may take a few moments + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RemainingFundsWillBeUsedAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RemainingFundsWillBeUsedAlert.tsx new file mode 100644 index 00000000..e297d063 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RemainingFundsWillBeUsedAlert.tsx @@ -0,0 +1,35 @@ +import { Alert } from '@material-ui/lab'; +import { Box, makeStyles } from '@material-ui/core'; +import { useAppSelector } from 'store/hooks'; +import WalletRefreshButton from '../pages/wallet/WalletRefreshButton'; +import { SatsAmount } from '../other/Units'; + +const useStyles = makeStyles((theme) => ({ + outer: { + paddingBottom: theme.spacing(1), + }, +})); + +export default function RemainingFundsWillBeUsedAlert() { + const classes = useStyles(); + const balance = useAppSelector((s) => s.rpc.state.balance); + + if (balance == null || balance <= 0) { + return <>; + } + + return ( + + } + variant="filled" + > + The remaining funds of in the wallet + will be used for the next swap. If the remaining funds exceed the + minimum swap amount of the provider, a swap will be initiated + instantaneously. + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RpcStatusAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RpcStatusAlert.tsx new file mode 100644 index 00000000..a03aff54 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/RpcStatusAlert.tsx @@ -0,0 +1,27 @@ +import { Alert } from '@material-ui/lab'; +import { CircularProgress } from '@material-ui/core'; +import { useAppSelector } from 'store/hooks'; +import { RpcProcessStateType } from 'models/rpcModel'; + +export default function RpcStatusAlert() { + const rpcProcess = useAppSelector((s) => s.rpc.process); + if (rpcProcess.type === RpcProcessStateType.STARTED) { + return ( + }> + The swap daemon is starting + + ); + } + if (rpcProcess.type === RpcProcessStateType.LISTENING_FOR_CONNECTIONS) { + return The swap daemon is running; + } + if (rpcProcess.type === RpcProcessStateType.NOT_STARTED) { + return The swap daemon is being started; + } + if (rpcProcess.type === RpcProcessStateType.EXITED) { + return ( + The swap daemon has stopped unexpectedly + ); + } + return <>; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapMightBeCancelledAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapMightBeCancelledAlert.tsx new file mode 100644 index 00000000..4bd2cd62 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapMightBeCancelledAlert.tsx @@ -0,0 +1,97 @@ +import { makeStyles } from '@material-ui/core'; +import { Alert, AlertTitle } from '@material-ui/lab'; +import { useActiveSwapInfo } from 'store/hooks'; +import { + isSwapTimelockInfoCancelled, + isSwapTimelockInfoNone, +} from 'models/rpcModel'; +import HumanizedBitcoinBlockDuration from '../other/HumanizedBitcoinBlockDuration'; + +const useStyles = makeStyles((theme) => ({ + outer: { + marginBottom: theme.spacing(1), + }, + list: { + margin: theme.spacing(0.25), + }, +})); + +export default function SwapMightBeCancelledAlert({ + bobBtcLockTxConfirmations, +}: { + bobBtcLockTxConfirmations: number; +}) { + const classes = useStyles(); + const swap = useActiveSwapInfo(); + + if ( + bobBtcLockTxConfirmations < 5 || + swap === null || + swap.timelock === null + ) { + return <>; + } + + const { timelock } = swap; + const punishTimelockOffset = swap.punishTimelock; + + return ( + + Be careful! + The swap provider has taken a long time to lock their Monero. This might + mean that: +
    +
  • + There is a technical issue that prevents them from locking their funds +
  • +
  • They are a malicious actor (unlikely)
  • +
+
+ There is still hope for the swap to be successful but you have to be extra + careful. Regardless of why it has taken them so long, it is important that + you refund the swap within the required time period if the swap is not + completed. If you fail to to do so, you will be punished and lose your + money. +
    + {isSwapTimelockInfoNone(timelock) && ( + <> +
  • + + You will be able to refund in about{' '} + + +
  • + +
  • + + If you have not refunded or completed the swap in about{' '} + + , you will lose your funds. + +
  • + + )} + {isSwapTimelockInfoCancelled(timelock) && ( +
  • + + If you have not refunded or completed the swap in about{' '} + + , you will lose your funds. + +
  • + )} +
  • + As long as you see this screen, the swap will be refunded + automatically when the time comes. If this fails, you have to manually + refund by navigating to the History page. +
  • +
+
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapStatusAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapStatusAlert.tsx new file mode 100644 index 00000000..91fcb06b --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapStatusAlert.tsx @@ -0,0 +1,233 @@ +import { Alert, AlertTitle } from '@material-ui/lab/'; +import { Box, makeStyles } from '@material-ui/core'; +import { ReactNode } from 'react'; +import { exhaustiveGuard } from 'utils/typescriptUtils'; +import { + SwapCancelRefundButton, + SwapResumeButton, +} from '../pages/history/table/HistoryRowActions'; +import HumanizedBitcoinBlockDuration from '../other/HumanizedBitcoinBlockDuration'; +import { + GetSwapInfoResponse, + GetSwapInfoResponseRunningSwap, + isGetSwapInfoResponseRunningSwap, + isSwapTimelockInfoCancelled, + isSwapTimelockInfoNone, + isSwapTimelockInfoPunished, + SwapStateName, + SwapTimelockInfoCancelled, + SwapTimelockInfoNone, +} from '../../../models/rpcModel'; +import { SwapMoneroRecoveryButton } from '../pages/history/table/SwapMoneroRecoveryButton'; + +const useStyles = makeStyles({ + box: { + display: 'flex', + flexDirection: 'column', + gap: '0.5rem', + }, + list: { + padding: '0px', + margin: '0px', + }, +}); + +/** + * Component for displaying a list of messages. + * @param messages - Array of messages to display. + * @returns JSX.Element + */ +const MessageList = ({ messages }: { messages: ReactNode[] }) => { + const classes = useStyles(); + return ( +
    + {messages.map((msg, i) => ( + // eslint-disable-next-line react/no-array-index-key +
  • {msg}
  • + ))} +
+ ); +}; + +/** + * Sub-component for displaying alerts when the swap is in a safe state. + * @param swap - The swap information. + * @returns JSX.Element + */ +const BitcoinRedeemedStateAlert = ({ swap }: { swap: GetSwapInfoResponse }) => { + const classes = useStyles(); + return ( + + + + + ); +}; + +/** + * Sub-component for displaying alerts when the swap is in a state with no timelock info. + * @param swap - The swap information. + * @param punishTimelockOffset - The punish timelock offset. + * @returns JSX.Element + */ +const BitcoinLockedNoTimelockExpiredStateAlert = ({ + timelock, + punishTimelockOffset, +}: { + timelock: SwapTimelockInfoNone; + punishTimelockOffset: number; +}) => ( + + Your Bitcoin is locked. If the swap is not completed in approximately{' '} + , + you need to refund + , + <> + You will lose your funds if you do not refund or complete the swap + within{' '} + + , + ]} + /> +); + +/** + * Sub-component for displaying alerts when the swap timelock is expired + * The swap could be cancelled but not necessarily (the transaction might not have been published yet) + * But it doesn't matter because the swap cannot be completed anymore + * @param swap - The swap information. + * @returns JSX.Element + */ +const BitcoinPossiblyCancelledAlert = ({ + swap, + timelock, +}: { + swap: GetSwapInfoResponse; + timelock: SwapTimelockInfoCancelled; +}) => { + const classes = useStyles(); + return ( + + + You will lose your funds if you do not refund within{' '} + + , + ]} + /> + + + ); +}; + +/** + * Sub-component for displaying alerts requiring immediate action. + * @returns JSX.Element + */ +const ImmediateActionAlert = () => ( + <>Resume the swap immediately to avoid losing your funds +); + +/** + * Main component for displaying the appropriate swap alert status text. + * @param swap - The swap information. + * @returns JSX.Element | null + */ +function SwapAlertStatusText({ + swap, +}: { + swap: GetSwapInfoResponseRunningSwap; +}) { + switch (swap.stateName) { + // This is the state where the swap is safe because the other party has redeemed the Bitcoin + // It cannot be punished anymore + case SwapStateName.BtcRedeemed: + return ; + + // These are states that are at risk of punishment because the Bitcoin have been locked + // but has not been redeemed yet by the other party + case SwapStateName.BtcLocked: + case SwapStateName.XmrLockProofReceived: + case SwapStateName.XmrLocked: + case SwapStateName.EncSigSent: + case SwapStateName.CancelTimelockExpired: + case SwapStateName.BtcCancelled: + if (swap.timelock !== null) { + if (isSwapTimelockInfoNone(swap.timelock)) { + return ( + + ); + } + + if (isSwapTimelockInfoCancelled(swap.timelock)) { + return ( + + ); + } + + if (isSwapTimelockInfoPunished(swap.timelock)) { + return ; + } + + // We have covered all possible timelock states above + // If we reach this point, it means we have missed a case + return exhaustiveGuard(swap.timelock); + } + return ; + default: + return exhaustiveGuard(swap.stateName); + } +} + +/** + * Main component for displaying the swap status alert. + * @param swap - The swap information. + * @returns JSX.Element | null + */ +export default function SwapStatusAlert({ + swap, +}: { + swap: GetSwapInfoResponse; +}): JSX.Element | null { + // If the swap is not running, there is no need to display the alert + // This is either because the swap is finished or has not started yet (e.g. in the setup phase, no Bitcoin locked) + if (!isGetSwapInfoResponseRunningSwap(swap)) { + return null; + } + + return ( + } + variant="filled" + > + + Swap {swap.swapId.substring(0, 5)}... is unfinished + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapTxLockAlertsBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapTxLockAlertsBox.tsx new file mode 100644 index 00000000..055573e7 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/SwapTxLockAlertsBox.tsx @@ -0,0 +1,28 @@ +import { Box, makeStyles } from '@material-ui/core'; +import { useSwapInfosSortedByDate } from 'store/hooks'; +import SwapStatusAlert from './SwapStatusAlert'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(1), + }, +})); + +export default function SwapTxLockAlertsBox() { + const classes = useStyles(); + + // We specifically choose ALL swaps here + // If a swap is in a state where an Alert is not needed (becaue no Bitcoin have been locked or because the swap has been completed) + // the SwapStatusAlert component will not render an Alert + const swaps = useSwapInfosSortedByDate(); + + return ( + + {swaps.map((swap) => ( + + ))} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/alert/UnfinishedSwapsAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/UnfinishedSwapsAlert.tsx new file mode 100644 index 00000000..bdeda601 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/alert/UnfinishedSwapsAlert.tsx @@ -0,0 +1,33 @@ +import { Button } from '@material-ui/core'; +import Alert from '@material-ui/lab/Alert'; +import { useNavigate } from 'react-router-dom'; +import { useResumeableSwapsCount } from 'store/hooks'; + +export default function UnfinishedSwapsAlert() { + const resumableSwapsCount = useResumeableSwapsCount(); + const navigate = useNavigate(); + + if (resumableSwapsCount > 0) { + return ( + navigate('/history')} + > + VIEW + + } + > + You have{' '} + {resumableSwapsCount > 1 + ? `${resumableSwapsCount} unfinished swaps` + : 'one unfinished swap'} + + ); + } + return null; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/icons/BitcoinIcon.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/BitcoinIcon.tsx new file mode 100644 index 00000000..b42f17f9 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/BitcoinIcon.tsx @@ -0,0 +1,24 @@ +import { SvgIcon } from '@material-ui/core'; +import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon'; + +export default function BitcoinIcon(props: SvgIconProps) { + return ( + // eslint-disable-next-line react/jsx-props-no-spreading + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/icons/DiscordIcon.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/DiscordIcon.tsx new file mode 100644 index 00000000..d913b884 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/DiscordIcon.tsx @@ -0,0 +1,24 @@ +import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon'; +import { SvgIcon } from '@material-ui/core'; + +export default function DiscordIcon(props: SvgIconProps) { + return ( + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/icons/LinkIconButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/LinkIconButton.tsx new file mode 100644 index 00000000..ad6c6ef4 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/LinkIconButton.tsx @@ -0,0 +1,16 @@ +import { ReactNode } from 'react'; +import { IconButton } from '@material-ui/core'; + +export default function LinkIconButton({ + url, + children, +}: { + url: string; + children: ReactNode; +}) { + return ( + window.open(url, '_blank')}> + {children} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/icons/MoneroIcon.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/MoneroIcon.tsx new file mode 100644 index 00000000..b5433385 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/MoneroIcon.tsx @@ -0,0 +1,28 @@ +import { SvgIcon } from '@material-ui/core'; +import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon'; + +export default function MoneroIcon(props: SvgIconProps) { + return ( + // eslint-disable-next-line react/jsx-props-no-spreading + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/icons/TorIcon.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/TorIcon.tsx new file mode 100644 index 00000000..4d77e587 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/icons/TorIcon.tsx @@ -0,0 +1,24 @@ +import { SvgIcon } from '@material-ui/core'; +import { SvgIconProps } from '@material-ui/core/SvgIcon/SvgIcon'; + +export default function TorIcon(props: SvgIconProps) { + return ( + // eslint-disable-next-line react/jsx-props-no-spreading + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/BitcoinAddressTextField.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/BitcoinAddressTextField.tsx new file mode 100644 index 00000000..a5ec21db --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/BitcoinAddressTextField.tsx @@ -0,0 +1,41 @@ +import { useEffect } from 'react'; +import { TextField } from '@material-ui/core'; +import { TextFieldProps } from '@material-ui/core/TextField/TextField'; +import { isBtcAddressValid } from 'utils/conversionUtils'; +import { isTestnet } from 'store/config'; + +export default function BitcoinAddressTextField({ + address, + onAddressChange, + onAddressValidityChange, + helperText, + ...props +}: { + address: string; + onAddressChange: (address: string) => void; + onAddressValidityChange: (valid: boolean) => void; + helperText: string; +} & TextFieldProps) { + const placeholder = isTestnet() ? 'tb1q4aelwalu...' : 'bc18ociqZ9mZ...'; + const errorText = isBtcAddressValid(address, isTestnet()) + ? null + : `Only bech32 addresses are supported. They begin with "${ + isTestnet() ? 'tb1' : 'bc1' + }"`; + + useEffect(() => { + onAddressValidityChange(!errorText); + }, [address, errorText, onAddressValidityChange]); + + return ( + onAddressChange(e.target.value)} + error={!!errorText && address.length > 0} + helperText={address.length > 0 ? errorText || helperText : helperText} + placeholder={placeholder} + variant="outlined" + {...props} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/MoneroAddressTextField.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/MoneroAddressTextField.tsx new file mode 100644 index 00000000..4418c588 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/inputs/MoneroAddressTextField.tsx @@ -0,0 +1,39 @@ +import { useEffect } from 'react'; +import { TextField } from '@material-ui/core'; +import { TextFieldProps } from '@material-ui/core/TextField/TextField'; +import { isXmrAddressValid } from 'utils/conversionUtils'; +import { isTestnet } from 'store/config'; + +export default function MoneroAddressTextField({ + address, + onAddressChange, + onAddressValidityChange, + helperText, + ...props +}: { + address: string; + onAddressChange: (address: string) => void; + onAddressValidityChange: (valid: boolean) => void; + helperText: string; +} & TextFieldProps) { + const placeholder = isTestnet() ? '59McWTPGc745...' : '888tNkZrPN6J...'; + const errorText = isXmrAddressValid(address, isTestnet()) + ? null + : 'Not a valid Monero address'; + + useEffect(() => { + onAddressValidityChange(!errorText); + }, [address, onAddressValidityChange, errorText]); + + return ( + onAddressChange(e.target.value)} + error={!!errorText && address.length > 0} + helperText={address.length > 0 ? errorText || helperText : helperText} + placeholder={placeholder} + variant="outlined" + {...props} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/DialogHeader.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/DialogHeader.tsx new file mode 100644 index 00000000..c550b65f --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/DialogHeader.tsx @@ -0,0 +1,22 @@ +import { DialogTitle, makeStyles, Typography } from '@material-ui/core'; + +const useStyles = makeStyles({ + root: { + display: 'flex', + justifyContent: 'space-between', + }, +}); + +type DialogTitleProps = { + title: string; +}; + +export default function DialogHeader({ title }: DialogTitleProps) { + const classes = useStyles(); + + return ( + + {title} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/PaperTextBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/PaperTextBox.tsx new file mode 100644 index 00000000..490f94aa --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/PaperTextBox.tsx @@ -0,0 +1,33 @@ +import { Button, makeStyles, Paper, Typography } from '@material-ui/core'; + +const useStyles = makeStyles((theme) => ({ + logsOuter: { + overflow: 'auto', + padding: theme.spacing(1), + marginTop: theme.spacing(1), + marginBottom: theme.spacing(1), + maxHeight: '10rem', + }, + copyButton: { + marginTop: theme.spacing(1), + }, +})); + +export default function PaperTextBox({ stdOut }: { stdOut: string }) { + const classes = useStyles(); + + function handleCopyLogs() { + throw new Error('Not implemented'); + } + + return ( + + + {stdOut} + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/SwapSuspendAlert.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/SwapSuspendAlert.tsx new file mode 100644 index 00000000..fa594cfe --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/SwapSuspendAlert.tsx @@ -0,0 +1,44 @@ +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, +} from '@material-ui/core'; +import IpcInvokeButton from '../IpcInvokeButton'; + +type SwapCancelAlertProps = { + open: boolean; + onClose: () => void; +}; + +export default function SwapSuspendAlert({ + open, + onClose, +}: SwapCancelAlertProps) { + return ( + + Force stop running operation? + + + Are you sure you want to force stop the running swap? + + + + + + Force stop + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/feedback/FeedbackDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/feedback/FeedbackDialog.tsx new file mode 100644 index 00000000..b8ed07d5 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/feedback/FeedbackDialog.tsx @@ -0,0 +1,170 @@ +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + MenuItem, + Select, + TextField, +} from '@material-ui/core'; +import { useState } from 'react'; +import { useSnackbar } from 'notistack'; +import { + useActiveSwapInfo, + useAppSelector, +} from 'store/hooks'; +import { parseDateString } from 'utils/parseUtils'; +import { store } from 'renderer/store/storeRenderer'; +import { CliLog } from 'models/cliModel'; +import { submitFeedbackViaHttp } from '../../../api'; +import { PiconeroAmount } from '../../other/Units'; +import LoadingButton from '../../other/LoadingButton'; + +async function submitFeedback(body: string, swapId: string | number) { + let attachedBody = ''; + + if (swapId !== 0 && typeof swapId === 'string') { + const swapInfo = store.getState().rpc.state.swapInfos[swapId]; + const logs = [] as CliLog[]; + + throw new Error('Not implemented'); + + if (swapInfo === undefined) { + throw new Error(`Swap with id ${swapId} not found`); + } + + attachedBody = `${JSON.stringify(swapInfo, null, 4)} \n\nLogs: ${logs + .map((l) => JSON.stringify(l)) + .join('\n====\n')}`; + } + + await submitFeedbackViaHttp(body, attachedBody); +} + +/* + * This component is a dialog that allows the user to submit feedback to the + * developers. The user can enter a message and optionally attach logs from a + * specific swap. + * selectedSwap = 0 means no swap is attached + */ +function SwapSelectDropDown({ + selectedSwap, + setSelectedSwap, +}: { + selectedSwap: string | number; + setSelectedSwap: (swapId: string | number) => void; +}) { + const swaps = useAppSelector((state) => + Object.values(state.rpc.state.swapInfos), + ); + + return ( + + ); +} + +const MAX_FEEDBACK_LENGTH = 4000; + +export default function FeedbackDialog({ + open, + onClose, +}: { + open: boolean; + onClose: () => void; +}) { + const [pending, setPending] = useState(false); + const [bodyText, setBodyText] = useState(''); + const currentSwapId = useActiveSwapInfo(); + + const { enqueueSnackbar } = useSnackbar(); + + const [selectedAttachedSwap, setSelectedAttachedSwap] = useState< + string | number + >(currentSwapId?.swapId || 0); + + const bodyTooLong = bodyText.length > MAX_FEEDBACK_LENGTH; + + return ( + + Submit Feedback + + + Got something to say? Drop us a message below. If you had an issue + with a specific swap, select it from the dropdown to attach the logs. + It will help us figure out what went wrong. Hit that submit button + when you are ready. We appreciate you taking the time to share your + thoughts! + + + setBodyText(e.target.value)} + label={ + bodyTooLong + ? `Text is too long (${bodyText.length}/${MAX_FEEDBACK_LENGTH})` + : 'Feedback' + } + multiline + minRows={4} + maxRows={4} + fullWidth + error={bodyTooLong} + /> + + + + + + { + if (pending) { + return; + } + + try { + setPending(true); + await submitFeedback(bodyText, selectedAttachedSwap); + enqueueSnackbar('Feedback submitted successfully!', { + variant: 'success', + }); + } catch (e) { + console.error(`Failed to submit feedback: ${e}`); + enqueueSnackbar(`Failed to submit feedback (${e})`, { + variant: 'error', + }); + } finally { + setPending(false); + } + onClose(); + }} + loading={pending} + > + Submit + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/listSellers/ListSellersDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/listSellers/ListSellersDialog.tsx new file mode 100644 index 00000000..72c2dded --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/listSellers/ListSellersDialog.tsx @@ -0,0 +1,136 @@ +import { ChangeEvent, useState } from 'react'; +import { + DialogTitle, + Dialog, + DialogContent, + DialogContentText, + TextField, + DialogActions, + Button, + Box, + Chip, + makeStyles, + Theme, +} from '@material-ui/core'; +import { Multiaddr } from 'multiaddr'; +import { useSnackbar } from 'notistack'; +import IpcInvokeButton from '../../IpcInvokeButton'; + +const PRESET_RENDEZVOUS_POINTS = [ + '/dns4/discover.unstoppableswap.net/tcp/8888/p2p/12D3KooWA6cnqJpVnreBVnoro8midDL9Lpzmg8oJPoAGi7YYaamE', + '/dns4/eratosthen.es/tcp/7798/p2p/12D3KooWAh7EXXa2ZyegzLGdjvj1W4G3EXrTGrf6trraoT1MEobs', +]; + +const useStyles = makeStyles((theme: Theme) => ({ + chipOuter: { + display: 'flex', + flexWrap: 'wrap', + gap: theme.spacing(1), + }, +})); + +type ListSellersDialogProps = { + open: boolean; + onClose: () => void; +}; + +export default function ListSellersDialog({ + open, + onClose, +}: ListSellersDialogProps) { + const classes = useStyles(); + const [rendezvousAddress, setRendezvousAddress] = useState(''); + const { enqueueSnackbar } = useSnackbar(); + + function handleMultiAddrChange(event: ChangeEvent) { + setRendezvousAddress(event.target.value); + } + + function getMultiAddressError(): string | null { + try { + const multiAddress = new Multiaddr(rendezvousAddress); + if (!multiAddress.protoNames().includes('p2p')) { + return 'The multi address must contain the peer id (/p2p/)'; + } + return null; + } catch (e) { + return 'Not a valid multi address'; + } + } + + function handleSuccess(amountOfSellers: number) { + let message: string; + + switch (amountOfSellers) { + case 0: + message = `No providers were discovered at the rendezvous point`; + break; + case 1: + message = `Discovered one provider at the rendezvous point`; + break; + default: + message = `Discovered ${amountOfSellers} providers at the rendezvous point`; + } + + enqueueSnackbar(message, { + variant: 'success', + autoHideDuration: 5000, + }); + + onClose(); + } + + return ( + + Discover swap providers + + + The rendezvous protocol provides a way to discover providers (trading + partners) without relying on one singular centralized institution. By + manually connecting to a rendezvous point run by a volunteer, you can + discover providers and then connect and swap with them. + + + + {PRESET_RENDEZVOUS_POINTS.map((rAddress) => ( + setRendezvousAddress(rAddress)} + /> + ))} + + + + + + Connect + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderInfo.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderInfo.tsx new file mode 100644 index 00000000..592bf1de --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderInfo.tsx @@ -0,0 +1,75 @@ +import { makeStyles, Box, Typography, Chip, Tooltip } from '@material-ui/core'; +import { VerifiedUser } from '@material-ui/icons'; +import { satsToBtc, secondsToDays } from 'utils/conversionUtils'; +import { ExtendedProviderStatus } from 'models/apiModel'; +import { + MoneroBitcoinExchangeRate, + SatsAmount, +} from 'renderer/components/other/Units'; + +const useStyles = makeStyles((theme) => ({ + content: { + flex: 1, + '& *': { + lineBreak: 'anywhere', + }, + }, + chipsOuter: { + display: 'flex', + marginTop: theme.spacing(1), + gap: theme.spacing(0.5), + flexWrap: 'wrap', + }, +})); + +export default function ProviderInfo({ + provider, +}: { + provider: ExtendedProviderStatus; +}) { + const classes = useStyles(); + + return ( + + + Swap Provider + + + {provider.multiAddr} + + + {provider.peerId.substring(0, 8)}...{provider.peerId.slice(-8)} + + + Exchange rate:{' '} + +
+ Minimum swap amount: +
+ Maximum swap amount: +
+ + + {provider.uptime && ( + + + + )} + {provider.age ? ( + + ) : ( + + )} + {provider.recommended === true && ( + + } color="primary" /> + + )} + +
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderListDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderListDialog.tsx new file mode 100644 index 00000000..7309ae51 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderListDialog.tsx @@ -0,0 +1,129 @@ +import { + Avatar, + List, + ListItem, + ListItemAvatar, + ListItemText, + DialogTitle, + Dialog, + DialogActions, + Button, + DialogContent, + makeStyles, + CircularProgress, +} from '@material-ui/core'; +import AddIcon from '@material-ui/icons/Add'; +import { useState } from 'react'; +import SearchIcon from '@material-ui/icons/Search'; +import { ExtendedProviderStatus } from 'models/apiModel'; +import { + useAllProviders, + useAppDispatch, + useIsRpcEndpointBusy, +} from 'store/hooks'; +import { setSelectedProvider } from 'store/features/providersSlice'; +import { RpcMethod } from 'models/rpcModel'; +import ProviderSubmitDialog from './ProviderSubmitDialog'; +import ListSellersDialog from '../listSellers/ListSellersDialog'; +import ProviderInfo from './ProviderInfo'; + +const useStyles = makeStyles({ + dialogContent: { + padding: 0, + }, +}); + +type ProviderSelectDialogProps = { + open: boolean; + onClose: () => void; +}; + +export function ProviderSubmitDialogOpenButton() { + const [open, setOpen] = useState(false); + + return ( + { + // Prevents background from being clicked and reopening dialog + if (!open) { + setOpen(true); + } + }} + > + setOpen(false)} /> + + + + + + + + ); +} + +export function ListSellersDialogOpenButton() { + const [open, setOpen] = useState(false); + const running = useIsRpcEndpointBusy(RpcMethod.LIST_SELLERS); + + return ( + { + // Prevents background from being clicked and reopening dialog + if (!open) { + setOpen(true); + } + }} + > + setOpen(false)} /> + + {running ? : } + + + + ); +} + +export default function ProviderListDialog({ + open, + onClose, +}: ProviderSelectDialogProps) { + const classes = useStyles(); + const providers = useAllProviders(); + const dispatch = useAppDispatch(); + + function handleProviderChange(provider: ExtendedProviderStatus) { + dispatch(setSelectedProvider(provider)); + onClose(); + } + + return ( + + Select a swap provider + + + + {providers.map((provider) => ( + handleProviderChange(provider)} + key={provider.peerId} + > + + + ))} + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSelect.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSelect.tsx new file mode 100644 index 00000000..1aeea214 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSelect.tsx @@ -0,0 +1,62 @@ +import { + makeStyles, + Card, + CardContent, + Box, + IconButton, +} from '@material-ui/core'; +import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos'; +import { useState } from 'react'; +import { useAppSelector } from 'store/hooks'; +import ProviderInfo from './ProviderInfo'; +import ProviderListDialog from './ProviderListDialog'; + +const useStyles = makeStyles({ + inner: { + textAlign: 'left', + width: '100%', + height: '100%', + }, + providerCard: { + width: '100%', + }, + providerCardContent: { + display: 'flex', + alignItems: 'center', + }, +}); + +export default function ProviderSelect() { + const classes = useStyles(); + const [selectDialogOpen, setSelectDialogOpen] = useState(false); + const selectedProvider = useAppSelector( + (state) => state.providers.selectedProvider, + ); + + if (!selectedProvider) return <>No provider selected; + + function handleSelectDialogClose() { + setSelectDialogOpen(false); + } + + function handleSelectDialogOpen() { + setSelectDialogOpen(true); + } + + return ( + + + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSubmitDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSubmitDialog.tsx new file mode 100644 index 00000000..0452db5e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/provider/ProviderSubmitDialog.tsx @@ -0,0 +1,111 @@ +import { ChangeEvent, useState } from 'react'; +import { + DialogTitle, + Dialog, + DialogContent, + DialogContentText, + TextField, + DialogActions, + Button, +} from '@material-ui/core'; +import { Multiaddr } from 'multiaddr'; + +type ProviderSubmitDialogProps = { + open: boolean; + onClose: () => void; +}; + +export default function ProviderSubmitDialog({ + open, + onClose, +}: ProviderSubmitDialogProps) { + const [multiAddr, setMultiAddr] = useState(''); + const [peerId, setPeerId] = useState(''); + + async function handleProviderSubmit() { + if (multiAddr && peerId) { + await fetch('https://api.unstoppableswap.net/api/submit-provider', { + method: 'post', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + multiAddr, + peerId, + }), + }); + setMultiAddr(''); + setPeerId(''); + onClose(); + } + } + + function handleMultiAddrChange(event: ChangeEvent) { + setMultiAddr(event.target.value); + } + + function handlePeerIdChange(event: ChangeEvent) { + setPeerId(event.target.value); + } + + function getMultiAddressError(): string | null { + try { + const multiAddress = new Multiaddr(multiAddr); + if (multiAddress.protoNames().includes('p2p')) { + return 'The multi address should not contain the peer id (/p2p/)'; + } + if (multiAddress.protoNames().find((name) => name.includes('onion'))) { + return 'It is currently not possible to add a provider that is only reachable via Tor'; + } + return null; + } catch (e) { + return 'Not a valid multi address'; + } + } + + return ( + + Submit a provider to the public registry + + + If the provider is valid and reachable, it will be displayed to all + other users to trade with. + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinQrCode.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinQrCode.tsx new file mode 100644 index 00000000..83ef6545 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinQrCode.tsx @@ -0,0 +1,22 @@ +import QRCode from 'react-qr-code'; +import { Box } from '@material-ui/core'; + +export default function BitcoinQrCode({ address }: { address: string }) { + return ( + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinTransactionInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinTransactionInfoBox.tsx new file mode 100644 index 00000000..252833d4 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/BitcoinTransactionInfoBox.tsx @@ -0,0 +1,25 @@ +import { isTestnet } from 'store/config'; +import { getBitcoinTxExplorerUrl } from 'utils/conversionUtils'; +import BitcoinIcon from 'renderer/components/icons/BitcoinIcon'; +import { ReactNode } from 'react'; +import TransactionInfoBox from './TransactionInfoBox'; + +type Props = { + title: string; + txId: string; + additionalContent: ReactNode; + loading: boolean; +}; + +export default function BitcoinTransactionInfoBox({ txId, ...props }: Props) { + const explorerUrl = getBitcoinTxExplorerUrl(txId, isTestnet()); + + return ( + } + {...props} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/CircularProgressWithSubtitle.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/CircularProgressWithSubtitle.tsx new file mode 100644 index 00000000..f82eab86 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/CircularProgressWithSubtitle.tsx @@ -0,0 +1,35 @@ +import { + Box, + CircularProgress, + makeStyles, + Typography, +} from '@material-ui/core'; +import { ReactNode } from 'react'; + +const useStyles = makeStyles((theme) => ({ + subtitle: { + paddingTop: theme.spacing(1), + }, +})); + +export default function CircularProgressWithSubtitle({ + description, +}: { + description: string | ReactNode; +}) { + const classes = useStyles(); + + return ( + + + + {description} + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/ClipbiardIconButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/ClipbiardIconButton.tsx new file mode 100644 index 00000000..8ad35b68 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/ClipbiardIconButton.tsx @@ -0,0 +1,17 @@ +import { Button } from '@material-ui/core'; +import { ButtonProps } from '@material-ui/core/Button/Button'; + +export default function ClipboardIconButton({ + text, + ...props +}: { text: string } & ButtonProps) { + function writeToClipboard() { + throw new Error('Not implemented'); + } + + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/DepositAddressInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/DepositAddressInfoBox.tsx new file mode 100644 index 00000000..9de60c26 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/DepositAddressInfoBox.tsx @@ -0,0 +1,53 @@ +import { ReactNode } from 'react'; +import { Box, Typography } from '@material-ui/core'; +import FileCopyOutlinedIcon from '@material-ui/icons/FileCopyOutlined'; +import InfoBox from './InfoBox'; +import ClipboardIconButton from './ClipbiardIconButton'; +import BitcoinQrCode from './BitcoinQrCode'; + +type Props = { + title: string; + address: string; + additionalContent: ReactNode; + icon: ReactNode; +}; + +export default function DepositAddressInfoBox({ + title, + address, + additionalContent, + icon, +}: Props) { + return ( + {address}} + additionalContent={ + + + } + color="primary" + variant="contained" + size="medium" + /> + + {additionalContent} + + + + + } + icon={icon} + loading={false} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/InfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/InfoBox.tsx new file mode 100644 index 00000000..e58a45bf --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/InfoBox.tsx @@ -0,0 +1,53 @@ +import { + Box, + LinearProgress, + makeStyles, + Paper, + Typography, +} from '@material-ui/core'; +import { ReactNode } from 'react'; + +type Props = { + title: ReactNode; + mainContent: ReactNode; + additionalContent: ReactNode; + loading: boolean; + icon: ReactNode; +}; + +const useStyles = makeStyles((theme) => ({ + outer: { + padding: theme.spacing(1.5), + overflow: 'hidden', + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(1), + }, + upperContent: { + display: 'flex', + alignItems: 'center', + gap: theme.spacing(0.5), + }, +})); + +export default function InfoBox({ + title, + mainContent, + additionalContent, + icon, + loading, +}: Props) { + const classes = useStyles(); + + return ( + + {title} + + {icon} + {mainContent} + + {loading ? : null} + {additionalContent} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/MoneroTransactionInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/MoneroTransactionInfoBox.tsx new file mode 100644 index 00000000..894f23d6 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/MoneroTransactionInfoBox.tsx @@ -0,0 +1,25 @@ +import { isTestnet } from 'store/config'; +import { getMoneroTxExplorerUrl } from 'utils/conversionUtils'; +import MoneroIcon from 'renderer/components/icons/MoneroIcon'; +import { ReactNode } from 'react'; +import TransactionInfoBox from './TransactionInfoBox'; + +type Props = { + title: string; + txId: string; + additionalContent: ReactNode; + loading: boolean; +}; + +export default function MoneroTransactionInfoBox({ txId, ...props }: Props) { + const explorerUrl = getMoneroTxExplorerUrl(txId, isTestnet()); + + return ( + } + {...props} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialog.tsx new file mode 100644 index 00000000..b7adced4 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialog.tsx @@ -0,0 +1,90 @@ +import { useState } from 'react'; +import { + Button, + Dialog, + DialogActions, + DialogContent, + makeStyles, +} from '@material-ui/core'; +import { useAppDispatch, useAppSelector } from 'store/hooks'; +import { swapReset } from 'store/features/swapSlice'; +import SwapStatePage from './pages/SwapStatePage'; +import SwapStateStepper from './SwapStateStepper'; +import SwapSuspendAlert from '../SwapSuspendAlert'; +import SwapDialogTitle from './SwapDialogTitle'; +import DebugPage from './pages/DebugPage'; + +const useStyles = makeStyles({ + content: { + minHeight: '25rem', + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + }, +}); + +export default function SwapDialog({ + open, + onClose, +}: { + open: boolean; + onClose: () => void; +}) { + const classes = useStyles(); + const swap = useAppSelector((state) => state.swap); + const [debug, setDebug] = useState(false); + const [openSuspendAlert, setOpenSuspendAlert] = useState(false); + const dispatch = useAppDispatch(); + + function onCancel() { + if (swap.processRunning) { + setOpenSuspendAlert(true); + } else { + onClose(); + setTimeout(() => dispatch(swapReset()), 0); + } + } + + // This prevents an issue where the Dialog is shown for a split second without a present swap state + if (!open) return null; + + return ( + + + + + {debug ? ( + + ) : ( + <> + + + + )} + + + + + + + + setOpenSuspendAlert(false)} + /> + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialogTitle.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialogTitle.tsx new file mode 100644 index 00000000..7592fc3d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapDialogTitle.tsx @@ -0,0 +1,45 @@ +import { + Box, + DialogTitle, + makeStyles, + Typography, +} from '@material-ui/core'; +import TorStatusBadge from './pages/TorStatusBadge'; +import FeedbackSubmitBadge from './pages/FeedbackSubmitBadge'; +import DebugPageSwitchBadge from './pages/DebugPageSwitchBadge'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + }, + rightSide: { + display: 'flex', + alignItems: 'center', + gridGap: theme.spacing(1), + }, +})); + +export default function SwapDialogTitle({ + title, + debug, + setDebug, +}: { + title: string; + debug: boolean; + setDebug: (d: boolean) => void; +}) { + const classes = useStyles(); + + return ( + + {title} + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapStateStepper.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapStateStepper.tsx new file mode 100644 index 00000000..10d0491b --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/SwapStateStepper.tsx @@ -0,0 +1,166 @@ +import { Step, StepLabel, Stepper, Typography } from '@material-ui/core'; +import { SwapSpawnType } from 'models/cliModel'; +import { SwapStateName } from 'models/rpcModel'; +import { useActiveSwapInfo, useAppSelector } from 'store/hooks'; +import { exhaustiveGuard } from 'utils/typescriptUtils'; + +export enum PathType { + HAPPY_PATH = 'happy path', + UNHAPPY_PATH = 'unhappy path', +} + +function getActiveStep( + stateName: SwapStateName | null, + processExited: boolean, +): [PathType, number, boolean] { + switch (stateName) { + /// // Happy Path + // Step: 0 (Waiting for Bitcoin lock tx to be published) + case null: + return [PathType.HAPPY_PATH, 0, false]; + case SwapStateName.Started: + case SwapStateName.SwapSetupCompleted: + return [PathType.HAPPY_PATH, 0, processExited]; + + // Step: 1 (Waiting for Bitcoin Lock confirmation and XMR Lock Publication) + // We have locked the Bitcoin and are waiting for the other party to lock their XMR + case SwapStateName.BtcLocked: + return [PathType.HAPPY_PATH, 1, processExited]; + + // Step: 2 (Waiting for XMR Lock confirmation) + // We have locked the Bitcoin and the other party has locked their XMR + case SwapStateName.XmrLockProofReceived: + return [PathType.HAPPY_PATH, 1, processExited]; + + // Step: 3 (Sending Encrypted Signature and waiting for Bitcoin Redemption) + // The XMR lock transaction has been confirmed + // We now need to send the encrypted signature to the other party and wait for them to redeem the Bitcoin + case SwapStateName.XmrLocked: + case SwapStateName.EncSigSent: + return [PathType.HAPPY_PATH, 2, processExited]; + + // Step: 4 (Waiting for XMR Redemption) + case SwapStateName.BtcRedeemed: + return [PathType.HAPPY_PATH, 3, processExited]; + + // Step: 4 (Completed) (Swap completed, XMR redeemed) + case SwapStateName.XmrRedeemed: + return [PathType.HAPPY_PATH, 4, false]; + + // Edge Case of Happy Path where the swap is safely aborted. We "fail" at the first step. + case SwapStateName.SafelyAborted: + return [PathType.HAPPY_PATH, 0, true]; + + // // Unhappy Path + // Step: 1 (Cancelling swap, checking if cancel transaction has been published already by the other party) + case SwapStateName.CancelTimelockExpired: + return [PathType.UNHAPPY_PATH, 0, processExited]; + + // Step: 2 (Attempt to publish the Bitcoin refund transaction) + case SwapStateName.BtcCancelled: + return [PathType.UNHAPPY_PATH, 1, processExited]; + + // Step: 2 (Completed) (Bitcoin refunded) + case SwapStateName.BtcRefunded: + return [PathType.UNHAPPY_PATH, 2, false]; + + // Step: 2 (We failed to publish the Bitcoin refund transaction) + // We failed to publish the Bitcoin refund transaction because the timelock has expired. + // We will be punished. Nothing we can do about it now. + case SwapStateName.BtcPunished: + return [PathType.UNHAPPY_PATH, 1, true]; + default: + return exhaustiveGuard(stateName); + } +} + +function HappyPathStepper({ + activeStep, + error, +}: { + activeStep: number; + error: boolean; +}) { + return ( + + + ~12min} + error={error && activeStep === 0} + > + Locking your BTC + + + + ~18min} + error={error && activeStep === 1} + > + They lock their XMR + + + + ~2min} + error={error && activeStep === 2} + > + They redeem the BTC + + + + ~2min} + error={error && activeStep === 3} + > + Redeeming your XMR + + + + ); +} + +function UnhappyPathStepper({ + activeStep, + error, +}: { + activeStep: number; + error: boolean; +}) { + return ( + + + ~20min} + error={error && activeStep === 0} + > + Cancelling swap + + + + ~20min} + error={error && activeStep === 1} + > + Refunding your BTC + + + + ); +} + +export default function SwapStateStepper() { + const currentSwapSpawnType = useAppSelector((s) => s.swap.spawnType); + const stateName = useActiveSwapInfo()?.stateName ?? null; + const processExited = useAppSelector((s) => !s.swap.processRunning); + const [pathType, activeStep, error] = getActiveStep(stateName, processExited); + + // If the current swap is being manually cancelled and refund, we want to show the unhappy path even though the current state is not a "unhappy" state + if (currentSwapSpawnType === SwapSpawnType.CANCEL_REFUND) { + return ; + } + + if (pathType === PathType.HAPPY_PATH) { + return ; + } + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/TransactionInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/TransactionInfoBox.tsx new file mode 100644 index 00000000..8f486e40 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/TransactionInfoBox.tsx @@ -0,0 +1,40 @@ +import { Link, Typography } from '@material-ui/core'; +import { ReactNode } from 'react'; +import InfoBox from './InfoBox'; + +type TransactionInfoBoxProps = { + title: string; + txId: string; + explorerUrl: string; + additionalContent: ReactNode; + loading: boolean; + icon: JSX.Element; +}; + +export default function TransactionInfoBox({ + title, + txId, + explorerUrl, + additionalContent, + icon, + loading, +}: TransactionInfoBoxProps) { + return ( + {txId}} + loading={loading} + additionalContent={ + <> + {additionalContent} + + + View on explorer + + + + } + icon={icon} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPage.tsx new file mode 100644 index 00000000..991e396d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPage.tsx @@ -0,0 +1,36 @@ +import { Box, DialogContentText } from "@material-ui/core"; +import { useActiveSwapInfo, useAppSelector } from "store/hooks"; +import CliLogsBox from "../../../other/RenderedCliLog"; +import JsonTreeView from "../../../other/JSONViewTree"; + +export default function DebugPage() { + const torStdOut = useAppSelector((s) => s.tor.stdOut); + const logs = useAppSelector((s) => s.swap.logs); + const guiState = useAppSelector((s) => s); + const cliState = useActiveSwapInfo(); + + return ( + + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPageSwitchBadge.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPageSwitchBadge.tsx new file mode 100644 index 00000000..49a2ee43 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/DebugPageSwitchBadge.tsx @@ -0,0 +1,26 @@ +import { Tooltip } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import DeveloperBoardIcon from '@material-ui/icons/DeveloperBoard'; + +export default function DebugPageSwitchBadge({ + enabled, + setEnabled, +}: { + enabled: boolean; + setEnabled: (enabled: boolean) => void; +}) { + const handleToggle = () => { + setEnabled(!enabled); + }; + + return ( + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx new file mode 100644 index 00000000..08ddccd7 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/FeedbackSubmitBadge.tsx @@ -0,0 +1,22 @@ +import { IconButton } from '@material-ui/core'; +import FeedbackIcon from '@material-ui/icons/Feedback'; +import FeedbackDialog from '../../feedback/FeedbackDialog'; +import { useState } from 'react'; + +export default function FeedbackSubmitBadge() { + const [showFeedbackDialog, setShowFeedbackDialog] = useState(false); + + return ( + <> + {showFeedbackDialog && ( + setShowFeedbackDialog(false)} + /> + )} + setShowFeedbackDialog(true)}> + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/SwapStatePage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/SwapStatePage.tsx new file mode 100644 index 00000000..de0429a2 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/SwapStatePage.tsx @@ -0,0 +1,106 @@ +import { Box } from '@material-ui/core'; +import { useAppSelector } from 'store/hooks'; +import { + isSwapStateBtcCancelled, + isSwapStateBtcLockInMempool, + isSwapStateBtcPunished, + isSwapStateBtcRedemeed, + isSwapStateBtcRefunded, + isSwapStateInitiated, + isSwapStateProcessExited, + isSwapStateReceivedQuote, + isSwapStateStarted, + isSwapStateWaitingForBtcDeposit, + isSwapStateXmrLocked, + isSwapStateXmrLockInMempool, + isSwapStateXmrRedeemInMempool, + SwapState, +} from '../../../../../models/storeModel'; +import InitiatedPage from './init/InitiatedPage'; +import WaitingForBitcoinDepositPage from './init/WaitingForBitcoinDepositPage'; +import StartedPage from './in_progress/StartedPage'; +import BitcoinLockTxInMempoolPage from './in_progress/BitcoinLockTxInMempoolPage'; +import XmrLockTxInMempoolPage from './in_progress/XmrLockInMempoolPage'; +// eslint-disable-next-line import/no-cycle +import ProcessExitedPage from './exited/ProcessExitedPage'; +import XmrRedeemInMempoolPage from './done/XmrRedeemInMempoolPage'; +import ReceivedQuotePage from './in_progress/ReceivedQuotePage'; +import BitcoinRedeemedPage from './in_progress/BitcoinRedeemedPage'; +import InitPage from './init/InitPage'; +import XmrLockedPage from './in_progress/XmrLockedPage'; +import BitcoinCancelledPage from './in_progress/BitcoinCancelledPage'; +import BitcoinRefundedPage from './done/BitcoinRefundedPage'; +import BitcoinPunishedPage from './done/BitcoinPunishedPage'; +import { SyncingMoneroWalletPage } from './in_progress/SyncingMoneroWalletPage'; + +export default function SwapStatePage({ + swapState, +}: { + swapState: SwapState | null; +}) { + const isSyncingMoneroWallet = useAppSelector( + (state) => state.rpc.state.moneroWallet.isSyncing, + ); + + if (isSyncingMoneroWallet) { + return ; + } + + if (swapState === null) { + return ; + } + if (isSwapStateInitiated(swapState)) { + return ; + } + if (isSwapStateReceivedQuote(swapState)) { + return ; + } + if (isSwapStateWaitingForBtcDeposit(swapState)) { + return ; + } + if (isSwapStateStarted(swapState)) { + return ; + } + if (isSwapStateBtcLockInMempool(swapState)) { + return ; + } + if (isSwapStateXmrLockInMempool(swapState)) { + return ; + } + if (isSwapStateXmrLocked(swapState)) { + return ; + } + if (isSwapStateBtcRedemeed(swapState)) { + return ; + } + if (isSwapStateXmrRedeemInMempool(swapState)) { + return ; + } + if (isSwapStateBtcCancelled(swapState)) { + return ; + } + if (isSwapStateBtcRefunded(swapState)) { + return ; + } + if (isSwapStateBtcPunished(swapState)) { + return ; + } + if (isSwapStateProcessExited(swapState)) { + return ; + } + + console.error( + `No swap state page found for swap state State: ${JSON.stringify( + swapState, + null, + 4, + )}`, + ); + return ( + + No information to display +
+ State: ${JSON.stringify(swapState, null, 4)} +
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/TorStatusBadge.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/TorStatusBadge.tsx new file mode 100644 index 00000000..6cf6d18e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/TorStatusBadge.tsx @@ -0,0 +1,19 @@ +import { IconButton, Tooltip } from '@material-ui/core'; +import { useAppSelector } from 'store/hooks'; +import TorIcon from '../../../icons/TorIcon'; + +export default function TorStatusBadge() { + const tor = useAppSelector((s) => s.tor); + + if (tor.processRunning) { + return ( + + + + + + ); + } + + return <>; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinPunishedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinPunishedPage.tsx new file mode 100644 index 00000000..e98f9fc1 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinPunishedPage.tsx @@ -0,0 +1,15 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import FeedbackInfoBox from '../../../../pages/help/FeedbackInfoBox'; + +export default function BitcoinPunishedPage() { + return ( + + + Unfortunately, the swap was not successful, and you've incurred a + penalty because the swap was not refunded in time. Both the Bitcoin and + Monero are irretrievable. + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinRefundedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinRefundedPage.tsx new file mode 100644 index 00000000..91f3a4cd --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/BitcoinRefundedPage.tsx @@ -0,0 +1,43 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import { SwapStateBtcRefunded } from 'models/storeModel'; +import { useActiveSwapInfo } from 'store/hooks'; +import BitcoinTransactionInfoBox from '../../BitcoinTransactionInfoBox'; +import FeedbackInfoBox from '../../../../pages/help/FeedbackInfoBox'; + +export default function BitcoinRefundedPage({ + state, +}: { + state: SwapStateBtcRefunded | null; +}) { + const swap = useActiveSwapInfo(); + const additionalContent = swap + ? `Refund address: ${swap.btcRefundAddress}` + : null; + + return ( + + + Unfortunately, the swap was not successful. However, rest assured that + all your Bitcoin has been refunded to the specified address. The swap + process is now complete, and you are free to exit the application. + + + {state && ( + + )} + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/XmrRedeemInMempoolPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/XmrRedeemInMempoolPage.tsx new file mode 100644 index 00000000..18f49597 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/done/XmrRedeemInMempoolPage.tsx @@ -0,0 +1,49 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import { SwapStateXmrRedeemInMempool } from 'models/storeModel'; +import { useActiveSwapInfo } from 'store/hooks'; +import { getSwapXmrAmount } from 'models/rpcModel'; +import MoneroTransactionInfoBox from '../../MoneroTransactionInfoBox'; +import FeedbackInfoBox from '../../../../pages/help/FeedbackInfoBox'; + +type XmrRedeemInMempoolPageProps = { + state: SwapStateXmrRedeemInMempool | null; +}; + +export default function XmrRedeemInMempoolPage({ + state, +}: XmrRedeemInMempoolPageProps) { + const swap = useActiveSwapInfo(); + const additionalContent = swap + ? `This transaction transfers ${getSwapXmrAmount(swap).toFixed(6)} XMR to ${ + state?.bobXmrRedeemAddress + }` + : null; + + return ( + + + The swap was successful and the Monero has been sent to the address you + specified. The swap is completed and you may exit the application now. + + + {state && ( + <> + + + )} + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedAndNotDonePage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedAndNotDonePage.tsx new file mode 100644 index 00000000..beea3154 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedAndNotDonePage.tsx @@ -0,0 +1,71 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import { useActiveSwapInfo, useAppSelector } from 'store/hooks'; +import { SwapStateProcessExited } from 'models/storeModel'; +import CliLogsBox from '../../../../other/RenderedCliLog'; +import { SwapSpawnType } from 'models/cliModel'; + +export default function ProcessExitedAndNotDonePage({ + state, +}: { + state: SwapStateProcessExited; +}) { + const swap = useActiveSwapInfo(); + const logs = useAppSelector((s) => s.swap.logs); + const spawnType = useAppSelector((s) => s.swap.spawnType); + + function getText() { + const isCancelRefund = spawnType === SwapSpawnType.CANCEL_REFUND; + const hasRpcError = state.rpcError != null; + const hasSwap = swap != null; + + let messages = []; + + messages.push( + isCancelRefund + ? 'The manual cancel and refund was unsuccessful.' + : 'The swap exited unexpectedly without completing.', + ); + + if (!hasSwap && !isCancelRefund) { + messages.push('No funds were locked.'); + } + + messages.push( + hasRpcError + ? 'Check the error and the logs below for more information.' + : 'Check the logs below for more information.', + ); + + if (hasSwap) { + messages.push(`The swap is in the "${swap.stateName}" state.`); + if (!isCancelRefund) { + messages.push( + 'Try resuming the swap or attempt to initiate a manual cancel and refund.', + ); + } + } + + return messages.join(' '); + } + + return ( + + {getText()} + + {state.rpcError && ( + + )} + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedPage.tsx new file mode 100644 index 00000000..2e78ff86 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/exited/ProcessExitedPage.tsx @@ -0,0 +1,47 @@ +import { useActiveSwapInfo } from 'store/hooks'; +import { SwapStateName } from 'models/rpcModel'; +import { + isSwapStateBtcPunished, + isSwapStateBtcRefunded, + isSwapStateXmrRedeemInMempool, + SwapStateProcessExited, +} from '../../../../../../models/storeModel'; +import XmrRedeemInMempoolPage from '../done/XmrRedeemInMempoolPage'; +import BitcoinPunishedPage from '../done/BitcoinPunishedPage'; +// eslint-disable-next-line import/no-cycle +import SwapStatePage from '../SwapStatePage'; +import BitcoinRefundedPage from '../done/BitcoinRefundedPage'; +import ProcessExitedAndNotDonePage from './ProcessExitedAndNotDonePage'; + +type ProcessExitedPageProps = { + state: SwapStateProcessExited; +}; + +export default function ProcessExitedPage({ state }: ProcessExitedPageProps) { + const swap = useActiveSwapInfo(); + + // If we have a swap state, for a "done" state we should use it to display additional information that can't be extracted from the database + if ( + isSwapStateXmrRedeemInMempool(state.prevState) || + isSwapStateBtcRefunded(state.prevState) || + isSwapStateBtcPunished(state.prevState) + ) { + return ; + } + + // If we don't have a swap state for a "done" state, we should fall back to using the database to display as much information as we can + if (swap) { + if (swap.stateName === SwapStateName.XmrRedeemed) { + return ; + } + if (swap.stateName === SwapStateName.BtcRefunded) { + return ; + } + if (swap.stateName === SwapStateName.BtcPunished) { + return ; + } + } + + // If the swap is not a "done" state (or we don't have a db state because the swap did complete the SwapSetup yet) we should tell the user and show logs + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinCancelledPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinCancelledPage.tsx new file mode 100644 index 00000000..60f06c5d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinCancelledPage.tsx @@ -0,0 +1,5 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function BitcoinCancelledPage() { + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinLockTxInMempoolPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinLockTxInMempoolPage.tsx new file mode 100644 index 00000000..9c55d0e7 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinLockTxInMempoolPage.tsx @@ -0,0 +1,38 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import { SwapStateBtcLockInMempool } from 'models/storeModel'; +import BitcoinTransactionInfoBox from '../../BitcoinTransactionInfoBox'; +import SwapMightBeCancelledAlert from '../../../../alert/SwapMightBeCancelledAlert'; + +type BitcoinLockTxInMempoolPageProps = { + state: SwapStateBtcLockInMempool; +}; + +export default function BitcoinLockTxInMempoolPage({ + state, +}: BitcoinLockTxInMempoolPageProps) { + return ( + + + + The Bitcoin lock transaction has been published. The swap will proceed + once the transaction is confirmed and the swap provider locks their + Monero. + + + Most swap providers require one confirmation before locking their + Monero +
+ Confirmations: {state.bobBtcLockTxConfirmations} + + } + /> +
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinRedeemedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinRedeemedPage.tsx new file mode 100644 index 00000000..c484ce97 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/BitcoinRedeemedPage.tsx @@ -0,0 +1,5 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function BitcoinRedeemedPage() { + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/ReceivedQuotePage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/ReceivedQuotePage.tsx new file mode 100644 index 00000000..b7d70261 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/ReceivedQuotePage.tsx @@ -0,0 +1,7 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function ReceivedQuotePage() { + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/StartedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/StartedPage.tsx new file mode 100644 index 00000000..8dd260c0 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/StartedPage.tsx @@ -0,0 +1,16 @@ +import { SwapStateStarted } from 'models/storeModel'; +import { BitcoinAmount } from 'renderer/components/other/Units'; +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function StartedPage({ state }: { state: SwapStateStarted }) { + const description = state.txLockDetails ? ( + <> + Locking with a + network fee of + + ) : ( + 'Locking Bitcoin' + ); + + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/SyncingMoneroWalletPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/SyncingMoneroWalletPage.tsx new file mode 100644 index 00000000..17e37f13 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/SyncingMoneroWalletPage.tsx @@ -0,0 +1,7 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export function SyncingMoneroWalletPage() { + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockInMempoolPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockInMempoolPage.tsx new file mode 100644 index 00000000..59a24ad8 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockInMempoolPage.tsx @@ -0,0 +1,29 @@ +import { Box, DialogContentText } from '@material-ui/core'; +import { SwapStateXmrLockInMempool } from 'models/storeModel'; +import MoneroTransactionInfoBox from '../../MoneroTransactionInfoBox'; + +type XmrLockTxInMempoolPageProps = { + state: SwapStateXmrLockInMempool; +}; + +export default function XmrLockTxInMempoolPage({ + state, +}: XmrLockTxInMempoolPageProps) { + const additionalContent = `Confirmations: ${state.aliceXmrLockTxConfirmations}/10`; + + return ( + + + They have published their Monero lock transaction. The swap will proceed + once the transaction has been confirmed. + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockedPage.tsx new file mode 100644 index 00000000..8fe447d3 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/in_progress/XmrLockedPage.tsx @@ -0,0 +1,7 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function XmrLockedPage() { + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DepositAmountHelper.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DepositAmountHelper.tsx new file mode 100644 index 00000000..87f3748a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DepositAmountHelper.tsx @@ -0,0 +1,91 @@ +import { useState } from 'react'; +import { Box, makeStyles, TextField, Typography } from '@material-ui/core'; +import { SwapStateWaitingForBtcDeposit } from 'models/storeModel'; +import { useAppSelector } from 'store/hooks'; +import { satsToBtc } from 'utils/conversionUtils'; +import { MoneroAmount } from '../../../../other/Units'; + +const MONERO_FEE = 0.000016; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + alignItems: 'center', + gap: theme.spacing(1), + }, + textField: { + '& input::-webkit-outer-spin-button, & input::-webkit-inner-spin-button': { + display: 'none', + }, + '& input[type=number]': { + MozAppearance: 'textfield', + }, + maxWidth: theme.spacing(16), + }, +})); + +function calcBtcAmountWithoutFees(amount: number, fees: number) { + return amount - fees; +} + +export default function DepositAmountHelper({ + state, +}: { + state: SwapStateWaitingForBtcDeposit; +}) { + const classes = useStyles(); + const [amount, setAmount] = useState(state.minDeposit); + const bitcoinBalance = useAppSelector((s) => s.rpc.state.balance) || 0; + + function getTotalAmountAfterDeposit() { + return amount + satsToBtc(bitcoinBalance); + } + + function hasError() { + return ( + amount < state.minDeposit || + getTotalAmountAfterDeposit() > state.maximumAmount + ); + } + + function calcXMRAmount(): number | null { + if (Number.isNaN(amount)) return null; + if (hasError()) return null; + if (state.price == null) return null; + + console.log( + `Calculating calcBtcAmountWithoutFees(${getTotalAmountAfterDeposit()}, ${ + state.minBitcoinLockTxFee + }) / ${state.price} - ${MONERO_FEE}`, + ); + + return ( + calcBtcAmountWithoutFees( + getTotalAmountAfterDeposit(), + state.minBitcoinLockTxFee, + ) / + state.price - + MONERO_FEE + ); + } + + return ( + + + Depositing {bitcoinBalance > 0 && <>another} + + setAmount(parseFloat(e.target.value))} + size="small" + type="number" + className={classes.textField} + /> + + BTC will give you approximately{' '} + . + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DownloadingMoneroWalletRpcPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DownloadingMoneroWalletRpcPage.tsx new file mode 100644 index 00000000..7cc43bd6 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/DownloadingMoneroWalletRpcPage.tsx @@ -0,0 +1,14 @@ +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; +import { MoneroWalletRpcUpdateState } from '../../../../../../models/storeModel'; + +export default function DownloadingMoneroWalletRpcPage({ + updateState, +}: { + updateState: MoneroWalletRpcUpdateState; +}) { + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitPage.tsx new file mode 100644 index 00000000..90f3277f --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitPage.tsx @@ -0,0 +1,82 @@ +import { Box, DialogContentText, makeStyles } from '@material-ui/core'; +import { useState } from 'react'; +import BitcoinAddressTextField from 'renderer/components/inputs/BitcoinAddressTextField'; +import MoneroAddressTextField from 'renderer/components/inputs/MoneroAddressTextField'; +import { useAppSelector } from 'store/hooks'; +import PlayArrowIcon from '@material-ui/icons/PlayArrow'; +import { isTestnet } from 'store/config'; +import RemainingFundsWillBeUsedAlert from '../../../../alert/RemainingFundsWillBeUsedAlert'; +import IpcInvokeButton from '../../../../IpcInvokeButton'; + +const useStyles = makeStyles((theme) => ({ + initButton: { + marginTop: theme.spacing(1), + }, + fieldsOuter: { + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(2), + }, +})); + +export default function InitPage() { + const classes = useStyles(); + const [redeemAddress, setRedeemAddress] = useState( + '' + ); + const [refundAddress, setRefundAddress] = useState( + '' + ); + const [redeemAddressValid, setRedeemAddressValid] = useState(false); + const [refundAddressValid, setRefundAddressValid] = useState(false); + const selectedProvider = useAppSelector( + (state) => state.providers.selectedProvider, + ); + + return ( + + + + Please specify the address to which the Monero should be sent upon + completion of the swap and the address for receiving a Bitcoin refund if + the swap fails. + + + + + + + + + } + ipcChannel="spawn-buy-xmr" + ipcArgs={[selectedProvider, redeemAddress, refundAddress]} + displayErrorSnackbar={false} + > + Start swap + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitiatedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitiatedPage.tsx new file mode 100644 index 00000000..b4890f95 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/InitiatedPage.tsx @@ -0,0 +1,21 @@ +import { useAppSelector } from 'store/hooks'; +import { SwapSpawnType } from 'models/cliModel'; +import CircularProgressWithSubtitle from '../../CircularProgressWithSubtitle'; + +export default function InitiatedPage() { + const description = useAppSelector((s) => { + switch (s.swap.spawnType) { + case SwapSpawnType.INIT: + return 'Requesting quote from provider...'; + case SwapSpawnType.RESUME: + return 'Resuming swap...'; + case SwapSpawnType.CANCEL_REFUND: + return 'Attempting to cancel & refund swap...'; + default: + // Should never be hit + return 'Initiating swap...'; + } + }); + + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/WaitingForBitcoinDepositPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/WaitingForBitcoinDepositPage.tsx new file mode 100644 index 00000000..fc45eab0 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/swap/pages/init/WaitingForBitcoinDepositPage.tsx @@ -0,0 +1,86 @@ +import { Box, makeStyles, Typography } from '@material-ui/core'; +import { SwapStateWaitingForBtcDeposit } from 'models/storeModel'; +import { useAppSelector } from 'store/hooks'; +import DepositAddressInfoBox from '../../DepositAddressInfoBox'; +import BitcoinIcon from '../../../../icons/BitcoinIcon'; +import DepositAmountHelper from './DepositAmountHelper'; +import { + BitcoinAmount, + MoneroBitcoinExchangeRate, + SatsAmount, +} from '../../../../other/Units'; + +const useStyles = makeStyles((theme) => ({ + amountHelper: { + display: 'flex', + alignItems: 'center', + }, + additionalContent: { + paddingTop: theme.spacing(1), + gap: theme.spacing(0.5), + display: 'flex', + flexDirection: 'column', + }, +})); + +type WaitingForBtcDepositPageProps = { + state: SwapStateWaitingForBtcDeposit; +}; + +export default function WaitingForBtcDepositPage({ + state, +}: WaitingForBtcDepositPageProps) { + const classes = useStyles(); + const bitcoinBalance = useAppSelector((s) => s.rpc.state.balance) || 0; + + // TODO: Account for BTC lock tx fees + return ( + + + +
    + {bitcoinBalance > 0 ? ( +
  • + You have already deposited{' '} + +
  • + ) : null} +
  • + Send any amount between{' '} + and{' '} + to the address + above + {bitcoinBalance > 0 && ( + <> (on top of the already deposited funds) + )} +
  • +
  • + All Bitcoin sent to this this address will converted into + Monero at an exchance rate of{' '} + +
  • +
  • + The network fee of{' '} + will + automatically be deducted from the deposited coins +
  • +
  • + The swap will start automatically as soon as the minimum + amount is deposited +
  • +
+
+ +
+ } + icon={} + /> + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialog.tsx new file mode 100644 index 00000000..23cd6c32 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialog.tsx @@ -0,0 +1,34 @@ +import { Dialog } from '@material-ui/core'; +import { useAppDispatch, useIsRpcEndpointBusy } from 'store/hooks'; +import { RpcMethod } from 'models/rpcModel'; +import { rpcResetWithdrawTxId } from 'store/features/rpcSlice'; +import WithdrawStatePage from './WithdrawStatePage'; +import DialogHeader from '../DialogHeader'; + +export default function WithdrawDialog({ + open, + onClose, +}: { + open: boolean; + onClose: () => void; +}) { + const isRpcEndpointBusy = useIsRpcEndpointBusy(RpcMethod.WITHDRAW_BTC); + const dispatch = useAppDispatch(); + + function onCancel() { + if (!isRpcEndpointBusy) { + onClose(); + dispatch(rpcResetWithdrawTxId()); + } + } + + // This prevents an issue where the Dialog is shown for a split second without a present withdraw state + if (!open && !isRpcEndpointBusy) return null; + + return ( + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialogContent.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialogContent.tsx new file mode 100644 index 00000000..87083079 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawDialogContent.tsx @@ -0,0 +1,27 @@ +import { ReactNode } from 'react'; +import { Box, DialogContent, makeStyles } from '@material-ui/core'; +import WithdrawStepper from './WithdrawStepper'; + +const useStyles = makeStyles({ + outer: { + minHeight: '15rem', + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + }, +}); + +export default function WithdrawDialogContent({ + children, +}: { + children: ReactNode; +}) { + const classes = useStyles(); + + return ( + + {children} + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStatePage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStatePage.tsx new file mode 100644 index 00000000..0e2a7771 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStatePage.tsx @@ -0,0 +1,27 @@ +import { useAppSelector, useIsRpcEndpointBusy } from 'store/hooks'; +import { RpcMethod } from 'models/rpcModel'; +import AddressInputPage from './pages/AddressInputPage'; +import InitiatedPage from './pages/InitiatedPage'; +import BtcTxInMempoolPageContent from './pages/BitcoinWithdrawTxInMempoolPage'; + +export default function WithdrawStatePage({ + onCancel, +}: { + onCancel: () => void; +}) { + const isRpcEndpointBusy = useIsRpcEndpointBusy(RpcMethod.WITHDRAW_BTC); + const withdrawTxId = useAppSelector((state) => state.rpc.state.withdrawTxId); + + if (withdrawTxId !== null) { + return ( + + ); + } + if (isRpcEndpointBusy) { + return ; + } + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStepper.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStepper.tsx new file mode 100644 index 00000000..cbc8bef2 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/WithdrawStepper.tsx @@ -0,0 +1,32 @@ +import { Step, StepLabel, Stepper } from '@material-ui/core'; +import { useAppSelector, useIsRpcEndpointBusy } from 'store/hooks'; +import { RpcMethod } from 'models/rpcModel'; + +function getActiveStep( + isWithdrawInProgress: boolean, + withdrawTxId: string | null, +) { + if (isWithdrawInProgress) { + return 1; + } + if (withdrawTxId !== null) { + return 2; + } + return 0; +} + +export default function WithdrawStepper() { + const isWithdrawInProgress = useIsRpcEndpointBusy(RpcMethod.WITHDRAW_BTC); + const withdrawTxId = useAppSelector((s) => s.rpc.state.withdrawTxId); + + return ( + + + Enter withdraw address + + + Transfer funds to wallet + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/AddressInputPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/AddressInputPage.tsx new file mode 100644 index 00000000..37d4126a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/AddressInputPage.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import { Button, DialogActions, DialogContentText } from '@material-ui/core'; +import BitcoinAddressTextField from '../../../inputs/BitcoinAddressTextField'; +import WithdrawDialogContent from '../WithdrawDialogContent'; +import IpcInvokeButton from '../../../IpcInvokeButton'; + +export default function AddressInputPage({ + onCancel, +}: { + onCancel: () => void; +}) { + const [withdrawAddressValid, setWithdrawAddressValid] = useState(false); + const [withdrawAddress, setWithdrawAddress] = useState(''); + + return ( + <> + + + To withdraw the BTC of the internal wallet, please enter an address. + All funds will be sent to that address. + + + + + + + + + Withdraw + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/BitcoinWithdrawTxInMempoolPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/BitcoinWithdrawTxInMempoolPage.tsx new file mode 100644 index 00000000..153e9941 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/BitcoinWithdrawTxInMempoolPage.tsx @@ -0,0 +1,36 @@ +import { Button, DialogActions, DialogContentText } from '@material-ui/core'; +import BitcoinTransactionInfoBox from '../../swap/BitcoinTransactionInfoBox'; +import WithdrawDialogContent from '../WithdrawDialogContent'; + +export default function BtcTxInMempoolPageContent({ + withdrawTxId, + onCancel, +}: { + withdrawTxId: string; + onCancel: () => void; +}) { + return ( + <> + + + All funds of the internal Bitcoin wallet have been transferred to your + withdraw address. + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/InitiatedPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/InitiatedPage.tsx new file mode 100644 index 00000000..875737a3 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/modal/wallet/pages/InitiatedPage.tsx @@ -0,0 +1,21 @@ +import { Button, DialogActions } from '@material-ui/core'; +import CircularProgressWithSubtitle from '../../swap/CircularProgressWithSubtitle'; +import WithdrawDialogContent from '../WithdrawDialogContent'; + +export default function InitiatedPage({ onCancel }: { onCancel: () => void }) { + return ( + <> + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/Navigation.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/Navigation.tsx new file mode 100644 index 00000000..5228a7b4 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/Navigation.tsx @@ -0,0 +1,41 @@ +import { Drawer, makeStyles, Box } from '@material-ui/core'; +import NavigationHeader from './NavigationHeader'; +import NavigationFooter from './NavigationFooter'; + +export const drawerWidth = 240; + +const useStyles = makeStyles({ + drawer: { + width: drawerWidth, + flexShrink: 0, + }, + drawerPaper: { + width: drawerWidth, + }, + drawerContainer: { + overflow: 'auto', + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + height: '100%', + }, +}); + +export default function Navigation() { + const classes = useStyles(); + + return ( + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationFooter.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationFooter.tsx new file mode 100644 index 00000000..01df1bb3 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationFooter.tsx @@ -0,0 +1,47 @@ +import RedditIcon from '@material-ui/icons/Reddit'; +import GitHubIcon from '@material-ui/icons/GitHub'; +import { Box, makeStyles } from '@material-ui/core'; +import LinkIconButton from '../icons/LinkIconButton'; +import UnfinishedSwapsAlert from '../alert/UnfinishedSwapsAlert'; +import FundsLeftInWalletAlert from '../alert/FundsLeftInWalletAlert'; +import RpcStatusAlert from '../alert/RpcStatusAlert'; +import DiscordIcon from '../icons/DiscordIcon'; +import { DISCORD_URL } from '../pages/help/ContactInfoBox'; +import MoneroWalletRpcUpdatingAlert from '../alert/MoneroWalletRpcUpdatingAlert'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + flexDirection: 'column', + padding: theme.spacing(1), + gap: theme.spacing(1), + }, + linksOuter: { + display: 'flex', + justifyContent: 'space-evenly', + }, +})); + +export default function NavigationFooter() { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationHeader.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationHeader.tsx new file mode 100644 index 00000000..0d208e20 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/NavigationHeader.tsx @@ -0,0 +1,30 @@ +import { Box, List } from '@material-ui/core'; +import SwapHorizOutlinedIcon from '@material-ui/icons/SwapHorizOutlined'; +import HistoryOutlinedIcon from '@material-ui/icons/HistoryOutlined'; +import AccountBalanceWalletIcon from '@material-ui/icons/AccountBalanceWallet'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import RouteListItemIconButton from './RouteListItemIconButton'; +import UnfinishedSwapsBadge from './UnfinishedSwapsCountBadge'; + +export default function NavigationHeader() { + return ( + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/RouteListItemIconButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/RouteListItemIconButton.tsx new file mode 100644 index 00000000..4e29f8b0 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/RouteListItemIconButton.tsx @@ -0,0 +1,22 @@ +import { ReactNode } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ListItem, ListItemIcon, ListItemText } from '@material-ui/core'; + +export default function RouteListItemIconButton({ + name, + route, + children, +}: { + name: string; + route: string; + children: ReactNode; +}) { + const navigate = useNavigate(); + + return ( + navigate(route)} key={name}> + {children} + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/UnfinishedSwapsCountBadge.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/UnfinishedSwapsCountBadge.tsx new file mode 100644 index 00000000..1304b775 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/navigation/UnfinishedSwapsCountBadge.tsx @@ -0,0 +1,19 @@ +import { Badge } from '@material-ui/core'; +import { useResumeableSwapsCount } from 'store/hooks'; + +export default function UnfinishedSwapsBadge({ + children, +}: { + children: JSX.Element; +}) { + const resumableSwapsCount = useResumeableSwapsCount(); + + if (resumableSwapsCount > 0) { + return ( + + {children} + + ); + } + return children; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/ExpandableSearchBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/ExpandableSearchBox.tsx new file mode 100644 index 00000000..3cbee92c --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/ExpandableSearchBox.tsx @@ -0,0 +1,44 @@ +import { useState } from 'react'; +import { Box, IconButton, TextField } from '@material-ui/core'; +import SearchIcon from '@material-ui/icons/Search'; +import CloseIcon from '@material-ui/icons/Close'; + +export function ExpandableSearchBox({ + query, + setQuery, +}: { + query: string; + setQuery: (query: string) => void; +}) { + const [expanded, setExpanded] = useState(false); + + return ( + + + {expanded ? ( + <> + setQuery(e.target.value)} + autoFocus + size="small" + /> + { + setExpanded(false); + setQuery(''); + }} + size="small" + > + + + + ) : ( + setExpanded(true)} size="small"> + + + )} + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/HumanizedBitcoinBlockDuration.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/HumanizedBitcoinBlockDuration.tsx new file mode 100644 index 00000000..00ed29cc --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/HumanizedBitcoinBlockDuration.tsx @@ -0,0 +1,17 @@ +import humanizeDuration from 'humanize-duration'; + +const AVG_BLOCK_TIME_MS = 10 * 60 * 1000; + +export default function HumanizedBitcoinBlockDuration({ + blocks, +}: { + blocks: number; +}) { + return ( + <> + {`${humanizeDuration(blocks * AVG_BLOCK_TIME_MS, { + conjunction: ' and ', + })} (${blocks} blocks)`} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/JSONViewTree.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/JSONViewTree.tsx new file mode 100644 index 00000000..ecdd2979 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/JSONViewTree.tsx @@ -0,0 +1,50 @@ +import TreeView from '@material-ui/lab/TreeView'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import ChevronRightIcon from '@material-ui/icons/ChevronRight'; +import TreeItem from '@material-ui/lab/TreeItem'; +import ScrollablePaperTextBox from './ScrollablePaperTextBox'; + +interface JsonTreeViewProps { + data: any; + label: string; +} + +export default function JsonTreeView({ data, label }: JsonTreeViewProps) { + const renderTree = (nodes: any, parentId: string) => { + return Object.keys(nodes).map((key, _) => { + const nodeId = `${parentId}.${key}`; + if (typeof nodes[key] === 'object' && nodes[key] !== null) { + return ( + + {renderTree(nodes[key], nodeId)} + + ); + } + return ( + + ); + }); + }; + + return ( + } + defaultExpandIcon={} + defaultExpanded={['root']} + > + + {renderTree(data ?? {}, 'root')} + + , + ]} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/LoadingButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/LoadingButton.tsx new file mode 100644 index 00000000..dafe51a9 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/LoadingButton.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import Button, { ButtonProps } from '@material-ui/core/Button'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +interface LoadingButtonProps extends ButtonProps { + loading: boolean; +} + +const LoadingButton: React.FC = ({ + loading, + disabled, + children, + ...props +}) => { + return ( + + ); +}; + +export default LoadingButton; diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/RenderedCliLog.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/RenderedCliLog.tsx new file mode 100644 index 00000000..53ad0264 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/RenderedCliLog.tsx @@ -0,0 +1,91 @@ +import { Box, Chip, Typography } from '@material-ui/core'; +import { useMemo, useState } from 'react'; +import { CliLog } from 'models/cliModel'; +import { logsToRawString } from 'utils/parseUtils'; +import ScrollablePaperTextBox from './ScrollablePaperTextBox'; + +function RenderedCliLog({ log }: { log: CliLog }) { + const { timestamp, level, fields } = log; + + const levelColorMap = { + DEBUG: '#1976d2', // Blue + INFO: '#388e3c', // Green + WARN: '#fbc02d', // Yellow + ERROR: '#d32f2f', // Red + TRACE: '#8e24aa', // Purple + }; + + return ( + + + + + {fields.message} + + + {Object.entries(fields).map(([key, value]) => { + if (key !== 'message') { + return ( + + {key}: {JSON.stringify(value)} + + ); + } + return null; + })} + + + ); +} + +export default function CliLogsBox({ + label, + logs, +}: { + label: string; + logs: (CliLog | string)[]; +}) { + const [searchQuery, setSearchQuery] = useState(''); + + const memoizedLogs = useMemo(() => { + if (searchQuery.length === 0) { + return logs; + } + return logs.filter((log) => + JSON.stringify(log).toLowerCase().includes(searchQuery.toLowerCase()), + ); + }, [logs, searchQuery]); + + return ( + + typeof log === 'string' ? ( + {log} + ) : ( + + ), + )} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/ScrollablePaperTextBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/ScrollablePaperTextBox.tsx new file mode 100644 index 00000000..59350c26 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/ScrollablePaperTextBox.tsx @@ -0,0 +1,90 @@ +import { Box, Divider, IconButton, Paper, Typography } from '@material-ui/core'; +import { ReactNode, useRef } from 'react'; +import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; +import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'; +import { VList, VListHandle } from 'virtua'; +import FileCopyOutlinedIcon from '@material-ui/icons/FileCopyOutlined'; +import { ExpandableSearchBox } from './ExpandableSearchBox'; + +const MIN_HEIGHT = '10rem'; + +export default function ScrollablePaperTextBox({ + rows, + title, + copyValue, + searchQuery, + setSearchQuery, + minHeight, +}: { + rows: ReactNode[]; + title: string; + copyValue: string; + searchQuery?: string; + setSearchQuery?: (query: string) => void; + minHeight?: string; +}) { + const virtuaEl = useRef(null); + + function onCopy() { + navigator.clipboard.writeText(copyValue); + } + + function scrollToBottom() { + virtuaEl.current?.scrollToIndex(rows.length - 1); + } + + function scrollToTop() { + virtuaEl.current?.scrollToIndex(0); + } + + return ( + + {title} + + + + {rows} + + + + + + + + + + + + + {searchQuery !== undefined && setSearchQuery !== undefined && ( + + )} + + + ); +} + +ScrollablePaperTextBox.defaultProps = { + searchQuery: undefined, + setSearchQuery: undefined, + minHeight: MIN_HEIGHT, +}; diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/other/Units.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/other/Units.tsx new file mode 100644 index 00000000..90420dde --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/other/Units.tsx @@ -0,0 +1,80 @@ +import { piconerosToXmr, satsToBtc } from "utils/conversionUtils"; +import { Tooltip } from "@material-ui/core"; +import { useAppSelector } from "store/hooks"; + +type Amount = number | null | undefined; + +export function AmountWithUnit({ + amount, + unit, + fixedPrecision, + dollarRate, +}: { + amount: Amount; + unit: string; + fixedPrecision: number; + dollarRate?: Amount; +}) { + return ( + + + {amount != null + ? Number.parseFloat(amount.toFixed(fixedPrecision)) + : "?"}{" "} + {unit} + + + ); +} + +AmountWithUnit.defaultProps = { + dollarRate: null, +}; + +export function BitcoinAmount({ amount }: { amount: Amount }) { + const btcUsdRate = useAppSelector((state) => state.rates.btcPrice); + + return ( + + ); +} + +export function MoneroAmount({ amount }: { amount: Amount }) { + const xmrUsdRate = useAppSelector((state) => state.rates.xmrPrice); + + return ( + + ); +} + +export function MoneroBitcoinExchangeRate({ rate }: { rate: Amount }) { + return ; +} + +export function SatsAmount({ amount }: { amount: Amount }) { + const btcAmount = amount == null ? null : satsToBtc(amount); + return ; +} + +export function PiconeroAmount({ amount }: { amount: Amount }) { + return ( + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/ContactInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/ContactInfoBox.tsx new file mode 100644 index 00000000..2352276b --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/ContactInfoBox.tsx @@ -0,0 +1,51 @@ +import { Box, Button, makeStyles, Typography } from '@material-ui/core'; +import InfoBox from '../../modal/swap/InfoBox'; + +const useStyles = makeStyles((theme) => ({ + spacedBox: { + display: 'flex', + gap: theme.spacing(1), + }, +})); + +const GITHUB_ISSUE_URL = + 'https://github.com/UnstoppableSwap/unstoppableswap-gui/issues/new/choose'; +const MATRIX_ROOM_URL = 'https://matrix.to/#/#unstoppableswap:matrix.org'; +export const DISCORD_URL = 'https://discord.gg/APJ6rJmq'; + +export default function ContactInfoBox() { + const classes = useStyles(); + + return ( + + If you need help or just want to reach out to the contributors of this + project you can open a GitHub issue, join our Matrix room or Discord + + } + additionalContent={ + + + + + + } + icon={null} + loading={false} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/DonateInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/DonateInfoBox.tsx new file mode 100644 index 00000000..a3dd510a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/DonateInfoBox.tsx @@ -0,0 +1,25 @@ +import { Typography } from '@material-ui/core'; +import DepositAddressInfoBox from '../../modal/swap/DepositAddressInfoBox'; +import MoneroIcon from '../../icons/MoneroIcon'; + +const XMR_DONATE_ADDRESS = + '87jS4C7ngk9EHdqFFuxGFgg8AyH63dRUoULshWDybFJaP75UA89qsutG5B1L1QTc4w228nsqsv8EjhL7bz8fB3611Mh98mg'; + +export default function DonateInfoBox() { + return ( + } + additionalContent={ + + We rely on generous donors like you to keep development moving + forward. To bring Atomic Swaps to life, we need resources. If you have + the possibility, please consider making a donation to the project. All + funds will be used to support contributors and critical + infrastructure. + + } + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/FeedbackInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/FeedbackInfoBox.tsx new file mode 100644 index 00000000..7c89d2fd --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/FeedbackInfoBox.tsx @@ -0,0 +1,35 @@ +import { Button, Typography } from '@material-ui/core'; +import { useState } from 'react'; +import InfoBox from '../../modal/swap/InfoBox'; +import FeedbackDialog from '../../modal/feedback/FeedbackDialog'; + +export default function FeedbackInfoBox() { + const [showDialog, setShowDialog] = useState(false); + + return ( + + The main goal of this project is to make Atomic Swaps easier to use, + and for that we need genuine users' input. Please leave some + feedback, it takes just two minutes. I'll read each and every + survey response and take your feedback into consideration. + + } + additionalContent={ + <> + + setShowDialog(false)} + /> + + } + icon={null} + loading={false} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/HelpPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/HelpPage.tsx new file mode 100644 index 00000000..7a6a2d1f --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/HelpPage.tsx @@ -0,0 +1,28 @@ +import { Box, makeStyles } from '@material-ui/core'; +import ContactInfoBox from './ContactInfoBox'; +import FeedbackInfoBox from './FeedbackInfoBox'; +import DonateInfoBox from './DonateInfoBox'; +import TorInfoBox from './TorInfoBox'; +import RpcControlBox from './RpcControlBox'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + gap: theme.spacing(2), + flexDirection: 'column', + }, +})); + +export default function HelpPage() { + const classes = useStyles(); + + return ( + + + + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/RpcControlBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/RpcControlBox.tsx new file mode 100644 index 00000000..78dc1395 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/RpcControlBox.tsx @@ -0,0 +1,74 @@ +import { Box, makeStyles } from '@material-ui/core'; +import IpcInvokeButton from 'renderer/components/IpcInvokeButton'; +import { useAppSelector } from 'store/hooks'; +import StopIcon from '@material-ui/icons/Stop'; +import PlayArrowIcon from '@material-ui/icons/PlayArrow'; +import { RpcProcessStateType } from 'models/rpcModel'; +import InfoBox from '../../modal/swap/InfoBox'; +import CliLogsBox from '../../other/RenderedCliLog'; +import FolderOpenIcon from '@material-ui/icons/FolderOpen'; + +const useStyles = makeStyles((theme) => ({ + actionsOuter: { + display: 'flex', + gap: theme.spacing(1), + alignItems: 'center', + }, +})); + +export default function RpcControlBox() { + const rpcProcess = useAppSelector((state) => state.rpc.process); + const isRunning = + rpcProcess.type === RpcProcessStateType.STARTED || + rpcProcess.type === RpcProcessStateType.LISTENING_FOR_CONNECTIONS; + const classes = useStyles(); + + return ( + + ) : null + } + additionalContent={ + + } + disabled={isRunning} + requiresRpc={false} + > + Start Daemon + + } + disabled={!isRunning} + requiresRpc={false} + > + Stop Daemon + + } + requiresRpc={false} + isIconButton + size="small" + tooltipTitle="Open the data directory of the Swap Daemon in your file explorer" + /> + + } + icon={null} + loading={false} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/TorInfoBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/TorInfoBox.tsx new file mode 100644 index 00000000..d787fa8e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/help/TorInfoBox.tsx @@ -0,0 +1,71 @@ +import { Box, makeStyles, Typography } from '@material-ui/core'; +import IpcInvokeButton from 'renderer/components/IpcInvokeButton'; +import { useAppSelector } from 'store/hooks'; +import StopIcon from '@material-ui/icons/Stop'; +import PlayArrowIcon from '@material-ui/icons/PlayArrow'; +import InfoBox from '../../modal/swap/InfoBox'; +import CliLogsBox from '../../other/RenderedCliLog'; + +const useStyles = makeStyles((theme) => ({ + actionsOuter: { + display: 'flex', + gap: theme.spacing(1), + }, +})); + +export default function TorInfoBox() { + const isTorRunning = useAppSelector((state) => state.tor.processRunning); + const torStdOut = useAppSelector((s) => s.tor.stdOut); + const classes = useStyles(); + + return ( + + + Tor is a network that allows you to anonymously connect to the + internet. It is a free and open network that is operated by + volunteers. You can start and stop Tor by clicking the buttons + below. If Tor is running, all traffic will be routed through it and + the swap provider will not be able to see your IP address. + + + + } + additionalContent={ + + } + requiresRpc={false} + > + Start Tor + + } + requiresRpc={false} + > + Stop Tor + + + } + icon={null} + loading={false} + /> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/HistoryPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/HistoryPage.tsx new file mode 100644 index 00000000..7ea72a48 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/HistoryPage.tsx @@ -0,0 +1,18 @@ +import { Typography } from '@material-ui/core'; +import { useIsSwapRunning } from 'store/hooks'; +import HistoryTable from './table/HistoryTable'; +import SwapDialog from '../../modal/swap/SwapDialog'; +import SwapTxLockAlertsBox from '../../alert/SwapTxLockAlertsBox'; + +export default function HistoryPage() { + const showDialog = useIsSwapRunning(); + + return ( + <> + History + + + {}} /> + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRow.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRow.tsx new file mode 100644 index 00000000..bbd0bf3c --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRow.tsx @@ -0,0 +1,86 @@ +import { + Box, + Collapse, + IconButton, + makeStyles, + TableCell, + TableRow, +} from '@material-ui/core'; +import { useState } from 'react'; +import ArrowForwardIcon from '@material-ui/icons/ArrowForward'; +import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; +import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'; +import { + getHumanReadableDbStateType, + getSwapBtcAmount, + getSwapXmrAmount, + GetSwapInfoResponse, +} from '../../../../../models/rpcModel'; +import HistoryRowActions from './HistoryRowActions'; +import HistoryRowExpanded from './HistoryRowExpanded'; +import { BitcoinAmount, MoneroAmount } from '../../../other/Units'; + +type HistoryRowProps = { + swap: GetSwapInfoResponse; +}; + +const useStyles = makeStyles((theme) => ({ + amountTransferContainer: { + display: 'flex', + alignItems: 'center', + gap: theme.spacing(1), + }, +})); + +function AmountTransfer({ + btcAmount, + xmrAmount, +}: { + xmrAmount: number; + btcAmount: number; +}) { + const classes = useStyles(); + + return ( + + + + + + ); +} + +export default function HistoryRow({ swap }: HistoryRowProps) { + const btcAmount = getSwapBtcAmount(swap); + const xmrAmount = getSwapXmrAmount(swap); + + const [expanded, setExpanded] = useState(false); + + return ( + <> + + + setExpanded(!expanded)}> + {expanded ? : } + + + {swap.swapId.substring(0, 5)}... + + + + {getHumanReadableDbStateType(swap.stateName)} + + + + + + + + + {expanded && } + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowActions.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowActions.tsx new file mode 100644 index 00000000..0caf8543 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowActions.tsx @@ -0,0 +1,90 @@ +import { Tooltip } from '@material-ui/core'; +import Button, { ButtonProps } from '@material-ui/core/Button/Button'; +import DoneIcon from '@material-ui/icons/Done'; +import ErrorIcon from '@material-ui/icons/Error'; +import { green, red } from '@material-ui/core/colors'; +import PlayArrowIcon from '@material-ui/icons/PlayArrow'; +import IpcInvokeButton from '../../../IpcInvokeButton'; +import { + GetSwapInfoResponse, + SwapStateName, + isSwapStateNamePossiblyCancellableSwap, + isSwapStateNamePossiblyRefundableSwap, +} from '../../../../../models/rpcModel'; + +export function SwapResumeButton({ + swap, + ...props +}: { swap: GetSwapInfoResponse } & ButtonProps) { + return ( + } + requiresRpc + {...props} + > + Resume + + ); +} + +export function SwapCancelRefundButton({ + swap, + ...props +}: { swap: GetSwapInfoResponse } & ButtonProps) { + const cancelOrRefundable = + isSwapStateNamePossiblyCancellableSwap(swap.stateName) || + isSwapStateNamePossiblyRefundableSwap(swap.stateName); + + if (!cancelOrRefundable) { + return <>; + } + + return ( + + Attempt manual Cancel & Refund + + ); +} + +export default function HistoryRowActions({ + swap, +}: { + swap: GetSwapInfoResponse; +}) { + if (swap.stateName === SwapStateName.XmrRedeemed) { + return ( + + + + ); + } + + if (swap.stateName === SwapStateName.BtcRefunded) { + return ( + + + + ); + } + + if (swap.stateName === SwapStateName.BtcPunished) { + return ( + + + + ); + } + + return ; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowExpanded.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowExpanded.tsx new file mode 100644 index 00000000..cc0deb98 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryRowExpanded.tsx @@ -0,0 +1,134 @@ +import { + Box, + Link, + makeStyles, + Table, + TableBody, + TableCell, + TableContainer, + TableRow, +} from '@material-ui/core'; +import { getBitcoinTxExplorerUrl } from 'utils/conversionUtils'; +import { isTestnet } from 'store/config'; +import { + getHumanReadableDbStateType, + getSwapBtcAmount, + getSwapExchangeRate, + getSwapTxFees, + getSwapXmrAmount, + GetSwapInfoResponse, +} from '../../../../../models/rpcModel'; +import SwapLogFileOpenButton from './SwapLogFileOpenButton'; +import { SwapCancelRefundButton } from './HistoryRowActions'; +import { SwapMoneroRecoveryButton } from './SwapMoneroRecoveryButton'; +import { + BitcoinAmount, + MoneroAmount, + MoneroBitcoinExchangeRate, +} from 'renderer/components/other/Units'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'grid', + padding: theme.spacing(1), + gap: theme.spacing(1), + }, + actionsOuter: { + display: 'flex', + flexDirection: 'row', + gap: theme.spacing(1), + }, +})); + +export default function HistoryRowExpanded({ + swap, +}: { + swap: GetSwapInfoResponse; +}) { + const classes = useStyles(); + + const { seller, startDate } = swap; + const btcAmount = getSwapBtcAmount(swap); + const xmrAmount = getSwapXmrAmount(swap); + const txFees = getSwapTxFees(swap); + const exchangeRate = getSwapExchangeRate(swap); + + return ( + + + + + + Started on + {startDate} + + + Swap ID + {swap.swapId} + + + State Name + + {getHumanReadableDbStateType(swap.stateName)} + + + + Monero Amount + + + + + + Bitcoin Amount + + + + + + Exchange Rate + + + + + + Bitcoin Network Fees + + + + + + Provider Address + + {seller.addresses.join(', ')} + + + + Bitcoin lock transaction + + + {swap.txLockId} + + + + +
+
+ + + + + +
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryTable.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryTable.tsx new file mode 100644 index 00000000..163456cf --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/HistoryTable.tsx @@ -0,0 +1,53 @@ +import { + Box, + makeStyles, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, +} from '@material-ui/core'; +import { sortBy } from 'lodash'; +import { parseDateString } from 'utils/parseUtils'; +import { + useAppSelector, + useSwapInfosSortedByDate, +} from '../../../../../store/hooks'; +import HistoryRow from './HistoryRow'; + +const useStyles = makeStyles((theme) => ({ + outer: { + paddingTop: theme.spacing(1), + paddingBottom: theme.spacing(1), + }, +})); + +export default function HistoryTable() { + const classes = useStyles(); + const swapSortedByDate = useSwapInfosSortedByDate(); + + return ( + + + + + + + ID + Amount + State + + + + + {swapSortedByDate.map((swap) => ( + + ))} + +
+
+
+ ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapLogFileOpenButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapLogFileOpenButton.tsx new file mode 100644 index 00000000..681f0b6c --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapLogFileOpenButton.tsx @@ -0,0 +1,45 @@ +import { ButtonProps } from '@material-ui/core/Button/Button'; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, +} from '@material-ui/core'; +import { useState } from 'react'; +import { CliLog } from 'models/cliModel'; +import IpcInvokeButton from '../../../IpcInvokeButton'; +import CliLogsBox from '../../../other/RenderedCliLog'; + +export default function SwapLogFileOpenButton({ + swapId, + ...props +}: { swapId: string } & ButtonProps) { + const [logs, setLogs] = useState(null); + + return ( + <> + { + setLogs(data as CliLog[]); + }} + {...props} + > + view log + + {logs && ( + setLogs(null)} fullWidth maxWidth="lg"> + Logs of swap {swapId} + + + + + + + + )} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapMoneroRecoveryButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapMoneroRecoveryButton.tsx new file mode 100644 index 00000000..e20e056e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/history/table/SwapMoneroRecoveryButton.tsx @@ -0,0 +1,119 @@ +import { ButtonProps } from '@material-ui/core/Button/Button'; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + Link, +} from '@material-ui/core'; +import { useAppDispatch, useAppSelector } from 'store/hooks'; +import { rpcResetMoneroRecoveryKeys } from 'store/features/rpcSlice'; +import { + GetSwapInfoResponse, + isSwapMoneroRecoverable, +} from '../../../../../models/rpcModel'; +import IpcInvokeButton from '../../../IpcInvokeButton'; +import DialogHeader from '../../../modal/DialogHeader'; +import ScrollablePaperTextBox from '../../../other/ScrollablePaperTextBox'; + +function MoneroRecoveryKeysDialog({ swap }: { swap: GetSwapInfoResponse }) { + const dispatch = useAppDispatch(); + const keys = useAppSelector((s) => s.rpc.state.moneroRecovery); + + function onClose() { + dispatch(rpcResetMoneroRecoveryKeys()); + } + + if (keys === null || keys.swapId !== swap.swapId) { + return <>; + } + + return ( + + + + + You can use the keys below to manually redeem the Monero funds from + the multi-signature wallet. +
    +
  • + This is useful if the swap daemon fails to redeem the funds itself +
  • +
  • + If you have come this far, there is no risk of losing funds. You + are the only one with access to these keys and can use them to + access your funds +
  • +
  • + View{' '} + + this guide + {' '} + for a detailed description on how to import the keys and spend the + funds. +
  • +
+
+ + {[ + ['Primary Address', keys.keys.address], + ['View Key', keys.keys.view_key], + ['Spend Key', keys.keys.spend_key], + ['Restore Height', keys.keys.restore_height.toString()], + ].map(([title, value]) => ( + + ))} + +
+ + + +
+ ); +} + +export function SwapMoneroRecoveryButton({ + swap, + ...props +}: { swap: GetSwapInfoResponse } & ButtonProps) { + const isRecoverable = isSwapMoneroRecoverable(swap.stateName); + + if (!isRecoverable) { + return <>; + } + + return ( + <> + + Display Monero Recovery Keys + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/ApiAlertsBox.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/ApiAlertsBox.tsx new file mode 100644 index 00000000..ad2bb153 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/ApiAlertsBox.tsx @@ -0,0 +1,31 @@ +import { Box } from '@material-ui/core'; +import { Alert, AlertTitle } from '@material-ui/lab'; +import { removeAlert } from 'store/features/alertsSlice'; +import { useAppDispatch, useAppSelector } from 'store/hooks'; + +export default function ApiAlertsBox() { + const alerts = useAppSelector((state) => state.alerts.alerts); + const dispatch = useAppDispatch(); + + function onRemoveAlert(id: number) { + dispatch(removeAlert(id)); + } + + if (alerts.length === 0) return null; + + return ( + + {alerts.map((alert) => ( + onRemoveAlert(alert.id)} + > + {alert.title} + {alert.body} + + ))} + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapPage.tsx new file mode 100644 index 00000000..f13171c6 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapPage.tsx @@ -0,0 +1,25 @@ +import { Box, makeStyles } from '@material-ui/core'; +import SwapWidget from './SwapWidget'; +import ApiAlertsBox from './ApiAlertsBox'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + width: '100%', + flexDirection: 'column', + alignItems: 'center', + paddingBottom: theme.spacing(1), + gap: theme.spacing(1), + }, +})); + +export default function SwapPage() { + const classes = useStyles(); + + return ( + + + + + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapWidget.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapWidget.tsx new file mode 100644 index 00000000..75840215 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/swap/SwapWidget.tsx @@ -0,0 +1,274 @@ +import { ChangeEvent, useEffect, useState } from 'react'; +import { + makeStyles, + Box, + Paper, + Typography, + TextField, + LinearProgress, + Fab, +} from '@material-ui/core'; +import InputAdornment from '@material-ui/core/InputAdornment'; +import ArrowDownwardIcon from '@material-ui/icons/ArrowDownward'; +import SwapHorizIcon from '@material-ui/icons/SwapHoriz'; +import { Alert } from '@material-ui/lab'; +import { satsToBtc } from 'utils/conversionUtils'; +import { useAppSelector } from 'store/hooks'; +import { ExtendedProviderStatus } from 'models/apiModel'; +import { isSwapState } from 'models/storeModel'; +import SwapDialog from '../../modal/swap/SwapDialog'; +import ProviderSelect from '../../modal/provider/ProviderSelect'; +import { + ListSellersDialogOpenButton, + ProviderSubmitDialogOpenButton, +} from '../../modal/provider/ProviderListDialog'; + +// After RECONNECTION_ATTEMPTS_UNTIL_ASSUME_DOWN failed reconnection attempts we can assume the public registry is down +const RECONNECTION_ATTEMPTS_UNTIL_ASSUME_DOWN = 1; + +function isRegistryDown(reconnectionAttempts: number): boolean { + return reconnectionAttempts > RECONNECTION_ATTEMPTS_UNTIL_ASSUME_DOWN; +} + +const useStyles = makeStyles((theme) => ({ + inner: { + width: 'min(480px, 100%)', + minHeight: '150px', + display: 'grid', + padding: theme.spacing(1), + gridGap: theme.spacing(1), + }, + header: { + padding: 0, + }, + headerText: { + padding: theme.spacing(1), + }, + providerInfo: { + padding: theme.spacing(1), + }, + swapIconOuter: { + display: 'flex', + justifyContent: 'center', + }, + swapIcon: { + marginRight: theme.spacing(1), + }, + noProvidersAlertOuter: { + display: 'flex', + flexDirection: 'column', + gap: theme.spacing(1), + }, + noProvidersAlertButtonsOuter: { + display: 'flex', + gap: theme.spacing(1), + }, +})); + +function Title() { + const classes = useStyles(); + + return ( + + + Swap + + + ); +} + +function HasProviderSwapWidget({ + selectedProvider, +}: { + selectedProvider: ExtendedProviderStatus; +}) { + const classes = useStyles(); + + const forceShowDialog = useAppSelector((state) => + isSwapState(state.swap.state), + ); + const [showDialog, setShowDialog] = useState(false); + const [btcFieldValue, setBtcFieldValue] = useState( + satsToBtc(selectedProvider.minSwapAmount), + ); + const [xmrFieldValue, setXmrFieldValue] = useState(1); + + function onBtcAmountChange(event: ChangeEvent) { + setBtcFieldValue(event.target.value); + } + + function updateXmrValue() { + const parsedBtcAmount = Number(btcFieldValue); + if (Number.isNaN(parsedBtcAmount)) { + setXmrFieldValue(0); + } else { + const convertedXmrAmount = + parsedBtcAmount / satsToBtc(selectedProvider.price); + setXmrFieldValue(convertedXmrAmount); + } + } + + function getBtcFieldError(): string | null { + const parsedBtcAmount = Number(btcFieldValue); + if (Number.isNaN(parsedBtcAmount)) { + return 'This is not a valid number'; + } + if (parsedBtcAmount < satsToBtc(selectedProvider.minSwapAmount)) { + return `The minimum swap amount is ${satsToBtc( + selectedProvider.minSwapAmount, + )} BTC. Switch to a different provider if you want to swap less.`; + } + if (parsedBtcAmount > satsToBtc(selectedProvider.maxSwapAmount)) { + return `The maximum swap amount is ${satsToBtc( + selectedProvider.maxSwapAmount, + )} BTC. Switch to a different provider if you want to swap more.`; + } + return null; + } + + function handleGuideDialogOpen() { + setShowDialog(true); + } + + useEffect(updateXmrValue, [btcFieldValue, selectedProvider]); + + return ( + // 'elevation' prop can't be passed down (type def issue) + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + + + <TextField + label="Send" + size="medium" + variant="outlined" + value={btcFieldValue} + onChange={onBtcAmountChange} + error={!!getBtcFieldError()} + helperText={getBtcFieldError()} + autoFocus + InputProps={{ + endAdornment: <InputAdornment position="end">BTC</InputAdornment>, + }} + /> + <Box className={classes.swapIconOuter}> + <ArrowDownwardIcon fontSize="small" /> + </Box> + <TextField + label="Receive" + variant="outlined" + size="medium" + value={xmrFieldValue.toFixed(6)} + InputProps={{ + endAdornment: <InputAdornment position="end">XMR</InputAdornment>, + }} + /> + <ProviderSelect /> + <Fab variant="extended" color="primary" onClick={handleGuideDialogOpen}> + <SwapHorizIcon className={classes.swapIcon} /> + Swap + </Fab> + <SwapDialog + open={showDialog || forceShowDialog} + onClose={() => setShowDialog(false)} + /> + </Box> + ); +} + +function HasNoProvidersSwapWidget() { + const forceShowDialog = useAppSelector((state) => + isSwapState(state.swap.state), + ); + const isPublicRegistryDown = useAppSelector((state) => + isRegistryDown( + state.providers.registry.failedReconnectAttemptsSinceLastSuccess, + ), + ); + const classes = useStyles(); + + const alertBox = isPublicRegistryDown ? ( + <Alert severity="info"> + <Box className={classes.noProvidersAlertOuter}> + <Typography> + Currently, the public registry of providers seems to be unreachable. + Here's what you can do: + <ul> + <li> + Try discovering a provider by connecting to a rendezvous point + </li> + <li> + Try again later when the public registry may be reachable again + </li> + </ul> + </Typography> + <Box> + <ListSellersDialogOpenButton /> + </Box> + </Box> + </Alert> + ) : ( + <Alert severity="info"> + <Box className={classes.noProvidersAlertOuter}> + <Typography> + Currently, there are no providers (trading partners) available in the + official registry. Here's what you can do: + <ul> + <li> + Try discovering a provider by connecting to a rendezvous point + </li> + <li>Add a new provider to the public registry</li> + <li>Try again later when more providers may be available</li> + </ul> + </Typography> + <Box> + <ProviderSubmitDialogOpenButton /> + <ListSellersDialogOpenButton /> + </Box> + </Box> + </Alert> + ); + + return ( + <Box> + {alertBox} + <SwapDialog open={forceShowDialog} onClose={() => {}} /> + </Box> + ); +} + +function ProviderLoadingSwapWidget() { + const classes = useStyles(); + + return ( + // 'elevation' prop can't be passed down (type def issue) + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + <Box className={classes.inner} component={Paper} elevation={15}> + <Title /> + <LinearProgress /> + </Box> + ); +} + +export default function SwapWidget() { + const selectedProvider = useAppSelector( + (state) => state.providers.selectedProvider, + ); + // If we fail more than RECONNECTION_ATTEMPTS_UNTIL_ASSUME_DOWN reconnect attempts, we'll show the "no providers" widget. We can assume the public registry is down. + const providerLoading = useAppSelector( + (state) => + state.providers.registry.providers === null && + !isRegistryDown( + state.providers.registry.failedReconnectAttemptsSinceLastSuccess, + ), + ); + + if (providerLoading) { + return <ProviderLoadingSwapWidget />; + } + if (selectedProvider) { + return <HasProviderSwapWidget selectedProvider={selectedProvider} />; + } + return <HasNoProvidersSwapWidget />; +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletPage.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletPage.tsx new file mode 100644 index 00000000..aab2291e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletPage.tsx @@ -0,0 +1,31 @@ +import { Box, makeStyles, Typography } from '@material-ui/core'; +import { Alert } from '@material-ui/lab'; +import WithdrawWidget from './WithdrawWidget'; + +const useStyles = makeStyles((theme) => ({ + outer: { + display: 'flex', + flexDirection: 'column', + gridGap: theme.spacing(0.5), + }, +})); + +export default function WalletPage() { + const classes = useStyles(); + + return ( + <Box className={classes.outer}> + <Typography variant="h3">Wallet</Typography> + <Alert severity="info"> + You do not have to deposit money before starting a swap. Instead, you + will be greeted with a deposit address after you initiate one. + </Alert> + <Typography variant="subtitle1"> + If funds are left in your wallet after a swap, you can withdraw them to + your wallet. If you decide to leave them inside the internal wallet, the + funds will automatically be used when starting a new swap. + </Typography> + <WithdrawWidget /> + </Box> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletRefreshButton.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletRefreshButton.tsx new file mode 100644 index 00000000..6457d7b0 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WalletRefreshButton.tsx @@ -0,0 +1,10 @@ +import { Button, CircularProgress, IconButton } from '@material-ui/core'; +import RefreshIcon from '@material-ui/icons/Refresh'; +import IpcInvokeButton from '../../IpcInvokeButton'; +import { checkBitcoinBalance } from 'renderer/rpc'; + +export default function WalletRefreshButton() { + return <IconButton onClick={() => checkBitcoinBalance(true)}> + <RefreshIcon /> + </IconButton> +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx new file mode 100644 index 00000000..45b85b0a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/pages/wallet/WithdrawWidget.tsx @@ -0,0 +1,64 @@ +import { Box, Button, makeStyles, Typography } from '@material-ui/core'; +import { useState } from 'react'; +import SendIcon from '@material-ui/icons/Send'; +import { useAppSelector, useIsRpcEndpointBusy } from 'store/hooks'; +import { RpcMethod } from 'models/rpcModel'; +import BitcoinIcon from '../../icons/BitcoinIcon'; +import WithdrawDialog from '../../modal/wallet/WithdrawDialog'; +import WalletRefreshButton from './WalletRefreshButton'; +import InfoBox from '../../modal/swap/InfoBox'; +import { SatsAmount } from 'renderer/components/other/Units'; + +const useStyles = makeStyles((theme) => ({ + title: { + alignItems: 'center', + display: 'flex', + gap: theme.spacing(0.5), + }, +})); + +export default function WithdrawWidget() { + const classes = useStyles(); + const walletBalance = useAppSelector((state) => state.rpc.state.balance); + const checkingBalance = useIsRpcEndpointBusy(RpcMethod.GET_BTC_BALANCE); + const [showDialog, setShowDialog] = useState(false); + + function onShowDialog() { + setShowDialog(true); + } + + return ( + <> + <InfoBox + title={ + <Box className={classes.title}> + Wallet Balance + <WalletRefreshButton /> + </Box> + } + mainContent={ + <Typography variant="h5"> + <SatsAmount amount={walletBalance} /> + </Typography> + } + icon={<BitcoinIcon />} + additionalContent={ + <Button + variant="contained" + color="primary" + endIcon={<SendIcon />} + size="large" + onClick={onShowDialog} + disabled={ + walletBalance === null || checkingBalance || walletBalance <= 0 + } + > + Withdraw + </Button> + } + loading={false} + /> + <WithdrawDialog open={showDialog} onClose={() => setShowDialog(false)} /> + </> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/components/snackbar/GlobalSnackbarProvider.tsx b/src-xmr-btc-swap/src-gui/src/renderer/components/snackbar/GlobalSnackbarProvider.tsx new file mode 100644 index 00000000..3a09bd63 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/components/snackbar/GlobalSnackbarProvider.tsx @@ -0,0 +1,46 @@ +import { + MaterialDesignContent, + SnackbarKey, + SnackbarProvider, + useSnackbar, +} from 'notistack'; +import { IconButton, styled } from '@material-ui/core'; +import { Close } from '@material-ui/icons'; +import { ReactNode } from 'react'; + +const StyledMaterialDesignContent = styled(MaterialDesignContent)(() => ({ + '&.notistack-MuiContent': { + maxWidth: '50vw', + }, +})); + +function CloseSnackbarButton({ snackbarId }: { snackbarId: SnackbarKey }) { + const { closeSnackbar } = useSnackbar(); + + return ( + <IconButton onClick={() => closeSnackbar(snackbarId)}> + <Close /> + </IconButton> + ); +} + +export default function GlobalSnackbarManager({ + children, +}: { + children: ReactNode; +}) { + return ( + <SnackbarProvider + action={(snackbarId) => <CloseSnackbarButton snackbarId={snackbarId} />} + Components={{ + success: StyledMaterialDesignContent, + error: StyledMaterialDesignContent, + default: StyledMaterialDesignContent, + info: StyledMaterialDesignContent, + warning: StyledMaterialDesignContent, + }} + > + {children} + </SnackbarProvider> + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/index.ejs b/src-xmr-btc-swap/src-gui/src/renderer/index.ejs new file mode 100644 index 00000000..146f4f79 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/index.ejs @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + <link + rel="stylesheet" + href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" + /> + <script type="text/javascript"> + window.global = window; + </script> + <style> + ::-webkit-scrollbar { + display: none; + } + *, *::after, *::before { + -webkit-user-select: none; + -webkit-user-drag: none; + -webkit-app-region: no-drag; + } + </style> + </head> + <body> + <div id="root"></div> + </body> +</html> diff --git a/src-xmr-btc-swap/src-gui/src/renderer/index.tsx b/src-xmr-btc-swap/src-gui/src/renderer/index.tsx new file mode 100644 index 00000000..15efcefe --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/index.tsx @@ -0,0 +1,63 @@ +import { render } from 'react-dom'; +import { Provider } from 'react-redux'; +import { store } from './store/storeRenderer'; +import { setRegistryProviders } from 'store/features/providersSlice'; +import { setAlerts } from 'store/features/alertsSlice'; +import { setXmrPrice, setBtcPrice } from 'store/features/ratesSlice'; +import { + fetchAlertsViaHttp, + fetchBtcPrice, + fetchProvidersViaHttp, + fetchXmrPrice, +} from './api'; +import logger from '../utils/logger'; +import App from './components/App'; +import { checkBitcoinBalance, getRawSwapInfos } from './rpc'; + +setTimeout(() => { + checkBitcoinBalance(); + getRawSwapInfos(); +}, 10000); + +render( + <Provider store={store}> + <App /> + </Provider>, + document.getElementById('root'), +); + +async function fetchInitialData() { + try { + const providerList = await fetchProvidersViaHttp(); + store.dispatch(setRegistryProviders(providerList)); + + logger.info( + { providerList }, + 'Fetched providers via UnstoppableSwap HTTP API', + ); + } catch (e) { + logger.error(e, 'Failed to fetch providers via UnstoppableSwap HTTP API'); + } + + try { + const alerts = await fetchAlertsViaHttp(); + store.dispatch(setAlerts(alerts)); + logger.info({ alerts }, 'Fetched alerts via UnstoppableSwap HTTP API'); + } catch (e) { + logger.error(e, 'Failed to fetch alerts via UnstoppableSwap HTTP API'); + } + + try { + const xmrPrice = await fetchXmrPrice(); + store.dispatch(setXmrPrice(xmrPrice)); + logger.info({ xmrPrice }, 'Fetched XMR price'); + + const btcPrice = await fetchBtcPrice(); + store.dispatch(setBtcPrice(btcPrice)); + logger.info({ btcPrice }, 'Fetched BTC price'); + } catch (e) { + logger.error(e, 'Error retrieving fiat prices'); + } +} + +fetchInitialData(); \ No newline at end of file diff --git a/src-xmr-btc-swap/src-gui/src/renderer/rpc.ts b/src-xmr-btc-swap/src-gui/src/renderer/rpc.ts new file mode 100644 index 00000000..126ca21c --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/rpc.ts @@ -0,0 +1,18 @@ +import { invoke } from "@tauri-apps/api/core"; +import { BalanceBitcoinResponse } from "models/rpcModel"; +import { store } from "./store/storeRenderer"; +import { rpcSetBalance } from "store/features/rpcSlice"; + +export async function checkBitcoinBalance() { + // TODO: use tauri-bindgen here + const response = (await invoke("balance")) as { + balance: number; + }; + + store.dispatch(rpcSetBalance(response.balance)); +} + +export async function getRawSwapInfos() { + const response = await invoke("swap_infos"); + console.log(response); +} diff --git a/src-xmr-btc-swap/src-gui/src/renderer/store/storeRenderer.ts b/src-xmr-btc-swap/src-gui/src/renderer/store/storeRenderer.ts new file mode 100644 index 00000000..4656033a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/renderer/store/storeRenderer.ts @@ -0,0 +1,9 @@ +import { configureStore } from '@reduxjs/toolkit'; +import { reducers } from 'store/combinedReducer'; + +export const store = configureStore({ + reducer: reducers, +}); + +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType<typeof store.getState>; diff --git a/src-xmr-btc-swap/src-gui/src/store/combinedReducer.ts b/src-xmr-btc-swap/src-gui/src/store/combinedReducer.ts new file mode 100644 index 00000000..c2c18b82 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/combinedReducer.ts @@ -0,0 +1,15 @@ +import swapReducer from './features/swapSlice'; +import providersSlice from './features/providersSlice'; +import torSlice from './features/torSlice'; +import rpcSlice from './features/rpcSlice'; +import alertsSlice from './features/alertsSlice'; +import ratesSlice from './features/ratesSlice'; + +export const reducers = { + swap: swapReducer, + providers: providersSlice, + tor: torSlice, + rpc: rpcSlice, + alerts: alertsSlice, + rates: ratesSlice, +}; diff --git a/src-xmr-btc-swap/src-gui/src/store/config.ts b/src-xmr-btc-swap/src-gui/src/store/config.ts new file mode 100644 index 00000000..2c475a5e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/config.ts @@ -0,0 +1,18 @@ +import { ExtendedProviderStatus } from 'models/apiModel'; + +export const isTestnet = () => + false + +export const isExternalRpc = () => + true + +export const isDevelopment = + true + +export function getStubTestnetProvider(): ExtendedProviderStatus | null { + return null; +} + +export const getPlatform = () => { + return 'mac'; +}; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/alertsSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/alertsSlice.ts new file mode 100644 index 00000000..4a1ce04a --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/alertsSlice.ts @@ -0,0 +1,28 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { Alert } from 'models/apiModel'; + +export interface AlertsSlice { + alerts: Alert[]; +} + +const initialState: AlertsSlice = { + alerts: [], +}; + +const alertsSlice = createSlice({ + name: 'alerts', + initialState, + reducers: { + setAlerts(slice, action: PayloadAction<Alert[]>) { + slice.alerts = action.payload; + }, + removeAlert(slice, action: PayloadAction<number>) { + slice.alerts = slice.alerts.filter( + (alert) => alert.id !== action.payload, + ); + }, + }, +}); + +export const { setAlerts, removeAlert } = alertsSlice.actions; +export default alertsSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/providersSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/providersSlice.ts new file mode 100644 index 00000000..d4af559d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/providersSlice.ts @@ -0,0 +1,117 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { ExtendedProviderStatus, ProviderStatus } from 'models/apiModel'; +import { sortProviderList } from 'utils/sortUtils'; +import { isProviderCompatible } from 'utils/multiAddrUtils'; +import { getStubTestnetProvider } from 'store/config'; + +const stubTestnetProvider = getStubTestnetProvider(); + +export interface ProvidersSlice { + rendezvous: { + providers: (ExtendedProviderStatus | ProviderStatus)[]; + }; + registry: { + providers: ExtendedProviderStatus[] | null; + failedReconnectAttemptsSinceLastSuccess: number; + }; + selectedProvider: ExtendedProviderStatus | null; +} + +const initialState: ProvidersSlice = { + rendezvous: { + providers: [], + }, + registry: { + providers: stubTestnetProvider ? [stubTestnetProvider] : null, + failedReconnectAttemptsSinceLastSuccess: 0, + }, + selectedProvider: null, +}; + +function selectNewSelectedProvider( + slice: ProvidersSlice, + peerId?: string, +): ProviderStatus { + const selectedPeerId = peerId || slice.selectedProvider?.peerId; + + return ( + slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || + slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId) || + slice.registry.providers?.at(0) || + slice.rendezvous.providers[0] || + null + ); +} + +export const providersSlice = createSlice({ + name: 'providers', + initialState, + reducers: { + discoveredProvidersByRendezvous( + slice, + action: PayloadAction<ProviderStatus[]>, + ) { + action.payload.forEach((discoveredProvider) => { + if ( + !slice.registry.providers?.some( + (prov) => + prov.peerId === discoveredProvider.peerId && + prov.multiAddr === discoveredProvider.multiAddr, + ) + ) { + const indexOfExistingProvider = slice.rendezvous.providers.findIndex( + (prov) => + prov.peerId === discoveredProvider.peerId && + prov.multiAddr === discoveredProvider.multiAddr, + ); + + // Avoid duplicates, replace instead + if (indexOfExistingProvider !== -1) { + slice.rendezvous.providers[indexOfExistingProvider] = + discoveredProvider; + } else { + slice.rendezvous.providers.push(discoveredProvider); + } + } + }); + + slice.rendezvous.providers = sortProviderList(slice.rendezvous.providers); + }, + setRegistryProviders( + slice, + action: PayloadAction<ExtendedProviderStatus[]>, + ) { + if (stubTestnetProvider) { + action.payload.push(stubTestnetProvider); + } + + slice.registry.providers = sortProviderList(action.payload).filter( + isProviderCompatible, + ); + slice.selectedProvider = selectNewSelectedProvider(slice); + }, + increaseFailedRegistryReconnectAttemptsSinceLastSuccess(slice) { + slice.registry.failedReconnectAttemptsSinceLastSuccess += 1; + }, + setSelectedProvider( + slice, + action: PayloadAction<{ + peerId: string; + }>, + ) { + slice.selectedProvider = selectNewSelectedProvider( + slice, + action.payload.peerId, + ); + }, + }, +}); + +export const { + discoveredProvidersByRendezvous, + setRegistryProviders, + increaseFailedRegistryReconnectAttemptsSinceLastSuccess, + setSelectedProvider, +} = providersSlice.actions; + +export default providersSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/ratesSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/ratesSlice.ts new file mode 100644 index 00000000..67c8d11e --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/ratesSlice.ts @@ -0,0 +1,28 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +export interface RatesState { + btcPrice: number | null; + xmrPrice: number | null; +} + +const initialState: RatesState = { + btcPrice: null, + xmrPrice: null, +}; + +const ratesSlice = createSlice({ + name: 'rates', + initialState, + reducers: { + setBtcPrice: (state, action: PayloadAction<number>) => { + state.btcPrice = action.payload; + }, + setXmrPrice: (state, action: PayloadAction<number>) => { + state.xmrPrice = action.payload; + }, + }, +}); + +export const { setBtcPrice, setXmrPrice } = ratesSlice.actions; + +export default ratesSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/rpcSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/rpcSlice.ts new file mode 100644 index 00000000..19f5865d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/rpcSlice.ts @@ -0,0 +1,218 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { ExtendedProviderStatus, ProviderStatus } from 'models/apiModel'; +import { MoneroWalletRpcUpdateState } from 'models/storeModel'; +import { + GetSwapInfoResponse, + MoneroRecoveryResponse, + RpcProcessStateType, +} from '../../models/rpcModel'; +import { + CliLog, + isCliLog, + isCliLogDownloadingMoneroWalletRpc, + isCliLogFailedToSyncMoneroWallet, + isCliLogFinishedSyncingMoneroWallet, + isCliLogStartedRpcServer, + isCliLogStartedSyncingMoneroWallet, +} from '../../models/cliModel'; +import { getLogsAndStringsFromRawFileString } from 'utils/parseUtils'; + +type Process = + | { + type: RpcProcessStateType.STARTED; + logs: (CliLog | string)[]; + } + | { + type: RpcProcessStateType.LISTENING_FOR_CONNECTIONS; + logs: (CliLog | string)[]; + address: string; + } + | { + type: RpcProcessStateType.EXITED; + logs: (CliLog | string)[]; + exitCode: number | null; + } + | { + type: RpcProcessStateType.NOT_STARTED; + }; + +interface State { + balance: number | null; + withdrawTxId: string | null; + rendezvous_discovered_sellers: (ExtendedProviderStatus | ProviderStatus)[]; + swapInfos: { + [swapId: string]: GetSwapInfoResponse; + }; + moneroRecovery: { + swapId: string; + keys: MoneroRecoveryResponse; + } | null; + moneroWallet: { + isSyncing: boolean; + }; + moneroWalletRpc: { + updateState: false | MoneroWalletRpcUpdateState; + }; +} + +export interface RPCSlice { + process: Process; + state: State; + busyEndpoints: string[]; +} + +const initialState: RPCSlice = { + process: { + type: RpcProcessStateType.NOT_STARTED, + }, + state: { + balance: null, + withdrawTxId: null, + rendezvous_discovered_sellers: [], + swapInfos: {}, + moneroRecovery: null, + moneroWallet: { + isSyncing: false, + }, + moneroWalletRpc: { + updateState: false, + }, + }, + busyEndpoints: [], +}; + +export const rpcSlice = createSlice({ + name: 'rpc', + initialState, + reducers: { + rpcAddLogs(slice, action: PayloadAction<(CliLog | string)[]>) { + if ( + slice.process.type === RpcProcessStateType.STARTED || + slice.process.type === RpcProcessStateType.LISTENING_FOR_CONNECTIONS || + slice.process.type === RpcProcessStateType.EXITED + ) { + const logs = action.payload; + slice.process.logs.push(...logs); + + logs.filter(isCliLog).forEach((log) => { + if ( + isCliLogStartedRpcServer(log) && + slice.process.type === RpcProcessStateType.STARTED + ) { + slice.process = { + type: RpcProcessStateType.LISTENING_FOR_CONNECTIONS, + logs: slice.process.logs, + address: log.fields.addr, + }; + } else if (isCliLogDownloadingMoneroWalletRpc(log)) { + slice.state.moneroWalletRpc.updateState = { + progress: log.fields.progress, + downloadUrl: log.fields.download_url, + }; + + if (log.fields.progress === '100%') { + slice.state.moneroWalletRpc.updateState = false; + } + } else if (isCliLogStartedSyncingMoneroWallet(log)) { + slice.state.moneroWallet.isSyncing = true; + } else if (isCliLogFinishedSyncingMoneroWallet(log)) { + slice.state.moneroWallet.isSyncing = false; + } else if (isCliLogFailedToSyncMoneroWallet(log)) { + slice.state.moneroWallet.isSyncing = false; + } + }); + } + }, + rpcInitiate(slice) { + slice.process = { + type: RpcProcessStateType.STARTED, + logs: [], + }; + }, + rpcProcessExited( + slice, + action: PayloadAction<{ + exitCode: number | null; + exitSignal: NodeJS.Signals | null; + }>, + ) { + if ( + slice.process.type === RpcProcessStateType.STARTED || + slice.process.type === RpcProcessStateType.LISTENING_FOR_CONNECTIONS + ) { + slice.process = { + type: RpcProcessStateType.EXITED, + logs: slice.process.logs, + exitCode: action.payload.exitCode, + }; + slice.state.moneroWalletRpc = { + updateState: false, + }; + slice.state.moneroWallet = { + isSyncing: false, + }; + } + }, + rpcSetBalance(slice, action: PayloadAction<number>) { + slice.state.balance = action.payload; + }, + rpcSetWithdrawTxId(slice, action: PayloadAction<string>) { + slice.state.withdrawTxId = action.payload; + }, + rpcSetRendezvousDiscoveredProviders( + slice, + action: PayloadAction<(ExtendedProviderStatus | ProviderStatus)[]>, + ) { + slice.state.rendezvous_discovered_sellers = action.payload; + }, + rpcResetWithdrawTxId(slice) { + slice.state.withdrawTxId = null; + }, + rpcSetSwapInfo(slice, action: PayloadAction<GetSwapInfoResponse>) { + slice.state.swapInfos[action.payload.swapId] = action.payload; + }, + rpcSetEndpointBusy(slice, action: PayloadAction<string>) { + if (!slice.busyEndpoints.includes(action.payload)) { + slice.busyEndpoints.push(action.payload); + } + }, + rpcSetEndpointFree(slice, action: PayloadAction<string>) { + const index = slice.busyEndpoints.indexOf(action.payload); + if (index >= 0) { + slice.busyEndpoints.splice(index); + } + }, + rpcSetMoneroRecoveryKeys( + slice, + action: PayloadAction<[string, MoneroRecoveryResponse]>, + ) { + const swapId = action.payload[0]; + const keys = action.payload[1]; + + slice.state.moneroRecovery = { + swapId, + keys, + }; + }, + rpcResetMoneroRecoveryKeys(slice) { + slice.state.moneroRecovery = null; + }, + }, +}); + +export const { + rpcProcessExited, + rpcAddLogs, + rpcInitiate, + rpcSetBalance, + rpcSetWithdrawTxId, + rpcResetWithdrawTxId, + rpcSetEndpointBusy, + rpcSetEndpointFree, + rpcSetRendezvousDiscoveredProviders, + rpcSetSwapInfo, + rpcSetMoneroRecoveryKeys, + rpcResetMoneroRecoveryKeys, +} = rpcSlice.actions; + +export default rpcSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/swapSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/swapSlice.ts new file mode 100644 index 00000000..c1cd8eab --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/swapSlice.ts @@ -0,0 +1,323 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { extractAmountFromUnitString } from 'utils/parseUtils'; +import { Provider } from 'models/apiModel'; +import { + isSwapStateBtcLockInMempool, + isSwapStateProcessExited, + isSwapStateXmrLockInMempool, + SwapSlice, + SwapStateAttemptingCooperativeRedeeem, + SwapStateBtcCancelled, + SwapStateBtcLockInMempool, + SwapStateBtcPunished, + SwapStateBtcRedemeed, + SwapStateBtcRefunded, + SwapStateInitiated, + SwapStateProcessExited, + SwapStateReceivedQuote, + SwapStateStarted, + SwapStateType, + SwapStateWaitingForBtcDeposit, + SwapStateXmrLocked, + SwapStateXmrLockInMempool, + SwapStateXmrRedeemInMempool, +} from '../../models/storeModel'; +import { + isCliLogAliceLockedXmr, + isCliLogBtcTxStatusChanged, + isCliLogPublishedBtcTx, + isCliLogReceivedQuote, + isCliLogReceivedXmrLockTxConfirmation, + isCliLogRedeemedXmr, + isCliLogStartedSwap, + isCliLogWaitingForBtcDeposit, + CliLog, + isCliLogAdvancingState, + SwapSpawnType, + isCliLogBtcTxFound, + isCliLogReleasingSwapLockLog, + isYouHaveBeenPunishedCliLog, + isCliLogAcquiringSwapLockLog, + isCliLogApiCallError, + isCliLogDeterminedSwapAmount, + isCliLogAttemptingToCooperativelyRedeemXmr, +} from '../../models/cliModel'; +import logger from '../../utils/logger'; + +const initialState: SwapSlice = { + state: null, + processRunning: false, + swapId: null, + logs: [], + provider: null, + spawnType: null, +}; + +export const swapSlice = createSlice({ + name: 'swap', + initialState, + reducers: { + swapAddLog( + slice, + action: PayloadAction<{ logs: CliLog[]; isFromRestore: boolean }>, + ) { + const { logs } = action.payload; + slice.logs.push(...logs); + + logs.forEach((log) => { + if ( + isCliLogAcquiringSwapLockLog(log) && + !action.payload.isFromRestore + ) { + slice.processRunning = true; + slice.swapId = log.fields.swap_id; + // TODO: Maybe we can infer more info here (state) from the log + } else if (isCliLogReceivedQuote(log)) { + const price = extractAmountFromUnitString(log.fields.price); + const minimumSwapAmount = extractAmountFromUnitString( + log.fields.minimum_amount, + ); + const maximumSwapAmount = extractAmountFromUnitString( + log.fields.maximum_amount, + ); + + if ( + price != null && + minimumSwapAmount != null && + maximumSwapAmount != null + ) { + const nextState: SwapStateReceivedQuote = { + type: SwapStateType.RECEIVED_QUOTE, + price, + minimumSwapAmount, + maximumSwapAmount, + }; + + slice.state = nextState; + } + } else if (isCliLogWaitingForBtcDeposit(log)) { + const maxGiveable = extractAmountFromUnitString( + log.fields.max_giveable, + ); + const minDeposit = extractAmountFromUnitString( + log.fields.min_deposit_until_swap_will_start, + ); + const maxDeposit = extractAmountFromUnitString( + log.fields.max_deposit_until_maximum_amount_is_reached, + ); + const minimumAmount = extractAmountFromUnitString( + log.fields.minimum_amount, + ); + const maximumAmount = extractAmountFromUnitString( + log.fields.maximum_amount, + ); + const minBitcoinLockTxFee = extractAmountFromUnitString( + log.fields.min_bitcoin_lock_tx_fee, + ); + const price = extractAmountFromUnitString(log.fields.price); + + const depositAddress = log.fields.deposit_address; + + if ( + maxGiveable != null && + minimumAmount != null && + maximumAmount != null && + minDeposit != null && + maxDeposit != null && + minBitcoinLockTxFee != null && + price != null + ) { + const nextState: SwapStateWaitingForBtcDeposit = { + type: SwapStateType.WAITING_FOR_BTC_DEPOSIT, + depositAddress, + maxGiveable, + minimumAmount, + maximumAmount, + minDeposit, + maxDeposit, + price, + minBitcoinLockTxFee, + }; + + slice.state = nextState; + } + } else if (isCliLogDeterminedSwapAmount(log)) { + const amount = extractAmountFromUnitString(log.fields.amount); + const fees = extractAmountFromUnitString(log.fields.fees); + + const nextState: SwapStateStarted = { + type: SwapStateType.STARTED, + txLockDetails: + amount != null && fees != null ? { amount, fees } : null, + }; + + slice.state = nextState; + } else if (isCliLogStartedSwap(log)) { + if (slice.state?.type !== SwapStateType.STARTED) { + const nextState: SwapStateStarted = { + type: SwapStateType.STARTED, + txLockDetails: null, + }; + + slice.state = nextState; + } + + slice.swapId = log.fields.swap_id; + } else if (isCliLogPublishedBtcTx(log)) { + if (log.fields.kind === 'lock') { + const nextState: SwapStateBtcLockInMempool = { + type: SwapStateType.BTC_LOCK_TX_IN_MEMPOOL, + bobBtcLockTxId: log.fields.txid, + bobBtcLockTxConfirmations: 0, + }; + + slice.state = nextState; + } else if (log.fields.kind === 'cancel') { + const nextState: SwapStateBtcCancelled = { + type: SwapStateType.BTC_CANCELLED, + btcCancelTxId: log.fields.txid, + }; + + slice.state = nextState; + } else if (log.fields.kind === 'refund') { + const nextState: SwapStateBtcRefunded = { + type: SwapStateType.BTC_REFUNDED, + bobBtcRefundTxId: log.fields.txid, + }; + + slice.state = nextState; + } + } else if (isCliLogBtcTxStatusChanged(log) || isCliLogBtcTxFound(log)) { + if (isSwapStateBtcLockInMempool(slice.state)) { + if (slice.state.bobBtcLockTxId === log.fields.txid) { + const newStatusText = isCliLogBtcTxStatusChanged(log) + ? log.fields.new_status + : log.fields.status; + + if (newStatusText.startsWith('confirmed with')) { + const confirmations = Number.parseInt( + newStatusText.split(' ')[2], + 10, + ); + + slice.state.bobBtcLockTxConfirmations = confirmations; + } + } + } + } else if (isCliLogAliceLockedXmr(log)) { + const nextState: SwapStateXmrLockInMempool = { + type: SwapStateType.XMR_LOCK_TX_IN_MEMPOOL, + aliceXmrLockTxId: log.fields.txid, + aliceXmrLockTxConfirmations: 0, + }; + + slice.state = nextState; + } else if (isCliLogReceivedXmrLockTxConfirmation(log)) { + if (isSwapStateXmrLockInMempool(slice.state)) { + if (slice.state.aliceXmrLockTxId === log.fields.txid) { + slice.state.aliceXmrLockTxConfirmations = Number.parseInt( + log.fields.seen_confirmations, + 10, + ); + } + } + } else if (isCliLogAdvancingState(log)) { + if (log.fields.state === 'xmr is locked') { + const nextState: SwapStateXmrLocked = { + type: SwapStateType.XMR_LOCKED, + }; + + slice.state = nextState; + } else if (log.fields.state === 'btc is redeemed') { + const nextState: SwapStateBtcRedemeed = { + type: SwapStateType.BTC_REDEEMED, + }; + + slice.state = nextState; + } + } else if (isCliLogRedeemedXmr(log)) { + const nextState: SwapStateXmrRedeemInMempool = { + type: SwapStateType.XMR_REDEEM_IN_MEMPOOL, + bobXmrRedeemTxId: log.fields.txid, + bobXmrRedeemAddress: log.fields.monero_receive_address, + }; + + slice.state = nextState; + } else if (isYouHaveBeenPunishedCliLog(log)) { + const nextState: SwapStateBtcPunished = { + type: SwapStateType.BTC_PUNISHED, + }; + + slice.state = nextState; + } else if (isCliLogAttemptingToCooperativelyRedeemXmr(log)) { + const nextState: SwapStateAttemptingCooperativeRedeeem = { + type: SwapStateType.ATTEMPTING_COOPERATIVE_REDEEM, + }; + + slice.state = nextState; + } + else if ( + isCliLogReleasingSwapLockLog(log) && + !action.payload.isFromRestore + ) { + const nextState: SwapStateProcessExited = { + type: SwapStateType.PROCESS_EXITED, + prevState: slice.state, + rpcError: null, + }; + + slice.state = nextState; + slice.processRunning = false; + } else if (isCliLogApiCallError(log) && !action.payload.isFromRestore) { + if (isSwapStateProcessExited(slice.state)) { + slice.state.rpcError = log.fields.err; + } + } else { + logger.debug({ log }, `Swap log was not reduced`); + } + }); + }, + swapReset() { + return initialState; + }, + swapInitiate( + swap, + action: PayloadAction<{ + provider: Provider | null; + spawnType: SwapSpawnType; + swapId: string | null; + }>, + ) { + const nextState: SwapStateInitiated = { + type: SwapStateType.INITIATED, + }; + + swap.processRunning = true; + swap.state = nextState; + swap.logs = []; + swap.provider = action.payload.provider; + swap.spawnType = action.payload.spawnType; + swap.swapId = action.payload.swapId; + }, + swapProcessExited(swap, action: PayloadAction<string | null>) { + if (!swap.processRunning) { + logger.warn(`swapProcessExited called on a swap that is not running`); + return; + } + + const nextState: SwapStateProcessExited = { + type: SwapStateType.PROCESS_EXITED, + prevState: swap.state, + rpcError: action.payload, + }; + + swap.state = nextState; + swap.processRunning = false; + }, + }, +}); + +export const { swapInitiate, swapProcessExited, swapReset, swapAddLog } = + swapSlice.actions; + +export default swapSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/features/torSlice.ts b/src-xmr-btc-swap/src-gui/src/store/features/torSlice.ts new file mode 100644 index 00000000..74b535b3 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/features/torSlice.ts @@ -0,0 +1,74 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +export interface TorSlice { + exitCode: number | null; + processRunning: boolean; + stdOut: string; + proxyStatus: + | false + | { + proxyHostname: string; + proxyPort: number; + bootstrapped: boolean; + }; +} + +const initialState: TorSlice = { + processRunning: false, + exitCode: null, + stdOut: '', + proxyStatus: false, +}; + +const socksListenerRegex = + /Opened Socks listener connection.*on (\d+\.\d+\.\d+\.\d+):(\d+)/; +const bootstrapDoneRegex = /Bootstrapped 100% \(done\)/; + +export const torSlice = createSlice({ + name: 'tor', + initialState, + reducers: { + torAppendStdOut(slice, action: PayloadAction<string>) { + slice.stdOut += action.payload; + + const logs = slice.stdOut.split('\n'); + logs.forEach((log) => { + if (socksListenerRegex.test(log)) { + const match = socksListenerRegex.exec(log); + if (match) { + slice.proxyStatus = { + proxyHostname: match[1], + proxyPort: Number.parseInt(match[2], 10), + bootstrapped: slice.proxyStatus + ? slice.proxyStatus.bootstrapped + : false, + }; + } + } else if (bootstrapDoneRegex.test(log)) { + if (slice.proxyStatus) { + slice.proxyStatus.bootstrapped = true; + } + } + }); + }, + torInitiate(slice) { + slice.processRunning = true; + }, + torProcessExited( + slice, + action: PayloadAction<{ + exitCode: number | null; + exitSignal: NodeJS.Signals | null; + }>, + ) { + slice.processRunning = false; + slice.exitCode = action.payload.exitCode; + slice.proxyStatus = false; + }, + }, +}); + +export const { torAppendStdOut, torInitiate, torProcessExited } = + torSlice.actions; + +export default torSlice.reducer; diff --git a/src-xmr-btc-swap/src-gui/src/store/hooks.ts b/src-xmr-btc-swap/src-gui/src/store/hooks.ts new file mode 100644 index 00000000..df19f6e5 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/store/hooks.ts @@ -0,0 +1,56 @@ +import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; +import type { AppDispatch, RootState } from 'renderer/store/storeRenderer'; +import { sortBy } from 'lodash'; +import { parseDateString } from 'utils/parseUtils'; + +// Use throughout your app instead of plain `useDispatch` and `useSelector` +export const useAppDispatch = () => useDispatch<AppDispatch>(); +export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; + +export function useResumeableSwapsCount() { + return useAppSelector( + (state) => + Object.values(state.rpc.state.swapInfos).filter( + (swapInfo) => !swapInfo.completed, + ).length, + ); +} + +export function useIsSwapRunning() { + return useAppSelector((state) => state.swap.state !== null); +} + +export function useSwapInfo(swapId: string | null) { + return useAppSelector((state) => + swapId ? state.rpc.state.swapInfos[swapId] ?? null : null, + ); +} + +export function useActiveSwapId() { + return useAppSelector((s) => s.swap.swapId); +} + +export function useActiveSwapInfo() { + const swapId = useActiveSwapId(); + return useSwapInfo(swapId); +} + +export function useIsRpcEndpointBusy(method: string) { + return useAppSelector((state) => state.rpc.busyEndpoints.includes(method)); +} + +export function useAllProviders() { + return useAppSelector((state) => { + const registryProviders = state.providers.registry.providers || []; + const listSellersProviders = state.providers.rendezvous.providers || []; + return [...registryProviders, ...listSellersProviders]; + }); +} + +export function useSwapInfosSortedByDate() { + const swapInfos = useAppSelector((state) => state.rpc.state.swapInfos); + return sortBy( + Object.values(swapInfos), + (swap) => -parseDateString(swap.startDate), + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/conversionUtils.ts b/src-xmr-btc-swap/src-gui/src/utils/conversionUtils.ts new file mode 100644 index 00000000..f43dcc6c --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/conversionUtils.ts @@ -0,0 +1,42 @@ +export function satsToBtc(sats: number): number { + return sats / 100000000; +} + +export function btcToSats(btc: number): number { + return btc * 100000000; +} + +export function piconerosToXmr(piconeros: number): number { + return piconeros / 1000000000000; +} + +export function isXmrAddressValid(address: string, stagenet: boolean) { + const re = stagenet + ? '[57][0-9AB][1-9A-HJ-NP-Za-km-z]{93}' + : '[48][0-9AB][1-9A-HJ-NP-Za-km-z]{93}'; + return new RegExp(`(?:^${re}$)`).test(address); +} + +export function isBtcAddressValid(address: string, testnet: boolean) { + const re = testnet + ? '(tb1)[a-zA-HJ-NP-Z0-9]{25,49}' + : '(bc1)[a-zA-HJ-NP-Z0-9]{25,49}'; + return new RegExp(`(?:^${re}$)`).test(address); +} + +export function getBitcoinTxExplorerUrl(txid: string, testnet: boolean) { + return `https://blockchair.com/bitcoin${ + testnet ? '/testnet' : '' + }/transaction/${txid}`; +} + +export function getMoneroTxExplorerUrl(txid: string, stagenet: boolean) { + if (stagenet) { + return `https://stagenet.xmrchain.net/tx/${txid}`; + } + return `https://xmrchain.net/tx/${txid}`; +} + +export function secondsToDays(seconds: number): number { + return seconds / 86400; +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/cryptoUtils.ts b/src-xmr-btc-swap/src-gui/src/utils/cryptoUtils.ts new file mode 100644 index 00000000..4cef19f5 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/cryptoUtils.ts @@ -0,0 +1,5 @@ +import { createHash } from 'crypto'; + +export function sha256(data: string): string { + return createHash('md5').update(data).digest('hex'); +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/event.ts b/src-xmr-btc-swap/src-gui/src/utils/event.ts new file mode 100644 index 00000000..7aace594 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/event.ts @@ -0,0 +1,21 @@ +export class SingleTypeEventEmitter<T> { + private listeners: Array<(data: T) => void> = []; + + // Method to add a listener for the event + on(listener: (data: T) => void) { + this.listeners.push(listener); + } + + // Method to remove a listener + off(listener: (data: T) => void) { + const index = this.listeners.indexOf(listener); + if (index > -1) { + this.listeners.splice(index, 1); + } + } + + // Method to emit the event + emit(data: T) { + this.listeners.forEach((listener) => listener(data)); + } +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/logger.ts b/src-xmr-btc-swap/src-gui/src/utils/logger.ts new file mode 100644 index 00000000..36d35c49 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/logger.ts @@ -0,0 +1,7 @@ +import pino from 'pino'; + +export default pino( + { + level: 'trace', + } +); diff --git a/src-xmr-btc-swap/src-gui/src/utils/multiAddrUtils.ts b/src-xmr-btc-swap/src-gui/src/utils/multiAddrUtils.ts new file mode 100644 index 00000000..71a36696 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/multiAddrUtils.ts @@ -0,0 +1,24 @@ +import { Multiaddr } from 'multiaddr'; +import semver from 'semver'; +import { ExtendedProviderStatus, Provider } from 'models/apiModel'; +import { isTestnet } from 'store/config'; + +const MIN_ASB_VERSION = '0.12.0'; + +export function providerToConcatenatedMultiAddr(provider: Provider) { + return new Multiaddr(provider.multiAddr) + .encapsulate(`/p2p/${provider.peerId}`) + .toString(); +} + +export function isProviderCompatible( + provider: ExtendedProviderStatus, +): boolean { + if (provider.version) { + if (!semver.satisfies(provider.version, `>=${MIN_ASB_VERSION}`)) + return false; + } + if (provider.testnet !== isTestnet()) return false; + + return true; +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/parseUtils.ts b/src-xmr-btc-swap/src-gui/src/utils/parseUtils.ts new file mode 100644 index 00000000..642ddf08 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/parseUtils.ts @@ -0,0 +1,65 @@ +import { CliLog, isCliLog } from 'models/cliModel'; + +/* +Extract btc amount from string + +E.g: "0.00100000 BTC" +Output: 0.001 + */ +export function extractAmountFromUnitString(text: string): number | null { + if (text != null) { + const parts = text.split(' '); + if (parts.length === 2) { + const amount = Number.parseFloat(parts[0]); + return amount; + } + } + return null; +} + +// E.g 2021-12-29 14:25:59.64082 +00:00:00 +export function parseDateString(str: string): number { + const parts = str.split(' ').slice(0, -1); + if (parts.length !== 2) { + throw new Error( + `Date string does not consist solely of date and time Str: ${str} Parts: ${parts}`, + ); + } + const wholeString = parts.join(' '); + const date = Date.parse(wholeString); + if (Number.isNaN(date)) { + throw new Error( + `Date string could not be parsed Str: ${str} Parts: ${parts}`, + ); + } + return date; +} + +export function getLinesOfString(data: string): string[] { + return data + .toString() + .replace('\r\n', '\n') + .replace('\r', '\n') + .split('\n') + .filter((l) => l.length > 0); +} + +export function getLogsAndStringsFromRawFileString( + rawFileData: string, +): (CliLog | string)[] { + return getLinesOfString(rawFileData).map((line) => { + try { + return JSON.parse(line); + } catch (e) { + return line; + } + }); +} + +export function getLogsFromRawFileString(rawFileData: string): CliLog[] { + return getLogsAndStringsFromRawFileString(rawFileData).filter(isCliLog); +} + +export function logsToRawString(logs: (CliLog | string)[]): string { + return logs.map((l) => JSON.stringify(l)).join('\n'); +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/sortUtils.ts b/src-xmr-btc-swap/src-gui/src/utils/sortUtils.ts new file mode 100644 index 00000000..0b6185c0 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/sortUtils.ts @@ -0,0 +1,19 @@ +import { ExtendedProviderStatus } from 'models/apiModel'; + +export function sortProviderList(list: ExtendedProviderStatus[]) { + return list.concat().sort((firstEl, secondEl) => { + // If neither of them have a relevancy score, sort by max swap amount + if (firstEl.relevancy === undefined && secondEl.relevancy === undefined) { + if (firstEl.maxSwapAmount > secondEl.maxSwapAmount) { + return -1; + } + } + // If only on of the two don't have a relevancy score, prioritize the one that does + if (firstEl.relevancy === undefined) return 1; + if (secondEl.relevancy === undefined) return -1; + if (firstEl.relevancy > secondEl.relevancy) { + return -1; + } + return 1; + }); +} diff --git a/src-xmr-btc-swap/src-gui/src/utils/typescriptUtils.tsx b/src-xmr-btc-swap/src-gui/src/utils/typescriptUtils.tsx new file mode 100644 index 00000000..19c75b2d --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/utils/typescriptUtils.tsx @@ -0,0 +1,7 @@ +export function exhaustiveGuard(_value: never): never { + throw new Error( + `ERROR! Reached forbidden guard function with unexpected value: ${JSON.stringify( + _value, + )}`, + ); +} diff --git a/src-xmr-btc-swap/src-gui/src/vite-env.d.ts b/src-xmr-btc-swap/src-gui/src/vite-env.d.ts new file mode 100644 index 00000000..ed772106 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// <reference types="vite/client" /> + diff --git a/src-xmr-btc-swap/src-gui/tsconfig.json b/src-xmr-btc-swap/src-gui/tsconfig.json new file mode 100644 index 00000000..13e18bc2 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": false, + + /* Path Resolving */ + "baseUrl": "./src", + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/src-xmr-btc-swap/src-gui/tsconfig.node.json b/src-xmr-btc-swap/src-gui/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/src-xmr-btc-swap/src-gui/vite.config.ts b/src-xmr-btc-swap/src-gui/vite.config.ts new file mode 100644 index 00000000..bd8f1c61 --- /dev/null +++ b/src-xmr-btc-swap/src-gui/vite.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { internalIpV4 } from "internal-ip"; +import tsconfigPaths from 'vite-tsconfig-paths'; + +// @ts-expect-error process is a nodejs global +const mobile = !!/android|ios/.exec(process.env.TAURI_ENV_PLATFORM); + +// https://vitejs.dev/config/ +export default defineConfig(async () => ({ + plugins: [react(), tsconfigPaths()], + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: mobile ? "0.0.0.0" : false, + hmr: mobile + ? { + protocol: "ws", + host: await internalIpV4(), + port: 1421, + } + : undefined, + watch: { + // 3. tell vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); diff --git a/src-xmr-btc-swap/src-gui/yarn.lock b/src-xmr-btc-swap/src-gui/yarn.lock new file mode 100644 index 00000000..d9b883bc --- /dev/null +++ b/src-xmr-btc-swap/src-gui/yarn.lock @@ -0,0 +1,1916 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== + +"@babel/core@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== + dependencies: + "@babel/types" "^7.24.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== + +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== + dependencies: + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@material-ui/core@^4.12.4": + version "4.12.4" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" + integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.5" + "@material-ui/system" "^4.12.2" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz#b0693709f9b161ce9ccde276a770d968484ecff1" + integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/lab@^4.0.0-alpha.61": + version "4.0.0-alpha.61" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz#9bf8eb389c0c26c15e40933cc114d4ad85e3d978" + integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.5": + version "4.11.5" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb" + integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b" + integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942" + integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@open-rpc/client-js@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@open-rpc/client-js/-/client-js-1.8.1.tgz#73b5a5bf237f24b14c3c89205b1fca3aea213213" + integrity sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g== + dependencies: + isomorphic-fetch "^3.0.0" + isomorphic-ws "^5.0.0" + strict-event-emitter-types "^2.0.0" + ws "^7.0.0" + +"@reduxjs/toolkit@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.6.tgz#4a8356dad9d0c1ab255607a555d492168e0e3bc1" + integrity sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA== + dependencies: + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + +"@remix-run/router@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.17.1.tgz#bf93997beb81863fde042ebd05013a2618471362" + integrity sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q== + +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + +"@tauri-apps/api@2.0.0-beta.14", "@tauri-apps/api@>=2.0.0-beta.0": + version "2.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.0.0-beta.14.tgz#8c1c65c07559cd29c5103a99e0abe5331cc2246f" + integrity sha512-YLYgHqdwWswr4Y70+hRzaLD6kLIUgHhE3shLXNquPiTaQ9+cX3Q2dB0AFfqsua6NXYFNe7LfkmMzaqEzqv3yQg== + +"@tauri-apps/cli-darwin-arm64@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0-beta.21.tgz#9dc6f306b14d58b0b4fbf218ffbb31831e28cf4d" + integrity sha512-okI7PRSC6RO4JfrOTqu4oWf0IfBPbkGHisyDOTay6K5uhz4zzry5fFJVa8S/DTrKtdjau4vcik/EDCxiGRun9Q== + +"@tauri-apps/cli-darwin-x64@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.0.0-beta.21.tgz#77a0bdd820301f120acbb93c57b6c8acb9ae4f82" + integrity sha512-mXoJDXB6CBoqUnFb4TCsSVC6FJRZsN1DHRZAyn6iNLIhOrObcM4L2xz8rzt3WirANwJ/ayrNv95fEt8Fq1jmgA== + +"@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.0.0-beta.21.tgz#bc9214feff536d917d55bddeadb724555f9ac698" + integrity sha512-LYPOx3LE2eZ0g8Zh/HYaNg6B1pZzH4BPMcma7wGZ0XPu+4fKLLGgav13xP2lknLnxiRP9jJCaTIBKXgcQEtLyg== + +"@tauri-apps/cli-linux-arm64-gnu@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.0.0-beta.21.tgz#69167099a4756944eb5d3d15905cbf4d903307ad" + integrity sha512-VP2L729tgY889OZj5U436EntjwkI8MyVB+GrvBv8k2mj1nWB651KiVIpcUmsUgjXZ2r01bifN9J0l+3EFEXUAQ== + +"@tauri-apps/cli-linux-arm64-musl@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0-beta.21.tgz#d66796e672c2606d2e08a232def55919a5fa9542" + integrity sha512-s1rV01RIdowlPHfw7hTBnCEm2C3mZbynF+xpyRSv9vSczu4dpfwILMRwxB4nzMzdJ7RPHsf/R+5Ww86e8QM4Gw== + +"@tauri-apps/cli-linux-x64-gnu@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.0.0-beta.21.tgz#ed02923c94b71f2377ef5c4cc72bf1de12487296" + integrity sha512-yGh7ktUycHT3mAnKxC7cx/vjcbjJzoxQCxnjWpmIayVwq+iXLD1mK7nRXRdJpL/rnBFTqqD29CKuypCEFiq3/A== + +"@tauri-apps/cli-linux-x64-musl@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0-beta.21.tgz#511293e6508a5d41e758d6f0bf98e834b22c63cb" + integrity sha512-+79b8O3tsjbGR47pJtcSKGmtqj4rsSxB5AfMb4UCkmoNkbaOzB0YS/ZieUGAb+SHXZ/MMs7mcl96N9SqYOL7hw== + +"@tauri-apps/cli-win32-arm64-msvc@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.0.0-beta.21.tgz#736c5dba48385bfebf030f4ad641592f0db14258" + integrity sha512-rKlpcjx6t1ECZciMmHT5xkXKjC+O+TVxRKmA21tEq/Ezt7XdnufGko1hduwQmVJWkHxKg6ab7uf98ImMpDC5UA== + +"@tauri-apps/cli-win32-ia32-msvc@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.0.0-beta.21.tgz#bf0a8dbfc1d5b724fd9f1ed2db14817821bd9b43" + integrity sha512-ExdhvRfgAoZi4/7re6OkmfqsHvTJQgWouTNphHWRilUEqBM7TEQV1UxYtwWfgyOKelyx4cxUYDFAJxootTb2Nw== + +"@tauri-apps/cli-win32-x64-msvc@2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.0.0-beta.21.tgz#56842ab8088a794276cbf74bf0edcda6e96ee8ee" + integrity sha512-JtNTwNXIOfE04Cs3ieTvkdcMyJM9Sujw5MM9zNmusJKE03s/OLqbNK/2ISlcb/puwYGGPhhyYtL5hCmYXIrHHQ== + +"@tauri-apps/cli@>=2.0.0-beta.0": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.0.0-beta.21.tgz#aef1b9f5d80da38265820ff3ab8558724e3309eb" + integrity sha512-lqV4pD0iTs8ASd19slH0eRoVAjbxtD0cCsZFVD7kG4sYkeZ0IkvtxbvnHAOUbALfvnHZr1dVXFDVxQUqJK2OXw== + optionalDependencies: + "@tauri-apps/cli-darwin-arm64" "2.0.0-beta.21" + "@tauri-apps/cli-darwin-x64" "2.0.0-beta.21" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.0.0-beta.21" + "@tauri-apps/cli-linux-arm64-gnu" "2.0.0-beta.21" + "@tauri-apps/cli-linux-arm64-musl" "2.0.0-beta.21" + "@tauri-apps/cli-linux-x64-gnu" "2.0.0-beta.21" + "@tauri-apps/cli-linux-x64-musl" "2.0.0-beta.21" + "@tauri-apps/cli-win32-arm64-msvc" "2.0.0-beta.21" + "@tauri-apps/cli-win32-ia32-msvc" "2.0.0-beta.21" + "@tauri-apps/cli-win32-x64-msvc" "2.0.0-beta.21" + +"@tauri-apps/plugin-shell@>=2.0.0-beta.0": + version "2.0.0-beta.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-shell/-/plugin-shell-2.0.0-beta.7.tgz#43159959ff8ef83435df6d64be381606f6e02130" + integrity sha512-oJxWbEiNRcoMM0PrePjJnjPHEAN1sbYuWaQ1QMtLPdjHsl83RLk+RpFzkL5WvtGknfiKY7T2qEthOID4br+mvg== + dependencies: + "@tauri-apps/api" "2.0.0-beta.14" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/humanize-duration@^3.27.4": + version "3.27.4" + resolved "https://registry.yarnpkg.com/@types/humanize-duration/-/humanize-duration-3.27.4.tgz#51d6d278213374735440bc3749de920935e9127e" + integrity sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA== + +"@types/lodash@^4.17.6": + version "4.17.6" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.6.tgz#193ced6a40c8006cfc1ca3f4553444fb38f0e543" + integrity sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA== + +"@types/node@*": + version "20.14.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" + integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== + dependencies: + undici-types "~5.26.4" + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^20.14.10": + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18.2.7": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.2.0": + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.15": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@vitejs/plugin-react@^4.2.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +browserslist@^4.22.2: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== + dependencies: + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" + node-releases "^2.0.14" + update-browserslist-db "^1.0.16" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +caniuse-lite@^1.0.30001629: + version "1.0.30001640" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f" + integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +clsx@^1.0.4, clsx@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +csstype@^2.5.2: + version "2.6.21" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" + integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +dns-over-http-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +electron-to-chromium@^1.4.796: + version "1.4.818" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz#7762c8bfd15a07c3833b7f5deed990e9e5a4c24f" + integrity sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fast-copy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" + integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +goober@^2.0.33: + version "2.1.14" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-duration@^3.32.1: + version "3.32.1" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.32.1.tgz#922beff5da36fb1cee3de26ada24c592b0fe519b" + integrity sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g== + +hyphenate-style-name@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" + integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + +internal-ip@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-7.0.0.tgz#5b1c6a9d7e188aa73a1b69717daf50c8d8ed774f" + integrity sha512-qE4TeD4brqC45Vq/+VASeMiS1KRyfBkR6HT2sh9pZVVCzSjPkaCEfKFU+dL0PRv7NHJtvoKN2r82G6wTfzorkw== + dependencies: + default-gateway "^6.0.3" + ipaddr.js "^2.0.1" + is-ip "^3.1.0" + p-event "^4.2.0" + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +jayson@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" + integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.5.10" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jss-plugin-camel-case@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-default-unit@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-global@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss@10.10.0, jss@^10.5.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multiaddr@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-10.0.1.tgz#0d15848871370860a4d266bb44d93b3dac5d90ef" + integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== + dependencies: + dns-over-http-resolver "^1.2.3" + err-code "^3.0.1" + is-ip "^3.1.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^9.4.2, multiformats@^9.4.5: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +notistack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-3.0.1.tgz#daf59888ab7e2c30a1fa8f71f9cba2978773236e" + integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA== + dependencies: + clsx "^1.1.0" + goober "^2.0.33" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@^11.2.1: + version "11.2.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-11.2.1.tgz#de9a42ff8ea7b26da93506bb9e49d0b566c5ae96" + integrity sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.2" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^4.0.1" + strip-json-comments "^3.1.1" + +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.2.0.tgz#e77a9516f3a3e5550d9b76d9f65ac6118ef02bdd" + integrity sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^7.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +postcss@^8.4.39: + version "8.4.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" + integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +qr.js@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" + integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react-is@^16.8.0 || ^17.0.0": + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-qr-code@^2.0.15: + version "2.0.15" + resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.15.tgz#fbfc12952c504bcd64275647e9d1ea63251742ce" + integrity sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw== + dependencies: + prop-types "^15.8.1" + qr.js "0.0.0" + +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react-router-dom@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.24.1.tgz#b1a22f7d6c5a1bfce30732bd370713f991ab4de4" + integrity sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg== + dependencies: + "@remix-run/router" "1.17.1" + react-router "6.24.1" + +react-router@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.24.1.tgz#5a3bbba0000afba68d42915456ca4c806f37a7de" + integrity sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg== + dependencies: + "@remix-run/router" "1.17.1" + +react-transition-group@^4.4.0: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +reselect@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== + +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.6.2: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sonic-boom@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" + integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== + dependencies: + atomic-sleep "^1.0.0" + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +strict-event-emitter-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" + integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== + +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== + dependencies: + real-require "^0.2.0" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tsconfck@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.1.tgz#c7284913262c293b43b905b8b034f524de4a3162" + integrity sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ== + +typescript@^5.2.2: + version "5.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" + integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== + +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.16: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + +virtua@^0.33.2: + version "0.33.2" + resolved "https://registry.yarnpkg.com/virtua/-/virtua-0.33.2.tgz#b9596387bc77664293359d438319e81180a0e051" + integrity sha512-4NgtryQH/idQ3oKkwM6DRCoCsn+IrjrStGcDOARPdlY7zIg0AtTcUq24nysM8YyHoS6KhqcVe8A3+lHJidNQWA== + +vite-tsconfig-paths@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" + integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + +vite@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2" + integrity sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.39" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.0.0, ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/src-xmr-btc-swap/src-tauri/Cargo.toml b/src-xmr-btc-swap/src-tauri/Cargo.toml index 754294e4..57d70c20 100644 --- a/src-xmr-btc-swap/src-tauri/Cargo.toml +++ b/src-xmr-btc-swap/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "unstoppableswap-gui-rs" version = "0.0.0" -authors = [ "you" ] +authors = ["you"] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,16 +9,16 @@ description = "A Tauri App" [lib] name = "unstoppableswap_gui_rs_lib" -crate-type = [ "lib", "cdylib", "staticlib" ] +crate-type = ["lib", "cdylib", "staticlib"] [build-dependencies] -tauri-build = { version = "2.0.0-beta", features = [ ] } +tauri-build = { version = "2.0.0-rc.1", features = ["config-json5"] } [dependencies] anyhow = "1" once_cell = "1" -serde = { version = "1", features = [ "derive" ] } +serde = { version = "1", features = ["derive"] } serde_json = "1" swap = { path = "../swap" } -tauri = { version = "2.0.0-beta", features = [ ] } -tauri-plugin-shell = "2.0.0-beta" +tauri = { version = "2.0.0-rc.1", features = ["config-json5"] } +tauri-plugin-shell = "2.0.0-rc.0" diff --git a/src-xmr-btc-swap/src-tauri/capabilities/default.json b/src-xmr-btc-swap/src-tauri/capabilities/default.json index e14ca1d8..650321c1 100644 --- a/src-xmr-btc-swap/src-tauri/capabilities/default.json +++ b/src-xmr-btc-swap/src-tauri/capabilities/default.json @@ -1,17 +1,7 @@ { - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": ["main"], - "permissions": [ - "path:default", - "event:default", - "window:default", - "app:default", - "image:default", - "resources:default", - "menu:default", - "tray:default", - "shell:allow-open" - ] + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": ["shell:allow-open"] } diff --git a/src-xmr-btc-swap/src-tauri/tauri.conf.json b/src-xmr-btc-swap/src-tauri/tauri.conf.json index e8ef751e..ffe6d3ee 100644 --- a/src-xmr-btc-swap/src-tauri/tauri.conf.json +++ b/src-xmr-btc-swap/src-tauri/tauri.conf.json @@ -1,34 +1,32 @@ { - "productName": "unstoppableswap-gui-rs", - "version": "0.0.0", - "identifier": "net.unstoppableswap.gui", - "build": { - "beforeDevCommand": "yarn dev", - "devUrl": "http://localhost:1420", - "beforeBuildCommand": "yarn build", - "frontendDist": "../dist" - }, - "app": { - "windows": [ - { - "title": "unstoppableswap-gui-rs", - "width": 800, - "height": 600 - } - ], - "security": { - "csp": "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self' http://localhost:1234" + "productName": "unstoppableswap-gui-rs", + "version": "0.1.0", + "identifier": "net.unstoppableswap.gui", + "build": { + "devUrl": "http://localhost:1420", + "frontendDist": "../src-gui/dist" + }, + "app": { + "windows": [ + { + "title": "unstoppableswap-gui-rs", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self' http://localhost:1234" + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] } - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ] - } } diff --git a/src-xmr-btc-swap/swap/src/api/request.rs b/src-xmr-btc-swap/swap/src/api/request.rs index 6b2dd20a..2a140765 100644 --- a/src-xmr-btc-swap/swap/src/api/request.rs +++ b/src-xmr-btc-swap/swap/src/api/request.rs @@ -22,7 +22,6 @@ use std::sync::Arc; use std::time::Duration; use tracing::{debug_span, field, Instrument, Span}; use uuid::Uuid; -use tracing: #[derive(PartialEq, Debug)] pub struct Request { @@ -219,7 +218,7 @@ impl Method { } } -#[tracing::instrument(fields(method="suspend_current_swap"), skip(context))] +// #[tracing::instrument(fields(method = "suspend_current_swap"), skip(context))] async fn suspend_current_swap(context: Arc<Context>) -> Result<serde_json::Value> { let swap_id = context.swap_lock.get_current_swap_id().await; @@ -232,11 +231,8 @@ async fn suspend_current_swap(context: Arc<Context>) -> Result<serde_json::Value } } -#[tracing::instrument(fields(method="get_swap_info", swap_id = args.swap_id), skip(context))] -async fn get_swap_info( - args: GetSwapInfoArgs, - context: Arc<Context>, -) -> Result<serde_json::Value> { +// #[tracing::instrument(fields(method="get_swap_info", swap_id = args.swap_id), skip(context))] +async fn get_swap_info(args: GetSwapInfoArgs, context: Arc<Context>) -> Result<serde_json::Value> { let bitcoin_wallet = context .bitcoin_wallet .as_ref() @@ -247,7 +243,7 @@ async fn get_swap_info( let peerId = context .db - .get_peer_id(swap_id) + .get_peer_id(args.swap_id) .await .with_context(|| "Could not get PeerID")?; @@ -745,7 +741,7 @@ async fn start_daemon( Ok(json!({})) } -#[instrument(method="get_balance") +// #[instrument(fields(method = "get_balance"))] pub async fn get_balance(balance: BalanceArgs, context: Arc<Context>) -> Result<BalanceResponse> { let BalanceArgs { force_refresh } = balance; let bitcoin_wallet = context