- Prevent Android ARM32 startup crashes by generating
Intcarriers for direct unsigned 8-bit and 16-bit UniFFI returns while preserving Kotlin unsigned APIs.
- Drop the legacy
idx_onchain_idandidx_lightning_idunique indexes on activity init. Older releases created them when an activity id was globally unique, which contradicts thePRIMARY KEY (wallet_id, id)the activity tables now use and blocked storing the same on-chain id once per wallet scope, for example a transaction visible to both the Bitkit wallet and a watched hardware wallet.CREATE ... IF NOT EXISTSnever removed them from databases that already had them, so they are dropped unconditionally.
- Add
get_activities_tags(wallet_id: Option<String>)andget_pre_activity_metadata_list(wallet_id: Option<String>), wallet-scoped reads of the two tag-backup tables whereNonereturns every scope. Apps backing up a single wallet scope (for example atrezor:{hash}hardware wallet) can now name that scope in the call instead of fetching every scope and filtering client-side, so which records leave the device is visible in the FFI call. The unscopedget_all_activities_tags()andget_all_pre_activity_metadata()are unchanged and now delegate to the scoped versions.
- Add keep consumer rules for JNA types UniFFI needs under R8.
- Watch-only watcher events now include the synchronized next unused external address and full derivation path.
- Ship the initial Android R8 consumer keep rules for the UniFFI/JNA FFI surface.
- Preserve UR decoder scan progress across invalid frames.
- Reject signed PSBT previous-output metadata that differs from the original transaction.
- Enforce encoded UR frame-size bounds.
- Add a generic hardware-wallet catalog with Foundation Passport support, multipart UR QR encoding and decoding, Passport single-signature account export parsing, and signed PSBT finalization across the UniFFI bindings.
- Stop writing secrets and user data to stdout. Library logs go through the
logfacade.
- Add
serialized_extended_pubkeyfor canonical 78-byte BIP32 xpub/tpub payloads, exposed as SwiftDataand KotlinByteArray.
- Persist the submarine-swap refund destination so
boltzGetSwapandboltzListSwapsreturn it after completion.
- Validate Boltz create responses, claim and refund addresses, and fee rates before swapping.
- Keep a settled reverse swap pending until its claim txid is recorded locally, and retry those claims on the updates stream.
- Swap status updates now reconcile against Boltz's REST status whenever a swap is (re)subscribed, both on
boltz_start_swap_updatesand whenboltz_create_reverse_swapadds a swap to a running stream. A confirmed reverse-swap lockup is therefore caught up and auto-claimed even when its live WebSocket event was missed (for example because the updates stream was down while the lockup confirmed), instead of the swap silently stalling until a manual claim. No FFI signature change. - Add instant-claim and periodic reconcile for Boltz reverse swaps.
- Upgrade
trezor-connect-rsto 0.4.0.
- Add a Boltz module for submarine (onchain → Lightning) and reverse (Lightning → onchain) swaps behind the UniFFI surface.
- Add stable ELF build IDs to published Android libraries.
- Publish the Android library with NDK r28c and 16 KB page-size validation on the AAR publication path.
- Add
serialized_extended_pubkeyfor converting Base58Check BIP32 xpub/tpub values into their canonical 78-byte payload, exposed as SwiftData, KotlinByteArray, and Pythonbytes.
onchain_broadcast_raw_txnow returns the transaction's canonical txid, computed locally in Rust, and treats Electrum "already known / already in mempool / already in block chain" responses as success (returning that same txid). This lets native apps complete Blocktank funding bookkeeping when they retry a broadcast after an ambiguous network failure, without relying on a signer-provided txid. Genuine connectivity failures and unrelated broadcast rejections remain typedBroadcastErrors, and there is no FFI signature change.
- Add Core-owned backup migration for wallet-scoped activity data, covering the backup-JSON boundary so apps can inject a default wallet id on legacy records.
- Surface a locked Trezor during the THP handshake as the typed
TrezorError::DeviceBusyinstead of a generic connection error, so mobile clients back off and prompt the user to unlock rather than reconnecting in a loop. Backed bytrezor-connect-rs0.3.4, which classifiesDeviceLockedas a distinct, non-retryable state: it no longer churns the transport (close/reopen loop) on a locked device and instead makes a singletry_to_unlockhandshake attempt so the device prompts for unlock.
- Validate LNURL-pay amount.
- Serialized activity records always include
walletId.
- Add
get_supported_hardware_wallets()so apps render the supported-device catalog from core. - Improve LNURL-pay payment validation.
- Add
derive_wallet_id(device_type, xpubs)so platforms derive the same hardware watch-only wallet id. - Expose
get_default_gap_limit()as the shared BIP44 gap-limit default. - Watcher emits persistence-ready activities the app can store through the normal activity APIs.
- Surface wrong/cancelled/expected Trezor PIN failures as typed
TrezorErrorvariants (InvalidPin,PinCancelled,PinRequired) instead of generic device errors, so mobile clients can clear the PIN spinner, prompt a deliberate retry, and avoid reconnecting while the device is mid-flow. Backed bytrezor-connect-rs0.3.3, which maps protocolFailurecodes to typed errors; unknown failure codes remain genericTrezorError::DeviceError.
- Expose Trezor lock state through
TrezorFeatures.unlockedso mobile apps can distinguish PIN protection from the current locked/unlocked session state. - Add
trezor_refresh_features()as an explicit one-shot refresh for fresh Trezor feature state without background polling. - Surface busy Trezor transport state as
TrezorError::DeviceBusy, including structured native callback busy results, so mobile clients can back off while the device is busy or awaiting user action.