@ledgerhq/live-desktop@4.16.0
4.16.0
Minor Changes
-
#20278
3d24a89Thanks @gre-ledger! - Drop the@ledgerhq/errorsdependency, completing the errors sunset (LIVE-32915).The
@ledgerhq/errorspackage is removed from the monorepo: no workspace source imported it anymore, every error class it held now lives in the package that owns it (@ledgerhq/ledger-wallet-framework/errorsfor the ones shared across coin modules).createCustomErrorClassand theserializeError/deserializeErrorstack are gone with it — define errors as native classes and branch onerror.name.@ledgerhq/errors@6.37.0stays on npm for external consumers, but is no longer published from this repo. -
#20280
9fcbe39Thanks @gre-ledger! - Stop depending on@ledgerhq/errors(LIVE-32915).No workspace package declares it anymore, and none may again:
enforce-boundariesnow fails CI on any manifest that does. The classes it held live in the package that owns them, with@ledgerhq/ledger-wallet-framework/errorsas the shared home below the coin layer.The package itself stays in the repo so it keeps being published for external consumers, and is bridged to the external coin packages that still peer-depend on it via
pnpm.packageExtensionsusingworkspace:*(which reuses the single in-repo copy, so the dependency graph keeps exactly the physical copies it had before). LedgerHQ/coin-modules#752 removes that peerDependency upstream; once it is released the bridge can be dropped, but the package still needs publishing. -
#20315
4b73f81Thanks @RobinVncnt! - Portfolio upsell banner and Braze content cards can now coexist on Portfolio (Mobile: shared carousel; Desktop: side-by-side grid when Braze placement is enabled, otherwise upsell stacked above the Braze carousel). -
#20624
e74a4a3Thanks @LucasWerey! - Retarget desktop off the dada-client shims onto @features/platform-aggregated-assets and @domain/api-aggregated-assets -
#20474
e73390cThanks @deepyjr! - Replace the Desktop address name clear action with a help tooltip. -
#20404
0f89b44Thanks @liviuciulinaru! - Replace the legacy Pay Card placeholders with the shared authentication flow on desktop and mobile -
#20266
626c858Thanks @tonykhaov! - Upgrade analytics consent QA debug screen to scenario parity -
#20585
feaf2fcThanks @claudiiafg! - Require signer confirmation before opening address delete confirmation in Contacts. -
#20423
44694e5Thanks @gre-ledger! - Complete the WalletSync DDD extraction: apps now compose the DDD slices directly@ledgerhq/live-walletno longer owns sync infrastructure.src/cloudsync/,src/walletsync/,
src/accountName.tsandsrc/store.tsare removed in favour of@shared/cloud-sync,
@shared/wallet-sync,@features/platform-wallet-sync,@domain/entity-account-nameand
@domain/entity-recent-addresses. What remains is the account list sync module (src/accounts/)
plussrc/walletSyncComposition.ts, which assembles the sync modules into the wallet-sync schema.Desktop and mobile replace the monolithic
walletreducer with acombineReducersof the entity
slices (accountNames,starredAccountIds,walletSync,recentAddresses,nonImportedAccountInfos)
and wire the watch loop and trustchain lifecycle from@features/platform-wallet-syncat bootstrap.
@ledgerhq/live-commondrops its@ledgerhq/live-walletruntime dependency: the wallet-api,
platform and CSV-export helpers now take anAccountNamesStateinstead of the wholeWalletState. -
#19169
d989af2Thanks @OlivierFreyssinet! - Add desktop Device Intent Executor context initializer. -
#20520
0db9cd3Thanks @OlivierFreyssinet! - Add Device Intent Executor shell tracking (lifecycle, errors, dialog dismiss). -
#20608
4033c32Thanks @vladyslavchupovskiy-ext-art! - AddderiveShieldedAddress(ufvk)to derive the Orchard unified address host-side from a UFVK without requiring a device connection. PersistsshieldedAddressinZcashPrivateInfowith backward-compatible serialisation (null fallback for legacy accounts). -
#20595
43bf6d8Thanks @ysitbon! - Make every new-architecture barrel a pure regrouping point, and enforce it.An
index.*undershared/,domain/orfeatures/may now contain onlyexport * from "./x"
lines, plus an optional default re-export. Having to sort in the export
(export { a, b } from "./x") proved the target file mixed public and private code; anindex.*
holding actual code proved it more loudly. A new nx plugin infers alint:structuretarget on each
of the 49 packages and fails on both, along with two related rules: a barrel may not re-export a
privateinternalslocation, and it may not re-export another workspace package.That last rule removes the proxies. A package that re-exported a neighbour gave the same symbol two
import paths and hid who actually provided it. Consumers now import the original provider and
declare the dependency, which is why the two apps gain@features/flow-contacts-add-contactand the
desktop app gains@features/platform-contacts.Renamed or relocated, with the import specifier unchanged for consumers in every case except where
noted:@domain/entity-account-nameno longer exports thesetAccountNamesalias; use
bulkSetAccountNames, the name the slice actually defines.@shared/cloud-syncexportsgetCloudSyncApias a named export from its api module instead of
re-exporting a default under a different name.
Five packages are left untouched behind temporary exclusions, each recording how to remove it:
@shared/env, the facade over the legacy@ledgerhq/live-env, which carries the wrapping in its
barrel.- the
@ledgerhq/engagementand@ledgerhq/ptxpackages (flow-analytics-consent,
flow-large-screen-upsell,flow-lazy-onboarding-banner,flow-pay-card-auth), so each owning
team lands the change on its own schedule. Conformant barrels were prepared and verified for them
before being reverted, so the work is deferred rather than open.
-
#20627
7af726bThanks @YazhuEth! - Explain the higher network fees when sending to an address that does not exist yet. EIP-8037 charges account creation substantially more gas, and nothing in the send flow told the user why the fee jumped. The gas we send is unchanged:eth_estimateGasremains the only source. -
#20646
fd7152aThanks @dilaouid! - feat(lwd): add recipient contact card to the send flow -
#20439
65beee5Thanks @deepyjr! - Fix the Contacts currency selection list so it fills the modal height. -
#20454
e1b63ffThanks @dilaouid! - feat(lwd): bip21 and eip681 scan for lwd -
#20455
f77b3faThanks @deepyjr! - Add invalid and sanctioned address feedback to the Desktop Contacts flow. -
#20641
1dde844Thanks @semeano! - Add a warning on Zcash accounts that the private balance excludes Sapling and Orchard shielded funds. -
#20216
593231cThanks @semeano! - Restrict the Zcash balance, operations and shielded send flow to the Ironwood pool only. -
#20207
aee0e64Thanks @lysyi3m! - Add Internet Computer (ICP) neuron staking to the coin module: create and top up neurons, start/stop dissolving, disburse, set/increase dissolve delay, follow, split, spawn, stake maturity, and add/remove hot keys, plus neuron listing. Governance operations are routed through the NNS governance canister via the device's update-call signing, alongside the existing ledger transfer path, and account synchronization now carries neuron data. Adds theSTAKE_NEURONandTOP_UP_NEURONoperation types, with matching icons and labels in the desktop and mobile operation history. (LIVE-28469) -
#20456
a0f13a2Thanks @sarneijim! - Use fixed legacy onboarding date for backfill instead of app-open date -
#20458
9876163Thanks @sarneijim! - Use legacy onboarding date fallback in large-screen upsell eligibility -
#19169
92b70efThanks @OlivierFreyssinet! - Preserve installed apps in Device Intent Executor last seen device info. -
#20408
e9a14f8Thanks @claudiiafg! - Wire send, edit, and delete actions on desktop contact address detail. -
#20557
3e0ae80Thanks @claudiiafg! - Render Desktop Contacts address edit signer mismatch error from shared flow state. -
#20539
60b4626Thanks @gre-ledger! - Scope@ledgerhq/live-walletdown to wallet sync onlyThe package now exposes
./accountsand./walletSyncCompositionand nothing else.
ordering.tsandaddAccounts.tsmove to@ledgerhq/live-common/account/*, and
accountRawToAccountUserDatajoinslive-common/account/serializationnext tofromAccountRaw.
Theliveqr/folder is gone:importAccounts.tsandaccountToAccountDatawere unreachable, and
accountDataToAccount— whose only callers rehydrated a wallet-sync descriptor — becomes
accounts/descriptorToAccount.live-commonno longer depends onlive-wallet. -
#20510
a1bd49eThanks @claudiiafg! - Model Me as the default self contact with shared display-name formatting, external address counts, and a Ledger Wallet accounts intent. -
#20643
bef9477Thanks @dilaouid! - fix(send): validate custom fees against native balance for evm tokens -
#18764
d266e13Thanks @philipptpunkt! - Migrate the swapfetchQuoteshelper from axios to an RTK Query endpoint (swapQuotesApi). The aggregator/quoterequest now flows through the Redux data layer, and the rawQuotes/providerErrors split is unchanged. Desktop and mobile register the new API and inject their store dispatch at startup viasetSwapQuotesStore; wallet-cli, which has no app store, sets up a standalone one.The endpoint itself now lives in the new
@domain/api-swap-quotespackage; live-common re-exports it, so existing call sites are unchanged.Two behaviour changes to be aware of:
/quotenow goes through the authenticated base query, where the legacy axios call sent no credentials. Both apps already register an auth provider on their store'sextra, so whether a request carries anAuthorizationheader is controlled entirely by thelwdAuth/lwmAuthfeature flags. They are disabled by default; enabling either one makes/quotesend the user's bearer token to the aggregator, and makes a 401/403 trigger the adapter's refresh-and-retry.- An aggregator HTTP error (4xx/5xx) now resolves to an empty result, so the caller surfaces the
noQuotesglobal. Previously the shared axios error interceptor turned these intoLedgerAPI4xx/LedgerAPI5xx, which propagated to the live app as an error. Only transport failures (no HTTP response) still reject, now with aSwapQuotesRequestFailederror rather than a bare RTK Query error object.
-
#20638
120d4ebThanks @sarneijim! - Use full-width LNS upsell MediaBanner in notification center -
#20642
a61f702Thanks @mcayuelas-ledger! - Persist the pay card hero balance filter across app restarts -
#20551
488217fThanks @mcayuelas-ledger! - Persist the payCard slice on desktop: save and restore only { hasSeenFeatureTour } so the Pay feature tour does not reappear after restarting the app -
#20628
8259d4dThanks @dilaouid! - feat(lwdm): add matched contact lookup for the send recipient flow -
#20518
ce46179Thanks @dilaouid! - chore(lwdm): refactoring mvvm recipient screen -
#20430
647804eThanks @gre-ledger! - Move the recent-addresses domain model and in-memory store into@domain/entity-recent-addressesRecentAddressandRecentAddressesStateare no longer declared in@ledgerhq/types-live; they are now inferred from the Zod schemas in@domain/entity-recent-addresses, which also ownsRecentAddressesStore,setupRecentAddressesStoreandgetRecentAddressesStore. Import them from@domain/entity-recent-addresses.@ledgerhq/live-common/account/indexstill re-exports the store API unchanged, minus theRecentAddressesCachealias — useRecentAddressesStateinstead.Also fixes the store mutating its own state in place: once a first mutation had been dispatched, immer had frozen that exact object graph, so the next
addAddressorremoveAddresson the same currency threwTypeError: Cannot assign to read only property. The store now replaces its state instead of mutating it. -
#20473
73948c9Thanks @dilaouid! - fix(lwdm): fix sanctionned ens address check -
#20111
aa3ea09Thanks @YazhuEth! - chore(coin-solana): remove preload and hydrate - fetch validators on demandCurrencyBridge.preload/hydrateare deprecated, and preloading the validators.app
list slowed down the scan account flow. Validators are now fetched lazily behind a 15min
LRU cache (@ledgerhq/coin-solana/validators) the first time a screen needs them.useSolanaPreloadDatais removed from@ledgerhq/live-common/families/solana/react; use
useValidatorsinstead.getAccountBannerStatenow takes the validators as a third argument. -
#20371
0f42c42Thanks @deepyjr! - Add mocked confirmation and saved address rendering to Desktop Contacts. -
#20333
4ef4615Thanks @tonykhaov! - Inline large-screen upsell modal entity state into the flow package -
#20471
3aefd3bThanks @dilaouid! - fix(lwdm): check sanctions for token recipient addresses -
#20622
ed79527Thanks @mdomanski-ext-ledger! - Rename Hedera'sHederaValidator.nodeIdtoid(string), matching the framework'sValidator.idand removing the duplicate identity field. Preload caches persisted by earlier versions are migrated on hydration, so upgrading users keep their cached validators. On-chain protocol fields (Transaction.stakingNodeId,HederaDelegation.nodeId) are unchanged. -
#20508
e7c941fThanks @claudiiafg! - Extract ghost-click guard logic to shared utility in EditName dialog -
#20637
f440c85Thanks @LucasWerey! - Retarget the remaining libs consumers and both store roots off the dada-client shims -
#20597
8c97aa1Thanks @OlivierFreyssinet! - Track Device Intent Executor Connect App states on desktop. -
#20552
e499f00Thanks @OlivierFreyssinet! - Add Device Intent Executor Connect Device tracking.
Patch Changes
- Updated dependencies [
3d24a89,9fcbe39,8559d54,f080e51,9b3fb2a,e73390c,6f6afe2,1de30a9,0f89b44,6258380,f1e93f7,02c6f9e,c4a8141,feaf2fc,9ef4440,5297c79,cc8b5b9,44694e5,4033c32,43bf6d8,fd3e81e,7af726b,e5ec77b,fd7152a,2ec3de4,4d27e41,2f297f7,f77b3fa,d614891,593231c,9e1412e,aee0e64,9708010,a0f13a2,9876163,92b70ef,5bdffd5,e9a14f8,91a2953,3e0ae80,c904346,60b4626,28046d3,64bb8cf,a1bd49e,bef9477,d266e13,e1e005d,1e9db75,7d5cd98,cc9d58f,6be80d8,0e439a0,a61f702,40efdfb,2edf614,9e45705,baba728,09c77c1,8259d4d,ac57e97,6694d77,bbfc8cf,647804e,6d45e7c,79d2278,5edd732,8a3a0bb,71b1069,ccbda89,9ea6eed,da86f85,aa3ea09,aaa67a7,aac9b34,c9eab39,4ef4615,ed79527,bdd82c4,53c3431,78ebc73,f440c85,b0e81d2,fb1ba1b,135223e,4c9af42,b9d4a22,79789ba,5171877,e664d84]:- @ledgerhq/coin-bitcoin@0.51.0
- @ledgerhq/coin-canton@0.33.0
- @ledgerhq/coin-cardano@0.34.0
- @ledgerhq/coin-casper@2.19.0
- @ledgerhq/coin-concordium@0.20.0
- @ledgerhq/coin-cosmos@0.43.0
- @ledgerhq/coin-evm@4.10.0
- @ledgerhq/coin-filecoin@1.32.0
- @ledgerhq/live-common@37.2.0
- @features/flow-contacts@0.6.0
- @features/platform-contacts@0.2.0
- @features/flow-contacts-add-contact@0.2.0
- @features/flow-pay-card-auth@0.2.0
- @domain/entity-contact@0.6.0
- @ledgerhq/ledger-key-ring-protocol@0.19.0
- @shared/cloud-sync@0.1.0
- @domain/entity-currency-crypto@0.10.0
- @domain/entity-currency-token@0.4.0
- @domain/entity-currency-fiat@0.4.0
- @ledgerhq/live-wallet@1.0.0
- @domain/entity-wallet-sync@0.1.0
- @ledgerhq/coin-zcash@0.3.0
- @domain/api-currency-fiat@0.4.0
- @domain/api-currency-token@0.4.0
- @domain/entity-account-name@0.2.0
- @domain/entity-client-identity@0.2.0
- @domain/entity-currency@0.4.0
- @features/flow-fear-and-greed@0.3.0
- @features/platform-aggregated-assets@0.3.0
- @features/platform-currencies@0.6.0
- @features/platform-env@0.2.0
- @features/platform-style@0.2.0
- @shared/api-services@0.3.0
- @shared/auth@0.4.0
- @shared/feature-flags@0.18.0
- @ledgerhq/types-live@6.119.0
- @ledgerhq/ledger-wallet-framework@2.8.0
- @features/flow-large-screen-upsell@0.5.0
- @domain/api-aggregated-assets@0.3.0
- @domain/entity-interest-rate@0.3.0
- @ledgerhq/hw-transport-http@6.37.0
- @ledgerhq/types-devices@6.32.0
- @domain/entity-pay-card@0.3.0
- @devtools/bindings@0.3.0
- @devtools/transport-panel@0.4.0
- @devtools/shell@0.8.0
- @ledgerhq/live-dmk-shared@0.30.0
- @ledgerhq/asset-detail@0.11.0
- @ledgerhq/asset-aggregation@0.13.0
- @ledgerhq/live-dmk-desktop@0.20.6
- @features/platform-wallet-sync@0.1.1
- @ledgerhq/live-currency-format@0.14.1
- @ledgerhq/wallet-analytics@0.3.3
- @ledgerhq/wallet-btc@0.3.0
- @ledgerhq/wallet-pnl@0.7.6
- @domain/entity-analytics-consent@0.2.1
- @domain/api-push-devices@0.2.1
- @domain/api-altcoins-sentiment@0.3.1
- @domain/api-market-sentiment@0.3.1
- @domain/entity-recent-addresses@0.1.1
- @features/platform-feature-flags@0.6.5
- @devtools/wire@0.3.1
- @ledgerhq/domain-service@1.8.14
- @ledgerhq/live-countervalues@0.24.2
- @ledgerhq/live-countervalues-react@0.16.6
- @ledgerhq/hw-transport-vault@1.7.8
- @ledgerhq/device-intent@5.0.0
- @domain/api-pay-card@0.2.1
- @features/flow-analytics-consent@0.2.1