@ledgerhq/live-desktop@4.19.0
4.19.0
Minor Changes
-
#20818
f9be984Thanks @beths-ledger! - Emitearn_transaction_completed/earn_transaction_failedfor native staking, from the account-bridge seam.Every transaction route resolves its bridge through
getAccountBridge, sowrapAccountBridge— which already hosts the sanctioned-address check — is the one place that sees them all. It now decoratessignOperation(emitting a classified failure, then re-raising the original error untouched) andbroadcast(success or classified failure). The device-action layer adds the one signal the bridge cannot see: closing the sign prompt is an unsubscribe rather than an error, so abandonment is reported from there.This replaces UI-inferred bottom-of-funnel tracking for staking, where a user reaching the final screen was counted as converted whether or not a transaction ever landed. No analytics event is produced for non-staking transactions. The seam observes every sign and broadcast outcome, and the Segment mapping is what drops the ones with no derived staking action — so plain sends and swaps reach no analytics sink, and no currency allowlist is needed.
Desktop and mobile each register a Segment observer at startup;
trackalready self-gates on analytics consent. Desktop also registers a dev-only console observer so the whole seam can be watched locally across every staking route and coin. The existing DatadoguseBroadcastpath is untouched. -
#21045
4342943Thanks @cted-ledger! - Fix missing memo in Zcash shielded operation details. After a shielded send with a memo, the memo is now persisted in the operation extra and displayed in Transaction details. -
#21243
2e92399Thanks @henri-ly! - Show the Contacts feature introduction in the new Send flow recipient step, for currency families eligible to the address book when the contacts feature flag is on and the user has not dismissed it yet. -
#21337
8c98500Thanks @gre-ledger! - Anonymize account ids in Desktop routes:/account/...paths now carry a non-reversible alias instead of the account id, which embeds an xpub or an address -
#21162
dff2a65Thanks @sarneijim! - Add missing Touchscreen Upgrade Program tracking for Backup Hub Recovery Key upsell and Lazy Onboarding Banner (LIVE-36494) -
#21098
0f71eebThanks @gre-ledger! - Upgrade rsbuild to 2.1.13, rspack to 2.1.10, and rslib to 0.23.2 -
#21348
46f41d2Thanks @deepyjr! - Update the Contacts feature introduction image and English copy, and remove its description field from the shared contract. -
#21346
23099d3Thanks @deepyjr! - Select newly created contacts in the Contacts detail pane. -
#21244
f4986f8Thanks @mcayuelas-ledger! - Show a host-provided Crypto card title on the Pay Card web and native views -
#21336
75f6af6Thanks @mcayuelas-ledger! - Filter desktop History by contact addresses via?contactId=. -
#21113
a6e4aceThanks @dilaouid! - feat(send): add a contact from an address in the send flow -
#21289
3b80e94Thanks @mcayuelas-ledger! - Add a "Load contacts from send history" generator to the desktop Contacts devtool -
#21363
ce47443Thanks @liviuciulinaru! - Read CARD_API_URL and CARD_BAANX_CLIENT_KEY on every use, and not one time at boot. The debug settings can now change the Card tenant without a restart. The mobile app also applies its.envvalues before the store reads them. -
#20117
6780db0Thanks @shazzzam! - Celo: show a clear "temporarily unavailable" message when voting is blocked during on-chain epoch processing, instead of a generic "RPC request failed" error -
#21220
bb44e2cThanks @OlivierFreyssinet! - Move the Contacts device intent renderers into the apps.@features/platform-contacts/device/intentsnow exports component-less
IntentDefinitions. Each app owns its renderers under
src/mvvm/features/Contacts/deviceIntents/, composes them into
IntentPlatformDefinitions and injects them intouseContactsIntentsOrchestrator,
which no longer imports a production intent implementation.A
features/package cannot resolve translations today, so a renderer that shows
translated copy has to live in the app. -
#21128
31223ebThanks @OlivierFreyssinet! - Orchestrate Contacts device confirmations through the Device Intent Executor. -
#21236
c62986bThanks @OlivierFreyssinet! - Register an external address on the device from Contacts. The device intent now calls@ledgerhq/device-contacts-kit'sContactsManager.registerExternalAddress(), each failure gets its own JobState (app version too low, invalid input, device rejected, existing-group verification failed, unsupported operation, device error), and both apps render the confirmation step and oneInfoStateper failure. A rejection keeps the job open so the user can retry on the same device. -
#21185
cef29a0Thanks @OlivierFreyssinet! - Add shared Contacts kit wiring: version-requirement wrappers over@ledgerhq/device-contacts-kit, composed with each app's app-global floor into the Contacts device intents' minimum app-version floor. -
#21225
2c65f71Thanks @sarneijim! - Add inline QA device simulation dev tool in Developer settings (LIVE-33171) -
#21222
fcdac1cThanks @gre-ledger! - Wire Env, Trustchain and Cloud Sync devtools into LLD and web-tools; wire Env devtool into LLM. -
#21282
0c29157Thanks @gre-ledger! - Stoplogger.criticalfrom reporting non-Error values to Datadog, where they collapsed into unsearchable"null"and"[object Object]"issues merged across unrelated callers. Such values are still kept in the local logs. -
#21089
803c2dbThanks @Valentin-Ledger! - Add earn/simulate deeplink to open the rewards simulator -
#21338
114420eThanks @mcayuelas-ledger! - Add View transactions from Pay contacts to History filtered by contact. -
#21347
b3a86f5Thanks @mcayuelas-ledger! - Move Pay balance/action-tile copy resolution into @features/flow-pay-balance via @shared/i18n so hosts no longer pass translated labels. -
#21365
77fe9ebThanks @mcayuelas-ledger! - Gate History contact features (contactId scoping and From/To contact name resolution) behind the lwdPayTab feature flag -
#21314
2cd8167Thanks @deepyjr! - Add explanations for unsupported assets and networks in the modular dialog -
#21032
f9f6b71Thanks @pawell24! - Default the Zcash shielded-balance birthday to Ironwood (NU6.3) mainnet activation
instead of Orchard/NU5 activation, and reject a birthday dated in the future. -
#21190
aafcdb7Thanks @vtaranushenko-ext-ledger! - Preserve transferId through the generic adapter for Casper -
#21142
11a1e34Thanks @dilaouid! - feat(send): add address to an existing account in the send -
#21532
173be30Thanks @francois-guerin-ledger! - chore(coin-solana): support v1 transactions -
#21394
6046b34Thanks @mcayuelas-ledger! - Fix MarketBanner/Market list navigation so clicking Arbitrum opens the ARB asset detail instead of the Ethereum one, by passing the market ledger ids in the navigation state and preventing a bare market id from colliding with a same-named chain id -
#21209
a334296Thanks @mcayuelas-ledger! - Wire the Pay contacts empty state to the shared Add contact dialog, Ledger Sync gate, and a host-injectedcreateContactCreationPort. -
#21208
1b789dcThanks @amaslakov! - Celo: add USAT (Tether America USD) to the fee currencies that can be selected to pay gas -
#21126
6c97b3fThanks @RobinVncnt! - Stack the LNS upsell banner above the hardware carousel instead of squeezing it into a tile slot, share a carousel with action cards only on mobile, and stop the Content Cards QA console from collapsing every Top wallet preset into the "alwayson" category -
#21107
244ff43Thanks @sarneijim! - Add missing tracking for touchscreen upsell placements on desktop (LIVE-36428) -
#21216
70ae1c8Thanks @mcayuelas-ledger! - Show the Card page background on the Pay page -
#21175
911a996Thanks @tonykhaov! - Show Pay action tiles in every hero state (LIVE-36422). -
#21099
c8614bfThanks @mcayuelas-ledger! - Add@features/flow-pay-card, a Contacts-style orchestrator that aggregates the Pay Card leaf flows behind a singleCardentry point. It follows the app MVVM split — aCardcontainer wires a shareduseCardViewModelto the platformCardView— and composes the card face from@features/flow-pay-card-details(CardVisualwith the balance overlay, or the bareCardArtwork) with the authentication controls (CardLogin/CardLogoutfrom@features/flow-pay-card-auth), each of which still decides on its own whether it belongs on screen.The flow owns the (currently mocked) card balance and assembles the overlay itself, so hosts no longer pass a pre-built visual: they hand over only what they alone know —
formatCountervalue(needs the app's locale and counter-value currency) andbalanceLabel(i18n). Both apps now mountCardinstead of wiringCardLogin/CardLogoutdirectly: desktop in the Pay tab's right panel, mobile in the Pay tab body. The package composes rather than re-exports: apps that need a single leaf or its Redux state (@features/flow-pay-card-auth/state) keep importing that leaf directly. -
#21310
1e0763eThanks @mcayuelas-ledger! - Display the full list of saved contacts on the desktop Pay tab, ordered by last sent-to then last added -
#21203
0127ebdThanks @mcayuelas-ledger! - Add a webContactssection (title + empty state with an Add contact CTA) and mount it on the desktop Pay tab. The package reads the contacts and derives the empty state itself; the host injects the copy and anonAddContacthandler. The add-contact flow and the Ledger Sync gate land in a follow-up. -
#21144
62008f0Thanks @tonykhaov! - Keep Pay hero empty vs funded from cached holdings; skeleton the amount only when funded (LIVE-36422). -
#21242
3b3c696Thanks @dilaouid! - feat(send): add to an existing contact in send flow lwm -
#21266
9faeaf8Thanks @mcayuelas-ledger! - Rename the request receive save helpers and the summary test id to drop their redundant "card" suffix -
#21103
63d7a08Thanks @dilaouid! - fix(lwd): fix layout of security content in recipient step -
#21145
5bcc7f1Thanks @tonykhaov! - Rename the Pay request flow package from@features/flow-pay-card-requestto@features/flow-pay-request. -
#21139
848b4bdThanks @OlivierFreyssinet! - Move the InfoState component (and its web-only dialog background tone plumbing) out of ledger-live-desktop and live-mobile into a new shared package, @shared/ui-info-state, so it can be reused in the DDD architecture -
#21179
46ed356Thanks @pawell24! - Fix the Zcash shielded-balance "Stop sync" action, which previously did nothing when the
running sync was started automatically by the standard wallet sync rather than by the
manual start button, and could resume on its own shortly after a manual stop otherwise
succeeded. -
#20935
27388a8Thanks @dilaouid! - Move Solana staking onto the genericStakingResourcesaccount attribute.Breaking for
@ledgerhq/coin-solana.SolanaResources,SolanaResourcesRaw,toSolanaResourcesRawandfromSolanaResourcesRaware gone.SolanaAccountis now an alias ofStakingAccount, so read staking data fromaccount.stakingResourcesinstead ofaccount.solanaResources. A stake is aStakingDelegationor aStakingUnbonding(SolanaStakingPosition) rather than aSolanaStake: its stake account address ispositionId, its validator isvalidatorAddress, and the formeractivation.active/activation.inactive/withdrawablefields areactiveAmount/inactiveAmount/withdrawableAmount.listSolanaStakingPositions,solanaActivationStateandstakeActionsfrom@ledgerhq/coin-solana/logiccover the common access patterns. Accounts already persisted with asolanaResourcesblob are migrated on hydration, so no resync is needed.@ledgerhq/types-livegainsStakingPositionDetails, mixed intoStakingDelegationandStakingUnbondingfor chains that materialize each position as its own on-chain account, plusactionFeeReserveonStakingResources. Both are optional, so other chains are unaffected.@ledgerhq/wallet-cli'searn positionsoutput changes shape: onEarnSolanaStake,stakeBalanceandwithdrawablego fromnumberto an integer decimal string, so lamport amounts aboveNumber.MAX_SAFE_INTEGERstay exact. Anything reading those two fields numerically needs updating.@ledgerhq/ledger-wallet-frameworknow exports the genericStakingResourcesserializer (toStakingResourcesRaw,fromStakingResourcesRaw,assignStakingResourcesToAccountRaw,assignStakingResourcesFromAccountRaw), moved out of the EVM family inlive-commonso every coin module can use it. -
#21111
17b43dfThanks @deepyjr! - Refresh desktop countervalues when the app regains focus or network connectivity. -
#21131
09af9b1Thanks @mcayuelas-ledger! - Rename the Pay flow packages to drop the redundantcardsegment:@features/flow-pay-card-balance→@features/flow-pay-balance,@features/flow-pay-card-deposit→@features/flow-pay-deposit, and@features/flow-pay-card-feature-tour→@features/flow-pay-feature-tour. Package paths, npm names and all imports are updated; persisted Redux state keys and component test IDs are unchanged. -
#21279
fe4e836Thanks @deepyjr! - Use a reliable manifest submit handler and wait for recipient validation before send assertions. -
#21536
dab00b6Thanks @ishaba! - fix(coin-tron): restore the TRC20 fee_limit default -
#21265
5b78670Thanks @gre-ledger! - Add@shared/i18n, a thin i18n context bridge sofeatures/*anddomain/*components can calluseTranslation()and render<Trans>instead of receiving translated strings as props.Both apps now build their i18next engine with an explicit
createInstance()rather than the global singleton, and mount<I18nProvider>at their root alongside the existing<I18nextProvider>. Non-React call sites import the app instance (~/renderer/i18n/initon Desktop,~/i18n/instanceon Mobile) instead ofi18next, enforced by a lint rule.@features/flow-pay-feature-touris the pilot: it resolves its ownpayTab.featureTour.*copy and no longer takes any copy props. -
#21132
6cc7ac6Thanks @dilaouid! - chore(send): remove addressBook property from the coin descriptor -
#21188
c8bb138Thanks @Moustafa-Koterba! - feat(lwdm): ask ledger sync on add contact -
#21273
f141a28Thanks @gre-ledger! - Guard Live App webview calls against a detached Electron guest so top bar actions and the network error retry no-op instead of throwing -
#21040
55d4feeThanks @lpaquet-ledger! - fix hint of previous user location tab when entering swap from deeplink -
#21123
ebd5766Thanks @deepyjr! - Stabilize local manifest creation in desktop Playwright tests. -
#21152
116f006Thanks @alexstapenka-ledger! - Add thestableSavingsfeature flag, forward it to Earn on initial load, and send it to Mixpanel as a boolean identify trait on desktop and mobile. -
#21114
dc23521Thanks @mcayuelas-ledger! - Fix Market Banner crash when a price-change percentage is missing. The desktop trending tile now usesgetChangePercentagelike mobile, which treats null or undefined values as 0 instead of calling.toFixedon them. -
#21361
989f22fThanks @vpenskyi-ledger! - Fix swap webview silently reporting ERR_ABORTED as an error and showing a blank screen on ERR_FAILED -
#21141
e2f2cfaThanks @OlivierFreyssinet! - Migrate the DeviceActionContent component into a new@features/platform-device-action-contentpackage so DDD flows can render it, decoupling it from theDeviceModelIdenum. Also render LumenTaglabels andBannertitles as text in the shared web/native passthrough test stubs.The package now exposes
getDeviceActionAnimation, and both apps resolve their pin/continue device animations through it instead of keeping byte-identical copies of the same 20 Lottie files each. This drops ~2.5 MB of duplicated animation JSON from the desktop and mobile bundles.@features/platform-stylegainsuseThemeVariant(), returning the active"light" | "dark"variant from the style provider both apps already mount, plus a./hooksentry point so reading it doesn't pull the providers into a consumer's bundle. DeviceActionContent picks its animation through that hook, so neither app injects a theme any more and the component can be used from deeply nestedfeatures/trees. It reads the styled-components context directly rather thanuseTheme, which throws when no provider is mounted. -
#21270
5b9df59Thanks @OlivierFreyssinet! - Map the DMK invalid firmware metadata error to a dedicated InvalidProvider blocking state, so the Device Intent Executor shows a clear "Invalid Provider" screen with a "Go to settings" action instead of a raw error -
#21245
45ea28bThanks @OlivierFreyssinet! - Provide the EVM address book to the DMK Ethereum signer, so registered contacts can be clear-signed.toEvmAddressBookmaps the Contacts state to anEvmAddressBooksnapshot, keeping EVM-family addresses only. Each app registers it onevmAddressBookProviderat its composition root, andDmkSignerEthreads it once per instance, so the recipient and the signing account are matched against the same snapshot. Records whose proof material does not decode are dropped, and signing is left untouched when no contact is usable.Ledger account contacts are not provided yet: the snapshot always carries an empty
ledgerAccounts. -
#21357
9f0b607Thanks @mcayuelas-ledger! - Resolve Pay deposit-options copy inside@features/flow-pay-depositthrough@shared/i18ninstead of receiving translated strings as props. The deposit options view-model now callsuseTranslation()for itspayTab.deposit.*keys, so both apps stop buildingDepositOptionsLabelsand passing them touseDepositOptionsAdapter. -
#21482
129c4dbThanks @mcayuelas-ledger! - Fix theme reverting to dark when navigating from My Ledger to Contacts -
#21049
27ea1f5Thanks @dilaouid! - feat(send): select which address of a contact receives the funds in the Send recipient step -
#21339
2a9d2eaThanks @mcayuelas-ledger! - Show From/To and contact address label in History Address column. -
#19191
148d76bThanks @cted-ledger! - staking feature for mina blockchain
Patch Changes
- Updated dependencies [
dd9fe60,f9be984,edad3fb,0b024e8,244454b,7d02f4b,545e419,7fae8f5,a2be85c,4342943,5e45fdd,7249fa2,e6d6ed6,8c98500,46f41d2,f4986f8,a6e4ace,ce47443,37cc17e,9a1a1df,e76361d,a4f727d,da47556,beaaa31,83b019e,36b7fda,f99b720,02c9ccf,e723d82,bb44e2c,31223eb,c62986b,cef29a0,076322c,0639bea,cdbc3ac,114420e,60c41bd,46d23e1,b3a86f5,e1c2a4b,a8c34d0,f9f6b71,aafcdb7,9b4214f,11a1e34,34fc080,41faac4,0df32c7,6046b34,bf22729,2ad298a,a334296,2c70999,1ef101a,9f37206,911a996,0500726,c8614bf,aa8f4bf,1e0763e,0127ebd,3ff0cde,62008f0,6f8acaf,3b3c696,9faeaf8,71fd65e,5bcc7f1,848b4bd,46ed356,6f4814b,27388a8,6cef6b5,09af9b1,ad1c0ff,c20677f,dab00b6,5b78670,6cc7ac6,6110948,1cf5583,c8bb138,150a151,116f006,9a3746d,e2f2cfa,5b9df59,cf9a982,45ea28b,f0f9990,9f0b607,27ea1f5,9d5a6d9]:- @features/flow-pay-request@0.3.0
- @ledgerhq/live-common@37.5.0
- @ledgerhq/transaction-observability@0.2.0
- @features/flow-contacts@0.9.0
- @features/platform-contacts@0.5.0
- @features/flow-contacts-add-contact@0.5.0
- @features/flow-contacts-edit-contact@0.3.0
- @shared/ui-info-state@0.2.0
- @features/platform-verify-address-intent@0.3.0
- @ledgerhq/coin-zcash@0.6.0
- @shared/env@0.5.0
- @domain/entity-currency-crypto@0.11.0
- @domain/entity-account-alias@0.1.0
- @features/flow-contacts-introduction@1.0.0
- @features/flow-pay-card@0.2.0
- @shared/api-services@0.6.0
- @ledgerhq/coin-canton@1.1.0
- @ledgerhq/coin-cardano@1.1.0
- @ledgerhq/coin-casper@3.2.0
- @ledgerhq/coin-concordium@1.1.0
- @ledgerhq/coin-cosmos@1.1.0
- @ledgerhq/coin-evm@5.2.0
- @ledgerhq/coin-filecoin@2.1.0
- @features/flow-contacts-list@0.5.0
- @features/flow-contacts-delete-contact@0.2.0
- @features/flow-contacts-edit-address@0.2.0
- @features/flow-contacts-add-address@0.3.0
- @features/flow-pay-contact@0.2.0
- @features/flow-pay-balance@0.4.0
- @features/flow-pay-deposit@0.3.0
- @shared/auth@0.6.0
- @shared/cloud-sync@0.3.0
- @shared/feature-flags@0.21.0
- @features/platform-currencies@0.7.0
- @domain/api-currency-token@0.6.0
- @ledgerhq/asset-aggregation@0.14.0
- @features/flow-pay-card-auth@0.5.0
- @ledgerhq/types-live@6.122.0
- @ledgerhq/ledger-wallet-framework@3.2.0
- @ledgerhq/live-dmk-shared@0.32.0
- @features/flow-pay-feature-tour@0.4.0
- @devtools/bindings@0.6.0
- @shared/i18n@0.2.0
- @features/platform-device-action-content@0.2.0
- @features/platform-style@0.3.0
- @ledgerhq/live-signer-evm@0.23.0
- @features/platform-device-intent@5.2.0
- @ledgerhq/asset-detail@0.11.3
- @ledgerhq/live-dmk-desktop@0.20.9
- @domain/api-aggregated-assets@0.4.2
- @features/platform-aggregated-assets@0.5.1
- @features/platform-env@0.2.3
- @ledgerhq/ledger-key-ring-protocol@0.21.1
- @ledgerhq/live-dmk-speculos@0.10.7
- @ledgerhq/wallet-analytics@0.3.6
- @ledgerhq/wallet-pnl@0.7.9
- @domain/entity-contact@0.8.1
- @domain/entity-currency@0.4.2
- @domain/entity-currency-token@0.5.1
- @ledgerhq/coin-bitcoin@0.51.3
- @ledgerhq/live-currency-format@0.14.3
- @ledgerhq/live-wallet@1.1.1
- @ledgerhq/wallet-btc@0.3.0
- @domain/api-altcoins-sentiment@0.3.4
- @domain/api-currency-fiat@0.4.3
- @domain/api-market-sentiment@0.3.4
- @domain/api-push-devices@0.2.4
- @domain/entity-account-name@0.2.2
- @domain/entity-recent-addresses@0.2.1
- @features/platform-wallet-sync@0.1.3
- @features/flow-large-screen-upsell@2.0.1
- @features/platform-feature-flags@0.6.8
- @domain/entity-analytics-consent@0.2.2
- @features/flow-pay-card-details@0.2.0
- @features/platform-card@0.3.1
- @ledgerhq/domain-service@1.8.17
- @ledgerhq/live-countervalues@0.24.5
- @ledgerhq/live-countervalues-react@0.16.9
- @devtools/shell@0.9.1
- @features/flow-analytics-consent@0.2.4