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.- 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.
- 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.