@metamask/bridge-controller 1.0.0 → 2.0.0
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 +13 -1
- package/dist/bridge-controller.cjs +81 -48
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +2 -5
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +2 -5
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +69 -36
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/constants/bridge.cjs +13 -12
- package/dist/constants/bridge.cjs.map +1 -1
- package/dist/constants/bridge.d.cts +6 -0
- package/dist/constants/bridge.d.cts.map +1 -1
- package/dist/constants/bridge.d.mts +6 -0
- package/dist/constants/bridge.d.mts.map +1 -1
- package/dist/constants/bridge.mjs +12 -11
- package/dist/constants/bridge.mjs.map +1 -1
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +20 -6
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +20 -6
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -1
- package/dist/utils/fetch.cjs +11 -10
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +12 -11
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/validators.d.cts +1 -1
- package/dist/utils/validators.d.mts +1 -1
- package/package.json +2 -2
package/dist/utils/fetch.cjs
CHANGED
|
@@ -26,23 +26,24 @@ async function fetchBridgeFeatureFlags(clientId, fetchFn) {
|
|
|
26
26
|
headers: (0, exports.getClientIdHeader)(clientId),
|
|
27
27
|
});
|
|
28
28
|
if ((0, validators_1.validateResponse)(validators_1.FEATURE_FLAG_VALIDATORS, rawFeatureFlags, url)) {
|
|
29
|
+
const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
|
|
30
|
+
...acc,
|
|
31
|
+
[(0, utils_1.numberToHex)(Number(chainId))]: value,
|
|
32
|
+
}), {});
|
|
29
33
|
return {
|
|
30
34
|
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
|
|
31
35
|
...rawFeatureFlags[types_1.BridgeFlag.EXTENSION_CONFIG],
|
|
32
|
-
chains:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
chains: getChainsObj(rawFeatureFlags[types_1.BridgeFlag.EXTENSION_CONFIG].chains),
|
|
37
|
+
},
|
|
38
|
+
[types_1.BridgeFeatureFlagsKey.MOBILE_CONFIG]: {
|
|
39
|
+
...rawFeatureFlags[types_1.BridgeFlag.MOBILE_CONFIG],
|
|
40
|
+
chains: getChainsObj(rawFeatureFlags[types_1.BridgeFlag.MOBILE_CONFIG].chains),
|
|
36
41
|
},
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
return {
|
|
40
|
-
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]:
|
|
41
|
-
|
|
42
|
-
maxRefreshCount: 5,
|
|
43
|
-
support: false,
|
|
44
|
-
chains: {},
|
|
45
|
-
},
|
|
45
|
+
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]: bridge_2.DEFAULT_FEATURE_FLAG_CONFIG,
|
|
46
|
+
[types_1.BridgeFeatureFlagsKey.MOBILE_CONFIG]: bridge_2.DEFAULT_FEATURE_FLAG_CONFIG,
|
|
46
47
|
};
|
|
47
48
|
}
|
|
48
49
|
exports.fetchBridgeFeatureFlags = fetchBridgeFeatureFlags;
|
package/dist/utils/fetch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":";;;AACA,2CAA2D;AAE3D,yCAIkB;AAClB,iDAQsB;AACtB,
|
|
1
|
+
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { hexToNumber, numberToHex } from '@metamask/utils';\n\nimport {\n isSwapsDefaultTokenAddress,\n isSwapsDefaultTokenSymbol,\n getBridgeApiBaseUrl,\n} from './bridge';\nimport {\n FEATURE_FLAG_VALIDATORS,\n QUOTE_VALIDATORS,\n TX_DATA_VALIDATORS,\n TOKEN_VALIDATORS,\n validateResponse,\n QUOTE_RESPONSE_VALIDATORS,\n FEE_DATA_VALIDATORS,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../constants/tokens';\nimport type {\n FeatureFlagResponse,\n FeeData,\n Quote,\n QuoteRequest,\n QuoteResponse,\n TxData,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n} from '../types';\nimport { BridgeFlag, FeeType, BridgeFeatureFlagsKey } from '../types';\n\n// TODO put this back in once we have a fetchWithCache equivalent\n// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<BridgeFeatureFlags> {\n const url = `${getBridgeApiBaseUrl()}/getAllFeatureFlags`;\n const rawFeatureFlags = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n if (\n validateResponse<FeatureFlagResponse>(\n FEATURE_FLAG_VALIDATORS,\n rawFeatureFlags,\n url,\n )\n ) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [numberToHex(Number(chainId))]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<Record<string, SwapsTokenObject>> {\n // TODO make token api v2 call\n const url = `${getBridgeApiBaseUrl()}/getTokens?chainId=${hexToNumber(\n chainId,\n )}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n const nativeToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n const transformedTokens: Record<string, SwapsTokenObject> = {};\n if (nativeToken) {\n transformedTokens[nativeToken.address] = nativeToken;\n }\n\n tokens.forEach((token: unknown) => {\n if (\n validateResponse<SwapsTokenObject>(TOKEN_VALIDATORS, token, url, false) &&\n !(\n isSwapsDefaultTokenSymbol(token.symbol, chainId) ||\n isSwapsDefaultTokenAddress(token.address, chainId)\n )\n ) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n// Returns a list of bridge tx quotes\n/**\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: QuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<QuoteResponse[]> {\n const queryParams = new URLSearchParams({\n walletAddress: request.walletAddress,\n srcChainId: request.srcChainId.toString(),\n destChainId: request.destChainId.toString(),\n srcTokenAddress: request.srcTokenAddress,\n destTokenAddress: request.destTokenAddress,\n srcTokenAmount: request.srcTokenAmount,\n slippage: request.slippage.toString(),\n insufficientBal: request.insufficientBal ? 'true' : 'false',\n resetApproval: request.resetApproval ? 'true' : 'false',\n });\n const url = `${getBridgeApiBaseUrl()}/getQuote?${queryParams}`;\n const quotes = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: QuoteResponse) => {\n const { quote, approval, trade } = quoteResponse;\n return (\n validateResponse<QuoteResponse>(\n QUOTE_RESPONSE_VALIDATORS,\n quoteResponse,\n url,\n ) &&\n validateResponse<Quote>(QUOTE_VALIDATORS, quote, url) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.srcAsset,\n url,\n ) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.destAsset,\n url,\n ) &&\n validateResponse<TxData>(TX_DATA_VALIDATORS, trade, url) &&\n validateResponse<FeeData>(\n FEE_DATA_VALIDATORS,\n quote.feeData[FeeType.METABRIDGE],\n url,\n ) &&\n (approval\n ? validateResponse<TxData>(TX_DATA_VALIDATORS, approval, url)\n : true)\n );\n });\n return filteredQuotes;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAkB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAClB,aAAa,
|
|
1
|
+
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAkB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAClB,aAAa,EAEd,qBAAiB;AAMlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAmC3C;AAGD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAiD1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAkB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAClB,aAAa,
|
|
1
|
+
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAkB3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAE5D,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAClB,aAAa,EAEd,qBAAiB;AAMlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAmC3C;AAGD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAiD1B"}
|
package/dist/utils/fetch.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { hexToNumber, numberToHex } from "@metamask/utils";
|
|
2
2
|
import { isSwapsDefaultTokenAddress, isSwapsDefaultTokenSymbol, getBridgeApiBaseUrl } from "./bridge.mjs";
|
|
3
3
|
import { FEATURE_FLAG_VALIDATORS, QUOTE_VALIDATORS, TX_DATA_VALIDATORS, TOKEN_VALIDATORS, validateResponse, QUOTE_RESPONSE_VALIDATORS, FEE_DATA_VALIDATORS } from "./validators.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import { DEFAULT_FEATURE_FLAG_CONFIG } from "../constants/bridge.mjs";
|
|
5
5
|
import { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from "../constants/tokens.mjs";
|
|
6
6
|
import { BridgeFlag, FeeType, BridgeFeatureFlagsKey } from "../types.mjs";
|
|
7
7
|
// TODO put this back in once we have a fetchWithCache equivalent
|
|
@@ -22,23 +22,24 @@ export async function fetchBridgeFeatureFlags(clientId, fetchFn) {
|
|
|
22
22
|
headers: getClientIdHeader(clientId),
|
|
23
23
|
});
|
|
24
24
|
if (validateResponse(FEATURE_FLAG_VALIDATORS, rawFeatureFlags, url)) {
|
|
25
|
+
const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
|
|
26
|
+
...acc,
|
|
27
|
+
[numberToHex(Number(chainId))]: value,
|
|
28
|
+
}), {});
|
|
25
29
|
return {
|
|
26
30
|
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
|
|
27
31
|
...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],
|
|
28
|
-
chains:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
chains: getChainsObj(rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains),
|
|
33
|
+
},
|
|
34
|
+
[BridgeFeatureFlagsKey.MOBILE_CONFIG]: {
|
|
35
|
+
...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],
|
|
36
|
+
chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),
|
|
32
37
|
},
|
|
33
38
|
};
|
|
34
39
|
}
|
|
35
40
|
return {
|
|
36
|
-
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]:
|
|
37
|
-
|
|
38
|
-
maxRefreshCount: 5,
|
|
39
|
-
support: false,
|
|
40
|
-
chains: {},
|
|
41
|
-
},
|
|
41
|
+
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,
|
|
42
|
+
[BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
/**
|
package/dist/utils/fetch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { hexToNumber, numberToHex } from '@metamask/utils';\n\nimport {\n isSwapsDefaultTokenAddress,\n isSwapsDefaultTokenSymbol,\n getBridgeApiBaseUrl,\n} from './bridge';\nimport {\n FEATURE_FLAG_VALIDATORS,\n QUOTE_VALIDATORS,\n TX_DATA_VALIDATORS,\n TOKEN_VALIDATORS,\n validateResponse,\n QUOTE_RESPONSE_VALIDATORS,\n FEE_DATA_VALIDATORS,\n} from './validators';\nimport { REFRESH_INTERVAL_MS } from '../constants/bridge';\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../constants/tokens';\nimport type {\n FeatureFlagResponse,\n FeeData,\n Quote,\n QuoteRequest,\n QuoteResponse,\n TxData,\n BridgeFeatureFlags,\n FetchFunction,\n} from '../types';\nimport { BridgeFlag, FeeType, BridgeFeatureFlagsKey } from '../types';\n\n// TODO put this back in once we have a fetchWithCache equivalent\n// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<BridgeFeatureFlags> {\n const url = `${getBridgeApiBaseUrl()}/getAllFeatureFlags`;\n const rawFeatureFlags = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n if (\n validateResponse<FeatureFlagResponse>(\n FEATURE_FLAG_VALIDATORS,\n rawFeatureFlags,\n url,\n )\n ) {\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: Object.entries(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [numberToHex(Number(chainId))]: value,\n }),\n {},\n ),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n refreshRate: REFRESH_INTERVAL_MS,\n maxRefreshCount: 5,\n support: false,\n chains: {},\n },\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<Record<string, SwapsTokenObject>> {\n // TODO make token api v2 call\n const url = `${getBridgeApiBaseUrl()}/getTokens?chainId=${hexToNumber(\n chainId,\n )}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n const nativeToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n const transformedTokens: Record<string, SwapsTokenObject> = {};\n if (nativeToken) {\n transformedTokens[nativeToken.address] = nativeToken;\n }\n\n tokens.forEach((token: unknown) => {\n if (\n validateResponse<SwapsTokenObject>(TOKEN_VALIDATORS, token, url, false) &&\n !(\n isSwapsDefaultTokenSymbol(token.symbol, chainId) ||\n isSwapsDefaultTokenAddress(token.address, chainId)\n )\n ) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n// Returns a list of bridge tx quotes\n/**\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: QuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<QuoteResponse[]> {\n const queryParams = new URLSearchParams({\n walletAddress: request.walletAddress,\n srcChainId: request.srcChainId.toString(),\n destChainId: request.destChainId.toString(),\n srcTokenAddress: request.srcTokenAddress,\n destTokenAddress: request.destTokenAddress,\n srcTokenAmount: request.srcTokenAmount,\n slippage: request.slippage.toString(),\n insufficientBal: request.insufficientBal ? 'true' : 'false',\n resetApproval: request.resetApproval ? 'true' : 'false',\n });\n const url = `${getBridgeApiBaseUrl()}/getQuote?${queryParams}`;\n const quotes = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: QuoteResponse) => {\n const { quote, approval, trade } = quoteResponse;\n return (\n validateResponse<QuoteResponse>(\n QUOTE_RESPONSE_VALIDATORS,\n quoteResponse,\n url,\n ) &&\n validateResponse<Quote>(QUOTE_VALIDATORS, quote, url) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.srcAsset,\n url,\n ) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.destAsset,\n url,\n ) &&\n validateResponse<TxData>(TX_DATA_VALIDATORS, trade, url) &&\n validateResponse<FeeData>(\n FEE_DATA_VALIDATORS,\n quote.feeData[FeeType.METABRIDGE],\n url,\n ) &&\n (approval\n ? validateResponse<TxData>(TX_DATA_VALIDATORS, approval, url)\n : true)\n );\n });\n return filteredQuotes;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { hexToNumber, numberToHex } from '@metamask/utils';\n\nimport {\n isSwapsDefaultTokenAddress,\n isSwapsDefaultTokenSymbol,\n getBridgeApiBaseUrl,\n} from './bridge';\nimport {\n FEATURE_FLAG_VALIDATORS,\n QUOTE_VALIDATORS,\n TX_DATA_VALIDATORS,\n TOKEN_VALIDATORS,\n validateResponse,\n QUOTE_RESPONSE_VALIDATORS,\n FEE_DATA_VALIDATORS,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type { SwapsTokenObject } from '../constants/tokens';\nimport { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from '../constants/tokens';\nimport type {\n FeatureFlagResponse,\n FeeData,\n Quote,\n QuoteRequest,\n QuoteResponse,\n TxData,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n} from '../types';\nimport { BridgeFlag, FeeType, BridgeFeatureFlagsKey } from '../types';\n\n// TODO put this back in once we have a fetchWithCache equivalent\n// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;\n\nexport const getClientIdHeader = (clientId: string) => ({\n 'X-Client-Id': clientId,\n});\n\n/**\n * Fetches the bridge feature flags\n *\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<BridgeFeatureFlags> {\n const url = `${getBridgeApiBaseUrl()}/getAllFeatureFlags`;\n const rawFeatureFlags = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n if (\n validateResponse<FeatureFlagResponse>(\n FEATURE_FLAG_VALIDATORS,\n rawFeatureFlags,\n url,\n )\n ) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [numberToHex(Number(chainId))]: value,\n }),\n {},\n );\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG],\n chains: getChainsObj(\n rawFeatureFlags[BridgeFlag.EXTENSION_CONFIG].chains,\n ),\n },\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: {\n ...rawFeatureFlags[BridgeFlag.MOBILE_CONFIG],\n chains: getChainsObj(rawFeatureFlags[BridgeFlag.MOBILE_CONFIG].chains),\n },\n };\n }\n\n return {\n [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n [BridgeFeatureFlagsKey.MOBILE_CONFIG]: DEFAULT_FEATURE_FLAG_CONFIG,\n };\n}\n\n/**\n * Returns a list of enabled (unblocked) tokens\n *\n * @param chainId - The chain ID to fetch tokens for\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<Record<string, SwapsTokenObject>> {\n // TODO make token api v2 call\n const url = `${getBridgeApiBaseUrl()}/getTokens?chainId=${hexToNumber(\n chainId,\n )}`;\n\n // TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:\n // If we allow selecting dest networks which the user has not imported,\n // note that the Assets controller won't be able to provide tokens. In extension we fetch+cache the token list from bridge-api to handle this\n const tokens = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n });\n\n const nativeToken =\n SWAPS_CHAINID_DEFAULT_TOKEN_MAP[\n chainId as keyof typeof SWAPS_CHAINID_DEFAULT_TOKEN_MAP\n ];\n\n const transformedTokens: Record<string, SwapsTokenObject> = {};\n if (nativeToken) {\n transformedTokens[nativeToken.address] = nativeToken;\n }\n\n tokens.forEach((token: unknown) => {\n if (\n validateResponse<SwapsTokenObject>(TOKEN_VALIDATORS, token, url, false) &&\n !(\n isSwapsDefaultTokenSymbol(token.symbol, chainId) ||\n isSwapsDefaultTokenAddress(token.address, chainId)\n )\n ) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n// Returns a list of bridge tx quotes\n/**\n *\n * @param request - The quote request\n * @param signal - The abort signal\n * @param clientId - The client ID for metrics\n * @param fetchFn - The fetch function to use\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: QuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n): Promise<QuoteResponse[]> {\n const queryParams = new URLSearchParams({\n walletAddress: request.walletAddress,\n srcChainId: request.srcChainId.toString(),\n destChainId: request.destChainId.toString(),\n srcTokenAddress: request.srcTokenAddress,\n destTokenAddress: request.destTokenAddress,\n srcTokenAmount: request.srcTokenAmount,\n slippage: request.slippage.toString(),\n insufficientBal: request.insufficientBal ? 'true' : 'false',\n resetApproval: request.resetApproval ? 'true' : 'false',\n });\n const url = `${getBridgeApiBaseUrl()}/getQuote?${queryParams}`;\n const quotes = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: QuoteResponse) => {\n const { quote, approval, trade } = quoteResponse;\n return (\n validateResponse<QuoteResponse>(\n QUOTE_RESPONSE_VALIDATORS,\n quoteResponse,\n url,\n ) &&\n validateResponse<Quote>(QUOTE_VALIDATORS, quote, url) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.srcAsset,\n url,\n ) &&\n validateResponse<SwapsTokenObject>(\n TOKEN_VALIDATORS,\n quote.destAsset,\n url,\n ) &&\n validateResponse<TxData>(TX_DATA_VALIDATORS, trade, url) &&\n validateResponse<FeeData>(\n FEE_DATA_VALIDATORS,\n quote.feeData[FeeType.METABRIDGE],\n url,\n ) &&\n (approval\n ? validateResponse<TxData>(TX_DATA_VALIDATORS, approval, url)\n : true)\n );\n });\n return filteredQuotes;\n}\n"]}
|
|
@@ -14,7 +14,7 @@ export declare const validateResponse: <ExpectedResponse>(validators: Validator<
|
|
|
14
14
|
export declare const FEATURE_FLAG_VALIDATORS: {
|
|
15
15
|
property: BridgeFlag;
|
|
16
16
|
type: string;
|
|
17
|
-
validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag>;
|
|
17
|
+
validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG>;
|
|
18
18
|
}[];
|
|
19
19
|
export declare const TOKEN_AGGREGATOR_VALIDATORS: {
|
|
20
20
|
property: string;
|
|
@@ -14,7 +14,7 @@ export declare const validateResponse: <ExpectedResponse>(validators: Validator<
|
|
|
14
14
|
export declare const FEATURE_FLAG_VALIDATORS: {
|
|
15
15
|
property: BridgeFlag;
|
|
16
16
|
type: string;
|
|
17
|
-
validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag>;
|
|
17
|
+
validator: (v: unknown) => v is Pick<FeatureFlagResponse, BridgeFlag.EXTENSION_CONFIG>;
|
|
18
18
|
}[];
|
|
19
19
|
export declare const TOKEN_AGGREGATOR_VALIDATORS: {
|
|
20
20
|
property: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/bridge-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Manages bridge-related quote fetching functionality for MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"ethers": "^6.12.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@metamask/accounts-controller": "^24.
|
|
58
|
+
"@metamask/accounts-controller": "^24.1.0",
|
|
59
59
|
"@metamask/auto-changelog": "^3.4.4",
|
|
60
60
|
"@metamask/eth-json-rpc-provider": "^4.1.8",
|
|
61
61
|
"@metamask/network-controller": "^22.2.1",
|