@metamask/bridge-status-controller 38.0.0 → 38.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/dist/bridge-status-controller.cjs +6 -1
  3. package/dist/bridge-status-controller.cjs.map +1 -1
  4. package/dist/bridge-status-controller.d.cts.map +1 -1
  5. package/dist/bridge-status-controller.d.mts.map +1 -1
  6. package/dist/bridge-status-controller.mjs +7 -2
  7. package/dist/bridge-status-controller.mjs.map +1 -1
  8. package/dist/types.cjs.map +1 -1
  9. package/dist/types.d.cts +2 -1
  10. package/dist/types.d.cts.map +1 -1
  11. package/dist/types.d.mts +2 -1
  12. package/dist/types.d.mts.map +1 -1
  13. package/dist/types.mjs.map +1 -1
  14. package/dist/utils/gas.cjs +31 -1
  15. package/dist/utils/gas.cjs.map +1 -1
  16. package/dist/utils/gas.d.cts +13 -3
  17. package/dist/utils/gas.d.cts.map +1 -1
  18. package/dist/utils/gas.d.mts +13 -3
  19. package/dist/utils/gas.d.mts.map +1 -1
  20. package/dist/utils/gas.mjs +29 -0
  21. package/dist/utils/gas.mjs.map +1 -1
  22. package/dist/utils/metrics.cjs +37 -8
  23. package/dist/utils/metrics.cjs.map +1 -1
  24. package/dist/utils/metrics.d.cts +13 -5
  25. package/dist/utils/metrics.d.cts.map +1 -1
  26. package/dist/utils/metrics.d.mts +13 -5
  27. package/dist/utils/metrics.d.mts.map +1 -1
  28. package/dist/utils/metrics.mjs +37 -8
  29. package/dist/utils/metrics.mjs.map +1 -1
  30. package/dist/utils/swap-received-amount.cjs +96 -0
  31. package/dist/utils/swap-received-amount.cjs.map +1 -0
  32. package/dist/utils/swap-received-amount.d.cts +25 -0
  33. package/dist/utils/swap-received-amount.d.cts.map +1 -0
  34. package/dist/utils/swap-received-amount.d.mts +25 -0
  35. package/dist/utils/swap-received-amount.d.mts.map +1 -0
  36. package/dist/utils/swap-received-amount.mjs +91 -0
  37. package/dist/utils/swap-received-amount.mjs.map +1 -0
  38. package/dist/utils/transaction.cjs +15 -1
  39. package/dist/utils/transaction.cjs.map +1 -1
  40. package/dist/utils/transaction.d.cts +8 -0
  41. package/dist/utils/transaction.d.cts.map +1 -1
  42. package/dist/utils/transaction.d.mts +8 -0
  43. package/dist/utils/transaction.d.mts.map +1 -1
  44. package/dist/utils/transaction.mjs +13 -0
  45. package/dist/utils/transaction.mjs.map +1 -1
  46. package/dist/utils/validators.cjs +1 -1
  47. package/dist/utils/validators.cjs.map +1 -1
  48. package/dist/utils/validators.d.cts +18 -6
  49. package/dist/utils/validators.d.cts.map +1 -1
  50. package/dist/utils/validators.d.mts +18 -6
  51. package/dist/utils/validators.d.mts.map +1 -1
  52. package/dist/utils/validators.mjs +2 -2
  53. package/dist/utils/validators.mjs.map +1 -1
  54. package/package.json +4 -4
@@ -0,0 +1,25 @@
1
+ import type { TokenAmountValues } from "@metamask/bridge-controller";
2
+ import { type TransactionMeta } from "@metamask/transaction-controller";
3
+ import { BigNumber } from "bignumber.js";
4
+ import type { BridgeHistoryItem } from "../types.mjs";
5
+ /**
6
+ * Calculate the amount received after a swap transaction based on the txMeta
7
+ *
8
+ * @param historyItem - The bridge history item
9
+ * @param actualGas - The actual gas used for the transaction
10
+ * @param txMeta - The transaction meta from the TransactionController
11
+ * @returns The actual amount received for the swap transaction
12
+ */
13
+ export declare const getActualSwapReceivedAmount: (historyItem: BridgeHistoryItem, actualGas: Omit<TokenAmountValues, 'valueInCurrency'> | null, txMeta?: TransactionMeta) => {
14
+ amount: string | BigNumber | null;
15
+ usd: BigNumber | null;
16
+ } | null;
17
+ /**
18
+ * Calculate the amount received after a bridge transaction based on the getTxStatus's
19
+ * amount field
20
+ *
21
+ * @param historyItem - The bridge history item
22
+ * @returns The actual amount received for the bridge transaction
23
+ */
24
+ export declare const getActualBridgeReceivedAmount: (historyItem: BridgeHistoryItem) => Omit<TokenAmountValues, 'valueInCurrency'> | null;
25
+ //# sourceMappingURL=swap-received-amount.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap-received-amount.d.mts","sourceRoot":"","sources":["../../src/utils/swap-received-amount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAoC;AAErE,OAAO,EAAE,KAAK,eAAe,EAAE,yCAAyC;AACxE,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAiElD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,gBACzB,iBAAiB,aACnB,KAAK,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAAI,WACnD,eAAe;;;QA6BzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,gBAC3B,iBAAiB,KAC7B,KAAK,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,IAc/C,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { isNativeAddress } from "@metamask/bridge-controller";
2
+ import { BigNumber } from "bignumber.js";
3
+ const getReceivedNativeAmount = (historyItem, actualGas, txMeta) => {
4
+ const { preTxBalance, postTxBalance } = txMeta;
5
+ if (!preTxBalance || !postTxBalance || preTxBalance === postTxBalance) {
6
+ // If preTxBalance and postTxBalance are equal, postTxBalance hasn't been updated on time
7
+ // because of the RPC provider delay, so we return an estimated receiving amount instead.
8
+ return new BigNumber(historyItem.quote.destTokenAmount)
9
+ .div(new BigNumber(10).pow(historyItem.quote.destAsset.decimals))
10
+ .toString(10);
11
+ }
12
+ return actualGas && postTxBalance && preTxBalance
13
+ ? new BigNumber(postTxBalance, 16)
14
+ .minus(preTxBalance, 16)
15
+ .minus(actualGas.amount)
16
+ .div(10 ** historyItem.quote.destAsset.decimals)
17
+ : null;
18
+ };
19
+ const getReceivedERC20Amount = (historyItem, txMeta) => {
20
+ const { txReceipt } = txMeta;
21
+ if (!txReceipt || !txReceipt.logs || txReceipt.status === '0x0') {
22
+ return null;
23
+ }
24
+ const { account: accountAddress, quote } = historyItem;
25
+ const TOKEN_TRANSFER_LOG_TOPIC_HASH = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
26
+ const tokenTransferLog = txReceipt.logs.find((txReceiptLog) => {
27
+ const isTokenTransfer = txReceiptLog.topics &&
28
+ txReceiptLog.topics[0].startsWith(TOKEN_TRANSFER_LOG_TOPIC_HASH);
29
+ const isTransferFromGivenToken = txReceiptLog.address?.toLowerCase() ===
30
+ quote.destAsset.address?.toLowerCase();
31
+ const isTransferFromGivenAddress = txReceiptLog.topics &&
32
+ txReceiptLog.topics[2] &&
33
+ (txReceiptLog.topics[2] === accountAddress ||
34
+ txReceiptLog.topics[2].match(accountAddress?.slice(2)));
35
+ return (isTokenTransfer && isTransferFromGivenToken && isTransferFromGivenAddress);
36
+ });
37
+ if (tokenTransferLog?.data) {
38
+ return new BigNumber(tokenTransferLog.data, 16).div(new BigNumber(10).pow(quote.destAsset.decimals));
39
+ }
40
+ return null;
41
+ };
42
+ /**
43
+ * Calculate the amount received after a swap transaction based on the txMeta
44
+ *
45
+ * @param historyItem - The bridge history item
46
+ * @param actualGas - The actual gas used for the transaction
47
+ * @param txMeta - The transaction meta from the TransactionController
48
+ * @returns The actual amount received for the swap transaction
49
+ */
50
+ export const getActualSwapReceivedAmount = (historyItem, actualGas, txMeta) => {
51
+ const { pricingData } = historyItem;
52
+ const quotedReturnAmount = historyItem.quote.destTokenAmount;
53
+ if (!txMeta?.txReceipt) {
54
+ return null;
55
+ }
56
+ const actualReturnAmount = isNativeAddress(historyItem.quote.destAsset.address)
57
+ ? getReceivedNativeAmount(historyItem, actualGas, txMeta)
58
+ : getReceivedERC20Amount(historyItem, txMeta);
59
+ const returnUsdExchangeRate = pricingData?.quotedReturnInUsd && quotedReturnAmount
60
+ ? new BigNumber(pricingData.quotedReturnInUsd)
61
+ .div(quotedReturnAmount)
62
+ .multipliedBy(10 ** historyItem.quote.destAsset.decimals)
63
+ : null;
64
+ return {
65
+ amount: actualReturnAmount,
66
+ usd: actualReturnAmount && returnUsdExchangeRate
67
+ ? returnUsdExchangeRate.multipliedBy(actualReturnAmount)
68
+ : null,
69
+ };
70
+ };
71
+ /**
72
+ * Calculate the amount received after a bridge transaction based on the getTxStatus's
73
+ * amount field
74
+ *
75
+ * @param historyItem - The bridge history item
76
+ * @returns The actual amount received for the bridge transaction
77
+ */
78
+ export const getActualBridgeReceivedAmount = (historyItem) => {
79
+ const { quote, pricingData, status } = historyItem;
80
+ const usdExchangeRate = pricingData?.quotedReturnInUsd
81
+ ? new BigNumber(pricingData.quotedReturnInUsd).div(quote.destTokenAmount)
82
+ : null;
83
+ const actualAmount = status.destChain?.amount;
84
+ return actualAmount && usdExchangeRate
85
+ ? {
86
+ amount: actualAmount,
87
+ usd: usdExchangeRate.multipliedBy(actualAmount).toString(10),
88
+ }
89
+ : null;
90
+ };
91
+ //# sourceMappingURL=swap-received-amount.mjs.map
@@ -0,0 +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,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findAndUpdateTransactionsInBatch = exports.getAddTransactionBatchParams = exports.toBatchTxParams = exports.getClientRequest = exports.handleLineaDelay = exports.handleSolanaTxResponse = exports.getTxMetaFields = exports.getStatusRequestParams = exports.getUSDTAllowanceResetTx = exports.generateActionId = void 0;
3
+ exports.findAndUpdateTransactionsInBatch = exports.getAddTransactionBatchParams = exports.toBatchTxParams = exports.getClientRequest = exports.handleMobileHardwareWalletDelay = exports.handleLineaDelay = exports.handleSolanaTxResponse = exports.getTxMetaFields = exports.getStatusRequestParams = exports.getUSDTAllowanceResetTx = exports.generateActionId = void 0;
4
4
  const bridge_controller_1 = require("@metamask/bridge-controller");
5
5
  const controller_utils_1 = require("@metamask/controller-utils");
6
6
  const keyring_api_1 = require("@metamask/keyring-api");
@@ -111,6 +111,20 @@ const handleLineaDelay = async (quoteResponse) => {
111
111
  }
112
112
  };
113
113
  exports.handleLineaDelay = handleLineaDelay;
114
+ /**
115
+ * Adds a delay for hardware wallet transactions on mobile to fix an issue
116
+ * where the Ledger does not get prompted for the 2nd approval.
117
+ * Extension does not have this issue.
118
+ *
119
+ * @param requireApproval - Whether the delay should be applied
120
+ */
121
+ const handleMobileHardwareWalletDelay = async (requireApproval) => {
122
+ if (requireApproval) {
123
+ const mobileHardwareWalletDelay = new Promise((resolve) => setTimeout(resolve, 1000));
124
+ await mobileHardwareWalletDelay;
125
+ }
126
+ };
127
+ exports.handleMobileHardwareWalletDelay = handleMobileHardwareWalletDelay;
114
128
  const getClientRequest = (quoteResponse, selectedAccount) => {
115
129
  const clientReqId = (0, uuid_1.v4)();
116
130
  return {
@@ -1 +1 @@
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 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 { SolScope } from '@metamask/keyring-api';\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 type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_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 messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & 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 messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\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'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\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: formatChainIdToHex(quoteResponse.quote.srcChainId),\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\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, '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 // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\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 }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\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 bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\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 messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const selectedAccount = messagingSystem.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 = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // 7702 enables gasless txs for smart accounts, so we disable it for now\n const disable7702 = true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 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 messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).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 const txMeta = txs.find(\n (tx) => tx.batchId === batchId && tx.txParams.data === txData,\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 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 { SolScope } from '@metamask/keyring-api';\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 type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_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 messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & 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 messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\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'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\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: formatChainIdToHex(quoteResponse.quote.srcChainId),\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\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, '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 // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\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 }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\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 bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_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\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\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 messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const selectedAccount = messagingSystem.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 = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // 7702 enables gasless txs for smart accounts, so we disable it for now\n const disable7702 = true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 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 messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).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 const txMeta = txs.find(\n (tx) => tx.batchId === batchId && tx.txParams.data === txData,\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"]}
@@ -159,6 +159,14 @@ export declare const handleSolanaTxResponse: (snapResponse: string | {
159
159
  signature: string;
160
160
  }, quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
161
161
  export declare const handleLineaDelay: (quoteResponse: QuoteResponse<TxData | string>) => Promise<void>;
162
+ /**
163
+ * Adds a delay for hardware wallet transactions on mobile to fix an issue
164
+ * where the Ledger does not get prompted for the 2nd approval.
165
+ * Extension does not have this issue.
166
+ *
167
+ * @param requireApproval - Whether the delay should be applied
168
+ */
169
+ export declare const handleMobileHardwareWalletDelay: (requireApproval: boolean) => Promise<void>;
162
170
  export declare const getClientRequest: (quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
163
171
  origin: string;
164
172
  snapId: never;
@@ -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,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,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,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAkB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAsFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkChB,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,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,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,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAkB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAsFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkChB,CAAC"}
@@ -159,6 +159,14 @@ export declare const handleSolanaTxResponse: (snapResponse: string | {
159
159
  signature: string;
160
160
  }, quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
161
161
  export declare const handleLineaDelay: (quoteResponse: QuoteResponse<TxData | string>) => Promise<void>;
162
+ /**
163
+ * Adds a delay for hardware wallet transactions on mobile to fix an issue
164
+ * where the Ledger does not get prompted for the 2nd approval.
165
+ * Extension does not have this issue.
166
+ *
167
+ * @param requireApproval - Whether the delay should be applied
168
+ */
169
+ export declare const handleMobileHardwareWalletDelay: (requireApproval: boolean) => Promise<void>;
162
170
  export declare const getClientRequest: (quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => {
163
171
  origin: string;
164
172
  snapId: never;
@@ -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,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,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,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAkB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAsFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkChB,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,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,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,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAkB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAsFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkChB,CAAC"}
@@ -102,6 +102,19 @@ export const handleLineaDelay = async (quoteResponse) => {
102
102
  await waitPromise;
103
103
  }
104
104
  };
105
+ /**
106
+ * Adds a delay for hardware wallet transactions on mobile to fix an issue
107
+ * where the Ledger does not get prompted for the 2nd approval.
108
+ * Extension does not have this issue.
109
+ *
110
+ * @param requireApproval - Whether the delay should be applied
111
+ */
112
+ export const handleMobileHardwareWalletDelay = async (requireApproval) => {
113
+ if (requireApproval) {
114
+ const mobileHardwareWalletDelay = new Promise((resolve) => setTimeout(resolve, 1000));
115
+ await mobileHardwareWalletDelay;
116
+ }
117
+ };
105
118
  export const getClientRequest = (quoteResponse, selectedAccount) => {
106
119
  const clientReqId = uuid();
107
120
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.mjs","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 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 { SolScope } from '@metamask/keyring-api';\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 type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_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 messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & 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 messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\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'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\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: formatChainIdToHex(quoteResponse.quote.srcChainId),\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\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, '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 // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\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 }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\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 bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\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 messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const selectedAccount = messagingSystem.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 = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // 7702 enables gasless txs for smart accounts, so we disable it for now\n const disable7702 = true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 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 messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).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 const txMeta = txs.find(\n (tx) => tx.batchId === batchId && tx.txParams.data === txData,\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.mjs","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 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 { SolScope } from '@metamask/keyring-api';\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 type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_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 messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & 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 messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\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'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\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: formatChainIdToHex(quoteResponse.quote.srcChainId),\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\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, '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 // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\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 }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\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 bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_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\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\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 messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const selectedAccount = messagingSystem.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 = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // 7702 enables gasless txs for smart accounts, so we disable it for now\n const disable7702 = true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n gasIncluded ? 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 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 messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).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 const txMeta = txs.find(\n (tx) => tx.batchId === batchId && tx.txParams.data === txData,\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"]}
@@ -4,7 +4,7 @@ exports.validateBridgeStatusResponse = exports.StatusResponseSchema = void 0;
4
4
  const bridge_controller_1 = require("@metamask/bridge-controller");
5
5
  const superstruct_1 = require("@metamask/superstruct");
6
6
  const ChainIdSchema = (0, superstruct_1.number)();
7
- const EmptyObjectSchema = (0, superstruct_1.object)({});
7
+ const EmptyObjectSchema = (0, superstruct_1.type)({});
8
8
  const SrcChainStatusSchema = (0, superstruct_1.type)({
9
9
  chainId: ChainIdSchema,
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;AAAA,mEAA6E;AAC7E,uDAW+B;AAE/B,MAAM,aAAa,GAAG,IAAA,oBAAM,GAAE,CAAC;AAE/B,MAAM,iBAAiB,GAAG,IAAA,oBAAM,EAAC,EAAE,CAAC,CAAC;AAErC,MAAM,oBAAoB,GAAG,IAAA,kBAAI,EAAC;IAChC,OAAO,EAAE,aAAa;IACtB;;;OAGG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,qCAAiB,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,IAAA,kBAAI,EAAC;IACjC,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,qCAAiB,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAA,kBAAI,EAAC,EAAE,CAAC,CAAC;AAE/B,QAAA,oBAAoB,GAAG,IAAA,kBAAI,EAAC;IACvC,MAAM,EAAE,IAAA,mBAAK,EAAC,MAAM,CAAC,MAAM,CAAC,+BAAW,CAAC,CAAC;IACzC,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,IAAA,sBAAQ,EAAC,qBAAqB,CAAC;IAC1C,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,eAAe,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;IACpC,2BAA2B,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;IAChD,MAAM,EAAE,IAAA,sBAAQ,EAAC,0BAA0B,CAAC;CAC7C,CAAC,CAAC;AAEI,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5D,MAAM,kBAAkB,GAA+B,EAAE,CAAC;IAC1D,IAAI;QACF,IAAA,oBAAM,EAAC,IAAI,EAAE,4BAAoB,CAAC,CAAC;KACpC;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,KAAK,YAAY,yBAAW,EAAE;YAChC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;gBACrD,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;gBAChD,kBAAkB,CAAC,UAAU,CAAC;oBAC5B,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;SACJ;QACD,MAAM,KAAK,CAAC;KACb;YAAS;QACR,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,kBAAkB,CAAC,CAAC;SACtE;KACF;AACH,CAAC,CAAC;AAlBW,QAAA,4BAA4B,gCAkBvC","sourcesContent":["import { StatusTypes, BridgeAssetSchema } from '@metamask/bridge-controller';\nimport {\n object,\n string,\n boolean,\n number,\n optional,\n enums,\n union,\n type,\n assert,\n StructError,\n} from '@metamask/superstruct';\n\nconst ChainIdSchema = number();\n\nconst EmptyObjectSchema = object({});\n\nconst SrcChainStatusSchema = type({\n chainId: ChainIdSchema,\n /**\n * The txHash of the transaction on the source chain.\n * This might be undefined for smart transactions (STX)\n */\n txHash: optional(string()),\n /**\n * The atomic amount of the token sent minus fees on the source chain\n */\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, BridgeAssetSchema])),\n});\n\nconst DestChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n /**\n * The atomic amount of the token received on the destination chain\n */\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, BridgeAssetSchema])),\n});\n\nconst RefuelStatusResponseSchema = type({});\n\nexport const StatusResponseSchema = type({\n status: enums(Object.values(StatusTypes)),\n srcChain: SrcChainStatusSchema,\n destChain: optional(DestChainStatusSchema),\n bridge: optional(string()),\n isExpectedToken: optional(boolean()),\n isUnrecognizedRouterAddress: optional(boolean()),\n refuel: optional(RefuelStatusResponseSchema),\n});\n\nexport const validateBridgeStatusResponse = (data: unknown) => {\n const validationFailures: { [path: string]: string } = {};\n try {\n assert(data, StatusResponseSchema);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path, message }) => {\n const pathString = path?.join('.') || 'unknown';\n validationFailures[pathString] =\n `[${branch?.[0]?.bridge || 'unknown'}] ${message}`;\n });\n }\n throw error;\n } finally {\n if (Object.keys(validationFailures).length > 0) {\n console.error(`Bridge status validation failed`, validationFailures);\n }\n }\n};\n"]}
1
+ {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;AAAA,mEAA6E;AAC7E,uDAU+B;AAE/B,MAAM,aAAa,GAAG,IAAA,oBAAM,GAAE,CAAC;AAE/B,MAAM,iBAAiB,GAAG,IAAA,kBAAI,EAAC,EAAE,CAAC,CAAC;AAEnC,MAAM,oBAAoB,GAAG,IAAA,kBAAI,EAAC;IAChC,OAAO,EAAE,aAAa;IACtB;;;OAGG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,qCAAiB,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,IAAA,kBAAI,EAAC;IACjC,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,KAAK,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,CAAC,iBAAiB,EAAE,qCAAiB,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAA,kBAAI,EAAC,EAAE,CAAC,CAAC;AAE/B,QAAA,oBAAoB,GAAG,IAAA,kBAAI,EAAC;IACvC,MAAM,EAAE,IAAA,mBAAK,EAAC,MAAM,CAAC,MAAM,CAAC,+BAAW,CAAC,CAAC;IACzC,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,IAAA,sBAAQ,EAAC,qBAAqB,CAAC;IAC1C,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC1B,eAAe,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;IACpC,2BAA2B,EAAE,IAAA,sBAAQ,EAAC,IAAA,qBAAO,GAAE,CAAC;IAChD,MAAM,EAAE,IAAA,sBAAQ,EAAC,0BAA0B,CAAC;CAC7C,CAAC,CAAC;AAEI,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5D,MAAM,kBAAkB,GAA+B,EAAE,CAAC;IAC1D,IAAI;QACF,IAAA,oBAAM,EAAC,IAAI,EAAE,4BAAoB,CAAC,CAAC;KACpC;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,KAAK,YAAY,yBAAW,EAAE;YAChC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;gBACrD,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;gBAChD,kBAAkB,CAAC,UAAU,CAAC;oBAC5B,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;SACJ;QACD,MAAM,KAAK,CAAC;KACb;YAAS;QACR,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,kBAAkB,CAAC,CAAC;SACtE;KACF;AACH,CAAC,CAAC;AAlBW,QAAA,4BAA4B,gCAkBvC","sourcesContent":["import { StatusTypes, BridgeAssetSchema } from '@metamask/bridge-controller';\nimport {\n string,\n boolean,\n number,\n optional,\n enums,\n union,\n type,\n assert,\n StructError,\n} from '@metamask/superstruct';\n\nconst ChainIdSchema = number();\n\nconst EmptyObjectSchema = type({});\n\nconst SrcChainStatusSchema = type({\n chainId: ChainIdSchema,\n /**\n * The txHash of the transaction on the source chain.\n * This might be undefined for smart transactions (STX)\n */\n txHash: optional(string()),\n /**\n * The atomic amount of the token sent minus fees on the source chain\n */\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, BridgeAssetSchema])),\n});\n\nconst DestChainStatusSchema = type({\n chainId: ChainIdSchema,\n txHash: optional(string()),\n /**\n * The atomic amount of the token received on the destination chain\n */\n amount: optional(string()),\n token: optional(union([EmptyObjectSchema, BridgeAssetSchema])),\n});\n\nconst RefuelStatusResponseSchema = type({});\n\nexport const StatusResponseSchema = type({\n status: enums(Object.values(StatusTypes)),\n srcChain: SrcChainStatusSchema,\n destChain: optional(DestChainStatusSchema),\n bridge: optional(string()),\n isExpectedToken: optional(boolean()),\n isUnrecognizedRouterAddress: optional(boolean()),\n refuel: optional(RefuelStatusResponseSchema),\n});\n\nexport const validateBridgeStatusResponse = (data: unknown) => {\n const validationFailures: { [path: string]: string } = {};\n try {\n assert(data, StatusResponseSchema);\n } catch (error) {\n if (error instanceof StructError) {\n error.failures().forEach(({ branch, path, message }) => {\n const pathString = path?.join('.') || 'unknown';\n validationFailures[pathString] =\n `[${branch?.[0]?.bridge || 'unknown'}] ${message}`;\n });\n }\n throw error;\n } finally {\n if (Object.keys(validationFailures).length > 0) {\n console.error(`Bridge status validation failed`, validationFailures);\n }\n }\n};\n"]}
@@ -9,7 +9,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
9
9
  address: string;
10
10
  name: string;
11
11
  chainId: number;
12
- decimals: number;
12
+ decimals: number; /**
13
+ * The atomic amount of the token sent minus fees on the source chain
14
+ */
13
15
  assetId: `${string}:${string}/${string}:${string}`;
14
16
  iconUrl?: string | null | undefined;
15
17
  icon?: string | null | undefined;
@@ -26,7 +28,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
26
28
  address: string;
27
29
  name: string;
28
30
  chainId: number;
29
- decimals: number;
31
+ decimals: number; /**
32
+ * The atomic amount of the token sent minus fees on the source chain
33
+ */
30
34
  assetId: `${string}:${string}/${string}:${string}`;
31
35
  iconUrl?: string | null | undefined;
32
36
  icon?: string | null | undefined;
@@ -50,7 +54,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
50
54
  address: string;
51
55
  name: string;
52
56
  chainId: number;
53
- decimals: number;
57
+ decimals: number; /**
58
+ * The atomic amount of the token sent minus fees on the source chain
59
+ */
54
60
  assetId: `${string}:${string}/${string}:${string}`;
55
61
  iconUrl?: string | null | undefined;
56
62
  icon?: string | null | undefined;
@@ -72,7 +78,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
72
78
  address: string;
73
79
  name: string;
74
80
  chainId: number;
75
- decimals: number;
81
+ decimals: number; /**
82
+ * The atomic amount of the token sent minus fees on the source chain
83
+ */
76
84
  assetId: `${string}:${string}/${string}:${string}`;
77
85
  iconUrl?: string | null | undefined;
78
86
  icon?: string | null | undefined;
@@ -86,7 +94,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
86
94
  address: string;
87
95
  name: string;
88
96
  chainId: number;
89
- decimals: number;
97
+ decimals: number; /**
98
+ * The atomic amount of the token sent minus fees on the source chain
99
+ */
90
100
  assetId: `${string}:${string}/${string}:${string}`;
91
101
  iconUrl?: string | null | undefined;
92
102
  icon?: string | null | undefined;
@@ -104,7 +114,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
104
114
  address: string;
105
115
  name: string;
106
116
  chainId: number;
107
- decimals: number;
117
+ decimals: number; /**
118
+ * The atomic amount of the token sent minus fees on the source chain
119
+ */
108
120
  assetId: `${string}:${string}/${string}:${string}`;
109
121
  iconUrl?: string | null | undefined;
110
122
  icon?: string | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,oCAAoC;AA4C7E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAxB/B;;;WAGG;;QAEH;;WAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAQH;;WAEG;;;;;;;;;;;;;;;;;EAeH,CAAC;AAEH,eAAO,MAAM,4BAA4B,SAAU,OAAO,SAkBzD,CAAC"}
1
+ {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,oCAAoC;AA2C7E,eAAO,MAAM,oBAAoB;;;;;;;;;;8BAnB/B;;eAEG;;;;;;;;;;;;;;;;;8BAFH;;eAEG;;;;;;;;;;;;;;;;;;;;;;;;8BAFH;;eAEG;;;;;;;;QAPH;;;WAGG;;QAEH;;WAEG;;;;;;;8BAFH;;eAEG;;;;;;;;;;;;;;8BAFH;;eAEG;;;;;;;;;QAQH;;WAEG;;;;;;;8BAZH;;eAEG;;;;;;;;;;EAyBH,CAAC;AAEH,eAAO,MAAM,4BAA4B,SAAU,OAAO,SAkBzD,CAAC"}
@@ -9,7 +9,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
9
9
  address: string;
10
10
  name: string;
11
11
  chainId: number;
12
- decimals: number;
12
+ decimals: number; /**
13
+ * The atomic amount of the token sent minus fees on the source chain
14
+ */
13
15
  assetId: `${string}:${string}/${string}:${string}`;
14
16
  iconUrl?: string | null | undefined;
15
17
  icon?: string | null | undefined;
@@ -26,7 +28,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
26
28
  address: string;
27
29
  name: string;
28
30
  chainId: number;
29
- decimals: number;
31
+ decimals: number; /**
32
+ * The atomic amount of the token sent minus fees on the source chain
33
+ */
30
34
  assetId: `${string}:${string}/${string}:${string}`;
31
35
  iconUrl?: string | null | undefined;
32
36
  icon?: string | null | undefined;
@@ -50,7 +54,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
50
54
  address: string;
51
55
  name: string;
52
56
  chainId: number;
53
- decimals: number;
57
+ decimals: number; /**
58
+ * The atomic amount of the token sent minus fees on the source chain
59
+ */
54
60
  assetId: `${string}:${string}/${string}:${string}`;
55
61
  iconUrl?: string | null | undefined;
56
62
  icon?: string | null | undefined;
@@ -72,7 +78,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
72
78
  address: string;
73
79
  name: string;
74
80
  chainId: number;
75
- decimals: number;
81
+ decimals: number; /**
82
+ * The atomic amount of the token sent minus fees on the source chain
83
+ */
76
84
  assetId: `${string}:${string}/${string}:${string}`;
77
85
  iconUrl?: string | null | undefined;
78
86
  icon?: string | null | undefined;
@@ -86,7 +94,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
86
94
  address: string;
87
95
  name: string;
88
96
  chainId: number;
89
- decimals: number;
97
+ decimals: number; /**
98
+ * The atomic amount of the token sent minus fees on the source chain
99
+ */
90
100
  assetId: `${string}:${string}/${string}:${string}`;
91
101
  iconUrl?: string | null | undefined;
92
102
  icon?: string | null | undefined;
@@ -104,7 +114,9 @@ export declare const StatusResponseSchema: import("@metamask/superstruct").Struc
104
114
  address: string;
105
115
  name: string;
106
116
  chainId: number;
107
- decimals: number;
117
+ decimals: number; /**
118
+ * The atomic amount of the token sent minus fees on the source chain
119
+ */
108
120
  assetId: `${string}:${string}/${string}:${string}`;
109
121
  iconUrl?: string | null | undefined;
110
122
  icon?: string | null | undefined;