github LedgerHQ/ledger-live live-mobile@4.25.0

3 hours ago

4.25.0

Minor Changes

  • #23341 a86963c Thanks @LucasWerey! - Add the accountDetail feature flag (with excludedCurrencyIds) for the new Account Detail page and send its state to analytics.

  • #23293 1d3e404 Thanks @ooke-ledger! - Stop swap entry points from stacking a new Main navigator, and open each swap entry on a fresh webview history.

  • #23322 1349df3 Thanks @claudiiafg! - Extract the Contact Detail journey into @features/flow-contacts-detail so Desktop and Mobile can reuse it, while the Contacts aggregate keeps cross-journey orchestration

  • #23004 505eea9 Thanks @vpenskyi-ledger! - Fix a second account drawer opening in Swap when the receive token is a token the user does not hold yet. The parent account is now sent with toTokenId instead of the unresolvable synthetic token account, so the Swap live app builds the token account itself.

  • #23346 80a62ae Thanks @ooke-ledger! - Show perps deposit device errors with the new error state and a retry.

  • #23134 2ebd029 Thanks @ovoronkov-ledger! - fix(bottom-sheet): hold reopen content until the sheet has closed (LIVE-37745)

  • #23215 08169a3 Thanks @cted-ledger! - do not show the bitcoin fee picker on a zcash send, whose fee zip-317 sets

  • #23391 ee508db Thanks @thesan! - Resolve the app configuration once, when the store is created, with resolveAppConfig from @shared/app-config. Keycloak is the first service to read it: its base URL comes from the ledgerKeyRing switch, which resolves to the option persisted under appConfigSelections, or to the CONFIG_PROFILE of the build's .env file: staging for dev, adhoc and nightly builds, prod for prerelease and release builds. The configuration stays the same for the whole session, by design: a new selection applies after an app reload. @shared/env drops the LEDGER_AUTH_* definitions.

  • #23485 623f8e6 Thanks @thesan! - @shared/auth drops the authEnvironment slice: Keycloak reads its base URL from the app config, so nothing reads it any more.

  • #23385 2ec955a Thanks @LucasWerey! - Add the shared Account Detail settings contents: settings menu, advanced logs (with copy) and remove account confirmation, plus buildAdvancedLogs.

  • #23378 fc5e597 Thanks @LucasWerey! - Add the Account Detail screen shell behind the accountDetail flag: ScreenName.Account switches per account to the new screen (token sub-accounts open their parent), the legacy screen otherwise.

  • #23380 92d5032 Thanks @LucasWerey! - Add the Account Detail nav bar on LWM: account name, shortened address with the network icon, and a settings button.

  • #23393 0902ebf Thanks @LucasWerey! - Add the Account Detail settings sheet on LWM: the settings button opens the account settings menu and the remove account confirmation.

  • #23450 b0c722a Thanks @LucasWerey! - Add the Account Detail change name screen on LWM, opened from the settings sheet once it has closed (keeps the name field focused). Long account names are truncated in the settings menu.

  • #23435 e4e90c0 Thanks @LucasWerey! - Add the Account Detail advanced logs screen on LWM, opened from the settings sheet. Copy logs now shows a "Copied" state for 2 seconds.

  • #23438 987dffa Thanks @LucasWerey! - Remove account from the LWM Account Detail settings sheet: confirming removes the account and goes back to the previous screen.

  • #23512 e8ede36 Thanks @LucasWerey! - Add the Assets section to the Account Detail screen: the coin and its tokens sorted by value, with the same filters as the Portfolio. AssetListItem rows are not pressable when no onPress is passed.

  • #23415 c568dc6 Thanks @LucasWerey! - Add the Transactions section to the LWM Account Detail screen: the 3 latest operations of the account and its tokens, opening the operations history scoped to the account. The Asset Detail section now uses the same shared component.

  • #23439 722c6f3 Thanks @ovoronkov-ledger! - chore(rn-upgrade): replace absoluteFillObject with absoluteFill (LIVE-39313)

  • #23429 39529a8 Thanks @LucasWerey! - Bump Lumen to lumen-design-core 0.1.32, lumen-ui-react 0.1.64, lumen-ui-rnative 0.1.67 and lumen-utils-shared 0.1.16, and migrate Spot to its palette API (icon required, appearance="icon" dropped, check/info/error/warning/loader mapped to explicit icons, number moved to SpotNumber). The devtools native jest preset now mocks react-native-gesture-handler, which the new lumen Toaster imports.

  • #23426 8b6190f Thanks @LucasWerey! - Add the bottom fade gradient to the LWM Account Detail screen, like Transaction History and Market.

  • #23559 ead8b59 Thanks @jiyuzhuang! - Expose the recoverV2 feature flag to Mixpanel on mobile and desktop.

  • #23543 257305f Thanks @mcayuelas-ledger! - feat(account-balance): add the balance entity

    Crypto balances of an account, one row per asset, keyed by AccountUUID. Both apps mount the slice. Fiat stays a view.

  • #23400 beea4cd Thanks @gre-ledger! - feat(account-data): add the account data framework

    Kind registry and accountData status slice, source contract and router (ranking, batching, concurrency, pagination affinity), fetchAccountData / fetchMoreAccountData and the useAccountData hook. Both apps register the status slice and inject the router into the thunk extraArgument, with no source yet.

  • #23436 f51fe16 Thanks @gre-ledger! - Add the accounts slice, keyed by AccountUUID and kept in sync with the legacy accounts

  • #23422 b97096c Thanks @mcayuelas-ledger! - End the Asset Detail chart on the header price so the line matches the live spot

  • #23213 6ce41e8 Thanks @dilaouid! - feat(send): add the Descriptionitem component for the new send flow

  • #23495 3c062fc Thanks @mcayuelas-ledger! - feat(analytics): add the blockchainWithFunds user property (blockchain names, e.g. Arbitrum) next to accountsWithFunds, which reports the native ticker (ETH for L2s)

  • #23210 a2ef1bf Thanks @OlivierFreyssinet! - The discovery error for an undetermined Bluetooth state (BluetoothStateUnknownCheckOnly) no longer shows a spinner with no action. It now shows "Bluetooth isn’t responding" with a retry CTA and, on Android, the "Continue with USB instead" CTA. Before, nothing checked the Bluetooth state again, so the sheet stayed stuck.

  • #23631 19e5335 Thanks @henri-ly! - Restore name and unit on the transaction intent asset so XRP and Stellar amount errors show the currency unit instead of "Unknown unit"

  • #23386 f40b1c2 Thanks @dilaouid! - Remove the Zenrock and Quicksilver integrations, including their chain adapters, currency definitions, feature flags and LCD endpoints

  • #23418 2621f1e Thanks @ysitbon! - Stop re-rendering every amount on a countervalues load that changes no rate

    A load now keeps a pair's rate Map and cache entry when every fetched value equals the stored one, and
    keeps the whole cache object when no pair changed. The conversions read the cache alone, through
    useCountervaluesCache, so a load that only stamps the fetch status no longer re-renders them. The
    conversions and the persisted export are the same as before.

  • #23154 3ad1a61 Thanks @ysitbon! - Move the countervalues polling loop into a Redux middleware and drop the countervalues React context.

    • After changing the countervalue currency, adding an account or tracking a new asset, amounts no longer briefly fall back to the last daily rate before the new rates land.
    • On mobile, changing the countervalue currency or adding an account no longer re-renders every amount on screen several times, and loads the rates once instead of up to three times.
    • @features/platform-market-countervalues: useCountervaluesState, useCountervaluesPolling, useCalculate, useCalculateCountervalueCallback and useSendAmount keep their names and signatures and read the countervalues slice with useSelector. The loop moves into createCountervaluesMiddleware, started with startCountervaluesSync({ savedState }). CountervaluesProvider, CountervaluesBridge, Props, PollingState and useCountervaluesUserSettings are removed.
    • Desktop: the store installs the middleware; boot starts it right before the first render, so the saved rates show from the first frame. The window focus and blur events, the network changes and the saving to disk move into the middleware's configuration.
    • Mobile: the store installs the middleware; boot starts it when the app is let through, and a reboot starts it again from the saved state. The extra session tracking pairs move from an RxJS subject into the store.
  • #23211 bcf98ff Thanks @ysitbon! - Split the countervalues Redux slice by owner. The rates now have their own slice in @domain/entity-market-countervalues (countervaluesRatesSlice, with setCountervaluesState and wipeCountervalues), stored with a shallow freeze so a load never pays for a deep freeze of every rate. @features/platform-market-countervalues keeps the loop's state in countervaluesSyncSlice (load, error, isPolling; load is one of idle, requested, loading, loadingThenRequested, replacing the former pending and triggerLoad flags) and mounts both under the same countervalues store key through countervaluesReducer, typed CountervaluesStoreState, which replaces CountervaluesState. The store reads countervalues.rates and countervalues.sync instead of countervalues.countervalues.state and countervalues.polling; persistence and the saved data are unchanged. Each slice now declares its own actions, so the COUNTERVALUES_* type strings are gone: setCountervaluesState and wipeCountervalues keep their names, typed countervaluesRates/set and countervaluesRates/wipe, and the loop's setters setCountervaluesPollingTriggerLoad, setCountervaluesStatePending, setCountervaluesStateError and setCountervaluesPollingIsPolling become the events countervaluesLoadRequested, countervaluesLoadStarted, countervaluesLoadSucceeded, countervaluesLoadFailed and countervaluesPollingSet, typed countervaluesSync/.... A load start and a load failure now dispatch one action each instead of two. The sync selectors are the slice's own selectors, and countervaluesSyncTriggerLoadSelector is gone. useCountervaluesPolling now returns only the poll, start, stop and wipe commands and no longer re-renders its callers on every load; pending and error come from the new useCountervaluesLoadStatus, which live-common's useSyncSources now reads.

  • #23335 246438d Thanks @ysitbon! - Release the countervalues startup wait's timer and store subscription once it ends

    The countervalues loop starts when the currencies are hydrated and the remote flags are ready, or
    after a second at most. The two sides raced as separate promises, so whichever lost kept running:
    the remote flags subscription stayed registered until the first fetch settled, and the timer fired
    for nothing when the app was ready first. One wait now owns both and releases both as soon as it
    settles. The loop starts at the same moment as before.

  • #23353 48d5c85 Thanks @LL782! - Remove the legacy ofacGeoBlockApi after Desktop and Mobile use @features/flow-app-availability

  • #23376 4ee8f78 Thanks @mateuszpalosz-ext! - Add a balance type sync step to the new send flow, used by Aleo to refresh private records after the pool pick

  • #23361 a02d06c Thanks @mcayuelas-ledger! - Move the mobile Fear and Greed UI into the flow package

  • #22508 ad58765 Thanks @pawell24! - fix(filecoin): open transactions on Blockscout from operation details

    Blockscout identifies a Filecoin message by its Ethereum-style hash, so the explorer link is now
    built from the message CID's digest instead of the CID itself.

  • #23423 c61cbe8 Thanks @mcayuelas-ledger! - fix(portfolio): show the Market 24h variation on assets whose balance did not change over the day (LIVE-39259)

  • #23389 03f4e70 Thanks @claudiiafg! - Extract address deletion into @features/flow-contacts-delete-address so Desktop and Mobile can reuse it without going through Contact Detail. Confirmation UI stays in @features/platform-contacts. Apps still own modal mounting, navigation, translations, and analytics.

  • #23023 7b01c45 Thanks @dilaouid! - fix(send): fix the send amount screen layout when the text size increases

  • #23459 2f9b7e9 Thanks @gre-ledger! - feat(account-data): full sync source on AccountBridge, serving no kind yet

  • #23302 ac7d243 Thanks @sarneijim! - Show genuine check error drawers during device onboarding

  • #23285 4fd1ebc Thanks @claudiiafg! - Keep a contacts device sheet mounted until iOS has closed it, and close it once the device step is finished.

  • #23315 68cebc0 Thanks @mcayuelas-ledger! - Fetch LargeMover chart and market rows through RTK Query by ledger id, and drop the unused CoinGecko mapping client.

  • #23058 214f7f1 Thanks @ishaba! - feat(tron): track the sponsored send funnel in Segment

  • #23247 c18097b Thanks @mcayuelas-ledger! - Load the market list with an RTK infinite query instead of React Query.

  • #23233 2cb9ecd Thanks @LL782! - Switch mobile launch gating to @features/flow-app-availability and drop the legacy OFAC geo-block api

  • #23279 34cffc5 Thanks @gre-ledger! - Declare @lottiefiles/dotlottie-react so lottie-react-native resolves to a single peer variant and Podfile.lock stops breaking on unrelated full installs.

  • #23151 004d896 Thanks @tonykhaov! - Show and export QA onboarding logs with the device answers and the machine context, and toggle the deviceOnboarding flag from the devtool

  • #23280 6a3d5ad Thanks @liviuciulinaru! - Remove the Card login code from the Pay tab route after the login reads it, so a logout shows the login screen and not a login error

  • #23102 4d77514 Thanks @sarneijim! - Move the shared device onboarding machine to features/platform

  • #23333 99efa90 Thanks @vladyslavchupovskiy-ext-art! - Load Expo's runtime before react-native-url-polyfill so the polyfill's URLSearchParams (with size) stays installed; fixes Aptos sends to an unfunded account failing with "insufficient funds"

  • #23424 b78f271 Thanks @gre-ledger! - Add a script generating Podfile.lock without installing pods, usable on Linux

  • #23230 b4241c5 Thanks @sarneijim! - Add the seeded-device checks screen, its animations, and a sync offer preview

  • #23328 e1ba29a Thanks @sarneijim! - Open the existing Ledger Sync skip confirmation from the seeded offer

  • #23226 dd34e1b Thanks @OlivierFreyssinet! - Shorten the device intent executor component names

  • #23672 fe74104 Thanks @henri-ly! - fix(coin-solana): check the stake minimum before a validator is picked

    The mobile delegation flow asks for the amount before the validator, so the recipient is still empty when the amount is validated. The minimum-delegation check was skipped in that case, which let an amount below 1 SOL through to the summary. The summary now also shows its validation error in the alert colour.

  • #23220 a8d48a9 Thanks @abdurrahman-ledger! - Support protected Speculinho sessions in E2E. Speculos transports take the session's bearerToken (SpeculosHttpTransportOpts, SpeculosSessionTarget, the mobile SpeculosTarget; DeviceManagementKitTransportSpeculos and the desktop transport default to SPECULOS_SESSION_TOKEN) and keep a separate DMK per token. E2E acquires sessions with protected: true and authenticates every operator and Speculos request; the mobile e2e bridge passes the token to the app and now requires a per-run connection token. Bumps @ledgerhq/device-transport-kit-speculos to 1.3.0 and @ledgerhq/speculos-device-controller to 0.4.0.

  • #23511 874b720 Thanks @gre-ledger! - Align @react-native/community-cli-plugin with react-native 0.81.6 and drop the stale 0.77.3 tree

  • #23003 57b4652 Thanks @live-github-bot! - Adapt to @ledgerhq/coin-evm 15

  • #23472 b88647d Thanks @sarneijim! - Add connectUnseededDevice to deviceOnboarding and edit that mock from the mobile onboarding devtool

  • #23261 02b383b Thanks @alexstapenka-ledger! - Add a withdraw icon to the earn action confirmation dialog, a custom.dialog.menu action menu dialog on desktop for the Earn "Earn more" / "Withdraw all" choice, and the earnWithdrawV2 feature flag that gates the Earn full withdraw flow

Patch Changes

  • Updated dependencies [a86963c, 68c2837, ec7b8b9, 1349df3, c9beaff, 4831311, 2ebd029, d6ab47c, 393a02a, ee508db, 623f8e6, d2b8471, 6032338, 2ec955a, b0c722a, e4e90c0, 722c6f3, 39529a8, c32fa7b, ead8b59, 257305f, beea4cd, f51fe16, fc846e5, b79ccab, 7b3040a, b599cb2, 3c062fc, de8fe99, 3527dbc, 80f99a8, 7da1ea9, f40b1c2, 2f9c159, a654488, 6abfd98, 2621f1e, 3ad1a61, bcf98ff, 75498cf, ad6aad8, 47e5b74, ff33162, 5e9a60a, 7e54483, e5762fc, a782d57, a02d06c, ad58765, 03f4e70, ff14496, e66d21e, 4fd1ebc, 68cebc0, ed10647, bcea51b, 2e198e2, 3fadda7, 004d896, 98c994b, 6639142, 2cd35c5, 4d77514, 307d5c0, 37a49df, 0ace271, ca063c4, 2c6e74a, e345c82, 696357f, a2ef1bf, a8d48a9, ed89930, 0d5c35d, b88647d, 02b383b]:
    • @shared/feature-flags@0.27.0
    • @features/flow-account-detail-settings@0.1.0
    • @features/flow-contacts-detail@0.2.0
    • @features/flow-contacts@0.15.0
    • @features/flow-pay-contact@0.7.0
    • @ledgerhq/coin-concordium@1.6.0
    • @shared/ui-queued-bottom-sheet@0.7.0
    • @domain/entity-currency-crypto@0.16.0
    • @shared/app-config@0.1.0
    • @shared/env@0.11.0
    • @shared/auth@0.7.0
    • @ledgerhq/coin-bitcoin@1.0.0
    • @features/flow-account-detail@0.1.0
    • @features/flow-pay-card-details@0.8.0
    • @ledgerhq/native-ui@0.69.0
    • @devtools/shell@0.11.0
    • @features/flow-fear-and-greed@0.4.0
    • @features/flow-contacts-introduction@1.5.0
    • @features/flow-contacts-list@0.10.0
    • @features/flow-pay-balance@0.8.0
    • @features/flow-pay-card-assets@0.4.0
    • @features/flow-pay-card-transactions@0.6.0
    • @features/flow-pay-card-widget@0.6.0
    • @features/flow-pay-deposit@0.6.0
    • @features/flow-pay-request@0.9.0
    • @features/platform-contacts@0.11.0
    • @shared/ui-info-state@0.5.0
    • @domain/entity-account-balance@0.2.0
    • @domain/entity-account-data@0.2.0
    • @domain/api-account-data@0.2.0
    • @domain/entity-account@0.1.0
    • @features/flow-contacts-add-contact@0.8.0
    • @features/platform-currencies@0.10.0
    • @features/platform-account-analytics@0.2.0
    • @features/flow-contacts-add-address@0.7.0
    • @ledgerhq/coin-stacks@0.34.0
    • @ledgerhq/ledger-wallet-framework@3.8.0
    • @ledgerhq/types-live@6.128.0
    • @ledgerhq/coin-cosmos@2.0.0
    • @features/flow-contacts-edit-address@0.5.0
    • @domain/entity-market-countervalues@0.4.0
    • @features/platform-market-countervalues@0.3.0
    • @features/flow-contacts-delete-address@0.2.0
    • @features/flow-contacts-delete-contact@0.3.0
    • @features/flow-contacts-edit-contact@0.7.0
    • @ledgerhq/coin-filecoin@2.5.0
    • @features/platform-device-onboarding@0.2.0
    • @devtools/bindings@0.12.0
    • @ledgerhq/coin-casper@3.6.0
    • @ledgerhq/live-dmk-speculos@0.12.0
    • @features/flow-app-availability@0.2.0
    • @ledgerhq/live-dmk-mobile@0.32.0
    • @ledgerhq/live-dmk-shared@0.36.0
    • @ledgerhq/coin-canton@1.5.0
    • @features/flow-large-screen-upsell@2.2.3
    • @features/flow-pay-feature-tour@0.8.1
    • @features/platform-feature-flags@0.9.1
    • @features/platform-feature-flags-firebase@0.1.1
    • @features/flow-app-longer-password@0.1.1
    • @features/flow-app-password-removal@0.1.1
    • @features/flow-app-protection-prompt@0.1.1
    • @features/flow-pay-bank-transfer@0.4.1
    • @features/flow-pay-card-auth@0.10.1
    • @ledgerhq/live-send@0.1.4
    • @domain/api-aggregated-assets@0.6.1
    • @domain/api-currency-token@0.6.5
    • @domain/api-market-countervalues@0.2.1
    • @domain/entity-contact@0.12.1
    • @domain/entity-currency@0.4.7
    • @domain/entity-currency-token@0.5.6
    • @ledgerhq/live-wallet@1.1.7
    • @ledgerhq/wallet-analytics@0.5.2
    • @ledgerhq/wallet-pnl@0.8.1
    • @features/platform-aggregated-assets@0.5.7
    • @features/platform-env@0.4.3
    • @ledgerhq/transaction-observability@0.5.1
    • @shared/api-services@0.10.1
    • @features/flow-pay-card@0.7.1
    • @features/flow-app-unlock@0.1.1
    • @devtools/transport-panel@0.7.0
    • @domain/entity-account-name@0.2.3
    • @domain/entity-starred-account@0.0.2
    • @ledgerhq/coin-multiversx@1.4.1
    • @ledgerhq/live-signer-evm@0.24.2
    • @ledgerhq/device-core@0.11.20
    • @ledgerhq/live-signer-tron@0.2.2
    • @features/flow-analytics-consent@0.2.10
    • @features/platform-content-ab-tests@0.2.1
    • @domain/api-card-management@0.8.2
    • @domain/api-currency-fiat@0.4.8
    • @domain/api-market-index-altcoin-season@0.4.2
    • @domain/api-market-index-fear-and-greed@0.4.2
    • @domain/api-push-devices@0.2.9
    • @features/platform-card@0.8.1

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.