@metamask/bridge-controller 9.0.0 → 11.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 +29 -1
- package/dist/bridge-controller.cjs +96 -25
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +5 -5
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +5 -5
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +97 -26
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/constants/bridge.cjs +2 -1
- package/dist/constants/bridge.cjs.map +1 -1
- package/dist/constants/bridge.d.cts +2 -1
- package/dist/constants/bridge.d.cts.map +1 -1
- package/dist/constants/bridge.d.mts +2 -1
- package/dist/constants/bridge.d.mts.map +1 -1
- package/dist/constants/bridge.mjs +2 -1
- package/dist/constants/bridge.mjs.map +1 -1
- package/dist/constants/chains.cjs +1 -12
- package/dist/constants/chains.cjs.map +1 -1
- package/dist/constants/chains.d.cts +0 -2
- package/dist/constants/chains.d.cts.map +1 -1
- package/dist/constants/chains.d.mts +0 -2
- package/dist/constants/chains.d.mts.map +1 -1
- package/dist/constants/chains.mjs +0 -11
- package/dist/constants/chains.mjs.map +1 -1
- package/dist/constants/tokens.cjs +61 -38
- package/dist/constants/tokens.cjs.map +1 -1
- package/dist/constants/tokens.d.cts +100 -48
- package/dist/constants/tokens.d.cts.map +1 -1
- package/dist/constants/tokens.d.mts +100 -48
- package/dist/constants/tokens.d.mts.map +1 -1
- package/dist/constants/tokens.mjs +37 -14
- package/dist/constants/tokens.mjs.map +1 -1
- package/dist/index.cjs +21 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +16 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +11 -2
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs +4 -3
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +108 -54
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +108 -54
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +4 -3
- package/dist/types.mjs.map +1 -1
- package/dist/utils/balance.cjs +2 -2
- package/dist/utils/balance.cjs.map +1 -1
- package/dist/utils/balance.d.cts.map +1 -1
- package/dist/utils/balance.d.mts.map +1 -1
- package/dist/utils/balance.mjs +2 -2
- package/dist/utils/balance.mjs.map +1 -1
- package/dist/utils/bridge.cjs +65 -5
- package/dist/utils/bridge.cjs.map +1 -1
- package/dist/utils/bridge.d.cts +27 -4
- package/dist/utils/bridge.d.cts.map +1 -1
- package/dist/utils/bridge.d.mts +27 -4
- package/dist/utils/bridge.d.mts.map +1 -1
- package/dist/utils/bridge.mjs +62 -5
- package/dist/utils/bridge.mjs.map +1 -1
- package/dist/utils/caip-formatters.cjs +102 -0
- package/dist/utils/caip-formatters.cjs.map +1 -0
- package/dist/utils/caip-formatters.d.cts +31 -0
- package/dist/utils/caip-formatters.d.cts.map +1 -0
- package/dist/utils/caip-formatters.d.mts +31 -0
- package/dist/utils/caip-formatters.d.mts.map +1 -0
- package/dist/utils/caip-formatters.mjs +95 -0
- package/dist/utils/caip-formatters.mjs.map +1 -0
- package/dist/utils/fetch.cjs +34 -26
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +6 -5
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +6 -5
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +32 -24
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/quote.cjs +12 -2
- package/dist/utils/quote.cjs.map +1 -1
- package/dist/utils/quote.d.cts +2 -2
- package/dist/utils/quote.d.cts.map +1 -1
- package/dist/utils/quote.d.mts +2 -2
- package/dist/utils/quote.d.mts.map +1 -1
- package/dist/utils/quote.mjs +12 -2
- package/dist/utils/quote.mjs.map +1 -1
- package/dist/utils/validators.cjs +15 -16
- package/dist/utils/validators.cjs.map +1 -1
- package/dist/utils/validators.d.cts +2 -3
- package/dist/utils/validators.d.cts.map +1 -1
- package/dist/utils/validators.d.mts +2 -3
- package/dist/utils/validators.d.mts.map +1 -1
- package/dist/utils/validators.mjs +16 -17
- package/dist/utils/validators.mjs.map +1 -1
- package/package.json +9 -4
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Hex, type CaipChainId } from "@metamask/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a chainId to a CaipChainId
|
|
4
|
+
*
|
|
5
|
+
* @param chainId - The chainId to convert
|
|
6
|
+
* @returns The CaipChainId
|
|
7
|
+
*/
|
|
8
|
+
export declare const formatChainIdToCaip: (chainId: Hex | number | CaipChainId | string) => CaipChainId;
|
|
9
|
+
/**
|
|
10
|
+
* Converts a chainId to a decimal number that can be used for bridge-api requests
|
|
11
|
+
*
|
|
12
|
+
* @param chainId - The chainId to convert
|
|
13
|
+
* @returns The decimal number
|
|
14
|
+
*/
|
|
15
|
+
export declare const formatChainIdToDec: (chainId: number | Hex | CaipChainId | string) => number;
|
|
16
|
+
/**
|
|
17
|
+
* Converts a chainId to a hex string used to read controller data within the app
|
|
18
|
+
* Hex chainIds are also used for fetching exchange rates
|
|
19
|
+
*
|
|
20
|
+
* @param chainId - The chainId to convert
|
|
21
|
+
* @returns The hex string
|
|
22
|
+
*/
|
|
23
|
+
export declare const formatChainIdToHex: (chainId: Hex | CaipChainId | string | number) => Hex;
|
|
24
|
+
/**
|
|
25
|
+
* Converts an asset or account address to a string that can be used for bridge-api requests
|
|
26
|
+
*
|
|
27
|
+
* @param address - The address to convert
|
|
28
|
+
* @returns The converted address
|
|
29
|
+
*/
|
|
30
|
+
export declare const formatAddressToCaipReference: (address: string) => string;
|
|
31
|
+
//# sourceMappingURL=caip-formatters.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caip-formatters.d.mts","sourceRoot":"","sources":["../../src/utils/caip-formatters.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,WAAW,EAMjB,wBAAwB;AAKzB;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,YACrB,GAAG,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,KAC3C,WAWF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,YACpB,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,MAAM,WAe7C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,YACpB,GAAG,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,KAC3C,GAgBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,YAAa,MAAM,WAgB3D,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getAddress } from "@ethersproject/address";
|
|
2
|
+
import { AddressZero } from "@ethersproject/constants";
|
|
3
|
+
import { convertHexToDecimal } from "@metamask/controller-utils";
|
|
4
|
+
import { SolScope } from "@metamask/keyring-api";
|
|
5
|
+
import { toEvmCaipChainId } from "@metamask/multichain-network-controller";
|
|
6
|
+
import { isCaipChainId, isStrictHexString, parseCaipChainId, isCaipReference, numberToHex } from "@metamask/utils";
|
|
7
|
+
import { isNativeAddress, isSolanaChainId } from "./bridge.mjs";
|
|
8
|
+
import { ChainId } from "../types.mjs";
|
|
9
|
+
/**
|
|
10
|
+
* Converts a chainId to a CaipChainId
|
|
11
|
+
*
|
|
12
|
+
* @param chainId - The chainId to convert
|
|
13
|
+
* @returns The CaipChainId
|
|
14
|
+
*/
|
|
15
|
+
export const formatChainIdToCaip = (chainId) => {
|
|
16
|
+
if (isCaipChainId(chainId)) {
|
|
17
|
+
return chainId;
|
|
18
|
+
}
|
|
19
|
+
if (isStrictHexString(chainId)) {
|
|
20
|
+
return toEvmCaipChainId(chainId);
|
|
21
|
+
}
|
|
22
|
+
if (isSolanaChainId(chainId)) {
|
|
23
|
+
return SolScope.Mainnet;
|
|
24
|
+
}
|
|
25
|
+
return toEvmCaipChainId(numberToHex(Number(chainId)));
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Converts a chainId to a decimal number that can be used for bridge-api requests
|
|
29
|
+
*
|
|
30
|
+
* @param chainId - The chainId to convert
|
|
31
|
+
* @returns The decimal number
|
|
32
|
+
*/
|
|
33
|
+
export const formatChainIdToDec = (chainId) => {
|
|
34
|
+
if (isStrictHexString(chainId)) {
|
|
35
|
+
return convertHexToDecimal(chainId);
|
|
36
|
+
}
|
|
37
|
+
if (chainId === SolScope.Mainnet) {
|
|
38
|
+
return ChainId.SOLANA;
|
|
39
|
+
}
|
|
40
|
+
if (isCaipChainId(chainId)) {
|
|
41
|
+
return Number(chainId.split(':').at(-1));
|
|
42
|
+
}
|
|
43
|
+
if (typeof chainId === 'string') {
|
|
44
|
+
return parseInt(chainId, 10);
|
|
45
|
+
}
|
|
46
|
+
return chainId;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Converts a chainId to a hex string used to read controller data within the app
|
|
50
|
+
* Hex chainIds are also used for fetching exchange rates
|
|
51
|
+
*
|
|
52
|
+
* @param chainId - The chainId to convert
|
|
53
|
+
* @returns The hex string
|
|
54
|
+
*/
|
|
55
|
+
export const formatChainIdToHex = (chainId) => {
|
|
56
|
+
if (isStrictHexString(chainId)) {
|
|
57
|
+
return chainId;
|
|
58
|
+
}
|
|
59
|
+
if (typeof chainId === 'number' || parseInt(chainId, 10)) {
|
|
60
|
+
return numberToHex(Number(chainId));
|
|
61
|
+
}
|
|
62
|
+
if (isCaipChainId(chainId)) {
|
|
63
|
+
const { reference } = parseCaipChainId(chainId);
|
|
64
|
+
if (isCaipReference(reference) && !isNaN(Number(reference))) {
|
|
65
|
+
return numberToHex(Number(reference));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Throw an error if a non-evm chainId is passed to this function
|
|
69
|
+
// This should never happen, but it's a sanity check
|
|
70
|
+
throw new Error(`Invalid cross-chain swaps chainId: ${chainId}`);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Converts an asset or account address to a string that can be used for bridge-api requests
|
|
74
|
+
*
|
|
75
|
+
* @param address - The address to convert
|
|
76
|
+
* @returns The converted address
|
|
77
|
+
*/
|
|
78
|
+
export const formatAddressToCaipReference = (address) => {
|
|
79
|
+
if (isStrictHexString(address)) {
|
|
80
|
+
return getAddress(address);
|
|
81
|
+
}
|
|
82
|
+
// If the address looks like a native token, return the zero address because it's
|
|
83
|
+
// what bridge-api uses to represent a native asset
|
|
84
|
+
if (isNativeAddress(address)) {
|
|
85
|
+
return AddressZero;
|
|
86
|
+
}
|
|
87
|
+
const addressWithoutPrefix = address.split(':').at(-1);
|
|
88
|
+
// If the address is not a valid hex string or CAIP address, throw an error
|
|
89
|
+
// This should never happen, but it's a sanity check
|
|
90
|
+
if (!addressWithoutPrefix) {
|
|
91
|
+
throw new Error('Invalid address');
|
|
92
|
+
}
|
|
93
|
+
return addressWithoutPrefix;
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=caip-formatters.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caip-formatters.mjs","sourceRoot":"","sources":["../../src/utils/caip-formatters.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAddress } from '@ethersproject/address';\nimport { AddressZero } from '@ethersproject/constants';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport { toEvmCaipChainId } from '@metamask/multichain-network-controller';\nimport {\n type Hex,\n type CaipChainId,\n isCaipChainId,\n isStrictHexString,\n parseCaipChainId,\n isCaipReference,\n numberToHex,\n} from '@metamask/utils';\n\nimport { isNativeAddress, isSolanaChainId } from './bridge';\nimport { ChainId } from '../types';\n\n/**\n * Converts a chainId to a CaipChainId\n *\n * @param chainId - The chainId to convert\n * @returns The CaipChainId\n */\nexport const formatChainIdToCaip = (\n chainId: Hex | number | CaipChainId | string,\n): CaipChainId => {\n if (isCaipChainId(chainId)) {\n return chainId;\n }\n if (isStrictHexString(chainId)) {\n return toEvmCaipChainId(chainId);\n }\n if (isSolanaChainId(chainId)) {\n return SolScope.Mainnet;\n }\n return toEvmCaipChainId(numberToHex(Number(chainId)));\n};\n\n/**\n * Converts a chainId to a decimal number that can be used for bridge-api requests\n *\n * @param chainId - The chainId to convert\n * @returns The decimal number\n */\nexport const formatChainIdToDec = (\n chainId: number | Hex | CaipChainId | string,\n) => {\n if (isStrictHexString(chainId)) {\n return convertHexToDecimal(chainId);\n }\n if (chainId === SolScope.Mainnet) {\n return ChainId.SOLANA;\n }\n if (isCaipChainId(chainId)) {\n return Number(chainId.split(':').at(-1));\n }\n if (typeof chainId === 'string') {\n return parseInt(chainId, 10);\n }\n return chainId;\n};\n\n/**\n * Converts a chainId to a hex string used to read controller data within the app\n * Hex chainIds are also used for fetching exchange rates\n *\n * @param chainId - The chainId to convert\n * @returns The hex string\n */\nexport const formatChainIdToHex = (\n chainId: Hex | CaipChainId | string | number,\n): Hex => {\n if (isStrictHexString(chainId)) {\n return chainId;\n }\n if (typeof chainId === 'number' || parseInt(chainId, 10)) {\n return numberToHex(Number(chainId));\n }\n if (isCaipChainId(chainId)) {\n const { reference } = parseCaipChainId(chainId);\n if (isCaipReference(reference) && !isNaN(Number(reference))) {\n return numberToHex(Number(reference));\n }\n }\n // Throw an error if a non-evm chainId is passed to this function\n // This should never happen, but it's a sanity check\n throw new Error(`Invalid cross-chain swaps chainId: ${chainId}`);\n};\n\n/**\n * Converts an asset or account address to a string that can be used for bridge-api requests\n *\n * @param address - The address to convert\n * @returns The converted address\n */\nexport const formatAddressToCaipReference = (address: string) => {\n if (isStrictHexString(address)) {\n return getAddress(address);\n }\n // If the address looks like a native token, return the zero address because it's\n // what bridge-api uses to represent a native asset\n if (isNativeAddress(address)) {\n return AddressZero;\n }\n const addressWithoutPrefix = address.split(':').at(-1);\n // If the address is not a valid hex string or CAIP address, throw an error\n // This should never happen, but it's a sanity check\n if (!addressWithoutPrefix) {\n throw new Error('Invalid address');\n }\n return addressWithoutPrefix;\n};\n"]}
|
package/dist/utils/fetch.cjs
CHANGED
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fetchBridgeQuotes = exports.fetchBridgeTokens = exports.fetchBridgeFeatureFlags = exports.getClientIdHeader = void 0;
|
|
4
4
|
const utils_1 = require("@metamask/utils");
|
|
5
|
-
const
|
|
5
|
+
const caip_formatters_1 = require("./caip-formatters.cjs");
|
|
6
6
|
const validators_1 = require("./validators.cjs");
|
|
7
|
-
const
|
|
8
|
-
const tokens_1 = require("../constants/tokens.cjs");
|
|
7
|
+
const bridge_1 = require("../constants/bridge.cjs");
|
|
9
8
|
const types_1 = require("../types.cjs");
|
|
10
|
-
|
|
11
|
-
// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;
|
|
9
|
+
const CACHE_REFRESH_TEN_MINUTES = 10 * utils_1.Duration.Minute;
|
|
12
10
|
const getClientIdHeader = (clientId) => ({
|
|
13
11
|
'X-Client-Id': clientId,
|
|
14
12
|
});
|
|
@@ -25,11 +23,13 @@ async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUrl) {
|
|
|
25
23
|
const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;
|
|
26
24
|
const rawFeatureFlags = await fetchFn(url, {
|
|
27
25
|
headers: (0, exports.getClientIdHeader)(clientId),
|
|
26
|
+
cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
|
|
27
|
+
functionName: 'fetchBridgeFeatureFlags',
|
|
28
28
|
});
|
|
29
29
|
if ((0, validators_1.validateFeatureFlagsResponse)(rawFeatureFlags)) {
|
|
30
30
|
const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
|
|
31
31
|
...acc,
|
|
32
|
-
[(0,
|
|
32
|
+
[(0, caip_formatters_1.formatChainIdToCaip)(chainId)]: value,
|
|
33
33
|
}), {});
|
|
34
34
|
return {
|
|
35
35
|
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
|
|
@@ -43,8 +43,8 @@ async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUrl) {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
return {
|
|
46
|
-
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]:
|
|
47
|
-
[types_1.BridgeFeatureFlagsKey.MOBILE_CONFIG]:
|
|
46
|
+
[types_1.BridgeFeatureFlagsKey.EXTENSION_CONFIG]: bridge_1.DEFAULT_FEATURE_FLAG_CONFIG,
|
|
47
|
+
[types_1.BridgeFeatureFlagsKey.MOBILE_CONFIG]: bridge_1.DEFAULT_FEATURE_FLAG_CONFIG,
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
exports.fetchBridgeFeatureFlags = fetchBridgeFeatureFlags;
|
|
@@ -59,30 +59,27 @@ exports.fetchBridgeFeatureFlags = fetchBridgeFeatureFlags;
|
|
|
59
59
|
*/
|
|
60
60
|
async function fetchBridgeTokens(chainId, clientId, fetchFn, bridgeApiBaseUrl) {
|
|
61
61
|
// TODO make token api v2 call
|
|
62
|
-
const url = `${bridgeApiBaseUrl}/getTokens?chainId=${(0,
|
|
62
|
+
const url = `${bridgeApiBaseUrl}/getTokens?chainId=${(0, caip_formatters_1.formatChainIdToDec)(chainId)}`;
|
|
63
63
|
// TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:
|
|
64
64
|
// If we allow selecting dest networks which the user has not imported,
|
|
65
65
|
// 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
|
|
66
66
|
const tokens = await fetchFn(url, {
|
|
67
67
|
headers: (0, exports.getClientIdHeader)(clientId),
|
|
68
|
+
cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
|
|
69
|
+
functionName: 'fetchBridgeTokens',
|
|
68
70
|
});
|
|
69
|
-
const nativeToken = tokens_1.SWAPS_CHAINID_DEFAULT_TOKEN_MAP[chainId];
|
|
70
71
|
const transformedTokens = {};
|
|
71
|
-
if (nativeToken) {
|
|
72
|
-
transformedTokens[nativeToken.address] = nativeToken;
|
|
73
|
-
}
|
|
74
72
|
tokens.forEach((token) => {
|
|
75
|
-
if ((0, validators_1.validateSwapsTokenObject)(token)
|
|
76
|
-
!((0, bridge_1.isSwapsDefaultTokenSymbol)(token.symbol, chainId) ||
|
|
77
|
-
(0, bridge_1.isSwapsDefaultTokenAddress)(token.address, chainId))) {
|
|
73
|
+
if ((0, validators_1.validateSwapsTokenObject)(token)) {
|
|
78
74
|
transformedTokens[token.address] = token;
|
|
79
75
|
}
|
|
80
76
|
});
|
|
81
77
|
return transformedTokens;
|
|
82
78
|
}
|
|
83
79
|
exports.fetchBridgeTokens = fetchBridgeTokens;
|
|
84
|
-
// Returns a list of bridge tx quotes
|
|
85
80
|
/**
|
|
81
|
+
* Converts the generic quote request to the type that the bridge-api expects
|
|
82
|
+
* then fetches quotes from the bridge-api
|
|
86
83
|
*
|
|
87
84
|
* @param request - The quote request
|
|
88
85
|
* @param signal - The abort signal
|
|
@@ -92,21 +89,32 @@ exports.fetchBridgeTokens = fetchBridgeTokens;
|
|
|
92
89
|
* @returns A list of bridge tx quotes
|
|
93
90
|
*/
|
|
94
91
|
async function fetchBridgeQuotes(request, signal, clientId, fetchFn, bridgeApiBaseUrl) {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
92
|
+
const destWalletAddress = request.destWalletAddress ?? request.walletAddress;
|
|
93
|
+
// Transform the generic quote request into QuoteRequest
|
|
94
|
+
const normalizedRequest = {
|
|
95
|
+
walletAddress: (0, caip_formatters_1.formatAddressToCaipReference)(request.walletAddress),
|
|
96
|
+
destWalletAddress: (0, caip_formatters_1.formatAddressToCaipReference)(destWalletAddress),
|
|
97
|
+
srcChainId: (0, caip_formatters_1.formatChainIdToDec)(request.srcChainId),
|
|
98
|
+
destChainId: (0, caip_formatters_1.formatChainIdToDec)(request.destChainId),
|
|
99
|
+
srcTokenAddress: (0, caip_formatters_1.formatAddressToCaipReference)(request.srcTokenAddress),
|
|
100
|
+
destTokenAddress: (0, caip_formatters_1.formatAddressToCaipReference)(request.destTokenAddress),
|
|
101
101
|
srcTokenAmount: request.srcTokenAmount,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
insufficientBal: Boolean(request.insufficientBal),
|
|
103
|
+
resetApproval: Boolean(request.resetApproval),
|
|
104
|
+
};
|
|
105
|
+
if (request.slippage !== undefined) {
|
|
106
|
+
normalizedRequest.slippage = request.slippage;
|
|
107
|
+
}
|
|
108
|
+
const queryParams = new URLSearchParams();
|
|
109
|
+
Object.entries(normalizedRequest).forEach(([key, value]) => {
|
|
110
|
+
queryParams.append(key, value.toString());
|
|
105
111
|
});
|
|
106
112
|
const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;
|
|
107
113
|
const quotes = await fetchFn(url, {
|
|
108
114
|
headers: (0, exports.getClientIdHeader)(clientId),
|
|
109
115
|
signal,
|
|
116
|
+
cacheOptions: { cacheRefreshTime: 0 },
|
|
117
|
+
functionName: 'fetchBridgeQuotes',
|
|
110
118
|
});
|
|
111
119
|
const filteredQuotes = quotes.filter((quoteResponse) => {
|
|
112
120
|
return (0, validators_1.validateQuoteResponse)(quoteResponse);
|
package/dist/utils/fetch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"fetch.cjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipChainId, Hex } from '@metamask/utils';\nimport { Duration } from '@metamask/utils';\n\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToDec,\n} from './caip-formatters';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type {\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\nconst 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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeFeatureFlags',\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, BridgeAsset>> {\n // TODO make token api v2 call\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\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 cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeTokens',\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateSwapsTokenObject(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n * then fetches quotes from the bridge-api\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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n cacheOptions: { cacheRefreshTime: 0 },\n functionName: 'fetchBridgeQuotes',\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
|
package/dist/utils/fetch.d.cts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type {
|
|
3
|
-
import type { QuoteRequest, QuoteResponse, BridgeFeatureFlags, FetchFunction } from "../types.cjs";
|
|
1
|
+
import type { CaipChainId, Hex } from "@metamask/utils";
|
|
2
|
+
import type { QuoteResponse, BridgeFeatureFlags, FetchFunction, GenericQuoteRequest, BridgeAsset } from "../types.cjs";
|
|
4
3
|
export declare const getClientIdHeader: (clientId: string) => {
|
|
5
4
|
'X-Client-Id': string;
|
|
6
5
|
};
|
|
@@ -22,8 +21,10 @@ export declare function fetchBridgeFeatureFlags(clientId: string, fetchFn: Fetch
|
|
|
22
21
|
* @param bridgeApiBaseUrl - The base URL for the bridge API
|
|
23
22
|
* @returns A list of enabled (unblocked) tokens
|
|
24
23
|
*/
|
|
25
|
-
export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string,
|
|
24
|
+
export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, BridgeAsset>>;
|
|
26
25
|
/**
|
|
26
|
+
* Converts the generic quote request to the type that the bridge-api expects
|
|
27
|
+
* then fetches quotes from the bridge-api
|
|
27
28
|
*
|
|
28
29
|
* @param request - The quote request
|
|
29
30
|
* @param signal - The abort signal
|
|
@@ -32,5 +33,5 @@ export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchF
|
|
|
32
33
|
* @param bridgeApiBaseUrl - The base URL for the bridge API
|
|
33
34
|
* @returns A list of bridge tx quotes
|
|
34
35
|
*/
|
|
35
|
-
export declare function fetchBridgeQuotes(request:
|
|
36
|
+
export declare function fetchBridgeQuotes(request: GenericQuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
|
|
36
37
|
//# sourceMappingURL=fetch.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.d.cts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAcxD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EAEnB,WAAW,EACZ,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,GAAG,WAAW,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAoBtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B"}
|
package/dist/utils/fetch.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type {
|
|
3
|
-
import type { QuoteRequest, QuoteResponse, BridgeFeatureFlags, FetchFunction } from "../types.mjs";
|
|
1
|
+
import type { CaipChainId, Hex } from "@metamask/utils";
|
|
2
|
+
import type { QuoteResponse, BridgeFeatureFlags, FetchFunction, GenericQuoteRequest, BridgeAsset } from "../types.mjs";
|
|
4
3
|
export declare const getClientIdHeader: (clientId: string) => {
|
|
5
4
|
'X-Client-Id': string;
|
|
6
5
|
};
|
|
@@ -22,8 +21,10 @@ export declare function fetchBridgeFeatureFlags(clientId: string, fetchFn: Fetch
|
|
|
22
21
|
* @param bridgeApiBaseUrl - The base URL for the bridge API
|
|
23
22
|
* @returns A list of enabled (unblocked) tokens
|
|
24
23
|
*/
|
|
25
|
-
export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string,
|
|
24
|
+
export declare function fetchBridgeTokens(chainId: Hex | CaipChainId, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<Record<string, BridgeAsset>>;
|
|
26
25
|
/**
|
|
26
|
+
* Converts the generic quote request to the type that the bridge-api expects
|
|
27
|
+
* then fetches quotes from the bridge-api
|
|
27
28
|
*
|
|
28
29
|
* @param request - The quote request
|
|
29
30
|
* @param signal - The abort signal
|
|
@@ -32,5 +33,5 @@ export declare function fetchBridgeTokens(chainId: Hex, clientId: string, fetchF
|
|
|
32
33
|
* @param bridgeApiBaseUrl - The base URL for the bridge API
|
|
33
34
|
* @returns A list of bridge tx quotes
|
|
34
35
|
*/
|
|
35
|
-
export declare function fetchBridgeQuotes(request:
|
|
36
|
+
export declare function fetchBridgeQuotes(request: GenericQuoteRequest, signal: AbortSignal, clientId: string, fetchFn: FetchFunction, bridgeApiBaseUrl: string): Promise<QuoteResponse[]>;
|
|
36
37
|
//# sourceMappingURL=fetch.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAcxD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,mBAAmB,EAEnB,WAAW,EACZ,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,aAAc,MAAM;;CAEhD,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,GAAG,WAAW,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAoBtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkC1B"}
|
package/dist/utils/fetch.mjs
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Duration } from "@metamask/utils";
|
|
2
|
+
import { formatAddressToCaipReference, formatChainIdToCaip, formatChainIdToDec } from "./caip-formatters.mjs";
|
|
3
3
|
import { validateFeatureFlagsResponse, validateQuoteResponse, validateSwapsTokenObject } from "./validators.mjs";
|
|
4
4
|
import { DEFAULT_FEATURE_FLAG_CONFIG } from "../constants/bridge.mjs";
|
|
5
|
-
import { SWAPS_CHAINID_DEFAULT_TOKEN_MAP } from "../constants/tokens.mjs";
|
|
6
5
|
import { BridgeFlag, BridgeFeatureFlagsKey } from "../types.mjs";
|
|
7
|
-
|
|
8
|
-
// const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;
|
|
6
|
+
const CACHE_REFRESH_TEN_MINUTES = 10 * Duration.Minute;
|
|
9
7
|
export const getClientIdHeader = (clientId) => ({
|
|
10
8
|
'X-Client-Id': clientId,
|
|
11
9
|
});
|
|
@@ -21,11 +19,13 @@ export async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUr
|
|
|
21
19
|
const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;
|
|
22
20
|
const rawFeatureFlags = await fetchFn(url, {
|
|
23
21
|
headers: getClientIdHeader(clientId),
|
|
22
|
+
cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
|
|
23
|
+
functionName: 'fetchBridgeFeatureFlags',
|
|
24
24
|
});
|
|
25
25
|
if (validateFeatureFlagsResponse(rawFeatureFlags)) {
|
|
26
26
|
const getChainsObj = (chains) => Object.entries(chains).reduce((acc, [chainId, value]) => ({
|
|
27
27
|
...acc,
|
|
28
|
-
[
|
|
28
|
+
[formatChainIdToCaip(chainId)]: value,
|
|
29
29
|
}), {});
|
|
30
30
|
return {
|
|
31
31
|
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
|
|
@@ -54,29 +54,26 @@ export async function fetchBridgeFeatureFlags(clientId, fetchFn, bridgeApiBaseUr
|
|
|
54
54
|
*/
|
|
55
55
|
export async function fetchBridgeTokens(chainId, clientId, fetchFn, bridgeApiBaseUrl) {
|
|
56
56
|
// TODO make token api v2 call
|
|
57
|
-
const url = `${bridgeApiBaseUrl}/getTokens?chainId=${
|
|
57
|
+
const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;
|
|
58
58
|
// TODO we will need to cache these. In Extension fetchWithCache is used. This is due to the following:
|
|
59
59
|
// If we allow selecting dest networks which the user has not imported,
|
|
60
60
|
// 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
|
|
61
61
|
const tokens = await fetchFn(url, {
|
|
62
62
|
headers: getClientIdHeader(clientId),
|
|
63
|
+
cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },
|
|
64
|
+
functionName: 'fetchBridgeTokens',
|
|
63
65
|
});
|
|
64
|
-
const nativeToken = SWAPS_CHAINID_DEFAULT_TOKEN_MAP[chainId];
|
|
65
66
|
const transformedTokens = {};
|
|
66
|
-
if (nativeToken) {
|
|
67
|
-
transformedTokens[nativeToken.address] = nativeToken;
|
|
68
|
-
}
|
|
69
67
|
tokens.forEach((token) => {
|
|
70
|
-
if (validateSwapsTokenObject(token)
|
|
71
|
-
!(isSwapsDefaultTokenSymbol(token.symbol, chainId) ||
|
|
72
|
-
isSwapsDefaultTokenAddress(token.address, chainId))) {
|
|
68
|
+
if (validateSwapsTokenObject(token)) {
|
|
73
69
|
transformedTokens[token.address] = token;
|
|
74
70
|
}
|
|
75
71
|
});
|
|
76
72
|
return transformedTokens;
|
|
77
73
|
}
|
|
78
|
-
// Returns a list of bridge tx quotes
|
|
79
74
|
/**
|
|
75
|
+
* Converts the generic quote request to the type that the bridge-api expects
|
|
76
|
+
* then fetches quotes from the bridge-api
|
|
80
77
|
*
|
|
81
78
|
* @param request - The quote request
|
|
82
79
|
* @param signal - The abort signal
|
|
@@ -86,21 +83,32 @@ export async function fetchBridgeTokens(chainId, clientId, fetchFn, bridgeApiBas
|
|
|
86
83
|
* @returns A list of bridge tx quotes
|
|
87
84
|
*/
|
|
88
85
|
export async function fetchBridgeQuotes(request, signal, clientId, fetchFn, bridgeApiBaseUrl) {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
const destWalletAddress = request.destWalletAddress ?? request.walletAddress;
|
|
87
|
+
// Transform the generic quote request into QuoteRequest
|
|
88
|
+
const normalizedRequest = {
|
|
89
|
+
walletAddress: formatAddressToCaipReference(request.walletAddress),
|
|
90
|
+
destWalletAddress: formatAddressToCaipReference(destWalletAddress),
|
|
91
|
+
srcChainId: formatChainIdToDec(request.srcChainId),
|
|
92
|
+
destChainId: formatChainIdToDec(request.destChainId),
|
|
93
|
+
srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),
|
|
94
|
+
destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),
|
|
95
95
|
srcTokenAmount: request.srcTokenAmount,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
insufficientBal: Boolean(request.insufficientBal),
|
|
97
|
+
resetApproval: Boolean(request.resetApproval),
|
|
98
|
+
};
|
|
99
|
+
if (request.slippage !== undefined) {
|
|
100
|
+
normalizedRequest.slippage = request.slippage;
|
|
101
|
+
}
|
|
102
|
+
const queryParams = new URLSearchParams();
|
|
103
|
+
Object.entries(normalizedRequest).forEach(([key, value]) => {
|
|
104
|
+
queryParams.append(key, value.toString());
|
|
99
105
|
});
|
|
100
106
|
const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;
|
|
101
107
|
const quotes = await fetchFn(url, {
|
|
102
108
|
headers: getClientIdHeader(clientId),
|
|
103
109
|
signal,
|
|
110
|
+
cacheOptions: { cacheRefreshTime: 0 },
|
|
111
|
+
functionName: 'fetchBridgeQuotes',
|
|
104
112
|
});
|
|
105
113
|
const filteredQuotes = quotes.filter((quoteResponse) => {
|
|
106
114
|
return validateQuoteResponse(quoteResponse);
|
package/dist/utils/fetch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,wBAAwB;AAE3C,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,kBAAkB,EACnB,8BAA0B;AAC3B,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,wBAAwB,EACzB,yBAAqB;AACtB,OAAO,EAAE,2BAA2B,EAAE,gCAA4B;AAUlE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,qBAAiB;AAE7D,MAAM,yBAAyB,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC;IACtD,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,MAAM,GAAG,GAAG,GAAG,gBAAgB,qBAAqB,CAAC;IACrD,MAAM,eAAe,GAAY,MAAM,OAAO,CAAC,GAAG,EAAE;QAClD,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACpC,YAAY,EAAE,EAAE,gBAAgB,EAAE,yBAAyB,EAAE;QAC7D,YAAY,EAAE,yBAAyB;KACxC,CAAC,CAAC;IAEH,IAAI,4BAA4B,CAAC,eAAe,CAAC,EAAE;QACjD,MAAM,YAAY,GAAG,CAAC,MAA0C,EAAE,EAAE,CAClE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,GAAG;YACN,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK;SACtC,CAAC,EACF,EAAE,CACH,CAAC;QAEJ,OAAO;YACL,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,EAAE;gBACxC,GAAG,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC;gBAC/C,MAAM,EAAE,YAAY,CAClB,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,MAAM,CACpD;aACF;YACD,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE;gBACrC,GAAG,eAAe,CAAC,UAAU,CAAC,aAAa,CAAC;gBAC5C,MAAM,EAAE,YAAY,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;aACvE;SACF,CAAC;KACH;IAED,OAAO;QACL,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,2BAA2B;QACrE,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,2BAA2B;KACnE,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA0B,EAC1B,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,8BAA8B;IAC9B,MAAM,GAAG,GAAG,GAAG,gBAAgB,sBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;IAEnF,uGAAuG;IACvG,uEAAuE;IACvE,6IAA6I;IAC7I,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACpC,YAAY,EAAE,EAAE,gBAAgB,EAAE,yBAAyB,EAAE;QAC7D,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAgC,EAAE,CAAC;IAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE;YACnC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;SAC1C;IACH,CAAC,CAAC,CAAC;IACH,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA4B,EAC5B,MAAmB,EACnB,QAAgB,EAChB,OAAsB,EACtB,gBAAwB;IAExB,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAC7E,wDAAwD;IACxD,MAAM,iBAAiB,GAAiB;QACtC,aAAa,EAAE,4BAA4B,CAAC,OAAO,CAAC,aAAa,CAAC;QAClE,iBAAiB,EAAE,4BAA4B,CAAC,iBAAiB,CAAC;QAClE,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;QAClD,WAAW,EAAE,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;QACpD,eAAe,EAAE,4BAA4B,CAAC,OAAO,CAAC,eAAe,CAAC;QACtE,gBAAgB,EAAE,4BAA4B,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACxE,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;QACjD,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;KAC9C,CAAC;IACF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE;QAClC,iBAAiB,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;KAC/C;IAED,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACzD,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,gBAAgB,aAAa,WAAW,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAc,MAAM,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACpC,MAAM;QACN,YAAY,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE;QACrC,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,aAAsB,EAAE,EAAE;QAC9D,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,cAAiC,CAAC;AAC3C,CAAC","sourcesContent":["import type { CaipChainId, Hex } from '@metamask/utils';\nimport { Duration } from '@metamask/utils';\n\nimport {\n formatAddressToCaipReference,\n formatChainIdToCaip,\n formatChainIdToDec,\n} from './caip-formatters';\nimport {\n validateFeatureFlagsResponse,\n validateQuoteResponse,\n validateSwapsTokenObject,\n} from './validators';\nimport { DEFAULT_FEATURE_FLAG_CONFIG } from '../constants/bridge';\nimport type {\n QuoteResponse,\n BridgeFeatureFlags,\n FetchFunction,\n ChainConfiguration,\n GenericQuoteRequest,\n QuoteRequest,\n BridgeAsset,\n} from '../types';\nimport { BridgeFlag, BridgeFeatureFlagsKey } from '../types';\n\nconst 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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns The bridge feature flags\n */\nexport async function fetchBridgeFeatureFlags(\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<BridgeFeatureFlags> {\n const url = `${bridgeApiBaseUrl}/getAllFeatureFlags`;\n const rawFeatureFlags: unknown = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeFeatureFlags',\n });\n\n if (validateFeatureFlagsResponse(rawFeatureFlags)) {\n const getChainsObj = (chains: Record<number, ChainConfiguration>) =>\n Object.entries(chains).reduce(\n (acc, [chainId, value]) => ({\n ...acc,\n [formatChainIdToCaip(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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of enabled (unblocked) tokens\n */\nexport async function fetchBridgeTokens(\n chainId: Hex | CaipChainId,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<Record<string, BridgeAsset>> {\n // TODO make token api v2 call\n const url = `${bridgeApiBaseUrl}/getTokens?chainId=${formatChainIdToDec(chainId)}`;\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 cacheOptions: { cacheRefreshTime: CACHE_REFRESH_TEN_MINUTES },\n functionName: 'fetchBridgeTokens',\n });\n\n const transformedTokens: Record<string, BridgeAsset> = {};\n tokens.forEach((token: unknown) => {\n if (validateSwapsTokenObject(token)) {\n transformedTokens[token.address] = token;\n }\n });\n return transformedTokens;\n}\n\n/**\n * Converts the generic quote request to the type that the bridge-api expects\n * then fetches quotes from the bridge-api\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 * @param bridgeApiBaseUrl - The base URL for the bridge API\n * @returns A list of bridge tx quotes\n */\nexport async function fetchBridgeQuotes(\n request: GenericQuoteRequest,\n signal: AbortSignal,\n clientId: string,\n fetchFn: FetchFunction,\n bridgeApiBaseUrl: string,\n): Promise<QuoteResponse[]> {\n const destWalletAddress = request.destWalletAddress ?? request.walletAddress;\n // Transform the generic quote request into QuoteRequest\n const normalizedRequest: QuoteRequest = {\n walletAddress: formatAddressToCaipReference(request.walletAddress),\n destWalletAddress: formatAddressToCaipReference(destWalletAddress),\n srcChainId: formatChainIdToDec(request.srcChainId),\n destChainId: formatChainIdToDec(request.destChainId),\n srcTokenAddress: formatAddressToCaipReference(request.srcTokenAddress),\n destTokenAddress: formatAddressToCaipReference(request.destTokenAddress),\n srcTokenAmount: request.srcTokenAmount,\n insufficientBal: Boolean(request.insufficientBal),\n resetApproval: Boolean(request.resetApproval),\n };\n if (request.slippage !== undefined) {\n normalizedRequest.slippage = request.slippage;\n }\n\n const queryParams = new URLSearchParams();\n Object.entries(normalizedRequest).forEach(([key, value]) => {\n queryParams.append(key, value.toString());\n });\n const url = `${bridgeApiBaseUrl}/getQuote?${queryParams}`;\n const quotes: unknown[] = await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n signal,\n cacheOptions: { cacheRefreshTime: 0 },\n functionName: 'fetchBridgeQuotes',\n });\n\n const filteredQuotes = quotes.filter((quoteResponse: unknown) => {\n return validateQuoteResponse(quoteResponse);\n });\n return filteredQuotes as QuoteResponse[];\n}\n"]}
|
package/dist/utils/quote.cjs
CHANGED
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isValidQuoteRequest = void 0;
|
|
4
4
|
const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
|
|
5
|
-
const stringFields = [
|
|
5
|
+
const stringFields = [
|
|
6
|
+
'srcTokenAddress',
|
|
7
|
+
'destTokenAddress',
|
|
8
|
+
'srcChainId',
|
|
9
|
+
'destChainId',
|
|
10
|
+
'walletAddress',
|
|
11
|
+
];
|
|
6
12
|
if (requireAmount) {
|
|
7
13
|
stringFields.push('srcTokenAmount');
|
|
8
14
|
}
|
|
9
|
-
const numberFields = [
|
|
15
|
+
const numberFields = [];
|
|
16
|
+
// if slippage is defined, require it to be a number
|
|
17
|
+
if (partialRequest.slippage !== undefined) {
|
|
18
|
+
numberFields.push('slippage');
|
|
19
|
+
}
|
|
10
20
|
return (stringFields.every((field) => field in partialRequest &&
|
|
11
21
|
typeof partialRequest[field] ===
|
|
12
22
|
'string' &&
|
package/dist/utils/quote.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":";;;AAEO,MAAM,mBAAmB,GAAG,CACjC,
|
|
1
|
+
{"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":";;;AAEO,MAAM,mBAAmB,GAAG,CACjC,cAA4C,EAC5C,aAAa,GAAG,IAAI,EACmB,EAAE;IACzC,MAAM,YAAY,GAAG;QACnB,iBAAiB;QACjB,kBAAkB;QAClB,YAAY;QACZ,aAAa;QACb,eAAe;KAChB,CAAC;IACF,IAAI,aAAa,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACrC;IACD,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,oDAAoD;IACpD,IAAI,cAAc,CAAC,QAAQ,KAAK,SAAS,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/B;IAED,OAAO,CACL,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;QACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;YACzD,QAAQ;QACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;QAClE,cAAc,CAAC,KAAoC,CAAC,KAAK,EAAE;QAC3D,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,YAAY,CAAC,KAAK,CAChB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,IAAI,cAAc;YACvB,OAAO,cAAc,CAAC,KAAoC,CAAC;gBACzD,QAAQ;YACV,cAAc,CAAC,KAAoC,CAAC,KAAK,SAAS;YAClE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAoC,CAAC,CAAC,CAAC;YACpE,cAAc,CAAC,KAAoC,CAAC,KAAK,IAAI,CAChE;QACD,CAAC,aAAa;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,CACV,CAAC;AACJ,CAAC,CAAC;AA3CW,QAAA,mBAAmB,uBA2C9B","sourcesContent":["import type { GenericQuoteRequest } from '../types';\n\nexport const isValidQuoteRequest = (\n partialRequest: Partial<GenericQuoteRequest>,\n requireAmount = true,\n): partialRequest is GenericQuoteRequest => {\n const stringFields = [\n 'srcTokenAddress',\n 'destTokenAddress',\n 'srcChainId',\n 'destChainId',\n 'walletAddress',\n ];\n if (requireAmount) {\n stringFields.push('srcTokenAmount');\n }\n const numberFields = [];\n // if slippage is defined, require it to be a number\n if (partialRequest.slippage !== undefined) {\n numberFields.push('slippage');\n }\n\n return (\n stringFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'string' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n partialRequest[field as keyof typeof partialRequest] !== '' &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n numberFields.every(\n (field) =>\n field in partialRequest &&\n typeof partialRequest[field as keyof typeof partialRequest] ===\n 'number' &&\n partialRequest[field as keyof typeof partialRequest] !== undefined &&\n !isNaN(Number(partialRequest[field as keyof typeof partialRequest])) &&\n partialRequest[field as keyof typeof partialRequest] !== null,\n ) &&\n (requireAmount\n ? Boolean((partialRequest.srcTokenAmount ?? '').match(/^[1-9]\\d*$/u))\n : true)\n );\n};\n"]}
|
package/dist/utils/quote.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const isValidQuoteRequest: (partialRequest: Partial<
|
|
1
|
+
import type { GenericQuoteRequest } from "../types.cjs";
|
|
2
|
+
export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
|
|
3
3
|
//# sourceMappingURL=quote.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAiB;AAEpD,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC"}
|
package/dist/utils/quote.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const isValidQuoteRequest: (partialRequest: Partial<
|
|
1
|
+
import type { GenericQuoteRequest } from "../types.mjs";
|
|
2
|
+
export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
|
|
3
3
|
//# sourceMappingURL=quote.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAiB;AAEpD,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC"}
|