4.25.0
Minor Changes
-
#23341
a86963cThanks @LucasWerey! - Add theaccountDetailfeature flag (withexcludedCurrencyIds) for the new Account Detail page and send its state to analytics. -
#23293
1d3e404Thanks @ooke-ledger! - Stop swap entry points from stacking a new Main navigator, and open each swap entry on a fresh webview history. -
#23322
1349df3Thanks @claudiiafg! - Extract the Contact Detail journey into@features/flow-contacts-detailso Desktop and Mobile can reuse it, while the Contacts aggregate keeps cross-journey orchestration -
#23004
505eea9Thanks @vpenskyi-ledger! - Fix a second account drawer opening in Swap when the receive token is a token the user does not hold yet. The parent account is now sent withtoTokenIdinstead of the unresolvable synthetic token account, so the Swap live app builds the token account itself. -
#23346
80a62aeThanks @ooke-ledger! - Show perps deposit device errors with the new error state and a retry. -
#23134
2ebd029Thanks @ovoronkov-ledger! - fix(bottom-sheet): hold reopen content until the sheet has closed (LIVE-37745) -
#23215
08169a3Thanks @cted-ledger! - do not show the bitcoin fee picker on a zcash send, whose fee zip-317 sets -
#23391
ee508dbThanks @thesan! - Resolve the app configuration once, when the store is created, withresolveAppConfigfrom@shared/app-config. Keycloak is the first service to read it: its base URL comes from theledgerKeyRingswitch, which resolves to the option persisted underappConfigSelections, or to theCONFIG_PROFILEof the build's.envfile:stagingfor dev, adhoc and nightly builds,prodfor prerelease and release builds. The configuration stays the same for the whole session, by design: a new selection applies after an app reload.@shared/envdrops theLEDGER_AUTH_*definitions. -
#23485
623f8e6Thanks @thesan! -@shared/authdrops theauthEnvironmentslice: Keycloak reads its base URL from the app config, so nothing reads it any more. -
#23385
2ec955aThanks @LucasWerey! - Add the shared Account Detail settings contents: settings menu, advanced logs (with copy) and remove account confirmation, plusbuildAdvancedLogs. -
#23378
fc5e597Thanks @LucasWerey! - Add the Account Detail screen shell behind theaccountDetailflag:ScreenName.Accountswitches per account to the new screen (token sub-accounts open their parent), the legacy screen otherwise. -
#23380
92d5032Thanks @LucasWerey! - Add the Account Detail nav bar on LWM: account name, shortened address with the network icon, and a settings button. -
#23393
0902ebfThanks @LucasWerey! - Add the Account Detail settings sheet on LWM: the settings button opens the account settings menu and the remove account confirmation. -
#23450
b0c722aThanks @LucasWerey! - Add the Account Detail change name screen on LWM, opened from the settings sheet once it has closed (keeps the name field focused). Long account names are truncated in the settings menu. -
#23435
e4e90c0Thanks @LucasWerey! - Add the Account Detail advanced logs screen on LWM, opened from the settings sheet. Copy logs now shows a "Copied" state for 2 seconds. -
#23438
987dffaThanks @LucasWerey! - Remove account from the LWM Account Detail settings sheet: confirming removes the account and goes back to the previous screen. -
#23512
e8ede36Thanks @LucasWerey! - Add the Assets section to the Account Detail screen: the coin and its tokens sorted by value, with the same filters as the Portfolio.AssetListItemrows are not pressable when noonPressis passed. -
#23415
c568dc6Thanks @LucasWerey! - Add the Transactions section to the LWM Account Detail screen: the 3 latest operations of the account and its tokens, opening the operations history scoped to the account. The Asset Detail section now uses the same shared component. -
#23439
722c6f3Thanks @ovoronkov-ledger! - chore(rn-upgrade): replace absoluteFillObject with absoluteFill (LIVE-39313) -
#23429
39529a8Thanks @LucasWerey! - Bump Lumen to lumen-design-core 0.1.32, lumen-ui-react 0.1.64, lumen-ui-rnative 0.1.67 and lumen-utils-shared 0.1.16, and migrateSpotto its palette API (iconrequired,appearance="icon"dropped,check/info/error/warning/loadermapped to explicit icons,numbermoved toSpotNumber). The devtools native jest preset now mocksreact-native-gesture-handler, which the new lumenToasterimports. -
#23426
8b6190fThanks @LucasWerey! - Add the bottom fade gradient to the LWM Account Detail screen, like Transaction History and Market. -
#23559
ead8b59Thanks @jiyuzhuang! - Expose the recoverV2 feature flag to Mixpanel on mobile and desktop. -
#23543
257305fThanks @mcayuelas-ledger! - feat(account-balance): add the balance entityCrypto balances of an account, one row per asset, keyed by AccountUUID. Both apps mount the slice. Fiat stays a view.
-
#23400
beea4cdThanks @gre-ledger! - feat(account-data): add the account data frameworkKind registry and
accountDatastatus slice, source contract and router (ranking, batching, concurrency, pagination affinity),fetchAccountData/fetchMoreAccountDataand theuseAccountDatahook. Both apps register the status slice and inject the router into the thunkextraArgument, with no source yet. -
#23436
f51fe16Thanks @gre-ledger! - Add the accounts slice, keyed by AccountUUID and kept in sync with the legacy accounts -
#23422
b97096cThanks @mcayuelas-ledger! - End the Asset Detail chart on the header price so the line matches the live spot -
#23213
6ce41e8Thanks @dilaouid! - feat(send): add the Descriptionitem component for the new send flow -
#23495
3c062fcThanks @mcayuelas-ledger! - feat(analytics): add theblockchainWithFundsuser property (blockchain names, e.g. Arbitrum) next toaccountsWithFunds, which reports the native ticker (ETH for L2s) -
#23210
a2ef1bfThanks @OlivierFreyssinet! - The discovery error for an undetermined Bluetooth state (BluetoothStateUnknownCheckOnly) no longer shows a spinner with no action. It now shows "Bluetooth isn’t responding" with a retry CTA and, on Android, the "Continue with USB instead" CTA. Before, nothing checked the Bluetooth state again, so the sheet stayed stuck. -
#23631
19e5335Thanks @henri-ly! - Restore name and unit on the transaction intent asset so XRP and Stellar amount errors show the currency unit instead of "Unknown unit" -
#23386
f40b1c2Thanks @dilaouid! - Remove the Zenrock and Quicksilver integrations, including their chain adapters, currency definitions, feature flags and LCD endpoints -
#23418
2621f1eThanks @ysitbon! - Stop re-rendering every amount on a countervalues load that changes no rateA load now keeps a pair's rate Map and cache entry when every fetched value equals the stored one, and
keeps the whole cache object when no pair changed. The conversions read the cache alone, through
useCountervaluesCache, so a load that only stamps the fetch status no longer re-renders them. The
conversions and the persisted export are the same as before. -
#23154
3ad1a61Thanks @ysitbon! - Move the countervalues polling loop into a Redux middleware and drop the countervalues React context.- After changing the countervalue currency, adding an account or tracking a new asset, amounts no longer briefly fall back to the last daily rate before the new rates land.
- On mobile, changing the countervalue currency or adding an account no longer re-renders every amount on screen several times, and loads the rates once instead of up to three times.
@features/platform-market-countervalues:useCountervaluesState,useCountervaluesPolling,useCalculate,useCalculateCountervalueCallbackanduseSendAmountkeep their names and signatures and read thecountervaluesslice withuseSelector. The loop moves intocreateCountervaluesMiddleware, started withstartCountervaluesSync({ savedState }).CountervaluesProvider,CountervaluesBridge,Props,PollingStateanduseCountervaluesUserSettingsare removed.- Desktop: the store installs the middleware; boot starts it right before the first render, so the saved rates show from the first frame. The window focus and blur events, the network changes and the saving to disk move into the middleware's configuration.
- Mobile: the store installs the middleware; boot starts it when the app is let through, and a reboot starts it again from the saved state. The extra session tracking pairs move from an RxJS subject into the store.
-
#23211
bcf98ffThanks @ysitbon! - Split the countervalues Redux slice by owner. The rates now have their own slice in@domain/entity-market-countervalues(countervaluesRatesSlice, withsetCountervaluesStateandwipeCountervalues), stored with a shallow freeze so a load never pays for a deep freeze of every rate.@features/platform-market-countervalueskeeps the loop's state incountervaluesSyncSlice(load,error,isPolling;loadis one ofidle,requested,loading,loadingThenRequested, replacing the formerpendingandtriggerLoadflags) and mounts both under the samecountervaluesstore key throughcountervaluesReducer, typedCountervaluesStoreState, which replacesCountervaluesState. The store readscountervalues.ratesandcountervalues.syncinstead ofcountervalues.countervalues.stateandcountervalues.polling; persistence and the saved data are unchanged. Each slice now declares its own actions, so theCOUNTERVALUES_*type strings are gone:setCountervaluesStateandwipeCountervalueskeep their names, typedcountervaluesRates/setandcountervaluesRates/wipe, and the loop's setterssetCountervaluesPollingTriggerLoad,setCountervaluesStatePending,setCountervaluesStateErrorandsetCountervaluesPollingIsPollingbecome the eventscountervaluesLoadRequested,countervaluesLoadStarted,countervaluesLoadSucceeded,countervaluesLoadFailedandcountervaluesPollingSet, typedcountervaluesSync/.... A load start and a load failure now dispatch one action each instead of two. The sync selectors are the slice's ownselectors, andcountervaluesSyncTriggerLoadSelectoris gone.useCountervaluesPollingnow returns only thepoll,start,stopandwipecommands and no longer re-renders its callers on every load;pendinganderrorcome from the newuseCountervaluesLoadStatus, which live-common'suseSyncSourcesnow reads. -
#23335
246438dThanks @ysitbon! - Release the countervalues startup wait's timer and store subscription once it endsThe countervalues loop starts when the currencies are hydrated and the remote flags are ready, or
after a second at most. The two sides raced as separate promises, so whichever lost kept running:
the remote flags subscription stayed registered until the first fetch settled, and the timer fired
for nothing when the app was ready first. One wait now owns both and releases both as soon as it
settles. The loop starts at the same moment as before. -
#23353
48d5c85Thanks @LL782! - Remove the legacyofacGeoBlockApiafter Desktop and Mobile use@features/flow-app-availability -
#23376
4ee8f78Thanks @mateuszpalosz-ext! - Add a balance type sync step to the new send flow, used by Aleo to refresh private records after the pool pick -
#23361
a02d06cThanks @mcayuelas-ledger! - Move the mobile Fear and Greed UI into the flow package -
#22508
ad58765Thanks @pawell24! - fix(filecoin): open transactions on Blockscout from operation detailsBlockscout identifies a Filecoin message by its Ethereum-style hash, so the explorer link is now
built from the message CID's digest instead of the CID itself. -
#23423
c61cbe8Thanks @mcayuelas-ledger! - fix(portfolio): show the Market 24h variation on assets whose balance did not change over the day (LIVE-39259) -
#23389
03f4e70Thanks @claudiiafg! - Extract address deletion into@features/flow-contacts-delete-addressso Desktop and Mobile can reuse it without going through Contact Detail. Confirmation UI stays in@features/platform-contacts. Apps still own modal mounting, navigation, translations, and analytics. -
#23023
7b01c45Thanks @dilaouid! - fix(send): fix the send amount screen layout when the text size increases -
#23459
2f9b7e9Thanks @gre-ledger! - feat(account-data): full sync source on AccountBridge, serving no kind yet -
#23302
ac7d243Thanks @sarneijim! - Show genuine check error drawers during device onboarding -
#23285
4fd1ebcThanks @claudiiafg! - Keep a contacts device sheet mounted until iOS has closed it, and close it once the device step is finished. -
#23315
68cebc0Thanks @mcayuelas-ledger! - Fetch LargeMover chart and market rows through RTK Query by ledger id, and drop the unused CoinGecko mapping client. -
#23058
214f7f1Thanks @ishaba! - feat(tron): track the sponsored send funnel in Segment -
#23247
c18097bThanks @mcayuelas-ledger! - Load the market list with an RTK infinite query instead of React Query. -
#23233
2cb9ecdThanks @LL782! - Switch mobile launch gating to@features/flow-app-availabilityand drop the legacy OFAC geo-block api -
#23279
34cffc5Thanks @gre-ledger! - Declare@lottiefiles/dotlottie-reactsolottie-react-nativeresolves to a single peer variant andPodfile.lockstops breaking on unrelated full installs. -
#23151
004d896Thanks @tonykhaov! - Show and export QA onboarding logs with the device answers and the machine context, and toggle the deviceOnboarding flag from the devtool -
#23280
6a3d5adThanks @liviuciulinaru! - Remove the Card login code from the Pay tab route after the login reads it, so a logout shows the login screen and not a login error -
#23102
4d77514Thanks @sarneijim! - Move the shared device onboarding machine to features/platform -
#23333
99efa90Thanks @vladyslavchupovskiy-ext-art! - Load Expo's runtime before react-native-url-polyfill so the polyfill's URLSearchParams (withsize) stays installed; fixes Aptos sends to an unfunded account failing with "insufficient funds" -
#23424
b78f271Thanks @gre-ledger! - Add a script generating Podfile.lock without installing pods, usable on Linux -
#23230
b4241c5Thanks @sarneijim! - Add the seeded-device checks screen, its animations, and a sync offer preview -
#23328
e1ba29aThanks @sarneijim! - Open the existing Ledger Sync skip confirmation from the seeded offer -
#23226
dd34e1bThanks @OlivierFreyssinet! - Shorten the device intent executor component names -
#23672
fe74104Thanks @henri-ly! - fix(coin-solana): check the stake minimum before a validator is pickedThe mobile delegation flow asks for the amount before the validator, so the recipient is still empty when the amount is validated. The minimum-delegation check was skipped in that case, which let an amount below 1 SOL through to the summary. The summary now also shows its validation error in the alert colour.
-
#23220
a8d48a9Thanks @abdurrahman-ledger! - Support protected Speculinho sessions in E2E. Speculos transports take the session'sbearerToken(SpeculosHttpTransportOpts,SpeculosSessionTarget, the mobileSpeculosTarget;DeviceManagementKitTransportSpeculosand the desktop transport default toSPECULOS_SESSION_TOKEN) and keep a separate DMK per token. E2E acquires sessions withprotected: trueand authenticates every operator and Speculos request; the mobile e2e bridge passes the token to the app and now requires a per-run connection token. Bumps@ledgerhq/device-transport-kit-speculosto 1.3.0 and@ledgerhq/speculos-device-controllerto 0.4.0. -
#23511
874b720Thanks @gre-ledger! - Align @react-native/community-cli-plugin with react-native 0.81.6 and drop the stale 0.77.3 tree -
#23003
57b4652Thanks @live-github-bot! - Adapt to@ledgerhq/coin-evm15 -
#23472
b88647dThanks @sarneijim! - Add connectUnseededDevice to deviceOnboarding and edit that mock from the mobile onboarding devtool -
#23261
02b383bThanks @alexstapenka-ledger! - Add a withdraw icon to the earn action confirmation dialog, acustom.dialog.menuaction menu dialog on desktop for the Earn "Earn more" / "Withdraw all" choice, and theearnWithdrawV2feature flag that gates the Earn full withdraw flow
Patch Changes
- Updated dependencies [
a86963c,68c2837,ec7b8b9,1349df3,c9beaff,4831311,2ebd029,d6ab47c,393a02a,ee508db,623f8e6,d2b8471,6032338,2ec955a,b0c722a,e4e90c0,722c6f3,39529a8,c32fa7b,ead8b59,257305f,beea4cd,f51fe16,fc846e5,b79ccab,7b3040a,b599cb2,3c062fc,de8fe99,3527dbc,80f99a8,7da1ea9,f40b1c2,2f9c159,a654488,6abfd98,2621f1e,3ad1a61,bcf98ff,75498cf,ad6aad8,47e5b74,ff33162,5e9a60a,7e54483,e5762fc,a782d57,a02d06c,ad58765,03f4e70,ff14496,e66d21e,4fd1ebc,68cebc0,ed10647,bcea51b,2e198e2,3fadda7,004d896,98c994b,6639142,2cd35c5,4d77514,307d5c0,37a49df,0ace271,ca063c4,2c6e74a,e345c82,696357f,a2ef1bf,a8d48a9,ed89930,0d5c35d,b88647d,02b383b]:- @shared/feature-flags@0.27.0
- @features/flow-account-detail-settings@0.1.0
- @features/flow-contacts-detail@0.2.0
- @features/flow-contacts@0.15.0
- @features/flow-pay-contact@0.7.0
- @ledgerhq/coin-concordium@1.6.0
- @shared/ui-queued-bottom-sheet@0.7.0
- @domain/entity-currency-crypto@0.16.0
- @shared/app-config@0.1.0
- @shared/env@0.11.0
- @shared/auth@0.7.0
- @ledgerhq/coin-bitcoin@1.0.0
- @features/flow-account-detail@0.1.0
- @features/flow-pay-card-details@0.8.0
- @ledgerhq/native-ui@0.69.0
- @devtools/shell@0.11.0
- @features/flow-fear-and-greed@0.4.0
- @features/flow-contacts-introduction@1.5.0
- @features/flow-contacts-list@0.10.0
- @features/flow-pay-balance@0.8.0
- @features/flow-pay-card-assets@0.4.0
- @features/flow-pay-card-transactions@0.6.0
- @features/flow-pay-card-widget@0.6.0
- @features/flow-pay-deposit@0.6.0
- @features/flow-pay-request@0.9.0
- @features/platform-contacts@0.11.0
- @shared/ui-info-state@0.5.0
- @domain/entity-account-balance@0.2.0
- @domain/entity-account-data@0.2.0
- @domain/api-account-data@0.2.0
- @domain/entity-account@0.1.0
- @features/flow-contacts-add-contact@0.8.0
- @features/platform-currencies@0.10.0
- @features/platform-account-analytics@0.2.0
- @features/flow-contacts-add-address@0.7.0
- @ledgerhq/coin-stacks@0.34.0
- @ledgerhq/ledger-wallet-framework@3.8.0
- @ledgerhq/types-live@6.128.0
- @ledgerhq/coin-cosmos@2.0.0
- @features/flow-contacts-edit-address@0.5.0
- @domain/entity-market-countervalues@0.4.0
- @features/platform-market-countervalues@0.3.0
- @features/flow-contacts-delete-address@0.2.0
- @features/flow-contacts-delete-contact@0.3.0
- @features/flow-contacts-edit-contact@0.7.0
- @ledgerhq/coin-filecoin@2.5.0
- @features/platform-device-onboarding@0.2.0
- @devtools/bindings@0.12.0
- @ledgerhq/coin-casper@3.6.0
- @ledgerhq/live-dmk-speculos@0.12.0
- @features/flow-app-availability@0.2.0
- @ledgerhq/live-dmk-mobile@0.32.0
- @ledgerhq/live-dmk-shared@0.36.0
- @ledgerhq/coin-canton@1.5.0
- @features/flow-large-screen-upsell@2.2.3
- @features/flow-pay-feature-tour@0.8.1
- @features/platform-feature-flags@0.9.1
- @features/platform-feature-flags-firebase@0.1.1
- @features/flow-app-longer-password@0.1.1
- @features/flow-app-password-removal@0.1.1
- @features/flow-app-protection-prompt@0.1.1
- @features/flow-pay-bank-transfer@0.4.1
- @features/flow-pay-card-auth@0.10.1
- @ledgerhq/live-send@0.1.4
- @domain/api-aggregated-assets@0.6.1
- @domain/api-currency-token@0.6.5
- @domain/api-market-countervalues@0.2.1
- @domain/entity-contact@0.12.1
- @domain/entity-currency@0.4.7
- @domain/entity-currency-token@0.5.6
- @ledgerhq/live-wallet@1.1.7
- @ledgerhq/wallet-analytics@0.5.2
- @ledgerhq/wallet-pnl@0.8.1
- @features/platform-aggregated-assets@0.5.7
- @features/platform-env@0.4.3
- @ledgerhq/transaction-observability@0.5.1
- @shared/api-services@0.10.1
- @features/flow-pay-card@0.7.1
- @features/flow-app-unlock@0.1.1
- @devtools/transport-panel@0.7.0
- @domain/entity-account-name@0.2.3
- @domain/entity-starred-account@0.0.2
- @ledgerhq/coin-multiversx@1.4.1
- @ledgerhq/live-signer-evm@0.24.2
- @ledgerhq/device-core@0.11.20
- @ledgerhq/live-signer-tron@0.2.2
- @features/flow-analytics-consent@0.2.10
- @features/platform-content-ab-tests@0.2.1
- @domain/api-card-management@0.8.2
- @domain/api-currency-fiat@0.4.8
- @domain/api-market-index-altcoin-season@0.4.2
- @domain/api-market-index-fear-and-greed@0.4.2
- @domain/api-push-devices@0.2.9
- @features/platform-card@0.8.1