@metamask/transaction-pay-controller 16.2.0 → 16.4.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 +22 -1
- package/dist/TransactionPayController.cjs +11 -0
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts +2 -1
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts +2 -1
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +11 -0
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/actions/update-fiat-payment.cjs +29 -0
- package/dist/actions/update-fiat-payment.cjs.map +1 -0
- package/dist/actions/update-fiat-payment.d.cts +14 -0
- package/dist/actions/update-fiat-payment.d.cts.map +1 -0
- package/dist/actions/update-fiat-payment.d.mts +14 -0
- package/dist/actions/update-fiat-payment.d.mts.map +1 -0
- package/dist/actions/update-fiat-payment.mjs +25 -0
- package/dist/actions/update-fiat-payment.mjs.map +1 -0
- package/dist/actions/update-payment-token.cjs +1 -0
- package/dist/actions/update-payment-token.cjs.map +1 -1
- package/dist/actions/update-payment-token.d.cts.map +1 -1
- package/dist/actions/update-payment-token.d.mts.map +1 -1
- package/dist/actions/update-payment-token.mjs +1 -0
- package/dist/actions/update-payment-token.mjs.map +1 -1
- package/dist/constants.cjs +1 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +1 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +1 -0
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +1 -0
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/strategy/across/AcrossStrategy.cjs +28 -0
- package/dist/strategy/across/AcrossStrategy.cjs.map +1 -0
- package/dist/strategy/across/AcrossStrategy.d.cts +8 -0
- package/dist/strategy/across/AcrossStrategy.d.cts.map +1 -0
- package/dist/strategy/across/AcrossStrategy.d.mts +8 -0
- package/dist/strategy/across/AcrossStrategy.d.mts.map +1 -0
- package/dist/strategy/across/AcrossStrategy.mjs +24 -0
- package/dist/strategy/across/AcrossStrategy.mjs.map +1 -0
- package/dist/strategy/across/across-quotes.cjs +356 -0
- package/dist/strategy/across/across-quotes.cjs.map +1 -0
- package/dist/strategy/across/across-quotes.d.cts +10 -0
- package/dist/strategy/across/across-quotes.d.cts.map +1 -0
- package/dist/strategy/across/across-quotes.d.mts +10 -0
- package/dist/strategy/across/across-quotes.d.mts.map +1 -0
- package/dist/strategy/across/across-quotes.mjs +352 -0
- package/dist/strategy/across/across-quotes.mjs.map +1 -0
- package/dist/strategy/across/across-submit.cjs +241 -0
- package/dist/strategy/across/across-submit.cjs.map +1 -0
- package/dist/strategy/across/across-submit.d.cts +13 -0
- package/dist/strategy/across/across-submit.d.cts.map +1 -0
- package/dist/strategy/across/across-submit.d.mts +13 -0
- package/dist/strategy/across/across-submit.d.mts.map +1 -0
- package/dist/strategy/across/across-submit.mjs +237 -0
- package/dist/strategy/across/across-submit.mjs.map +1 -0
- package/dist/strategy/across/types.cjs +3 -0
- package/dist/strategy/across/types.cjs.map +1 -0
- package/dist/strategy/across/types.d.cts +89 -0
- package/dist/strategy/across/types.d.cts.map +1 -0
- package/dist/strategy/across/types.d.mts +89 -0
- package/dist/strategy/across/types.d.mts.map +1 -0
- package/dist/strategy/across/types.mjs +2 -0
- package/dist/strategy/across/types.mjs.map +1 -0
- package/dist/strategy/relay/RelayStrategy.cjs +5 -0
- package/dist/strategy/relay/RelayStrategy.cjs.map +1 -1
- package/dist/strategy/relay/RelayStrategy.d.cts +1 -0
- package/dist/strategy/relay/RelayStrategy.d.cts.map +1 -1
- package/dist/strategy/relay/RelayStrategy.d.mts +1 -0
- package/dist/strategy/relay/RelayStrategy.d.mts.map +1 -1
- package/dist/strategy/relay/RelayStrategy.mjs +5 -0
- package/dist/strategy/relay/RelayStrategy.mjs.map +1 -1
- package/dist/strategy/relay/gas-station.cjs +92 -0
- package/dist/strategy/relay/gas-station.cjs.map +1 -0
- package/dist/strategy/relay/gas-station.d.cts +22 -0
- package/dist/strategy/relay/gas-station.d.cts.map +1 -0
- package/dist/strategy/relay/gas-station.d.mts +22 -0
- package/dist/strategy/relay/gas-station.d.mts.map +1 -0
- package/dist/strategy/relay/gas-station.mjs +87 -0
- package/dist/strategy/relay/gas-station.mjs.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.cjs +242 -0
- package/dist/strategy/relay/relay-max-gas-station.cjs.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.d.cts +22 -0
- package/dist/strategy/relay/relay-max-gas-station.d.cts.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.d.mts +22 -0
- package/dist/strategy/relay/relay-max-gas-station.d.mts.map +1 -0
- package/dist/strategy/relay/relay-max-gas-station.mjs +238 -0
- package/dist/strategy/relay/relay-max-gas-station.mjs.map +1 -0
- package/dist/strategy/relay/relay-quotes.cjs +38 -59
- 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 +35 -56
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/types.cjs.map +1 -1
- package/dist/strategy/relay/types.d.cts +1 -0
- package/dist/strategy/relay/types.d.cts.map +1 -1
- package/dist/strategy/relay/types.d.mts +1 -0
- package/dist/strategy/relay/types.d.mts.map +1 -1
- package/dist/strategy/relay/types.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +44 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +44 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/amounts.cjs +40 -0
- package/dist/utils/amounts.cjs.map +1 -0
- package/dist/utils/amounts.d.cts +18 -0
- package/dist/utils/amounts.d.cts.map +1 -0
- package/dist/utils/amounts.d.mts +18 -0
- package/dist/utils/amounts.d.mts.map +1 -0
- package/dist/utils/amounts.mjs +35 -0
- package/dist/utils/amounts.mjs.map +1 -0
- package/dist/utils/feature-flags.cjs +45 -6
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +45 -2
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +45 -2
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +42 -5
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/gas.cjs +46 -1
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.d.cts +18 -0
- package/dist/utils/gas.d.cts.map +1 -1
- package/dist/utils/gas.d.mts +18 -0
- package/dist/utils/gas.d.mts.map +1 -1
- package/dist/utils/gas.mjs +44 -0
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +8 -3
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +8 -3
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/strategy.cjs +3 -0
- package/dist/utils/strategy.cjs.map +1 -1
- package/dist/utils/strategy.d.cts.map +1 -1
- package/dist/utils/strategy.d.mts.map +1 -1
- package/dist/utils/strategy.mjs +3 -0
- package/dist/utils/strategy.mjs.map +1 -1
- package/dist/utils/totals.cjs +4 -19
- package/dist/utils/totals.cjs.map +1 -1
- package/dist/utils/totals.d.cts.map +1 -1
- package/dist/utils/totals.d.mts.map +1 -1
- package/dist/utils/totals.mjs +1 -16
- package/dist/utils/totals.mjs.map +1 -1
- package/package.json +3 -3
package/dist/utils/gas.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type {\n GasFeeToken,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getNativeToken, getTokenBalance, getTokenFiatRate } from './token';\nimport type { TransactionPayControllerMessenger } from '..';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { Amount } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n *\n * Calculate the estimated gas cost for a given transaction in fiat.\n *\n * @param transaction - Transaction to calculate gas cost for\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum fee.\n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateTransactionGasCost(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax?: boolean } = {},\n): Amount & { isGasFeeToken?: boolean } {\n const {\n chainId,\n gasUsed: gasUsedOriginal,\n gasLimitNoBuffer,\n txParams,\n } = transaction;\n\n const { from, gas, maxFeePerGas, maxPriorityFeePerGas } = txParams;\n const gasUsed = isMax ? undefined : gasUsedOriginal;\n const finalGas = gasUsed ?? gasLimitNoBuffer ?? gas ?? '0x0';\n\n const result = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax: true,\n messenger,\n });\n\n const nativeBalance = getTokenBalance(\n messenger,\n from as Hex,\n chainId,\n getNativeToken(chainId),\n );\n\n const hasBalance = new BigNumber(nativeBalance).gte(max.raw);\n\n const gasFeeTokenCost = calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n });\n\n if (gasFeeTokenCost) {\n return gasFeeTokenCost;\n }\n\n return result;\n}\n\n/**\n * Calculate the gas cost for the specified parameters.\n *\n * @param request - Gas cost calculation parameters.\n * @param request.chainId - ID of the chain.\n * @param request.gas - Amount of gas the transaction will use.\n * @param request.isMax - Whether to calculate the maximum fee.\n * @param request.maxFeePerGas - Max fee to pay per gas.\n * @param request.maxPriorityFeePerGas - Max priority fee to pay per gas.\n * @param request.messenger - Controller messenger.\n \n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateGasCost(request: {\n chainId: number | Hex;\n gas: BigNumber.Value;\n isMax?: boolean;\n maxFeePerGas?: BigNumber.Value;\n maxPriorityFeePerGas?: BigNumber.Value;\n messenger: TransactionPayControllerMessenger;\n}): Amount {\n const {\n chainId: chainIdInput,\n gas,\n isMax,\n maxFeePerGas: maxFeePerGasInput,\n maxPriorityFeePerGas: maxPriorityFeePerGasInput,\n messenger,\n } = request;\n\n const chainId = toHex(chainIdInput);\n\n const {\n estimatedBaseFee,\n maxFeePerGas: maxFeePerGasEstimate,\n maxPriorityFeePerGas: maxPriorityFeePerGasEstimate,\n } = getGasFee(chainId, messenger);\n\n const maxFeePerGas = maxFeePerGasInput ?? maxFeePerGasEstimate;\n\n const maxPriorityFeePerGas =\n maxPriorityFeePerGasInput ?? maxPriorityFeePerGasEstimate;\n\n const feePerGas =\n estimatedBaseFee && maxPriorityFeePerGas && !isMax\n ? new BigNumber(estimatedBaseFee).plus(maxPriorityFeePerGas)\n : new BigNumber(maxFeePerGas ?? '0x0');\n\n const rawValue = new BigNumber(gas).multipliedBy(feePerGas);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-18);\n const human = humanValue.toString(10);\n\n const fiatRate = getTokenFiatRate(\n messenger,\n getNativeToken(chainId),\n chainId,\n );\n\n if (!fiatRate) {\n throw new Error('Could not fetch fiat rate for native token');\n }\n\n const usd = humanValue.multipliedBy(fiatRate.usdRate).toString(10);\n const fiat = humanValue.multipliedBy(fiatRate.fiatRate).toString(10);\n\n return {\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.chainId - Chain ID.\n * @param request.gasFeeToken - Gas fee token to calculate cost for.\n * @param request.messenger - Controller messenger.\n * @returns Cost of the gas fee token.\n */\nexport function calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n}: {\n chainId: Hex;\n gasFeeToken: GasFeeToken;\n messenger: TransactionPayControllerMessenger;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const { amount, decimals, tokenAddress } = gasFeeToken;\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (!tokenFiatRate) {\n log('Cannot get gas fee token info');\n return undefined;\n }\n\n const rawValue = new BigNumber(amount);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const fiat = humanValue.multipliedBy(tokenFiatRate.fiatRate).toString(10);\n const usd = humanValue.multipliedBy(tokenFiatRate.usdRate).toString(10);\n\n return {\n isGasFeeToken: true,\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Get gas fee estimates for a given chain.\n *\n * @param chainId - Chain ID.\n * @param messenger - Controller messenger.\n * @returns Gas fee estimates for the chain.\n */\nfunction getGasFee(\n chainId: Hex,\n messenger: TransactionPayControllerMessenger,\n): {\n estimatedBaseFee: string | undefined;\n maxFeePerGas: string | undefined;\n maxPriorityFeePerGas: string | undefined;\n} {\n const gasFeeControllerState = messenger.call('GasFeeController:getState');\n\n const chainState = gasFeeControllerState?.gasFeeEstimatesByChainId?.[chainId];\n\n const { estimatedBaseFee: estimatedBaseFeeGwei, medium } =\n (chainState?.gasFeeEstimates as GasFeeEstimates | undefined) ?? {};\n\n const maxFeePerGasGwei = medium?.suggestedMaxFeePerGas;\n const maxPriorityFeePerGasGwei = medium?.suggestedMaxPriorityFeePerGas;\n\n const estimatedBaseFee = estimatedBaseFeeGwei\n ? new BigNumber(estimatedBaseFeeGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxFeePerGas = maxFeePerGasGwei\n ? new BigNumber(maxFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxPriorityFeePerGas = maxPriorityFeePerGasGwei\n ? new BigNumber(maxPriorityFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n return { estimatedBaseFee, maxFeePerGas, maxPriorityFeePerGas };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.hasBalance - Whether the user has enough balance to cover the gas fee.\n * @param request.messenger - Controller messenger.\n * @param request.transaction - Transaction to calculate gas fee token cost for.\n * @returns Cost of the gas fee token.\n */\nfunction calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n}: {\n hasBalance: boolean;\n messenger: TransactionPayControllerMessenger;\n transaction: TransactionMeta;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const {\n chainId,\n gasFeeTokens,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !gasFeeTokens ||\n !selectedGasFeeToken ||\n (isGasFeeTokenIgnoredIfBalance && hasBalance)\n ) {\n return undefined;\n }\n\n log('Calculating gas fee token cost', { selectedGasFeeToken, chainId });\n\n const gasFeeToken = gasFeeTokens?.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n selectedGasFeeToken.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('Gas fee token not found', {\n gasFeeTokens,\n selectedGasFeeToken,\n });\n\n return undefined;\n }\n\n return calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type {\n GasFeeToken,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getFallbackGas, getGasBuffer } from './feature-flags';\nimport { getNativeToken, getTokenBalance, getTokenFiatRate } from './token';\nimport type { TransactionPayControllerMessenger } from '..';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { Amount } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n *\n * Calculate the estimated gas cost for a given transaction in fiat.\n *\n * @param transaction - Transaction to calculate gas cost for\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum fee.\n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateTransactionGasCost(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax?: boolean } = {},\n): Amount & { isGasFeeToken?: boolean } {\n const {\n chainId,\n gasUsed: gasUsedOriginal,\n gasLimitNoBuffer,\n txParams,\n } = transaction;\n\n const { from, gas, maxFeePerGas, maxPriorityFeePerGas } = txParams;\n const gasUsed = isMax ? undefined : gasUsedOriginal;\n const finalGas = gasUsed ?? gasLimitNoBuffer ?? gas ?? '0x0';\n\n const result = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax: true,\n messenger,\n });\n\n const nativeBalance = getTokenBalance(\n messenger,\n from as Hex,\n chainId,\n getNativeToken(chainId),\n );\n\n const hasBalance = new BigNumber(nativeBalance).gte(max.raw);\n\n const gasFeeTokenCost = calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n });\n\n if (gasFeeTokenCost) {\n return gasFeeTokenCost;\n }\n\n return result;\n}\n\n/**\n * Calculate the gas cost for the specified parameters.\n *\n * @param request - Gas cost calculation parameters.\n * @param request.chainId - ID of the chain.\n * @param request.gas - Amount of gas the transaction will use.\n * @param request.isMax - Whether to calculate the maximum fee.\n * @param request.maxFeePerGas - Max fee to pay per gas.\n * @param request.maxPriorityFeePerGas - Max priority fee to pay per gas.\n * @param request.messenger - Controller messenger.\n \n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateGasCost(request: {\n chainId: number | Hex;\n gas: BigNumber.Value;\n isMax?: boolean;\n maxFeePerGas?: BigNumber.Value;\n maxPriorityFeePerGas?: BigNumber.Value;\n messenger: TransactionPayControllerMessenger;\n}): Amount {\n const {\n chainId: chainIdInput,\n gas,\n isMax,\n maxFeePerGas: maxFeePerGasInput,\n maxPriorityFeePerGas: maxPriorityFeePerGasInput,\n messenger,\n } = request;\n\n const chainId = toHex(chainIdInput);\n\n const {\n estimatedBaseFee,\n maxFeePerGas: maxFeePerGasEstimate,\n maxPriorityFeePerGas: maxPriorityFeePerGasEstimate,\n } = getGasFee(chainId, messenger);\n\n const maxFeePerGas = maxFeePerGasInput ?? maxFeePerGasEstimate;\n\n const maxPriorityFeePerGas =\n maxPriorityFeePerGasInput ?? maxPriorityFeePerGasEstimate;\n\n const feePerGas =\n estimatedBaseFee && maxPriorityFeePerGas && !isMax\n ? new BigNumber(estimatedBaseFee).plus(maxPriorityFeePerGas)\n : new BigNumber(maxFeePerGas ?? '0x0');\n\n const rawValue = new BigNumber(gas).multipliedBy(feePerGas);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-18);\n const human = humanValue.toString(10);\n\n const fiatRate = getTokenFiatRate(\n messenger,\n getNativeToken(chainId),\n chainId,\n );\n\n if (!fiatRate) {\n throw new Error('Could not fetch fiat rate for native token');\n }\n\n const usd = humanValue.multipliedBy(fiatRate.usdRate).toString(10);\n const fiat = humanValue.multipliedBy(fiatRate.fiatRate).toString(10);\n\n return {\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.chainId - Chain ID.\n * @param request.gasFeeToken - Gas fee token to calculate cost for.\n * @param request.messenger - Controller messenger.\n * @returns Cost of the gas fee token.\n */\nexport function calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n}: {\n chainId: Hex;\n gasFeeToken: GasFeeToken;\n messenger: TransactionPayControllerMessenger;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const { amount, decimals, tokenAddress } = gasFeeToken;\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (!tokenFiatRate) {\n log('Cannot get gas fee token info');\n return undefined;\n }\n\n const rawValue = new BigNumber(amount);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const fiat = humanValue.multipliedBy(tokenFiatRate.fiatRate).toString(10);\n const usd = humanValue.multipliedBy(tokenFiatRate.usdRate).toString(10);\n\n return {\n isGasFeeToken: true,\n fiat,\n human,\n raw,\n usd,\n };\n}\n\nexport async function estimateGasLimit({\n chainId,\n data,\n fallbackGas,\n fallbackOnSimulationFailure = false,\n from,\n messenger,\n to,\n value,\n}: {\n chainId: Hex;\n data: Hex;\n fallbackGas?: {\n estimate: number;\n max: number;\n };\n fallbackOnSimulationFailure?: boolean;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n to: Hex;\n value?: Hex;\n}): Promise<{\n estimate: number;\n max: number;\n usedFallback: boolean;\n error?: unknown;\n}> {\n const gasBuffer = getGasBuffer(messenger, chainId);\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n let estimateGasError: unknown;\n let simulationError: Error | undefined;\n\n try {\n const { gas: gasHex, simulationFails } = await messenger.call(\n 'TransactionController:estimateGas',\n { from, data, to, value: value ?? '0x0' },\n networkClientId,\n );\n\n if (simulationFails) {\n simulationError = new Error('Gas simulation failed');\n } else {\n const estimatedGas = parseEstimatedGas(gasHex);\n const bufferedGas = Math.ceil(estimatedGas * gasBuffer);\n\n return {\n estimate: bufferedGas,\n max: bufferedGas,\n usedFallback: false,\n };\n }\n } catch (caughtError) {\n estimateGasError = caughtError;\n }\n\n if (simulationError !== undefined && !fallbackOnSimulationFailure) {\n throw simulationError;\n }\n\n const fallbackGasConfig = fallbackGas ?? getFallbackGas(messenger);\n\n return {\n estimate: fallbackGasConfig.estimate,\n max: fallbackGasConfig.max,\n usedFallback: true,\n error: estimateGasError ?? simulationError,\n };\n}\n\nfunction parseEstimatedGas(gasValue: string): number {\n const parsedGas = gasValue.startsWith('0x')\n ? new BigNumber(gasValue.slice(2), 16)\n : new BigNumber(gasValue);\n\n if (!parsedGas.isFinite() || parsedGas.isNaN()) {\n throw new Error(`Invalid gas estimate returned: ${gasValue}`);\n }\n\n return parsedGas.toNumber();\n}\n\n/**\n * Get gas fee estimates for a given chain.\n *\n * @param chainId - Chain ID.\n * @param messenger - Controller messenger.\n * @returns Gas fee estimates for the chain.\n */\nfunction getGasFee(\n chainId: Hex,\n messenger: TransactionPayControllerMessenger,\n): {\n estimatedBaseFee: string | undefined;\n maxFeePerGas: string | undefined;\n maxPriorityFeePerGas: string | undefined;\n} {\n const gasFeeControllerState = messenger.call('GasFeeController:getState');\n\n const chainState = gasFeeControllerState?.gasFeeEstimatesByChainId?.[chainId];\n\n const { estimatedBaseFee: estimatedBaseFeeGwei, medium } =\n (chainState?.gasFeeEstimates as GasFeeEstimates | undefined) ?? {};\n\n const maxFeePerGasGwei = medium?.suggestedMaxFeePerGas;\n const maxPriorityFeePerGasGwei = medium?.suggestedMaxPriorityFeePerGas;\n\n const estimatedBaseFee = estimatedBaseFeeGwei\n ? new BigNumber(estimatedBaseFeeGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxFeePerGas = maxFeePerGasGwei\n ? new BigNumber(maxFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxPriorityFeePerGas = maxPriorityFeePerGasGwei\n ? new BigNumber(maxPriorityFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n return { estimatedBaseFee, maxFeePerGas, maxPriorityFeePerGas };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.hasBalance - Whether the user has enough balance to cover the gas fee.\n * @param request.messenger - Controller messenger.\n * @param request.transaction - Transaction to calculate gas fee token cost for.\n * @returns Cost of the gas fee token.\n */\nfunction calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n}: {\n hasBalance: boolean;\n messenger: TransactionPayControllerMessenger;\n transaction: TransactionMeta;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const {\n chainId,\n gasFeeTokens,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !gasFeeTokens ||\n !selectedGasFeeToken ||\n (isGasFeeTokenIgnoredIfBalance && hasBalance)\n ) {\n return undefined;\n }\n\n log('Calculating gas fee token cost', { selectedGasFeeToken, chainId });\n\n const gasFeeToken = gasFeeTokens?.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n selectedGasFeeToken.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('Gas fee token not found', {\n gasFeeTokens,\n selectedGasFeeToken,\n });\n\n return undefined;\n }\n\n return calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n });\n}\n"]}
|
package/dist/utils/gas.d.cts
CHANGED
|
@@ -55,4 +55,22 @@ export declare function calculateGasFeeTokenCost({ chainId, gasFeeToken, messeng
|
|
|
55
55
|
}): (Amount & {
|
|
56
56
|
isGasFeeToken?: boolean;
|
|
57
57
|
}) | undefined;
|
|
58
|
+
export declare function estimateGasLimit({ chainId, data, fallbackGas, fallbackOnSimulationFailure, from, messenger, to, value, }: {
|
|
59
|
+
chainId: Hex;
|
|
60
|
+
data: Hex;
|
|
61
|
+
fallbackGas?: {
|
|
62
|
+
estimate: number;
|
|
63
|
+
max: number;
|
|
64
|
+
};
|
|
65
|
+
fallbackOnSimulationFailure?: boolean;
|
|
66
|
+
from: Hex;
|
|
67
|
+
messenger: TransactionPayControllerMessenger;
|
|
68
|
+
to: Hex;
|
|
69
|
+
value?: Hex;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
estimate: number;
|
|
72
|
+
max: number;
|
|
73
|
+
usedFallback: boolean;
|
|
74
|
+
error?: unknown;
|
|
75
|
+
}>;
|
|
58
76
|
//# sourceMappingURL=gas.d.cts.map
|
package/dist/utils/gas.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.d.cts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,SAAS,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"gas.d.cts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAIzC,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAiB;AAIvC;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,EAAE,KAAK,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,MAAM,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAgDtC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IAC/B,oBAAoB,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;CAC9C,GAAG,MAAM,CAqDT;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,WAAW,EACX,SAAS,GACV,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,iCAAiC,CAAC;CAC9C,GAAG,CAAC,MAAM,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,CA0BrD;AAED,wBAAsB,gBAAgB,CAAC,EACrC,OAAO,EACP,IAAI,EACJ,WAAW,EACX,2BAAmC,EACnC,IAAI,EACJ,SAAS,EACT,EAAE,EACF,KAAK,GACN,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,iCAAiC,CAAC;IAC7C,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC,CA6CD"}
|
package/dist/utils/gas.d.mts
CHANGED
|
@@ -55,4 +55,22 @@ export declare function calculateGasFeeTokenCost({ chainId, gasFeeToken, messeng
|
|
|
55
55
|
}): (Amount & {
|
|
56
56
|
isGasFeeToken?: boolean;
|
|
57
57
|
}) | undefined;
|
|
58
|
+
export declare function estimateGasLimit({ chainId, data, fallbackGas, fallbackOnSimulationFailure, from, messenger, to, value, }: {
|
|
59
|
+
chainId: Hex;
|
|
60
|
+
data: Hex;
|
|
61
|
+
fallbackGas?: {
|
|
62
|
+
estimate: number;
|
|
63
|
+
max: number;
|
|
64
|
+
};
|
|
65
|
+
fallbackOnSimulationFailure?: boolean;
|
|
66
|
+
from: Hex;
|
|
67
|
+
messenger: TransactionPayControllerMessenger;
|
|
68
|
+
to: Hex;
|
|
69
|
+
value?: Hex;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
estimate: number;
|
|
72
|
+
max: number;
|
|
73
|
+
usedFallback: boolean;
|
|
74
|
+
error?: unknown;
|
|
75
|
+
}>;
|
|
58
76
|
//# sourceMappingURL=gas.d.mts.map
|
package/dist/utils/gas.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.d.mts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,SAAS,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"gas.d.mts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,yCAAyC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAIzC,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAiB;AAIvC;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,EAAE,KAAK,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,MAAM,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAgDtC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IAC/B,oBAAoB,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IACvC,SAAS,EAAE,iCAAiC,CAAC;CAC9C,GAAG,MAAM,CAqDT;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,WAAW,EACX,SAAS,GACV,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,iCAAiC,CAAC;CAC9C,GAAG,CAAC,MAAM,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,CA0BrD;AAED,wBAAsB,gBAAgB,CAAC,EACrC,OAAO,EACP,IAAI,EACJ,WAAW,EACX,2BAAmC,EACnC,IAAI,EACJ,SAAS,EACT,EAAE,EACF,KAAK,GACN,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,iCAAiC,CAAC;IAC7C,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC,CA6CD"}
|
package/dist/utils/gas.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { toHex } from "@metamask/controller-utils";
|
|
2
2
|
import { BigNumber } from "bignumber.js";
|
|
3
|
+
import { getFallbackGas, getGasBuffer } from "./feature-flags.mjs";
|
|
3
4
|
import { getNativeToken, getTokenBalance, getTokenFiatRate } from "./token.mjs";
|
|
4
5
|
import { createModuleLogger, projectLogger } from "../logger.mjs";
|
|
5
6
|
const log = createModuleLogger(projectLogger, 'gas');
|
|
@@ -113,6 +114,49 @@ export function calculateGasFeeTokenCost({ chainId, gasFeeToken, messenger, }) {
|
|
|
113
114
|
usd,
|
|
114
115
|
};
|
|
115
116
|
}
|
|
117
|
+
export async function estimateGasLimit({ chainId, data, fallbackGas, fallbackOnSimulationFailure = false, from, messenger, to, value, }) {
|
|
118
|
+
const gasBuffer = getGasBuffer(messenger, chainId);
|
|
119
|
+
const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
120
|
+
let estimateGasError;
|
|
121
|
+
let simulationError;
|
|
122
|
+
try {
|
|
123
|
+
const { gas: gasHex, simulationFails } = await messenger.call('TransactionController:estimateGas', { from, data, to, value: value ?? '0x0' }, networkClientId);
|
|
124
|
+
if (simulationFails) {
|
|
125
|
+
simulationError = new Error('Gas simulation failed');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const estimatedGas = parseEstimatedGas(gasHex);
|
|
129
|
+
const bufferedGas = Math.ceil(estimatedGas * gasBuffer);
|
|
130
|
+
return {
|
|
131
|
+
estimate: bufferedGas,
|
|
132
|
+
max: bufferedGas,
|
|
133
|
+
usedFallback: false,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (caughtError) {
|
|
138
|
+
estimateGasError = caughtError;
|
|
139
|
+
}
|
|
140
|
+
if (simulationError !== undefined && !fallbackOnSimulationFailure) {
|
|
141
|
+
throw simulationError;
|
|
142
|
+
}
|
|
143
|
+
const fallbackGasConfig = fallbackGas ?? getFallbackGas(messenger);
|
|
144
|
+
return {
|
|
145
|
+
estimate: fallbackGasConfig.estimate,
|
|
146
|
+
max: fallbackGasConfig.max,
|
|
147
|
+
usedFallback: true,
|
|
148
|
+
error: estimateGasError ?? simulationError,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function parseEstimatedGas(gasValue) {
|
|
152
|
+
const parsedGas = gasValue.startsWith('0x')
|
|
153
|
+
? new BigNumber(gasValue.slice(2), 16)
|
|
154
|
+
: new BigNumber(gasValue);
|
|
155
|
+
if (!parsedGas.isFinite() || parsedGas.isNaN()) {
|
|
156
|
+
throw new Error(`Invalid gas estimate returned: ${gasValue}`);
|
|
157
|
+
}
|
|
158
|
+
return parsedGas.toNumber();
|
|
159
|
+
}
|
|
116
160
|
/**
|
|
117
161
|
* Get gas fee estimates for a given chain.
|
|
118
162
|
*
|
package/dist/utils/gas.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type {\n GasFeeToken,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getNativeToken, getTokenBalance, getTokenFiatRate } from './token';\nimport type { TransactionPayControllerMessenger } from '..';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { Amount } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n *\n * Calculate the estimated gas cost for a given transaction in fiat.\n *\n * @param transaction - Transaction to calculate gas cost for\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum fee.\n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateTransactionGasCost(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax?: boolean } = {},\n): Amount & { isGasFeeToken?: boolean } {\n const {\n chainId,\n gasUsed: gasUsedOriginal,\n gasLimitNoBuffer,\n txParams,\n } = transaction;\n\n const { from, gas, maxFeePerGas, maxPriorityFeePerGas } = txParams;\n const gasUsed = isMax ? undefined : gasUsedOriginal;\n const finalGas = gasUsed ?? gasLimitNoBuffer ?? gas ?? '0x0';\n\n const result = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax: true,\n messenger,\n });\n\n const nativeBalance = getTokenBalance(\n messenger,\n from as Hex,\n chainId,\n getNativeToken(chainId),\n );\n\n const hasBalance = new BigNumber(nativeBalance).gte(max.raw);\n\n const gasFeeTokenCost = calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n });\n\n if (gasFeeTokenCost) {\n return gasFeeTokenCost;\n }\n\n return result;\n}\n\n/**\n * Calculate the gas cost for the specified parameters.\n *\n * @param request - Gas cost calculation parameters.\n * @param request.chainId - ID of the chain.\n * @param request.gas - Amount of gas the transaction will use.\n * @param request.isMax - Whether to calculate the maximum fee.\n * @param request.maxFeePerGas - Max fee to pay per gas.\n * @param request.maxPriorityFeePerGas - Max priority fee to pay per gas.\n * @param request.messenger - Controller messenger.\n \n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateGasCost(request: {\n chainId: number | Hex;\n gas: BigNumber.Value;\n isMax?: boolean;\n maxFeePerGas?: BigNumber.Value;\n maxPriorityFeePerGas?: BigNumber.Value;\n messenger: TransactionPayControllerMessenger;\n}): Amount {\n const {\n chainId: chainIdInput,\n gas,\n isMax,\n maxFeePerGas: maxFeePerGasInput,\n maxPriorityFeePerGas: maxPriorityFeePerGasInput,\n messenger,\n } = request;\n\n const chainId = toHex(chainIdInput);\n\n const {\n estimatedBaseFee,\n maxFeePerGas: maxFeePerGasEstimate,\n maxPriorityFeePerGas: maxPriorityFeePerGasEstimate,\n } = getGasFee(chainId, messenger);\n\n const maxFeePerGas = maxFeePerGasInput ?? maxFeePerGasEstimate;\n\n const maxPriorityFeePerGas =\n maxPriorityFeePerGasInput ?? maxPriorityFeePerGasEstimate;\n\n const feePerGas =\n estimatedBaseFee && maxPriorityFeePerGas && !isMax\n ? new BigNumber(estimatedBaseFee).plus(maxPriorityFeePerGas)\n : new BigNumber(maxFeePerGas ?? '0x0');\n\n const rawValue = new BigNumber(gas).multipliedBy(feePerGas);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-18);\n const human = humanValue.toString(10);\n\n const fiatRate = getTokenFiatRate(\n messenger,\n getNativeToken(chainId),\n chainId,\n );\n\n if (!fiatRate) {\n throw new Error('Could not fetch fiat rate for native token');\n }\n\n const usd = humanValue.multipliedBy(fiatRate.usdRate).toString(10);\n const fiat = humanValue.multipliedBy(fiatRate.fiatRate).toString(10);\n\n return {\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.chainId - Chain ID.\n * @param request.gasFeeToken - Gas fee token to calculate cost for.\n * @param request.messenger - Controller messenger.\n * @returns Cost of the gas fee token.\n */\nexport function calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n}: {\n chainId: Hex;\n gasFeeToken: GasFeeToken;\n messenger: TransactionPayControllerMessenger;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const { amount, decimals, tokenAddress } = gasFeeToken;\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (!tokenFiatRate) {\n log('Cannot get gas fee token info');\n return undefined;\n }\n\n const rawValue = new BigNumber(amount);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const fiat = humanValue.multipliedBy(tokenFiatRate.fiatRate).toString(10);\n const usd = humanValue.multipliedBy(tokenFiatRate.usdRate).toString(10);\n\n return {\n isGasFeeToken: true,\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Get gas fee estimates for a given chain.\n *\n * @param chainId - Chain ID.\n * @param messenger - Controller messenger.\n * @returns Gas fee estimates for the chain.\n */\nfunction getGasFee(\n chainId: Hex,\n messenger: TransactionPayControllerMessenger,\n): {\n estimatedBaseFee: string | undefined;\n maxFeePerGas: string | undefined;\n maxPriorityFeePerGas: string | undefined;\n} {\n const gasFeeControllerState = messenger.call('GasFeeController:getState');\n\n const chainState = gasFeeControllerState?.gasFeeEstimatesByChainId?.[chainId];\n\n const { estimatedBaseFee: estimatedBaseFeeGwei, medium } =\n (chainState?.gasFeeEstimates as GasFeeEstimates | undefined) ?? {};\n\n const maxFeePerGasGwei = medium?.suggestedMaxFeePerGas;\n const maxPriorityFeePerGasGwei = medium?.suggestedMaxPriorityFeePerGas;\n\n const estimatedBaseFee = estimatedBaseFeeGwei\n ? new BigNumber(estimatedBaseFeeGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxFeePerGas = maxFeePerGasGwei\n ? new BigNumber(maxFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxPriorityFeePerGas = maxPriorityFeePerGasGwei\n ? new BigNumber(maxPriorityFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n return { estimatedBaseFee, maxFeePerGas, maxPriorityFeePerGas };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.hasBalance - Whether the user has enough balance to cover the gas fee.\n * @param request.messenger - Controller messenger.\n * @param request.transaction - Transaction to calculate gas fee token cost for.\n * @returns Cost of the gas fee token.\n */\nfunction calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n}: {\n hasBalance: boolean;\n messenger: TransactionPayControllerMessenger;\n transaction: TransactionMeta;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const {\n chainId,\n gasFeeTokens,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !gasFeeTokens ||\n !selectedGasFeeToken ||\n (isGasFeeTokenIgnoredIfBalance && hasBalance)\n ) {\n return undefined;\n }\n\n log('Calculating gas fee token cost', { selectedGasFeeToken, chainId });\n\n const gasFeeToken = gasFeeTokens?.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n selectedGasFeeToken.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('Gas fee token not found', {\n gasFeeTokens,\n selectedGasFeeToken,\n });\n\n return undefined;\n }\n\n return calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { GasFeeEstimates } from '@metamask/gas-fee-controller';\nimport type {\n GasFeeToken,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { getFallbackGas, getGasBuffer } from './feature-flags';\nimport { getNativeToken, getTokenBalance, getTokenFiatRate } from './token';\nimport type { TransactionPayControllerMessenger } from '..';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { Amount } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n *\n * Calculate the estimated gas cost for a given transaction in fiat.\n *\n * @param transaction - Transaction to calculate gas cost for\n * @param messenger - Controller messenger.\n * @param options - Calculation options.\n * @param options.isMax - Whether to calculate the maximum fee.\n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateTransactionGasCost(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n { isMax }: { isMax?: boolean } = {},\n): Amount & { isGasFeeToken?: boolean } {\n const {\n chainId,\n gasUsed: gasUsedOriginal,\n gasLimitNoBuffer,\n txParams,\n } = transaction;\n\n const { from, gas, maxFeePerGas, maxPriorityFeePerGas } = txParams;\n const gasUsed = isMax ? undefined : gasUsedOriginal;\n const finalGas = gasUsed ?? gasLimitNoBuffer ?? gas ?? '0x0';\n\n const result = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: finalGas,\n isMax: true,\n messenger,\n });\n\n const nativeBalance = getTokenBalance(\n messenger,\n from as Hex,\n chainId,\n getNativeToken(chainId),\n );\n\n const hasBalance = new BigNumber(nativeBalance).gte(max.raw);\n\n const gasFeeTokenCost = calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n });\n\n if (gasFeeTokenCost) {\n return gasFeeTokenCost;\n }\n\n return result;\n}\n\n/**\n * Calculate the gas cost for the specified parameters.\n *\n * @param request - Gas cost calculation parameters.\n * @param request.chainId - ID of the chain.\n * @param request.gas - Amount of gas the transaction will use.\n * @param request.isMax - Whether to calculate the maximum fee.\n * @param request.maxFeePerGas - Max fee to pay per gas.\n * @param request.maxPriorityFeePerGas - Max priority fee to pay per gas.\n * @param request.messenger - Controller messenger.\n \n * @returns Estimated gas cost for the transaction.\n */\nexport function calculateGasCost(request: {\n chainId: number | Hex;\n gas: BigNumber.Value;\n isMax?: boolean;\n maxFeePerGas?: BigNumber.Value;\n maxPriorityFeePerGas?: BigNumber.Value;\n messenger: TransactionPayControllerMessenger;\n}): Amount {\n const {\n chainId: chainIdInput,\n gas,\n isMax,\n maxFeePerGas: maxFeePerGasInput,\n maxPriorityFeePerGas: maxPriorityFeePerGasInput,\n messenger,\n } = request;\n\n const chainId = toHex(chainIdInput);\n\n const {\n estimatedBaseFee,\n maxFeePerGas: maxFeePerGasEstimate,\n maxPriorityFeePerGas: maxPriorityFeePerGasEstimate,\n } = getGasFee(chainId, messenger);\n\n const maxFeePerGas = maxFeePerGasInput ?? maxFeePerGasEstimate;\n\n const maxPriorityFeePerGas =\n maxPriorityFeePerGasInput ?? maxPriorityFeePerGasEstimate;\n\n const feePerGas =\n estimatedBaseFee && maxPriorityFeePerGas && !isMax\n ? new BigNumber(estimatedBaseFee).plus(maxPriorityFeePerGas)\n : new BigNumber(maxFeePerGas ?? '0x0');\n\n const rawValue = new BigNumber(gas).multipliedBy(feePerGas);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-18);\n const human = humanValue.toString(10);\n\n const fiatRate = getTokenFiatRate(\n messenger,\n getNativeToken(chainId),\n chainId,\n );\n\n if (!fiatRate) {\n throw new Error('Could not fetch fiat rate for native token');\n }\n\n const usd = humanValue.multipliedBy(fiatRate.usdRate).toString(10);\n const fiat = humanValue.multipliedBy(fiatRate.fiatRate).toString(10);\n\n return {\n fiat,\n human,\n raw,\n usd,\n };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.chainId - Chain ID.\n * @param request.gasFeeToken - Gas fee token to calculate cost for.\n * @param request.messenger - Controller messenger.\n * @returns Cost of the gas fee token.\n */\nexport function calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n}: {\n chainId: Hex;\n gasFeeToken: GasFeeToken;\n messenger: TransactionPayControllerMessenger;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const { amount, decimals, tokenAddress } = gasFeeToken;\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (!tokenFiatRate) {\n log('Cannot get gas fee token info');\n return undefined;\n }\n\n const rawValue = new BigNumber(amount);\n const raw = rawValue.toString(10);\n\n const humanValue = rawValue.shiftedBy(-decimals);\n const human = humanValue.toString(10);\n\n const fiat = humanValue.multipliedBy(tokenFiatRate.fiatRate).toString(10);\n const usd = humanValue.multipliedBy(tokenFiatRate.usdRate).toString(10);\n\n return {\n isGasFeeToken: true,\n fiat,\n human,\n raw,\n usd,\n };\n}\n\nexport async function estimateGasLimit({\n chainId,\n data,\n fallbackGas,\n fallbackOnSimulationFailure = false,\n from,\n messenger,\n to,\n value,\n}: {\n chainId: Hex;\n data: Hex;\n fallbackGas?: {\n estimate: number;\n max: number;\n };\n fallbackOnSimulationFailure?: boolean;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n to: Hex;\n value?: Hex;\n}): Promise<{\n estimate: number;\n max: number;\n usedFallback: boolean;\n error?: unknown;\n}> {\n const gasBuffer = getGasBuffer(messenger, chainId);\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n let estimateGasError: unknown;\n let simulationError: Error | undefined;\n\n try {\n const { gas: gasHex, simulationFails } = await messenger.call(\n 'TransactionController:estimateGas',\n { from, data, to, value: value ?? '0x0' },\n networkClientId,\n );\n\n if (simulationFails) {\n simulationError = new Error('Gas simulation failed');\n } else {\n const estimatedGas = parseEstimatedGas(gasHex);\n const bufferedGas = Math.ceil(estimatedGas * gasBuffer);\n\n return {\n estimate: bufferedGas,\n max: bufferedGas,\n usedFallback: false,\n };\n }\n } catch (caughtError) {\n estimateGasError = caughtError;\n }\n\n if (simulationError !== undefined && !fallbackOnSimulationFailure) {\n throw simulationError;\n }\n\n const fallbackGasConfig = fallbackGas ?? getFallbackGas(messenger);\n\n return {\n estimate: fallbackGasConfig.estimate,\n max: fallbackGasConfig.max,\n usedFallback: true,\n error: estimateGasError ?? simulationError,\n };\n}\n\nfunction parseEstimatedGas(gasValue: string): number {\n const parsedGas = gasValue.startsWith('0x')\n ? new BigNumber(gasValue.slice(2), 16)\n : new BigNumber(gasValue);\n\n if (!parsedGas.isFinite() || parsedGas.isNaN()) {\n throw new Error(`Invalid gas estimate returned: ${gasValue}`);\n }\n\n return parsedGas.toNumber();\n}\n\n/**\n * Get gas fee estimates for a given chain.\n *\n * @param chainId - Chain ID.\n * @param messenger - Controller messenger.\n * @returns Gas fee estimates for the chain.\n */\nfunction getGasFee(\n chainId: Hex,\n messenger: TransactionPayControllerMessenger,\n): {\n estimatedBaseFee: string | undefined;\n maxFeePerGas: string | undefined;\n maxPriorityFeePerGas: string | undefined;\n} {\n const gasFeeControllerState = messenger.call('GasFeeController:getState');\n\n const chainState = gasFeeControllerState?.gasFeeEstimatesByChainId?.[chainId];\n\n const { estimatedBaseFee: estimatedBaseFeeGwei, medium } =\n (chainState?.gasFeeEstimates as GasFeeEstimates | undefined) ?? {};\n\n const maxFeePerGasGwei = medium?.suggestedMaxFeePerGas;\n const maxPriorityFeePerGasGwei = medium?.suggestedMaxPriorityFeePerGas;\n\n const estimatedBaseFee = estimatedBaseFeeGwei\n ? new BigNumber(estimatedBaseFeeGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxFeePerGas = maxFeePerGasGwei\n ? new BigNumber(maxFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n const maxPriorityFeePerGas = maxPriorityFeePerGasGwei\n ? new BigNumber(maxPriorityFeePerGasGwei).shiftedBy(9).toString(10)\n : undefined;\n\n return { estimatedBaseFee, maxFeePerGas, maxPriorityFeePerGas };\n}\n\n/**\n * Calculate the cost of a gas fee token on a transaction.\n *\n * @param request - Request parameters.\n * @param request.hasBalance - Whether the user has enough balance to cover the gas fee.\n * @param request.messenger - Controller messenger.\n * @param request.transaction - Transaction to calculate gas fee token cost for.\n * @returns Cost of the gas fee token.\n */\nfunction calculateTransactionGasFeeTokenCost({\n hasBalance,\n messenger,\n transaction,\n}: {\n hasBalance: boolean;\n messenger: TransactionPayControllerMessenger;\n transaction: TransactionMeta;\n}): (Amount & { isGasFeeToken?: boolean }) | undefined {\n const {\n chainId,\n gasFeeTokens,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !gasFeeTokens ||\n !selectedGasFeeToken ||\n (isGasFeeTokenIgnoredIfBalance && hasBalance)\n ) {\n return undefined;\n }\n\n log('Calculating gas fee token cost', { selectedGasFeeToken, chainId });\n\n const gasFeeToken = gasFeeTokens?.find(\n (singleGasFeeToken) =>\n singleGasFeeToken.tokenAddress.toLowerCase() ===\n selectedGasFeeToken.toLowerCase(),\n );\n\n if (!gasFeeToken) {\n log('Gas fee token not found', {\n gasFeeTokens,\n selectedGasFeeToken,\n });\n\n return undefined;\n }\n\n return calculateGasFeeTokenCost({\n chainId,\n gasFeeToken,\n messenger,\n });\n}\n"]}
|
package/dist/utils/quotes.cjs
CHANGED
|
@@ -27,7 +27,7 @@ async function updateQuotes(request) {
|
|
|
27
27
|
return false;
|
|
28
28
|
}
|
|
29
29
|
log('Updating quotes', { transactionId });
|
|
30
|
-
const { isMaxAmount, isPostQuote, paymentToken: originalPaymentToken, sourceAmounts, tokens, } = transactionData;
|
|
30
|
+
const { isMaxAmount, isPostQuote, paymentToken: originalPaymentToken, refundTo, sourceAmounts, tokens, } = transactionData;
|
|
31
31
|
const from = transaction.txParams.from;
|
|
32
32
|
updateTransactionData(transactionId, (data) => {
|
|
33
33
|
data.isLoading = true;
|
|
@@ -45,6 +45,7 @@ async function updateQuotes(request) {
|
|
|
45
45
|
isMaxAmount: isMaxAmount ?? false,
|
|
46
46
|
isPostQuote,
|
|
47
47
|
paymentToken,
|
|
48
|
+
refundTo,
|
|
48
49
|
sourceAmounts,
|
|
49
50
|
tokens,
|
|
50
51
|
transactionId,
|
|
@@ -160,12 +161,13 @@ exports.refreshQuotes = refreshQuotes;
|
|
|
160
161
|
* @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
|
|
161
162
|
* @param request.isPostQuote - Whether this is a post-quote flow.
|
|
162
163
|
* @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).
|
|
164
|
+
* @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.
|
|
163
165
|
* @param request.sourceAmounts - Source amounts for the transaction.
|
|
164
166
|
* @param request.tokens - Required tokens for the transaction.
|
|
165
167
|
* @param request.transactionId - ID of the transaction.
|
|
166
168
|
* @returns Array of quote requests.
|
|
167
169
|
*/
|
|
168
|
-
function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sourceAmounts, tokens, transactionId, }) {
|
|
170
|
+
function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, refundTo, sourceAmounts, tokens, transactionId, }) {
|
|
169
171
|
if (!paymentToken) {
|
|
170
172
|
return [];
|
|
171
173
|
}
|
|
@@ -176,6 +178,7 @@ function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sour
|
|
|
176
178
|
from,
|
|
177
179
|
isMaxAmount,
|
|
178
180
|
destinationToken: paymentToken,
|
|
181
|
+
refundTo,
|
|
179
182
|
sourceAmounts,
|
|
180
183
|
transactionId,
|
|
181
184
|
});
|
|
@@ -209,11 +212,12 @@ function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sour
|
|
|
209
212
|
* @param request.from - Address from which the transaction is sent.
|
|
210
213
|
* @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
|
|
211
214
|
* @param request.destinationToken - Destination token (paymentToken in post-quote mode).
|
|
215
|
+
* @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.
|
|
212
216
|
* @param request.sourceAmounts - Source amounts for the transaction (includes source token info).
|
|
213
217
|
* @param request.transactionId - ID of the transaction.
|
|
214
218
|
* @returns Array of quote requests for post-quote flow.
|
|
215
219
|
*/
|
|
216
|
-
function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, sourceAmounts, transactionId, }) {
|
|
220
|
+
function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, refundTo, sourceAmounts, transactionId, }) {
|
|
217
221
|
// Find the source amount where targetTokenAddress matches the destination token
|
|
218
222
|
const sourceAmount = sourceAmounts?.find((amount) => amount.targetTokenAddress.toLowerCase() ===
|
|
219
223
|
destinationToken.address.toLowerCase());
|
|
@@ -230,6 +234,7 @@ function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, sourceAmo
|
|
|
230
234
|
from,
|
|
231
235
|
isMaxAmount,
|
|
232
236
|
isPostQuote: true,
|
|
237
|
+
refundTo,
|
|
233
238
|
sourceBalanceRaw: sourceAmount.sourceBalanceRaw,
|
|
234
239
|
sourceTokenAmount: sourceAmount.sourceAmountRaw,
|
|
235
240
|
sourceChainId: sourceAmount.sourceChainId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.cjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":";;;AAAA,6EAAqE;AAIrE,2CAAqD;AAErD,6CAAoE;AACpE,uCAIiB;AACjB,yCAA2C;AAC3C,mDAAkE;AAClE,gDAAsD;AACtD,0CAA0C;AAa1C,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAEzD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,QAAQ,CAAC,CAAC;AAUxD;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,EACJ,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,qBAAqB,GACtB,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW,EAAE,MAAM,KAAK,0CAAiB,CAAC,UAAU,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAE1C,MAAM,EACJ,WAAW,EACX,WAAW,EACX,YAAY,EAAE,oBAAoB,EAClC,aAAa,EACb,MAAM,GACP,GAAG,eAAe,CAAC;IAEpB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAW,CAAC;IAE9C,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC;YACpD,IAAI;YACJ,SAAS;YACT,YAAY,EAAE,oBAAoB;YAClC,aAAa;YACb,qBAAqB;SACtB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,IAAI;YACJ,WAAW,EAAE,WAAW,IAAI,KAAK;YACjC,WAAW;YACX,YAAY;YACZ,aAAa;YACb,MAAM;YACN,aAAa;SACd,CAAC,CAAC;QAEH,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CACnD,WAAW,EACX,QAAQ,EACR,aAAa,EACb,SAAS,CACV,CAAC;QAEF,MAAM,MAAM,GAAG,IAAA,wBAAe,EAAC;YAC7B,WAAW;YACX,SAAS;YACT,MAAM,EAAE,MAAwC;YAChD,MAAM;YACN,WAAW;SACZ,CAAC,CAAC;QAEH,GAAG,CAAC,mBAAmB,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpD,eAAe,CAAC;YACd,iBAAiB;YACjB,WAAW;YACX,SAAS,EAAE,SAAkB;YAC7B,YAAY;YACZ,MAAM;YACN,aAAa;SACd,CAAC,CAAC;QAEH,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,MAAM,GAAG,MAAe,CAAC;YAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA9FD,oCA8FC;AAED;;;;;;;;;;GAUG;AACH,SAAS,eAAe,CAAC,EACvB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,GAQd;IACC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAA,+BAAiB,EACf;QACE,aAAa;QACb,SAAS,EAAE,SAAkB;QAC7B,IAAI,EAAE,6BAA6B;KACpC,EACD,CAAC,EAAmB,EAAE,EAAE;QACtB,EAAE,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QACzC,EAAE,CAAC,wBAAwB,GAAG,EAAE,CAAC;QAEjC,EAAE,CAAC,WAAW,GAAG;YACf,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG;YACvC,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,WAAW;YACX,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG;YACtD,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG;YACnC,YAAY,EAAE,YAAY,CAAC,OAAO;YAClC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;SAC5B,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CACjC,SAA4C,EAC5C,qBAAoD,EACpD,aAAyE;IAEzE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE1D,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAAC;QAEjE,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAA,4BAAiB,EAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,eAAe,GACnB,CAAC,MAAM,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YACnC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;YACxC,SAAS;SACV,CAAC,CAAC,IAAI,wBAAwB,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;QAE1E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC;YACnC,aAAa;YACb,SAAS;YACT,eAAe;YACf,aAAa;YACb,qBAAqB;SACtB,CAAC,CAAC;QAEH,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AA3CD,sCA2CC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,kBAAkB,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,MAAM,EACN,aAAa,GASd;IACC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,8FAA8F;QAC9F,mEAAmE;QACnE,OAAO,sBAAsB,CAAC;YAC5B,IAAI;YACJ,WAAW;YACX,gBAAgB,EAAE,YAAY;YAC9B,aAAa;YACb,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,YAAY,CAAC,kBAAkB,CAC1C,CAAC;QAEjC,OAAO;YACL,IAAI;YACJ,WAAW;YACX,gBAAgB,EAAE,YAAY,CAAC,UAAU;YACzC,iBAAiB,EAAE,YAAY,CAAC,eAAe;YAC/C,aAAa,EAAE,YAAY,CAAC,OAAO;YACnC,kBAAkB,EAAE,YAAY,CAAC,OAAO;YACxC,mBAAmB,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS;YACpE,aAAa,EAAE,KAAK,CAAC,OAAO;YAC5B,kBAAkB,EAAE,KAAK,CAAC,OAAO;SAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,GAAG,CAAC,mBAAmB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,EAC9B,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,GAOd;IACC,gFAAgF;IAChF,MAAM,YAAY,GAAG,aAAa,EAAE,IAAI,CACtC,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACvC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CACzC,CAAC;IAEF,wEAAwE;IACxE,IACE,CAAC,YAAY,EAAE,gBAAgB;QAC/B,CAAC,YAAY,CAAC,aAAa;QAC3B,CAAC,YAAY,CAAC,kBAAkB,EAChC,CAAC;QACD,GAAG,CAAC,qDAAqD,EAAE;YACzD,aAAa;SACd,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAiB;QAC5B,IAAI;QACJ,WAAW;QACX,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;QAC/C,iBAAiB,EAAE,YAAY,CAAC,eAAe;QAC/C,aAAa,EAAE,YAAY,CAAC,aAAa;QACzC,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;QACnD,2EAA2E;QAC3E,uDAAuD;QACvD,mBAAmB,EAAE,GAAG;QACxB,aAAa,EAAE,gBAAgB,CAAC,OAAO;QACvC,kBAAkB,EAAE,gBAAgB,CAAC,OAAO;KAC7C,CAAC;IAEF,GAAG,CAAC,0BAA0B,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5D,8DAA8D;IAC9D,gFAAgF;IAChF,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,EACxC,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,qBAAqB,GAOtB;IACC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAChC,SAAS,EACT,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,OAAO,CACrB,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAmB,EAC3C,SAAS,EACT,IAAI,EACJ,YAAY,CAAC,OAAO,EACpB,YAAY,CAAC,OAAO,CACrB,CAAC;QAEF,MAAM,EACJ,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,WAAW,GAClB,GAAG,IAAA,2BAAmB,EAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEvE,MAAM,YAAY,GAAG;YACnB,GAAG,YAAY;YACf,WAAW;YACX,YAAY;YACZ,UAAU;YACV,UAAU;SACX,CAAC;QAEF,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,iCAAiC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAEtE,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,yCAAyC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,SAAS,CACtB,WAA4B,EAC5B,QAAwB,EACxB,aAAyE,EACzE,SAA4C;IAK5C,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAA,8BAAmB,EACpC,aAAa,CAAC,WAAW,CAAC,EAC1B,CAAC,YAAY,EAAE,EAAE;QACf,GAAG,CAAC,2BAA2B,EAAE;YAC/B,QAAQ,EAAE,YAAY;YACtB,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,iBAAiB,EAAE,EAAE;YACrB,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG;QACd,SAAS;QACT,QAAQ;QACR,WAAW;KACZ,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,mCAAmC,EAAE;oBACvC,QAAQ,EAAE,IAAI;oBACd,aAAa;iBACd,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,SAAS,CACtC,OAAO,CACR,CAAgC,CAAC;YAElC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,GAAG,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,GAAG,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;YAE1C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,oBAAoB;gBACrD,CAAC,CAAC,MAAM,QAAQ,CAAC,oBAAoB,CAAC;oBAClC,SAAS;oBACT,MAAM;iBACP,CAAC;gBACJ,CAAC,CAAC,EAAE,CAAC;YAEP,GAAG,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAEhE,OAAO;gBACL,iBAAiB;gBACjB,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,8BAA8B,EAAE;gBAClC,KAAK;gBACL,QAAQ,EAAE,IAAI;gBACd,aAAa;aACd,CAAC,CAAC;YACH,SAAS;QACX,CAAC;IACH,CAAC;IAED,GAAG,CAAC,qBAAqB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAE9C,OAAO;QACL,iBAAiB,EAAE,EAAE;QACrB,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC","sourcesContent":["import { TransactionStatus } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategiesByName, getStrategyByName } from './strategy';\nimport {\n computeTokenAmounts,\n getLiveTokenBalance,\n getTokenFiatRate,\n} from './token';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPaySourceAmount,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[];\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n * @returns Boolean indicating if the quotes were updated.\n */\nexport async function updateQuotes(\n request: UpdateQuotesRequest,\n): Promise<boolean> {\n const {\n getStrategies,\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n } = request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n if (transaction?.status !== TransactionStatus.unapproved) {\n return false;\n }\n\n log('Updating quotes', { transactionId });\n\n const {\n isMaxAmount,\n isPostQuote,\n paymentToken: originalPaymentToken,\n sourceAmounts,\n tokens,\n } = transactionData;\n\n const from = transaction.txParams.from as Hex;\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const paymentToken = await refreshPaymentTokenBalance({\n from,\n messenger,\n paymentToken: originalPaymentToken,\n transactionId,\n updateTransactionData,\n });\n\n const requests = buildQuoteRequests({\n from,\n isMaxAmount: isMaxAmount ?? false,\n isPostQuote,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n });\n\n const { batchTransactions, quotes } = await getQuotes(\n transaction,\n requests,\n getStrategies,\n messenger,\n );\n\n const totals = calculateTotals({\n isMaxAmount,\n messenger,\n quotes: quotes as TransactionPayQuote<unknown>[],\n tokens,\n transaction,\n });\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n isPostQuote,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n });\n } finally {\n updateTransactionData(transactionId, (data) => {\n data.isLoading = false;\n });\n }\n\n return true;\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.isPostQuote - Whether this is a post-quote flow.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n isPostQuote,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n isPostQuote?: boolean;\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken | undefined;\n totals: TransactionPayTotals;\n transactionId: string;\n}): void {\n if (!paymentToken) {\n return;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n isPostQuote,\n networkFeeFiat: totals.fees.sourceNetwork.estimate.usd,\n targetFiat: totals.targetAmount.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n * @param getStrategies - Callback to get ordered strategy names for a transaction.\n */\nexport async function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[],\n): Promise<void> {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n const isUpdated = await updateQuotes({\n getStrategies,\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n if (isUpdated) {\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n }\n}\n\n/**\n * Build quote requests required to retrieve quotes.\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.isPostQuote - Whether this is a post-quote flow.\n * @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).\n * @param request.sourceAmounts - Source amounts for the transaction.\n * @param request.tokens - Required tokens for the transaction.\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests.\n */\nfunction buildQuoteRequests({\n from,\n isMaxAmount,\n isPostQuote,\n paymentToken,\n sourceAmounts,\n tokens,\n transactionId,\n}: {\n from: Hex;\n isMaxAmount: boolean;\n isPostQuote?: boolean;\n paymentToken: TransactionPaymentToken | undefined;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n tokens: TransactionPayRequiredToken[];\n transactionId: string;\n}): QuoteRequest[] {\n if (!paymentToken) {\n return [];\n }\n\n if (isPostQuote) {\n // Post-quote flow: source = transaction's required token, target = paymentToken (destination)\n // The user wants to receive the transaction output in paymentToken\n return buildPostQuoteRequests({\n from,\n isMaxAmount,\n destinationToken: paymentToken,\n sourceAmounts,\n transactionId,\n });\n }\n\n // Standard flow: source = paymentToken, target = required tokens\n const requests = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (singleToken) => singleToken.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from,\n isMaxAmount,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n });\n\n if (!requests.length) {\n log('No quote requests', { transactionId });\n }\n\n return requests;\n}\n\n/**\n * Build quote requests for post-quote flows.\n * In this flow, the source is the transaction's required token,\n * and the target is the user's selected destination token (paymentToken).\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.destinationToken - Destination token (paymentToken in post-quote mode).\n * @param request.sourceAmounts - Source amounts for the transaction (includes source token info).\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests for post-quote flow.\n */\nfunction buildPostQuoteRequests({\n from,\n isMaxAmount,\n destinationToken,\n sourceAmounts,\n transactionId,\n}: {\n from: Hex;\n isMaxAmount: boolean;\n destinationToken: TransactionPaymentToken;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n transactionId: string;\n}): QuoteRequest[] {\n // Find the source amount where targetTokenAddress matches the destination token\n const sourceAmount = sourceAmounts?.find(\n (amount) =>\n amount.targetTokenAddress.toLowerCase() ===\n destinationToken.address.toLowerCase(),\n );\n\n // Same-token-same-chain cases are already filtered in source-amounts.ts\n if (\n !sourceAmount?.sourceBalanceRaw ||\n !sourceAmount.sourceChainId ||\n !sourceAmount.sourceTokenAddress\n ) {\n log('No valid source amount found for post-quote request', {\n transactionId,\n });\n return [];\n }\n\n const request: QuoteRequest = {\n from,\n isMaxAmount,\n isPostQuote: true,\n sourceBalanceRaw: sourceAmount.sourceBalanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: sourceAmount.sourceChainId,\n sourceTokenAddress: sourceAmount.sourceTokenAddress,\n // For post-quote flows, use EXACT_INPUT - user specifies how much to send,\n // and we show them how much they'll receive after fees\n targetAmountMinimum: '0',\n targetChainId: destinationToken.chainId,\n targetTokenAddress: destinationToken.address,\n };\n\n log('Post-quote request built', { transactionId, request });\n\n // Currently only single token post-quote flows are supported.\n // Multiple token support would require multiple quotes for each required token.\n return [request];\n}\n\nasync function refreshPaymentTokenBalance({\n from,\n messenger,\n paymentToken,\n transactionId,\n updateTransactionData,\n}: {\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n}): Promise<TransactionPaymentToken | undefined> {\n if (!paymentToken) {\n return undefined;\n }\n\n try {\n const fiatRates = getTokenFiatRate(\n messenger,\n paymentToken.address,\n paymentToken.chainId,\n );\n\n if (!fiatRates) {\n return paymentToken;\n }\n\n const liveBalance = await getLiveTokenBalance(\n messenger,\n from,\n paymentToken.chainId,\n paymentToken.address,\n );\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(liveBalance, paymentToken.decimals, fiatRates);\n\n const updatedToken = {\n ...paymentToken,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n };\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = updatedToken;\n });\n\n log('Refreshed payment token balance', { transactionId, balanceRaw });\n\n return updatedToken;\n } catch (error) {\n log('Failed to refresh payment token balance', { transactionId, error });\n return paymentToken;\n }\n}\n\n/**\n * Retrieve quotes for a transaction.\n *\n * @param transaction - Transaction metadata.\n * @param requests - Quote requests.\n * @param getStrategies - Callback to get ordered strategy names for a transaction.\n * @param messenger - Controller messenger.\n * @returns An object containing batch transactions and quotes.\n */\nasync function getQuotes(\n transaction: TransactionMeta,\n requests: QuoteRequest[],\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[],\n messenger: TransactionPayControllerMessenger,\n): Promise<{\n batchTransactions: BatchTransaction[];\n quotes: TransactionPayQuote<Json>[];\n}> {\n const { id: transactionId } = transaction;\n const strategies = getStrategiesByName(\n getStrategies(transaction),\n (strategyName) => {\n log('Skipping unknown strategy', {\n strategy: strategyName,\n transactionId,\n });\n },\n );\n\n if (!requests?.length) {\n return {\n batchTransactions: [],\n quotes: [],\n };\n }\n\n const request = {\n messenger,\n requests,\n transaction,\n };\n\n for (const { name, strategy } of strategies) {\n try {\n if (strategy.supports && !strategy.supports(request)) {\n log('Strategy does not support request', {\n strategy: name,\n transactionId,\n });\n continue;\n }\n\n const quotes = (await strategy.getQuotes(\n request,\n )) as TransactionPayQuote<Json>[];\n\n if (!quotes.length) {\n log('Strategy returned no quotes', { strategy: name, transactionId });\n continue;\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions = strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n return {\n batchTransactions,\n quotes,\n };\n } catch (error) {\n log('Strategy failed, trying next', {\n error,\n strategy: name,\n transactionId,\n });\n continue;\n }\n }\n\n log('No quotes available', { transactionId });\n\n return {\n batchTransactions: [],\n quotes: [],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"quotes.cjs","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransactionStatus } from '@metamask/transaction-controller';\nimport type { BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { getStrategiesByName, getStrategyByName } from './strategy';\nimport {\n computeTokenAmounts,\n getLiveTokenBalance,\n getTokenFiatRate,\n} from './token';\nimport { calculateTotals } from './totals';\nimport { getTransaction, updateTransaction } from './transaction';\nimport { TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport type {\n QuoteRequest,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPaySourceAmount,\n TransactionPayTotals,\n TransactionPaymentToken,\n UpdateTransactionDataCallback,\n} from '../types';\n\nconst DEFAULT_REFRESH_INTERVAL = 30 * 1000; // 30 Seconds\n\nconst log = createModuleLogger(projectLogger, 'quotes');\n\nexport type UpdateQuotesRequest = {\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[];\n messenger: TransactionPayControllerMessenger;\n transactionData: TransactionData | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the quotes for a specific transaction.\n *\n * @param request - Request parameters.\n * @returns Boolean indicating if the quotes were updated.\n */\nexport async function updateQuotes(\n request: UpdateQuotesRequest,\n): Promise<boolean> {\n const {\n getStrategies,\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n } = request;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction || !transactionData) {\n throw new Error('Transaction not found');\n }\n\n if (transaction?.status !== TransactionStatus.unapproved) {\n return false;\n }\n\n log('Updating quotes', { transactionId });\n\n const {\n isMaxAmount,\n isPostQuote,\n paymentToken: originalPaymentToken,\n refundTo,\n sourceAmounts,\n tokens,\n } = transactionData;\n\n const from = transaction.txParams.from as Hex;\n\n updateTransactionData(transactionId, (data) => {\n data.isLoading = true;\n });\n\n try {\n const paymentToken = await refreshPaymentTokenBalance({\n from,\n messenger,\n paymentToken: originalPaymentToken,\n transactionId,\n updateTransactionData,\n });\n\n const requests = buildQuoteRequests({\n from,\n isMaxAmount: isMaxAmount ?? false,\n isPostQuote,\n paymentToken,\n refundTo,\n sourceAmounts,\n tokens,\n transactionId,\n });\n\n const { batchTransactions, quotes } = await getQuotes(\n transaction,\n requests,\n getStrategies,\n messenger,\n );\n\n const totals = calculateTotals({\n isMaxAmount,\n messenger,\n quotes: quotes as TransactionPayQuote<unknown>[],\n tokens,\n transaction,\n });\n\n log('Calculated totals', { transactionId, totals });\n\n syncTransaction({\n batchTransactions,\n isPostQuote,\n messenger: messenger as never,\n paymentToken,\n totals,\n transactionId,\n });\n\n updateTransactionData(transactionId, (data) => {\n data.quotes = quotes as never;\n data.quotesLastUpdated = Date.now();\n data.totals = totals;\n });\n } finally {\n updateTransactionData(transactionId, (data) => {\n data.isLoading = false;\n });\n }\n\n return true;\n}\n\n/**\n * Sync batch transactions to the transaction meta.\n *\n * @param request - Request object.\n * @param request.batchTransactions - Batch transactions to sync.\n * @param request.isPostQuote - Whether this is a post-quote flow.\n * @param request.messenger - Messenger instance.\n * @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).\n * @param request.totals - Calculated totals.\n * @param request.transactionId - ID of the transaction to sync.\n */\nfunction syncTransaction({\n batchTransactions,\n isPostQuote,\n messenger,\n paymentToken,\n totals,\n transactionId,\n}: {\n batchTransactions: BatchTransaction[];\n isPostQuote?: boolean;\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken | undefined;\n totals: TransactionPayTotals;\n transactionId: string;\n}): void {\n if (!paymentToken) {\n return;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: messenger as never,\n note: 'Update transaction pay data',\n },\n (tx: TransactionMeta) => {\n tx.batchTransactions = batchTransactions;\n tx.batchTransactionsOptions = {};\n\n tx.metamaskPay = {\n bridgeFeeFiat: totals.fees.provider.usd,\n chainId: paymentToken.chainId,\n isPostQuote,\n networkFeeFiat: totals.fees.sourceNetwork.estimate.usd,\n targetFiat: totals.targetAmount.usd,\n tokenAddress: paymentToken.address,\n totalFiat: totals.total.usd,\n };\n },\n );\n}\n\n/**\n * Refresh quotes for all transactions if expired.\n *\n * @param messenger - Messenger instance.\n * @param updateTransactionData - Callback to update transaction data.\n * @param getStrategies - Callback to get ordered strategy names for a transaction.\n */\nexport async function refreshQuotes(\n messenger: TransactionPayControllerMessenger,\n updateTransactionData: UpdateTransactionDataCallback,\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[],\n): Promise<void> {\n const state = messenger.call('TransactionPayController:getState');\n const transactionIds = Object.keys(state.transactionData);\n\n for (const transactionId of transactionIds) {\n const transactionData = state.transactionData[transactionId];\n const { isLoading, quotes, quotesLastUpdated } = transactionData;\n\n if (isLoading || !quotes?.length) {\n continue;\n }\n\n const strategyName = quotes[0].strategy;\n const strategy = getStrategyByName(strategyName);\n\n const refreshInterval =\n (await strategy.getRefreshInterval?.({\n chainId: quotes[0].request.sourceChainId,\n messenger,\n })) ?? DEFAULT_REFRESH_INTERVAL;\n\n const isExpired = Date.now() - (quotesLastUpdated ?? 0) > refreshInterval;\n\n if (!isExpired) {\n continue;\n }\n\n const isUpdated = await updateQuotes({\n getStrategies,\n messenger,\n transactionData,\n transactionId,\n updateTransactionData,\n });\n\n if (isUpdated) {\n log('Refreshed quotes', { transactionId, strategy: strategyName });\n }\n }\n}\n\n/**\n * Build quote requests required to retrieve quotes.\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.isPostQuote - Whether this is a post-quote flow.\n * @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).\n * @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.\n * @param request.sourceAmounts - Source amounts for the transaction.\n * @param request.tokens - Required tokens for the transaction.\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests.\n */\nfunction buildQuoteRequests({\n from,\n isMaxAmount,\n isPostQuote,\n paymentToken,\n refundTo,\n sourceAmounts,\n tokens,\n transactionId,\n}: {\n from: Hex;\n isMaxAmount: boolean;\n isPostQuote?: boolean;\n paymentToken: TransactionPaymentToken | undefined;\n refundTo?: Hex;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n tokens: TransactionPayRequiredToken[];\n transactionId: string;\n}): QuoteRequest[] {\n if (!paymentToken) {\n return [];\n }\n\n if (isPostQuote) {\n // Post-quote flow: source = transaction's required token, target = paymentToken (destination)\n // The user wants to receive the transaction output in paymentToken\n return buildPostQuoteRequests({\n from,\n isMaxAmount,\n destinationToken: paymentToken,\n refundTo,\n sourceAmounts,\n transactionId,\n });\n }\n\n // Standard flow: source = paymentToken, target = required tokens\n const requests = (sourceAmounts ?? []).map((sourceAmount) => {\n const token = tokens.find(\n (singleToken) => singleToken.address === sourceAmount.targetTokenAddress,\n ) as TransactionPayRequiredToken;\n\n return {\n from,\n isMaxAmount,\n sourceBalanceRaw: paymentToken.balanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: paymentToken.chainId,\n sourceTokenAddress: paymentToken.address,\n targetAmountMinimum: token.allowUnderMinimum ? '0' : token.amountRaw,\n targetChainId: token.chainId,\n targetTokenAddress: token.address,\n };\n });\n\n if (!requests.length) {\n log('No quote requests', { transactionId });\n }\n\n return requests;\n}\n\n/**\n * Build quote requests for post-quote flows.\n * In this flow, the source is the transaction's required token,\n * and the target is the user's selected destination token (paymentToken).\n *\n * @param request - Request parameters.\n * @param request.from - Address from which the transaction is sent.\n * @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.\n * @param request.destinationToken - Destination token (paymentToken in post-quote mode).\n * @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.\n * @param request.sourceAmounts - Source amounts for the transaction (includes source token info).\n * @param request.transactionId - ID of the transaction.\n * @returns Array of quote requests for post-quote flow.\n */\nfunction buildPostQuoteRequests({\n from,\n isMaxAmount,\n destinationToken,\n refundTo,\n sourceAmounts,\n transactionId,\n}: {\n from: Hex;\n isMaxAmount: boolean;\n destinationToken: TransactionPaymentToken;\n refundTo?: Hex;\n sourceAmounts: TransactionPaySourceAmount[] | undefined;\n transactionId: string;\n}): QuoteRequest[] {\n // Find the source amount where targetTokenAddress matches the destination token\n const sourceAmount = sourceAmounts?.find(\n (amount) =>\n amount.targetTokenAddress.toLowerCase() ===\n destinationToken.address.toLowerCase(),\n );\n\n // Same-token-same-chain cases are already filtered in source-amounts.ts\n if (\n !sourceAmount?.sourceBalanceRaw ||\n !sourceAmount.sourceChainId ||\n !sourceAmount.sourceTokenAddress\n ) {\n log('No valid source amount found for post-quote request', {\n transactionId,\n });\n return [];\n }\n\n const request: QuoteRequest = {\n from,\n isMaxAmount,\n isPostQuote: true,\n refundTo,\n sourceBalanceRaw: sourceAmount.sourceBalanceRaw,\n sourceTokenAmount: sourceAmount.sourceAmountRaw,\n sourceChainId: sourceAmount.sourceChainId,\n sourceTokenAddress: sourceAmount.sourceTokenAddress,\n // For post-quote flows, use EXACT_INPUT - user specifies how much to send,\n // and we show them how much they'll receive after fees\n targetAmountMinimum: '0',\n targetChainId: destinationToken.chainId,\n targetTokenAddress: destinationToken.address,\n };\n\n log('Post-quote request built', { transactionId, request });\n\n // Currently only single token post-quote flows are supported.\n // Multiple token support would require multiple quotes for each required token.\n return [request];\n}\n\nasync function refreshPaymentTokenBalance({\n from,\n messenger,\n paymentToken,\n transactionId,\n updateTransactionData,\n}: {\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n paymentToken: TransactionPaymentToken | undefined;\n transactionId: string;\n updateTransactionData: UpdateTransactionDataCallback;\n}): Promise<TransactionPaymentToken | undefined> {\n if (!paymentToken) {\n return undefined;\n }\n\n try {\n const fiatRates = getTokenFiatRate(\n messenger,\n paymentToken.address,\n paymentToken.chainId,\n );\n\n if (!fiatRates) {\n return paymentToken;\n }\n\n const liveBalance = await getLiveTokenBalance(\n messenger,\n from,\n paymentToken.chainId,\n paymentToken.address,\n );\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(liveBalance, paymentToken.decimals, fiatRates);\n\n const updatedToken = {\n ...paymentToken,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n };\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = updatedToken;\n });\n\n log('Refreshed payment token balance', { transactionId, balanceRaw });\n\n return updatedToken;\n } catch (error) {\n log('Failed to refresh payment token balance', { transactionId, error });\n return paymentToken;\n }\n}\n\n/**\n * Retrieve quotes for a transaction.\n *\n * @param transaction - Transaction metadata.\n * @param requests - Quote requests.\n * @param getStrategies - Callback to get ordered strategy names for a transaction.\n * @param messenger - Controller messenger.\n * @returns An object containing batch transactions and quotes.\n */\nasync function getQuotes(\n transaction: TransactionMeta,\n requests: QuoteRequest[],\n getStrategies: (transaction: TransactionMeta) => TransactionPayStrategy[],\n messenger: TransactionPayControllerMessenger,\n): Promise<{\n batchTransactions: BatchTransaction[];\n quotes: TransactionPayQuote<Json>[];\n}> {\n const { id: transactionId } = transaction;\n const strategies = getStrategiesByName(\n getStrategies(transaction),\n (strategyName) => {\n log('Skipping unknown strategy', {\n strategy: strategyName,\n transactionId,\n });\n },\n );\n\n if (!requests?.length) {\n return {\n batchTransactions: [],\n quotes: [],\n };\n }\n\n const request = {\n messenger,\n requests,\n transaction,\n };\n\n for (const { name, strategy } of strategies) {\n try {\n if (strategy.supports && !strategy.supports(request)) {\n log('Strategy does not support request', {\n strategy: name,\n transactionId,\n });\n continue;\n }\n\n const quotes = (await strategy.getQuotes(\n request,\n )) as TransactionPayQuote<Json>[];\n\n if (!quotes.length) {\n log('Strategy returned no quotes', { strategy: name, transactionId });\n continue;\n }\n\n log('Updated', { transactionId, quotes });\n\n const batchTransactions = strategy.getBatchTransactions\n ? await strategy.getBatchTransactions({\n messenger,\n quotes,\n })\n : [];\n\n log('Batch transactions', { transactionId, batchTransactions });\n\n return {\n batchTransactions,\n quotes,\n };\n } catch (error) {\n log('Strategy failed, trying next', {\n error,\n strategy: name,\n transactionId,\n });\n continue;\n }\n }\n\n log('No quotes available', { transactionId });\n\n return {\n batchTransactions: [],\n quotes: [],\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAYxE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAEtD,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,CAAC;IAC1E,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"quotes.d.cts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAYxE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAEtD,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,CAAC;IAC1E,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA8FlB;AAuDD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,GACxE,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAYxE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAEtD,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,CAAC;IAC1E,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"quotes.d.mts","sourceRoot":"","sources":["../../src/utils/quotes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAYxE,OAAO,EAAE,sBAAsB,EAAE,yBAAqB;AAEtD,OAAO,KAAK,EAEV,eAAe,EACf,iCAAiC,EAMjC,6BAA6B,EAC9B,qBAAiB;AAMlB,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,CAAC;IAC1E,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA8FlB;AAuDD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,iCAAiC,EAC5C,qBAAqB,EAAE,6BAA6B,EACpD,aAAa,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,sBAAsB,EAAE,GACxE,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
package/dist/utils/quotes.mjs
CHANGED
|
@@ -24,7 +24,7 @@ export async function updateQuotes(request) {
|
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
log('Updating quotes', { transactionId });
|
|
27
|
-
const { isMaxAmount, isPostQuote, paymentToken: originalPaymentToken, sourceAmounts, tokens, } = transactionData;
|
|
27
|
+
const { isMaxAmount, isPostQuote, paymentToken: originalPaymentToken, refundTo, sourceAmounts, tokens, } = transactionData;
|
|
28
28
|
const from = transaction.txParams.from;
|
|
29
29
|
updateTransactionData(transactionId, (data) => {
|
|
30
30
|
data.isLoading = true;
|
|
@@ -42,6 +42,7 @@ export async function updateQuotes(request) {
|
|
|
42
42
|
isMaxAmount: isMaxAmount ?? false,
|
|
43
43
|
isPostQuote,
|
|
44
44
|
paymentToken,
|
|
45
|
+
refundTo,
|
|
45
46
|
sourceAmounts,
|
|
46
47
|
tokens,
|
|
47
48
|
transactionId,
|
|
@@ -155,12 +156,13 @@ export async function refreshQuotes(messenger, updateTransactionData, getStrateg
|
|
|
155
156
|
* @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
|
|
156
157
|
* @param request.isPostQuote - Whether this is a post-quote flow.
|
|
157
158
|
* @param request.paymentToken - Payment token (source for standard flows, destination for post-quote).
|
|
159
|
+
* @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.
|
|
158
160
|
* @param request.sourceAmounts - Source amounts for the transaction.
|
|
159
161
|
* @param request.tokens - Required tokens for the transaction.
|
|
160
162
|
* @param request.transactionId - ID of the transaction.
|
|
161
163
|
* @returns Array of quote requests.
|
|
162
164
|
*/
|
|
163
|
-
function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sourceAmounts, tokens, transactionId, }) {
|
|
165
|
+
function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, refundTo, sourceAmounts, tokens, transactionId, }) {
|
|
164
166
|
if (!paymentToken) {
|
|
165
167
|
return [];
|
|
166
168
|
}
|
|
@@ -171,6 +173,7 @@ function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sour
|
|
|
171
173
|
from,
|
|
172
174
|
isMaxAmount,
|
|
173
175
|
destinationToken: paymentToken,
|
|
176
|
+
refundTo,
|
|
174
177
|
sourceAmounts,
|
|
175
178
|
transactionId,
|
|
176
179
|
});
|
|
@@ -204,11 +207,12 @@ function buildQuoteRequests({ from, isMaxAmount, isPostQuote, paymentToken, sour
|
|
|
204
207
|
* @param request.from - Address from which the transaction is sent.
|
|
205
208
|
* @param request.isMaxAmount - Whether the transaction is a maximum amount transaction.
|
|
206
209
|
* @param request.destinationToken - Destination token (paymentToken in post-quote mode).
|
|
210
|
+
* @param request.refundTo - Optional address to receive refunds if the Relay transaction fails.
|
|
207
211
|
* @param request.sourceAmounts - Source amounts for the transaction (includes source token info).
|
|
208
212
|
* @param request.transactionId - ID of the transaction.
|
|
209
213
|
* @returns Array of quote requests for post-quote flow.
|
|
210
214
|
*/
|
|
211
|
-
function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, sourceAmounts, transactionId, }) {
|
|
215
|
+
function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, refundTo, sourceAmounts, transactionId, }) {
|
|
212
216
|
// Find the source amount where targetTokenAddress matches the destination token
|
|
213
217
|
const sourceAmount = sourceAmounts?.find((amount) => amount.targetTokenAddress.toLowerCase() ===
|
|
214
218
|
destinationToken.address.toLowerCase());
|
|
@@ -225,6 +229,7 @@ function buildPostQuoteRequests({ from, isMaxAmount, destinationToken, sourceAmo
|
|
|
225
229
|
from,
|
|
226
230
|
isMaxAmount,
|
|
227
231
|
isPostQuote: true,
|
|
232
|
+
refundTo,
|
|
228
233
|
sourceBalanceRaw: sourceAmount.sourceBalanceRaw,
|
|
229
234
|
sourceTokenAmount: sourceAmount.sourceAmountRaw,
|
|
230
235
|
sourceChainId: sourceAmount.sourceChainId,
|