@metamask/transaction-controller 29.0.0 → 29.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [29.0.2]
11
+
12
+ ### Fixed
13
+
14
+ - fix incorrect token balance changes for simulations of multiple tokens that include an NFT mint ([#4290](https://github.com/MetaMask/core/pull/4290))
15
+
16
+ ## [29.0.1]
17
+
18
+ ### Changed
19
+
20
+ - Bump `@metamask/gas-fee-controller` to `^15.1.2` ([#4275](https://github.com/MetaMask/core/pull/4275))
21
+
22
+ ### Fixed
23
+
24
+ - approveTransaction was throwing away the raw signed transaction that signTransaction was adding to the metadata.
25
+ This was causing some transaction with low gas to appear as "failed" when in fact they were still pending. ([#4255](https://github.com/MetaMask/core/pull/4255))
26
+
10
27
  ## [29.0.0]
11
28
 
12
29
  ### Added
@@ -816,7 +833,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
816
833
 
817
834
  All changes listed after this point were applied to this package following the monorepo conversion.
818
835
 
819
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@29.0.0...HEAD
836
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@29.0.2...HEAD
837
+ [29.0.2]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@29.0.1...@metamask/transaction-controller@29.0.2
838
+ [29.0.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@29.0.0...@metamask/transaction-controller@29.0.1
820
839
  [29.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@28.1.1...@metamask/transaction-controller@29.0.0
821
840
  [28.1.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@28.1.0...@metamask/transaction-controller@28.1.1
822
841
  [28.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@28.0.0...@metamask/transaction-controller@28.1.0
@@ -4,9 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkN55SEKK7js = require('./chunk-N55SEKK7.js');
7
+ var _chunkIXUOEWWLjs = require('./chunk-IXUOEWWL.js');
8
8
  require('./chunk-ZNZEJDOE.js');
9
- require('./chunk-X3KACH5P.js');
9
+ require('./chunk-IT3SYNZ6.js');
10
10
  require('./chunk-KT6UAKBB.js');
11
11
  require('./chunk-SD6CWFDF.js');
12
12
  require('./chunk-VH47Q6TS.js');
@@ -41,5 +41,5 @@ require('./chunk-Z4BLTVTB.js');
41
41
 
42
42
 
43
43
 
44
- exports.ApprovalState = _chunkN55SEKK7js.ApprovalState; exports.CANCEL_RATE = _chunkN55SEKK7js.CANCEL_RATE; exports.HARDFORK = _chunkN55SEKK7js.HARDFORK; exports.SPEED_UP_RATE = _chunkN55SEKK7js.SPEED_UP_RATE; exports.TransactionController = _chunkN55SEKK7js.TransactionController;
44
+ exports.ApprovalState = _chunkIXUOEWWLjs.ApprovalState; exports.CANCEL_RATE = _chunkIXUOEWWLjs.CANCEL_RATE; exports.HARDFORK = _chunkIXUOEWWLjs.HARDFORK; exports.SPEED_UP_RATE = _chunkIXUOEWWLjs.SPEED_UP_RATE; exports.TransactionController = _chunkIXUOEWWLjs.TransactionController;
45
45
  //# sourceMappingURL=TransactionController.js.map
@@ -4,9 +4,9 @@ import {
4
4
  HARDFORK,
5
5
  SPEED_UP_RATE,
6
6
  TransactionController
7
- } from "./chunk-7TPXSDXL.mjs";
7
+ } from "./chunk-FBCFML64.mjs";
8
8
  import "./chunk-NHRBO3LU.mjs";
9
- import "./chunk-MDRMMUMS.mjs";
9
+ import "./chunk-AHSDUIMT.mjs";
10
10
  import "./chunk-K4KOSAGM.mjs";
11
11
  import "./chunk-KG4UW4K4.mjs";
12
12
  import "./chunk-NM6OYEPP.mjs";
@@ -178,12 +178,14 @@ async function getTokenBalanceChanges(request, events) {
178
178
  if (response.transactions.length !== transactions.length) {
179
179
  throw new SimulationInvalidResponseError();
180
180
  }
181
+ let prevBalanceTxIndex = 0;
181
182
  return [...balanceTxs.after.keys()].map((token, index) => {
182
183
  const previousBalanceCheckSkipped = !balanceTxs.before.get(token);
183
184
  const previousBalance = previousBalanceCheckSkipped ? "0x0" : getValueFromBalanceTransaction(
184
185
  request.from,
185
186
  token,
186
- response.transactions[index]
187
+ // eslint-disable-next-line no-plusplus
188
+ response.transactions[prevBalanceTxIndex++]
187
189
  );
188
190
  const newBalance = getValueFromBalanceTransaction(
189
191
  request.from,
@@ -347,4 +349,4 @@ export {
347
349
  getSimulationData,
348
350
  getEvents
349
351
  };
350
- //# sourceMappingURL=chunk-MDRMMUMS.mjs.map
352
+ //# sourceMappingURL=chunk-AHSDUIMT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/simulation.ts"],"sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\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} from '../types';\nimport { SimulationTokenStandard } from '../types';\nimport { simulateTransactions } from './simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n SimulationResponseTransaction,\n} from './simulation-api';\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 GetSimulationDataRequest = {\n chainId: Hex;\n from: Hex;\n to?: Hex;\n value?: Hex;\n data?: Hex;\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, 'simulation');\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 * @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 * @returns The simulation data.\n */\nexport async function getSimulationData(\n request: GetSimulationDataRequest,\n): Promise<SimulationData> {\n const { chainId, from, to, value, data } = request;\n\n log('Getting simulation data', request);\n\n try {\n const response = await simulateTransactions(chainId, {\n transactions: [\n {\n data,\n from,\n maxFeePerGas: '0x0',\n maxPriorityFeePerGas: '0x0',\n to,\n value,\n },\n ],\n withCallTrace: true,\n withLogs: true,\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.from, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n return {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n } catch (error) {\n log('Failed to get simulation data', 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 tokenBalanceChanges: [],\n error: {\n code,\n message,\n },\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n * @param userAddress - The user's account address.\n * @param response - The simulation response.\n * @returns The native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n userAddress: Hex,\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 { 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(previousBalance, newBalance);\n}\n\n/**\n * Extract events from a simulation response.\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nexport function 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 const args = parseEventArgs(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 * Parse event arguments using ABI input definitions.\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The parsed event arguments.\n */\nfunction parseEventArgs(\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 = parseEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Parse an event argument value.\n * @param value - The event argument value.\n * @returns The parsed event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseEventArgValue(value: any): Hex | Hex[] {\n if (Array.isArray(value)) {\n return value.map(parseEventArgValue) as Hex[];\n }\n\n return (value.toHexString?.() ?? value).toLowerCase();\n}\n\n/**\n * Generate token balance changes from parsed events.\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: GetSimulationDataRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const balanceTxs = getTokenBalanceTransactions(request, events);\n\n log('Generated balance transactions', [...balanceTxs.after.values()]);\n\n const transactions = [\n ...balanceTxs.before.values(),\n request,\n ...balanceTxs.after.values(),\n ];\n\n if (transactions.length === 1) {\n return [];\n }\n\n const response = await simulateTransactions(request.chainId as Hex, {\n transactions,\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== transactions.length) {\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 : getValueFromBalanceTransaction(\n request.from,\n token,\n // eslint-disable-next-line no-plusplus\n response.transactions[prevBalanceTxIndex++],\n );\n\n const newBalance = getValueFromBalanceTransaction(\n request.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 * @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: GetSimulationDataRequest,\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\n const userEvents = events.filter(\n (event) =>\n SUPPORTED_EVENTS.includes(event.name) &&\n [event.args.from, event.args.to].includes(request.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 request.from,\n tokenId,\n );\n\n const transaction: SimulationRequestTransaction = {\n from: request.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 * @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 * @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 * Extract the value from a balance transaction response.\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.\n */\nfunction getValueFromBalanceTransaction(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const normalizedReturn = normalizeReturnValue(response.return);\n\n if (token.standard === SimulationTokenStandard.erc721) {\n return normalizedReturn === from ? '0x1' : '0x0';\n }\n\n return normalizedReturn;\n}\n\n/**\n * Generate the balance transaction data for a token.\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 switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721).encodeFunctionData('ownerOf', [\n tokenId,\n ]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155).encodeFunctionData('balanceOf', [\n from,\n tokenId,\n ]) as Hex;\n\n default:\n return new Interface(abiERC20).encodeFunctionData('balanceOf', [\n from,\n ]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\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 (e) {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\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 * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n): SimulationBalanceChange | undefined {\n const differenceBN = hexToBN(newBalance).sub(hexToBN(previousBalance));\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,\n difference,\n isDecrease,\n };\n}\n\n/**\n * Normalize a return value.\n * @param value - The return value to normalize.\n * @returns The normalized return value.\n */\nfunction normalizeReturnValue(value: Hex): Hex {\n return toHex(hexToBN(value));\n}\n\n/**\n * Get the contract interfaces for all supported tokens.\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"],"mappings":"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","names":["SupportedToken"]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-NHRBO3LU.mjs";
5
5
  import {
6
6
  getSimulationData
7
- } from "./chunk-MDRMMUMS.mjs";
7
+ } from "./chunk-AHSDUIMT.mjs";
8
8
  import {
9
9
  determineTransactionType
10
10
  } from "./chunk-KG4UW4K4.mjs";
@@ -234,7 +234,7 @@ var TransactionController = class extends BaseController {
234
234
  __privateAdd(this, _getGlobalChainId);
235
235
  __privateAdd(this, _isCustomNetwork);
236
236
  __privateAdd(this, _internalEvents, new EventEmitter());
237
- this.inProcessOfSigning = /* @__PURE__ */ new Set();
237
+ this.approvingTransactionIds = /* @__PURE__ */ new Set();
238
238
  this.mutex = new Mutex();
239
239
  __privateAdd(this, _incomingTransactionOptions, void 0);
240
240
  __privateAdd(this, _pendingTransactionOptions, void 0);
@@ -725,9 +725,7 @@ var TransactionController = class extends BaseController {
725
725
  validateGasValues(gasValues);
726
726
  }
727
727
  projectLogger("Creating speed up transaction", transactionId, gasValues);
728
- const transactionMeta = this.state.transactions.find(
729
- ({ id }) => id === transactionId
730
- );
728
+ const transactionMeta = this.getTransaction(transactionId);
731
729
  if (!transactionMeta) {
732
730
  return;
733
731
  }
@@ -776,7 +774,7 @@ var TransactionController = class extends BaseController {
776
774
  unsignedEthTx,
777
775
  transactionMeta.txParams.from
778
776
  );
779
- const transactionMetaWithRsv = await this.updateTransactionMetaRSV(
777
+ const transactionMetaWithRsv = this.updateTransactionMetaRSV(
780
778
  transactionMeta,
781
779
  signedTx
782
780
  );
@@ -1215,10 +1213,10 @@ var TransactionController = class extends BaseController {
1215
1213
  common
1216
1214
  });
1217
1215
  const initialTxAsSerializedHex = bufferToHex(initialTxAsEthTx.serialize());
1218
- if (this.inProcessOfSigning.has(initialTxAsSerializedHex)) {
1216
+ if (this.approvingTransactionIds.has(initialTxAsSerializedHex)) {
1219
1217
  return "";
1220
1218
  }
1221
- this.inProcessOfSigning.add(initialTxAsSerializedHex);
1219
+ this.approvingTransactionIds.add(initialTxAsSerializedHex);
1222
1220
  let rawTransactions, nonceLock;
1223
1221
  try {
1224
1222
  const fromAddress = initialTx.from;
@@ -1239,7 +1237,7 @@ var TransactionController = class extends BaseController {
1239
1237
  throw err;
1240
1238
  } finally {
1241
1239
  nonceLock?.releaseLock();
1242
- this.inProcessOfSigning.delete(initialTxAsSerializedHex);
1240
+ this.approvingTransactionIds.delete(initialTxAsSerializedHex);
1243
1241
  }
1244
1242
  return rawTransactions;
1245
1243
  }
@@ -1280,10 +1278,10 @@ var TransactionController = class extends BaseController {
1280
1278
  transactionMeta,
1281
1279
  pickBy({ hash, status })
1282
1280
  );
1283
- if (status === "submitted" /* submitted */) {
1281
+ if (updatedTransactionMeta.status === "submitted" /* submitted */) {
1284
1282
  updatedTransactionMeta.submittedTime = (/* @__PURE__ */ new Date()).getTime();
1285
1283
  }
1286
- if (status === "failed" /* failed */) {
1284
+ if (updatedTransactionMeta.status === "failed" /* failed */) {
1287
1285
  updatedTransactionMeta.error = normalizeTxError(new Error(errorMessage));
1288
1286
  }
1289
1287
  this.updateTransaction(
@@ -1639,68 +1637,62 @@ var TransactionController = class extends BaseController {
1639
1637
  * @param transactionId - The ID of the transaction to approve.
1640
1638
  */
1641
1639
  async approveTransaction(transactionId) {
1642
- const { transactions } = this.state;
1643
- const releaseLock = await this.mutex.acquire();
1644
- const index = transactions.findIndex(({ id }) => transactionId === id);
1645
- const transactionMeta = transactions[index];
1646
- const updatedTransactionMeta = cloneDeep(transactionMeta);
1647
- const {
1648
- txParams: { from },
1649
- networkClientId
1650
- } = transactionMeta;
1651
- let releaseNonceLock;
1640
+ const cleanupTasks = new Array();
1641
+ cleanupTasks.push(await this.mutex.acquire());
1642
+ let transactionMeta = this.getTransactionOrThrow(transactionId);
1652
1643
  try {
1653
1644
  if (!this.sign) {
1654
- releaseLock();
1655
1645
  this.failTransaction(
1656
1646
  transactionMeta,
1657
1647
  new Error("No sign method defined.")
1658
1648
  );
1659
1649
  return "not-approved" /* NotApproved */;
1660
1650
  } else if (!transactionMeta.chainId) {
1661
- releaseLock();
1662
1651
  this.failTransaction(transactionMeta, new Error("No chainId defined."));
1663
1652
  return "not-approved" /* NotApproved */;
1664
1653
  }
1665
- if (this.inProcessOfSigning.has(transactionId)) {
1654
+ if (this.approvingTransactionIds.has(transactionId)) {
1666
1655
  projectLogger("Skipping approval as signing in progress", transactionId);
1667
1656
  return "not-approved" /* NotApproved */;
1668
1657
  }
1658
+ this.approvingTransactionIds.add(transactionId);
1659
+ cleanupTasks.push(
1660
+ () => this.approvingTransactionIds.delete(transactionId)
1661
+ );
1669
1662
  const [nonce, releaseNonce] = await getNextNonce(
1670
1663
  transactionMeta,
1671
- (address) => __privateGet(this, _multichainTrackingHelper).getNonceLock(address, networkClientId)
1664
+ (address) => __privateGet(this, _multichainTrackingHelper).getNonceLock(
1665
+ address,
1666
+ transactionMeta.networkClientId
1667
+ )
1672
1668
  );
1673
- releaseNonceLock = releaseNonce;
1674
- updatedTransactionMeta.status = "approved" /* approved */;
1675
- updatedTransactionMeta.txParams = {
1676
- ...updatedTransactionMeta.txParams,
1677
- nonce,
1678
- chainId: transactionMeta.chainId
1679
- };
1680
- const baseTxParams = {
1681
- ...updatedTransactionMeta.txParams,
1682
- gasLimit: updatedTransactionMeta.txParams.gas
1683
- };
1684
- this.updateTransaction(
1685
- updatedTransactionMeta,
1686
- "TransactionController#approveTransaction - Transaction approved"
1687
- );
1688
- this.onTransactionStatusChange(updatedTransactionMeta);
1689
- const isEIP1559 = isEIP1559Transaction(updatedTransactionMeta.txParams);
1690
- const txParams = isEIP1559 ? {
1691
- ...baseTxParams,
1692
- estimatedBaseFee: updatedTransactionMeta.txParams.estimatedBaseFee,
1693
- type: "0x2" /* feeMarket */
1694
- } : baseTxParams;
1669
+ releaseNonce && cleanupTasks.push(releaseNonce);
1670
+ transactionMeta = __privateMethod(this, _updateTransactionInternal, updateTransactionInternal_fn).call(this, {
1671
+ transactionId,
1672
+ note: "TransactionController#approveTransaction - Transaction approved"
1673
+ }, (draftTxMeta) => {
1674
+ const { txParams, chainId } = draftTxMeta;
1675
+ draftTxMeta.status = "approved" /* approved */;
1676
+ draftTxMeta.txParams = {
1677
+ ...txParams,
1678
+ nonce,
1679
+ chainId,
1680
+ gasLimit: txParams.gas,
1681
+ ...isEIP1559Transaction(txParams) && {
1682
+ type: "0x2" /* feeMarket */
1683
+ }
1684
+ };
1685
+ });
1686
+ this.onTransactionStatusChange(transactionMeta);
1695
1687
  const rawTx = await this.signTransaction(
1696
- updatedTransactionMeta,
1697
- txParams
1688
+ transactionMeta,
1689
+ transactionMeta.txParams
1698
1690
  );
1699
- if (!this.beforePublish(updatedTransactionMeta)) {
1691
+ if (!this.beforePublish(transactionMeta)) {
1700
1692
  projectLogger("Skipping publishing transaction based on hook");
1701
1693
  this.messagingSystem.publish(
1702
1694
  `${controllerName}:transactionPublishingSkipped`,
1703
- updatedTransactionMeta
1695
+ transactionMeta
1704
1696
  );
1705
1697
  return "skipped-via-before-publish-hook" /* SkippedViaBeforePublishHook */;
1706
1698
  }
@@ -1711,51 +1703,50 @@ var TransactionController = class extends BaseController {
1711
1703
  networkClientId: transactionMeta.networkClientId,
1712
1704
  chainId: transactionMeta.chainId
1713
1705
  });
1714
- if (transactionMeta.type === "swap" /* swap */) {
1706
+ let preTxBalance;
1707
+ const shouldUpdatePreTxBalance = transactionMeta.type === "swap" /* swap */;
1708
+ if (shouldUpdatePreTxBalance) {
1715
1709
  projectLogger("Determining pre-transaction balance");
1716
- const preTxBalance = await query(ethQuery, "getBalance", [from]);
1717
- updatedTransactionMeta.preTxBalance = preTxBalance;
1718
- projectLogger(
1719
- "Updated pre-transaction balance",
1720
- updatedTransactionMeta.preTxBalance
1721
- );
1710
+ preTxBalance = await query(ethQuery, "getBalance", [
1711
+ transactionMeta.txParams.from
1712
+ ]);
1722
1713
  }
1723
- projectLogger("Publishing transaction", txParams);
1714
+ projectLogger("Publishing transaction", transactionMeta.txParams);
1724
1715
  let { transactionHash: hash } = await this.publish(
1725
- updatedTransactionMeta,
1716
+ transactionMeta,
1726
1717
  rawTx
1727
1718
  );
1728
1719
  if (hash === void 0) {
1729
1720
  hash = await this.publishTransaction(ethQuery, rawTx);
1730
1721
  }
1731
1722
  projectLogger("Publish successful", hash);
1732
- updatedTransactionMeta.hash = hash;
1733
- updatedTransactionMeta.status = "submitted" /* submitted */;
1734
- updatedTransactionMeta.submittedTime = (/* @__PURE__ */ new Date()).getTime();
1735
- this.updateTransaction(
1736
- updatedTransactionMeta,
1737
- "TransactionController#approveTransaction - Transaction submitted"
1738
- );
1723
+ transactionMeta = __privateMethod(this, _updateTransactionInternal, updateTransactionInternal_fn).call(this, {
1724
+ transactionId,
1725
+ note: "TransactionController#approveTransaction - Transaction submitted"
1726
+ }, (draftTxMeta) => {
1727
+ draftTxMeta.hash = hash;
1728
+ draftTxMeta.status = "submitted" /* submitted */;
1729
+ draftTxMeta.submittedTime = (/* @__PURE__ */ new Date()).getTime();
1730
+ if (shouldUpdatePreTxBalance) {
1731
+ draftTxMeta.preTxBalance = preTxBalance;
1732
+ projectLogger("Updated pre-transaction balance", preTxBalance);
1733
+ }
1734
+ });
1739
1735
  this.messagingSystem.publish(`${controllerName}:transactionSubmitted`, {
1740
- transactionMeta: updatedTransactionMeta
1736
+ transactionMeta
1741
1737
  });
1742
1738
  this.messagingSystem.publish(
1743
1739
  `${controllerName}:transactionFinished`,
1744
- updatedTransactionMeta
1745
- );
1746
- __privateGet(this, _internalEvents).emit(
1747
- `${updatedTransactionMeta.id}:finished`,
1748
- updatedTransactionMeta
1740
+ transactionMeta
1749
1741
  );
1750
- this.onTransactionStatusChange(updatedTransactionMeta);
1742
+ __privateGet(this, _internalEvents).emit(`${transactionId}:finished`, transactionMeta);
1743
+ this.onTransactionStatusChange(transactionMeta);
1751
1744
  return "approved" /* Approved */;
1752
1745
  } catch (error) {
1753
1746
  this.failTransaction(transactionMeta, error);
1754
1747
  return "not-approved" /* NotApproved */;
1755
1748
  } finally {
1756
- this.inProcessOfSigning.delete(transactionId);
1757
- releaseNonceLock?.();
1758
- releaseLock();
1749
+ cleanupTasks.forEach((task) => task());
1759
1750
  }
1760
1751
  }
1761
1752
  async publishTransaction(ethQuery, rawTransaction) {
@@ -1877,6 +1868,15 @@ var TransactionController = class extends BaseController {
1877
1868
  const { transactions } = this.state;
1878
1869
  return transactions.find(({ id }) => id === transactionId);
1879
1870
  }
1871
+ getTransactionOrThrow(transactionId, errorMessagePrefix = "TransactionController") {
1872
+ const txMeta = this.getTransaction(transactionId);
1873
+ if (!txMeta) {
1874
+ throw new Error(
1875
+ `${errorMessagePrefix}: No transaction found with id ${transactionId}`
1876
+ );
1877
+ }
1878
+ return txMeta;
1879
+ }
1880
1880
  getApprovalId(txMeta) {
1881
1881
  return String(txMeta.id);
1882
1882
  }
@@ -2085,8 +2085,9 @@ var TransactionController = class extends BaseController {
2085
2085
  *
2086
2086
  * @param transactionMeta - The TransactionMeta object to update.
2087
2087
  * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.
2088
+ * @returns The updated TransactionMeta object.
2088
2089
  */
2089
- async updateTransactionMetaRSV(transactionMeta, signedTx) {
2090
+ updateTransactionMetaRSV(transactionMeta, signedTx) {
2090
2091
  const transactionMetaWithRsv = cloneDeep(transactionMeta);
2091
2092
  for (const key of ["r", "s", "v"]) {
2092
2093
  const value = signedTx[key];
@@ -2108,7 +2109,7 @@ var TransactionController = class extends BaseController {
2108
2109
  transactionMeta.chainId,
2109
2110
  txParams
2110
2111
  );
2111
- this.inProcessOfSigning.add(transactionMeta.id);
2112
+ this.approvingTransactionIds.add(transactionMeta.id);
2112
2113
  const signedTx = await new Promise((resolve, reject) => {
2113
2114
  this.sign?.(
2114
2115
  unsignedEthTx,
@@ -2134,7 +2135,7 @@ var TransactionController = class extends BaseController {
2134
2135
  return void 0;
2135
2136
  }
2136
2137
  const transactionMetaWithRsv = {
2137
- ...await this.updateTransactionMetaRSV(transactionMeta, signedTx),
2138
+ ...this.updateTransactionMetaRSV(transactionMeta, signedTx),
2138
2139
  status: "signed" /* signed */
2139
2140
  };
2140
2141
  this.updateTransaction(
@@ -2413,6 +2414,7 @@ updateTransactionInternal_fn = function({
2413
2414
  if (updatedTransactionParams.length > 0) {
2414
2415
  __privateMethod(this, _onTransactionParamsUpdated, onTransactionParamsUpdated_fn).call(this, transactionMeta, updatedTransactionParams);
2415
2416
  }
2417
+ return transactionMeta;
2416
2418
  };
2417
2419
  _checkIfTransactionParamsUpdated = new WeakSet();
2418
2420
  checkIfTransactionParamsUpdated_fn = function(newTransactionMeta) {
@@ -2547,4 +2549,4 @@ export {
2547
2549
  ApprovalState,
2548
2550
  TransactionController
2549
2551
  };
2550
- //# sourceMappingURL=chunk-7TPXSDXL.mjs.map
2552
+ //# sourceMappingURL=chunk-FBCFML64.mjs.map