* 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(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
* 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
- Upgrade `sqlx` to `0.8`
- Use `arti_client@0.24` in combination with [`libp2p-community-tor`](https://crates.io/crates/libp2p-community-tor/0.4.1). https://github.com/umgefahren/libp2p-tor/pull/18 was required for this.
- Display spinner in GUI while Tor circuits are being established
- Remove unused dependencies (`once_cell`, `tauri-plugin-devtools`, `digest`, `hyper`, `itertools`, `erased_serde`)
- Bundle roboto font from npm registry
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`.
Previously we used the data we fetched via the rpc (`GetSwapInfo` call, saved in redux in `rpc.swapInfos`) to decide what to display in the state stepper to the user. The state stepper is displayed at the bottom of the `SwapDialog`.
However, we are moving away from our depedence on periodic rpc calls and towards relying more and more on the events we receive from the Host (from Tauri). Our goal is to rely solely on the Tauri events for everything displayed about the currently running swap.
This PR includes the following changes:
- refactor the `SwapStateStepper` such that it relies only on the Tauri events
- emit two new Tauri events (`EncryptedSignatureSent`, `CancelTimelockExpired`) in the state machine
- correctly emit `BtcRefunded` Tauri event after Bitcoin refund transaction is published
- differentiate between `"Waiting for them to redeem the Bitcoin"` and `"Revealing encrypted signature to the other party"` on the `SwapStatePage` (content displayed in the center of the `SwapDialog`)
This PR
- removes `tauriModel.ts` from git and instead
- generates `tauriModel.ts` everytime `vite` starts or `vite` detects a change in `swap/src/`
To do that I have introduced the `gen-bindings` and `check-bindings` commands as well as improved documentation. Following this PR, the Typescript bindings to our Tauri commands will be automatically re-generated upon the instant a source file is changed!
This closes#49
- 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