* refactor(gui): seperate get info and get timelock to speed up display of swaps
* progress
* progress
* remove unused function useSwapInfoWithTimelock
* use GetSwapTimelockArgs and GetSwapTimelockResponse types
* fix(swap): Split approve-and-sign and publish-lock-tx into two states
* fix: cannot get blockchain height
* add RetrievingMoneroBlockheight, RetrievingMoneroBlockheight tauri events
* propagate daemon blcok height fetch error, treat height 0 as error
* check if tx_lock was previously published
* feat(gui): Monero wallet
* progress
* refactor
* progress, dont delete wallet, re-fetch approvals and background periodically
* show transaction history correctly
* Enable fetching tx hashes
* Try add the wallet listener event callbacks, not working
* fix: Redeem XMR to internal main wallet, not temp wallet
* type safety
* refactoring of callback system
* make free floating functions generic
* refactor: Format files
* refactor(gui): Split wallet components and redesign balanceOverview component
* refactor(gui): Add action buttons and transaction section
* wrapper event listener
* progress, compiles
* works!
* WORKS! Event received on balance change
* refactor: format and slight refactorings and comments
* refactor(gui): Start with implementation of send dialog
- new number input
- new button variant and size
* add @tauri-apps/plugin-dialog
* feat(gui): Add permissions for file dialog
* fix(monero-harness): Compile issue
* feat(gui): Extract seed from Monero wallet and use for derivation, allow opening existing wallet file
* feat(gui): Always refresh the approval list from frontend when resolving
* fix(monero-rpc-pool): Implement Into<String> for ServerInfo
* fix(monero-sys): Use oneshot channel for all wallets
* feat(gui, monero-sys): Display recently opened wallets
* small refactors
* fix(gui): Enable background_sync, display temp "Loading..." if values are null
* feat(gui): Remove headers from pages, show selected navigation item
* feat(gui): Explicitly tell user if no swaps have been made yet
* feat(gui): send sync and history updates
* feat(gui): Fetch monero wallet details when context becomes availiable
* feat(gui): Display Monero primary address without modal
* feat(gui): Make "swap" button on wallet page take you to "/swap"
* feat(gui): Rework send modal, adjust number input, added send to field
* feat(gui): set block restore height, not working
* refactor(gui): Optimize number input and add support for switching between currency
* feat(gui): Display real fiat currency prices in send modal
* feat(gui): Add error message for too high send amount
* feat(gui): Modern UI for SeedSelectionDialog
* feat(gui): Wrap MoneroWalletActions
* wip
* refactoring approval callback
* feat(gui): Send Direction of Transaction in History to Frontend
* feat(gui): Let user approve transaction before publishing
* feat: Display 8 digits for Monero amounts by default
* feat(monero-sys): Store pending (non published) transactions in Mutex map inside wallet thread
This allows seperating signing and publishing transactions cleanly
* dprint fmt
* fix(gui): Refresh Monero wallet history C++ struct before serializing
* feat(monero-rpc-pool): Fail after three JSON-RPC errors
* feat(monero-sys): Add wrapper around verify_wallet_password
* feat(gui): Allow opening password-protected Wallets
* refactor: fmt, remove receive button
* fix(gui): Convert to XMR before converting into Fiat
* feat(gui): Add dialog for setting restore height
* feat(gui): block height can be changed, blocks when too low
* refactor(monero-sys): Remove old WalletListener code
* feat(gui): Continually ask for user to select wallet and enter password, if user rejects, offer to select different wallet
* refactor(swap): Extract "select Monero wallet" into own function
* refactor(tauri): Dont kill monero-wallet-rpc
* refactor(tauri): Avoid multiple concurrent Contexts starting
* refactor: Change "Cancel" to "Change wallet" on PasswordEntryDialog
* feat(gui): show curent block height, fix blockage
* Cargo.lock update
* refactor(monero-sys): Use match instead of is_err() and expect(...)
* refactor: better context for WalletHandle constructor method errors handling
* refactor(monero-sys): Common open_with<F>(path: String, daemon: Daemon, wallet_op: F) function
* feat: check empty password before requeston password for wallet
* feat: Remove "Checking for available remote nodes" from frontend
* feat(gui): Allow sweeping entire Monero balance
* feat(monero-rpc-pool): Keep alive TCP connections, do not record JSON-RPC errors as failure if >=3 nodes failed
If >=3 nodes failed we assume it was an actual issue on our side, not an issue with the node
* refactor(swap): Remove dead code
* add comment to WalletHandleListener::on_refreshed{...}
* feat(gui): show current block height in the field
* refactor: remove unused UserCancelledError;
* refactor: No Arc<Mutex<_>> for Pending TXs map
* refactor: remove redundant } catch (error) {
* feat: add our new crates to `OUR_CRATES` in tracing util
* fix(gui): Add math.ceil to piconero conversion to ensure integer
* fix(gui): Close menu when option is clicked
* review and improve/reduce uses of unsafe, also remove unique_ptr wrapper around TransactionHistory to avoid double free
* fix(gui): Use monero amount from units.tsx
* fix(gui): Use PromiseInvokeButton for simplification for approving of send transaction
* update comment, rename function
* refactor(gui): Fix alignment of amounts
* refactor(gui): Remove sending and refreshing states from wallet
* fix(cli, gui): use old seed flow on no tauri, fix minor issues in gui
* fix: use the new named function
* refactor(gui): Add skeletons for monero wallet when still loading
* refactor(gui): Remove isLoading from wallet slice
* feat(gui): Add success dialog after send transaction was approved
* fix(gui): Floor piconero amount in sendMoneroTransaction
* feat(gui): Allow view on explorer button on send success modal
* feat(backend): save the wallet state on events
* fix(structure): move throttle into its own crate
* fix(log): remove spammy logs
* fix(logs): log folder in confid
* remove "sync progress: " log
* small refactors
* save wallet at most every 60s
* remove useless logs
* underscore unused variables
* feat(gui): Add timestamp of the tx
* feat(gui): Add the legacy wallet init option
* legac ybutton
* Fix(gui, asb): reverse the log config
remove log in bridge.h
cleanup
* use none for .store(..)
* display dot for running swap
---------
Co-authored-by: Maksim Kirillov <maksim.kirillov@staticlabs.de>
Co-authored-by: b-enedict <benedict.seuss@gmail.com>
Co-authored-by: einliterflasche <einliterflasche@pm.me>
* 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>
* 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>