@metamask/transaction-controller 62.5.0 → 62.6.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 (176) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/TransactionController.cjs +105 -48
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +33 -21
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +33 -21
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +106 -49
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/api/accounts-api.cjs +1 -1
  11. package/dist/api/accounts-api.cjs.map +1 -1
  12. package/dist/api/accounts-api.mjs +1 -1
  13. package/dist/api/accounts-api.mjs.map +1 -1
  14. package/dist/api/simulation-api.cjs +1 -1
  15. package/dist/api/simulation-api.cjs.map +1 -1
  16. package/dist/api/simulation-api.mjs +1 -1
  17. package/dist/api/simulation-api.mjs.map +1 -1
  18. package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -1
  19. package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -1
  20. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +28 -17
  21. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -1
  22. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts +1 -6
  23. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -1
  24. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +1 -6
  25. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -1
  26. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +28 -17
  27. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -1
  28. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +1 -0
  29. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -1
  30. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -1
  31. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -1
  32. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +1 -0
  33. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
  34. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
  35. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
  36. package/dist/helpers/GasFeePoller.cjs.map +1 -1
  37. package/dist/helpers/GasFeePoller.mjs.map +1 -1
  38. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  39. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  40. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  41. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  42. package/dist/helpers/MultichainTrackingHelper.cjs +2 -2
  43. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  44. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  45. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  46. package/dist/helpers/MultichainTrackingHelper.mjs +2 -2
  47. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  48. package/dist/helpers/PendingTransactionTracker.cjs +88 -22
  49. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  50. package/dist/helpers/PendingTransactionTracker.d.cts +7 -6
  51. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  52. package/dist/helpers/PendingTransactionTracker.d.mts +7 -6
  53. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  54. package/dist/helpers/PendingTransactionTracker.mjs +88 -22
  55. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  56. package/dist/helpers/ResimulateHelper.cjs.map +1 -1
  57. package/dist/helpers/ResimulateHelper.d.cts +1 -4
  58. package/dist/helpers/ResimulateHelper.d.cts.map +1 -1
  59. package/dist/helpers/ResimulateHelper.d.mts +1 -4
  60. package/dist/helpers/ResimulateHelper.d.mts.map +1 -1
  61. package/dist/helpers/ResimulateHelper.mjs.map +1 -1
  62. package/dist/helpers/TransactionPoller.cjs.map +1 -1
  63. package/dist/helpers/TransactionPoller.d.cts.map +1 -1
  64. package/dist/helpers/TransactionPoller.d.mts.map +1 -1
  65. package/dist/helpers/TransactionPoller.mjs.map +1 -1
  66. package/dist/hooks/CollectPublishHook.cjs +1 -1
  67. package/dist/hooks/CollectPublishHook.cjs.map +1 -1
  68. package/dist/hooks/CollectPublishHook.d.cts.map +1 -1
  69. package/dist/hooks/CollectPublishHook.d.mts.map +1 -1
  70. package/dist/hooks/CollectPublishHook.mjs +1 -1
  71. package/dist/hooks/CollectPublishHook.mjs.map +1 -1
  72. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -1
  73. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -1
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +1 -1
  76. package/dist/index.d.cts.map +1 -1
  77. package/dist/index.d.mts +1 -1
  78. package/dist/index.d.mts.map +1 -1
  79. package/dist/index.mjs.map +1 -1
  80. package/dist/types.cjs +5 -0
  81. package/dist/types.cjs.map +1 -1
  82. package/dist/types.d.cts +6 -0
  83. package/dist/types.d.cts.map +1 -1
  84. package/dist/types.d.mts +6 -0
  85. package/dist/types.d.mts.map +1 -1
  86. package/dist/types.mjs +5 -0
  87. package/dist/types.mjs.map +1 -1
  88. package/dist/utils/balance-changes.cjs +5 -5
  89. package/dist/utils/balance-changes.cjs.map +1 -1
  90. package/dist/utils/balance-changes.d.cts.map +1 -1
  91. package/dist/utils/balance-changes.d.mts.map +1 -1
  92. package/dist/utils/balance-changes.mjs +5 -5
  93. package/dist/utils/balance-changes.mjs.map +1 -1
  94. package/dist/utils/balance.cjs.map +1 -1
  95. package/dist/utils/balance.d.cts.map +1 -1
  96. package/dist/utils/balance.d.mts.map +1 -1
  97. package/dist/utils/balance.mjs.map +1 -1
  98. package/dist/utils/batch.cjs +9 -4
  99. package/dist/utils/batch.cjs.map +1 -1
  100. package/dist/utils/batch.d.cts.map +1 -1
  101. package/dist/utils/batch.d.mts.map +1 -1
  102. package/dist/utils/batch.mjs +9 -4
  103. package/dist/utils/batch.mjs.map +1 -1
  104. package/dist/utils/eip7702.cjs +4 -3
  105. package/dist/utils/eip7702.cjs.map +1 -1
  106. package/dist/utils/eip7702.d.cts +1 -1
  107. package/dist/utils/eip7702.d.cts.map +1 -1
  108. package/dist/utils/eip7702.d.mts +1 -1
  109. package/dist/utils/eip7702.d.mts.map +1 -1
  110. package/dist/utils/eip7702.mjs +4 -3
  111. package/dist/utils/eip7702.mjs.map +1 -1
  112. package/dist/utils/external-transactions.cjs.map +1 -1
  113. package/dist/utils/external-transactions.d.cts.map +1 -1
  114. package/dist/utils/external-transactions.d.mts.map +1 -1
  115. package/dist/utils/external-transactions.mjs.map +1 -1
  116. package/dist/utils/feature-flags.cjs +22 -7
  117. package/dist/utils/feature-flags.cjs.map +1 -1
  118. package/dist/utils/feature-flags.d.cts +24 -0
  119. package/dist/utils/feature-flags.d.cts.map +1 -1
  120. package/dist/utils/feature-flags.d.mts +24 -0
  121. package/dist/utils/feature-flags.d.mts.map +1 -1
  122. package/dist/utils/feature-flags.mjs +20 -6
  123. package/dist/utils/feature-flags.mjs.map +1 -1
  124. package/dist/utils/first-time-interaction.cjs +3 -5
  125. package/dist/utils/first-time-interaction.cjs.map +1 -1
  126. package/dist/utils/first-time-interaction.d.cts.map +1 -1
  127. package/dist/utils/first-time-interaction.d.mts.map +1 -1
  128. package/dist/utils/first-time-interaction.mjs +3 -5
  129. package/dist/utils/first-time-interaction.mjs.map +1 -1
  130. package/dist/utils/gas-fee-tokens.cjs +1 -1
  131. package/dist/utils/gas-fee-tokens.cjs.map +1 -1
  132. package/dist/utils/gas-fee-tokens.d.cts.map +1 -1
  133. package/dist/utils/gas-fee-tokens.d.mts.map +1 -1
  134. package/dist/utils/gas-fee-tokens.mjs +1 -1
  135. package/dist/utils/gas-fee-tokens.mjs.map +1 -1
  136. package/dist/utils/gas-fees.cjs +1 -3
  137. package/dist/utils/gas-fees.cjs.map +1 -1
  138. package/dist/utils/gas-fees.d.cts +1 -1
  139. package/dist/utils/gas-fees.d.cts.map +1 -1
  140. package/dist/utils/gas-fees.d.mts +1 -1
  141. package/dist/utils/gas-fees.d.mts.map +1 -1
  142. package/dist/utils/gas-fees.mjs +1 -3
  143. package/dist/utils/gas-fees.mjs.map +1 -1
  144. package/dist/utils/gas.cjs +71 -15
  145. package/dist/utils/gas.cjs.map +1 -1
  146. package/dist/utils/gas.d.cts +18 -12
  147. package/dist/utils/gas.d.cts.map +1 -1
  148. package/dist/utils/gas.d.mts +18 -12
  149. package/dist/utils/gas.d.mts.map +1 -1
  150. package/dist/utils/gas.mjs +70 -15
  151. package/dist/utils/gas.mjs.map +1 -1
  152. package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -1
  153. package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -1
  154. package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -1
  155. package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -1
  156. package/dist/utils/prepare.cjs.map +1 -1
  157. package/dist/utils/prepare.d.cts +1 -1
  158. package/dist/utils/prepare.d.cts.map +1 -1
  159. package/dist/utils/prepare.d.mts +1 -1
  160. package/dist/utils/prepare.d.mts.map +1 -1
  161. package/dist/utils/prepare.mjs.map +1 -1
  162. package/dist/utils/swaps.cjs.map +1 -1
  163. package/dist/utils/swaps.mjs.map +1 -1
  164. package/dist/utils/utils.cjs +10 -10
  165. package/dist/utils/utils.cjs.map +1 -1
  166. package/dist/utils/utils.d.cts +4 -4
  167. package/dist/utils/utils.d.cts.map +1 -1
  168. package/dist/utils/utils.d.mts +4 -4
  169. package/dist/utils/utils.d.mts.map +1 -1
  170. package/dist/utils/utils.mjs +10 -10
  171. package/dist/utils/utils.mjs.map +1 -1
  172. package/dist/utils/validation.cjs.map +1 -1
  173. package/dist/utils/validation.d.cts.map +1 -1
  174. package/dist/utils/validation.d.mts.map +1 -1
  175. package/dist/utils/validation.mjs.map +1 -1
  176. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"balance-changes.cjs","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { getNativeBalance } from './balance';\nimport { simulateTransactions } from '../api/simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n SimulationResponseTransaction,\n SimulationRequest,\n} from '../api/simulation-api';\nimport {\n ABI_SIMULATION_ERC20_WRAPPED,\n ABI_SIMULATION_ERC721_LEGACY,\n} from '../constants';\nimport {\n SimulationError,\n SimulationInvalidResponseError,\n SimulationRevertedError,\n} from '../errors';\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n TransactionParams,\n NestedTransactionMetadata,\n GetSimulationConfig,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\n\nexport enum SupportedToken {\n ERC20 = 'erc20',\n ERC721 = 'erc721',\n ERC1155 = 'erc1155',\n ERC20_WRAPPED = 'erc20Wrapped',\n ERC721_LEGACY = 'erc721Legacy',\n}\n\ntype ABI = Fragment[];\n\nexport type GetBalanceChangesRequest = {\n blockTime?: number;\n chainId: Hex;\n ethQuery: EthQuery;\n getSimulationConfig: GetSimulationConfig;\n nestedTransactions?: NestedTransactionMetadata[];\n txParams: TransactionParams;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\nconst log = createModuleLogger(projectLogger, 'balance-changes');\n\nconst SUPPORTED_EVENTS = [\n 'Transfer',\n 'TransferSingle',\n 'TransferBatch',\n 'Deposit',\n 'Withdrawal',\n];\n\nconst SUPPORTED_TOKEN_ABIS = {\n [SupportedToken.ERC20]: {\n abi: abiERC20,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721]: {\n abi: abiERC721,\n standard: SimulationTokenStandard.erc721,\n },\n [SupportedToken.ERC1155]: {\n abi: abiERC1155,\n standard: SimulationTokenStandard.erc1155,\n },\n [SupportedToken.ERC20_WRAPPED]: {\n abi: ABI_SIMULATION_ERC20_WRAPPED,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721_LEGACY]: {\n abi: ABI_SIMULATION_ERC721_LEGACY,\n standard: SimulationTokenStandard.erc721,\n },\n};\n\nconst REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];\n\ntype BalanceTransactionMap = Map<SimulationToken, SimulationRequestTransaction>;\n\n/**\n * Generate simulation data for a transaction.\n *\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns The simulation data.\n */\nexport async function getBalanceChanges(\n request: GetBalanceChangesRequest,\n): Promise<{ simulationData: SimulationData; gasUsed?: Hex }> {\n log('Request', request);\n\n try {\n const response = await baseRequest({\n request,\n params: {\n withCallTrace: true,\n withLogs: true,\n },\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n throw new SimulationError(transactionError);\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n const gasUsed = response.transactions?.[0]?.gasUsed;\n const simulationData = {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n\n return { simulationData, gasUsed };\n } catch (error) {\n log('Failed to get balance changes', error, request);\n\n let simulationError = error as SimulationError;\n\n if (\n REVERTED_ERRORS.some((revertErrorMessage) =>\n simulationError.message?.includes(revertErrorMessage),\n )\n ) {\n simulationError = new SimulationRevertedError();\n }\n\n const { code, message } = simulationError;\n\n return {\n simulationData: {\n tokenBalanceChanges: [],\n error: {\n code,\n message,\n },\n },\n gasUsed: undefined,\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n *\n * @param request - Simulation request.\n * @param response - Simulation response.\n * @returns Native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n request: GetBalanceChangesRequest,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { txParams } = request;\n const userAddress = txParams.from as Hex;\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(\n previousBalance,\n newBalance,\n transactionResponse.gasCost,\n );\n}\n\n/**\n * Extract events from a simulation response.\n *\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const interfaces = getContractInterfaces();\n\n return logs\n .map((currentLog) => {\n const event = parseLog(currentLog, interfaces);\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find((e) => e.name === event.name)?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n if (!SUPPORTED_EVENTS.includes(event.name)) {\n log('Ignoring unsupported event', event.name, event);\n return undefined;\n }\n\n log('Normalizing event args', event.name, event);\n\n const args = normalizeEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((e) => e !== undefined) as ParsedEvent[];\n}\n\n/**\n * Normalize event arguments using ABI input definitions.\n *\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The normalized event arguments.\n */\nfunction normalizeEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = normalizeEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Normalize an event argument value.\n *\n * @param value - The event argument value.\n * @returns The normalized event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeEventArgValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map(normalizeEventArgValue);\n }\n\n let normalizedValue = value;\n\n normalizedValue = normalizedValue.toHexString?.() ?? normalizedValue;\n normalizedValue = normalizedValue.toLowerCase?.() ?? normalizedValue;\n\n return normalizedValue;\n}\n\n/**\n * Generate token balance changes from parsed events.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const { txParams } = request;\n const from = txParams.from as Hex;\n const balanceTxs = getTokenBalanceTransactions(request, events);\n\n log('Generated balance transactions', [...balanceTxs.after.values()]);\n\n const transactionCount = balanceTxs.before.size + balanceTxs.after.size + 1;\n\n if (transactionCount === 1) {\n return [];\n }\n\n const response = await baseRequest({\n request,\n before: [...balanceTxs.before.values()],\n after: [...balanceTxs.after.values()],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== transactionCount) {\n throw new SimulationInvalidResponseError();\n }\n\n let prevBalanceTxIndex = 0;\n return [...balanceTxs.after.keys()]\n .map((token, index) => {\n const previousBalanceCheckSkipped = !balanceTxs.before.get(token);\n const previousBalance = previousBalanceCheckSkipped\n ? '0x0'\n : getAmountFromBalanceTransactionResult(\n from,\n token,\n // eslint-disable-next-line no-plusplus\n response.transactions[prevBalanceTxIndex++],\n );\n\n const newBalance = getAmountFromBalanceTransactionResult(\n from,\n token,\n response.transactions[index + balanceTxs.before.size + 1],\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): {\n before: BalanceTransactionMap;\n after: BalanceTransactionMap;\n} {\n const tokenKeys = new Set();\n const before = new Map();\n const after = new Map();\n const from = request.txParams.from as Hex;\n\n const userEvents = events.filter((event) =>\n [event.args.from, event.args.to].includes(from),\n );\n\n log('Filtered user events', userEvents);\n\n for (const event of userEvents) {\n const tokenIds = getEventTokenIds(event);\n\n log('Extracted token IDs', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const data = getBalanceTransactionData(\n event.tokenStandard,\n from,\n tokenId,\n );\n\n const transaction: SimulationRequestTransaction = {\n from,\n to: event.contractAddress,\n data,\n };\n\n if (skipPriorBalanceCheck(event)) {\n after.set(simulationToken, transaction);\n } else {\n before.set(simulationToken, transaction);\n after.set(simulationToken, transaction);\n }\n }\n }\n\n return { before, after };\n}\n\n/**\n * Check if an event needs to check the previous balance.\n *\n * @param event - The parsed event.\n * @returns True if the prior balance check should be skipped.\n */\nfunction skipPriorBalanceCheck(event: ParsedEvent): boolean {\n // In the case of an NFT mint, we cannot check the NFT owner before the mint\n // as the balance check transaction would revert.\n return (\n event.name === 'Transfer' &&\n event.tokenStandard === SimulationTokenStandard.erc721 &&\n parseInt(event.args.from as string, 16) === 0\n );\n}\n\n/**\n * Extract token IDs from a parsed event.\n *\n * @param event - The parsed event.\n * @returns An array of token IDs.\n */\nfunction getEventTokenIds(event: ParsedEvent): (Hex | undefined)[] {\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n return [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n return [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n return event.args.ids as Hex[];\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n return [undefined];\n}\n\n/**\n * Get the interface for a token standard.\n *\n * @param tokenStandard - The token standard.\n * @returns The interface for the token standard.\n */\nfunction getContractInterface(\n tokenStandard: SimulationTokenStandard,\n): Interface {\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721);\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155);\n default:\n return new Interface(abiERC20);\n }\n}\n\n/**\n * Extract the value from a balance transaction response using the correct ABI.\n *\n * @param from - The address to check the balance of.\n * @param token - The token to check the balance of.\n * @param response - The balance transaction response.\n * @returns The value of the balance transaction as Hex.\n */\nfunction getAmountFromBalanceTransactionResult(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const contract = getContractInterface(token.standard);\n\n try {\n if (token.standard === SimulationTokenStandard.erc721) {\n const result = contract.decodeFunctionResult('ownerOf', response.return);\n const owner = result[0];\n return owner.toLowerCase() === from.toLowerCase() ? '0x1' : '0x0';\n }\n\n const result = contract.decodeFunctionResult('balanceOf', response.return);\n return toHex(result[0]);\n } catch (error) {\n log('Failed to decode balance transaction', error, { token, response });\n throw new SimulationError(\n `Failed to decode balance transaction for token ${\n token.address\n }: ${String(error)}`,\n );\n }\n}\n\n/**\n * Generate the balance transaction data for a token.\n *\n * @param tokenStandard - The token standard.\n * @param from - The address to check the balance of.\n * @param tokenId - The token ID to check the balance of.\n * @returns The balance transaction data.\n */\nfunction getBalanceTransactionData(\n tokenStandard: SimulationTokenStandard,\n from: Hex,\n tokenId?: Hex,\n): Hex {\n const contract = getContractInterface(tokenStandard);\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return contract.encodeFunctionData('ownerOf', [tokenId]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return contract.encodeFunctionData('balanceOf', [from, tokenId]) as Hex;\n\n default:\n return contract.encodeFunctionData('balanceOf', [from]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\n *\n * @param eventLog - The raw event log.\n * @param interfaces - The contract interfaces.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n interfaces: Map<SupportedToken, Interface>,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const supportedTokens = Object.values(SupportedToken);\n\n for (const token of supportedTokens) {\n try {\n const contractInterface = interfaces.get(token) as Interface;\n const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];\n\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n // Not used\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n *\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n *\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @param offset - Optional offset to apply to the new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n offset: number = 0,\n): SimulationBalanceChange | undefined {\n const newBalanceBN = hexToBN(newBalance).add(new BN(offset));\n const previousBalanceBN = hexToBN(previousBalance);\n const differenceBN = newBalanceBN.sub(previousBalanceBN);\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance: toHex(newBalanceBN),\n difference,\n isDecrease,\n };\n}\n\n/**\n * Get the contract interfaces for all supported tokens.\n *\n * @returns A map of supported tokens to their contract interfaces.\n */\nfunction getContractInterfaces(): Map<SupportedToken, Interface> {\n const supportedTokens = Object.values(SupportedToken);\n\n return new Map(\n supportedTokens.map((tokenType) => {\n const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];\n const contractInterface = new Interface(abi);\n return [tokenType, contractInterface];\n }),\n );\n}\n\n/**\n * Base request to simulation API.\n *\n * @param options - Options bag.\n * @param options.after - Transactions to simulate after user's transaction.\n * @param options.before - Transactions to simulate before user's transaction.\n * @param options.params - Additional parameters for the request.\n * @param options.request - Original request object.\n * @returns The simulation response.\n */\nasync function baseRequest({\n request,\n params,\n before = [],\n after = [],\n}: {\n request: GetBalanceChangesRequest;\n params?: Partial<SimulationRequest>;\n before?: SimulationRequestTransaction[];\n after?: SimulationRequestTransaction[];\n}): Promise<SimulationResponse> {\n const { blockTime, chainId, ethQuery, getSimulationConfig, txParams } =\n request;\n const { authorizationList } = txParams;\n const from = txParams.from as Hex;\n\n const authorizationListFinal = authorizationList?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n const userTransaction: SimulationRequestTransaction = {\n authorizationList: authorizationListFinal,\n data: txParams.data as Hex,\n from: txParams.from as Hex,\n gas: txParams.gas as Hex,\n maxFeePerGas: (txParams.maxFeePerGas ?? txParams.gasPrice) as Hex,\n maxPriorityFeePerGas: (txParams.maxPriorityFeePerGas ??\n txParams.gasPrice) as Hex,\n to: txParams.to as Hex,\n value: txParams.value as Hex,\n };\n\n const transactions = [...before, userTransaction, ...after];\n const requiredBalanceBN = getRequiredBalance(request);\n const requiredBalanceHex = toHex(requiredBalanceBN);\n\n log('Required balance', requiredBalanceHex);\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n const currentBalanceHex = toHex(balanceRaw);\n const currentBalanceBN = hexToBN(currentBalanceHex);\n\n log('Current balance', currentBalanceHex);\n\n const isInsufficientBalance = currentBalanceBN.lt(requiredBalanceBN);\n\n return await simulateTransactions(chainId, {\n ...params,\n getSimulationConfig,\n transactions,\n withGas: true,\n withDefaultBlockOverrides: true,\n ...(blockTime && {\n blockOverrides: {\n ...params?.blockOverrides,\n time: toHex(blockTime),\n },\n }),\n ...(isInsufficientBalance && {\n overrides: {\n ...params?.overrides,\n [from]: {\n ...params?.overrides?.[from],\n balance: requiredBalanceHex,\n },\n },\n }),\n });\n}\n\n/**\n * Calculate the required minimum balance for a transaction.\n *\n * @param request - The transaction request.\n * @returns The minimal balance as a BN.\n */\nfunction getRequiredBalance(request: GetBalanceChangesRequest): BN {\n const { txParams } = request;\n const gasLimit = hexToBN(txParams.gas ?? '0x0');\n const gasPrice = hexToBN(txParams.maxFeePerGas ?? txParams.gasPrice ?? '0x0');\n const value = hexToBN(txParams.value ?? '0x0');\n\n const nestedValue = (request.nestedTransactions ?? [])\n .map((tx) => hexToBN(tx.value ?? '0x0'))\n .reduce((acc, val) => acc.add(val), new BN(0));\n\n return gasLimit.mul(gasPrice).add(value).add(nestedValue);\n}\n"]}
1
+ {"version":3,"file":"balance-changes.cjs","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { getNativeBalance } from './balance';\nimport { simulateTransactions } from '../api/simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n SimulationResponseTransaction,\n SimulationRequest,\n} from '../api/simulation-api';\nimport {\n ABI_SIMULATION_ERC20_WRAPPED,\n ABI_SIMULATION_ERC721_LEGACY,\n} from '../constants';\nimport {\n SimulationError,\n SimulationInvalidResponseError,\n SimulationRevertedError,\n} from '../errors';\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n TransactionParams,\n NestedTransactionMetadata,\n GetSimulationConfig,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\n\nexport enum SupportedToken {\n ERC20 = 'erc20',\n ERC721 = 'erc721',\n ERC1155 = 'erc1155',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ERC20_WRAPPED = 'erc20Wrapped',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ERC721_LEGACY = 'erc721Legacy',\n}\n\ntype ABI = Fragment[];\n\nexport type GetBalanceChangesRequest = {\n blockTime?: number;\n chainId: Hex;\n ethQuery: EthQuery;\n getSimulationConfig: GetSimulationConfig;\n nestedTransactions?: NestedTransactionMetadata[];\n txParams: TransactionParams;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\nconst log = createModuleLogger(projectLogger, 'balance-changes');\n\nconst SUPPORTED_EVENTS = [\n 'Transfer',\n 'TransferSingle',\n 'TransferBatch',\n 'Deposit',\n 'Withdrawal',\n];\n\nconst SUPPORTED_TOKEN_ABIS = {\n [SupportedToken.ERC20]: {\n abi: abiERC20,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721]: {\n abi: abiERC721,\n standard: SimulationTokenStandard.erc721,\n },\n [SupportedToken.ERC1155]: {\n abi: abiERC1155,\n standard: SimulationTokenStandard.erc1155,\n },\n [SupportedToken.ERC20_WRAPPED]: {\n abi: ABI_SIMULATION_ERC20_WRAPPED,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721_LEGACY]: {\n abi: ABI_SIMULATION_ERC721_LEGACY,\n standard: SimulationTokenStandard.erc721,\n },\n};\n\nconst REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];\n\ntype BalanceTransactionMap = Map<SimulationToken, SimulationRequestTransaction>;\n\n/**\n * Generate simulation data for a transaction.\n *\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns The simulation data.\n */\nexport async function getBalanceChanges(\n request: GetBalanceChangesRequest,\n): Promise<{ simulationData: SimulationData; gasUsed?: Hex }> {\n log('Request', request);\n\n try {\n const response = await baseRequest({\n request,\n params: {\n withCallTrace: true,\n withLogs: true,\n },\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n throw new SimulationError(transactionError);\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n const gasUsed = response.transactions?.[0]?.gasUsed;\n const simulationData = {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n\n return { simulationData, gasUsed };\n } catch (error) {\n log('Failed to get balance changes', error, request);\n\n let simulationError = error as SimulationError;\n\n if (\n REVERTED_ERRORS.some((revertErrorMessage) =>\n simulationError.message?.includes(revertErrorMessage),\n )\n ) {\n simulationError = new SimulationRevertedError();\n }\n\n const { code, message } = simulationError;\n\n return {\n simulationData: {\n tokenBalanceChanges: [],\n error: {\n code,\n message,\n },\n },\n gasUsed: undefined,\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n *\n * @param request - Simulation request.\n * @param response - Simulation response.\n * @returns Native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n request: GetBalanceChangesRequest,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { txParams } = request;\n const userAddress = txParams.from as Hex;\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(\n previousBalance,\n newBalance,\n transactionResponse.gasCost,\n );\n}\n\n/**\n * Extract events from a simulation response.\n *\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const interfaces = getContractInterfaces();\n\n return logs\n .map((currentLog) => {\n const event = parseLog(currentLog, interfaces);\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find(\n (eventAbi) => eventAbi.name === event.name,\n )?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n if (!SUPPORTED_EVENTS.includes(event.name)) {\n log('Ignoring unsupported event', event.name, event);\n return undefined;\n }\n\n log('Normalizing event args', event.name, event);\n\n const args = normalizeEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((parsedEvent) => parsedEvent !== undefined) as ParsedEvent[];\n}\n\n/**\n * Normalize event arguments using ABI input definitions.\n *\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The normalized event arguments.\n */\nfunction normalizeEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = normalizeEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Normalize an event argument value.\n *\n * @param value - The event argument value.\n * @returns The normalized event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeEventArgValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map(normalizeEventArgValue);\n }\n\n let normalizedValue = value;\n\n normalizedValue = normalizedValue.toHexString?.() ?? normalizedValue;\n normalizedValue = normalizedValue.toLowerCase?.() ?? normalizedValue;\n\n return normalizedValue;\n}\n\n/**\n * Generate token balance changes from parsed events.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const { txParams } = request;\n const from = txParams.from as Hex;\n const balanceTxs = getTokenBalanceTransactions(request, events);\n\n log('Generated balance transactions', [...balanceTxs.after.values()]);\n\n const transactionCount = balanceTxs.before.size + balanceTxs.after.size + 1;\n\n if (transactionCount === 1) {\n return [];\n }\n\n const response = await baseRequest({\n request,\n before: [...balanceTxs.before.values()],\n after: [...balanceTxs.after.values()],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== transactionCount) {\n throw new SimulationInvalidResponseError();\n }\n\n let prevBalanceTxIndex = 0;\n return [...balanceTxs.after.keys()]\n .map((token, index) => {\n const previousBalanceCheckSkipped = !balanceTxs.before.get(token);\n const previousBalance = previousBalanceCheckSkipped\n ? '0x0'\n : getAmountFromBalanceTransactionResult(\n from,\n token,\n // eslint-disable-next-line no-plusplus\n response.transactions[prevBalanceTxIndex++],\n );\n\n const newBalance = getAmountFromBalanceTransactionResult(\n from,\n token,\n response.transactions[index + balanceTxs.before.size + 1],\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): {\n before: BalanceTransactionMap;\n after: BalanceTransactionMap;\n} {\n const tokenKeys = new Set();\n const before = new Map();\n const after = new Map();\n const from = request.txParams.from as Hex;\n\n const userEvents = events.filter((event) =>\n [event.args.from, event.args.to].includes(from),\n );\n\n log('Filtered user events', userEvents);\n\n for (const event of userEvents) {\n const tokenIds = getEventTokenIds(event);\n\n log('Extracted token IDs', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const data = getBalanceTransactionData(\n event.tokenStandard,\n from,\n tokenId,\n );\n\n const transaction: SimulationRequestTransaction = {\n from,\n to: event.contractAddress,\n data,\n };\n\n if (skipPriorBalanceCheck(event)) {\n after.set(simulationToken, transaction);\n } else {\n before.set(simulationToken, transaction);\n after.set(simulationToken, transaction);\n }\n }\n }\n\n return { before, after };\n}\n\n/**\n * Check if an event needs to check the previous balance.\n *\n * @param event - The parsed event.\n * @returns True if the prior balance check should be skipped.\n */\nfunction skipPriorBalanceCheck(event: ParsedEvent): boolean {\n // In the case of an NFT mint, we cannot check the NFT owner before the mint\n // as the balance check transaction would revert.\n return (\n event.name === 'Transfer' &&\n event.tokenStandard === SimulationTokenStandard.erc721 &&\n parseInt(event.args.from as string, 16) === 0\n );\n}\n\n/**\n * Extract token IDs from a parsed event.\n *\n * @param event - The parsed event.\n * @returns An array of token IDs.\n */\nfunction getEventTokenIds(event: ParsedEvent): (Hex | undefined)[] {\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n return [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n return [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n return event.args.ids as Hex[];\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n return [undefined];\n}\n\n/**\n * Get the interface for a token standard.\n *\n * @param tokenStandard - The token standard.\n * @returns The interface for the token standard.\n */\nfunction getContractInterface(\n tokenStandard: SimulationTokenStandard,\n): Interface {\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721);\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155);\n default:\n return new Interface(abiERC20);\n }\n}\n\n/**\n * Extract the value from a balance transaction response using the correct ABI.\n *\n * @param from - The address to check the balance of.\n * @param token - The token to check the balance of.\n * @param response - The balance transaction response.\n * @returns The value of the balance transaction as Hex.\n */\nfunction getAmountFromBalanceTransactionResult(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const contract = getContractInterface(token.standard);\n\n try {\n if (token.standard === SimulationTokenStandard.erc721) {\n const result = contract.decodeFunctionResult('ownerOf', response.return);\n const owner = result[0];\n return owner.toLowerCase() === from.toLowerCase() ? '0x1' : '0x0';\n }\n\n const result = contract.decodeFunctionResult('balanceOf', response.return);\n return toHex(result[0]);\n } catch (error) {\n log('Failed to decode balance transaction', error, { token, response });\n throw new SimulationError(\n `Failed to decode balance transaction for token ${\n token.address\n }: ${String(error)}`,\n );\n }\n}\n\n/**\n * Generate the balance transaction data for a token.\n *\n * @param tokenStandard - The token standard.\n * @param from - The address to check the balance of.\n * @param tokenId - The token ID to check the balance of.\n * @returns The balance transaction data.\n */\nfunction getBalanceTransactionData(\n tokenStandard: SimulationTokenStandard,\n from: Hex,\n tokenId?: Hex,\n): Hex {\n const contract = getContractInterface(tokenStandard);\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return contract.encodeFunctionData('ownerOf', [tokenId]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return contract.encodeFunctionData('balanceOf', [from, tokenId]) as Hex;\n\n default:\n return contract.encodeFunctionData('balanceOf', [from]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\n *\n * @param eventLog - The raw event log.\n * @param interfaces - The contract interfaces.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n interfaces: Map<SupportedToken, Interface>,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const supportedTokens = Object.values(SupportedToken);\n\n for (const token of supportedTokens) {\n try {\n const contractInterface = interfaces.get(token) as Interface;\n const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];\n\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n *\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n *\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @param offset - Optional offset to apply to the new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n offset: number = 0,\n): SimulationBalanceChange | undefined {\n const newBalanceBN = hexToBN(newBalance).add(new BN(offset));\n const previousBalanceBN = hexToBN(previousBalance);\n const differenceBN = newBalanceBN.sub(previousBalanceBN);\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance: toHex(newBalanceBN),\n difference,\n isDecrease,\n };\n}\n\n/**\n * Get the contract interfaces for all supported tokens.\n *\n * @returns A map of supported tokens to their contract interfaces.\n */\nfunction getContractInterfaces(): Map<SupportedToken, Interface> {\n const supportedTokens = Object.values(SupportedToken);\n\n return new Map(\n supportedTokens.map((tokenType) => {\n const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];\n const contractInterface = new Interface(abi);\n return [tokenType, contractInterface];\n }),\n );\n}\n\n/**\n * Base request to simulation API.\n *\n * @param options - Options bag.\n * @param options.after - Transactions to simulate after user's transaction.\n * @param options.before - Transactions to simulate before user's transaction.\n * @param options.params - Additional parameters for the request.\n * @param options.request - Original request object.\n * @returns The simulation response.\n */\nasync function baseRequest({\n request,\n params,\n before = [],\n after = [],\n}: {\n request: GetBalanceChangesRequest;\n params?: Partial<SimulationRequest>;\n before?: SimulationRequestTransaction[];\n after?: SimulationRequestTransaction[];\n}): Promise<SimulationResponse> {\n const { blockTime, chainId, ethQuery, getSimulationConfig, txParams } =\n request;\n const { authorizationList } = txParams;\n const from = txParams.from as Hex;\n\n const authorizationListFinal = authorizationList?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n const userTransaction: SimulationRequestTransaction = {\n authorizationList: authorizationListFinal,\n data: txParams.data as Hex,\n from: txParams.from as Hex,\n gas: txParams.gas as Hex,\n maxFeePerGas: (txParams.maxFeePerGas ?? txParams.gasPrice) as Hex,\n maxPriorityFeePerGas: (txParams.maxPriorityFeePerGas ??\n txParams.gasPrice) as Hex,\n to: txParams.to as Hex,\n value: txParams.value as Hex,\n };\n\n const transactions = [...before, userTransaction, ...after];\n const requiredBalanceBN = getRequiredBalance(request);\n const requiredBalanceHex = toHex(requiredBalanceBN);\n\n log('Required balance', requiredBalanceHex);\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n const currentBalanceHex = toHex(balanceRaw);\n const currentBalanceBN = hexToBN(currentBalanceHex);\n\n log('Current balance', currentBalanceHex);\n\n const isInsufficientBalance = currentBalanceBN.lt(requiredBalanceBN);\n\n return await simulateTransactions(chainId, {\n ...params,\n getSimulationConfig,\n transactions,\n withGas: true,\n withDefaultBlockOverrides: true,\n ...(blockTime && {\n blockOverrides: {\n ...params?.blockOverrides,\n time: toHex(blockTime),\n },\n }),\n ...(isInsufficientBalance && {\n overrides: {\n ...params?.overrides,\n [from]: {\n ...params?.overrides?.[from],\n balance: requiredBalanceHex,\n },\n },\n }),\n });\n}\n\n/**\n * Calculate the required minimum balance for a transaction.\n *\n * @param request - The transaction request.\n * @returns The minimal balance as a BN.\n */\nfunction getRequiredBalance(request: GetBalanceChangesRequest): BN {\n const { txParams } = request;\n const gasLimit = hexToBN(txParams.gas ?? '0x0');\n const gasPrice = hexToBN(txParams.maxFeePerGas ?? txParams.gasPrice ?? '0x0');\n const value = hexToBN(txParams.value ?? '0x0');\n\n const nestedValue = (request.nestedTransactions ?? [])\n .map((tx) => hexToBN(tx.value ?? '0x0'))\n .reduce((acc, val) => acc.add(val), new BN(0));\n\n return gasLimit.mul(gasPrice).add(value).add(nestedValue);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"balance-changes.d.cts","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,4BAA4B;AAGhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAuB3C,OAAO,KAAK,EAEV,cAAc,EAGd,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACpB,qBAAiB;AAGlB,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,aAAa,iBAAiB;IAC9B,aAAa,iBAAiB;CAC/B;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACjD,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AA+CF;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CA0D5D"}
1
+ {"version":3,"file":"balance-changes.d.cts","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,4BAA4B;AAGhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAuB3C,OAAO,KAAK,EAEV,cAAc,EAGd,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACpB,qBAAiB;AAGlB,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IAEnB,aAAa,iBAAiB;IAE9B,aAAa,iBAAiB;CAC/B;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACjD,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AA+CF;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CA0D5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"balance-changes.d.mts","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,4BAA4B;AAGhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAuB3C,OAAO,KAAK,EAEV,cAAc,EAGd,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACpB,qBAAiB;AAGlB,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,aAAa,iBAAiB;IAC9B,aAAa,iBAAiB;CAC/B;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACjD,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AA+CF;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CA0D5D"}
1
+ {"version":3,"file":"balance-changes.d.mts","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,4BAA4B;AAGhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAuB3C,OAAO,KAAK,EAEV,cAAc,EAGd,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACpB,qBAAiB;AAGlB,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IAEnB,aAAa,iBAAiB;IAE9B,aAAa,iBAAiB;CAC/B;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACjD,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AA+CF;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CA0D5D"}
@@ -21,7 +21,9 @@ export var SupportedToken;
21
21
  SupportedToken["ERC20"] = "erc20";
22
22
  SupportedToken["ERC721"] = "erc721";
23
23
  SupportedToken["ERC1155"] = "erc1155";
24
+ // eslint-disable-next-line @typescript-eslint/naming-convention
24
25
  SupportedToken["ERC20_WRAPPED"] = "erc20Wrapped";
26
+ // eslint-disable-next-line @typescript-eslint/naming-convention
25
27
  SupportedToken["ERC721_LEGACY"] = "erc721Legacy";
26
28
  })(SupportedToken || (SupportedToken = {}));
27
29
  const log = createModuleLogger(projectLogger, 'balance-changes');
@@ -153,7 +155,7 @@ function getEvents(response) {
153
155
  return undefined;
154
156
  }
155
157
  /* istanbul ignore next */
156
- const inputs = event.abi.find((e) => e.name === event.name)?.inputs;
158
+ const inputs = event.abi.find((eventAbi) => eventAbi.name === event.name)?.inputs;
157
159
  /* istanbul ignore if */
158
160
  if (!inputs) {
159
161
  log('Failed to find inputs for event', event);
@@ -173,7 +175,7 @@ function getEvents(response) {
173
175
  abi: event.abi,
174
176
  };
175
177
  })
176
- .filter((e) => e !== undefined);
178
+ .filter((parsedEvent) => parsedEvent !== undefined);
177
179
  }
178
180
  /**
179
181
  * Normalize event arguments using ABI input definitions.
@@ -409,10 +411,8 @@ function parseLog(eventLog, interfaces) {
409
411
  abi,
410
412
  standard,
411
413
  };
412
- // Not used
413
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
414
414
  }
415
- catch (e) {
415
+ catch {
416
416
  continue;
417
417
  }
418
418
  }
@@ -1 +1 @@
1
- {"version":3,"file":"balance-changes.mjs","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { getNativeBalance } from './balance';\nimport { simulateTransactions } from '../api/simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n SimulationResponseTransaction,\n SimulationRequest,\n} from '../api/simulation-api';\nimport {\n ABI_SIMULATION_ERC20_WRAPPED,\n ABI_SIMULATION_ERC721_LEGACY,\n} from '../constants';\nimport {\n SimulationError,\n SimulationInvalidResponseError,\n SimulationRevertedError,\n} from '../errors';\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n TransactionParams,\n NestedTransactionMetadata,\n GetSimulationConfig,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\n\nexport enum SupportedToken {\n ERC20 = 'erc20',\n ERC721 = 'erc721',\n ERC1155 = 'erc1155',\n ERC20_WRAPPED = 'erc20Wrapped',\n ERC721_LEGACY = 'erc721Legacy',\n}\n\ntype ABI = Fragment[];\n\nexport type GetBalanceChangesRequest = {\n blockTime?: number;\n chainId: Hex;\n ethQuery: EthQuery;\n getSimulationConfig: GetSimulationConfig;\n nestedTransactions?: NestedTransactionMetadata[];\n txParams: TransactionParams;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\nconst log = createModuleLogger(projectLogger, 'balance-changes');\n\nconst SUPPORTED_EVENTS = [\n 'Transfer',\n 'TransferSingle',\n 'TransferBatch',\n 'Deposit',\n 'Withdrawal',\n];\n\nconst SUPPORTED_TOKEN_ABIS = {\n [SupportedToken.ERC20]: {\n abi: abiERC20,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721]: {\n abi: abiERC721,\n standard: SimulationTokenStandard.erc721,\n },\n [SupportedToken.ERC1155]: {\n abi: abiERC1155,\n standard: SimulationTokenStandard.erc1155,\n },\n [SupportedToken.ERC20_WRAPPED]: {\n abi: ABI_SIMULATION_ERC20_WRAPPED,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721_LEGACY]: {\n abi: ABI_SIMULATION_ERC721_LEGACY,\n standard: SimulationTokenStandard.erc721,\n },\n};\n\nconst REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];\n\ntype BalanceTransactionMap = Map<SimulationToken, SimulationRequestTransaction>;\n\n/**\n * Generate simulation data for a transaction.\n *\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns The simulation data.\n */\nexport async function getBalanceChanges(\n request: GetBalanceChangesRequest,\n): Promise<{ simulationData: SimulationData; gasUsed?: Hex }> {\n log('Request', request);\n\n try {\n const response = await baseRequest({\n request,\n params: {\n withCallTrace: true,\n withLogs: true,\n },\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n throw new SimulationError(transactionError);\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n const gasUsed = response.transactions?.[0]?.gasUsed;\n const simulationData = {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n\n return { simulationData, gasUsed };\n } catch (error) {\n log('Failed to get balance changes', error, request);\n\n let simulationError = error as SimulationError;\n\n if (\n REVERTED_ERRORS.some((revertErrorMessage) =>\n simulationError.message?.includes(revertErrorMessage),\n )\n ) {\n simulationError = new SimulationRevertedError();\n }\n\n const { code, message } = simulationError;\n\n return {\n simulationData: {\n tokenBalanceChanges: [],\n error: {\n code,\n message,\n },\n },\n gasUsed: undefined,\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n *\n * @param request - Simulation request.\n * @param response - Simulation response.\n * @returns Native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n request: GetBalanceChangesRequest,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { txParams } = request;\n const userAddress = txParams.from as Hex;\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(\n previousBalance,\n newBalance,\n transactionResponse.gasCost,\n );\n}\n\n/**\n * Extract events from a simulation response.\n *\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const interfaces = getContractInterfaces();\n\n return logs\n .map((currentLog) => {\n const event = parseLog(currentLog, interfaces);\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find((e) => e.name === event.name)?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n if (!SUPPORTED_EVENTS.includes(event.name)) {\n log('Ignoring unsupported event', event.name, event);\n return undefined;\n }\n\n log('Normalizing event args', event.name, event);\n\n const args = normalizeEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((e) => e !== undefined) as ParsedEvent[];\n}\n\n/**\n * Normalize event arguments using ABI input definitions.\n *\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The normalized event arguments.\n */\nfunction normalizeEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = normalizeEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Normalize an event argument value.\n *\n * @param value - The event argument value.\n * @returns The normalized event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeEventArgValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map(normalizeEventArgValue);\n }\n\n let normalizedValue = value;\n\n normalizedValue = normalizedValue.toHexString?.() ?? normalizedValue;\n normalizedValue = normalizedValue.toLowerCase?.() ?? normalizedValue;\n\n return normalizedValue;\n}\n\n/**\n * Generate token balance changes from parsed events.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const { txParams } = request;\n const from = txParams.from as Hex;\n const balanceTxs = getTokenBalanceTransactions(request, events);\n\n log('Generated balance transactions', [...balanceTxs.after.values()]);\n\n const transactionCount = balanceTxs.before.size + balanceTxs.after.size + 1;\n\n if (transactionCount === 1) {\n return [];\n }\n\n const response = await baseRequest({\n request,\n before: [...balanceTxs.before.values()],\n after: [...balanceTxs.after.values()],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== transactionCount) {\n throw new SimulationInvalidResponseError();\n }\n\n let prevBalanceTxIndex = 0;\n return [...balanceTxs.after.keys()]\n .map((token, index) => {\n const previousBalanceCheckSkipped = !balanceTxs.before.get(token);\n const previousBalance = previousBalanceCheckSkipped\n ? '0x0'\n : getAmountFromBalanceTransactionResult(\n from,\n token,\n // eslint-disable-next-line no-plusplus\n response.transactions[prevBalanceTxIndex++],\n );\n\n const newBalance = getAmountFromBalanceTransactionResult(\n from,\n token,\n response.transactions[index + balanceTxs.before.size + 1],\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): {\n before: BalanceTransactionMap;\n after: BalanceTransactionMap;\n} {\n const tokenKeys = new Set();\n const before = new Map();\n const after = new Map();\n const from = request.txParams.from as Hex;\n\n const userEvents = events.filter((event) =>\n [event.args.from, event.args.to].includes(from),\n );\n\n log('Filtered user events', userEvents);\n\n for (const event of userEvents) {\n const tokenIds = getEventTokenIds(event);\n\n log('Extracted token IDs', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const data = getBalanceTransactionData(\n event.tokenStandard,\n from,\n tokenId,\n );\n\n const transaction: SimulationRequestTransaction = {\n from,\n to: event.contractAddress,\n data,\n };\n\n if (skipPriorBalanceCheck(event)) {\n after.set(simulationToken, transaction);\n } else {\n before.set(simulationToken, transaction);\n after.set(simulationToken, transaction);\n }\n }\n }\n\n return { before, after };\n}\n\n/**\n * Check if an event needs to check the previous balance.\n *\n * @param event - The parsed event.\n * @returns True if the prior balance check should be skipped.\n */\nfunction skipPriorBalanceCheck(event: ParsedEvent): boolean {\n // In the case of an NFT mint, we cannot check the NFT owner before the mint\n // as the balance check transaction would revert.\n return (\n event.name === 'Transfer' &&\n event.tokenStandard === SimulationTokenStandard.erc721 &&\n parseInt(event.args.from as string, 16) === 0\n );\n}\n\n/**\n * Extract token IDs from a parsed event.\n *\n * @param event - The parsed event.\n * @returns An array of token IDs.\n */\nfunction getEventTokenIds(event: ParsedEvent): (Hex | undefined)[] {\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n return [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n return [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n return event.args.ids as Hex[];\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n return [undefined];\n}\n\n/**\n * Get the interface for a token standard.\n *\n * @param tokenStandard - The token standard.\n * @returns The interface for the token standard.\n */\nfunction getContractInterface(\n tokenStandard: SimulationTokenStandard,\n): Interface {\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721);\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155);\n default:\n return new Interface(abiERC20);\n }\n}\n\n/**\n * Extract the value from a balance transaction response using the correct ABI.\n *\n * @param from - The address to check the balance of.\n * @param token - The token to check the balance of.\n * @param response - The balance transaction response.\n * @returns The value of the balance transaction as Hex.\n */\nfunction getAmountFromBalanceTransactionResult(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const contract = getContractInterface(token.standard);\n\n try {\n if (token.standard === SimulationTokenStandard.erc721) {\n const result = contract.decodeFunctionResult('ownerOf', response.return);\n const owner = result[0];\n return owner.toLowerCase() === from.toLowerCase() ? '0x1' : '0x0';\n }\n\n const result = contract.decodeFunctionResult('balanceOf', response.return);\n return toHex(result[0]);\n } catch (error) {\n log('Failed to decode balance transaction', error, { token, response });\n throw new SimulationError(\n `Failed to decode balance transaction for token ${\n token.address\n }: ${String(error)}`,\n );\n }\n}\n\n/**\n * Generate the balance transaction data for a token.\n *\n * @param tokenStandard - The token standard.\n * @param from - The address to check the balance of.\n * @param tokenId - The token ID to check the balance of.\n * @returns The balance transaction data.\n */\nfunction getBalanceTransactionData(\n tokenStandard: SimulationTokenStandard,\n from: Hex,\n tokenId?: Hex,\n): Hex {\n const contract = getContractInterface(tokenStandard);\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return contract.encodeFunctionData('ownerOf', [tokenId]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return contract.encodeFunctionData('balanceOf', [from, tokenId]) as Hex;\n\n default:\n return contract.encodeFunctionData('balanceOf', [from]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\n *\n * @param eventLog - The raw event log.\n * @param interfaces - The contract interfaces.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n interfaces: Map<SupportedToken, Interface>,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const supportedTokens = Object.values(SupportedToken);\n\n for (const token of supportedTokens) {\n try {\n const contractInterface = interfaces.get(token) as Interface;\n const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];\n\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n // Not used\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n *\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n *\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @param offset - Optional offset to apply to the new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n offset: number = 0,\n): SimulationBalanceChange | undefined {\n const newBalanceBN = hexToBN(newBalance).add(new BN(offset));\n const previousBalanceBN = hexToBN(previousBalance);\n const differenceBN = newBalanceBN.sub(previousBalanceBN);\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance: toHex(newBalanceBN),\n difference,\n isDecrease,\n };\n}\n\n/**\n * Get the contract interfaces for all supported tokens.\n *\n * @returns A map of supported tokens to their contract interfaces.\n */\nfunction getContractInterfaces(): Map<SupportedToken, Interface> {\n const supportedTokens = Object.values(SupportedToken);\n\n return new Map(\n supportedTokens.map((tokenType) => {\n const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];\n const contractInterface = new Interface(abi);\n return [tokenType, contractInterface];\n }),\n );\n}\n\n/**\n * Base request to simulation API.\n *\n * @param options - Options bag.\n * @param options.after - Transactions to simulate after user's transaction.\n * @param options.before - Transactions to simulate before user's transaction.\n * @param options.params - Additional parameters for the request.\n * @param options.request - Original request object.\n * @returns The simulation response.\n */\nasync function baseRequest({\n request,\n params,\n before = [],\n after = [],\n}: {\n request: GetBalanceChangesRequest;\n params?: Partial<SimulationRequest>;\n before?: SimulationRequestTransaction[];\n after?: SimulationRequestTransaction[];\n}): Promise<SimulationResponse> {\n const { blockTime, chainId, ethQuery, getSimulationConfig, txParams } =\n request;\n const { authorizationList } = txParams;\n const from = txParams.from as Hex;\n\n const authorizationListFinal = authorizationList?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n const userTransaction: SimulationRequestTransaction = {\n authorizationList: authorizationListFinal,\n data: txParams.data as Hex,\n from: txParams.from as Hex,\n gas: txParams.gas as Hex,\n maxFeePerGas: (txParams.maxFeePerGas ?? txParams.gasPrice) as Hex,\n maxPriorityFeePerGas: (txParams.maxPriorityFeePerGas ??\n txParams.gasPrice) as Hex,\n to: txParams.to as Hex,\n value: txParams.value as Hex,\n };\n\n const transactions = [...before, userTransaction, ...after];\n const requiredBalanceBN = getRequiredBalance(request);\n const requiredBalanceHex = toHex(requiredBalanceBN);\n\n log('Required balance', requiredBalanceHex);\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n const currentBalanceHex = toHex(balanceRaw);\n const currentBalanceBN = hexToBN(currentBalanceHex);\n\n log('Current balance', currentBalanceHex);\n\n const isInsufficientBalance = currentBalanceBN.lt(requiredBalanceBN);\n\n return await simulateTransactions(chainId, {\n ...params,\n getSimulationConfig,\n transactions,\n withGas: true,\n withDefaultBlockOverrides: true,\n ...(blockTime && {\n blockOverrides: {\n ...params?.blockOverrides,\n time: toHex(blockTime),\n },\n }),\n ...(isInsufficientBalance && {\n overrides: {\n ...params?.overrides,\n [from]: {\n ...params?.overrides?.[from],\n balance: requiredBalanceHex,\n },\n },\n }),\n });\n}\n\n/**\n * Calculate the required minimum balance for a transaction.\n *\n * @param request - The transaction request.\n * @returns The minimal balance as a BN.\n */\nfunction getRequiredBalance(request: GetBalanceChangesRequest): BN {\n const { txParams } = request;\n const gasLimit = hexToBN(txParams.gas ?? '0x0');\n const gasPrice = hexToBN(txParams.maxFeePerGas ?? txParams.gasPrice ?? '0x0');\n const value = hexToBN(txParams.value ?? '0x0');\n\n const nestedValue = (request.nestedTransactions ?? [])\n .map((tx) => hexToBN(tx.value ?? '0x0'))\n .reduce((acc, val) => acc.add(val), new BN(0));\n\n return gasLimit.mul(gasPrice).add(value).add(nestedValue);\n}\n"]}
1
+ {"version":3,"file":"balance-changes.mjs","sourceRoot":"","sources":["../../src/utils/balance-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { getNativeBalance } from './balance';\nimport { simulateTransactions } from '../api/simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n SimulationResponseTransaction,\n SimulationRequest,\n} from '../api/simulation-api';\nimport {\n ABI_SIMULATION_ERC20_WRAPPED,\n ABI_SIMULATION_ERC721_LEGACY,\n} from '../constants';\nimport {\n SimulationError,\n SimulationInvalidResponseError,\n SimulationRevertedError,\n} from '../errors';\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n TransactionParams,\n NestedTransactionMetadata,\n GetSimulationConfig,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\n\nexport enum SupportedToken {\n ERC20 = 'erc20',\n ERC721 = 'erc721',\n ERC1155 = 'erc1155',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ERC20_WRAPPED = 'erc20Wrapped',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ERC721_LEGACY = 'erc721Legacy',\n}\n\ntype ABI = Fragment[];\n\nexport type GetBalanceChangesRequest = {\n blockTime?: number;\n chainId: Hex;\n ethQuery: EthQuery;\n getSimulationConfig: GetSimulationConfig;\n nestedTransactions?: NestedTransactionMetadata[];\n txParams: TransactionParams;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\nconst log = createModuleLogger(projectLogger, 'balance-changes');\n\nconst SUPPORTED_EVENTS = [\n 'Transfer',\n 'TransferSingle',\n 'TransferBatch',\n 'Deposit',\n 'Withdrawal',\n];\n\nconst SUPPORTED_TOKEN_ABIS = {\n [SupportedToken.ERC20]: {\n abi: abiERC20,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721]: {\n abi: abiERC721,\n standard: SimulationTokenStandard.erc721,\n },\n [SupportedToken.ERC1155]: {\n abi: abiERC1155,\n standard: SimulationTokenStandard.erc1155,\n },\n [SupportedToken.ERC20_WRAPPED]: {\n abi: ABI_SIMULATION_ERC20_WRAPPED,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721_LEGACY]: {\n abi: ABI_SIMULATION_ERC721_LEGACY,\n standard: SimulationTokenStandard.erc721,\n },\n};\n\nconst REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];\n\ntype BalanceTransactionMap = Map<SimulationToken, SimulationRequestTransaction>;\n\n/**\n * Generate simulation data for a transaction.\n *\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns The simulation data.\n */\nexport async function getBalanceChanges(\n request: GetBalanceChangesRequest,\n): Promise<{ simulationData: SimulationData; gasUsed?: Hex }> {\n log('Request', request);\n\n try {\n const response = await baseRequest({\n request,\n params: {\n withCallTrace: true,\n withLogs: true,\n },\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n throw new SimulationError(transactionError);\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n const gasUsed = response.transactions?.[0]?.gasUsed;\n const simulationData = {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n\n return { simulationData, gasUsed };\n } catch (error) {\n log('Failed to get balance changes', error, request);\n\n let simulationError = error as SimulationError;\n\n if (\n REVERTED_ERRORS.some((revertErrorMessage) =>\n simulationError.message?.includes(revertErrorMessage),\n )\n ) {\n simulationError = new SimulationRevertedError();\n }\n\n const { code, message } = simulationError;\n\n return {\n simulationData: {\n tokenBalanceChanges: [],\n error: {\n code,\n message,\n },\n },\n gasUsed: undefined,\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n *\n * @param request - Simulation request.\n * @param response - Simulation response.\n * @returns Native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n request: GetBalanceChangesRequest,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { txParams } = request;\n const userAddress = txParams.from as Hex;\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(\n previousBalance,\n newBalance,\n transactionResponse.gasCost,\n );\n}\n\n/**\n * Extract events from a simulation response.\n *\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const interfaces = getContractInterfaces();\n\n return logs\n .map((currentLog) => {\n const event = parseLog(currentLog, interfaces);\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find(\n (eventAbi) => eventAbi.name === event.name,\n )?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n if (!SUPPORTED_EVENTS.includes(event.name)) {\n log('Ignoring unsupported event', event.name, event);\n return undefined;\n }\n\n log('Normalizing event args', event.name, event);\n\n const args = normalizeEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((parsedEvent) => parsedEvent !== undefined) as ParsedEvent[];\n}\n\n/**\n * Normalize event arguments using ABI input definitions.\n *\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The normalized event arguments.\n */\nfunction normalizeEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = normalizeEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Normalize an event argument value.\n *\n * @param value - The event argument value.\n * @returns The normalized event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeEventArgValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map(normalizeEventArgValue);\n }\n\n let normalizedValue = value;\n\n normalizedValue = normalizedValue.toHexString?.() ?? normalizedValue;\n normalizedValue = normalizedValue.toLowerCase?.() ?? normalizedValue;\n\n return normalizedValue;\n}\n\n/**\n * Generate token balance changes from parsed events.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const { txParams } = request;\n const from = txParams.from as Hex;\n const balanceTxs = getTokenBalanceTransactions(request, events);\n\n log('Generated balance transactions', [...balanceTxs.after.values()]);\n\n const transactionCount = balanceTxs.before.size + balanceTxs.after.size + 1;\n\n if (transactionCount === 1) {\n return [];\n }\n\n const response = await baseRequest({\n request,\n before: [...balanceTxs.before.values()],\n after: [...balanceTxs.after.values()],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== transactionCount) {\n throw new SimulationInvalidResponseError();\n }\n\n let prevBalanceTxIndex = 0;\n return [...balanceTxs.after.keys()]\n .map((token, index) => {\n const previousBalanceCheckSkipped = !balanceTxs.before.get(token);\n const previousBalance = previousBalanceCheckSkipped\n ? '0x0'\n : getAmountFromBalanceTransactionResult(\n from,\n token,\n // eslint-disable-next-line no-plusplus\n response.transactions[prevBalanceTxIndex++],\n );\n\n const newBalance = getAmountFromBalanceTransactionResult(\n from,\n token,\n response.transactions[index + balanceTxs.before.size + 1],\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n *\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetBalanceChangesRequest,\n events: ParsedEvent[],\n): {\n before: BalanceTransactionMap;\n after: BalanceTransactionMap;\n} {\n const tokenKeys = new Set();\n const before = new Map();\n const after = new Map();\n const from = request.txParams.from as Hex;\n\n const userEvents = events.filter((event) =>\n [event.args.from, event.args.to].includes(from),\n );\n\n log('Filtered user events', userEvents);\n\n for (const event of userEvents) {\n const tokenIds = getEventTokenIds(event);\n\n log('Extracted token IDs', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const data = getBalanceTransactionData(\n event.tokenStandard,\n from,\n tokenId,\n );\n\n const transaction: SimulationRequestTransaction = {\n from,\n to: event.contractAddress,\n data,\n };\n\n if (skipPriorBalanceCheck(event)) {\n after.set(simulationToken, transaction);\n } else {\n before.set(simulationToken, transaction);\n after.set(simulationToken, transaction);\n }\n }\n }\n\n return { before, after };\n}\n\n/**\n * Check if an event needs to check the previous balance.\n *\n * @param event - The parsed event.\n * @returns True if the prior balance check should be skipped.\n */\nfunction skipPriorBalanceCheck(event: ParsedEvent): boolean {\n // In the case of an NFT mint, we cannot check the NFT owner before the mint\n // as the balance check transaction would revert.\n return (\n event.name === 'Transfer' &&\n event.tokenStandard === SimulationTokenStandard.erc721 &&\n parseInt(event.args.from as string, 16) === 0\n );\n}\n\n/**\n * Extract token IDs from a parsed event.\n *\n * @param event - The parsed event.\n * @returns An array of token IDs.\n */\nfunction getEventTokenIds(event: ParsedEvent): (Hex | undefined)[] {\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n return [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n return [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n return event.args.ids as Hex[];\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n return [undefined];\n}\n\n/**\n * Get the interface for a token standard.\n *\n * @param tokenStandard - The token standard.\n * @returns The interface for the token standard.\n */\nfunction getContractInterface(\n tokenStandard: SimulationTokenStandard,\n): Interface {\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721);\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155);\n default:\n return new Interface(abiERC20);\n }\n}\n\n/**\n * Extract the value from a balance transaction response using the correct ABI.\n *\n * @param from - The address to check the balance of.\n * @param token - The token to check the balance of.\n * @param response - The balance transaction response.\n * @returns The value of the balance transaction as Hex.\n */\nfunction getAmountFromBalanceTransactionResult(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const contract = getContractInterface(token.standard);\n\n try {\n if (token.standard === SimulationTokenStandard.erc721) {\n const result = contract.decodeFunctionResult('ownerOf', response.return);\n const owner = result[0];\n return owner.toLowerCase() === from.toLowerCase() ? '0x1' : '0x0';\n }\n\n const result = contract.decodeFunctionResult('balanceOf', response.return);\n return toHex(result[0]);\n } catch (error) {\n log('Failed to decode balance transaction', error, { token, response });\n throw new SimulationError(\n `Failed to decode balance transaction for token ${\n token.address\n }: ${String(error)}`,\n );\n }\n}\n\n/**\n * Generate the balance transaction data for a token.\n *\n * @param tokenStandard - The token standard.\n * @param from - The address to check the balance of.\n * @param tokenId - The token ID to check the balance of.\n * @returns The balance transaction data.\n */\nfunction getBalanceTransactionData(\n tokenStandard: SimulationTokenStandard,\n from: Hex,\n tokenId?: Hex,\n): Hex {\n const contract = getContractInterface(tokenStandard);\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return contract.encodeFunctionData('ownerOf', [tokenId]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return contract.encodeFunctionData('balanceOf', [from, tokenId]) as Hex;\n\n default:\n return contract.encodeFunctionData('balanceOf', [from]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\n *\n * @param eventLog - The raw event log.\n * @param interfaces - The contract interfaces.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n interfaces: Map<SupportedToken, Interface>,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const supportedTokens = Object.values(SupportedToken);\n\n for (const token of supportedTokens) {\n try {\n const contractInterface = interfaces.get(token) as Interface;\n const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];\n\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n *\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n *\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @param offset - Optional offset to apply to the new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n offset: number = 0,\n): SimulationBalanceChange | undefined {\n const newBalanceBN = hexToBN(newBalance).add(new BN(offset));\n const previousBalanceBN = hexToBN(previousBalance);\n const differenceBN = newBalanceBN.sub(previousBalanceBN);\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance: toHex(newBalanceBN),\n difference,\n isDecrease,\n };\n}\n\n/**\n * Get the contract interfaces for all supported tokens.\n *\n * @returns A map of supported tokens to their contract interfaces.\n */\nfunction getContractInterfaces(): Map<SupportedToken, Interface> {\n const supportedTokens = Object.values(SupportedToken);\n\n return new Map(\n supportedTokens.map((tokenType) => {\n const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];\n const contractInterface = new Interface(abi);\n return [tokenType, contractInterface];\n }),\n );\n}\n\n/**\n * Base request to simulation API.\n *\n * @param options - Options bag.\n * @param options.after - Transactions to simulate after user's transaction.\n * @param options.before - Transactions to simulate before user's transaction.\n * @param options.params - Additional parameters for the request.\n * @param options.request - Original request object.\n * @returns The simulation response.\n */\nasync function baseRequest({\n request,\n params,\n before = [],\n after = [],\n}: {\n request: GetBalanceChangesRequest;\n params?: Partial<SimulationRequest>;\n before?: SimulationRequestTransaction[];\n after?: SimulationRequestTransaction[];\n}): Promise<SimulationResponse> {\n const { blockTime, chainId, ethQuery, getSimulationConfig, txParams } =\n request;\n const { authorizationList } = txParams;\n const from = txParams.from as Hex;\n\n const authorizationListFinal = authorizationList?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n const userTransaction: SimulationRequestTransaction = {\n authorizationList: authorizationListFinal,\n data: txParams.data as Hex,\n from: txParams.from as Hex,\n gas: txParams.gas as Hex,\n maxFeePerGas: (txParams.maxFeePerGas ?? txParams.gasPrice) as Hex,\n maxPriorityFeePerGas: (txParams.maxPriorityFeePerGas ??\n txParams.gasPrice) as Hex,\n to: txParams.to as Hex,\n value: txParams.value as Hex,\n };\n\n const transactions = [...before, userTransaction, ...after];\n const requiredBalanceBN = getRequiredBalance(request);\n const requiredBalanceHex = toHex(requiredBalanceBN);\n\n log('Required balance', requiredBalanceHex);\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n const currentBalanceHex = toHex(balanceRaw);\n const currentBalanceBN = hexToBN(currentBalanceHex);\n\n log('Current balance', currentBalanceHex);\n\n const isInsufficientBalance = currentBalanceBN.lt(requiredBalanceBN);\n\n return await simulateTransactions(chainId, {\n ...params,\n getSimulationConfig,\n transactions,\n withGas: true,\n withDefaultBlockOverrides: true,\n ...(blockTime && {\n blockOverrides: {\n ...params?.blockOverrides,\n time: toHex(blockTime),\n },\n }),\n ...(isInsufficientBalance && {\n overrides: {\n ...params?.overrides,\n [from]: {\n ...params?.overrides?.[from],\n balance: requiredBalanceHex,\n },\n },\n }),\n });\n}\n\n/**\n * Calculate the required minimum balance for a transaction.\n *\n * @param request - The transaction request.\n * @returns The minimal balance as a BN.\n */\nfunction getRequiredBalance(request: GetBalanceChangesRequest): BN {\n const { txParams } = request;\n const gasLimit = hexToBN(txParams.gas ?? '0x0');\n const gasPrice = hexToBN(txParams.maxFeePerGas ?? txParams.gasPrice ?? '0x0');\n const value = hexToBN(txParams.value ?? '0x0');\n\n const nestedValue = (request.nestedTransactions ?? [])\n .map((tx) => hexToBN(tx.value ?? '0x0'))\n .reduce((acc, val) => acc.add(val), new BN(0));\n\n return gasLimit.mul(gasPrice).add(value).add(nestedValue);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"balance.cjs","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":";;;AAAA,iEAAmD;AAGnD,+CAAyC;AAIzC;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAAY,EAAE,QAAkB;IACrE,MAAM,aAAa,GAAG,CAAC,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,YAAY,EAAE;QACzD,OAAO;QACP,QAAQ;KACT,CAAC,CAAQ,CAAC;IAEX,MAAM,UAAU,GAAG,IAAI,wBAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,wBAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3E,OAAO;QACL,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAbD,4CAaC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,+BAA+B,CACnD,WAA4B,EAC5B,QAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAW,CAAC;IAE9C,MAAM,eAAe,GAAG,IAAI,wBAAS,CACnC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAClC,CAAC,YAAY,CACZ,WAAW,CAAC,QAAQ,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAC5E,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9D,OAAO,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC;AAfD,0EAeC","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionMeta } from '..';\n\n/**\n * Get the native balance for an address.\n *\n * @param address - Address to get the balance for.\n * @param ethQuery - EthQuery instance to use.\n * @returns Balance in both human-readable and raw format.\n */\nexport async function getNativeBalance(address: Hex, ethQuery: EthQuery) {\n const balanceRawHex = (await query(ethQuery, 'getBalance', [\n address,\n 'latest',\n ])) as Hex;\n\n const balanceRaw = new BigNumber(balanceRawHex).toString(10);\n const balanceHuman = new BigNumber(balanceRaw).shiftedBy(-18).toString(10);\n\n return {\n balanceHuman,\n balanceRaw,\n };\n}\n\n/**\n * Determine if the native balance is sufficient to cover max gas cost.\n *\n * @param transaction - Transaction metadata.\n * @param ethQuery - EthQuery instance.\n * @returns True if the native balance is sufficient, false otherwise.\n */\nexport async function isNativeBalanceSufficientForGas(\n transaction: TransactionMeta,\n ethQuery: EthQuery,\n): Promise<boolean> {\n const from = transaction.txParams.from as Hex;\n\n const gasCostRawValue = new BigNumber(\n transaction.txParams.gas ?? '0x0',\n ).multipliedBy(\n transaction.txParams.maxFeePerGas ?? transaction.txParams.gasPrice ?? '0x0',\n );\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n\n return gasCostRawValue.isLessThanOrEqualTo(balanceRaw);\n}\n"]}
1
+ {"version":3,"file":"balance.cjs","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":";;;AAAA,iEAAmD;AAGnD,+CAAyC;AAIzC;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAAY,EACZ,QAAkB;IAKlB,MAAM,aAAa,GAAG,CAAC,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,YAAY,EAAE;QACzD,OAAO;QACP,QAAQ;KACT,CAAC,CAAQ,CAAC;IAEX,MAAM,UAAU,GAAG,IAAI,wBAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,wBAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3E,OAAO;QACL,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAnBD,4CAmBC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,+BAA+B,CACnD,WAA4B,EAC5B,QAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAW,CAAC;IAE9C,MAAM,eAAe,GAAG,IAAI,wBAAS,CACnC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAClC,CAAC,YAAY,CACZ,WAAW,CAAC,QAAQ,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAC5E,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9D,OAAO,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC;AAfD,0EAeC","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionMeta } from '..';\n\n/**\n * Get the native balance for an address.\n *\n * @param address - Address to get the balance for.\n * @param ethQuery - EthQuery instance to use.\n * @returns Balance in both human-readable and raw format.\n */\nexport async function getNativeBalance(\n address: Hex,\n ethQuery: EthQuery,\n): Promise<{\n balanceHuman: string;\n balanceRaw: string;\n}> {\n const balanceRawHex = (await query(ethQuery, 'getBalance', [\n address,\n 'latest',\n ])) as Hex;\n\n const balanceRaw = new BigNumber(balanceRawHex).toString(10);\n const balanceHuman = new BigNumber(balanceRaw).shiftedBy(-18).toString(10);\n\n return {\n balanceHuman,\n balanceRaw,\n };\n}\n\n/**\n * Determine if the native balance is sufficient to cover max gas cost.\n *\n * @param transaction - Transaction metadata.\n * @param ethQuery - EthQuery instance.\n * @returns True if the native balance is sufficient, false otherwise.\n */\nexport async function isNativeBalanceSufficientForGas(\n transaction: TransactionMeta,\n ethQuery: EthQuery,\n): Promise<boolean> {\n const from = transaction.txParams.from as Hex;\n\n const gasCostRawValue = new BigNumber(\n transaction.txParams.gas ?? '0x0',\n ).multipliedBy(\n transaction.txParams.maxFeePerGas ?? transaction.txParams.gasPrice ?? '0x0',\n );\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n\n return gasCostRawValue.isLessThanOrEqualTo(balanceRaw);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"balance.d.cts","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAW;AAE1C;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ;;;GAatE;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
1
+ {"version":3,"file":"balance.d.cts","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAW;AAE1C;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAaD;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"balance.d.mts","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAW;AAE1C;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ;;;GAatE;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
1
+ {"version":3,"file":"balance.d.mts","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAW;AAE1C;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAaD;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"balance.mjs","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,mCAAmC;AAGnD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAIzC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAY,EAAE,QAAkB;IACrE,MAAM,aAAa,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE;QACzD,OAAO;QACP,QAAQ;KACT,CAAC,CAAQ,CAAC;IAEX,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3E,OAAO;QACL,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAA4B,EAC5B,QAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAW,CAAC;IAE9C,MAAM,eAAe,GAAG,IAAI,SAAS,CACnC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAClC,CAAC,YAAY,CACZ,WAAW,CAAC,QAAQ,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAC5E,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9D,OAAO,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionMeta } from '..';\n\n/**\n * Get the native balance for an address.\n *\n * @param address - Address to get the balance for.\n * @param ethQuery - EthQuery instance to use.\n * @returns Balance in both human-readable and raw format.\n */\nexport async function getNativeBalance(address: Hex, ethQuery: EthQuery) {\n const balanceRawHex = (await query(ethQuery, 'getBalance', [\n address,\n 'latest',\n ])) as Hex;\n\n const balanceRaw = new BigNumber(balanceRawHex).toString(10);\n const balanceHuman = new BigNumber(balanceRaw).shiftedBy(-18).toString(10);\n\n return {\n balanceHuman,\n balanceRaw,\n };\n}\n\n/**\n * Determine if the native balance is sufficient to cover max gas cost.\n *\n * @param transaction - Transaction metadata.\n * @param ethQuery - EthQuery instance.\n * @returns True if the native balance is sufficient, false otherwise.\n */\nexport async function isNativeBalanceSufficientForGas(\n transaction: TransactionMeta,\n ethQuery: EthQuery,\n): Promise<boolean> {\n const from = transaction.txParams.from as Hex;\n\n const gasCostRawValue = new BigNumber(\n transaction.txParams.gas ?? '0x0',\n ).multipliedBy(\n transaction.txParams.maxFeePerGas ?? transaction.txParams.gasPrice ?? '0x0',\n );\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n\n return gasCostRawValue.isLessThanOrEqualTo(balanceRaw);\n}\n"]}
1
+ {"version":3,"file":"balance.mjs","sourceRoot":"","sources":["../../src/utils/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,mCAAmC;AAGnD,OAAO,EAAE,SAAS,EAAE,qBAAqB;AAIzC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAY,EACZ,QAAkB;IAKlB,MAAM,aAAa,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE;QACzD,OAAO;QACP,QAAQ;KACT,CAAC,CAAQ,CAAC;IAEX,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3E,OAAO;QACL,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAA4B,EAC5B,QAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAW,CAAC;IAE9C,MAAM,eAAe,GAAG,IAAI,SAAS,CACnC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAClC,CAAC,YAAY,CACZ,WAAW,CAAC,QAAQ,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAC5E,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9D,OAAO,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { TransactionMeta } from '..';\n\n/**\n * Get the native balance for an address.\n *\n * @param address - Address to get the balance for.\n * @param ethQuery - EthQuery instance to use.\n * @returns Balance in both human-readable and raw format.\n */\nexport async function getNativeBalance(\n address: Hex,\n ethQuery: EthQuery,\n): Promise<{\n balanceHuman: string;\n balanceRaw: string;\n}> {\n const balanceRawHex = (await query(ethQuery, 'getBalance', [\n address,\n 'latest',\n ])) as Hex;\n\n const balanceRaw = new BigNumber(balanceRawHex).toString(10);\n const balanceHuman = new BigNumber(balanceRaw).shiftedBy(-18).toString(10);\n\n return {\n balanceHuman,\n balanceRaw,\n };\n}\n\n/**\n * Determine if the native balance is sufficient to cover max gas cost.\n *\n * @param transaction - Transaction metadata.\n * @param ethQuery - EthQuery instance.\n * @returns True if the native balance is sufficient, false otherwise.\n */\nexport async function isNativeBalanceSufficientForGas(\n transaction: TransactionMeta,\n ethQuery: EthQuery,\n): Promise<boolean> {\n const from = transaction.txParams.from as Hex;\n\n const gasCostRawValue = new BigNumber(\n transaction.txParams.gas ?? '0x0',\n ).multipliedBy(\n transaction.txParams.maxFeePerGas ?? transaction.txParams.gasPrice ?? '0x0',\n );\n\n const { balanceRaw } = await getNativeBalance(from, ethQuery);\n\n return gasCostRawValue.isLessThanOrEqualTo(balanceRaw);\n}\n"]}
@@ -124,7 +124,7 @@ async function getNestedTransactionMeta(request, singleRequest, ethQuery) {
124
124
  */
125
125
  async function addTransactionBatchWith7702(request) {
126
126
  const { addTransaction, getChainId, messenger, publicKeyEIP7702, request: userRequest, } = request;
127
- const { batchId: batchIdOverride, disableUpgrade, from, gasFeeToken, networkClientId, origin, overwriteUpgrade, requireApproval, securityAlertId, skipInitialGasEstimate, transactions, validateSecurity, } = userRequest;
127
+ const { batchId: batchIdOverride, disableUpgrade, from, gasFeeToken, gasLimit7702, networkClientId, origin, overwriteUpgrade, requireApproval, securityAlertId, skipInitialGasEstimate, transactions, validateSecurity, } = userRequest;
128
128
  const chainId = getChainId(networkClientId);
129
129
  const ethQuery = request.getEthQuery(networkClientId);
130
130
  const isChainSupported = (0, eip7702_1.doesChainSupportEIP7702)(chainId, messenger);
@@ -155,6 +155,7 @@ async function addTransactionBatchWith7702(request) {
155
155
  const txParams = {
156
156
  ...batchParams,
157
157
  from,
158
+ gas: gasLimit7702,
158
159
  maxFeePerGas: nestedTransactions[0]?.maxFeePerGas,
159
160
  maxPriorityFeePerGas: nestedTransactions[0]?.maxPriorityFeePerGas,
160
161
  };
@@ -290,7 +291,11 @@ async function addTransactionBatchWithHook(request) {
290
291
  ...transaction,
291
292
  signedTx: signedTransactions[i],
292
293
  }));
293
- const hookParams = { from, networkClientId, transactions };
294
+ const hookParams = {
295
+ from,
296
+ networkClientId,
297
+ transactions,
298
+ };
294
299
  log('Calling publish batch hook', hookParams);
295
300
  let result = await publishBatchHook(hookParams);
296
301
  log('Publish batch hook result', result);
@@ -436,7 +441,7 @@ async function requestApproval(txBatchMeta, messenger) {
436
441
  log('Requesting approval for transaction batch', id);
437
442
  return (await messenger.call('ApprovalController:addRequest', {
438
443
  id,
439
- origin: origin || controller_utils_1.ORIGIN_METAMASK,
444
+ origin: origin ?? controller_utils_1.ORIGIN_METAMASK,
440
445
  requestData,
441
446
  expectsResult: true,
442
447
  type,
@@ -496,7 +501,7 @@ async function prepareApprovalData({ batchId, request, }) {
496
501
  }
497
502
  log('Preparing approval data for batch');
498
503
  const chainId = getChainId(networkClientId);
499
- const { gasLimit } = await (0, gas_1.simulateGasBatch)({
504
+ const { totalGasLimit: gasLimit } = await (0, gas_1.simulateGasBatch)({
500
505
  chainId,
501
506
  from,
502
507
  getSimulationConfig,