@ledgerhq/cryptoassets 13.31.0-nightly.6 → 13.31.0-nightly.8
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/.unimportedrc.json +1 -0
- package/CHANGELOG.md +27 -0
- package/jest.config.ts +1 -0
- package/lib/api-asset-converter.d.ts.map +1 -1
- package/lib/api-asset-converter.js +31 -1
- package/lib/api-asset-converter.js.map +1 -1
- package/lib/hooks.d.ts +27 -0
- package/lib/hooks.d.ts.map +1 -0
- package/lib/hooks.js +115 -0
- package/lib/hooks.js.map +1 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib-es/api-asset-converter.d.ts.map +1 -1
- package/lib-es/api-asset-converter.js +31 -1
- package/lib-es/api-asset-converter.js.map +1 -1
- package/lib-es/hooks.d.ts +27 -0
- package/lib-es/hooks.d.ts.map +1 -0
- package/lib-es/hooks.js +111 -0
- package/lib-es/hooks.js.map +1 -0
- package/lib-es/index.d.ts +0 -1
- package/lib-es/index.d.ts.map +1 -1
- package/lib-es/index.js +0 -1
- package/lib-es/index.js.map +1 -1
- package/package.json +17 -4
- package/src/api-asset-converter.test.ts +22 -5
- package/src/api-asset-converter.ts +32 -1
- package/src/hooks.test.ts +411 -0
- package/src/hooks.ts +147 -0
- package/src/index.ts +0 -1
- package/lib/api-asset-converter.test.d.ts +0 -2
- package/lib/api-asset-converter.test.d.ts.map +0 -1
- package/lib/api-asset-converter.test.js +0 -240
- package/lib/api-asset-converter.test.js.map +0 -1
- package/lib/api-token-converter.test.d.ts +0 -2
- package/lib/api-token-converter.test.d.ts.map +0 -1
- package/lib/api-token-converter.test.js +0 -316
- package/lib/api-token-converter.test.js.map +0 -1
- package/lib/backtest-tokenTypes.test.d.ts +0 -2
- package/lib/backtest-tokenTypes.test.d.ts.map +0 -1
- package/lib/backtest-tokenTypes.test.js +0 -31
- package/lib/backtest-tokenTypes.test.js.map +0 -1
- package/lib/crypto-assets-importer/fetch/fetch.test.d.ts +0 -2
- package/lib/crypto-assets-importer/fetch/fetch.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/fetch/fetch.test.js +0 -28
- package/lib/crypto-assets-importer/fetch/fetch.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/apt/aptos.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/apt/aptos.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/apt/aptos.test.js +0 -69
- package/lib/crypto-assets-importer/importers/apt/aptos.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/asa/asa.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/asa/asa.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/asa/asa.test.js +0 -63
- package/lib/crypto-assets-importer/importers/asa/asa.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js +0 -74
- package/lib/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/eip712/eip712.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/eip712/eip712.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/eip712/eip712.test.js +0 -45
- package/lib/crypto-assets-importer/importers/eip712/eip712.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/esdt/esdt.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/esdt/esdt.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/esdt/esdt.test.js +0 -65
- package/lib/crypto-assets-importer/importers/esdt/esdt.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/evm/evm.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/evm/evm.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/evm/evm.test.js +0 -62
- package/lib/crypto-assets-importer/importers/evm/evm.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js +0 -66
- package/lib/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/hedera/hedera.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/hedera/hedera.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/hedera/hedera.test.js +0 -64
- package/lib/crypto-assets-importer/importers/hedera/hedera.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/spl/spl.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/spl/spl.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/spl/spl.test.js +0 -73
- package/lib/crypto-assets-importer/importers/spl/spl.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/stellar/stellar.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/stellar/stellar.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/stellar/stellar.test.js +0 -56
- package/lib/crypto-assets-importer/importers/stellar/stellar.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/sui/sui.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/sui/sui.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/sui/sui.test.js +0 -74
- package/lib/crypto-assets-importer/importers/sui/sui.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.js +0 -59
- package/lib/crypto-assets-importer/importers/ton/ton-jetton.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/trc20/trc20.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/trc20/trc20.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/trc20/trc20.test.js +0 -71
- package/lib/crypto-assets-importer/importers/trc20/trc20.test.js.map +0 -1
- package/lib/crypto-assets-importer/importers/vip180/vip180.test.d.ts +0 -2
- package/lib/crypto-assets-importer/importers/vip180/vip180.test.d.ts.map +0 -1
- package/lib/crypto-assets-importer/importers/vip180/vip180.test.js +0 -64
- package/lib/crypto-assets-importer/importers/vip180/vip180.test.js.map +0 -1
- package/lib/currencies.test.d.ts +0 -2
- package/lib/currencies.test.d.ts.map +0 -1
- package/lib/currencies.test.js +0 -230
- package/lib/currencies.test.js.map +0 -1
- package/lib/data/exchange/bep20-hash.json +0 -1
- package/lib/data/exchange/bep20.d.ts +0 -5
- package/lib/data/exchange/bep20.d.ts.map +0 -1
- package/lib/data/exchange/bep20.js +0 -11
- package/lib/data/exchange/bep20.js.map +0 -1
- package/lib/data/exchange/bep20.json +0 -1
- package/lib/data/exchange/coin-hash.json +0 -1
- package/lib/data/exchange/coins.d.ts +0 -5
- package/lib/data/exchange/coins.d.ts.map +0 -1
- package/lib/data/exchange/coins.js +0 -11
- package/lib/data/exchange/coins.js.map +0 -1
- package/lib/data/exchange/coins.json +0 -1
- package/lib/data/exchange/erc20-hash.json +0 -1
- package/lib/data/exchange/erc20.d.ts +0 -5
- package/lib/data/exchange/erc20.d.ts.map +0 -1
- package/lib/data/exchange/erc20.js +0 -11
- package/lib/data/exchange/erc20.js.map +0 -1
- package/lib/data/exchange/erc20.json +0 -1
- package/lib/data/exchange/polygon-erc20-hash.json +0 -1
- package/lib/data/exchange/polygon-erc20.d.ts +0 -5
- package/lib/data/exchange/polygon-erc20.d.ts.map +0 -1
- package/lib/data/exchange/polygon-erc20.js +0 -11
- package/lib/data/exchange/polygon-erc20.js.map +0 -1
- package/lib/data/exchange/polygon-erc20.json +0 -1
- package/lib/data/exchange/trc20-hash.json +0 -1
- package/lib/data/exchange/trc20.d.ts +0 -5
- package/lib/data/exchange/trc20.d.ts.map +0 -1
- package/lib/data/exchange/trc20.js +0 -11
- package/lib/data/exchange/trc20.js.map +0 -1
- package/lib/data/exchange/trc20.json +0 -1
- package/lib/exchange.d.ts +0 -8
- package/lib/exchange.d.ts.map +0 -1
- package/lib/exchange.js +0 -25
- package/lib/exchange.js.map +0 -1
- package/lib/legacy/legacy.test.d.ts +0 -2
- package/lib/legacy/legacy.test.d.ts.map +0 -1
- package/lib/legacy/legacy.test.js +0 -466
- package/lib/legacy/legacy.test.js.map +0 -1
- package/lib/tokens.test.d.ts +0 -2
- package/lib/tokens.test.d.ts.map +0 -1
- package/lib/tokens.test.js +0 -118
- package/lib/tokens.test.js.map +0 -1
- package/lib-es/api-asset-converter.test.d.ts +0 -2
- package/lib-es/api-asset-converter.test.d.ts.map +0 -1
- package/lib-es/api-asset-converter.test.js +0 -238
- package/lib-es/api-asset-converter.test.js.map +0 -1
- package/lib-es/api-token-converter.test.d.ts +0 -2
- package/lib-es/api-token-converter.test.d.ts.map +0 -1
- package/lib-es/api-token-converter.test.js +0 -314
- package/lib-es/api-token-converter.test.js.map +0 -1
- package/lib-es/backtest-tokenTypes.test.d.ts +0 -2
- package/lib-es/backtest-tokenTypes.test.d.ts.map +0 -1
- package/lib-es/backtest-tokenTypes.test.js +0 -29
- package/lib-es/backtest-tokenTypes.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/fetch/fetch.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/fetch/fetch.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/fetch/fetch.test.js +0 -23
- package/lib-es/crypto-assets-importer/fetch/fetch.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/apt/aptos.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/apt/aptos.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/apt/aptos.test.js +0 -64
- package/lib-es/crypto-assets-importer/importers/apt/aptos.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/asa/asa.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/asa/asa.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/asa/asa.test.js +0 -58
- package/lib-es/crypto-assets-importer/importers/asa/asa.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js +0 -69
- package/lib-es/crypto-assets-importer/importers/cardanoNative/cardanoNative.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.js +0 -40
- package/lib-es/crypto-assets-importer/importers/eip712/eip712.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.js +0 -60
- package/lib-es/crypto-assets-importer/importers/esdt/esdt.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/evm/evm.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/evm/evm.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/evm/evm.test.js +0 -57
- package/lib-es/crypto-assets-importer/importers/evm/evm.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js +0 -61
- package/lib-es/crypto-assets-importer/importers/filecoin/filecoin-erc20.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.js +0 -59
- package/lib-es/crypto-assets-importer/importers/hedera/hedera.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/spl/spl.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/spl/spl.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/spl/spl.test.js +0 -68
- package/lib-es/crypto-assets-importer/importers/spl/spl.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.js +0 -51
- package/lib-es/crypto-assets-importer/importers/stellar/stellar.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/sui/sui.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/sui/sui.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/sui/sui.test.js +0 -69
- package/lib-es/crypto-assets-importer/importers/sui/sui.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.js +0 -54
- package/lib-es/crypto-assets-importer/importers/ton/ton-jetton.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.js +0 -66
- package/lib-es/crypto-assets-importer/importers/trc20/trc20.test.js.map +0 -1
- package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.d.ts +0 -2
- package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.d.ts.map +0 -1
- package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.js +0 -59
- package/lib-es/crypto-assets-importer/importers/vip180/vip180.test.js.map +0 -1
- package/lib-es/currencies.test.d.ts +0 -2
- package/lib-es/currencies.test.d.ts.map +0 -1
- package/lib-es/currencies.test.js +0 -228
- package/lib-es/currencies.test.js.map +0 -1
- package/lib-es/data/exchange/bep20-hash.json +0 -1
- package/lib-es/data/exchange/bep20.d.ts +0 -5
- package/lib-es/data/exchange/bep20.d.ts.map +0 -1
- package/lib-es/data/exchange/bep20.js +0 -4
- package/lib-es/data/exchange/bep20.js.map +0 -1
- package/lib-es/data/exchange/bep20.json +0 -1
- package/lib-es/data/exchange/coin-hash.json +0 -1
- package/lib-es/data/exchange/coins.d.ts +0 -5
- package/lib-es/data/exchange/coins.d.ts.map +0 -1
- package/lib-es/data/exchange/coins.js +0 -4
- package/lib-es/data/exchange/coins.js.map +0 -1
- package/lib-es/data/exchange/coins.json +0 -1
- package/lib-es/data/exchange/erc20-hash.json +0 -1
- package/lib-es/data/exchange/erc20.d.ts +0 -5
- package/lib-es/data/exchange/erc20.d.ts.map +0 -1
- package/lib-es/data/exchange/erc20.js +0 -4
- package/lib-es/data/exchange/erc20.js.map +0 -1
- package/lib-es/data/exchange/erc20.json +0 -1
- package/lib-es/data/exchange/polygon-erc20-hash.json +0 -1
- package/lib-es/data/exchange/polygon-erc20.d.ts +0 -5
- package/lib-es/data/exchange/polygon-erc20.d.ts.map +0 -1
- package/lib-es/data/exchange/polygon-erc20.js +0 -4
- package/lib-es/data/exchange/polygon-erc20.js.map +0 -1
- package/lib-es/data/exchange/polygon-erc20.json +0 -1
- package/lib-es/data/exchange/trc20-hash.json +0 -1
- package/lib-es/data/exchange/trc20.d.ts +0 -5
- package/lib-es/data/exchange/trc20.d.ts.map +0 -1
- package/lib-es/data/exchange/trc20.js +0 -4
- package/lib-es/data/exchange/trc20.js.map +0 -1
- package/lib-es/data/exchange/trc20.json +0 -1
- package/lib-es/exchange.d.ts +0 -8
- package/lib-es/exchange.d.ts.map +0 -1
- package/lib-es/exchange.js +0 -18
- package/lib-es/exchange.js.map +0 -1
- package/lib-es/legacy/legacy.test.d.ts +0 -2
- package/lib-es/legacy/legacy.test.d.ts.map +0 -1
- package/lib-es/legacy/legacy.test.js +0 -464
- package/lib-es/legacy/legacy.test.js.map +0 -1
- package/lib-es/tokens.test.d.ts +0 -2
- package/lib-es/tokens.test.d.ts.map +0 -1
- package/lib-es/tokens.test.js +0 -116
- package/lib-es/tokens.test.js.map +0 -1
- package/src/data/exchange/bep20-hash.json +0 -1
- package/src/data/exchange/bep20.json +0 -1
- package/src/data/exchange/bep20.ts +0 -7
- package/src/data/exchange/coin-hash.json +0 -1
- package/src/data/exchange/coins.json +0 -1
- package/src/data/exchange/coins.ts +0 -7
- package/src/data/exchange/erc20-hash.json +0 -1
- package/src/data/exchange/erc20.json +0 -1
- package/src/data/exchange/erc20.ts +0 -7
- package/src/data/exchange/polygon-erc20-hash.json +0 -1
- package/src/data/exchange/polygon-erc20.json +0 -1
- package/src/data/exchange/polygon-erc20.ts +0 -7
- package/src/data/exchange/trc20-hash.json +0 -1
- package/src/data/exchange/trc20.json +0 -1
- package/src/data/exchange/trc20.ts +0 -7
- package/src/exchange.ts +0 -29
|
@@ -29,7 +29,7 @@ describe("convertApiAsset", () => {
|
|
|
29
29
|
expect(result?.ticker).toBe("BTC");
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
it("should
|
|
32
|
+
it("should create dynamic crypto currency for unknown crypto currency", () => {
|
|
33
33
|
const apiCrypto: ApiCryptoCurrency = {
|
|
34
34
|
type: "crypto_currency",
|
|
35
35
|
id: "nonexistent_coin",
|
|
@@ -40,7 +40,20 @@ describe("convertApiAsset", () => {
|
|
|
40
40
|
|
|
41
41
|
const result = convertApiAsset(apiCrypto);
|
|
42
42
|
|
|
43
|
-
expect(result).
|
|
43
|
+
expect(result).toBeDefined();
|
|
44
|
+
expect(result?.type).toBe("CryptoCurrency");
|
|
45
|
+
expect(result?.id).toBe("nonexistent_coin");
|
|
46
|
+
expect(result?.name).toBe("Nonexistent Coin");
|
|
47
|
+
expect(result?.ticker).toBe("NONE");
|
|
48
|
+
// Check default/placeholder values
|
|
49
|
+
if (result?.type === "CryptoCurrency") {
|
|
50
|
+
expect(result.managerAppName).toBe("Nonexistent Coin");
|
|
51
|
+
expect(result.coinType).toBe(0);
|
|
52
|
+
expect(result.scheme).toBe("nonexistent_coin");
|
|
53
|
+
expect(result.color).toBe("#999999");
|
|
54
|
+
expect(result.family).toBe("nonexistent_coin");
|
|
55
|
+
expect(result.explorerViews).toEqual([]);
|
|
56
|
+
}
|
|
44
57
|
});
|
|
45
58
|
|
|
46
59
|
it("should handle crypto currency with all optional fields", () => {
|
|
@@ -193,7 +206,7 @@ describe("convertApiAssets", () => {
|
|
|
193
206
|
expect(result.eth?.id).toBe("ethereum");
|
|
194
207
|
});
|
|
195
208
|
|
|
196
|
-
it("should
|
|
209
|
+
it("should convert known crypto and create dynamic crypto, but skip unsupported tokens", () => {
|
|
197
210
|
const apiAssets: Record<string, ApiAsset> = {
|
|
198
211
|
valid: {
|
|
199
212
|
type: "crypto_currency",
|
|
@@ -222,9 +235,13 @@ describe("convertApiAssets", () => {
|
|
|
222
235
|
|
|
223
236
|
const result = convertApiAssets(apiAssets);
|
|
224
237
|
|
|
225
|
-
|
|
238
|
+
// Now converts both known and unknown cryptocurrencies, but skips unsupported tokens
|
|
239
|
+
expect(Object.keys(result)).toHaveLength(2);
|
|
226
240
|
expect(result.valid).toBeDefined();
|
|
227
|
-
expect(result.
|
|
241
|
+
expect(result.valid?.id).toBe("bitcoin");
|
|
242
|
+
expect(result.invalid_crypto).toBeDefined();
|
|
243
|
+
expect(result.invalid_crypto?.type).toBe("CryptoCurrency");
|
|
244
|
+
expect(result.invalid_crypto?.id).toBe("nonexistent");
|
|
228
245
|
expect(result.invalid_token).toBeUndefined();
|
|
229
246
|
});
|
|
230
247
|
|
|
@@ -47,7 +47,38 @@ export function convertApiAsset(apiAsset: ApiAsset): CryptoOrTokenCurrency | und
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function convertApiCryptoCurrency(apiCrypto: ApiCryptoCurrency): CryptoOrTokenCurrency | undefined {
|
|
50
|
-
|
|
50
|
+
const localCrypto = findCryptoCurrencyById(apiCrypto.id);
|
|
51
|
+
if (localCrypto) {
|
|
52
|
+
return localCrypto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Create a dynamic CryptoCurrency object with placeholders for fields we can't infer
|
|
56
|
+
return {
|
|
57
|
+
type: "CryptoCurrency" as const,
|
|
58
|
+
id: apiCrypto.id,
|
|
59
|
+
name: apiCrypto.name,
|
|
60
|
+
ticker: apiCrypto.ticker,
|
|
61
|
+
units: apiCrypto.units.map(unit => ({
|
|
62
|
+
name: unit.name,
|
|
63
|
+
code: unit.code,
|
|
64
|
+
magnitude: unit.magnitude,
|
|
65
|
+
})),
|
|
66
|
+
// Required fields with placeholders when not available in API
|
|
67
|
+
managerAppName: apiCrypto.name, // Placeholder: use name as fallback
|
|
68
|
+
coinType: apiCrypto.coinType ?? 0, // Placeholder: default to 0 if not provided
|
|
69
|
+
scheme: apiCrypto.id.toLowerCase(), // Placeholder: use lowercase ticker
|
|
70
|
+
color: "#999999", // Placeholder: default gray color
|
|
71
|
+
family: apiCrypto.family ?? apiCrypto.id, // Placeholder: default to "unknown" if not provided
|
|
72
|
+
explorerViews: [], // Placeholder: empty array
|
|
73
|
+
// Optional fields from API
|
|
74
|
+
symbol: apiCrypto.symbol,
|
|
75
|
+
disableCountervalue: apiCrypto.disableCountervalue,
|
|
76
|
+
supportsSegwit: apiCrypto.hasSegwit,
|
|
77
|
+
// Add ethereumLikeInfo if chainId is present
|
|
78
|
+
...(apiCrypto.chainId && {
|
|
79
|
+
ethereumLikeInfo: { chainId: parseInt(apiCrypto.chainId, 10) },
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
51
82
|
}
|
|
52
83
|
|
|
53
84
|
function convertApiTokenCurrency(apiToken: ApiTokenCurrency): CryptoOrTokenCurrency | undefined {
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { renderHook, waitFor } from "@testing-library/react";
|
|
2
|
+
import { createCryptoAssetsHooks } from "./hooks";
|
|
3
|
+
import type { TokenCurrency, CryptoCurrency } 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
|
+
// Mock the currencies module
|
|
14
|
+
jest.mock("./currencies", () => ({
|
|
15
|
+
findCryptoCurrencyById: jest.fn(),
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
import { legacyCryptoAssetsStore } from "./legacy/legacy-store";
|
|
19
|
+
import { findCryptoCurrencyById } from "./currencies";
|
|
20
|
+
|
|
21
|
+
// Mock crypto currency data
|
|
22
|
+
const mockCryptoCurrency: CryptoCurrency = {
|
|
23
|
+
type: "CryptoCurrency",
|
|
24
|
+
id: "bitcoin",
|
|
25
|
+
name: "Bitcoin",
|
|
26
|
+
ticker: "BTC",
|
|
27
|
+
units: [
|
|
28
|
+
{
|
|
29
|
+
code: "BTC",
|
|
30
|
+
name: "Bitcoin",
|
|
31
|
+
magnitude: 8,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
family: "bitcoin",
|
|
35
|
+
managerAppName: "Bitcoin",
|
|
36
|
+
coinType: 0,
|
|
37
|
+
scheme: "bitcoin",
|
|
38
|
+
color: "#FF9900",
|
|
39
|
+
explorerViews: [],
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Mock token data
|
|
43
|
+
const mockToken: TokenCurrency = {
|
|
44
|
+
type: "TokenCurrency",
|
|
45
|
+
id: "ethereum/erc20/usd_coin",
|
|
46
|
+
ledgerSignature: "3045022100...",
|
|
47
|
+
contractAddress: "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
|
|
48
|
+
parentCurrency: {
|
|
49
|
+
type: "CryptoCurrency",
|
|
50
|
+
id: "ethereum",
|
|
51
|
+
name: "Ethereum",
|
|
52
|
+
ticker: "ETH",
|
|
53
|
+
units: [],
|
|
54
|
+
family: "ethereum",
|
|
55
|
+
managerAppName: "Ethereum",
|
|
56
|
+
coinType: 60,
|
|
57
|
+
scheme: "ethereum",
|
|
58
|
+
color: "#627EEA",
|
|
59
|
+
explorerViews: [],
|
|
60
|
+
},
|
|
61
|
+
tokenType: "erc20",
|
|
62
|
+
name: "USD Coin",
|
|
63
|
+
ticker: "USDC",
|
|
64
|
+
units: [
|
|
65
|
+
{
|
|
66
|
+
code: "USDC",
|
|
67
|
+
name: "USD Coin",
|
|
68
|
+
magnitude: 6,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Setup mock implementations
|
|
74
|
+
const mockFindTokenById = legacyCryptoAssetsStore.findTokenById as jest.MockedFunction<
|
|
75
|
+
typeof legacyCryptoAssetsStore.findTokenById
|
|
76
|
+
>;
|
|
77
|
+
const mockFindTokenByAddressInCurrency =
|
|
78
|
+
legacyCryptoAssetsStore.findTokenByAddressInCurrency as jest.MockedFunction<
|
|
79
|
+
typeof legacyCryptoAssetsStore.findTokenByAddressInCurrency
|
|
80
|
+
>;
|
|
81
|
+
const mockFindCryptoCurrencyById = findCryptoCurrencyById as jest.MockedFunction<
|
|
82
|
+
typeof findCryptoCurrencyById
|
|
83
|
+
>;
|
|
84
|
+
|
|
85
|
+
beforeEach(() => {
|
|
86
|
+
jest.clearAllMocks();
|
|
87
|
+
|
|
88
|
+
// Default mock implementations
|
|
89
|
+
mockFindTokenById.mockImplementation((id: string) => {
|
|
90
|
+
if (id === "ethereum/erc20/usd_coin") {
|
|
91
|
+
return mockToken;
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
mockFindTokenByAddressInCurrency.mockImplementation((address: string, currencyId: string) => {
|
|
97
|
+
if (address === "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4" && currencyId === "ethereum") {
|
|
98
|
+
return mockToken;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
mockFindCryptoCurrencyById.mockImplementation((id: string) => {
|
|
104
|
+
if (id === "bitcoin") {
|
|
105
|
+
return mockCryptoCurrency;
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe("Hooks Factory", () => {
|
|
112
|
+
it("should return legacy hooks when useCALBackend is false", () => {
|
|
113
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
114
|
+
|
|
115
|
+
expect(hooks.useTokenById).toBeDefined();
|
|
116
|
+
expect(hooks.useTokenByAddressInCurrency).toBeDefined();
|
|
117
|
+
expect(hooks.useCurrencyById).toBeDefined();
|
|
118
|
+
expect(hooks.useTokenById).toBeInstanceOf(Function);
|
|
119
|
+
expect(hooks.useTokenByAddressInCurrency).toBeInstanceOf(Function);
|
|
120
|
+
expect(hooks.useCurrencyById).toBeInstanceOf(Function);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("should throw an error when useCALBackend is true", () => {
|
|
124
|
+
// @ts-expect-error useCALBackend is not supported yet
|
|
125
|
+
expect(() => createCryptoAssetsHooks({ useCALBackend: true })).toThrow();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe("Legacy hooks", () => {
|
|
130
|
+
describe("useTokenById", () => {
|
|
131
|
+
it("should start with loading state and then return token", async () => {
|
|
132
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
133
|
+
const { result } = renderHook(() => hooks.useTokenById("ethereum/erc20/usd_coin"));
|
|
134
|
+
|
|
135
|
+
// Initial loading state
|
|
136
|
+
expect(result.current.loading).toBe(true);
|
|
137
|
+
expect(result.current.token).toBeUndefined();
|
|
138
|
+
expect(result.current.error).toBeUndefined();
|
|
139
|
+
|
|
140
|
+
// Wait for the async operation to complete
|
|
141
|
+
await waitFor(() => {
|
|
142
|
+
expect(result.current.loading).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Settled state with token
|
|
146
|
+
expect(result.current.token).toBe(mockToken);
|
|
147
|
+
expect(result.current.error).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("should handle empty id parameter", async () => {
|
|
151
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
152
|
+
const { result } = renderHook(() => hooks.useTokenById(""));
|
|
153
|
+
|
|
154
|
+
// Should immediately settle with no token
|
|
155
|
+
expect(result.current.loading).toBe(false);
|
|
156
|
+
expect(result.current.token).toBeUndefined();
|
|
157
|
+
expect(result.current.error).toBeUndefined();
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("should handle non-existent token id", async () => {
|
|
161
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
162
|
+
const { result } = renderHook(() => hooks.useTokenById("non-existent-token"));
|
|
163
|
+
|
|
164
|
+
// Initial loading state
|
|
165
|
+
expect(result.current.loading).toBe(true);
|
|
166
|
+
|
|
167
|
+
// Wait for the async operation to complete
|
|
168
|
+
await waitFor(() => {
|
|
169
|
+
expect(result.current.loading).toBe(false);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Settled state with no token (but no error since the store returns undefined)
|
|
173
|
+
expect(result.current.token).toBeUndefined();
|
|
174
|
+
expect(result.current.error).toBeUndefined();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("should re-run when id changes", async () => {
|
|
178
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
179
|
+
const { result, rerender } = renderHook(({ id }) => hooks.useTokenById(id), {
|
|
180
|
+
initialProps: { id: "ethereum/erc20/usd_coin" },
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Wait for first token to load
|
|
184
|
+
await waitFor(() => {
|
|
185
|
+
expect(result.current.loading).toBe(false);
|
|
186
|
+
expect(result.current.token).toBe(mockToken);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Change the id
|
|
190
|
+
rerender({ id: "different-token" });
|
|
191
|
+
|
|
192
|
+
// Should start loading again and reset token
|
|
193
|
+
expect(result.current.loading).toBe(true);
|
|
194
|
+
|
|
195
|
+
// Wait for the token to be reset
|
|
196
|
+
await waitFor(() => {
|
|
197
|
+
expect(result.current.token).toBeUndefined();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Wait for new search to complete
|
|
201
|
+
await waitFor(() => {
|
|
202
|
+
expect(result.current.loading).toBe(false);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Should have no token for the new id
|
|
206
|
+
expect(result.current.token).toBeUndefined();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
describe("useTokenByAddressInCurrency", () => {
|
|
211
|
+
it("should start with loading state and then return token", async () => {
|
|
212
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
213
|
+
const { result } = renderHook(() =>
|
|
214
|
+
hooks.useTokenByAddressInCurrency(
|
|
215
|
+
"0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
|
|
216
|
+
"ethereum",
|
|
217
|
+
),
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
// Initial loading state
|
|
221
|
+
expect(result.current.loading).toBe(true);
|
|
222
|
+
expect(result.current.token).toBeUndefined();
|
|
223
|
+
expect(result.current.error).toBeUndefined();
|
|
224
|
+
|
|
225
|
+
// Wait for the async operation to complete
|
|
226
|
+
await waitFor(() => {
|
|
227
|
+
expect(result.current.loading).toBe(false);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Settled state with token
|
|
231
|
+
expect(result.current.token).toBe(mockToken);
|
|
232
|
+
expect(result.current.error).toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("should handle empty address parameter", async () => {
|
|
236
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
237
|
+
const { result } = renderHook(() => hooks.useTokenByAddressInCurrency("", "ethereum"));
|
|
238
|
+
|
|
239
|
+
// Should immediately settle with no token
|
|
240
|
+
expect(result.current.loading).toBe(false);
|
|
241
|
+
expect(result.current.token).toBeUndefined();
|
|
242
|
+
expect(result.current.error).toBeUndefined();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("should handle empty currencyId parameter", async () => {
|
|
246
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
247
|
+
const { result } = renderHook(() =>
|
|
248
|
+
hooks.useTokenByAddressInCurrency("0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4", ""),
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// Should immediately settle with no token
|
|
252
|
+
expect(result.current.loading).toBe(false);
|
|
253
|
+
expect(result.current.token).toBeUndefined();
|
|
254
|
+
expect(result.current.error).toBeUndefined();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("should handle non-existent token address", async () => {
|
|
258
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
259
|
+
const { result } = renderHook(() =>
|
|
260
|
+
hooks.useTokenByAddressInCurrency("0xNonExistentAddress", "ethereum"),
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
// Initial loading state
|
|
264
|
+
expect(result.current.loading).toBe(true);
|
|
265
|
+
|
|
266
|
+
// Wait for the async operation to complete
|
|
267
|
+
await waitFor(() => {
|
|
268
|
+
expect(result.current.loading).toBe(false);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Settled state with no token (but no error since the store returns undefined)
|
|
272
|
+
expect(result.current.token).toBeUndefined();
|
|
273
|
+
expect(result.current.error).toBeUndefined();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it("should re-run when address or currencyId changes", async () => {
|
|
277
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
278
|
+
const { result, rerender } = renderHook(
|
|
279
|
+
({ address, currencyId }) => hooks.useTokenByAddressInCurrency(address, currencyId),
|
|
280
|
+
{
|
|
281
|
+
initialProps: {
|
|
282
|
+
address: "0xA0b86a33E6441b8c4C8C0e4b8b8c4C8C0e4b8b8c4",
|
|
283
|
+
currencyId: "ethereum",
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// Wait for first token to load
|
|
289
|
+
await waitFor(() => {
|
|
290
|
+
expect(result.current.loading).toBe(false);
|
|
291
|
+
expect(result.current.token).toBe(mockToken);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Change the address
|
|
295
|
+
rerender({
|
|
296
|
+
address: "0xDifferentAddress",
|
|
297
|
+
currencyId: "ethereum",
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Should start loading again and reset token
|
|
301
|
+
expect(result.current.loading).toBe(true);
|
|
302
|
+
|
|
303
|
+
// Wait for the token to be reset
|
|
304
|
+
await waitFor(() => {
|
|
305
|
+
expect(result.current.token).toBeUndefined();
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// Wait for new search to complete
|
|
309
|
+
await waitFor(() => {
|
|
310
|
+
expect(result.current.loading).toBe(false);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Should have no token for the new address
|
|
314
|
+
expect(result.current.token).toBeUndefined();
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
describe("useCurrencyById", () => {
|
|
319
|
+
it("should return crypto currency when found", async () => {
|
|
320
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
321
|
+
const { result } = renderHook(() => hooks.useCurrencyById("bitcoin"));
|
|
322
|
+
|
|
323
|
+
// Initial loading state
|
|
324
|
+
expect(result.current.loading).toBe(true);
|
|
325
|
+
expect(result.current.currency).toBeUndefined();
|
|
326
|
+
expect(result.current.error).toBeUndefined();
|
|
327
|
+
|
|
328
|
+
// Wait for the async operation to complete
|
|
329
|
+
await waitFor(() => {
|
|
330
|
+
expect(result.current.loading).toBe(false);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// Settled state with crypto currency
|
|
334
|
+
expect(result.current.currency).toBe(mockCryptoCurrency);
|
|
335
|
+
expect(result.current.error).toBeUndefined();
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it("should fallback to token when crypto currency not found", async () => {
|
|
339
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
340
|
+
const { result } = renderHook(() => hooks.useCurrencyById("ethereum/erc20/usd_coin"));
|
|
341
|
+
|
|
342
|
+
// Initial loading state
|
|
343
|
+
expect(result.current.loading).toBe(true);
|
|
344
|
+
|
|
345
|
+
// Wait for the async operation to complete
|
|
346
|
+
await waitFor(() => {
|
|
347
|
+
expect(result.current.loading).toBe(false);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Settled state with token
|
|
351
|
+
expect(result.current.currency).toBe(mockToken);
|
|
352
|
+
expect(result.current.error).toBeUndefined();
|
|
353
|
+
expect(mockFindCryptoCurrencyById).toHaveBeenCalledWith("ethereum/erc20/usd_coin");
|
|
354
|
+
expect(mockFindTokenById).toHaveBeenCalledWith("ethereum/erc20/usd_coin");
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it("should handle empty id parameter", async () => {
|
|
358
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
359
|
+
const { result } = renderHook(() => hooks.useCurrencyById(""));
|
|
360
|
+
|
|
361
|
+
// Should immediately settle with no currency
|
|
362
|
+
expect(result.current.loading).toBe(false);
|
|
363
|
+
expect(result.current.currency).toBeUndefined();
|
|
364
|
+
expect(result.current.error).toBeUndefined();
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it("should handle non-existent currency id", async () => {
|
|
368
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
369
|
+
const { result } = renderHook(() => hooks.useCurrencyById("non-existent"));
|
|
370
|
+
|
|
371
|
+
// Initial loading state
|
|
372
|
+
expect(result.current.loading).toBe(true);
|
|
373
|
+
|
|
374
|
+
// Wait for the async operation to complete
|
|
375
|
+
await waitFor(() => {
|
|
376
|
+
expect(result.current.loading).toBe(false);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
// Settled state with no currency
|
|
380
|
+
expect(result.current.currency).toBeUndefined();
|
|
381
|
+
expect(result.current.error).toBeUndefined();
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it("should re-run when id changes", async () => {
|
|
385
|
+
const hooks = createCryptoAssetsHooks({ useCALBackend: false });
|
|
386
|
+
const { result, rerender } = renderHook(({ id }) => hooks.useCurrencyById(id), {
|
|
387
|
+
initialProps: { id: "bitcoin" },
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Wait for first currency to load
|
|
391
|
+
await waitFor(() => {
|
|
392
|
+
expect(result.current.loading).toBe(false);
|
|
393
|
+
expect(result.current.currency).toBe(mockCryptoCurrency);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
// Change the id to a token
|
|
397
|
+
rerender({ id: "ethereum/erc20/usd_coin" });
|
|
398
|
+
|
|
399
|
+
// Should start loading again
|
|
400
|
+
expect(result.current.loading).toBe(true);
|
|
401
|
+
|
|
402
|
+
// Wait for new search to complete
|
|
403
|
+
await waitFor(() => {
|
|
404
|
+
expect(result.current.loading).toBe(false);
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// Should have token for the new id
|
|
408
|
+
expect(result.current.currency).toBe(mockToken);
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
});
|
package/src/hooks.ts
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
import { legacyCryptoAssetsStore } from "./legacy/legacy-store";
|
|
3
|
+
import type { TokenCurrency, CryptoCurrency } from "@ledgerhq/types-cryptoassets";
|
|
4
|
+
import { findCryptoCurrencyById } from "./currencies";
|
|
5
|
+
|
|
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
|
+
export function createCryptoAssetsHooks(
|
|
12
|
+
config: {
|
|
13
|
+
useCALBackend?: false; // at the moment, we only support legacy
|
|
14
|
+
api?: unknown; // placeholder for the future
|
|
15
|
+
} = {},
|
|
16
|
+
): Hooks {
|
|
17
|
+
if (config.useCALBackend) {
|
|
18
|
+
throw new Error("backend is not supported yet");
|
|
19
|
+
} else {
|
|
20
|
+
return {
|
|
21
|
+
useTokenById: useLegacyTokenById,
|
|
22
|
+
useTokenByAddressInCurrency: useLegacyTokenByAddressInCurrency,
|
|
23
|
+
useCurrencyById: useLegacyCurrencyById,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type TokenResult = {
|
|
29
|
+
token: TokenCurrency | undefined;
|
|
30
|
+
loading: boolean;
|
|
31
|
+
error: unknown;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type CurrencyResult = {
|
|
35
|
+
currency: CryptoCurrency | TokenCurrency | undefined;
|
|
36
|
+
loading: boolean;
|
|
37
|
+
error: unknown;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type Hooks = {
|
|
41
|
+
useTokenById: (id: string) => TokenResult;
|
|
42
|
+
useTokenByAddressInCurrency: (address: string, currencyId: string) => TokenResult;
|
|
43
|
+
useCurrencyById: (id: string) => CurrencyResult;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/////////// Legacy hooks using legacyCryptoAssetsStore ///////////
|
|
47
|
+
|
|
48
|
+
function useLegacyTokenById(id: string) {
|
|
49
|
+
const [token, setToken] = useState<TokenCurrency | undefined>(undefined);
|
|
50
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
51
|
+
const [error, setError] = useState<unknown>(undefined);
|
|
52
|
+
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!id) {
|
|
55
|
+
setToken(undefined);
|
|
56
|
+
setLoading(false);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const fetchToken = async () => {
|
|
61
|
+
try {
|
|
62
|
+
setLoading(true);
|
|
63
|
+
setError(undefined);
|
|
64
|
+
const result = await legacyCryptoAssetsStore.findTokenById(id);
|
|
65
|
+
setToken(result);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
setError(err);
|
|
68
|
+
setToken(undefined);
|
|
69
|
+
} finally {
|
|
70
|
+
setLoading(false);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
fetchToken();
|
|
75
|
+
}, [id]);
|
|
76
|
+
|
|
77
|
+
return { token, loading, error };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function useLegacyTokenByAddressInCurrency(address: string, currencyId: string) {
|
|
81
|
+
const [token, setToken] = useState<TokenCurrency | undefined>(undefined);
|
|
82
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
83
|
+
const [error, setError] = useState<unknown>(undefined);
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (!address || !currencyId) {
|
|
87
|
+
setToken(undefined);
|
|
88
|
+
setLoading(false);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const fetchToken = async () => {
|
|
93
|
+
try {
|
|
94
|
+
setLoading(true);
|
|
95
|
+
setError(undefined);
|
|
96
|
+
const result = await legacyCryptoAssetsStore.findTokenByAddressInCurrency(
|
|
97
|
+
address,
|
|
98
|
+
currencyId,
|
|
99
|
+
);
|
|
100
|
+
setToken(result);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
setError(err);
|
|
103
|
+
setToken(undefined);
|
|
104
|
+
} finally {
|
|
105
|
+
setLoading(false);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
fetchToken();
|
|
110
|
+
}, [address, currencyId]);
|
|
111
|
+
|
|
112
|
+
return { token, loading, error };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function useLegacyCurrencyById(id: string) {
|
|
116
|
+
const [currency, setCurrency] = useState<CryptoCurrency | TokenCurrency | undefined>(undefined);
|
|
117
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
118
|
+
const [error, setError] = useState<unknown>(undefined);
|
|
119
|
+
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (!id) {
|
|
122
|
+
setCurrency(undefined);
|
|
123
|
+
setLoading(false);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const fetchCurrency = async () => {
|
|
128
|
+
try {
|
|
129
|
+
setLoading(true);
|
|
130
|
+
setError(undefined);
|
|
131
|
+
// First try to find as a crypto currency
|
|
132
|
+
const cryptoCurrency = await Promise.resolve(findCryptoCurrencyById(id));
|
|
133
|
+
const result = cryptoCurrency || (await legacyCryptoAssetsStore.findTokenById(id));
|
|
134
|
+
setCurrency(result);
|
|
135
|
+
} catch (err) {
|
|
136
|
+
setError(err);
|
|
137
|
+
setCurrency(undefined);
|
|
138
|
+
} finally {
|
|
139
|
+
setLoading(false);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
fetchCurrency();
|
|
144
|
+
}, [id]);
|
|
145
|
+
|
|
146
|
+
return { currency, loading, error };
|
|
147
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-asset-converter.test.d.ts","sourceRoot":"","sources":["../src/api-asset-converter.test.ts"],"names":[],"mappings":""}
|