* 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>
* 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 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.
* 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
- 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
Our libp2p version is out of date, and we need to tackle the upgrade even though it's a significant undertaking. This'll also fix some other [issues](https://github.com/UnstoppableSwap/core/issues/95).
## This PR includes the following changes:
- Breaking network protocol change: The libp2p version has been upgraded to 0.53 which includes breaking network protocol changes. ASBs and CLIs will not be able to swap if one of them is on the old version.
- ASB: Transfer proofs will be repeatedly sent until they are acknowledged by the other party. This fixes a bug where it'd seem to Bob as if the Alice never locked the Monero. Forcing the swap to be refunded.
- CLI: Encrypted signatures will be repeatedly sent until they are acknowledged by the other party
- CLI+ASB: Libp2p network errors in request-response protocols are now propagated throught the event loop channels. This allows the caller to retry if an error occurs (e.g timeout)
Closes https://github.com/UnstoppableSwap/core/issues/101, https://github.com/UnstoppableSwap/core/issues/95
We no longer show the manual cancel and refund button. This functionality is currently not implemented in the GUI. The state machine should resume the swap as well. The functionality can be added back later.