4.9.0
Minor Changes
- #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
- #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.
- #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).
- #18555
8c2d80cThanks @mcayuelas-ledger! - Use base color instead of red for the unread operation dot indicator
- #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 consumes selectTopStocks instead 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 USDfiat 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.



