@metamask/bridge-status-controller 59.0.0 → 60.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues, TxData } from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n GasFeeEstimates,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type {\n FeeMarketGasFeeEstimates,\n TransactionController,\n TransactionReceipt,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n BridgeHistoryItem,\n BridgeStatusControllerMessenger,\n} from '../types';\n\nconst getTransaction1559GasFeeEstimates = (\n txGasFeeEstimates: FeeMarketGasFeeEstimates,\n estimatedBaseFee: string,\n) => {\n const { maxFeePerGas, maxPriorityFeePerGas } = txGasFeeEstimates?.high ?? {};\n\n const baseAndPriorityFeePerGas = maxPriorityFeePerGas\n ? new BigNumber(estimatedBaseFee, 10)\n .times(10 ** 9)\n .plus(maxPriorityFeePerGas, 16)\n : undefined;\n\n return {\n baseAndPriorityFeePerGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n};\n\n/**\n * Get the gas fee estimates for a transaction\n *\n * @param params - The parameters for the gas fee estimates\n * @param params.txGasFeeEstimates - The gas fee estimates for the transaction (TransactionController)\n * @param params.networkGasFeeEstimates - The gas fee estimates for the network (GasFeeController)\n * @returns The gas fee estimates for the transaction\n */\nexport const getTxGasEstimates = ({\n txGasFeeEstimates,\n networkGasFeeEstimates,\n}: {\n txGasFeeEstimates: Awaited<\n ReturnType<TransactionController['estimateGasFee']>\n >['estimates'];\n networkGasFeeEstimates: GasFeeState['gasFeeEstimates'];\n}) => {\n const { estimatedBaseFee = '0' } = networkGasFeeEstimates as GasFeeEstimates;\n return getTransaction1559GasFeeEstimates(\n txGasFeeEstimates as unknown as FeeMarketGasFeeEstimates,\n estimatedBaseFee,\n );\n};\n\nexport const calculateGasFees = async (\n disable7702: boolean,\n messenger: BridgeStatusControllerMessenger,\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee,\n { chainId: _, gasLimit, ...trade }: TxData,\n networkClientId: string,\n chainId: Hex,\n txFee?: { maxFeePerGas: string; maxPriorityFeePerGas: string },\n) => {\n if (!disable7702) {\n return {};\n }\n if (txFee) {\n return { ...txFee, gas: gasLimit?.toString() };\n }\n const transactionParams = {\n ...trade,\n gas: gasLimit?.toString(),\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n const { gasFeeEstimates } = messenger.call('GasFeeController:getState');\n const { estimates: txGasFeeEstimates } = await estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n};\n\nconst calcGasInHexWei = (gasLimit?: string, gasPrice?: string) => {\n return gasLimit && gasPrice\n ? new BigNumber(gasLimit, 16).times(new BigNumber(gasPrice, 16))\n : null;\n};\n\n/**\n * Calculate the effective gas used for a transaction and its approval tx\n *\n * @param bridgeHistoryItem - The bridge history item\n * @param bridgeHistoryItem.pricingData - pricing data from the submitted quote\n * @param txReceipt - tx receipt from the txMeta\n * @param approvalTxReceipt - tx receipt from the approvalTxMeta\n * @returns The actual gas used for the transaction in Wei and its value in USD\n */\nexport const calcActualGasUsed = (\n { pricingData }: BridgeHistoryItem,\n txReceipt?: TransactionReceipt,\n approvalTxReceipt?: TransactionReceipt,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const usdExchangeRate =\n pricingData?.quotedGasInUsd && pricingData?.quotedGasAmount\n ? new BigNumber(pricingData?.quotedGasInUsd).div(\n pricingData.quotedGasAmount,\n )\n : null;\n\n const actualGasInHexWei = calcGasInHexWei(\n txReceipt?.gasUsed,\n txReceipt?.effectiveGasPrice,\n )?.plus(\n calcGasInHexWei(\n approvalTxReceipt?.gasUsed,\n approvalTxReceipt?.effectiveGasPrice,\n ) ?? 0,\n );\n\n const actualGasInDecEth = actualGasInHexWei\n ?.div(new BigNumber(10).pow(18))\n .toString(10);\n\n return actualGasInHexWei && actualGasInDecEth\n ? {\n amount: actualGasInHexWei.toString(10),\n usd:\n usdExchangeRate?.multipliedBy(actualGasInDecEth).toString(10) ?? null,\n }\n : null;\n};\n"]}
1
+ {"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues, TxData } from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n GasFeeEstimates,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type {\n FeeMarketGasFeeEstimates,\n TransactionController,\n TransactionReceipt,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type {\n BridgeHistoryItem,\n BridgeStatusControllerMessenger,\n} from '../types';\n\nconst getTransaction1559GasFeeEstimates = (\n txGasFeeEstimates: FeeMarketGasFeeEstimates,\n estimatedBaseFee: string,\n) => {\n const { maxFeePerGas, maxPriorityFeePerGas } = txGasFeeEstimates?.high ?? {};\n\n const baseAndPriorityFeePerGas = maxPriorityFeePerGas\n ? new BigNumber(estimatedBaseFee, 10)\n .times(10 ** 9)\n .plus(maxPriorityFeePerGas, 16)\n : undefined;\n\n return {\n baseAndPriorityFeePerGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n};\n\n/**\n * Get the gas fee estimates for a transaction\n *\n * @param params - The parameters for the gas fee estimates\n * @param params.txGasFeeEstimates - The gas fee estimates for the transaction (TransactionController)\n * @param params.networkGasFeeEstimates - The gas fee estimates for the network (GasFeeController)\n * @returns The gas fee estimates for the transaction\n */\nexport const getTxGasEstimates = ({\n txGasFeeEstimates,\n networkGasFeeEstimates,\n}: {\n txGasFeeEstimates: Awaited<\n ReturnType<TransactionController['estimateGasFee']>\n >['estimates'];\n networkGasFeeEstimates: GasFeeState['gasFeeEstimates'];\n}) => {\n const { estimatedBaseFee = '0' } = networkGasFeeEstimates as GasFeeEstimates;\n return getTransaction1559GasFeeEstimates(\n txGasFeeEstimates as unknown as FeeMarketGasFeeEstimates,\n estimatedBaseFee,\n );\n};\n\nexport const calculateGasFees = async (\n disable7702: boolean,\n messenger: BridgeStatusControllerMessenger,\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee,\n { chainId: _, gasLimit, ...trade }: TxData,\n networkClientId: string,\n chainId: Hex,\n txFee?: { maxFeePerGas: string; maxPriorityFeePerGas: string },\n) => {\n if (!disable7702) {\n return {};\n }\n if (txFee) {\n return { ...txFee, gas: gasLimit?.toString() };\n }\n const transactionParams = {\n ...trade,\n gas: gasLimit?.toString(),\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n const { gasFeeEstimates } = messenger.call('GasFeeController:getState');\n const { estimates: txGasFeeEstimates } = await estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n};\n\nconst calcGasInHexWei = (gasLimit?: string, gasPrice?: string) => {\n return gasLimit && gasPrice\n ? new BigNumber(gasLimit, 16).times(new BigNumber(gasPrice, 16))\n : null;\n};\n\n/**\n * Calculate the effective gas used for a transaction and its approval tx\n *\n * @param bridgeHistoryItem - The bridge history item\n * @param bridgeHistoryItem.pricingData - pricing data from the submitted quote\n * @param txReceipt - tx receipt from the txMeta\n * @param approvalTxReceipt - tx receipt from the approvalTxMeta\n * @returns The actual gas used for the transaction in Wei and its value in USD\n */\nexport const calcActualGasUsed = (\n { pricingData }: BridgeHistoryItem,\n txReceipt?: TransactionReceipt,\n approvalTxReceipt?: TransactionReceipt,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const usdExchangeRate =\n pricingData?.quotedGasInUsd && pricingData?.quotedGasAmount\n ? new BigNumber(pricingData?.quotedGasInUsd).div(\n pricingData.quotedGasAmount,\n )\n : null;\n\n const actualGasInHexWei = calcGasInHexWei(\n txReceipt?.gasUsed,\n txReceipt?.effectiveGasPrice,\n )?.plus(\n calcGasInHexWei(\n approvalTxReceipt?.gasUsed,\n approvalTxReceipt?.effectiveGasPrice,\n ) ?? 0,\n );\n\n const actualGasInDecEth = actualGasInHexWei\n ?.div(new BigNumber(10).pow(18))\n .toString(10);\n\n return actualGasInHexWei && actualGasInDecEth\n ? {\n amount: actualGasInHexWei.toString(10),\n usd:\n usdExchangeRate?.multipliedBy(actualGasInDecEth).toString(10) ?? null,\n }\n : null;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"swap-received-amount.cjs","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues } from '@metamask/bridge-controller';\nimport { isNativeAddress } from '@metamask/bridge-controller';\nimport { type TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { BridgeHistoryItem } from '../types';\n\nconst getReceivedNativeAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta: TransactionMeta,\n) => {\n const { preTxBalance, postTxBalance } = txMeta;\n\n if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {\n // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time\n // because of the RPC provider delay, so we return an estimated receiving amount instead.\n return new BigNumber(historyItem.quote.destTokenAmount)\n .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))\n .toString(10);\n }\n\n return actualGas && postTxBalance && preTxBalance\n ? new BigNumber(postTxBalance, 16)\n .minus(preTxBalance, 16)\n .minus(actualGas.amount)\n .div(10 ** historyItem.quote.destAsset.decimals)\n : null;\n};\n\nconst getReceivedERC20Amount = (\n historyItem: BridgeHistoryItem,\n txMeta: TransactionMeta,\n) => {\n const { txReceipt } = txMeta;\n if (!txReceipt || !txReceipt.logs || txReceipt.status === '0x0') {\n return null;\n }\n const { account: accountAddress, quote } = historyItem;\n\n const TOKEN_TRANSFER_LOG_TOPIC_HASH =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n const tokenTransferLog = txReceipt.logs.find((txReceiptLog) => {\n const isTokenTransfer =\n txReceiptLog.topics &&\n txReceiptLog.topics[0]?.startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);\n const isTransferFromGivenToken =\n txReceiptLog.address?.toLowerCase() ===\n quote.destAsset.address?.toLowerCase();\n const isTransferFromGivenAddress =\n txReceiptLog.topics &&\n txReceiptLog.topics[2] &&\n (txReceiptLog.topics[2] === accountAddress ||\n txReceiptLog.topics[2].match(accountAddress?.slice(2)));\n\n return (\n isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress\n );\n });\n\n if (tokenTransferLog?.data) {\n return new BigNumber(tokenTransferLog.data, 16).div(\n new BigNumber(10).pow(quote.destAsset.decimals),\n );\n }\n\n return null;\n};\n\n/**\n * Calculate the amount received after a swap transaction based on the txMeta\n *\n * @param historyItem - The bridge history item\n * @param actualGas - The actual gas used for the transaction\n * @param txMeta - The transaction meta from the TransactionController\n * @returns The actual amount received for the swap transaction\n */\nexport const getActualSwapReceivedAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta?: TransactionMeta,\n) => {\n const { pricingData } = historyItem;\n const quotedReturnAmount = historyItem.quote.destTokenAmount;\n\n if (!txMeta?.txReceipt) {\n return null;\n }\n\n const actualReturnAmount = isNativeAddress(\n historyItem.quote.destAsset.address,\n )\n ? getReceivedNativeAmount(historyItem, actualGas, txMeta)\n : getReceivedERC20Amount(historyItem, txMeta);\n\n const returnUsdExchangeRate =\n pricingData?.quotedReturnInUsd && quotedReturnAmount\n ? new BigNumber(pricingData.quotedReturnInUsd)\n .div(quotedReturnAmount)\n .multipliedBy(10 ** historyItem.quote.destAsset.decimals)\n : null;\n\n return {\n amount: actualReturnAmount,\n usd:\n actualReturnAmount && returnUsdExchangeRate\n ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)\n : null,\n };\n};\n\n/**\n * Calculate the amount received after a bridge transaction based on the getTxStatus's\n * amount field\n *\n * @param historyItem - The bridge history item\n * @returns The actual amount received for the bridge transaction\n */\nexport const getActualBridgeReceivedAmount = (\n historyItem: BridgeHistoryItem,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const { quote, pricingData, status } = historyItem;\n\n const usdExchangeRate = pricingData?.quotedReturnInUsd\n ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)\n : null;\n\n const actualAmount = status.destChain?.amount;\n return actualAmount && usdExchangeRate\n ? {\n amount: actualAmount,\n usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),\n }\n : null;\n};\n"]}
1
+ {"version":3,"file":"swap-received-amount.cjs","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":";;;AACA,mEAA8D;AAE9D,+CAAyC;AAIzC,MAAM,uBAAuB,GAAG,CAC9B,WAA8B,EAC9B,SAA4D,EAC5D,MAAuB,EACvB,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE/C,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACtE,yFAAyF;QACzF,yFAAyF;QACzF,OAAO,IAAI,wBAAS,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC;aACpD,GAAG,CAAC,IAAI,wBAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aAChE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,IAAI,aAAa,IAAI,YAAY;QAC/C,CAAC,CAAC,IAAI,wBAAS,CAAC,aAAa,EAAE,EAAE,CAAC;aAC7B,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;aACvB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;aACvB,GAAG,CAAC,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC7B,WAA8B,EAC9B,MAAuB,EACvB,EAAE;IACF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;IAEvD,MAAM,6BAA6B,GACjC,oEAAoE,CAAC;IAEvE,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;QAC5D,MAAM,eAAe,GACnB,YAAY,CAAC,MAAM;YACnB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC;QACpE,MAAM,wBAAwB,GAC5B,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE;YACnC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QACzC,MAAM,0BAA0B,GAC9B,YAAY,CAAC,MAAM;YACnB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YACtB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,cAAc;gBACxC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,OAAO,CACL,eAAe,IAAI,wBAAwB,IAAI,0BAA0B,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,wBAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CACjD,IAAI,wBAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAChD,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;GAOG;AACI,MAAM,2BAA2B,GAAG,CACzC,WAA8B,EAC9B,SAA4D,EAC5D,MAAwB,EACxB,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;IACpC,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC;IAE7D,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAA,mCAAe,EACxC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CACpC;QACC,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;QACzD,CAAC,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,qBAAqB,GACzB,WAAW,EAAE,iBAAiB,IAAI,kBAAkB;QAClD,CAAC,CAAC,IAAI,wBAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC;aACzC,GAAG,CAAC,kBAAkB,CAAC;aACvB,YAAY,CAAC,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC7D,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO;QACL,MAAM,EAAE,kBAAkB;QAC1B,GAAG,EACD,kBAAkB,IAAI,qBAAqB;YACzC,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACxD,CAAC,CAAC,IAAI;KACX,CAAC;AACJ,CAAC,CAAC;AAhCW,QAAA,2BAA2B,+BAgCtC;AAEF;;;;;;GAMG;AACI,MAAM,6BAA6B,GAAG,CAC3C,WAA8B,EACqB,EAAE;IACrD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IAEnD,MAAM,eAAe,GAAG,WAAW,EAAE,iBAAiB;QACpD,CAAC,CAAC,IAAI,wBAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;QACzE,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9C,OAAO,YAAY,IAAI,eAAe;QACpC,CAAC,CAAC;YACE,MAAM,EAAE,YAAY;YACpB,GAAG,EAAE,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC7D;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAhBW,QAAA,6BAA6B,iCAgBxC","sourcesContent":["import type { TokenAmountValues } from '@metamask/bridge-controller';\nimport { isNativeAddress } from '@metamask/bridge-controller';\nimport { type TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { BridgeHistoryItem } from '../types';\n\nconst getReceivedNativeAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta: TransactionMeta,\n) => {\n const { preTxBalance, postTxBalance } = txMeta;\n\n if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {\n // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time\n // because of the RPC provider delay, so we return an estimated receiving amount instead.\n return new BigNumber(historyItem.quote.destTokenAmount)\n .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))\n .toString(10);\n }\n\n return actualGas && postTxBalance && preTxBalance\n ? new BigNumber(postTxBalance, 16)\n .minus(preTxBalance, 16)\n .minus(actualGas.amount)\n .div(10 ** historyItem.quote.destAsset.decimals)\n : null;\n};\n\nconst getReceivedERC20Amount = (\n historyItem: BridgeHistoryItem,\n txMeta: TransactionMeta,\n) => {\n const { txReceipt } = txMeta;\n if (!txReceipt || !txReceipt.logs || txReceipt.status === '0x0') {\n return null;\n }\n const { account: accountAddress, quote } = historyItem;\n\n const TOKEN_TRANSFER_LOG_TOPIC_HASH =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n const tokenTransferLog = txReceipt.logs.find((txReceiptLog) => {\n const isTokenTransfer =\n txReceiptLog.topics &&\n txReceiptLog.topics[0]?.startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);\n const isTransferFromGivenToken =\n txReceiptLog.address?.toLowerCase() ===\n quote.destAsset.address?.toLowerCase();\n const isTransferFromGivenAddress =\n txReceiptLog.topics &&\n txReceiptLog.topics[2] &&\n (txReceiptLog.topics[2] === accountAddress ||\n txReceiptLog.topics[2].match(accountAddress?.slice(2)));\n\n return (\n isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress\n );\n });\n\n if (tokenTransferLog?.data) {\n return new BigNumber(tokenTransferLog.data, 16).div(\n new BigNumber(10).pow(quote.destAsset.decimals),\n );\n }\n\n return null;\n};\n\n/**\n * Calculate the amount received after a swap transaction based on the txMeta\n *\n * @param historyItem - The bridge history item\n * @param actualGas - The actual gas used for the transaction\n * @param txMeta - The transaction meta from the TransactionController\n * @returns The actual amount received for the swap transaction\n */\nexport const getActualSwapReceivedAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta?: TransactionMeta,\n) => {\n const { pricingData } = historyItem;\n const quotedReturnAmount = historyItem.quote.destTokenAmount;\n\n if (!txMeta?.txReceipt) {\n return null;\n }\n\n const actualReturnAmount = isNativeAddress(\n historyItem.quote.destAsset.address,\n )\n ? getReceivedNativeAmount(historyItem, actualGas, txMeta)\n : getReceivedERC20Amount(historyItem, txMeta);\n\n const returnUsdExchangeRate =\n pricingData?.quotedReturnInUsd && quotedReturnAmount\n ? new BigNumber(pricingData.quotedReturnInUsd)\n .div(quotedReturnAmount)\n .multipliedBy(10 ** historyItem.quote.destAsset.decimals)\n : null;\n\n return {\n amount: actualReturnAmount,\n usd:\n actualReturnAmount && returnUsdExchangeRate\n ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)\n : null,\n };\n};\n\n/**\n * Calculate the amount received after a bridge transaction based on the getTxStatus's\n * amount field\n *\n * @param historyItem - The bridge history item\n * @returns The actual amount received for the bridge transaction\n */\nexport const getActualBridgeReceivedAmount = (\n historyItem: BridgeHistoryItem,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const { quote, pricingData, status } = historyItem;\n\n const usdExchangeRate = pricingData?.quotedReturnInUsd\n ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)\n : null;\n\n const actualAmount = status.destChain?.amount;\n return actualAmount && usdExchangeRate\n ? {\n amount: actualAmount,\n usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),\n }\n : null;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"swap-received-amount.mjs","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues } from '@metamask/bridge-controller';\nimport { isNativeAddress } from '@metamask/bridge-controller';\nimport { type TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { BridgeHistoryItem } from '../types';\n\nconst getReceivedNativeAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta: TransactionMeta,\n) => {\n const { preTxBalance, postTxBalance } = txMeta;\n\n if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {\n // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time\n // because of the RPC provider delay, so we return an estimated receiving amount instead.\n return new BigNumber(historyItem.quote.destTokenAmount)\n .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))\n .toString(10);\n }\n\n return actualGas && postTxBalance && preTxBalance\n ? new BigNumber(postTxBalance, 16)\n .minus(preTxBalance, 16)\n .minus(actualGas.amount)\n .div(10 ** historyItem.quote.destAsset.decimals)\n : null;\n};\n\nconst getReceivedERC20Amount = (\n historyItem: BridgeHistoryItem,\n txMeta: TransactionMeta,\n) => {\n const { txReceipt } = txMeta;\n if (!txReceipt || !txReceipt.logs || txReceipt.status === '0x0') {\n return null;\n }\n const { account: accountAddress, quote } = historyItem;\n\n const TOKEN_TRANSFER_LOG_TOPIC_HASH =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n const tokenTransferLog = txReceipt.logs.find((txReceiptLog) => {\n const isTokenTransfer =\n txReceiptLog.topics &&\n txReceiptLog.topics[0]?.startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);\n const isTransferFromGivenToken =\n txReceiptLog.address?.toLowerCase() ===\n quote.destAsset.address?.toLowerCase();\n const isTransferFromGivenAddress =\n txReceiptLog.topics &&\n txReceiptLog.topics[2] &&\n (txReceiptLog.topics[2] === accountAddress ||\n txReceiptLog.topics[2].match(accountAddress?.slice(2)));\n\n return (\n isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress\n );\n });\n\n if (tokenTransferLog?.data) {\n return new BigNumber(tokenTransferLog.data, 16).div(\n new BigNumber(10).pow(quote.destAsset.decimals),\n );\n }\n\n return null;\n};\n\n/**\n * Calculate the amount received after a swap transaction based on the txMeta\n *\n * @param historyItem - The bridge history item\n * @param actualGas - The actual gas used for the transaction\n * @param txMeta - The transaction meta from the TransactionController\n * @returns The actual amount received for the swap transaction\n */\nexport const getActualSwapReceivedAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta?: TransactionMeta,\n) => {\n const { pricingData } = historyItem;\n const quotedReturnAmount = historyItem.quote.destTokenAmount;\n\n if (!txMeta?.txReceipt) {\n return null;\n }\n\n const actualReturnAmount = isNativeAddress(\n historyItem.quote.destAsset.address,\n )\n ? getReceivedNativeAmount(historyItem, actualGas, txMeta)\n : getReceivedERC20Amount(historyItem, txMeta);\n\n const returnUsdExchangeRate =\n pricingData?.quotedReturnInUsd && quotedReturnAmount\n ? new BigNumber(pricingData.quotedReturnInUsd)\n .div(quotedReturnAmount)\n .multipliedBy(10 ** historyItem.quote.destAsset.decimals)\n : null;\n\n return {\n amount: actualReturnAmount,\n usd:\n actualReturnAmount && returnUsdExchangeRate\n ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)\n : null,\n };\n};\n\n/**\n * Calculate the amount received after a bridge transaction based on the getTxStatus's\n * amount field\n *\n * @param historyItem - The bridge history item\n * @returns The actual amount received for the bridge transaction\n */\nexport const getActualBridgeReceivedAmount = (\n historyItem: BridgeHistoryItem,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const { quote, pricingData, status } = historyItem;\n\n const usdExchangeRate = pricingData?.quotedReturnInUsd\n ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)\n : null;\n\n const actualAmount = status.destChain?.amount;\n return actualAmount && usdExchangeRate\n ? {\n amount: actualAmount,\n usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),\n }\n : null;\n};\n"]}
1
+ {"version":3,"file":"swap-received-amount.mjs","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TokenAmountValues } from '@metamask/bridge-controller';\nimport { isNativeAddress } from '@metamask/bridge-controller';\nimport { type TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { BridgeHistoryItem } from '../types';\n\nconst getReceivedNativeAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta: TransactionMeta,\n) => {\n const { preTxBalance, postTxBalance } = txMeta;\n\n if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {\n // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time\n // because of the RPC provider delay, so we return an estimated receiving amount instead.\n return new BigNumber(historyItem.quote.destTokenAmount)\n .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))\n .toString(10);\n }\n\n return actualGas && postTxBalance && preTxBalance\n ? new BigNumber(postTxBalance, 16)\n .minus(preTxBalance, 16)\n .minus(actualGas.amount)\n .div(10 ** historyItem.quote.destAsset.decimals)\n : null;\n};\n\nconst getReceivedERC20Amount = (\n historyItem: BridgeHistoryItem,\n txMeta: TransactionMeta,\n) => {\n const { txReceipt } = txMeta;\n if (!txReceipt || !txReceipt.logs || txReceipt.status === '0x0') {\n return null;\n }\n const { account: accountAddress, quote } = historyItem;\n\n const TOKEN_TRANSFER_LOG_TOPIC_HASH =\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n const tokenTransferLog = txReceipt.logs.find((txReceiptLog) => {\n const isTokenTransfer =\n txReceiptLog.topics &&\n txReceiptLog.topics[0]?.startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);\n const isTransferFromGivenToken =\n txReceiptLog.address?.toLowerCase() ===\n quote.destAsset.address?.toLowerCase();\n const isTransferFromGivenAddress =\n txReceiptLog.topics &&\n txReceiptLog.topics[2] &&\n (txReceiptLog.topics[2] === accountAddress ||\n txReceiptLog.topics[2].match(accountAddress?.slice(2)));\n\n return (\n isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress\n );\n });\n\n if (tokenTransferLog?.data) {\n return new BigNumber(tokenTransferLog.data, 16).div(\n new BigNumber(10).pow(quote.destAsset.decimals),\n );\n }\n\n return null;\n};\n\n/**\n * Calculate the amount received after a swap transaction based on the txMeta\n *\n * @param historyItem - The bridge history item\n * @param actualGas - The actual gas used for the transaction\n * @param txMeta - The transaction meta from the TransactionController\n * @returns The actual amount received for the swap transaction\n */\nexport const getActualSwapReceivedAmount = (\n historyItem: BridgeHistoryItem,\n actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null,\n txMeta?: TransactionMeta,\n) => {\n const { pricingData } = historyItem;\n const quotedReturnAmount = historyItem.quote.destTokenAmount;\n\n if (!txMeta?.txReceipt) {\n return null;\n }\n\n const actualReturnAmount = isNativeAddress(\n historyItem.quote.destAsset.address,\n )\n ? getReceivedNativeAmount(historyItem, actualGas, txMeta)\n : getReceivedERC20Amount(historyItem, txMeta);\n\n const returnUsdExchangeRate =\n pricingData?.quotedReturnInUsd && quotedReturnAmount\n ? new BigNumber(pricingData.quotedReturnInUsd)\n .div(quotedReturnAmount)\n .multipliedBy(10 ** historyItem.quote.destAsset.decimals)\n : null;\n\n return {\n amount: actualReturnAmount,\n usd:\n actualReturnAmount && returnUsdExchangeRate\n ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)\n : null,\n };\n};\n\n/**\n * Calculate the amount received after a bridge transaction based on the getTxStatus's\n * amount field\n *\n * @param historyItem - The bridge history item\n * @returns The actual amount received for the bridge transaction\n */\nexport const getActualBridgeReceivedAmount = (\n historyItem: BridgeHistoryItem,\n): Omit<TokenAmountValues, 'valueInCurrency'> | null => {\n const { quote, pricingData, status } = historyItem;\n\n const usdExchangeRate = pricingData?.quotedReturnInUsd\n ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)\n : null;\n\n const actualAmount = status.destChain?.amount;\n return actualAmount && usdExchangeRate\n ? {\n amount: actualAmount,\n usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),\n }\n : null;\n};\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findAndUpdateTransactionsInBatch = exports.getAddTransactionBatchParams = exports.toBatchTxParams = exports.getClientRequest = exports.handleMobileHardwareWalletDelay = exports.handleApprovalDelay = exports.handleNonEvmTxResponse = exports.getTxMetaFields = exports.getStatusRequestParams = exports.getUSDTAllowanceResetTx = exports.generateActionId = void 0;
4
4
  const bridge_controller_1 = require("@metamask/bridge-controller");
5
+ const bridge_controller_2 = require("@metamask/bridge-controller");
5
6
  const controller_utils_1 = require("@metamask/controller-utils");
6
7
  const transaction_controller_1 = require("@metamask/transaction-controller");
7
8
  const utils_1 = require("@metamask/utils");
@@ -113,9 +114,7 @@ const handleNonEvmTxResponse = (snapResponse, quoteResponse, selectedAccount) =>
113
114
  hexChainId = '0x1';
114
115
  }
115
116
  // Extract the transaction data for storage
116
- const tradeData = typeof quoteResponse.trade === 'string'
117
- ? quoteResponse.trade
118
- : quoteResponse.trade.unsignedPsbtBase64;
117
+ const tradeData = (0, bridge_controller_2.extractTradeData)(quoteResponse.trade);
119
118
  // Create a transaction meta object with bridge-specific fields
120
119
  return {
121
120
  ...(0, exports.getTxMetaFields)(quoteResponse),
@@ -126,10 +125,10 @@ const handleNonEvmTxResponse = (snapResponse, quoteResponse, selectedAccount) =>
126
125
  txParams: { from: selectedAccountAddress, data: tradeData },
127
126
  type: isBridgeTx ? transaction_controller_1.TransactionType.bridge : transaction_controller_1.TransactionType.swap,
128
127
  status: transaction_controller_1.TransactionStatus.submitted,
129
- hash,
128
+ hash, // Add the transaction signature as hash
130
129
  origin: snapId,
131
130
  // Add an explicit flag to mark this as a non-EVM transaction
132
- isSolana: true,
131
+ isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains
133
132
  isBridgeTx,
134
133
  };
135
134
  };
@@ -161,18 +160,23 @@ exports.handleMobileHardwareWalletDelay = handleMobileHardwareWalletDelay;
161
160
  * Creates a request to sign and send a transaction for non-EVM chains
162
161
  * Uses the new unified ClientRequest:signAndSendTransaction interface
163
162
  *
164
- * @param quoteResponse - The quote response containing trade details and metadata
163
+ * @param trade - The trade data
164
+ * @param srcChainId - The source chain ID
165
165
  * @param selectedAccount - The selected account information
166
166
  * @returns The snap request object for signing and sending transaction
167
167
  */
168
- const getClientRequest = (quoteResponse, selectedAccount) => {
169
- const scope = (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId);
170
- // Extract the transaction data - Bitcoin uses unsignedPsbtBase64, others use string
171
- const transactionData = typeof quoteResponse.trade === 'string'
172
- ? quoteResponse.trade
173
- : quoteResponse.trade.unsignedPsbtBase64;
168
+ const getClientRequest = (trade, srcChainId, selectedAccount) => {
169
+ const scope = (0, bridge_controller_1.formatChainIdToCaip)(srcChainId);
170
+ const transactionData = (0, bridge_controller_2.extractTradeData)(trade);
171
+ // Tron trades need the visible flag and contract type to be included in the request options
172
+ const options = (0, bridge_controller_2.isTronTrade)(trade)
173
+ ? {
174
+ visible: trade.visible,
175
+ type: trade.raw_data?.contract?.[0]?.type,
176
+ }
177
+ : undefined;
174
178
  // Use the new unified interface
175
- return (0, snaps_1.createClientTransactionRequest)(selectedAccount.metadata.snap?.id, transactionData, scope, selectedAccount.id);
179
+ return (0, snaps_1.createClientTransactionRequest)(selectedAccount.metadata.snap?.id, transactionData, scope, selectedAccount.id, options);
176
180
  };
177
181
  exports.getClientRequest = getClientRequest;
178
182
  const toBatchTxParams = (disable7702, { chainId, gasLimit, ...trade }, { maxFeePerGas, maxPriorityFeePerGas, gas, }) => {
@@ -193,7 +197,7 @@ const toBatchTxParams = (disable7702, { chainId, gasLimit, ...trade }, { maxFeeP
193
197
  };
194
198
  };
195
199
  exports.toBatchTxParams = toBatchTxParams;
196
- const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, }, sentAmount, toTokenAmount, }, requireApproval = false, estimateGasFeeFn, }) => {
200
+ const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, gasSponsored, }, sentAmount, toTokenAmount, }, requireApproval = false, estimateGasFeeFn, }) => {
197
201
  const isGasless = gasIncluded || gasIncluded7702;
198
202
  const selectedAccount = messenger.call('AccountsController:getAccountByAddress', trade.from);
199
203
  if (!selectedAccount) {
@@ -235,6 +239,7 @@ const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, approval, r
235
239
  const transactionParams = {
236
240
  disable7702,
237
241
  isGasFeeIncluded: Boolean(gasIncluded7702),
242
+ isGasFeeSponsored: Boolean(gasSponsored),
238
243
  networkClientId,
239
244
  requireApproval,
240
245
  origin: 'metamask',
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":";;;AAEA,mEASqC;AACrC,iEAAmD;AAKnD,6EAI0C;AAC1C,2CAAsD;AACtD,+CAAyC;AACzC,+BAAkC;AAElC,mCAAyC;AACzC,uCAAyD;AAEzD,gDAAiD;AAM1C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAAjE,QAAA,gBAAgB,oBAAiD;AAEvE,MAAM,uBAAuB,GAAG,KAAK,EAC1C,SAA0C,EAC1C,aAAqD,EACrD,EAAE;IACF,MAAM,UAAU,GAAG,IAAA,sCAAkB,EAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IACE,aAAa,CAAC,QAAQ;QACtB,IAAA,6BAAS,EAAC,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC3D;QACA,MAAM,SAAS,GAAG,IAAI,wBAAS,CAC7B,MAAM,SAAS,CAAC,IAAI,CAClB,0CAA0C,EAC1C,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EACpC,UAAU,CACX,CACF,CAAC;QACF,MAAM,mBAAmB,GACvB,SAAS,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,mBAAmB,EAAE;YACvB,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAA,uCAAmB,GAAE,EAAE,CAAC;SACnE;KACF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAvBW,QAAA,uBAAuB,2BAuBlC;AAEK,MAAM,sBAAsB,GAAG,CAAC,aAA4B,EAAE,EAAE;IACrE,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ;QACtC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,UAAU;QAC1C,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW;QAC5C,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;KAC5C,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,sBAAsB,0BASjC;AAEK,MAAM,eAAe,GAAG,CAC7B,aACe,EACf,YAAqB,EAIrB,EAAE;IACF,kFAAkF;IAClF,IAAI,kBAAkB,CAAC;IACvB,IAAI;QACF,kBAAkB,GAAG,IAAA,sCAAkB,EAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KAC1E;IAAC,MAAM;QACN,mEAAmE;QACnE,kBAAkB,GAAG,KAAsB,CAAC,CAAC,qBAAqB;KACnE;IAED,OAAO;QACL,kBAAkB;QAClB,iBAAiB,EAAE,aAAa,CAAC,KAAK,CAAC,cAAc;QACrD,iBAAiB,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;QACtD,mBAAmB,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ;QAC1D,kBAAkB,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO;QAExD,sBAAsB,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe;QAC3D,sBAAsB,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;QAC5D,wBAAwB,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;QAChE,uBAAuB,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO;QAE9D,uEAAuE;QACvE,YAAY;QACZ,kFAAkF;QAClF,cAAc,EAAE,aAAa,CAAC,UAAU,CAAC,MAAM;KAChD,CAAC;AACJ,CAAC,CAAC;AAlCW,QAAA,eAAe,mBAkC1B;AAEF;;;;;;;;;GASG;AACI,MAAM,sBAAsB,GAAG,CACpC,YAIyB,EACzB,aAIe,EACf,eAAgF,EACvC,EAAE;IAC3C,MAAM,sBAAsB,GAAG,eAAe,CAAC,OAAO,CAAC;IACvD,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACjD,IAAI,IAAI,CAAC;IACT,oCAAoC;IACpC,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QACpC,IAAI,GAAG,YAAY,CAAC;KACrB;SAAM,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QAC3D,wDAAwD;QACxD,IAAI,eAAe,IAAI,YAAY,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC;SACnC;aAAM,IACL,QAAQ,IAAI,YAAY;YACxB,YAAY,CAAC,MAAM;YACnB,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EACvC;YACA,oEAAoE;YACpE,IAAI;gBACF,YAAY,CAAC,MAAM,CAAC,SAAS;oBAC7B,YAAY,CAAC,MAAM,CAAC,IAAI;oBACxB,YAAY,CAAC,MAAM,CAAC,IAAI;oBACxB,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;SAC9B;aAAM,IACL,WAAW,IAAI,YAAY;YAC3B,YAAY,CAAC,SAAS;YACtB,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ,EAC1C;YACA,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC;SAC/B;KACF;IAED,MAAM,UAAU,GAAG,IAAA,gCAAY,EAC7B,aAAa,CAAC,KAAK,CAAC,UAAU,EAC9B,aAAa,CAAC,KAAK,CAAC,WAAW,CAChC,CAAC;IAEF,IAAI,UAAU,CAAC;IACf,IAAI;QACF,UAAU,GAAG,IAAA,sCAAkB,EAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;KACjE;IAAC,MAAM;QACN,wDAAwD;QACxD,uCAAuC;QACvC,UAAU,GAAG,KAAsB,CAAC;KACrC;IAED,2CAA2C;IAC3C,MAAM,SAAS,GACb,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;QACrC,CAAC,CAAC,aAAa,CAAC,KAAK;QACrB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAE7C,+DAA+D;IAC/D,OAAO;QACL,GAAG,IAAA,uBAAe,EAAC,aAAa,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;QAChB,EAAE,EAAE,IAAI,IAAI,IAAA,SAAI,GAAE;QAClB,OAAO,EAAE,UAAU;QACnB,eAAe,EAAE,MAAM,IAAI,UAAU;QACrC,QAAQ,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3D,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,wCAAe,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAe,CAAC,IAAI;QAChE,MAAM,EAAE,0CAAiB,CAAC,SAAS;QACnC,IAAI;QACJ,MAAM,EAAE,MAAM;QACd,6DAA6D;QAC7D,QAAQ,EAAE,IAAI;QACd,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AA/EW,QAAA,sBAAsB,0BA+EjC;AAEK,MAAM,mBAAmB,GAAG,KAAK,EAAE,aAA4B,EAAE,EAAE;IACxE,IAAI,CAAC,2BAAO,CAAC,KAAK,EAAE,2BAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;QAC1E,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,QAAQ,CAAC,CAAC;QAC/C,QAAQ,CACN,+EAA+E,CAChF,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1C,UAAU,CAAC,OAAO,EAAE,6BAAiB,CAAC,CACvC,CAAC;QACF,MAAM,WAAW,CAAC;KACnB;AACH,CAAC,CAAC;AAXW,QAAA,mBAAmB,uBAW9B;AAEF;;;;;;GAMG;AACI,MAAM,+BAA+B,GAAG,KAAK,EAClD,eAAwB,EACxB,EAAE;IACF,IAAI,eAAe,EAAE;QACnB,MAAM,yBAAyB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAC1B,CAAC;QACF,MAAM,yBAAyB,CAAC;KACjC;AACH,CAAC,CAAC;AATW,QAAA,+BAA+B,mCAS1C;AAEF;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAC9B,aAIe,EACf,eAAgF,EAChF,EAAE;IACF,MAAM,KAAK,GAAG,IAAA,uCAAmB,EAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAElE,oFAAoF;IACpF,MAAM,eAAe,GACnB,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;QACrC,CAAC,CAAC,aAAa,CAAC,KAAK;QACrB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAE7C,gCAAgC;IAChC,OAAO,IAAA,sCAA8B,EACnC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAY,EAC3C,eAAe,EACf,KAAK,EACL,eAAe,CAAC,EAAE,CACnB,CAAC;AACJ,CAAC,CAAC;AAvBW,QAAA,gBAAgB,oBAuB3B;AAEK,MAAM,eAAe,GAAG,CAC7B,WAAoB,EACpB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAU,EACvC,EACE,YAAY,EACZ,oBAAoB,EACpB,GAAG,GACoE,EACjD,EAAE;IAC1B,MAAM,MAAM,GAAG;QACb,GAAG,KAAK;QACR,IAAI,EAAE,KAAK,CAAC,IAAqB;QACjC,EAAE,EAAE,KAAK,CAAC,EAAmB;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAsB;KACpC,CAAC;IACF,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,MAAM,CAAC;KACf;IAED,OAAO;QACL,GAAG,MAAM;QACT,GAAG,EAAE,IAAA,wBAAK,EAAC,GAAG,IAAI,CAAC,CAAC;QACpB,YAAY,EAAE,IAAA,wBAAK,EAAC,YAAY,IAAI,CAAC,CAAC;QACtC,oBAAoB,EAAE,IAAA,wBAAK,EAAC,oBAAoB,IAAI,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC,CAAC;AAzBW,QAAA,eAAe,mBAyB1B;AAEK,MAAM,4BAA4B,GAAG,KAAK,EAAE,EACjD,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,EACb,KAAK,EACL,aAAa,EAAE,EACb,KAAK,EAAE,EACL,OAAO,EAAE,EAAE,KAAK,EAAE,EAClB,WAAW,EACX,eAAe,GAChB,EACD,UAAU,EACV,aAAa,GACd,EACD,eAAe,GAAG,KAAK,EACvB,gBAAgB,GAWjB,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,WAAW,IAAI,eAAe,CAAC;IACjD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CACpC,wCAAwC,EACxC,KAAK,CAAC,IAAI,CACX,CAAC;IACF,IAAI,CAAC,eAAe,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;KACH;IACD,MAAM,UAAU,GAAG,IAAA,sCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CACpC,gDAAgD,EAChD,UAAU,CACX,CAAC;IAEF,wDAAwD;IACxD,6CAA6C;IAC7C,MAAM,WAAW,GAAG,eAAe,KAAK,IAAI,CAAC;IAC7C,MAAM,YAAY,GAAoC,EAAE,CAAC;IACzD,IAAI,aAAa,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAgB,EACpC,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,UAAU,EACV,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC9B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,UAAU;gBACd,CAAC,CAAC,wCAAe,CAAC,cAAc;gBAChC,CAAC,CAAC,wCAAe,CAAC,YAAY;YAChC,MAAM,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC;SAC7D,CAAC,CAAC;KACJ;IACD,IAAI,QAAQ,EAAE;QACZ,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAgB,EACpC,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,UAAU,EACV,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC9B,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,UAAU;gBACd,CAAC,CAAC,wCAAe,CAAC,cAAc;gBAChC,CAAC,CAAC,wCAAe,CAAC,YAAY;YAChC,MAAM,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;SACxD,CAAC,CAAC;KACJ;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAgB,EACpC,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,eAAe,EACf,UAAU,EACV,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC9B,CAAC;IACF,YAAY,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,wCAAe,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAe,CAAC,IAAI;QAChE,MAAM,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC;QACpD,gBAAgB,EAAE;YAChB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE;YAChD,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE;SACtD;KACF,CAAC,CAAC;IACH,MAAM,iBAAiB,GAEhB;QACL,WAAW;QACX,gBAAgB,EAAE,OAAO,CAAC,eAAe,CAAC;QAC1C,eAAe;QACf,eAAe;QACf,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,KAAK,CAAC,IAAqB;QACjC,YAAY;KACb,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAhHW,QAAA,4BAA4B,gCAgHvC;AAEK,MAAM,gCAAgC,GAAG,CAAC,EAC/C,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,YAAY,GAMb,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,YAAY,CAAC;IAC1E,MAAM,OAAO,GAGT;QACF,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,SAAS;KACrB,CAAC;IAEF,oEAAoE;IACpE,qFAAqF;IACrF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE;QACxD,qFAAqF;QACrF,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YAC7B,IAAI,EAAE,CAAC,OAAO,KAAK,OAAO,EAAE;gBAC1B,OAAO,KAAK,CAAC;aACd;YAED,wEAAwE;YACxE,uEAAuE;YACvE,MAAM,iBAAiB,GACrB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAC3C,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3C,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;YAEhC,IAAI,iBAAiB,EAAE;gBACrB,oEAAoE;gBACpE,+DAA+D;gBAC/D,IACE,MAAM,KAAK,wCAAe,CAAC,IAAI;oBAC/B,EAAE,CAAC,IAAI,KAAK,wCAAe,CAAC,KAAK,EACjC;oBACA,OAAO,IAAI,CAAC;iBACb;gBACD,sDAAsD;gBACtD,IACE,MAAM,KAAK,wCAAe,CAAC,YAAY;oBACvC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAC3B;oBACA,OAAO,IAAI,CAAC;iBACb;aACF;YAED,mDAAmD;YACnD,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE;YACV,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAyB,EAAE,CAAC;YACjE,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;YAC9D,OAAO,CACL,CAAC,wCAAe,CAAC,cAAc,EAAE,wCAAe,CAAC,YAAY,CAAC,CAAC,QAAQ,CACrE,MAAyB,CAC1B;gBACC,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,WAAW,CAChB,GAAG,SAAS,CAAC;SACf;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAxEW,QAAA,gCAAgC,oCAwE3C","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToCaip,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport { createClientTransactionRequest } from './snaps';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { APPROVAL_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messenger: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messenger.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount?.amount ?? '0') && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (quoteResponse: QuoteResponse) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = '0x1' as `0x${string}`; // Default to mainnet\n }\n\n return {\n destinationChainId,\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n // chainId is now excluded from this function and handled by the caller\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<\n QuoteResponse<string | { unsignedPsbtBase64: string }>,\n 'approval'\n > &\n QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n // TODO: Fix chain ID activity list handling for Bitcoin\n // Fallback to Ethereum mainnet for now\n hexChainId = '0x1' as `0x${string}`;\n }\n\n // Extract the transaction data for storage\n const tradeData =\n typeof quoteResponse.trade === 'string'\n ? quoteResponse.trade\n : quoteResponse.trade.unsignedPsbtBase64;\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\nexport const handleApprovalDelay = async (quoteResponse: QuoteResponse) => {\n if ([ChainId.LINEA, ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea and Base confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n quoteResponse: Omit<\n QuoteResponse<string | { unsignedPsbtBase64: string }>,\n 'approval'\n > &\n QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const scope = formatChainIdToCaip(quoteResponse.quote.srcChainId);\n\n // Extract the transaction data - Bitcoin uses unsignedPsbtBase64, others use string\n const transactionData =\n typeof quoteResponse.trade === 'string'\n ? quoteResponse.trade\n : quoteResponse.trade.unsignedPsbtBase64;\n\n // Use the new unified interface\n return createClientTransactionRequest(\n selectedAccount.metadata.snap?.id as string,\n transactionData,\n scope,\n selectedAccount.id,\n );\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messenger,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messenger: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> &\n Partial<QuoteMetadata>;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messenger,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messenger: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messenger.call('TransactionController:getState').transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
1
+ {"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToCaip,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n extractTradeData,\n isTronTrade,\n type Trade,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport { createClientTransactionRequest } from './snaps';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { APPROVAL_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messenger: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messenger.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount?.amount ?? '0') && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (quoteResponse: QuoteResponse) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'\n> => {\n // Handle destination chain ID - should always be convertible for EVM destinations\n let destinationChainId;\n try {\n destinationChainId = formatChainIdToHex(quoteResponse.quote.destChainId);\n } catch {\n // Fallback for non-EVM destination (shouldn't happen for BTC->EVM)\n destinationChainId = '0x1' as `0x${string}`; // Default to mainnet\n }\n\n return {\n destinationChainId,\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n // chainId is now excluded from this function and handled by the caller\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\n/**\n * Handles the response from non-EVM transaction submission\n * Works with the new unified ClientRequest:signAndSendTransaction interface\n * Supports Solana, Bitcoin, and other non-EVM chains\n *\n * @param snapResponse - The response from the snap after transaction submission\n * @param quoteResponse - The quote response containing trade details and metadata\n * @param selectedAccount - The selected account information\n * @returns The transaction metadata including non-EVM specific fields\n */\nexport const handleNonEvmTxResponse = (\n snapResponse:\n | string\n | { transactionId: string } // New unified interface response\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<Trade>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // Check for new unified interface response format first\n if ('transactionId' in snapResponse && snapResponse.transactionId) {\n hash = snapResponse.transactionId;\n } else if (\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n } else if (\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n let hexChainId;\n try {\n hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n } catch {\n // TODO: Fix chain ID activity list handling for Bitcoin\n // Fallback to Ethereum mainnet for now\n hexChainId = '0x1' as `0x${string}`;\n }\n\n // Extract the transaction data for storage\n const tradeData = extractTradeData(quoteResponse.trade);\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: tradeData },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit flag to mark this as a non-EVM transaction\n isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains\n isBridgeTx,\n };\n};\n\nexport const handleApprovalDelay = async (quoteResponse: QuoteResponse) => {\n if ([ChainId.LINEA, ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea and Base confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\n/**\n * Creates a request to sign and send a transaction for non-EVM chains\n * Uses the new unified ClientRequest:signAndSendTransaction interface\n *\n * @param trade - The trade data\n * @param srcChainId - The source chain ID\n * @param selectedAccount - The selected account information\n * @returns The snap request object for signing and sending transaction\n */\nexport const getClientRequest = (\n trade: Trade,\n srcChainId: number,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const scope = formatChainIdToCaip(srcChainId);\n\n const transactionData = extractTradeData(trade);\n\n // Tron trades need the visible flag and contract type to be included in the request options\n const options = isTronTrade(trade)\n ? {\n visible: trade.visible,\n type: trade.raw_data?.contract?.[0]?.type,\n }\n : undefined;\n\n // Use the new unified interface\n return createClientTransactionRequest(\n selectedAccount.metadata.snap?.id as string,\n transactionData,\n scope,\n selectedAccount.id,\n options,\n );\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messenger,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n gasSponsored,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messenger: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> &\n Partial<QuoteMetadata>;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messenger,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n isGasFeeSponsored: Boolean(gasSponsored),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messenger,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messenger: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messenger.call('TransactionController:getState').transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { AccountsControllerState } from "@metamask/accounts-controller";
2
2
  import type { TxData } from "@metamask/bridge-controller";
3
3
  import { type QuoteMetadata, type QuoteResponse } from "@metamask/bridge-controller";
4
+ import { type Trade } from "@metamask/bridge-controller";
4
5
  import type { BatchTransactionParams, TransactionController } from "@metamask/transaction-controller";
5
6
  import { TransactionType, type TransactionMeta } from "@metamask/transaction-controller";
6
7
  import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.cjs";
@@ -13,6 +14,34 @@ export declare const getUSDTAllowanceResetTx: (messenger: BridgeStatusController
13
14
  value: string;
14
15
  gasLimit: number | null;
15
16
  effectiveGas?: number | undefined;
17
+ } | {
18
+ data: string;
19
+ chainId: number;
20
+ to: string;
21
+ from: string;
22
+ value: string;
23
+ gasLimit: number | null;
24
+ effectiveGas?: number | undefined;
25
+ raw_data_hex: string;
26
+ visible?: boolean | undefined;
27
+ raw_data?: {
28
+ contract?: {
29
+ type?: string | undefined;
30
+ }[] | undefined;
31
+ } | null | undefined;
32
+ } | {
33
+ data: string;
34
+ raw_data_hex: string;
35
+ visible?: boolean | undefined;
36
+ raw_data?: ({
37
+ contract?: {
38
+ type?: string | undefined;
39
+ }[] | undefined;
40
+ } & {
41
+ contract?: {
42
+ type?: string | undefined;
43
+ }[] | undefined;
44
+ }) | null | undefined;
16
45
  } | undefined>;
17
46
  export declare const getStatusRequestParams: (quoteResponse: QuoteResponse) => {
18
47
  bridgeId: string;
@@ -155,7 +184,7 @@ export declare const getStatusRequestParams: (quoteResponse: QuoteResponse) => {
155
184
  };
156
185
  refuel: boolean;
157
186
  };
158
- export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
187
+ export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
159
188
  /**
160
189
  * Handles the response from non-EVM transaction submission
161
190
  * Works with the new unified ClientRequest:signAndSendTransaction interface
@@ -172,9 +201,7 @@ export declare const handleNonEvmTxResponse: (snapResponse: string | {
172
201
  result: Record<string, string>;
173
202
  } | {
174
203
  signature: string;
175
- }, quoteResponse: Omit<QuoteResponse<string | {
176
- unsignedPsbtBase64: string;
177
- }>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
204
+ }, quoteResponse: Omit<QuoteResponse<Trade>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
178
205
  export declare const handleApprovalDelay: (quoteResponse: QuoteResponse) => Promise<void>;
179
206
  /**
180
207
  * Adds a delay for hardware wallet transactions on mobile to fix an issue
@@ -188,13 +215,12 @@ export declare const handleMobileHardwareWalletDelay: (requireApproval: boolean)
188
215
  * Creates a request to sign and send a transaction for non-EVM chains
189
216
  * Uses the new unified ClientRequest:signAndSendTransaction interface
190
217
  *
191
- * @param quoteResponse - The quote response containing trade details and metadata
218
+ * @param trade - The trade data
219
+ * @param srcChainId - The source chain ID
192
220
  * @param selectedAccount - The selected account information
193
221
  * @returns The snap request object for signing and sending transaction
194
222
  */
195
- export declare const getClientRequest: (quoteResponse: Omit<QuoteResponse<string | {
196
- unsignedPsbtBase64: string;
197
- }>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
223
+ export declare const getClientRequest: (trade: Trade, srcChainId: number, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
198
224
  snapId: never;
199
225
  origin: string;
200
226
  handler: never;
@@ -215,7 +241,7 @@ export declare const toBatchTxParams: (disable7702: boolean, { chainId, gasLimit
215
241
  maxPriorityFeePerGas?: string | undefined;
216
242
  gas?: string | undefined;
217
243
  }) => BatchTransactionParams;
218
- export declare const getAddTransactionBatchParams: ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, }, sentAmount, toTokenAmount, }, requireApproval, estimateGasFeeFn, }: {
244
+ export declare const getAddTransactionBatchParams: ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, gasSponsored, }, sentAmount, toTokenAmount, }, requireApproval, estimateGasFeeFn, }: {
219
245
  messenger: BridgeStatusControllerMessenger;
220
246
  isBridgeTx: boolean;
221
247
  trade: TxData;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAS1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,8DAEnB,aAAa,GAAG,QAAQ,aAAa,CAAC;;;;;;;;cAqBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAAmB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASlE,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KACb,cAAc,MAAM,GAAG;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,UAAU,CACX,GACC,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAmEpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBAAyB,aAAa,kBAWrE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,kBACZ,KACb,cAAc,MAAM,GAAG;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,UAAU,CACX,GACC,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;CAiBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAmB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GACtD,QAAQ,aAAa,CAAC;sBACN,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAyFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhB,CAAC"}
1
+ {"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AACrC,OAAO,EAGL,KAAK,KAAK,EACX,oCAAoC;AAErC,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAS1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,8DAEnB,aAAa,GAAG,QAAQ,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAAmB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASlE,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACpE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACpD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAgEpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBAAyB,aAAa,kBAWrE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,UACpB,KAAK,cACA,MAAM,mBACD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;CAsBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAoB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GACtD,QAAQ,aAAa,CAAC;sBACN,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFA0FxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { AccountsControllerState } from "@metamask/accounts-controller";
2
2
  import type { TxData } from "@metamask/bridge-controller";
3
3
  import { type QuoteMetadata, type QuoteResponse } from "@metamask/bridge-controller";
4
+ import { type Trade } from "@metamask/bridge-controller";
4
5
  import type { BatchTransactionParams, TransactionController } from "@metamask/transaction-controller";
5
6
  import { TransactionType, type TransactionMeta } from "@metamask/transaction-controller";
6
7
  import type { BridgeStatusControllerMessenger, SolanaTransactionMeta } from "../types.mjs";
@@ -13,6 +14,34 @@ export declare const getUSDTAllowanceResetTx: (messenger: BridgeStatusController
13
14
  value: string;
14
15
  gasLimit: number | null;
15
16
  effectiveGas?: number | undefined;
17
+ } | {
18
+ data: string;
19
+ chainId: number;
20
+ to: string;
21
+ from: string;
22
+ value: string;
23
+ gasLimit: number | null;
24
+ effectiveGas?: number | undefined;
25
+ raw_data_hex: string;
26
+ visible?: boolean | undefined;
27
+ raw_data?: {
28
+ contract?: {
29
+ type?: string | undefined;
30
+ }[] | undefined;
31
+ } | null | undefined;
32
+ } | {
33
+ data: string;
34
+ raw_data_hex: string;
35
+ visible?: boolean | undefined;
36
+ raw_data?: ({
37
+ contract?: {
38
+ type?: string | undefined;
39
+ }[] | undefined;
40
+ } & {
41
+ contract?: {
42
+ type?: string | undefined;
43
+ }[] | undefined;
44
+ }) | null | undefined;
16
45
  } | undefined>;
17
46
  export declare const getStatusRequestParams: (quoteResponse: QuoteResponse) => {
18
47
  bridgeId: string;
@@ -155,7 +184,7 @@ export declare const getStatusRequestParams: (quoteResponse: QuoteResponse) => {
155
184
  };
156
185
  refuel: boolean;
157
186
  };
158
- export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
187
+ export declare const getTxMetaFields: (quoteResponse: Omit<QuoteResponse<Trade, Trade>, 'approval' | 'trade'> & QuoteMetadata, approvalTxId?: string) => Omit<TransactionMeta, 'networkClientId' | 'status' | 'time' | 'txParams' | 'id' | 'chainId'>;
159
188
  /**
160
189
  * Handles the response from non-EVM transaction submission
161
190
  * Works with the new unified ClientRequest:signAndSendTransaction interface
@@ -172,9 +201,7 @@ export declare const handleNonEvmTxResponse: (snapResponse: string | {
172
201
  result: Record<string, string>;
173
202
  } | {
174
203
  signature: string;
175
- }, quoteResponse: Omit<QuoteResponse<string | {
176
- unsignedPsbtBase64: string;
177
- }>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
204
+ }, quoteResponse: Omit<QuoteResponse<Trade>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
178
205
  export declare const handleApprovalDelay: (quoteResponse: QuoteResponse) => Promise<void>;
179
206
  /**
180
207
  * Adds a delay for hardware wallet transactions on mobile to fix an issue
@@ -188,13 +215,12 @@ export declare const handleMobileHardwareWalletDelay: (requireApproval: boolean)
188
215
  * Creates a request to sign and send a transaction for non-EVM chains
189
216
  * Uses the new unified ClientRequest:signAndSendTransaction interface
190
217
  *
191
- * @param quoteResponse - The quote response containing trade details and metadata
218
+ * @param trade - The trade data
219
+ * @param srcChainId - The source chain ID
192
220
  * @param selectedAccount - The selected account information
193
221
  * @returns The snap request object for signing and sending transaction
194
222
  */
195
- export declare const getClientRequest: (quoteResponse: Omit<QuoteResponse<string | {
196
- unsignedPsbtBase64: string;
197
- }>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
223
+ export declare const getClientRequest: (trade: Trade, srcChainId: number, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
198
224
  snapId: never;
199
225
  origin: string;
200
226
  handler: never;
@@ -215,7 +241,7 @@ export declare const toBatchTxParams: (disable7702: boolean, { chainId, gasLimit
215
241
  maxPriorityFeePerGas?: string | undefined;
216
242
  gas?: string | undefined;
217
243
  }) => BatchTransactionParams;
218
- export declare const getAddTransactionBatchParams: ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, }, sentAmount, toTokenAmount, }, requireApproval, estimateGasFeeFn, }: {
244
+ export declare const getAddTransactionBatchParams: ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, gasSponsored, }, sentAmount, toTokenAmount, }, requireApproval, estimateGasFeeFn, }: {
219
245
  messenger: BridgeStatusControllerMessenger;
220
246
  isBridgeTx: boolean;
221
247
  trade: TxData;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAS1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,8DAEnB,aAAa,GAAG,QAAQ,aAAa,CAAC;;;;;;;;cAqBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAAmB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASlE,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KACb,cAAc,MAAM,GAAG;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,UAAU,CACX,GACC,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAmEpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBAAyB,aAAa,kBAWrE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,kBACZ,KACb,cAAc,MAAM,GAAG;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,UAAU,CACX,GACC,aAAa,mBACE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;CAiBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAmB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GACtD,QAAQ,aAAa,CAAC;sBACN,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAyFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhB,CAAC"}
1
+ {"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AACrC,OAAO,EAGL,KAAK,KAAK,EACX,oCAAoC;AAErC,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAS1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,8DAEnB,aAAa,GAAG,QAAQ,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqBtD,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAAmB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASlE,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACpE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CA4BtE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACpD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAgEpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBAAyB,aAAa,kBAWrE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,UACpB,KAAK,cACA,MAAM,mBACD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;CAsBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAoB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GACtD,QAAQ,aAAa,CAAC;sBACN,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFA0FxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { ChainId, formatChainIdToCaip, formatChainIdToHex, getEthUsdtResetData, isCrossChain, isEthUsdt } from "@metamask/bridge-controller";
2
+ import { extractTradeData, isTronTrade } from "@metamask/bridge-controller";
2
3
  import { toHex } from "@metamask/controller-utils";
3
4
  import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
4
5
  import { createProjectLogger } from "@metamask/utils";
@@ -106,9 +107,7 @@ export const handleNonEvmTxResponse = (snapResponse, quoteResponse, selectedAcco
106
107
  hexChainId = '0x1';
107
108
  }
108
109
  // Extract the transaction data for storage
109
- const tradeData = typeof quoteResponse.trade === 'string'
110
- ? quoteResponse.trade
111
- : quoteResponse.trade.unsignedPsbtBase64;
110
+ const tradeData = extractTradeData(quoteResponse.trade);
112
111
  // Create a transaction meta object with bridge-specific fields
113
112
  return {
114
113
  ...getTxMetaFields(quoteResponse),
@@ -119,10 +118,10 @@ export const handleNonEvmTxResponse = (snapResponse, quoteResponse, selectedAcco
119
118
  txParams: { from: selectedAccountAddress, data: tradeData },
120
119
  type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,
121
120
  status: TransactionStatus.submitted,
122
- hash,
121
+ hash, // Add the transaction signature as hash
123
122
  origin: snapId,
124
123
  // Add an explicit flag to mark this as a non-EVM transaction
125
- isSolana: true,
124
+ isSolana: true, // TODO deprecate this and use chainId to detect non-EVM chains
126
125
  isBridgeTx,
127
126
  };
128
127
  };
@@ -151,18 +150,23 @@ export const handleMobileHardwareWalletDelay = async (requireApproval) => {
151
150
  * Creates a request to sign and send a transaction for non-EVM chains
152
151
  * Uses the new unified ClientRequest:signAndSendTransaction interface
153
152
  *
154
- * @param quoteResponse - The quote response containing trade details and metadata
153
+ * @param trade - The trade data
154
+ * @param srcChainId - The source chain ID
155
155
  * @param selectedAccount - The selected account information
156
156
  * @returns The snap request object for signing and sending transaction
157
157
  */
158
- export const getClientRequest = (quoteResponse, selectedAccount) => {
159
- const scope = formatChainIdToCaip(quoteResponse.quote.srcChainId);
160
- // Extract the transaction data - Bitcoin uses unsignedPsbtBase64, others use string
161
- const transactionData = typeof quoteResponse.trade === 'string'
162
- ? quoteResponse.trade
163
- : quoteResponse.trade.unsignedPsbtBase64;
158
+ export const getClientRequest = (trade, srcChainId, selectedAccount) => {
159
+ const scope = formatChainIdToCaip(srcChainId);
160
+ const transactionData = extractTradeData(trade);
161
+ // Tron trades need the visible flag and contract type to be included in the request options
162
+ const options = isTronTrade(trade)
163
+ ? {
164
+ visible: trade.visible,
165
+ type: trade.raw_data?.contract?.[0]?.type,
166
+ }
167
+ : undefined;
164
168
  // Use the new unified interface
165
- return createClientTransactionRequest(selectedAccount.metadata.snap?.id, transactionData, scope, selectedAccount.id);
169
+ return createClientTransactionRequest(selectedAccount.metadata.snap?.id, transactionData, scope, selectedAccount.id, options);
166
170
  };
167
171
  export const toBatchTxParams = (disable7702, { chainId, gasLimit, ...trade }, { maxFeePerGas, maxPriorityFeePerGas, gas, }) => {
168
172
  const params = {
@@ -181,7 +185,7 @@ export const toBatchTxParams = (disable7702, { chainId, gasLimit, ...trade }, {
181
185
  maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),
182
186
  };
183
187
  };
184
- export const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, }, sentAmount, toTokenAmount, }, requireApproval = false, estimateGasFeeFn, }) => {
188
+ export const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, approval, resetApproval, trade, quoteResponse: { quote: { feeData: { txFee }, gasIncluded, gasIncluded7702, gasSponsored, }, sentAmount, toTokenAmount, }, requireApproval = false, estimateGasFeeFn, }) => {
185
189
  const isGasless = gasIncluded || gasIncluded7702;
186
190
  const selectedAccount = messenger.call('AccountsController:getAccountByAddress', trade.from);
187
191
  if (!selectedAccount) {
@@ -223,6 +227,7 @@ export const getAddTransactionBatchParams = async ({ messenger, isBridgeTx, appr
223
227
  const transactionParams = {
224
228
  disable7702,
225
229
  isGasFeeIncluded: Boolean(gasIncluded7702),
230
+ isGasFeeSponsored: Boolean(gasSponsored),
226
231
  networkClientId,
227
232
  requireApproval,
228
233
  origin: 'metamask',