* fix(gui): we were not checking for null everywhere
* add more null checks, enable tsconfig strict
* remove dead code
* more nullish checks
* remove unused JSONViewTree.tsx
* fix a bunch of small typescript lints
* add explanations as to why LabeledMoneroAddress.address is non-nullish but we pass in null due to typeshare limitation
* remove @mui/lab from yarn.lock
* re-add SortableQuoteWithAddress
* add guard function for ExportBitcoinWalletResponseExt ("wallet_descriptor")
* fix remaining linter errors
* remove duplicate XMR
* fix hasUnusualAmountOfTimePassed in SwapStatusAlert.tsx
* refactor(monero-rpc-pool): ureq -> raw hyper
* whitelist "getblocks.bin", refactor config constructors, use arti-client, record lowerst seen block height, small style changes
* display effective bandwidth
* compact wallet overview page a bit
* record latencies correctly
* add setting for monero tor routing, add ssl support for hyper, lengthen window duration for bandwidth tracker
* remove unwrap
* refactor ui
* dont fail silently tor bootstrap
* some workarounds for buggy wallet2 stuff
* feat(gui): Implement base structure for new swap ux
- refactored file structure to match common projecte structure
- implement step get bitcoin
* feat(gui): Implement basic multi step modal
* feat(gui): Add outline of add choose maker and offer step
* feat(gui): Add receive address selector
* refactor(gui): format code
* feat(gui): Make Swap Overveiw interactive
* feat(gui): Add action to swap amount selector to quickly go to deposit bitcoin step
* progress
* feat(gui, cli): Request quotes concurrently at all sellers
* refresh offers occasionally, display progress
* progress
* feat(gui, cli): Request quotes concurrently at all sellers
* refresh offers occasionally, display progress
* progress, works again
* allow closing dialog without warning if no funds have been locked
* progress
* feat(gui): Rewrite Swap Components to have flow directly on swap page
* feat: log monero_rpc_pool only at >= INFO level
* remove full_url, add migration to change scheme of node.monerodevs.org to http
* feat: send known_quotes with WaitingForBitcoinDeposit Tauri progress event (even if our balance is too low)
* lock swap lock later
* refactor(monero-rpc-pool): Pass around tuple of (scheme, host, port) as nodes
* refactor(gui): Remove modal for swap and adjust few pages for swap process
- Moved files from swap modal to page directory
- Use new layouts for init page
- Use new layout for depositBTC Step
- Use new layout for Offer Page
* allow cancel before lock
* remove unused code
* dynamic layout, chips for amounts
* feat(gui): Add breakpoints
* remove continue button, add select button on each maker box
* add GetCurrentSwapArgs tauri command to only suspend swap if one is actually running
* feat(gui): Show all known quotes and disable the ones that aren't available
* fix get_current_swap, kill tasks when buy_xmr is cancelled
* cleanup: remove CleanupGuard
* feat(gui): Add cancel button on every page
* refactor(gui): Fix merge issues
* refactor(gui): Unify Cancel Button insertion by using a swap base page
* refactor(gui): Unify Cancel Button insertion by using a swap base page
* refactor(gui): Remove deeply nested relative paths
* refactor(gui): Made BaseSwapPage obsolete by moving Cancel Button to SwapStatePage
* refactor(gui): Adjust condition for showing SwapSuspendAlert
* fix(gui): Fetch previous monero redeem addresses repeatedly
* refactor(gui): Remove QR Code from deposit and choose maker page
* refactor(gui): Don't display dialog on History page
* fix(gui): If no swap was running "suspend_current_swap" will still return success now, less logic in the CancelButton
* get offer select working
* refactor: dont display cancel button on set redeem address page
* feat: add pagination to offers
* refactor
* emit partial events for list_sellers
* refactor: remove torSlice
* refactor: use sync (non tokio) mutex for approvals
* throttle getSwapInfo calls
* feat: add debug page back, add info in suspend dialog about what will happen
* refactor: format files
* refactor(gui): Remove sortMakers method and replace with method that sorts approvals
* refactor(gui): Refactor swap page structure
* fix(gui): Add breakpoints to swapSetupInflightPage
* feat(gui): Add flag for outdated makers
* refactor(gui): Reduce fetch rate for maker quotes
* fix(gui): Debug Window size
* no unwrap
---------
Co-authored-by: b-enedict <benedict.seuss@gmail.com>
* poc: monero receive pool with multiple redeem addresses for bob with given ratios
* fix: use new monero_receive_pool arg for buy_xmr
* update sweep/sweep_multi to return TxReceipt instead of String containing txid
* fix test (generate 1 block before checking balance after transfer)
* add move distribute function to rust, add property tests
* use rust distribute
* update sqlx cache/tempdb
* sqlx fix
* feat: update ui to display the monero address pool
* fix: remove unused functions, set dispatcher for tracing in wallet threads, use new subtract_fee wallet2 functionality
* Add patch system
* add wallet2_api_allow_subtract_from_fee patch
* apply git patches
* split monero-sys patches into chunks
* refactor
* .sqlx needs to be commited, revert unbound issue
* display pool on XmrRedeemInMempoolPage.tsx page, commit .sqlx folder
* fmt
* refactor
* assert MoneroAddressPool is on correct network, differntiate between stagenet and mainnet donaiton address
* looks ok
* re-add retry logic, database errors, ...
* add test
* add tests
* fmt comments, changelog
---------
Co-authored-by: Binarybaron <binarybaron@protonmail.com>
* feat(swap): Allow discovery at multiple rendezvous points, request quotes from locally stored peers
- Ensure uniqueness of the peer_addresses table (no duplicate entries)
- Add peer to local database even if we just request a quote, and no swap (call to list_sellers)
- Refactor list_sellers to take multiple rendezvous points
- Allow db to be passed into list_sellers, if so request quote from all locally stored peers
* feat: editable list of rendezvous points in settings, new maker box on help page
* Recover old commits
* fix small compile errors due to rebase
* amend
* fixes
* fix(gui): Do not display "Core components are loading..." spinner
* fix(gui): Prefer makers with m.minSwapAmount > 0 BTC
* feat(cli, gui): Fetch version of maker
* feat: display progress bar
* feat(protocol): Early Bitcoin refund
Alice can choose to let Bob refund his Bitcoin early (before TxCancel timelock expires)
* feat: Let Bob check for TxEarlyRefund
* fix: compile errors
feat(alice): if we cannot lock Monero within 2 minutes, early refund bitcoin
* satisfy clippy
* fix(gui): Emit tauri event when Bitcoin is early refunded
* tests progress
* rename AliceStates
* progress: working prototype!
* add unit tests for tx_early_refund construction (tx_early_refund_can_be_constructed_and_signed, tx_early weight check)
* fix compile error in swap/tests/alice_zero_xmr_early_refund.rs
* only make [`tx_early_refund_sig_bob`] optional in state machine, not message machine
* feat: working integration test alice_zero_xmr_early_refund.rs
* fix tests
* add changelog entry, add integration test with broken monero-wallet-rpc simulation
* amend
* amend changelog
* nitpick
* feat(gui): Bump MIN_ASB_VERSION to 2.0.0
* feat(bob): explicitly check for tx_early_rewfund
* refactor(bob): Assume tx_early_refund will not be published if timelock has expired
* add todo
* refactor
* refactor(swap): Differentiate between BtcRefundPublished, BtcEarlyRefundPublished, BtcEarlyRefunded and BtcRefunded
* refactor: move weight of tx_early into TX_EARLY_REFUND_WEIGHT const
* efactor(swap): Differentiate between BtcRefundPublished,BtcEarlyRefundPublished, BtcEarlyRefunded and BtcRefunded
* small refactors
* nitpciks
* dprint fmt
* add context to get_raw_transaction
* refactor: remove duplicated code in watch_for_redeem_btc, dprint fmt
* fix: parse -5 electrum transaction not found error correctly
* refactor: send btc_refund_finalized flag to tauri with BtcRefunded state
* remove uncessary .context
* dprint dfmt
* remove unused import
* refactor: explicitly mark state3.expired_timelocks(...) as transient error when locking Monero
* use .context instead of ok_or_else(...)
* fix: in get_raw_transaction also check for "missing transaction"
* add 4 different types of tauri events for different refund states
* display BobStateName.BtcEarlyRefunded as done state
* add global bottom to DialogContentText
* fix(gui): Add missing padding in SwapDialog
* proof of concept: electrum load balancer
* load balancer progress
* wrap Mutex<Vec<Arc<BdkElectrumClient<Client>>>> in electrum_balancer in another Arc, free locks as fast as possible
* refactor
* refactor(electrum balancer): use OnceCell to do lazy initilization
* tests
* refactor(electrum): enhance error handling with MultiError for comprehensive failure analysis
This commit introduces a robust MultiError system for the Electrum balancer that collects
and exposes all individual node failures, enabling better error analysis and decision making.
Key improvements:
- Add MultiError struct with methods for inspecting all collected errors from failed nodes
- Modify electrum_balancer::call() to return MultiError instead of single Error
- Enhance Client::get_tx() to properly detect transaction-not-found across multiple nodes
- Add call_async_with_multi_error() method for detailed async error analysis
- Improve error tracing and logging throughout the Bitcoin wallet operations
- Add comprehensive test coverage for MultiError functionality and edge cases
- Remove obsolete should_retry_on_error() logic in favor of MultiError inspection
The MultiError type maintains backward compatibility through automatic conversion to Error
while providing rich error analysis capabilities for callers that need detailed failure
information. This particularly improves handling of transaction-not-found scenarios where
different nodes may return different error formats.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* add changelog entry for electrum node balancing
* refactors of electrum balancer
* only warn if .check_for_tx_early_refund fails
* clippy
* remove verbose message
* use AtomicUsize
* final touches
* log libp2p crates
* merge master
* display LinearProgressWithSubtitle as indeterminate if progress=100%
* let broadcast return a MultiError, log all libp2p crates
* nitpick
* make clippy happy
* log "kind" for join_all load balancer
* add kind to join_all method, show warning alert if alice takes a long time to redeem Bitcoin
* parse multierrors correctly
* fmt
---------
Co-authored-by: Claude <noreply@anthropic.com>
* task(gui): update to mui v5
* task(gui): use sx prop instead of system props
* task(gui): update to mui v6 and replace makeStyles with sx prop
* task(gui): update to mui v7
* task(gui): update react
* fix(gui): fix import
* task(gui): adjust theme and few components to fix migration introduced styling errors
* fix(gui): animation issues with text field animations
* fix(gui): remove 'darker' theme and make 'dark' theme the default
- with the new update 'dark' theme is already quite dark and therefore a 'darker' theme not necessary
- the default theme is set to 'dark' now in settings initialization
* feat(tooling): Upgrade dprint to 0.50.0, eslint config, prettier, justfile commands
- Upgrade dprint to 0.50.0
- Use sane default eslint config (fairly permissive)
- `dprint fmt` now runs prettier for the `src-gui` folder
- Added `check_gui_eslint`, `check_gui_tsc` and `check_gui` commands
* refactor: fix a few eslint errors
* dprint fmt
* fix tsc complains
* nitpick: small spacing issue
---------
Co-authored-by: Binarybaron <binarybaron@protonmail.com>
Co-authored-by: Mohan <86064887+binarybaron@users.noreply.github.com>
* 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
This PR tackles #92
- Add the `tauri-plugin-cli` (only on desktop)
- Check in the frontend if the `--testnet` flag is set. If it's set we pass `testnet=true` to the `initialize_context` command on invokation
- We add the `vite-plugin-top-level-await` to allow top level await in all browsers
- Remove the `bitcoin_confirmation_target` from settings for simplicity
- Implemented dual persistence strategy:
- **User Settings**: Persisted across app restarts using `tauri-plugin-store`.
- **Transient State**: Persisted across page reloads using `sessionStorage`.
- Added `settingsSlice` reducer for managing persistent user settings.
- Updated Redux store configuration to handle multiple persistence layers.
- Added a new Settings page in the GUI where users can specify custom Electrum RPC URLs for Bitcoin and Monero node URLs.
- Users can input their preferred Electrum server (`ssl://host:port`) and Monero daemon (`http://host:port`).
- Input fields include validation to ensure correct URL formats.
- Settings persist across application restarts using Tauri's storage plugin.
- A reset option is available to revert to default settings.
- Improved the Daemon Controller in the Help page:
- Renamed `RpcControlBox` to `DaemonControlBox` for clarity.
- Users can now start the daemon manually if it isn't running or has failed.
- Added a "Restart GUI" button to apply new settings immediately.
- Displayed the daemon's status within the controller.
- Upgraded Tauri and related plugins to stable version `2.0.0`:
- Updated `tauri`, `tauri-build`, and `tauri-utils` to `2.0.0`.
- Ensured compatibility with the latest stable release.
- Updated Tauri plugins to version `2.0.0`:
- `tauri-plugin-clipboard-manager`
- `tauri-plugin-shell`
- Added new plugins:
- `tauri-plugin-store` for settings persistence.
- `tauri-plugin-process` to enable application relaunch.
- Deferred Context initialization until explicitly triggered from the frontend.
- Moved Context setup from the `setup` function to a new `initialize_context` Tauri command.
- Allows the application to start without immediately initializing the backend context.
- Context initialization now considers user-provided settings for Electrum and Monero nodes.
- Introduced a `ValidatedTextField` component for form inputs with validation logic.
- Provides immediate feedback on input validity.
- Used in the Settings page for Electrum and Monero node URLs.
- If the user provides an override Monero remote daemon, we check if it reachable and on the correct network before starting the `monero-wallet-rpc`
- Changed `bitcoin_confirmation_target` type from `usize` to `u16`.