github LedgerHQ/ledger-live live-mobile@4.9.0

6 hours ago

4.9.0

Minor Changes

  • #18333 1bb2d22 Thanks @qperrot! - Fix: add support link for SEI delegation warning

  • #18328 c714634 Thanks @Valentin-Ledger! - Add Borrow info bottom sheet for the mobile Borrow Live App, with a dedicated Redux slice (borrow.infoBottomSheet) and a custom.bottomSheet.info wallet API handler so the embedded webview can open contextual help drawers. The InfoBottomSheet view is now shared between the Borrow and Earn Live Apps.

  • #18279 3601c5e Thanks @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 52474bd Thanks @tonykhaov! - Fix mobile notification opt-in to enable app notification categories directly

  • #18222 9ddf006 Thanks @henri-ly! - add undelegate for monad

  • #18267 44811cc Thanks @jiyuzhuang! - Add transaction alerts notification drawer, per-target opt-out dismissals, and drawerPromptTarget analytics

  • #18394 abd103c Thanks @sergiubreban! - fix: hide navigation when user is on earn simulator screen

  • #18255 1da564f Thanks @dilaouid! - feat(lwdm): hook in llc for signature view model

  • #18362 9fe00b7 Thanks @jiyuzhuang! - Add theme-specific awareness modal hero images, feature intro border, carousel navigation label, and related UI improvements

  • #18355 d00229b Thanks @jiyuzhuang! - Use performance chart illustration for onboarding notification prompt and add NotificationsPrompt component tests

  • #18315 bfbd74d Thanks @shazzzam! - Display the correct fee currency for Celo CIP-64 transactions (fees paid in tokens such as USDT/USDC instead of native CELO). Adds a feeCurrencyAddress field to CeloOperationExtra, an eth_getTransactionByHash-based sync enrichment, and a skip option to useTokenByAddressInCurrency for conditional CAL lookups.

  • #18286 86a74c0 Thanks @YazhuEth! - Fix SEI delegation amount screen displaying the raw NotEnoughBalance error name instead of a translated message. The amount step now renders the error through TranslatedError, so an over-balance delegation shows "Sorry, insufficient funds".

  • #18348 8a7fca0 Thanks @OlivierFreyssinet! - Keep the screen awake while the Device Intent Executor (DIE) is open, so the phone does not sleep during a device flow

  • #18302 3cf8c3f Thanks @OlivierFreyssinet! - Replace the DeviceIntentExecutor cancellableUI prop with the ModalLock pattern 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 6b181c5 Thanks @dilaouid! - fix(lwm): position toggle button amount screen new send flow

  • #18337 fdd5d35 Thanks @RobinVncnt! - fix: add tracking on select device button clicked

  • #18330 f275d88 Thanks @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 native intent param, and the app navigates back to the Earn dashboard tab when the flow is exited.

  • #18252 eee243c Thanks @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 b21a093 Thanks @Moustafa-Koterba! - feat(lwm): prevent exchange to broadcast multiple times

  • #18237 8d79393 Thanks @ysitbon! - Migrate @ledgerhq/live-common's internal feature-flag consumers off its React featureFlags Context module and @ledgerhq/types-live feature types, onto the Redux-backed @shared/feature-flags / @features/platform-feature-flags packages, and remove the featureFlags module along with the apps' now-inert FeatureFlagsContextBridge. Remaining external React consumers (both apps) are repointed to @features/platform-feature-flags; @ledgerhq/live-dmk-desktop receives its ldmkTransport flag via a prop instead of depending on the feature-flags package; non-React imperative reads use an injected getter or the relocated live-common/firebase/featureFlags reader. Adds the platform-specific formatToFirebaseFeatureId / formatDefaultFeatures to @features/platform-feature-flags and the generic isValidFeatureId to @shared/feature-flags. No behavioral change — resolved flag values are identical.

  • #18386 24d19cc Thanks @ysitbon! - Repoint the remaining @ledgerhq/types-live feature-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/index unimported entry in live-dmk-desktop, and the deleted FeatureFlagsContextBridge eslint-guardrail exemptions in both apps (the block rules against re-introducing the deleted module are kept).

  • #18332 0d684e0 Thanks @dilaouid! - feat(lwm): add copy paste address from clipboard new send flow

  • #18555 8c2d80c Thanks @mcayuelas-ledger! - Use base color instead of red for the unread operation dot indicator

  • #18553 e9edcfa Thanks @dilaouid! - fix(lwdm): switch mode amount step new send flow changes header

  • #18317 1e6afe5 Thanks @koda-apps! - Fix LiFi link in swap history on Ledger Live Mobile pointing to deactivated page

  • #18401 66a27f2 Thanks @dilaouid! - feat(lwm): update flow wizard removing bottomsheet from api - die will manage it itself

  • #18266 835b816 Thanks @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 67c3a67 Thanks @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 93f22d7 Thanks @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 via button_clicked) and shows skeletons while loading.

  • #18434 22dad59 Thanks @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 a5ab02b Thanks @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-level hooks/ folder to match the MVVM architecture.

  • #18433 bd98e72 Thanks @LucasWerey! - Render the Global Search results when a search is active: matching assets as shared AssetListItem market 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 062f41a Thanks @LucasWerey! - Add the Global Search screen scaffold. Registers the GlobalSearch navigator 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 the search_open tracking event on open.

  • #18429 34871e6 Thanks @LucasWerey! - Wire Global Search results: as the user types (debounced), search across all asset types via DADA and expose searchResults, isLoadingSearch, and hasNoResults. Input handling and the search_query tracking event use the shared useSearchCommon hook.

  • #18410 08a13d9 Thanks @LucasWerey! - Add a Global Search entry point to the Portfolio top bar. The search icon is gated behind the assetDiscoverability Wallet 4.0 param (shouldDisplayAssetDiscoverability) and navigates to the upcoming Global Search screen.

  • #18417 b1e56f3 Thanks @LucasWerey! - Extract the Global Search screen logic into useGlobalSearchViewModel, following the MVVM Container → ViewModel → View split. The ViewModel owns the search state, isSearchActive, back navigation, and search_open tracking, and exposes placeholders for the default sections and search results (wired in follow-up PRs).

  • #18509 2241e4f Thanks @dilaouid! - feat(llc): new send flow custom fees common hooks

  • #18242 5ae5191 Thanks @sarneijim! - Migrate SyncOnboarding TwoStepStepper module to MVVM architecture under SyncOnboardingCompanion

  • #18672 6ded0c1 Thanks @OlivierFreyssinet! - Update DMK to fix recovery-mode restore device connection

  • #18297 d2cf973 Thanks @mitchellv-ledger! - Add post onboarding widget completed track event to lwm

  • #18294 f4f4185 Thanks @LucasWerey! - LWD - W4.0 - Add the Market category switcher (All / Stocks / Favorites) on the V4 Market page, gated by the lwdWallet40.assetDiscoverability feature 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/category and are reused by both desktop and mobile.

  • #18483 821ec45 Thanks @LucasWerey! - Add a Stocks toggle to the "Accounts by type" debug account generator (dev-only tooling).

  • #18502 d25dc3a Thanks @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 df20bb2 Thanks @LucasWerey! - Fix the Market Banner Favorites filter erroring on mobile. The favorites request sent an invalid pageSize to 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 8ab763a Thanks @LucasWerey! - Wire the market banner ranking to its data source: trending/gainers show the top positive price-change performers, losers the top negative ones, and favorites the user's starred assets. When the active ranking is favorites and the user removes their last favourite, the banner falls back to trending and resets the persisted ranking.

  • #18378 7cd259a Thanks @LucasWerey! - Build the market banner filter selection drawer: a Lumen OptionList bottom sheet with the four filter options (Trending, Gainers, Losers, Favorites). The current filter is pre-selected, picking an option dispatches setMarketBannerRanking, closes the drawer and fires the change_sort_market_banner event. The Favorites row is disabled with a "No favorite yet" description when the user has no starred assets.

  • #18358 f422853 Thanks @LucasWerey! - Add a persisted marketBanner Redux slice holding the market banner ranking (ranking), mirroring ledger-live-desktop. Exposes setMarketBannerRanking and selectMarketBannerRanking, defaults to "trending", and survives app restart via MMKV.

  • #18524 77ef117 Thanks @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 9a00ab4 Thanks @LucasWerey! - Add unit tests covering the market banner filter tracking event (change_sort_market_banner): it fires with the correct sort for each of the four options and is not fired when reselecting the already active option.

  • #18358 3f7cd65 Thanks @LucasWerey! - Add the market banner filter trigger: a MediaButton selector in the banner subheader showing the active filter label and opening the filter selection drawer on press. Gated behind assetDiscoverability. Also renames the banner title to "Market".

  • #18565 443b210 Thanks @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 b8e85a3 Thanks @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 marketListConfig redux 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.
  • #18544 6c08499 Thanks @deepyjr! - Fix Market screen spacing: set the top and bottom margins around the highlights gauge row to 16

  • #18559 63ffa0d Thanks @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 06b6175 Thanks @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 d12c347 Thanks @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 b233373 Thanks @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 d3829e5 Thanks @LucasWerey! - Add trending categories to the Market screen. Trending categories are fetched from /v3/categories/trending and appended to the category controls (after All / Stocks / Favorites); selecting one filters the asset list via the /v3/markets categories param.

    Shared logic lives in @ledgerhq/live-common/market so desktop can reuse it: the getTrendingCategories RTK Query endpoint (useGetTrendingCategoriesQuery), the categories request param threaded through fetchList/useMarketData, and category helpers (widened MarketListCategory, isBuiltInMarketListCategory, getMarketCategoriesParam).

  • #18465 f59b441 Thanks @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 3caa099 Thanks @mitchellv-ledger! - Update swap lottie in product tour

  • #18329 21c7211 Thanks @francois-guerin-ledger! - Support Monad compound (restake rewards): add the per-chain compoundReward staking operation to coin-evm (native compound(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 is REWARD, matching the existing claim flow.

  • #18642 93a5bcd Thanks @hedi-edelbloute! - feat: add new evm chain

  • #18298 e6c617b Thanks @LucasWerey! - Extract quickActionsCtasVariant out of the feature_lwm_wallet_40 feature flag into a dedicated feature_lwm_quick_actions_ctas_variant flag so the A/B test can run independently from other Wallet 4.0 parameters

  • #18496 37ddb59 Thanks @KVNLS! - Fix the global synchronization spinner spinning indefinitely when the portfolio contains only empty accounts (LIVE-32175). Empty accounts are never tracked for countervalues, so getPortfolio reported balanceAvailable: false forever, which kept isColdStart/isBalanceLoading true and the sync lifecycle stuck on "syncing". getPortfolio now 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 04e3349 Thanks @Justkant! - Harden custom deeplink opening behind platform feature flags.

  • #18321 6fc5965 Thanks @LucasWerey! - Share a single ArcGaugeIndicator component (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 84f147d Thanks @mitchellv-ledger! - Migrate useTwoStepDesync lwm to mvvm

  • #18554 1660756 Thanks @dilaouid! - fix(lwdm): remove stellar specific mention on error message new send flow

  • #18561 dd3547b Thanks @mcayuelas-ledger! - Use the dedicated CVS tokenized-stock category for the Market stocks filter instead of the hardcoded filter=stock + client-side id matching, and stop firing a spurious to=usd market request while the supported counter-values list is still loading.

  • #18469 6e0f83d Thanks @LucasWerey! - Add the Portfolio Stocks data layer. useDefaultStocksAssets fetches the top stocks (market-cap ordered) from the DADA stocks category via useStocksData + selectTopStocks for the discovery scenario (no-op when disabled). useCategorizedAssetsFromPortfolio now returns a stocks bucket split out of cryptos, identified by DADA currency id via the new useStockAssetIds hook — matching by id rather than ticker avoids symbol collisions (e.g. a crypto like TON is no longer misclassified as a stock).

  • #18470 02980c8 Thanks @LucasWerey! - Add the Portfolio Stocks section and wire it into AssetsSections behind the assetDiscoverability flag. 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 — extending CryptoVariant with "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 shared StockPillRows component reused by Global Search (removing the duplicated grid). Subheader spacing: the holdings list matches the other portfolio sections, the discovery grid uses s12.

  • #18256 eb1dae8 Thanks @gre-ledger! - Derive "supported currencies" from the coin-modules registry instead of setSupportedCurrencies.

    Each CoinModuleLoader now declares a supportedCoins: CryptoCurrencyId[] field, and a currency is supported when it appears in a registered loader's supportedCoins. The framework setSupportedCurrencies / listSupportedCurrencies / isCurrencySupported and the EXPERIMENTAL_CURRENCIES env are removed; listSupportedCurrencies / isCurrencySupported are now exported from @ledgerhq/live-common/currencies backed by the registry. Apps no longer maintain a supported-currencies list — registering the coin modules is what makes their currencies supported.

  • #18310 e95d1ce Thanks @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 9dacc01 Thanks @dilaouid! - chore(lwdm): refactor memo feature for new send flow

  • #18516 bf9d9f3 Thanks @dilaouid! - feat(lwm): custom fees new send flow screen

  • #18270 7d06bb4 Thanks @qperrot! - Fix: new message for sei delegation when address not linked

  • #18505 e4d8136 Thanks @koda-apps! - Reorder v4 market categories

  • #18390 6e028f3 Thanks @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

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.