Back to Freedom.Tech Back
All Ledger Live Mobile releasesAll versions
Release Fri, Sep 11, 2026 6 min read

Ledger Live Mobile 4.20.0

Original release notes

4.20.0

Minor Changes

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)
  • #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.
  • #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.
  • #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.
  • #21277 37dde9f Thanks @sarneijim! - Log Segment identify calls (enqueued or failed) in the mobile analytics debug overlay
  • #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.
  • #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.

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