* fix android CI
* feat: add anypay core models, parser and routing engine
* feat: add anypay resolver, anypay service and wallet switch service
* refactor: route the send page payment flow through anypay service
* fix: show message when there's no swap providers for a pair and reset the trade guard on dismissal
* refactor: merge the swap from network and send to network decision pages together and clean up anypay widgets
* feat: reapply deep links to a currently open send flow and register the solana scheme
* feat: add support for zcash address detection to anypay and other minor fixes
* refactor: remove trailing icon
* feat: hide swap flow for sp and mweb addresses
* feat: enhance zcash address detection and deeplink handling
* fix: pin bitcoin_base
* refactor: Move the anypay decision navigation out of the send page and address minor review comments
* refactor: Move the anypay decision navigation out of the send page and address minor review comments
* feat: handle exception in switch service and mvoe balance compute to call site
* refactor: combine anypay entry points to one and extract selected mode widget
---------
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
* Randomize coin selection with single random draw
The greedy selection walked the unspent pool in a predictable order (address generation order, then per-address server order), a fingerprint an analyst can exploit. Shuffle the pool before the accumulate-until-covered loop so the input set is chosen non-deterministically (single random draw). MWEB coins are still kept last.
Branch-and-bound (changeless exact match) is a larger follow-up.
* Add BnB + SRD coin selection primitives
Pure, wallet-independent coin selector: branch-and-bound for an exact
changeless match within the cost-of-change window, single-random-draw
fallback (shuffled, injectable RNG) when no exact match exists, and
selectCoins tying them together over effective values.
This is the basis for replacing the greedy accumulation in _createUTXOS
so sends produce no change when possible and a non-deterministic
selection otherwise. Validated with dart test (9 cases); wiring into
_createUTXOS is a separate step.
* Use BnB changeless matching in coin selection
Before the shuffled greedy walk, run branch-and-bound over effective
values (value minus per-input fee cost) looking for an input set whose
excess over amount plus fee stays below dust. When found, order those
inputs first and cap the walk at their count: the caller then computes
a change below dust, drops the change output, and absorbs the residue
into the fee, producing a changeless transaction with no residual
change fingerprint.
When no match exists, selection falls back to the shuffled pool, which
the greedy walk turns into a single random draw. BnB is skipped for
sendAll, forced input counts and pools holding MWEB coins.
changelessMatch filters non-positive effective values and maps indices
back to the original pool.
* Cover changeless fee bounds and BnB termination
Assert the end-to-end arithmetic the wallet performs around a
branch-and-bound match: with the 68/34/10 vBytes model, the leftover
the caller absorbs into the fee is never negative (no re-selection
loop) and never exceeds the dust limit (bounded fee overpay).
Also pin termination: a large pool with no possible match returns null
through the maxTries cap instead of exploring the full search tree.
* Use a secure RNG for coin selection randomness
The selection shuffle and the single-random-draw fallback exist to be
unpredictable, so seed them from Random.secure() instead of the default
PRNG, matching what Core and bdk use for coin selection. Pool sizes are
small, so the cost is negligible. Tests keep injecting a seeded Random
for determinism.
* Randomize RBF and payjoin input candidate order
Two secondary paths still consumed unspentCoins in wallet scan order
(address generation order, then per-address age), the same predictable
order removed from the main selection path:
- replaceByFee walked the unused-UTXO list in scan order when the fee
bump needed extra inputs
- the payjoin receiver handed input candidates to the payjoin library
in scan order, letting ties inside its selection mirror that order
Shuffle both with a secure RNG so no input-selection path exposes the
wallet's address or coin age ordering.
* ci: skip Linux PR build on forks (no secrets access)
* Account for script-type sizes in changeless matching
* Keep coin selection order stable within a transaction build
* Set anti-fee-sniping locktime on bitcoin sends
Current tip (exact-tip) via shared helper, wired into normal sends (path A) and payjoin/PSBT (path B). 0 when unsynced. Converges with the exact-tip cluster (payjoin-cli, ldk-node, Bull Bitcoin) and skips the ~10% backdate.
* Update cw_bitcoin/lib/locktime.dart
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
* Update cw_bitcoin/lib/locktime.dart
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
* Update cw_bitcoin/lib/locktime.dart [skip ci]
---------
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* fix: sanitize Electrum fee estimates
* chore: drop test changes from this PR
Removes the test additions/modifications introduced by this branch so the
test design is left to the maintainers. Production code is unchanged.
* feat: show Bitcoin master fingerprint in wallet keys
Add the BIP-32 master fingerprint (XFP) to the Bitcoin wallet keys shown
under Settings > Seed & Keys > Keys, labeled "Master fingerprint".
* fix: keep xPub in Keys tab by splitting silent payment keys into a dedicated list
The Keys tab / Silent Payments tab split relied on a hardcoded item index
(`items.sublist(0, 4)` / `sublist(4)`) that assumed the first four items
were always WIF/private key/public key/xPub. Adding the master fingerprint
as the first item pushed xPub into the Silent Payments tab.
Route Bitcoin silent payment keys into their own `silentPaymentItems` list
instead, and render each tab from its list.
* Shuffle change output on hardware wallet sends
Hardware wallet BTC/LTC sends passed outputs to the PSBT/device in the
given order (change last), a position fingerprint. The outputOrdering
param was plumbed but ignored. Add orderOutputs() and apply it in both
buildHardwareWalletTransaction paths; set the send call site to shuffle.
Refs #3376 (the software send + RBF paths were covered by #3420).
* Shuffle change output on Bitcoin Cash sends
The BCH send path built via ForkedTransactionBuilder with
outputOrdering: none, leaving change deterministically last. The builder
shuffles natively and change is found by isChange, not position, so flip
it to shuffle (matches the BTC software path from #3420).
Refs #3376.
* Update cw_bitcoin/lib/electrum_wallet.dart
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
---------
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* v6.3.0 Release Candidate
- the new transaction history
- Radar in Apps screen
- Zcash update
- Flutter update
- Parts of the Refactor
should improve how amounts are handled in the app and fix any issue with amounts
improve handling sending to aliases
- Improvements for Cake Pay mobile
- Bug fixes
* don't use memo for note/message values
* save message in QR locally in the notes field
* Make stealth addresses generated from silent payment, not reliant on output index (#3420)
* - fix swaps showing only on primary account
- switch tron default node
- privacy fixes
* - enlarge destination tag and make it copiable
- migrate users on hashvault
- minor fix
* feat: add ExchangeRate class for currency conversion with tests
* docs: add detailed comments to ExchangeRate class
* refactor: rename `baseCurrency` to `base` in `ExchangeRate`
* auto-reformat
---------
Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* test add lint as separate action
* nicer logging
* only detect changes in dart files
* fix printV warnings being displayed when editing printV
---------
Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
* if input transactions are not all fetched correctly or had a failure, still parse the transaction correctly instead of skipping it
* handle nullable tx fee
* show warning for BTC txs with missing inputs
---------
Co-authored-by: Serhii <17529954+serhii-bor@users.noreply.github.com>
* feat: add `Money` class for precise currency handling and amount parsing
- Introduced `Money` class for handling money values with fixed-point precision.
- Added parsing and comparison methods to `CryptoCurrency` and `FiatCurrency` interfaces.
- Implemented `smartAmountSanitizer` for format normalization.
Includes extensive unit tests for validation.
* refactor: optimize Money class with new factories and string formatting improvements
* refactor: unify balance handling with `Money` refactor
* refactor: update `ElectrumBalance` and transaction logic to use `Money` for currency precision
* refactor: standardize balance handling with `Money` across `Monero`, `Wownero`, and `Zano` wallets
* refactor: migrate EVM balance and transaction handling to `Money` for consistent currency precision
* refactor: migrate Decred balance and transaction handling to `Money` for consistent currency precision
* refactor: migrate nano balance and transaction handling to `Money` for consistent currency precision
* refactor: migrate Solana balance and transaction logic to `Money` for precise currency handling
* refactor: migrate Tron balance and transaction handling to `Money` for consistent currency precision
* refactor: migrate Zcash balance and transaction handling to `Money` for consistent currency precision
* refactor: adjust lib to handle money
* refactor: remove legacy Decred amount formatting and migrate to `Money`
* refactor: migrate pending transaction amount and fee to `Money`
* refactor: migrate dEuro savings and transaction logic to `Money` for improved precision and consistency
* refactor: migrate Bitcoin and lightning transaction logic to `Money` for consistent currency precision
* refactor: migrate Wownero, EVM, Zano, and Zcash transaction logic to `Money` for consistent and precise currency handling
* refactor: standardize balance handling across wallets, migrate to `Money.zero` and refine `Balance` class for consistency
* refactor: migrate Solana transaction and wallet logic to `Money` for consistent and precise currency handling
* refactor: improve fiat balance and formatting for consistency on dashboard
* fix: fiat input mode switching and standardize crypto amount display logic
* fix: cw_evm generator
* refactor: migrate exchange amount handling to `Money` for improved precision and consistency
* test: remove redundant and commented-out tests, tidy test cases, and apply minor formatting adjustments
* fix using Money wrapper in BridgeViewModel and USDT0Service
* refactor: streamline `AmountConverter` and `LightningWallet`, add `cw_core` tests to GitHub workflow, and remove unused/deprecated logic
* refactor: enhance `changeReceiveAmount` with `isCanonical` support, improve null handling, and refine amount parsing logic
* minor fix
* try/catch the lightning log file error
* feat: add copy-to-clipboard functionality for transaction amounts, fix typo in trailing widget method name (#3219)
* Cw 1234 disallow sp and mweb addresses as refund for swaps (#3187)
* disallow SP and MWEB for swaps
* Simplify address selection in addressForExchange
Refactor addressForExchange method to simplify address selection logic.
* validate refund and receive address types
* localize address validation messages
* minor ui fix [skip ci]
* minor fix [skip ci]
* Revert "localize address validation messages"
* fix translations
---------
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* refactor: replace manual amount sanitization with `sanitized()` extension across the codebase, add unit tests for `AmountSanitizer`
* fix: correct `sanitized()` test expectations for decimal handling in `amount_sanitizer_test.dart`
* refactor: fee display logic and append currency symbol in `send_confirm_sheet.dart`
* refactor: simplify `ZcashBalance` class by replacing custom fields with inherited properties, update references accordingly
* refactor: replace hardcoded USDT contract address with `DefaultTronTokens` lookup, improve maintainability
* refactor: replace `currency` with `inputAmount.currency` in Solana transaction signing methods to avoid inconsistency
* fix: handle null `fee` in `electrum_transaction_info.dart` to prevent potential runtime errors
* refactor: replace raw fee and amount handling with `Money` object for improved consistency and maintainability
* fix: limit fiat balance display to 2 decimal places in `balance_view_model.dart`
* refactor: replace raw `amount` and `fee` types with `Money` in Solana transaction methods for consistency and precision
* refactor: replace raw `amount` and `fee` handling with `Money` and improve balance calculation consistency across view models
* refactor: replace raw balance strings with `Money` and simplify `UnconfirmedBalanceModal` widget logic
* refactor: replace `print` with `printV` for better logging, add equality and hashCode overrides to `ERC20Currency` for object comparison
* feat: prepare deuro savings migration
* feat: add V1 savings migration support and improve formatting consistency in DEuro view model
* feat: add V1 savings withdrawal support and update associated UI components and logic
* refactor: replace `Image.asset` with `CakeImageWidget`, update balance string handling, and streamline address validation logic
* refactor: use `Money.tryParse` with fallback to `Money.zero` in `NanoBalance.fromRawString` for safer balance parsing
* refactor: replace `ERC20Currency` with `Erc20Token` for consistency and remove unused `evm_erc20_currency.dart` file
* refactor: add computed `hasDepositAmount` for deposit null-checks, optimize balance handling in `zano_wallet`, update Breez SDK to v0.14.0, and implement equality/hashCode for `Currency`
* refactor: rename `amountSats` to `amount` in `PrepareLnurlPayRequest` for consistency
* revert: downgrade Breez SDK to v0.11.0 in `pubspec.yaml` and update relevant references in `pubspec.lock`
* fix: use `cryptoAmount.copyWith` for currency consistency and replace `Image.asset` with `CakeImageWidget` in swap address modal
* fix: ensure currency consistency by using `cryptoAmount.copyWith` in Solana and EVM wallet transactions
* refactor: simplify CSV row generation logic by removing `_splitAmountCurrency` and streamlining amount/fee handling
* fix: LateInitializationError Field 'sdk' has not been initialized
* fix: use `Money.tryParse` for safer parsing of deposit and receive amounts
* chore: remove debug print statement
* refactor: update transaction processing to consistently use `Money` for amounts and fees
* refactor: improve currency and amount handling, simplify logic, and enhance code readability in Send and Swap pages
* refactor: integrate `DecimalInputFormatter` for consistent decimal input across Send and Swap pages, simplify input handling logic
* fix: "fiatMode" per output on sendPage
* refactor: make transaction_details_height applicable more readable
* fix: use correct base unit for deposit
* refactor: use Money in estimateFakeSendAllTxAmount method
* fix decred frozen balance
minor fixes
* fix decred frozen balance
minor fixes
* fix: automatically switch to lightning if lnurl or invoice detected
* fix: getBolt11Amount test cases
* fix: standardise crypto amount formatting and display
* fix: use base unit for Tron transaction fee parsing
* refactor: hardcode fractional digits to 8 in `AmountParsingProxy` display methods
* refactor: ensure consistent 8-decimal precision for fee formatting in `PendingTransaction`
* fix: use `AmountParsingProxy` for available balance display in exchange view model
* fix: improve amount formatting and layout in swap and send confirmation sheets
* chore: remove redundant decimal truncation in balance view model and send confirmation sheet
* fix: allow for editing text field if it is filled with "ALL"
* fix: allow for editing text field if it is filled with "ALL"
* fix: update currency detection logic for lightning mode
* avoid potential infinite loop [skip ci]
* fix: getDisplayCryptoAmount
* fix: update estimated fee calculation
* chore: simplify fee calculation logic [skip-ci]
* fix value display in hidden mode
* fix stale state in send confirm sheet
* fix decimals for mweb
* fix available balance display for sol/trx on swap
* restore proper hint text
* fix swap receive amount calculation for xno
---------
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
Co-authored-by: Serhii <17529954+serhii-bor@users.noreply.github.com>
Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>
* fix(trezor): use PAYTOADDRESS script_type for external outputs
* Apply suggestion from @konstantinullrich
---------
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
Co-authored-by: Konstantin Ullrich <konstantin@cakewallet.com>
* refactor: improve locale parsing and normalization in localization generation script
* Remove chinese tranditional because it's breaking flutter
* delete retry in case of parallel save [skip ci]
* Improve translation
* linux fixes
fix: use ints instead of bools in SQLite to prevent crashes on linux
fix: disable lightning if it's unsupported
ui: start linux app in portrait mode instead of landscape so it looks
nicer
* minor cleanup
---------
Co-authored-by: Omar <omarh.ismail1@gmail.com>
Squashed migration of node Hive→SQLite, default-node handling,
isPow/proxy support, arbitrum node updates, and related fixes.
Replays node-sqlite-migration on top of current dev without the
amount-refactor merge that the original branch carried.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* v6.1.0 Release Candidate
* add copy indicator on tx details screen (#3152)
* initial remove wownero (#3180)
* fix: minor fix to the backupSeeds (#3181)
* add isSensitive to copy indicator (#3183)
* add copy indicator on tx details screen
* add isSensitive field
* fix: add "support for coin removed" to exception handler ignored list (#3182)
* CW-1273: Implement USDT0 Bridge (#2855)
* feat: Implement USDT0 Bridging using OFT Standard by Layer Zero. POC available in apps menu.
* feat: Implement USDT0 Bridging using OFT Standard by Layer Zero. POC available in apps menu.
* feat: Implement USDT0 Bridging using OFT Standard by Layer Zero. POC available in apps menu.
* Add transaction history and status polling for USDT0 bridging
* Add Transaction history and status polling for USDT0 Bridging
* USDT0 Bridging Implementation
* Update Arbitrum USDT token symbol
* fix: Merge conflicts
* fix: Merge conflicts
* chore: Rever formatting
* feat: Implement new flow
* feat: Implement new ui flow
* Add currency to configure
* feat: new ui flow
* Update USDT0 implementation
- Switch to sqlite for storage instead of hive
- Switch bridge history and details to modals
- Switch bridge transfer details page to new tx details ui
* refactor: rearrange modal action buttons
* enhance usdt0 bridge flows
* Update lib/entities/wallet_manager.dart [skip ci]
---------
Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
* v6.1.0 Release Candidate
* fix lag on saving frozen coin status (#3164)
* fix lag on saving frozen coin status
* wrap saveUnspentCoinInfo in @action
* revert fix + safeguard coin control page
* v6.1.0 Release Candidate
* v6.1.0 Release Candidate [skip ci]
* v6.1.0 Release Candidate [skip ci]
---------
Co-authored-by: malik1004x <malikowskirobert@gmail.com>
Co-authored-by: cyan <cyjan@mrcyjanek.net>
Co-authored-by: David Adegoke <64401859+Blazebrain@users.noreply.github.com>
* feat: use bitcoin standard derivation paths per address type
* add support for Electrum derivation type in wallet
* fix merge conflict
* Use segwit HD for key export and simplify _hdFor
* skip derivation chooser for standard scan paths
* add legacy and P2SH derivation paths
* fix: send all for lightning
* fix: adjust crypto amount parsing logic for send page outputs
* feat: add event handling for deposit transactions in Bitcoin and Lightning wallets
- Introduced `onCreateDepositTransactionEvent` and `onUpdateDepositTransactionEvent` callbacks to manage deposit transaction updates.
- Updated event listener logic to handle unclaimed and claimed deposit events.
- Added support for processing deposit transaction info with `ElectrumTransactionInfo`.
* fix: handle network errors on username validation and improve Lightning address setup
- Added network error handling for username validation with a fallback error.
- Enhanced Lightning address setup logic with error handling and a fail-safe mechanism to disable Lightning usage if the setup fails.
* fix: enhance error handling for Lightning and update validation patterns
* fix: remove redundant raw string mark from amount validation pattern
* fix: normalize crypto amount input by replacing commas with dots
* v6.0.2 Release candidate
* v6.0.2 Release candidate
* move btc ln up in the currency picker
* disable bsc for swapsxyz
* minor [skip ci]
* hide dex/rate selection on swap screen
* temp fix for evm tokens swaps icons until hive migration is done
* minor [skip ci]
* disable force dex providers for existing users and let them pick it from settings preference
* Show bitcoin address types in swap picker (#3096)
* Show bitcoin address types in swap picker
* remove wrong conversion to bolt11 [skip ci]
* feat: add Lightning invoice resolution and address normalization
* automatically select contact wallet address based on the selected swap currency (whether it's bitcoin or lightning)
* minor [skip ci]
* default to bolt11 invoice for lightning swaps
---------
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
---------
Co-authored-by: Konstantin Ullrich <konstantinullrich12@gmail.com>
Technically `0x1` will signal opt-in RBF (since 0x1 ≤ 0xFFFFFFFD); however it also sets a relative timelock of 1 block. This seems like an unintended bug. It also fingerprints cake wallet since `0x1` is an abnormal value. This is especially harmful in collaborative settings e.g payjoin. Most wallets set `nsequence = 0xFFFFFFFD` to opt into RBF or just use full rbf which seems to be gaining more adoption.