github LedgerHQ/ledger-live @ledgerhq/live-desktop@4.18.0

latest release: 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.

  • #20986 9965d7f Thanks @mcayuelas-ledger! - Add @features/platform-verify-address-intent, a Device Intent that verifies a receive address on the device Secure Screen, and wire it to the desktop Pay tab Verify CTA.

    The host injects a family-agnostic startAddressVerification (generic getAddress over the DIE DMK transport). When ldmkTransport is off, Verify opens the classic Receive modal. Address comparison is encoding-aware (case-insensitive for hex, exact otherwise). verified / cancelled / unsupported return to the request summary; mismatch closes the flow.

    Generalize desktop InfoState by adding a full-width content slot and optional backgroundTone support for the spot preset.

  • #20962 6218989 Thanks @mcayuelas-ledger! - Wire the desktop Pay tab Request "Verify" action: pressing it closes the receive dialog and opens the shared VerifyAddress overlay (intro then success), tracking the Page Request Address Verification page view. The device intent (DIE) is kept behind the exposed showSuccess bridge for LIVE-36132.

    Make the request action onShare (mobile-only) and onSave (desktop-only) callbacks optional, align the request verify tracking button to verify, and give the VerifyAddress dialog an InfoState-style muted background with centered next steps.

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

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

  • #21067 291f4b7 Thanks @mcayuelas-ledger! - Add the Pay tab card container on desktop, rendered through a new right-panel variant system that dispatches between the swap sidebar and the Pay card

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

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

  • #20902 7d473f5 Thanks @deepyjr! - Use the Contacts address-group resolver without an app-specific currency adapter.

  • #20918 15a872a Thanks @RobinVncnt! - Add hardware carousel close all control on portfolio

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

  • #20909 c6b6f85 Thanks @OlivierFreyssinet! - Fix duplicate WebHID connections when known devices update during device discovery

  • #20922 e8d823f Thanks @OlivierFreyssinet! - Add Device Intent Executor orchestration playground in Developer settings

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

  • #20852 f8a01e0 Thanks @jiyuzhuang! - Default starredMarketCoinsSelector to an empty array so MarketBanner cannot crash on incomplete settings.

  • #20982 aebea36 Thanks @alexstapenka-ledger! - Restore Earn webview focus after the account picker so deposit amount autofocus works

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

  • #20882 ed42292 Thanks @claudiiafg! - Wire Contacts edit-address validation and analytics into desktop.

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

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

  • #20900 7fcbc76 Thanks @OlivierFreyssinet! - Prevent dismissing device intent dialogs while a device action is pending.

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

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

  • #20805 3722c36 Thanks @RobinVncnt! - Add the hardware carousel UI component for Braze category cards on desktop.

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

  • #20894 49157dc Thanks @LL782! - Fix Ledger Sync being wiped on every launch when Password Lock is enabled. app.trustchain is an encrypted db path, so before unlock it reads back as a ciphertext string; importing it regenerated member credentials, nulled the trustchain, and persisted that fresh state over the encrypted blob in plaintext. The import is now skipped while the value is still a string, and trustchain writes are suppressed while the app is locked.

  • #20938 73f303f Thanks @mcayuelas-ledger! - Show a branded QrCode (asset icon in the center) on Pay Card request receive (LIVE-36233).

  • #20876 1ba0ceb Thanks @tonykhaov! - Block Recover on desktop for Nano S-only wallets with a dismissible upgrade modal (LIVE-35465).

  • #20834 01c088d Thanks @tonykhaov! - Add a My Wallet Profile LNS upsell banner gated by largeScreenUpsell.banners.profile (LIVE-35481). Require utmContent on buildLargeScreenUpsellCtaLink and export LARGE_SCREEN_UPSELL_UTM.

  • #20925 91dbf02 Thanks @tonykhaov! - Gate Recover Nano S intercept and Backup Hub Recovery Key warning with largeScreenUpsell.params.banners["recover-page-block-nano-s-only"] and banners["backup-hub-recovery-key-text-warning"].

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

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

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

  • #20898 ff7e5e0 Thanks @mcayuelas-ledger! - Add the web RequestReceive dialog (asset icon, network row, highlighted address, action tiles) and wire the Pay tab Request tile on desktop to open it with copy support (LIVE-36120).

  • #21082 655bcb4 Thanks @mcayuelas-ledger! - Render the Pay card visual with a mock balance in the Pay tab right panel, wiring the new @features/flow-pay-card-details CardVisual through an MVVM view model.

  • #20942 8c438f9 Thanks @mcayuelas-ledger! - Plug the Modular Asset Drawer into the Pay tab Request and Add stablecoin actions, filtering selection to the stablecoin category so users can pick asset, network and account without over-long request URLs

  • #21037 aafb541 Thanks @mcayuelas-ledger! - Wire the Pay tab "New payment" action to open the new Send flow with a stablecoin-filtered account picker and source: "Pay"

  • #20953 fabb26b Thanks @mcayuelas-ledger! - Save the Pay request card (QR + address) as a PNG image through the native OS save dialog

  • #20868 7623d4e Thanks @mcayuelas-ledger! - Skip the Noah receive options step when depositing from Pay so users are not asked to choose crypto vs bank transfer twice

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

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

  • #20974 97f75d2 Thanks @tonykhaov! - Remove the flaky Default analytics consent mount test

  • #21027 1b3bf54 Thanks @dgreen-ledger! - Disable Braze user-supplied JavaScript in HTML in-app messages and banners for security hardening

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

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

  • #21064 32c64ba Thanks @deepyjr! - Stabilize desktop Playwright settings and DevTools checks.

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

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

  • #20949 a56baa8 Thanks @pawell24! - Fold a Zcash account's shielded balance sync into the standard automatic wallet sync instead of requiring a manual trigger, and make that trigger unconditional and spam-proof. The account page's shielded balance now refreshes on launch and on the regular sync interval, the Amount step of a send refreshes it when moving on from the Recipient step, and a completed private transfer triggers a follow-up sync so the account page converges without a manual refresh. The manual "sync balance" action is now offered and enabled in every state, including once a scan has completed, and clicking it while a sync is already running no longer cancels and restarts it.

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

  • #21052 acbc7b9 Thanks @RobinVncnt! - Add type and layout on hardware carousel content card impressions

  • #20956 41311d6 Thanks @RobinVncnt! - Add shop UTMs on hardware carousel card clicks in the desktop portfolio

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

  • #20889 569d202 Thanks @vladyslavchupovskiy-ext-art! - [ZEC] Replace pool-exclusion warning banner with spendable/maturing breakdown; move pool warning into private balance tooltip.

Patch Changes

  • Updated dependencies [61b4b5f, 26d8617, a86fe14, de982e6, e6ad2f6, 9965d7f, 8ebdb6a, 6218989, 17a4154, 1d6c394, 98f4802, 2a4b4b1, bb045d8, 5a30d71, 6560883, f427599, e998478, bb58645, 5a630b2, d8c04dd, 9470502, e732d3e, d4bb463, ce4ae4a, 6084fcd, b6bb5b5, f64ceec, fec3bc8, 9fa2ab5, f0f10ca, 55b7e6d, aa39333, 5125ac7, 46a0d30, c566744, e1c2a4b, 8003387, c0bdd70, b2a2e9e, 6c425e0, d1ab42f, 73f303f, 1ba0ceb, 01c088d, 91dbf02, 585d8d7, 32f3b76, d6c7592, f7e5005, f567f20, d5ea888, dd64855, ff7e5e0, 33007b1, 35c12b6, 8c438f9, fabb26b, eba4d17, 4555355, fb4a5bc, 6e1e0aa, cad4f63, 306a681, 9fa2ab5, 582f422, 79bd143, 9e0c703, e11eebe, 8161bac, f4ed19f, a826856, b3095f5, fbc8036, d6f0c7d, a56baa8, 39a676d, 9d84383, 3908965, 41311d6, 79ee882, 4c333ad, d7a9847]:
    • @ledgerhq/live-common@37.4.0
    • @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/platform-verify-address-intent@0.2.0
    • @ledgerhq/coin-zcash@0.5.0
    • @features/flow-large-screen-upsell@2.0.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
    • @features/flow-pay-card-details@0.2.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
    • @features/flow-contacts-introduction@0.3.0
    • @ledgerhq/asset-detail@0.11.2
    • @ledgerhq/live-dmk-desktop@0.20.8
    • @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/asset-aggregation@0.13.2
    • @ledgerhq/coin-bitcoin@0.51.2
    • @ledgerhq/coin-canton@1.0.1
    • @ledgerhq/coin-cardano@1.0.1
    • @ledgerhq/coin-concordium@1.0.1
    • @ledgerhq/coin-cosmos@1.0.1
    • @ledgerhq/coin-filecoin@2.0.1
    • @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-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
    • @ledgerhq/wallet-btc@0.3.0

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.