* mvp
* only redial if DisconnectedAndNotDialing
* progress
* progress
* progress
* some progress
* progress
* extract common logic into behaviour_util::ConnectionTracker
* extract common logic into BackoffTracker helper struct
* add comment in quote::background behaviour
* BackoffTracker rename get_backoff to get(...)
* cleanup, fix some things that got lost during rebase
* properly propagate quote::background ToSwarm events
* actually persist event loop, add quotes and rendezvous::discovery to cli behaviour
* some progress, cleanup, comments
* progress
* redial all peers that we dont know dont support quote, use quotes_cached behaviour in example, add remove_peer(...) to redial behaviour, don't redial discovered rendezvous peers
* remove old todo
* quotes_cached.rs: cache last connected endpoint
* rename: add_peer_address -> queue_peer_address
* extract p2p defaults into swap-p2p/defaults.rs
* split rendezvous.rs into two sub-modules
* remove unused bob::BackgroundQuoteReceived
* replace usage of list_sellers with event loop
* prune: remove list_sellers command
* use backoff helper in swap-p2p/src/protocols/quotes.rs
* refactor rendezvous::register behaviour, getting some unit tests working again
* add all peer addresses to the swarm on init
* less agressive redials
* extract magic backoff numbers
* proof of concept: drill tracing span into event loop through channels
* add BackoffTracker::increment, re-schedule register when we lose connection to rendezvous point
* fetch identify version and propagate into UI
* forbid private/local/loopback ip addresses to be shared/accepted through Identify
* remove legacy list_sellers code
* ensure uuids are unique for alice during swap_setup
* formatting and nitpicks
* fix: allow multiple swap setup requests over the same connection handler
* small cleanups
* fix: protocols/quotes.rs unit tests
* revert: listen on 0.0.0.0 for asb p2p
* propagate handle_pending_inbound_connection and handle_pending_outbound_connection to identify patch source
* replace loop with repeated return Poll::Ready in discovery.rs
* format
* MultiAddrVecExt trait, emit rendezvous addresses to rendezvous-node swarm
* fix: strictly disallow concurrent swap setup requests for the same swap on the same connection
* fix tests etc
* remove slop from futures_util.rs
* address some comments
* behaviour_util.rs: track inflight dials, add tests, return Some(peer_id) if internal state was changed
* replace boring-avatars with jidenticon
* feat: add peer discovery status dialog
* remove buy-xmr cli command, remove "sellers" arg for BuyXmrArgs, add changelog
* disable body overscroll
* add changelog for jidenticon
* increase quote fetch interval to 45s
* fix rendezvous::register_and_discover_together test
* 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>
* bump(rust): Toolchain to 1.82
* bump(tauri): Bump some Tauri peer-dependencies
* fix(gui): Prefer maker with known version, bump MIN_ASB_VERSION to 1.1.0-rc.3
* amend: CHANGELOG.md
- GUI: Changed terminology from "swap providers" to "makers"
- GUI: For each maker, we now display a unique deterministically generated avatar derived from the maker's public key
This PR applies all remaining changes from https://github.com/UnstoppableSwap/unstoppableswap-gui/pull/210
- Added checkbox option to attach daemon logs when submitting feedback
- Added "Outdated" chip with warning icon for providers running outdated asb versions
- Updated `BitcoinPunishedPage` to display different messages for BtcPunished and CooperativeRedeemRejected states (including reason for failed cooperative redeem)
- Added "Attempt recovery" button for swaps in BtcPunished state
- Modified `getBitcoinTxExplorerUrl` to use mempool.space instead of blockchair.com
- Added `useResumeableSwapsCountExcludingPunished` hook to count resumable swaps excluding punished ones, use it for the badge and alert
- Updated `sortProviderList` function to filter out incompatible providers before sorting
- Added `TauriSwapProgressEventExt` type to extract specific event types from TauriSwapProgressEvent
- Replace Electron IPC with Tauri invoke() for API calls
- Implement TauriSwapProgressEvent for state management
- Remove IpcInvokeButton, replace with PromiseInvokeButton
- Update models: new tauriModel.ts, refactor rpcModel.ts
- Simplify SwapSlice state, remove processRunning flag
- Refactor SwapStatePage to use TauriSwapProgressEvent
- Update HistoryRow and HistoryRowActions for new data structures
- Remove unused Electron-specific components (e.g., RpcStatusAlert)
- Update dependencies: React 18, Material-UI v4 to v5
- Implement typeshare for Rust/TypeScript type synchronization
- Add BobStateName enum for more precise swap state tracking
- Refactor utility functions for Tauri compatibility
- Remove JSONStream and other Electron-specific dependencies