4.9.0
Minor Changes
-
#18333
1bb2d22Thanks @qperrot! - Fix: add support link for SEI delegation warning -
#18328
c714634Thanks @Valentin-Ledger! - Add Borrow info bottom sheet for the mobile Borrow Live App, with a dedicated Redux slice (borrow.infoBottomSheet) and acustom.bottomSheet.infowallet API handler so the embedded webview can open contextual help drawers. TheInfoBottomSheetview is now shared between the Borrow and Earn Live Apps. -
#18279
3601c5eThanks @Valentin-Ledger! - Remove the outer navigation header (with custom back button) wrapping the Borrow LiveApp so the LiveApp's own internal header/back button is used instead -
#18526
52474bdThanks @tonykhaov! - Fix mobile notification opt-in to enable app notification categories directly -
#18267
44811ccThanks @jiyuzhuang! - Add transaction alerts notification drawer, per-target opt-out dismissals, and drawerPromptTarget analytics -
#18394
abd103cThanks @sergiubreban! - fix: hide navigation when user is on earn simulator screen -
#18255
1da564fThanks @dilaouid! - feat(lwdm): hook in llc for signature view model -
#18362
9fe00b7Thanks @jiyuzhuang! - Add theme-specific awareness modal hero images, feature intro border, carousel navigation label, and related UI improvements -
#18355
d00229bThanks @jiyuzhuang! - Use performance chart illustration for onboarding notification prompt and add NotificationsPrompt component tests -
#18315
bfbd74dThanks @shazzzam! - Display the correct fee currency for Celo CIP-64 transactions (fees paid in tokens such as USDT/USDC instead of native CELO). Adds afeeCurrencyAddressfield toCeloOperationExtra, aneth_getTransactionByHash-based sync enrichment, and askipoption touseTokenByAddressInCurrencyfor conditional CAL lookups. -
#18286
86a74c0Thanks @YazhuEth! - Fix SEI delegation amount screen displaying the rawNotEnoughBalanceerror name instead of a translated message. The amount step now renders the error throughTranslatedError, so an over-balance delegation shows "Sorry, insufficient funds". -
#18348
8a7fca0Thanks @OlivierFreyssinet! - Keep the screen awake while the Device Intent Executor (DIE) is open, so the phone does not sleep during a device flow -
#18302
3cf8c3fThanks @OlivierFreyssinet! - Replace the DeviceIntentExecutorcancellableUIprop with theModalLockpattern to control bottom sheet dismissability. The drawer is now locked (no close button, backdrop and pan-down disabled) while a device action is pending or in progress (unlock, allow secure connection, confirm open app, installing app, loading), and dismissable otherwise. -
#18454
6b181c5Thanks @dilaouid! - fix(lwm): position toggle button amount screen new send flow -
#18337
fdd5d35Thanks @RobinVncnt! - fix: add tracking on select device button clicked -
#18330
f275d88Thanks @beths-ledger! - Fix Earn dashboard losing its background and main navigation (top bar + tab bar) after returning from an in-webview intent flow (deposit/withdraw/simulate). The active flow is now derived from the live webview URL instead of the stale nativeintentparam, and the app navigates back to the Earn dashboard tab when the flow is exited. -
#18252
eee243cThanks @YazhuEth! - Add Monad withdraw flow on mobile to finalize matured undelegations from the undelegation drawer. Also fix the mobile undelegation list display: unique row keys for Monad withdrawal slots sharing a completion date, and proper separation from the delegation list. -
#18360
b21a093Thanks @Moustafa-Koterba! - feat(lwm): prevent exchange to broadcast multiple times -
#18237
8d79393Thanks @ysitbon! - Migrate@ledgerhq/live-common's internal feature-flag consumers off its ReactfeatureFlagsContext module and@ledgerhq/types-livefeature types, onto the Redux-backed@shared/feature-flags/@features/platform-feature-flagspackages, and remove thefeatureFlagsmodule along with the apps' now-inertFeatureFlagsContextBridge. Remaining external React consumers (both apps) are repointed to@features/platform-feature-flags;@ledgerhq/live-dmk-desktopreceives itsldmkTransportflag via a prop instead of depending on the feature-flags package; non-React imperative reads use an injected getter or the relocatedlive-common/firebase/featureFlagsreader. Adds the platform-specificformatToFirebaseFeatureId/formatDefaultFeaturesto@features/platform-feature-flagsand the genericisValidFeatureIdto@shared/feature-flags. No behavioral change — resolved flag values are identical. -
#18386
24d19ccThanks @ysitbon! - Repoint the remaining@ledgerhq/types-livefeature-type consumers (desktop app + desktop/mobile e2e) onto@shared/feature-flags, taking in-repo usage of the legacy types-live feature types to zero. Also drop now-dead feature-flag tooling config: the@ledgerhq/live-common/featureFlags/indexunimportedentry inlive-dmk-desktop, and the deletedFeatureFlagsContextBridgeeslint-guardrail exemptions in both apps (the block rules against re-introducing the deleted module are kept). -
#18332
0d684e0Thanks @dilaouid! - feat(lwm): add copy paste address from clipboard new send flow -
#18555
8c2d80cThanks @mcayuelas-ledger! - Use base color instead of red for the unread operation dot indicator -
#18553
e9edcfaThanks @dilaouid! - fix(lwdm): switch mode amount step new send flow changes header -
#18317
1e6afe5Thanks @koda-apps! - Fix LiFi link in swap history on Ledger Live Mobile pointing to deactivated page -
#18401
66a27f2Thanks @dilaouid! - feat(lwm): update flow wizard removing bottomsheet from api - die will manage it itself -
#18266
835b816Thanks @amaslakov! - Add the Tezos unstake flow and the unstake-required gate to the mobile staking dashboard. Users can now unstake funds, and are prompted to unstake first when changing baker or ending delegation while funds are still staked. -
#18428
67c3a67Thanks @LucasWerey! - Add the Global Search default-sections data on mobile, fed by DADA. Cryptos (top 3) and stablecoins (top 2) render as market rows; stocks (top 10) as pills.Share the DADA asset-discovery selection in
@ledgerhq/live-common(selectTopStocks,selectTopAssetsByCategory,StockSuggestion) so desktop and mobile use one implementation; desktop's stocks section now consumesselectTopStocksinstead of its own copy. -
#18431
93f22d7Thanks @LucasWerey! - Render the Global Search default sections when no search is active: Cryptos (3) and Stablecoins (2) as compact asset rows (icon, name, price + 24h change on one line), and Stocks (up to 20) as pills laid out in two horizontally-scrollable rows. Each section has a pressable header (tracked viabutton_clicked) and shows skeletons while loading. -
#18434
22dad59Thanks @LucasWerey! - Wire Global Search navigation: tapping an asset row or stock pill opens its detail (openFromMarket), the Cryptos "See all" opens the Market list (all), and the Stocks "See all" opens it on the Stocks category. The Stablecoins "See all" stays inert until the Market list gains a stablecoins category. -
#18445
a5ab02bThanks @LucasWerey! - Polish the Global Search feature: prices and market caps now follow the user's counter-value currency setting (converting DADA's USD values via the USD→fiat rate, matching the Modular Asset Drawer), the results and default views show an error state when their data fails to load, the header back button aligns with the other screens, and the GlobalSearch analytics events (search_open,search_query,asset_clicked) are wired per the tracking plan. Data hooks moved to a feature-levelhooks/folder to match the MVVM architecture. -
#18433
bd98e72Thanks @LucasWerey! - Render the Global Search results when a search is active: matching assets as sharedAssetListItemmarket rows (with the Market screen's bottom fade gradient), three list skeletons while the query is loading, and a "No assets found" empty state (reusing the Market screen pattern) when the query returns nothing. Default sections are hidden while searching and restored when the input is cleared. -
#18416
062f41aThanks @LucasWerey! - Add the Global Search screen scaffold. Registers theGlobalSearchnavigator in the base navigator with a fade entrance, and renders a custom header (back button + "Search assets" input) that auto-focuses after the transition. Fires thesearch_opentracking event on open. -
#18429
34871e6Thanks @LucasWerey! - Wire Global Search results: as the user types (debounced), search across all asset types via DADA and exposesearchResults,isLoadingSearch, andhasNoResults. Input handling and thesearch_querytracking event use the shareduseSearchCommonhook. -
#18410
08a13d9Thanks @LucasWerey! - Add a Global Search entry point to the Portfolio top bar. The search icon is gated behind theassetDiscoverabilityWallet 4.0 param (shouldDisplayAssetDiscoverability) and navigates to the upcoming Global Search screen. -
#18417
b1e56f3Thanks @LucasWerey! - Extract the Global Search screen logic intouseGlobalSearchViewModel, following the MVVM Container → ViewModel → View split. The ViewModel owns the search state,isSearchActive, back navigation, andsearch_opentracking, and exposes placeholders for the default sections and search results (wired in follow-up PRs). -
#18509
2241e4fThanks @dilaouid! - feat(llc): new send flow custom fees common hooks -
#18242
5ae5191Thanks @sarneijim! - Migrate SyncOnboarding TwoStepStepper module to MVVM architecture under SyncOnboardingCompanion -
#18672
6ded0c1Thanks @OlivierFreyssinet! - Update DMK to fix recovery-mode restore device connection -
#18297
d2cf973Thanks @mitchellv-ledger! - Add post onboarding widget completed track event to lwm -
#18294
f4f4185Thanks @LucasWerey! - LWD - W4.0 - Add the Market category switcher (All / Stocks / Favorites) on the V4 Market page, gated by thelwdWallet40.assetDiscoverabilityfeature flag. The selected category is persisted across reloads and supersedes the legacy starred filter drawer when the flag is on. The shared category helpers (parseMarketListCategory,getMarketFilter,isStockMarketCurrency) now live in@ledgerhq/live-common/market/utils/categoryand are reused by both desktop and mobile. -
#18483
821ec45Thanks @LucasWerey! - Add a Stocks toggle to the "Accounts by type" debug account generator (dev-only tooling). -
#18502
d25dc3aThanks @LucasWerey! - Global Search (mobile): auto-open the keyboard on Android. The search input now focuses once the screen's fade-in transition has finished, so the soft keyboard reliably appears on Android (iOS behaviour is unchanged). -
#18517
df20bb2Thanks @LucasWerey! - Fix the Market Banner Favorites filter erroring on mobile. The favorites request sent an invalidpageSizeto the market endpoint (the tile count× 2, not one of the supported 1/5/20/50 values), which returned an error. Favorites now request a valid page size and, like desktop, show starred coins even when not buyable/swappable. -
#18378
8ab763aThanks @LucasWerey! - Wire the market banner ranking to its data source:trending/gainersshow the top positive price-change performers,losersthe top negative ones, andfavoritesthe user's starred assets. When the active ranking isfavoritesand the user removes their last favourite, the banner falls back totrendingand resets the persisted ranking. -
#18378
7cd259aThanks @LucasWerey! - Build the market banner filter selection drawer: a LumenOptionListbottom sheet with the four filter options (Trending, Gainers, Losers, Favorites). The current filter is pre-selected, picking an option dispatchessetMarketBannerRanking, closes the drawer and fires thechange_sort_market_bannerevent. The Favorites row is disabled with a "No favorite yet" description when the user has no starred assets. -
#18358
f422853Thanks @LucasWerey! - Add a persistedmarketBannerRedux slice holding the market banner ranking (ranking), mirroring ledger-live-desktop. ExposessetMarketBannerRankingandselectMarketBannerRanking, defaults to"trending", and survives app restart via MMKV. -
#18524
77ef117Thanks @LucasWerey! - Market Banner improvements on the Home screen:- Replace the filter MediaButton with a right-aligned text + chevron control using the text-muted color (and its pressed token), keeping a clean 12px gap below the section title.
- Ignore the persisted ranking filter when asset discoverability is off (fall back to the default ranking), instead of keeping the previously selected filter applied. The stored preference is preserved for when the feature is re-enabled.
-
#18400
9a00ab4Thanks @LucasWerey! - Add unit tests covering the market banner filter tracking event (change_sort_market_banner): it fires with the correctsortfor each of the four options and is not fired when reselecting the already active option. -
#18358
3f7cd65Thanks @LucasWerey! - Add the market banner filter trigger: aMediaButtonselector in the banner subheader showing the active filter label and opening the filter selection drawer on press. Gated behindassetDiscoverability. Also renames the banner title to "Market". -
#18565
443b210Thanks @LucasWerey! - Update the footnote on the Market highlight cards (Mood index, Altcoin index, Total market cap) to "Data is sourced from CoinMarketCap. Provided for informational purposes only.", and add the missing footnote to the Total market cap card. -
#18542
b8e85a3Thanks @LucasWerey! - Market screen category fixes (mobile):- The selected category is no longer persisted — opening the Market list always starts on the "all" category (a route param such as "stocks" still sets the initial category for that visit). The category was removed from the persisted
marketListConfigredux slice and is now local screen state. - Fixed the category filter tabs not switching when a category was pre-selected (e.g. arriving from a "stocks" link): the previous logic re-applied the route category on every change, reverting the tap. Tabs are now plain local state, so any tab can be selected.
- The selected category is no longer persisted — opening the Market list always starts on the "all" category (a route param such as "stocks" still sets the initial category for that visit). The category was removed from the persisted
-
#18544
6c08499Thanks @deepyjr! - Fix Market screen spacing: set the top and bottom margins around the highlights gauge row to 16 -
#18559
63ffa0dThanks @LucasWerey! - Refine the Market screen layout: the category tabs stick to the top while scrolling the asset list, with harmonised spacing and category-switch scroll behaviour (tabs stay pinned, the new list starts from its first item when already scrolled, and short result sets no longer snap to the top). Set the highlights gauges (Fear & Greed, Altcoin season) to a fixed 44x32. Change the Market search bar placeholder to "Search asset" (address search is no longer supported). -
#18570
06b6175Thanks @LucasWerey! - Enable the "Volume" sorting option in the Market filters: it is no longer greyed out and now sorts the asset list by total volume (descending), using the total-volume endpoint support. -
#18495
d12c347Thanks @LucasWerey! - Remove the Stablecoins section from the mobile Global Search default view. The Cryptos section still excludes stablecoins, so they no longer appear in the search defaults. -
#18335
b233373Thanks @LucasWerey! - Make the Market screen asset category controls (All / Stocks / Favorites) horizontally scrollable so every option stays fully visible — including categories added later. The segmented control now sizes to its content and scrolls within a horizontal ScrollView instead of being squeezed to fit the screen width. -
#18342
d3829e5Thanks @LucasWerey! - Add trending categories to the Market screen. Trending categories are fetched from/v3/categories/trendingand appended to the category controls (after All / Stocks / Favorites); selecting one filters the asset list via the/v3/marketscategoriesparam.Shared logic lives in
@ledgerhq/live-common/marketso desktop can reuse it: thegetTrendingCategoriesRTK Query endpoint (useGetTrendingCategoriesQuery), thecategoriesrequest param threaded throughfetchList/useMarketData, and category helpers (widenedMarketListCategory,isBuiltInMarketListCategory,getMarketCategoriesParam). -
#18465
f59b441Thanks @YazhuEth! - Add memo/tag input to the new send flow, and clear an empty memo/tag in applyMemoToTransaction instead of applying 0 or an empty string -
#18432
3caa099Thanks @mitchellv-ledger! - Update swap lottie in product tour -
#18329
21c7211Thanks @francois-guerin-ledger! - Support Monad compound (restake rewards): add the per-chaincompoundRewardstaking operation to coin-evm (nativecompound(uint64)precompile call, nonpayable) and a Claim/Compound toggle in the EVM claim-rewards flow on desktop and mobile. The toggle is only shown for compound-capable chains (Monad) and defaults to Claim; the history operation type isREWARD, matching the existing claim flow. -
#18642
93a5bcdThanks @hedi-edelbloute! - feat: add new evm chain -
#18298
e6c617bThanks @LucasWerey! - ExtractquickActionsCtasVariantout of thefeature_lwm_wallet_40feature flag into a dedicatedfeature_lwm_quick_actions_ctas_variantflag so the A/B test can run independently from other Wallet 4.0 parameters -
#18496
37ddb59Thanks @KVNLS! - Fix the global synchronization spinner spinning indefinitely when the portfolio contains only empty accounts (LIVE-32175). Empty accounts are never tracked for countervalues, sogetPortfolioreportedbalanceAvailable: falseforever, which keptisColdStart/isBalanceLoadingtrue and the sync lifecycle stuck on"syncing".getPortfolionow reports the balance as available when every still-unpriced account is empty (the total is a known 0), so the spinner settles and the balance shows instead of a permanent placeholder. -
#17997
04e3349Thanks @Justkant! - Harden custom deeplink opening behind platform feature flags. -
#18321
6fc5965Thanks @LucasWerey! - Share a singleArcGaugeIndicatorcomponent (matching the desktop naming) between the Market screen's Mood index (Fear & Greed) and Season (Altcoin Season) cards so both render an identical gauge — same geometry, animation, sizing, and cursor — differing only by gradient colors. Aligns the Season card's pressed state with the Mood index card. -
#18287
84f147dThanks @mitchellv-ledger! - Migrate useTwoStepDesync lwm to mvvm -
#18554
1660756Thanks @dilaouid! - fix(lwdm): remove stellar specific mention on error message new send flow -
#18561
dd3547bThanks @mcayuelas-ledger! - Use the dedicated CVStokenized-stockcategory for the Market stocks filter instead of the hardcodedfilter=stock+ client-side id matching, and stop firing a spuriousto=usdmarket request while the supported counter-values list is still loading. -
#18469
6e0f83dThanks @LucasWerey! - Add the Portfolio Stocks data layer.useDefaultStocksAssetsfetches the top stocks (market-cap ordered) from the DADA stocks category viauseStocksData+selectTopStocksfor the discovery scenario (no-op when disabled).useCategorizedAssetsFromPortfolionow returns astocksbucket split out ofcryptos, identified by DADA currency id via the newuseStockAssetIdshook — matching by id rather than ticker avoids symbol collisions (e.g. a crypto like TON is no longer misclassified as a stock). -
#18470
02980c8Thanks @LucasWerey! - Add the Portfolio Stocks section and wire it intoAssetsSectionsbehind theassetDiscoverabilityflag. When the user holds stocks it renders a vertical list (max 5, mirroring the Crypto/Stablecoins sections) with a "Show more" header that opens the Crypto screen filtered to stocks — extendingCryptoVariantwith"stocks"and the asset-list filter accordingly. When the user holds none it renders a horizontal 2-row discovery grid of the top stocks (MediaButton pills) with an "Explore All" header that opens the Market list filtered to stocks; tapping a pill opens that stock's market detail. The 2-row grid is extracted into a sharedStockPillRowscomponent reused by Global Search (removing the duplicated grid). Subheader spacing: the holdings list matches the other portfolio sections, the discovery grid uses s12. -
#18256
eb1dae8Thanks @gre-ledger! - Derive "supported currencies" from the coin-modules registry instead ofsetSupportedCurrencies.Each
CoinModuleLoadernow declares asupportedCoins: CryptoCurrencyId[]field, and a currency is supported when it appears in a registered loader'ssupportedCoins. The frameworksetSupportedCurrencies/listSupportedCurrencies/isCurrencySupportedand theEXPERIMENTAL_CURRENCIESenv are removed;listSupportedCurrencies/isCurrencySupportedare now exported from@ledgerhq/live-common/currenciesbacked by the registry. Apps no longer maintain a supported-currencies list — registering the coin modules is what makes their currencies supported. -
#18310
e95d1ceThanks @liviuciulinaru! - Track Nano S swap incompatibility views: add page-view and CTA click analytics for the "Explore compatible devices" and "Swap with another provider" actions -
#18560
9dacc01Thanks @dilaouid! - chore(lwdm): refactor memo feature for new send flow -
#18516
bf9d9f3Thanks @dilaouid! - feat(lwm): custom fees new send flow screen -
#18270
7d06bb4Thanks @qperrot! - Fix: new message for sei delegation when address not linked -
#18505
e4d8136Thanks @koda-apps! - Reorder v4 market categories -
#18390
6e028f3Thanks @qperrot! - fix(lwm): use SafeAreaView for EVM claim rewards validator list UI
Patch Changes
- Updated dependencies [
81ceb34,9ddf006,4d59f9d,b9a2a9e,bfbd74d,558e633,3cf8c3f,da1c0c8,8d79393,031097a,9ab3a61,05d8db8,16b9bbc,82a143f,21c7211,93a5bcd,e6c617b,37ddb59,bbb92a1,04e3349,eb1dae8]:- @ledgerhq/live-env@2.39.0
- @ledgerhq/types-live@6.112.0
- @ledgerhq/coin-evm@4.3.0
- @ledgerhq/live-dmk-mobile@0.26.0
- @ledgerhq/cryptoassets@13.52.0
- @ledgerhq/coin-cosmos@0.36.0
- @ledgerhq/device-intent@3.3.0
- @shared/feature-flags@0.11.0
- @features/platform-feature-flags@0.4.0
- @ledgerhq/types-cryptoassets@7.38.0
- @ledgerhq/ledger-wallet-framework@2.2.0
- @ledgerhq/wallet-pnl@0.6.0
- @ledgerhq/live-currency-format@0.10.0
- @ledgerhq/live-countervalues@0.20.0
- @ledgerhq/client-ids@0.10.3
- @ledgerhq/coin-bitcoin@0.44.1
- @ledgerhq/coin-canton@0.26.2
- @ledgerhq/coin-concordium@0.13.1
- @ledgerhq/coin-filecoin@1.25.1
- @ledgerhq/coin-multiversx@0.17.4
- @ledgerhq/coin-stacks@0.21.7
- @ledgerhq/hw-ledger-key-ring-protocol@0.10.6
- @ledgerhq/ledger-key-ring-protocol@0.15.1
- @ledgerhq/live-dmk-speculos@0.9.2
- @ledgerhq/live-network@2.6.5
- @ledgerhq/live-wallet@0.27.3
- @ledgerhq/coin-casper@2.13.7
- @ledgerhq/domain-service@1.8.7
- @ledgerhq/live-countervalues-react@0.15.1