4.24.0
Minor Changes
-
#23139
320d2a1Thanks @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
c954015Thanks @semeano! - feat(stacks): add mobile stake and unstake flows -
#23025
6ec6cb7Thanks @LucasWerey! - Align the Contacts search no-results state with the design and update its copy -
#23143
4101467Thanks @LucasWerey! - refactor(contacts): clean up the Contacts debug toolsThe send-history contacts builder was copied in both apps. It now lives once in
@domain/entity-contact/schema.mockasmockContactsFromSendHistory.@features/platform-contacts
addsparseExcludedCurrencyIdsInput, which works likeparseEligibleAddressFamiliesInput. The
desktop tool no longer copies flag params into local state with effects. Its inputs show the flag
value unless you are editing them, usecn, and have no hard-coded strings left. The mobile tool
drops itsStyleSheet, shows the families as tags, and builds the flag preview in its view model. -
#23101
6da6010Thanks @LucasWerey! - Replace react-native-linear-gradient with Lumen LinearGradient -
#23064
82e9e1eThanks @koda-apps! - Replace react-native-device-info and react-native-version-number with expo-device and expo-application -
#23062
3bd2949Thanks @LucasWerey! - Replace react-native-image-picker with expo-image-picker for the custom lock screen gallery import -
#23035
20bf9b0Thanks @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
4028b7eThanks @ooke-ledger! - Hold back a per-currency fee buffer when depositing the max of a native coin into perps, configured by the newptxTradeMaxConstantflag (feature_ptx_trade_max_constant). Only the MAX ratio is reduced; token accounts and other ratios are unchanged. -
#22860
21fa5a5Thanks @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
438c7b3Thanks @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 theperpetuals:fundflow, which rejects send-disabled families, so modular dialog analytics from that picker reportflow: "perpetuals:fund" -
#22890
ee95a8eThanks @LucasWerey! - fix(cg-client): remove the unused CoinGecko supported coins list queryRemoves
getSupportedCoinsList,useGetSupportedCoinsListQuery,useSupportedCurrencies,MarketCoinSchema,SupportedCoinsSchemaand theMarketCoin/SupportedCoinstypes.useMarketDataProvidernow only returnssupportedCounterCurrencies. -
#23228
27d0cc9Thanks @ovoronkov-ledger! - fix(receive): keep network warning above verify address cta (LIVE-38002) -
#22866
52747b3Thanks @LucasWerey! - Name the default Me contact "Me" in the Pay tab contacts list instead of "My addresses (Me)" -
#23053
2a09181Thanks @mcayuelas-ledger! - Show each stablecoin as its own Pay balance filter option, including testnet holdings -
#23126
f0210f9Thanks @dgreen-ledger! - fix(notifications): request POST_NOTIFICATIONS on Android 13+Firebase's
requestPermissionis 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 requestsPOST_NOTIFICATIONSthrough
PermissionsAndroidon Android 13+, and only opens the settings once the permission can no
longer be requested. -
#22436
23455abThanks @ysitbon! - Add the countervalues domain api: rate fetching, and the orchestration that folds rates into the entity state.@domain/api-market-countervaluesowns the Countervalues Service endpoints andloadCountervalues, which moves out of@ledgerhq/live-countervalues.- The endpoints are injected into the shared countervalues api from
@shared/api-servicesinstead 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. loadCountervaluestakes 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 theMOCK_COUNTERVALUESdispatcher 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-countervaluesdropsloadCountervalues, itsapientry point and the fetch contract types, and with them its dependencies on@ledgerhq/logs,@ledgerhq/live-network,@ledgerhq/live-promiseand@ledgerhq/live-env. It no longer reaches the network.- web-tools now registers the shared countervalues api, which its portfolio countervalues loading dispatches through.
cvsApiExtratakesgetCountervaluesServiceUrl, a getter read on every request, in place of thecountervaluesServiceUrlstring 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
011766dThanks @LucasWerey! - Report revamped protection clicks asbutton_clickedand completed activation, deactivation, and migration asencryption_updated -
#22648
15491fbThanks @LucasWerey! - Move the app lock UI shared by several journeys into@features/platform-app-lock.PasswordFieldand 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
57b333dThanks @LucasWerey! - Move the mandatory longer-password journey out of@features/flow-app-lockinto a new@features/flow-app-longer-passwordpackage:useLongerPasswordViewModel,LongerPasswordViewand its enter and confirm steps,ChangePasswordSheetandPasswordChangedSheet. 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-lockno longer depends on. No behaviour change. -
#22792
9894c78Thanks @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-lockinto a new@features/flow-app-password-removalpackage. The Settings password and biometrics rows and the Deactivate password screen import it from there. No behaviour change. -
#22785
6225945Thanks @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, forsteps/SetupPasswordandsteps/ConfirmPasswordin 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
9a947efThanks @LucasWerey! - Move the app protection prompt —useProtectionPromptViewModel,EnableProtectionSheetandProtectionEnabledSheet— into a new@features/flow-app-protection-promptpackage, 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
b18cbdbThanks @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/Unlockwith the sheet understeps/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
6b2c0c6Thanks @ovoronkov-ledger! - fix(asset-detail): stop cropping translated time range labels in the chart selector (LIVE-33383) -
#22759
bf29f88Thanks @qperrot! - fix(coin-bitcoin): read the explorer and tuning values from the injected coin configThe module no longer keeps configuration in module state.
createBridgestakes aContext
(ADR-019) and every bridge method resolvesconfig_currency_<id>fromcontext.config()at call
time. The endpointexplorer.urlis required and defaults to today's production host in each
servedconfig_currency_<id>(http://localhost:9876forbitcoin_regtest, whosebtc_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.calculationCacheTtlMsandfees.feeRatesCacheTtlMs
(5 min each) andsync.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 throughWalletBtcCurrency.explorerBatchSize, and the RBF ratio and
the unconfirmed-operation expiry are parameters.Breaking:
createBridges(signerContext, context)takes aContextinstead of a config getter;
setCoinConfig,getCoinConfig,CoinConfig,BitcoinConfigInfo,makeAssignFromAccountRaw
andgetMinRelayFeeare removed in favour ofBitcoinCoinConfig/BitcoinContextand
assignFromAccountRaw, andpostSyncbecomesmakePostSync(context). The module logs only
throughcontext.logger:buildTransaction,getTransactionStatus,prepareTransaction,
calculateFees,signAccountTx,ChainAdapter.resolveFeePerByte,buildSignRawOperationand the
hw-getAddress/hw-getFullViewingKeyresolvers take aLogger.prepareTransaction,getTransactionStatus,buildTransaction,
buildAccountTx,getOriginalTxFeeContext,getMinReplacementFeeSat,
getMinReplacementFeeRateSatVbandgetRbfContexttake the coin config as first parameter. The
getEditTransactionStatusandisStrategyDisabledbridge extensions require themainAccount. TheEXPLORER_REGTESTandBITCOIN_STUCK_TRANSACTION_TIMEOUTenvs are
removed, as are theconfig_currency_<id>defaults of the bitcoin-family currencies no loader
serves (bitcoin_private,game_credits,gochain,lbry,nix,ravencoin,resistance,
zclassic,zcoin). -
#22938
7a2505bThanks @qperrot! - Rename BNB Chain to BNB Smart Chain -
#22599
d819300Thanks @OlivierFreyssinet! - Add failureType and subError properties to Device Intent Executor deviceflow_failed and deviceflow_aborted events -
#23080
4e7c1aeThanks @mcayuelas-ledger! - Migrate mobile Add Account off pre-ldls onto Lumen and remove the native pre-ldls entry -
#22995
3444d16Thanks @OlivierFreyssinet! - Implement the final Discovering, Connecting and Connected views ofConnectNewDevice, 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,onDeviceNotFoundoronCloseends the flow. Its log also shows each mount and unmount.onDeviceNotFoundis 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
3dacfc2Thanks @fAnselmi-Ledger! - Bump@ledgerhq/device-management-kitto 1.11.0 and@ledgerhq/dmk-ledger-walletto 0.7.0. -
#23246
71c5860Thanks @aussedatlo! - Bump@ledgerhq/dmk-ledger-walletto 0.7.1,@ledgerhq/device-transport-kit-speculosto 1.3.0 and@ledgerhq/speculos-device-controllerto 0.4.0. -
#23000
0710383Thanks @LucasWerey! - Bumpreact-native-reanimatedto 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 theAmountDisplaydigits overlapping. -
#23083
4c28d72Thanks @gre-ledger! - Bump@ledgerhq/ledger-key-ring-protocol,@ledgerhq/hw-ledger-key-ring-protocolto 1.0.0 and@ledgerhq/evm-toolsto 2.0.0 (ts-libs). No API change. -
#22984
2680cb0Thanks @OlivierFreyssinet! - Move the discovery, connection and unknown error UI of the Device Intent Executor tomvvm/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
e308debThanks @benruseau! - Add the OS updates orchestrator React layer: a genericOsUpdatesOrchestratorComponentanduseOsUpdatesOrchestratorhook in live-common that render platform-injected components for each stepAdd 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
01ee590Thanks @RobinVncnt! - Handle firmware handover and onboarding exits, and drive every Nano S through the shared flow -
#22770
2cf2dfeThanks @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
cdd2446Thanks @LucasWerey! - Replace react-native-splash-screen with expo-splash-screen -
#23184
3dda070Thanks @CremaFR! - Retry a swap up to twice, without showing the error, when the Exchange app rejects the provider signature (signVerificationFailatCHECK_TRANSACTION_SIGNATURE).executeSwaprequests a new nonce and calls/swapagain with the same parameters. Each rejected attempt is still reported to/swap/cancelled, with the attempt in the error message:Signature verification failed Code: R0for the first attempt, thenR1andR2for the retries. This replaces the[diagnostic=…]signature classification, which is removed -
#22745
db3bde1Thanks @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
ac0379eThanks @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
3132a4aThanks @gre-ledger! - Consume@ledgerhq/ledger-key-ring-protocoland@ledgerhq/hw-ledger-key-ring-protocolfrom npm (they now live ints-libs), and bumpaxiosto 1.20.0. No API change. -
#22604
ca82e70Thanks @sarneijim! - Add anab_testsattribute to desktop and mobile analytics events with thetrackingConfigurationof each enabled English copy experiment, or{}when none applies -
#22603
9c0fecaThanks @sarneijim! - Addfeature_copy_*experiments to the feature flags debug screen soenabledandcopycan be mocked locally -
#22413
0f401bbThanks @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 sharedtransactionToIntentonly readsmemoType/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 legacymemofield. Left as is, flipping Cosmos into
genericCoinFrameworkFamilies.jsonin a later ticket would silently drop every memo, with no
error anywhere.Adds a
cosmosentry to the shared memo-application registry, addsmemoType/memoValueto
CosmosLikeTransactionalongside the existingmemofield (read unchanged by the live legacy
bridge), and centralizes the three-field patch in a singlecosmosMemoPatchhelper all four
write sites now call, so they can't drift out of sync. Also adds the memo length check
(CosmosMemoTooLong) to the AlpacavalidateIntent, which nothing previously enforced outside
the UI'smaxLengthtruncation. -
#23001
21ab07fThanks @ysitbon! - Move the countervalues Redux slice into@features/platform-market-countervalues: its reducer, action creators, initial state, state type and selectors. Both apps now mountcountervaluesReducerat the samecountervaluesstore key and keep their ownuseSelectorhooks, persistence, polling and user-settings computation. The action types keep the desktop strings, so mobile's pending, error and wipe actions are now namedCOUNTERVALUES_STATE_SET_PENDING,COUNTERVALUES_STATE_SET_ERRORandCOUNTERVALUES_WIPE. The reducer stays a plain function rather thancreateSlice, because immer would freeze the rate maps thatloadCountervaluesupdates in place. -
#23107
fa2c070Thanks @ysitbon! - Countervalues user settings are no longer stored in Redux: each app computes them and hands them to the provider through the bridge'suseUserSettings.@features/platform-market-countervalues: the slice loses itsuserSettingsfield,setCountervaluesUserSettings(COUNTERVALUES_USER_SETTINGS_SET) andcountervaluesUserSettingsSelector.- Desktop:
useCalculateCountervaluesUserSettingsreturns 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
eb23867Thanks @tonykhaov! - Offer Ledger Sync during device onboarding from the singledeviceOnboardingfeature flag -
#23131
a653da5Thanks @tonykhaov! - feat(device-onboarding): keep the screen awake while the device onboarding connects or runs -
#22996
1f50e41Thanks @gre-ledger! - Drop@ledgerhq/live-hooks:useDebounceand a simpleruseThrottledValuesnow live in@ledgerhq/live-common/hooks. -
#23056
9a39ad5Thanks @OlivierFreyssinet! -ConnectNewDevicekeeps a device that is no longer discovered in its list, with a disabled card and a disabled Connect button. -
#22803
0e3e7b0Thanks @ysitbon! - fix(feature-flags): show the Firebase project the build actually targetsThe 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
ff5e1b0Thanks @ysitbon! - refactor(feature-flags): move the Firebase Remote Config mapping to@features/platform-feature-flags-firebase@features/platform-feature-flagsnow only exposes resolved flag state (hooks andFeatureToggle).formatToFirebaseFeatureId,formatDefaultFeatures,parseFirebaseFeaturesandRemoteConfigValueare imported from@features/platform-feature-flags-firebaseinstead; the./firebasesubpath is removed. No behavior change. -
#22352
c7e76f3Thanks @ishaba! - fix(babylon): remove pre-selected validator, default to show all -
#22950
dccba0cThanks @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
d042881Thanks @ooke-ledger! - Fix perps deposit quotes returning empty on mobile: readSWAP_API_BASEfromreact-native-configat store setup so the swap aggregator URL is resolved before the store captures it -
#22939
c59fbf4Thanks @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
e2c3771Thanks @mdomanski-ext-ledger! - feat(hedera): migrate mobile Hedera flows to the generic transaction shape -
#22784
e72683bThanks @mcayuelas-ledger! - Hide the Pay tab card and its history when the pay-tab flag's card param is false -
#22985
4182256Thanks @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
2bb0ec2Thanks @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
8783545Thanks @francois-guerin-ledger! - chore(contacts): stop readingethereumLikeInfoand promotechainIdfrom coin config -
#22395
39d91b6Thanks @dilaouid! - feat(tracking): tracking error and warning in new send flow lwm -
#22743
4d9cfbdThanks @ysitbon! - Import the countervalues logic, types, helpers and mocks from@domain/entity-market-countervaluesinstead 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
calculatethey mock is called inside live-common: desktop'suseHistoryOperationsand mobile'suseOperationsListViewModelanduseOperationsV1. Their mock has to name the same module live-common imports. -
#23020
e1f1bedThanks @mcayuelas-ledger! - fix(asset-detail): show asset ticker and icon in the header when no Ledger currency resolves (e.g. Firo) -
#22703
a09b259Thanks @LL782! - Import mobile analytics from the shared packages instead of app barrel shims -
#22749
bde5ee6Thanks @ysitbon! - Import the countervalues logic, types and helpers from@domain/entity-market-countervaluesinstead of@ledgerhq/live-countervalues, and drop the legacy dependency. Specifier change only, no behaviour change. -
#22816
7b17793Thanks @lewisd5! - fix(lwm): declare babel-loader and @babel/plugin-syntax-typescript so the iOS bundle builds without @babel/* hoisting -
#22635
bfebf6bThanks @sarneijim! - Apply enabledfeature_copy_*Remote Config values as English copy overrides, reusing the feature-flag fetch -
#23086
5532cc2Thanks @LucasWerey! - Fix unreadable text on the feature flags debug screen in dark mode -
#22933
c24108fThanks @ysitbon! - Import the countervalues provider and hooks from@features/platform-market-countervaluesinstead of@ledgerhq/live-countervalues-react, anduseUsdToFiatRateanduseGetCounterValueIdsPollingfrom 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
faccddbThanks @LL782! - fix(analytics): send language as a flat property on the Discoverability - Prompt event -
#22943
dad0153Thanks @LucasWerey! - fix(my-wallet): show Help and Referral as tiles and Wallet backups as a list item (LIVE-38059) -
#22765
e3e6c22Thanks @OlivierFreyssinet! - Extract the device discovery service and the connectivity types shared by device connection flows into adeviceConnectivityfolder. The discovery, connection and unknown error UI states now use the sharedConnectivityUIStateTypesenum.ConnectDeviceUIStateTypesbecomes a const object that includes these shared members, so type positions usetypeof ConnectDeviceUIStateTypes.Xor the newConnectDeviceUIStateTypetype. The device type moves to the shared part asDevice, and connectDevice keepsKnownDeviceas an alias of it. connectDevice behaviour is unchanged. -
#23055
c7cf8b4Thanks @Valentin-Ledger! - Open the Borrow screen from the ledgerlive://borrow deeplink -
#22910
177a5b4Thanks @tonykhaov! - Pay card login: name Monavate instead of Baanx in "Log in to" and "Card provided by". -
#22649
514d6f9Thanks @koda-apps! - Show a newly linked Card asset when the user comes back to Pay from Baanx. -
#22723
a92f75fThanks @mcayuelas-ledger! - Closing Buy opened from the Pay tab returns to the Pay tab instead of the portfolio -
#22869
eb65ce4Thanks @mcayuelas-ledger! - Add feature-flag scenarios for the native Pay card, Card live app login, and CL Card disclaimer -
#22027
10e4a67Thanks @ooke-ledger! - Default the Perps deposit funding account to the USDC account with the highest non-zero spendable balance -
#22865
667d378Thanks @ysitbon! - Add@features/platform-market-countervalues, the countervalues React glue: the provider, its context and the hooks reading it, plususeUsdToFiatRateanduseGetCounterValueIdsPolling. It is a copy of@ledgerhq/live-countervalues-reactand of the two live-common hooks, which keep their own until their consumers move over.@ledgerhq/live-countervalues-reactreads the platform package'sCountervaluesContextinstead of creating its own, so a provider from either package serves the hooks of both. It stops exportingCountervaluesContext, which nothing imported, and drops its unused@ledgerhq/types-livedependency.- The platform package depends on no logging library. Desktop and mobile hand it their logger with
setCountervaluesLoggerat app setup, next to the rate lookups.
-
#23121
3a45eb3Thanks @OlivierFreyssinet! -ConnectNewDeviceshows 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
78b38fbThanks @dilaouid! - fix(send): sync account at the start of a send -
#23150
4dec481Thanks @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
b2792d8Thanks @mcayuelas-ledger! - Show a setup state on the History card tab when the signed-in holder has not claimed a card yet. -
#22960
ddd2bceThanks @dilaouid! - feat(contact): display contact in tx details lwm -
#22673
08e85b2Thanks @LucHebrard! - Remove the bottom safe-area padding on the Ledger Recover webview and show a themed loader until it loads -
#22661
ea1ae2dThanks @qperrot! - Fix Earn banner on Asset Detail not opening the SEI delegation validator selection -
#23044
dce4fb6Thanks @LucasWerey! - Remove the lwmQuickActionsCtasVariant feature flag and its Receive/Send quick action CTAs variant -
#22659
bed3cf9Thanks @liviuciulinaru! - Restore the Card sign-in state at app start so the Card history shows a stored session -
#22820
f4bfc96Thanks @gre-ledger! - chore(lwm): replace @rozenite/mmkv-plugin with @rozenite/storage-plugin -
#23221
91ad9a0Thanks @sarneijim! - AddconnectSeededDeviceto thedeviceOnboardingflag and send a non-seeded device to legacy onboarding unless the host can run seed setup -
#23140
b99f923Thanks @gre-ledger! - Play Lottie animations through the new@shared/lottiepackage: dotlottie on web (replacing the unmaintainedreact-lottie/lottie-web),lottie-react-nativeon mobile. -
#22702
c4f0be9Thanks @mateuszpalosz-ext! - updated translation for claim operations for Aleo -
#22950
8737f89Thanks @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
42d4dc2Thanks @benruseau! - Add the apply updates sub-step to the OS updates orchestrator, covering the OSU install, the MCU flash loop and the final firmware installWait 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_URLto the DMK secure channel WebSocket URL -
#21839
6d744e0Thanks @YazhuEth! -estimateFeesnow 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 throwsSolanaTokenAccountHoldsAnotherToken.makeEmptyTokenAccountnow builds its id withencodeTokenAccountId, 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
ldmkSolanaSignerflag 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
7f0d867Thanks @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
69284e8Thanks @sarneijim! - Keep the Ledger Recovery Key backup as its own onboarding step -
#23032
bcd25fdThanks @OlivierFreyssinet! - chore(live-dmk): remove the ldmkTransport feature flagDeviceManagementKitProvideron desktop no longer takesldmkTransportEnabledand always provides
the Device Management Kit.useDeviceManagementKitnow returns a non-nullDeviceManagementKitand
throws outside the provider. The PayTab address verification always uses the Device Intent Executor,
and theisLDMKTransportEnabledanalytics property is removed. -
#23031
3264580Thanks @philipptpunkt! - PassswapApiEnv(stg|prd) to the Swap live app so it follows Wallet's Swap backend- Derived from the
SWAP_API_BASEurl via newgetSwapAPIEnvhelper in live-common - Unknown hosts (e.g. localhost) send nothing; the live app keeps its own default
- Stop passing the full
swapApiBaseurl; the live app no longer reads it
- Derived from the
-
#22891
cc764ecThanks @ooke-ledger! - Open swap history from theswap/historydeeplink, with the swap matchingswapIdopened -
#23127
7f7eeabThanks @LucasWerey! - Replace react-native-get-random-values with expo-crypto for crypto.getRandomValues -
#23185
437d666Thanks @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
67dbab2Thanks @OlivierFreyssinet! - Add theConnectNewDevicecomponent. 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 andConnectNewDevicenow save the connected device with the sameuseSaveConnectedDevicehook.ConnectNewDevicealso 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
ConnectNewDevicecomponent, logs itsonConnected,onDeviceNotFoundandonClosecalls, and can restart the flow with other delays. -
#22384
bc6383aThanks @Moustafa-Koterba! - Migrate the mobile Cosmos staking UI (delegate, undelegate, redelegate, claim/compound) onto the generic staking transaction shape -
#22953
f482212Thanks @OlivierFreyssinet! - chore(device): remove the legacy connectApp and the ldmkConnectApp feature flagconnectAppandconnectManagernow always use the Device Management Kit device actions and fail
withDmkTransportRequiredon a non-DMK transport.apps/inlineAppInstall,hw/isUpdateAvailable
andDeviceManagementKitTransport.listenLegacyConnectAppare removed. -
#23022
ebc1ab9Thanks @LucasWerey! - Fix Receive confirmation header so the help button no longer overlaps the title or triggers close -
#21764
b014537Thanks @shazzzam! - Add the Tronify sponsored send to the mobile Send flow behind thegasSponsorshipflag: 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
c56dcb3Thanks @ysitbon! -useSendAmounttakes thecryptoCurrencyto convert instead of theaccountholding it. Callers resolve it withgetAccountCurrencyon 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
8312d68Thanks @gre-ledger! - chore: takeuuidfrom the pnpm catalog (11.1.0)uuidwas spread over 8.3.2, 9.0.1 and 11.1.0. Every package now uses the catalog entry.@types/uuidis dropped: 11 ships its own types. The repo only importsv4,v5andparse(parsein a coin-solana test fixture), which behave the same across these majors. 11 typesv4with overloads, so passing it directly as a callback (useState(uuid)) no longer typechecks and is now wrapped (useState(() => uuid())). -
#22383
33094bcThanks @ysitbon! - Let wallet-pnl declare the countervalues interface it needsThe 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 aRateLookupinterface, treats the state as an opaque snapshot, and drops
@ledgerhq/live-countervaluesfrom 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.
getCostBasismemoises 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-countervaluesashistoryKey, beside the
lenseRateMapit 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,buildMultiCVanddailyHistory
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/scenariosno 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