@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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +51 -14
- package/lib/cal-client/hooks/useTokensData.d.ts +2 -2
- package/lib/cal-client/persistence.d.ts +17 -10
- package/lib/cal-client/persistence.d.ts.map +1 -1
- package/lib/cal-client/persistence.js +84 -23
- package/lib/cal-client/persistence.js.map +1 -1
- package/lib/cal-client/state-manager/api.d.ts +157 -160
- package/lib/cal-client/state-manager/api.d.ts.map +1 -1
- package/lib/cal-client/state-manager/api.js +25 -8
- package/lib/cal-client/state-manager/api.js.map +1 -1
- package/lib-es/cal-client/hooks/useTokensData.d.ts +2 -2
- package/lib-es/cal-client/persistence.d.ts +17 -10
- package/lib-es/cal-client/persistence.d.ts.map +1 -1
- package/lib-es/cal-client/persistence.js +81 -22
- package/lib-es/cal-client/persistence.js.map +1 -1
- package/lib-es/cal-client/state-manager/api.d.ts +157 -160
- package/lib-es/cal-client/state-manager/api.d.ts.map +1 -1
- package/lib-es/cal-client/state-manager/api.js +26 -9
- package/lib-es/cal-client/state-manager/api.js.map +1 -1
- package/package.json +3 -3
- package/src/cal-client/persistence.test.ts +492 -34
- package/src/cal-client/persistence.ts +112 -32
- package/src/cal-client/state-manager/api.ts +28 -4
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/cryptoassets@13.
|
|
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.
|
|
3
|
+
## 13.34.0-nightly.20251126023856
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
|
-
- [#
|
|
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
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
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 =
|
|
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
|
|
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
|
-
*
|
|
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>,
|
|
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,
|
|
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 =
|
|
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
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
|
|
128
|
-
|
|
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
|
|
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 ${
|
|
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":";AAAA;;;GAGG;;;AAEH,yCAAqC;AAErC,8CAAuD;AACvD,6CAAsD;AAGtD;;;GAGG;AACU,QAAA,mBAAmB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/cal-client/persistence.ts"],"names":[],"mappings":"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"}
|