@metamask-previews/transaction-controller 21.0.1-preview.56c80981 → 21.1.0-preview.cbe2fbb7

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,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [21.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add `abortTransactionSigning` method ([#3870](https://github.com/MetaMask/core/pull/3870))
15
+
10
16
  ## [21.0.1]
11
17
 
12
18
  ### Fixed
@@ -464,7 +470,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
464
470
 
465
471
  All changes listed after this point were applied to this package following the monorepo conversion.
466
472
 
467
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@21.0.1...HEAD
473
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@21.1.0...HEAD
474
+ [21.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@21.0.1...@metamask/transaction-controller@21.1.0
468
475
  [21.0.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@21.0.0...@metamask/transaction-controller@21.0.1
469
476
  [21.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@20.0.0...@metamask/transaction-controller@21.0.0
470
477
  [20.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@19.0.1...@metamask/transaction-controller@20.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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"}
@@ -133,6 +133,7 @@ class TransactionController extends base_controller_1.BaseControllerV1 {
133
133
  });
134
134
  });
135
135
  _TransactionController_refreshTrackingMap.set(this, (networkClients) => {
136
+ __classPrivateFieldGet(this, _TransactionController_refreshEtherscanRemoteTransactionSources, "f").call(this, networkClients);
136
137
  const networkClientIds = Object.keys(networkClients);
137
138
  const existingNetworkClientIds = Array.from(this.trackingMap.keys());
138
139
  // Remove tracking for NetworkClientIds that no longer exist
@@ -154,10 +155,10 @@ class TransactionController extends base_controller_1.BaseControllerV1 {
154
155
  });
155
156
  _TransactionController_checkForPendingTransactionAndStartPolling.set(this, () => {
156
157
  // PendingTransactionTracker reads state through its getTransactions hook
157
- this.pendingTransactionTracker.onStateChange();
158
+ this.pendingTransactionTracker.startIfPendingTransactions();
158
159
  if (this.enableMultichain) {
159
160
  for (const [, trackingMap] of this.trackingMap) {
160
- trackingMap.pendingTransactionTracker.onStateChange();
161
+ trackingMap.pendingTransactionTracker.startIfPendingTransactions();
161
162
  }
162
163
  }
163
164
  });
@@ -257,7 +258,7 @@ class TransactionController extends base_controller_1.BaseControllerV1 {
257
258
  // selectedNetworkClientId changes
258
259
  onNetworkStateChange(() => {
259
260
  (0, logger_1.projectLogger)('Detected network change', this.getChainId());
260
- this.pendingTransactionTracker.onStateChange();
261
+ this.pendingTransactionTracker.startIfPendingTransactions();
261
262
  this.onBootCleanup();
262
263
  });
263
264
  this.onBootCleanup();
@@ -271,7 +272,6 @@ class TransactionController extends base_controller_1.BaseControllerV1 {
271
272
  }
272
273
  });
273
274
  __classPrivateFieldGet(this, _TransactionController_refreshTrackingMap, "f").call(this, networkClients);
274
- __classPrivateFieldGet(this, _TransactionController_refreshEtherscanRemoteTransactionSources, "f").call(this, networkClients);
275
275
  }
276
276
  });
277
277
  if (this.enableMultichain) {
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionController.js","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hardfork, Common, type ChainConfig } from '@ethereumjs/common';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n BaseConfig,\n BaseState,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseControllerV1 } from '@metamask/base-controller';\nimport {\n query,\n NetworkType,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n BlockTracker,\n NetworkClientId,\n NetworkController,\n NetworkControllerStateChangeEvent,\n NetworkState,\n Provider,\n NetworkClient,\n} from '@metamask/network-controller';\nimport { NetworkClientType } from '@metamask/network-controller';\nimport { errorCodes, rpcErrors, providerErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport { MethodRegistry } from 'eth-method-registry';\nimport { addHexPrefix, bufferToHex } from 'ethereumjs-util';\nimport { EventEmitter } from 'events';\nimport { mapValues, merge, pickBy, sortBy } from 'lodash';\nimport { NonceTracker } from 'nonce-tracker';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from 'nonce-tracker';\nimport { v1 as random } from 'uuid';\n\nimport { EtherscanRemoteTransactionSource } from './helpers/EtherscanRemoteTransactionSource';\nimport { IncomingTransactionHelper } from './helpers/IncomingTransactionHelper';\nimport { PendingTransactionTracker } from './helpers/PendingTransactionTracker';\nimport { projectLogger as log } from './logger';\nimport type {\n Events,\n DappSuggestedGasFees,\n SavedGasFees,\n SecurityProviderRequest,\n SendFlowHistoryEntry,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n WalletDevice,\n SecurityAlertResponse,\n} from './types';\nimport {\n TransactionEnvelopeType,\n TransactionType,\n TransactionStatus,\n} from './types';\nimport { validateConfirmedExternalTransaction } from './utils/external-transactions';\nimport { addGasBuffer, estimateGas, updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport {\n addInitialHistorySnapshot,\n updateTransactionHistory,\n} from './utils/history';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getNextNonce,\n} from './utils/nonce';\nimport {\n updatePostTransactionBalance,\n updateSwapsTransaction,\n} from './utils/swaps';\nimport { determineTransactionType } from './utils/transaction-type';\nimport {\n getIncreasedPriceFromExisting,\n normalizeTxParams,\n isEIP1559Transaction,\n isFeeMarketEIP1559Values,\n isGasPriceValue,\n validateGasValues,\n validateIfTransactionUnapproved,\n validateMinimumIncrease,\n normalizeTxError,\n normalizeGasFeeValues,\n} from './utils/utils';\nimport {\n validateTransactionOrigin,\n validateTxParams,\n} from './utils/validation';\n\nexport const HARDFORK = Hardfork.London;\n\n/**\n * @type Result\n * @property result - Promise resolving to a new transaction hash\n * @property transactionMeta - Meta information about this new transaction\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface Result {\n result: Promise<string>;\n transactionMeta: TransactionMeta;\n}\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface GasPriceValue {\n gasPrice: string;\n}\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface FeeMarketEIP1559Values {\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n}\n\n/**\n * @type TransactionConfig\n *\n * Transaction controller configuration\n * @property provider - Provider used to create a new underlying EthQuery instance\n * @property sign - Method used to sign transactions\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionConfig extends BaseConfig {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sign?: (txParams: TransactionParams, from: string) => Promise<any>;\n txHistoryLimit: number;\n}\n\n/**\n * @type MethodData\n *\n * Method data registry object\n * @property registryMethod - Registry method raw string\n * @property parsedRegistryMethod - Registry method object, containing name and method arguments\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface MethodData {\n registryMethod: string;\n parsedRegistryMethod: Record<string, unknown>;\n}\n\n/**\n * @type TransactionState\n *\n * Transaction controller state\n * @property transactions - A list of TransactionMeta objects\n * @property methodData - Object containing all known method data information\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionState extends BaseState {\n transactions: TransactionMeta[];\n methodData: { [key: string]: MethodData };\n lastFetchedBlockNumbers: { [key: string]: number };\n}\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.5;\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during speed up\n */\nexport const SPEED_UP_RATE = 1.1;\n\n/**\n * @type IncomingTransactionOptions\n *\n * Configuration options for the IncomingTransactionHelper\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\ntype IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\n/**\n * @type PendingTransactionOptions\n *\n * Configuration options for the PendingTransactionTracker\n * @property isResubmitEnabled - Whether transaction publishing is automatically retried.\n */\ntype PendingTransactionOptions = {\n isResubmitEnabled?: boolean;\n};\n\n/**\n * The name of the {@link TransactionController}.\n */\nconst controllerName = 'TransactionController';\n\n/**\n * The external actions available to the {@link TransactionController}.\n */\ntype AllowedActions = AddApprovalRequest;\n\ntype AllowedEvents = NetworkControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AllowedActions,\n AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionControllerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseControllerV1<\n TransactionConfig,\n TransactionState\n> {\n private readonly ethQuery: EthQuery;\n\n private readonly isHistoryDisabled: boolean;\n\n private readonly isSwapsDisabled: boolean;\n\n private readonly isSendFlowHistoryDisabled: boolean;\n\n private readonly inProcessOfSigning: Set<string> = new Set();\n\n private readonly nonceTracker: NonceTracker;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly registry: any;\n\n private readonly provider: Provider;\n\n private readonly mutex = new Mutex();\n\n private readonly nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n private readonly getSavedGasFees: (chainId: Hex) => SavedGasFees | undefined;\n\n private readonly getNetworkState: () => NetworkState;\n\n private readonly getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n\n private readonly getCurrentNetworkEIP1559Compatibility: (\n networkClientId?: NetworkClientId,\n ) => Promise<boolean>;\n\n private readonly getGasFeeEstimates: () => Promise<GasFeeState>;\n\n private readonly getPermittedAccounts: (origin?: string) => Promise<string[]>;\n\n private readonly getSelectedAddress: () => string;\n\n private readonly getExternalPendingTransactions: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n private enableMultichain: boolean;\n\n private readonly messagingSystem: TransactionControllerMessenger;\n\n private readonly incomingTransactionHelper: IncomingTransactionHelper;\n\n private readonly securityProviderRequest?: SecurityProviderRequest;\n\n private readonly pendingTransactionTracker: PendingTransactionTracker;\n\n private readonly cancelMultiplier: number;\n\n private readonly speedUpMultiplier: number;\n\n private readonly incomingTransactionOptions: IncomingTransactionOptions;\n\n private readonly pendingTransactionOptions: PendingTransactionOptions;\n\n private readonly signAbortCallbacks: Map<string, () => void> = new Map();\n\n private readonly afterSign: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n private readonly beforeApproveOnInit: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n private readonly beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n private readonly beforePublish: (transactionMeta: TransactionMeta) => boolean;\n\n private readonly getAdditionalSignArguments: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n private readonly findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n private readonly getNetworkClientById: NetworkController['getNetworkClientById'];\n\n private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n private failTransaction(\n transactionMeta: TransactionMeta,\n error: Error,\n actionId?: string,\n ) {\n const newTransactionMeta = {\n ...transactionMeta,\n error: normalizeTxError(error),\n status: TransactionStatus.failed,\n };\n this.hub.emit('transaction-failed', {\n actionId,\n error: error.message,\n transactionMeta: newTransactionMeta,\n });\n this.updateTransaction(\n newTransactionMeta,\n 'TransactionController#failTransaction - Add error message and set status to failed',\n );\n this.onTransactionStatusChange(newTransactionMeta);\n this.hub.emit(`${transactionMeta.id}:finished`, newTransactionMeta);\n }\n\n private async registryLookup(fourBytePrefix: string): Promise<MethodData> {\n const registryMethod = await this.registry.lookup(fourBytePrefix);\n const parsedRegistryMethod = this.registry.parse(registryMethod);\n return { registryMethod, parsedRegistryMethod };\n }\n\n /**\n * EventEmitter instance used to listen to specific transactional events\n */\n hub = new EventEmitter() as TransactionControllerEventEmitter;\n\n /**\n * Name of this controller used during composition\n */\n override name = 'TransactionController';\n\n private readonly trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n incomingTransactionHelper: IncomingTransactionHelper;\n }\n > = new Map();\n\n readonly etherscanRemoteTransactionSourcesMap: Map<\n Hex,\n EtherscanRemoteTransactionSource\n > = new Map();\n\n /**\n * Method used to sign transactions\n */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n /**\n * Creates a TransactionController instance.\n *\n * @param options - The controller options.\n * @param options.blockTracker - The block tracker used to poll for new blocks data.\n * @param options.cancelMultiplier - Multiplier used to determine a transaction's increased gas fee during cancellation.\n * @param options.disableHistory - Whether to disable storing history in transaction metadata.\n * @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.\n * @param options.disableSwaps - Whether to disable additional processing on swaps transactions.\n * @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.\n * @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.\n * @param options.getExternalPendingTransactions - Callback to retrieve pending transactions from external sources.\n * @param options.getGasFeeEstimates - Callback to retrieve gas fee estimates.\n * @param options.getNetworkState - Gets the state of the network controller.\n * @param options.getPermittedAccounts - Get accounts that a given origin has permissions for.\n * @param options.getSavedGasFees - Gets the saved gas fee config.\n * @param options.getSelectedAddress - Gets the address of the currently selected account.\n * @param options.incomingTransactions - Configuration options for incoming transaction support.\n * @param options.messenger - The controller messenger.\n * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.\n * @param options.pendingTransactions - Configuration options for pending transaction support.\n * @param options.provider - The provider used to create the underlying EthQuery instance.\n * @param options.securityProviderRequest - A function for verifying a transaction, whether it is malicious or not.\n * @param options.speedUpMultiplier - Multiplier used to determine a transaction's increased gas fee during speed up.\n * @param options.findNetworkClientIdByChainId - Finds a networkClientId with the given chainId from the NetworkController.\n * @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.\n * @param options.hooks - The controller hooks.\n * @param options.hooks.afterSign - Additional logic to execute after signing a transaction. Return false to not change the status to signed.\n * @param options.hooks.beforeApproveOnInit - Additional logic to execute before starting an approval flow for a transaction during initialization. Return false to skip the transaction.\n * @param options.hooks.beforeCheckPendingTransaction - Additional logic to execute before checking pending transactions. Return false to prevent the broadcast of the transaction.\n * @param options.hooks.beforePublish - Additional logic to execute before publishing a transaction. Return false to prevent the broadcast of the transaction.\n * @param options.hooks.getAdditionalSignArguments - Returns additional arguments required to sign a transaction.\n * @param options.hub - Use a different event emitter for the hub.\n * @param options.getNetworkClientRegistry - Gets the network client registry.\n * @param options.enableMultichain - Enable multichain support.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n blockTracker,\n cancelMultiplier,\n disableHistory,\n disableSendFlowHistory,\n disableSwaps,\n getCurrentAccountEIP1559Compatibility,\n getCurrentNetworkEIP1559Compatibility,\n getExternalPendingTransactions,\n getGasFeeEstimates,\n getNetworkState,\n getPermittedAccounts,\n getSavedGasFees,\n getSelectedAddress,\n incomingTransactions = {},\n messenger,\n onNetworkStateChange,\n pendingTransactions = {},\n provider,\n securityProviderRequest,\n speedUpMultiplier,\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n hub,\n enableMultichain = false,\n hooks = {},\n }: {\n blockTracker: BlockTracker;\n cancelMultiplier?: number;\n disableHistory: boolean;\n disableSendFlowHistory: boolean;\n disableSwaps: boolean;\n getCurrentAccountEIP1559Compatibility?: () => Promise<boolean>;\n getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n getExternalPendingTransactions?: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n getGasFeeEstimates?: () => Promise<GasFeeState>;\n getNetworkState: () => NetworkState;\n getPermittedAccounts: (origin?: string) => Promise<string[]>;\n getSavedGasFees?: (chainId: Hex) => SavedGasFees | undefined;\n getSelectedAddress: () => string;\n incomingTransactions?: IncomingTransactionOptions;\n messenger: TransactionControllerMessenger;\n onNetworkStateChange: (listener: (state: NetworkState) => void) => void;\n pendingTransactions?: PendingTransactionOptions;\n provider: Provider;\n securityProviderRequest?: SecurityProviderRequest;\n speedUpMultiplier?: number;\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n hub: TransactionControllerEventEmitter;\n enableMultichain: boolean;\n hooks: {\n afterSign?: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n beforeApproveOnInit?: (transactionMeta: TransactionMeta) => boolean;\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n beforePublish?: (transactionMeta: TransactionMeta) => boolean;\n getAdditionalSignArguments?: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n };\n },\n config?: Partial<TransactionConfig>,\n state?: Partial<TransactionState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n txHistoryLimit: 40,\n };\n\n this.defaultState = {\n methodData: {},\n transactions: [],\n lastFetchedBlockNumbers: {},\n };\n this.initialize();\n this.hub = hub ?? this.hub;\n this.enableMultichain = enableMultichain;\n this.findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.getNetworkClientById = getNetworkClientById;\n this.getNetworkClientRegistry = getNetworkClientRegistry;\n this.provider = provider;\n this.messagingSystem = messenger;\n this.getNetworkState = getNetworkState;\n this.ethQuery = new EthQuery(provider);\n this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;\n this.isHistoryDisabled = disableHistory ?? false;\n this.isSwapsDisabled = disableSwaps ?? false;\n // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed\n this.registry = new MethodRegistry({ provider });\n this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined);\n this.getCurrentAccountEIP1559Compatibility =\n getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true));\n this.getCurrentNetworkEIP1559Compatibility =\n getCurrentNetworkEIP1559Compatibility;\n this.getGasFeeEstimates =\n getGasFeeEstimates || (() => Promise.resolve({} as GasFeeState));\n this.getPermittedAccounts = getPermittedAccounts;\n this.getSelectedAddress = getSelectedAddress;\n this.getExternalPendingTransactions =\n getExternalPendingTransactions ?? (() => []);\n this.securityProviderRequest = securityProviderRequest;\n this.cancelMultiplier = cancelMultiplier ?? CANCEL_RATE;\n this.speedUpMultiplier = speedUpMultiplier ?? SPEED_UP_RATE;\n this.incomingTransactionOptions = incomingTransactions;\n this.pendingTransactionOptions = pendingTransactions;\n\n this.afterSign = hooks?.afterSign ?? (() => true);\n this.beforeApproveOnInit = hooks?.beforeApproveOnInit ?? (() => true);\n this.beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ??\n /* istanbul ignore next */\n (() => true);\n this.beforePublish = hooks?.beforePublish ?? (() => true);\n this.getAdditionalSignArguments =\n hooks?.getAdditionalSignArguments ?? (() => []);\n\n this.nonceTracker = new NonceTracker({\n // @ts-expect-error provider types misaligned: SafeEventEmitterProvider vs Record<string,string>\n provider,\n blockTracker,\n getPendingTransactions: this.getNonceTrackerPendingTransactions.bind(\n this,\n undefined,\n ),\n getConfirmedTransactions: this.getNonceTrackerTransactions.bind(\n this,\n TransactionStatus.confirmed,\n ),\n });\n\n const etherscanRemoteTransactionSource =\n new EtherscanRemoteTransactionSource({\n includeTokenTransfers: incomingTransactions.includeTokenTransfers,\n });\n\n this.incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker,\n getCurrentAccount: getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getChainId: this.getChainId.bind(this),\n isEnabled: incomingTransactions.isEnabled,\n queryEntireHistory: incomingTransactions.queryEntireHistory,\n remoteTransactionSource: etherscanRemoteTransactionSource,\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: incomingTransactions.updateTransactions,\n });\n\n this.addIncomingTransactionHelperListeners();\n\n this.pendingTransactionTracker = new PendingTransactionTracker({\n approveTransaction: this.approveTransaction.bind(this),\n blockTracker,\n getChainId: this.getChainId.bind(this),\n getEthQuery: () => this.ethQuery,\n getTransactions: () => this.state.transactions,\n isResubmitEnabled: pendingTransactions.isResubmitEnabled,\n getGlobalLock: async () =>\n this.#acquireNonceLockForChainIdKey({\n chainId: this.getChainId(),\n }),\n publishTransaction: this.publishTransaction.bind(this),\n hooks: {\n beforeCheckPendingTransaction:\n this.beforeCheckPendingTransaction.bind(this),\n beforePublish: this.beforePublish.bind(this),\n },\n });\n\n this.addPendingTransactionTrackerListeners();\n\n // when transactionsController state changes\n // check for pending transactions and start polling if there are any\n this.subscribe(this.#checkForPendingTransactionAndStartPolling);\n\n // TODO once v2 is merged make sure this only runs when\n // selectedNetworkClientId changes\n onNetworkStateChange(() => {\n log('Detected network change', this.getChainId());\n this.pendingTransactionTracker.onStateChange();\n this.onBootCleanup();\n });\n\n this.onBootCleanup();\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (_, patches) => {\n if (this.enableMultichain) {\n const networkClients = this.getNetworkClientRegistry();\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n this.#refreshEtherscanRemoteTransactionSources(networkClients);\n }\n },\n );\n if (this.enableMultichain) {\n this.#initTrackingMap();\n }\n }\n\n setEnableMultichain(enableMultichain: boolean) {\n this.enableMultichain = enableMultichain;\n if (enableMultichain) {\n this.#initTrackingMap();\n }\n }\n\n /**\n * Stops polling and removes listeners to prepare the controller for garbage collection.\n */\n destroy() {\n this.#stopAllTracking();\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(fourBytePrefix: string): Promise<MethodData> {\n const releaseLock = await this.mutex.acquire();\n try {\n const { methodData } = this.state;\n const knownMethod = Object.keys(methodData).find(\n (knownFourBytePrefix) => fourBytePrefix === knownFourBytePrefix,\n );\n if (knownMethod) {\n return methodData[fourBytePrefix];\n }\n const registry = await this.registryLookup(fourBytePrefix);\n this.update({\n methodData: { ...methodData, ...{ [fourBytePrefix]: registry } },\n });\n return registry;\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Add a new unapproved transaction to state. Parameters will be validated, a\n * unique transaction id will be generated, and gas and gasPrice will be calculated\n * if not provided. If A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param opts - Additional options to control how the transaction is added.\n * @param opts.actionId - Unique ID to prevent duplicate requests.\n * @param opts.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.\n * @param opts.method - RPC method that requested the transaction.\n * @param opts.origin - The origin of the transaction request, such as a dApp hostname.\n * @param opts.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.\n * @param opts.securityAlertResponse - Response from security validator.\n * @param opts.sendFlowHistory - The sendFlowHistory entries to add.\n * @param opts.type - Type of transaction to add, such as 'cancel' or 'swap'.\n * @param opts.swaps - Options for swaps transactions.\n * @param opts.swaps.hasApproveTx - Whether the transaction has an approval transaction.\n * @param opts.swaps.meta - Metadata for swap transaction.\n * @param opts.networkClientId - The id of the network client for this transaction.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n {\n actionId,\n deviceConfirmedOn,\n method,\n origin,\n requireApproval,\n securityAlertResponse,\n sendFlowHistory,\n swaps = {},\n type,\n networkClientId,\n }: {\n actionId?: string;\n deviceConfirmedOn?: WalletDevice;\n method?: string;\n origin?: string;\n requireApproval?: boolean | undefined;\n securityAlertResponse?: SecurityAlertResponse;\n sendFlowHistory?: SendFlowHistoryEntry[];\n swaps?: {\n hasApproveTx?: boolean;\n meta?: Partial<TransactionMeta>;\n };\n type?: TransactionType;\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<Result> {\n log('Adding transaction', txParams);\n\n txParams = normalizeTxParams(txParams);\n if (networkClientId && !this.trackingMap.has(networkClientId)) {\n throw new Error(\n 'The networkClientId for this transaction could not be found',\n );\n }\n\n const isEIP1559Compatible = await this.getEIP1559Compatibility(\n networkClientId,\n );\n\n validateTxParams(txParams, isEIP1559Compatible);\n\n if (origin) {\n await validateTransactionOrigin(\n await this.getPermittedAccounts(origin),\n this.getSelectedAddress(),\n txParams.from,\n origin,\n );\n }\n\n const dappSuggestedGasFees = this.generateDappSuggestedGasFees(\n txParams,\n origin,\n );\n\n const chainId = this.getChainId(networkClientId);\n const ethQuery = this.#getEthQuery({ networkClientId, chainId });\n\n const transactionType =\n type ?? (await determineTransactionType(txParams, ethQuery)).type;\n\n const existingTransactionMeta = this.getTransactionWithActionId(actionId);\n\n // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.\n const transactionMeta: TransactionMeta = existingTransactionMeta || {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n id: random(),\n origin,\n securityAlertResponse,\n status: TransactionStatus.unapproved as TransactionStatus.unapproved,\n time: Date.now(),\n txParams,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n type: transactionType,\n networkClientId,\n };\n\n await this.updateGasProperties(transactionMeta);\n\n // Checks if a transaction already exists with a given actionId\n if (!existingTransactionMeta) {\n // Set security provider response\n if (method && this.securityProviderRequest) {\n const securityProviderResponse = await this.securityProviderRequest(\n transactionMeta,\n method,\n );\n transactionMeta.securityProviderResponse = securityProviderResponse;\n }\n\n if (!this.isSendFlowHistoryDisabled) {\n transactionMeta.sendFlowHistory = sendFlowHistory ?? [];\n }\n // Initial history push\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n\n await updateSwapsTransaction(transactionMeta, transactionType, swaps, {\n isSwapsDisabled: this.isSwapsDisabled,\n cancelTransaction: this.cancelTransaction.bind(this),\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n controllerHubEmitter: this.hub.emit.bind(this.hub) as any,\n });\n\n this.addMetadata(transactionMeta);\n this.hub.emit(`unapprovedTransaction`, transactionMeta);\n }\n\n return {\n result: this.processApproval(transactionMeta, {\n isExisting: Boolean(existingTransactionMeta),\n requireApproval,\n actionId,\n }),\n transactionMeta,\n };\n }\n\n startIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n this.incomingTransactionHelper.start();\n return;\n }\n networkClientIds.forEach((networkClientId) => {\n this.trackingMap.get(networkClientId)?.incomingTransactionHelper.start();\n });\n }\n\n stopIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n this.incomingTransactionHelper.stop();\n return;\n }\n networkClientIds.forEach((networkClientId) => {\n this.trackingMap.get(networkClientId)?.incomingTransactionHelper.stop();\n });\n }\n\n stopAllIncomingTransactionPolling() {\n this.incomingTransactionHelper.stop();\n if (this.enableMultichain) {\n for (const [, trackingMap] of this.trackingMap) {\n trackingMap.incomingTransactionHelper.stop();\n }\n }\n }\n\n async updateIncomingTransactions(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n await this.incomingTransactionHelper.update();\n return;\n }\n\n await Promise.allSettled(\n networkClientIds.map(async (networkClientId) => {\n return await this.trackingMap\n .get(networkClientId)\n ?.incomingTransactionHelper.update();\n }),\n );\n }\n\n /**\n * Attempts to cancel a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param gasValues - The gas values to use for the cancellation transaction.\n * @param options - The options for the cancellation transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests.\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async stopTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n estimatedBaseFee,\n actionId,\n }: { estimatedBaseFee?: string; actionId?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a cancel transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n // Not good practice to reassign a parameter but temporarily avoiding a larger refactor.\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log('Creating cancel transaction', transactionId, gasValues);\n\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n return;\n }\n\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n this.cancelMultiplier,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n this.cancelMultiplier,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n this.cancelMultiplier,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const newTxParams: TransactionParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: TransactionEnvelopeType.feeMarket,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n }\n : {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n newTxParams,\n );\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n const rawTx = bufferToHex(signedTx.serialize());\n\n const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;\n\n const oldFee = newTxParams.maxFeePerGas\n ? transactionMeta.txParams.maxFeePerGas\n : transactionMeta.txParams.gasPrice;\n\n log('Submitting cancel transaction', {\n oldFee,\n newFee,\n txParams: newTxParams,\n });\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n const cancelTransactionMeta: TransactionMeta = {\n actionId,\n chainId: transactionMeta.chainId,\n networkClientId: transactionMeta.networkClientId,\n estimatedBaseFee,\n hash,\n id: random(),\n originalGasEstimate: transactionMeta.txParams.gas,\n status: TransactionStatus.submitted,\n time: Date.now(),\n type: TransactionType.cancel,\n txParams: newTxParams,\n };\n\n this.addMetadata(cancelTransactionMeta);\n\n // stopTransaction has no approval request, so we assume the user has already approved the transaction\n this.hub.emit('transaction-approved', {\n transactionMeta: cancelTransactionMeta,\n actionId,\n });\n this.hub.emit('transaction-submitted', {\n transactionMeta: cancelTransactionMeta,\n actionId,\n });\n\n this.hub.emit(\n `${cancelTransactionMeta.id}:finished`,\n cancelTransactionMeta,\n );\n }\n\n /**\n * Attempts to speed up a transaction increasing transaction gasPrice by ten percent.\n *\n * @param transactionId - The ID of the transaction to speed up.\n * @param gasValues - The gas values to use for the speed up transaction.\n * @param options - The options for the speed up transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async speedUpTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n actionId,\n estimatedBaseFee,\n }: { actionId?: string; estimatedBaseFee?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a new speed up transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n // Not good practice to reassign a parameter but temporarily avoiding a larger refactor.\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log('Creating speed up transaction', transactionId, gasValues);\n\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n /* istanbul ignore next */\n if (!transactionMeta) {\n return;\n }\n\n /* istanbul ignore next */\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n this.speedUpMultiplier,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n this.speedUpMultiplier,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n this.speedUpMultiplier,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams: TransactionParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: TransactionEnvelopeType.feeMarket,\n }\n : {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n txParams,\n );\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n\n const newFee = txParams.maxFeePerGas ?? txParams.gasPrice;\n\n const oldFee = txParams.maxFeePerGas\n ? transactionMeta.txParams.maxFeePerGas\n : transactionMeta.txParams.gasPrice;\n\n log('Submitting speed up transaction', { oldFee, newFee, txParams });\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n const baseTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n estimatedBaseFee,\n id: random(),\n time: Date.now(),\n hash,\n actionId,\n originalGasEstimate: transactionMeta.txParams.gas,\n type: TransactionType.retry,\n originalType: transactionMeta.type,\n };\n\n const newTransactionMeta =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n },\n }\n : {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n gasPrice: newGasPrice,\n },\n };\n\n this.addMetadata(newTransactionMeta);\n\n // speedUpTransaction has no approval request, so we assume the user has already approved the transaction\n this.hub.emit('transaction-approved', {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.hub.emit('transaction-submitted', {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.hub.emit(`${transactionMeta.id}:speedup`, newTransactionMeta);\n }\n\n /**\n * Estimates required gas for a given transaction.\n *\n * @param transaction - The transaction to estimate gas for.\n * @param networkClientId - The network client id to use for the estimate.\n * @returns The gas and gas price.\n */\n async estimateGas(\n transaction: TransactionParams,\n networkClientId?: NetworkClientId,\n ) {\n const ethQuery = this.#getEthQuery({ networkClientId });\n const { estimatedGas, simulationFails } = await estimateGas(\n transaction,\n ethQuery,\n );\n\n return { gas: estimatedGas, simulationFails };\n }\n\n /**\n * Estimates required gas for a given transaction and add additional gas buffer with the given multiplier.\n *\n * @param transaction - The transaction params to estimate gas for.\n * @param multiplier - The multiplier to use for the gas buffer.\n * @param networkClientId - The network client id to use for the estimate.\n */\n async estimateGasBuffered(\n transaction: TransactionParams,\n multiplier: number,\n networkClientId?: NetworkClientId,\n ) {\n const ethQuery = this.#getEthQuery({ networkClientId });\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(\n transaction,\n ethQuery,\n );\n\n const gas = addGasBuffer(estimatedGas, blockGasLimit, multiplier);\n\n return {\n gas,\n simulationFails,\n };\n }\n\n /**\n * Updates an existing transaction in state.\n *\n * @param transactionMeta - The new transaction to store in state.\n * @param note - A note or update reason to include in the transaction history.\n */\n updateTransaction(transactionMeta: TransactionMeta, note: string) {\n const { transactions } = this.state;\n transactionMeta.txParams = normalizeTxParams(transactionMeta.txParams);\n validateTxParams(transactionMeta.txParams);\n if (!this.isHistoryDisabled) {\n updateTransactionHistory(transactionMeta, note);\n }\n const index = transactions.findIndex(({ id }) => transactionMeta.id === id);\n transactions[index] = transactionMeta;\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Update the security alert response for a transaction.\n *\n * @param transactionId - ID of the transaction.\n * @param securityAlertResponse - The new security alert response for the transaction.\n */\n updateSecurityAlertResponse(\n transactionId: string,\n securityAlertResponse: SecurityAlertResponse,\n ) {\n if (!securityAlertResponse) {\n throw new Error(\n 'updateSecurityAlertResponse: securityAlertResponse should not be null',\n );\n }\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n throw new Error(\n `Cannot update security alert response as no transaction metadata found`,\n );\n }\n const updatedMeta = merge(transactionMeta, { securityAlertResponse });\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updatesecurityAlertResponse - securityAlertResponse updated',\n );\n }\n\n /**\n * Removes all transactions from state, optionally based on the current network.\n *\n * @param ignoreNetwork - Determines whether to wipe all transactions, or just those on the\n * current network. If `true`, all transactions are wiped.\n * @param address - If specified, only transactions originating from this address will be\n * wiped on current network.\n */\n wipeTransactions(ignoreNetwork?: boolean, address?: string) {\n /* istanbul ignore next */\n if (ignoreNetwork && !address) {\n this.update({ transactions: [] });\n return;\n }\n const currentChainId = this.getChainId();\n const newTransactions = this.state.transactions.filter(\n ({ chainId, txParams }) => {\n const isMatchingNetwork = ignoreNetwork || chainId === currentChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address || txParams.from?.toLowerCase() === address.toLowerCase();\n\n return !isMatchingAddress;\n },\n );\n\n this.update({\n transactions: this.trimTransactionsForState(newTransactions),\n });\n }\n\n /**\n * Adds external provided transaction to state as confirmed transaction.\n *\n * @param transactionMeta - TransactionMeta to add transactions.\n * @param transactionReceipt - TransactionReceipt of the external transaction.\n * @param baseFeePerGas - Base fee per gas of the external transaction.\n */\n async confirmExternalTransaction(\n transactionMeta: TransactionMeta,\n transactionReceipt: TransactionReceipt,\n baseFeePerGas: Hex,\n ) {\n // Run validation and add external transaction to state.\n this.addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = transactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n transactionMeta.status = TransactionStatus.confirmed;\n transactionMeta.txReceipt = transactionReceipt;\n if (baseFeePerGas) {\n transactionMeta.baseFeePerGas = baseFeePerGas;\n }\n\n // Update same nonce local transactions as dropped and define replacedBy properties.\n this.markNonceDuplicatesDropped(transactionId);\n\n // Update external provided transaction with updated gas values and confirmed status.\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:confirmExternalTransaction - Add external transaction',\n );\n this.onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updatePostBalance(transactionMeta);\n\n this.hub.emit('transaction-confirmed', {\n transactionMeta,\n });\n } catch (error) {\n console.error('Failed to confirm external transaction', error);\n }\n }\n\n /**\n * Append new send flow history to a transaction.\n *\n * @param transactionID - The ID of the transaction to update.\n * @param currentSendFlowHistoryLength - The length of the current sendFlowHistory array.\n * @param sendFlowHistoryToAdd - The sendFlowHistory entries to add.\n * @returns The updated transactionMeta.\n */\n updateTransactionSendFlowHistory(\n transactionID: string,\n currentSendFlowHistoryLength: number,\n sendFlowHistoryToAdd: SendFlowHistoryEntry[],\n ): TransactionMeta {\n if (this.isSendFlowHistoryDisabled) {\n throw new Error(\n 'Send flow history is disabled for the current transaction controller',\n );\n }\n\n const transactionMeta = this.getTransaction(transactionID);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update send flow history as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionSendFlowHistory',\n );\n\n if (\n currentSendFlowHistoryLength ===\n (transactionMeta?.sendFlowHistory?.length || 0)\n ) {\n transactionMeta.sendFlowHistory = [\n ...(transactionMeta?.sendFlowHistory ?? []),\n ...sendFlowHistoryToAdd,\n ];\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:updateTransactionSendFlowHistory - sendFlowHistory updated',\n );\n }\n\n return this.getTransaction(transactionID) as TransactionMeta;\n }\n\n /**\n * Update the gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param gasValues - Gas values to update.\n * @param gasValues.gas - Same as transaction.gasLimit.\n * @param gasValues.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param gasValues.gasPrice - Price per gas for legacy transactions.\n * @param gasValues.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param gasValues.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param gasValues.estimateUsed - Which estimate level was used.\n * @param gasValues.estimateSuggested - Which estimate level that the API suggested.\n * @param gasValues.defaultGasEstimates - The default estimate for gas.\n * @param gasValues.originalGasEstimate - Original estimate for gas.\n * @param gasValues.userEditedGasLimit - The gas limit supplied by user.\n * @param gasValues.userFeeLevel - Estimate level user selected.\n * @returns The updated transactionMeta.\n */\n updateTransactionGasFees(\n transactionId: string,\n {\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n }: {\n defaultGasEstimates?: string;\n estimateUsed?: string;\n estimateSuggested?: string;\n gas?: string;\n gasLimit?: string;\n gasPrice?: string;\n maxPriorityFeePerGas?: string;\n maxFeePerGas?: string;\n originalGasEstimate?: string;\n userEditedGasLimit?: boolean;\n userFeeLevel?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionGasFees',\n );\n\n let transactionGasFees = {\n txParams: {\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n },\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n\n // only update what is defined\n transactionGasFees.txParams = pickBy(transactionGasFees.txParams);\n transactionGasFees = pickBy(transactionGasFees);\n\n // merge updated gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionGasFees);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updateTransactionGasFees - gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n /**\n * Update the previous gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param previousGas - Previous gas values to update.\n * @param previousGas.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param previousGas.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param previousGas.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @returns The updated transactionMeta.\n */\n updatePreviousGasParams(\n transactionId: string,\n {\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n }: {\n gasLimit?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(transactionMeta, 'updatePreviousGasParams');\n\n const transactionPreviousGas = {\n previousGas: {\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n\n // only update what is defined\n transactionPreviousGas.previousGas = pickBy(\n transactionPreviousGas.previousGas,\n );\n\n // merge updated previous gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionPreviousGas);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updatePreviousGasParams - Previous gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async #acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId?: NetworkClientId,\n ): Promise<NonceLock> {\n let releaseLockForChainIdKey: (() => void) | undefined;\n let { nonceTracker } = this;\n if (networkClientId && this.enableMultichain) {\n const networkClient = this.getNetworkClientById(networkClientId);\n releaseLockForChainIdKey = await this.#acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n const trackers = this.trackingMap.get(networkClientId);\n if (!trackers) {\n throw new Error('missing nonceTracker for networkClientId');\n }\n nonceTracker = trackers?.nonceTracker;\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n return {\n ...nonceLock,\n releaseLock: () => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n },\n };\n } catch (err) {\n releaseLockForChainIdKey?.();\n throw err;\n }\n }\n\n /**\n * Updates the editable parameters of a transaction.\n *\n * @param txId - The ID of the transaction to update.\n * @param params - The editable parameters to update.\n * @param params.data - Data to pass with the transaction.\n * @param params.gas - Maximum number of units of gas to use for the transaction.\n * @param params.gasPrice - Price per gas for legacy transactions.\n * @param params.from - Address to send the transaction from.\n * @param params.to - Address to send the transaction to.\n * @param params.value - Value associated with the transaction.\n * @returns The updated transaction metadata.\n */\n async updateEditableParams(\n txId: string,\n {\n data,\n gas,\n gasPrice,\n from,\n to,\n value,\n }: {\n data?: string;\n gas?: string;\n gasPrice?: string;\n from?: string;\n to?: string;\n value?: string;\n },\n ) {\n const transactionMeta = this.getTransaction(txId);\n if (!transactionMeta) {\n throw new Error(\n `Cannot update editable params as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(transactionMeta, 'updateEditableParams');\n\n const editableParams = {\n txParams: {\n data,\n from,\n to,\n value,\n gas,\n gasPrice,\n },\n } as Partial<TransactionMeta>;\n\n editableParams.txParams = pickBy(\n editableParams.txParams,\n ) as TransactionParams;\n\n const updatedTransaction = merge(transactionMeta, editableParams);\n const { type } = await determineTransactionType(\n updatedTransaction.txParams,\n this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n }),\n );\n updatedTransaction.type = type;\n\n this.updateTransaction(\n updatedTransaction,\n `Update Editable Params for ${txId}`,\n );\n return this.getTransaction(txId);\n }\n\n /**\n * Signs and returns the raw transaction data for provided transaction params list.\n *\n * @param listOfTxParams - The list of transaction params to approve.\n * @returns The raw transactions.\n */\n async approveTransactionsWithSameNonce(\n listOfTxParams: (TransactionParams & { chainId: Hex })[] = [],\n ): Promise<string | string[]> {\n log('Approving transactions with same nonce', {\n transactions: listOfTxParams,\n });\n\n if (listOfTxParams.length === 0) {\n return '';\n }\n\n const initialTx = listOfTxParams[0];\n const common = this.getCommonConfiguration(initialTx.chainId);\n\n const initialTxAsEthTx = TransactionFactory.fromTxData(initialTx, {\n common,\n });\n const initialTxAsSerializedHex = bufferToHex(initialTxAsEthTx.serialize());\n\n if (this.inProcessOfSigning.has(initialTxAsSerializedHex)) {\n return '';\n }\n\n this.inProcessOfSigning.add(initialTxAsSerializedHex);\n\n let rawTransactions, nonceLock;\n try {\n // TODO: we should add a check to verify that all transactions have the same from address\n const fromAddress = initialTx.from;\n nonceLock = await this.getNonceLock(fromAddress);\n const nonce = nonceLock.nextNonce;\n\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n\n rawTransactions = await Promise.all(\n listOfTxParams.map((txParams) => {\n txParams.nonce = addHexPrefix(nonce.toString(16));\n return this.signExternalTransaction(txParams.chainId, txParams);\n }),\n );\n } catch (err) {\n log('Error while signing transactions with same nonce', err);\n // Must set transaction to submitted/failed before releasing lock\n // continue with error chain\n throw err;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n this.inProcessOfSigning.delete(initialTxAsSerializedHex);\n }\n return rawTransactions;\n }\n\n /**\n * Update a custodial transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param options - The custodial transaction options to update.\n * @param options.errorMessage - The error message to be assigned in case transaction status update to failed.\n * @param options.hash - The new hash value to be assigned.\n * @param options.status - The new status value to be assigned.\n */\n updateCustodialTransaction(\n transactionId: string,\n {\n errorMessage,\n hash,\n status,\n }: {\n errorMessage?: string;\n hash?: string;\n status?: TransactionStatus;\n },\n ) {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update custodial transaction as no transaction metadata found`,\n );\n }\n\n if (!transactionMeta.custodyId) {\n throw new Error('Transaction must be a custodian transaction');\n }\n\n if (\n status &&\n ![\n TransactionStatus.submitted,\n TransactionStatus.signed,\n TransactionStatus.failed,\n ].includes(status)\n ) {\n throw new Error(\n `Cannot update custodial transaction with status: ${status}`,\n );\n }\n\n const updatedTransactionMeta = merge(\n transactionMeta,\n pickBy({ hash, status }),\n );\n\n if (status === TransactionStatus.submitted) {\n updatedTransactionMeta.submittedTime = new Date().getTime();\n }\n\n if (status === TransactionStatus.failed) {\n updatedTransactionMeta.error = normalizeTxError(new Error(errorMessage));\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n `TransactionController:updateCustodialTransaction - Custodial transaction updated`,\n );\n\n if (\n [TransactionStatus.submitted, TransactionStatus.failed].includes(\n status as TransactionStatus,\n )\n ) {\n this.hub.emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);\n }\n }\n\n /**\n * Creates approvals for all unapproved transactions persisted.\n */\n initApprovals() {\n const chainId = this.getChainId();\n const unapprovedTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.status === TransactionStatus.unapproved &&\n transaction.chainId === chainId &&\n !transaction.isUserOperation,\n );\n\n for (const txMeta of unapprovedTxs) {\n this.processApproval(txMeta, {\n shouldShowRequest: false,\n }).catch((error) => {\n if (error?.code === errorCodes.provider.userRejectedRequest) {\n return;\n }\n console.error('Error during persisted transaction approval', error);\n });\n }\n }\n\n /**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.filterToCurrentNetwork - Whether to filter the results to the current network. Defaults to true.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @returns An array of transactions matching the provided options.\n */\n getTransactions({\n searchCriteria = {},\n initialList,\n filterToCurrentNetwork = true,\n limit,\n }: {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchCriteria?: any;\n initialList?: TransactionMeta[];\n filterToCurrentNetwork?: boolean;\n limit?: number;\n } = {}): TransactionMeta[] {\n const chainId = this.getChainId();\n // searchCriteria is an object that might have values that aren't predicate\n // methods. When providing any other value type (string, number, etc), we\n // consider this shorthand for \"check the value at key for strict equality\n // with the provided value\". To conform this object to be only methods, we\n // mapValues (lodash) such that every value on the object is a method that\n // returns a boolean.\n const predicateMethods = mapValues(searchCriteria, (predicate) => {\n return typeof predicate === 'function'\n ? predicate\n : // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: any) => v === predicate;\n });\n\n const transactionsToFilter = initialList ?? this.state.transactions;\n\n // Combine sortBy and pickBy to transform our state object into an array of\n // matching transactions that are sorted by time.\n const filteredTransactions = sortBy(\n pickBy(transactionsToFilter, (transaction) => {\n if (filterToCurrentNetwork && transaction.chainId !== chainId) {\n return false;\n }\n // iterate over the predicateMethods keys to check if the transaction\n // matches the searchCriteria\n for (const [key, predicate] of Object.entries(predicateMethods)) {\n // We return false early as soon as we know that one of the specified\n // search criteria do not match the transaction. This prevents\n // needlessly checking all criteria when we already know the criteria\n // are not fully satisfied. We check both txParams and the base\n // object as predicate keys can be either.\n if (key in transaction.txParams) {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (predicate((transaction.txParams as any)[key]) === false) {\n return false;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if (predicate((transaction as any)[key]) === false) {\n return false;\n }\n }\n\n return true;\n }),\n 'time',\n );\n if (limit !== undefined) {\n // We need to have all transactions of a given nonce in order to display\n // necessary details in the UI. We use the size of this set to determine\n // whether we have reached the limit provided, thus ensuring that all\n // transactions of nonces we include will be sent to the UI.\n const nonces = new Set();\n const txs = [];\n // By default, the transaction list we filter from is sorted by time ASC.\n // To ensure that filtered results prefers the newest transactions we\n // iterate from right to left, inserting transactions into front of a new\n // array. The original order is preserved, but we ensure that newest txs\n // are preferred.\n for (let i = filteredTransactions.length - 1; i > -1; i--) {\n const txMeta = filteredTransactions[i];\n const { nonce } = txMeta.txParams;\n if (!nonces.has(nonce)) {\n if (nonces.size < limit) {\n nonces.add(nonce);\n } else {\n continue;\n }\n }\n // Push transaction into the beginning of our array to ensure the\n // original order is preserved.\n txs.unshift(txMeta);\n }\n return txs;\n }\n return filteredTransactions;\n }\n\n private async signExternalTransaction(\n chainId: Hex,\n transactionParams: TransactionParams,\n ): Promise<string> {\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n const normalizedTransactionParams = normalizeTxParams(transactionParams);\n const type = isEIP1559Transaction(normalizedTransactionParams)\n ? TransactionEnvelopeType.feeMarket\n : TransactionEnvelopeType.legacy;\n const updatedTransactionParams = {\n ...normalizedTransactionParams,\n type,\n gasLimit: normalizedTransactionParams.gas,\n chainId,\n };\n\n const { from } = updatedTransactionParams;\n const common = this.getCommonConfiguration(chainId);\n const unsignedTransaction = TransactionFactory.fromTxData(\n updatedTransactionParams,\n { common },\n );\n const signedTransaction = await this.sign(unsignedTransaction, from);\n\n const rawTransaction = bufferToHex(signedTransaction.serialize());\n return rawTransaction;\n }\n\n /**\n * Removes unapproved transactions from state.\n */\n clearUnapprovedTransactions() {\n const transactions = this.state.transactions.filter(\n ({ status }) => status !== TransactionStatus.unapproved,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Stop the signing process for a specific transaction.\n * Throws an error causing the transaction status to be set to failed.\n * @param transactionId - The ID of the transaction to stop signing.\n */\n abortTransactionSigning(transactionId: string) {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(`Cannot abort signing as no transaction metadata found`);\n }\n\n const abortCallback = this.signAbortCallbacks.get(transactionId);\n\n if (!abortCallback) {\n throw new Error(\n `Cannot abort signing as transaction is not waiting for signing`,\n );\n }\n\n abortCallback();\n\n this.signAbortCallbacks.delete(transactionId);\n }\n\n private addMetadata(transactionMeta: TransactionMeta) {\n const { transactions } = this.state;\n transactions.push(transactionMeta);\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n private async updateGasProperties(transactionMeta: TransactionMeta) {\n const isEIP1559Compatible =\n (await this.getEIP1559Compatibility(transactionMeta.networkClientId)) &&\n transactionMeta.txParams.type !== TransactionEnvelopeType.legacy;\n\n const { networkClientId, chainId } = transactionMeta;\n\n const isCustomNetwork = networkClientId\n ? this.getNetworkClientById(networkClientId).configuration.type ===\n NetworkClientType.Custom\n : this.getNetworkState().providerConfig.type === NetworkType.rpc;\n\n await updateGas({\n ethQuery: this.#getEthQuery({ networkClientId, chainId }),\n chainId,\n isCustomNetwork,\n txMeta: transactionMeta,\n });\n\n await updateGasFees({\n eip1559: isEIP1559Compatible,\n ethQuery: this.#getEthQuery({ networkClientId, chainId }),\n getSavedGasFees: this.getSavedGasFees.bind(this),\n getGasFeeEstimates: this.getGasFeeEstimates.bind(this),\n txMeta: transactionMeta,\n });\n }\n\n private onBootCleanup() {\n this.submitApprovedTransactions();\n }\n\n /**\n * Force submit approved transactions for all chains.\n */\n private submitApprovedTransactions() {\n const approvedTransactions = this.state.transactions.filter(\n (transaction) => transaction.status === TransactionStatus.approved,\n );\n\n for (const transactionMeta of approvedTransactions) {\n if (this.beforeApproveOnInit(transactionMeta)) {\n this.approveTransaction(transactionMeta.id).catch((error) => {\n /* istanbul ignore next */\n console.error('Error while submitting persisted transaction', error);\n });\n }\n }\n }\n\n private async processApproval(\n transactionMeta: TransactionMeta,\n {\n isExisting = false,\n requireApproval,\n shouldShowRequest = true,\n actionId,\n }: {\n isExisting?: boolean;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n actionId?: string;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.isTransactionCompleted(transactionId);\n const finishedPromise = isCompleted\n ? Promise.resolve(meta)\n : this.waitForTransactionFinished(transactionId);\n\n if (meta && !isExisting && !isCompleted) {\n try {\n if (requireApproval !== false) {\n const acceptResult = await this.requestApproval(transactionMeta, {\n shouldShowRequest,\n });\n\n resultCallbacks = acceptResult.resultCallbacks;\n\n if (resultCallbacks) {\n this.hub.once(`${transactionId}:publish-skip`, () => {\n resultCallbacks?.success();\n\n // Remove the reference to prevent additional reports once submitted.\n resultCallbacks = undefined;\n });\n }\n\n const approvalValue = acceptResult.value as\n | {\n txMeta?: TransactionMeta;\n }\n | undefined;\n\n const updatedTransaction = approvalValue?.txMeta;\n\n if (updatedTransaction) {\n log('Updating transaction with approval data', {\n customNonce: updatedTransaction.customNonceValue,\n params: updatedTransaction.txParams,\n });\n\n this.updateTransaction(\n updatedTransaction,\n 'TransactionController#processApproval - Updated with approval data',\n );\n }\n }\n\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n await this.approveTransaction(transactionId);\n const updatedTransactionMeta = this.getTransaction(\n transactionId,\n ) as TransactionMeta;\n this.hub.emit('transaction-approved', {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n if (!isTxCompleted) {\n if (error?.code === errorCodes.provider.userRejectedRequest) {\n this.cancelTransaction(transactionId, actionId);\n\n throw providerErrors.userRejectedRequest(\n 'MetaMask Tx Signature: User denied transaction signature.',\n );\n } else {\n this.failTransaction(meta, error, actionId);\n }\n }\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed:\n resultCallbacks?.error(finalMeta.error);\n throw rpcErrors.internal(finalMeta.error.message);\n\n case TransactionStatus.submitted:\n resultCallbacks?.success();\n return finalMeta.hash as string;\n\n default:\n const internalError = rpcErrors.internal(\n `MetaMask Tx Signature: Unknown problem: ${JSON.stringify(\n finalMeta || transactionId,\n )}`,\n );\n\n resultCallbacks?.error(internalError);\n throw internalError;\n }\n }\n\n /**\n * Approves a transaction and updates it's status in state. If this is not a\n * retry transaction, a nonce will be generated. The transaction is signed\n * using the sign configuration property, then published to the blockchain.\n * A `<tx.id>:finished` hub event is fired after success or failure.\n *\n * @param transactionId - The ID of the transaction to approve.\n */\n private async approveTransaction(transactionId: string) {\n const { transactions } = this.state;\n const releaseLock = await this.mutex.acquire();\n const index = transactions.findIndex(({ id }) => transactionId === id);\n const transactionMeta = transactions[index];\n const {\n txParams: { from },\n networkClientId,\n } = transactionMeta;\n\n let releaseNonceLock: (() => void) | undefined;\n\n try {\n if (!this.sign) {\n releaseLock();\n this.failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return;\n } else if (!transactionMeta.chainId) {\n releaseLock();\n this.failTransaction(transactionMeta, new Error('No chainId defined.'));\n return;\n }\n\n if (this.inProcessOfSigning.has(transactionId)) {\n log('Skipping approval as signing in progress', transactionId);\n return;\n }\n\n const [nonce, releaseNonce] = await getNextNonce(\n transactionMeta,\n (address: string) => this.getNonceLock(address, networkClientId),\n );\n\n releaseNonceLock = releaseNonce;\n\n transactionMeta.status = TransactionStatus.approved;\n transactionMeta.txParams.nonce = nonce;\n transactionMeta.txParams.chainId = transactionMeta.chainId;\n\n const baseTxParams = {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n };\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction approved',\n );\n\n this.onTransactionStatusChange(transactionMeta);\n\n const isEIP1559 = isEIP1559Transaction(transactionMeta.txParams);\n\n const txParams: TransactionParams = isEIP1559\n ? {\n ...baseTxParams,\n estimatedBaseFee: transactionMeta.txParams.estimatedBaseFee,\n type: TransactionEnvelopeType.feeMarket,\n }\n : baseTxParams;\n\n const rawTx = await this.signTransaction(transactionMeta, txParams);\n\n if (!this.beforePublish(transactionMeta)) {\n log('Skipping publishing transaction based on hook');\n this.hub.emit(`${transactionMeta.id}:publish-skip`, transactionMeta);\n return;\n }\n\n if (!rawTx) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n\n if (transactionMeta.type === TransactionType.swap) {\n log('Determining pre-transaction balance');\n\n const preTxBalance = await query(ethQuery, 'getBalance', [from]);\n\n transactionMeta.preTxBalance = preTxBalance;\n\n log('Updated pre-transaction balance', transactionMeta.preTxBalance);\n }\n\n log('Publishing transaction', txParams);\n\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n log('Publish successful', hash);\n\n transactionMeta.hash = hash;\n transactionMeta.status = TransactionStatus.submitted;\n transactionMeta.submittedTime = new Date().getTime();\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction submitted',\n );\n\n this.hub.emit('transaction-submitted', {\n transactionMeta,\n });\n\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n\n this.onTransactionStatusChange(transactionMeta);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n } finally {\n this.inProcessOfSigning.delete(transactionId);\n // must set transaction to submitted/failed before releasing lock\n releaseNonceLock?.();\n releaseLock();\n }\n }\n\n private async publishTransaction(\n ethQuery: EthQuery,\n rawTransaction: string,\n ): Promise<string> {\n return await query(ethQuery, 'sendRawTransaction', [rawTransaction]);\n }\n\n /**\n * Cancels a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param actionId - The actionId passed from UI\n */\n private cancelTransaction(transactionId: string, actionId?: string) {\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n transactionMeta.status = TransactionStatus.rejected;\n const transactions = this.state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n this.hub.emit('transaction-rejected', {\n transactionMeta,\n actionId,\n });\n this.onTransactionStatusChange(transactionMeta);\n }\n\n /**\n * Trim the amount of transactions that are set on the state. Checks\n * if the length of the tx history is longer then desired persistence\n * limit and then if it is removes the oldest confirmed or rejected tx.\n * Pending or unapproved transactions will not be removed by this\n * operation. For safety of presenting a fully functional transaction UI\n * representation, this function will not break apart transactions with the\n * same nonce, created on the same day, per network. Not accounting for transactions of the same\n * nonce, same day and network combo can result in confusing or broken experiences\n * in the UI. The transactions are then updated using the BaseControllerV1 update.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n private trimTransactionsForState(\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const nonceNetworkSet = new Set();\n\n const txsToKeep = transactions\n .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order\n .filter((tx) => {\n const { chainId, status, txParams, time } = tx;\n\n if (txParams) {\n const key = `${txParams.nonce}-${convertHexToDecimal(\n chainId,\n )}-${new Date(time).toDateString()}`;\n\n if (nonceNetworkSet.has(key)) {\n return true;\n } else if (\n nonceNetworkSet.size < this.config.txHistoryLimit ||\n !this.isFinalState(status)\n ) {\n nonceNetworkSet.add(key);\n return true;\n }\n }\n\n return false;\n });\n\n txsToKeep.reverse(); // Ascending time order\n return txsToKeep;\n }\n\n /**\n * Determines if the transaction is in a final state.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed\n );\n }\n\n /**\n * Whether the transaction has at least completed all local processing.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n private async requestApproval(\n txMeta: TransactionMeta,\n { shouldShowRequest }: { shouldShowRequest: boolean },\n ): Promise<AddResult> {\n const id = this.getApprovalId(txMeta);\n const { origin } = txMeta;\n const type = ApprovalType.Transaction;\n const requestData = { txId: txMeta.id };\n\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin || ORIGIN_METAMASK,\n type,\n requestData,\n expectsResult: true,\n },\n shouldShowRequest,\n )) as Promise<AddResult>;\n }\n\n private getTransaction(transactionId: string): TransactionMeta | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n private getApprovalId(txMeta: TransactionMeta) {\n return String(txMeta.id);\n }\n\n private isTransactionCompleted(transactionId: string): {\n meta?: TransactionMeta;\n isCompleted: boolean;\n } {\n const transaction = this.getTransaction(transactionId);\n\n if (!transaction) {\n return { meta: undefined, isCompleted: false };\n }\n\n const isCompleted = this.isLocalFinalState(transaction.status);\n\n return { meta: transaction, isCompleted };\n }\n\n private getChainId(networkClientId?: NetworkClientId): Hex {\n if (networkClientId) {\n return this.getNetworkClientById(networkClientId).configuration.chainId;\n }\n const { providerConfig } = this.getNetworkState();\n return providerConfig.chainId;\n }\n\n private prepareUnsignedEthTx(\n chainId: Hex,\n txParams: TransactionParams,\n ): TypedTransaction {\n return TransactionFactory.fromTxData(txParams, {\n freeze: false,\n common: this.getCommonConfiguration(chainId),\n });\n }\n\n /**\n * `@ethereumjs/tx` uses `@ethereumjs/common` as a configuration tool for\n * specifying which chain, network, hardfork and EIPs to support for\n * a transaction. By referencing this configuration, and analyzing the fields\n * specified in txParams, @ethereumjs/tx is able to determine which EIP-2718\n * transaction type to use.\n *\n * @param chainId - The chainId to use for the configuration.\n * @returns common configuration object\n */\n private getCommonConfiguration(chainId: Hex): Common {\n const customChainParams: Partial<ChainConfig> = {\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams);\n }\n\n private onIncomingTransactions({\n added,\n updated,\n }: {\n added: TransactionMeta[];\n updated: TransactionMeta[];\n }) {\n const { transactions: currentTransactions } = this.state;\n\n const updatedTransactions = [\n ...added,\n ...currentTransactions.map((originalTransaction) => {\n const updatedTransaction = updated.find(\n ({ hash }) => hash === originalTransaction.hash,\n );\n\n return updatedTransaction ?? originalTransaction;\n }),\n ];\n\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n private onUpdatedLastFetchedBlockNumbers({\n lastFetchedBlockNumbers,\n blockNumber,\n }: {\n lastFetchedBlockNumbers: {\n [key: string]: number;\n };\n blockNumber: number;\n }) {\n this.update({ lastFetchedBlockNumbers });\n this.hub.emit('incomingTransactionBlock', blockNumber);\n }\n\n private generateDappSuggestedGasFees(\n txParams: TransactionParams,\n origin?: string,\n ): DappSuggestedGasFees | undefined {\n if (!origin || origin === ORIGIN_METAMASK) {\n return undefined;\n }\n\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;\n\n if (\n gasPrice === undefined &&\n maxFeePerGas === undefined &&\n maxPriorityFeePerGas === undefined &&\n gas === undefined\n ) {\n return undefined;\n }\n\n const dappSuggestedGasFees: DappSuggestedGasFees = {};\n\n if (gasPrice !== undefined) {\n dappSuggestedGasFees.gasPrice = gasPrice;\n } else if (\n maxFeePerGas !== undefined ||\n maxPriorityFeePerGas !== undefined\n ) {\n dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;\n dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;\n }\n\n if (gas !== undefined) {\n dappSuggestedGasFees.gas = gas;\n }\n\n return dappSuggestedGasFees;\n }\n\n /**\n * Validates and adds external provided transaction to state.\n *\n * @param transactionMeta - Nominated external transaction to be added to state.\n */\n private addExternalTransaction(transactionMeta: TransactionMeta) {\n const { chainId } = transactionMeta;\n const { transactions } = this.state;\n const fromAddress = transactionMeta?.txParams?.from;\n const sameFromAndNetworkTransactions = transactions.filter(\n (transaction) =>\n transaction.txParams.from === fromAddress &&\n transaction.chainId === chainId,\n );\n const confirmedTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.confirmed,\n );\n const pendingTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.submitted,\n );\n\n validateConfirmedExternalTransaction(\n transactionMeta,\n confirmedTxs,\n pendingTxs,\n );\n\n // Make sure provided external transaction has non empty history array\n if (!(transactionMeta.history ?? []).length) {\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n }\n\n const updatedTransactions = [...transactions, transactionMeta];\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n /**\n * Sets other txMeta statuses to dropped if the txMeta that has been confirmed has other transactions\n * in the transactions have the same nonce.\n *\n * @param transactionId - Used to identify original transaction.\n */\n private markNonceDuplicatesDropped(transactionId: string) {\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n return;\n }\n const nonce = transactionMeta.txParams?.nonce;\n const from = transactionMeta.txParams?.from;\n const { chainId } = transactionMeta;\n\n const sameNonceTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.id !== transactionId &&\n transaction.txParams.from === from &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId &&\n transaction.type !== TransactionType.incoming,\n );\n\n if (!sameNonceTxs.length) {\n return;\n }\n\n // Mark all same nonce transactions as dropped and give it a replacedBy hash\n for (const transaction of sameNonceTxs) {\n transaction.replacedBy = transactionMeta.hash;\n transaction.replacedById = transactionMeta.id;\n // Drop any transaction that wasn't previously failed (off chain failure)\n if (transaction.status !== TransactionStatus.failed) {\n this.setTransactionStatusDropped(transaction);\n }\n }\n }\n\n /**\n * Method to set transaction status to dropped.\n *\n * @param transactionMeta - TransactionMeta of transaction to be marked as dropped.\n */\n private setTransactionStatusDropped(transactionMeta: TransactionMeta) {\n transactionMeta.status = TransactionStatus.dropped;\n this.hub.emit('transaction-dropped', {\n transactionMeta,\n });\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n this.onTransactionStatusChange(transactionMeta);\n }\n\n /**\n * Get transaction with provided actionId.\n *\n * @param actionId - Unique ID to prevent duplicate requests\n * @returns the filtered transaction\n */\n private getTransactionWithActionId(actionId?: string) {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n private async waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.hub.once(`${transactionId}:finished`, (txMeta) => {\n resolve(txMeta);\n });\n });\n }\n\n /**\n * Updates the r, s, and v properties of a TransactionMeta object\n * with values from a signed transaction.\n *\n * @param transactionMeta - The TransactionMeta object to update.\n * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.\n */\n private async updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): Promise<void> {\n for (const key of ['r', 's', 'v'] as const) {\n const value = signedTx[key];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n transactionMeta[key] = addHexPrefix(value.toString(16));\n }\n }\n\n private async getEIP1559Compatibility(networkClientId?: NetworkClientId) {\n const currentNetworkIsEIP1559Compatible =\n await this.getCurrentNetworkEIP1559Compatibility(networkClientId);\n\n const currentAccountIsEIP1559Compatible =\n await this.getCurrentAccountEIP1559Compatibility();\n\n return (\n currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible\n );\n }\n\n private removeIncomingTransactionHelperListeners(\n incomingTransactionHelper = this.incomingTransactionHelper,\n ) {\n incomingTransactionHelper.hub.removeAllListeners('transactions');\n incomingTransactionHelper.hub.removeAllListeners(\n 'updatedLastFetchedBlockNumbers',\n );\n }\n\n private addIncomingTransactionHelperListeners(\n incomingTransactionHelper = this.incomingTransactionHelper,\n ) {\n incomingTransactionHelper.hub.on(\n 'transactions',\n this.onIncomingTransactions.bind(this),\n );\n incomingTransactionHelper.hub.on(\n 'updatedLastFetchedBlockNumbers',\n this.onUpdatedLastFetchedBlockNumbers.bind(this),\n );\n }\n\n private removePendingTransactionTrackerListeners(\n pendingTransactionTracker = this.pendingTransactionTracker,\n ) {\n pendingTransactionTracker.hub.removeAllListeners('transaction-confirmed');\n pendingTransactionTracker.hub.removeAllListeners('transaction-dropped');\n pendingTransactionTracker.hub.removeAllListeners('transaction-failed');\n pendingTransactionTracker.hub.removeAllListeners('transaction-updated');\n }\n\n private addPendingTransactionTrackerListeners(\n pendingTransactionTracker = this.pendingTransactionTracker,\n ) {\n pendingTransactionTracker.hub.on(\n 'transaction-confirmed',\n this.onConfirmedTransaction.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n this.setTransactionStatusDropped.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-failed',\n this.failTransaction.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-updated',\n this.updateTransaction.bind(this),\n );\n }\n\n private async signTransaction(\n transactionMeta: TransactionMeta,\n txParams: TransactionParams,\n ): Promise<string | undefined> {\n log('Signing transaction', txParams);\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n txParams,\n );\n\n this.inProcessOfSigning.add(transactionMeta.id);\n\n const signedTx = await new Promise<TypedTransaction>((resolve, reject) => {\n this.sign?.(\n unsignedEthTx,\n txParams.from,\n ...this.getAdditionalSignArguments(transactionMeta),\n ).then(resolve, reject);\n\n this.signAbortCallbacks.set(transactionMeta.id, () =>\n reject(new Error('Signing aborted by user')),\n );\n });\n\n this.signAbortCallbacks.delete(transactionMeta.id);\n\n if (!signedTx) {\n log('Skipping signed status as no signed transaction');\n return undefined;\n }\n\n if (!this.afterSign(transactionMeta, signedTx)) {\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#signTransaction - Update after sign',\n );\n\n log('Skipping signed status based on hook');\n\n return undefined;\n }\n\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n\n transactionMeta.status = TransactionStatus.signed;\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n this.onTransactionStatusChange(transactionMeta);\n\n const rawTx = bufferToHex(signedTx.serialize());\n\n transactionMeta.rawTx = rawTx;\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n\n return rawTx;\n }\n\n private onTransactionStatusChange(transactionMeta: TransactionMeta) {\n this.hub.emit('transaction-status-update', { transactionMeta });\n }\n\n private getNonceTrackerPendingTransactions(\n chainId: string | undefined,\n address: string,\n ) {\n const standardPendingTransactions = this.getNonceTrackerTransactions(\n TransactionStatus.submitted,\n address,\n chainId,\n );\n\n const externalPendingTransactions = this.getExternalPendingTransactions(\n address,\n chainId,\n );\n\n return [...standardPendingTransactions, ...externalPendingTransactions];\n }\n\n private getNonceTrackerTransactions(\n status: TransactionStatus,\n address: string,\n chainId: string = this.getChainId(),\n ) {\n return getAndFormatTransactionsForNonceTracker(\n chainId,\n address,\n status,\n this.state.transactions,\n );\n }\n\n private onConfirmedTransaction(transactionMeta: TransactionMeta) {\n log('Processing confirmed transaction', transactionMeta.id);\n\n this.markNonceDuplicatesDropped(transactionMeta.id);\n\n this.hub.emit('transaction-confirmed', { transactionMeta });\n this.hub.emit(`${transactionMeta.id}:confirmed`, transactionMeta);\n\n this.onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updatePostBalance(transactionMeta);\n }\n\n private async updatePostBalance(transactionMeta: TransactionMeta) {\n try {\n if (transactionMeta.type !== TransactionType.swap) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const { updatedTransactionMeta, approvalTransactionMeta } =\n await updatePostTransactionBalance(transactionMeta, {\n ethQuery,\n getTransaction: this.getTransaction.bind(this),\n updateTransaction: this.updateTransaction.bind(this),\n });\n\n this.hub.emit('post-transaction-balance-updated', {\n transactionMeta: updatedTransactionMeta,\n approvalTransactionMeta,\n });\n } catch (error) {\n /* istanbul ignore next */\n log('Error while updating post transaction balance', error);\n }\n }\n\n #getEthQuery({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n }): EthQuery {\n // if multichain is disabled, use the global ethQuery\n if (!this.enableMultichain) {\n return this.ethQuery;\n }\n let networkClient: NetworkClient | undefined;\n\n if (networkClientId) {\n try {\n networkClient = this.getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by networkClientId');\n }\n }\n\n if (!networkClient && chainId) {\n try {\n networkClientId = this.findNetworkClientIdByChainId(chainId);\n networkClient = this.getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by chainId');\n }\n }\n\n if (networkClient) {\n return new EthQuery(networkClient.provider);\n }\n\n // NOTE(JL): we're not ready to drop globally selected ethQuery yet.\n // Some calls to getEthQuery only have access to optional networkClientId\n // throw new Error('failed to get eth query instance');\n return this.ethQuery;\n }\n\n #refreshEtherscanRemoteTransactionSources = (\n networkClients: ReturnType<NetworkController['getNetworkClientRegistry']>,\n ) => {\n // this will be prettier when we have consolidated network clients with a single chainId:\n // check if there are still other network clients using the same chainId\n // if not remove the etherscanRemoteTransaction source from the map\n const chainIdsInRegistry = new Set();\n Object.values(networkClients).forEach((networkClient) =>\n chainIdsInRegistry.add(networkClient.configuration.chainId),\n );\n const existingChainIds = Array.from(\n this.etherscanRemoteTransactionSourcesMap.keys(),\n );\n const chainIdsToRemove = existingChainIds.filter(\n (chainId) => !chainIdsInRegistry.has(chainId),\n );\n\n chainIdsToRemove.forEach((chainId) => {\n this.etherscanRemoteTransactionSourcesMap.delete(chainId);\n });\n };\n\n #refreshTrackingMap = (\n networkClients: ReturnType<NetworkController['getNetworkClientRegistry']>,\n ) => {\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n };\n\n #initTrackingMap = () => {\n const networkClients = this.getNetworkClientRegistry();\n const networkClientIds = Object.keys(networkClients);\n networkClientIds.map((id) => this.#startTrackingByNetworkClientId(id));\n this.hub.emit('tracking-map-init', networkClientIds);\n };\n\n #checkForPendingTransactionAndStartPolling = () => {\n // PendingTransactionTracker reads state through its getTransactions hook\n this.pendingTransactionTracker.onStateChange();\n if (this.enableMultichain) {\n for (const [, trackingMap] of this.trackingMap) {\n trackingMap.pendingTransactionTracker.onStateChange();\n }\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n trackers.incomingTransactionHelper.stop();\n this.removeIncomingTransactionHelperListeners(\n trackers.incomingTransactionHelper,\n );\n this.trackingMap.delete(networkClientId);\n this.hub.emit('tracking-map-remove', networkClientId);\n }\n }\n\n #stopAllTracking() {\n this.pendingTransactionTracker.stop();\n this.removePendingTransactionTrackerListeners();\n this.incomingTransactionHelper.stop();\n this.removeIncomingTransactionHelperListeners();\n\n if (this.enableMultichain) {\n for (const [networkClientId] of this.trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n const networkClient = this.getNetworkClientById(networkClientId);\n const { chainId } = networkClient.configuration;\n\n let etherscanRemoteTransactionSource =\n this.etherscanRemoteTransactionSourcesMap.get(chainId);\n if (!etherscanRemoteTransactionSource) {\n etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({\n includeTokenTransfers:\n this.incomingTransactionOptions.includeTokenTransfers,\n });\n this.etherscanRemoteTransactionSourcesMap.set(\n chainId,\n etherscanRemoteTransactionSource,\n );\n }\n\n const ethQuery = new EthQuery(networkClient.provider);\n\n const nonceTracker = new NonceTracker({\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provider: networkClient.provider as any,\n blockTracker: networkClient.blockTracker,\n getPendingTransactions: this.getNonceTrackerPendingTransactions.bind(\n this,\n chainId,\n ),\n getConfirmedTransactions: this.getNonceTrackerTransactions.bind(\n this,\n TransactionStatus.confirmed,\n ),\n });\n\n const incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker: networkClient.blockTracker,\n getCurrentAccount: this.getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getChainId: () => chainId,\n isEnabled: this.incomingTransactionOptions.isEnabled,\n queryEntireHistory: this.incomingTransactionOptions.queryEntireHistory,\n remoteTransactionSource: etherscanRemoteTransactionSource,\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: this.incomingTransactionOptions.updateTransactions,\n });\n\n this.addIncomingTransactionHelperListeners(incomingTransactionHelper);\n\n const pendingTransactionTracker = new PendingTransactionTracker({\n approveTransaction: this.approveTransaction.bind(this),\n blockTracker: networkClient.blockTracker,\n getChainId: () => chainId,\n getEthQuery: () => ethQuery,\n getTransactions: () => this.state.transactions,\n isResubmitEnabled: this.pendingTransactionOptions.isResubmitEnabled,\n getGlobalLock: this.#acquireNonceLockForChainIdKey.bind(this, {\n chainId,\n }),\n publishTransaction: this.publishTransaction.bind(this),\n hooks: {\n beforeCheckPendingTransaction:\n this.beforeCheckPendingTransaction.bind(this),\n beforePublish: this.beforePublish.bind(this),\n },\n });\n\n this.addPendingTransactionTrackerListeners(pendingTransactionTracker);\n\n this.trackingMap.set(networkClientId, {\n nonceTracker,\n incomingTransactionHelper,\n pendingTransactionTracker,\n });\n\n this.hub.emit('tracking-map-add', networkClientId);\n }\n}\n"]}
1
+ {"version":3,"file":"TransactionController.js","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hardfork, Common, type ChainConfig } from '@ethereumjs/common';\nimport type { TypedTransaction } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n BaseConfig,\n BaseState,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseControllerV1 } from '@metamask/base-controller';\nimport {\n query,\n NetworkType,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n BlockTracker,\n NetworkClientId,\n NetworkController,\n NetworkControllerStateChangeEvent,\n NetworkState,\n Provider,\n NetworkClient,\n} from '@metamask/network-controller';\nimport { NetworkClientType } from '@metamask/network-controller';\nimport { errorCodes, rpcErrors, providerErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport { MethodRegistry } from 'eth-method-registry';\nimport { addHexPrefix, bufferToHex } from 'ethereumjs-util';\nimport { EventEmitter } from 'events';\nimport { mapValues, merge, pickBy, sortBy } from 'lodash';\nimport { NonceTracker } from 'nonce-tracker';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from 'nonce-tracker';\nimport { v1 as random } from 'uuid';\n\nimport { EtherscanRemoteTransactionSource } from './helpers/EtherscanRemoteTransactionSource';\nimport { IncomingTransactionHelper } from './helpers/IncomingTransactionHelper';\nimport { PendingTransactionTracker } from './helpers/PendingTransactionTracker';\nimport { projectLogger as log } from './logger';\nimport type {\n Events,\n DappSuggestedGasFees,\n SavedGasFees,\n SecurityProviderRequest,\n SendFlowHistoryEntry,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n WalletDevice,\n SecurityAlertResponse,\n} from './types';\nimport {\n TransactionEnvelopeType,\n TransactionType,\n TransactionStatus,\n} from './types';\nimport { validateConfirmedExternalTransaction } from './utils/external-transactions';\nimport { addGasBuffer, estimateGas, updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport {\n addInitialHistorySnapshot,\n updateTransactionHistory,\n} from './utils/history';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getNextNonce,\n} from './utils/nonce';\nimport {\n updatePostTransactionBalance,\n updateSwapsTransaction,\n} from './utils/swaps';\nimport { determineTransactionType } from './utils/transaction-type';\nimport {\n getIncreasedPriceFromExisting,\n normalizeTxParams,\n isEIP1559Transaction,\n isFeeMarketEIP1559Values,\n isGasPriceValue,\n validateGasValues,\n validateIfTransactionUnapproved,\n validateMinimumIncrease,\n normalizeTxError,\n normalizeGasFeeValues,\n} from './utils/utils';\nimport {\n validateTransactionOrigin,\n validateTxParams,\n} from './utils/validation';\n\nexport const HARDFORK = Hardfork.London;\n\n/**\n * @type Result\n * @property result - Promise resolving to a new transaction hash\n * @property transactionMeta - Meta information about this new transaction\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface Result {\n result: Promise<string>;\n transactionMeta: TransactionMeta;\n}\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface GasPriceValue {\n gasPrice: string;\n}\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface FeeMarketEIP1559Values {\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n}\n\n/**\n * @type TransactionConfig\n *\n * Transaction controller configuration\n * @property provider - Provider used to create a new underlying EthQuery instance\n * @property sign - Method used to sign transactions\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionConfig extends BaseConfig {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sign?: (txParams: TransactionParams, from: string) => Promise<any>;\n txHistoryLimit: number;\n}\n\n/**\n * @type MethodData\n *\n * Method data registry object\n * @property registryMethod - Registry method raw string\n * @property parsedRegistryMethod - Registry method object, containing name and method arguments\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface MethodData {\n registryMethod: string;\n parsedRegistryMethod: Record<string, unknown>;\n}\n\n/**\n * @type TransactionState\n *\n * Transaction controller state\n * @property transactions - A list of TransactionMeta objects\n * @property methodData - Object containing all known method data information\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionState extends BaseState {\n transactions: TransactionMeta[];\n methodData: { [key: string]: MethodData };\n lastFetchedBlockNumbers: { [key: string]: number };\n}\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.5;\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during speed up\n */\nexport const SPEED_UP_RATE = 1.1;\n\n/**\n * @type IncomingTransactionOptions\n *\n * Configuration options for the IncomingTransactionHelper\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\ntype IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\n/**\n * @type PendingTransactionOptions\n *\n * Configuration options for the PendingTransactionTracker\n * @property isResubmitEnabled - Whether transaction publishing is automatically retried.\n */\ntype PendingTransactionOptions = {\n isResubmitEnabled?: boolean;\n};\n\n/**\n * @type NetworkClientRegistry\n *\n * Registry of network clients provided by the NetworkController\n */\n\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\n/**\n * The name of the {@link TransactionController}.\n */\nconst controllerName = 'TransactionController';\n\n/**\n * The external actions available to the {@link TransactionController}.\n */\ntype AllowedActions = AddApprovalRequest;\n\ntype AllowedEvents = NetworkControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AllowedActions,\n AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface TransactionControllerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseControllerV1<\n TransactionConfig,\n TransactionState\n> {\n private readonly ethQuery: EthQuery;\n\n private readonly isHistoryDisabled: boolean;\n\n private readonly isSwapsDisabled: boolean;\n\n private readonly isSendFlowHistoryDisabled: boolean;\n\n private readonly inProcessOfSigning: Set<string> = new Set();\n\n private readonly nonceTracker: NonceTracker;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly registry: any;\n\n private readonly provider: Provider;\n\n private readonly mutex = new Mutex();\n\n private readonly nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n private readonly getSavedGasFees: (chainId: Hex) => SavedGasFees | undefined;\n\n private readonly getNetworkState: () => NetworkState;\n\n private readonly getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n\n private readonly getCurrentNetworkEIP1559Compatibility: (\n networkClientId?: NetworkClientId,\n ) => Promise<boolean>;\n\n private readonly getGasFeeEstimates: () => Promise<GasFeeState>;\n\n private readonly getPermittedAccounts: (origin?: string) => Promise<string[]>;\n\n private readonly getSelectedAddress: () => string;\n\n private readonly getExternalPendingTransactions: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n private enableMultichain: boolean;\n\n private readonly messagingSystem: TransactionControllerMessenger;\n\n private readonly incomingTransactionHelper: IncomingTransactionHelper;\n\n private readonly securityProviderRequest?: SecurityProviderRequest;\n\n private readonly pendingTransactionTracker: PendingTransactionTracker;\n\n private readonly cancelMultiplier: number;\n\n private readonly speedUpMultiplier: number;\n\n private readonly incomingTransactionOptions: IncomingTransactionOptions;\n\n private readonly pendingTransactionOptions: PendingTransactionOptions;\n\n private readonly signAbortCallbacks: Map<string, () => void> = new Map();\n\n private readonly afterSign: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n private readonly beforeApproveOnInit: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n private readonly beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n private readonly beforePublish: (transactionMeta: TransactionMeta) => boolean;\n\n private readonly getAdditionalSignArguments: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n private readonly findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n private readonly getNetworkClientById: NetworkController['getNetworkClientById'];\n\n private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n private failTransaction(\n transactionMeta: TransactionMeta,\n error: Error,\n actionId?: string,\n ) {\n const newTransactionMeta = {\n ...transactionMeta,\n error: normalizeTxError(error),\n status: TransactionStatus.failed,\n };\n this.hub.emit('transaction-failed', {\n actionId,\n error: error.message,\n transactionMeta: newTransactionMeta,\n });\n this.updateTransaction(\n newTransactionMeta,\n 'TransactionController#failTransaction - Add error message and set status to failed',\n );\n this.onTransactionStatusChange(newTransactionMeta);\n this.hub.emit(`${transactionMeta.id}:finished`, newTransactionMeta);\n }\n\n private async registryLookup(fourBytePrefix: string): Promise<MethodData> {\n const registryMethod = await this.registry.lookup(fourBytePrefix);\n const parsedRegistryMethod = this.registry.parse(registryMethod);\n return { registryMethod, parsedRegistryMethod };\n }\n\n /**\n * EventEmitter instance used to listen to specific transactional events\n */\n hub = new EventEmitter() as TransactionControllerEventEmitter;\n\n /**\n * Name of this controller used during composition\n */\n override name = 'TransactionController';\n\n private readonly trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n incomingTransactionHelper: IncomingTransactionHelper;\n }\n > = new Map();\n\n readonly etherscanRemoteTransactionSourcesMap: Map<\n Hex,\n EtherscanRemoteTransactionSource\n > = new Map();\n\n /**\n * Method used to sign transactions\n */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n /**\n * Creates a TransactionController instance.\n *\n * @param options - The controller options.\n * @param options.blockTracker - The block tracker used to poll for new blocks data.\n * @param options.cancelMultiplier - Multiplier used to determine a transaction's increased gas fee during cancellation.\n * @param options.disableHistory - Whether to disable storing history in transaction metadata.\n * @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.\n * @param options.disableSwaps - Whether to disable additional processing on swaps transactions.\n * @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.\n * @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.\n * @param options.getExternalPendingTransactions - Callback to retrieve pending transactions from external sources.\n * @param options.getGasFeeEstimates - Callback to retrieve gas fee estimates.\n * @param options.getNetworkState - Gets the state of the network controller.\n * @param options.getPermittedAccounts - Get accounts that a given origin has permissions for.\n * @param options.getSavedGasFees - Gets the saved gas fee config.\n * @param options.getSelectedAddress - Gets the address of the currently selected account.\n * @param options.incomingTransactions - Configuration options for incoming transaction support.\n * @param options.messenger - The controller messenger.\n * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.\n * @param options.pendingTransactions - Configuration options for pending transaction support.\n * @param options.provider - The provider used to create the underlying EthQuery instance.\n * @param options.securityProviderRequest - A function for verifying a transaction, whether it is malicious or not.\n * @param options.speedUpMultiplier - Multiplier used to determine a transaction's increased gas fee during speed up.\n * @param options.findNetworkClientIdByChainId - Finds a networkClientId with the given chainId from the NetworkController.\n * @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.\n * @param options.hooks - The controller hooks.\n * @param options.hooks.afterSign - Additional logic to execute after signing a transaction. Return false to not change the status to signed.\n * @param options.hooks.beforeApproveOnInit - Additional logic to execute before starting an approval flow for a transaction during initialization. Return false to skip the transaction.\n * @param options.hooks.beforeCheckPendingTransaction - Additional logic to execute before checking pending transactions. Return false to prevent the broadcast of the transaction.\n * @param options.hooks.beforePublish - Additional logic to execute before publishing a transaction. Return false to prevent the broadcast of the transaction.\n * @param options.hooks.getAdditionalSignArguments - Returns additional arguments required to sign a transaction.\n * @param options.hub - Use a different event emitter for the hub.\n * @param options.getNetworkClientRegistry - Gets the network client registry.\n * @param options.enableMultichain - Enable multichain support.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n blockTracker,\n cancelMultiplier,\n disableHistory,\n disableSendFlowHistory,\n disableSwaps,\n getCurrentAccountEIP1559Compatibility,\n getCurrentNetworkEIP1559Compatibility,\n getExternalPendingTransactions,\n getGasFeeEstimates,\n getNetworkState,\n getPermittedAccounts,\n getSavedGasFees,\n getSelectedAddress,\n incomingTransactions = {},\n messenger,\n onNetworkStateChange,\n pendingTransactions = {},\n provider,\n securityProviderRequest,\n speedUpMultiplier,\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n hub,\n enableMultichain = false,\n hooks = {},\n }: {\n blockTracker: BlockTracker;\n cancelMultiplier?: number;\n disableHistory: boolean;\n disableSendFlowHistory: boolean;\n disableSwaps: boolean;\n getCurrentAccountEIP1559Compatibility?: () => Promise<boolean>;\n getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n getExternalPendingTransactions?: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n getGasFeeEstimates?: () => Promise<GasFeeState>;\n getNetworkState: () => NetworkState;\n getPermittedAccounts: (origin?: string) => Promise<string[]>;\n getSavedGasFees?: (chainId: Hex) => SavedGasFees | undefined;\n getSelectedAddress: () => string;\n incomingTransactions?: IncomingTransactionOptions;\n messenger: TransactionControllerMessenger;\n onNetworkStateChange: (listener: (state: NetworkState) => void) => void;\n pendingTransactions?: PendingTransactionOptions;\n provider: Provider;\n securityProviderRequest?: SecurityProviderRequest;\n speedUpMultiplier?: number;\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n hub: TransactionControllerEventEmitter;\n enableMultichain: boolean;\n hooks: {\n afterSign?: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n beforeApproveOnInit?: (transactionMeta: TransactionMeta) => boolean;\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n beforePublish?: (transactionMeta: TransactionMeta) => boolean;\n getAdditionalSignArguments?: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n };\n },\n config?: Partial<TransactionConfig>,\n state?: Partial<TransactionState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n txHistoryLimit: 40,\n };\n\n this.defaultState = {\n methodData: {},\n transactions: [],\n lastFetchedBlockNumbers: {},\n };\n this.initialize();\n this.hub = hub ?? this.hub;\n this.enableMultichain = enableMultichain;\n this.findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.getNetworkClientById = getNetworkClientById;\n this.getNetworkClientRegistry = getNetworkClientRegistry;\n this.provider = provider;\n this.messagingSystem = messenger;\n this.getNetworkState = getNetworkState;\n this.ethQuery = new EthQuery(provider);\n this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;\n this.isHistoryDisabled = disableHistory ?? false;\n this.isSwapsDisabled = disableSwaps ?? false;\n // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed\n this.registry = new MethodRegistry({ provider });\n this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined);\n this.getCurrentAccountEIP1559Compatibility =\n getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true));\n this.getCurrentNetworkEIP1559Compatibility =\n getCurrentNetworkEIP1559Compatibility;\n this.getGasFeeEstimates =\n getGasFeeEstimates || (() => Promise.resolve({} as GasFeeState));\n this.getPermittedAccounts = getPermittedAccounts;\n this.getSelectedAddress = getSelectedAddress;\n this.getExternalPendingTransactions =\n getExternalPendingTransactions ?? (() => []);\n this.securityProviderRequest = securityProviderRequest;\n this.cancelMultiplier = cancelMultiplier ?? CANCEL_RATE;\n this.speedUpMultiplier = speedUpMultiplier ?? SPEED_UP_RATE;\n this.incomingTransactionOptions = incomingTransactions;\n this.pendingTransactionOptions = pendingTransactions;\n\n this.afterSign = hooks?.afterSign ?? (() => true);\n this.beforeApproveOnInit = hooks?.beforeApproveOnInit ?? (() => true);\n this.beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ??\n /* istanbul ignore next */\n (() => true);\n this.beforePublish = hooks?.beforePublish ?? (() => true);\n this.getAdditionalSignArguments =\n hooks?.getAdditionalSignArguments ?? (() => []);\n\n this.nonceTracker = new NonceTracker({\n // @ts-expect-error provider types misaligned: SafeEventEmitterProvider vs Record<string,string>\n provider,\n blockTracker,\n getPendingTransactions: this.getNonceTrackerPendingTransactions.bind(\n this,\n undefined,\n ),\n getConfirmedTransactions: this.getNonceTrackerTransactions.bind(\n this,\n TransactionStatus.confirmed,\n ),\n });\n\n const etherscanRemoteTransactionSource =\n new EtherscanRemoteTransactionSource({\n includeTokenTransfers: incomingTransactions.includeTokenTransfers,\n });\n\n this.incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker,\n getCurrentAccount: getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getChainId: this.getChainId.bind(this),\n isEnabled: incomingTransactions.isEnabled,\n queryEntireHistory: incomingTransactions.queryEntireHistory,\n remoteTransactionSource: etherscanRemoteTransactionSource,\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: incomingTransactions.updateTransactions,\n });\n\n this.addIncomingTransactionHelperListeners();\n\n this.pendingTransactionTracker = new PendingTransactionTracker({\n approveTransaction: this.approveTransaction.bind(this),\n blockTracker,\n getChainId: this.getChainId.bind(this),\n getEthQuery: () => this.ethQuery,\n getTransactions: () => this.state.transactions,\n isResubmitEnabled: pendingTransactions.isResubmitEnabled,\n getGlobalLock: async () =>\n this.#acquireNonceLockForChainIdKey({\n chainId: this.getChainId(),\n }),\n publishTransaction: this.publishTransaction.bind(this),\n hooks: {\n beforeCheckPendingTransaction:\n this.beforeCheckPendingTransaction.bind(this),\n beforePublish: this.beforePublish.bind(this),\n },\n });\n\n this.addPendingTransactionTrackerListeners();\n\n // when transactionsController state changes\n // check for pending transactions and start polling if there are any\n this.subscribe(this.#checkForPendingTransactionAndStartPolling);\n\n // TODO once v2 is merged make sure this only runs when\n // selectedNetworkClientId changes\n onNetworkStateChange(() => {\n log('Detected network change', this.getChainId());\n this.pendingTransactionTracker.startIfPendingTransactions();\n this.onBootCleanup();\n });\n\n this.onBootCleanup();\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (_, patches) => {\n if (this.enableMultichain) {\n const networkClients = this.getNetworkClientRegistry();\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n }\n },\n );\n if (this.enableMultichain) {\n this.#initTrackingMap();\n }\n }\n\n setEnableMultichain(enableMultichain: boolean) {\n this.enableMultichain = enableMultichain;\n if (enableMultichain) {\n this.#initTrackingMap();\n }\n }\n\n /**\n * Stops polling and removes listeners to prepare the controller for garbage collection.\n */\n destroy() {\n this.#stopAllTracking();\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(fourBytePrefix: string): Promise<MethodData> {\n const releaseLock = await this.mutex.acquire();\n try {\n const { methodData } = this.state;\n const knownMethod = Object.keys(methodData).find(\n (knownFourBytePrefix) => fourBytePrefix === knownFourBytePrefix,\n );\n if (knownMethod) {\n return methodData[fourBytePrefix];\n }\n const registry = await this.registryLookup(fourBytePrefix);\n this.update({\n methodData: { ...methodData, ...{ [fourBytePrefix]: registry } },\n });\n return registry;\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Add a new unapproved transaction to state. Parameters will be validated, a\n * unique transaction id will be generated, and gas and gasPrice will be calculated\n * if not provided. If A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param opts - Additional options to control how the transaction is added.\n * @param opts.actionId - Unique ID to prevent duplicate requests.\n * @param opts.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.\n * @param opts.method - RPC method that requested the transaction.\n * @param opts.origin - The origin of the transaction request, such as a dApp hostname.\n * @param opts.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.\n * @param opts.securityAlertResponse - Response from security validator.\n * @param opts.sendFlowHistory - The sendFlowHistory entries to add.\n * @param opts.type - Type of transaction to add, such as 'cancel' or 'swap'.\n * @param opts.swaps - Options for swaps transactions.\n * @param opts.swaps.hasApproveTx - Whether the transaction has an approval transaction.\n * @param opts.swaps.meta - Metadata for swap transaction.\n * @param opts.networkClientId - The id of the network client for this transaction.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n {\n actionId,\n deviceConfirmedOn,\n method,\n origin,\n requireApproval,\n securityAlertResponse,\n sendFlowHistory,\n swaps = {},\n type,\n networkClientId,\n }: {\n actionId?: string;\n deviceConfirmedOn?: WalletDevice;\n method?: string;\n origin?: string;\n requireApproval?: boolean | undefined;\n securityAlertResponse?: SecurityAlertResponse;\n sendFlowHistory?: SendFlowHistoryEntry[];\n swaps?: {\n hasApproveTx?: boolean;\n meta?: Partial<TransactionMeta>;\n };\n type?: TransactionType;\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<Result> {\n log('Adding transaction', txParams);\n\n txParams = normalizeTxParams(txParams);\n if (networkClientId && !this.trackingMap.has(networkClientId)) {\n throw new Error(\n 'The networkClientId for this transaction could not be found',\n );\n }\n\n const isEIP1559Compatible = await this.getEIP1559Compatibility(\n networkClientId,\n );\n\n validateTxParams(txParams, isEIP1559Compatible);\n\n if (origin) {\n await validateTransactionOrigin(\n await this.getPermittedAccounts(origin),\n this.getSelectedAddress(),\n txParams.from,\n origin,\n );\n }\n\n const dappSuggestedGasFees = this.generateDappSuggestedGasFees(\n txParams,\n origin,\n );\n\n const chainId = this.getChainId(networkClientId);\n const ethQuery = this.#getEthQuery({ networkClientId, chainId });\n\n const transactionType =\n type ?? (await determineTransactionType(txParams, ethQuery)).type;\n\n const existingTransactionMeta = this.getTransactionWithActionId(actionId);\n\n // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.\n const transactionMeta: TransactionMeta = existingTransactionMeta || {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n id: random(),\n origin,\n securityAlertResponse,\n status: TransactionStatus.unapproved as TransactionStatus.unapproved,\n time: Date.now(),\n txParams,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n type: transactionType,\n networkClientId,\n };\n\n await this.updateGasProperties(transactionMeta);\n\n // Checks if a transaction already exists with a given actionId\n if (!existingTransactionMeta) {\n // Set security provider response\n if (method && this.securityProviderRequest) {\n const securityProviderResponse = await this.securityProviderRequest(\n transactionMeta,\n method,\n );\n transactionMeta.securityProviderResponse = securityProviderResponse;\n }\n\n if (!this.isSendFlowHistoryDisabled) {\n transactionMeta.sendFlowHistory = sendFlowHistory ?? [];\n }\n // Initial history push\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n\n await updateSwapsTransaction(transactionMeta, transactionType, swaps, {\n isSwapsDisabled: this.isSwapsDisabled,\n cancelTransaction: this.cancelTransaction.bind(this),\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n controllerHubEmitter: this.hub.emit.bind(this.hub) as any,\n });\n\n this.addMetadata(transactionMeta);\n this.hub.emit(`unapprovedTransaction`, transactionMeta);\n }\n\n return {\n result: this.processApproval(transactionMeta, {\n isExisting: Boolean(existingTransactionMeta),\n requireApproval,\n actionId,\n }),\n transactionMeta,\n };\n }\n\n startIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n this.incomingTransactionHelper.start();\n return;\n }\n networkClientIds.forEach((networkClientId) => {\n this.trackingMap.get(networkClientId)?.incomingTransactionHelper.start();\n });\n }\n\n stopIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n this.incomingTransactionHelper.stop();\n return;\n }\n networkClientIds.forEach((networkClientId) => {\n this.trackingMap.get(networkClientId)?.incomingTransactionHelper.stop();\n });\n }\n\n stopAllIncomingTransactionPolling() {\n this.incomingTransactionHelper.stop();\n if (this.enableMultichain) {\n for (const [, trackingMap] of this.trackingMap) {\n trackingMap.incomingTransactionHelper.stop();\n }\n }\n }\n\n async updateIncomingTransactions(networkClientIds: NetworkClientId[] = []) {\n if (networkClientIds.length === 0 || !this.enableMultichain) {\n await this.incomingTransactionHelper.update();\n return;\n }\n\n await Promise.allSettled(\n networkClientIds.map(async (networkClientId) => {\n return await this.trackingMap\n .get(networkClientId)\n ?.incomingTransactionHelper.update();\n }),\n );\n }\n\n /**\n * Attempts to cancel a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param gasValues - The gas values to use for the cancellation transaction.\n * @param options - The options for the cancellation transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests.\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async stopTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n estimatedBaseFee,\n actionId,\n }: { estimatedBaseFee?: string; actionId?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a cancel transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n // Not good practice to reassign a parameter but temporarily avoiding a larger refactor.\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log('Creating cancel transaction', transactionId, gasValues);\n\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n return;\n }\n\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n this.cancelMultiplier,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n this.cancelMultiplier,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n this.cancelMultiplier,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const newTxParams: TransactionParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: TransactionEnvelopeType.feeMarket,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n }\n : {\n from: transactionMeta.txParams.from,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n nonce: transactionMeta.txParams.nonce,\n to: transactionMeta.txParams.from,\n value: '0x0',\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n newTxParams,\n );\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n const rawTx = bufferToHex(signedTx.serialize());\n\n const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;\n\n const oldFee = newTxParams.maxFeePerGas\n ? transactionMeta.txParams.maxFeePerGas\n : transactionMeta.txParams.gasPrice;\n\n log('Submitting cancel transaction', {\n oldFee,\n newFee,\n txParams: newTxParams,\n });\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n const cancelTransactionMeta: TransactionMeta = {\n actionId,\n chainId: transactionMeta.chainId,\n networkClientId: transactionMeta.networkClientId,\n estimatedBaseFee,\n hash,\n id: random(),\n originalGasEstimate: transactionMeta.txParams.gas,\n status: TransactionStatus.submitted,\n time: Date.now(),\n type: TransactionType.cancel,\n txParams: newTxParams,\n };\n\n this.addMetadata(cancelTransactionMeta);\n\n // stopTransaction has no approval request, so we assume the user has already approved the transaction\n this.hub.emit('transaction-approved', {\n transactionMeta: cancelTransactionMeta,\n actionId,\n });\n this.hub.emit('transaction-submitted', {\n transactionMeta: cancelTransactionMeta,\n actionId,\n });\n\n this.hub.emit(\n `${cancelTransactionMeta.id}:finished`,\n cancelTransactionMeta,\n );\n }\n\n /**\n * Attempts to speed up a transaction increasing transaction gasPrice by ten percent.\n *\n * @param transactionId - The ID of the transaction to speed up.\n * @param gasValues - The gas values to use for the speed up transaction.\n * @param options - The options for the speed up transaction.\n * @param options.actionId - Unique ID to prevent duplicate requests\n * @param options.estimatedBaseFee - The estimated base fee of the transaction.\n */\n async speedUpTransaction(\n transactionId: string,\n gasValues?: GasPriceValue | FeeMarketEIP1559Values,\n {\n actionId,\n estimatedBaseFee,\n }: { actionId?: string; estimatedBaseFee?: string } = {},\n ) {\n // If transaction is found for same action id, do not create a new speed up transaction.\n if (this.getTransactionWithActionId(actionId)) {\n return;\n }\n\n if (gasValues) {\n // Not good practice to reassign a parameter but temporarily avoiding a larger refactor.\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log('Creating speed up transaction', transactionId, gasValues);\n\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n /* istanbul ignore next */\n if (!transactionMeta) {\n return;\n }\n\n /* istanbul ignore next */\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n // gasPrice (legacy non EIP1559)\n const minGasPrice = getIncreasedPriceFromExisting(\n transactionMeta.txParams.gasPrice,\n this.speedUpMultiplier,\n );\n\n const gasPriceFromValues = isGasPriceValue(gasValues) && gasValues.gasPrice;\n\n const newGasPrice =\n (gasPriceFromValues &&\n validateMinimumIncrease(gasPriceFromValues, minGasPrice)) ||\n minGasPrice;\n\n // maxFeePerGas (EIP1559)\n const existingMaxFeePerGas = transactionMeta.txParams?.maxFeePerGas;\n const minMaxFeePerGas = getIncreasedPriceFromExisting(\n existingMaxFeePerGas,\n this.speedUpMultiplier,\n );\n const maxFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxFeePerGas;\n const newMaxFeePerGas =\n (maxFeePerGasValues &&\n validateMinimumIncrease(maxFeePerGasValues, minMaxFeePerGas)) ||\n (existingMaxFeePerGas && minMaxFeePerGas);\n\n // maxPriorityFeePerGas (EIP1559)\n const existingMaxPriorityFeePerGas =\n transactionMeta.txParams?.maxPriorityFeePerGas;\n const minMaxPriorityFeePerGas = getIncreasedPriceFromExisting(\n existingMaxPriorityFeePerGas,\n this.speedUpMultiplier,\n );\n const maxPriorityFeePerGasValues =\n isFeeMarketEIP1559Values(gasValues) && gasValues.maxPriorityFeePerGas;\n const newMaxPriorityFeePerGas =\n (maxPriorityFeePerGasValues &&\n validateMinimumIncrease(\n maxPriorityFeePerGasValues,\n minMaxPriorityFeePerGas,\n )) ||\n (existingMaxPriorityFeePerGas && minMaxPriorityFeePerGas);\n\n const txParams: TransactionParams =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n type: TransactionEnvelopeType.feeMarket,\n }\n : {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n gasPrice: newGasPrice,\n };\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n txParams,\n );\n\n const signedTx = await this.sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n const rawTx = bufferToHex(signedTx.serialize());\n\n const newFee = txParams.maxFeePerGas ?? txParams.gasPrice;\n\n const oldFee = txParams.maxFeePerGas\n ? transactionMeta.txParams.maxFeePerGas\n : transactionMeta.txParams.gasPrice;\n\n log('Submitting speed up transaction', { oldFee, newFee, txParams });\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n const baseTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n estimatedBaseFee,\n id: random(),\n time: Date.now(),\n hash,\n actionId,\n originalGasEstimate: transactionMeta.txParams.gas,\n type: TransactionType.retry,\n originalType: transactionMeta.type,\n };\n\n const newTransactionMeta =\n newMaxFeePerGas && newMaxPriorityFeePerGas\n ? {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n maxFeePerGas: newMaxFeePerGas,\n maxPriorityFeePerGas: newMaxPriorityFeePerGas,\n },\n }\n : {\n ...baseTransactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n gasPrice: newGasPrice,\n },\n };\n\n this.addMetadata(newTransactionMeta);\n\n // speedUpTransaction has no approval request, so we assume the user has already approved the transaction\n this.hub.emit('transaction-approved', {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.hub.emit('transaction-submitted', {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.hub.emit(`${transactionMeta.id}:speedup`, newTransactionMeta);\n }\n\n /**\n * Estimates required gas for a given transaction.\n *\n * @param transaction - The transaction to estimate gas for.\n * @param networkClientId - The network client id to use for the estimate.\n * @returns The gas and gas price.\n */\n async estimateGas(\n transaction: TransactionParams,\n networkClientId?: NetworkClientId,\n ) {\n const ethQuery = this.#getEthQuery({ networkClientId });\n const { estimatedGas, simulationFails } = await estimateGas(\n transaction,\n ethQuery,\n );\n\n return { gas: estimatedGas, simulationFails };\n }\n\n /**\n * Estimates required gas for a given transaction and add additional gas buffer with the given multiplier.\n *\n * @param transaction - The transaction params to estimate gas for.\n * @param multiplier - The multiplier to use for the gas buffer.\n * @param networkClientId - The network client id to use for the estimate.\n */\n async estimateGasBuffered(\n transaction: TransactionParams,\n multiplier: number,\n networkClientId?: NetworkClientId,\n ) {\n const ethQuery = this.#getEthQuery({ networkClientId });\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(\n transaction,\n ethQuery,\n );\n\n const gas = addGasBuffer(estimatedGas, blockGasLimit, multiplier);\n\n return {\n gas,\n simulationFails,\n };\n }\n\n /**\n * Updates an existing transaction in state.\n *\n * @param transactionMeta - The new transaction to store in state.\n * @param note - A note or update reason to include in the transaction history.\n */\n updateTransaction(transactionMeta: TransactionMeta, note: string) {\n const { transactions } = this.state;\n transactionMeta.txParams = normalizeTxParams(transactionMeta.txParams);\n validateTxParams(transactionMeta.txParams);\n if (!this.isHistoryDisabled) {\n updateTransactionHistory(transactionMeta, note);\n }\n const index = transactions.findIndex(({ id }) => transactionMeta.id === id);\n transactions[index] = transactionMeta;\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Update the security alert response for a transaction.\n *\n * @param transactionId - ID of the transaction.\n * @param securityAlertResponse - The new security alert response for the transaction.\n */\n updateSecurityAlertResponse(\n transactionId: string,\n securityAlertResponse: SecurityAlertResponse,\n ) {\n if (!securityAlertResponse) {\n throw new Error(\n 'updateSecurityAlertResponse: securityAlertResponse should not be null',\n );\n }\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n throw new Error(\n `Cannot update security alert response as no transaction metadata found`,\n );\n }\n const updatedMeta = merge(transactionMeta, { securityAlertResponse });\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updatesecurityAlertResponse - securityAlertResponse updated',\n );\n }\n\n /**\n * Removes all transactions from state, optionally based on the current network.\n *\n * @param ignoreNetwork - Determines whether to wipe all transactions, or just those on the\n * current network. If `true`, all transactions are wiped.\n * @param address - If specified, only transactions originating from this address will be\n * wiped on current network.\n */\n wipeTransactions(ignoreNetwork?: boolean, address?: string) {\n /* istanbul ignore next */\n if (ignoreNetwork && !address) {\n this.update({ transactions: [] });\n return;\n }\n const currentChainId = this.getChainId();\n const newTransactions = this.state.transactions.filter(\n ({ chainId, txParams }) => {\n const isMatchingNetwork = ignoreNetwork || chainId === currentChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address || txParams.from?.toLowerCase() === address.toLowerCase();\n\n return !isMatchingAddress;\n },\n );\n\n this.update({\n transactions: this.trimTransactionsForState(newTransactions),\n });\n }\n\n /**\n * Adds external provided transaction to state as confirmed transaction.\n *\n * @param transactionMeta - TransactionMeta to add transactions.\n * @param transactionReceipt - TransactionReceipt of the external transaction.\n * @param baseFeePerGas - Base fee per gas of the external transaction.\n */\n async confirmExternalTransaction(\n transactionMeta: TransactionMeta,\n transactionReceipt: TransactionReceipt,\n baseFeePerGas: Hex,\n ) {\n // Run validation and add external transaction to state.\n this.addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = transactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n transactionMeta.status = TransactionStatus.confirmed;\n transactionMeta.txReceipt = transactionReceipt;\n if (baseFeePerGas) {\n transactionMeta.baseFeePerGas = baseFeePerGas;\n }\n\n // Update same nonce local transactions as dropped and define replacedBy properties.\n this.markNonceDuplicatesDropped(transactionId);\n\n // Update external provided transaction with updated gas values and confirmed status.\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:confirmExternalTransaction - Add external transaction',\n );\n this.onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updatePostBalance(transactionMeta);\n\n this.hub.emit('transaction-confirmed', {\n transactionMeta,\n });\n } catch (error) {\n console.error('Failed to confirm external transaction', error);\n }\n }\n\n /**\n * Append new send flow history to a transaction.\n *\n * @param transactionID - The ID of the transaction to update.\n * @param currentSendFlowHistoryLength - The length of the current sendFlowHistory array.\n * @param sendFlowHistoryToAdd - The sendFlowHistory entries to add.\n * @returns The updated transactionMeta.\n */\n updateTransactionSendFlowHistory(\n transactionID: string,\n currentSendFlowHistoryLength: number,\n sendFlowHistoryToAdd: SendFlowHistoryEntry[],\n ): TransactionMeta {\n if (this.isSendFlowHistoryDisabled) {\n throw new Error(\n 'Send flow history is disabled for the current transaction controller',\n );\n }\n\n const transactionMeta = this.getTransaction(transactionID);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update send flow history as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionSendFlowHistory',\n );\n\n if (\n currentSendFlowHistoryLength ===\n (transactionMeta?.sendFlowHistory?.length || 0)\n ) {\n transactionMeta.sendFlowHistory = [\n ...(transactionMeta?.sendFlowHistory ?? []),\n ...sendFlowHistoryToAdd,\n ];\n this.updateTransaction(\n transactionMeta,\n 'TransactionController:updateTransactionSendFlowHistory - sendFlowHistory updated',\n );\n }\n\n return this.getTransaction(transactionID) as TransactionMeta;\n }\n\n /**\n * Update the gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param gasValues - Gas values to update.\n * @param gasValues.gas - Same as transaction.gasLimit.\n * @param gasValues.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param gasValues.gasPrice - Price per gas for legacy transactions.\n * @param gasValues.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param gasValues.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param gasValues.estimateUsed - Which estimate level was used.\n * @param gasValues.estimateSuggested - Which estimate level that the API suggested.\n * @param gasValues.defaultGasEstimates - The default estimate for gas.\n * @param gasValues.originalGasEstimate - Original estimate for gas.\n * @param gasValues.userEditedGasLimit - The gas limit supplied by user.\n * @param gasValues.userFeeLevel - Estimate level user selected.\n * @returns The updated transactionMeta.\n */\n updateTransactionGasFees(\n transactionId: string,\n {\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n }: {\n defaultGasEstimates?: string;\n estimateUsed?: string;\n estimateSuggested?: string;\n gas?: string;\n gasLimit?: string;\n gasPrice?: string;\n maxPriorityFeePerGas?: string;\n maxFeePerGas?: string;\n originalGasEstimate?: string;\n userEditedGasLimit?: boolean;\n userFeeLevel?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(\n transactionMeta,\n 'updateTransactionGasFees',\n );\n\n let transactionGasFees = {\n txParams: {\n gas,\n gasLimit,\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n },\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n\n // only update what is defined\n transactionGasFees.txParams = pickBy(transactionGasFees.txParams);\n transactionGasFees = pickBy(transactionGasFees);\n\n // merge updated gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionGasFees);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updateTransactionGasFees - gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n /**\n * Update the previous gas values of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param previousGas - Previous gas values to update.\n * @param previousGas.gasLimit - Maxmimum number of units of gas to use for this transaction.\n * @param previousGas.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param previousGas.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @returns The updated transactionMeta.\n */\n updatePreviousGasParams(\n transactionId: string,\n {\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n }: {\n gasLimit?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n },\n ): TransactionMeta {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update transaction as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(transactionMeta, 'updatePreviousGasParams');\n\n const transactionPreviousGas = {\n previousGas: {\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n\n // only update what is defined\n transactionPreviousGas.previousGas = pickBy(\n transactionPreviousGas.previousGas,\n );\n\n // merge updated previous gas values with existing transaction meta\n const updatedMeta = merge(transactionMeta, transactionPreviousGas);\n\n this.updateTransaction(\n updatedMeta,\n 'TransactionController:updatePreviousGasParams - Previous gas values updated',\n );\n\n return this.getTransaction(transactionId) as TransactionMeta;\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async #acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId?: NetworkClientId,\n ): Promise<NonceLock> {\n let releaseLockForChainIdKey: (() => void) | undefined;\n let { nonceTracker } = this;\n if (networkClientId && this.enableMultichain) {\n const networkClient = this.getNetworkClientById(networkClientId);\n releaseLockForChainIdKey = await this.#acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n const trackers = this.trackingMap.get(networkClientId);\n if (!trackers) {\n throw new Error('missing nonceTracker for networkClientId');\n }\n nonceTracker = trackers?.nonceTracker;\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n return {\n ...nonceLock,\n releaseLock: () => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n },\n };\n } catch (err) {\n releaseLockForChainIdKey?.();\n throw err;\n }\n }\n\n /**\n * Updates the editable parameters of a transaction.\n *\n * @param txId - The ID of the transaction to update.\n * @param params - The editable parameters to update.\n * @param params.data - Data to pass with the transaction.\n * @param params.gas - Maximum number of units of gas to use for the transaction.\n * @param params.gasPrice - Price per gas for legacy transactions.\n * @param params.from - Address to send the transaction from.\n * @param params.to - Address to send the transaction to.\n * @param params.value - Value associated with the transaction.\n * @returns The updated transaction metadata.\n */\n async updateEditableParams(\n txId: string,\n {\n data,\n gas,\n gasPrice,\n from,\n to,\n value,\n }: {\n data?: string;\n gas?: string;\n gasPrice?: string;\n from?: string;\n to?: string;\n value?: string;\n },\n ) {\n const transactionMeta = this.getTransaction(txId);\n if (!transactionMeta) {\n throw new Error(\n `Cannot update editable params as no transaction metadata found`,\n );\n }\n\n validateIfTransactionUnapproved(transactionMeta, 'updateEditableParams');\n\n const editableParams = {\n txParams: {\n data,\n from,\n to,\n value,\n gas,\n gasPrice,\n },\n } as Partial<TransactionMeta>;\n\n editableParams.txParams = pickBy(\n editableParams.txParams,\n ) as TransactionParams;\n\n const updatedTransaction = merge(transactionMeta, editableParams);\n const { type } = await determineTransactionType(\n updatedTransaction.txParams,\n this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n }),\n );\n updatedTransaction.type = type;\n\n this.updateTransaction(\n updatedTransaction,\n `Update Editable Params for ${txId}`,\n );\n return this.getTransaction(txId);\n }\n\n /**\n * Signs and returns the raw transaction data for provided transaction params list.\n *\n * @param listOfTxParams - The list of transaction params to approve.\n * @returns The raw transactions.\n */\n async approveTransactionsWithSameNonce(\n listOfTxParams: (TransactionParams & { chainId: Hex })[] = [],\n ): Promise<string | string[]> {\n log('Approving transactions with same nonce', {\n transactions: listOfTxParams,\n });\n\n if (listOfTxParams.length === 0) {\n return '';\n }\n\n const initialTx = listOfTxParams[0];\n const common = this.getCommonConfiguration(initialTx.chainId);\n\n const initialTxAsEthTx = TransactionFactory.fromTxData(initialTx, {\n common,\n });\n const initialTxAsSerializedHex = bufferToHex(initialTxAsEthTx.serialize());\n\n if (this.inProcessOfSigning.has(initialTxAsSerializedHex)) {\n return '';\n }\n\n this.inProcessOfSigning.add(initialTxAsSerializedHex);\n\n let rawTransactions, nonceLock;\n try {\n // TODO: we should add a check to verify that all transactions have the same from address\n const fromAddress = initialTx.from;\n nonceLock = await this.getNonceLock(fromAddress);\n const nonce = nonceLock.nextNonce;\n\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n\n rawTransactions = await Promise.all(\n listOfTxParams.map((txParams) => {\n txParams.nonce = addHexPrefix(nonce.toString(16));\n return this.signExternalTransaction(txParams.chainId, txParams);\n }),\n );\n } catch (err) {\n log('Error while signing transactions with same nonce', err);\n // Must set transaction to submitted/failed before releasing lock\n // continue with error chain\n throw err;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n this.inProcessOfSigning.delete(initialTxAsSerializedHex);\n }\n return rawTransactions;\n }\n\n /**\n * Update a custodial transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param options - The custodial transaction options to update.\n * @param options.errorMessage - The error message to be assigned in case transaction status update to failed.\n * @param options.hash - The new hash value to be assigned.\n * @param options.status - The new status value to be assigned.\n */\n updateCustodialTransaction(\n transactionId: string,\n {\n errorMessage,\n hash,\n status,\n }: {\n errorMessage?: string;\n hash?: string;\n status?: TransactionStatus;\n },\n ) {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(\n `Cannot update custodial transaction as no transaction metadata found`,\n );\n }\n\n if (!transactionMeta.custodyId) {\n throw new Error('Transaction must be a custodian transaction');\n }\n\n if (\n status &&\n ![\n TransactionStatus.submitted,\n TransactionStatus.signed,\n TransactionStatus.failed,\n ].includes(status)\n ) {\n throw new Error(\n `Cannot update custodial transaction with status: ${status}`,\n );\n }\n\n const updatedTransactionMeta = merge(\n transactionMeta,\n pickBy({ hash, status }),\n );\n\n if (status === TransactionStatus.submitted) {\n updatedTransactionMeta.submittedTime = new Date().getTime();\n }\n\n if (status === TransactionStatus.failed) {\n updatedTransactionMeta.error = normalizeTxError(new Error(errorMessage));\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n `TransactionController:updateCustodialTransaction - Custodial transaction updated`,\n );\n\n if (\n [TransactionStatus.submitted, TransactionStatus.failed].includes(\n status as TransactionStatus,\n )\n ) {\n this.hub.emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);\n }\n }\n\n /**\n * Creates approvals for all unapproved transactions persisted.\n */\n initApprovals() {\n const chainId = this.getChainId();\n const unapprovedTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.status === TransactionStatus.unapproved &&\n transaction.chainId === chainId &&\n !transaction.isUserOperation,\n );\n\n for (const txMeta of unapprovedTxs) {\n this.processApproval(txMeta, {\n shouldShowRequest: false,\n }).catch((error) => {\n if (error?.code === errorCodes.provider.userRejectedRequest) {\n return;\n }\n console.error('Error during persisted transaction approval', error);\n });\n }\n }\n\n /**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.filterToCurrentNetwork - Whether to filter the results to the current network. Defaults to true.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @returns An array of transactions matching the provided options.\n */\n getTransactions({\n searchCriteria = {},\n initialList,\n filterToCurrentNetwork = true,\n limit,\n }: {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchCriteria?: any;\n initialList?: TransactionMeta[];\n filterToCurrentNetwork?: boolean;\n limit?: number;\n } = {}): TransactionMeta[] {\n const chainId = this.getChainId();\n // searchCriteria is an object that might have values that aren't predicate\n // methods. When providing any other value type (string, number, etc), we\n // consider this shorthand for \"check the value at key for strict equality\n // with the provided value\". To conform this object to be only methods, we\n // mapValues (lodash) such that every value on the object is a method that\n // returns a boolean.\n const predicateMethods = mapValues(searchCriteria, (predicate) => {\n return typeof predicate === 'function'\n ? predicate\n : // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: any) => v === predicate;\n });\n\n const transactionsToFilter = initialList ?? this.state.transactions;\n\n // Combine sortBy and pickBy to transform our state object into an array of\n // matching transactions that are sorted by time.\n const filteredTransactions = sortBy(\n pickBy(transactionsToFilter, (transaction) => {\n if (filterToCurrentNetwork && transaction.chainId !== chainId) {\n return false;\n }\n // iterate over the predicateMethods keys to check if the transaction\n // matches the searchCriteria\n for (const [key, predicate] of Object.entries(predicateMethods)) {\n // We return false early as soon as we know that one of the specified\n // search criteria do not match the transaction. This prevents\n // needlessly checking all criteria when we already know the criteria\n // are not fully satisfied. We check both txParams and the base\n // object as predicate keys can be either.\n if (key in transaction.txParams) {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (predicate((transaction.txParams as any)[key]) === false) {\n return false;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if (predicate((transaction as any)[key]) === false) {\n return false;\n }\n }\n\n return true;\n }),\n 'time',\n );\n if (limit !== undefined) {\n // We need to have all transactions of a given nonce in order to display\n // necessary details in the UI. We use the size of this set to determine\n // whether we have reached the limit provided, thus ensuring that all\n // transactions of nonces we include will be sent to the UI.\n const nonces = new Set();\n const txs = [];\n // By default, the transaction list we filter from is sorted by time ASC.\n // To ensure that filtered results prefers the newest transactions we\n // iterate from right to left, inserting transactions into front of a new\n // array. The original order is preserved, but we ensure that newest txs\n // are preferred.\n for (let i = filteredTransactions.length - 1; i > -1; i--) {\n const txMeta = filteredTransactions[i];\n const { nonce } = txMeta.txParams;\n if (!nonces.has(nonce)) {\n if (nonces.size < limit) {\n nonces.add(nonce);\n } else {\n continue;\n }\n }\n // Push transaction into the beginning of our array to ensure the\n // original order is preserved.\n txs.unshift(txMeta);\n }\n return txs;\n }\n return filteredTransactions;\n }\n\n private async signExternalTransaction(\n chainId: Hex,\n transactionParams: TransactionParams,\n ): Promise<string> {\n if (!this.sign) {\n throw new Error('No sign method defined.');\n }\n\n const normalizedTransactionParams = normalizeTxParams(transactionParams);\n const type = isEIP1559Transaction(normalizedTransactionParams)\n ? TransactionEnvelopeType.feeMarket\n : TransactionEnvelopeType.legacy;\n const updatedTransactionParams = {\n ...normalizedTransactionParams,\n type,\n gasLimit: normalizedTransactionParams.gas,\n chainId,\n };\n\n const { from } = updatedTransactionParams;\n const common = this.getCommonConfiguration(chainId);\n const unsignedTransaction = TransactionFactory.fromTxData(\n updatedTransactionParams,\n { common },\n );\n const signedTransaction = await this.sign(unsignedTransaction, from);\n\n const rawTransaction = bufferToHex(signedTransaction.serialize());\n return rawTransaction;\n }\n\n /**\n * Removes unapproved transactions from state.\n */\n clearUnapprovedTransactions() {\n const transactions = this.state.transactions.filter(\n ({ status }) => status !== TransactionStatus.unapproved,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n /**\n * Stop the signing process for a specific transaction.\n * Throws an error causing the transaction status to be set to failed.\n * @param transactionId - The ID of the transaction to stop signing.\n */\n abortTransactionSigning(transactionId: string) {\n const transactionMeta = this.getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(`Cannot abort signing as no transaction metadata found`);\n }\n\n const abortCallback = this.signAbortCallbacks.get(transactionId);\n\n if (!abortCallback) {\n throw new Error(\n `Cannot abort signing as transaction is not waiting for signing`,\n );\n }\n\n abortCallback();\n\n this.signAbortCallbacks.delete(transactionId);\n }\n\n private addMetadata(transactionMeta: TransactionMeta) {\n const { transactions } = this.state;\n transactions.push(transactionMeta);\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n }\n\n private async updateGasProperties(transactionMeta: TransactionMeta) {\n const isEIP1559Compatible =\n (await this.getEIP1559Compatibility(transactionMeta.networkClientId)) &&\n transactionMeta.txParams.type !== TransactionEnvelopeType.legacy;\n\n const { networkClientId, chainId } = transactionMeta;\n\n const isCustomNetwork = networkClientId\n ? this.getNetworkClientById(networkClientId).configuration.type ===\n NetworkClientType.Custom\n : this.getNetworkState().providerConfig.type === NetworkType.rpc;\n\n await updateGas({\n ethQuery: this.#getEthQuery({ networkClientId, chainId }),\n chainId,\n isCustomNetwork,\n txMeta: transactionMeta,\n });\n\n await updateGasFees({\n eip1559: isEIP1559Compatible,\n ethQuery: this.#getEthQuery({ networkClientId, chainId }),\n getSavedGasFees: this.getSavedGasFees.bind(this),\n getGasFeeEstimates: this.getGasFeeEstimates.bind(this),\n txMeta: transactionMeta,\n });\n }\n\n private onBootCleanup() {\n this.submitApprovedTransactions();\n }\n\n /**\n * Force submit approved transactions for all chains.\n */\n private submitApprovedTransactions() {\n const approvedTransactions = this.state.transactions.filter(\n (transaction) => transaction.status === TransactionStatus.approved,\n );\n\n for (const transactionMeta of approvedTransactions) {\n if (this.beforeApproveOnInit(transactionMeta)) {\n this.approveTransaction(transactionMeta.id).catch((error) => {\n /* istanbul ignore next */\n console.error('Error while submitting persisted transaction', error);\n });\n }\n }\n }\n\n private async processApproval(\n transactionMeta: TransactionMeta,\n {\n isExisting = false,\n requireApproval,\n shouldShowRequest = true,\n actionId,\n }: {\n isExisting?: boolean;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n actionId?: string;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.isTransactionCompleted(transactionId);\n const finishedPromise = isCompleted\n ? Promise.resolve(meta)\n : this.waitForTransactionFinished(transactionId);\n\n if (meta && !isExisting && !isCompleted) {\n try {\n if (requireApproval !== false) {\n const acceptResult = await this.requestApproval(transactionMeta, {\n shouldShowRequest,\n });\n\n resultCallbacks = acceptResult.resultCallbacks;\n\n if (resultCallbacks) {\n this.hub.once(`${transactionId}:publish-skip`, () => {\n resultCallbacks?.success();\n\n // Remove the reference to prevent additional reports once submitted.\n resultCallbacks = undefined;\n });\n }\n\n const approvalValue = acceptResult.value as\n | {\n txMeta?: TransactionMeta;\n }\n | undefined;\n\n const updatedTransaction = approvalValue?.txMeta;\n\n if (updatedTransaction) {\n log('Updating transaction with approval data', {\n customNonce: updatedTransaction.customNonceValue,\n params: updatedTransaction.txParams,\n });\n\n this.updateTransaction(\n updatedTransaction,\n 'TransactionController#processApproval - Updated with approval data',\n );\n }\n }\n\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n await this.approveTransaction(transactionId);\n const updatedTransactionMeta = this.getTransaction(\n transactionId,\n ) as TransactionMeta;\n this.hub.emit('transaction-approved', {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const { isCompleted: isTxCompleted } =\n this.isTransactionCompleted(transactionId);\n if (!isTxCompleted) {\n if (error?.code === errorCodes.provider.userRejectedRequest) {\n this.cancelTransaction(transactionId, actionId);\n\n throw providerErrors.userRejectedRequest(\n 'MetaMask Tx Signature: User denied transaction signature.',\n );\n } else {\n this.failTransaction(meta, error, actionId);\n }\n }\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed:\n resultCallbacks?.error(finalMeta.error);\n throw rpcErrors.internal(finalMeta.error.message);\n\n case TransactionStatus.submitted:\n resultCallbacks?.success();\n return finalMeta.hash as string;\n\n default:\n const internalError = rpcErrors.internal(\n `MetaMask Tx Signature: Unknown problem: ${JSON.stringify(\n finalMeta || transactionId,\n )}`,\n );\n\n resultCallbacks?.error(internalError);\n throw internalError;\n }\n }\n\n /**\n * Approves a transaction and updates it's status in state. If this is not a\n * retry transaction, a nonce will be generated. The transaction is signed\n * using the sign configuration property, then published to the blockchain.\n * A `<tx.id>:finished` hub event is fired after success or failure.\n *\n * @param transactionId - The ID of the transaction to approve.\n */\n private async approveTransaction(transactionId: string) {\n const { transactions } = this.state;\n const releaseLock = await this.mutex.acquire();\n const index = transactions.findIndex(({ id }) => transactionId === id);\n const transactionMeta = transactions[index];\n const {\n txParams: { from },\n networkClientId,\n } = transactionMeta;\n\n let releaseNonceLock: (() => void) | undefined;\n\n try {\n if (!this.sign) {\n releaseLock();\n this.failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return;\n } else if (!transactionMeta.chainId) {\n releaseLock();\n this.failTransaction(transactionMeta, new Error('No chainId defined.'));\n return;\n }\n\n if (this.inProcessOfSigning.has(transactionId)) {\n log('Skipping approval as signing in progress', transactionId);\n return;\n }\n\n const [nonce, releaseNonce] = await getNextNonce(\n transactionMeta,\n (address: string) => this.getNonceLock(address, networkClientId),\n );\n\n releaseNonceLock = releaseNonce;\n\n transactionMeta.status = TransactionStatus.approved;\n transactionMeta.txParams.nonce = nonce;\n transactionMeta.txParams.chainId = transactionMeta.chainId;\n\n const baseTxParams = {\n ...transactionMeta.txParams,\n gasLimit: transactionMeta.txParams.gas,\n };\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction approved',\n );\n\n this.onTransactionStatusChange(transactionMeta);\n\n const isEIP1559 = isEIP1559Transaction(transactionMeta.txParams);\n\n const txParams: TransactionParams = isEIP1559\n ? {\n ...baseTxParams,\n estimatedBaseFee: transactionMeta.txParams.estimatedBaseFee,\n type: TransactionEnvelopeType.feeMarket,\n }\n : baseTxParams;\n\n const rawTx = await this.signTransaction(transactionMeta, txParams);\n\n if (!this.beforePublish(transactionMeta)) {\n log('Skipping publishing transaction based on hook');\n this.hub.emit(`${transactionMeta.id}:publish-skip`, transactionMeta);\n return;\n }\n\n if (!rawTx) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n\n if (transactionMeta.type === TransactionType.swap) {\n log('Determining pre-transaction balance');\n\n const preTxBalance = await query(ethQuery, 'getBalance', [from]);\n\n transactionMeta.preTxBalance = preTxBalance;\n\n log('Updated pre-transaction balance', transactionMeta.preTxBalance);\n }\n\n log('Publishing transaction', txParams);\n\n const hash = await this.publishTransaction(ethQuery, rawTx);\n\n log('Publish successful', hash);\n\n transactionMeta.hash = hash;\n transactionMeta.status = TransactionStatus.submitted;\n transactionMeta.submittedTime = new Date().getTime();\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction submitted',\n );\n\n this.hub.emit('transaction-submitted', {\n transactionMeta,\n });\n\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n\n this.onTransactionStatusChange(transactionMeta);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n this.failTransaction(transactionMeta, error);\n } finally {\n this.inProcessOfSigning.delete(transactionId);\n // must set transaction to submitted/failed before releasing lock\n releaseNonceLock?.();\n releaseLock();\n }\n }\n\n private async publishTransaction(\n ethQuery: EthQuery,\n rawTransaction: string,\n ): Promise<string> {\n return await query(ethQuery, 'sendRawTransaction', [rawTransaction]);\n }\n\n /**\n * Cancels a transaction based on its ID by setting its status to \"rejected\"\n * and emitting a `<tx.id>:finished` hub event.\n *\n * @param transactionId - The ID of the transaction to cancel.\n * @param actionId - The actionId passed from UI\n */\n private cancelTransaction(transactionId: string, actionId?: string) {\n const transactionMeta = this.state.transactions.find(\n ({ id }) => id === transactionId,\n );\n if (!transactionMeta) {\n return;\n }\n transactionMeta.status = TransactionStatus.rejected;\n const transactions = this.state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n this.update({ transactions: this.trimTransactionsForState(transactions) });\n this.hub.emit(`${transactionMeta.id}:finished`, transactionMeta);\n this.hub.emit('transaction-rejected', {\n transactionMeta,\n actionId,\n });\n this.onTransactionStatusChange(transactionMeta);\n }\n\n /**\n * Trim the amount of transactions that are set on the state. Checks\n * if the length of the tx history is longer then desired persistence\n * limit and then if it is removes the oldest confirmed or rejected tx.\n * Pending or unapproved transactions will not be removed by this\n * operation. For safety of presenting a fully functional transaction UI\n * representation, this function will not break apart transactions with the\n * same nonce, created on the same day, per network. Not accounting for transactions of the same\n * nonce, same day and network combo can result in confusing or broken experiences\n * in the UI. The transactions are then updated using the BaseControllerV1 update.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n private trimTransactionsForState(\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const nonceNetworkSet = new Set();\n\n const txsToKeep = transactions\n .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order\n .filter((tx) => {\n const { chainId, status, txParams, time } = tx;\n\n if (txParams) {\n const key = `${txParams.nonce}-${convertHexToDecimal(\n chainId,\n )}-${new Date(time).toDateString()}`;\n\n if (nonceNetworkSet.has(key)) {\n return true;\n } else if (\n nonceNetworkSet.size < this.config.txHistoryLimit ||\n !this.isFinalState(status)\n ) {\n nonceNetworkSet.add(key);\n return true;\n }\n }\n\n return false;\n });\n\n txsToKeep.reverse(); // Ascending time order\n return txsToKeep;\n }\n\n /**\n * Determines if the transaction is in a final state.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed\n );\n }\n\n /**\n * Whether the transaction has at least completed all local processing.\n *\n * @param status - The transaction status.\n * @returns Whether the transaction is in a final state.\n */\n private isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n private async requestApproval(\n txMeta: TransactionMeta,\n { shouldShowRequest }: { shouldShowRequest: boolean },\n ): Promise<AddResult> {\n const id = this.getApprovalId(txMeta);\n const { origin } = txMeta;\n const type = ApprovalType.Transaction;\n const requestData = { txId: txMeta.id };\n\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin || ORIGIN_METAMASK,\n type,\n requestData,\n expectsResult: true,\n },\n shouldShowRequest,\n )) as Promise<AddResult>;\n }\n\n private getTransaction(transactionId: string): TransactionMeta | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n private getApprovalId(txMeta: TransactionMeta) {\n return String(txMeta.id);\n }\n\n private isTransactionCompleted(transactionId: string): {\n meta?: TransactionMeta;\n isCompleted: boolean;\n } {\n const transaction = this.getTransaction(transactionId);\n\n if (!transaction) {\n return { meta: undefined, isCompleted: false };\n }\n\n const isCompleted = this.isLocalFinalState(transaction.status);\n\n return { meta: transaction, isCompleted };\n }\n\n private getChainId(networkClientId?: NetworkClientId): Hex {\n if (networkClientId) {\n return this.getNetworkClientById(networkClientId).configuration.chainId;\n }\n const { providerConfig } = this.getNetworkState();\n return providerConfig.chainId;\n }\n\n private prepareUnsignedEthTx(\n chainId: Hex,\n txParams: TransactionParams,\n ): TypedTransaction {\n return TransactionFactory.fromTxData(txParams, {\n freeze: false,\n common: this.getCommonConfiguration(chainId),\n });\n }\n\n /**\n * `@ethereumjs/tx` uses `@ethereumjs/common` as a configuration tool for\n * specifying which chain, network, hardfork and EIPs to support for\n * a transaction. By referencing this configuration, and analyzing the fields\n * specified in txParams, @ethereumjs/tx is able to determine which EIP-2718\n * transaction type to use.\n *\n * @param chainId - The chainId to use for the configuration.\n * @returns common configuration object\n */\n private getCommonConfiguration(chainId: Hex): Common {\n const customChainParams: Partial<ChainConfig> = {\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams);\n }\n\n private onIncomingTransactions({\n added,\n updated,\n }: {\n added: TransactionMeta[];\n updated: TransactionMeta[];\n }) {\n const { transactions: currentTransactions } = this.state;\n\n const updatedTransactions = [\n ...added,\n ...currentTransactions.map((originalTransaction) => {\n const updatedTransaction = updated.find(\n ({ hash }) => hash === originalTransaction.hash,\n );\n\n return updatedTransaction ?? originalTransaction;\n }),\n ];\n\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n private onUpdatedLastFetchedBlockNumbers({\n lastFetchedBlockNumbers,\n blockNumber,\n }: {\n lastFetchedBlockNumbers: {\n [key: string]: number;\n };\n blockNumber: number;\n }) {\n this.update({ lastFetchedBlockNumbers });\n this.hub.emit('incomingTransactionBlock', blockNumber);\n }\n\n private generateDappSuggestedGasFees(\n txParams: TransactionParams,\n origin?: string,\n ): DappSuggestedGasFees | undefined {\n if (!origin || origin === ORIGIN_METAMASK) {\n return undefined;\n }\n\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;\n\n if (\n gasPrice === undefined &&\n maxFeePerGas === undefined &&\n maxPriorityFeePerGas === undefined &&\n gas === undefined\n ) {\n return undefined;\n }\n\n const dappSuggestedGasFees: DappSuggestedGasFees = {};\n\n if (gasPrice !== undefined) {\n dappSuggestedGasFees.gasPrice = gasPrice;\n } else if (\n maxFeePerGas !== undefined ||\n maxPriorityFeePerGas !== undefined\n ) {\n dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;\n dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;\n }\n\n if (gas !== undefined) {\n dappSuggestedGasFees.gas = gas;\n }\n\n return dappSuggestedGasFees;\n }\n\n /**\n * Validates and adds external provided transaction to state.\n *\n * @param transactionMeta - Nominated external transaction to be added to state.\n */\n private addExternalTransaction(transactionMeta: TransactionMeta) {\n const { chainId } = transactionMeta;\n const { transactions } = this.state;\n const fromAddress = transactionMeta?.txParams?.from;\n const sameFromAndNetworkTransactions = transactions.filter(\n (transaction) =>\n transaction.txParams.from === fromAddress &&\n transaction.chainId === chainId,\n );\n const confirmedTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.confirmed,\n );\n const pendingTxs = sameFromAndNetworkTransactions.filter(\n (transaction) => transaction.status === TransactionStatus.submitted,\n );\n\n validateConfirmedExternalTransaction(\n transactionMeta,\n confirmedTxs,\n pendingTxs,\n );\n\n // Make sure provided external transaction has non empty history array\n if (!(transactionMeta.history ?? []).length) {\n if (!this.isHistoryDisabled) {\n addInitialHistorySnapshot(transactionMeta);\n }\n }\n\n const updatedTransactions = [...transactions, transactionMeta];\n this.update({\n transactions: this.trimTransactionsForState(updatedTransactions),\n });\n }\n\n /**\n * Sets other txMeta statuses to dropped if the txMeta that has been confirmed has other transactions\n * in the transactions have the same nonce.\n *\n * @param transactionId - Used to identify original transaction.\n */\n private markNonceDuplicatesDropped(transactionId: string) {\n const transactionMeta = this.getTransaction(transactionId);\n if (!transactionMeta) {\n return;\n }\n const nonce = transactionMeta.txParams?.nonce;\n const from = transactionMeta.txParams?.from;\n const { chainId } = transactionMeta;\n\n const sameNonceTxs = this.state.transactions.filter(\n (transaction) =>\n transaction.id !== transactionId &&\n transaction.txParams.from === from &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId &&\n transaction.type !== TransactionType.incoming,\n );\n\n if (!sameNonceTxs.length) {\n return;\n }\n\n // Mark all same nonce transactions as dropped and give it a replacedBy hash\n for (const transaction of sameNonceTxs) {\n transaction.replacedBy = transactionMeta.hash;\n transaction.replacedById = transactionMeta.id;\n // Drop any transaction that wasn't previously failed (off chain failure)\n if (transaction.status !== TransactionStatus.failed) {\n this.setTransactionStatusDropped(transaction);\n }\n }\n }\n\n /**\n * Method to set transaction status to dropped.\n *\n * @param transactionMeta - TransactionMeta of transaction to be marked as dropped.\n */\n private setTransactionStatusDropped(transactionMeta: TransactionMeta) {\n transactionMeta.status = TransactionStatus.dropped;\n this.hub.emit('transaction-dropped', {\n transactionMeta,\n });\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n this.onTransactionStatusChange(transactionMeta);\n }\n\n /**\n * Get transaction with provided actionId.\n *\n * @param actionId - Unique ID to prevent duplicate requests\n * @returns the filtered transaction\n */\n private getTransactionWithActionId(actionId?: string) {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n private async waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.hub.once(`${transactionId}:finished`, (txMeta) => {\n resolve(txMeta);\n });\n });\n }\n\n /**\n * Updates the r, s, and v properties of a TransactionMeta object\n * with values from a signed transaction.\n *\n * @param transactionMeta - The TransactionMeta object to update.\n * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.\n */\n private async updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): Promise<void> {\n for (const key of ['r', 's', 'v'] as const) {\n const value = signedTx[key];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n transactionMeta[key] = addHexPrefix(value.toString(16));\n }\n }\n\n private async getEIP1559Compatibility(networkClientId?: NetworkClientId) {\n const currentNetworkIsEIP1559Compatible =\n await this.getCurrentNetworkEIP1559Compatibility(networkClientId);\n\n const currentAccountIsEIP1559Compatible =\n await this.getCurrentAccountEIP1559Compatibility();\n\n return (\n currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible\n );\n }\n\n private removeIncomingTransactionHelperListeners(\n incomingTransactionHelper = this.incomingTransactionHelper,\n ) {\n incomingTransactionHelper.hub.removeAllListeners('transactions');\n incomingTransactionHelper.hub.removeAllListeners(\n 'updatedLastFetchedBlockNumbers',\n );\n }\n\n private addIncomingTransactionHelperListeners(\n incomingTransactionHelper = this.incomingTransactionHelper,\n ) {\n incomingTransactionHelper.hub.on(\n 'transactions',\n this.onIncomingTransactions.bind(this),\n );\n incomingTransactionHelper.hub.on(\n 'updatedLastFetchedBlockNumbers',\n this.onUpdatedLastFetchedBlockNumbers.bind(this),\n );\n }\n\n private removePendingTransactionTrackerListeners(\n pendingTransactionTracker = this.pendingTransactionTracker,\n ) {\n pendingTransactionTracker.hub.removeAllListeners('transaction-confirmed');\n pendingTransactionTracker.hub.removeAllListeners('transaction-dropped');\n pendingTransactionTracker.hub.removeAllListeners('transaction-failed');\n pendingTransactionTracker.hub.removeAllListeners('transaction-updated');\n }\n\n private addPendingTransactionTrackerListeners(\n pendingTransactionTracker = this.pendingTransactionTracker,\n ) {\n pendingTransactionTracker.hub.on(\n 'transaction-confirmed',\n this.onConfirmedTransaction.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-dropped',\n this.setTransactionStatusDropped.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-failed',\n this.failTransaction.bind(this),\n );\n\n pendingTransactionTracker.hub.on(\n 'transaction-updated',\n this.updateTransaction.bind(this),\n );\n }\n\n private async signTransaction(\n transactionMeta: TransactionMeta,\n txParams: TransactionParams,\n ): Promise<string | undefined> {\n log('Signing transaction', txParams);\n\n const unsignedEthTx = this.prepareUnsignedEthTx(\n transactionMeta.chainId,\n txParams,\n );\n\n this.inProcessOfSigning.add(transactionMeta.id);\n\n const signedTx = await new Promise<TypedTransaction>((resolve, reject) => {\n this.sign?.(\n unsignedEthTx,\n txParams.from,\n ...this.getAdditionalSignArguments(transactionMeta),\n ).then(resolve, reject);\n\n this.signAbortCallbacks.set(transactionMeta.id, () =>\n reject(new Error('Signing aborted by user')),\n );\n });\n\n this.signAbortCallbacks.delete(transactionMeta.id);\n\n if (!signedTx) {\n log('Skipping signed status as no signed transaction');\n return undefined;\n }\n\n if (!this.afterSign(transactionMeta, signedTx)) {\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#signTransaction - Update after sign',\n );\n\n log('Skipping signed status based on hook');\n\n return undefined;\n }\n\n await this.updateTransactionMetaRSV(transactionMeta, signedTx);\n\n transactionMeta.status = TransactionStatus.signed;\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n this.onTransactionStatusChange(transactionMeta);\n\n const rawTx = bufferToHex(signedTx.serialize());\n\n transactionMeta.rawTx = rawTx;\n\n this.updateTransaction(\n transactionMeta,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n\n return rawTx;\n }\n\n private onTransactionStatusChange(transactionMeta: TransactionMeta) {\n this.hub.emit('transaction-status-update', { transactionMeta });\n }\n\n private getNonceTrackerPendingTransactions(\n chainId: string | undefined,\n address: string,\n ) {\n const standardPendingTransactions = this.getNonceTrackerTransactions(\n TransactionStatus.submitted,\n address,\n chainId,\n );\n\n const externalPendingTransactions = this.getExternalPendingTransactions(\n address,\n chainId,\n );\n\n return [...standardPendingTransactions, ...externalPendingTransactions];\n }\n\n private getNonceTrackerTransactions(\n status: TransactionStatus,\n address: string,\n chainId: string = this.getChainId(),\n ) {\n return getAndFormatTransactionsForNonceTracker(\n chainId,\n address,\n status,\n this.state.transactions,\n );\n }\n\n private onConfirmedTransaction(transactionMeta: TransactionMeta) {\n log('Processing confirmed transaction', transactionMeta.id);\n\n this.markNonceDuplicatesDropped(transactionMeta.id);\n\n this.hub.emit('transaction-confirmed', { transactionMeta });\n this.hub.emit(`${transactionMeta.id}:confirmed`, transactionMeta);\n\n this.onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.updatePostBalance(transactionMeta);\n }\n\n private async updatePostBalance(transactionMeta: TransactionMeta) {\n try {\n if (transactionMeta.type !== TransactionType.swap) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({\n networkClientId: transactionMeta.networkClientId,\n chainId: transactionMeta.chainId,\n });\n const { updatedTransactionMeta, approvalTransactionMeta } =\n await updatePostTransactionBalance(transactionMeta, {\n ethQuery,\n getTransaction: this.getTransaction.bind(this),\n updateTransaction: this.updateTransaction.bind(this),\n });\n\n this.hub.emit('post-transaction-balance-updated', {\n transactionMeta: updatedTransactionMeta,\n approvalTransactionMeta,\n });\n } catch (error) {\n /* istanbul ignore next */\n log('Error while updating post transaction balance', error);\n }\n }\n\n #getEthQuery({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n }): EthQuery {\n // if multichain is disabled, use the global ethQuery\n if (!this.enableMultichain) {\n return this.ethQuery;\n }\n let networkClient: NetworkClient | undefined;\n\n if (networkClientId) {\n try {\n networkClient = this.getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by networkClientId');\n }\n }\n\n if (!networkClient && chainId) {\n try {\n networkClientId = this.findNetworkClientIdByChainId(chainId);\n networkClient = this.getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by chainId');\n }\n }\n\n if (networkClient) {\n return new EthQuery(networkClient.provider);\n }\n\n // NOTE(JL): we're not ready to drop globally selected ethQuery yet.\n // Some calls to getEthQuery only have access to optional networkClientId\n // throw new Error('failed to get eth query instance');\n return this.ethQuery;\n }\n\n #refreshEtherscanRemoteTransactionSources = (\n networkClients: NetworkClientRegistry,\n ) => {\n // this will be prettier when we have consolidated network clients with a single chainId:\n // check if there are still other network clients using the same chainId\n // if not remove the etherscanRemoteTransaction source from the map\n const chainIdsInRegistry = new Set();\n Object.values(networkClients).forEach((networkClient) =>\n chainIdsInRegistry.add(networkClient.configuration.chainId),\n );\n const existingChainIds = Array.from(\n this.etherscanRemoteTransactionSourcesMap.keys(),\n );\n const chainIdsToRemove = existingChainIds.filter(\n (chainId) => !chainIdsInRegistry.has(chainId),\n );\n\n chainIdsToRemove.forEach((chainId) => {\n this.etherscanRemoteTransactionSourcesMap.delete(chainId);\n });\n };\n\n #refreshTrackingMap = (\n networkClients: ReturnType<NetworkController['getNetworkClientRegistry']>,\n ) => {\n this.#refreshEtherscanRemoteTransactionSources(networkClients);\n\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n };\n\n #initTrackingMap = () => {\n const networkClients = this.getNetworkClientRegistry();\n const networkClientIds = Object.keys(networkClients);\n networkClientIds.map((id) => this.#startTrackingByNetworkClientId(id));\n this.hub.emit('tracking-map-init', networkClientIds);\n };\n\n #checkForPendingTransactionAndStartPolling = () => {\n // PendingTransactionTracker reads state through its getTransactions hook\n this.pendingTransactionTracker.startIfPendingTransactions();\n if (this.enableMultichain) {\n for (const [, trackingMap] of this.trackingMap) {\n trackingMap.pendingTransactionTracker.startIfPendingTransactions();\n }\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n trackers.incomingTransactionHelper.stop();\n this.removeIncomingTransactionHelperListeners(\n trackers.incomingTransactionHelper,\n );\n this.trackingMap.delete(networkClientId);\n this.hub.emit('tracking-map-remove', networkClientId);\n }\n }\n\n #stopAllTracking() {\n this.pendingTransactionTracker.stop();\n this.removePendingTransactionTrackerListeners();\n this.incomingTransactionHelper.stop();\n this.removeIncomingTransactionHelperListeners();\n\n if (this.enableMultichain) {\n for (const [networkClientId] of this.trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n const networkClient = this.getNetworkClientById(networkClientId);\n const { chainId } = networkClient.configuration;\n\n let etherscanRemoteTransactionSource =\n this.etherscanRemoteTransactionSourcesMap.get(chainId);\n if (!etherscanRemoteTransactionSource) {\n etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({\n includeTokenTransfers:\n this.incomingTransactionOptions.includeTokenTransfers,\n });\n this.etherscanRemoteTransactionSourcesMap.set(\n chainId,\n etherscanRemoteTransactionSource,\n );\n }\n\n const ethQuery = new EthQuery(networkClient.provider);\n\n const nonceTracker = new NonceTracker({\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provider: networkClient.provider as any,\n blockTracker: networkClient.blockTracker,\n getPendingTransactions: this.getNonceTrackerPendingTransactions.bind(\n this,\n chainId,\n ),\n getConfirmedTransactions: this.getNonceTrackerTransactions.bind(\n this,\n TransactionStatus.confirmed,\n ),\n });\n\n const incomingTransactionHelper = new IncomingTransactionHelper({\n blockTracker: networkClient.blockTracker,\n getCurrentAccount: this.getSelectedAddress,\n getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,\n getChainId: () => chainId,\n isEnabled: this.incomingTransactionOptions.isEnabled,\n queryEntireHistory: this.incomingTransactionOptions.queryEntireHistory,\n remoteTransactionSource: etherscanRemoteTransactionSource,\n transactionLimit: this.config.txHistoryLimit,\n updateTransactions: this.incomingTransactionOptions.updateTransactions,\n });\n\n this.addIncomingTransactionHelperListeners(incomingTransactionHelper);\n\n const pendingTransactionTracker = new PendingTransactionTracker({\n approveTransaction: this.approveTransaction.bind(this),\n blockTracker: networkClient.blockTracker,\n getChainId: () => chainId,\n getEthQuery: () => ethQuery,\n getTransactions: () => this.state.transactions,\n isResubmitEnabled: this.pendingTransactionOptions.isResubmitEnabled,\n getGlobalLock: this.#acquireNonceLockForChainIdKey.bind(this, {\n chainId,\n }),\n publishTransaction: this.publishTransaction.bind(this),\n hooks: {\n beforeCheckPendingTransaction:\n this.beforeCheckPendingTransaction.bind(this),\n beforePublish: this.beforePublish.bind(this),\n },\n });\n\n this.addPendingTransactionTrackerListeners(pendingTransactionTracker);\n\n this.trackingMap.set(networkClientId, {\n nonceTracker,\n incomingTransactionHelper,\n pendingTransactionTracker,\n });\n\n this.hub.emit('tracking-map-add', networkClientId);\n }\n}\n"]}
@@ -30,7 +30,7 @@ export declare class PendingTransactionTracker {
30
30
  beforePublish?: (transactionMeta: TransactionMeta) => boolean;
31
31
  };
32
32
  });
33
- onStateChange: () => void;
33
+ startIfPendingTransactions: () => void;
34
34
  stop(): void;
35
35
  }
36
36
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"PendingTransactionTracker.d.ts","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAGlC,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AA6BpE,aAAK,MAAM,GAAG;IACZ,uBAAuB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;CAChE,CAAC;AAKF,MAAM,WAAW,qCAAsC,SAAQ,YAAY;IACzE,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EACvB,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI,CAAC;IAER,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACzE;AAED,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,qCAAqC,CAAC;gBA8B/B,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,KAAK,GACN,EAAE;QACD,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,YAAY,EAAE,YAAY,CAAC;QAC3B,UAAU,EAAE,MAAM,MAAM,CAAC;QACzB,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,KAAK,QAAQ,CAAC;QAC7D,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;QACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACzC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,KAAK,CAAC,EAAE;YACN,6BAA6B,CAAC,EAAE,CAC9B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC;YACb,aAAa,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC;SAC/D,CAAC;KACH;IAmBD,aAAa,aAQX;IAaF,IAAI;CAoXL"}
1
+ {"version":3,"file":"PendingTransactionTracker.d.ts","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAGlC,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AA6BpE,aAAK,MAAM,GAAG;IACZ,uBAAuB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;CAChE,CAAC;AAKF,MAAM,WAAW,qCAAsC,SAAQ,YAAY;IACzE,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EACvB,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI,CAAC;IAER,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACzE;AAED,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,qCAAqC,CAAC;gBA8B/B,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,KAAK,GACN,EAAE;QACD,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,YAAY,EAAE,YAAY,CAAC;QAC3B,UAAU,EAAE,MAAM,MAAM,CAAC;QACzB,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,KAAK,QAAQ,CAAC;QAC7D,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;QACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACzC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,KAAK,CAAC,EAAE;YACN,6BAA6B,CAAC,EAAE,CAC9B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC;YACb,aAAa,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC;SAC/D,CAAC;KACH;IAmBD,0BAA0B,aAQxB;IAaF,IAAI;CAoXL"}
@@ -66,7 +66,7 @@ class PendingTransactionTracker {
66
66
  _PendingTransactionTracker_running.set(this, void 0);
67
67
  _PendingTransactionTracker_beforeCheckPendingTransaction.set(this, void 0);
68
68
  _PendingTransactionTracker_beforePublish.set(this, void 0);
69
- this.onStateChange = () => {
69
+ this.startIfPendingTransactions = () => {
70
70
  const pendingTransactions = __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_getPendingTransactions).call(this);
71
71
  if (pendingTransactions.length) {
72
72
  __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_start).call(this);
@@ -1 +1 @@
1
- {"version":3,"file":"PendingTransactionTracker.js","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionMeta, TransactionReceipt } from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\n/**\n * We wait this many blocks before emitting a 'transaction-dropped' event\n * This is because we could be talking to a node that is out of sync\n */\nconst DROPPED_BLOCK_COUNT = 3;\n\nconst RECEIPT_STATUS_SUCCESS = '0x1';\nconst RECEIPT_STATUS_FAILURE = '0x0';\nconst MAX_RETRY_BLOCK_DISTANCE = 50;\n\nconst KNOWN_TRANSACTION_ERRORS = [\n 'replacement transaction underpriced',\n 'known transaction',\n 'gas price too low to replace',\n 'transaction with the same hash was already imported',\n 'gateway timeout',\n 'nonce too low',\n];\n\nconst log = createModuleLogger(projectLogger, 'pending-transactions');\n\ntype SuccessfulTransactionReceipt = TransactionReceipt & {\n blockNumber: string;\n blockHash: string;\n};\n\ntype Events = {\n 'transaction-confirmed': [txMeta: TransactionMeta];\n 'transaction-dropped': [txMeta: TransactionMeta];\n 'transaction-failed': [txMeta: TransactionMeta, error: Error];\n 'transaction-updated': [txMeta: TransactionMeta, note: string];\n};\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface PendingTransactionTrackerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\nexport class PendingTransactionTracker {\n hub: PendingTransactionTrackerEventEmitter;\n\n #approveTransaction: (transactionId: string) => Promise<void>;\n\n #blockTracker: BlockTracker;\n\n #droppedBlockCountByHash: Map<string, number>;\n\n #getChainId: () => string;\n\n #getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n\n #getTransactions: () => TransactionMeta[];\n\n #isResubmitEnabled: boolean;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #listener: any;\n\n #getGlobalLock: () => Promise<() => void>;\n\n #publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n\n #running: boolean;\n\n #beforeCheckPendingTransaction: (transactionMeta: TransactionMeta) => boolean;\n\n #beforePublish: (transactionMeta: TransactionMeta) => boolean;\n\n constructor({\n approveTransaction,\n blockTracker,\n getChainId,\n getEthQuery,\n getTransactions,\n isResubmitEnabled,\n getGlobalLock,\n publishTransaction,\n hooks,\n }: {\n approveTransaction: (transactionId: string) => Promise<void>;\n blockTracker: BlockTracker;\n getChainId: () => string;\n getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n getTransactions: () => TransactionMeta[];\n isResubmitEnabled?: boolean;\n getGlobalLock: () => Promise<() => void>;\n publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n hooks?: {\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n beforePublish?: (transactionMeta: TransactionMeta) => boolean;\n };\n }) {\n this.hub = new EventEmitter() as PendingTransactionTrackerEventEmitter;\n\n this.#approveTransaction = approveTransaction;\n this.#blockTracker = blockTracker;\n this.#droppedBlockCountByHash = new Map();\n this.#getChainId = getChainId;\n this.#getEthQuery = getEthQuery;\n this.#getTransactions = getTransactions;\n this.#isResubmitEnabled = isResubmitEnabled ?? true;\n this.#listener = this.#onLatestBlock.bind(this);\n this.#getGlobalLock = getGlobalLock;\n this.#publishTransaction = publishTransaction;\n this.#running = false;\n this.#beforePublish = hooks?.beforePublish ?? (() => true);\n this.#beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ?? (() => true);\n }\n\n onStateChange = () => {\n const pendingTransactions = this.#getPendingTransactions();\n\n if (pendingTransactions.length) {\n this.#start();\n } else {\n this.stop();\n }\n };\n\n #start() {\n if (this.#running) {\n return;\n }\n\n this.#blockTracker.on('latest', this.#listener);\n this.#running = true;\n\n log('Started polling');\n }\n\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#listener);\n this.#running = false;\n\n log('Stopped polling');\n }\n\n async #onLatestBlock(latestBlockNumber: string) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransactions();\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check transactions', error);\n } finally {\n releaseLock();\n }\n\n try {\n await this.#resubmitTransactions(latestBlockNumber);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to resubmit transactions', error);\n }\n }\n\n async #checkTransactions() {\n log('Checking transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to check');\n return;\n }\n\n log('Found pending transactions to check', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n await Promise.all(\n pendingTransactions.map((tx) => this.#checkTransaction(tx)),\n );\n }\n\n async #resubmitTransactions(latestBlockNumber: string) {\n if (!this.#isResubmitEnabled || !this.#running) {\n return;\n }\n\n log('Resubmitting transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to resubmit');\n return;\n }\n\n log('Found pending transactions to resubmit', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n for (const txMeta of pendingTransactions) {\n try {\n await this.#resubmitTransaction(txMeta, latestBlockNumber);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n /* istanbul ignore next */\n const errorMessage =\n error.value?.message?.toLowerCase() || error.message.toLowerCase();\n\n if (this.#isKnownTransactionError(errorMessage)) {\n log('Ignoring known transaction error', errorMessage);\n return;\n }\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was an error when resubmitting this transaction.',\n );\n }\n }\n }\n\n #isKnownTransactionError(errorMessage: string) {\n return KNOWN_TRANSACTION_ERRORS.some((knownError) =>\n errorMessage.includes(knownError),\n );\n }\n\n async #resubmitTransaction(\n txMeta: TransactionMeta,\n latestBlockNumber: string,\n ) {\n if (!this.#isResubmitDue(txMeta, latestBlockNumber)) {\n return;\n }\n\n log('Resubmitting transaction', txMeta.id);\n\n const { rawTx } = txMeta;\n\n if (!this.#beforePublish(txMeta)) {\n return;\n }\n\n if (!rawTx?.length) {\n log('Approving transaction as no raw value');\n await this.#approveTransaction(txMeta.id);\n return;\n }\n\n const ethQuery = this.#getEthQuery(txMeta.networkClientId);\n await this.#publishTransaction(ethQuery, rawTx);\n\n txMeta.retryCount = (txMeta.retryCount ?? 0) + 1;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:transaction-retry - Retry count increased',\n );\n }\n\n #isResubmitDue(txMeta: TransactionMeta, latestBlockNumber: string): boolean {\n if (!txMeta.firstRetryBlockNumber) {\n txMeta.firstRetryBlockNumber = latestBlockNumber;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#isResubmitDue - First retry block number set',\n );\n }\n\n const firstRetryBlockNumber =\n txMeta.firstRetryBlockNumber || latestBlockNumber;\n\n const blocksSinceFirstRetry =\n Number.parseInt(latestBlockNumber, 16) -\n Number.parseInt(firstRetryBlockNumber, 16);\n\n const retryCount = txMeta.retryCount || 0;\n\n // Exponential backoff to limit retries at publishing\n // Capped at ~15 minutes between retries\n const requiredBlocksSinceFirstRetry = Math.min(\n MAX_RETRY_BLOCK_DISTANCE,\n Math.pow(2, retryCount),\n );\n\n return blocksSinceFirstRetry >= requiredBlocksSinceFirstRetry;\n }\n\n async #checkTransaction(txMeta: TransactionMeta) {\n const { hash, id } = txMeta;\n\n if (!hash && this.#beforeCheckPendingTransaction(txMeta)) {\n const error = new Error(\n 'We had an error while submitting this transaction, please try again.',\n );\n\n error.name = 'NoTxHashError';\n\n this.#failTransaction(txMeta, error);\n\n return;\n }\n\n if (this.#isNonceTaken(txMeta)) {\n log('Nonce already taken', id);\n this.#dropTransaction(txMeta);\n return;\n }\n\n try {\n const receipt = await this.#getTransactionReceipt(hash);\n const isSuccess = receipt?.status === RECEIPT_STATUS_SUCCESS;\n const isFailure = receipt?.status === RECEIPT_STATUS_FAILURE;\n\n if (isFailure) {\n log('Transaction receipt has failed status');\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction dropped or replaced'),\n );\n\n return;\n }\n\n const { blockNumber, blockHash } = receipt || {};\n\n if (isSuccess && blockNumber && blockHash) {\n await this.#onTransactionConfirmed(txMeta, {\n ...receipt,\n blockNumber,\n blockHash,\n });\n\n return;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Failed to check transaction', id, error);\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was a problem loading this transaction.',\n );\n\n return;\n }\n\n if (await this.#isTransactionDropped(txMeta)) {\n this.#dropTransaction(txMeta);\n }\n }\n\n async #onTransactionConfirmed(\n txMeta: TransactionMeta,\n receipt: SuccessfulTransactionReceipt,\n ) {\n const { id } = txMeta;\n const { blockHash } = receipt;\n\n log('Transaction confirmed', id);\n\n const { baseFeePerGas, timestamp: blockTimestamp } =\n await this.#getBlockByHash(blockHash, false);\n\n txMeta.baseFeePerGas = baseFeePerGas;\n txMeta.blockTimestamp = blockTimestamp;\n txMeta.status = TransactionStatus.confirmed;\n txMeta.txParams.gasUsed = receipt.gasUsed;\n txMeta.txReceipt = receipt;\n txMeta.verifiedOnBlockchain = true;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#onTransactionConfirmed - Transaction confirmed',\n );\n\n this.hub.emit('transaction-confirmed', txMeta);\n }\n\n async #isTransactionDropped(txMeta: TransactionMeta) {\n const {\n hash,\n id,\n txParams: { nonce, from },\n } = txMeta;\n\n /* istanbul ignore next */\n if (!nonce || !hash) {\n return false;\n }\n\n const networkNextNonceHex = await this.#getNetworkTransactionCount(from);\n const networkNextNonceNumber = parseInt(networkNextNonceHex, 16);\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber >= networkNextNonceNumber) {\n return false;\n }\n\n let droppedBlockCount = this.#droppedBlockCountByHash.get(hash);\n\n if (droppedBlockCount === undefined) {\n droppedBlockCount = 0;\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount);\n }\n\n if (droppedBlockCount < DROPPED_BLOCK_COUNT) {\n log('Incrementing dropped block count', { id, droppedBlockCount });\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount + 1);\n return false;\n }\n\n log('Hit dropped block count', id);\n\n this.#droppedBlockCountByHash.delete(hash);\n return true;\n }\n\n #isNonceTaken(txMeta: TransactionMeta): boolean {\n const { id, txParams } = txMeta;\n\n return this.#getCurrentChainTransactions().some(\n (tx) =>\n tx.id !== id &&\n tx.txParams.from === txParams.from &&\n tx.status === TransactionStatus.confirmed &&\n tx.txParams.nonce === txParams.nonce &&\n tx.type !== TransactionType.incoming,\n );\n }\n\n #getPendingTransactions(): TransactionMeta[] {\n return this.#getCurrentChainTransactions().filter(\n (tx) =>\n tx.status === TransactionStatus.submitted &&\n !tx.verifiedOnBlockchain &&\n !tx.isUserOperation,\n );\n }\n\n #warnTransaction(txMeta: TransactionMeta, error: string, message: string) {\n txMeta.warning = {\n error,\n message,\n };\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#warnTransaction - Warning added',\n );\n }\n\n #failTransaction(txMeta: TransactionMeta, error: Error) {\n log('Transaction failed', txMeta.id, error);\n this.hub.emit('transaction-failed', txMeta, error);\n }\n\n #dropTransaction(txMeta: TransactionMeta) {\n log('Transaction dropped', txMeta.id);\n this.hub.emit('transaction-dropped', txMeta);\n }\n\n #updateTransaction(txMeta: TransactionMeta, note: string) {\n this.hub.emit('transaction-updated', txMeta, note);\n }\n\n async #getTransactionReceipt(\n txHash?: string,\n ): Promise<TransactionReceipt | undefined> {\n return await query(this.#getEthQuery(), 'getTransactionReceipt', [txHash]);\n }\n\n async #getBlockByHash(\n blockHash: string,\n includeTransactionDetails: boolean,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return await query(this.#getEthQuery(), 'getBlockByHash', [\n blockHash,\n includeTransactionDetails,\n ]);\n }\n\n async #getNetworkTransactionCount(address: string): Promise<string> {\n return await query(this.#getEthQuery(), 'getTransactionCount', [address]);\n }\n\n #getCurrentChainTransactions(): TransactionMeta[] {\n const currentChainId = this.#getChainId();\n\n return this.#getTransactions().filter(\n (tx) => tx.chainId === currentChainId,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"PendingTransactionTracker.js","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionMeta, TransactionReceipt } from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\n/**\n * We wait this many blocks before emitting a 'transaction-dropped' event\n * This is because we could be talking to a node that is out of sync\n */\nconst DROPPED_BLOCK_COUNT = 3;\n\nconst RECEIPT_STATUS_SUCCESS = '0x1';\nconst RECEIPT_STATUS_FAILURE = '0x0';\nconst MAX_RETRY_BLOCK_DISTANCE = 50;\n\nconst KNOWN_TRANSACTION_ERRORS = [\n 'replacement transaction underpriced',\n 'known transaction',\n 'gas price too low to replace',\n 'transaction with the same hash was already imported',\n 'gateway timeout',\n 'nonce too low',\n];\n\nconst log = createModuleLogger(projectLogger, 'pending-transactions');\n\ntype SuccessfulTransactionReceipt = TransactionReceipt & {\n blockNumber: string;\n blockHash: string;\n};\n\ntype Events = {\n 'transaction-confirmed': [txMeta: TransactionMeta];\n 'transaction-dropped': [txMeta: TransactionMeta];\n 'transaction-failed': [txMeta: TransactionMeta, error: Error];\n 'transaction-updated': [txMeta: TransactionMeta, note: string];\n};\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface PendingTransactionTrackerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\nexport class PendingTransactionTracker {\n hub: PendingTransactionTrackerEventEmitter;\n\n #approveTransaction: (transactionId: string) => Promise<void>;\n\n #blockTracker: BlockTracker;\n\n #droppedBlockCountByHash: Map<string, number>;\n\n #getChainId: () => string;\n\n #getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n\n #getTransactions: () => TransactionMeta[];\n\n #isResubmitEnabled: boolean;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #listener: any;\n\n #getGlobalLock: () => Promise<() => void>;\n\n #publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n\n #running: boolean;\n\n #beforeCheckPendingTransaction: (transactionMeta: TransactionMeta) => boolean;\n\n #beforePublish: (transactionMeta: TransactionMeta) => boolean;\n\n constructor({\n approveTransaction,\n blockTracker,\n getChainId,\n getEthQuery,\n getTransactions,\n isResubmitEnabled,\n getGlobalLock,\n publishTransaction,\n hooks,\n }: {\n approveTransaction: (transactionId: string) => Promise<void>;\n blockTracker: BlockTracker;\n getChainId: () => string;\n getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n getTransactions: () => TransactionMeta[];\n isResubmitEnabled?: boolean;\n getGlobalLock: () => Promise<() => void>;\n publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n hooks?: {\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n beforePublish?: (transactionMeta: TransactionMeta) => boolean;\n };\n }) {\n this.hub = new EventEmitter() as PendingTransactionTrackerEventEmitter;\n\n this.#approveTransaction = approveTransaction;\n this.#blockTracker = blockTracker;\n this.#droppedBlockCountByHash = new Map();\n this.#getChainId = getChainId;\n this.#getEthQuery = getEthQuery;\n this.#getTransactions = getTransactions;\n this.#isResubmitEnabled = isResubmitEnabled ?? true;\n this.#listener = this.#onLatestBlock.bind(this);\n this.#getGlobalLock = getGlobalLock;\n this.#publishTransaction = publishTransaction;\n this.#running = false;\n this.#beforePublish = hooks?.beforePublish ?? (() => true);\n this.#beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ?? (() => true);\n }\n\n startIfPendingTransactions = () => {\n const pendingTransactions = this.#getPendingTransactions();\n\n if (pendingTransactions.length) {\n this.#start();\n } else {\n this.stop();\n }\n };\n\n #start() {\n if (this.#running) {\n return;\n }\n\n this.#blockTracker.on('latest', this.#listener);\n this.#running = true;\n\n log('Started polling');\n }\n\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#listener);\n this.#running = false;\n\n log('Stopped polling');\n }\n\n async #onLatestBlock(latestBlockNumber: string) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransactions();\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check transactions', error);\n } finally {\n releaseLock();\n }\n\n try {\n await this.#resubmitTransactions(latestBlockNumber);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to resubmit transactions', error);\n }\n }\n\n async #checkTransactions() {\n log('Checking transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to check');\n return;\n }\n\n log('Found pending transactions to check', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n await Promise.all(\n pendingTransactions.map((tx) => this.#checkTransaction(tx)),\n );\n }\n\n async #resubmitTransactions(latestBlockNumber: string) {\n if (!this.#isResubmitEnabled || !this.#running) {\n return;\n }\n\n log('Resubmitting transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to resubmit');\n return;\n }\n\n log('Found pending transactions to resubmit', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n for (const txMeta of pendingTransactions) {\n try {\n await this.#resubmitTransaction(txMeta, latestBlockNumber);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n /* istanbul ignore next */\n const errorMessage =\n error.value?.message?.toLowerCase() || error.message.toLowerCase();\n\n if (this.#isKnownTransactionError(errorMessage)) {\n log('Ignoring known transaction error', errorMessage);\n return;\n }\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was an error when resubmitting this transaction.',\n );\n }\n }\n }\n\n #isKnownTransactionError(errorMessage: string) {\n return KNOWN_TRANSACTION_ERRORS.some((knownError) =>\n errorMessage.includes(knownError),\n );\n }\n\n async #resubmitTransaction(\n txMeta: TransactionMeta,\n latestBlockNumber: string,\n ) {\n if (!this.#isResubmitDue(txMeta, latestBlockNumber)) {\n return;\n }\n\n log('Resubmitting transaction', txMeta.id);\n\n const { rawTx } = txMeta;\n\n if (!this.#beforePublish(txMeta)) {\n return;\n }\n\n if (!rawTx?.length) {\n log('Approving transaction as no raw value');\n await this.#approveTransaction(txMeta.id);\n return;\n }\n\n const ethQuery = this.#getEthQuery(txMeta.networkClientId);\n await this.#publishTransaction(ethQuery, rawTx);\n\n txMeta.retryCount = (txMeta.retryCount ?? 0) + 1;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:transaction-retry - Retry count increased',\n );\n }\n\n #isResubmitDue(txMeta: TransactionMeta, latestBlockNumber: string): boolean {\n if (!txMeta.firstRetryBlockNumber) {\n txMeta.firstRetryBlockNumber = latestBlockNumber;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#isResubmitDue - First retry block number set',\n );\n }\n\n const firstRetryBlockNumber =\n txMeta.firstRetryBlockNumber || latestBlockNumber;\n\n const blocksSinceFirstRetry =\n Number.parseInt(latestBlockNumber, 16) -\n Number.parseInt(firstRetryBlockNumber, 16);\n\n const retryCount = txMeta.retryCount || 0;\n\n // Exponential backoff to limit retries at publishing\n // Capped at ~15 minutes between retries\n const requiredBlocksSinceFirstRetry = Math.min(\n MAX_RETRY_BLOCK_DISTANCE,\n Math.pow(2, retryCount),\n );\n\n return blocksSinceFirstRetry >= requiredBlocksSinceFirstRetry;\n }\n\n async #checkTransaction(txMeta: TransactionMeta) {\n const { hash, id } = txMeta;\n\n if (!hash && this.#beforeCheckPendingTransaction(txMeta)) {\n const error = new Error(\n 'We had an error while submitting this transaction, please try again.',\n );\n\n error.name = 'NoTxHashError';\n\n this.#failTransaction(txMeta, error);\n\n return;\n }\n\n if (this.#isNonceTaken(txMeta)) {\n log('Nonce already taken', id);\n this.#dropTransaction(txMeta);\n return;\n }\n\n try {\n const receipt = await this.#getTransactionReceipt(hash);\n const isSuccess = receipt?.status === RECEIPT_STATUS_SUCCESS;\n const isFailure = receipt?.status === RECEIPT_STATUS_FAILURE;\n\n if (isFailure) {\n log('Transaction receipt has failed status');\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction dropped or replaced'),\n );\n\n return;\n }\n\n const { blockNumber, blockHash } = receipt || {};\n\n if (isSuccess && blockNumber && blockHash) {\n await this.#onTransactionConfirmed(txMeta, {\n ...receipt,\n blockNumber,\n blockHash,\n });\n\n return;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Failed to check transaction', id, error);\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was a problem loading this transaction.',\n );\n\n return;\n }\n\n if (await this.#isTransactionDropped(txMeta)) {\n this.#dropTransaction(txMeta);\n }\n }\n\n async #onTransactionConfirmed(\n txMeta: TransactionMeta,\n receipt: SuccessfulTransactionReceipt,\n ) {\n const { id } = txMeta;\n const { blockHash } = receipt;\n\n log('Transaction confirmed', id);\n\n const { baseFeePerGas, timestamp: blockTimestamp } =\n await this.#getBlockByHash(blockHash, false);\n\n txMeta.baseFeePerGas = baseFeePerGas;\n txMeta.blockTimestamp = blockTimestamp;\n txMeta.status = TransactionStatus.confirmed;\n txMeta.txParams.gasUsed = receipt.gasUsed;\n txMeta.txReceipt = receipt;\n txMeta.verifiedOnBlockchain = true;\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#onTransactionConfirmed - Transaction confirmed',\n );\n\n this.hub.emit('transaction-confirmed', txMeta);\n }\n\n async #isTransactionDropped(txMeta: TransactionMeta) {\n const {\n hash,\n id,\n txParams: { nonce, from },\n } = txMeta;\n\n /* istanbul ignore next */\n if (!nonce || !hash) {\n return false;\n }\n\n const networkNextNonceHex = await this.#getNetworkTransactionCount(from);\n const networkNextNonceNumber = parseInt(networkNextNonceHex, 16);\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber >= networkNextNonceNumber) {\n return false;\n }\n\n let droppedBlockCount = this.#droppedBlockCountByHash.get(hash);\n\n if (droppedBlockCount === undefined) {\n droppedBlockCount = 0;\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount);\n }\n\n if (droppedBlockCount < DROPPED_BLOCK_COUNT) {\n log('Incrementing dropped block count', { id, droppedBlockCount });\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount + 1);\n return false;\n }\n\n log('Hit dropped block count', id);\n\n this.#droppedBlockCountByHash.delete(hash);\n return true;\n }\n\n #isNonceTaken(txMeta: TransactionMeta): boolean {\n const { id, txParams } = txMeta;\n\n return this.#getCurrentChainTransactions().some(\n (tx) =>\n tx.id !== id &&\n tx.txParams.from === txParams.from &&\n tx.status === TransactionStatus.confirmed &&\n tx.txParams.nonce === txParams.nonce &&\n tx.type !== TransactionType.incoming,\n );\n }\n\n #getPendingTransactions(): TransactionMeta[] {\n return this.#getCurrentChainTransactions().filter(\n (tx) =>\n tx.status === TransactionStatus.submitted &&\n !tx.verifiedOnBlockchain &&\n !tx.isUserOperation,\n );\n }\n\n #warnTransaction(txMeta: TransactionMeta, error: string, message: string) {\n txMeta.warning = {\n error,\n message,\n };\n\n this.#updateTransaction(\n txMeta,\n 'PendingTransactionTracker:#warnTransaction - Warning added',\n );\n }\n\n #failTransaction(txMeta: TransactionMeta, error: Error) {\n log('Transaction failed', txMeta.id, error);\n this.hub.emit('transaction-failed', txMeta, error);\n }\n\n #dropTransaction(txMeta: TransactionMeta) {\n log('Transaction dropped', txMeta.id);\n this.hub.emit('transaction-dropped', txMeta);\n }\n\n #updateTransaction(txMeta: TransactionMeta, note: string) {\n this.hub.emit('transaction-updated', txMeta, note);\n }\n\n async #getTransactionReceipt(\n txHash?: string,\n ): Promise<TransactionReceipt | undefined> {\n return await query(this.#getEthQuery(), 'getTransactionReceipt', [txHash]);\n }\n\n async #getBlockByHash(\n blockHash: string,\n includeTransactionDetails: boolean,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return await query(this.#getEthQuery(), 'getBlockByHash', [\n blockHash,\n includeTransactionDetails,\n ]);\n }\n\n async #getNetworkTransactionCount(address: string): Promise<string> {\n return await query(this.#getEthQuery(), 'getTransactionCount', [address]);\n }\n\n #getCurrentChainTransactions(): TransactionMeta[] {\n const currentChainId = this.#getChainId();\n\n return this.#getTransactions().filter(\n (tx) => tx.chainId === currentChainId,\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/transaction-controller",
3
- "version": "21.0.1-preview.56c80981",
3
+ "version": "21.1.0-preview.cbe2fbb7",
4
4
  "description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
5
5
  "keywords": [
6
6
  "MetaMask",