Commit graph

3198 commits

Author SHA1 Message Date
Binarybaron
cc8f6f4b70 amend: CHANGELOG.md 2025-05-18 22:59:45 +02:00
Raphael
3f4cbddf23
upgrade(swap): Concurrent syncing, bdk upgrade, refactors (#180)
* upgrade sqlx to 0.8, add bdk_wallet and bdk_electrum

The new dependencies are part of the bdk upgrade and
include the improved wallet code.
They, too, depend on sqlite3.
However, they use a newer version than we currently use via sqlx.
This necessitated the sqlx upgrade.
This entailed trivial changes (use Pool directly instead of pool.acquire()).
We might have to fix the CI as well, I kept getting compile
errors from the macro until I ran swap/sqlx_dev_setup.sh.

* move old wallet code to extra module

* fix fee estimation for old client

* bump bitcoin crate, add new wallet constructor

* remove unused old Client, move code around for better readibility

* make Wallet generic over Persister (database) and move more code around for readibility

* add script history, start reimplementing client methods

* update some imports

* cargo fmt

* Add comments, fix fee estimation, address generation and status_of_script

* redo state update and wallet sync

* fix bitcoin address validation and more imports, use Amount everywhere

* fix tx cancel, lock, punish, redeem, refund

* fix bitcoin::Address de-/serialisation

* fix more address validation

* fix more address parsing and validation, also some more imports

* cargo fmt

* fix wallet initialization, start wallet migration

* fail test instead of ignoring it

* perform full scan on creation, load from db if it exists

* add more wallet info, fix wallet initialization

* fix: default to null in config

* migrate from old wallet if needed

* change something

* fix some tests

* temporarily patch bdk_wallet and bdk_electrum

* fix more tests

* fix missing rustls

* asb: only start tor client if register_hidden_service=true in the config

* fix: use p2wsh_signature_hash instead of p2wpkh_signature_hash

* fix some bitcoin address parsing and fee rate parsing

* dprint fmt

* add bitcoin-harness to this project and update to the new bitcoin version

* fix max_givible again

* create electrum client separately from wallet, clean up some code

* add comment

* ignore .env.development

* log config file path on ./asb config

* feat(monero-sys): Initial commit. Regtest integration test. Wrapper around basic Wallet functions, depends on monero#9464

* Revert "feat(monero-sys): Initial commit. Regtest integration test. Wrapper around basic Wallet functions, depends on monero#9464"

This reverts commit 14a5b4c348a109d2524657ffeba306422458ea44.

* upgrade to rust toolchain 1.81

* Use new bdk update for code from master

* fix

* remove

* fix: add empty .gitmodules file to fix Docker build

* fix: clean up submodule references

* fix: properly declare monero submodule with ignore flag

* fix(wallet, bdk): only reveal new address if absolutely necessary

* fix: private keys not loaded into bdk wallet

* refactor: sync wallet progress log

* dprint fmt

* refactor: move bitcoin-harness to outside repo

* refactor: remove redundant log message

* Display sync progress

* Remove redundant arg to  swap/tests/harness/mod.rs function

* fix: call rustls::crypto:💍:default_provider()

* dprint fmt

* refactor: remove debug code

* refactor: move old bdk wallet export to own function, clear log messages

* remove old migr for testnets (checksum mismatch), remove balance and stringified last revealed addresses from migration export

* use revalidate_network function, remove redundant drop

* Display progress of background tasks, TauriBackgroundProgressHandle struct

* fix: almost satisfy clippy

* fix: gen-bindings error

* feat: add BackgroundRefund background type

* feat: use builder pattern for constructing Bitcoin wallet

* dprint ftm

* sync electrum in seperate thread

* do not allow user to start sync while sync is in progress

* remove redundant log message

* display random buffer in AlertWithLinearProgress progress

* fix: use TauriContextStatusEvent.Available), dont show syncing wallet spinner if not syncing

* differentiate between TestWalletBuilder and WalletBuilder

* satisfy clippy

* remove custom BackgroundRefund event, move into background process architecture

* refactor

* dprint fmt

* progress: get unit tests compiling

* fix: bitcoin unit tests specify const values like sync_interval

* fix: get unit tests passing

* make clippy happy

* feat: display full sync progress, fix unit test import issues

* dprint fmt

* make clippy happy, use u32 for target_block and not usize

* always spawn tor for asb

* refactor: remove gen_background_progress_id and just use Uuid::new_v4()

* refactor(hooks.ts): clarify comment on useConservativeBitcoinSyncProgress

* fix typo

* refactor: do not let WalletBuilder take entire env struct

* dprint fmt

* refactor: remove default feature from workspace patch of bdk

* first try for concurrent syncing

* refactor: concurrent syncing

* fix(wallet.rs): Safely convert FeeRate from btc / kb to sats / kwu

* feat(wallet.rs): persist published Bitcoin transactions without requiring re-scan

This allows us to compute an updated Bitcoin balance without requiring a re-scan

* refactor(wallet.rs): use just 5 concurrent sync requests

* refactor: display snackbar error when Wallet refresh fails

* fix: add missing space

* dprint fmt

* refactor: fancy traits for the CumulativeProgress struct, allow limiting amount of callback calls

* make clippy happy

* dprint fmt

* refactor: clearly differntiate between SyncMutex and TokioMutex, use traits for converting to Arc<Mutex<_>>, move sync_ext into own moid

* fix: skip syncing if no spks in wallet

* fix: update bdk.sh to test migration from old wallet (pre 1.0.0 bdk) to new bdk

* fix: increase bitcoin_lock_confirmed_timeout in RegTest env to 5 minutes

* refactor: avoid usize where possible, create persistence only after full scan, transmit assumed_total for full scan to tauri, add some icons to progress displays

* make clippy happy

* fix(ci): change rust toolchain 1.81

* fix(cross compilation arm): use ring instead of aws-lc-rs

* fmt

* ignore failing rendezvous tests

* fix printing_status_change_doesnt_spam_on_same_status

* fix: given_bitcoin_address_network_mismatch_then_error test

* ignore list_sellers_should_report_all_registered_asbs_with_a_quote test

* feat: add tor icon

* refactor(wallet.rs): reorder struct by abstraction level

* refactor(bitcoin wallet): chunk size for syncing

* fix(integration tests): decrease sync interval to 3s

* fix(integration tests): parse_rpc_err method to take new bdk error, not old one

* add changelog entry

---------

Co-authored-by: Binarybaron <binarybaron@protonmail.com>
Co-authored-by: Mohan <86064887+binarybaron@users.noreply.github.com>
2025-05-18 22:54:03 +02:00
unstoppableswap-botty
0f2c406915
Prepare release 1.0.0-rc.21 (#318)
Co-authored-by: UnstoppableSwap Botty <help@unstoppableswap.net>
2025-05-15 19:39:53 +02:00
Binarybaron
8ec58dcb1e fix(gui): Fetch alerts only once 2025-05-15 18:26:23 +02:00
Mohan
23abb13315
feat(docs): Add darkness.su rendezvous point to docs 2025-05-15 17:09:49 +02:00
Mohan
7d111e18fe
fix(ci): Set yarn network-timeout to 10 minutes to avoid spurious network failures (#317) 2025-05-14 21:28:15 +02:00
Mohan
b7424ffaf5
feat(ci): Limit ci.yml to one concurrent running job per git branch (#316) 2025-05-14 21:20:50 +02:00
unstoppableswap-botty
75f48e35af
Prepare release 1.0.0-rc.20 (#315)
Co-authored-by: UnstoppableSwap Botty <help@unstoppableswap.net>
2025-05-14 21:07:29 +02:00
Mohan
9da5e432b3
feat(swap): Upgrade monero-wallet-rpc to v0.18.4.0 (#314) 2025-05-14 21:03:17 +02:00
b-enedict
31e68b2671
feat(gui): Add a Introduction for new users (#287)
* feat(gui): add IntroductionModal component

* feat(gui): add interactivity to IntroductionModal

* feat(gui): create SlideTemplate component for IntroductionModal Slides

* feat(gui): add generic slides to IntroductionModal with images and content

* feat(gui): add Slide with SwapStatusAlert to IntroductionModal

* feat(gui): show the introduction only on the first app start

* feat(gui): make external links functional

* fix(gui): update github link to link to active repo

* feat(gui): replace old images with new mockups and update Slide05 content

* feat(gui): add CardSelectionGroup and CardSelectionOption components for improved card selection UI

* feat(gui): add FiatPricePreference slide to IntroductionModal

* feat(gui): save user preference regarding fiat prices

I set the initial store configuration for fetching fiat prices to false to avoid any calls to coingecko without user consent

* refactor(gui): remove old Slide05 component for improved codebase maintenance

* fix(gui): add UnstoppableSwap logo to FiatPricePreference slide

* refactor(gui): update image imports and improve slide content for introduction modal

* fix(gui): introduce ExternalLink component and update Slide05 to use it for external navigation

* fix(gui): replace webp images for introduction with svg mockups for improved quality

* fix(gui): change order of introduction slides, to asking for fiat price preference at the end

* refactor(gui): implement CardSelectionContext for managing card selection state

* refactor: texts in intro modakl

* fix(gui): update currency fetching SVG for improved design and clarity

* feat(gui): added changelog entry for introduction

---------

Co-authored-by: Binarybaron <binarybaron@protonmail.com>
2025-05-07 12:44:29 +02:00
unstoppableswap-botty
66313ad91f
Prepare release 1.0.0-rc.19 (#305)
Co-authored-by: UnstoppableSwap Botty <help@unstoppableswap.net>
2025-04-28 17:03:18 +02:00
Mohan
01f1e6f218
fix(gui): Feedback submit payload 2025-04-28 16:58:51 +02:00
unstoppableswap-botty
3cf2337bfb
Prepare release 1.0.0-rc.18 (#304) 2025-04-28 15:52:48 +02:00
Mohan
53a994e6dc
feat(gui): Display developer responses to feedback (#302) 2025-04-28 13:12:43 +02:00
Raphael
f1e5cdfbfe
fix(swap): Monero wallet thread safety (#281)
* add comment to ConfirmationListener

* swap: always wrap monero::Wallet in tokio::sync::Mutex

Before, monero::Wallet wrapped a Mutex<Client>, and locked
the mutex on each operation. This meant releasing the
lock in between operations, even though we rely on the
operations being executed in order.

To remedy this race condition, we wrap monero::Wallet itself
in a mutex, requiring any caller to hold the lock for the duration
of the operation, including any suboperations.

* work on: releasing the lock while waiting for confirmations

Due to the newly introduced thread safety, we are currently holding
lock to the monero wallet while waiting for confirmations
-- since this takes a lot of time, it starves all other tasks
that do anything with the monero wallet.

In this commit I start implementing a change that enables us to release
the lock to the wallet while waiting for confirmations and only acquire it
when necessary.

This breaks with the current system of passing just a generic client
which implements the MoneroWalletRpc trait (which we use to pass a dummy
client for testing).

This commit is the first step towards a small refactor to that system.

* always pass Wallet instead of a MoneroWalletRpc client

By always passing Arc<Mutex<Wallet>> instead of MoneroWalletRpc clients
directly we can allow the wait_for_confirmations functions to lock the
Mutex and access the client when they need to, while releasing the lock
when waiting for the next tick. This stops the current starving of other
tasks waiting for the lock.

Since we use a dummy client for testing, this required adding a generic
parameter to the Wallet. However, since we specify a default type,
this doesn't actually require generic handling anywhere.

* add warning comment to monero::wallet::Wallet::from_dummy

* add timeout when waiting for monero lock during quote

This commit adds a timeout after 60 seconds when trying to acquire
the lock on the monero wallet while making a quote.
Should a timout occur, we return an error.
This makes sure that we get _some_ return value and that
starvation is noticed.

* fix lints, don't keep lock during loop body in wait_for_confirmations

* always immediately drop lock in wait_for_transfer

* fix clippy lints

* open wallet instead of failing when we can't create from keys

When we fail to create a monero wallet from keys, we will now try
to open it instead. I also renamed the method to be more consistent
with Wallet::open_or_create.

These changes are mostly taken from #260.

* improve documentation on monero::Wallet

* use Wallet::open instead of Wallet::Client::open

* use create_from_keys_and_sweep in bob's redeem_xmr

This commit deduplicates logic by using
create_from_keys_and_sweep_to in bob's redeem_xmr
and also adds the create_from_keys_and_sweep_to
method while making create_from_keys_and_sweep a
wrapper around it.

* add error context and improve logging

* fix deadlock in wait_for_confirmation_with, add timout to test
2025-04-24 15:34:01 +02:00
Raphael
e8084d65ec
feat(gui): Review logs before sending feedback (#301)
* add review buttons that open the attached logs before submitting feedback
* add redact switches to redact transaction id's from attached logs
2025-04-23 15:09:19 +02:00
Raphael
3fa31ba139
feat(gui): Tor toggle (#300)
* re-add tor info box, show switch for toggling tor

* add use_tor to TauriSettings, only initialize tor client when it's true

* add warning log message when not using tor client

* change the label text of the switch, fail to align switch with SettingsBox icons

* move Tor settings to SettingsBox
2025-04-22 16:36:09 +02:00
unstoppableswap-botty
ffe103cb49
Prepare release 1.0.0-rc.17 (#297)
Co-authored-by: UnstoppableSwap Botty <help@unstoppableswap.net>
2025-04-18 02:06:09 +02:00
Mohan
75f37a987b
fix(gui): Accept integrated Monero addresses 2025-04-18 02:01:25 +02:00
Mohan
9ddf2daafe
feat(gui): Approve dialog before publishing Bitcoin lock transaction (#291)
This diff introduces a new "approvals" mechanism that alters the swap flow by requiring explicit user intervention before the Bitcoin lock transaction is broadcast. Previously, the Bitcoin lock was executed automatically without any user prompt. Now, the backend defines `ApprovalRequestType` (e.g. a `PreBtcLock` variant with details like `btc_lock_amount`, `btc_network_fee`, and `xmr_receive_amount`) and `ApprovalEvent` (with statuses such as `Pending`, `Resolved`, and `Rejected`). The method `request_approval()` in the `TauriHandle` struct uses a oneshot channel and concurrent timeout handling via `tokio::select!` to wait for the user's decision. Based on the outcome—explicit approval or timeout/rejection—the approval event is emitted through the `emit_approval()` helper, thereby gating the subsequent broadcast of the Bitcoin lock transaction.

On the UI side, changes have been made to reflect the new flow; the modal (for example, in `SwapSetupInflightPage.tsx`) now displays the swap details along with explicit action buttons that call `resolveApproval()` via RPC when clicked. The Redux store, selectors, and hooks like `usePendingPreBtcLockApproval()` have been updated to track and display these approval events. As a result, the overall functionality now requires the user to explicitly approve the swap offer before proceeding, ensuring they are aware of the swap's key parameters and that the locking of funds occurs only after their confirmation.
2025-04-18 01:51:55 +02:00
unstoppableswap-botty
ab5f93ff44
Prepare release 1.0.0-rc.16 (#294) 2025-04-17 22:00:52 +02:00
Mohan
49af378467
fix: Move changelog entry for asb quote caches to correct section 2025-04-17 20:22:48 +02:00
Mohan
b3559421ae
feat(asb): Cache quotes (#288) 2025-04-17 16:22:30 +02:00
unstoppableswap-botty
8d4f714015
Prepare release 1.0.0-rc.14 (#290)
Co-authored-by: UnstoppableSwap Botty <help@unstoppableswap.net>
2025-04-16 15:10:24 +02:00
Raphael
24cfa71932
cli: log the reason we can't find tx_cancel (#289)
* cli: log the reason we can't find tx_cancel

When we can't find tx_cancel even though the cancel timelock
expired, we publish it ourselves.

However, some users had a problem where the tx_cancel wasn't
found even though it was already published.
This leads to the cli getting stuck in `CancelTimelockExpired`
when it should go to `BtcCancelled`.
This commit introduces an additional log statement that will
help us narrow down why that is.

* gui: update the documentation icon
2025-04-16 13:44:37 +02:00
Mohan
b9609b979b
dev: Add code2prompt scripts to extract entire codebase into single file (#285) 2025-04-15 14:59:38 +02:00
Mohan
7023a186b1
fix(swap): Error handling for fallback during Monero tx monitoring (#278) 2025-03-17 15:58:51 +01:00
Mohan
80ef31c3e9
docs: Add backup rendezvous server to maker documentation (#277) 2025-03-17 15:16:59 +01:00
Byron Hambly
7e8bfd4f02
Merge pull request #276 from UnstoppableSwap/gui/add-docs-icon
gui: add an icon that links to the documentation
2025-03-15 18:53:46 +02:00
Einliterflasche
012131c267
gui: add an icon that links to the documentation 2025-03-14 12:38:04 +01:00
Raphael
315272b50d
gui: update social media links (remove reddit, discord; add matrix) (#273) 2025-02-28 21:14:23 +01:00
einliterflasche
54670ab839
docs: update changelog to include updated rust version 2025-02-27 19:23:44 +01:00
einliterflasche
86ddda4207
fix(ci): upgrade rust toolchain to 1.80 2025-02-27 19:10:57 +01:00
einliterflasche
25cc97660a
fix(ci): update our ci toolchain to resolve toolchain conflicts 2025-02-27 18:52:28 +01:00
einliterflasche
bee547ef68
fix ci for windows 2025-02-22 23:40:15 +01:00
Byron Hambly
2ec90384f4
Merge pull request #270 from ikmckenz/master
Run cargo fmt in src-tauri
2025-02-19 11:03:19 +02:00
Ian McKenzie
7debdeabb0 Run cargo fmt in src-tauri 2025-02-18 18:42:56 -08:00
Dimitris Apostolou
ad86a80098
deps: fix crate vulnerabilities (#269) 2025-02-18 17:19:42 +01:00
Raphael
504eb0d014
ci: fix spurious network erros (#268)
Occasionally our ci jobs would fail due to network errors.
This is a known issue which is worked around by disabling
http multiplexing, for now. Hopefully.
2025-02-15 22:26:04 +01:00
unstoppableswap-botty
dfe1a28267
Prepare release 1.0.0-rc.13 (#259) 2025-01-24 02:54:38 +01:00
Mohan
c9d3536f36
fix(gui): Button to open data directory (#256) 2025-01-22 16:29:11 +01:00
Einliterflasche
9e27c6548b
docs: generally improve docs and add maker page (#242)
* improve introduction and installation docs

* add some maker documentation

* improve maker docs

* Add network section, explain multiaddr, move docker commands into table

* Finally fix src-gui/.gitignore

* Fix .env.development

* Refine cancel, refund, punish explanation

* Add to changelog

* Make donation addresses copyable

* Apply suggestions
2025-01-21 16:05:05 +01:00
binarybaron
29da23ea60
fix(asb): Would silently fail if Monero refund transaction publish failed (#254) 2025-01-21 14:01:57 +01:00
unstoppableswap-botty
3e6b25a0c8
Prepare release 1.0.0-rc.12 (#252) 2025-01-16 11:46:02 +01:00
binarybaron
5e9240b628
fix(cli): Correctly check for available nodes, remove dead nodes (#251)
There was an issue before we were falsely applying a default node to use and not actually iterating through our list and checking for availiability. This commit fixes this issue and removes a few dead nodes.
2025-01-14 23:23:33 +01:00
Byron Hambly
37d97e5f2f
Merge pull request #248 from HammerPavel/master
docs: added note about increasing gap limit
2025-01-09 17:08:53 +02:00
hp
3affb18925 docs: added note about increasing gap limit 2025-01-09 15:56:17 +03:00
Einliterflasche
799eb15411
GUI: warn against replace-by-fee for deposit transactions (#243)
* add alert in deposit page to warn against replace-by-fee
2025-01-07 12:15:43 +01:00
binarybaron
c9431d80f7
docs: Refer to asb-docker-compoe 2025-01-02 20:40:39 +01:00
binarybaron
cf20891638
fix(gui): Fetch balance after swap is released, re-fetch database after progress event, change wording in progress page (#237) 2024-12-23 11:59:40 +01:00