@ledgerhq/cryptoassets 13.33.0-nightly.20251125074637 → 13.34.0-nightly.20251126023856

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
 
2
- > @ledgerhq/cryptoassets@13.32.0 build /home/runner/work/ledger-live/ledger-live/libs/ledgerjs/packages/cryptoassets
2
+ > @ledgerhq/cryptoassets@13.33.0 build /home/runner/work/ledger-live/ledger-live/libs/ledgerjs/packages/cryptoassets
3
3
  > tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,28 +1,21 @@
1
1
  # @ledgerhq/cryptoassets
2
2
 
3
- ## 13.33.0-nightly.20251125074637
3
+ ## 13.34.0-nightly.20251126023856
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c) Thanks [@gre-ledger](https://github.com/gre-ledger)! - BREAKING: CryptoAssetsStore interface is now fully async. All token lookup methods return Promises. Bot system and coin modules updated to support async token operations.
8
-
9
- - [#12580](https://github.com/LedgerHQ/ledger-live/pull/12580) [`b69c97d`](https://github.com/LedgerHQ/ledger-live/commit/b69c97d979ba97154c9abfda6abfc2a36becee4f) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Fix TRC10/TRC20 token duplication causing inconsistent lookups
10
-
11
- - Eliminated 2,815 contract address conflicts between TRC10 and TRC20 tokens
12
- - Prioritized TRC20 tokens when contract addresses exist in both files
13
- - Ensured consistent token resolution for `byAddress` and `byId` lookups
14
- - Aligned local data with backend CAL API behavior
7
+ - [#12961](https://github.com/LedgerHQ/ledger-live/pull/12961) [`50aeea1`](https://github.com/LedgerHQ/ledger-live/commit/50aeea1233056e9abff9568eb928927f39e76cff) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Add retry strategy in cal-client to improve stability of CryptoAssetsStore methods
15
8
 
16
9
  - [#12677](https://github.com/LedgerHQ/ledger-live/pull/12677) [`fe81926`](https://github.com/LedgerHQ/ledger-live/commit/fe81926afeb2df8e917e6bd1e4cbab13f09647fd) Thanks [@semeano](https://github.com/semeano)! - Add 0G coin
17
10
 
11
+ - [#12978](https://github.com/LedgerHQ/ledger-live/pull/12978) [`49ef24c`](https://github.com/LedgerHQ/ledger-live/commit/49ef24cbd1948bfd146af0b20f2128951b2dc170) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Evict CryptoAssetsStore cache when the CAL API hash changes
12
+
18
13
  - [#12734](https://github.com/LedgerHQ/ledger-live/pull/12734) [`903ea9c`](https://github.com/LedgerHQ/ledger-live/commit/903ea9cdacf704a0119de2803a4f409b775391a5) Thanks [@semeano](https://github.com/semeano)! - Add Monad testnet
19
14
 
20
15
  - [#12942](https://github.com/LedgerHQ/ledger-live/pull/12942) [`9251b77`](https://github.com/LedgerHQ/ledger-live/commit/9251b77fcb01709723842f19220a2a41a6fc8f3b) Thanks [@gre-ledger](https://github.com/gre-ledger)! - improve CryptoAssetsStore to return proper network errors
21
16
 
22
17
  - [#12754](https://github.com/LedgerHQ/ledger-live/pull/12754) [`02ef98f`](https://github.com/LedgerHQ/ledger-live/commit/02ef98faeb13c182ef255e06a43c39abeb55ecc7) Thanks [@gre-ledger](https://github.com/gre-ledger)! - cal-client useTokensData hook to use pageSize of 1000 by default to workaround Hedera problem (and possibly on other flows too) of missing token beyond top 100
23
18
 
24
- - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`c0b5b9f`](https://github.com/LedgerHQ/ledger-live/commit/c0b5b9f4cdcb2ea3e15419cbf3d1a14f725c3e6a) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Make legacy token initialization explicit instead of automatic. This prepares for the async migration by giving applications control over when tokens are loaded.
25
-
26
19
  - [#12775](https://github.com/LedgerHQ/ledger-live/pull/12775) [`6d0c6b2`](https://github.com/LedgerHQ/ledger-live/commit/6d0c6b2eda60049d8eebda5de2c54e8f0be7d009) Thanks [@Justkant](https://github.com/Justkant)! - refactor(wallet-api): migrate to lazy account/currency loading pattern
27
20
 
28
21
  Refactor Wallet & Platform APIs to lazy-load currencies/accounts via CAL API.
@@ -44,11 +37,55 @@
44
37
 
45
38
  ### Patch Changes
46
39
 
40
+ - Updated dependencies [[`fe81926`](https://github.com/LedgerHQ/ledger-live/commit/fe81926afeb2df8e917e6bd1e4cbab13f09647fd), [`927ae64`](https://github.com/LedgerHQ/ledger-live/commit/927ae64db0bb04af54e25623655a001a68e0f2d3), [`903ea9c`](https://github.com/LedgerHQ/ledger-live/commit/903ea9cdacf704a0119de2803a4f409b775391a5), [`0d33751`](https://github.com/LedgerHQ/ledger-live/commit/0d33751bb2ae599d0d26ce6a8efdbe01757f12fb), [`aadcec6`](https://github.com/LedgerHQ/ledger-live/commit/aadcec66847b800f79452ba1df09149e0a1cb9e8), [`b113920`](https://github.com/LedgerHQ/ledger-live/commit/b11392056bc334fc1813c473569ad3ae7be08045), [`ed8532b`](https://github.com/LedgerHQ/ledger-live/commit/ed8532bad754ca2b5f1788c6e92f4646b775ec79), [`88a5018`](https://github.com/LedgerHQ/ledger-live/commit/88a501871d58c980f18495b5b32012a3eaa9ab2c), [`9659a34`](https://github.com/LedgerHQ/ledger-live/commit/9659a34d9998d5c4dff8618bf6cef7d16403680d)]:
41
+ - @ledgerhq/types-live@6.90.0-nightly.20251126023856
42
+ - @ledgerhq/live-env@2.21.1-nightly.20251126023856
43
+
44
+ ## 13.33.0
45
+
46
+ ### Minor Changes
47
+
48
+ - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c) Thanks [@gre-ledger](https://github.com/gre-ledger)! - BREAKING: CryptoAssetsStore interface is now fully async. All token lookup methods return Promises. Bot system and coin modules updated to support async token operations.
49
+
50
+ - [#12580](https://github.com/LedgerHQ/ledger-live/pull/12580) [`b69c97d`](https://github.com/LedgerHQ/ledger-live/commit/b69c97d979ba97154c9abfda6abfc2a36becee4f) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Fix TRC10/TRC20 token duplication causing inconsistent lookups
51
+
52
+ - Eliminated 2,815 contract address conflicts between TRC10 and TRC20 tokens
53
+ - Prioritized TRC20 tokens when contract addresses exist in both files
54
+ - Ensured consistent token resolution for `byAddress` and `byId` lookups
55
+ - Aligned local data with backend CAL API behavior
56
+
47
57
  - [#12728](https://github.com/LedgerHQ/ledger-live/pull/12728) [`938b970`](https://github.com/LedgerHQ/ledger-live/commit/938b970e15118dc706c759a3bec27dc01c3dd268) Thanks [@jonezque](https://github.com/jonezque)! - feat: canton links for new explorer
48
58
 
49
- - Updated dependencies [[`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c), [`a6bc24e`](https://github.com/LedgerHQ/ledger-live/commit/a6bc24ee988b98bf82f807ac5ce731ba79813901), [`544721d`](https://github.com/LedgerHQ/ledger-live/commit/544721d198454526ef83516619d59c881ba34eb9), [`fe81926`](https://github.com/LedgerHQ/ledger-live/commit/fe81926afeb2df8e917e6bd1e4cbab13f09647fd), [`1c6f5f5`](https://github.com/LedgerHQ/ledger-live/commit/1c6f5f5843349b1955f7ca466f98cbe4ffcdaddf), [`927ae64`](https://github.com/LedgerHQ/ledger-live/commit/927ae64db0bb04af54e25623655a001a68e0f2d3), [`d5d838a`](https://github.com/LedgerHQ/ledger-live/commit/d5d838a23e00edd53293843781c559c41db4e854), [`903ea9c`](https://github.com/LedgerHQ/ledger-live/commit/903ea9cdacf704a0119de2803a4f409b775391a5), [`c40e9da`](https://github.com/LedgerHQ/ledger-live/commit/c40e9da68452fe9827b9435ff2d162291186be73), [`70049be`](https://github.com/LedgerHQ/ledger-live/commit/70049bed0cd0a8c7a9e4947a63af82061dad46c0), [`0d33751`](https://github.com/LedgerHQ/ledger-live/commit/0d33751bb2ae599d0d26ce6a8efdbe01757f12fb), [`5b41dd5`](https://github.com/LedgerHQ/ledger-live/commit/5b41dd56e024a5d03ba0e49084113c04887395db), [`aadcec6`](https://github.com/LedgerHQ/ledger-live/commit/aadcec66847b800f79452ba1df09149e0a1cb9e8), [`b113920`](https://github.com/LedgerHQ/ledger-live/commit/b11392056bc334fc1813c473569ad3ae7be08045), [`ed8532b`](https://github.com/LedgerHQ/ledger-live/commit/ed8532bad754ca2b5f1788c6e92f4646b775ec79), [`9659a34`](https://github.com/LedgerHQ/ledger-live/commit/9659a34d9998d5c4dff8618bf6cef7d16403680d), [`c70f6a8`](https://github.com/LedgerHQ/ledger-live/commit/c70f6a8370056b6fd8f236205471359d6f9b846f)]:
50
- - @ledgerhq/types-live@6.89.0-nightly.20251125074637
51
- - @ledgerhq/live-env@2.21.0-nightly.20251125074637
59
+ - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`c0b5b9f`](https://github.com/LedgerHQ/ledger-live/commit/c0b5b9f4cdcb2ea3e15419cbf3d1a14f725c3e6a) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Make legacy token initialization explicit instead of automatic. This prepares for the async migration by giving applications control over when tokens are loaded.
60
+
61
+ ### Patch Changes
62
+
63
+ - Updated dependencies [[`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c), [`a6bc24e`](https://github.com/LedgerHQ/ledger-live/commit/a6bc24ee988b98bf82f807ac5ce731ba79813901), [`544721d`](https://github.com/LedgerHQ/ledger-live/commit/544721d198454526ef83516619d59c881ba34eb9), [`1c6f5f5`](https://github.com/LedgerHQ/ledger-live/commit/1c6f5f5843349b1955f7ca466f98cbe4ffcdaddf), [`d5d838a`](https://github.com/LedgerHQ/ledger-live/commit/d5d838a23e00edd53293843781c559c41db4e854), [`c40e9da`](https://github.com/LedgerHQ/ledger-live/commit/c40e9da68452fe9827b9435ff2d162291186be73), [`70049be`](https://github.com/LedgerHQ/ledger-live/commit/70049bed0cd0a8c7a9e4947a63af82061dad46c0), [`5b41dd5`](https://github.com/LedgerHQ/ledger-live/commit/5b41dd56e024a5d03ba0e49084113c04887395db), [`c70f6a8`](https://github.com/LedgerHQ/ledger-live/commit/c70f6a8370056b6fd8f236205471359d6f9b846f)]:
64
+ - @ledgerhq/types-live@6.89.0
65
+ - @ledgerhq/live-env@2.21.0
66
+
67
+ ## 13.33.0-next.0
68
+
69
+ ### Minor Changes
70
+
71
+ - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c) Thanks [@gre-ledger](https://github.com/gre-ledger)! - BREAKING: CryptoAssetsStore interface is now fully async. All token lookup methods return Promises. Bot system and coin modules updated to support async token operations.
72
+
73
+ - [#12580](https://github.com/LedgerHQ/ledger-live/pull/12580) [`b69c97d`](https://github.com/LedgerHQ/ledger-live/commit/b69c97d979ba97154c9abfda6abfc2a36becee4f) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Fix TRC10/TRC20 token duplication causing inconsistent lookups
74
+
75
+ - Eliminated 2,815 contract address conflicts between TRC10 and TRC20 tokens
76
+ - Prioritized TRC20 tokens when contract addresses exist in both files
77
+ - Ensured consistent token resolution for `byAddress` and `byId` lookups
78
+ - Aligned local data with backend CAL API behavior
79
+
80
+ - [#12728](https://github.com/LedgerHQ/ledger-live/pull/12728) [`938b970`](https://github.com/LedgerHQ/ledger-live/commit/938b970e15118dc706c759a3bec27dc01c3dd268) Thanks [@jonezque](https://github.com/jonezque)! - feat: canton links for new explorer
81
+
82
+ - [#12572](https://github.com/LedgerHQ/ledger-live/pull/12572) [`c0b5b9f`](https://github.com/LedgerHQ/ledger-live/commit/c0b5b9f4cdcb2ea3e15419cbf3d1a14f725c3e6a) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Make legacy token initialization explicit instead of automatic. This prepares for the async migration by giving applications control over when tokens are loaded.
83
+
84
+ ### Patch Changes
85
+
86
+ - Updated dependencies [[`74a340b`](https://github.com/LedgerHQ/ledger-live/commit/74a340b258589c9c37476103029eb036b930616c), [`a6bc24e`](https://github.com/LedgerHQ/ledger-live/commit/a6bc24ee988b98bf82f807ac5ce731ba79813901), [`544721d`](https://github.com/LedgerHQ/ledger-live/commit/544721d198454526ef83516619d59c881ba34eb9), [`1c6f5f5`](https://github.com/LedgerHQ/ledger-live/commit/1c6f5f5843349b1955f7ca466f98cbe4ffcdaddf), [`d5d838a`](https://github.com/LedgerHQ/ledger-live/commit/d5d838a23e00edd53293843781c559c41db4e854), [`c40e9da`](https://github.com/LedgerHQ/ledger-live/commit/c40e9da68452fe9827b9435ff2d162291186be73), [`70049be`](https://github.com/LedgerHQ/ledger-live/commit/70049bed0cd0a8c7a9e4947a63af82061dad46c0), [`5b41dd5`](https://github.com/LedgerHQ/ledger-live/commit/5b41dd56e024a5d03ba0e49084113c04887395db), [`c70f6a8`](https://github.com/LedgerHQ/ledger-live/commit/c70f6a8370056b6fd8f236205471359d6f9b846f)]:
87
+ - @ledgerhq/types-live@6.89.0-next.0
88
+ - @ledgerhq/live-env@2.21.0-next.0
52
89
 
53
90
  ## 13.32.0
54
91
 
@@ -3,9 +3,9 @@ export declare function useTokensData(params: GetTokensDataParams): {
3
3
  data: TokensDataWithPagination | undefined;
4
4
  isLoading: boolean;
5
5
  error: import("@reduxjs/toolkit").SerializedError | undefined;
6
- loadNext: (() => import("@reduxjs/toolkit/query").InfiniteQueryActionCreatorResult<import("@reduxjs/toolkit/query").InfiniteQueryDefinition<GetTokensDataParams, import("../state-manager/types").PageParam, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@reduxjs/toolkit/query").FetchArgs, unknown, import("@reduxjs/toolkit/query").FetchBaseQueryError, {}, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, import("../state-manager/types").TokensDataTags, TokensDataWithPagination, "cryptoAssetsApi", unknown>>) | undefined;
6
+ loadNext: (() => import("@reduxjs/toolkit/query").InfiniteQueryActionCreatorResult<import("@reduxjs/toolkit/query").InfiniteQueryDefinition<GetTokensDataParams, import("../state-manager/types").PageParam, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@reduxjs/toolkit/query").FetchArgs, unknown, import("@reduxjs/toolkit/query").FetchBaseQueryError, {} & import("@reduxjs/toolkit/query").RetryOptions, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, import("../state-manager/types").TokensDataTags, TokensDataWithPagination, "cryptoAssetsApi", unknown>>) | undefined;
7
7
  isSuccess: boolean;
8
8
  isError: boolean;
9
- refetch: () => import("@reduxjs/toolkit/query").InfiniteQueryActionCreatorResult<import("@reduxjs/toolkit/query").InfiniteQueryDefinition<GetTokensDataParams, import("../state-manager/types").PageParam, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@reduxjs/toolkit/query").FetchArgs, unknown, import("@reduxjs/toolkit/query").FetchBaseQueryError, {}, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, import("../state-manager/types").TokensDataTags, TokensDataWithPagination, "cryptoAssetsApi", unknown>>;
9
+ refetch: () => import("@reduxjs/toolkit/query").InfiniteQueryActionCreatorResult<import("@reduxjs/toolkit/query").InfiniteQueryDefinition<GetTokensDataParams, import("../state-manager/types").PageParam, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@reduxjs/toolkit/query").FetchArgs, unknown, import("@reduxjs/toolkit/query").FetchBaseQueryError, {} & import("@reduxjs/toolkit/query").RetryOptions, import("@reduxjs/toolkit/query").FetchBaseQueryMeta>, import("../state-manager/types").TokensDataTags, TokensDataWithPagination, "cryptoAssetsApi", unknown>>;
10
10
  };
11
11
  //# sourceMappingURL=useTokensData.d.ts.map
@@ -9,7 +9,7 @@ import type { ThunkDispatch } from "@reduxjs/toolkit";
9
9
  * Current version of the persistence format
10
10
  * Increment this when making breaking changes to the format
11
11
  */
12
- export declare const PERSISTENCE_VERSION = 1;
12
+ export declare const PERSISTENCE_VERSION = 2;
13
13
  /**
14
14
  * Serializable token format
15
15
  * This is TokenCurrency without the parentCurrency object (replaced by parentCurrencyId)
@@ -42,11 +42,13 @@ export interface PersistedTokenEntry {
42
42
  /**
43
43
  * Root persistence format with versioning
44
44
  */
45
- export interface PersistedTokens {
45
+ export interface PersistedCAL {
46
46
  /** Format version for migration handling */
47
47
  version: number;
48
48
  /** Array of persisted tokens */
49
49
  tokens: PersistedTokenEntry[];
50
+ /** Mapping of currencyId to X-Ledger-Commit hash */
51
+ hashes?: Record<string, string>;
50
52
  }
51
53
  /**
52
54
  * Converts TokenCurrency to serializable Raw format
@@ -69,18 +71,23 @@ export interface StateWithCryptoAssets {
69
71
  * Converts tokens to serializable format
70
72
  */
71
73
  export declare function extractTokensFromState(state: StateWithCryptoAssets): PersistedTokenEntry[];
74
+ /**
75
+ * Extracts hashes from getTokensSyncHash queries in RTK Query state
76
+ * Returns a mapping of currencyId to hash
77
+ */
78
+ export declare function extractHashesFromState(state: StateWithCryptoAssets): Record<string, string>;
79
+ /**
80
+ * Extracts all persisted data (tokens and hashes) from RTK Query state
81
+ * Returns a complete PersistedCAL object ready for serialization
82
+ */
83
+ export declare function extractPersistedCALFromState(state: StateWithCryptoAssets): PersistedCAL;
72
84
  /**
73
85
  * Filters out expired tokens based on TTL
74
86
  */
75
87
  export declare function filterExpiredTokens(tokens: PersistedTokenEntry[], ttl: number): PersistedTokenEntry[];
76
88
  /**
77
- * Restores tokens from persisted data to RTK Query cache
78
- * Uses upsertQueryEntries to insert final TokenCurrency values (no transformResponse)
79
- * Implements cross-caching: stores tokens by both ID and address
80
- *
81
- * @param dispatch - Redux dispatch function
82
- * @param tokens - Array of persisted token entries
83
- * @param ttl - Time-to-live in milliseconds (tokens older than this are skipped)
89
+ * Restores tokens from persisted data to RTK Query cache.
90
+ * Validates persisted hashes against current hashes and evicts cache if they differ.
84
91
  */
85
- export declare function restoreTokensToCache(dispatch: ThunkDispatch<any, any, any>, tokens: PersistedTokenEntry[], ttl: number): void;
92
+ export declare function restoreTokensToCache(dispatch: ThunkDispatch<any, any, any>, persistedData: PersistedCAL, ttl: number): Promise<void>;
86
93
  //# sourceMappingURL=persistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/cal-client/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAazE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,GAAG,SAAS,CAoBrF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAmC1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,GAAG,EAAE,MAAM,GACV,mBAAmB,EAAE,CAavB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAElC,QAAQ,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACtC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,GAAG,EAAE,MAAM,GACV,IAAI,CA8DN"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/cal-client/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAazE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,GAAG,SAAS,CAoBrF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAoC1F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2B3F;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CASvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,GAAG,EAAE,MAAM,GACV,mBAAmB,EAAE,CAavB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAExC,QAAQ,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACtC,aAAa,EAAE,YAAY,EAC3B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAgGf"}
@@ -4,7 +4,7 @@
4
4
  * Handles extracting, saving, and restoring tokens from RTK Query cache
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.restoreTokensToCache = exports.filterExpiredTokens = exports.extractTokensFromState = exports.fromTokenCurrencyRaw = exports.toTokenCurrencyRaw = exports.PERSISTENCE_VERSION = void 0;
7
+ exports.restoreTokensToCache = exports.filterExpiredTokens = exports.extractPersistedCALFromState = exports.extractHashesFromState = exports.extractTokensFromState = exports.fromTokenCurrencyRaw = exports.toTokenCurrencyRaw = exports.PERSISTENCE_VERSION = void 0;
8
8
  const logs_1 = require("@ledgerhq/logs");
9
9
  const currencies_1 = require("../currencies");
10
10
  const api_1 = require("./state-manager/api");
@@ -12,7 +12,7 @@ const api_1 = require("./state-manager/api");
12
12
  * Current version of the persistence format
13
13
  * Increment this when making breaking changes to the format
14
14
  */
15
- exports.PERSISTENCE_VERSION = 1;
15
+ exports.PERSISTENCE_VERSION = 2;
16
16
  /**
17
17
  * Converts TokenCurrency to serializable Raw format
18
18
  */
@@ -70,9 +70,9 @@ function extractTokensFromState(state) {
70
70
  const tokens = [];
71
71
  const seenIds = new Set();
72
72
  // Extract tokens from fulfilled queries
73
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
73
  for (const [_queryKey, query] of Object.entries(rtkState.queries)) {
75
- if (query.status === "fulfilled" &&
74
+ if (query &&
75
+ query.status === "fulfilled" &&
76
76
  query.data &&
77
77
  (query.endpointName === "findTokenById" ||
78
78
  query.endpointName === "findTokenByAddressInCurrency")) {
@@ -91,6 +91,47 @@ function extractTokensFromState(state) {
91
91
  return tokens;
92
92
  }
93
93
  exports.extractTokensFromState = extractTokensFromState;
94
+ /**
95
+ * Extracts hashes from getTokensSyncHash queries in RTK Query state
96
+ * Returns a mapping of currencyId to hash
97
+ */
98
+ function extractHashesFromState(state) {
99
+ const rtkState = state[api_1.cryptoAssetsApi.reducerPath];
100
+ if (!rtkState || !rtkState.queries) {
101
+ return {};
102
+ }
103
+ const hashes = {};
104
+ // Extract hashes from fulfilled getTokensSyncHash queries
105
+ for (const [queryKey, query] of Object.entries(rtkState.queries)) {
106
+ if (query &&
107
+ query.status === "fulfilled" &&
108
+ query.endpointName === "getTokensSyncHash" &&
109
+ query.data &&
110
+ typeof query.data === "string") {
111
+ // Extract currencyId from query key (format: 'getTokensSyncHash("ethereum")')
112
+ const match = queryKey.match(/getTokensSyncHash\("([^"]+)"\)/);
113
+ if (match && match[1]) {
114
+ hashes[match[1]] = query.data;
115
+ }
116
+ }
117
+ }
118
+ return hashes;
119
+ }
120
+ exports.extractHashesFromState = extractHashesFromState;
121
+ /**
122
+ * Extracts all persisted data (tokens and hashes) from RTK Query state
123
+ * Returns a complete PersistedCAL object ready for serialization
124
+ */
125
+ function extractPersistedCALFromState(state) {
126
+ const tokens = extractTokensFromState(state);
127
+ const hashes = extractHashesFromState(state);
128
+ return {
129
+ version: exports.PERSISTENCE_VERSION,
130
+ tokens,
131
+ ...(Object.keys(hashes).length > 0 && { hashes }),
132
+ };
133
+ }
134
+ exports.extractPersistedCALFromState = extractPersistedCALFromState;
94
135
  /**
95
136
  * Filters out expired tokens based on TTL
96
137
  */
@@ -108,41 +149,62 @@ function filterExpiredTokens(tokens, ttl) {
108
149
  }
109
150
  exports.filterExpiredTokens = filterExpiredTokens;
110
151
  /**
111
- * Restores tokens from persisted data to RTK Query cache
112
- * Uses upsertQueryEntries to insert final TokenCurrency values (no transformResponse)
113
- * Implements cross-caching: stores tokens by both ID and address
114
- *
115
- * @param dispatch - Redux dispatch function
116
- * @param tokens - Array of persisted token entries
117
- * @param ttl - Time-to-live in milliseconds (tokens older than this are skipped)
152
+ * Restores tokens from persisted data to RTK Query cache.
153
+ * Validates persisted hashes against current hashes and evicts cache if they differ.
118
154
  */
119
- function restoreTokensToCache(
155
+ async function restoreTokensToCache(
120
156
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
- dispatch, tokens, ttl) {
122
- const validTokens = filterExpiredTokens(tokens, ttl);
157
+ dispatch, persistedData, ttl) {
158
+ const validTokens = filterExpiredTokens(persistedData.tokens, ttl);
123
159
  if (validTokens.length === 0) {
124
160
  (0, logs_1.log)("persistence", "No valid tokens to restore");
125
161
  return;
126
162
  }
127
- // Build entries for upsertQueryEntries
128
- // Each token needs to be cached under both ID and address lookups
163
+ const tokensByCurrency = new Map();
164
+ for (const entry of validTokens) {
165
+ const currencyId = entry.data.parentCurrencyId;
166
+ if (!tokensByCurrency.has(currencyId)) {
167
+ tokensByCurrency.set(currencyId, []);
168
+ }
169
+ tokensByCurrency.get(currencyId).push(entry);
170
+ }
171
+ const currencyIdsToEvict = new Set();
172
+ const hashes = persistedData.hashes || {};
173
+ for (const currencyId of tokensByCurrency.keys()) {
174
+ const storedHash = hashes[currencyId];
175
+ if (!storedHash)
176
+ continue;
177
+ try {
178
+ const currentHashResult = await dispatch(api_1.cryptoAssetsApi.endpoints.getTokensSyncHash.initiate(currencyId, { forceRefetch: false }));
179
+ const currentHash = currentHashResult.data;
180
+ if (currentHash && currentHash !== storedHash) {
181
+ (0, logs_1.log)("persistence", `Hash changed for currencyId ${currencyId}: ${storedHash} -> ${currentHash}, skipping restore`);
182
+ currencyIdsToEvict.add(currencyId);
183
+ }
184
+ }
185
+ catch (error) {
186
+ (0, logs_1.log)("persistence", `Failed to validate hash for currencyId ${currencyId}, skipping restore`, error);
187
+ currencyIdsToEvict.add(currencyId);
188
+ }
189
+ }
190
+ const tokensToRestore = validTokens.filter(entry => !currencyIdsToEvict.has(entry.data.parentCurrencyId));
191
+ if (tokensToRestore.length === 0) {
192
+ (0, logs_1.log)("persistence", "No tokens to restore after hash validation");
193
+ return;
194
+ }
129
195
  const entries = [];
130
196
  let skipped = 0;
131
- for (const entry of validTokens) {
132
- // Convert Raw format back to TokenCurrency
197
+ for (const entry of tokensToRestore) {
133
198
  const token = fromTokenCurrencyRaw(entry.data);
134
199
  if (!token) {
135
- // Conversion failed (e.g., parent currency not found), skip this token
136
200
  skipped++;
137
201
  continue;
138
202
  }
139
- // Cache by ID
140
203
  entries.push({
141
204
  endpointName: "findTokenById",
142
205
  arg: { id: token.id },
143
206
  value: token,
144
207
  });
145
- // Cross-cache by address (for findTokenByAddressInCurrency queries)
146
208
  entries.push({
147
209
  endpointName: "findTokenByAddressInCurrency",
148
210
  arg: {
@@ -152,11 +214,10 @@ dispatch, tokens, ttl) {
152
214
  value: token,
153
215
  });
154
216
  }
155
- // Dispatch single upsertQueryEntries action with all entries
156
217
  if (entries.length > 0) {
157
218
  dispatch(api_1.cryptoAssetsApi.util.upsertQueryEntries(entries));
158
219
  }
159
- (0, logs_1.log)("persistence", `Restored ${validTokens.length - skipped} tokens to cache (${entries.length} entries, ${skipped} skipped)`);
220
+ (0, logs_1.log)("persistence", `Restored ${tokensToRestore.length - skipped} tokens (${entries.length} entries, ${skipped} skipped, ${currencyIdsToEvict.size} currencies evicted)`);
160
221
  }
161
222
  exports.restoreTokensToCache = restoreTokensToCache;
162
223
  //# sourceMappingURL=persistence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/cal-client/persistence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/cal-client/persistence.ts"],"names":[],"mappings":"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"}