@ledgerhq/live-common 34.44.0-nightly.0 → 34.44.0-nightly.1
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/lib/e2e/enum/Currency.js +1 -1
- package/lib/e2e/enum/Currency.js.map +1 -1
- package/lib/e2e/enum/Provider.d.ts +1 -0
- package/lib/e2e/enum/Provider.d.ts.map +1 -1
- package/lib/e2e/enum/Provider.js +1 -0
- package/lib/e2e/enum/Provider.js.map +1 -1
- package/lib/families/canton/bridge.integration.test.d.ts +2 -0
- package/lib/families/canton/bridge.integration.test.d.ts.map +1 -0
- package/lib/families/canton/bridge.integration.test.js +7 -0
- package/lib/families/canton/bridge.integration.test.js.map +1 -0
- package/lib/families/canton/config.d.ts +3 -0
- package/lib/families/canton/config.d.ts.map +1 -0
- package/lib/families/canton/config.js +14 -0
- package/lib/families/canton/config.js.map +1 -0
- package/lib/families/canton/logic.d.ts +2 -0
- package/lib/families/canton/logic.d.ts.map +1 -0
- package/lib/families/canton/logic.js +19 -0
- package/lib/families/canton/logic.js.map +1 -0
- package/lib/families/canton/setup.d.ts +27 -0
- package/lib/families/canton/setup.d.ts.map +1 -0
- package/lib/families/canton/setup.js +27 -0
- package/lib/families/canton/setup.js.map +1 -0
- package/lib/families/canton/types.d.ts +2 -0
- package/lib/families/canton/types.d.ts.map +1 -0
- package/lib/families/canton/types.js +19 -0
- package/lib/families/canton/types.js.map +1 -0
- package/lib/generated/bridge/js.d.ts +1 -0
- package/lib/generated/bridge/js.d.ts.map +1 -1
- package/lib/generated/bridge/js.js +40 -38
- package/lib/generated/bridge/js.js.map +1 -1
- package/lib/generated/cli-transaction.d.ts +20 -0
- package/lib/generated/cli-transaction.d.ts.map +1 -1
- package/lib/generated/cli-transaction.js +42 -40
- package/lib/generated/cli-transaction.js.map +1 -1
- package/lib/generated/deviceTransactionConfig.d.ts +2 -0
- package/lib/generated/deviceTransactionConfig.d.ts.map +1 -1
- package/lib/generated/deviceTransactionConfig.js +38 -36
- package/lib/generated/deviceTransactionConfig.js.map +1 -1
- package/lib/generated/hw-getAddress.d.ts +1 -0
- package/lib/generated/hw-getAddress.d.ts.map +1 -1
- package/lib/generated/hw-getAddress.js +42 -40
- package/lib/generated/hw-getAddress.js.map +1 -1
- package/lib/generated/specs.d.ts +2 -0
- package/lib/generated/specs.d.ts.map +1 -1
- package/lib/generated/specs.js +40 -38
- package/lib/generated/specs.js.map +1 -1
- package/lib/generated/transaction.d.ts +8 -0
- package/lib/generated/transaction.d.ts.map +1 -1
- package/lib/generated/transaction.js +42 -40
- package/lib/generated/transaction.js.map +1 -1
- package/lib/generated/types.d.ts +5 -4
- package/lib/generated/types.d.ts.map +1 -1
- package/lib/modularDrawer/utils/__tests__/currencyUtils.test.d.ts +2 -0
- package/lib/modularDrawer/utils/__tests__/currencyUtils.test.d.ts.map +1 -0
- package/lib/modularDrawer/utils/__tests__/currencyUtils.test.js +100 -0
- package/lib/modularDrawer/utils/__tests__/currencyUtils.test.js.map +1 -0
- package/lib/modularDrawer/utils/currencyUtils.d.ts +10 -0
- package/lib/modularDrawer/utils/currencyUtils.d.ts.map +1 -0
- package/lib/modularDrawer/utils/currencyUtils.js +74 -0
- package/lib/modularDrawer/utils/currencyUtils.js.map +1 -0
- package/lib/modularDrawer/utils/haveOneCommonProvider.d.ts +1 -1
- package/lib/modularDrawer/utils/haveOneCommonProvider.d.ts.map +1 -1
- package/lib-es/e2e/enum/Currency.js +1 -1
- package/lib-es/e2e/enum/Currency.js.map +1 -1
- package/lib-es/e2e/enum/Provider.d.ts +1 -0
- package/lib-es/e2e/enum/Provider.d.ts.map +1 -1
- package/lib-es/e2e/enum/Provider.js +1 -0
- package/lib-es/e2e/enum/Provider.js.map +1 -1
- package/lib-es/families/canton/bridge.integration.test.d.ts +2 -0
- package/lib-es/families/canton/bridge.integration.test.d.ts.map +1 -0
- package/lib-es/families/canton/bridge.integration.test.js +5 -0
- package/lib-es/families/canton/bridge.integration.test.js.map +1 -0
- package/lib-es/families/canton/config.d.ts +3 -0
- package/lib-es/families/canton/config.d.ts.map +1 -0
- package/lib-es/families/canton/config.js +11 -0
- package/lib-es/families/canton/config.js.map +1 -0
- package/lib-es/families/canton/logic.d.ts +2 -0
- package/lib-es/families/canton/logic.d.ts.map +1 -0
- package/lib-es/families/canton/logic.js +3 -0
- package/lib-es/families/canton/logic.js.map +1 -0
- package/lib-es/families/canton/setup.d.ts +27 -0
- package/lib-es/families/canton/setup.d.ts.map +1 -0
- package/lib-es/families/canton/setup.js +19 -0
- package/lib-es/families/canton/setup.js.map +1 -0
- package/lib-es/families/canton/types.d.ts +2 -0
- package/lib-es/families/canton/types.d.ts.map +1 -0
- package/lib-es/families/canton/types.js +3 -0
- package/lib-es/families/canton/types.js.map +1 -0
- package/lib-es/generated/bridge/js.d.ts +1 -0
- package/lib-es/generated/bridge/js.d.ts.map +1 -1
- package/lib-es/generated/bridge/js.js +2 -0
- package/lib-es/generated/bridge/js.js.map +1 -1
- package/lib-es/generated/cli-transaction.d.ts +20 -0
- package/lib-es/generated/cli-transaction.d.ts.map +1 -1
- package/lib-es/generated/cli-transaction.js +2 -0
- package/lib-es/generated/cli-transaction.js.map +1 -1
- package/lib-es/generated/deviceTransactionConfig.d.ts +2 -0
- package/lib-es/generated/deviceTransactionConfig.d.ts.map +1 -1
- package/lib-es/generated/deviceTransactionConfig.js +2 -0
- package/lib-es/generated/deviceTransactionConfig.js.map +1 -1
- package/lib-es/generated/hw-getAddress.d.ts +1 -0
- package/lib-es/generated/hw-getAddress.d.ts.map +1 -1
- package/lib-es/generated/hw-getAddress.js +2 -0
- package/lib-es/generated/hw-getAddress.js.map +1 -1
- package/lib-es/generated/specs.d.ts +2 -0
- package/lib-es/generated/specs.d.ts.map +1 -1
- package/lib-es/generated/specs.js +2 -0
- package/lib-es/generated/specs.js.map +1 -1
- package/lib-es/generated/transaction.d.ts +8 -0
- package/lib-es/generated/transaction.d.ts.map +1 -1
- package/lib-es/generated/transaction.js +2 -0
- package/lib-es/generated/transaction.js.map +1 -1
- package/lib-es/generated/types.d.ts +5 -4
- package/lib-es/generated/types.d.ts.map +1 -1
- package/lib-es/modularDrawer/utils/__tests__/currencyUtils.test.d.ts +2 -0
- package/lib-es/modularDrawer/utils/__tests__/currencyUtils.test.d.ts.map +1 -0
- package/lib-es/modularDrawer/utils/__tests__/currencyUtils.test.js +98 -0
- package/lib-es/modularDrawer/utils/__tests__/currencyUtils.test.js.map +1 -0
- package/lib-es/modularDrawer/utils/currencyUtils.d.ts +10 -0
- package/lib-es/modularDrawer/utils/currencyUtils.d.ts.map +1 -0
- package/lib-es/modularDrawer/utils/currencyUtils.js +65 -0
- package/lib-es/modularDrawer/utils/currencyUtils.js.map +1 -0
- package/lib-es/modularDrawer/utils/haveOneCommonProvider.d.ts +1 -1
- package/lib-es/modularDrawer/utils/haveOneCommonProvider.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/e2e/enum/Currency.ts +1 -1
- package/src/e2e/enum/Provider.ts +1 -0
- package/src/families/canton/bridge.integration.test.ts +6 -0
- package/src/families/canton/config.ts +12 -0
- package/src/families/canton/logic.ts +2 -0
- package/src/families/canton/setup.ts +34 -0
- package/src/families/canton/types.ts +2 -0
- package/src/generated/bridge/js.ts +2 -0
- package/src/generated/cli-transaction.ts +2 -0
- package/src/generated/deviceTransactionConfig.ts +2 -0
- package/src/generated/hw-getAddress.ts +2 -0
- package/src/generated/specs.ts +2 -0
- package/src/generated/transaction.ts +2 -0
- package/src/generated/types.ts +10 -0
- package/src/modularDrawer/utils/__tests__/currencyUtils.test.ts +126 -0
- package/src/modularDrawer/utils/currencyUtils.ts +95 -0
- package/src/modularDrawer/utils/haveOneCommonProvider.ts +1 -1
@@ -3,6 +3,7 @@ import aptos from "@ledgerhq/coin-aptos/transaction";
|
|
3
3
|
import bitcoin from "@ledgerhq/coin-bitcoin/transaction";
|
4
4
|
import cardano from "@ledgerhq/coin-cardano/transaction";
|
5
5
|
import casper from "@ledgerhq/coin-casper/transaction";
|
6
|
+
import canton from "@ledgerhq/coin-canton/transaction";
|
6
7
|
import celo from "@ledgerhq/coin-celo/transaction";
|
7
8
|
import cosmos from "@ledgerhq/coin-cosmos/transaction";
|
8
9
|
import evm from "@ledgerhq/coin-evm/transaction";
|
@@ -30,6 +31,7 @@ export default {
|
|
30
31
|
bitcoin,
|
31
32
|
cardano,
|
32
33
|
casper,
|
34
|
+
canton,
|
33
35
|
celo,
|
34
36
|
cosmos,
|
35
37
|
evm,
|
package/src/generated/types.ts
CHANGED
@@ -16,6 +16,12 @@ import type {
|
|
16
16
|
TransactionStatus as bitcoinTransactionStatus,
|
17
17
|
TransactionStatusRaw as bitcoinTransactionStatusRaw,
|
18
18
|
} from "@ledgerhq/coin-bitcoin/types";
|
19
|
+
import type {
|
20
|
+
Transaction as cantonTransaction,
|
21
|
+
TransactionRaw as cantonTransactionRaw,
|
22
|
+
TransactionStatus as cantonTransactionStatus,
|
23
|
+
TransactionStatusRaw as cantonTransactionStatusRaw,
|
24
|
+
} from "@ledgerhq/coin-canton/types/index";
|
19
25
|
import type {
|
20
26
|
Transaction as cardanoTransaction,
|
21
27
|
TransactionRaw as cardanoTransactionRaw,
|
@@ -153,6 +159,7 @@ export type Transaction =
|
|
153
159
|
| algorandTransaction
|
154
160
|
| aptosTransaction
|
155
161
|
| bitcoinTransaction
|
162
|
+
| cantonTransaction
|
156
163
|
| cardanoTransaction
|
157
164
|
| casperTransaction
|
158
165
|
| celoTransaction
|
@@ -180,6 +187,7 @@ export type TransactionRaw =
|
|
180
187
|
| algorandTransactionRaw
|
181
188
|
| aptosTransactionRaw
|
182
189
|
| bitcoinTransactionRaw
|
190
|
+
| cantonTransactionRaw
|
183
191
|
| cardanoTransactionRaw
|
184
192
|
| casperTransactionRaw
|
185
193
|
| celoTransactionRaw
|
@@ -207,6 +215,7 @@ export type TransactionStatus =
|
|
207
215
|
| algorandTransactionStatus
|
208
216
|
| aptosTransactionStatus
|
209
217
|
| bitcoinTransactionStatus
|
218
|
+
| cantonTransactionStatus
|
210
219
|
| cardanoTransactionStatus
|
211
220
|
| casperTransactionStatus
|
212
221
|
| celoTransactionStatus
|
@@ -234,6 +243,7 @@ export type TransactionStatusRaw =
|
|
234
243
|
| algorandTransactionStatusRaw
|
235
244
|
| aptosTransactionStatusRaw
|
236
245
|
| bitcoinTransactionStatusRaw
|
246
|
+
| cantonTransactionStatusRaw
|
237
247
|
| cardanoTransactionStatusRaw
|
238
248
|
| casperTransactionStatusRaw
|
239
249
|
| celoTransactionStatusRaw
|
@@ -0,0 +1,126 @@
|
|
1
|
+
import { useGroupedCurrenciesByProvider } from "@ledgerhq/live-common/modularDrawer/__mocks__/useGroupedCurrenciesByProvider.mock";
|
2
|
+
import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
|
3
|
+
|
4
|
+
import {
|
5
|
+
buildProviderCoverageMap,
|
6
|
+
extractProviderCurrencies,
|
7
|
+
filterProvidersByIds,
|
8
|
+
getProviderCurrency,
|
9
|
+
isProviderToken,
|
10
|
+
safeCurrencyLookup,
|
11
|
+
} from "../currencyUtils";
|
12
|
+
import {
|
13
|
+
usdcToken,
|
14
|
+
mockBaseCryptoCurrency,
|
15
|
+
mockBtcCryptoCurrency,
|
16
|
+
mockEthCryptoCurrency,
|
17
|
+
} from "../../__mocks__/currencies.mock";
|
18
|
+
|
19
|
+
describe("safeCurrencyLookup", () => {
|
20
|
+
it("should return the currency if it is found", () => {
|
21
|
+
const currency = safeCurrencyLookup("ethereum");
|
22
|
+
expect(currency).toBeDefined();
|
23
|
+
});
|
24
|
+
it("should return null if the currency is not found", () => {
|
25
|
+
const currency = safeCurrencyLookup("not-a-currency");
|
26
|
+
expect(currency).toBeNull();
|
27
|
+
});
|
28
|
+
});
|
29
|
+
|
30
|
+
describe("isProviderToken", () => {
|
31
|
+
it("should return true if the currency is a provider token", () => {
|
32
|
+
const baseToken: TokenCurrency = {
|
33
|
+
type: "TokenCurrency",
|
34
|
+
id: "base/erc20/base",
|
35
|
+
contractAddress: "0x0000000000000000000000000000000000000000",
|
36
|
+
parentCurrency: mockBaseCryptoCurrency,
|
37
|
+
tokenType: "erc20",
|
38
|
+
name: "Base",
|
39
|
+
ticker: "BASE",
|
40
|
+
units: [
|
41
|
+
{
|
42
|
+
name: "Base",
|
43
|
+
code: "BASE",
|
44
|
+
magnitude: 18,
|
45
|
+
},
|
46
|
+
],
|
47
|
+
};
|
48
|
+
const currency = isProviderToken(baseToken, "base");
|
49
|
+
expect(currency).toBe(true);
|
50
|
+
});
|
51
|
+
it("should return false if the currency is not a provider token", () => {
|
52
|
+
const currency = isProviderToken(mockEthCryptoCurrency, "ethereum");
|
53
|
+
expect(currency).toBe(false);
|
54
|
+
});
|
55
|
+
});
|
56
|
+
|
57
|
+
describe("getProviderCurrency", () => {
|
58
|
+
it("should return the currency if it is a provider currency", () => {
|
59
|
+
const { result } = useGroupedCurrenciesByProvider();
|
60
|
+
const currency = getProviderCurrency(result.currenciesByProvider[0]);
|
61
|
+
expect(currency).toEqual(mockBtcCryptoCurrency);
|
62
|
+
});
|
63
|
+
it("should return the currency if it is a provider token", () => {
|
64
|
+
const { result } = useGroupedCurrenciesByProvider();
|
65
|
+
const currency = getProviderCurrency(result.currenciesByProvider[3]);
|
66
|
+
expect(currency).toEqual(usdcToken);
|
67
|
+
});
|
68
|
+
});
|
69
|
+
|
70
|
+
describe("buildProviderCoverageMap", () => {
|
71
|
+
it("should build a map of provider coverage correctly", () => {
|
72
|
+
const { result } = useGroupedCurrenciesByProvider();
|
73
|
+
const coverageMap = buildProviderCoverageMap(result.currenciesByProvider);
|
74
|
+
|
75
|
+
expect(coverageMap).toBeInstanceOf(Map);
|
76
|
+
expect(coverageMap.get("bitcoin")).toEqual(new Set(["bitcoin"]));
|
77
|
+
expect(coverageMap.get("ethereum")).toEqual(new Set(["ethereum"]));
|
78
|
+
expect(coverageMap.get("arbitrum")).toEqual(new Set(["ethereum"]));
|
79
|
+
expect(coverageMap.get("base")).toEqual(new Set(["ethereum"]));
|
80
|
+
expect(coverageMap.get("scroll")).toEqual(new Set(["ethereum"]));
|
81
|
+
expect(coverageMap.get("arbitrum/erc20/arbitrum")).toEqual(new Set(["arbitrum"]));
|
82
|
+
expect(coverageMap.get("ethereum/erc20/usd__coin")).toEqual(new Set(["usd-coin"]));
|
83
|
+
expect(coverageMap.get("injective")).toEqual(new Set(["injective-protocol"]));
|
84
|
+
});
|
85
|
+
it("should handle empty input", () => {
|
86
|
+
const coverageMap = buildProviderCoverageMap([]);
|
87
|
+
expect(coverageMap).toBeInstanceOf(Map);
|
88
|
+
expect(coverageMap.size).toBe(0);
|
89
|
+
});
|
90
|
+
});
|
91
|
+
|
92
|
+
describe("filterProvidersByIds", () => {
|
93
|
+
it("should filter providers by ids correctly #evm", () => {
|
94
|
+
const { result } = useGroupedCurrenciesByProvider();
|
95
|
+
const coverageMap = buildProviderCoverageMap(result.currenciesByProvider);
|
96
|
+
const filteredProviders = filterProvidersByIds(
|
97
|
+
result.currenciesByProvider,
|
98
|
+
new Set(["base"]),
|
99
|
+
coverageMap,
|
100
|
+
);
|
101
|
+
expect(filteredProviders).toHaveLength(1);
|
102
|
+
expect(filteredProviders[0].providerId).toBe("ethereum");
|
103
|
+
});
|
104
|
+
it("should filter providers by ids correctly #bitcoin", () => {
|
105
|
+
const { result } = useGroupedCurrenciesByProvider();
|
106
|
+
const coverageMap = buildProviderCoverageMap(result.currenciesByProvider);
|
107
|
+
const filteredProviders = filterProvidersByIds(
|
108
|
+
result.currenciesByProvider,
|
109
|
+
new Set(["bitcoin"]),
|
110
|
+
coverageMap,
|
111
|
+
);
|
112
|
+
expect(filteredProviders).toHaveLength(1);
|
113
|
+
expect(filteredProviders[0].providerId).toBe("bitcoin");
|
114
|
+
});
|
115
|
+
});
|
116
|
+
|
117
|
+
describe("extractProviderCurrencies", () => {
|
118
|
+
it("should extract provider currencies correctly", () => {
|
119
|
+
const { result } = useGroupedCurrenciesByProvider();
|
120
|
+
const providerCurrencies = extractProviderCurrencies(result.currenciesByProvider);
|
121
|
+
expect(providerCurrencies).toHaveLength(5);
|
122
|
+
expect(providerCurrencies[0]).toEqual(mockBtcCryptoCurrency);
|
123
|
+
expect(providerCurrencies[1].id).toBe("ethereum");
|
124
|
+
expect(providerCurrencies[2].id).toBe("arbitrum/erc20/arbitrum");
|
125
|
+
});
|
126
|
+
});
|
@@ -0,0 +1,95 @@
|
|
1
|
+
import { CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets";
|
2
|
+
import { getTokenOrCryptoCurrencyById } from "../../deposit/helper";
|
3
|
+
import { isTokenCurrency } from "../../currencies";
|
4
|
+
import { CurrenciesByProviderId } from "../../deposit/type";
|
5
|
+
|
6
|
+
export type ProviderCoverageMap = Map<string, Set<string>>;
|
7
|
+
|
8
|
+
export const safeCurrencyLookup = (id: string): CryptoOrTokenCurrency | null => {
|
9
|
+
try {
|
10
|
+
return getTokenOrCryptoCurrencyById(id);
|
11
|
+
} catch {
|
12
|
+
return null;
|
13
|
+
}
|
14
|
+
};
|
15
|
+
|
16
|
+
export const isProviderToken = (currency: CryptoOrTokenCurrency, providerId: string): boolean => {
|
17
|
+
return isTokenCurrency(currency) && currency.id.toLowerCase().includes(providerId.toLowerCase());
|
18
|
+
};
|
19
|
+
|
20
|
+
export const getProviderCurrency = (
|
21
|
+
provider: CurrenciesByProviderId,
|
22
|
+
): CryptoOrTokenCurrency | null => {
|
23
|
+
const providerToken = provider.currenciesByNetwork.find(currency => {
|
24
|
+
return isProviderToken(currency, provider.providerId);
|
25
|
+
});
|
26
|
+
|
27
|
+
if (providerToken) {
|
28
|
+
return providerToken;
|
29
|
+
}
|
30
|
+
|
31
|
+
return safeCurrencyLookup(provider.providerId) ?? provider.currenciesByNetwork[0];
|
32
|
+
};
|
33
|
+
|
34
|
+
export const buildProviderCoverageMap = (
|
35
|
+
providers: CurrenciesByProviderId[],
|
36
|
+
): ProviderCoverageMap => {
|
37
|
+
const providerIdToCoveringProviders = new Map<string, Set<string>>();
|
38
|
+
|
39
|
+
for (const { providerId, currenciesByNetwork } of providers) {
|
40
|
+
for (const { id } of currenciesByNetwork) {
|
41
|
+
if (!providerIdToCoveringProviders.has(id)) {
|
42
|
+
providerIdToCoveringProviders.set(id, new Set());
|
43
|
+
}
|
44
|
+
providerIdToCoveringProviders.get(id)!.add(providerId);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
return providerIdToCoveringProviders;
|
49
|
+
};
|
50
|
+
|
51
|
+
export const filterProvidersByIds = (
|
52
|
+
providers: CurrenciesByProviderId[],
|
53
|
+
currencyIdsSet: Set<string>,
|
54
|
+
providerCoverageMap: ProviderCoverageMap,
|
55
|
+
): CurrenciesByProviderId[] => {
|
56
|
+
const filtered: CurrenciesByProviderId[] = [];
|
57
|
+
|
58
|
+
for (const provider of providers) {
|
59
|
+
const filteredCurrencies = provider.currenciesByNetwork.filter(currency =>
|
60
|
+
currencyIdsSet.has(currency.id),
|
61
|
+
);
|
62
|
+
|
63
|
+
if (filteredCurrencies.length === 0) continue;
|
64
|
+
|
65
|
+
const providerHasOwnCurrency = provider.currenciesByNetwork.some(
|
66
|
+
currency => currency.id === provider.providerId,
|
67
|
+
);
|
68
|
+
|
69
|
+
if (!providerHasOwnCurrency) {
|
70
|
+
const coveringProviders = providerCoverageMap.get(provider.providerId);
|
71
|
+
const isProviderIdCoveredElsewhere = coveringProviders && coveringProviders.size > 1;
|
72
|
+
|
73
|
+
if (isProviderIdCoveredElsewhere) continue;
|
74
|
+
}
|
75
|
+
|
76
|
+
if (filteredCurrencies.length === provider.currenciesByNetwork.length) {
|
77
|
+
filtered.push(provider);
|
78
|
+
} else {
|
79
|
+
filtered.push({
|
80
|
+
...provider,
|
81
|
+
currenciesByNetwork: filteredCurrencies,
|
82
|
+
});
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
return filtered;
|
87
|
+
};
|
88
|
+
|
89
|
+
export const extractProviderCurrencies = (
|
90
|
+
providers: CurrenciesByProviderId[],
|
91
|
+
): CryptoOrTokenCurrency[] => {
|
92
|
+
return providers
|
93
|
+
.map(provider => getProviderCurrency(provider))
|
94
|
+
.filter((currency): currency is CryptoOrTokenCurrency => currency !== null);
|
95
|
+
};
|