Original release notes
4.19.0
Minor Changes
- #21092
dd9fe60Thanks @tonykhaov! - Add the native Pay Request receive stack screen (close, QR, share, copy, verify).
- #20818
f9be984Thanks @beths-ledger! - Emitearn_transaction_completed/earn_transaction_failedfor native staking, from the account-bridge seam.
Every transaction route resolves its bridge through getAccountBridge, so wrapAccountBridge - which already hosts the sanctioned-address check - is the one place that sees them all. It now decorates signOperation (emitting a classified failure, then re-raising the original error untouched) and broadcast (success or classified failure). The device-action layer adds the one signal the bridge cannot see: closing the sign prompt is an unsubscribe rather than an error, so abandonment is reported from there.
This replaces UI-inferred bottom-of-funnel tracking for staking, where a user reaching the final screen was counted as converted whether or not a transaction ever landed. No analytics event is produced for non-staking transactions. The seam observes every sign and broadcast outcome, and the Segment mapping is what drops the ones with no derived staking action - so plain sends and swaps reach no analytics sink, and no currency allowlist is needed.
Desktop and mobile each register a Segment observer at startup; track already self-gates on analytics consent. Desktop also registers a dev-only console observer so the whole seam can be watched locally across every staking route and coin. The existing Datadog useBroadcast path is untouched.
- #20973
7d02f4bThanks @claudiiafg! - Fix mobile bottom sheets that could not be reopened after being closed.
- #21151
545e419Thanks @claudiiafg! - Fix the odd Add contact transition on Mobile by focusing the contact name field only once the drawer has finished opening, so the keyboard no longer resizes the dynamically sized drawer mid-animation. Adds an onOpened callback to QueuedBottomSheet and makes ContactNameInput focus reactively rather than only on mount.
- #21234
7fae8f5Thanks @claudiiafg! - Fix the keyboard flickering open and shut on the Mobile edit contact drawer, which focused its name field as soon as it mounted and so raised the keyboard into a drawer that was still animating. The field now waits for its drawer to settle before taking focus, as the add contact drawer already did, and focus is opt-in so no other drawer can raise the keyboard by accident.
Also give the add contact, edit contact and Send add new contact drawers the same keyboard clearance as the add address and edit address drawers, so every contact drawer leaves the same gap above the keyboard on iOS instead of sitting flush against it.
- #21164
a2be85cThanks @tonykhaov! - Wire Pay Request Verify on mobile (intro sheet, DIE address confirmation, tracking).
Share getAddressVerification (maps refuse / unsupported) in the platform intent package.
- #21156
5820213Thanks @vpenskyi-ledger! - Refactoraccount.requestcancel-navigation out ofuseUiHookand fix premature cancel in the inline add-account flow.
Refactor (LIVE-36323): Remove host-specific shouldGoBackOnCancelRef from useUiHook. Expose plain onAccountRequestCancel / onAccountRequestSuccess callbacks instead. Exchange and Buy host screens now own the one-shot dismiss rule directly (shouldGoBackRef in PTX/index.tsx), eliminating the goBackOnAccountRequestCancel booleanstringboolean round-trip through inputs.
Bug fix (flagged by Earn team): Since 6f1e402, closeDrawer fired onCancel immediately when the user tapped "Add Account" in the modular drawer, breaking Earn's inline add-account flow. Introduce hideModularDrawer - a Redux action that sets isOpen = false without clearing callbackId or cancelCallbackId. The navigate-to-device step uses this silent hide so account.request stays pending. The real cancel still fires via onCloseNavigation if the user abandons the device flow.
- #21243
2e92399Thanks @henri-ly! - Show the Contacts feature introduction in the new Send flow recipient step, for currency families eligible to the address book when the contacts feature flag is on and the user has not dismissed it yet.
- #21162
dff2a65Thanks @sarneijim! - Add missing Touchscreen Upgrade Program tracking for Backup Hub Recovery Key upsell and Lazy Onboarding Banner (LIVE-36494)
- #21098
0f71eebThanks @gre-ledger! - Upgrade rsbuild to 2.1.13, rspack to 2.1.10, and rslib to 0.23.2
- #21348
46f41d2Thanks @deepyjr! - Update the Contacts feature introduction image and English copy, and remove its description field from the shared contract.
- #21244
f4986f8Thanks @mcayuelas-ledger! - Show a host-provided Crypto card title on the Pay Card web and native views
- #21363
ce47443Thanks @liviuciulinaru! - Read CARD_API_URL and CARD_BAANX_CLIENT_KEY on every use, and not one time at boot. The debug settings can now change the Card tenant without a restart. The mobile app also applies its.envvalues before the store reads them.
- #20117
6780db0Thanks @shazzzam! - Celo: show a clear "temporarily unavailable" message when voting is blocked during on-chain epoch processing, instead of a generic "RPC request failed" error
- #21235
7ae6040Thanks @deepyjr! - Add explicit close controls to Contacts address entry forms on mobile.
- #21220
bb44e2cThanks @OlivierFreyssinet! - Move the Contacts device intent renderers into the apps.
@features/platform-contacts/device/intents now exports component-less IntentDefinitions. Each app owns its renderers under src/mvvm/features/Contacts/deviceIntents/, composes them into IntentPlatformDefinitions and injects them into useContactsIntentsOrchestrator, which no longer imports a production intent implementation.
A features/ package cannot resolve translations today, so a renderer that shows translated copy has to live in the app.
- #21128
31223ebThanks @OlivierFreyssinet! - Orchestrate Contacts device confirmations through the Device Intent Executor.
- #21236
c62986bThanks @OlivierFreyssinet! - Register an external address on the device from Contacts. The device intent now calls@ledgerhq/device-contacts-kit'sContactsManager.registerExternalAddress(), each failure gets its own JobState (app version too low, invalid input, device rejected, existing-group verification failed, unsupported operation, device error), and both apps render the confirmation step and oneInfoStateper failure. A rejection keeps the job open so the user can retry on the same device.
- #21185
cef29a0Thanks @OlivierFreyssinet! - Add shared Contacts kit wiring: version-requirement wrappers over@ledgerhq/device-contacts-kit, composed with each app's app-global floor into the Contacts device intents' minimum app-version floor.
- #21226
a2360f0Thanks @sarneijim! - Add QA device simulation dev tool in Debug > Configuration (LIVE-33169)
- #21222
fcdac1cThanks @gre-ledger! - Wire Env, Trustchain and Cloud Sync devtools into LLD and web-tools; wire Env devtool into LLM.
- #21142
a51303cThanks @dilaouid! - feat(send): add a contact from an address in the send flow on lwm
- #21089
803c2dbThanks @Valentin-Ledger! - Add earn/simulate deeplink to open the rewards simulator
- #21085
60c41bdThanks @deepyjr! - Fix Contacts address drawers so the confirm button stays visible above the keyboard on Android
- #21347
b3a86f5Thanks @mcayuelas-ledger! - Move Pay balance/action-tile copy resolution into @features/flow-pay-balance via @shared/i18n so hosts no longer pass translated labels.
- #21014
e1c2a4bThanks @mcayuelas-ledger! - Fix Pay tab bottom sheets so the filter opens expanded and deposit options stay fully visible
- #21117
1190ce1Thanks @Sebastien-Dav1d! - Declaresexpo-document-pickeras an optional peer dependency (and devDependency) in@devtools/feature-flags, removing it from regular dependencies. Adds it as a direct dependency inledger-live-mobileso autolinking resolves correctly on the native side.
- #21190
aafcdb7Thanks @vtaranushenko-ext-ledger! - Preserve transferId through the generic adapter for Casper

