@metamask-previews/transaction-controller 56.1.0-preview-4ec8b2d → 56.1.0-preview-37f78da

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 (36) hide show
  1. package/CHANGELOG.md +0 -4
  2. package/dist/TransactionController.cjs +55 -17
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts.map +1 -1
  6. package/dist/TransactionController.mjs +58 -20
  7. package/dist/TransactionController.mjs.map +1 -1
  8. package/dist/api/simulation-api.cjs.map +1 -1
  9. package/dist/api/simulation-api.d.cts +5 -15
  10. package/dist/api/simulation-api.d.cts.map +1 -1
  11. package/dist/api/simulation-api.d.mts +5 -15
  12. package/dist/api/simulation-api.d.mts.map +1 -1
  13. package/dist/api/simulation-api.mjs.map +1 -1
  14. package/dist/utils/{balance-changes.cjs → simulation.cjs} +108 -96
  15. package/dist/utils/simulation.cjs.map +1 -0
  16. package/dist/utils/simulation.d.cts +60 -0
  17. package/dist/utils/simulation.d.cts.map +1 -0
  18. package/dist/utils/simulation.d.mts +60 -0
  19. package/dist/utils/simulation.d.mts.map +1 -0
  20. package/dist/utils/{balance-changes.mjs → simulation.mjs} +107 -100
  21. package/dist/utils/simulation.mjs.map +1 -0
  22. package/package.json +1 -1
  23. package/dist/utils/balance-changes.cjs.map +0 -1
  24. package/dist/utils/balance-changes.d.cts +0 -30
  25. package/dist/utils/balance-changes.d.cts.map +0 -1
  26. package/dist/utils/balance-changes.d.mts +0 -30
  27. package/dist/utils/balance-changes.d.mts.map +0 -1
  28. package/dist/utils/balance-changes.mjs.map +0 -1
  29. package/dist/utils/gas-fee-tokens.cjs +0 -122
  30. package/dist/utils/gas-fee-tokens.cjs.map +0 -1
  31. package/dist/utils/gas-fee-tokens.d.cts +0 -22
  32. package/dist/utils/gas-fee-tokens.d.cts.map +0 -1
  33. package/dist/utils/gas-fee-tokens.d.mts +0 -22
  34. package/dist/utils/gas-fee-tokens.d.mts.map +0 -1
  35. package/dist/utils/gas-fee-tokens.mjs +0 -118
  36. package/dist/utils/gas-fee-tokens.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"simulation-api.cjs","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACjE,2CAA+D;AAE/D,0CAA8E;AAC9E,0CAA0C;AAE1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE,MAAM,UAAU,GAAG,6BAA6B,CAAC;AACjD,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAuOrC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAY,EACZ,OAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACnC,gBAAgB,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC,OAAO,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,YAAY,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,wBAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;KAC1C;IAED,OAAO,YAAY,EAAE,MAAM,CAAC;AAC9B,CAAC;AA/BD,oDA+BC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAY;IAC1C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAA,sCAAmB,EAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;QAC3B,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,yCAAgC,CAAC,OAAO,CAAC,CAAC;KACrD;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { SimulationChainNotSupportedError, SimulationError } from '../errors';\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n authorizationList?: {\n /** Address of a smart contract that contains the code to be set. */\n address: Hex;\n\n /** Address of the account being upgraded. */\n from: Hex;\n }[];\n\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n blockOverrides?: {\n time?: Hex;\n };\n\n /**\n * Overrides to the state of the blockchain, keyed by address.\n */\n overrides?: {\n [address: Hex]: {\n /** Override the code for an address. */\n code?: Hex;\n\n /** Overrides to the storage slots for an address. */\n stateDiff?: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include available token fees.\n */\n suggestFees?: {\n /* Whether to estimate gas for the transaction being submitted via a delegation. */\n with7702?: boolean;\n\n /* Whether to include the gas fee of the token transfer. */\n withFeeTransfer?: boolean;\n\n /* Whether to include the native transfer if available. */\n withTransfer?: boolean;\n };\n\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include the default block data in the simulation.\n * Defaults to false.\n */\n withDefaultBlockOverrides?: boolean;\n\n /**\n * Whether to use the gas fees in the simulation.\n * Defaults to false.\n */\n withGas?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\nexport type SimulationResponseTokenFee = {\n /** Token data independent of current transaction. */\n token: {\n /** Address of the token contract. */\n address: Hex;\n\n /** Decimals of the token. */\n decimals: number;\n\n /** Symbol of the token. */\n symbol: string;\n };\n\n /** Amount of tokens needed to pay for gas. */\n balanceNeededToken: Hex;\n\n /** Current token balance of sender. */\n currentBalanceToken: Hex;\n\n /** Account address that token should be transferred to. */\n feeRecipient: Hex;\n\n /** Conversation rate of 1 token to native WEI. */\n rateWei: Hex;\n\n /** Estimated gas limit required for fee transfer. */\n transferEstimate: Hex;\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Recommended gas fees for the transaction. */\n fees?: {\n /** Gas limit for the fee level. */\n gas: Hex;\n\n /** Maximum fee per gas for the fee level. */\n maxFeePerGas: Hex;\n\n /** Maximum priority fee per gas for the fee level. */\n maxPriorityFeePerGas: Hex;\n\n /** Token fee data for the fee level. */\n tokenFees: SimulationResponseTokenFee[];\n }[];\n\n /** Required `gasLimit` for the transaction. */\n gasLimit?: Hex;\n\n /** Total gas used by the transaction. */\n gasUsed?: Hex;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n *\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n * @returns The response from the simulation API.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new SimulationError(message, code);\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n *\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new SimulationChainNotSupportedError(chainId);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n *\n * @returns The network data response from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n *\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"]}
1
+ {"version":3,"file":"simulation-api.cjs","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACjE,2CAA+D;AAE/D,0CAA8E;AAC9E,0CAA0C;AAE1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE,MAAM,UAAU,GAAG,6BAA6B,CAAC;AACjD,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AA2NrC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAY,EACZ,OAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACnC,gBAAgB,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC,OAAO,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,YAAY,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,wBAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;KAC1C;IAED,OAAO,YAAY,EAAE,MAAM,CAAC;AAC9B,CAAC;AA/BD,oDA+BC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAY;IAC1C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAA,sCAAmB,EAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;QAC3B,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,yCAAgC,CAAC,OAAO,CAAC,CAAC;KACrD;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { SimulationChainNotSupportedError, SimulationError } from '../errors';\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n authorizationList?: {\n /** Address of a smart contract that contains the code to be set. */\n address: Hex;\n\n /** Address of the account being upgraded. */\n from: Hex;\n }[];\n\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n blockOverrides?: {\n time?: Hex;\n };\n\n /**\n * Overrides to the state of the blockchain, keyed by address.\n */\n overrides?: {\n [address: Hex]: {\n /** Override the code for an address. */\n code?: Hex;\n\n /** Overrides to the storage slots for an address. */\n stateDiff?: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include available token fees.\n */\n suggestFees?: {\n /* Whether to estimate gas for the transaction being submitted via a delegation. */\n with7702?: boolean;\n\n /* Whether to include the gas fee of the token transfer. */\n withFeeTransfer?: boolean;\n\n /* Whether to include the native transfer if available. */\n withTransfer?: boolean;\n };\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\nexport type SimulationResponseTokenFee = {\n /** Token data independent of current transaction. */\n token: {\n /** Address of the token contract. */\n address: Hex;\n\n /** Decimals of the token. */\n decimals: number;\n\n /** Symbol of the token. */\n symbol: string;\n };\n\n /** Amount of tokens needed to pay for gas. */\n balanceNeededToken: Hex;\n\n /** Current token balance of sender. */\n currentBalanceToken: Hex;\n\n /** Account address that token should be transferred to. */\n feeRecipient: Hex;\n\n /** Conversation rate of 1 token to native WEI. */\n rateWei: Hex;\n\n /** Estimated gas limit required for fee transfer. */\n transferEstimate: Hex;\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Recommended gas fees for the transaction. */\n fees?: {\n /** Gas limit for the fee level. */\n gas: Hex;\n\n /** Maximum fee per gas for the fee level. */\n maxFeePerGas: Hex;\n\n /** Maximum priority fee per gas for the fee level. */\n maxPriorityFeePerGas: Hex;\n\n /** Token fee data for the fee level. */\n tokenFees: SimulationResponseTokenFee[];\n }[];\n\n /** Required `gasLimit` for the transaction. */\n gasLimit?: Hex;\n\n /** Total gas used by the transaction. */\n gasUsed?: Hex;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n *\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n * @returns The response from the simulation API.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new SimulationError(message, code);\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n *\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new SimulationChainNotSupportedError(chainId);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n *\n * @returns The network data response from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n *\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"]}
@@ -24,6 +24,11 @@ export type SimulationRequestTransaction = {
24
24
  };
25
25
  /** Request to the simulation API to simulate transactions. */
26
26
  export type SimulationRequest = {
27
+ /**
28
+ * Transactions to be sequentially simulated.
29
+ * State changes impact subsequent transactions in the list.
30
+ */
31
+ transactions: SimulationRequestTransaction[];
27
32
  blockOverrides?: {
28
33
  time?: Hex;
29
34
  };
@@ -48,26 +53,11 @@ export type SimulationRequest = {
48
53
  withFeeTransfer?: boolean;
49
54
  withTransfer?: boolean;
50
55
  };
51
- /**
52
- * Transactions to be sequentially simulated.
53
- * State changes impact subsequent transactions in the list.
54
- */
55
- transactions: SimulationRequestTransaction[];
56
56
  /**
57
57
  * Whether to include call traces in the response.
58
58
  * Defaults to false.
59
59
  */
60
60
  withCallTrace?: boolean;
61
- /**
62
- * Whether to include the default block data in the simulation.
63
- * Defaults to false.
64
- */
65
- withDefaultBlockOverrides?: boolean;
66
- /**
67
- * Whether to use the gas fees in the simulation.
68
- * Defaults to false.
69
- */
70
- withGas?: boolean;
71
61
  /**
72
62
  * Whether to include event logs in the response.
73
63
  * Defaults to false.
@@ -1 +1 @@
1
- {"version":3,"file":"simulation-api.d.cts","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simulation-api.d.cts","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,11 @@ export type SimulationRequestTransaction = {
24
24
  };
25
25
  /** Request to the simulation API to simulate transactions. */
26
26
  export type SimulationRequest = {
27
+ /**
28
+ * Transactions to be sequentially simulated.
29
+ * State changes impact subsequent transactions in the list.
30
+ */
31
+ transactions: SimulationRequestTransaction[];
27
32
  blockOverrides?: {
28
33
  time?: Hex;
29
34
  };
@@ -48,26 +53,11 @@ export type SimulationRequest = {
48
53
  withFeeTransfer?: boolean;
49
54
  withTransfer?: boolean;
50
55
  };
51
- /**
52
- * Transactions to be sequentially simulated.
53
- * State changes impact subsequent transactions in the list.
54
- */
55
- transactions: SimulationRequestTransaction[];
56
56
  /**
57
57
  * Whether to include call traces in the response.
58
58
  * Defaults to false.
59
59
  */
60
60
  withCallTrace?: boolean;
61
- /**
62
- * Whether to include the default block data in the simulation.
63
- * Defaults to false.
64
- */
65
- withDefaultBlockOverrides?: boolean;
66
- /**
67
- * Whether to use the gas fees in the simulation.
68
- * Defaults to false.
69
- */
70
- withGas?: boolean;
71
61
  /**
72
62
  * Whether to include event logs in the response.
73
63
  * Defaults to false.
@@ -1 +1 @@
1
- {"version":3,"file":"simulation-api.d.mts","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simulation-api.d.mts","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"simulation-api.mjs","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mCAAmC;AACjE,OAAO,EAAE,kBAAkB,EAAY,wBAAwB;AAE/D,OAAO,EAAE,gCAAgC,EAAE,eAAe,EAAE,sBAAkB;AAC9E,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAE1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE,MAAM,UAAU,GAAG,6BAA6B,CAAC;AACjD,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAuOrC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAY,EACZ,OAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACnC,gBAAgB,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC,OAAO,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,YAAY,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;KAC1C;IAED,OAAO,YAAY,EAAE,MAAM,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAY;IAC1C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;QAC3B,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,gCAAgC,CAAC,OAAO,CAAC,CAAC;KACrD;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { SimulationChainNotSupportedError, SimulationError } from '../errors';\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n authorizationList?: {\n /** Address of a smart contract that contains the code to be set. */\n address: Hex;\n\n /** Address of the account being upgraded. */\n from: Hex;\n }[];\n\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n blockOverrides?: {\n time?: Hex;\n };\n\n /**\n * Overrides to the state of the blockchain, keyed by address.\n */\n overrides?: {\n [address: Hex]: {\n /** Override the code for an address. */\n code?: Hex;\n\n /** Overrides to the storage slots for an address. */\n stateDiff?: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include available token fees.\n */\n suggestFees?: {\n /* Whether to estimate gas for the transaction being submitted via a delegation. */\n with7702?: boolean;\n\n /* Whether to include the gas fee of the token transfer. */\n withFeeTransfer?: boolean;\n\n /* Whether to include the native transfer if available. */\n withTransfer?: boolean;\n };\n\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include the default block data in the simulation.\n * Defaults to false.\n */\n withDefaultBlockOverrides?: boolean;\n\n /**\n * Whether to use the gas fees in the simulation.\n * Defaults to false.\n */\n withGas?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\nexport type SimulationResponseTokenFee = {\n /** Token data independent of current transaction. */\n token: {\n /** Address of the token contract. */\n address: Hex;\n\n /** Decimals of the token. */\n decimals: number;\n\n /** Symbol of the token. */\n symbol: string;\n };\n\n /** Amount of tokens needed to pay for gas. */\n balanceNeededToken: Hex;\n\n /** Current token balance of sender. */\n currentBalanceToken: Hex;\n\n /** Account address that token should be transferred to. */\n feeRecipient: Hex;\n\n /** Conversation rate of 1 token to native WEI. */\n rateWei: Hex;\n\n /** Estimated gas limit required for fee transfer. */\n transferEstimate: Hex;\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Recommended gas fees for the transaction. */\n fees?: {\n /** Gas limit for the fee level. */\n gas: Hex;\n\n /** Maximum fee per gas for the fee level. */\n maxFeePerGas: Hex;\n\n /** Maximum priority fee per gas for the fee level. */\n maxPriorityFeePerGas: Hex;\n\n /** Token fee data for the fee level. */\n tokenFees: SimulationResponseTokenFee[];\n }[];\n\n /** Required `gasLimit` for the transaction. */\n gasLimit?: Hex;\n\n /** Total gas used by the transaction. */\n gasUsed?: Hex;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n *\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n * @returns The response from the simulation API.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new SimulationError(message, code);\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n *\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new SimulationChainNotSupportedError(chainId);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n *\n * @returns The network data response from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n *\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"]}
1
+ {"version":3,"file":"simulation-api.mjs","sourceRoot":"","sources":["../../src/api/simulation-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mCAAmC;AACjE,OAAO,EAAE,kBAAkB,EAAY,wBAAwB;AAE/D,OAAO,EAAE,gCAAgC,EAAE,eAAe,EAAE,sBAAkB;AAC9E,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAE1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAEhE,MAAM,UAAU,GAAG,6BAA6B,CAAC;AACjD,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,iBAAiB,GAAG,UAAU,CAAC;AA2NrC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAY,EACZ,OAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACnC,gBAAgB,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC,OAAO,CAAC;SAClB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,YAAY,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;KAC1C;IAED,OAAO,YAAY,EAAE,MAAM,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAY;IAC1C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;QAC3B,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,gCAAgC,CAAC,OAAO,CAAC,CAAC;KACrD;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { SimulationChainNotSupportedError, SimulationError } from '../errors';\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n authorizationList?: {\n /** Address of a smart contract that contains the code to be set. */\n address: Hex;\n\n /** Address of the account being upgraded. */\n from: Hex;\n }[];\n\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n blockOverrides?: {\n time?: Hex;\n };\n\n /**\n * Overrides to the state of the blockchain, keyed by address.\n */\n overrides?: {\n [address: Hex]: {\n /** Override the code for an address. */\n code?: Hex;\n\n /** Overrides to the storage slots for an address. */\n stateDiff?: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include available token fees.\n */\n suggestFees?: {\n /* Whether to estimate gas for the transaction being submitted via a delegation. */\n with7702?: boolean;\n\n /* Whether to include the gas fee of the token transfer. */\n withFeeTransfer?: boolean;\n\n /* Whether to include the native transfer if available. */\n withTransfer?: boolean;\n };\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\nexport type SimulationResponseTokenFee = {\n /** Token data independent of current transaction. */\n token: {\n /** Address of the token contract. */\n address: Hex;\n\n /** Decimals of the token. */\n decimals: number;\n\n /** Symbol of the token. */\n symbol: string;\n };\n\n /** Amount of tokens needed to pay for gas. */\n balanceNeededToken: Hex;\n\n /** Current token balance of sender. */\n currentBalanceToken: Hex;\n\n /** Account address that token should be transferred to. */\n feeRecipient: Hex;\n\n /** Conversation rate of 1 token to native WEI. */\n rateWei: Hex;\n\n /** Estimated gas limit required for fee transfer. */\n transferEstimate: Hex;\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Recommended gas fees for the transaction. */\n fees?: {\n /** Gas limit for the fee level. */\n gas: Hex;\n\n /** Maximum fee per gas for the fee level. */\n maxFeePerGas: Hex;\n\n /** Maximum priority fee per gas for the fee level. */\n maxPriorityFeePerGas: Hex;\n\n /** Token fee data for the fee level. */\n tokenFees: SimulationResponseTokenFee[];\n }[];\n\n /** Required `gasLimit` for the transaction. */\n gasLimit?: Hex;\n\n /** Total gas used by the transaction. */\n gasUsed?: Hex;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n *\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n * @returns The response from the simulation API.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new SimulationError(message, code);\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n *\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new SimulationChainNotSupportedError(chainId);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n *\n * @returns The network data response from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n *\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"]}
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getBalanceChanges = exports.SupportedToken = void 0;
3
+ exports.getEvents = exports.getSimulationData = exports.SupportedToken = void 0;
7
4
  const abi_1 = require("@ethersproject/abi");
8
5
  const controller_utils_1 = require("@metamask/controller-utils");
9
6
  const metamask_eth_abis_1 = require("@metamask/metamask-eth-abis");
10
7
  const utils_1 = require("@metamask/utils");
11
- const bn_js_1 = __importDefault(require("bn.js"));
12
8
  const simulation_api_1 = require("../api/simulation-api.cjs");
13
9
  const constants_1 = require("../constants.cjs");
14
10
  const errors_1 = require("../errors.cjs");
@@ -22,7 +18,7 @@ var SupportedToken;
22
18
  SupportedToken["ERC20_WRAPPED"] = "erc20Wrapped";
23
19
  SupportedToken["ERC721_LEGACY"] = "erc721Legacy";
24
20
  })(SupportedToken || (exports.SupportedToken = SupportedToken = {}));
25
- const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'balance-changes');
21
+ const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'simulation');
26
22
  const SUPPORTED_EVENTS = [
27
23
  'Transfer',
28
24
  'TransferSingle',
@@ -62,64 +58,95 @@ const REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];
62
58
  * @param request.to - The recipient of the transaction.
63
59
  * @param request.value - The value of the transaction.
64
60
  * @param request.data - The data of the transaction.
61
+ * @param options - Additional options.
62
+ * @param options.blockTime - An optional block time to simulate the transaction at.
65
63
  * @returns The simulation data.
66
64
  */
67
- async function getBalanceChanges(request) {
68
- log('Request', request);
65
+ async function getSimulationData(request, options = {}) {
66
+ const { authorizationList, chainId, from, to, value, data } = request;
67
+ const { use7702Fees } = options;
68
+ log('Getting simulation data', { request, options });
69
69
  try {
70
70
  const response = await baseRequest({
71
- request,
71
+ chainId,
72
+ from,
73
+ options,
72
74
  params: {
75
+ suggestFees: {
76
+ withFeeTransfer: true,
77
+ withTransfer: true,
78
+ ...(use7702Fees ? { with7702: true } : {}),
79
+ },
73
80
  withCallTrace: true,
74
81
  withLogs: true,
75
82
  },
83
+ transactions: [
84
+ {
85
+ authorizationList,
86
+ data,
87
+ from,
88
+ to,
89
+ value,
90
+ },
91
+ ],
76
92
  });
77
93
  const transactionError = response.transactions?.[0]?.error;
78
94
  if (transactionError) {
79
95
  throw new errors_1.SimulationError(transactionError);
80
96
  }
81
- const nativeBalanceChange = getNativeBalanceChange(request, response);
97
+ const nativeBalanceChange = getNativeBalanceChange(request.from, response);
82
98
  const events = getEvents(response);
83
99
  log('Parsed events', events);
84
- const tokenBalanceChanges = await getTokenBalanceChanges(request, events);
100
+ const tokenBalanceChanges = await getTokenBalanceChanges(request, events, options);
85
101
  const simulationData = {
86
102
  nativeBalanceChange,
87
103
  tokenBalanceChanges,
88
104
  };
89
- return simulationData;
105
+ let gasFeeTokens = [];
106
+ try {
107
+ gasFeeTokens = getGasFeeTokens(response);
108
+ }
109
+ catch (error) {
110
+ log('Failed to parse gas fee tokens', error, response);
111
+ }
112
+ return {
113
+ gasFeeTokens,
114
+ simulationData,
115
+ };
90
116
  }
91
117
  catch (error) {
92
- log('Failed to get balance changes', error, request);
118
+ log('Failed to get simulation data', error, request);
93
119
  let simulationError = error;
94
120
  if (REVERTED_ERRORS.some((revertErrorMessage) => simulationError.message?.includes(revertErrorMessage))) {
95
121
  simulationError = new errors_1.SimulationRevertedError();
96
122
  }
97
123
  const { code, message } = simulationError;
98
124
  return {
99
- tokenBalanceChanges: [],
100
- error: {
101
- code,
102
- message,
125
+ gasFeeTokens: [],
126
+ simulationData: {
127
+ tokenBalanceChanges: [],
128
+ error: {
129
+ code,
130
+ message,
131
+ },
103
132
  },
104
133
  };
105
134
  }
106
135
  }
107
- exports.getBalanceChanges = getBalanceChanges;
136
+ exports.getSimulationData = getSimulationData;
108
137
  /**
109
138
  * Extract the native balance change from a simulation response.
110
139
  *
111
- * @param request - Simulation request.
112
- * @param response - Simulation response.
113
- * @returns Native balance change or undefined if unchanged.
140
+ * @param userAddress - The user's account address.
141
+ * @param response - The simulation response.
142
+ * @returns The native balance change or undefined if unchanged.
114
143
  */
115
- function getNativeBalanceChange(request, response) {
144
+ function getNativeBalanceChange(userAddress, response) {
116
145
  const transactionResponse = response.transactions[0];
117
146
  /* istanbul ignore next */
118
147
  if (!transactionResponse) {
119
148
  return undefined;
120
149
  }
121
- const { txParams } = request;
122
- const userAddress = txParams.from;
123
150
  const { stateDiff } = transactionResponse;
124
151
  const previousBalance = stateDiff?.pre?.[userAddress]?.balance;
125
152
  const newBalance = stateDiff?.post?.[userAddress]?.balance;
@@ -169,6 +196,7 @@ function getEvents(response) {
169
196
  })
170
197
  .filter((e) => e !== undefined);
171
198
  }
199
+ exports.getEvents = getEvents;
172
200
  /**
173
201
  * Normalize event arguments using ABI input definitions.
174
202
  *
@@ -205,24 +233,30 @@ function normalizeEventArgValue(value) {
205
233
  *
206
234
  * @param request - The transaction that was simulated.
207
235
  * @param events - The parsed events.
236
+ * @param options - Additional options.
237
+ * @param options.blockTime - An optional block time to simulate the transaction at.
208
238
  * @returns An array of token balance changes.
209
239
  */
210
- async function getTokenBalanceChanges(request, events) {
211
- const { txParams } = request;
212
- const from = txParams.from;
240
+ async function getTokenBalanceChanges(request, events, options) {
241
+ const { chainId, from } = request;
213
242
  const balanceTxs = getTokenBalanceTransactions(request, events);
214
243
  log('Generated balance transactions', [...balanceTxs.after.values()]);
215
- const transactionCount = balanceTxs.before.size + balanceTxs.after.size + 1;
216
- if (transactionCount === 1) {
244
+ const transactions = [
245
+ ...balanceTxs.before.values(),
246
+ request,
247
+ ...balanceTxs.after.values(),
248
+ ];
249
+ if (transactions.length === 1) {
217
250
  return [];
218
251
  }
219
252
  const response = await baseRequest({
220
- request,
221
- before: [...balanceTxs.before.values()],
222
- after: [...balanceTxs.after.values()],
253
+ chainId,
254
+ from,
255
+ options,
256
+ transactions,
223
257
  });
224
258
  log('Balance simulation response', response);
225
- if (response.transactions.length !== transactionCount) {
259
+ if (response.transactions.length !== transactions.length) {
226
260
  throw new errors_1.SimulationInvalidResponseError();
227
261
  }
228
262
  let prevBalanceTxIndex = 0;
@@ -231,10 +265,10 @@ async function getTokenBalanceChanges(request, events) {
231
265
  const previousBalanceCheckSkipped = !balanceTxs.before.get(token);
232
266
  const previousBalance = previousBalanceCheckSkipped
233
267
  ? '0x0'
234
- : getAmountFromBalanceTransactionResult(from, token,
268
+ : getAmountFromBalanceTransactionResult(request.from, token,
235
269
  // eslint-disable-next-line no-plusplus
236
270
  response.transactions[prevBalanceTxIndex++]);
237
- const newBalance = getAmountFromBalanceTransactionResult(from, token, response.transactions[index + balanceTxs.before.size + 1]);
271
+ const newBalance = getAmountFromBalanceTransactionResult(request.from, token, response.transactions[index + balanceTxs.before.size + 1]);
238
272
  const balanceChange = getSimulationBalanceChange(previousBalance, newBalance);
239
273
  if (!balanceChange) {
240
274
  return undefined;
@@ -257,8 +291,7 @@ function getTokenBalanceTransactions(request, events) {
257
291
  const tokenKeys = new Set();
258
292
  const before = new Map();
259
293
  const after = new Map();
260
- const from = request.txParams.from;
261
- const userEvents = events.filter((event) => [event.args.from, event.args.to].includes(from));
294
+ const userEvents = events.filter((event) => [event.args.from, event.args.to].includes(request.from));
262
295
  log('Filtered user events', userEvents);
263
296
  for (const event of userEvents) {
264
297
  const tokenIds = getEventTokenIds(event);
@@ -275,9 +308,9 @@ function getTokenBalanceTransactions(request, events) {
275
308
  continue;
276
309
  }
277
310
  tokenKeys.add(tokenKey);
278
- const data = getBalanceTransactionData(event.tokenStandard, from, tokenId);
311
+ const data = getBalanceTransactionData(event.tokenStandard, request.from, tokenId);
279
312
  const transaction = {
280
- from,
313
+ from: request.from,
281
314
  to: event.contractAddress,
282
315
  data,
283
316
  };
@@ -463,82 +496,61 @@ function getContractInterfaces() {
463
496
  return [tokenType, contractInterface];
464
497
  }));
465
498
  }
499
+ /**
500
+ * Extract gas fee tokens from a simulation response.
501
+ *
502
+ * @param response - The simulation response.
503
+ * @returns An array of gas fee tokens.
504
+ */
505
+ function getGasFeeTokens(response) {
506
+ const feeLevel = response.transactions?.[0]
507
+ ?.fees?.[0];
508
+ const tokenFees = feeLevel?.tokenFees ?? [];
509
+ return tokenFees.map((tokenFee) => ({
510
+ amount: tokenFee.balanceNeededToken,
511
+ balance: tokenFee.currentBalanceToken,
512
+ decimals: tokenFee.token.decimals,
513
+ gas: feeLevel.gas,
514
+ gasTransfer: tokenFee.transferEstimate,
515
+ maxFeePerGas: feeLevel.maxFeePerGas,
516
+ maxPriorityFeePerGas: feeLevel.maxPriorityFeePerGas,
517
+ rateWei: tokenFee.rateWei,
518
+ recipient: tokenFee.feeRecipient,
519
+ symbol: tokenFee.token.symbol,
520
+ tokenAddress: tokenFee.token.address,
521
+ }));
522
+ }
466
523
  /**
467
524
  * Base request to simulation API.
468
525
  *
469
- * @param options - Options bag.
470
- * @param options.after - Transactions to simulate after user's transaction.
471
- * @param options.before - Transactions to simulate before user's transaction.
472
- * @param options.params - Additional parameters for the request.
473
- * @param options.request - Original request object.
526
+ * @param request - The request object.
527
+ * @param request.chainId - Chain ID of the transaction.
528
+ * @param request.from - Address of the sender.
529
+ * @param request.options - Options for the simulation.
530
+ * @param request.params - Additional parameters for the request.
531
+ * @param request.transactions - Transactions to simulate.
474
532
  * @returns The simulation response.
475
533
  */
476
- async function baseRequest({ request, params, before = [], after = [], }) {
477
- const { blockTime, chainId, ethQuery, txParams } = request;
478
- const { authorizationList } = txParams;
479
- const from = txParams.from;
480
- const authorizationListFinal = authorizationList?.map((authorization) => ({
481
- address: authorization.address,
482
- from,
483
- }));
484
- const userTransaction = {
485
- authorizationList: authorizationListFinal,
486
- data: txParams.data,
487
- from: txParams.from,
488
- gas: txParams.gas,
489
- maxFeePerGas: (txParams.maxFeePerGas ?? txParams.gasPrice),
490
- maxPriorityFeePerGas: (txParams.maxPriorityFeePerGas ??
491
- txParams.gasPrice),
492
- to: txParams.to,
493
- value: txParams.value,
494
- };
495
- const transactions = [...before, userTransaction, ...after];
496
- const requiredBalanceBN = getRequiredBalance(request);
497
- const requiredBalanceHex = (0, controller_utils_1.toHex)(requiredBalanceBN);
498
- log('Required balance', requiredBalanceHex);
499
- const currentBalanceHex = (await (0, controller_utils_1.query)(ethQuery, 'getBalance', [
500
- from,
501
- 'latest',
502
- ]));
503
- const currentBalanceBN = (0, controller_utils_1.hexToBN)(currentBalanceHex);
504
- log('Current balance', currentBalanceHex);
505
- const isInsufficientBalance = currentBalanceBN.lt(requiredBalanceBN);
534
+ async function baseRequest({ chainId, from, options, params, transactions, }) {
535
+ const { blockTime, senderCode } = options;
506
536
  return await (0, simulation_api_1.simulateTransactions)(chainId, {
507
- ...params,
508
537
  transactions,
509
- withGas: true,
510
- withDefaultBlockOverrides: true,
538
+ ...params,
511
539
  ...(blockTime && {
512
540
  blockOverrides: {
513
541
  ...params?.blockOverrides,
514
542
  time: (0, controller_utils_1.toHex)(blockTime),
515
543
  },
516
544
  }),
517
- ...(isInsufficientBalance && {
545
+ ...(senderCode && {
518
546
  overrides: {
519
547
  ...params?.overrides,
520
548
  [from]: {
521
549
  ...params?.overrides?.[from],
522
- balance: requiredBalanceHex,
550
+ code: senderCode,
523
551
  },
524
552
  },
525
553
  }),
526
554
  });
527
555
  }
528
- /**
529
- * Calculate the required minimum balance for a transaction.
530
- *
531
- * @param request - The transaction request.
532
- * @returns The minimal balance as a BN.
533
- */
534
- function getRequiredBalance(request) {
535
- const { txParams } = request;
536
- const gasLimit = (0, controller_utils_1.hexToBN)(txParams.gas ?? '0x0');
537
- const gasPrice = (0, controller_utils_1.hexToBN)(txParams.maxFeePerGas ?? txParams.gasPrice ?? '0x0');
538
- const value = (0, controller_utils_1.hexToBN)(txParams.value ?? '0x0');
539
- const nestedValue = (request.nestedTransactions ?? [])
540
- .map((tx) => (0, controller_utils_1.hexToBN)(tx.value ?? '0x0'))
541
- .reduce((acc, val) => acc.add(val), new bn_js_1.default(0));
542
- return gasLimit.mul(gasPrice).add(value).add(nestedValue);
543
- }
544
- //# sourceMappingURL=balance-changes.cjs.map
556
+ //# sourceMappingURL=simulation.cjs.map