@metamask/transaction-pay-controller 3.0.0 → 4.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 +27 -1
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/actions/update-payment-token.cjs.map +1 -1
- package/dist/actions/update-payment-token.mjs.map +1 -1
- package/dist/helpers/QuoteRefresher.cjs.map +1 -1
- package/dist/helpers/QuoteRefresher.mjs.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.cjs.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.mjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.cjs +13 -5
- package/dist/strategy/bridge/bridge-quotes.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-quotes.mjs +13 -5
- package/dist/strategy/bridge/bridge-quotes.mjs.map +1 -1
- package/dist/strategy/bridge/bridge-submit.cjs +10 -27
- package/dist/strategy/bridge/bridge-submit.cjs.map +1 -1
- package/dist/strategy/bridge/bridge-submit.d.cts.map +1 -1
- package/dist/strategy/bridge/bridge-submit.d.mts.map +1 -1
- package/dist/strategy/bridge/bridge-submit.mjs +10 -27
- package/dist/strategy/bridge/bridge-submit.mjs.map +1 -1
- package/dist/strategy/relay/constants.cjs +2 -1
- package/dist/strategy/relay/constants.cjs.map +1 -1
- package/dist/strategy/relay/constants.d.cts +1 -0
- package/dist/strategy/relay/constants.d.cts.map +1 -1
- package/dist/strategy/relay/constants.d.mts +1 -0
- package/dist/strategy/relay/constants.d.mts.map +1 -1
- package/dist/strategy/relay/constants.mjs +1 -0
- package/dist/strategy/relay/constants.mjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.cjs +22 -17
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +23 -18
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/relay-submit.cjs +77 -30
- package/dist/strategy/relay/relay-submit.cjs.map +1 -1
- package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
- package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
- package/dist/strategy/relay/relay-submit.mjs +79 -32
- package/dist/strategy/relay/relay-submit.mjs.map +1 -1
- package/dist/strategy/relay/types.cjs.map +1 -1
- package/dist/strategy/relay/types.d.cts +1 -1
- package/dist/strategy/relay/types.d.cts.map +1 -1
- package/dist/strategy/relay/types.d.mts +1 -1
- package/dist/strategy/relay/types.d.mts.map +1 -1
- package/dist/strategy/relay/types.mjs.map +1 -1
- package/dist/tests/messenger-mock.cjs +3 -0
- package/dist/tests/messenger-mock.cjs.map +1 -1
- package/dist/tests/messenger-mock.d.cts +1 -0
- package/dist/tests/messenger-mock.d.cts.map +1 -1
- package/dist/tests/messenger-mock.d.mts +1 -0
- package/dist/tests/messenger-mock.d.mts.map +1 -1
- package/dist/tests/messenger-mock.mjs +3 -0
- package/dist/tests/messenger-mock.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +2 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +97 -49
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts +2 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts +2 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +97 -49
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/required-tokens.cjs.map +1 -1
- package/dist/utils/required-tokens.mjs.map +1 -1
- package/dist/utils/source-amounts.cjs.map +1 -1
- package/dist/utils/source-amounts.mjs.map +1 -1
- package/dist/utils/strategy.cjs.map +1 -1
- package/dist/utils/strategy.mjs.map +1 -1
- package/dist/utils/token.cjs.map +1 -1
- package/dist/utils/token.mjs.map +1 -1
- package/dist/utils/totals.cjs +14 -6
- package/dist/utils/totals.cjs.map +1 -1
- package/dist/utils/totals.d.cts +12 -4
- package/dist/utils/totals.d.cts.map +1 -1
- package/dist/utils/totals.d.mts +12 -4
- package/dist/utils/totals.d.mts.map +1 -1
- package/dist/utils/totals.mjs +14 -6
- package/dist/utils/totals.mjs.map +1 -1
- package/dist/utils/transaction.cjs +25 -1
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.d.cts +13 -0
- package/dist/utils/transaction.d.cts.map +1 -1
- package/dist/utils/transaction.d.mts +13 -0
- package/dist/utils/transaction.d.mts.map +1 -1
- package/dist/utils/transaction.mjs +23 -0
- package/dist/utils/transaction.mjs.map +1 -1
- package/package.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { successfulFetch, toHex } from "@metamask/controller-utils";
|
|
2
2
|
import { createModuleLogger } from "@metamask/utils";
|
|
3
3
|
import { BigNumber } from "bignumber.js";
|
|
4
|
-
import { ARBITRUM_USDC_ADDRESS, CHAIN_ID_ARBITRUM, CHAIN_ID_POLYGON, RELAY_URL_QUOTE } from "./constants.mjs";
|
|
4
|
+
import { ARBITRUM_USDC_ADDRESS, CHAIN_ID_ARBITRUM, CHAIN_ID_POLYGON, RELAY_FALLBACK_GAS_LIMIT, RELAY_URL_QUOTE } from "./constants.mjs";
|
|
5
5
|
import { TransactionPayStrategy } from "../../index.mjs";
|
|
6
6
|
import { NATIVE_TOKEN_ADDRESS } from "../../constants.mjs";
|
|
7
7
|
import { projectLogger } from "../../logger.mjs";
|
|
@@ -212,22 +212,27 @@ function getFeatureFlags(messenger) {
|
|
|
212
212
|
* @returns Total source network cost in USD and fiat.
|
|
213
213
|
*/
|
|
214
214
|
function calculateSourceNetworkCost(quote, messenger) {
|
|
215
|
-
const allParams = quote.steps.
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
215
|
+
const allParams = quote.steps[0].items.map((i) => i.data);
|
|
216
|
+
const totalGasLimit = calculateSourceNetworkGasLimit(allParams);
|
|
217
|
+
return calculateGasCost({
|
|
218
|
+
chainId: allParams[0].chainId,
|
|
219
|
+
gas: totalGasLimit,
|
|
220
|
+
messenger,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Calculate the total gas limit for the source network transactions.
|
|
225
|
+
*
|
|
226
|
+
* @param params - Array of transaction parameters.
|
|
227
|
+
* @returns - Total gas limit.
|
|
228
|
+
*/
|
|
229
|
+
function calculateSourceNetworkGasLimit(params) {
|
|
230
|
+
const allParamsHasGas = params.every((p) => p.gas !== undefined);
|
|
231
|
+
if (allParamsHasGas) {
|
|
232
|
+
return params.reduce((total, p) => total + new BigNumber(p.gas).toNumber(), 0);
|
|
233
|
+
}
|
|
234
|
+
// In future, call `TransactionController:estimateGas`
|
|
235
|
+
// or `TransactionController:estimateGasBatch` based on params length.
|
|
236
|
+
return params.reduce((total, p) => total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(), 0);
|
|
232
237
|
}
|
|
233
238
|
//# sourceMappingURL=relay-quotes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch, toHex } from '@metamask/controller-utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_POLYGON,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { NATIVE_TOKEN_ADDRESS } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const result = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n const normalizedRequests = result.map((r) => r.request);\n const isSkipTransaction = result.some((r) => r.isSkipTransaction);\n\n log('Normalized requests', { normalizedRequests, isSkipTransaction });\n\n return await Promise.all(\n normalizedRequests.map((r) =>\n getSingleQuote(r, isSkipTransaction, request),\n ),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param isSkipTransaction - Whether to skip the transaction.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n isSkipTransaction: boolean,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.skipTransaction = isSkipTransaction;\n\n log('Fetched relay quote', { quote, url });\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit ? toHex(1337) : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return {\n request: requestOutput,\n isSkipTransaction: isHyperliquidDeposit,\n };\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger, transaction } = fullRequest;\n const { details } = quote;\n const { currencyIn, currencyOut } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n new BigNumber(currencyIn.amountUsd).minus(currencyOut.amountUsd),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = quote.skipTransaction\n ? {\n usd: '0',\n fiat: '0',\n }\n : calculateTransactionGasCost(transaction, messenger);\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n) {\n const allParams = quote.steps.flatMap((s) => s.items.map((i) => i.data));\n\n const result = allParams.reduce(\n (total, params) => {\n const gasCost = calculateGasCost({\n ...params,\n maxFeePerGas: undefined,\n maxPriorityFeePerGas: undefined,\n messenger,\n });\n\n return {\n usd: new BigNumber(total.usd).plus(gasCost.usd),\n fiat: new BigNumber(total.fiat).plus(gasCost.fiat),\n };\n },\n { usd: new BigNumber(0), fiat: new BigNumber(0) },\n );\n\n return {\n usd: result.usd.toString(10),\n fiat: result.fiat.toString(10),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-quotes.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { successfulFetch, toHex } from '@metamask/controller-utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_POLYGON,\n RELAY_FALLBACK_GAS_LIMIT,\n RELAY_URL_QUOTE,\n} from './constants';\nimport type { RelayQuote } from './types';\nimport { TransactionPayStrategy } from '../..';\nimport { NATIVE_TOKEN_ADDRESS } from '../../constants';\nimport { projectLogger } from '../../logger';\nimport type {\n FiatValue,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { calculateGasCost, calculateTransactionGasCost } from '../../utils/gas';\nimport { getNativeToken, getTokenFiatRate } from '../../utils/token';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const result = requests\n // Ignore gas fee token requests\n .filter((r) => r.targetAmountMinimum !== '0')\n .map((r) => normalizeRequest(r));\n\n const normalizedRequests = result.map((r) => r.request);\n const isSkipTransaction = result.some((r) => r.isSkipTransaction);\n\n log('Normalized requests', { normalizedRequests, isSkipTransaction });\n\n return await Promise.all(\n normalizedRequests.map((r) =>\n getSingleQuote(r, isSkipTransaction, request),\n ),\n );\n } catch (error) {\n log('Error fetching quotes', { error });\n throw new Error(`Failed to fetch Relay quotes: ${String(error)}`);\n }\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param isSkipTransaction - Whether to skip the transaction.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n isSkipTransaction: boolean,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger } = fullRequest;\n\n try {\n const body = {\n amount: request.targetAmountMinimum,\n destinationChainId: Number(request.targetChainId),\n destinationCurrency: request.targetTokenAddress,\n originChainId: Number(request.sourceChainId),\n originCurrency: request.sourceTokenAddress,\n recipient: request.from,\n tradeType: 'EXPECTED_OUTPUT',\n user: request.from,\n };\n\n const url = getFeatureFlags(messenger).relayQuoteUrl;\n\n const response = await successfulFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n const quote = (await response.json()) as RelayQuote;\n quote.skipTransaction = isSkipTransaction;\n\n log('Fetched relay quote', { quote, url });\n\n return normalizeQuote(quote, request, fullRequest);\n } catch (e) {\n log('Error fetching relay quote', e);\n throw e;\n }\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @returns Normalized request.\n */\nfunction normalizeRequest(request: QuoteRequest) {\n const isHyperliquidDeposit =\n request.targetChainId === CHAIN_ID_ARBITRUM &&\n request.targetTokenAddress.toLowerCase() ===\n ARBITRUM_USDC_ADDRESS.toLowerCase();\n\n const isPolygonNativeSource =\n request.sourceChainId === CHAIN_ID_POLYGON &&\n request.sourceTokenAddress === getNativeToken(request.sourceChainId);\n\n const requestOutput: QuoteRequest = {\n ...request,\n sourceTokenAddress: isPolygonNativeSource\n ? NATIVE_TOKEN_ADDRESS\n : request.sourceTokenAddress,\n targetChainId: isHyperliquidDeposit ? toHex(1337) : request.targetChainId,\n targetTokenAddress: isHyperliquidDeposit\n ? '0x00000000000000000000000000000000'\n : request.targetTokenAddress,\n targetAmountMinimum: isHyperliquidDeposit\n ? new BigNumber(request.targetAmountMinimum).shiftedBy(2).toString(10)\n : request.targetAmountMinimum,\n };\n\n if (isHyperliquidDeposit) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: requestOutput,\n });\n }\n\n return {\n request: requestOutput,\n isSkipTransaction: isHyperliquidDeposit,\n };\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nfunction normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): TransactionPayQuote<RelayQuote> {\n const { messenger, transaction } = fullRequest;\n const { details } = quote;\n const { currencyIn, currencyOut } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const provider = getFiatValueFromUsd(\n new BigNumber(currencyIn.amountUsd).minus(currencyOut.amountUsd),\n usdToFiatRate,\n );\n\n const sourceNetwork = calculateSourceNetworkCost(quote, messenger);\n\n const targetNetwork = quote.skipTransaction\n ? {\n usd: '0',\n fiat: '0',\n }\n : calculateTransactionGasCost(transaction, messenger);\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n provider,\n sourceNetwork,\n targetNetwork,\n },\n original: quote,\n request,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest) {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = new BigNumber(minimumAmount).minus(\n request.targetAmountMinimum,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Converts USD value to fiat value.\n *\n * @param usdValue - USD value.\n * @param usdToFiatRate - USD to fiat rate.\n * @returns Fiat value.\n */\nfunction getFiatValueFromUsd(\n usdValue: BigNumber,\n usdToFiatRate: BigNumber,\n): FiatValue {\n const fiatValue = usdValue.multipliedBy(usdToFiatRate);\n\n return {\n usd: usdValue.toString(10),\n fiat: fiatValue.toString(10),\n };\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n) {\n const { sourceChainId, sourceTokenAddress } = request;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Gets feature flags for Relay quotes.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nfunction getFeatureFlags(messenger: TransactionPayControllerMessenger) {\n const featureFlagState = messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n const featureFlags = featureFlagState.remoteFeatureFlags\n ?.confirmations_pay as Record<string, string> | undefined;\n\n const relayQuoteUrl = featureFlags?.relayQuoteUrl ?? RELAY_URL_QUOTE;\n\n return {\n relayQuoteUrl,\n };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @returns Total source network cost in USD and fiat.\n */\nfunction calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n) {\n const allParams = quote.steps[0].items.map((i) => i.data);\n const totalGasLimit = calculateSourceNetworkGasLimit(allParams);\n\n return calculateGasCost({\n chainId: allParams[0].chainId,\n gas: totalGasLimit,\n messenger,\n });\n}\n\n/**\n * Calculate the total gas limit for the source network transactions.\n *\n * @param params - Array of transaction parameters.\n * @returns - Total gas limit.\n */\nfunction calculateSourceNetworkGasLimit(\n params: RelayQuote['steps'][0]['items'][0]['data'][],\n): number {\n const allParamsHasGas = params.every((p) => p.gas !== undefined);\n\n if (allParamsHasGas) {\n return params.reduce(\n (total, p) => total + new BigNumber(p.gas as string).toNumber(),\n 0,\n );\n }\n\n // In future, call `TransactionController:estimateGas`\n // or `TransactionController:estimateGasBatch` based on params length.\n\n return params.reduce(\n (total, p) =>\n total + new BigNumber(p.gas ?? RELAY_FALLBACK_GAS_LIMIT).toNumber(),\n 0,\n );\n}\n"]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.submitRelayQuotes = void 0;
|
|
4
4
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
|
+
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
5
6
|
const utils_1 = require("@metamask/utils");
|
|
6
7
|
const constants_1 = require("./constants.cjs");
|
|
7
8
|
const logger_1 = require("../../logger.cjs");
|
|
@@ -44,13 +45,7 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
44
45
|
}
|
|
45
46
|
const transactionParams = quote.steps[0].items[0].data;
|
|
46
47
|
const chainId = (0, controller_utils_1.toHex)(transactionParams.chainId);
|
|
47
|
-
const
|
|
48
|
-
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
49
|
-
log('Adding transaction', {
|
|
50
|
-
chainId,
|
|
51
|
-
normalizedParams,
|
|
52
|
-
networkClientId,
|
|
53
|
-
});
|
|
48
|
+
const from = transactionParams.from;
|
|
54
49
|
if (quote.skipTransaction) {
|
|
55
50
|
(0, transaction_1.updateTransaction)({
|
|
56
51
|
transactionId: transaction.id,
|
|
@@ -60,27 +55,7 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
60
55
|
tx.txParams.nonce = undefined;
|
|
61
56
|
});
|
|
62
57
|
}
|
|
63
|
-
const
|
|
64
|
-
networkClientId,
|
|
65
|
-
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
66
|
-
requireApproval: false,
|
|
67
|
-
});
|
|
68
|
-
const { transactionMeta, result: transactionHashPromise } = result;
|
|
69
|
-
(0, transaction_1.updateTransaction)({
|
|
70
|
-
transactionId: transaction.id,
|
|
71
|
-
messenger,
|
|
72
|
-
note: 'Add required transaction ID',
|
|
73
|
-
}, (tx) => {
|
|
74
|
-
if (!tx.requiredTransactionIds) {
|
|
75
|
-
tx.requiredTransactionIds = [];
|
|
76
|
-
}
|
|
77
|
-
tx.requiredTransactionIds.push(transactionMeta.id);
|
|
78
|
-
});
|
|
79
|
-
log('Added transaction', transactionMeta);
|
|
80
|
-
const transactionHash = (await transactionHashPromise);
|
|
81
|
-
log('Submitted transaction', transactionHash);
|
|
82
|
-
await (0, transaction_1.waitForTransactionConfirmed)(transactionMeta.id, messenger);
|
|
83
|
-
log('Transaction confirmed', transactionMeta.id);
|
|
58
|
+
const transactionHash = await submitTransactions(quote, chainId, from, transaction.id, messenger);
|
|
84
59
|
await waitForRelayCompletion(quote);
|
|
85
60
|
log('Relay request completed');
|
|
86
61
|
if (quote.skipTransaction) {
|
|
@@ -102,7 +77,9 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
102
77
|
* @returns A promise that resolves when the Relay request is complete.
|
|
103
78
|
*/
|
|
104
79
|
async function waitForRelayCompletion(quote) {
|
|
105
|
-
const { endpoint, method } = quote.steps
|
|
80
|
+
const { endpoint, method } = quote.steps
|
|
81
|
+
.slice(-1)[0]
|
|
82
|
+
.items.slice(-1)[0].check;
|
|
106
83
|
const url = `${constants_1.RELAY_URL_BASE}${endpoint}`;
|
|
107
84
|
while (true) {
|
|
108
85
|
const response = await (0, controller_utils_1.successfulFetch)(url, { method });
|
|
@@ -127,11 +104,81 @@ function normalizeParams(params) {
|
|
|
127
104
|
return {
|
|
128
105
|
data: params.data,
|
|
129
106
|
from: params.from,
|
|
130
|
-
gas: (0, controller_utils_1.toHex)(params.gas),
|
|
107
|
+
gas: (0, controller_utils_1.toHex)(params.gas ?? constants_1.RELAY_FALLBACK_GAS_LIMIT),
|
|
131
108
|
maxFeePerGas: (0, controller_utils_1.toHex)(params.maxFeePerGas),
|
|
132
109
|
maxPriorityFeePerGas: (0, controller_utils_1.toHex)(params.maxPriorityFeePerGas),
|
|
133
110
|
to: params.to,
|
|
134
111
|
value: (0, controller_utils_1.toHex)(params.value ?? '0'),
|
|
135
112
|
};
|
|
136
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Submit transactions for a relay quote.
|
|
116
|
+
*
|
|
117
|
+
* @param quote - Relay quote.
|
|
118
|
+
* @param chainId - ID of the chain.
|
|
119
|
+
* @param from - Address of the sender.
|
|
120
|
+
* @param parentTransactionId - ID of the parent transaction.
|
|
121
|
+
* @param messenger - Controller messenger.
|
|
122
|
+
* @returns Hash of the last submitted transaction.
|
|
123
|
+
*/
|
|
124
|
+
async function submitTransactions(quote, chainId, from, parentTransactionId, messenger) {
|
|
125
|
+
const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);
|
|
126
|
+
const normalizedParams = params.map(normalizeParams);
|
|
127
|
+
const transactionIds = [];
|
|
128
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
129
|
+
log('Adding transactions', {
|
|
130
|
+
normalizedParams,
|
|
131
|
+
chainId,
|
|
132
|
+
from,
|
|
133
|
+
networkClientId,
|
|
134
|
+
});
|
|
135
|
+
const { end } = (0, transaction_1.collectTransactionIds)(chainId, from, messenger, (transactionId) => {
|
|
136
|
+
transactionIds.push(transactionId);
|
|
137
|
+
(0, transaction_1.updateTransaction)({
|
|
138
|
+
transactionId: parentTransactionId,
|
|
139
|
+
messenger,
|
|
140
|
+
note: 'Add required transaction ID from Relay submission',
|
|
141
|
+
}, (tx) => {
|
|
142
|
+
if (!tx.requiredTransactionIds) {
|
|
143
|
+
tx.requiredTransactionIds = [];
|
|
144
|
+
}
|
|
145
|
+
tx.requiredTransactionIds.push(transactionId);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
let result;
|
|
149
|
+
if (params.length === 1) {
|
|
150
|
+
result = await messenger.call('TransactionController:addTransaction', normalizedParams[0], {
|
|
151
|
+
networkClientId,
|
|
152
|
+
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
153
|
+
requireApproval: false,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
await messenger.call('TransactionController:addTransactionBatch', {
|
|
158
|
+
from,
|
|
159
|
+
networkClientId,
|
|
160
|
+
origin: controller_utils_1.ORIGIN_METAMASK,
|
|
161
|
+
requireApproval: false,
|
|
162
|
+
transactions: normalizedParams.map((p, i) => ({
|
|
163
|
+
params: {
|
|
164
|
+
data: p.data,
|
|
165
|
+
gas: p.gas,
|
|
166
|
+
to: p.to,
|
|
167
|
+
value: p.value,
|
|
168
|
+
},
|
|
169
|
+
type: i === 0 ? transaction_controller_1.TransactionType.tokenMethodApprove : undefined,
|
|
170
|
+
})),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
end();
|
|
174
|
+
log('Added transactions', transactionIds);
|
|
175
|
+
if (result) {
|
|
176
|
+
const txHash = await result.result;
|
|
177
|
+
log('Submitted transaction', txHash);
|
|
178
|
+
}
|
|
179
|
+
await Promise.all(transactionIds.map((txId) => (0, transaction_1.waitForTransactionConfirmed)(txId, messenger)));
|
|
180
|
+
log('All transactions confirmed', transactionIds);
|
|
181
|
+
const hash = (0, transaction_1.getTransaction)(transactionIds.slice(-1)[0], messenger)?.hash;
|
|
182
|
+
return hash;
|
|
183
|
+
}
|
|
137
184
|
//# sourceMappingURL=relay-submit.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const normalizedParams = normalizeParams(transactionParams);\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transaction', {\n chainId,\n normalizedParams,\n networkClientId,\n });\n\n if (quote.skipTransaction) {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n }\n\n const result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams,\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n\n const { transactionMeta, result: transactionHashPromise } = result;\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionMeta.id);\n },\n );\n\n log('Added transaction', transactionMeta);\n\n const transactionHash = (await transactionHashPromise) as Hex;\n\n log('Submitted transaction', transactionHash);\n\n await waitForTransactionConfirmed(transactionMeta.id, messenger);\n\n log('Transaction confirmed', transactionMeta.id);\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps[0].items[0].check;\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport {\n TransactionType,\n type TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_FALLBACK_GAS_LIMIT, RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const from = transactionParams.from as Hex;\n\n if (quote.skipTransaction) {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n }\n\n const transactionHash = await submitTransactions(\n quote,\n chainId,\n from,\n transaction.id,\n messenger,\n );\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps\n .slice(-1)[0]\n .items.slice(-1)[0].check;\n\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * @param quote - Relay quote.\n * @param chainId - ID of the chain.\n * @param from - Address of the sender.\n * @param parentTransactionId - ID of the parent transaction.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: RelayQuote,\n chainId: Hex,\n from: Hex,\n parentTransactionId: string,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);\n const normalizedParams = params.map(normalizeParams);\n const transactionIds: string[] = [];\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transactions', {\n normalizedParams,\n chainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransactionId,\n messenger,\n note: 'Add required transaction ID from Relay submission',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n\n if (params.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams[0],\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n } else {\n await messenger.call('TransactionController:addTransactionBatch', {\n from,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n transactions: normalizedParams.map((p, i) => ({\n params: {\n data: p.data as Hex,\n gas: p.gas as Hex,\n to: p.to as Hex,\n value: p.value as Hex,\n },\n type: i === 0 ? TransactionType.tokenMethodApprove : undefined,\n })),\n });\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n log('All transactions confirmed', transactionIds);\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n return hash as Hex;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAUrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAuBpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAgB;AAEvD,OAAO,KAAK,EACV,yBAAyB,EAE1B,wBAAoB;AAUrB;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAuBpC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ORIGIN_METAMASK, successfulFetch, toHex } from "@metamask/controller-utils";
|
|
2
|
+
import { TransactionType } from "@metamask/transaction-controller";
|
|
2
3
|
import { createModuleLogger } from "@metamask/utils";
|
|
3
|
-
import { RELAY_URL_BASE } from "./constants.mjs";
|
|
4
|
+
import { RELAY_FALLBACK_GAS_LIMIT, RELAY_URL_BASE } from "./constants.mjs";
|
|
4
5
|
import { projectLogger } from "../../logger.mjs";
|
|
5
|
-
import { updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
|
|
6
|
+
import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
|
|
6
7
|
const log = createModuleLogger(projectLogger, 'relay-strategy');
|
|
7
8
|
/**
|
|
8
9
|
* Submits Relay quotes.
|
|
@@ -40,13 +41,7 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
40
41
|
}
|
|
41
42
|
const transactionParams = quote.steps[0].items[0].data;
|
|
42
43
|
const chainId = toHex(transactionParams.chainId);
|
|
43
|
-
const
|
|
44
|
-
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
45
|
-
log('Adding transaction', {
|
|
46
|
-
chainId,
|
|
47
|
-
normalizedParams,
|
|
48
|
-
networkClientId,
|
|
49
|
-
});
|
|
44
|
+
const from = transactionParams.from;
|
|
50
45
|
if (quote.skipTransaction) {
|
|
51
46
|
updateTransaction({
|
|
52
47
|
transactionId: transaction.id,
|
|
@@ -56,27 +51,7 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
56
51
|
tx.txParams.nonce = undefined;
|
|
57
52
|
});
|
|
58
53
|
}
|
|
59
|
-
const
|
|
60
|
-
networkClientId,
|
|
61
|
-
origin: ORIGIN_METAMASK,
|
|
62
|
-
requireApproval: false,
|
|
63
|
-
});
|
|
64
|
-
const { transactionMeta, result: transactionHashPromise } = result;
|
|
65
|
-
updateTransaction({
|
|
66
|
-
transactionId: transaction.id,
|
|
67
|
-
messenger,
|
|
68
|
-
note: 'Add required transaction ID',
|
|
69
|
-
}, (tx) => {
|
|
70
|
-
if (!tx.requiredTransactionIds) {
|
|
71
|
-
tx.requiredTransactionIds = [];
|
|
72
|
-
}
|
|
73
|
-
tx.requiredTransactionIds.push(transactionMeta.id);
|
|
74
|
-
});
|
|
75
|
-
log('Added transaction', transactionMeta);
|
|
76
|
-
const transactionHash = (await transactionHashPromise);
|
|
77
|
-
log('Submitted transaction', transactionHash);
|
|
78
|
-
await waitForTransactionConfirmed(transactionMeta.id, messenger);
|
|
79
|
-
log('Transaction confirmed', transactionMeta.id);
|
|
54
|
+
const transactionHash = await submitTransactions(quote, chainId, from, transaction.id, messenger);
|
|
80
55
|
await waitForRelayCompletion(quote);
|
|
81
56
|
log('Relay request completed');
|
|
82
57
|
if (quote.skipTransaction) {
|
|
@@ -98,7 +73,9 @@ async function executeSingleQuote(quote, messenger, transaction) {
|
|
|
98
73
|
* @returns A promise that resolves when the Relay request is complete.
|
|
99
74
|
*/
|
|
100
75
|
async function waitForRelayCompletion(quote) {
|
|
101
|
-
const { endpoint, method } = quote.steps
|
|
76
|
+
const { endpoint, method } = quote.steps
|
|
77
|
+
.slice(-1)[0]
|
|
78
|
+
.items.slice(-1)[0].check;
|
|
102
79
|
const url = `${RELAY_URL_BASE}${endpoint}`;
|
|
103
80
|
while (true) {
|
|
104
81
|
const response = await successfulFetch(url, { method });
|
|
@@ -123,11 +100,81 @@ function normalizeParams(params) {
|
|
|
123
100
|
return {
|
|
124
101
|
data: params.data,
|
|
125
102
|
from: params.from,
|
|
126
|
-
gas: toHex(params.gas),
|
|
103
|
+
gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),
|
|
127
104
|
maxFeePerGas: toHex(params.maxFeePerGas),
|
|
128
105
|
maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),
|
|
129
106
|
to: params.to,
|
|
130
107
|
value: toHex(params.value ?? '0'),
|
|
131
108
|
};
|
|
132
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Submit transactions for a relay quote.
|
|
112
|
+
*
|
|
113
|
+
* @param quote - Relay quote.
|
|
114
|
+
* @param chainId - ID of the chain.
|
|
115
|
+
* @param from - Address of the sender.
|
|
116
|
+
* @param parentTransactionId - ID of the parent transaction.
|
|
117
|
+
* @param messenger - Controller messenger.
|
|
118
|
+
* @returns Hash of the last submitted transaction.
|
|
119
|
+
*/
|
|
120
|
+
async function submitTransactions(quote, chainId, from, parentTransactionId, messenger) {
|
|
121
|
+
const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);
|
|
122
|
+
const normalizedParams = params.map(normalizeParams);
|
|
123
|
+
const transactionIds = [];
|
|
124
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
125
|
+
log('Adding transactions', {
|
|
126
|
+
normalizedParams,
|
|
127
|
+
chainId,
|
|
128
|
+
from,
|
|
129
|
+
networkClientId,
|
|
130
|
+
});
|
|
131
|
+
const { end } = collectTransactionIds(chainId, from, messenger, (transactionId) => {
|
|
132
|
+
transactionIds.push(transactionId);
|
|
133
|
+
updateTransaction({
|
|
134
|
+
transactionId: parentTransactionId,
|
|
135
|
+
messenger,
|
|
136
|
+
note: 'Add required transaction ID from Relay submission',
|
|
137
|
+
}, (tx) => {
|
|
138
|
+
if (!tx.requiredTransactionIds) {
|
|
139
|
+
tx.requiredTransactionIds = [];
|
|
140
|
+
}
|
|
141
|
+
tx.requiredTransactionIds.push(transactionId);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
let result;
|
|
145
|
+
if (params.length === 1) {
|
|
146
|
+
result = await messenger.call('TransactionController:addTransaction', normalizedParams[0], {
|
|
147
|
+
networkClientId,
|
|
148
|
+
origin: ORIGIN_METAMASK,
|
|
149
|
+
requireApproval: false,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
await messenger.call('TransactionController:addTransactionBatch', {
|
|
154
|
+
from,
|
|
155
|
+
networkClientId,
|
|
156
|
+
origin: ORIGIN_METAMASK,
|
|
157
|
+
requireApproval: false,
|
|
158
|
+
transactions: normalizedParams.map((p, i) => ({
|
|
159
|
+
params: {
|
|
160
|
+
data: p.data,
|
|
161
|
+
gas: p.gas,
|
|
162
|
+
to: p.to,
|
|
163
|
+
value: p.value,
|
|
164
|
+
},
|
|
165
|
+
type: i === 0 ? TransactionType.tokenMethodApprove : undefined,
|
|
166
|
+
})),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
end();
|
|
170
|
+
log('Added transactions', transactionIds);
|
|
171
|
+
if (result) {
|
|
172
|
+
const txHash = await result.result;
|
|
173
|
+
log('Submitted transaction', txHash);
|
|
174
|
+
}
|
|
175
|
+
await Promise.all(transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)));
|
|
176
|
+
log('All transactions confirmed', transactionIds);
|
|
177
|
+
const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;
|
|
178
|
+
return hash;
|
|
179
|
+
}
|
|
133
180
|
//# sourceMappingURL=relay-submit.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,EACN,mCAAmC;AAIpC,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAErD,OAAO,EAAE,cAAc,EAAE,wBAAoB;AAE7C,OAAO,EAAE,aAAa,EAAE,yBAAqB;AAK7C,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC5B,oCAAgC;AAEjC,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA8C;IAE9C,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEnD,IAAI,eAAgC,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAK,CAAC,QAAQ,EACd,SAAS,EACT,WAAW,CACZ,CAAC,CAAC;KACJ;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAEzE,IAAI,iBAAiB,EAAE;QACrB,GAAG,CAAC,+BAA+B,EAAE,eAAe,CAAC,CAAC;QACtD,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B;IAED,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,kBAAkB,CAC/B,KAAiB,EACjB,SAA4C,EAC5C,WAA4B;IAE5B,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAErC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,IAAI,KAAK,aAAa,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAc,EAAE,CAAC,CAAC;KAC7D;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAE5D,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CACpC,gDAAgD,EAChD,OAAO,CACR,CAAC;IAEF,GAAG,CAAC,oBAAoB,EAAE;QACxB,OAAO;QACP,gBAAgB;QAChB,eAAe;KAChB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,eAAe,EAAE;QACzB,iBAAiB,CACf;YACE,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,SAAS;YACT,IAAI,EAAE,uCAAuC;SAC9C,EACD,CAAC,EAAE,EAAE,EAAE;YACL,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;QAChC,CAAC,CACF,CAAC;KACH;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CACjC,sCAAsC,EACtC,gBAAgB,EAChB;QACE,eAAe;QACf,MAAM,EAAE,eAAe;QACvB,eAAe,EAAE,KAAK;KACvB,CACF,CAAC;IAEF,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAAC;IAEnE,iBAAiB,CACf;QACE,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,SAAS;QACT,IAAI,EAAE,6BAA6B;KACpC,EACD,CAAC,EAAE,EAAE,EAAE;QACL,IAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE;YAC9B,EAAE,CAAC,sBAAsB,GAAG,EAAE,CAAC;SAChC;QAED,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAE1C,MAAM,eAAe,GAAG,CAAC,MAAM,sBAAsB,CAAQ,CAAC;IAE9D,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;IAE9C,MAAM,2BAA2B,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAEjE,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAEpC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,eAAe,EAAE;QACzB,GAAG,CAAC,8CAA8C,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAEpE,iBAAiB,CACf;YACE,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,SAAS;YACT,IAAI,EAAE,wCAAwC;SAC/C,EACD,CAAC,EAAE,EAAE,EAAE;YACL,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,CAAC,CACF,CAAC;KACH;IAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CAAC,KAAiB;IACrD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,MAAM,GAAG,GAAG,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC;IAE3C,OAAO,IAAI,EAAE;QACX,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;QAEtD,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE5C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE;YAC/B,OAAO;SACR;QAED,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;SACvE;QAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;KAC3D;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CACtB,MAAkD;IAElD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QACtB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;QACxC,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC;QACxD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const normalizedParams = normalizeParams(transactionParams);\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transaction', {\n chainId,\n normalizedParams,\n networkClientId,\n });\n\n if (quote.skipTransaction) {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n }\n\n const result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams,\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n\n const { transactionMeta, result: transactionHashPromise } = result;\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionMeta.id);\n },\n );\n\n log('Added transaction', transactionMeta);\n\n const transactionHash = (await transactionHashPromise) as Hex;\n\n log('Submitted transaction', transactionHash);\n\n await waitForTransactionConfirmed(transactionMeta.id, messenger);\n\n log('Transaction confirmed', transactionMeta.id);\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps[0].items[0].check;\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-submit.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport {\n TransactionType,\n type TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { RELAY_FALLBACK_GAS_LIMIT, RELAY_URL_BASE } from './constants';\nimport type { RelayQuote, RelayStatus } from './types';\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n} from '../../types';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote.original,\n messenger,\n transaction,\n ));\n }\n\n const isSkipTransaction = quotes.some((q) => q.original.skipTransaction);\n\n if (isSkipTransaction) {\n log('Skipping original transaction', transactionHash);\n return { transactionHash };\n }\n\n return { transactionHash: undefined };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n) {\n log('Executing single quote', quote);\n\n const { kind } = quote.steps[0];\n\n if (kind !== 'transaction') {\n throw new Error(`Unsupported step kind: ${kind as string}`);\n }\n\n const transactionParams = quote.steps[0].items[0].data;\n const chainId = toHex(transactionParams.chainId);\n const from = transactionParams.from as Hex;\n\n if (quote.skipTransaction) {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n }\n\n const transactionHash = await submitTransactions(\n quote,\n chainId,\n from,\n transaction.id,\n messenger,\n );\n\n await waitForRelayCompletion(quote);\n\n log('Relay request completed');\n\n if (quote.skipTransaction) {\n log('Updating intent complete flag on transaction', transaction.id);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n }\n\n return { transactionHash };\n}\n\n/**\n * Wait for a Relay request to complete.\n *\n * @param quote - Relay quote associated with the request.\n * @returns A promise that resolves when the Relay request is complete.\n */\nasync function waitForRelayCompletion(quote: RelayQuote) {\n const { endpoint, method } = quote.steps\n .slice(-1)[0]\n .items.slice(-1)[0].check;\n\n const url = `${RELAY_URL_BASE}${endpoint}`;\n\n while (true) {\n const response = await successfulFetch(url, { method });\n const status = (await response.json()) as RelayStatus;\n\n log('Polled status', status.status, status);\n\n if (status.status === 'success') {\n return;\n }\n\n if (['failure', 'refund'].includes(status.status)) {\n throw new Error(`Relay request failed with status: ${status.status}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayQuote['steps'][0]['items'][0]['data'],\n): TransactionParams {\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? RELAY_FALLBACK_GAS_LIMIT),\n maxFeePerGas: toHex(params.maxFeePerGas),\n maxPriorityFeePerGas: toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * @param quote - Relay quote.\n * @param chainId - ID of the chain.\n * @param from - Address of the sender.\n * @param parentTransactionId - ID of the parent transaction.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: RelayQuote,\n chainId: Hex,\n from: Hex,\n parentTransactionId: string,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n const params = quote.steps.flatMap((s) => s.items).map((i) => i.data);\n const normalizedParams = params.map(normalizeParams);\n const transactionIds: string[] = [];\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n log('Adding transactions', {\n normalizedParams,\n chainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransactionId,\n messenger,\n note: 'Add required transaction ID from Relay submission',\n },\n (tx) => {\n if (!tx.requiredTransactionIds) {\n tx.requiredTransactionIds = [];\n }\n\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n\n if (params.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n normalizedParams[0],\n {\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n },\n );\n } else {\n await messenger.call('TransactionController:addTransactionBatch', {\n from,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n transactions: normalizedParams.map((p, i) => ({\n params: {\n data: p.data as Hex,\n gas: p.gas as Hex,\n to: p.to as Hex,\n value: p.value as Hex,\n },\n type: i === 0 ? TransactionType.tokenMethodApprove : undefined,\n })),\n });\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n log('All transactions confirmed', transactionIds);\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n return hash as Hex;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountUsd: string;\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n gas: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas
|
|
1
|
+
{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountUsd: string;\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n gas: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas?: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n skipTransaction?: boolean;\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,YAAY,EAAE,MAAM,CAAC;gBACrB,oBAAoB,EAAE,MAAM,CAAC;gBAC7B,EAAE,EAAE,GAAG,CAAC;gBACR,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;SACnC,EAAE,CAAC;QACJ,IAAI,EAAE,aAAa,CAAC;KACrB,EAAE,CAAC;IACJ,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EACF,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE;QACP,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE;YACX,eAAe,EAAE,MAAM,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE;YACH,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;aACxB,CAAC;YACF,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,GAAG,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC;gBACV,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,YAAY,EAAE,MAAM,CAAC;gBACrB,oBAAoB,EAAE,MAAM,CAAC;gBAC7B,EAAE,EAAE,GAAG,CAAC;gBACR,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;SACnC,EAAE,CAAC;QACJ,IAAI,EAAE,aAAa,CAAC;KACrB,EAAE,CAAC;IACJ,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EACF,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountUsd: string;\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n gas: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../../src/strategy/relay/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nexport type RelayQuote = {\n details: {\n currencyIn: {\n amountUsd: string;\n };\n currencyOut: {\n amountFormatted: string;\n amountUsd: string;\n currency: {\n decimals: number;\n };\n minimumAmount: string;\n };\n timeEstimate: number;\n };\n fees: {\n gas: {\n amountUsd: string;\n };\n };\n steps: {\n items: {\n check: {\n endpoint: string;\n method: 'GET' | 'POST';\n };\n data: {\n chainId: number;\n data: Hex;\n from: Hex;\n gas?: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n to: Hex;\n value: string;\n };\n status: 'complete' | 'incomplete';\n }[];\n kind: 'transaction';\n }[];\n skipTransaction?: boolean;\n};\n\nexport type RelayStatus = {\n status:\n | 'refund'\n | 'waiting'\n | 'failure'\n | 'pending'\n | 'submitted'\n | 'success';\n inTxHashes: string[];\n txHashes: string[];\n updatedAt: number;\n originChainId: number;\n destinationChainId: number;\n};\n"]}
|