github LedgerHQ/ledger-live live-mobile@4.20.0

2 hours ago

4.20.0

Minor Changes

  • #21206 750bdd4 Thanks @RobinVncnt! - Add mobile E2E for the post-onboarding hub mock flow (LIVE-31323).

  • #21042 d5e1c7d Thanks @ooke-ledger! - Tell the two Hyperliquid account-picker states apart.

    The perps receiving step used one description for both states, so users who already had a Hyperliquid account were told to add one. It now reads "Select an account you want to deposit funds into to place your trades" when accounts exist, and keeps "To fund your perps, you need a Hyperliquid account.

  • #21515 7f4723c Thanks @sarneijim! - Bump Segment analytics SDKs for retry, rate-limit and security fixes (LIVE-35839)

  • #21237 db835f9 Thanks @vpenskyi-ledger! - Remove native navbar title on Select Quote page in Swap wallet40 header

  • #21355 fc74af8 Thanks @semeano! - Offer the Zcash memo only to shielded recipients. A memo travels in a shielded output, so a transparent recipient could never receive one, yet the send flow showed the input for every Zcash address and made the user fill or skip it. Send descriptors can now distinguish static memo support from recipient-specific visibility, and a memo left over from an earlier shielded recipient is dropped when the recipient turns transparent, so it can no longer reach the transaction builder.

  • #21421 3d23fd4 Thanks @tonykhaov! - Add a first-time verify hint on mobile Pay Request, persisted once dismissed.

  • #21434 b7f83a1 Thanks @tonykhaov! - Add persisted Pay Request verify-hint state in @features/flow-pay-request.

  • #21367 d182d46 Thanks @claudiiafg! - Fix the Ledger Sync entry point from Contacts: align the introduction copy and artwork with the production design, only show it when the user actually tries to add a contact or an address, start the flow on "Choose your sync method", and return to Contacts instead of the Portfolio once the flow is done on Mobile.

  • #21470 5b79eb3 Thanks @claudiiafg! - Fix the Contacts add address flow stalling on Continue by only offering networks the device can register an address on: EVM networks running their own coin app, such as Ethereum Classic, Sonic and Sei, are no longer selectable

  • #21431 c06bd2e Thanks @claudiiafg! - Fix the extra left padding on the address field of the Mobile add address and edit address drawers. Both screens render the address without the "To:" prefix, but Lumen's AddressInput mounts its prefix even when empty, so the prefix still took a slot in the field's inner gap and pushed the address 8px to the right. Add address now drops that gap and keeps the spacing only between the address and the trailing QR code icon, and edit address, which has no trailing icon, uses a plain TextInput instead.

  • #21543 eea933c Thanks @claudiiafg! - Fix the trash icon of the contact "Delete contact" action rendering white instead of red.

  • #21587 46b51dd Thanks @claudiiafg! - Fix the Contacts feature introduction so closing it counts as seen and keeps you on the Contacts list, instead of navigating back and reopening the introduction on the next visit.

  • #21592 9e0d7eb Thanks @koda-apps! - Fix misaligned "Maybe later" link on the notifications opt-in prompt drawer

  • #21393 406f56f Thanks @RobinVncnt! - Align the content card tag and dismiss cross with their desktop counterparts by using the Lumen UI Tag and InteractiveIcon components.

  • #21026 4f514c9 Thanks @LucasWerey! - Store a scrypt verifier instead of the password itself. Confirming a password now derives a digest and persists {version, scrypt, salt, digest} in the keychain, so nothing that can be replayed as a password is kept anywhere.

    The protection state lands with it: two independent flags plus a session lock, keyed off "any protection is enabled" rather than on having a password, which is the coupling that makes biometrics-only impossible today.

    Ordering is the safety argument throughout — the whole verifier is one keychain item, so an interrupted write leaves the previous verifier or none, never a half-written pairing, and the state flips only once the write has landed. Derivations are serialised: two concurrent setups would otherwise interleave and store a verifier whose salt belongs to the other run.

    The password field also gains a length cap. It sits far above anything anyone types, and exists because deriving a digest is deliberately slow.

  • #21746 c2e2276 Thanks @amaslakov! - Add the error message shown when the protocol refuses a Tezos stake amount as too small

  • #21401 8c40cc1 Thanks @claudiiafg! - Skip the extra confirmation modal when editing a contact or address name. Apply changes now starts the device action directly when needed, and the Apply CTA shows the Ledger logo in that case.

  • #21440 0089a4b Thanks @claudiiafg! - Drive Contacts add-address confirmation through the Device Intent Executor instead of mocked Continue screens, including prefill and Send entry points.

  • #21599 e601584 Thanks @LucasWerey! - Pin the Contacts feature introduction CTA to the bottom of the mobile sheet

  • #21277 37dde9f Thanks @sarneijim! - Log Segment identify calls (enqueued or failed) in the mobile analytics debug overlay

  • #21606 000eac0 Thanks @LucasWerey! - Fix missing 8px spacing between items in the mobile contacts list

  • #21526 4494817 Thanks @tonykhaov! - Open the contact address sheet from the Pay strip and continue to MAD with the chosen recipient.

  • #21418 60ee73c Thanks @liviuciulinaru! - Rename CARD_API_URL to CARD_BAANX_API_URL, keep the production defaults, and drop the Env vars section from the Card / Pay DevTool.

  • #21551 727b9e5 Thanks @mcayuelas-ledger! - Register and persist the card onboarding widget state in Ledger Wallet Mobile.

  • #21610 6b47659 Thanks @mcayuelas-ledger! - Add native card onboarding widget on mobile with Apple/Google Pay step and wallet persistence

  • #21619 23d2e1e Thanks @LucasWerey! - Keep mobile contact address detail action buttons full width by applying horizontal padding only to the summary.

  • #21248 9672658 Thanks @OlivierFreyssinet! - Edit an external address on the device from Contacts. The device intent now calls @ledgerhq/device-contacts-kit's ContactsManager.editExternalAddressIdentifier() and ContactsManager.editExternalAddressScope(), each returning the rotated address proof to persist while the group's name proof passes through untouched, and both apps render the confirmation step and one InfoState per failure.

    The device serves address and label edits as two separate commands, so an edit changing both asks the user to confirm twice, showing the same waiting screen for each step rather than numbering them. Nothing partial is ever stored: an abandoned or rejected edit leaves the record untouched, and a retry restarts the whole chain.

  • #21609 094e919 Thanks @LucasWerey! - Use the horizontal more icon on the mobile contact detail page

  • #21247 a55d4ca Thanks @OlivierFreyssinet! - Rename a contact on the device from Contacts. The device intent now calls @ledgerhq/device-contacts-kit's ContactsManager.renameContact(), which returns the rotated name proof to persist, and both apps render the confirmation step and one InfoState per failure. A rejection keeps the job open so the user can retry on the same device.

    Rename is a blockchain-agnostic dashboard operation, so it initializes on the dashboard (BOLOS) rather than a coin app: a contact with no address is renameable, and an outdated device surfaces as an OS-update screen instead of an app-update one.

  • #21351 51c44eb Thanks @OlivierFreyssinet! - Wire the contacts device intents in the remaining add address flows: adding an external address from the new send flow now goes through the Device Intent Executor instead of the mocked device intents port. The calling drawer closes so the executor can take the queue, and the add address flow closes as it hands the review over to the device

  • #21833 8993c24 Thanks @koda-apps! - Fix walletsync feature flags (lldWalletSync, llmWalletSync) to default to the PROD environment instead of STAGING.

  • #21490 c5dfbed Thanks @dilaouid! - fix(send): picking a contact on the recipient step now goes straight to the amount step, matching desktop

  • #21487 b7d0367 Thanks @gre-ledger! - Drop disableCountervalue from CryptoCurrency. Nothing read it on a crypto currency; it stays on TokenCurrency, where the assets API drives it, and on FiatCurrency.

  • #21492 f8dc454 Thanks @YazhuEth! - Add a provider-row-<name> testID to the Cosmos family validator row so automation can select a validator explicitly, which Osmosis now requires since it has no pre-selected Ledger validator

  • #21223 e92cf97 Thanks @vtaranushenko-ext-ledger! - Route Casper through the generic coin-framework bridge (LIVE-35912/35914/35915).

    • coin-casper: createApi() now returns a CoinModuleImpl (dropping the throwing stubs for unsupported capabilities; withDefaults fills them). craftTransactionData delegates to the framework helper. getTransferIdFromMemo bridges the legacy StringMemo<"transferId"> shape and the new {type:"transferId"} framework shape until LIVE-35735 unifies them.
    • live-common: Casper added to genericCoinFrameworkFamilies.json; LiveConfig key config_casper_generic_bridge (default true) provides a runtime kill-switch to fall back to the legacy bridge without a deploy.
    • Desktop/Mobile: useTransferIdChange hook extracted and shared between MemoField / TransferIdField / MemoTagInput / ScreenEditTransferId; now writes both transferId (legacy bridge) and memoType/memoValue (generic path) so both bridges read the same user input correctly.
  • #21135 2566c81 Thanks @jiyuzhuang! - Consolidate mobile Braze Content Card refreshes under one lifecycle provider

  • #21513 9dd7db0 Thanks @mcayuelas-ledger! - Add a Pay success screen to the Send flow. When the flow is launched from the Pay tab and the transaction succeeds, it now routes to a dedicated PAY_SUCCESS step that shows the recipient, amount, source account (with network icon) and a link to the transaction details, instead of the standard confirmation step. Exposes a presentational PaySuccess component from @features/flow-pay-contact and wires it in ledger-live-desktop via an MVVM PaySuccessScreen + usePaySuccessViewModel.

  • #21372 961792b Thanks @mcayuelas-ledger! - Gate the Pay tab contacts section behind the contacts feature flag (lwdContacts on desktop, lwmContacts on mobile)

  • #21332 08201e0 Thanks @dilaouid! - feat(send): open the MAD for the new send flow on LWM

  • #21806 04445dc Thanks @henri-ly! - Add missing changeset for Aleo bugfix LIVE-37189

  • #21305 7aca4c8 Thanks @mdomanski-ext-ledger! - refactor: drop the Hedera preload layer now that no consumer reads it, and fold useHederaEnrichedDelegationV2 back into useHederaEnrichedDelegation

  • #21304 17862f6 Thanks @mdomanski-ext-ledger! - refactor: read Hedera staking validators through an on-demand query on mobile, with loading and fetch-error states

  • #21358 6561cf0 Thanks @mdomanski-ext-ledger! - refactor: serve the Hedera validators list from an RTK Query api instead of React Query

  • #21528 2744267 Thanks @tonykhaov! - Open Pay New on a dedicated contact list, including people with no address.

  • #21616 5e971b5 Thanks @gre-ledger! - Migrate BIG_NUMBER_DECIMAL_PLACES off @ledgerhq/live-env: every call site now inlines the constant and the definition is removed. @ledgerhq/live-currency-format drops its @ledgerhq/live-env dependency altogether.

  • #21557 0122aa8 Thanks @tonykhaov! - Title the pay-contact MAD account step “Select account to pay from”.

  • #21474 54351c2 Thanks @claudiiafg! - Group unavailable assets and networks under a "Not available yet" section in the asset and network selection lists

  • #21636 d3b658b Thanks @mcayuelas-ledger! - add freeze to mobile

  • #21483 a35c7b9 Thanks @dilaouid! - fix(send): the send recipient AddressInput taking then losing the keyboard,it now only focuses once the step shows nothing at all, not when contacts are in the list

  • #21345 07410d0 Thanks @cted-ledger! - Add MINA staking (delegation) support to Ledger Live Mobile

  • #21283 761cf3e Thanks @lpaquet-ledger! - add earn banner to success transation modal

  • #21359 36ea18d Thanks @tonykhaov! - Route the Noah webview to signup or signin when noahAuth is set (LIVE-35383).

  • #21450 4bc8559 Thanks @sarneijim! - Make the notifications prompt debug screen QA-readable with named scenarios, plain-English verdicts and an in-place drawer preview (LIVE-35955)

  • #21298 91bae2a Thanks @tonykhaov! - Present the Pay cash-to-stable intro as a mobile bottom sheet, then hand off create/login to Noah (LIVE-35382).

  • #21428 c3de11c Thanks @liviuciulinaru! - Show a Card login intro sheet on the first press of the card's action (LIVE-36793). The sheet has two
    buttons. "Log in to Baanx" runs the OAuth2 hosted login. "Create an account" opens the provider's
    own signup page, /onboarding/signup on the new CARD_BAANX_HOSTED_UI host, in the same browser. The
    intro shows once: a new persisted payCardLoginIntro flag goes up when a login the card holder just
    started reaches ready, and it survives an app restart inside the shared payCard blob. A hydrated
    session raises nothing. A tester resets the flag from the Pay Card devtool, and the intro shows again
    on the next press.

    The same flag now picks what the login block says, from the app's new payTab.cardLogin.* keys. It
    sells the card while the flag is down — "Get 1% cashback every time you spend" under a Get card
    button that opens the intro — and offers a login once the flag is up: "Log in to access your card"
    under a Login button that starts one. Its title is Crypto Card, and on mobile it is a Lumen
    Subheader under the card face, so the Pay Card flow no longer draws a section title above it there.
    Desktop keeps its host-provided title.

    The virtual card row names one wallet only: Apple Pay on iOS, Google Pay on Android. Desktop cannot
    see the phone the card will be added to, so it keeps naming both. Each row wraps its title and its
    description over as many lines as the copy needs, instead of cutting both off at the first.

    Hosts inject onTrackEvent. Get card, Login, the intro buttons and close fire button_clicked;
    opening the intro also fires Page card login intro.

    CARD_BAANX_HOSTED_UI defaults to https://ledger-ew1uat.baanxapi.com. Both apps read it with
    useEnv and hand it to the flow as oauthConfig.hostedUiUrl, so a new value moves the signup page
    to another tenant without a restart.

  • #21426 3de7317 Thanks @liviuciulinaru! - Replace the Card logout block with a More tile-button (CardMore). The tile opens the More sheet, and the sheet's Logout row ends the Card session.

  • #21438 8dd19d9 Thanks @mcayuelas-ledger! - Move Pay contact copy resolution into @features/flow-pay-contact via @shared/i18n so hosts no longer pass translated labels.

  • #21397 2fe4ef6 Thanks @mcayuelas-ledger! - Wire Pay contact tile press to send (prefill a single-address contact), add a desktop View contact overflow action, and render Lumen MenuTrigger render props in the shared web passthrough stub.

  • #21564 c92234c Thanks @tonykhaov! - Open Pay see-all on the Pay contact list (Me, A–Z, add) instead of MyWallet Contacts

  • #21380 59ea8fb Thanks @francois-guerin-ledger! - chore(cosmos): remove Ledger validator as the default one for Osmosis

  • #21496 9e93f16 Thanks @dilaouid! - feat(tracking): add tracking contact send flow lwm

  • #21854 6ad68ad Thanks @francois-guerin-ledger! - chore(llc): update Arc mainnet native contract address

  • #21353 f3de6fb Thanks @jeportie! - Clean up mobile E2E Allure after-hook attachments: filter network noise, failure-only feature flags, warn/error-only console logs, aligned attachment names

  • #21555 a83aff5 Thanks @tonykhaov! - Open Send recipient from the amount header instead of leaving to Pay.

  • #21240 1cb4dbe Thanks @YazhuEth! - Persist Solana stakingResources through the generic coin framework, and revive accounts still holding the legacy solanaResources blob

  • #21605 39115cb Thanks @gre-ledger! - Fix app crash on the first APDU exchange over USB HID in minified Android builds

  • #21194 2bd6a1c Thanks @liviuciulinaru! - Refresh Baanx Pay Card sessions after a 401, and keep the credentials out of every reader of redux.

    The two OAuth2 grants are RTK Query endpoints again. Both opt out of the Bearer and out of the
    renewal, both run with track: false, so no session becomes a cache entry, and neither has a hook.

    The desktop redux logger and both DevTools configurations now strip every Card action, which also
    closes a live leak: the code exchange logs its code and its code verifier in production, into the
    file users attach to a support ticket.

  • #21373 d54d191 Thanks @tonykhaov! - Update the Pay feature tour copy, icons, and hero to match mockups (LIVE-36497).

  • #21522 64a7c3c Thanks @tonykhaov! - Open the contact address sheet from Send recipient.

  • #21527 f7fad4d Thanks @tonykhaov! - Open the contact address sheet from Pay see-all with the title Pay contact.

  • #21430 5b546c5 Thanks @claudiiafg! - Remove unused PrefillAddAddressFlowRoot and the shared prefill listener store. Send now owns the prefilled add-address session via startWithPrefilled.

  • #21439 90ba96b Thanks @semeano! - Add missing label for transaction inputs

  • #21650 349c522 Thanks @lysyi3m! - Add an error message for UnexpectedGetBalanceError

    @ledgerhq/coin-tezos reports this error when a token balance cannot be retrieved, so Send Max
    no longer claims the account has insufficient funds during an indexer outage. Without a
    translation the send flow fell back to rendering the raw error name.

  • #21392 2df85eb Thanks @dilaouid! - feat(send): add skip memo screen in the send flow

  • #21645 cf71736 Thanks @henri-ly! - fix(send): stop reading the send-flow contexts from SigningBody

    SigningBody renders inside the signature bottom sheet, whose children are mounted by a portal at
    the app root — outside SendFlowProvider. Reading the send-flow contexts from there threw
    useSendFlowData must be used within a SendFlowProvider and crashed the app on the device-signing
    step. The tracking properties and the recipient type are now passed down from
    SignatureDeviceActionView, which sits in the send-flow tree.

  • #21326 9fb98ab Thanks @aussedatlo! - Drive the XRP app through the Device Management Kit behind the ldmkXrpSigner feature flag, keeping hw-app-xrp as the fallback

Patch Changes

  • Updated dependencies [7c6a8de, 8f8f1a4, 81aa729, 3d23fd4, b7f83a1, c270975, d182d46, 5b79eb3, c06bd2e, eea933c, 3b0dbae, 4f514c9, 47a1cd0, 8c40cc1, 0089a4b, e601584, 000eac0, 60ee73c, ef29f07, 55bd216, 6ed1820, 6b47659, b1b1e38, 3a78322, 2b8a4e4, 92b90a6, 23d2e1e, 9672658, a55d4ca, 147a290, 6ccfc64, 8993c24, 52f573c, 2d42e64, b7d0367, e42c12a, eb62268, bed4fe7, a9e389f, e92cf97, 5f6b8a8, 9dd7db0, 5b7d11d, ebb1371, 53dcdc9, 2744267, 5e971b5, b7a8906, 5db7a7d, 761cf3e, 36ea18d, ac0311e, 91bae2a, 08ee05c, d6b290b, 0a02a32, 66c7569, 543b17d, a7d54c0, c3de11c, 3de7317, d60ce38, 7aa3071, faa8ef1, 8dd19d9, 2fe4ef6, 80b27a1, 59ea8fb, 3ea6abc, a6193dc, 30619aa, 08ae9c2, 2bd6a1c, d54d191, 5b546c5, 54124e4, a19ffef, 0152cad, 9fb98ab, 018ee9b]:
    • @ledgerhq/transaction-observability@0.3.0
    • @features/flow-pay-contact@0.3.0
    • @devtools/bindings@0.7.0
    • @features/flow-pay-request@0.4.0
    • @features/flow-contacts-introduction@1.1.0
    • @features/flow-contacts@0.10.0
    • @features/platform-contacts@0.6.0
    • @features/flow-contacts-add-address@0.4.0
    • @features/flow-contacts-edit-address@0.3.0
    • @features/platform-app-lock@0.3.0
    • @features/flow-app-lock@0.3.0
    • @ledgerhq/coin-concordium@1.2.0
    • @features/flow-contacts-edit-contact@0.4.0
    • @features/flow-contacts-list@0.6.0
    • @shared/env@0.6.0
    • @shared/api-services@0.7.0
    • @domain/api-card-management@0.5.0
    • @features/flow-pay-card@0.3.0
    • @features/flow-pay-card-widget@0.2.0
    • @ledgerhq/coin-cosmos@1.2.0
    • @shared/feature-flags@0.22.0
    • @domain/entity-currency-crypto@0.12.0
    • @ledgerhq/types-live@6.123.0
    • @ledgerhq/ledger-wallet-framework@3.3.0
    • @domain/api-aggregated-assets@0.5.0
    • @ledgerhq/live-countervalues@0.25.0
    • @ledgerhq/live-countervalues-react@0.17.0
    • @ledgerhq/coin-casper@3.3.0
    • @features/platform-currencies@0.8.0
    • @ledgerhq/wallet-analytics@0.4.0
    • @ledgerhq/live-currency-format@0.15.0
    • @features/platform-env@0.3.0
    • @ledgerhq/hw-ledger-key-ring-protocol@0.12.0
    • @features/flow-pay-bank-transfer@0.3.0
    • @features/flow-pay-card-auth@0.6.0
    • @shared/ui-queued-bottom-sheet@0.3.0
    • @features/platform-card@0.4.0
    • @features/flow-pay-feature-tour@0.5.0
    • @ledgerhq/coin-bitcoin@0.52.0
    • @features/flow-contacts-add-contact@0.5.1
    • @features/flow-contacts-delete-contact@0.2.1
    • @features/flow-pay-balance@0.4.1
    • @features/flow-pay-deposit@0.3.1
    • @features/platform-device-action-content@0.2.0
    • @features/platform-aggregated-assets@0.5.2
    • @ledgerhq/ledger-key-ring-protocol@0.21.2
    • @ledgerhq/live-dmk-mobile@0.29.7
    • @ledgerhq/live-dmk-speculos@0.10.8
    • @ledgerhq/wallet-pnl@0.7.10
    • @domain/api-altcoins-sentiment@0.3.5
    • @domain/api-currency-fiat@0.4.4
    • @domain/api-currency-token@0.6.1
    • @domain/api-market-sentiment@0.3.5
    • @domain/api-push-devices@0.2.5
    • @features/flow-large-screen-upsell@2.0.2
    • @features/platform-feature-flags@0.6.9
    • @domain/entity-contact@0.8.2
    • @domain/entity-currency@0.4.3
    • @domain/entity-currency-token@0.5.2
    • @ledgerhq/live-wallet@1.1.2
    • @ledgerhq/coin-canton@1.1.1
    • @ledgerhq/coin-filecoin@2.1.1
    • @ledgerhq/coin-multiversx@1.1.1
    • @ledgerhq/coin-stacks@0.30.1
    • @ledgerhq/device-core@0.11.15
    • @ledgerhq/domain-service@1.8.18
    • @ledgerhq/live-signer-evm@0.23.1
    • @shared/ui-info-state@0.2.1
    • @shared/auth@0.6.0
    • @shared/cloud-sync@0.3.0
    • @shared/i18n@0.2.0
    • @shared/password-verifier@0.3.0
    • @devtools/shell@0.9.2
    • @features/flow-analytics-consent@0.2.5

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.