github LedgerHQ/ledger-live live-mobile@4.24.0

5 hours ago

4.24.0

Minor Changes

  • #23139 320d2a1 Thanks @mcayuelas-ledger! - Resolve the market id of an asset from the ledger ids when needed, so favorites added from search show up in the Market banner

  • #22843 c954015 Thanks @semeano! - feat(stacks): add mobile stake and unstake flows

  • #23025 6ec6cb7 Thanks @LucasWerey! - Align the Contacts search no-results state with the design and update its copy

  • #23143 4101467 Thanks @LucasWerey! - refactor(contacts): clean up the Contacts debug tools

    The send-history contacts builder was copied in both apps. It now lives once in
    @domain/entity-contact/schema.mock as mockContactsFromSendHistory. @features/platform-contacts
    adds parseExcludedCurrencyIdsInput, which works like parseEligibleAddressFamiliesInput. The
    desktop tool no longer copies flag params into local state with effects. Its inputs show the flag
    value unless you are editing them, use cn, and have no hard-coded strings left. The mobile tool
    drops its StyleSheet, shows the families as tags, and builds the flag preview in its view model.

  • #23101 6da6010 Thanks @LucasWerey! - Replace react-native-linear-gradient with Lumen LinearGradient

  • #23064 82e9e1e Thanks @koda-apps! - Replace react-native-device-info and react-native-version-number with expo-device and expo-application

  • #23062 3bd2949 Thanks @LucasWerey! - Replace react-native-image-picker with expo-image-picker for the custom lock screen gallery import

  • #23035 20bf9b0 Thanks @LucasWerey! - Route every copy/paste through the new @shared/clipboard package (expo-clipboard replaces @react-native-clipboard/clipboard on mobile) and enforce it with lint rules; copy feedback now only shows once the copy succeeded

  • #23043 4028b7e Thanks @ooke-ledger! - Hold back a per-currency fee buffer when depositing the max of a native coin into perps, configured by the new ptxTradeMaxConstant flag (feature_ptx_trade_max_constant). Only the MAX ratio is reduced; token accounts and other ratios are unchanged.

  • #22860 21fa5a5 Thanks @ooke-ledger! - Send the user back to the perps deposit form when they retry after a "not enough balance" error. Retrying re-ran the same deposit, which could only fail again; the form now reopens with the draft amount and funding account so the amount can be lowered. Other errors still retry in place

  • #22856 438c7b3 Thanks @ooke-ledger! - Hide accounts that cannot send, such as HyperCore, from the perps deposit funding picker. The receiving HyperCore account was still offered as a funding source even though a deposit cannot be sent from it. The picker now opens in the perpetuals:fund flow, which rejects send-disabled families, so modular dialog analytics from that picker report flow: "perpetuals:fund"

  • #22890 ee95a8e Thanks @LucasWerey! - fix(cg-client): remove the unused CoinGecko supported coins list query

    Removes getSupportedCoinsList, useGetSupportedCoinsListQuery, useSupportedCurrencies, MarketCoinSchema, SupportedCoinsSchema and the MarketCoin / SupportedCoins types. useMarketDataProvider now only returns supportedCounterCurrencies.

  • #23228 27d0cc9 Thanks @ovoronkov-ledger! - fix(receive): keep network warning above verify address cta (LIVE-38002)

  • #22866 52747b3 Thanks @LucasWerey! - Name the default Me contact "Me" in the Pay tab contacts list instead of "My addresses (Me)"

  • #23053 2a09181 Thanks @mcayuelas-ledger! - Show each stablecoin as its own Pay balance filter option, including testnet holdings

  • #23126 f0210f9 Thanks @dgreen-ledger! - fix(notifications): request POST_NOTIFICATIONS on Android 13+

    Firebase's requestPermission is a no-op on Android, so since #13457 the system notification
    prompt was never shown on Android 13 and above: tapping allow opened App info and push
    notifications stayed blocked. The app now requests POST_NOTIFICATIONS through
    PermissionsAndroid on Android 13+, and only opens the settings once the permission can no
    longer be requested.

  • #22436 23455ab Thanks @ysitbon! - Add the countervalues domain api: rate fetching, and the orchestration that folds rates into the entity state.

    • @domain/api-market-countervalues owns the Countervalues Service endpoints and loadCountervalues, which moves out of @ledgerhq/live-countervalues.
    • The endpoints are injected into the shared countervalues api from @shared/api-services instead of standing up a second slice. The duplicate client in live-common is removed, so each app registers one countervalues reducer where it previously registered two against the same host. That slice is an RTK Query cache and is not persisted, so there is no stored state to migrate.
    • loadCountervalues takes its rates as an argument rather than reaching for a module-level client. The apps compose one in the countervalues bridge they already own; tests pass a mock directly, which removes the MOCK_COUNTERVALUES dispatcher hidden inside the fetch path.
    • Rate failures carry the HTTP status through unchanged, so an unsupported pair still clears its cache on 422, an HTTP failure still increments the per-pair backoff, and an offline period still does not.
    • Rate requests keep the previous request policy: a 60s timeout, so a hung connection can no longer stall countervalues polling, and the same retries as before. The two endpoints moved out of live-common keep not retrying.
    • @ledgerhq/live-countervalues drops loadCountervalues, its api entry point and the fetch contract types, and with them its dependencies on @ledgerhq/logs, @ledgerhq/live-network, @ledgerhq/live-promise and @ledgerhq/live-env. It no longer reaches the network.
    • web-tools now registers the shared countervalues api, which its portfolio countervalues loading dispatches through.
    • cvsApiExtra takes getCountervaluesServiceUrl, a getter read on every request, in place of the countervaluesServiceUrl string read once at store creation. Switching the developer staging toggle now applies to the next countervalues request again, as it did before the rates moved onto the shared api.
  • #22689 011766d Thanks @LucasWerey! - Report revamped protection clicks as button_clicked and completed activation, deactivation, and migration as encryption_updated

  • #22648 15491fb Thanks @LucasWerey! - Move the app lock UI shared by several journeys into @features/platform-app-lock.

    PasswordField and the password draft (PasswordDraftProvider, usePasswordDraft) leave @features/flow-app-lock, which no longer exports them, for @features/platform-app-lock, exported from its native entry only. This is the first step of splitting the app lock flow into one package per journey: unlock, password setup and removal, longer password and the protection prompt each need these pieces, and none of them should depend on another journey to get them. No behaviour changes.

  • #22817 57b333d Thanks @LucasWerey! - Move the mandatory longer-password journey out of @features/flow-app-lock into a new @features/flow-app-longer-password package: useLongerPasswordViewModel, LongerPasswordView and its enter and confirm steps, ChangePasswordSheet and PasswordChangedSheet. The app's longer-password gate imports them from there, and the enter and confirm steps still reuse @features/flow-app-password-setup, which @features/flow-app-lock no longer depends on. No behaviour change.

  • #22792 9894c78 Thanks @LucasWerey! - Move the password removal journey — the Deactivate password step and the sheet that keeps the last protection while a card is active — out of @features/flow-app-lock into a new @features/flow-app-password-removal package. The Settings password and biometrics rows and the Deactivate password screen import it from there. No behaviour change.

  • #22785 6225945 Thanks @LucasWerey! - Move the app password setup steps into their own flow package, @features/flow-app-password-setup.

    The Setup password and Confirm password steps (useSetupPasswordViewModel, SetupPasswordView, useConfirmPasswordViewModel, ConfirmPasswordView) leave @features/flow-app-lock, which no longer exports them, for steps/SetupPassword and steps/ConfirmPassword in the new package. The app's add-password screens import them from there, and the longer-password journey, still in @features/flow-app-lock, reuses them through the new package. Third step of splitting the app lock flow into one package per journey. No behaviour changes.

  • #22828 9a947ef Thanks @LucasWerey! - Move the app protection prompt — useProtectionPromptViewModel, EnableProtectionSheet and ProtectionEnabledSheet — into a new @features/flow-app-protection-prompt package, and delete @features/flow-app-lock, now empty. The app's protection prompt imports from the new package. Last step of splitting the app lock flow into one package per journey. No behaviour change.

  • #22693 b18cbdb Thanks @LucasWerey! - Move the app unlock journey into its own flow package, @features/flow-app-unlock.

    The unlock screen (useUnlockViewModel, UnlockView, the splash and focus rules) and the forgotten password sheet leave @features/flow-app-lock, which no longer exports them. They follow the flow layout, steps/Unlock with the sheet under steps/Unlock/components, and the app's unlock screen imports them from the new package. Second step of splitting the app lock flow into one package per journey. No behaviour changes.

  • #22993 6b2c0c6 Thanks @ovoronkov-ledger! - fix(asset-detail): stop cropping translated time range labels in the chart selector (LIVE-33383)

  • #22759 bf29f88 Thanks @qperrot! - fix(coin-bitcoin): read the explorer and tuning values from the injected coin config

    The module no longer keeps configuration in module state. createBridges takes a Context
    (ADR-019) and every bridge method resolves config_currency_<id> from context.config() at call
    time. The endpoint explorer.url is required and defaults to today's production host in each
    served config_currency_<id> (http://localhost:9876 for bitcoin_regtest, whose btc_regtest
    explorer id also moves to its config). The optional fields fall back to named module defaults:
    explorer.batchSize (DEFAULT_EXPLORER_BATCH_SIZE, 1000), fees.stuckTransactionTimeoutMs
    (DEFAULT_STUCK_TRANSACTION_TIMEOUT_MS, 20 min), fees.rbfMinBumpRatio
    (DEFAULT_RBF_MIN_BUMP_RATIO, 0.1), fees.calculationCacheTtlMs and fees.feeRatesCacheTtlMs
    (5 min each) and sync.replacedOperationExpiryMs (DEFAULT_REPLACED_OPERATION_EXPIRY_MS, 2 h).
    The explorer is bound to a wallet-btc account from the config at use, so deserialization stays
    config-free and a remote change applies on the next call. wallet-btc still reads no configuration:
    the batch size is injected through WalletBtcCurrency.explorerBatchSize, and the RBF ratio and
    the unconfirmed-operation expiry are parameters.

    Breaking: createBridges(signerContext, context) takes a Context instead of a config getter;
    setCoinConfig, getCoinConfig, CoinConfig, BitcoinConfigInfo, makeAssignFromAccountRaw
    and getMinRelayFee are removed in favour of BitcoinCoinConfig / BitcoinContext and
    assignFromAccountRaw, and postSync becomes makePostSync(context). The module logs only
    through context.logger: buildTransaction, getTransactionStatus, prepareTransaction,
    calculateFees, signAccountTx, ChainAdapter.resolveFeePerByte, buildSignRawOperation and the
    hw-getAddress / hw-getFullViewingKey resolvers take a Logger. prepareTransaction, getTransactionStatus, buildTransaction,
    buildAccountTx, getOriginalTxFeeContext, getMinReplacementFeeSat,
    getMinReplacementFeeRateSatVb and getRbfContext take the coin config as first parameter. The
    getEditTransactionStatus and isStrategyDisabled bridge extensions require the mainAccount. The EXPLORER_REGTEST and BITCOIN_STUCK_TRANSACTION_TIMEOUT envs are
    removed, as are the config_currency_<id> defaults of the bitcoin-family currencies no loader
    serves (bitcoin_private, game_credits, gochain, lbry, nix, ravencoin, resistance,
    zclassic, zcoin).

  • #22938 7a2505b Thanks @qperrot! - Rename BNB Chain to BNB Smart Chain

  • #22599 d819300 Thanks @OlivierFreyssinet! - Add failureType and subError properties to Device Intent Executor deviceflow_failed and deviceflow_aborted events

  • #23080 4e7c1ae Thanks @mcayuelas-ledger! - Migrate mobile Add Account off pre-ldls onto Lumen and remove the native pre-ldls entry

  • #22995 3444d16 Thanks @OlivierFreyssinet! - Implement the final Discovering, Connecting and Connected views of ConnectNewDevice, on a true black background. The animations come from the Figma Symbols Library in a light and a dark version, and they include their animated spot. The Discovering copy and animation depend on the scanned transports: Bluetooth, Bluetooth and USB, or USB only. Each discovered device shows in a card with a Connect button. For a USB device, the Connecting and Connected views say "connecting" and "connected" instead of "pairing" and "paired".

    The Connect New Device debug screen now mounts the component alone, as a caller does, and unmounts it when onConnected, onDeviceNotFound or onClose ends the flow. Its log also shows each mount and unmount.

    onDeviceNotFound is now optional: the "I don't see my device" button shows only when the caller passes it.

    A Connect New Device animations debug screen previews each of these Lotties, in the light and the dark theme.

  • #23021 3dacfc2 Thanks @fAnselmi-Ledger! - Bump @ledgerhq/device-management-kit to 1.11.0 and @ledgerhq/dmk-ledger-wallet to 0.7.0.

  • #23246 71c5860 Thanks @aussedatlo! - Bump @ledgerhq/dmk-ledger-wallet to 0.7.1, @ledgerhq/device-transport-kit-speculos to 1.3.0 and @ledgerhq/speculos-device-controller to 0.4.0.

  • #23000 0710383 Thanks @LucasWerey! - Bump react-native-reanimated to 4.3.4 so animated views no longer revert to their initial values after a heavy JS-thread load at startup, which left the portfolio gauge cursor at 0 and the AmountDisplay digits overlapping.

  • #23083 4c28d72 Thanks @gre-ledger! - Bump @ledgerhq/ledger-key-ring-protocol, @ledgerhq/hw-ledger-key-ring-protocol to 1.0.0 and @ledgerhq/evm-tools to 2.0.0 (ts-libs). No API change.

  • #22984 2680cb0 Thanks @OlivierFreyssinet! - Move the discovery, connection and unknown error UI of the Device Intent Executor to mvvm/components/DeviceConnection, so that connectNewDevice can reuse it. The moved components take the shared connectivity UI states and do no tracking. The executor keeps thin containers that add the screen and button tracking. The UI and the analytics events are unchanged.

  • #23178 e308deb Thanks @benruseau! - Add the OS updates orchestrator React layer: a generic OsUpdatesOrchestratorComponent and useOsUpdatesOrchestrator hook in live-common that render platform-injected components for each step

    Add the mobile pre-checks, create backup, apply updates and restore backup components, and persist the device backup in the app storage

    Use the real components in the OS updates orchestrator debug screen

    Fix the OS updates apply step after a bootloader recovery: when the device comes back on an OS, install the first update of the resolved path from its OSU firmware instead of its final firmware, which skipped an update

  • #22598 01ee590 Thanks @RobinVncnt! - Handle firmware handover and onboarding exits, and drive every Nano S through the shared flow

  • #22770 2cf2dfe Thanks @ooke-ledger! - Settle the Perps deposit request from the mobile deposit flow with the swap ID and quoted amount, and reject it when the user leaves the deposit screen

  • #23148 cdd2446 Thanks @LucasWerey! - Replace react-native-splash-screen with expo-splash-screen

  • #23184 3dda070 Thanks @CremaFR! - Retry a swap up to twice, without showing the error, when the Exchange app rejects the provider signature (signVerificationFail at CHECK_TRANSACTION_SIGNATURE). executeSwap requests a new nonce and calls /swap again with the same parameters. Each rejected attempt is still reported to /swap/cancelled, with the attempt in the error message: Signature verification failed Code: R0 for the first attempt, then R1 and R2 for the retries. This replaces the [diagnostic=…] signature classification, which is removed

  • #22745 db3bde1 Thanks @lysyi3m! - Canton: hide Accept once an offer expires while the screen is open, and show a clear message instead of retry when accepting an expired offer

  • #23008 ac0379e Thanks @dilaouid! - fix(send): show a broadcast error on the new send flow confirmation and only offer to try again for temporary errors (network, server, locked device)

  • #22811 3132a4a Thanks @gre-ledger! - Consume @ledgerhq/ledger-key-ring-protocol and @ledgerhq/hw-ledger-key-ring-protocol from npm (they now live in ts-libs), and bump axios to 1.20.0. No API change.

  • #22604 ca82e70 Thanks @sarneijim! - Add an ab_tests attribute to desktop and mobile analytics events with the trackingConfiguration of each enabled English copy experiment, or {} when none applies

  • #22603 9c0feca Thanks @sarneijim! - Add feature_copy_* experiments to the feature flags debug screen so enabled and copy can be mocked locally

  • #22413 0f401bb Thanks @Moustafa-Koterba! - feat(cosmos): move the Cosmos memo onto the shared generic-adapter memo fields (LIVE-36108)

    Prep work for the Cosmos generic-coin-framework migration (depends on LIVE-35735, already fixed):
    the shared transactionToIntent only reads memoType/memoValue, fields the four Cosmos memo
    write sites (desktop send field, mobile memo-tag input, mobile edit-memo screen, wallet-api
    adapter) never set — they only wrote the legacy memo field. Left as is, flipping Cosmos into
    genericCoinFrameworkFamilies.json in a later ticket would silently drop every memo, with no
    error anywhere.

    Adds a cosmos entry to the shared memo-application registry, adds memoType/memoValue to
    CosmosLikeTransaction alongside the existing memo field (read unchanged by the live legacy
    bridge), and centralizes the three-field patch in a single cosmosMemoPatch helper all four
    write sites now call, so they can't drift out of sync. Also adds the memo length check
    (CosmosMemoTooLong) to the Alpaca validateIntent, which nothing previously enforced outside
    the UI's maxLength truncation.

  • #23001 21ab07f Thanks @ysitbon! - Move the countervalues Redux slice into @features/platform-market-countervalues: its reducer, action creators, initial state, state type and selectors. Both apps now mount countervaluesReducer at the same countervalues store key and keep their own useSelector hooks, persistence, polling and user-settings computation. The action types keep the desktop strings, so mobile's pending, error and wipe actions are now named COUNTERVALUES_STATE_SET_PENDING, COUNTERVALUES_STATE_SET_ERROR and COUNTERVALUES_WIPE. The reducer stays a plain function rather than createSlice, because immer would freeze the rate maps that loadCountervalues updates in place.

  • #23107 fa2c070 Thanks @ysitbon! - Countervalues user settings are no longer stored in Redux: each app computes them and hands them to the provider through the bridge's useUserSettings.

    • @features/platform-market-countervalues: the slice loses its userSettings field, setCountervaluesUserSettings (COUNTERVALUES_USER_SETTINGS_SET) and countervaluesUserSettingsSelector.
    • Desktop: useCalculateCountervaluesUserSettings returns the memoized settings instead of dispatching them, and the bridge calls it directly. The provider sees the real tracking pairs and refresh rate from the first render instead of one render late, so the saved rates are restored once and the boot loads once.
    • Mobile: no runtime change; its tests read a shared test settings constant instead of the removed slice field.
  • #23071 eb23867 Thanks @tonykhaov! - Offer Ledger Sync during device onboarding from the single deviceOnboarding feature flag

  • #23131 a653da5 Thanks @tonykhaov! - feat(device-onboarding): keep the screen awake while the device onboarding connects or runs

  • #22996 1f50e41 Thanks @gre-ledger! - Drop @ledgerhq/live-hooks: useDebounce and a simpler useThrottledValues now live in @ledgerhq/live-common/hooks.

  • #23056 9a39ad5 Thanks @OlivierFreyssinet! - ConnectNewDevice keeps a device that is no longer discovered in its list, with a disabled card and a disabled Connect button.

  • #22803 0e3e7b0 Thanks @ysitbon! - fix(feature-flags): show the Firebase project the build actually targets

    The debug feature flags screen read the project name from the firebaseEnvironmentReadOnly
    remote flag, a value set by hand in each Firebase project, so a staging build reported
    ledger-live-production. It now reads the project id from the Firebase config bundled in the
    build.

  • #22795 ff5e1b0 Thanks @ysitbon! - refactor(feature-flags): move the Firebase Remote Config mapping to @features/platform-feature-flags-firebase

    @features/platform-feature-flags now only exposes resolved flag state (hooks and FeatureToggle). formatToFirebaseFeatureId, formatDefaultFeatures, parseFirebaseFeatures and RemoteConfigValue are imported from @features/platform-feature-flags-firebase instead; the ./firebase subpath is removed. No behavior change.

  • #22352 c7e76f3 Thanks @ishaba! - fix(babylon): remove pre-selected validator, default to show all

  • #22950 dccba0c Thanks @OlivierFreyssinet! - Compute the firmware distribution salt of the non-DMK firmware update checks from the identities store instead of the USER_ID env, so they use the same salt as the DMK

  • #22520 d042881 Thanks @ooke-ledger! - Fix perps deposit quotes returning empty on mobile: read SWAP_API_BASE from react-native-config at store setup so the swap aggregator URL is resolved before the store captures it

  • #22939 c59fbf4 Thanks @mdomanski-ext-ledger! - chore(hedera): migrate from @hashgraph/sdk 2.78.0 to @hiero-ledger/sdk 2.84.0
    fix(hedera): keep the nonce when serializing generic transactions

  • #22911 e2c3771 Thanks @mdomanski-ext-ledger! - feat(hedera): migrate mobile Hedera flows to the generic transaction shape

  • #22784 e72683b Thanks @mcayuelas-ledger! - Hide the Pay tab card and its history when the pay-tab flag's card param is false

  • #22985 4182256 Thanks @mdomanski-ext-ledger! - fix(hedera): generic adapter fixes for fee estimation, wallet API memo, token association wording, token receive and swap history saved by the legacy bridge

  • #23009 2bb0ec2 Thanks @tonykhaov! - Large Mover: screen readers only read the front card, and swiping up/down on the coin shows the next or previous one. The swipe integration test no longer relies on gesture-handler jest-utils, which made it flaky.

  • #22640 8783545 Thanks @francois-guerin-ledger! - chore(contacts): stop reading ethereumLikeInfo and promote chainId from coin config

  • #22395 39d91b6 Thanks @dilaouid! - feat(tracking): tracking error and warning in new send flow lwm

  • #22743 4d9cfbd Thanks @ysitbon! - Import the countervalues logic, types, helpers and mocks from @domain/entity-market-countervalues instead of @ledgerhq/live-countervalues, and depend on the entity package in place of the legacy one. Specifier change only, no behaviour change.

    Three app tests move with live-common because the calculate they mock is called inside live-common: desktop's useHistoryOperations and mobile's useOperationsListViewModel and useOperationsV1. Their mock has to name the same module live-common imports.

  • #23020 e1f1bed Thanks @mcayuelas-ledger! - fix(asset-detail): show asset ticker and icon in the header when no Ledger currency resolves (e.g. Firo)

  • #22703 a09b259 Thanks @LL782! - Import mobile analytics from the shared packages instead of app barrel shims

  • #22749 bde5ee6 Thanks @ysitbon! - Import the countervalues logic, types and helpers from @domain/entity-market-countervalues instead of @ledgerhq/live-countervalues, and drop the legacy dependency. Specifier change only, no behaviour change.

  • #22816 7b17793 Thanks @lewisd5! - fix(lwm): declare babel-loader and @babel/plugin-syntax-typescript so the iOS bundle builds without @babel/* hoisting

  • #22635 bfebf6b Thanks @sarneijim! - Apply enabled feature_copy_* Remote Config values as English copy overrides, reusing the feature-flag fetch

  • #23086 5532cc2 Thanks @LucasWerey! - Fix unreadable text on the feature flags debug screen in dark mode

  • #22933 c24108f Thanks @ysitbon! - Import the countervalues provider and hooks from @features/platform-market-countervalues instead of @ledgerhq/live-countervalues-react, and useUsdToFiatRate and useGetCounterValueIdsPolling from it instead of live-common. The app and the test renderer mount the platform provider. Mobile no longer depends on @ledgerhq/live-countervalues-react. Specifier change only, no behaviour change.

  • #22796 faccddb Thanks @LL782! - fix(analytics): send language as a flat property on the Discoverability - Prompt event

  • #22943 dad0153 Thanks @LucasWerey! - fix(my-wallet): show Help and Referral as tiles and Wallet backups as a list item (LIVE-38059)

  • #22765 e3e6c22 Thanks @OlivierFreyssinet! - Extract the device discovery service and the connectivity types shared by device connection flows into a deviceConnectivity folder. The discovery, connection and unknown error UI states now use the shared ConnectivityUIStateTypes enum. ConnectDeviceUIStateTypes becomes a const object that includes these shared members, so type positions use typeof ConnectDeviceUIStateTypes.X or the new ConnectDeviceUIStateType type. The device type moves to the shared part as Device, and connectDevice keeps KnownDevice as an alias of it. connectDevice behaviour is unchanged.

  • #23055 c7cf8b4 Thanks @Valentin-Ledger! - Open the Borrow screen from the ledgerlive://borrow deeplink

  • #22910 177a5b4 Thanks @tonykhaov! - Pay card login: name Monavate instead of Baanx in "Log in to" and "Card provided by".

  • #22649 514d6f9 Thanks @koda-apps! - Show a newly linked Card asset when the user comes back to Pay from Baanx.

  • #22723 a92f75f Thanks @mcayuelas-ledger! - Closing Buy opened from the Pay tab returns to the Pay tab instead of the portfolio

  • #22869 eb65ce4 Thanks @mcayuelas-ledger! - Add feature-flag scenarios for the native Pay card, Card live app login, and CL Card disclaimer

  • #22027 10e4a67 Thanks @ooke-ledger! - Default the Perps deposit funding account to the USDC account with the highest non-zero spendable balance

  • #22865 667d378 Thanks @ysitbon! - Add @features/platform-market-countervalues, the countervalues React glue: the provider, its context and the hooks reading it, plus useUsdToFiatRate and useGetCounterValueIdsPolling. It is a copy of @ledgerhq/live-countervalues-react and of the two live-common hooks, which keep their own until their consumers move over.

    • @ledgerhq/live-countervalues-react reads the platform package's CountervaluesContext instead of creating its own, so a provider from either package serves the hooks of both. It stops exporting CountervaluesContext, which nothing imported, and drops its unused @ledgerhq/types-live dependency.
    • The platform package depends on no logging library. Desktop and mobile hand it their logger with setCountervaluesLogger at app setup, next to the rate lookups.
  • #23121 3a45eb3 Thanks @OlivierFreyssinet! - ConnectNewDevice shows only the available USB devices when a USB device is available, and only the devices on the other transports otherwise, so that the same device does not show over USB and over Bluetooth.

  • #22654 78b38fb Thanks @dilaouid! - fix(send): sync account at the start of a send

  • #23150 4dec481 Thanks @tonykhaov! - Keep the device onboarding session in the machine context, follow a new session on reconnect, and let the host run the exit actions

  • #22766 b2792d8 Thanks @mcayuelas-ledger! - Show a setup state on the History card tab when the signed-in holder has not claimed a card yet.

  • #22960 ddd2bce Thanks @dilaouid! - feat(contact): display contact in tx details lwm

  • #22673 08e85b2 Thanks @LucHebrard! - Remove the bottom safe-area padding on the Ledger Recover webview and show a themed loader until it loads

  • #22661 ea1ae2d Thanks @qperrot! - Fix Earn banner on Asset Detail not opening the SEI delegation validator selection

  • #23044 dce4fb6 Thanks @LucasWerey! - Remove the lwmQuickActionsCtasVariant feature flag and its Receive/Send quick action CTAs variant

  • #22659 bed3cf9 Thanks @liviuciulinaru! - Restore the Card sign-in state at app start so the Card history shows a stored session

  • #22820 f4bfc96 Thanks @gre-ledger! - chore(lwm): replace @rozenite/mmkv-plugin with @rozenite/storage-plugin

  • #23221 91ad9a0 Thanks @sarneijim! - Add connectSeededDevice to the deviceOnboarding flag and send a non-seeded device to legacy onboarding unless the host can run seed setup

  • #23140 b99f923 Thanks @gre-ledger! - Play Lottie animations through the new @shared/lottie package: dotlottie on web (replacing the unmaintained react-lottie / lottie-web), lottie-react-native on mobile.

  • #22702 c4f0be9 Thanks @mateuszpalosz-ext! - updated translation for claim operations for Aleo

  • #22950 8737f89 Thanks @OlivierFreyssinet! - Keep the DMK firmware distribution salt in sync with the user ID of the identities store, so DMK flows follow the progressive OS rollout on desktop and mobile

  • #22846 42d4dc2 Thanks @benruseau! - Add the apply updates sub-step to the OS updates orchestrator, covering the OSU install, the MCU flash loop and the final firmware install

    Wait out the device reboots each install and flash leaves behind, reconnecting under the same session id

    Add the restore backup step, which runs as the last tenth of the bar when it follows an update and on its own when there is nothing left to update

    Sync BASE_SOCKET_URL to the DMK secure channel WebSocket URL

  • #21839 6d744e0 Thanks @YazhuEth! - estimateFees now returns the recipient token account, wallet address and input type of an SPL transfer alongside its fee, so the device screen names the destination; a recipient token account holding another token throws SolanaTokenAccountHoldsAnotherToken.

    makeEmptyTokenAccount now builds its id with encodeTokenAccountId, like the fourteen families that already do: the wallet-API placeholder previously used the contract address, so it matched no real sub-account id.

    Solana runs on the generic coin framework. The send and staking screens move onto the generic transaction shape, which names what it does — a mode, a memo, a stake account seed — instead of the nested command model the legacy bridge carried, and the apps now read it through one family module rather than reaching into the transaction themselves.

    The behaviours the legacy bridge produced are restored on the generic path: an incoming SPL transfer produces an operation, a stake withdrawal empties the account rather than signing a stale amount, opening a token account is charged its rent, sending the maximum to a new stake account leaves enough to unstake it later, the device confirmation screen lists every row the device itself shows, and a token account's frozen state and Token-2022 extensions are back on screen.

    A live app can again submit the four token and stake commands the wallet API defines, and a raw signature it gets back is hex, as the field it arrives in says. The device signer is selected through the family's own factory, so the ldmkSolanaSigner flag and the transaction-check option it carries keep deciding, as they did before. The mock bridge is rewritten on the coin module, so a mocked signature still yields a transaction the wallet API can deserialize.

  • #23112 7f0d867 Thanks @amaslakov! - Harden the Tronify rent payment: Retry stays locked until a payment that may still land has expired, a rent price rise is shown and must be accepted before ordering again, a signed payment about to expire is refused before broadcast, and the unreachable contract-data failure is removed.

  • #22979 69284e8 Thanks @sarneijim! - Keep the Ledger Recovery Key backup as its own onboarding step

  • #23032 bcd25fd Thanks @OlivierFreyssinet! - chore(live-dmk): remove the ldmkTransport feature flag

    DeviceManagementKitProvider on desktop no longer takes ldmkTransportEnabled and always provides
    the Device Management Kit. useDeviceManagementKit now returns a non-null DeviceManagementKit and
    throws outside the provider. The PayTab address verification always uses the Device Intent Executor,
    and the isLDMKTransportEnabled analytics property is removed.

  • #23031 3264580 Thanks @philipptpunkt! - Pass swapApiEnv (stg | prd) to the Swap live app so it follows Wallet's Swap backend

    • Derived from the SWAP_API_BASE url via new getSwapAPIEnv helper in live-common
    • Unknown hosts (e.g. localhost) send nothing; the live app keeps its own default
    • Stop passing the full swapApiBase url; the live app no longer reads it
  • #22891 cc764ec Thanks @ooke-ledger! - Open swap history from the swap/history deeplink, with the swap matching swapId opened

  • #23127 7f7eeab Thanks @LucasWerey! - Replace react-native-get-random-values with expo-crypto for crypto.getRandomValues

  • #23185 437d666 Thanks @LucasWerey! - Replace @react-native-community/netinfo with expo-network behind the new @shared/network-status package, and use it for the desktop network status

  • #22990 67dbab2 Thanks @OlivierFreyssinet! - Add the ConnectNewDevice component. It runs connectNewDevice, shows one view for each UI state and shows the discovery, connection and unknown errors in a bottom sheet over the last view. The Discovering, Connecting and Connected views are placeholders. The device intent executor and ConnectNewDevice now save the connected device with the same useSaveConnectedDevice hook. ConnectNewDevice also adds a new Bluetooth device to the BLE known devices.

    Add a Connect New Device debug screen in Settings > Debug > Features > Device Intent Executor. It runs the ConnectNewDevice component, logs its onConnected, onDeviceNotFound and onClose calls, and can restart the flow with other delays.

  • #22384 bc6383a Thanks @Moustafa-Koterba! - Migrate the mobile Cosmos staking UI (delegate, undelegate, redelegate, claim/compound) onto the generic staking transaction shape

  • #22953 f482212 Thanks @OlivierFreyssinet! - chore(device): remove the legacy connectApp and the ldmkConnectApp feature flag

    connectApp and connectManager now always use the Device Management Kit device actions and fail
    with DmkTransportRequired on a non-DMK transport. apps/inlineAppInstall, hw/isUpdateAvailable
    and DeviceManagementKitTransport.listenLegacyConnectApp are removed.

  • #23022 ebc1ab9 Thanks @LucasWerey! - Fix Receive confirmation header so the help button no longer overlaps the title or triggers close

  • #21764 b014537 Thanks @shazzzam! - Add the Tronify sponsored send to the mobile Send flow behind the gasSponsorship flag: a USDT transfer can pay its network fee with rented energy, signing the rent payment first, then the transfer once the energy is delivered on-chain.

  • #22818 c56dcb3 Thanks @ysitbon! - useSendAmount takes the cryptoCurrency to convert instead of the account holding it. Callers resolve it with getAccountCurrency on the same account they passed before, so a token account still converts with its token. The hook no longer imports any account type or helper.

  • #22989 8312d68 Thanks @gre-ledger! - chore: take uuid from the pnpm catalog (11.1.0)

    uuid was spread over 8.3.2, 9.0.1 and 11.1.0. Every package now uses the catalog entry. @types/uuid is dropped: 11 ships its own types. The repo only imports v4, v5 and parse (parse in a coin-solana test fixture), which behave the same across these majors. 11 types v4 with overloads, so passing it directly as a callback (useState(uuid)) no longer typechecks and is now wrapped (useState(() => uuid())).

  • #22383 33094bc Thanks @ysitbon! - Let wallet-pnl declare the countervalues interface it needs

    The package computed profit and loss straight against the countervalues implementation, which
    tied a pure pricing calculation to a concrete state shape. It now declares the three operations
    it uses as a RateLookup interface, treats the state as an opaque snapshot, and drops
    @ledgerhq/live-countervalues from its dependencies. The apps fill the interface at startup,
    beside the crypto-assets store and the two lookups already registered there.

    The exported signatures keep their arity and the state argument is assignable as before, so no
    caller needs a change for the interface.

    The third operation is a cache key. getCostBasis memoises against a fingerprint of the rate
    history relevant to a pair, which it used to compute inline from three countervalues helpers.
    That computation moves to @domain/entity-market-countervalues as historyKey, beside the
    lenseRateMap it is built on, so the three apps share one copy instead of each carrying its own
    and risking drift. A drifted key serves a stale cost basis silently. The key string is unchanged,
    and the existing cache tests pin it without being modified.

    The synthetic state builder moves with it. buildCV, buildMultiCV and dailyHistory
    construct countervalues state rather than reading it, so they cannot work against an opaque
    snapshot; they now live behind @domain/entity-market-countervalues/mock, and
    @ledgerhq/wallet-pnl/scenarios no longer exports them. The web-tools pnl-calculator imports them
    from the entity directly.

    web-tools registers the interface too. It renders profit and loss through the same package but
    was never a consumer of the two lookups registered previously, so it needed wiring of its own.

Patch Changes

  • Updated dependencies [5b62ecb, d60f240, c954015, 4101467, 20bf9b0, 4028b7e, 1bf1044, 8376d49, 75e55ba, 52747b3, 2a09181, 5eca063, d6e7695, 87de6a7, ef84a7c, 20484ff, f047501, 23455ab, 15491fb, 57b333d, 9894c78, 6225945, 9a947ef, b18cbdb, bf29f88, c9b7594, 7a2505b, d33fd72, d819300, 4e7c1ae, 48874b3, 4c28d72, e308deb, 01ee590, db3bde1, e7996b4, 5f07a43, ca82e70, 0f401bb, 3347eb8, 21ab07f, 9ddaa97, e80d009, fa2c070, d1eeaab, eb23867, 90e805d, ff5e1b0, f5fa6e1, 7ff8f5b, 9c9cae5, 3a45eb3, 29b0e0c, 0a65851, 3444d16, 8783545, f3b3c1c, dad0153, e3e6c22, 77e7162, 77e7162, 57921f9, 1b78e74, a99d63a, 4aa7793, 0e7d80a, 5f7cc73, eb65ce4, aaedf56, c26bbea, 667d378, f45fc80, 1731458, 4dec481, 2989e37, b2792d8, 6f2ecf8, 18166fb, 1a9b21e, dce4fb6, 6c8bd31, bed3cf9, 91ad9a0, 2b2eee6, b99f923, 9717369, 63c700c, 8737f89, 42d4dc2, 6d744e0, 35d9396, c92c32e, 77d202b, 9a39ad5, 69284e8, bcd25fd, 91ac227, 99b54cd, f482212, 3cdcba9, 3a45eb3, 8312d68, c5c2815, 33094bc]:
    • @ledgerhq/transaction-observability@0.5.0
    • @ledgerhq/coin-stacks@0.33.0
    • @domain/entity-contact@0.12.0
    • @features/platform-contacts@0.10.0
    • @shared/clipboard@0.1.0
    • @features/flow-pay-card-transactions@0.5.0
    • @features/flow-contacts@0.14.0
    • @features/flow-pay-request@0.8.0
    • @shared/feature-flags@0.26.0
    • @features/flow-contacts-introduction@1.4.0
    • @features/flow-pay-contact@0.6.0
    • @features/flow-pay-balance@0.7.0
    • @ledgerhq/coin-bitcoin@0.55.0
    • @domain/entity-currency-crypto@0.15.0
    • @ledgerhq/ledger-wallet-framework@3.7.0
    • @domain/api-market-countervalues@0.2.0
    • @domain/entity-market-countervalues@0.3.0
    • @shared/api-services@0.10.0
    • @features/platform-app-lock@0.6.0
    • @features/flow-app-longer-password@0.1.0
    • @features/flow-app-password-removal@0.1.0
    • @features/flow-app-password-setup@0.1.0
    • @features/flow-app-protection-prompt@0.1.0
    • @features/flow-app-unlock@0.1.0
    • @ledgerhq/types-live@6.127.0
    • @shared/env@0.10.0
    • @ledgerhq/live-dmk-shared@0.35.0
    • @ledgerhq/native-ui@0.68.0
    • @ledgerhq/device-onboarding@0.5.0
    • @ledgerhq/coin-canton@1.4.0
    • @features/platform-card@0.8.0
    • @features/flow-pay-card-auth@0.10.0
    • @features/platform-content-ab-tests@0.2.0
    • @ledgerhq/coin-cosmos@1.6.0
    • @features/platform-market-countervalues@0.2.0
    • @ledgerhq/wallet-pnl@0.8.0
    • @domain/entity-client-identity@0.3.0
    • @features/platform-feature-flags-firebase@0.1.0
    • @features/platform-feature-flags@0.9.0
    • @domain/api-aggregated-assets@0.6.0
    • @features/flow-pay-feature-tour@0.8.0
    • @ledgerhq/live-dmk-mobile@0.31.0
    • @devtools/bindings@0.11.0
    • @features/flow-pay-card-details@0.7.0
    • @features/flow-pay-card@0.7.0
    • @ledgerhq/coin-multiversx@1.4.0
    • @features/platform-device-action-content@0.4.0
    • @ledgerhq/coin-filecoin@2.4.0
    • @ledgerhq/live-send@0.1.3
    • @features/flow-contacts-add-address@0.6.2
    • @features/flow-contacts-add-contact@0.7.2
    • @features/flow-contacts-delete-contact@0.2.5
    • @features/flow-contacts-edit-address@0.4.2
    • @features/flow-contacts-edit-contact@0.6.2
    • @features/flow-contacts-list@0.9.1
    • @ledgerhq/live-wallet@1.1.6
    • @features/flow-pay-card-assets@0.3.1
    • @features/flow-large-screen-upsell@2.2.2
    • @features/platform-currencies@0.9.2
    • @domain/api-currency-token@0.6.4
    • @domain/entity-currency@0.4.6
    • @domain/entity-currency-token@0.5.5
    • @ledgerhq/wallet-analytics@0.5.1
    • @ledgerhq/coin-casper@3.5.1
    • @ledgerhq/coin-concordium@1.5.1
    • @ledgerhq/live-signer-evm@0.24.1
    • @domain/api-card-management@0.8.1
    • @domain/api-currency-fiat@0.4.7
    • @domain/api-market-index-altcoin-season@0.4.1
    • @domain/api-market-index-fear-and-greed@0.4.1
    • @domain/api-push-devices@0.2.8
    • @ledgerhq/device-core@0.11.19
    • @features/platform-aggregated-assets@0.5.6
    • @features/platform-env@0.4.2
    • @ledgerhq/live-signer-tron@0.2.1
    • @features/flow-analytics-consent@0.2.9
    • @shared/analytics@0.4.0
    • @shared/analytics-react@0.4.0
    • @shared/auth@0.6.0
    • @shared/cloud-sync@0.3.0
    • @shared/i18n@0.2.0
    • @shared/linking@0.3.0
    • @shared/lottie@0.0.0
    • @shared/network-status@0.0.0
    • @shared/ui-info-state@0.4.0
    • @shared/ui-queued-bottom-sheet@0.6.0
    • @features/flow-pay-card-widget@0.5.1
    • @devtools/wire@0.5.1
    • @domain/entity-account@0.0.1
    • @domain/entity-account-name@0.2.2
    • @domain/entity-analytics-consent@0.2.2
    • @domain/entity-card-asset-mapping@0.7.0
    • @domain/entity-currency-fiat@0.4.0
    • @domain/entity-currency-unit@0.3.0
    • @domain/entity-interest-rate@0.3.0
    • @domain/entity-market-index-altcoin-season@0.3.0
    • @domain/entity-market-index-fear-and-greed@0.3.0
    • @domain/entity-recent-addresses@0.2.1
    • @domain/entity-starred-account@0.0.1
    • @domain/entity-wallet-sync@0.1.0
    • @features/flow-fear-and-greed@0.3.0
    • @features/flow-lazy-onboarding-banner@0.4.0
    • @features/platform-device-intent@5.2.0
    • @features/platform-pay-analytics@0.3.0
    • @features/platform-style@0.4.0
    • @features/platform-wallet-sync@0.1.3
    • @ledgerhq/ethereum-provider@0.8.0
    • @ledgerhq/hw-transport-http@6.38.0
    • @ledgerhq/live-dmk-speculos@0.11.0
    • @ledgerhq/live-engagement@0.1.0
    • @ledgerhq/types-devices@7.1.0
    • @devtools/shell@0.10.2

Don't miss a new ledger-live release

NewReleases is sending notifications on new releases.