Commit graph

19 commits

Author SHA1 Message Date
Mohan
7d019bfb30
feat(gui): Partially available global state (#593)
* feat(gui): Partially availiable global state

* move tauri command into own module

* move commands list into src-tauri/src/commands.rs

* cleanup swap/src/cli/api.rs

* add contextRequirement attribute to PromiseInvokeButton

* amend

* allow wallet operation on partially availiable context

* improvements

* fix some linter errors

* limit amount of logs to 5k

* keep behaviour from before

* make sure if swapId is null useActiveSwapLogs, return no logs

* remove unused variable

* create ContextStatusType enum
2025-10-02 21:28:12 +02:00
einliterflasche
adace17af3
Merge branch 'master' of https://github.com/UnstoppableSwap/core 2025-09-25 21:26:16 +02:00
Mohan
2ec6323c45
feat(asb): Disabled-by-default developer tip (#566)
* wip

* filter out destinations with zero amount

* add changelog entry

* do not use subtract_fee_from_outputs for multi lock tx

* make developer tip address configurable

* create developer_tip_monero_wallet in integration test

* add happy_path_alice_developer_tip integration test

* run happy_path_alice_developer_tip integration test in ci

* make stub tests

* document `developer_tip` and add log at startup

* take tip consideration when crafting quote

* remove double g++

* fix bash

* full stack trace in logs

* add DEFAULT_DEVELOPER_TIP_ADDRESS_STAGENET

* fix issue where --testnet could not be detected

* triple bitcoin testnet timelocks

* assert hardcoded developer tip address is on the correct network

* fix: interpret developer_tip = 0 as no tip in log at startup

* change developer_tip type to non-option, clamp tips below 100_00 piconero to 0

* create dedidcated TipConfig struct to replace (Decimal, monero::Address)

* small refactorings

* move tip config init out of of function call params

* refactoring

* unit tests wrong arguments passed in

* document `developer_tip` allows configuring your maker to donate a small part of swaps to funding further development of the project. This is disabled by default. You can manually enable it if you choose to do so. Set it to a number between 0 and 1. Setting it to 0.02 will donate 2% of each swap to the donation address of the project. The tip is sent by adding an additional output the Monero lock transaction of a swap. This means this will not impact document `maker.developer_tip` in docs/pages/becoming_a_maker/overview.mdx

* do not panic if cxx_addrs / cxx_amounts is null

* formatting, full error stack trace in swap/src/asb/event_loop.rs when we cannot construct a quote

* increase MIN_USEFUL_TIP_AMOUNT_PICONERO to 30m piconero (usd), correct params in unit tests

* prompt for developer_tip in orchestrator and asb wizard

* just fmt

* fmt

* address comments

* fmt

* spelling mistakes

---------

Co-authored-by: binarybaron <binarybaron@mail.mail>
2025-09-24 13:07:24 +02:00
einliterflasche
4905b2b068
fixes 2025-09-19 21:16:32 +02:00
Mohan
f2b23348d7
feat(monero-sys): Build system (#500)
* feat: use contrib/depends to build dependencies

* fix: bump min iOS sdk to 13

* fix: macos targets

* fix: show make output during build
fix: mingw linking issues

* chore: address AI review

* check target only once, stream make output to stdout, init ios project

* check whether patch is already applied before trying again

* copy contrib/depends to target dir and build dependencies there

* fix: use proper triplet for ios-sim

* fix(dprint): ignore monero_c, monero and monero-seed folders

* fix(swap): Missing import

* fix(ci): Add gperf as a required dependency for Linux

* add notes for unsafe usage to CLAUDE.md

* add clean command to justfile

* fix: minimumSystemVersion to 11.0 because tauri doesn't default behavior is wild

* update crunchy dependency to fix linux->windows cross compilation issue

* fix last commit

* link c++ std lib and libgcc statically on windows

* embed WebView2 Bootstrapper

* disable ccache on ios, update tauri deps, set minimumSystemVersion to 13.0

* fix

* fix: build env leaking into contrib/depends

* fix: version '-sim' in target triple 'arm64-apple-ios13.0-simulator-sim' is invalid

* get it working on ios

* Upgrade to nightly Rust toolchain for unstable features

- Change from Rust 1.85 to nightly to support yamux unstable features
- This resolves the unsigned_is_multiple_of compilation error

* fix

* WINDOWS WORKS

* Cargo.lock update

* android progress

* progress on gcc build script

* remove windows binary dependencies from git, running just prepare-windows-build will re-create them

* check for .dll's in src-tauri/build.rs and give hint how to build them

* document new build requirement

* add verification to gcc build script and error message when building windows from os other than linux

* fix windows build

* add just command for building windows  ss

* fix script: remove sudo, copy dlls when finished

* move path setup to its own function

* fix

* try and fix ci

* extract setup to single action

* clean up ci

* add actions/checkout everywhere

* fix missing input prefix

* fix missing autoconf

* fix add build deps to env

* fix add build deps to env

* add deps for cross building windows

* fix action call

* only bundle dll's on windows

* use ubuntu-latest, install yarn, don't use swap

* add build dependencies, remove no longer existing docker test

* add aclocal to macos setup

* include macos build depends

* change platform -> host for setup-build-environment, use matrix for building binaries for all platforms

* fix: prepare build env for docker for ubuntu, don't get host value from matrix

* manually install rust target

* include openssl on ubuntu for sqlx

* build cargo cache once before building individual tests

* only manually install target if provided

* fix: don't need special syntax for variables in if condition

* fix libssl problem by upgrading sqlx cli

* fix: specify host for prepare_docker_tests

* a lot of fixes

---------

Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
Co-authored-by: einliterflasche <einliterflasche@pm.me>
Co-authored-by: binarybaron <you@example.com>
Co-authored-by: Raphael <81313171+Einliterflasche@users.noreply.github.com>
2025-08-27 16:45:59 +02:00
Mohan
a7823d7489
feat(gui): Monero wallet (#442)
* 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>
2025-07-18 15:08:36 +02:00
b-enedict
430a22fbf6
refactor(gui): Update MUI to v7 (#383)
* 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>
2025-06-06 22:31:33 +02:00
Mohan
c9d3536f36
fix(gui): Button to open data directory (#256) 2025-01-22 16:29:11 +01:00
binarybaron
765655bfb6 fix(tauri): Remove dialog::default capability 2024-11-07 21:57:56 +01:00
binarybaron
6c433041b7
feat(gui, tauri, ci): Auto updater (#105) 2024-10-17 14:56:04 +02:00
binarybaron
83f831ccac
feat(gui, tauri): Accept --testnet flag, default to mainnet (#106)
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
2024-10-10 14:51:56 +02:00
binarybaron
253e0b0cf6
feat(gui, tauri): Save settings in Tauri storage (#102)
- 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`.
2024-10-08 12:57:01 +02:00
Einliterflasche
ff2e3ae8dd
feat(gui): open links in default browser (#50) 2024-09-04 17:11:06 +02:00
Einliterflasche
ff1ded55ba
feat(gui): Clickable addresses to copy to clipboard (#38) 2024-08-29 14:28:23 +02:00
binarybaron
d54f5c6c77
refactor(tauri): Use macro and new Request trait for command generation 2024-08-26 15:26:21 +02:00
binarybaron
2e1b6f6b43
feat: swap history tauri connector 2024-08-08 12:02:59 +02:00
binarybaron
709a2820c4
feat: cargo project at root 2024-08-08 00:49:04 +02:00
binarybaron
f2d8d91584 feat: Prototype connecting between frontend and backend 2024-07-18 23:58:54 +02:00
binarybaron
bc188870af Initial commit 2024-07-06 21:34:33 +02:00