@metamask-previews/assets-controllers 96.0.0-preview-863782e → 96.0.0-preview-4888150
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 +7 -10
- 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 +3 -53
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts +1 -12
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts +1 -12
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs +3 -53
- 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 +1 -2
|
@@ -9,11 +9,6 @@ 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
|
-
}>;
|
|
17
12
|
};
|
|
18
13
|
/**
|
|
19
14
|
* The action which can be used to retrieve the state of the
|
|
@@ -63,17 +58,11 @@ export declare function getDefaultTokenSearchDiscoveryDataControllerState(): Tok
|
|
|
63
58
|
*/
|
|
64
59
|
export declare class TokenSearchDiscoveryDataController extends BaseController<typeof controllerName, TokenSearchDiscoveryDataControllerState, TokenSearchDiscoveryDataControllerMessenger> {
|
|
65
60
|
#private;
|
|
66
|
-
constructor({ state, messenger, tokenPricesService,
|
|
61
|
+
constructor({ state, messenger, tokenPricesService, }: {
|
|
67
62
|
state?: Partial<TokenSearchDiscoveryDataControllerState>;
|
|
68
63
|
messenger: TokenSearchDiscoveryDataControllerMessenger;
|
|
69
64
|
tokenPricesService: AbstractTokenPricesService;
|
|
70
|
-
swapsSupportedChainIds: Hex[];
|
|
71
|
-
fetchTokens: (chainId: Hex) => Promise<{
|
|
72
|
-
address: string;
|
|
73
|
-
}[]>;
|
|
74
|
-
fetchSwapsTokensThresholdMs: number;
|
|
75
65
|
});
|
|
76
|
-
fetchSwapsTokens(chainId: Hex): Promise<void>;
|
|
77
66
|
fetchTokenDisplayData(chainId: Hex, address: string): Promise<void>;
|
|
78
67
|
}
|
|
79
68
|
//# 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;CACtC,CAAC;AAcF;;;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,CAI3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAKa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,GACnB,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;KAChD;IAiCK,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4D1E"}
|
|
@@ -9,11 +9,6 @@ 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
|
-
}>;
|
|
17
12
|
};
|
|
18
13
|
/**
|
|
19
14
|
* The action which can be used to retrieve the state of the
|
|
@@ -63,17 +58,11 @@ export declare function getDefaultTokenSearchDiscoveryDataControllerState(): Tok
|
|
|
63
58
|
*/
|
|
64
59
|
export declare class TokenSearchDiscoveryDataController extends BaseController<typeof controllerName, TokenSearchDiscoveryDataControllerState, TokenSearchDiscoveryDataControllerMessenger> {
|
|
65
60
|
#private;
|
|
66
|
-
constructor({ state, messenger, tokenPricesService,
|
|
61
|
+
constructor({ state, messenger, tokenPricesService, }: {
|
|
67
62
|
state?: Partial<TokenSearchDiscoveryDataControllerState>;
|
|
68
63
|
messenger: TokenSearchDiscoveryDataControllerMessenger;
|
|
69
64
|
tokenPricesService: AbstractTokenPricesService;
|
|
70
|
-
swapsSupportedChainIds: Hex[];
|
|
71
|
-
fetchTokens: (chainId: Hex) => Promise<{
|
|
72
|
-
address: string;
|
|
73
|
-
}[]>;
|
|
74
|
-
fetchSwapsTokensThresholdMs: number;
|
|
75
65
|
});
|
|
76
|
-
fetchSwapsTokens(chainId: Hex): Promise<void>;
|
|
77
66
|
fetchTokenDisplayData(chainId: Hex, address: string): Promise<void>;
|
|
78
67
|
}
|
|
79
68
|
//# 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;CACtC,CAAC;AAcF;;;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,CAI3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAKa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,GACnB,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;KAChD;IAiCK,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4D1E"}
|
|
@@ -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,
|
|
12
|
+
var _TokenSearchDiscoveryDataController_instances, _TokenSearchDiscoveryDataController_abortController, _TokenSearchDiscoveryDataController_tokenPricesService, _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,12 +23,6 @@ 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
|
-
},
|
|
32
26
|
};
|
|
33
27
|
/**
|
|
34
28
|
* Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows
|
|
@@ -41,7 +35,6 @@ const tokenSearchDiscoveryDataControllerMetadata = {
|
|
|
41
35
|
export function getDefaultTokenSearchDiscoveryDataControllerState() {
|
|
42
36
|
return {
|
|
43
37
|
tokenDisplayData: [],
|
|
44
|
-
swapsTokenAddressesByChainId: {},
|
|
45
38
|
};
|
|
46
39
|
}
|
|
47
40
|
/**
|
|
@@ -49,7 +42,7 @@ export function getDefaultTokenSearchDiscoveryDataControllerState() {
|
|
|
49
42
|
* It fetches token search results and discovery data from the Portfolio API.
|
|
50
43
|
*/
|
|
51
44
|
export class TokenSearchDiscoveryDataController extends BaseController {
|
|
52
|
-
constructor({ state = {}, messenger, tokenPricesService,
|
|
45
|
+
constructor({ state = {}, messenger, tokenPricesService, }) {
|
|
53
46
|
super({
|
|
54
47
|
name: controllerName,
|
|
55
48
|
metadata: tokenSearchDiscoveryDataControllerMetadata,
|
|
@@ -62,53 +55,10 @@ export class TokenSearchDiscoveryDataController extends BaseController {
|
|
|
62
55
|
_TokenSearchDiscoveryDataController_instances.add(this);
|
|
63
56
|
_TokenSearchDiscoveryDataController_abortController.set(this, void 0);
|
|
64
57
|
_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);
|
|
68
58
|
__classPrivateFieldSet(this, _TokenSearchDiscoveryDataController_abortController, new AbortController(), "f");
|
|
69
59
|
__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
|
-
}
|
|
109
60
|
}
|
|
110
61
|
async fetchTokenDisplayData(chainId, address) {
|
|
111
|
-
await this.fetchSwapsTokens(chainId);
|
|
112
62
|
let tokenMetadata;
|
|
113
63
|
try {
|
|
114
64
|
tokenMetadata = await fetchTokenMetadata(chainId, address, __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_abortController, "f").signal);
|
|
@@ -157,7 +107,7 @@ export class TokenSearchDiscoveryDataController extends BaseController {
|
|
|
157
107
|
});
|
|
158
108
|
}
|
|
159
109
|
}
|
|
160
|
-
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(),
|
|
110
|
+
_TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
|
|
161
111
|
const { currentCurrency } = this.messenger.call('CurrencyRateController:getState');
|
|
162
112
|
try {
|
|
163
113
|
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 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
|
+
{"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 +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"]}
|
|
@@ -10,9 +10,9 @@ 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 _CodefiTokenPricesServiceV2_policy
|
|
13
|
+
var _CodefiTokenPricesServiceV2_policy;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.CodefiTokenPricesServiceV2 = exports.resetSupportedCurrenciesCache = exports.getSupportedCurrencies = exports.fetchSupportedCurrencies = exports.
|
|
15
|
+
exports.CodefiTokenPricesServiceV2 = exports.resetSupportedCurrenciesCache = exports.getSupportedCurrencies = exports.fetchSupportedCurrencies = exports.SUPPORTED_CHAIN_IDS = exports.SPOT_PRICES_SUPPORT_INFO = exports.getNativeTokenAddress = exports.ZERO_ADDRESS = exports.SUPPORTED_CURRENCIES = exports.SUPPORTED_CURRENCIES_FALLBACK = void 0;
|
|
16
16
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
17
17
|
const utils_1 = require("@metamask/utils");
|
|
18
18
|
/**
|
|
@@ -304,105 +304,13 @@ exports.SPOT_PRICES_SUPPORT_INFO = {
|
|
|
304
304
|
* @see Used by {@link CodefiTokenPricesServiceV2} to validate that a given chain ID is supported by V2 of the Codefi Price API.
|
|
305
305
|
*/
|
|
306
306
|
exports.SUPPORTED_CHAIN_IDS = Object.keys(exports.SPOT_PRICES_SUPPORT_INFO);
|
|
307
|
-
const BASE_URL_V1 = 'https://price.api.cx.metamask.io/v1';
|
|
308
|
-
const BASE_URL_V2 = 'https://price.api.cx.metamask.io/v2';
|
|
309
|
-
const BASE_URL_V3 = 'https://price.api.cx.metamask.io/v3';
|
|
310
|
-
/**
|
|
311
|
-
* In-memory store for the last successfully fetched supported networks.
|
|
312
|
-
*/
|
|
313
|
-
let lastFetchedSupportedNetworks = null;
|
|
314
|
-
/**
|
|
315
|
-
* Converts a CAIP-2 chain ID (e.g., 'eip155:1') to a hex chain ID (e.g., '0x1').
|
|
316
|
-
*
|
|
317
|
-
* @param caipChainId - The CAIP-2 chain ID string.
|
|
318
|
-
* @returns The hex chain ID or null if not an EIP-155 chain.
|
|
319
|
-
*/
|
|
320
|
-
function caipChainIdToHex(caipChainId) {
|
|
321
|
-
const match = caipChainId.match(/^eip155:(\d+)$/u);
|
|
322
|
-
if (!match) {
|
|
323
|
-
return null;
|
|
324
|
-
}
|
|
325
|
-
return (0, utils_1.numberToHex)(parseInt(match[1], 10));
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Fetches the list of supported networks from the API.
|
|
329
|
-
* Falls back to the hardcoded list if the fetch fails.
|
|
330
|
-
*
|
|
331
|
-
* @returns The supported networks response.
|
|
332
|
-
*/
|
|
333
|
-
async function fetchSupportedNetworks() {
|
|
334
|
-
try {
|
|
335
|
-
const url = `${BASE_URL_V2}/supportedNetworks`;
|
|
336
|
-
const response = await (0, controller_utils_1.handleFetch)(url, {
|
|
337
|
-
headers: { 'Cache-Control': 'no-cache' },
|
|
338
|
-
});
|
|
339
|
-
if (response &&
|
|
340
|
-
typeof response === 'object' &&
|
|
341
|
-
'fullSupport' in response &&
|
|
342
|
-
'partialSupport' in response) {
|
|
343
|
-
lastFetchedSupportedNetworks = response;
|
|
344
|
-
return lastFetchedSupportedNetworks;
|
|
345
|
-
}
|
|
346
|
-
// Invalid response format, fall back to hardcoded list
|
|
347
|
-
return getSupportedNetworksFallback();
|
|
348
|
-
}
|
|
349
|
-
catch {
|
|
350
|
-
// On any error, fall back to the hardcoded list
|
|
351
|
-
return getSupportedNetworksFallback();
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
exports.fetchSupportedNetworks = fetchSupportedNetworks;
|
|
355
|
-
/**
|
|
356
|
-
* Synchronously gets the list of supported networks.
|
|
357
|
-
* Returns the last fetched value if available, otherwise returns the fallback list.
|
|
358
|
-
*
|
|
359
|
-
* @returns The supported networks response.
|
|
360
|
-
*/
|
|
361
|
-
function getSupportedNetworks() {
|
|
362
|
-
if (lastFetchedSupportedNetworks !== null) {
|
|
363
|
-
return lastFetchedSupportedNetworks;
|
|
364
|
-
}
|
|
365
|
-
return getSupportedNetworksFallback();
|
|
366
|
-
}
|
|
367
|
-
exports.getSupportedNetworks = getSupportedNetworks;
|
|
368
|
-
/**
|
|
369
|
-
* Generates a fallback supported networks response from the hardcoded SPOT_PRICES_SUPPORT_INFO.
|
|
370
|
-
*
|
|
371
|
-
* @returns A SupportedNetworksResponse derived from hardcoded data.
|
|
372
|
-
*/
|
|
373
|
-
function getSupportedNetworksFallback() {
|
|
374
|
-
const caipChainIds = Object.keys(exports.SPOT_PRICES_SUPPORT_INFO).map((hexChainId) => (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, (0, utils_1.hexToNumber)(hexChainId).toString()));
|
|
375
|
-
return {
|
|
376
|
-
fullSupport: caipChainIds.slice(0, 11), // First 11 chains as "full support"
|
|
377
|
-
partialSupport: {
|
|
378
|
-
spotPricesV2: caipChainIds,
|
|
379
|
-
spotPricesV3: caipChainIds,
|
|
380
|
-
},
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Resets the supported networks cache.
|
|
385
|
-
* This is primarily intended for testing purposes.
|
|
386
|
-
*/
|
|
387
|
-
function resetSupportedNetworksCache() {
|
|
388
|
-
lastFetchedSupportedNetworks = null;
|
|
389
|
-
}
|
|
390
|
-
exports.resetSupportedNetworksCache = resetSupportedNetworksCache;
|
|
391
307
|
/**
|
|
392
|
-
*
|
|
393
|
-
*
|
|
394
|
-
* @returns Array of hex chain IDs supported by spot prices v3.
|
|
308
|
+
* The list of chain IDs that are supported by V3 of the Codefi Price API.
|
|
309
|
+
* Only includes chain IDs from SPOT_PRICES_SUPPORT_INFO that have a non-null CAIP-19 value.
|
|
395
310
|
*/
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
...supportedNetworks.fullSupport,
|
|
400
|
-
...supportedNetworks.partialSupport.spotPricesV3,
|
|
401
|
-
];
|
|
402
|
-
return allV3Chains
|
|
403
|
-
.map(caipChainIdToHex)
|
|
404
|
-
.filter((hexChainId) => hexChainId !== null);
|
|
405
|
-
}
|
|
311
|
+
const SUPPORTED_CHAIN_IDS_V3 = Object.keys(exports.SPOT_PRICES_SUPPORT_INFO).filter((chainId) => exports.SPOT_PRICES_SUPPORT_INFO[chainId] !== null);
|
|
312
|
+
const BASE_URL_V1 = 'https://price.api.cx.metamask.io/v1';
|
|
313
|
+
const BASE_URL_V3 = 'https://price.api.cx.metamask.io/v3';
|
|
406
314
|
/**
|
|
407
315
|
* In-memory store for the last successfully fetched supported currencies.
|
|
408
316
|
*/
|
|
@@ -461,11 +369,6 @@ exports.resetSupportedCurrenciesCache = resetSupportedCurrenciesCache;
|
|
|
461
369
|
class CodefiTokenPricesServiceV2 {
|
|
462
370
|
constructor({ degradedThreshold = controller_utils_1.DEFAULT_DEGRADED_THRESHOLD, retries = controller_utils_1.DEFAULT_MAX_RETRIES, maximumConsecutiveFailures = controller_utils_1.DEFAULT_MAX_CONSECUTIVE_FAILURES, onBreak, onDegraded, circuitBreakDuration = controller_utils_1.DEFAULT_CIRCUIT_BREAK_DURATION, } = {}) {
|
|
463
371
|
_CodefiTokenPricesServiceV2_policy.set(this, void 0);
|
|
464
|
-
/**
|
|
465
|
-
* Map of CAIP-2 chain IDs to their native asset identifiers.
|
|
466
|
-
* Updated via setNativeAssetIdentifiers().
|
|
467
|
-
*/
|
|
468
|
-
_CodefiTokenPricesServiceV2_nativeAssetIdentifiers.set(this, {});
|
|
469
372
|
__classPrivateFieldSet(this, _CodefiTokenPricesServiceV2_policy, (0, controller_utils_1.createServicePolicy)({
|
|
470
373
|
maxRetries: retries,
|
|
471
374
|
maxConsecutiveFailures: maximumConsecutiveFailures,
|
|
@@ -499,24 +402,6 @@ class CodefiTokenPricesServiceV2 {
|
|
|
499
402
|
onDegraded(...args) {
|
|
500
403
|
return __classPrivateFieldGet(this, _CodefiTokenPricesServiceV2_policy, "f").onDegraded(...args);
|
|
501
404
|
}
|
|
502
|
-
/**
|
|
503
|
-
* Sets the native asset identifiers map for resolving native token CAIP-19 IDs.
|
|
504
|
-
* This should be called with data from NetworkEnablementController.state.nativeAssetIdentifiers.
|
|
505
|
-
*
|
|
506
|
-
* @param nativeAssetIdentifiers - Map of CAIP-2 chain IDs to native asset identifiers.
|
|
507
|
-
*/
|
|
508
|
-
setNativeAssetIdentifiers(nativeAssetIdentifiers) {
|
|
509
|
-
__classPrivateFieldSet(this, _CodefiTokenPricesServiceV2_nativeAssetIdentifiers, nativeAssetIdentifiers, "f");
|
|
510
|
-
}
|
|
511
|
-
/**
|
|
512
|
-
* Updates the supported networks cache by fetching from the API.
|
|
513
|
-
* This should be called periodically to keep the supported networks list fresh.
|
|
514
|
-
*
|
|
515
|
-
* @returns The updated supported networks response.
|
|
516
|
-
*/
|
|
517
|
-
async updateSupportedNetworks() {
|
|
518
|
-
return fetchSupportedNetworks();
|
|
519
|
-
}
|
|
520
405
|
/**
|
|
521
406
|
* Retrieves prices in the given currency for the tokens identified by the
|
|
522
407
|
* given addresses which are expected to live on the given chain.
|
|
@@ -527,41 +412,21 @@ class CodefiTokenPricesServiceV2 {
|
|
|
527
412
|
* @returns The prices for the requested tokens.
|
|
528
413
|
*/
|
|
529
414
|
async fetchTokenPrices({ assets, currency, }) {
|
|
530
|
-
// Refresh supported networks in background (non-blocking)
|
|
531
|
-
// This ensures the list stays fresh during normal polling
|
|
532
|
-
// Note: fetchSupportedNetworks handles errors internally and always resolves
|
|
533
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
534
|
-
fetchSupportedNetworks();
|
|
535
|
-
// Get dynamically fetched supported chain IDs for V3
|
|
536
|
-
const supportedChainIdsV3 = getSupportedChainIdsV3AsHex();
|
|
537
415
|
const assetsWithIds = assets
|
|
538
416
|
// Filter out assets that are not supported by V3 of the Price API.
|
|
539
|
-
.filter((asset) =>
|
|
417
|
+
.filter((asset) => SUPPORTED_CHAIN_IDS_V3.includes(asset.chainId))
|
|
540
418
|
.map((asset) => {
|
|
541
419
|
const caipChainId = (0, utils_1.toCaipChainId)(utils_1.KnownCaipNamespace.Eip155, (0, utils_1.hexToNumber)(asset.chainId).toString());
|
|
542
420
|
const nativeAddress = (0, exports.getNativeTokenAddress)(asset.chainId);
|
|
543
|
-
const isNativeToken = nativeAddress.toLowerCase() === asset.tokenAddress.toLowerCase();
|
|
544
|
-
let assetId;
|
|
545
|
-
if (isNativeToken) {
|
|
546
|
-
// For native tokens, use nativeAssetIdentifiers from NetworkEnablementController,
|
|
547
|
-
// falling back to hardcoded SPOT_PRICES_SUPPORT_INFO
|
|
548
|
-
assetId =
|
|
549
|
-
__classPrivateFieldGet(this, _CodefiTokenPricesServiceV2_nativeAssetIdentifiers, "f")[caipChainId] ??
|
|
550
|
-
exports.SPOT_PRICES_SUPPORT_INFO[asset.chainId];
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
// For ERC20 tokens, construct the CAIP-19 ID dynamically
|
|
554
|
-
assetId = `${caipChainId}/erc20:${asset.tokenAddress.toLowerCase()}`;
|
|
555
|
-
}
|
|
556
|
-
if (!assetId) {
|
|
557
|
-
return undefined;
|
|
558
|
-
}
|
|
559
421
|
return {
|
|
560
422
|
...asset,
|
|
561
|
-
assetId:
|
|
423
|
+
assetId: (nativeAddress.toLowerCase() ===
|
|
424
|
+
asset.tokenAddress.toLowerCase()
|
|
425
|
+
? exports.SPOT_PRICES_SUPPORT_INFO[asset.chainId]
|
|
426
|
+
: `${caipChainId}/erc20:${asset.tokenAddress.toLowerCase()}`),
|
|
562
427
|
};
|
|
563
428
|
})
|
|
564
|
-
.filter((asset) => asset
|
|
429
|
+
.filter((asset) => asset.assetId);
|
|
565
430
|
if (assetsWithIds.length === 0) {
|
|
566
431
|
return [];
|
|
567
432
|
}
|
|
@@ -671,13 +536,8 @@ class CodefiTokenPricesServiceV2 {
|
|
|
671
536
|
* @returns True if the API supports the chain ID, false otherwise.
|
|
672
537
|
*/
|
|
673
538
|
validateChainIdSupported(chainId) {
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
// Also include the hardcoded fallback list for backwards compatibility
|
|
677
|
-
const allSupportedChainIds = [
|
|
678
|
-
...new Set([...supportedChainIds, ...exports.SUPPORTED_CHAIN_IDS]),
|
|
679
|
-
];
|
|
680
|
-
return (typeof chainId === 'string' && allSupportedChainIds.includes(chainId));
|
|
539
|
+
const supportedChainIds = exports.SUPPORTED_CHAIN_IDS;
|
|
540
|
+
return typeof chainId === 'string' && supportedChainIds.includes(chainId);
|
|
681
541
|
}
|
|
682
542
|
/**
|
|
683
543
|
* Type guard for whether the API can return token prices in the given
|
|
@@ -702,5 +562,5 @@ class CodefiTokenPricesServiceV2 {
|
|
|
702
562
|
}
|
|
703
563
|
}
|
|
704
564
|
exports.CodefiTokenPricesServiceV2 = CodefiTokenPricesServiceV2;
|
|
705
|
-
_CodefiTokenPricesServiceV2_policy = new WeakMap()
|
|
565
|
+
_CodefiTokenPricesServiceV2_policy = new WeakMap();
|
|
706
566
|
//# sourceMappingURL=codefi-v2.cjs.map
|