github LedgerHQ/ledger-live live-mobile@4.18.0

6 hours ago

4.18.0

Minor Changes

  • #20911 4014093 Thanks @claudiiafg! - Expose useOpenPrefillAddAddressFlow and mount PrefillAddAddressFlowRoot on Desktop and Mobile so consumers such as Send can open the prefilled Add Address flow without depending on Contacts internals.

  • #21025 de982e6 Thanks @claudiiafg! - Fix Contacts edit flow so the device connection prompt appears after saving a contact name or address, not before opening the edit form.

  • #20874 1d6c394 Thanks @jiyuzhuang! - Warn Backup Hub Recovery Key for Nano S, SP and X and open the upgrade landing page

  • #20727 53938d6 Thanks @dilaouid! - feat(lwdm): add the contact avatar component in the new send flow

  • #20847 197acad Thanks @LucasWerey! - Add the two app lock packages the User App Authentication tickets build on: @shared/password-verifier (the verifier record and its constant-time comparison) and @features/platform-app-lock (protection state schemas, biometrics status unions and errors).

    No functional change to Ledger Wallet Mobile: react-native-keychain now resolves through the pnpm catalog instead of a direct pin, so the app and @features/platform-app-lock cannot drift apart. It still resolves to 10.0.0.

  • #20988 5bd3557 Thanks @LucasWerey! - Add the two-step form for setting an app lock password, behind lwmPasswordRevamp. The legacy screens stay on the flag-off path untouched.

    @features/flow-app-lock gains one shared password field that every password surface will use, the two entry steps as ViewModel and View, and a draft that carries the chosen password from the first step to the second in memory — not through navigation state, which is serialisable and gets persisted. @features/platform-app-lock gains the minimum-length rule, which the migration off short passwords will need as well.

    Nothing is stored yet: confirming closes the flow and leaves the Settings switch off until the verifier lands.

  • #21165 e903cf0 Thanks @sarneijim! - Add missing Touchscreen Upgrade Program tracking for Backup Hub Recovery Key upsell and Lazy Onboarding Banner (LIVE-36494)

  • #20993 2a4b4b1 Thanks @YazhuEth! - Move Aptos and crypto_org account migrations out of DataModel into app-level accountModel

  • #20810 bb045d8 Thanks @liviuciulinaru! - Complete the Pay Card login from the Baanx redirect (LIVE-34742)

    An XState 5 machine now owns the journey: it mints and stores the PKCE attempt, starts the
    authorization, opens the OS browser, compares the state on the redirect, exchanges the code, stores
    the session, and reads GET /v1/user into the RTK Query cache. On mobile the redirect arrives either
    from the browser session or from the ledgerlive://paytab?code=…&state=… deep link, and the first one
    wins. CardLogin shows the login action only when there is something to log in to, and renders nothing
    once the user is signed in.

  • #20899 5a30d71 Thanks @deepyjr! - Allow Contacts address groups to be resolved from a contact ID.

  • #20917 f427599 Thanks @deepyjr! - Allow numbers in contact names and hide add-contact actions when a Contacts search has no results.

  • #21023 dcd5af5 Thanks @deepyjr! - Animate transitions between Contacts add-address flow steps.

  • #20991 3bea41d Thanks @jeportie! - Assert the mobile Buy/Sell handoff instead of the partner's checkout page, matching what
    e2e/desktop already does. The app records the WebPTXPlayer handoff URL in a
    Config.DETOX-guarded store and exposes it over the e2e bridge as getPtxHandoff, so the
    specs verify the provider and query parameters without ever loading Transak's or MoonPay's
    site — removing a dependency on a third party's uptime, and the ~70s per test spent waiting
    on it. Parsing lives in libs/live-e2e-shared/src/buySellHandoff.ts and handles the
    double-encoded URL that made new URL() throw, plus provider aliases such as Mercuryo's
    mrcr. Also fixes the sell flow asserting a minimum amount the flow never types, since it
    taps the 75% button, and makes the "Buy and sell query parameters" test actually assert
    query parameters.

  • #20934 d8c04dd Thanks @deepyjr! - Fix Contacts entry point styling and return navigation to Ledger Wallet addresses.

  • #20659 d6623e5 Thanks @koda-apps! - Fix post-onboarding hub drawer height to follow its content

  • #20966 9470502 Thanks @OlivierFreyssinet! - Scaffold Contacts Device Intent Executor contracts and colocate platform definitions

  • #20809 e732d3e Thanks @liviuciulinaru! - Keep the Pay Card session in OS secure storage (LIVE-34742)

    cardSession now stores the whole session — both tokens and both lifetimes — through
    react-native-keychain on native, and through renderer memory on web and desktop. The app already
    uses that library for the app password, so the session needs no second secure-storage package.

    Each key is a keychain service of its own, and the access token sits alone in one of them, so the
    base query reads one small value per request. AFTER_FIRST_UNLOCK on iOS and AES_GCM_NO_AUTH on
    Android state the same rule: no prompt, and a value a background launch can read, but nothing before
    the first unlock after boot.

    cardSession.get reads all three keys, so it waits its turn behind a write. A login over a live
    session replaces the two cold keys before the access token, and a read between the two would report
    the previous access token with the new refresh token.

  • #20872 d4bb463 Thanks @deepyjr! - Fix Contact sharing and align empty address copy

  • #20891 97f35b3 Thanks @claudiiafg! - Enable editing a saved contact address value on mobile with validation and analytics.

  • #21018 903e0da Thanks @ishaba! - fix(canton): fix kiln validator name typo in setup copy

  • #20992 4fc5ef0 Thanks @jeportie! - Record fetch traffic in the e2e network log alongside axios, so RTK Query — and therefore
    every CAL token lookup — is no longer invisible in CI artifacts, and attach a per-host
    summary with peak concurrency so a fan-out is legible without reading several hundred
    entries. Query strings, fragments and any user:pass@ userinfo are stripped before a URL is
    recorded, and no bodies or headers are captured.

  • #20887 aa39333 Thanks @fAnselmi-Ledger! - Add Solana TXC flag

  • #20776 14b6b12 Thanks @cunhabruno! - Fix the receive verify-address drawer becoming unusable a few seconds after opening on Android

    The drawer opened correctly, then snapped back off-screen after 3-4 seconds and left an opaque backdrop with nothing tappable. It prevents backdrop dismissal, so the only way out was to force-quit the app mid receive flow.

    useAnimatedStyle only writes its initial value into the Fabric shadow tree, which still held the closed position while the drawer was open. Any commit outside Reanimated's commit hook re-applied it, and nothing wrote the transform again because the open animation had long finished. The resting position is now mirrored in React state and declared after the animated style, so such a commit settles on open. The same applies to the backdrop opacity and to the security modal's scroll view height, which collapsed to zero for the same reason.

  • #21036 c98a1b9 Thanks @vpenskyi-ledger! - Fix: sell quotes now correctly shown when returning from a provider via "Back to quote". Previously, BuySellUI defaulted to buy mode because the stored flow name was not passed back during navigation. Desktop also removed a hardcoded || "buy" fallback when saving the flow name to localStorage.

  • #21063 c566744 Thanks @deepyjr! - Persist Contacts locally and synchronize them through Ledger Sync.

  • #21014 e1c2a4b Thanks @mcayuelas-ledger! - Fix Pay tab bottom sheets so the filter opens expanded and deposit options stay fully visible

  • #21001 c0bdd70 Thanks @KVNLS! - Prevent keypair generation at each startup and remove zod valdiation which is coslty at startup

  • #21044 b2a2e9e Thanks @dilaouid! - feat(send): search by contact name as recipient in the send

  • #20782 6c425e0 Thanks @shazzzam! - Surface ICP neuron staking entry points on mobile: Stake and Manage Neurons account-header actions,
    gated behind the new llmIcpStaking feature flag. The StakingFlow and NeuronManageFlow navigators
    are registered as stubs and their screens land separately.

  • #20730 eccbacf Thanks @claudiiafg! - Wire Mobile Contacts scenario entry points to the shared analytics contract.

  • #20513 e80c178 Thanks @vpenskyi-ledger! - Fix infinite loader on Exchange when closing account selection drawer with no accounts

  • #20799 585d8d7 Thanks @ishaba! - Migrate Tron to the generic coin framework (LIVE-34994).

    Adds a per-family pending-operation extra to the generic framework: OptimisticOperationDescriptor gains an optional extra bag and describeOptimisticOperation receives the transaction it describes, with framework-reserved keys stripped so a family cannot shadow them.

  • #21116 6bf8331 Thanks @RobinVncnt! - Stack the LNS upsell banner above the hardware carousel instead of squeezing it into a tile slot, share a carousel with action cards only on mobile, and stop the Content Cards QA console from collapsing every Top wallet preset into the "alwayson" category

  • #20996 d6c7592 Thanks @CremaFR! - Forward the llmWalletApiDeviceIntentSign assignment to the swap live app on mobile as llmWalletApiDeviceIntentSignVariant (the variantId) and llmWalletApiDeviceIntentSignEnabled (the flag state). Resolve that per manifest through useDeviceIntentSignAssignment, which also backs the Wallet API UI hook. Report both attributes on Mixpanel via getRemoteABTestingAttributes.

  • #20669 f7e5005 Thanks @YazhuEth! - feat(lwd): display the contact name and avatar in the send header

    The Amount step now shows the matched contact instead of the truncated address, using the shared ContactAvatar. The Recipient card moves to the same component, so both steps render the same colour and initials.

  • #21041 f056cfc Thanks @Moustafa-Koterba! - fix(solana): make default validator option for delegation summary

  • #20593 d5ea888 Thanks @liviuciulinaru! - Start the Baanx login with a PKCE challenge and a CSRF state (LIVE-34738)

    Pressing Login now mints a login attempt client-side — a 16-byte state and a 32-byte PKCE verifier,
    with code_challenge = BASE64URL(SHA256(verifier)) — and sends it to
    GET /v1/auth/oauth/authorize/initiate, whose url answer is opened in the platform
    secure browser as before. The randomness comes from the platform CSPRNG on each side: expo-crypto
    on mobile, WebCrypto on desktop.

    The redirect URI now reaches the secure browser too, since that is what ends the session:
    ASWebAuthenticationSession matches the callback against it, and so does the Android polyfill. The
    opener only opens the URL; the redirect goes back to the app, so the browser result is not read and
    closing the browser shows no error — a cancelled login is not a failed one.

    The initiation carries mode=api. Without it the endpoint answers 302 and redirects to the hosted
    UI, which a fetch follows into an HTML page; api returns the same URL as JSON instead. That answer
    also carries the JWT of Baanx's programmatic flow, which the hosted UI does not need, so the schema
    drops it instead of parking a short-lived credential in the cache.

    The request goes through useInitiateAuthorizeMutation from @domain/api-card-management, which owns
    the Card Auth contract and injects it into the shared cardApi service. Every endpoint there is
    declarative — query, rawResponseSchema, transformResponse, responseSchema — so the wire shape
    is validated at the boundary and mapped in one place. cardApiExtra keeps only what the base query
    needs: the base URL, the Baanx client key for the x-client-key header, and the session accessors.

    The OAuth client id and redirect URI are the app's, so they reach CardLogin as an oauthConfig
    prop: one value goes to the initiation and to the secure browser, and the token exchange will send it
    again. Baanx uses the same value for the client key and the OAuth client_id, and the provider matches
    ledgerlive://paytab verbatim on the token exchange. Each platform container opens the returned URL
    itself, and no host-provided opener is needed. The Baanx secret key stays server-side and is never
    sent from the apps.

    The challenge is spent on the initiation, and nothing keeps the attempt afterwards. Completing the
    callback — holding the state and the verifier, verifying the state, exchanging the code for
    tokens and storing them in expo-secure-store — is the remainder of LIVE-34738 and is not part of
    this change.

  • #21012 5e1aa3e Thanks @mcayuelas-ledger! - Fix the Pay tab "Add stablecoin" receive flow on mobile to list the full stablecoin catalog by filtering the Modular Asset Drawer on the stablecoin category, instead of pre-selecting only the two default stablecoins (USDC/USDT)

  • #20983 eba4d17 Thanks @liviuciulinaru! - Open the Baanx authorize page directly, and drop the CSRF state (LIVE-36301)

    The login no longer asks the backend where to send the user. It builds the authorize URL itself and
    opens the secure browser on it, and the provider hosts the page and owns the redirect. That removes a
    network call, a machine state and one way a login could fail.

    GET {CARD_API_URL}/v1/auth/oauth2/authorize
      ?client_id=…&response_type=code
      &scope=openid profile email offline_access
      &redirect_uri=…&code_challenge=…&code_challenge_method=S256&prompt=consent
    

    The attempt is now a PKCE pair alone. The redirect carries code, and the state that used to travel
    with it is gone, because PKCE already ties the code to the verifier on disk: the provider issues the
    code against this attempt's challenge, so no other attempt can exchange it. Both token grants move to
    /v1/auth/oauth2/token, and neither repeats redirect_uri there: Baanx's contract for that endpoint
    takes only grant_type, code, and code_verifier.

    oauthConfig gains apiUrl, which is the host the authorize page lives on.

    prepareAttempt builds the authorize URL, rather than the transition that follows it. The URL builder
    throws on a misconfigured apiUrl, and a throw inside an action stops the machine instead of reaching
    a transition. From the actor it lands on onError, which wipes the stored attempt and reports a
    failure the user can retry.

    A live exchange against Baanx's UAT environment answered with no refresh_token_expires_in, which
    PayCardSessionResponseSchema required. That field is gone from the schema, the session, and the
    stored lifetimes: Baanx's contract carries no lifetime for the refresh token, only for the access
    token, so nothing here can track one.

  • #20920 0fda04b Thanks @tonykhaov! - Rename notifications prompt context hook to useNotificationsPrompt

  • #20977 fb4a5bc Thanks @deepyjr! - Open the amount step when sending to a saved contact.

  • #21056 9e997b2 Thanks @sarneijim! - Add missing tracking events for touchscreen upsell placements

  • #20901 6e1e0aa Thanks @jiyuzhuang! - Stop using generateAnonymousId for Braze identity

  • #20816 cad4f63 Thanks @liviuciulinaru! - Show the signed-in card holder, and let them log out

    CardLogout is a new component, and it is the only one that knows about logging out. It shows the
    account id and the verification state, which is everything the user schema holds, beside a logout
    action. Logout tells the provider first, while the session can still authorize that call, then clears
    the session, the login attempt and the Card cache. A logout on a dead network still logs the user out
    on this device.

    The two directions stay apart. CardLogin runs the login and shows nothing once somebody is signed
    in; CardLogout shows nothing until somebody is. Each one decides that for itself, so the Pay tab
    places both and passes CardLogout nothing.

    They agree through one Redux flag, payCardAuth.isSignedIn, because two login machines would each
    hydrate the session and neither would agree with the other. The machine writes the flag on entering
    ready, idle and error. CardLogout writes it once a logout is through, and the machine takes a
    SESSION_ENDED event to put the login back on offer.

    CARD_OAUTH_REDIRECT_URI now defaults to https://go.ledger.com/ledger/card-baanx. The provider
    whitelists an HTTPS address, and it must match on the token exchange too.

    oauthConfig gains deepLink, which is what closes the secure browser.
    ASWebAuthenticationSession takes the scheme of this value as its callbackURLScheme, and the
    Android polyfill matches the incoming link against the whole of it.

    One value cannot serve both jobs. The provider accepts an https redirect URI alone, and only a
    custom scheme ends a browser session. With no value that matches, the login still completes through
    the app's own deep link, but nothing closes the browser and it stays on top of the Pay tab.

    Mobile takes the value from PAY_TAB_DEEP_LINK, a new constant that sits beside the linking config
    and shares the path that config maps onto the Pay tab, so the two cannot drift. It is not an
    environment variable: the scheme is declared in AndroidManifest.xml and Info.plist, so it cannot
    change without a release. Desktop passes no deepLink, because the user's own browser opens the page
    and reports nothing back (LIVE-34740).

  • #20893 33d89c0 Thanks @deepyjr! - Hide balances and preserve market-cap order in the Contacts currency selector.

  • #20865 5b45a76 Thanks @OlivierFreyssinet! - Update Device Intent Executor copy to match Figma (LIVE-34689, LIVE-34690)

  • #20921 cb2ccae Thanks @tonykhaov! - Remove leftover notifications opt-in backward-compat and unused prompt hooks

  • #20862 c65db86 Thanks @deepyjr! - Show unavailable Contacts asset and network options as disabled in the asset drawer.

  • #20880 79bd143 Thanks @YazhuEth! - Hide accounts that cannot send from the send pickers, and accounts that cannot receive from the receive pickers (HyperCore)

  • #20892 5b7c2c7 Thanks @jiyuzhuang! - Add a Profile upsell banner on My Wallet for Nano S, SP and X

  • #20913 cbeeb18 Thanks @lpaquet-ledger! - select the network then the account on asset page

  • #21007 8f6e66f Thanks @dilaouid! - feat(send): explain why the address book is unavailable for some families

  • #20555 9e0c703 Thanks @gre-ledger! - Isolate wallet sync module failures instead of failing the whole sync: the aggregator validates each module slice on its own and quarantines a broken one, preserving its raw distant value, while every other module keeps syncing. A quarantine is reported as the module key plus the failure kind only, never the offending data.

    A distant document is now typed as what it is — a DistantDocument (Record<string, unknown>) whose slices are trusted per module — instead of the aggregate of the module schemas that nothing validates. parseDistantState is removed: it cast an unvalidated document to a validated type, and the aggregator already narrows the document at runtime. CloudSyncSDK drops its schema constructor option, which was never applied to anything and only served to infer that same misleading type; the class is now parameterised by its document type directly.

    recentAddresses drops its corrupted-address repair path. CorruptedNestedAddressDistantSchema and the lenient z.array(z.unknown()) wrapper that swallowed every bad entry are removed together: a corrupted distant entry now quarantines the module, so the slice is preserved verbatim and reported, instead of being silently rewritten — or, had only the transform been removed, silently dropped. The local-cache repair in schema.ts/store.ts is untouched; it migrates data on disk, which quarantine does not cover.

  • #21046 e11eebe Thanks @dilaouid! - feat(send): add network-filtered contact selection to the Send recipient step on desktop and mobile

  • #20505 f4ed19f Thanks @deepyjr! - Connect Contacts mutations to Ledger Sync availability and activation on Desktop and Mobile.

  • #20854 f32bf30 Thanks @ishaba! - fix(coin-sui): map device 0x8 on address-balance send to clear error

  • #20650 fbc8036 Thanks @lysyi3m! - Add a gRPC-web transport to the Sui coin module

    • coin-sui gains a third transport on sui.rpc.v2 over gRPC-web, covering every capability from
      checkpoints to device signing.
    • New tri-state suiTransport feature flag (json | grpc | graphql), defaulting to json,
      replaces the boolean suiGraphqlTransport, which is removed. An unrecognised value resolves to
      json.
    • New env vars API_SUI_GRPC_PROXY and API_SUI_TESTNET_GRPC_PROXY. @mysten/sui 2.9.0 → 2.23.1.
    • Operation blockHash carries the real checkpoint digest on gRPC.
    • Fix: account sync read a single page of history on GraphQL and gRPC, capping an account at its
      newest 50 operations for good — sync resumes from the newest stored operation and never re-reads
      what it skipped. Both arms now walk up to TRANSACTIONS_LIMIT (300), the depth JSON-RPC reached.
    • Fix: a resumed sync on GraphQL and gRPC read backwards from the tip, so when more than
      TRANSACTIONS_LIMIT transactions arrived between two syncs, the ones in the middle were skipped
      and the next sync resumed above them — a permanent hole. Both arms now walk forward from the
      cursor, as the JSON-RPC arm already did, leaving anything unread newer than the next resume point.
    • Fix: an account holding no operations resumed from its stored syncHash, so a cleared cache came
      back with only the transactions that arrived after it. Such an account now re-reads its history,
      which is also how one truncated by the bug above recovers. Token operations count as history: they
      live in the subaccounts, so a token-only account is no longer treated as empty.
    • Fix: on gRPC, any failure to resolve a cursor's digest — including a transient network error — was
      read as "unknown digest", which falls back to an unbounded page from the tip and made paging report
      the end of history. Only a NOT_FOUND does that now; everything else propagates and is retried.
    • Fix: reading history skipped transactions that shared a checkpoint with the resume point, in
      account sync (getOperations) as well as paging (getListOperations).
    • Fix: paging inferred "more to come" from how many operations survived client-side filtering, which
      ended the walk early. GraphQL now reads pageInfo, gRPC the stream's QueryEnd reason. A page
      whose transactions were all filtered out now resumes from the page's own boundary instead of
      reporting the end of history.
    • Fix: a gRPC history record with no timestamp became an operation dated 1970 that could not serve as
      a pagination cursor. Those records are now dropped, as the GraphQL arm already did.
    • Fix: ascending paging on GraphQL returned the newest slice of the range instead of walking forward
      from the oldest.
    • Fix: the Sui fetcher dropped X-Ledger-Client-Version and all gRPC-web headers when passed a
      Headers instance.
    • Fix: GraphQL resolved the latest checkpoint in two queries, so the second could answer null. It is
      now one query.
    • A checkpoint missing its digest or timestamp now raises on both GraphQL and gRPC, instead of
      reporting a block with an empty hash and a 1970 timestamp.
    • Known limitation: getListOperations resumes from a synthesised timestamp:digest cursor, so
      within one checkpoint a sibling whose digest sorts earlier can be skipped, and a checkpoint holding
      more than one page is stepped over rather than resumed inside. Account sync is unaffected: it
      resumes from the server's own watermark cursor.
  • #20924 83a2392 Thanks @lysyi3m! - Reject a SUI unstake above the staking position's principal, and make the remainder error actionable

    A partial unstake calls staking_pool::split, which asserts the withdrawn amount is at most the
    principal. Nothing validated that locally, so an amount far above the staked balance passed
    validation and only aborted on chain. It now fails with a dedicated error. The remainder error also
    names the way out — withdraw in full — because a position under 2 SUI cannot be split at all.

  • #20110 bdcf051 Thanks @philipptpunkt! - Fix Swap: pressing "<" from the History screen after a multi-step swap now returns to the initial input form. Opening a Swap sub-screen no longer replaces the Main navigator when the Swap tab is the focused route (which unmounted the tab navigator and left the back button unable to navigate), and the webview reset is re-applied when the Swap tab regains focus if the live app is still on the page it was asked to leave.

  • #20955 39a676d Thanks @mdomanski-ext-ledger! - fix: move hedera envs to config/constants

  • #20860 60f343c Thanks @YazhuEth! - chore: bump the Lumen packages to the latest pinned set

    AddressInput now accepts a ReactNode prefix, and BaseInput is no longer exported by Lumen. Both apps only consume Lumen internally, so their own public API is unchanged. The Lumen packages pin each other on exact versions, so they move together.

  • #21038 2247ceb Thanks @mcayuelas-ledger! - Connect the Modular Asset Drawer to the Pay tab Request action, filtered to stablecoins with account selection

Patch Changes

  • Updated dependencies [26d8617, a86fe14, de982e6, e6ad2f6, 6218989, 1d6c394, 5bd3557, 98f4802, bb045d8, 5a30d71, 6560883, f427599, e998478, 5a630b2, d8c04dd, 9470502, e732d3e, d4bb463, ce4ae4a, 6084fcd, b6bb5b5, f64ceec, fec3bc8, 9fa2ab5, f0f10ca, 55b7e6d, aa39333, 5125ac7, 46a0d30, c566744, e1c2a4b, 8003387, c0bdd70, 6c425e0, 73f303f, 1ba0ceb, 01c088d, 91dbf02, 585d8d7, d6c7592, d5ea888, dd64855, ff7e5e0, 33007b1, 8c438f9, fabb26b, eba4d17, cad4f63, 306a681, 9fa2ab5, 582f422, 9e0c703, 8161bac, f4ed19f, a826856, b3095f5, fbc8036, d6f0c7d, 39a676d, 3908965, 41311d6, 79ee882, 4c333ad]:
    • @ledgerhq/coin-evm@5.1.0
    • @features/flow-contacts-add-address@0.2.0
    • @features/flow-contacts@0.8.0
    • @features/flow-pay-card-request@0.2.0
    • @features/flow-large-screen-upsell@2.0.0
    • @features/flow-app-lock@0.2.0
    • @ledgerhq/coin-casper@3.1.0
    • @features/flow-pay-card-auth@0.4.0
    • @domain/entity-contact@0.8.0
    • @features/flow-contacts-list@0.4.0
    • @features/platform-contacts@0.4.0
    • @features/platform-card@0.3.0
    • @devtools/bindings@0.5.0
    • @devtools/shell@0.9.0
    • @devtools/transport-panel@0.6.0
    • @devtools/wire@0.5.0
    • @shared/api-services@0.5.0
    • @features/flow-contacts-add-contact@0.4.0
    • @features/platform-device-intent@5.1.0
    • @features/flow-contacts-edit-contact@0.2.0
    • @shared/feature-flags@0.20.0
    • @ledgerhq/types-live@6.121.0
    • @ledgerhq/live-wallet@1.1.0
    • @features/flow-pay-card-balance@0.3.0
    • @features/flow-pay-card-deposit@0.3.0
    • @ledgerhq/ledger-key-ring-protocol@0.21.0
    • @ledgerhq/ledger-wallet-framework@3.1.0
    • @shared/env@0.4.0
    • @features/platform-aggregated-assets@0.5.0
    • @shared/cloud-sync@0.2.0
    • @domain/entity-recent-addresses@0.2.0
    • @ledgerhq/coin-stacks@0.29.0
    • @features/flow-contacts-introduction@0.3.0
    • @domain/api-aggregated-assets@0.4.1
    • @domain/api-altcoins-sentiment@0.3.3
    • @domain/api-currency-fiat@0.4.2
    • @domain/api-currency-token@0.5.1
    • @domain/api-market-sentiment@0.3.3
    • @domain/api-push-devices@0.2.3
    • @features/platform-currencies@0.6.2
    • @features/platform-feature-flags@0.6.7
    • @ledgerhq/coin-bitcoin@0.51.2
    • @ledgerhq/coin-canton@1.0.1
    • @ledgerhq/coin-concordium@1.0.1
    • @ledgerhq/coin-cosmos@1.0.1
    • @ledgerhq/coin-filecoin@2.0.1
    • @ledgerhq/coin-multiversx@1.0.1
    • @ledgerhq/device-core@0.11.13
    • @ledgerhq/domain-service@1.8.16
    • @ledgerhq/live-countervalues@0.24.4
    • @ledgerhq/live-countervalues-react@0.16.8
    • @ledgerhq/wallet-analytics@0.3.5
    • @ledgerhq/wallet-pnl@0.7.8
    • @features/platform-env@0.2.2
    • @ledgerhq/live-dmk-mobile@0.29.5
    • @ledgerhq/live-dmk-speculos@0.10.6
    • @domain/entity-account-name@0.2.1
    • @features/platform-wallet-sync@0.1.2
    • @ledgerhq/live-currency-format@0.14.2
    • @features/flow-analytics-consent@0.2.3

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.