4.17.0
Minor Changes
-
#20611
5a87153Thanks @mcayuelas-ledger! - Mount the first-time Pay tab FeatureTour on the PayTab screen in both apps. Visibility is self-gated by the payCard slice (shown on first visit, hidden after dismissal), copy is injected from app-owned i18n keys (payTab.featureTour.*), and analytics are wired through the view-model. Adds unit and integration coverage for the conditional rendering. -
#20655
ec8baadThanks @mcayuelas-ledger! - Add the desktop Pay hero for the aggregated stablecoin balance. Introduces the@features/flow-pay-card-balancepackage with props-only empty and funded states, wired into the desktop Pay tab and trackingPage Paywith the activebalance_filter(LIVE-34896). -
#20713
a3164d8Thanks @mcayuelas-ledger! - Add the mobile Pay hero for the aggregated stablecoin balance. The@features/flow-pay-card-balancepackage gains props-only native empty and funded states, and both apps now share the portfolio aggregation throughaggregatePayCardBalance(LIVE-34898). The hero is mounted at the top of the mobile Pay tab, which tracksPage Paywith the activebalance_filteron view. -
#20844
5ff320aThanks @mcayuelas-ledger! - Wire the desktop Pay tab "Add stablecoin" tile to the shared Deposit options dialog: pressing it opens the dialog and each option routes to its desktop flow (bank transfer, swap, buy) or the receive asset flow filtered to stablecoins.Render the deposit options as Lumen
ListItemrows. -
#20644
936abf0Thanks @LucasWerey! - chore(deps): bump Lumen design system to latest and migrate CSS to tailwind v4 style -
#20815
54fcd49Thanks @cted-ledger! - Exclude immature Ironwood notes from the spendable pool. A shielded note is only spendable once its transaction is buried deep enough to have a witness at the builder's anchor, so a freshly scanned change note is no longer selected while a second send is prepared within the same confirmation window. The rule is applied wherever the spendable pool is derived — note selection, max-spendable and amount validation — and the send flow now reports insufficient spendable funds instead of failing when the transaction is built. Funds held by maturing notes stay part of the account's total balance. -
#20735
c3b8717Thanks @mcayuelas-ledger! - Add a stablecoin balance filter picker to the Pay card hero. -
#20833
2ab3cb8Thanks @tonykhaov! - RequireutmContentonbuildLargeScreenUpsellCtaLink(breaking) and personalise the Backup Hub Recovery Key row for Nano S / SP / X with a warning and large-screen upsell CTA (LIVE-35484). -
#20683
74de0e5Thanks @RobinVncnt! - Show only one portfolio Braze banner when the placement area is too narrow for two readable columns, using CSS container queries instead of JS width measurement. -
#20702
e07e0baThanks @mcayuelas-ledger! - Scaffold the Card API on a single endpoint-lesscardApiservice (DDD, CMC/DADA pattern): add theservices/cardtransport in@shared/api-serviceswith Bearer +x-client-key(CARD_BAANX_CLIENT_KEY) + one 401-refresh, the@domain/api-card-managementendpoint injector, the@features/platform-cardin-memory session andgetCardSessionToken/refreshCardSessionaccessors, theCARD_API_URL/CARD_BAANX_CLIENT_KEYenvs, and registercardApiin both apps. The legacypayCardApiCard Auth holdout is left untouched pending its migration ontocardApi(LIVE-33829). -
#20684
ead65e0Thanks @sarneijim! - Update LNS upsell banner opt-in/opt-out copy and per-placement images to match mobile. -
#20571
7c8d5dfThanks @live-github-bot! - Thread the coin-moduleContext(ADR-019) explicitly through the coin-evm, coin-vechain and coin-near api and logic layers instead of resolving configuration from the module-levelgetCoinConfigsingleton. Exported logic functions now take the context as their first argument, resolveconfigfrom it (await context.config(currencyId)), and pass an explicit, requiredconfigdown to the network layer — noconfig?optionals and no singleton reads on the data path.getCoinConfig/setCoinConfigremain only as the compatibility surface for the classic account bridge. Ledger Live consumers (live-common, desktop, mobile and coin-celo) are updated to resolve and pass config/context explicitly. Also fixes a coin-polkadot type-inference issue wheregetTransactionMaterialWithMetadata's cache-key extractor narrowed the cached signature and dropped theconfigargument. -
#20759
526ca7bThanks @claudiiafg! - Extract shared Contacts tracking hooks and move currency analytics resolution to platform-contacts. -
#20420
494963bThanks @jiyuzhuang! - Fix apps not being restored after a firmware update during Early Security Checks (ESC) in sync onboarding -
#20856
d0ac51cThanks @mcayuelas-ledger! - Wire the Pay tab "Add stablecoin" tile to the shared Deposit options overlay on both platforms: pressing it opens the dialog (desktop) or bottom sheet (mobile), and each option routes to its platform flow (bank transfer, swap, buy) or the receive flow filtered to stablecoins.Extract a shared
useDepositOptionsAdapterhook in@features/flow-pay-card-depositso desktop and mobile no longer duplicate the deposit options open/close state and props shape. -
#20907
da0a5ceThanks @fAnselmi-Ledger! - Add Solana TXC flag -
#20784
19e578aThanks @mcayuelas-ledger! - Move the Pay Card UI Redux state out of the removed@domain/entity-pay-cardpackage into the owning feature flows: the balance filter goes to@features/flow-pay-card-balanceand the feature-tour seen flag to@features/flow-pay-card-feature-tour. The apps keep persisting it under the existingpayCardkey (no data migration). Both flows expose a UI-free./stateentry so store, persistence and test setup can use the slice without pulling in the flow UI. -
#20778
eecf99aThanks @francois-guerin-ledger! - chore(coin-evm): replaceCryptoCurrencywithcurrencyId -
#20670
6165c9dThanks @dilaouid! - feat(lwd): show recipient action only when no bridge error -
#20929
dcb3340Thanks @jiyuzhuang! - Skip installed-app listing before the ESC firmware update drawer on unseeded devices (LIVE-36215) -
#20906
dbb2ee0Thanks @LL782! - Fix Ledger Sync being wiped on every launch when Password Lock is enabled.app.trustchainis 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. -
#20662
a736d28Thanks @RobinVncnt! - Add the Braze category content cards data layer on desktop, with single and bulk dismiss -
#20703
c8d9b15Thanks @amaslakov! - Surface ICP neuron staking on the account page: a stake banner for accounts that can afford a neuron
but hold none, a balance summary footer showing total staked and total maturity, and Stake / Manage
Neurons actions in the account header. The send flow now explains that the memo is protocol-derived
forcreate_neuronandincrease_stakeinstead of offering an editable field. The two neuron flow
modals are registered but their bodies land separately. -
#20789
fe57525Thanks @sarneijim! - Fix Large Screen Upsell competing-modal handling on desktop: do not consume retriesModal when blocked/preempted, rename persisted retries to retriesModal (legacy reset on LWD only), and track modal_blocked. -
#20803
13d6db5Thanks @sarneijim! - Extend desktop always-on upsell banners to Nano SP and Nano X using the shared largeScreenUpsell audience and cooldown (LIVE-35397). -
#20719
5b39a67Thanks @sarneijim! - Drive desktop LNS upsell banners fromlargeScreenUpselland remove the legacylldNanoSUpsellBannersflag (LIVE-35487). -
#20794
29347c9Thanks @LL782! - Replace the useTrack hook with the module-level track functionInternal refactor ahead of the analytics package migration. Every event keeps the properties it emits today: desktop reads the
drawername from the drawer context (or passes the custom-lock-screen constant directly) at each call site, and mobile's swap entry point rebuilds its router-derivedpagewithusePageNameFromRoute. -
#20731
69a5644Thanks @claudiiafg! - Wire Contacts feature analytics to the shared platform tracking contract. -
#20795
b8370ecThanks @lewisd5! - Add 1024 icon for the mac app store -
#19581
6a437fdThanks @Moustafa-Koterba! - feat(lwdm): improve error context on datadog -
#20740
542737cThanks @ishaba! - fix(drawer): don't restore focus to a detached webview on close -
#20806
eb4d29eThanks @mcayuelas-ledger! - Drop the redundantPayCardprefix from the public API of@features/flow-pay-card-balance. The package path already scopes the feature, matching sibling flows (FeatureTour,CardLogin). The hero is now exported asBalance, withuseBalanceData,aggregateBalance,buildBalanceDataandBalance*types. -
#20642
a61f702Thanks @mcayuelas-ledger! - Persist the pay card hero balance filter across app restarts -
#20755
e291645Thanks @mcayuelas-ledger! - Add the mobile stable balance filter (native select under the hero + queued bottom-sheet picker) and share the filter option and stablecoin logic between desktop and mobile -
#20096
e54d98bThanks @liviuciulinaru! - Integrate the Card API and give its endpoints a domain owner@domain/api-card-managementgains the Card Auth contract: authorize initiation, authorization-code
exchange, session refresh, logout and the user read, with their zod wire schemas and inferred types.
They inject into the sharedcardApiservice, so one reducer, one middleware and one cache serve the
Card backend, and the base query supplies the base URL,x-client-keyand theAuthorization: Bearer
header from the@features/platform-cardsession.@features/flow-pay-card-authowns no network contract any more. It keeps the auth-onlypayCardAuth
slice and theCardLogincomponent;useCardLoginViewModelimports its hook from
@domain/api-card-management, and that import is what triggers the injection.@domain/api-pay-card
and its in-process mock transport are removed, along with the Pay Card mocks.Pay Card UI Redux state is owned by the feature flows that use it: the balance filter by
@features/flow-pay-card-balanceand the feature-tour flag by@features/flow-pay-card-feature-tour.Only the login step ships here. The callback code exchange and the card status read stay behind until
the session has an owner that can store and refresh it. -
#20433
481bc40Thanks @ooke-ledger! - Hand a perps deposit requested by the live app over to the wallet, and let the asset and account pickers word themselves after the role the selection plays: the account funds land in, the account they are taken from, or the perps pick that predates both -
#20723
ab35763Thanks @YazhuEth! - Fix the receive flow reporting a verification error (visible on Polkadot) while the address confirmation succeeded on the device: re-renders no longer start a concurrentconfirmAddresscall, and a late result can no longer overwrite a successful verification. -
#20742
2d1bdedThanks @mcayuelas-ledger! - Refactor PayTab integration tests: merge describe blocks and use scoped within queries -
#20668
0076ce3Thanks @dilaouid! - feat(lwd): no contact screen in recipient screen -
#20681
6543cfdThanks @YazhuEth! - Add an "add contact" step to the send flow, opened from the recipient card, offering to create a new contact or to add the address to an existing one -
#20645
dd3baf3Thanks @claudiiafg! - Add shared edit contact signer validation state with mocked signer mismatch handling and wire Desktop and Mobile contact edit flows. -
#20788
7c20f72Thanks @mcayuelas-ledger! - Add the Pay action tiles to the LWD Card screen: mount the shared ActionTiles view-model under the balance hero (Add stablecoin / Request / New payment), add per-tileappearancesupport to the ActionTiles component, and extract the PayTab action-tiles and balance labels into dedicated hooks. -
#20945
e63995dThanks @benruseau! - LWD 4.17.0 release notes -
#20796
320b488Thanks @dilaouid! - fix(lwd): new send flow keeping the previous recipient after skip memo and edit -
#20761
80fb6aeThanks @mcayuelas-ledger! - Stabilize the PayTab balance integration test by asserting a settled funded state -
#20732
0952b2eThanks @jiyuzhuang! - Simplify Welcome analytics opt-in V2 gating to lwdAnalyticsOptInScreenV2 only -
#20658
a79b9aaThanks @semeano! - Zcash: add self transfer option on send modal -
#20798
1de6156Thanks @cted-ledger! - Name the Ironwood shielded operations and stop listing Zcash self-transfers.The Ironwood operation types were declared and given icons but never labelled, so a received or sent Ironwood transaction rendered its raw key in the history. They now carry the same labels, address cells and "Private (Ironwood)" transaction-type detail as the Sapling and Orchard ones.
A shielded transaction that moved no value across the wallet boundary — every note landing on the account's own internal address — was also emitted as a history row of its own: no counterparty, a value of 0, and, when it was the shielded leg of a transparent-funded sweep, a duplicate of the transparent operation already listing that transaction. Such a transaction now produces an operation typed
NONE, which keeps it in the account data while leaving it out of the lists. Its classification is unchanged, so the fee and balance logic that reads it is unaffected. -
#20714
93406e8Thanks @semeano! - Show a warning in the send flow when the Zcash private balance is selected as source and funds were shielded in the last 15 minutes, explaining that recently shielded funds need confirmations and scanning before they are spendable
Patch Changes
- Updated dependencies [
061d873,ec8baad,a3164d8,9accbb8,841f7a0,5ff320a,54fcd49,e4e8d08,14cf5b8,0dc2509,8605089,c3b8717,1a2df41,2ab3cb8,55768ad,696f871,e07e0ba,45dc82e,a7b0bae,7c8d5df,f2f3ec9,526ca7b,89171ea,d0ac51c,840de0d,3c36af2,46eb674,da0a5ce,84e3f9d,19e578a,eecf99a,6165c9d,d43f03d,21323c6,f5b2359,f040998,77dc4d9,030fc67,a781abe,fe57525,13d6db5,5b39a67,0807eca,e72d6ff,6a437fd,352c6a3,68448cd,d1a01e8,75d0c9b,eb4d29e,42fca4a,a61f702,e291645,4faf5cd,2edf614,9e45705,e54d98b,004c294,481bc40,b6da6b1,ca74f9d,3dd9308,fae92bf,0076ce3,8153370,6543cfd,dd3baf3,7c20f72,0fc43c1,c8adec3,b2896a9,320b488,e0d646e,e3e7804,79882e2,96ac61e,5a96e09,a20805c,030b427,a79b9aa,1de6156,4cc31ec,02ddf7e,93406e8]:- @ledgerhq/live-common@37.3.0
- @features/flow-pay-card-balance@0.2.0
- @features/flow-pay-card-deposit@0.2.0
- @ledgerhq/coin-zcash@0.4.0
- @shared/feature-flags@0.19.0
- @domain/api-aggregated-assets@0.4.0
- @features/platform-contacts@0.3.0
- @domain/entity-contact@0.7.0
- @features/flow-contacts@0.7.0
- @ledgerhq/live-dmk-shared@0.31.0
- @features/flow-large-screen-upsell@1.0.0
- @ledgerhq/ledger-auth@0.4.0
- @ledgerhq/ledger-key-ring-protocol@0.20.0
- @shared/auth@0.5.0
- @shared/api-services@0.4.0
- @features/platform-card@0.2.0
- @shared/env@0.3.0
- @features/flow-contacts-add-contact@0.3.0
- @ledgerhq/types-devices@7.0.0
- @ledgerhq/coin-concordium@1.0.0
- @ledgerhq/coin-filecoin@2.0.0
- @ledgerhq/coin-cardano@1.0.0
- @ledgerhq/coin-canton@1.0.0
- @ledgerhq/coin-casper@3.0.0
- @ledgerhq/coin-cosmos@1.0.0
- @ledgerhq/coin-evm@5.0.0
- @features/flow-contacts-introduction@0.2.0
- @ledgerhq/types-live@6.120.0
- @features/flow-pay-card-feature-tour@0.3.0
- @features/flow-pay-card-auth@0.3.0
- @devtools/bindings@0.4.0
- @ledgerhq/ledger-wallet-framework@3.0.0
- @features/platform-aggregated-assets@0.4.0
- @devtools/transport-panel@0.5.0
- @devtools/wire@0.4.0
- @domain/entity-currency-token@0.5.0
- @domain/api-currency-token@0.5.0
- @ledgerhq/asset-detail@0.11.1
- @ledgerhq/live-dmk-desktop@0.20.7
- @ledgerhq/coin-bitcoin@0.51.1
- @features/platform-currencies@0.6.1
- @features/platform-feature-flags@0.6.6
- @ledgerhq/asset-aggregation@0.13.1
- @domain/api-altcoins-sentiment@0.3.2
- @domain/api-currency-fiat@0.4.1
- @domain/api-market-sentiment@0.3.2
- @domain/api-push-devices@0.2.2
- @features/platform-env@0.2.1
- @ledgerhq/live-dmk-speculos@0.10.5
- @ledgerhq/wallet-analytics@0.3.4
- @ledgerhq/wallet-pnl@0.7.7
- @ledgerhq/device-intent@6.0.0
- @ledgerhq/domain-service@1.8.15
- @ledgerhq/live-countervalues@0.24.3
- @ledgerhq/live-countervalues-react@0.16.7
- @ledgerhq/live-wallet@1.0.1
- @devtools/shell@0.8.1
- @domain/entity-currency@0.4.1
- @features/flow-analytics-consent@0.2.2
- @ledgerhq/wallet-btc@0.3.0