@metamask-previews/assets-controllers 96.0.0-preview-a94732c3 → 96.0.0-preview-766f7065
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/CHANGELOG.md +0 -28
- package/dist/TokenListController.cjs +78 -353
- package/dist/TokenListController.cjs.map +1 -1
- package/dist/TokenListController.d.cts +17 -22
- package/dist/TokenListController.d.cts.map +1 -1
- package/dist/TokenListController.d.mts +17 -22
- package/dist/TokenListController.d.mts.map +1 -1
- package/dist/TokenListController.mjs +78 -353
- package/dist/TokenListController.mjs.map +1 -1
- package/dist/TokenRatesController.cjs +1 -8
- package/dist/TokenRatesController.cjs.map +1 -1
- package/dist/TokenRatesController.d.cts +1 -2
- package/dist/TokenRatesController.d.cts.map +1 -1
- package/dist/TokenRatesController.d.mts +1 -2
- package/dist/TokenRatesController.d.mts.map +1 -1
- package/dist/TokenRatesController.mjs +1 -8
- package/dist/TokenRatesController.mjs.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs +53 -3
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts +12 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts +12 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs +53 -3
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.cjs.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.d.cts +1 -12
- package/dist/token-prices-service/abstract-token-prices-service.d.cts.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.d.mts +1 -12
- package/dist/token-prices-service/abstract-token-prices-service.d.mts.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.mjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.cjs +16 -156
- package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.cts +1 -44
- package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.mts +1 -44
- package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
- package/dist/token-prices-service/codefi-v2.mjs +16 -153
- package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
- package/dist/token-prices-service/index.cjs +1 -4
- package/dist/token-prices-service/index.cjs.map +1 -1
- package/dist/token-prices-service/index.d.cts +2 -2
- package/dist/token-prices-service/index.d.cts.map +1 -1
- package/dist/token-prices-service/index.d.mts +2 -2
- package/dist/token-prices-service/index.d.mts.map +1 -1
- package/dist/token-prices-service/index.mjs +1 -1
- package/dist/token-prices-service/index.mjs.map +1 -1
- package/package.json +2 -4
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _TokenSearchDiscoveryDataController_instances, _TokenSearchDiscoveryDataController_abortController, _TokenSearchDiscoveryDataController_tokenPricesService, _TokenSearchDiscoveryDataController_fetchPriceData;
|
|
13
|
+
var _TokenSearchDiscoveryDataController_instances, _TokenSearchDiscoveryDataController_abortController, _TokenSearchDiscoveryDataController_tokenPricesService, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, _TokenSearchDiscoveryDataController_fetchTokens, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, _TokenSearchDiscoveryDataController_fetchPriceData;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.TokenSearchDiscoveryDataController = exports.getDefaultTokenSearchDiscoveryDataControllerState = exports.MAX_TOKEN_DISPLAY_DATA_LENGTH = exports.controllerName = void 0;
|
|
16
16
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -26,6 +26,12 @@ const tokenSearchDiscoveryDataControllerMetadata = {
|
|
|
26
26
|
includeInDebugSnapshot: false,
|
|
27
27
|
usedInUi: true,
|
|
28
28
|
},
|
|
29
|
+
swapsTokenAddressesByChainId: {
|
|
30
|
+
includeInStateLogs: false,
|
|
31
|
+
persist: true,
|
|
32
|
+
includeInDebugSnapshot: false,
|
|
33
|
+
usedInUi: true,
|
|
34
|
+
},
|
|
29
35
|
};
|
|
30
36
|
/**
|
|
31
37
|
* Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows
|
|
@@ -38,6 +44,7 @@ const tokenSearchDiscoveryDataControllerMetadata = {
|
|
|
38
44
|
function getDefaultTokenSearchDiscoveryDataControllerState() {
|
|
39
45
|
return {
|
|
40
46
|
tokenDisplayData: [],
|
|
47
|
+
swapsTokenAddressesByChainId: {},
|
|
41
48
|
};
|
|
42
49
|
}
|
|
43
50
|
exports.getDefaultTokenSearchDiscoveryDataControllerState = getDefaultTokenSearchDiscoveryDataControllerState;
|
|
@@ -46,7 +53,7 @@ exports.getDefaultTokenSearchDiscoveryDataControllerState = getDefaultTokenSearc
|
|
|
46
53
|
* It fetches token search results and discovery data from the Portfolio API.
|
|
47
54
|
*/
|
|
48
55
|
class TokenSearchDiscoveryDataController extends base_controller_1.BaseController {
|
|
49
|
-
constructor({ state = {}, messenger, tokenPricesService, }) {
|
|
56
|
+
constructor({ state = {}, messenger, tokenPricesService, swapsSupportedChainIds, fetchTokens, fetchSwapsTokensThresholdMs, }) {
|
|
50
57
|
super({
|
|
51
58
|
name: exports.controllerName,
|
|
52
59
|
metadata: tokenSearchDiscoveryDataControllerMetadata,
|
|
@@ -59,10 +66,53 @@ class TokenSearchDiscoveryDataController extends base_controller_1.BaseControlle
|
|
|
59
66
|
_TokenSearchDiscoveryDataController_instances.add(this);
|
|
60
67
|
_TokenSearchDiscoveryDataController_abortController.set(this, void 0);
|
|
61
68
|
_TokenSearchDiscoveryDataController_tokenPricesService.set(this, void 0);
|
|
69
|
+
_TokenSearchDiscoveryDataController_swapsSupportedChainIds.set(this, void 0);
|
|
70
|
+
_TokenSearchDiscoveryDataController_fetchTokens.set(this, void 0);
|
|
71
|
+
_TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs.set(this, void 0);
|
|
62
72
|
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_abortController, new AbortController(), "f");
|
|
63
73
|
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_tokenPricesService, tokenPricesService, "f");
|
|
74
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, swapsSupportedChainIds, "f");
|
|
75
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_fetchTokens, fetchTokens, "f");
|
|
76
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, fetchSwapsTokensThresholdMs, "f");
|
|
77
|
+
}
|
|
78
|
+
async fetchSwapsTokens(chainId) {
|
|
79
|
+
if (!__classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, "f").includes(chainId)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];
|
|
83
|
+
if ((!swapsTokens ||
|
|
84
|
+
swapsTokens.lastFetched <
|
|
85
|
+
Date.now() - __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, "f")) &&
|
|
86
|
+
!swapsTokens?.isFetching) {
|
|
87
|
+
try {
|
|
88
|
+
this.update((state) => {
|
|
89
|
+
if (!state.swapsTokenAddressesByChainId[chainId]) {
|
|
90
|
+
state.swapsTokenAddressesByChainId[chainId] = {
|
|
91
|
+
lastFetched: Date.now(),
|
|
92
|
+
addresses: [],
|
|
93
|
+
isFetching: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
state.swapsTokenAddressesByChainId[chainId].isFetching = true;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
const tokens = await __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_fetchTokens, "f").call(this, chainId);
|
|
101
|
+
this.update((state) => {
|
|
102
|
+
state.swapsTokenAddressesByChainId[chainId] = {
|
|
103
|
+
lastFetched: Date.now(),
|
|
104
|
+
addresses: tokens.map((token) => token.address),
|
|
105
|
+
isFetching: false,
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error(error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
64
113
|
}
|
|
65
114
|
async fetchTokenDisplayData(chainId, address) {
|
|
115
|
+
await this.fetchSwapsTokens(chainId);
|
|
66
116
|
let tokenMetadata;
|
|
67
117
|
try {
|
|
68
118
|
tokenMetadata = await (0, token_service_1.fetchTokenMetadata)(chainId, address, __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_abortController, "f").signal);
|
|
@@ -112,7 +162,7 @@ class TokenSearchDiscoveryDataController extends base_controller_1.BaseControlle
|
|
|
112
162
|
}
|
|
113
163
|
}
|
|
114
164
|
exports.TokenSearchDiscoveryDataController = TokenSearchDiscoveryDataController;
|
|
115
|
-
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
|
|
165
|
+
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_swapsSupportedChainIds = new WeakMap(), _TokenSearchDiscoveryDataController_fetchTokens = new WeakMap(), _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
|
|
116
166
|
const { currentCurrency } = this.messenger.call('CurrencyRateController:getState');
|
|
117
167
|
try {
|
|
118
168
|
const pricesData = await __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_tokenPricesService, "f").fetchTokenPrices({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenSearchDiscoveryDataController.cjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n StateMetadata,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n }\n\n async #fetchPriceData(chainId: Hex, address: string) {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n assets: [{ chainId, tokenAddress: address as Hex }],\n currency: currentCurrency,\n });\n\n return pricesData[0] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TokenSearchDiscoveryDataController.cjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n StateMetadata,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(chainId: Hex, address: string) {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n assets: [{ chainId, tokenAddress: address as Hex }],\n currency: currentCurrency,\n });\n\n return pricesData[0] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
|
|
@@ -9,6 +9,11 @@ export declare const controllerName = "TokenSearchDiscoveryDataController";
|
|
|
9
9
|
export declare const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;
|
|
10
10
|
export type TokenSearchDiscoveryDataControllerState = {
|
|
11
11
|
tokenDisplayData: TokenDisplayData[];
|
|
12
|
+
swapsTokenAddressesByChainId: Record<Hex, {
|
|
13
|
+
lastFetched: number;
|
|
14
|
+
addresses: string[];
|
|
15
|
+
isFetching: boolean;
|
|
16
|
+
}>;
|
|
12
17
|
};
|
|
13
18
|
/**
|
|
14
19
|
* The action which can be used to retrieve the state of the
|
|
@@ -58,11 +63,17 @@ export declare function getDefaultTokenSearchDiscoveryDataControllerState(): Tok
|
|
|
58
63
|
*/
|
|
59
64
|
export declare class TokenSearchDiscoveryDataController extends BaseController<typeof controllerName, TokenSearchDiscoveryDataControllerState, TokenSearchDiscoveryDataControllerMessenger> {
|
|
60
65
|
#private;
|
|
61
|
-
constructor({ state, messenger, tokenPricesService, }: {
|
|
66
|
+
constructor({ state, messenger, tokenPricesService, swapsSupportedChainIds, fetchTokens, fetchSwapsTokensThresholdMs, }: {
|
|
62
67
|
state?: Partial<TokenSearchDiscoveryDataControllerState>;
|
|
63
68
|
messenger: TokenSearchDiscoveryDataControllerMessenger;
|
|
64
69
|
tokenPricesService: AbstractTokenPricesService;
|
|
70
|
+
swapsSupportedChainIds: Hex[];
|
|
71
|
+
fetchTokens: (chainId: Hex) => Promise<{
|
|
72
|
+
address: string;
|
|
73
|
+
}[]>;
|
|
74
|
+
fetchSwapsTokensThresholdMs: number;
|
|
65
75
|
});
|
|
76
|
+
fetchSwapsTokens(chainId: Hex): Promise<void>;
|
|
66
77
|
fetchTokenDisplayData(chainId: Hex, address: string): Promise<void>;
|
|
67
78
|
}
|
|
68
79
|
//# sourceMappingURL=TokenSearchDiscoveryDataController.d.cts.map
|
package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenSearchDiscoveryDataController.d.cts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAEV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAS1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"TokenSearchDiscoveryDataController.d.cts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAEV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAS1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAoBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,SAAS,CACjE,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,CACzD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAoCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
|
|
@@ -9,6 +9,11 @@ export declare const controllerName = "TokenSearchDiscoveryDataController";
|
|
|
9
9
|
export declare const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;
|
|
10
10
|
export type TokenSearchDiscoveryDataControllerState = {
|
|
11
11
|
tokenDisplayData: TokenDisplayData[];
|
|
12
|
+
swapsTokenAddressesByChainId: Record<Hex, {
|
|
13
|
+
lastFetched: number;
|
|
14
|
+
addresses: string[];
|
|
15
|
+
isFetching: boolean;
|
|
16
|
+
}>;
|
|
12
17
|
};
|
|
13
18
|
/**
|
|
14
19
|
* The action which can be used to retrieve the state of the
|
|
@@ -58,11 +63,17 @@ export declare function getDefaultTokenSearchDiscoveryDataControllerState(): Tok
|
|
|
58
63
|
*/
|
|
59
64
|
export declare class TokenSearchDiscoveryDataController extends BaseController<typeof controllerName, TokenSearchDiscoveryDataControllerState, TokenSearchDiscoveryDataControllerMessenger> {
|
|
60
65
|
#private;
|
|
61
|
-
constructor({ state, messenger, tokenPricesService, }: {
|
|
66
|
+
constructor({ state, messenger, tokenPricesService, swapsSupportedChainIds, fetchTokens, fetchSwapsTokensThresholdMs, }: {
|
|
62
67
|
state?: Partial<TokenSearchDiscoveryDataControllerState>;
|
|
63
68
|
messenger: TokenSearchDiscoveryDataControllerMessenger;
|
|
64
69
|
tokenPricesService: AbstractTokenPricesService;
|
|
70
|
+
swapsSupportedChainIds: Hex[];
|
|
71
|
+
fetchTokens: (chainId: Hex) => Promise<{
|
|
72
|
+
address: string;
|
|
73
|
+
}[]>;
|
|
74
|
+
fetchSwapsTokensThresholdMs: number;
|
|
65
75
|
});
|
|
76
|
+
fetchSwapsTokens(chainId: Hex): Promise<void>;
|
|
66
77
|
fetchTokenDisplayData(chainId: Hex, address: string): Promise<void>;
|
|
67
78
|
}
|
|
68
79
|
//# sourceMappingURL=TokenSearchDiscoveryDataController.d.mts.map
|
package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenSearchDiscoveryDataController.d.mts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAEV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAS1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"TokenSearchDiscoveryDataController.d.mts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAEV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAS1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAoBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,SAAS,CACjE,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,CACzD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAoCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TokenSearchDiscoveryDataController_instances, _TokenSearchDiscoveryDataController_abortController, _TokenSearchDiscoveryDataController_tokenPricesService, _TokenSearchDiscoveryDataController_fetchPriceData;
|
|
12
|
+
var _TokenSearchDiscoveryDataController_instances, _TokenSearchDiscoveryDataController_abortController, _TokenSearchDiscoveryDataController_tokenPricesService, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, _TokenSearchDiscoveryDataController_fetchTokens, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, _TokenSearchDiscoveryDataController_fetchPriceData;
|
|
13
13
|
import { BaseController } from "@metamask/base-controller";
|
|
14
14
|
import { formatIconUrlWithProxy } from "../assetsUtil.mjs";
|
|
15
15
|
import { fetchTokenMetadata, TOKEN_METADATA_NO_SUPPORT_ERROR } from "../token-service.mjs";
|
|
@@ -23,6 +23,12 @@ const tokenSearchDiscoveryDataControllerMetadata = {
|
|
|
23
23
|
includeInDebugSnapshot: false,
|
|
24
24
|
usedInUi: true,
|
|
25
25
|
},
|
|
26
|
+
swapsTokenAddressesByChainId: {
|
|
27
|
+
includeInStateLogs: false,
|
|
28
|
+
persist: true,
|
|
29
|
+
includeInDebugSnapshot: false,
|
|
30
|
+
usedInUi: true,
|
|
31
|
+
},
|
|
26
32
|
};
|
|
27
33
|
/**
|
|
28
34
|
* Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows
|
|
@@ -35,6 +41,7 @@ const tokenSearchDiscoveryDataControllerMetadata = {
|
|
|
35
41
|
export function getDefaultTokenSearchDiscoveryDataControllerState() {
|
|
36
42
|
return {
|
|
37
43
|
tokenDisplayData: [],
|
|
44
|
+
swapsTokenAddressesByChainId: {},
|
|
38
45
|
};
|
|
39
46
|
}
|
|
40
47
|
/**
|
|
@@ -42,7 +49,7 @@ export function getDefaultTokenSearchDiscoveryDataControllerState() {
|
|
|
42
49
|
* It fetches token search results and discovery data from the Portfolio API.
|
|
43
50
|
*/
|
|
44
51
|
export class TokenSearchDiscoveryDataController extends BaseController {
|
|
45
|
-
constructor({ state = {}, messenger, tokenPricesService, }) {
|
|
52
|
+
constructor({ state = {}, messenger, tokenPricesService, swapsSupportedChainIds, fetchTokens, fetchSwapsTokensThresholdMs, }) {
|
|
46
53
|
super({
|
|
47
54
|
name: controllerName,
|
|
48
55
|
metadata: tokenSearchDiscoveryDataControllerMetadata,
|
|
@@ -55,10 +62,53 @@ export class TokenSearchDiscoveryDataController extends BaseController {
|
|
|
55
62
|
_TokenSearchDiscoveryDataController_instances.add(this);
|
|
56
63
|
_TokenSearchDiscoveryDataController_abortController.set(this, void 0);
|
|
57
64
|
_TokenSearchDiscoveryDataController_tokenPricesService.set(this, void 0);
|
|
65
|
+
_TokenSearchDiscoveryDataController_swapsSupportedChainIds.set(this, void 0);
|
|
66
|
+
_TokenSearchDiscoveryDataController_fetchTokens.set(this, void 0);
|
|
67
|
+
_TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs.set(this, void 0);
|
|
58
68
|
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_abortController, new AbortController(), "f");
|
|
59
69
|
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_tokenPricesService, tokenPricesService, "f");
|
|
70
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, swapsSupportedChainIds, "f");
|
|
71
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_fetchTokens, fetchTokens, "f");
|
|
72
|
+
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, fetchSwapsTokensThresholdMs, "f");
|
|
73
|
+
}
|
|
74
|
+
async fetchSwapsTokens(chainId) {
|
|
75
|
+
if (!__classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_swapsSupportedChainIds, "f").includes(chainId)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];
|
|
79
|
+
if ((!swapsTokens ||
|
|
80
|
+
swapsTokens.lastFetched <
|
|
81
|
+
Date.now() - __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs, "f")) &&
|
|
82
|
+
!swapsTokens?.isFetching) {
|
|
83
|
+
try {
|
|
84
|
+
this.update((state) => {
|
|
85
|
+
if (!state.swapsTokenAddressesByChainId[chainId]) {
|
|
86
|
+
state.swapsTokenAddressesByChainId[chainId] = {
|
|
87
|
+
lastFetched: Date.now(),
|
|
88
|
+
addresses: [],
|
|
89
|
+
isFetching: true,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
state.swapsTokenAddressesByChainId[chainId].isFetching = true;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
const tokens = await __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_fetchTokens, "f").call(this, chainId);
|
|
97
|
+
this.update((state) => {
|
|
98
|
+
state.swapsTokenAddressesByChainId[chainId] = {
|
|
99
|
+
lastFetched: Date.now(),
|
|
100
|
+
addresses: tokens.map((token) => token.address),
|
|
101
|
+
isFetching: false,
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
60
109
|
}
|
|
61
110
|
async fetchTokenDisplayData(chainId, address) {
|
|
111
|
+
await this.fetchSwapsTokens(chainId);
|
|
62
112
|
let tokenMetadata;
|
|
63
113
|
try {
|
|
64
114
|
tokenMetadata = await fetchTokenMetadata(chainId, address, __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_abortController, "f").signal);
|
|
@@ -107,7 +157,7 @@ export class TokenSearchDiscoveryDataController extends BaseController {
|
|
|
107
157
|
});
|
|
108
158
|
}
|
|
109
159
|
}
|
|
110
|
-
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
|
|
160
|
+
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_swapsSupportedChainIds = new WeakMap(), _TokenSearchDiscoveryDataController_fetchTokens = new WeakMap(), _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
|
|
111
161
|
const { currentCurrency } = this.messenger.call('CurrencyRateController:getState');
|
|
112
162
|
try {
|
|
113
163
|
const pricesData = await __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_tokenPricesService, "f").fetchTokenPrices({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenSearchDiscoveryDataController.mjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n StateMetadata,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n }\n\n async #fetchPriceData(chainId: Hex, address: string) {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n assets: [{ chainId, tokenAddress: address as Hex }],\n currency: currentCurrency,\n });\n\n return pricesData[0] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TokenSearchDiscoveryDataController.mjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n StateMetadata,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(chainId: Hex, address: string) {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n assets: [{ chainId, tokenAddress: address as Hex }],\n currency: currentCurrency,\n });\n\n return pricesData[0] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-token-prices-service.cjs","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type { CaipAssetType,
|
|
1
|
+
{"version":3,"file":"abstract-token-prices-service.cjs","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type { CaipAssetType, Hex } from '@metamask/utils';\n\nimport type { MarketDataDetails } from '../TokenRatesController';\n\n/**\n * Represents an exchange rate.\n */\nexport type ExchangeRate = {\n name: string;\n ticker: string;\n value: number;\n currencyType: string;\n usd?: number;\n};\n\n/**\n * A map of currency to its exchange rate.\n */\nexport type ExchangeRatesByCurrency<Currency extends string> = {\n [C in Currency]: ExchangeRate;\n};\n\nexport type EvmAssetAddressWithChain<ChainId extends Hex = Hex> = {\n tokenAddress: Hex;\n chainId: ChainId;\n};\n\nexport type EvmAssetWithId<ChainId extends Hex = Hex> =\n EvmAssetAddressWithChain<ChainId> & {\n assetId: CaipAssetType;\n };\n\nexport type EvmAssetWithMarketData<\n ChainId extends Hex = Hex,\n Currency extends string = string,\n> = EvmAssetAddressWithChain<ChainId> &\n MarketDataDetails & { currency: Currency };\n\n/**\n * An ideal token prices service. All implementations must confirm to this\n * interface.\n *\n * @template ChainId - A type union of valid arguments for the `chainId`\n * argument to `fetchTokenPrices`.\n * @template Currency - A type union of valid arguments for the `currency`\n * argument to `fetchTokenPrices`.\n */\nexport type AbstractTokenPricesService<\n ChainId extends Hex = Hex,\n Currency extends string = string,\n> = Partial<Pick<ServicePolicy, 'onBreak' | 'onDegraded'>> & {\n /**\n * Retrieves prices in the given currency for the tokens identified by the\n * given addresses which are expected to live on the given chain.\n *\n * @param args - The arguments to this function.\n * @param args.assets - The assets to get prices for.\n * @param args.currency - The desired currency of the token prices.\n * @returns The prices for the requested tokens.\n */\n fetchTokenPrices({\n assets,\n currency,\n }: {\n assets: EvmAssetAddressWithChain<ChainId>[];\n currency: Currency;\n }): Promise<EvmAssetWithMarketData<ChainId, Currency>[]>;\n\n /**\n * Retrieves exchange rates in the given currency.\n *\n * @param args - The arguments to this function.\n * @param args.baseCurrency - The desired currency of the token prices.\n * @param args.includeUsdRate - Whether to include the USD rate in the response.\n * @param args.cryptocurrencies - The cryptocurrencies to get exchange rates for.\n * @returns The exchange rates in the requested base currency.\n */\n fetchExchangeRates({\n baseCurrency,\n includeUsdRate,\n cryptocurrencies,\n }: {\n baseCurrency: Currency;\n includeUsdRate: boolean;\n cryptocurrencies: string[];\n }): Promise<ExchangeRatesByCurrency<Currency>>;\n\n /**\n * Type guard for whether the API can return token prices for the given chain\n * ID.\n *\n * @param chainId - The chain ID to check.\n * @returns True if the API supports the chain ID, false otherwise.\n */\n validateChainIdSupported(chainId: unknown): chainId is ChainId;\n\n /**\n * Type guard for whether the API can return token prices in the given\n * currency.\n *\n * @param currency - The currency to check.\n * @returns True if the API supports the currency, false otherwise.\n */\n validateCurrencySupported(currency: unknown): currency is Currency;\n};\n"]}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type { ServicePolicy } from "@metamask/controller-utils";
|
|
2
|
-
import type { CaipAssetType,
|
|
2
|
+
import type { CaipAssetType, Hex } from "@metamask/utils";
|
|
3
3
|
import type { MarketDataDetails } from "../TokenRatesController.cjs";
|
|
4
|
-
/**
|
|
5
|
-
* A map of CAIP-2 chain IDs to their native asset identifiers (CAIP-19 format).
|
|
6
|
-
*/
|
|
7
|
-
export type NativeAssetIdentifiersMap = Record<CaipChainId, CaipAssetType>;
|
|
8
4
|
/**
|
|
9
5
|
* Represents an exchange rate.
|
|
10
6
|
*/
|
|
@@ -84,12 +80,5 @@ export type AbstractTokenPricesService<ChainId extends Hex = Hex, Currency exten
|
|
|
84
80
|
* @returns True if the API supports the currency, false otherwise.
|
|
85
81
|
*/
|
|
86
82
|
validateCurrencySupported(currency: unknown): currency is Currency;
|
|
87
|
-
/**
|
|
88
|
-
* Sets the native asset identifiers map for resolving native token CAIP-19 IDs.
|
|
89
|
-
* This should be called with data from NetworkEnablementController.state.nativeAssetIdentifiers.
|
|
90
|
-
*
|
|
91
|
-
* @param nativeAssetIdentifiers - Map of CAIP-2 chain IDs to native asset identifiers.
|
|
92
|
-
*/
|
|
93
|
-
setNativeAssetIdentifiers?(nativeAssetIdentifiers: NativeAssetIdentifiersMap): void;
|
|
94
83
|
};
|
|
95
84
|
//# sourceMappingURL=abstract-token-prices-service.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-token-prices-service.d.cts","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"abstract-token-prices-service.d.cts","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,wBAAwB;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAgC;AAEjE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,CAAC,QAAQ,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,QAAQ,GAAG,YAAY;CAC9B,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,OAAO,SAAS,GAAG,GAAG,GAAG,IAAI;IAChE,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,GAAG,GAAG,GAAG,IAClD,wBAAwB,CAAC,OAAO,CAAC,GAAG;IAClC,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAEJ,MAAM,MAAM,sBAAsB,CAChC,OAAO,SAAS,GAAG,GAAG,GAAG,EACzB,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,wBAAwB,CAAC,OAAO,CAAC,GACnC,iBAAiB,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,0BAA0B,CACpC,OAAO,SAAS,GAAG,GAAG,GAAG,EACzB,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,GAAG;IAC3D;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EACf,MAAM,EACN,QAAQ,GACT,EAAE;QACD,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzD;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,EAAE;QACD,YAAY,EAAE,QAAQ,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,GAAG,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C;;;;;;OAMG;IACH,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC;IAE/D;;;;;;OAMG;IACH,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;CACpE,CAAC"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type { ServicePolicy } from "@metamask/controller-utils";
|
|
2
|
-
import type { CaipAssetType,
|
|
2
|
+
import type { CaipAssetType, Hex } from "@metamask/utils";
|
|
3
3
|
import type { MarketDataDetails } from "../TokenRatesController.mjs";
|
|
4
|
-
/**
|
|
5
|
-
* A map of CAIP-2 chain IDs to their native asset identifiers (CAIP-19 format).
|
|
6
|
-
*/
|
|
7
|
-
export type NativeAssetIdentifiersMap = Record<CaipChainId, CaipAssetType>;
|
|
8
4
|
/**
|
|
9
5
|
* Represents an exchange rate.
|
|
10
6
|
*/
|
|
@@ -84,12 +80,5 @@ export type AbstractTokenPricesService<ChainId extends Hex = Hex, Currency exten
|
|
|
84
80
|
* @returns True if the API supports the currency, false otherwise.
|
|
85
81
|
*/
|
|
86
82
|
validateCurrencySupported(currency: unknown): currency is Currency;
|
|
87
|
-
/**
|
|
88
|
-
* Sets the native asset identifiers map for resolving native token CAIP-19 IDs.
|
|
89
|
-
* This should be called with data from NetworkEnablementController.state.nativeAssetIdentifiers.
|
|
90
|
-
*
|
|
91
|
-
* @param nativeAssetIdentifiers - Map of CAIP-2 chain IDs to native asset identifiers.
|
|
92
|
-
*/
|
|
93
|
-
setNativeAssetIdentifiers?(nativeAssetIdentifiers: NativeAssetIdentifiersMap): void;
|
|
94
83
|
};
|
|
95
84
|
//# sourceMappingURL=abstract-token-prices-service.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-token-prices-service.d.mts","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"abstract-token-prices-service.d.mts","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,wBAAwB;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAgC;AAEjE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,CAAC,QAAQ,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,QAAQ,GAAG,YAAY;CAC9B,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,OAAO,SAAS,GAAG,GAAG,GAAG,IAAI;IAChE,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,GAAG,GAAG,GAAG,IAClD,wBAAwB,CAAC,OAAO,CAAC,GAAG;IAClC,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAEJ,MAAM,MAAM,sBAAsB,CAChC,OAAO,SAAS,GAAG,GAAG,GAAG,EACzB,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,wBAAwB,CAAC,OAAO,CAAC,GACnC,iBAAiB,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,0BAA0B,CACpC,OAAO,SAAS,GAAG,GAAG,GAAG,EACzB,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,GAAG;IAC3D;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EACf,MAAM,EACN,QAAQ,GACT,EAAE;QACD,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzD;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,EAAE;QACD,YAAY,EAAE,QAAQ,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,GAAG,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C;;;;;;OAMG;IACH,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC;IAE/D;;;;;;OAMG;IACH,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;CACpE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-token-prices-service.mjs","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type { CaipAssetType,
|
|
1
|
+
{"version":3,"file":"abstract-token-prices-service.mjs","sourceRoot":"","sources":["../../src/token-prices-service/abstract-token-prices-service.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type { CaipAssetType, Hex } from '@metamask/utils';\n\nimport type { MarketDataDetails } from '../TokenRatesController';\n\n/**\n * Represents an exchange rate.\n */\nexport type ExchangeRate = {\n name: string;\n ticker: string;\n value: number;\n currencyType: string;\n usd?: number;\n};\n\n/**\n * A map of currency to its exchange rate.\n */\nexport type ExchangeRatesByCurrency<Currency extends string> = {\n [C in Currency]: ExchangeRate;\n};\n\nexport type EvmAssetAddressWithChain<ChainId extends Hex = Hex> = {\n tokenAddress: Hex;\n chainId: ChainId;\n};\n\nexport type EvmAssetWithId<ChainId extends Hex = Hex> =\n EvmAssetAddressWithChain<ChainId> & {\n assetId: CaipAssetType;\n };\n\nexport type EvmAssetWithMarketData<\n ChainId extends Hex = Hex,\n Currency extends string = string,\n> = EvmAssetAddressWithChain<ChainId> &\n MarketDataDetails & { currency: Currency };\n\n/**\n * An ideal token prices service. All implementations must confirm to this\n * interface.\n *\n * @template ChainId - A type union of valid arguments for the `chainId`\n * argument to `fetchTokenPrices`.\n * @template Currency - A type union of valid arguments for the `currency`\n * argument to `fetchTokenPrices`.\n */\nexport type AbstractTokenPricesService<\n ChainId extends Hex = Hex,\n Currency extends string = string,\n> = Partial<Pick<ServicePolicy, 'onBreak' | 'onDegraded'>> & {\n /**\n * Retrieves prices in the given currency for the tokens identified by the\n * given addresses which are expected to live on the given chain.\n *\n * @param args - The arguments to this function.\n * @param args.assets - The assets to get prices for.\n * @param args.currency - The desired currency of the token prices.\n * @returns The prices for the requested tokens.\n */\n fetchTokenPrices({\n assets,\n currency,\n }: {\n assets: EvmAssetAddressWithChain<ChainId>[];\n currency: Currency;\n }): Promise<EvmAssetWithMarketData<ChainId, Currency>[]>;\n\n /**\n * Retrieves exchange rates in the given currency.\n *\n * @param args - The arguments to this function.\n * @param args.baseCurrency - The desired currency of the token prices.\n * @param args.includeUsdRate - Whether to include the USD rate in the response.\n * @param args.cryptocurrencies - The cryptocurrencies to get exchange rates for.\n * @returns The exchange rates in the requested base currency.\n */\n fetchExchangeRates({\n baseCurrency,\n includeUsdRate,\n cryptocurrencies,\n }: {\n baseCurrency: Currency;\n includeUsdRate: boolean;\n cryptocurrencies: string[];\n }): Promise<ExchangeRatesByCurrency<Currency>>;\n\n /**\n * Type guard for whether the API can return token prices for the given chain\n * ID.\n *\n * @param chainId - The chain ID to check.\n * @returns True if the API supports the chain ID, false otherwise.\n */\n validateChainIdSupported(chainId: unknown): chainId is ChainId;\n\n /**\n * Type guard for whether the API can return token prices in the given\n * currency.\n *\n * @param currency - The currency to check.\n * @returns True if the API supports the currency, false otherwise.\n */\n validateCurrencySupported(currency: unknown): currency is Currency;\n};\n"]}
|