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

latest release: live-mobile@4.23.0
4 hours ago

4.23.0

Minor Changes

  • #22217 63960b1 Thanks @vpenskyi-ledger! - Fix the Swap receive field staying empty when reaching Swap from the Earn no-funds screen. Desktop now always identifies a token by toTokenId (plus its toToken alias), which toCurrencyId alone could not do; mobile passed no parameters at all and now forwards the asset. On both, an account the Earn live app synthesised for a token the user does not hold is no longer sent as an unresolvable id

  • #22404 b42673e Thanks @philipptpunkt! - Read the card cashback banner from GET /v1/card/cashback

    • Add getCardCashback endpoint, resolving the asset's currency/network pair (both nullable) to its ledgerId
    • Remove getRewardWallet (GET /v1/wallet/reward), its schema, types, mock and handlers
    • useCardCashback replaces useCardRewardWallet in the reward banner
    • Banner subtitle now shows the rate and ticker: "Total cashback · 1% in BTC"
    • cardRewardsAvailable / cardRewardCurrency analytics now read the cashback (amount > 0)
  • #22450 2d869a5 Thanks @LucasWerey! - fix(i18n): keep Thai selected across app restarts

    Removes the llmThai / lldThai feature flags. Flags resolve on their enabled: false default
    until the first remote fetch settles, so on every cold start the locale guard saw Thai as
    unsupported and persisted English over the user's choice.

  • #22840 e4c24f3 Thanks @LucasWerey! - Name the default Me contact "Me" in the Pay tab contacts list instead of "My addresses (Me)"

  • #22634 e3b6f7a Thanks @mateuszpalosz-ext! - fix(aleo): keep the newer public and private sync fields when both syncs overlap

  • #22381 c5964f8 Thanks @ysitbon! - Rename @domain/api-market-sentiment to @domain/api-market-index-fear-and-greed, and its exported api from marketSentimentApi to fearAndGreedApi, so the name states which CoinMarketCap index the package serves

  • #22653 e8d5e1b Thanks @OlivierFreyssinet! - Bump DMK dependencies: device-management-kit 1.10.0, device-signer-kit-solana 1.13.3, device-signer-kit-ethereum 1.18.1, context-module 2.6.0, dmk-ledger-wallet 0.6.0, device-contacts-kit 0.5.0, signer-utils 1.3.0, device-transport-kit-mockserver 1.1.2

  • #22567 3ee4143 Thanks @tonykhaov! - List the Me contact in the desktop Send recipient contacts, like mobile, with only its addresses on the selected network.

  • #22615 7bc8d65 Thanks @mcayuelas-ledger! - Open the Pay request flow from the Add stablecoin "Crypto address" option instead of the standard Receive flow

  • #22318 83b8a5c Thanks @tonykhaov! - Use dnd-kit to reorder card assets in the desktop manage-assets dialog

  • #22379 ad2f1de Thanks @philipptpunkt! - Let the card transaction history read past its first page.

    • Both platforms read on by scrolling: native through the list's onEndReached, web through an observer on a sentinel at the end of the table.
    • A spinner marks the page in flight; no new copy, so nothing to translate.
    • Both take loadMore/isLoadingMore from the shared view model, so the three-row previews on the Pay surfaces are unaffected.
  • #22432 cfb7566 Thanks @tonykhaov! - Show the cashback a card transaction earned in its detail view

  • #22665 46cfd43 Thanks @lysyi3m! - fix(celo): label pending withdrawal rows with their unlock date

  • #22474 1a26e59 Thanks @live-github-bot! - Update coin module dependencies (coin-evm, coin-module-framework, coin-stellar, coin-tezos) and rebuild the lockfile

  • #22572 6e76dda Thanks @tonykhaov! - ContactAvatar takes isMe and is the only avatar that formats the Me label, so a Me avatar is announced once as " (Me)". MeAvatar takes a display-ready label and is no longer exported; ME_AVATAR_URL stays exported. PaySuccessRecipient.isMe is now required.

  • #22656 486a1a4 Thanks @LucasWerey! - Only mention ENS in the contact address input placeholder for networks that support domain resolution (LIVE-38284).

  • #22348 f7cd861 Thanks @ysitbon! - Let asset-aggregation and wallet-analytics declare the countervalues interface they need

    Both packages only ever needed one countervalues operation, calculate, over a state they
    receive as a parameter and never inspect. They now declare that operation themselves as a
    RateLookup interface, treat the state as an opaque RateSnapshot, and drop
    @ledgerhq/live-countervalues from their dependencies entirely. The apps fill the interface
    at startup, beside the crypto-assets store and the currencies resolver.

    No caller changes: the exported signatures keep their arity and the state argument is
    assignable as before, so the 41 files consuming these two packages are untouched.

    Tests get simpler as a side effect. Mocking countervalues was a module mock reaching across a
    package boundary; it is now an injected fake passed to setRateLookup.

  • #22534 c5a6a7e Thanks @ysitbon! - fix(feature-flags): report a re-resolution that throws

    A feature-flags re-resolution that throws at boot is now reported through logger.critical,
    whatever the state of the remote-flag cache.

  • #22503 33b4952 Thanks @daniel-choinski-ledger! - Inject the Tron address book into the DMK Tron signer so Tron transactions can clear-sign saved contact names.

    Adds a generic AddressBookProvider<T> in live-dmk-shared (the EVM provider is refactored onto it), a tronAddressBookProvider instance, a pure toTronAddressBook mapper (Contact[] -> TronAddressBook, Tron-family only, no chain id, ledgerAccounts always empty), and registers the source at each app's composition root. An absent or empty book leaves signing behavior unchanged.

  • #22481 d6866e7 Thanks @mcayuelas-ledger! - adapt crypto card title to be consistent

  • #22058 f8c92f9 Thanks @alexstapenka-ledger! - Instrument the shared sign/broadcast bridge defensively and dispatch consent-independent Earn
    transaction lifecycle events for native staking and allow-listed dApps on Desktop and Mobile.

  • #22558 e046686 Thanks @dilaouid! - feat(cosmos): staking validation rule in the generic path

  • #22788 3699ef4 Thanks @mcayuelas-ledger! - Hide the Pay tab card and its history when the pay-tab flag's card param is false

  • #22614 b4599a5 Thanks @mcayuelas-ledger! - Update the verify address next steps copy, add a third step, and size the mobile shield spot to match desktop

  • #22433 8c787ee Thanks @jeportie! - Add test IDs to the My Ledger values that automation has to read.

    The device storage figures and the install success banner render their values as bare text nodes, so a test can see the containers but cannot assert what they show. This adds them to the used, capacity, apps count and free space figures in the storage card, and to the install success banner's title and its manage accounts button.

    No behaviour changes: every addition is a data-testid attribute.

  • #22322 08e23bb Thanks @jeportie! - Add test IDs to the My Ledger controls that automation has to click.

    The manager screen already exposes test IDs for its containers, inputs and success states, but not for several triggers and submit buttons, so those flows could not be driven from a test. This adds them to the app catalog's Show and Sort dropdowns, the device rename entry point and its submit button, the custom lock screen removal link and its success state, and the OS version and genuine badge values.

    No behaviour changes: every addition is a data-testid attribute.

  • #22571 e3c51c5 Thanks @tonykhaov! - Show a matched Me contact as " (Me)" in Send: the recipient card, the "Address matched" row, the amount step "To" header, the Pay success title and the History counterparty. MatchedContact and RecipientHeaderContact now carry isMe, and RecipientHeaderPresentation.label is renamed recipientDisplayValue and never holds a contact name.

  • #22438 f9b43be Thanks @pawell24! - fix(near): size staking gas from measured usage and price it the way the chain does

    Staking fees priced the attached gas at the current gas price. nearcore buys the gas attached
    to a receipt at max(current_gas_price, min_gas_purchase_price), and that floor is an order of
    magnitude above the current price on mainnet, so every stake, unstake and withdraw quoted about a
    tenth of what the account had to hold. A withdraw quoted at 0.02 NEAR was rejected on broadcast
    with NotEnoughBalance naming a cost of 0.1759 NEAR.

    The fee now uses the same floor the runtime does, and the attached gas drops from 125 TGas (175
    for withdraw_all) to 50 TGas for every staking call. The heaviest poolv1 path, the first call in
    a new epoch which also restakes and runs the pool's 20 TGas on_stake_action callback, was
    measured across five mainnet pools: at most 13.64 TGas charged, and 30 TGas attached succeeds on
    it. The old budget, bought at the floor, locked 0.2 NEAR for a call that burns about 0.001;
    the new one locks 0.055.

    Unstake and withdraw are validated against the balance left above storage staking, which is what
    the chain checks, instead of the spendable balance that also subtracts the minimum-balance
    reserve. The withdraw flow gains the NotEnoughFundsToUnstake banner the unstake flow already
    shows, so a real shortfall is explained with the available balance and Buy/Swap/Deposit actions.

    The NEAR coin-tester scenario's withdraw step now requires the withdrawn amount itself to have
    landed before the send-max step sizes its amount: the pool pays out through a Transfer receipt
    that lands a block after the call, and the smaller gas refund alone used to satisfy the step.

  • #22570 dfd53ad Thanks @tonykhaov! - Show the Me contact as " (Me)", or "My addresses (Me)" when it was never renamed, through one rule: formatContactDisplayName, wrapped by useContactDisplayName. It replaces createMeDisplayNameFormatter, resolveMeContactDisplayName, identityFormatMeDisplayName and every formatMeDisplayName label. Contact list items keep the raw name plus isMe, and rows render through the hook. Fixes the Me name in the Send recipient list, Pay contacts, the History scope and the address dialog. The Me address picker says "Select my address". Adds @features/platform-contacts/testing.

  • #22512 c63d0fa Thanks @tonykhaov! - Always show Me in the Send recipient contact list, with only its addresses on the account network, ordered like the other contacts (last sent to first). Draw Me with one MeAvatar everywhere: ContactAvatar renders it for the Me contact, so the meAvatarSrc, avatarSrc and isMe avatar props are gone.

  • #22573 9e54487 Thanks @tonykhaov! - Add useOtherContactsAddresses(excludeContactId?) so the duplicate-address list is built in one place, with each owner's display name: "This address is already used for My addresses (Me)." It replaces five copies in the Contacts and Send view models.

  • #22321 83fac3e Thanks @philipptpunkt! - Read the Pay Card transaction history one page at a time.

    • getCardTransactions is an infinite query; useGetCardTransactionsQuery becomes useGetCardTransactionsInfiniteQuery.
    • page moves off the filters onto the query's page param, so PayCardTransactionsRequest is filters only.
    • The provider answers a page past the end with an empty array, so an empty page ends the reading. No page size is documented, so a short page is read past at the cost of one further request.
    • A failure over pages already read no longer blanks the list — a later page or a failed refresh alike. Such a failure is not announced anywhere yet.
    • useCardTransactionsViewModel exposes loadMore and isLoadingMore; no surface calls them yet.
    • The joined list is ordered by dateTime, newest first, with repeats dropped, because a charge landing between two reads shifts the paging. The ordering applies to callers that only ever read one page.
    • toPayGlobalProperties takes hasCardTransactions: boolean in place of the transaction list, so analytics reads the first page through hasCardTransactions rather than joining the cached history on every track().
    • loadMore is not offered once a read has failed, so a scroll-driven caller cannot turn one failure into a request loop.
    • The MSW mock pages, and its page size drops from the 10 #22236 sliced at to 6 — 10 exceeded the eight-charge fixture, so that mock never paged.
  • #22302 e81a3d8 Thanks @mcayuelas-ledger! - Attach Pay Mixpanel user properties when the Pay flag is on.

  • #22577 b6a9b53 Thanks @mcayuelas-ledger! - Fix Pay analytics events that never reached Segment, and align the feature-intro page names.

    Pay tracking no longer travels through a React context: @features/platform-pay-analytics exposes
    module-level trackers built on @shared/analytics, and every Pay flow imports the one it needs.
    The provider could not be reached from inside @gorhom/bottom-sheet portals on mobile, so the card
    details sheet and the reward-currencies CTA silently dropped their events. The onTrackEvent prop
    is gone from every Pay flow package and from both host apps.

    Card milestone events are now planned from a first-read baseline, so they no longer replay on each
    login. Feature-intro pages report as Page Feature Intro <flow>, and the bank transfer flow is
    named Cash to stable instead of C2S.

  • #22592 46f0f94 Thanks @mcayuelas-ledger! - Show a dedicated empty and error state in Pay card assets and hide Manage until the list is ready.

  • #22545 ea90542 Thanks @liviuciulinaru! - feat(pay-card): show every login error in a retryable panel

  • #22899 40b22c1 Thanks @tonykhaov! - Show a "Go to CL Card" disclaimer below the Pay contacts when the card_disclaimer param of lwdPayTab is on. It opens the same CL Card webview as "I have a card" on the Card screen.

  • #22899 56640ba Thanks @tonykhaov! - Show the Card login on the desktop Pay tab when the card_live_app param of lwdPayTab is on. "Create an account" opens the card program live app and "Log in" opens the CL Card live app.

  • #22389 9c98732 Thanks @mcayuelas-ledger! - Collapse the Pay Tab card hosted-page openers into one helper and pass the host view model through to the card flow

  • #22899 87f8ce0 Thanks @tonykhaov! - Read the desktop Pay card face (native, live app, disclaimer) from one usePayCardFace hook.

  • #22507 219049d Thanks @liviuciulinaru! - Keep the Baanx session when the user leaves and opens the Pay tab again.

  • #22328 41eca65 Thanks @liviuciulinaru! - Open top-up in the legacy cl-card live app when the new legacyTopUp param of lwdPayTab or lwmPayTab is on.

  • #22293 912b087 Thanks @liviuciulinaru! - Keep the aspect ratio of the login intro hero image and theme the desktop row icons

  • #22546 defb949 Thanks @liviuciulinaru! - fix(pay-card): keep the card visible, with a loading balance, while the session resolves

  • #22682 f678cbd Thanks @tonykhaov! - Mention Monavate instead of Baanx in the Pay card add asset and withdraw copy.

  • #22908 23ee31c Thanks @tonykhaov! - Pay card login: name Monavate instead of Baanx in "Log in to" and "Card provided by".

  • #22446 3d41eab Thanks @mcayuelas-ledger! - Open the hosted cashback page from the Pay card reward banner

  • #22353 ae229f2 Thanks @philipptpunkt! - Show a counter-value on the card rewards banner.

    • The reward wallet now carries the currency it is denominated in, like a linked wallet does.
    • The banner prices it with the host's rates and leads with the counter-value.
    • The amount is formatted as a token, not as fiat.
    • A reward nothing can price shows the asset amount alone.
    • priceWallet is renamed getCounterValue: it converts an amount, it does not price a wallet.
  • #22899 8369030 Thanks @tonykhaov! - Send the live app webview Back button to Pay when the webview was opened from Pay with fromPayTab state.

  • #22241 3b95cbb Thanks @tonykhaov! - Include the Me contact in Pay contact strips and contact selection, keeping the existing order.

  • #22358 973a613 Thanks @mcayuelas-ledger! - Show a Pay disclaimer at the bottom of the desktop Card panel and the mobile Pay tab.

  • #22440 a39ba90 Thanks @mcayuelas-ledger! - Fix remaining Pay Mixpanel events and user properties from the tracking plan

  • #22427 b9742c4 Thanks @mcayuelas-ledger! - Drop brackets around the recipient name on the Pay send confirmation screen.

  • #22889 fe55ea3 Thanks @mcayuelas-ledger! - Add feature-flag scenarios for the native Pay card, Card live app login, and CL Card disclaimer

  • #22402 dccea32 Thanks @mcayuelas-ledger! - Polish the Pay tab: keep the last row of every Pay bottom sheet clear of the Android navigation bar and the iOS home indicator, size the card action buttons to md, make the desktop contacts table responsive with a wider name column, wrap the address-picker title, add 32px of scroll padding, widen the history tabs, fix the disclaimer copy and use the shield icon on verify address

  • #22031 f28215d Thanks @ooke-ledger! - Reserve height for the Perps deposit quoted-amount and status rows so the form no longer jumps when switching between the provider notice, the quote, and the error message

  • #22033 db7b972 Thanks @ooke-ledger! - Keep the entered Perps deposit amount when switching the funding asset/account instead of resetting it

  • #22488 1302bc7 Thanks @LL782! - Replace mutable analytics screen refs with a function-only tracking-page API.

  • #22550 86dbc48 Thanks @alexstapenka-ledger! - Add the ptxEarnCtaOnMobile feature flag and send it to Mixpanel as a boolean identify trait. Earn reads it via Wallet API.

  • #22549 24e881b Thanks @mcayuelas-ledger! - Hide Pay and card history amounts when discreet mode is enabled, and toggle it from the Pay balance

  • #22767 8947c0b Thanks @mcayuelas-ledger! - Show a setup state on the History card tab when the signed-in holder has not claimed a card yet.

  • #22562 b8a4056 Thanks @philipptpunkt! - Keep re-reading the Pay Card status after the holder returns from Apple or Google Wallet, and when the app comes back to the foreground

  • #22491 c8d3949 Thanks @mcayuelas-ledger! - Hide the redundant Card extra in the History navbar when the type switcher is visible.

  • #22631 9be4635 Thanks @liviuciulinaru! - Keep the Pay tab active in the sidebar while a Card live app is open

  • #22378 87de096 Thanks @ysitbon! - refactor(domain): rename @domain/api-altcoins-sentiment to @domain/api-market-index-altcoin-season

    The package wraps one specific CoinMarketCap product, the Altcoin Season Index, so the old name
    used sentiment as a top-level leaf for something that measures capital rotation rather than
    sentiment. The new name places it in the market-index-* namespace alongside its Fear and Greed
    sibling and uses the provider's own product name for the leaf.

    The exported api follows the package leaf: altcoinsSentimentApi becomes altcoinSeasonApi and
    the AltcoinsSentimentApi type becomes AltcoinSeasonApi. ALTCOIN_SEASON_INDEX_TAGS,
    transformAltcoinSeasonIndexResponse and useGetAltcoinSeasonIndexLatestQuery are unchanged.
    The README, which documented an implementation the package never had, is rewritten against the
    code. No behaviour change.

  • #22376 cdcb834 Thanks @ysitbon! - refactor(market): rename the Fear & Greed entity package to the market-index-* namespace

    @domain/entity-market-sentiment becomes @domain/entity-market-index-fear-and-greed, and
    domain/entity/market-sentiment becomes domain/entity/market-index-fear-and-greed. The old
    name used a namespace as a leaf: it holds one specific CoinMarketCap index, not market sentiment
    in general, which left the sibling Altcoin Season index with nowhere to sit.

    Pure rename. No behaviour change, and no symbol changes inside the package: FearAndGreedIndexSchema
    and FearAndGreedIndex already carried the index's real name.

  • #22238 62fb052 Thanks @tonykhaov! - Keep the selected contact in Send and open the recipient picker from the To bar.

  • #22407 4efaa4f Thanks @lysyi3m! - Remove the Ledger by Figment T&Cs link from the Sui delegation validator step

  • #22579 0e98a58 Thanks @vpenskyi-ledger! - Re-read SWAP_API_BASE on every swap/Perps quote request instead of baking it into the store at startup, so a debug-menu override reaches the aggregator without an app restart

  • #22392 a6b6959 Thanks @CremaFR! - Include Exchange and signing app versions on swap cancel payloads

  • #22382 c119e0d Thanks @mcayuelas-ledger! - Redirect the "choose card type" onboarding step to the Baanx hosted order-card page, and align pay bottom sheet spacing and tile styles

  • #22522 e19e6cf Thanks @mcayuelas-ledger! - Fix the cropped transaction name and date on a card charge funded by several assets, and round card crypto amounts like the rest of the product. A devtool action and a mock fixture now produce such a charge.

  • #22054 8c486aa Thanks @aussedatlo! - Add @ledgerhq/live-signer-tron, wrapping @ledgerhq/device-signer-kit-tron as DmkSignerTron
    alongside the legacy hw-app-trx path as LegacySignerTron. families/tron/setup.ts picks
    between them, using the DMK signer only on a DMK transport with the new ldmkTronSigner feature
    flag on. The flag is disabled by default, so Tron keeps signing through hw-app-trx.

  • #22664 f96e346 Thanks @semeano! - Add Zcash privacy/transfer-flow attributes to the new send flow's Segment tracking, and a first page event for the balance-type step, so a private vs public Zcash send is distinguishable in analytics (LIVE-38009).

Patch Changes

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.