4.18.0
Minor Changes
-
#20911
4014093Thanks @claudiiafg! - Expose useOpenPrefillAddAddressFlow and mount PrefillAddAddressFlowRoot on Desktop and Mobile so consumers such as Send can open the prefilled Add Address flow without depending on Contacts internals. -
#21025
de982e6Thanks @claudiiafg! - Fix Contacts edit flow so the device connection prompt appears after saving a contact name or address, not before opening the edit form. -
#20986
9965d7fThanks @mcayuelas-ledger! - Add@features/platform-verify-address-intent, a Device Intent that verifies a receive address on the device Secure Screen, and wire it to the desktop Pay tab Verify CTA.The host injects a family-agnostic
startAddressVerification(genericgetAddressover the DIE DMK transport). WhenldmkTransportis off, Verify opens the classic Receive modal. Address comparison is encoding-aware (case-insensitive for hex, exact otherwise).verified/cancelled/unsupportedreturn to the request summary;mismatchcloses the flow.Generalize desktop
InfoStateby adding a full-widthcontentslot and optionalbackgroundTonesupport for thespotpreset. -
#20962
6218989Thanks @mcayuelas-ledger! - Wire the desktop Pay tab Request "Verify" action: pressing it closes the receive dialog and opens the shared VerifyAddress overlay (intro then success), tracking thePage Request Address Verificationpage view. The device intent (DIE) is kept behind the exposedshowSuccessbridge for LIVE-36132.Make the request action
onShare(mobile-only) andonSave(desktop-only) callbacks optional, align the request verify tracking button toverify, and give the VerifyAddress dialog an InfoState-style muted background with centered next steps. -
#20727
53938d6Thanks @dilaouid! - feat(lwdm): add the contact avatar component in the new send flow -
#21165
e903cf0Thanks @sarneijim! - Add missing Touchscreen Upgrade Program tracking for Backup Hub Recovery Key upsell and Lazy Onboarding Banner (LIVE-36494) -
#21067
291f4b7Thanks @mcayuelas-ledger! - Add the Pay tab card container on desktop, rendered through a new right-panel variant system that dispatches between the swap sidebar and the Pay card -
#20993
2a4b4b1Thanks @YazhuEth! - Move Aptos and crypto_org account migrations out of DataModel into app-level accountModel -
#20917
f427599Thanks @deepyjr! - Allow numbers in contact names and hide add-contact actions when a Contacts search has no results. -
#20902
7d473f5Thanks @deepyjr! - Use the Contacts address-group resolver without an app-specific currency adapter. -
#20918
15a872aThanks @RobinVncnt! - Add hardware carousel close all control on portfolio -
#20934
d8c04ddThanks @deepyjr! - Fix Contacts entry point styling and return navigation to Ledger Wallet addresses. -
#20909
c6b6f85Thanks @OlivierFreyssinet! - Fix duplicate WebHID connections when known devices update during device discovery -
#20922
e8d823fThanks @OlivierFreyssinet! - Add Device Intent Executor orchestration playground in Developer settings -
#20966
9470502Thanks @OlivierFreyssinet! - Scaffold Contacts Device Intent Executor contracts and colocate platform definitions -
#20852
f8a01e0Thanks @jiyuzhuang! - Default starredMarketCoinsSelector to an empty array so MarketBanner cannot crash on incomplete settings. -
#20982
aebea36Thanks @alexstapenka-ledger! - Restore Earn webview focus after the account picker so deposit amount autofocus works -
#20872
d4bb463Thanks @deepyjr! - Fix Contact sharing and align empty address copy -
#20882
ed42292Thanks @claudiiafg! - Wire Contacts edit-address validation and analytics into desktop. -
#21018
903e0daThanks @ishaba! - fix(canton): fix kiln validator name typo in setup copy -
#20887
aa39333Thanks @fAnselmi-Ledger! - Add Solana TXC flag -
#20900
7fcbc76Thanks @OlivierFreyssinet! - Prevent dismissing device intent dialogs while a device action is pending. -
#21036
c98a1b9Thanks @vpenskyi-ledger! - Fix: sell quotes now correctly shown when returning from a provider via "Back to quote". Previously, BuySellUI defaulted to buy mode because the stored flow name was not passed back during navigation. Desktop also removed a hardcoded|| "buy"fallback when saving the flow name to localStorage. -
#21063
c566744Thanks @deepyjr! - Persist Contacts locally and synchronize them through Ledger Sync. -
#20861
4eb83b2Thanks @deepyjr! - Show unavailable Contacts asset and network options as disabled in the asset drawer. -
#20805
3722c36Thanks @RobinVncnt! - Add the hardware carousel UI component for Braze category cards on desktop. -
#21044
b2a2e9eThanks @dilaouid! - feat(send): search by contact name as recipient in the send -
#20894
49157dcThanks @LL782! - Fix Ledger Sync being wiped on every launch when Password Lock is enabled.app.trustchainis an encrypted db path, so before unlock it reads back as a ciphertext string; importing it regenerated member credentials, nulled the trustchain, and persisted that fresh state over the encrypted blob in plaintext. The import is now skipped while the value is still a string, and trustchain writes are suppressed while the app is locked. -
#20938
73f303fThanks @mcayuelas-ledger! - Show a brandedQrCode(asset icon in the center) on Pay Card request receive (LIVE-36233). -
#20876
1ba0cebThanks @tonykhaov! - Block Recover on desktop for Nano S-only wallets with a dismissible upgrade modal (LIVE-35465). -
#20834
01c088dThanks @tonykhaov! - Add a My Wallet Profile LNS upsell banner gated bylargeScreenUpsell.banners.profile(LIVE-35481). RequireutmContentonbuildLargeScreenUpsellCtaLinkand exportLARGE_SCREEN_UPSELL_UTM. -
#20925
91dbf02Thanks @tonykhaov! - Gate Recover Nano S intercept and Backup Hub Recovery Key warning withlargeScreenUpsell.params.banners["recover-page-block-nano-s-only"]andbanners["backup-hub-recovery-key-text-warning"]. -
#20799
585d8d7Thanks @ishaba! - Migrate Tron to the generic coin framework (LIVE-34994).Adds a per-family pending-operation
extrato the generic framework:OptimisticOperationDescriptorgains an optionalextrabag anddescribeOptimisticOperationreceives the transaction it describes, with framework-reserved keys stripped so a family cannot shadow them. -
#21116
6bf8331Thanks @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 -
#20669
f7e5005Thanks @YazhuEth! - feat(lwd): display the contact name and avatar in the send headerThe Amount step now shows the matched contact instead of the truncated address, using the shared
ContactAvatar. The Recipient card moves to the same component, so both steps render the same colour and initials. -
#20593
d5ea888Thanks @liviuciulinaru! - Start the Baanx login with a PKCE challenge and a CSRF state (LIVE-34738)Pressing Login now mints a login attempt client-side — a 16-byte
stateand a 32-byte PKCE verifier,
withcode_challenge = BASE64URL(SHA256(verifier))— and sends it to
GET /v1/auth/oauth/authorize/initiate, whoseurlanswer is opened in the platform
secure browser as before. The randomness comes from the platform CSPRNG on each side:expo-crypto
on mobile, WebCrypto on desktop.The redirect URI now reaches the secure browser too, since that is what ends the session:
ASWebAuthenticationSessionmatches the callback against it, and so does the Android polyfill. The
opener only opens the URL; the redirect goes back to the app, so the browser result is not read and
closing the browser shows no error — a cancelled login is not a failed one.The initiation carries
mode=api. Without it the endpoint answers302and redirects to the hosted
UI, which afetchfollows into an HTML page;apireturns the same URL as JSON instead. That answer
also carries the JWT of Baanx's programmatic flow, which the hosted UI does not need, so the schema
drops it instead of parking a short-lived credential in the cache.The request goes through
useInitiateAuthorizeMutationfrom@domain/api-card-management, which owns
the Card Auth contract and injects it into the sharedcardApiservice. Every endpoint there is
declarative —query,rawResponseSchema,transformResponse,responseSchema— so the wire shape
is validated at the boundary and mapped in one place.cardApiExtrakeeps only what the base query
needs: the base URL, the Baanx client key for thex-client-keyheader, and the session accessors.The OAuth client id and redirect URI are the app's, so they reach
CardLoginas anoauthConfig
prop: one value goes to the initiation and to the secure browser, and the token exchange will send it
again. Baanx uses the same value for the client key and the OAuthclient_id, and the provider matches
ledgerlive://paytabverbatim on the token exchange. Each platform container opens the returned URL
itself, and no host-provided opener is needed. The Baanx secret key stays server-side and is never
sent from the apps.The challenge is spent on the initiation, and nothing keeps the attempt afterwards. Completing the
callback — holding thestateand the verifier, verifying thestate, exchanging the code for
tokens and storing them inexpo-secure-store— is the remainder of LIVE-34738 and is not part of
this change. -
#20898
ff7e5e0Thanks @mcayuelas-ledger! - Add the web RequestReceive dialog (asset icon, network row, highlighted address, action tiles) and wire the Pay tab Request tile on desktop to open it with copy support (LIVE-36120). -
#21082
655bcb4Thanks @mcayuelas-ledger! - Render the Pay card visual with a mock balance in the Pay tab right panel, wiring the new@features/flow-pay-card-detailsCardVisualthrough an MVVM view model. -
#20942
8c438f9Thanks @mcayuelas-ledger! - Plug the Modular Asset Drawer into the Pay tab Request and Add stablecoin actions, filtering selection to the stablecoin category so users can pick asset, network and account without over-long request URLs -
#21037
aafb541Thanks @mcayuelas-ledger! - Wire the Pay tab "New payment" action to open the new Send flow with a stablecoin-filtered account picker andsource: "Pay" -
#20953
fabb26bThanks @mcayuelas-ledger! - Save the Pay request card (QR + address) as a PNG image through the native OS save dialog -
#20868
7623d4eThanks @mcayuelas-ledger! - Skip the Noah receive options step when depositing from Pay so users are not asked to choose crypto vs bank transfer twice -
#20983
eba4d17Thanks @liviuciulinaru! - Open the Baanx authorize page directly, and drop the CSRF state (LIVE-36301)The login no longer asks the backend where to send the user. It builds the authorize URL itself and
opens the secure browser on it, and the provider hosts the page and owns the redirect. That removes a
network call, a machine state and one way a login could fail.GET {CARD_API_URL}/v1/auth/oauth2/authorize ?client_id=…&response_type=code &scope=openid profile email offline_access &redirect_uri=…&code_challenge=…&code_challenge_method=S256&prompt=consentThe attempt is now a PKCE pair alone. The redirect carries
code, and thestatethat used to travel
with it is gone, because PKCE already ties the code to the verifier on disk: the provider issues the
code against this attempt's challenge, so no other attempt can exchange it. Both token grants move to
/v1/auth/oauth2/token, and neither repeatsredirect_urithere: Baanx's contract for that endpoint
takes onlygrant_type,code, andcode_verifier.oauthConfiggainsapiUrl, which is the host the authorize page lives on.prepareAttemptbuilds the authorize URL, rather than the transition that follows it. The URL builder
throws on a misconfiguredapiUrl, and a throw inside an action stops the machine instead of reaching
a transition. From the actor it lands ononError, which wipes the stored attempt and reports a
failure the user can retry.A live exchange against Baanx's UAT environment answered with no
refresh_token_expires_in, which
PayCardSessionResponseSchemarequired. That field is gone from the schema, the session, and the
stored lifetimes: Baanx's contract carries no lifetime for the refresh token, only for the access
token, so nothing here can track one. -
#20901
6e1e0aaThanks @jiyuzhuang! - Stop using generateAnonymousId for Braze identity -
#20816
cad4f63Thanks @liviuciulinaru! - Show the signed-in card holder, and let them log outCardLogoutis a new component, and it is the only one that knows about logging out. It shows the
account id and the verification state, which is everything the user schema holds, beside a logout
action. Logout tells the provider first, while the session can still authorize that call, then clears
the session, the login attempt and the Card cache. A logout on a dead network still logs the user out
on this device.The two directions stay apart.
CardLoginruns the login and shows nothing once somebody is signed
in;CardLogoutshows nothing until somebody is. Each one decides that for itself, so the Pay tab
places both and passesCardLogoutnothing.They agree through one Redux flag,
payCardAuth.isSignedIn, because two login machines would each
hydrate the session and neither would agree with the other. The machine writes the flag on entering
ready,idleanderror.CardLogoutwrites it once a logout is through, and the machine takes a
SESSION_ENDEDevent to put the login back on offer.CARD_OAUTH_REDIRECT_URInow defaults tohttps://go.ledger.com/ledger/card-baanx. The provider
whitelists an HTTPS address, and it must match on the token exchange too.oauthConfiggainsdeepLink, which is what closes the secure browser.
ASWebAuthenticationSessiontakes the scheme of this value as itscallbackURLScheme, and the
Android polyfill matches the incoming link against the whole of it.One value cannot serve both jobs. The provider accepts an
httpsredirect URI alone, and only a
custom scheme ends a browser session. With no value that matches, the login still completes through
the app's own deep link, but nothing closes the browser and it stays on top of the Pay tab.Mobile takes the value from
PAY_TAB_DEEP_LINK, a new constant that sits beside the linking config
and shares the path that config maps onto the Pay tab, so the two cannot drift. It is not an
environment variable: the scheme is declared inAndroidManifest.xmlandInfo.plist, so it cannot
change without a release. Desktop passes nodeepLink, because the user's own browser opens the page
and reports nothing back (LIVE-34740). -
#20893
33d89c0Thanks @deepyjr! - Hide balances and preserve market-cap order in the Contacts currency selector. -
#20865
5b45a76Thanks @OlivierFreyssinet! - Update Device Intent Executor copy to match Figma (LIVE-34689, LIVE-34690) -
#20974
97f75d2Thanks @tonykhaov! - Remove the flaky Default analytics consent mount test -
#21027
1b3bf54Thanks @dgreen-ledger! - Disable Braze user-supplied JavaScript in HTML in-app messages and banners for security hardening -
#20880
79bd143Thanks @YazhuEth! - Hide accounts that cannot send from the send pickers, and accounts that cannot receive from the receive pickers (HyperCore) -
#20555
9e0c703Thanks @gre-ledger! - Isolate wallet sync module failures instead of failing the whole sync: the aggregator validates each module slice on its own and quarantines a broken one, preserving its raw distant value, while every other module keeps syncing. A quarantine is reported as the module key plus the failure kind only, never the offending data.A distant document is now typed as what it is — a
DistantDocument(Record<string, unknown>) whose slices are trusted per module — instead of the aggregate of the module schemas that nothing validates.parseDistantStateis removed: it cast an unvalidated document to a validated type, and the aggregator already narrows the document at runtime.CloudSyncSDKdrops itsschemaconstructor option, which was never applied to anything and only served to infer that same misleading type; the class is now parameterised by its document type directly.recentAddressesdrops its corrupted-address repair path.CorruptedNestedAddressDistantSchemaand the lenientz.array(z.unknown())wrapper that swallowed every bad entry are removed together: a corrupted distant entry now quarantines the module, so the slice is preserved verbatim and reported, instead of being silently rewritten — or, had only the transform been removed, silently dropped. The local-cache repair inschema.ts/store.tsis untouched; it migrates data on disk, which quarantine does not cover. -
#21046
e11eebeThanks @dilaouid! - feat(send): add network-filtered contact selection to the Send recipient step on desktop and mobile -
#20505
f4ed19fThanks @deepyjr! - Connect Contacts mutations to Ledger Sync availability and activation on Desktop and Mobile. -
#20854
f32bf30Thanks @ishaba! - fix(coin-sui): map device 0x8 on address-balance send to clear error -
#21064
32c64baThanks @deepyjr! - Stabilize desktop Playwright settings and DevTools checks. -
#20978
ca9496aThanks @deepyjr! - Open the amount step when sending to a saved contact. -
#20650
fbc8036Thanks @lysyi3m! - Add a gRPC-web transport to the Sui coin modulecoin-suigains a third transport onsui.rpc.v2over gRPC-web, covering every capability from
checkpoints to device signing.- New tri-state
suiTransportfeature flag (json|grpc|graphql), defaulting tojson,
replaces the booleansuiGraphqlTransport, which is removed. An unrecognised value resolves to
json. - New env vars
API_SUI_GRPC_PROXYandAPI_SUI_TESTNET_GRPC_PROXY.@mysten/sui2.9.0 → 2.23.1. - Operation
blockHashcarries the real checkpoint digest on gRPC. - Fix: account sync read a single page of history on GraphQL and gRPC, capping an account at its
newest 50 operations for good — sync resumes from the newest stored operation and never re-reads
what it skipped. Both arms now walk up toTRANSACTIONS_LIMIT(300), the depth JSON-RPC reached. - Fix: a resumed sync on GraphQL and gRPC read backwards from the tip, so when more than
TRANSACTIONS_LIMITtransactions arrived between two syncs, the ones in the middle were skipped
and the next sync resumed above them — a permanent hole. Both arms now walk forward from the
cursor, as the JSON-RPC arm already did, leaving anything unread newer than the next resume point. - Fix: an account holding no operations resumed from its stored
syncHash, so a cleared cache came
back with only the transactions that arrived after it. Such an account now re-reads its history,
which is also how one truncated by the bug above recovers. Token operations count as history: they
live in the subaccounts, so a token-only account is no longer treated as empty. - Fix: on gRPC, any failure to resolve a cursor's digest — including a transient network error — was
read as "unknown digest", which falls back to an unbounded page from the tip and made paging report
the end of history. Only aNOT_FOUNDdoes that now; everything else propagates and is retried. - Fix: reading history skipped transactions that shared a checkpoint with the resume point, in
account sync (getOperations) as well as paging (getListOperations). - Fix: paging inferred "more to come" from how many operations survived client-side filtering, which
ended the walk early. GraphQL now readspageInfo, gRPC the stream'sQueryEndreason. A page
whose transactions were all filtered out now resumes from the page's own boundary instead of
reporting the end of history. - Fix: a gRPC history record with no timestamp became an operation dated 1970 that could not serve as
a pagination cursor. Those records are now dropped, as the GraphQL arm already did. - Fix: ascending paging on GraphQL returned the newest slice of the range instead of walking forward
from the oldest. - Fix: the Sui fetcher dropped
X-Ledger-Client-Versionand all gRPC-web headers when passed a
Headersinstance. - Fix: GraphQL resolved the latest checkpoint in two queries, so the second could answer null. It is
now one query. - A checkpoint missing its
digestortimestampnow raises on both GraphQL and gRPC, instead of
reporting a block with an empty hash and a 1970 timestamp. - Known limitation:
getListOperationsresumes from a synthesisedtimestamp:digestcursor, so
within one checkpoint a sibling whose digest sorts earlier can be skipped, and a checkpoint holding
more than one page is stepped over rather than resumed inside. Account sync is unaffected: it
resumes from the server's own watermark cursor.
-
#20924
83a2392Thanks @lysyi3m! - Reject a SUI unstake above the staking position's principal, and make the remainder error actionableA partial unstake calls
staking_pool::split, which asserts the withdrawn amount is at most the
principal. Nothing validated that locally, so an amount far above the staked balance passed
validation and only aborted on chain. It now fails with a dedicated error. The remainder error also
names the way out — withdraw in full — because a position under 2 SUI cannot be split at all. -
#20949
a56baa8Thanks @pawell24! - Fold a Zcash account's shielded balance sync into the standard automatic wallet sync instead of requiring a manual trigger, and make that trigger unconditional and spam-proof. The account page's shielded balance now refreshes on launch and on the regular sync interval, the Amount step of a send refreshes it when moving on from the Recipient step, and a completed private transfer triggers a follow-up sync so the account page converges without a manual refresh. The manual "sync balance" action is now offered and enabled in every state, including once a scan has completed, and clicking it while a sync is already running no longer cancels and restarts it. -
#20955
39a676dThanks @mdomanski-ext-ledger! - fix: move hedera envs to config/constants -
#21052
acbc7b9Thanks @RobinVncnt! - Add type and layout on hardware carousel content card impressions -
#20956
41311d6Thanks @RobinVncnt! - Add shop UTMs on hardware carousel card clicks in the desktop portfolio -
#20860
60f343cThanks @YazhuEth! - chore: bump the Lumen packages to the latest pinned setAddressInputnow accepts aReactNodeprefix, andBaseInputis no longer exported by Lumen. Both apps only consume Lumen internally, so their own public API is unchanged. The Lumen packages pin each other on exact versions, so they move together. -
#20889
569d202Thanks @vladyslavchupovskiy-ext-art! - [ZEC] Replace pool-exclusion warning banner with spendable/maturing breakdown; move pool warning into private balance tooltip.
Patch Changes
- Updated dependencies [
61b4b5f,26d8617,a86fe14,de982e6,e6ad2f6,9965d7f,8ebdb6a,6218989,17a4154,1d6c394,98f4802,2a4b4b1,bb045d8,5a30d71,6560883,f427599,e998478,bb58645,5a630b2,d8c04dd,9470502,e732d3e,d4bb463,ce4ae4a,6084fcd,b6bb5b5,f64ceec,fec3bc8,9fa2ab5,f0f10ca,55b7e6d,aa39333,5125ac7,46a0d30,c566744,e1c2a4b,8003387,c0bdd70,b2a2e9e,6c425e0,d1ab42f,73f303f,1ba0ceb,01c088d,91dbf02,585d8d7,32f3b76,d6c7592,f7e5005,f567f20,d5ea888,dd64855,ff7e5e0,33007b1,35c12b6,8c438f9,fabb26b,eba4d17,4555355,fb4a5bc,6e1e0aa,cad4f63,306a681,9fa2ab5,582f422,79bd143,9e0c703,e11eebe,8161bac,f4ed19f,a826856,b3095f5,fbc8036,d6f0c7d,a56baa8,39a676d,9d84383,3908965,41311d6,79ee882,4c333ad,d7a9847]:- @ledgerhq/live-common@37.4.0
- @ledgerhq/coin-evm@5.1.0
- @features/flow-contacts-add-address@0.2.0
- @features/flow-contacts@0.8.0
- @features/flow-pay-card-request@0.2.0
- @features/platform-verify-address-intent@0.2.0
- @ledgerhq/coin-zcash@0.5.0
- @features/flow-large-screen-upsell@2.0.0
- @ledgerhq/coin-casper@3.1.0
- @features/flow-pay-card-auth@0.4.0
- @domain/entity-contact@0.8.0
- @features/flow-contacts-list@0.4.0
- @features/platform-contacts@0.4.0
- @features/platform-card@0.3.0
- @devtools/bindings@0.5.0
- @devtools/shell@0.9.0
- @devtools/transport-panel@0.6.0
- @devtools/wire@0.5.0
- @shared/api-services@0.5.0
- @features/flow-contacts-add-contact@0.4.0
- @features/platform-device-intent@5.1.0
- @features/flow-contacts-edit-contact@0.2.0
- @shared/feature-flags@0.20.0
- @ledgerhq/types-live@6.121.0
- @ledgerhq/live-wallet@1.1.0
- @features/flow-pay-card-balance@0.3.0
- @features/flow-pay-card-deposit@0.3.0
- @ledgerhq/ledger-key-ring-protocol@0.21.0
- @ledgerhq/ledger-wallet-framework@3.1.0
- @features/flow-pay-card-details@0.2.0
- @shared/env@0.4.0
- @features/platform-aggregated-assets@0.5.0
- @shared/cloud-sync@0.2.0
- @domain/entity-recent-addresses@0.2.0
- @features/flow-contacts-introduction@0.3.0
- @ledgerhq/asset-detail@0.11.2
- @ledgerhq/live-dmk-desktop@0.20.8
- @domain/api-aggregated-assets@0.4.1
- @domain/api-altcoins-sentiment@0.3.3
- @domain/api-currency-fiat@0.4.2
- @domain/api-currency-token@0.5.1
- @domain/api-market-sentiment@0.3.3
- @domain/api-push-devices@0.2.3
- @features/platform-currencies@0.6.2
- @features/platform-feature-flags@0.6.7
- @ledgerhq/asset-aggregation@0.13.2
- @ledgerhq/coin-bitcoin@0.51.2
- @ledgerhq/coin-canton@1.0.1
- @ledgerhq/coin-cardano@1.0.1
- @ledgerhq/coin-concordium@1.0.1
- @ledgerhq/coin-cosmos@1.0.1
- @ledgerhq/coin-filecoin@2.0.1
- @ledgerhq/domain-service@1.8.16
- @ledgerhq/live-countervalues@0.24.4
- @ledgerhq/live-countervalues-react@0.16.8
- @ledgerhq/wallet-analytics@0.3.5
- @ledgerhq/wallet-pnl@0.7.8
- @features/platform-env@0.2.2
- @ledgerhq/live-dmk-speculos@0.10.6
- @domain/entity-account-name@0.2.1
- @features/platform-wallet-sync@0.1.2
- @ledgerhq/live-currency-format@0.14.2
- @features/flow-analytics-consent@0.2.3
- @ledgerhq/wallet-btc@0.3.0