@metamask-previews/bridge-controller 13.0.0-preview-13a1c613 → 14.0.0-preview-f919f9b0
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 +21 -3
- package/dist/bridge-controller.cjs +59 -4
- package/dist/bridge-controller.cjs.map +1 -1
- package/dist/bridge-controller.d.cts +2 -3
- package/dist/bridge-controller.d.cts.map +1 -1
- package/dist/bridge-controller.d.mts +2 -3
- package/dist/bridge-controller.d.mts.map +1 -1
- package/dist/bridge-controller.mjs +60 -5
- package/dist/bridge-controller.mjs.map +1 -1
- package/dist/constants/bridge.cjs +1 -0
- package/dist/constants/bridge.cjs.map +1 -1
- package/dist/constants/bridge.d.cts.map +1 -1
- package/dist/constants/bridge.d.mts.map +1 -1
- package/dist/constants/bridge.mjs +1 -0
- package/dist/constants/bridge.mjs.map +1 -1
- package/dist/index.cjs +13 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +10 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +10 -1
- package/dist/index.mjs.map +1 -1
- package/dist/selectors.cjs +224 -0
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +1506 -0
- package/dist/selectors.d.cts.map +1 -0
- package/dist/selectors.d.mts +1506 -0
- package/dist/selectors.d.mts.map +1 -0
- package/dist/selectors.mjs +220 -0
- package/dist/selectors.mjs.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +44 -14
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +44 -14
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/assets.cjs +30 -0
- package/dist/utils/assets.cjs.map +1 -0
- package/dist/utils/assets.d.cts +9 -0
- package/dist/utils/assets.d.cts.map +1 -0
- package/dist/utils/assets.d.mts +9 -0
- package/dist/utils/assets.d.mts.map +1 -0
- package/dist/utils/assets.mjs +25 -0
- package/dist/utils/assets.mjs.map +1 -0
- package/dist/utils/caip-formatters.cjs +25 -1
- package/dist/utils/caip-formatters.cjs.map +1 -1
- package/dist/utils/caip-formatters.d.cts +10 -0
- package/dist/utils/caip-formatters.d.cts.map +1 -1
- package/dist/utils/caip-formatters.d.mts +10 -0
- package/dist/utils/caip-formatters.d.mts.map +1 -1
- package/dist/utils/caip-formatters.mjs +25 -2
- package/dist/utils/caip-formatters.mjs.map +1 -1
- package/dist/utils/fetch.cjs +61 -1
- package/dist/utils/fetch.cjs.map +1 -1
- package/dist/utils/fetch.d.cts +21 -1
- package/dist/utils/fetch.d.cts.map +1 -1
- package/dist/utils/fetch.d.mts +21 -1
- package/dist/utils/fetch.d.mts.map +1 -1
- package/dist/utils/fetch.mjs +59 -0
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/quote.cjs +177 -1
- package/dist/utils/quote.cjs.map +1 -1
- package/dist/utils/quote.d.cts +62 -1
- package/dist/utils/quote.d.cts.map +1 -1
- package/dist/utils/quote.d.mts +62 -1
- package/dist/utils/quote.d.mts.map +1 -1
- package/dist/utils/quote.mjs +164 -0
- package/dist/utils/quote.mjs.map +1 -1
- package/package.json +9 -5
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;
|
1
|
+
{"version":3,"file":"fetch.d.mts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AAcvE,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;AAED,QAAA,MAAM,2BAA2B,YAAmB;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI,aAAa,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;CACxB;;GAsCA,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAClB;IACP,UAAU,EAAE,IAAI,MAAM,CAAC,CAAC;CACzB,GAAG,KAAK,WAAW,kCAAkC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;;eAgCxE,CAAC"}
|
package/dist/utils/fetch.mjs
CHANGED
@@ -115,4 +115,63 @@ export async function fetchBridgeQuotes(request, signal, clientId, fetchFn, brid
|
|
115
115
|
});
|
116
116
|
return filteredQuotes;
|
117
117
|
}
|
118
|
+
const fetchAssetPricesForCurrency = async (request) => {
|
119
|
+
const { currency, assetIds, clientId, fetchFn } = request;
|
120
|
+
const validAssetIds = Array.from(assetIds).filter(Boolean);
|
121
|
+
if (validAssetIds.length === 0) {
|
122
|
+
return {};
|
123
|
+
}
|
124
|
+
const queryParams = new URLSearchParams({
|
125
|
+
assetIds: validAssetIds.filter(Boolean).join(','),
|
126
|
+
vsCurrency: currency,
|
127
|
+
});
|
128
|
+
const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;
|
129
|
+
const priceApiResponse = (await fetchFn(url, {
|
130
|
+
headers: getClientIdHeader(clientId),
|
131
|
+
cacheOptions: { cacheRefreshTime: Number(Duration.Second * 30) },
|
132
|
+
functionName: 'fetchAssetExchangeRates',
|
133
|
+
}));
|
134
|
+
if (!priceApiResponse || typeof priceApiResponse !== 'object') {
|
135
|
+
return {};
|
136
|
+
}
|
137
|
+
return Object.entries(priceApiResponse).reduce((acc, [assetId, currencyToPrice]) => {
|
138
|
+
if (!currencyToPrice) {
|
139
|
+
return acc;
|
140
|
+
}
|
141
|
+
if (!acc[assetId]) {
|
142
|
+
acc[assetId] = {};
|
143
|
+
}
|
144
|
+
if (currencyToPrice[currency]) {
|
145
|
+
acc[assetId][currency] =
|
146
|
+
currencyToPrice[currency].toString();
|
147
|
+
}
|
148
|
+
return acc;
|
149
|
+
}, {});
|
150
|
+
};
|
151
|
+
/**
|
152
|
+
* Fetches the asset prices from the price API for multiple currencies
|
153
|
+
*
|
154
|
+
* @param request - The request object
|
155
|
+
* @returns The asset prices by assetId
|
156
|
+
*/
|
157
|
+
export const fetchAssetPrices = async (request) => {
|
158
|
+
const { currencies, ...args } = request;
|
159
|
+
const combinedPrices = await Promise.allSettled(Array.from(currencies).map(async (currency) => await fetchAssetPricesForCurrency({ ...args, currency }))).then((priceApiResponse) => {
|
160
|
+
return priceApiResponse.reduce((acc, result) => {
|
161
|
+
if (result.status === 'fulfilled') {
|
162
|
+
Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {
|
163
|
+
const existingPrices = acc[assetId];
|
164
|
+
if (!existingPrices) {
|
165
|
+
acc[assetId] = {};
|
166
|
+
}
|
167
|
+
Object.entries(currencyToPrice).forEach(([currency, price]) => {
|
168
|
+
acc[assetId][currency] = price;
|
169
|
+
});
|
170
|
+
});
|
171
|
+
}
|
172
|
+
return acc;
|
173
|
+
}, {});
|
174
|
+
});
|
175
|
+
return combinedPrices;
|
176
|
+
};
|
118
177
|
//# sourceMappingURL=fetch.mjs.map
|
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 { 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"]}
|
1
|
+
{"version":3,"file":"fetch.mjs","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAssetType, 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\nconst fetchAssetPricesForCurrency = async (request: {\n currency: string;\n assetIds: Set<CaipAssetType>;\n clientId: string;\n fetchFn: FetchFunction;\n}): Promise<Record<CaipAssetType, { [currency: string]: string }>> => {\n const { currency, assetIds, clientId, fetchFn } = request;\n const validAssetIds = Array.from(assetIds).filter(Boolean);\n if (validAssetIds.length === 0) {\n return {};\n }\n\n const queryParams = new URLSearchParams({\n assetIds: validAssetIds.filter(Boolean).join(','),\n vsCurrency: currency,\n });\n const url = `https://price.api.cx.metamask.io/v3/spot-prices?${queryParams}`;\n const priceApiResponse = (await fetchFn(url, {\n headers: getClientIdHeader(clientId),\n cacheOptions: { cacheRefreshTime: Number(Duration.Second * 30) },\n functionName: 'fetchAssetExchangeRates',\n })) as Record<CaipAssetType, { [currency: string]: number }>;\n\n if (!priceApiResponse || typeof priceApiResponse !== 'object') {\n return {};\n }\n\n return Object.entries(priceApiResponse).reduce(\n (acc, [assetId, currencyToPrice]) => {\n if (!currencyToPrice) {\n return acc;\n }\n if (!acc[assetId as CaipAssetType]) {\n acc[assetId as CaipAssetType] = {};\n }\n if (currencyToPrice[currency]) {\n acc[assetId as CaipAssetType][currency] =\n currencyToPrice[currency].toString();\n }\n return acc;\n },\n {} as Record<CaipAssetType, { [currency: string]: string }>,\n );\n};\n\n/**\n * Fetches the asset prices from the price API for multiple currencies\n *\n * @param request - The request object\n * @returns The asset prices by assetId\n */\nexport const fetchAssetPrices = async (\n request: {\n currencies: Set<string>;\n } & Omit<Parameters<typeof fetchAssetPricesForCurrency>[0], 'currency'>,\n): Promise<\n Record<CaipAssetType, { [currency: string]: string } | undefined>\n> => {\n const { currencies, ...args } = request;\n\n const combinedPrices = await Promise.allSettled(\n Array.from(currencies).map(\n async (currency) =>\n await fetchAssetPricesForCurrency({ ...args, currency }),\n ),\n ).then((priceApiResponse) => {\n return priceApiResponse.reduce(\n (acc, result) => {\n if (result.status === 'fulfilled') {\n Object.entries(result.value).forEach(([assetId, currencyToPrice]) => {\n const existingPrices = acc[assetId as CaipAssetType];\n if (!existingPrices) {\n acc[assetId as CaipAssetType] = {};\n }\n Object.entries(currencyToPrice).forEach(([currency, price]) => {\n acc[assetId as CaipAssetType][currency] = price;\n });\n });\n }\n return acc;\n },\n {} as Record<CaipAssetType, { [currency: string]: string }>,\n );\n });\n\n return combinedPrices;\n};\n"]}
|
package/dist/utils/quote.cjs
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.isValidQuoteRequest = void 0;
|
3
|
+
exports.formatEtaInMinutes = exports.calcCost = exports.calcSwapRate = exports.calcAdjustedReturn = exports.calcTotalMaxNetworkFee = exports.calcTotalEstimatedNetworkFee = exports.calcEstimatedAndMaxTotalGasFee = exports.calcRelayerFee = exports.calcSentAmount = exports.calcToAmount = exports.calcSolanaTotalNetworkFee = exports.getQuoteIdentifier = exports.isValidQuoteRequest = void 0;
|
4
|
+
const controller_utils_1 = require("@metamask/controller-utils");
|
5
|
+
const bignumber_js_1 = require("bignumber.js");
|
6
|
+
const bridge_1 = require("./bridge.cjs");
|
4
7
|
const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
|
5
8
|
const stringFields = [
|
6
9
|
'srcTokenAddress',
|
@@ -34,4 +37,177 @@ const isValidQuoteRequest = (partialRequest, requireAmount = true) => {
|
|
34
37
|
: true));
|
35
38
|
};
|
36
39
|
exports.isValidQuoteRequest = isValidQuoteRequest;
|
40
|
+
/**
|
41
|
+
* Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
|
42
|
+
*
|
43
|
+
* @param quote - The quote to generate an identifier for
|
44
|
+
* @returns A pseudo-unique string that identifies the quote
|
45
|
+
*/
|
46
|
+
const getQuoteIdentifier = (quote) => `${quote.bridgeId}-${quote.bridges[0]}-${quote.steps.length}`;
|
47
|
+
exports.getQuoteIdentifier = getQuoteIdentifier;
|
48
|
+
const calcTokenAmount = (value, decimals) => {
|
49
|
+
const divisor = new bignumber_js_1.BigNumber(10).pow(decimals ?? 0);
|
50
|
+
return new bignumber_js_1.BigNumber(value).div(divisor);
|
51
|
+
};
|
52
|
+
const calcSolanaTotalNetworkFee = (bridgeQuote, { exchangeRate, usdExchangeRate }) => {
|
53
|
+
const { solanaFeesInLamports } = bridgeQuote;
|
54
|
+
const solanaFeeInNative = calcTokenAmount(solanaFeesInLamports ?? '0', 9);
|
55
|
+
return {
|
56
|
+
amount: solanaFeeInNative.toString(),
|
57
|
+
valueInCurrency: exchangeRate
|
58
|
+
? solanaFeeInNative.times(exchangeRate).toString()
|
59
|
+
: null,
|
60
|
+
usd: usdExchangeRate
|
61
|
+
? solanaFeeInNative.times(usdExchangeRate).toString()
|
62
|
+
: null,
|
63
|
+
};
|
64
|
+
};
|
65
|
+
exports.calcSolanaTotalNetworkFee = calcSolanaTotalNetworkFee;
|
66
|
+
const calcToAmount = ({ destTokenAmount, destAsset }, { exchangeRate, usdExchangeRate }) => {
|
67
|
+
const normalizedDestAmount = calcTokenAmount(destTokenAmount, destAsset.decimals);
|
68
|
+
return {
|
69
|
+
amount: normalizedDestAmount.toString(),
|
70
|
+
valueInCurrency: exchangeRate
|
71
|
+
? normalizedDestAmount.times(exchangeRate).toString()
|
72
|
+
: null,
|
73
|
+
usd: usdExchangeRate
|
74
|
+
? normalizedDestAmount.times(usdExchangeRate).toString()
|
75
|
+
: null,
|
76
|
+
};
|
77
|
+
};
|
78
|
+
exports.calcToAmount = calcToAmount;
|
79
|
+
const calcSentAmount = ({ srcTokenAmount, srcAsset, feeData }, { exchangeRate, usdExchangeRate }) => {
|
80
|
+
const normalizedSentAmount = calcTokenAmount(new bignumber_js_1.BigNumber(srcTokenAmount).plus(feeData.metabridge.amount), srcAsset.decimals);
|
81
|
+
return {
|
82
|
+
amount: normalizedSentAmount.toString(),
|
83
|
+
valueInCurrency: exchangeRate
|
84
|
+
? normalizedSentAmount.times(exchangeRate).toString()
|
85
|
+
: null,
|
86
|
+
usd: usdExchangeRate
|
87
|
+
? normalizedSentAmount.times(usdExchangeRate).toString()
|
88
|
+
: null,
|
89
|
+
};
|
90
|
+
};
|
91
|
+
exports.calcSentAmount = calcSentAmount;
|
92
|
+
const calcRelayerFee = (bridgeQuote, { exchangeRate, usdExchangeRate }) => {
|
93
|
+
const { quote: { srcAsset, srcTokenAmount, feeData }, trade, } = bridgeQuote;
|
94
|
+
const relayerFeeInNative = calcTokenAmount(new bignumber_js_1.BigNumber(trade.value || '0x0', 16).minus((0, bridge_1.isNativeAddress)(srcAsset.address)
|
95
|
+
? new bignumber_js_1.BigNumber(srcTokenAmount).plus(feeData.metabridge.amount)
|
96
|
+
: 0), 18);
|
97
|
+
return {
|
98
|
+
amount: relayerFeeInNative,
|
99
|
+
valueInCurrency: exchangeRate
|
100
|
+
? relayerFeeInNative.times(exchangeRate)
|
101
|
+
: null,
|
102
|
+
usd: usdExchangeRate ? relayerFeeInNative.times(usdExchangeRate) : null,
|
103
|
+
};
|
104
|
+
};
|
105
|
+
exports.calcRelayerFee = calcRelayerFee;
|
106
|
+
const calcTotalGasFee = ({ bridgeQuote, feePerGasInDecGwei, priorityFeePerGasInDecGwei, nativeToDisplayCurrencyExchangeRate, nativeToUsdExchangeRate, }) => {
|
107
|
+
const { approval, trade, l1GasFeesInHexWei } = bridgeQuote;
|
108
|
+
const totalGasLimitInDec = new bignumber_js_1.BigNumber(trade.gasLimit?.toString() ?? '0').plus(approval?.gasLimit?.toString() ?? '0');
|
109
|
+
const totalFeePerGasInDecGwei = new bignumber_js_1.BigNumber(feePerGasInDecGwei).plus(priorityFeePerGasInDecGwei);
|
110
|
+
const l1GasFeesInDecGWei = (0, controller_utils_1.weiHexToGweiDec)((0, controller_utils_1.toHex)(l1GasFeesInHexWei ?? '0'));
|
111
|
+
const gasFeesInDecGwei = totalGasLimitInDec
|
112
|
+
.times(totalFeePerGasInDecGwei)
|
113
|
+
.plus(l1GasFeesInDecGWei);
|
114
|
+
const gasFeesInDecEth = gasFeesInDecGwei.times(new bignumber_js_1.BigNumber(10).pow(-9));
|
115
|
+
const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate
|
116
|
+
? gasFeesInDecEth.times(nativeToDisplayCurrencyExchangeRate.toString())
|
117
|
+
: null;
|
118
|
+
const gasFeesInUSD = nativeToUsdExchangeRate
|
119
|
+
? gasFeesInDecEth.times(nativeToUsdExchangeRate.toString())
|
120
|
+
: null;
|
121
|
+
return {
|
122
|
+
amount: gasFeesInDecEth.toString(),
|
123
|
+
valueInCurrency: gasFeesInDisplayCurrency?.toString() ?? null,
|
124
|
+
usd: gasFeesInUSD?.toString() ?? null,
|
125
|
+
};
|
126
|
+
};
|
127
|
+
const calcEstimatedAndMaxTotalGasFee = ({ bridgeQuote, estimatedBaseFeeInDecGwei, maxFeePerGasInDecGwei, maxPriorityFeePerGasInDecGwei, exchangeRate: nativeToDisplayCurrencyExchangeRate, usdExchangeRate: nativeToUsdExchangeRate, }) => {
|
128
|
+
const { amount, valueInCurrency, usd } = calcTotalGasFee({
|
129
|
+
bridgeQuote,
|
130
|
+
feePerGasInDecGwei: estimatedBaseFeeInDecGwei,
|
131
|
+
priorityFeePerGasInDecGwei: maxPriorityFeePerGasInDecGwei,
|
132
|
+
nativeToDisplayCurrencyExchangeRate,
|
133
|
+
nativeToUsdExchangeRate,
|
134
|
+
});
|
135
|
+
const { amount: amountMax, valueInCurrency: valueInCurrencyMax, usd: usdMax, } = calcTotalGasFee({
|
136
|
+
bridgeQuote,
|
137
|
+
feePerGasInDecGwei: maxFeePerGasInDecGwei,
|
138
|
+
priorityFeePerGasInDecGwei: maxPriorityFeePerGasInDecGwei,
|
139
|
+
nativeToDisplayCurrencyExchangeRate,
|
140
|
+
nativeToUsdExchangeRate,
|
141
|
+
});
|
142
|
+
return {
|
143
|
+
amount,
|
144
|
+
amountMax,
|
145
|
+
valueInCurrency,
|
146
|
+
valueInCurrencyMax,
|
147
|
+
usd,
|
148
|
+
usdMax,
|
149
|
+
};
|
150
|
+
};
|
151
|
+
exports.calcEstimatedAndMaxTotalGasFee = calcEstimatedAndMaxTotalGasFee;
|
152
|
+
const calcTotalEstimatedNetworkFee = (gasFee, relayerFee) => {
|
153
|
+
return {
|
154
|
+
amount: new bignumber_js_1.BigNumber(gasFee.amount).plus(relayerFee.amount).toString(),
|
155
|
+
valueInCurrency: gasFee.valueInCurrency
|
156
|
+
? new bignumber_js_1.BigNumber(gasFee.valueInCurrency)
|
157
|
+
.plus(relayerFee.valueInCurrency || '0')
|
158
|
+
.toString()
|
159
|
+
: null,
|
160
|
+
usd: gasFee.usd
|
161
|
+
? new bignumber_js_1.BigNumber(gasFee.usd).plus(relayerFee.usd || '0').toString()
|
162
|
+
: null,
|
163
|
+
};
|
164
|
+
};
|
165
|
+
exports.calcTotalEstimatedNetworkFee = calcTotalEstimatedNetworkFee;
|
166
|
+
const calcTotalMaxNetworkFee = (gasFee, relayerFee) => {
|
167
|
+
return {
|
168
|
+
amount: new bignumber_js_1.BigNumber(gasFee.amountMax).plus(relayerFee.amount).toString(),
|
169
|
+
valueInCurrency: gasFee.valueInCurrencyMax
|
170
|
+
? new bignumber_js_1.BigNumber(gasFee.valueInCurrencyMax)
|
171
|
+
.plus(relayerFee.valueInCurrency || '0')
|
172
|
+
.toString()
|
173
|
+
: null,
|
174
|
+
usd: gasFee.usdMax
|
175
|
+
? new bignumber_js_1.BigNumber(gasFee.usdMax).plus(relayerFee.usd || '0').toString()
|
176
|
+
: null,
|
177
|
+
};
|
178
|
+
};
|
179
|
+
exports.calcTotalMaxNetworkFee = calcTotalMaxNetworkFee;
|
180
|
+
const calcAdjustedReturn = (toTokenAmount, totalEstimatedNetworkFee) => ({
|
181
|
+
valueInCurrency: toTokenAmount.valueInCurrency && totalEstimatedNetworkFee.valueInCurrency
|
182
|
+
? new bignumber_js_1.BigNumber(toTokenAmount.valueInCurrency)
|
183
|
+
.minus(totalEstimatedNetworkFee.valueInCurrency)
|
184
|
+
.toString()
|
185
|
+
: null,
|
186
|
+
usd: toTokenAmount.usd && totalEstimatedNetworkFee.usd
|
187
|
+
? new bignumber_js_1.BigNumber(toTokenAmount.usd)
|
188
|
+
.minus(totalEstimatedNetworkFee.usd)
|
189
|
+
.toString()
|
190
|
+
: null,
|
191
|
+
});
|
192
|
+
exports.calcAdjustedReturn = calcAdjustedReturn;
|
193
|
+
const calcSwapRate = (sentAmount, destTokenAmount) => new bignumber_js_1.BigNumber(destTokenAmount).div(sentAmount).toString();
|
194
|
+
exports.calcSwapRate = calcSwapRate;
|
195
|
+
const calcCost = (adjustedReturn, sentAmount) => ({
|
196
|
+
valueInCurrency: adjustedReturn.valueInCurrency && sentAmount.valueInCurrency
|
197
|
+
? new bignumber_js_1.BigNumber(sentAmount.valueInCurrency)
|
198
|
+
.minus(adjustedReturn.valueInCurrency)
|
199
|
+
.toString()
|
200
|
+
: null,
|
201
|
+
usd: adjustedReturn.usd && sentAmount.usd
|
202
|
+
? new bignumber_js_1.BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toString()
|
203
|
+
: null,
|
204
|
+
});
|
205
|
+
exports.calcCost = calcCost;
|
206
|
+
const formatEtaInMinutes = (estimatedProcessingTimeInSeconds) => {
|
207
|
+
if (estimatedProcessingTimeInSeconds < 60) {
|
208
|
+
return `< 1`;
|
209
|
+
}
|
210
|
+
return (estimatedProcessingTimeInSeconds / 60).toFixed();
|
211
|
+
};
|
212
|
+
exports.formatEtaInMinutes = formatEtaInMinutes;
|
37
213
|
//# sourceMappingURL=quote.cjs.map
|
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,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"]}
|
1
|
+
{"version":3,"file":"quote.cjs","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex, weiHexToGweiDec } from '@metamask/controller-utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { isNativeAddress } from './bridge';\nimport type {\n ExchangeRate,\n GenericQuoteRequest,\n L1GasFees,\n Quote,\n QuoteResponse,\n SolanaFees,\n} 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\n/**\n * Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps\n *\n * @param quote - The quote to generate an identifier for\n * @returns A pseudo-unique string that identifies the quote\n */\nexport const getQuoteIdentifier = (quote: QuoteResponse['quote']) =>\n `${quote.bridgeId}-${quote.bridges[0]}-${quote.steps.length}`;\n\nconst calcTokenAmount = (value: string | BigNumber, decimals: number) => {\n const divisor = new BigNumber(10).pow(decimals ?? 0);\n return new BigNumber(value).div(divisor);\n};\n\nexport const calcSolanaTotalNetworkFee = (\n bridgeQuote: QuoteResponse & SolanaFees,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const { solanaFeesInLamports } = bridgeQuote;\n const solanaFeeInNative = calcTokenAmount(solanaFeesInLamports ?? '0', 9);\n return {\n amount: solanaFeeInNative.toString(),\n valueInCurrency: exchangeRate\n ? solanaFeeInNative.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? solanaFeeInNative.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcToAmount = (\n { destTokenAmount, destAsset }: Quote,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedDestAmount = calcTokenAmount(\n destTokenAmount,\n destAsset.decimals,\n );\n return {\n amount: normalizedDestAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedDestAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedDestAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcSentAmount = (\n { srcTokenAmount, srcAsset, feeData }: Quote,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const normalizedSentAmount = calcTokenAmount(\n new BigNumber(srcTokenAmount).plus(feeData.metabridge.amount),\n srcAsset.decimals,\n );\n return {\n amount: normalizedSentAmount.toString(),\n valueInCurrency: exchangeRate\n ? normalizedSentAmount.times(exchangeRate).toString()\n : null,\n usd: usdExchangeRate\n ? normalizedSentAmount.times(usdExchangeRate).toString()\n : null,\n };\n};\n\nexport const calcRelayerFee = (\n bridgeQuote: QuoteResponse,\n { exchangeRate, usdExchangeRate }: ExchangeRate,\n) => {\n const {\n quote: { srcAsset, srcTokenAmount, feeData },\n trade,\n } = bridgeQuote;\n const relayerFeeInNative = calcTokenAmount(\n new BigNumber(trade.value || '0x0', 16).minus(\n isNativeAddress(srcAsset.address)\n ? new BigNumber(srcTokenAmount).plus(feeData.metabridge.amount)\n : 0,\n ),\n 18,\n );\n return {\n amount: relayerFeeInNative,\n valueInCurrency: exchangeRate\n ? relayerFeeInNative.times(exchangeRate)\n : null,\n usd: usdExchangeRate ? relayerFeeInNative.times(usdExchangeRate) : null,\n };\n};\n\nconst calcTotalGasFee = ({\n bridgeQuote,\n feePerGasInDecGwei,\n priorityFeePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponse & L1GasFees;\n feePerGasInDecGwei: string;\n priorityFeePerGasInDecGwei: string;\n nativeToDisplayCurrencyExchangeRate?: string;\n nativeToUsdExchangeRate?: string;\n}) => {\n const { approval, trade, l1GasFeesInHexWei } = bridgeQuote;\n\n const totalGasLimitInDec = new BigNumber(\n trade.gasLimit?.toString() ?? '0',\n ).plus(approval?.gasLimit?.toString() ?? '0');\n\n const totalFeePerGasInDecGwei = new BigNumber(feePerGasInDecGwei).plus(\n priorityFeePerGasInDecGwei,\n );\n const l1GasFeesInDecGWei = weiHexToGweiDec(toHex(l1GasFeesInHexWei ?? '0'));\n const gasFeesInDecGwei = totalGasLimitInDec\n .times(totalFeePerGasInDecGwei)\n .plus(l1GasFeesInDecGWei);\n const gasFeesInDecEth = gasFeesInDecGwei.times(new BigNumber(10).pow(-9));\n\n const gasFeesInDisplayCurrency = nativeToDisplayCurrencyExchangeRate\n ? gasFeesInDecEth.times(nativeToDisplayCurrencyExchangeRate.toString())\n : null;\n const gasFeesInUSD = nativeToUsdExchangeRate\n ? gasFeesInDecEth.times(nativeToUsdExchangeRate.toString())\n : null;\n\n return {\n amount: gasFeesInDecEth.toString(),\n valueInCurrency: gasFeesInDisplayCurrency?.toString() ?? null,\n usd: gasFeesInUSD?.toString() ?? null,\n };\n};\n\nexport const calcEstimatedAndMaxTotalGasFee = ({\n bridgeQuote,\n estimatedBaseFeeInDecGwei,\n maxFeePerGasInDecGwei,\n maxPriorityFeePerGasInDecGwei,\n exchangeRate: nativeToDisplayCurrencyExchangeRate,\n usdExchangeRate: nativeToUsdExchangeRate,\n}: {\n bridgeQuote: QuoteResponse & L1GasFees;\n estimatedBaseFeeInDecGwei: string;\n maxFeePerGasInDecGwei: string;\n maxPriorityFeePerGasInDecGwei: string;\n} & ExchangeRate) => {\n const { amount, valueInCurrency, usd } = calcTotalGasFee({\n bridgeQuote,\n feePerGasInDecGwei: estimatedBaseFeeInDecGwei,\n priorityFeePerGasInDecGwei: maxPriorityFeePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n const {\n amount: amountMax,\n valueInCurrency: valueInCurrencyMax,\n usd: usdMax,\n } = calcTotalGasFee({\n bridgeQuote,\n feePerGasInDecGwei: maxFeePerGasInDecGwei,\n priorityFeePerGasInDecGwei: maxPriorityFeePerGasInDecGwei,\n nativeToDisplayCurrencyExchangeRate,\n nativeToUsdExchangeRate,\n });\n return {\n amount,\n amountMax,\n valueInCurrency,\n valueInCurrencyMax,\n usd,\n usdMax,\n };\n};\n\nexport const calcTotalEstimatedNetworkFee = (\n gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFee.amount).plus(relayerFee.amount).toString(),\n valueInCurrency: gasFee.valueInCurrency\n ? new BigNumber(gasFee.valueInCurrency)\n .plus(relayerFee.valueInCurrency || '0')\n .toString()\n : null,\n usd: gasFee.usd\n ? new BigNumber(gasFee.usd).plus(relayerFee.usd || '0').toString()\n : null,\n };\n};\n\nexport const calcTotalMaxNetworkFee = (\n gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>,\n relayerFee: ReturnType<typeof calcRelayerFee>,\n) => {\n return {\n amount: new BigNumber(gasFee.amountMax).plus(relayerFee.amount).toString(),\n valueInCurrency: gasFee.valueInCurrencyMax\n ? new BigNumber(gasFee.valueInCurrencyMax)\n .plus(relayerFee.valueInCurrency || '0')\n .toString()\n : null,\n usd: gasFee.usdMax\n ? new BigNumber(gasFee.usdMax).plus(relayerFee.usd || '0').toString()\n : null,\n };\n};\n\nexport const calcAdjustedReturn = (\n toTokenAmount: ReturnType<typeof calcToAmount>,\n totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>,\n) => ({\n valueInCurrency:\n toTokenAmount.valueInCurrency && totalEstimatedNetworkFee.valueInCurrency\n ? new BigNumber(toTokenAmount.valueInCurrency)\n .minus(totalEstimatedNetworkFee.valueInCurrency)\n .toString()\n : null,\n usd:\n toTokenAmount.usd && totalEstimatedNetworkFee.usd\n ? new BigNumber(toTokenAmount.usd)\n .minus(totalEstimatedNetworkFee.usd)\n .toString()\n : null,\n});\n\nexport const calcSwapRate = (sentAmount: string, destTokenAmount: string) =>\n new BigNumber(destTokenAmount).div(sentAmount).toString();\n\nexport const calcCost = (\n adjustedReturn: ReturnType<typeof calcAdjustedReturn>,\n sentAmount: ReturnType<typeof calcSentAmount>,\n) => ({\n valueInCurrency:\n adjustedReturn.valueInCurrency && sentAmount.valueInCurrency\n ? new BigNumber(sentAmount.valueInCurrency)\n .minus(adjustedReturn.valueInCurrency)\n .toString()\n : null,\n usd:\n adjustedReturn.usd && sentAmount.usd\n ? new BigNumber(sentAmount.usd).minus(adjustedReturn.usd).toString()\n : null,\n});\n\nexport const formatEtaInMinutes = (\n estimatedProcessingTimeInSeconds: number,\n) => {\n if (estimatedProcessingTimeInSeconds < 60) {\n return `< 1`;\n }\n return (estimatedProcessingTimeInSeconds / 60).toFixed();\n};\n"]}
|
package/dist/utils/quote.d.cts
CHANGED
@@ -1,3 +1,64 @@
|
|
1
|
-
import
|
1
|
+
import { BigNumber } from "bignumber.js";
|
2
|
+
import type { ExchangeRate, GenericQuoteRequest, L1GasFees, Quote, QuoteResponse, SolanaFees } from "../types.cjs";
|
2
3
|
export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
|
4
|
+
/**
|
5
|
+
* Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
|
6
|
+
*
|
7
|
+
* @param quote - The quote to generate an identifier for
|
8
|
+
* @returns A pseudo-unique string that identifies the quote
|
9
|
+
*/
|
10
|
+
export declare const getQuoteIdentifier: (quote: QuoteResponse['quote']) => string;
|
11
|
+
export declare const calcSolanaTotalNetworkFee: (bridgeQuote: QuoteResponse & SolanaFees, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
12
|
+
amount: string;
|
13
|
+
valueInCurrency: string | null;
|
14
|
+
usd: string | null;
|
15
|
+
};
|
16
|
+
export declare const calcToAmount: ({ destTokenAmount, destAsset }: Quote, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
17
|
+
amount: string;
|
18
|
+
valueInCurrency: string | null;
|
19
|
+
usd: string | null;
|
20
|
+
};
|
21
|
+
export declare const calcSentAmount: ({ srcTokenAmount, srcAsset, feeData }: Quote, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
22
|
+
amount: string;
|
23
|
+
valueInCurrency: string | null;
|
24
|
+
usd: string | null;
|
25
|
+
};
|
26
|
+
export declare const calcRelayerFee: (bridgeQuote: QuoteResponse, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
27
|
+
amount: BigNumber;
|
28
|
+
valueInCurrency: BigNumber | null;
|
29
|
+
usd: BigNumber | null;
|
30
|
+
};
|
31
|
+
export declare const calcEstimatedAndMaxTotalGasFee: ({ bridgeQuote, estimatedBaseFeeInDecGwei, maxFeePerGasInDecGwei, maxPriorityFeePerGasInDecGwei, exchangeRate: nativeToDisplayCurrencyExchangeRate, usdExchangeRate: nativeToUsdExchangeRate, }: {
|
32
|
+
bridgeQuote: QuoteResponse & L1GasFees;
|
33
|
+
estimatedBaseFeeInDecGwei: string;
|
34
|
+
maxFeePerGasInDecGwei: string;
|
35
|
+
maxPriorityFeePerGasInDecGwei: string;
|
36
|
+
} & ExchangeRate) => {
|
37
|
+
amount: string;
|
38
|
+
amountMax: string;
|
39
|
+
valueInCurrency: string | null;
|
40
|
+
valueInCurrencyMax: string | null;
|
41
|
+
usd: string | null;
|
42
|
+
usdMax: string | null;
|
43
|
+
};
|
44
|
+
export declare const calcTotalEstimatedNetworkFee: (gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>, relayerFee: ReturnType<typeof calcRelayerFee>) => {
|
45
|
+
amount: string;
|
46
|
+
valueInCurrency: string | null;
|
47
|
+
usd: string | null;
|
48
|
+
};
|
49
|
+
export declare const calcTotalMaxNetworkFee: (gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>, relayerFee: ReturnType<typeof calcRelayerFee>) => {
|
50
|
+
amount: string;
|
51
|
+
valueInCurrency: string | null;
|
52
|
+
usd: string | null;
|
53
|
+
};
|
54
|
+
export declare const calcAdjustedReturn: (toTokenAmount: ReturnType<typeof calcToAmount>, totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>) => {
|
55
|
+
valueInCurrency: string | null;
|
56
|
+
usd: string | null;
|
57
|
+
};
|
58
|
+
export declare const calcSwapRate: (sentAmount: string, destTokenAmount: string) => string;
|
59
|
+
export declare const calcCost: (adjustedReturn: ReturnType<typeof calcAdjustedReturn>, sentAmount: ReturnType<typeof calcSentAmount>) => {
|
60
|
+
valueInCurrency: string | null;
|
61
|
+
usd: string | null;
|
62
|
+
};
|
63
|
+
export declare const formatEtaInMinutes: (estimatedProcessingTimeInSeconds: number) => string;
|
3
64
|
//# sourceMappingURL=quote.d.cts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"quote.d.cts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAGzC,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,UAAU,EACX,qBAAiB;AAElB,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,mCACS,KAAK,qCACF,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,gBACZ,aAAa,qCACS,YAAY;;;;CAqBhD,CAAC;AA4CF,eAAO,MAAM,8BAA8B;iBAQ5B,aAAa,GAAG,SAAS;+BACX,MAAM;2BACV,MAAM;mCACE,MAAM;;;;;;;;CA4BtC,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAC/B,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC;;;CAczE,CAAC;AAEH,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC"}
|
package/dist/utils/quote.d.mts
CHANGED
@@ -1,3 +1,64 @@
|
|
1
|
-
import
|
1
|
+
import { BigNumber } from "bignumber.js";
|
2
|
+
import type { ExchangeRate, GenericQuoteRequest, L1GasFees, Quote, QuoteResponse, SolanaFees } from "../types.mjs";
|
2
3
|
export declare const isValidQuoteRequest: (partialRequest: Partial<GenericQuoteRequest>, requireAmount?: boolean) => partialRequest is GenericQuoteRequest;
|
4
|
+
/**
|
5
|
+
* Generates a pseudo-unique string that identifies each quote by aggregator, bridge, and steps
|
6
|
+
*
|
7
|
+
* @param quote - The quote to generate an identifier for
|
8
|
+
* @returns A pseudo-unique string that identifies the quote
|
9
|
+
*/
|
10
|
+
export declare const getQuoteIdentifier: (quote: QuoteResponse['quote']) => string;
|
11
|
+
export declare const calcSolanaTotalNetworkFee: (bridgeQuote: QuoteResponse & SolanaFees, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
12
|
+
amount: string;
|
13
|
+
valueInCurrency: string | null;
|
14
|
+
usd: string | null;
|
15
|
+
};
|
16
|
+
export declare const calcToAmount: ({ destTokenAmount, destAsset }: Quote, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
17
|
+
amount: string;
|
18
|
+
valueInCurrency: string | null;
|
19
|
+
usd: string | null;
|
20
|
+
};
|
21
|
+
export declare const calcSentAmount: ({ srcTokenAmount, srcAsset, feeData }: Quote, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
22
|
+
amount: string;
|
23
|
+
valueInCurrency: string | null;
|
24
|
+
usd: string | null;
|
25
|
+
};
|
26
|
+
export declare const calcRelayerFee: (bridgeQuote: QuoteResponse, { exchangeRate, usdExchangeRate }: ExchangeRate) => {
|
27
|
+
amount: BigNumber;
|
28
|
+
valueInCurrency: BigNumber | null;
|
29
|
+
usd: BigNumber | null;
|
30
|
+
};
|
31
|
+
export declare const calcEstimatedAndMaxTotalGasFee: ({ bridgeQuote, estimatedBaseFeeInDecGwei, maxFeePerGasInDecGwei, maxPriorityFeePerGasInDecGwei, exchangeRate: nativeToDisplayCurrencyExchangeRate, usdExchangeRate: nativeToUsdExchangeRate, }: {
|
32
|
+
bridgeQuote: QuoteResponse & L1GasFees;
|
33
|
+
estimatedBaseFeeInDecGwei: string;
|
34
|
+
maxFeePerGasInDecGwei: string;
|
35
|
+
maxPriorityFeePerGasInDecGwei: string;
|
36
|
+
} & ExchangeRate) => {
|
37
|
+
amount: string;
|
38
|
+
amountMax: string;
|
39
|
+
valueInCurrency: string | null;
|
40
|
+
valueInCurrencyMax: string | null;
|
41
|
+
usd: string | null;
|
42
|
+
usdMax: string | null;
|
43
|
+
};
|
44
|
+
export declare const calcTotalEstimatedNetworkFee: (gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>, relayerFee: ReturnType<typeof calcRelayerFee>) => {
|
45
|
+
amount: string;
|
46
|
+
valueInCurrency: string | null;
|
47
|
+
usd: string | null;
|
48
|
+
};
|
49
|
+
export declare const calcTotalMaxNetworkFee: (gasFee: ReturnType<typeof calcEstimatedAndMaxTotalGasFee>, relayerFee: ReturnType<typeof calcRelayerFee>) => {
|
50
|
+
amount: string;
|
51
|
+
valueInCurrency: string | null;
|
52
|
+
usd: string | null;
|
53
|
+
};
|
54
|
+
export declare const calcAdjustedReturn: (toTokenAmount: ReturnType<typeof calcToAmount>, totalEstimatedNetworkFee: ReturnType<typeof calcTotalEstimatedNetworkFee>) => {
|
55
|
+
valueInCurrency: string | null;
|
56
|
+
usd: string | null;
|
57
|
+
};
|
58
|
+
export declare const calcSwapRate: (sentAmount: string, destTokenAmount: string) => string;
|
59
|
+
export declare const calcCost: (adjustedReturn: ReturnType<typeof calcAdjustedReturn>, sentAmount: ReturnType<typeof calcSentAmount>) => {
|
60
|
+
valueInCurrency: string | null;
|
61
|
+
usd: string | null;
|
62
|
+
};
|
63
|
+
export declare const formatEtaInMinutes: (estimatedProcessingTimeInSeconds: number) => string;
|
3
64
|
//# sourceMappingURL=quote.d.mts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"quote.d.mts","sourceRoot":"","sources":["../../src/utils/quote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAGzC,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,KAAK,EACL,aAAa,EACb,UAAU,EACX,qBAAiB;AAElB,eAAO,MAAM,mBAAmB,mBACd,QAAQ,mBAAmB,CAAC,mEA0C7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,aAAa,CAAC,OAAO,CAAC,WACD,CAAC;AAOhE,eAAO,MAAM,yBAAyB,gBACvB,aAAa,GAAG,UAAU,qCACJ,YAAY;;;;CAahD,CAAC;AAEF,eAAO,MAAM,YAAY,mCACS,KAAK,qCACF,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,0CACc,KAAK,qCACT,YAAY;;;;CAehD,CAAC;AAEF,eAAO,MAAM,cAAc,gBACZ,aAAa,qCACS,YAAY;;;;CAqBhD,CAAC;AA4CF,eAAO,MAAM,8BAA8B;iBAQ5B,aAAa,GAAG,SAAS;+BACX,MAAM;2BACV,MAAM;mCACE,MAAM;;;;;;;;CA4BtC,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAC/B,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,WACzB,WAAW,qCAAqC,CAAC,cAC7C,WAAW,qBAAqB,CAAC;;;;CAa9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,kBACd,WAAW,mBAAmB,CAAC,4BACpB,WAAW,mCAAmC,CAAC;;;CAczE,CAAC;AAEH,eAAO,MAAM,YAAY,eAAgB,MAAM,mBAAmB,MAAM,WACb,CAAC;AAE5D,eAAO,MAAM,QAAQ,mBACH,WAAW,yBAAyB,CAAC,cACzC,WAAW,qBAAqB,CAAC;;;CAY7C,CAAC;AAEH,eAAO,MAAM,kBAAkB,qCACK,MAAM,WAMzC,CAAC"}
|