@ledgerhq/cryptoassets 13.31.0-nightly.6 → 13.31.0-nightly.7

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.
Files changed (183) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.unimportedrc.json +1 -0
  3. package/CHANGELOG.md +12 -0
  4. package/jest.config.ts +1 -0
  5. package/lib/hooks.d.ts +21 -0
  6. package/lib/hooks.d.ts.map +1 -0
  7. package/lib/hooks.js +82 -0
  8. package/lib/hooks.js.map +1 -0
  9. package/lib-es/hooks.d.ts +21 -0
  10. package/lib-es/hooks.d.ts.map +1 -0
  11. package/lib-es/hooks.js +78 -0
  12. package/lib-es/hooks.js.map +1 -0
  13. package/package.json +16 -3
  14. package/src/hooks.test.ts +278 -0
  15. package/src/hooks.ts +104 -0
  16. package/lib/api-asset-converter.test.d.ts +0 -2
  17. package/lib/api-asset-converter.test.d.ts.map +0 -1
  18. package/lib/api-asset-converter.test.js +0 -240
  19. package/lib/api-asset-converter.test.js.map +0 -1
  20. package/lib/api-token-converter.test.d.ts +0 -2
  21. package/lib/api-token-converter.test.d.ts.map +0 -1
  22. package/lib/api-token-converter.test.js +0 -316
  23. package/lib/api-token-converter.test.js.map +0 -1
  24. package/lib/backtest-tokenTypes.test.d.ts +0 -2
  25. package/lib/backtest-tokenTypes.test.d.ts.map +0 -1
  26. package/lib/backtest-tokenTypes.test.js +0 -31
  27. package/lib/backtest-tokenTypes.test.js.map +0 -1
  28. package/lib/crypto-assets-importer/fetch/fetch.test.d.ts +0 -2
  29. package/lib/crypto-assets-importer/fetch/fetch.test.d.ts.map +0 -1
  30. package/lib/crypto-assets-importer/fetch/fetch.test.js +0 -28
  31. package/lib/crypto-assets-importer/fetch/fetch.test.js.map +0 -1
  32. package/lib/crypto-assets-importer/importers/apt/aptos.test.d.ts +0 -2
  33. package/lib/crypto-assets-importer/importers/apt/aptos.test.d.ts.map +0 -1
  34. package/lib/crypto-assets-importer/importers/apt/aptos.test.js +0 -69
  35. package/lib/crypto-assets-importer/importers/apt/aptos.test.js.map +0 -1
  36. package/lib/crypto-assets-importer/importers/asa/asa.test.d.ts +0 -2
  37. package/lib/crypto-assets-importer/importers/asa/asa.test.d.ts.map +0 -1
  38. package/lib/crypto-assets-importer/importers/asa/asa.test.js +0 -63
  39. package/lib/crypto-assets-importer/importers/asa/asa.test.js.map +0 -1
  40. package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts +0 -2
  41. package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts.map +0 -1
  42. package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js +0 -74
  43. package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js.map +0 -1
  44. package/lib/crypto-assets-importer/importers/eip712/eip712.test.d.ts +0 -2
  45. package/lib/crypto-assets-importer/importers/eip712/eip712.test.d.ts.map +0 -1
  46. package/lib/crypto-assets-importer/importers/eip712/eip712.test.js +0 -45
  47. package/lib/crypto-assets-importer/importers/eip712/eip712.test.js.map +0 -1
  48. package/lib/crypto-assets-importer/importers/esdt/esdt.test.d.ts +0 -2
  49. package/lib/crypto-assets-importer/importers/esdt/esdt.test.d.ts.map +0 -1
  50. package/lib/crypto-assets-importer/importers/esdt/esdt.test.js +0 -65
  51. package/lib/crypto-assets-importer/importers/esdt/esdt.test.js.map +0 -1
  52. package/lib/crypto-assets-importer/importers/evm/evm.test.d.ts +0 -2
  53. package/lib/crypto-assets-importer/importers/evm/evm.test.d.ts.map +0 -1
  54. package/lib/crypto-assets-importer/importers/evm/evm.test.js +0 -62
  55. package/lib/crypto-assets-importer/importers/evm/evm.test.js.map +0 -1
  56. package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts +0 -2
  57. package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts.map +0 -1
  58. package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js +0 -66
  59. package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js.map +0 -1
  60. package/lib/crypto-assets-importer/importers/hedera/hedera.test.d.ts +0 -2
  61. package/lib/crypto-assets-importer/importers/hedera/hedera.test.d.ts.map +0 -1
  62. package/lib/crypto-assets-importer/importers/hedera/hedera.test.js +0 -64
  63. package/lib/crypto-assets-importer/importers/hedera/hedera.test.js.map +0 -1
  64. package/lib/crypto-assets-importer/importers/spl/spl.test.d.ts +0 -2
  65. package/lib/crypto-assets-importer/importers/spl/spl.test.d.ts.map +0 -1
  66. package/lib/crypto-assets-importer/importers/spl/spl.test.js +0 -73
  67. package/lib/crypto-assets-importer/importers/spl/spl.test.js.map +0 -1
  68. package/lib/crypto-assets-importer/importers/stellar/stellar.test.d.ts +0 -2
  69. package/lib/crypto-assets-importer/importers/stellar/stellar.test.d.ts.map +0 -1
  70. package/lib/crypto-assets-importer/importers/stellar/stellar.test.js +0 -56
  71. package/lib/crypto-assets-importer/importers/stellar/stellar.test.js.map +0 -1
  72. package/lib/crypto-assets-importer/importers/sui/sui.test.d.ts +0 -2
  73. package/lib/crypto-assets-importer/importers/sui/sui.test.d.ts.map +0 -1
  74. package/lib/crypto-assets-importer/importers/sui/sui.test.js +0 -74
  75. package/lib/crypto-assets-importer/importers/sui/sui.test.js.map +0 -1
  76. package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts +0 -2
  77. package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts.map +0 -1
  78. package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.js +0 -59
  79. package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.js.map +0 -1
  80. package/lib/crypto-assets-importer/importers/trc20/trc20.test.d.ts +0 -2
  81. package/lib/crypto-assets-importer/importers/trc20/trc20.test.d.ts.map +0 -1
  82. package/lib/crypto-assets-importer/importers/trc20/trc20.test.js +0 -71
  83. package/lib/crypto-assets-importer/importers/trc20/trc20.test.js.map +0 -1
  84. package/lib/crypto-assets-importer/importers/vip180/vip180.test.d.ts +0 -2
  85. package/lib/crypto-assets-importer/importers/vip180/vip180.test.d.ts.map +0 -1
  86. package/lib/crypto-assets-importer/importers/vip180/vip180.test.js +0 -64
  87. package/lib/crypto-assets-importer/importers/vip180/vip180.test.js.map +0 -1
  88. package/lib/currencies.test.d.ts +0 -2
  89. package/lib/currencies.test.d.ts.map +0 -1
  90. package/lib/currencies.test.js +0 -230
  91. package/lib/currencies.test.js.map +0 -1
  92. package/lib/legacy/legacy.test.d.ts +0 -2
  93. package/lib/legacy/legacy.test.d.ts.map +0 -1
  94. package/lib/legacy/legacy.test.js +0 -466
  95. package/lib/legacy/legacy.test.js.map +0 -1
  96. package/lib/tokens.test.d.ts +0 -2
  97. package/lib/tokens.test.d.ts.map +0 -1
  98. package/lib/tokens.test.js +0 -118
  99. package/lib/tokens.test.js.map +0 -1
  100. package/lib-es/api-asset-converter.test.d.ts +0 -2
  101. package/lib-es/api-asset-converter.test.d.ts.map +0 -1
  102. package/lib-es/api-asset-converter.test.js +0 -238
  103. package/lib-es/api-asset-converter.test.js.map +0 -1
  104. package/lib-es/api-token-converter.test.d.ts +0 -2
  105. package/lib-es/api-token-converter.test.d.ts.map +0 -1
  106. package/lib-es/api-token-converter.test.js +0 -314
  107. package/lib-es/api-token-converter.test.js.map +0 -1
  108. package/lib-es/backtest-tokenTypes.test.d.ts +0 -2
  109. package/lib-es/backtest-tokenTypes.test.d.ts.map +0 -1
  110. package/lib-es/backtest-tokenTypes.test.js +0 -29
  111. package/lib-es/backtest-tokenTypes.test.js.map +0 -1
  112. package/lib-es/crypto-assets-importer/fetch/fetch.test.d.ts +0 -2
  113. package/lib-es/crypto-assets-importer/fetch/fetch.test.d.ts.map +0 -1
  114. package/lib-es/crypto-assets-importer/fetch/fetch.test.js +0 -23
  115. package/lib-es/crypto-assets-importer/fetch/fetch.test.js.map +0 -1
  116. package/lib-es/crypto-assets-importer/importers/apt/aptos.test.d.ts +0 -2
  117. package/lib-es/crypto-assets-importer/importers/apt/aptos.test.d.ts.map +0 -1
  118. package/lib-es/crypto-assets-importer/importers/apt/aptos.test.js +0 -64
  119. package/lib-es/crypto-assets-importer/importers/apt/aptos.test.js.map +0 -1
  120. package/lib-es/crypto-assets-importer/importers/asa/asa.test.d.ts +0 -2
  121. package/lib-es/crypto-assets-importer/importers/asa/asa.test.d.ts.map +0 -1
  122. package/lib-es/crypto-assets-importer/importers/asa/asa.test.js +0 -58
  123. package/lib-es/crypto-assets-importer/importers/asa/asa.test.js.map +0 -1
  124. package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts +0 -2
  125. package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts.map +0 -1
  126. package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js +0 -69
  127. package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js.map +0 -1
  128. package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.d.ts +0 -2
  129. package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.d.ts.map +0 -1
  130. package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.js +0 -40
  131. package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.js.map +0 -1
  132. package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.d.ts +0 -2
  133. package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.d.ts.map +0 -1
  134. package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.js +0 -60
  135. package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.js.map +0 -1
  136. package/lib-es/crypto-assets-importer/importers/evm/evm.test.d.ts +0 -2
  137. package/lib-es/crypto-assets-importer/importers/evm/evm.test.d.ts.map +0 -1
  138. package/lib-es/crypto-assets-importer/importers/evm/evm.test.js +0 -57
  139. package/lib-es/crypto-assets-importer/importers/evm/evm.test.js.map +0 -1
  140. package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts +0 -2
  141. package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts.map +0 -1
  142. package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js +0 -61
  143. package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js.map +0 -1
  144. package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.d.ts +0 -2
  145. package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.d.ts.map +0 -1
  146. package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.js +0 -59
  147. package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.js.map +0 -1
  148. package/lib-es/crypto-assets-importer/importers/spl/spl.test.d.ts +0 -2
  149. package/lib-es/crypto-assets-importer/importers/spl/spl.test.d.ts.map +0 -1
  150. package/lib-es/crypto-assets-importer/importers/spl/spl.test.js +0 -68
  151. package/lib-es/crypto-assets-importer/importers/spl/spl.test.js.map +0 -1
  152. package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.d.ts +0 -2
  153. package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.d.ts.map +0 -1
  154. package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.js +0 -51
  155. package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.js.map +0 -1
  156. package/lib-es/crypto-assets-importer/importers/sui/sui.test.d.ts +0 -2
  157. package/lib-es/crypto-assets-importer/importers/sui/sui.test.d.ts.map +0 -1
  158. package/lib-es/crypto-assets-importer/importers/sui/sui.test.js +0 -69
  159. package/lib-es/crypto-assets-importer/importers/sui/sui.test.js.map +0 -1
  160. package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts +0 -2
  161. package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts.map +0 -1
  162. package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.js +0 -54
  163. package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.js.map +0 -1
  164. package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.d.ts +0 -2
  165. package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.d.ts.map +0 -1
  166. package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.js +0 -66
  167. package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.js.map +0 -1
  168. package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.d.ts +0 -2
  169. package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.d.ts.map +0 -1
  170. package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.js +0 -59
  171. package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.js.map +0 -1
  172. package/lib-es/currencies.test.d.ts +0 -2
  173. package/lib-es/currencies.test.d.ts.map +0 -1
  174. package/lib-es/currencies.test.js +0 -228
  175. package/lib-es/currencies.test.js.map +0 -1
  176. package/lib-es/legacy/legacy.test.d.ts +0 -2
  177. package/lib-es/legacy/legacy.test.d.ts.map +0 -1
  178. package/lib-es/legacy/legacy.test.js +0 -464
  179. package/lib-es/legacy/legacy.test.js.map +0 -1
  180. package/lib-es/tokens.test.d.ts +0 -2
  181. package/lib-es/tokens.test.d.ts.map +0 -1
  182. package/lib-es/tokens.test.js +0 -116
  183. package/lib-es/tokens.test.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
 
2
- > @ledgerhq/cryptoassets@13.31.0-nightly.5 build /home/runner/work/ledger-live/ledger-live/libs/ledgerjs/packages/cryptoassets
2
+ > @ledgerhq/cryptoassets@13.31.0-nightly.6 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
 
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "entry": [
3
3
  "src/index.ts",
4
+ "src/hooks.ts",
4
5
  "src/crypto-assets-importer/index.ts"
5
6
  ],
6
7
  "ignorePatterns": ["src/data/**/*.ts", "src/**/*.test.ts"],
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ledgerhq/cryptoassets
2
2
 
3
+ ## 13.31.0-nightly.7
4
+
5
+ ### Minor Changes
6
+
7
+ - [#12257](https://github.com/LedgerHQ/ledger-live/pull/12257) [`b4ceaff`](https://github.com/LedgerHQ/ledger-live/commit/b4ceaff2ecf68d8a14e09801c76ab0b014c45286) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Introduce hooks in cryptoassets
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`f392f69`](https://github.com/LedgerHQ/ledger-live/commit/f392f6912f445cc2f7cf4dfcfd030fa3da76f736), [`cbc0648`](https://github.com/LedgerHQ/ledger-live/commit/cbc064885d8e0459e40d327a2e5389204b3ec705)]:
12
+ - @ledgerhq/types-live@6.87.0-nightly.5
13
+ - @ledgerhq/live-env@2.19.0-nightly.2
14
+
3
15
  ## 13.31.0-nightly.6
4
16
 
5
17
  ### Patch Changes
package/jest.config.ts CHANGED
@@ -3,4 +3,5 @@ import baseConfig from "../../jest.config";
3
3
  export default {
4
4
  ...baseConfig,
5
5
  rootDir: __dirname,
6
+ testEnvironment: "jsdom",
6
7
  };
package/lib/hooks.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import type { TokenCurrency } from "@ledgerhq/types-cryptoassets";
2
+ /**
3
+ * CryptoAssetsHooks is the hooks interface version of the CryptoAssetsStore
4
+ * This work provide a common interface for the hooks, and the backend implementation will be completed in the future
5
+ * See https://github.com/LedgerHQ/ledger-live/pull/11951
6
+ */
7
+ export declare function createCryptoAssetsHooks(config?: {
8
+ useCALBackend?: false;
9
+ api?: unknown;
10
+ }): Hooks;
11
+ type TokenResult = {
12
+ token: TokenCurrency | undefined;
13
+ loading: boolean;
14
+ error: unknown;
15
+ };
16
+ type Hooks = {
17
+ useTokenById: (id: string) => TokenResult;
18
+ useTokenByAddressInCurrency: (address: string, currencyId: string) => TokenResult;
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,GAAE;IACN,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACV,GACL,KAAK,CASP;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW,CAAC;IAC1C,2BAA2B,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,WAAW,CAAC;CACnF,CAAC"}
package/lib/hooks.js ADDED
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCryptoAssetsHooks = void 0;
4
+ const react_1 = require("react");
5
+ const legacy_store_1 = require("./legacy/legacy-store");
6
+ /**
7
+ * CryptoAssetsHooks is the hooks interface version of the CryptoAssetsStore
8
+ * This work provide a common interface for the hooks, and the backend implementation will be completed in the future
9
+ * See https://github.com/LedgerHQ/ledger-live/pull/11951
10
+ */
11
+ function createCryptoAssetsHooks(config = {}) {
12
+ if (config.useCALBackend) {
13
+ throw new Error("backend is not supported yet");
14
+ }
15
+ else {
16
+ return {
17
+ useTokenById: useLegacyTokenById,
18
+ useTokenByAddressInCurrency: useLegacyTokenByAddressInCurrency,
19
+ };
20
+ }
21
+ }
22
+ exports.createCryptoAssetsHooks = createCryptoAssetsHooks;
23
+ /////////// Legacy hooks using legacyCryptoAssetsStore ///////////
24
+ function useLegacyTokenById(id) {
25
+ const [token, setToken] = (0, react_1.useState)(undefined);
26
+ const [loading, setLoading] = (0, react_1.useState)(true);
27
+ const [error, setError] = (0, react_1.useState)(undefined);
28
+ (0, react_1.useEffect)(() => {
29
+ if (!id) {
30
+ setToken(undefined);
31
+ setLoading(false);
32
+ return;
33
+ }
34
+ const fetchToken = async () => {
35
+ try {
36
+ setLoading(true);
37
+ setError(undefined);
38
+ const result = await legacy_store_1.legacyCryptoAssetsStore.findTokenById(id);
39
+ setToken(result);
40
+ }
41
+ catch (err) {
42
+ setError(err);
43
+ setToken(undefined);
44
+ }
45
+ finally {
46
+ setLoading(false);
47
+ }
48
+ };
49
+ fetchToken();
50
+ }, [id]);
51
+ return { token, loading, error };
52
+ }
53
+ function useLegacyTokenByAddressInCurrency(address, currencyId) {
54
+ const [token, setToken] = (0, react_1.useState)(undefined);
55
+ const [loading, setLoading] = (0, react_1.useState)(true);
56
+ const [error, setError] = (0, react_1.useState)(undefined);
57
+ (0, react_1.useEffect)(() => {
58
+ if (!address || !currencyId) {
59
+ setToken(undefined);
60
+ setLoading(false);
61
+ return;
62
+ }
63
+ const fetchToken = async () => {
64
+ try {
65
+ setLoading(true);
66
+ setError(undefined);
67
+ const result = await legacy_store_1.legacyCryptoAssetsStore.findTokenByAddressInCurrency(address, currencyId);
68
+ setToken(result);
69
+ }
70
+ catch (err) {
71
+ setError(err);
72
+ setToken(undefined);
73
+ }
74
+ finally {
75
+ setLoading(false);
76
+ }
77
+ };
78
+ fetchToken();
79
+ }, [address, currencyId]);
80
+ return { token, loading, error };
81
+ }
82
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TokenCurrency } from "@ledgerhq/types-cryptoassets";
2
+ /**
3
+ * CryptoAssetsHooks is the hooks interface version of the CryptoAssetsStore
4
+ * This work provide a common interface for the hooks, and the backend implementation will be completed in the future
5
+ * See https://github.com/LedgerHQ/ledger-live/pull/11951
6
+ */
7
+ export declare function createCryptoAssetsHooks(config?: {
8
+ useCALBackend?: false;
9
+ api?: unknown;
10
+ }): Hooks;
11
+ type TokenResult = {
12
+ token: TokenCurrency | undefined;
13
+ loading: boolean;
14
+ error: unknown;
15
+ };
16
+ type Hooks = {
17
+ useTokenById: (id: string) => TokenResult;
18
+ useTokenByAddressInCurrency: (address: string, currencyId: string) => TokenResult;
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,GAAE;IACN,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACV,GACL,KAAK,CASP;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW,CAAC;IAC1C,2BAA2B,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,WAAW,CAAC;CACnF,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { useState, useEffect } from "react";
2
+ import { legacyCryptoAssetsStore } from "./legacy/legacy-store";
3
+ /**
4
+ * CryptoAssetsHooks is the hooks interface version of the CryptoAssetsStore
5
+ * This work provide a common interface for the hooks, and the backend implementation will be completed in the future
6
+ * See https://github.com/LedgerHQ/ledger-live/pull/11951
7
+ */
8
+ export function createCryptoAssetsHooks(config = {}) {
9
+ if (config.useCALBackend) {
10
+ throw new Error("backend is not supported yet");
11
+ }
12
+ else {
13
+ return {
14
+ useTokenById: useLegacyTokenById,
15
+ useTokenByAddressInCurrency: useLegacyTokenByAddressInCurrency,
16
+ };
17
+ }
18
+ }
19
+ /////////// Legacy hooks using legacyCryptoAssetsStore ///////////
20
+ function useLegacyTokenById(id) {
21
+ const [token, setToken] = useState(undefined);
22
+ const [loading, setLoading] = useState(true);
23
+ const [error, setError] = useState(undefined);
24
+ useEffect(() => {
25
+ if (!id) {
26
+ setToken(undefined);
27
+ setLoading(false);
28
+ return;
29
+ }
30
+ const fetchToken = async () => {
31
+ try {
32
+ setLoading(true);
33
+ setError(undefined);
34
+ const result = await legacyCryptoAssetsStore.findTokenById(id);
35
+ setToken(result);
36
+ }
37
+ catch (err) {
38
+ setError(err);
39
+ setToken(undefined);
40
+ }
41
+ finally {
42
+ setLoading(false);
43
+ }
44
+ };
45
+ fetchToken();
46
+ }, [id]);
47
+ return { token, loading, error };
48
+ }
49
+ function useLegacyTokenByAddressInCurrency(address, currencyId) {
50
+ const [token, setToken] = useState(undefined);
51
+ const [loading, setLoading] = useState(true);
52
+ const [error, setError] = useState(undefined);
53
+ useEffect(() => {
54
+ if (!address || !currencyId) {
55
+ setToken(undefined);
56
+ setLoading(false);
57
+ return;
58
+ }
59
+ const fetchToken = async () => {
60
+ try {
61
+ setLoading(true);
62
+ setError(undefined);
63
+ const result = await legacyCryptoAssetsStore.findTokenByAddressInCurrency(address, currencyId);
64
+ setToken(result);
65
+ }
66
+ catch (err) {
67
+ setError(err);
68
+ setToken(undefined);
69
+ }
70
+ finally {
71
+ setLoading(false);
72
+ }
73
+ };
74
+ fetchToken();
75
+ }, [address, currencyId]);
76
+ return { token, loading, error };
77
+ }
78
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/cryptoassets",
3
- "version": "13.31.0-nightly.6",
3
+ "version": "13.31.0-nightly.7",
4
4
  "description": "Ledger crypto-assets list",
5
5
  "keywords": [
6
6
  "Ledger"
@@ -23,14 +23,19 @@
23
23
  "axios": "1.11.0",
24
24
  "bs58check": "^2.1.2",
25
25
  "invariant": "2",
26
- "@ledgerhq/live-env": "^2.19.0-nightly.1",
27
- "@ledgerhq/types-live": "^6.87.0-nightly.4"
26
+ "@ledgerhq/live-env": "^2.19.0-nightly.2",
27
+ "@ledgerhq/types-live": "^6.87.0-nightly.5"
28
28
  },
29
29
  "devDependencies": {
30
+ "@testing-library/react": "14.2.2",
30
31
  "@types/bs58check": "^2.1.0",
31
32
  "@types/jest": "^29.5.10",
32
33
  "@types/node": "^22.10.10",
34
+ "@types/react": "^18.0.0",
33
35
  "jest": "^29.7.0",
36
+ "jest-environment-jsdom": "^29.7.0",
37
+ "react": "^18.0.0",
38
+ "react-dom": "^18.0.0",
34
39
  "rimraf": "^4.4.1",
35
40
  "source-map-support": "^0.5.21",
36
41
  "ts-jest": "^29.1.1",
@@ -58,6 +63,14 @@
58
63
  "./lib/*.js": "./lib/*.js",
59
64
  "./lib-es/*": "./lib-es/*.js",
60
65
  "./lib-es/*.js": "./lib-es/*.js",
66
+ "./rtk-store": {
67
+ "require": "./lib/rtk-store/index.js",
68
+ "default": "./lib-es/rtk-store/index.js"
69
+ },
70
+ "./rtk-store/*": {
71
+ "require": "./lib/rtk-store/*.js",
72
+ "default": "./lib-es/rtk-store/*.js"
73
+ },
61
74
  "./*": {
62
75
  "require": "./lib/*.js",
63
76
  "default": "./lib-es/*.js"
@@ -0,0 +1,278 @@
1
+ import { renderHook, waitFor } from "@testing-library/react";
2
+ import { createCryptoAssetsHooks } from "./hooks";
3
+ import type { TokenCurrency } from "@ledgerhq/types-cryptoassets";
4
+
5
+ // Mock the legacy store
6
+ jest.mock("./legacy/legacy-store", () => ({
7
+ legacyCryptoAssetsStore: {
8
+ findTokenById: jest.fn(),
9
+ findTokenByAddressInCurrency: jest.fn(),
10
+ },
11
+ }));
12
+
13
+ import { legacyCryptoAssetsStore } from "./legacy/legacy-store";
14
+
15
+ // Mock token data
16
+ const mockToken: TokenCurrency = {
17
+ type: "TokenCurrency",
18
+ id: "ethereum/erc20/usd_coin",
19
+ ledgerSignature: "3045022100...",
20
+ contractAddress: "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
21
+ parentCurrency: {
22
+ type: "CryptoCurrency",
23
+ id: "ethereum",
24
+ name: "Ethereum",
25
+ ticker: "ETH",
26
+ units: [],
27
+ family: "ethereum",
28
+ managerAppName: "Ethereum",
29
+ coinType: 60,
30
+ scheme: "ethereum",
31
+ color: "#627EEA",
32
+ explorerViews: [],
33
+ },
34
+ tokenType: "erc20",
35
+ name: "USD Coin",
36
+ ticker: "USDC",
37
+ units: [
38
+ {
39
+ code: "USDC",
40
+ name: "USD Coin",
41
+ magnitude: 6,
42
+ },
43
+ ],
44
+ };
45
+
46
+ // Setup mock implementations
47
+ const mockFindTokenById = legacyCryptoAssetsStore.findTokenById as jest.MockedFunction<
48
+ typeof legacyCryptoAssetsStore.findTokenById
49
+ >;
50
+ const mockFindTokenByAddressInCurrency =
51
+ legacyCryptoAssetsStore.findTokenByAddressInCurrency as jest.MockedFunction<
52
+ typeof legacyCryptoAssetsStore.findTokenByAddressInCurrency
53
+ >;
54
+
55
+ beforeEach(() => {
56
+ jest.clearAllMocks();
57
+
58
+ // Default mock implementations
59
+ mockFindTokenById.mockImplementation((id: string) => {
60
+ if (id === "ethereum/erc20/usd_coin") {
61
+ return mockToken;
62
+ }
63
+ return undefined;
64
+ });
65
+
66
+ mockFindTokenByAddressInCurrency.mockImplementation((address: string, currencyId: string) => {
67
+ if (address === "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4" && currencyId === "ethereum") {
68
+ return mockToken;
69
+ }
70
+ return undefined;
71
+ });
72
+ });
73
+
74
+ describe("Hooks Factory", () => {
75
+ it("should return legacy hooks when useCALBackend is false", () => {
76
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
77
+
78
+ expect(hooks.useTokenById).toBeDefined();
79
+ expect(hooks.useTokenByAddressInCurrency).toBeDefined();
80
+ expect(hooks.useTokenById).toBeInstanceOf(Function);
81
+ expect(hooks.useTokenByAddressInCurrency).toBeInstanceOf(Function);
82
+ });
83
+
84
+ it("should throw an error when useCALBackend is true", () => {
85
+ // @ts-expect-error useCALBackend is not supported yet
86
+ expect(() => createCryptoAssetsHooks({ useCALBackend: true })).toThrow();
87
+ });
88
+ });
89
+
90
+ describe("Legacy hooks", () => {
91
+ describe("useTokenById", () => {
92
+ it("should start with loading state and then return token", async () => {
93
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
94
+ const { result } = renderHook(() => hooks.useTokenById("ethereum/erc20/usd_coin"));
95
+
96
+ // Initial loading state
97
+ expect(result.current.loading).toBe(true);
98
+ expect(result.current.token).toBeUndefined();
99
+ expect(result.current.error).toBeUndefined();
100
+
101
+ // Wait for the async operation to complete
102
+ await waitFor(() => {
103
+ expect(result.current.loading).toBe(false);
104
+ });
105
+
106
+ // Settled state with token
107
+ expect(result.current.token).toBe(mockToken);
108
+ expect(result.current.error).toBeUndefined();
109
+ });
110
+
111
+ it("should handle empty id parameter", async () => {
112
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
113
+ const { result } = renderHook(() => hooks.useTokenById(""));
114
+
115
+ // Should immediately settle with no token
116
+ expect(result.current.loading).toBe(false);
117
+ expect(result.current.token).toBeUndefined();
118
+ expect(result.current.error).toBeUndefined();
119
+ });
120
+
121
+ it("should handle non-existent token id", async () => {
122
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
123
+ const { result } = renderHook(() => hooks.useTokenById("non-existent-token"));
124
+
125
+ // Initial loading state
126
+ expect(result.current.loading).toBe(true);
127
+
128
+ // Wait for the async operation to complete
129
+ await waitFor(() => {
130
+ expect(result.current.loading).toBe(false);
131
+ });
132
+
133
+ // Settled state with no token (but no error since the store returns undefined)
134
+ expect(result.current.token).toBeUndefined();
135
+ expect(result.current.error).toBeUndefined();
136
+ });
137
+
138
+ it("should re-run when id changes", async () => {
139
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
140
+ const { result, rerender } = renderHook(({ id }) => hooks.useTokenById(id), {
141
+ initialProps: { id: "ethereum/erc20/usd_coin" },
142
+ });
143
+
144
+ // Wait for first token to load
145
+ await waitFor(() => {
146
+ expect(result.current.loading).toBe(false);
147
+ expect(result.current.token).toBe(mockToken);
148
+ });
149
+
150
+ // Change the id
151
+ rerender({ id: "different-token" });
152
+
153
+ // Should start loading again and reset token
154
+ expect(result.current.loading).toBe(true);
155
+
156
+ // Wait for the token to be reset
157
+ await waitFor(() => {
158
+ expect(result.current.token).toBeUndefined();
159
+ });
160
+
161
+ // Wait for new search to complete
162
+ await waitFor(() => {
163
+ expect(result.current.loading).toBe(false);
164
+ });
165
+
166
+ // Should have no token for the new id
167
+ expect(result.current.token).toBeUndefined();
168
+ });
169
+ });
170
+
171
+ describe("useTokenByAddressInCurrency", () => {
172
+ it("should start with loading state and then return token", async () => {
173
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
174
+ const { result } = renderHook(() =>
175
+ hooks.useTokenByAddressInCurrency(
176
+ "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
177
+ "ethereum",
178
+ ),
179
+ );
180
+
181
+ // Initial loading state
182
+ expect(result.current.loading).toBe(true);
183
+ expect(result.current.token).toBeUndefined();
184
+ expect(result.current.error).toBeUndefined();
185
+
186
+ // Wait for the async operation to complete
187
+ await waitFor(() => {
188
+ expect(result.current.loading).toBe(false);
189
+ });
190
+
191
+ // Settled state with token
192
+ expect(result.current.token).toBe(mockToken);
193
+ expect(result.current.error).toBeUndefined();
194
+ });
195
+
196
+ it("should handle empty address parameter", async () => {
197
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
198
+ const { result } = renderHook(() => hooks.useTokenByAddressInCurrency("", "ethereum"));
199
+
200
+ // Should immediately settle with no token
201
+ expect(result.current.loading).toBe(false);
202
+ expect(result.current.token).toBeUndefined();
203
+ expect(result.current.error).toBeUndefined();
204
+ });
205
+
206
+ it("should handle empty currencyId parameter", async () => {
207
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
208
+ const { result } = renderHook(() =>
209
+ hooks.useTokenByAddressInCurrency("0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4", ""),
210
+ );
211
+
212
+ // Should immediately settle with no token
213
+ expect(result.current.loading).toBe(false);
214
+ expect(result.current.token).toBeUndefined();
215
+ expect(result.current.error).toBeUndefined();
216
+ });
217
+
218
+ it("should handle non-existent token address", async () => {
219
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
220
+ const { result } = renderHook(() =>
221
+ hooks.useTokenByAddressInCurrency("0xNonExistentAddress", "ethereum"),
222
+ );
223
+
224
+ // Initial loading state
225
+ expect(result.current.loading).toBe(true);
226
+
227
+ // Wait for the async operation to complete
228
+ await waitFor(() => {
229
+ expect(result.current.loading).toBe(false);
230
+ });
231
+
232
+ // Settled state with no token (but no error since the store returns undefined)
233
+ expect(result.current.token).toBeUndefined();
234
+ expect(result.current.error).toBeUndefined();
235
+ });
236
+
237
+ it("should re-run when address or currencyId changes", async () => {
238
+ const hooks = createCryptoAssetsHooks({ useCALBackend: false });
239
+ const { result, rerender } = renderHook(
240
+ ({ address, currencyId }) => hooks.useTokenByAddressInCurrency(address, currencyId),
241
+ {
242
+ initialProps: {
243
+ address: "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
244
+ currencyId: "ethereum",
245
+ },
246
+ },
247
+ );
248
+
249
+ // Wait for first token to load
250
+ await waitFor(() => {
251
+ expect(result.current.loading).toBe(false);
252
+ expect(result.current.token).toBe(mockToken);
253
+ });
254
+
255
+ // Change the address
256
+ rerender({
257
+ address: "0xDifferentAddress",
258
+ currencyId: "ethereum",
259
+ });
260
+
261
+ // Should start loading again and reset token
262
+ expect(result.current.loading).toBe(true);
263
+
264
+ // Wait for the token to be reset
265
+ await waitFor(() => {
266
+ expect(result.current.token).toBeUndefined();
267
+ });
268
+
269
+ // Wait for new search to complete
270
+ await waitFor(() => {
271
+ expect(result.current.loading).toBe(false);
272
+ });
273
+
274
+ // Should have no token for the new address
275
+ expect(result.current.token).toBeUndefined();
276
+ });
277
+ });
278
+ });