@metamask-previews/transaction-controller 62.7.0-preview-42084fe4 → 62.7.0-preview-7bc2d97e
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 +6 -0
- package/dist/TransactionController.cjs +23 -72
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +12 -13
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +12 -13
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +23 -72
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +37 -25
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +38 -26
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/index.cjs +1 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +0 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -4
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -4
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +4 -1
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +5 -0
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +5 -0
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +4 -1
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/utils/history.cjs +0 -164
- package/dist/utils/history.cjs.map +0 -1
- package/dist/utils/history.d.cts +0 -29
- package/dist/utils/history.d.cts.map +0 -1
- package/dist/utils/history.d.mts +0 -29
- package/dist/utils/history.d.mts.map +0 -1
- package/dist/utils/history.mjs +0 -164
- package/dist/utils/history.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionController.cjs","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TypedTransaction } from '@ethereumjs/tx';\nimport type {\n AccountsController,\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerGetStateAction,\n} from '@metamask/accounts-controller';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n query,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport type { TraceCallback, TraceContext } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { KeyringControllerSignEip7702AuthorizationAction } from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n BlockTracker,\n NetworkClientId,\n NetworkController,\n NetworkControllerStateChangeEvent,\n NetworkState,\n Provider,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerGetNetworkClientByIdAction,\n} from '@metamask/network-controller';\nimport { NetworkClientType } from '@metamask/network-controller';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from '@metamask/nonce-tracker';\nimport { NonceTracker } from '@metamask/nonce-tracker';\nimport type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';\nimport {\n errorCodes,\n rpcErrors,\n providerErrors,\n JsonRpcError,\n} from '@metamask/rpc-errors';\nimport type { Hex, Json } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport { EventEmitter } from 'events';\nimport { cloneDeep, mapValues, merge, noop, pickBy, sortBy } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { DefaultGasFeeFlow } from './gas-flows/DefaultGasFeeFlow';\nimport { LineaGasFeeFlow } from './gas-flows/LineaGasFeeFlow';\nimport { OptimismLayer1GasFeeFlow } from './gas-flows/OptimismLayer1GasFeeFlow';\nimport { RandomisedEstimationsGasFeeFlow } from './gas-flows/RandomisedEstimationsGasFeeFlow';\nimport { ScrollLayer1GasFeeFlow } from './gas-flows/ScrollLayer1GasFeeFlow';\nimport { TestGasFeeFlow } from './gas-flows/TestGasFeeFlow';\nimport { AccountsApiRemoteTransactionSource } from './helpers/AccountsApiRemoteTransactionSource';\nimport {\n GasFeePoller,\n updateTransactionGasProperties,\n updateTransactionGasEstimates,\n} from './helpers/GasFeePoller';\nimport type { IncomingTransactionOptions } from './helpers/IncomingTransactionHelper';\nimport { IncomingTransactionHelper } from './helpers/IncomingTransactionHelper';\nimport { MethodDataHelper } from './helpers/MethodDataHelper';\nimport { MultichainTrackingHelper } from './helpers/MultichainTrackingHelper';\nimport { PendingTransactionTracker } from './helpers/PendingTransactionTracker';\nimport type { ResimulateResponse } from './helpers/ResimulateHelper';\nimport {\n ResimulateHelper,\n hasSimulationDataChanged,\n shouldResimulate,\n} from './helpers/ResimulateHelper';\nimport { ExtraTransactionsPublishHook } from './hooks/ExtraTransactionsPublishHook';\nimport { projectLogger as log } from './logger';\nimport type {\n DappSuggestedGasFees,\n Layer1GasFeeFlow,\n SavedGasFees,\n SecurityProviderRequest,\n SendFlowHistoryEntry,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n SecurityAlertResponse,\n GasFeeFlow,\n SimulationData,\n GasFeeEstimates,\n GasFeeFlowResponse,\n GasPriceValue,\n FeeMarketEIP1559Values,\n SubmitHistoryEntry,\n TransactionBatchRequest,\n TransactionBatchResult,\n BatchTransactionParams,\n UpdateCustodialTransactionRequest,\n PublishHook,\n PublishBatchHook,\n GasFeeToken,\n IsAtomicBatchSupportedResult,\n IsAtomicBatchSupportedRequest,\n AfterAddHook,\n GasFeeEstimateLevel as GasFeeEstimateLevelType,\n TransactionBatchMeta,\n AfterSimulateHook,\n BeforeSignHook,\n TransactionContainerType,\n GetSimulationConfig,\n AddTransactionOptions,\n PublishHookResult,\n GetGasFeeTokensRequest,\n InternalAccount,\n} from './types';\nimport {\n GasFeeEstimateLevel,\n TransactionEnvelopeType,\n TransactionType,\n TransactionStatus,\n SimulationErrorCode,\n} from './types';\nimport { getBalanceChanges } from './utils/balance-changes';\nimport { addTransactionBatch, isAtomicBatchSupported } from './utils/batch';\nimport {\n generateEIP7702BatchTransaction,\n getDelegationAddress,\n signAuthorizationList,\n} from './utils/eip7702';\nimport { validateConfirmedExternalTransaction } from './utils/external-transactions';\nimport { updateFirstTimeInteraction } from './utils/first-time-interaction';\nimport {\n addGasBuffer,\n estimateGas,\n estimateGasBatch,\n updateGas,\n} from './utils/gas';\nimport {\n checkGasFeeTokenBeforePublish,\n getGasFeeTokens,\n} from './utils/gas-fee-tokens';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getGasFeeFlow } from './utils/gas-flow';\nimport {\n addInitialHistorySnapshot,\n updateTransactionHistory,\n} from './utils/history';\nimport {\n getTransactionLayer1GasFee,\n updateTransactionLayer1GasFee,\n} from './utils/layer1-gas-fee-flow';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getNextNonce,\n} from './utils/nonce';\nimport { prepareTransaction, serializeTransaction } from './utils/prepare';\nimport { getTransactionParamsWithIncreasedGasFee } from './utils/retry';\nimport {\n updatePostTransactionBalance,\n updateSwapsTransaction,\n} from './utils/swaps';\nimport { determineTransactionType } from './utils/transaction-type';\nimport {\n normalizeTransactionParams,\n isEIP1559Transaction,\n validateGasValues,\n validateIfTransactionUnapproved,\n normalizeTxError,\n normalizeGasFeeValues,\n setEnvelopeType,\n} from './utils/utils';\nimport {\n ErrorCode,\n validateTransactionOrigin,\n validateTxParams,\n} from './utils/validation';\n\n/**\n * Metadata for the TransactionController state, describing how to \"anonymize\"\n * the state and which parts should be persisted.\n */\nconst metadata: StateMetadata<TransactionControllerState> = {\n transactions: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n transactionBatches: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n methodData: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastFetchedBlockNumbers: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n submitHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n};\n\nconst SUBMIT_HISTORY_LIMIT = 100;\n\n/**\n * Object with new transaction's meta and a promise resolving to the\n * transaction hash if successful.\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 /** Promise resolving to a new transaction hash. */\n result: Promise<string>;\n\n /** Meta information about this new transaction. */\n transactionMeta: TransactionMeta;\n}\n\n/**\n * Method data registry object\n */\nexport type MethodData = {\n /** Registry method raw string. */\n registryMethod: string;\n\n /** Registry method object, containing name and method arguments. */\n parsedRegistryMethod:\n | {\n name: string;\n args: { type: string }[];\n }\n | {\n // We're using `any` instead of `undefined` for compatibility with `Json`\n // TODO: Correct this type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name?: any;\n // We're using `any` instead of `undefined` for compatibility with `Json`\n // TODO: Correct this type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args?: any;\n };\n};\n\n/**\n * Transaction controller state\n */\nexport type TransactionControllerState = {\n /** A list of TransactionMeta objects. */\n transactions: TransactionMeta[];\n\n /** A list of TransactionBatchMeta objects. */\n transactionBatches: TransactionBatchMeta[];\n\n /** Object containing all known method data information. */\n methodData: Record<string, MethodData>;\n\n /** Cache to optimise incoming transaction queries. */\n lastFetchedBlockNumbers: { [key: string]: number | string };\n\n /** History of all transactions submitted from the wallet. */\n submitHistory: SubmitHistoryEntry[];\n};\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.1;\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 * Represents the `TransactionController:getState` action.\n */\nexport type TransactionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TransactionControllerState\n>;\n\n/**\n * Represents the `TransactionController:updateCustodialTransaction` action.\n */\nexport type TransactionControllerUpdateCustodialTransactionAction = {\n type: `${typeof controllerName}:updateCustodialTransaction`;\n handler: TransactionController['updateCustodialTransaction'];\n};\n\nexport type TransactionControllerEstimateGasAction = {\n type: `${typeof controllerName}:estimateGas`;\n handler: TransactionController['estimateGas'];\n};\n\nexport type TransactionControllerEstimateGasBatchAction = {\n type: `${typeof controllerName}:estimateGasBatch`;\n handler: TransactionController['estimateGasBatch'];\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 */\nexport type TransactionControllerConfirmExternalTransactionAction = {\n type: `${typeof controllerName}:confirmExternalTransaction`;\n handler: TransactionController['confirmExternalTransaction'];\n};\n\nexport type TransactionControllerGetNonceLockAction = {\n type: `${typeof controllerName}:getNonceLock`;\n handler: TransactionController['getNonceLock'];\n};\n\n/**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @returns An array of transactions matching the provided options.\n */\nexport type TransactionControllerGetTransactionsAction = {\n type: `${typeof controllerName}:getTransactions`;\n handler: TransactionController['getTransactions'];\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 */\nexport type TransactionControllerUpdateTransactionAction = {\n type: `${typeof controllerName}:updateTransaction`;\n handler: TransactionController['updateTransaction'];\n};\n\n/** Add a single transaction to be submitted after approval. */\nexport type TransactionControllerAddTransactionAction = {\n type: `${typeof controllerName}:addTransaction`;\n handler: TransactionController['addTransaction'];\n};\n\n/** Add a batch of transactions to be submitted after approval. */\nexport type TransactionControllerAddTransactionBatchAction = {\n type: `${typeof controllerName}:addTransactionBatch`;\n handler: TransactionController['addTransactionBatch'];\n};\n\n/**\n * Emulate a new transaction.\n *\n * @param transactionId - The transaction ID.\n */\nexport type TransactionControllerEmulateNewTransaction = {\n type: `${typeof controllerName}:emulateNewTransaction`;\n handler: TransactionController['emulateNewTransaction'];\n};\n\n/**\n * Emmulate a transaction update.\n *\n * @param transactionMeta - Transaction metadata.\n */\nexport type TransactionControllerEmulateTransactionUpdate = {\n type: `${typeof controllerName}:emulateTransactionUpdate`;\n handler: TransactionController['emulateTransactionUpdate'];\n};\n\n/**\n * Retrieve available gas fee tokens for a transaction.\n */\nexport type TransactionControllerGetGasFeeTokensAction = {\n type: `${typeof controllerName}:getGasFeeTokens`;\n handler: (request: GetGasFeeTokensRequest) => Promise<GasFeeToken[]>;\n};\n\n/**\n * The internal actions available to the TransactionController.\n */\nexport type TransactionControllerActions =\n | TransactionControllerAddTransactionAction\n | TransactionControllerAddTransactionBatchAction\n | TransactionControllerConfirmExternalTransactionAction\n | TransactionControllerEstimateGasAction\n | TransactionControllerEstimateGasBatchAction\n | TransactionControllerGetGasFeeTokensAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetStateAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateCustodialTransactionAction\n | TransactionControllerUpdateTransactionAction\n | TransactionControllerEmulateNewTransaction\n | TransactionControllerEmulateTransactionUpdate;\n\n/**\n * Configuration options for the PendingTransactionTracker\n */\nexport type PendingTransactionOptions = {\n /** Whether transaction publishing is automatically retried. */\n isResubmitEnabled?: () => boolean;\n};\n\n/** TransactionController constructor options. */\nexport type TransactionControllerOptions = {\n /** Whether to disable storing history in transaction metadata. */\n disableHistory: boolean;\n\n /** Explicitly disable transaction metadata history. */\n disableSendFlowHistory: boolean;\n\n /** Whether to disable additional processing on swaps transactions. */\n disableSwaps: boolean;\n\n /** Whether or not the account supports EIP-1559. */\n getCurrentAccountEIP1559Compatibility?: () => Promise<boolean>;\n\n /** Whether or not the network supports EIP-1559. */\n getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n\n /** Callback to retrieve pending transactions from external sources. */\n getExternalPendingTransactions?: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n /** Callback to retrieve gas fee estimates. */\n getGasFeeEstimates?: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n\n /** Gets the network client registry. */\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n /** Gets the state of the network controller. */\n getNetworkState: () => NetworkState;\n\n /** Get accounts that a given origin has permissions for. */\n getPermittedAccounts?: (origin?: string) => Promise<string[]>;\n\n /** Gets the saved gas fee config. */\n getSavedGasFees?: (chainId: Hex) => SavedGasFees | undefined;\n\n /**\n * Gets the transaction simulation configuration.\n */\n getSimulationConfig?: GetSimulationConfig;\n\n /** Configuration options for incoming transaction support. */\n incomingTransactions?: IncomingTransactionOptions & {\n /** @deprecated Ignored as Etherscan no longer used. */\n etherscanApiKeysByChainId?: Record<Hex, string>;\n };\n\n /**\n * Callback to determine whether gas fee updates should be enabled for a given transaction.\n * Returns true to enable updates, false to disable them.\n */\n isAutomaticGasFeeUpdateEnabled?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n /** Whether simulation should return EIP-7702 gas fee tokens. */\n isEIP7702GasFeeTokensEnabled?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n /** Whether the first time interaction check is enabled. */\n isFirstTimeInteractionEnabled?: () => boolean;\n\n /** Whether new transactions will be automatically simulated. */\n isSimulationEnabled?: () => boolean;\n\n /** The controller messenger. */\n messenger: TransactionControllerMessenger;\n\n /** Configuration options for pending transaction support. */\n pendingTransactions?: PendingTransactionOptions;\n\n /** Public key used to validate EIP-7702 contract signatures in feature flags. */\n publicKeyEIP7702?: Hex;\n\n /** A function for verifying a transaction, whether it is malicious or not. */\n securityProviderRequest?: SecurityProviderRequest;\n\n /** Function used to sign transactions. */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n /** Initial state to set on this controller. */\n state?: Partial<TransactionControllerState>;\n\n testGasFeeFlows?: boolean;\n trace?: TraceCallback;\n\n /** Transaction history limit. */\n transactionHistoryLimit: number;\n\n /** The controller hooks. */\n hooks: {\n /** Additional logic to execute after adding a transaction. */\n afterAdd?: AfterAddHook;\n\n /** Additional logic to execute after signing a transaction. Return false to not change the status to signed. */\n afterSign?: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n /** Additional logic to execute after simulating a transaction. */\n afterSimulate?: AfterSimulateHook;\n\n /**\n * Additional logic to execute before checking pending transactions.\n * Return false to prevent the broadcast of the transaction.\n */\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n /**\n * Additional logic to execute before publishing a transaction.\n * Return false to prevent the broadcast of the transaction.\n */\n beforePublish?: (transactionMeta: TransactionMeta) => Promise<boolean>;\n\n /**\n * Additional logic to execute before signing a transaction.\n */\n beforeSign?: BeforeSignHook;\n\n /** Returns additional arguments required to sign a transaction. */\n getAdditionalSignArguments?: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n /**\n * Callback to determine whether timeout checking should be enabled for a transaction.\n * Return false to disable timeout for the transaction.\n */\n isTimeoutEnabled?: (transactionMeta: TransactionMeta) => boolean;\n\n /** Alternate logic to publish a transaction. */\n publish?: (\n transactionMeta: TransactionMeta,\n ) => Promise<{ transactionHash: string }>;\n publishBatch?: PublishBatchHook;\n };\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 */\nexport type AllowedActions =\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetStateAction\n | AddApprovalRequest\n | KeyringControllerSignEip7702AuthorizationAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerGetNetworkClientByIdAction\n | RemoteFeatureFlagControllerGetStateAction;\n\n/**\n * The external events available to the {@link TransactionController}.\n */\nexport type AllowedEvents = NetworkControllerStateChangeEvent;\n\n/**\n * Represents the `TransactionController:stateChange` event.\n */\nexport type TransactionControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TransactionControllerState\n>;\n\n/**\n * Represents the `TransactionController:incomingTransactionsReceived` event.\n */\nexport type TransactionControllerIncomingTransactionsReceivedEvent = {\n type: `${typeof controllerName}:incomingTransactionsReceived`;\n payload: [incomingTransactions: TransactionMeta[]];\n};\n\n/**\n * Represents the `TransactionController:postTransactionBalanceUpdated` event.\n */\nexport type TransactionControllerPostTransactionBalanceUpdatedEvent = {\n type: `${typeof controllerName}:postTransactionBalanceUpdated`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n approvalTransactionMeta?: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:speedUpTransactionAdded` event.\n */\nexport type TransactionControllerSpeedupTransactionAddedEvent = {\n type: `${typeof controllerName}:speedupTransactionAdded`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionApproved` event.\n */\nexport type TransactionControllerTransactionApprovedEvent = {\n type: `${typeof controllerName}:transactionApproved`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionConfirmed` event.\n */\nexport type TransactionControllerTransactionConfirmedEvent = {\n type: `${typeof controllerName}:transactionConfirmed`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionDropped` event.\n */\nexport type TransactionControllerTransactionDroppedEvent = {\n type: `${typeof controllerName}:transactionDropped`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionFailed` event.\n */\nexport type TransactionControllerTransactionFailedEvent = {\n type: `${typeof controllerName}:transactionFailed`;\n payload: [\n {\n actionId?: string;\n error: string;\n transactionMeta: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionFinished` event.\n */\nexport type TransactionControllerTransactionFinishedEvent = {\n type: `${typeof controllerName}:transactionFinished`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwapApproval` event.\n */\nexport type TransactionControllerTransactionNewSwapApprovalEvent = {\n type: `${typeof controllerName}:transactionNewSwapApproval`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwap` event.\n */\nexport type TransactionControllerTransactionNewSwapEvent = {\n type: `${typeof controllerName}:transactionNewSwap`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwapApproval` event.\n */\nexport type TransactionControllerTransactionNewSwapAndSendEvent = {\n type: `${typeof controllerName}:transactionNewSwapAndSend`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionPublishingSkipped` event.\n */\nexport type TransactionControllerTransactionPublishingSkipped = {\n type: `${typeof controllerName}:transactionPublishingSkipped`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionRejected` event.\n */\nexport type TransactionControllerTransactionRejectedEvent = {\n type: `${typeof controllerName}:transactionRejected`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionStatusUpdated` event.\n */\nexport type TransactionControllerTransactionStatusUpdatedEvent = {\n type: `${typeof controllerName}:transactionStatusUpdated`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionSubmitted` event.\n */\nexport type TransactionControllerTransactionSubmittedEvent = {\n type: `${typeof controllerName}:transactionSubmitted`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:unapprovedTransactionAdded` event.\n */\nexport type TransactionControllerUnapprovedTransactionAddedEvent = {\n type: `${typeof controllerName}:unapprovedTransactionAdded`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * The internal events available to the {@link TransactionController}.\n */\nexport type TransactionControllerEvents =\n | TransactionControllerIncomingTransactionsReceivedEvent\n | TransactionControllerPostTransactionBalanceUpdatedEvent\n | TransactionControllerSpeedupTransactionAddedEvent\n | TransactionControllerStateChangeEvent\n | TransactionControllerTransactionApprovedEvent\n | TransactionControllerTransactionConfirmedEvent\n | TransactionControllerTransactionDroppedEvent\n | TransactionControllerTransactionFailedEvent\n | TransactionControllerTransactionFinishedEvent\n | TransactionControllerTransactionNewSwapApprovalEvent\n | TransactionControllerTransactionNewSwapEvent\n | TransactionControllerTransactionNewSwapAndSendEvent\n | TransactionControllerTransactionPublishingSkipped\n | TransactionControllerTransactionRejectedEvent\n | TransactionControllerTransactionStatusUpdatedEvent\n | TransactionControllerTransactionSubmittedEvent\n | TransactionControllerUnapprovedTransactionAddedEvent;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = Messenger<\n typeof controllerName,\n TransactionControllerActions | AllowedActions,\n TransactionControllerEvents | AllowedEvents\n>;\n\n/**\n * Possible states of the approve transaction step.\n */\nexport enum ApprovalState {\n Approved = 'approved',\n NotApproved = 'not-approved',\n SkippedViaBeforePublishHook = 'skipped-via-before-publish-hook',\n}\n\n/**\n * Get the default TransactionsController state.\n *\n * @returns The default TransactionsController state.\n */\nfunction getDefaultTransactionControllerState(): TransactionControllerState {\n return {\n methodData: {},\n transactions: [],\n transactionBatches: [],\n lastFetchedBlockNumbers: {},\n submitHistory: [],\n };\n}\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseController<\n typeof controllerName,\n TransactionControllerState,\n TransactionControllerMessenger\n> {\n readonly #afterAdd: AfterAddHook;\n\n readonly #afterSign: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n readonly #afterSimulate: AfterSimulateHook;\n\n readonly #approvingTransactionIds: Set<string> = new Set();\n\n readonly #beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #beforePublish: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #beforeSign: BeforeSignHook;\n\n readonly #gasFeeFlows: GasFeeFlow[];\n\n readonly #getAdditionalSignArguments: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n readonly #getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n\n readonly #getCurrentNetworkEIP1559Compatibility: (\n networkClientId?: NetworkClientId,\n ) => Promise<boolean>;\n\n readonly #getExternalPendingTransactions: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n readonly #getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n\n readonly #getNetworkState: () => NetworkState;\n\n readonly #getPermittedAccounts?: (origin?: string) => Promise<string[]>;\n\n readonly #getSavedGasFees: (chainId: Hex) => SavedGasFees | undefined;\n\n readonly #getSimulationConfig: GetSimulationConfig;\n\n readonly #incomingTransactionHelper: IncomingTransactionHelper;\n\n readonly #incomingTransactionOptions: IncomingTransactionOptions & {\n etherscanApiKeysByChainId?: Record<Hex, string>;\n };\n\n readonly #internalEvents = new EventEmitter();\n\n readonly #isAutomaticGasFeeUpdateEnabled: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n readonly #isEIP7702GasFeeTokensEnabled: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #isFirstTimeInteractionEnabled: () => boolean;\n\n readonly #isHistoryDisabled: boolean;\n\n readonly #isSendFlowHistoryDisabled: boolean;\n\n readonly #isSimulationEnabled: () => boolean;\n\n readonly #isSwapsDisabled: boolean;\n\n readonly #isTimeoutEnabled: (transactionMeta: TransactionMeta) => boolean;\n\n readonly #layer1GasFeeFlows: Layer1GasFeeFlow[];\n\n readonly #methodDataHelper: MethodDataHelper;\n\n readonly #multichainTrackingHelper: MultichainTrackingHelper;\n\n readonly #pendingTransactionOptions: PendingTransactionOptions;\n\n readonly #publicKeyEIP7702?: Hex;\n\n readonly #publish: (\n transactionMeta: TransactionMeta,\n rawTx: string,\n ) => Promise<{ transactionHash?: string }>;\n\n readonly #publishBatchHook?: PublishBatchHook;\n\n readonly #securityProviderRequest?: SecurityProviderRequest;\n\n readonly #sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n readonly #signAbortCallbacks: Map<string, () => void> = new Map();\n\n readonly #skipSimulationTransactionIds: Set<string> = new Set();\n\n readonly #testGasFeeFlows: boolean;\n\n readonly #trace: TraceCallback;\n\n readonly #transactionHistoryLimit: number;\n\n /**\n * Constructs a TransactionController.\n *\n * @param options - The controller options.\n */\n constructor(options: TransactionControllerOptions) {\n const {\n disableHistory,\n disableSendFlowHistory,\n disableSwaps,\n getCurrentAccountEIP1559Compatibility,\n getCurrentNetworkEIP1559Compatibility,\n getExternalPendingTransactions,\n getGasFeeEstimates,\n getNetworkClientRegistry,\n getNetworkState,\n getPermittedAccounts,\n getSavedGasFees,\n getSimulationConfig,\n hooks,\n incomingTransactions = {},\n isAutomaticGasFeeUpdateEnabled,\n isEIP7702GasFeeTokensEnabled,\n isFirstTimeInteractionEnabled,\n isSimulationEnabled,\n messenger,\n pendingTransactions = {},\n publicKeyEIP7702,\n securityProviderRequest,\n sign,\n state,\n testGasFeeFlows,\n trace,\n transactionHistoryLimit = 40,\n } = options;\n\n super({\n name: controllerName,\n metadata,\n messenger,\n state: {\n ...getDefaultTransactionControllerState(),\n ...state,\n },\n });\n\n this.messenger = messenger;\n\n this.#afterAdd =\n hooks?.afterAdd ?? ((): ReturnType<AfterAddHook> => Promise.resolve({}));\n this.#afterSign = hooks?.afterSign ?? ((): boolean => true);\n this.#afterSimulate =\n hooks?.afterSimulate ??\n ((): ReturnType<AfterSimulateHook> => Promise.resolve({}));\n this.#beforeCheckPendingTransaction =\n /* istanbul ignore next */\n hooks?.beforeCheckPendingTransaction ??\n ((): Promise<boolean> => Promise.resolve(true));\n this.#beforePublish =\n hooks?.beforePublish ?? ((): Promise<boolean> => Promise.resolve(true));\n this.#beforeSign =\n hooks?.beforeSign ??\n ((): ReturnType<BeforeSignHook> => Promise.resolve({}));\n this.#getAdditionalSignArguments =\n hooks?.getAdditionalSignArguments ??\n ((): (TransactionMeta | undefined)[] => []);\n this.#getCurrentAccountEIP1559Compatibility =\n getCurrentAccountEIP1559Compatibility ??\n ((): Promise<boolean> => Promise.resolve(true));\n this.#getCurrentNetworkEIP1559Compatibility =\n getCurrentNetworkEIP1559Compatibility;\n this.#getExternalPendingTransactions =\n getExternalPendingTransactions ?? ((): NonceTrackerTransaction[] => []);\n this.#getGasFeeEstimates =\n getGasFeeEstimates ??\n ((): Promise<GasFeeState> => Promise.resolve({} as GasFeeState));\n this.#getNetworkState = getNetworkState;\n this.#getPermittedAccounts = getPermittedAccounts;\n this.#getSavedGasFees =\n getSavedGasFees ?? ((_chainId): SavedGasFees | undefined => undefined);\n this.#getSimulationConfig =\n getSimulationConfig ??\n ((): ReturnType<GetSimulationConfig> => Promise.resolve({}));\n this.#incomingTransactionOptions = incomingTransactions;\n this.#isAutomaticGasFeeUpdateEnabled =\n isAutomaticGasFeeUpdateEnabled ??\n ((_txMeta: TransactionMeta): boolean => false);\n this.#isEIP7702GasFeeTokensEnabled =\n isEIP7702GasFeeTokensEnabled ??\n ((): Promise<boolean> => Promise.resolve(false));\n this.#isFirstTimeInteractionEnabled =\n isFirstTimeInteractionEnabled ?? ((): boolean => true);\n this.#isHistoryDisabled = disableHistory ?? false;\n this.#isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;\n this.#isSimulationEnabled = isSimulationEnabled ?? ((): boolean => true);\n this.#isSwapsDisabled = disableSwaps ?? false;\n this.#isTimeoutEnabled = hooks?.isTimeoutEnabled ?? ((): boolean => true);\n this.#pendingTransactionOptions = pendingTransactions;\n this.#publicKeyEIP7702 = publicKeyEIP7702;\n this.#publish =\n hooks?.publish ??\n ((): Promise<{ transactionHash?: string }> =>\n Promise.resolve({ transactionHash: undefined }));\n this.#publishBatchHook = hooks?.publishBatch;\n this.#securityProviderRequest = securityProviderRequest;\n this.#sign = sign;\n this.#testGasFeeFlows = testGasFeeFlows === true;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#transactionHistoryLimit = transactionHistoryLimit;\n\n const findNetworkClientIdByChainId = (chainId: Hex): string => {\n return this.messenger.call(\n `NetworkController:findNetworkClientIdByChainId`,\n chainId,\n );\n };\n\n this.#multichainTrackingHelper = new MultichainTrackingHelper({\n findNetworkClientIdByChainId,\n getNetworkClientById: ((networkClientId: NetworkClientId) => {\n return this.messenger.call(\n `NetworkController:getNetworkClientById`,\n networkClientId,\n );\n }) as NetworkController['getNetworkClientById'],\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners:\n this.#removePendingTransactionTrackerListeners.bind(this),\n createNonceTracker: this.#createNonceTracker.bind(this),\n createPendingTransactionTracker:\n this.#createPendingTransactionTracker.bind(this),\n onNetworkStateChange: (listener): void => {\n this.messenger.subscribe('NetworkController:stateChange', listener);\n },\n });\n\n this.#multichainTrackingHelper.initialize();\n this.#gasFeeFlows = this.#getGasFeeFlows();\n this.#layer1GasFeeFlows = this.#getLayer1GasFeeFlows();\n\n const gasFeePoller = new GasFeePoller({\n findNetworkClientIdByChainId,\n gasFeeFlows: this.#gasFeeFlows,\n getGasFeeControllerEstimates: this.#getGasFeeEstimates,\n getProvider: (networkClientId): Provider =>\n this.#getProvider({ networkClientId }),\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n getTransactionBatches: (): TransactionBatchMeta[] =>\n this.state.transactionBatches,\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n onStateChange: (listener): void => {\n this.messenger.subscribe('TransactionController:stateChange', listener);\n },\n });\n\n gasFeePoller.hub.on(\n 'transaction-updated',\n this.#onGasFeePollerTransactionUpdate.bind(this),\n );\n\n gasFeePoller.hub.on(\n 'transaction-batch-updated',\n this.#onGasFeePollerTransactionBatchUpdate.bind(this),\n );\n\n this.#methodDataHelper = new MethodDataHelper({\n getProvider: (networkClientId): Provider =>\n this.#getProvider({ networkClientId }),\n getState: (): Record<string, MethodData> => this.state.methodData,\n });\n\n this.#methodDataHelper.hub.on(\n 'update',\n ({ fourBytePrefix, methodData }) => {\n this.update((_state) => {\n _state.methodData[fourBytePrefix] = methodData;\n });\n },\n );\n\n this.#incomingTransactionHelper = new IncomingTransactionHelper({\n client: this.#incomingTransactionOptions.client,\n getCurrentAccount: (): ReturnType<\n AccountsController['getSelectedAccount']\n > => this.#getSelectedAccount(),\n getLocalTransactions: (): TransactionMeta[] => this.state.transactions,\n includeTokenTransfers:\n this.#incomingTransactionOptions.includeTokenTransfers,\n isEnabled: this.#incomingTransactionOptions.isEnabled,\n messenger: this.messenger,\n remoteTransactionSource: new AccountsApiRemoteTransactionSource(),\n trimTransactions: this.#trimTransactionsForState.bind(this),\n updateTransactions: this.#incomingTransactionOptions.updateTransactions,\n });\n\n this.#addIncomingTransactionHelperListeners(\n this.#incomingTransactionHelper,\n );\n\n // when transactionsController state changes\n // check for pending transactions and start polling if there are any\n this.messenger.subscribe(\n 'TransactionController:stateChange',\n this.#checkForPendingTransactionAndStartPolling,\n );\n\n // eslint-disable-next-line no-new\n new ResimulateHelper({\n simulateTransaction: this.#updateSimulationData.bind(this),\n onTransactionsUpdate: (listener): void => {\n this.messenger.subscribe(\n 'TransactionController:stateChange',\n listener,\n (controllerState) => controllerState.transactions,\n );\n },\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n });\n\n this.#onBootCleanup();\n this.#checkForPendingTransactionAndStartPolling();\n this.#registerActionHandlers();\n }\n\n /**\n * Stops polling and removes listeners to prepare the controller for garbage collection.\n */\n destroy(): void {\n this.#stopAllTracking();\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @param networkClientId - The ID of the network client used to fetch the method data.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(\n fourBytePrefix: string,\n networkClientId: NetworkClientId,\n ): Promise<MethodData> {\n return this.#methodDataHelper.lookup(fourBytePrefix, networkClientId);\n }\n\n /**\n * Add a batch of transactions to be submitted after approval.\n *\n * @param request - Request object containing the transactions to add.\n * @returns Result object containing the generated batch ID.\n */\n async addTransactionBatch(\n request: TransactionBatchRequest,\n ): Promise<TransactionBatchResult> {\n const { blockTracker } = this.messenger.call(\n `NetworkController:getNetworkClientById`,\n request.networkClientId,\n );\n\n return await addTransactionBatch({\n addTransaction: this.addTransaction.bind(this),\n estimateGas: this.estimateGas.bind(this),\n getChainId: this.#getChainId.bind(this),\n getEthQuery: (networkClientId) => this.#getEthQuery({ networkClientId }),\n getGasFeeEstimates: this.#getGasFeeEstimates,\n getInternalAccounts: this.#getInternalAccounts.bind(this),\n getSimulationConfig: this.#getSimulationConfig.bind(this),\n getPendingTransactionTracker: (networkClientId: NetworkClientId) =>\n this.#createPendingTransactionTracker({\n provider: this.#getProvider({ networkClientId }),\n blockTracker,\n chainId: this.#getChainId(networkClientId),\n networkClientId,\n }),\n getTransaction: (transactionId) =>\n this.#getTransactionOrThrow(transactionId),\n isSimulationEnabled: this.#isSimulationEnabled,\n messenger: this.messenger,\n publishBatchHook: this.#publishBatchHook,\n publicKeyEIP7702: this.#publicKeyEIP7702,\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => this.#publishTransaction(ethQuery, transactionMeta) as Promise<Hex>,\n request,\n signTransaction: this.#signTransaction.bind(this),\n update: this.update.bind(this),\n updateTransaction: this.#updateTransactionInternal.bind(this),\n });\n }\n\n /**\n * Determine which chains support atomic batch transactions with the given account address.\n *\n * @param request - Request object containing the account address and other parameters.\n * @returns Result object containing the supported chains and related information.\n */\n async isAtomicBatchSupported(\n request: IsAtomicBatchSupportedRequest,\n ): Promise<IsAtomicBatchSupportedResult> {\n return isAtomicBatchSupported({\n ...request,\n getEthQuery: (chainId) => this.#getEthQuery({ chainId }),\n messenger: this.messenger,\n publicKeyEIP7702: this.#publicKeyEIP7702,\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. A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param options - Additional options to control how the transaction is added.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n options: AddTransactionOptions,\n ): Promise<Result> {\n log('Adding transaction', txParams, options);\n\n const {\n actionId,\n assetsFiatValues,\n batchId,\n deviceConfirmedOn,\n disableGasBuffer,\n gasFeeToken,\n isGasFeeIncluded,\n isGasFeeSponsored,\n method,\n nestedTransactions,\n networkClientId,\n origin,\n publishHook,\n requestId,\n requireApproval,\n securityAlertResponse,\n sendFlowHistory,\n skipInitialGasEstimate,\n swaps = {},\n traceContext,\n type,\n } = options;\n\n // eslint-disable-next-line no-param-reassign\n txParams = normalizeTransactionParams(txParams);\n\n if (!this.#multichainTrackingHelper.has(networkClientId)) {\n throw new Error(`Network client not found - ${networkClientId}`);\n }\n\n const chainId = this.#getChainId(networkClientId);\n\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const permittedAddresses =\n origin === undefined\n ? undefined\n : await this.#getPermittedAccounts?.(origin);\n\n const internalAccounts = this.#getInternalAccounts();\n\n await validateTransactionOrigin({\n data: txParams.data,\n from: txParams.from,\n internalAccounts,\n origin,\n permittedAddresses,\n txParams,\n type,\n });\n\n const delegationAddressPromise = getDelegationAddress(\n txParams.from as Hex,\n ethQuery,\n ).catch(() => undefined);\n\n const isEIP1559Compatible =\n await this.#getEIP1559Compatibility(networkClientId);\n\n validateTxParams(txParams, isEIP1559Compatible, chainId);\n\n if (!txParams.type) {\n // Determine transaction type based on transaction parameters and network compatibility\n setEnvelopeType(txParams, isEIP1559Compatible);\n }\n\n const isDuplicateBatchId =\n batchId?.length &&\n this.state.transactions.some(\n (tx) => tx.batchId?.toLowerCase() === batchId?.toLowerCase(),\n );\n\n if (isDuplicateBatchId && origin && origin !== ORIGIN_METAMASK) {\n throw new JsonRpcError(\n ErrorCode.DuplicateBundleId,\n 'Batch ID already exists',\n );\n }\n\n const dappSuggestedGasFees = this.#generateDappSuggestedGasFees(\n txParams,\n origin,\n );\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 let addedTransactionMeta: TransactionMeta = existingTransactionMeta\n ? cloneDeep(existingTransactionMeta)\n : {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n assetsFiatValues,\n batchId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n disableGasBuffer,\n id: random(),\n isGasFeeTokenIgnoredIfBalance: Boolean(gasFeeToken),\n isGasFeeIncluded,\n isGasFeeSponsored,\n isFirstTimeInteraction: undefined,\n nestedTransactions,\n networkClientId,\n origin,\n requestId,\n securityAlertResponse,\n selectedGasFeeToken: gasFeeToken,\n status: TransactionStatus.unapproved as const,\n time: Date.now(),\n txParams,\n type: transactionType,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n };\n\n const { updateTransaction } = await this.#afterAdd({\n transactionMeta: addedTransactionMeta,\n });\n\n if (updateTransaction) {\n log('Updating transaction using afterAdd hook');\n\n addedTransactionMeta.txParamsOriginal = cloneDeep(\n addedTransactionMeta.txParams,\n );\n\n updateTransaction(addedTransactionMeta);\n }\n\n // eslint-disable-next-line no-negated-condition\n if (!skipInitialGasEstimate) {\n await this.#trace(\n { name: 'Estimate Gas Properties', parentContext: traceContext },\n (context) =>\n this.#updateGasProperties(addedTransactionMeta, {\n traceContext: context,\n }),\n );\n } else {\n const newTransactionMeta = cloneDeep(addedTransactionMeta);\n\n this.#updateGasProperties(newTransactionMeta)\n .then(() => {\n this.#updateTransactionInternal(\n {\n transactionId: newTransactionMeta.id,\n skipHistory: true,\n skipResimulateCheck: true,\n skipValidation: true,\n },\n (tx) => {\n tx.txParams.gas = newTransactionMeta.txParams.gas;\n tx.txParams.gasPrice = newTransactionMeta.txParams.gasPrice;\n tx.txParams.maxFeePerGas =\n newTransactionMeta.txParams.maxFeePerGas;\n tx.txParams.maxPriorityFeePerGas =\n newTransactionMeta.txParams.maxPriorityFeePerGas;\n },\n );\n\n return undefined;\n })\n .catch(noop);\n }\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 addedTransactionMeta,\n method,\n );\n // eslint-disable-next-line require-atomic-updates\n addedTransactionMeta.securityProviderResponse =\n securityProviderResponse;\n }\n\n if (!this.#isSendFlowHistoryDisabled) {\n // eslint-disable-next-line require-atomic-updates\n addedTransactionMeta.sendFlowHistory = sendFlowHistory ?? [];\n }\n // Initial history push\n if (!this.#isHistoryDisabled) {\n addedTransactionMeta = addInitialHistorySnapshot(addedTransactionMeta);\n }\n\n addedTransactionMeta = updateSwapsTransaction(\n addedTransactionMeta,\n transactionType,\n swaps,\n {\n isSwapsDisabled: this.#isSwapsDisabled,\n cancelTransaction: this.#rejectTransaction.bind(this),\n messenger: this.messenger,\n },\n );\n\n this.#addMetadata(addedTransactionMeta);\n\n delegationAddressPromise\n .then((delegationAddress) => {\n this.#updateTransactionInternal(\n {\n transactionId: addedTransactionMeta.id,\n skipHistory: true,\n skipResimulateCheck: true,\n skipValidation: true,\n },\n (tx) => {\n tx.delegationAddress = delegationAddress;\n },\n );\n\n return undefined;\n })\n .catch(noop);\n\n // eslint-disable-next-line no-negated-condition\n if (requireApproval !== false) {\n this.#updateSimulationData(addedTransactionMeta, {\n traceContext,\n }).catch((error) => {\n log('Error while updating simulation data', error);\n throw error;\n });\n\n updateFirstTimeInteraction({\n existingTransactions: this.state.transactions,\n getTransaction: (transactionId: string) =>\n this.#getTransaction(transactionId),\n isFirstTimeInteractionEnabled: this.#isFirstTimeInteractionEnabled,\n trace: this.#trace,\n traceContext,\n transactionMeta: addedTransactionMeta,\n updateTransaction: this.#updateTransactionInternal.bind(this),\n }).catch((error) => {\n log('Error while updating first interaction properties', error);\n });\n } else {\n log(\n 'Skipping simulation & first interaction update as approval not required',\n );\n }\n\n this.messenger.publish(\n `${controllerName}:unapprovedTransactionAdded`,\n addedTransactionMeta,\n );\n }\n\n return {\n result: this.#processApproval(addedTransactionMeta, {\n actionId,\n isExisting: Boolean(existingTransactionMeta),\n publishHook,\n requireApproval,\n traceContext,\n }),\n transactionMeta: addedTransactionMeta,\n };\n }\n\n startIncomingTransactionPolling(): void {\n this.#incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionPolling(): void {\n this.#incomingTransactionHelper.stop();\n }\n\n /**\n * Update the incoming transactions by polling the remote transaction source.\n *\n * @param request - Request object.\n * @param request.tags - Additional tags to identify the source of the request.\n */\n async updateIncomingTransactions({\n tags,\n }: { tags?: string[] } = {}): Promise<void> {\n await this.#incomingTransactionHelper.update({ tags });\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 ): Promise<void> {\n await this.#retryTransaction({\n actionId,\n estimatedBaseFee,\n gasValues,\n label: 'cancel',\n rate: CANCEL_RATE,\n transactionId,\n transactionType: TransactionType.cancel,\n prepareTransactionParams: (txParams) => {\n delete txParams.data;\n txParams.to = txParams.from;\n txParams.value = '0x0';\n },\n afterSubmit: (newTransactionMeta) => {\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n newTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${newTransactionMeta.id}:finished`,\n newTransactionMeta,\n );\n },\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 ): Promise<void> {\n await this.#retryTransaction({\n actionId,\n estimatedBaseFee,\n gasValues,\n label: 'speed up',\n rate: SPEED_UP_RATE,\n transactionId,\n transactionType: TransactionType.retry,\n afterSubmit: (newTransactionMeta) => {\n this.messenger.publish(\n `${controllerName}:speedupTransactionAdded`,\n newTransactionMeta,\n );\n },\n });\n }\n\n async #retryTransaction({\n actionId,\n afterSubmit,\n estimatedBaseFee,\n gasValues,\n label,\n prepareTransactionParams,\n rate,\n transactionId,\n transactionType,\n }: {\n actionId?: string;\n afterSubmit?: (transactionMeta: TransactionMeta) => void;\n estimatedBaseFee?: string;\n gasValues?: GasPriceValue | FeeMarketEIP1559Values;\n label: string;\n prepareTransactionParams?: (txParams: TransactionParams) => void;\n rate: number;\n transactionId: string;\n transactionType: TransactionType;\n }): Promise<void> {\n // If transaction is found for same action id, do not create a new 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 // eslint-disable-next-line no-param-reassign\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log(`Creating ${label} transaction`, transactionId, gasValues);\n\n const transactionMeta = this.#getTransaction(transactionId);\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 const newTxParams: TransactionParams =\n getTransactionParamsWithIncreasedGasFee(\n transactionMeta.txParams,\n rate,\n gasValues,\n );\n\n prepareTransactionParams?.(newTxParams);\n\n const unsignedEthTx = prepareTransaction(\n transactionMeta.chainId,\n newTxParams,\n );\n\n const signedTx = await this.#sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n const transactionMetaWithRsv = this.#updateTransactionMetaRSV(\n transactionMeta,\n signedTx,\n );\n\n const rawTx = serializeTransaction(signedTx);\n const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;\n\n const oldFee = newTxParams.maxFeePerGas\n ? transactionMetaWithRsv.txParams.maxFeePerGas\n : transactionMetaWithRsv.txParams.gasPrice;\n\n log(`Submitting ${label} transaction`, {\n oldFee,\n newFee,\n txParams: newTxParams,\n });\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n const newTransactionMeta = {\n ...transactionMetaWithRsv,\n actionId,\n estimatedBaseFee,\n id: random(),\n originalGasEstimate: transactionMeta.txParams.gas,\n originalType: transactionMeta.type,\n rawTx,\n time: Date.now(),\n txParams: newTxParams,\n type: transactionType,\n };\n\n const hash = await this.#publishTransactionForRetry(ethQuery, {\n ...newTransactionMeta,\n origin: label,\n });\n\n newTransactionMeta.hash = hash;\n\n this.#addMetadata(newTransactionMeta);\n\n // speedUpTransaction has no approval request, so we assume the user has already approved the transaction\n this.messenger.publish(`${controllerName}:transactionApproved`, {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.messenger.publish(`${controllerName}:transactionSubmitted`, {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n afterSubmit?.(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 * @param options - Additional options for the estimate.\n * @param options.ignoreDelegationSignatures - Ignore signature errors if submitting delegations to the DelegationManager.\n * @returns The gas and gas price.\n */\n async estimateGas(\n transaction: TransactionParams,\n networkClientId: NetworkClientId,\n {\n ignoreDelegationSignatures,\n }: {\n ignoreDelegationSignatures?: boolean;\n } = {},\n ): Promise<{\n gas: string;\n simulationFails: TransactionMeta['simulationFails'];\n }> {\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const { estimatedGas, simulationFails } = await estimateGas({\n chainId: this.#getChainId(networkClientId),\n ethQuery,\n ignoreDelegationSignatures,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txParams: transaction,\n });\n\n return { gas: estimatedGas, simulationFails };\n }\n\n /**\n * Estimates required gas for a batch of transactions.\n *\n * @param request - Request object.\n * @param request.chainId - Chain ID of the transactions.\n * @param request.from - Address of the sender.\n * @param request.transactions - Array of transactions within a batch request.\n * @returns Object containing the gas limit.\n */\n async estimateGasBatch({\n chainId,\n from,\n transactions,\n }: {\n chainId: Hex;\n from: Hex;\n transactions: BatchTransactionParams[];\n }): Promise<{ totalGasLimit: number; gasLimits: number[] }> {\n const ethQuery = this.#getEthQuery({\n chainId,\n });\n\n return estimateGasBatch({\n chainId,\n ethQuery,\n from,\n getSimulationConfig: this.#getSimulationConfig,\n isAtomicBatchSupported: this.isAtomicBatchSupported.bind(this),\n messenger: this.messenger,\n transactions,\n });\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 * @returns The buffered estimated gas and whether the estimation failed.\n */\n async estimateGasBuffered(\n transaction: TransactionParams,\n multiplier: number,\n networkClientId: NetworkClientId,\n ): Promise<{\n gas: string;\n simulationFails: TransactionMeta['simulationFails'];\n }> {\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas({\n chainId: this.#getChainId(networkClientId),\n ethQuery,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txParams: transaction,\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): void {\n const { id: transactionId } = transactionMeta;\n\n this.#updateTransactionInternal({ transactionId, note }, () => ({\n ...transactionMeta,\n }));\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 ): void {\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 updatedTransactionMeta = {\n ...transactionMeta,\n securityAlertResponse,\n };\n this.updateTransaction(\n updatedTransactionMeta,\n `${controllerName}:updatesecurityAlertResponse - securityAlertResponse updated`,\n );\n }\n\n /**\n * Remove transactions from state.\n *\n * @param options - The options bag.\n * @param options.address - Remove transactions from this account only. Defaults to all accounts.\n * @param options.chainId - Remove transactions for the specified chain only. Defaults to all chains.\n */\n wipeTransactions({\n address,\n chainId,\n }: {\n address?: string;\n chainId?: string;\n } = {}): void {\n if (!chainId && !address) {\n this.update((state) => {\n state.transactions = [];\n });\n\n return;\n }\n\n const newTransactions = this.state.transactions.filter(\n ({ chainId: txChainId, txParams, type }) => {\n const isMatchingNetwork = !chainId || chainId === txChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address ||\n txParams.from?.toLowerCase() === address.toLowerCase() ||\n (type === TransactionType.incoming &&\n txParams.to?.toLowerCase() === address.toLowerCase());\n\n return !isMatchingAddress;\n },\n );\n\n this.update((state) => {\n state.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 ): Promise<void> {\n // Run validation and add external transaction to state.\n const newTransactionMeta = this.#addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = newTransactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n const updatedTransactionMeta = {\n ...newTransactionMeta,\n status: TransactionStatus.confirmed as const,\n txReceipt: transactionReceipt,\n };\n if (baseFeePerGas) {\n updatedTransactionMeta.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 updatedTransactionMeta,\n `${controllerName}:confirmExternalTransaction - Add external transaction`,\n );\n this.#onTransactionStatusChange(updatedTransactionMeta);\n\n // Intentional given potential duration of process.\n this.#updatePostBalance(updatedTransactionMeta).catch((error) => {\n /* istanbul ignore next */\n log('Error while updating post balance', error);\n throw error;\n });\n\n this.messenger.publish(\n `${controllerName}:transactionConfirmed`,\n updatedTransactionMeta,\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 const sendFlowHistory = transactionMeta.sendFlowHistory ?? [];\n if (currentSendFlowHistoryLength === sendFlowHistory.length) {\n const updatedTransactionMeta = {\n ...transactionMeta,\n sendFlowHistory: [...sendFlowHistory, ...sendFlowHistoryToAdd],\n };\n this.updateTransaction(\n updatedTransactionMeta,\n `${controllerName}: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: userFeeLevelParam,\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 const clonedTransactionMeta = cloneDeep(transactionMeta);\n const isTransactionGasFeeEstimatesExists = transactionMeta.gasFeeEstimates;\n const isAutomaticGasFeeUpdateEnabled =\n this.#isAutomaticGasFeeUpdateEnabled(transactionMeta);\n const userFeeLevel = userFeeLevelParam as GasFeeEstimateLevelType;\n const isOneOfFeeLevelSelected =\n Object.values(GasFeeEstimateLevel).includes(userFeeLevel);\n const shouldUpdateTxParamsGasFees =\n isTransactionGasFeeEstimatesExists &&\n isAutomaticGasFeeUpdateEnabled &&\n isOneOfFeeLevelSelected;\n\n if (shouldUpdateTxParamsGasFees) {\n updateTransactionGasEstimates({\n txMeta: clonedTransactionMeta,\n userFeeLevel,\n });\n }\n\n const txParamsUpdate = {\n gas,\n gasLimit,\n };\n\n if (shouldUpdateTxParamsGasFees) {\n // Get updated values from clonedTransactionMeta if we're using automated fee updates\n Object.assign(txParamsUpdate, {\n gasPrice: clonedTransactionMeta.txParams.gasPrice,\n maxPriorityFeePerGas:\n clonedTransactionMeta.txParams.maxPriorityFeePerGas,\n maxFeePerGas: clonedTransactionMeta.txParams.maxFeePerGas,\n });\n } else {\n Object.assign(txParamsUpdate, {\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n });\n }\n\n const transactionGasFees = {\n txParams: pickBy(txParamsUpdate),\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n };\n\n const filteredTransactionGasFees = pickBy(transactionGasFees);\n\n this.#updateTransactionInternal(\n {\n transactionId,\n note: `${controllerName}:updateTransactionGasFees - gas values updated`,\n skipResimulateCheck: true,\n },\n (draftTxMeta) => {\n const { txParams, ...otherProps } = filteredTransactionGasFees;\n Object.assign(draftTxMeta, otherProps);\n if (txParams) {\n Object.assign(draftTxMeta.txParams, txParams);\n }\n },\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 `${controllerName}:updatePreviousGasParams - Previous gas values updated`,\n );\n\n return this.#getTransaction(transactionId) as TransactionMeta;\n }\n\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n return this.#multichainTrackingHelper.getNonceLock(\n address,\n networkClientId,\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.containerTypes - Container types applied to the parameters.\n * @param params.data - Data to pass with the transaction.\n * @param params.from - Address to send the transaction from.\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.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param params.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param params.updateType - Whether to update the transaction type. Defaults to `true`.\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 containerTypes,\n data,\n from,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n updateType,\n value,\n }: {\n containerTypes?: TransactionContainerType[];\n data?: string;\n from?: string;\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n updateType?: boolean;\n value?: string;\n },\n ): Promise<Readonly<TransactionMeta> | undefined> {\n const transactionMeta = this.#getTransaction(txId);\n\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 maxFeePerGas,\n maxPriorityFeePerGas,\n },\n } as Partial<TransactionMeta>;\n\n editableParams.txParams = pickBy(\n editableParams.txParams,\n ) as TransactionParams;\n\n const updatedTransaction = merge({}, transactionMeta, editableParams);\n\n const { networkClientId } = transactionMeta;\n const provider = this.#getProvider({ networkClientId });\n const ethQuery = new EthQuery(provider);\n\n if (updateType !== false) {\n const { type } = await determineTransactionType(\n updatedTransaction.txParams,\n ethQuery,\n );\n\n updatedTransaction.type = type;\n }\n\n if (containerTypes) {\n updatedTransaction.containerTypes = containerTypes;\n }\n\n await updateTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta: updatedTransaction,\n });\n\n this.updateTransaction(\n updatedTransaction,\n `Update Editable Params for ${txId}`,\n );\n\n return this.#getTransaction(txId);\n }\n\n /**\n * Update the isActive state of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param isActive - The active state.\n */\n setTransactionActive(transactionId: string, isActive: boolean): void {\n const transactionMeta = this.#getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(`Transaction with id ${transactionId} not found`);\n }\n\n this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#setTransactionActive - Transaction isActive updated',\n skipHistory: true,\n skipValidation: true,\n skipResimulateCheck: true,\n },\n (updatedTransactionMeta) => {\n updatedTransactionMeta.isActive = isActive;\n },\n );\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 * @param opts - Options bag.\n * @param opts.hasNonce - Whether the transactions already have a nonce.\n * @returns The raw transactions.\n */\n async approveTransactionsWithSameNonce(\n listOfTxParams: (TransactionParams & { chainId: Hex })[] = [],\n { hasNonce }: { hasNonce?: boolean } = {},\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 { chainId } = initialTx;\n const networkClientId = this.#getNetworkClientId({ chainId });\n const initialTxAsEthTx = prepareTransaction(chainId, initialTx);\n const initialTxAsSerializedHex = serializeTransaction(initialTxAsEthTx);\n\n if (this.#approvingTransactionIds.has(initialTxAsSerializedHex)) {\n return '';\n }\n\n this.#approvingTransactionIds.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 const requiresNonce = hasNonce !== true;\n\n nonceLock = requiresNonce\n ? await this.getNonceLock(fromAddress, networkClientId)\n : undefined;\n\n const nonce = nonceLock\n ? add0x(nonceLock.nextNonce.toString(16))\n : initialTx.nonce;\n\n if (nonceLock) {\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n }\n\n rawTransactions = await Promise.all(\n listOfTxParams.map((txParams) => {\n txParams.nonce = nonce;\n return this.#signExternalTransaction(txParams.chainId, txParams);\n }),\n );\n } catch (error) {\n log('Error while signing transactions with same nonce', error);\n // Must set transaction to submitted/failed before releasing lock\n // continue with error chain\n throw error;\n } finally {\n nonceLock?.releaseLock();\n this.#approvingTransactionIds.delete(initialTxAsSerializedHex);\n }\n return rawTransactions;\n }\n\n /**\n * Update a custodial transaction.\n *\n * @param request - The custodial transaction update request.\n *\n * @returns The updated transaction metadata.\n */\n updateCustodialTransaction(\n request: UpdateCustodialTransactionRequest,\n ): TransactionMeta {\n const {\n transactionId,\n errorMessage,\n hash,\n status,\n gasLimit,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n type,\n } = request;\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 (\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 const updatedTransactionMeta = merge(\n {},\n transactionMeta,\n pickBy({ hash, status }),\n ) as TransactionMeta;\n\n if (updatedTransactionMeta.status === TransactionStatus.submitted) {\n updatedTransactionMeta.submittedTime = new Date().getTime();\n }\n\n if (updatedTransactionMeta.status === TransactionStatus.failed) {\n updatedTransactionMeta.error = normalizeTxError(new Error(errorMessage));\n }\n\n // Update txParams properties with a single pickBy operation\n updatedTransactionMeta.txParams = merge(\n {},\n updatedTransactionMeta.txParams,\n pickBy({\n gasLimit,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n type,\n }),\n );\n\n // Special case for type change to legacy\n if (type === TransactionEnvelopeType.legacy) {\n delete updatedTransactionMeta.txParams.maxFeePerGas;\n delete updatedTransactionMeta.txParams.maxPriorityFeePerGas;\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n `${controllerName}:updateCustodialTransaction - Custodial transaction updated`,\n );\n\n if (\n status &&\n [TransactionStatus.submitted, TransactionStatus.failed].includes(status)\n ) {\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n updatedTransactionMeta,\n );\n this.#internalEvents.emit(\n `${updatedTransactionMeta.id}:finished`,\n updatedTransactionMeta,\n );\n }\n\n return updatedTransactionMeta;\n }\n\n /**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @returns An array of transactions matching the provided options.\n */\n getTransactions({\n initialList,\n limit,\n searchCriteria = {},\n }: {\n initialList?: TransactionMeta[];\n limit?: number;\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchCriteria?: any;\n } = {}): TransactionMeta[] {\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 (value: any): boolean => value === 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 // 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 async estimateGasFee({\n transactionParams,\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n transactionParams: TransactionParams;\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Promise<GasFeeFlowResponse> {\n const { id: networkClientId, provider } =\n this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n });\n\n const transactionMeta = {\n txParams: transactionParams,\n chainId,\n networkClientId,\n } as TransactionMeta;\n\n // Guaranteed as the default gas fee flow matches all transactions.\n const gasFeeFlow = getGasFeeFlow(\n transactionMeta,\n this.#gasFeeFlows,\n this.messenger,\n ) as GasFeeFlow;\n\n const ethQuery = new EthQuery(provider);\n\n const gasFeeControllerData = await this.#getGasFeeEstimates({\n networkClientId,\n });\n\n return gasFeeFlow.getGasFees({\n ethQuery,\n gasFeeControllerData,\n messenger: this.messenger,\n transactionMeta,\n });\n }\n\n /**\n * Determine the layer 1 gas fee for the given transaction parameters.\n *\n * @param request - The request object.\n * @param request.transactionParams - The transaction parameters to estimate the layer 1 gas fee for.\n * @param request.chainId - The ID of the chain where the transaction will be executed.\n * @param request.networkClientId - The ID of a specific network client to process the transaction.\n * @returns The layer 1 gas fee.\n */\n async getLayer1GasFee({\n transactionParams,\n chainId,\n networkClientId,\n }: {\n transactionParams: TransactionParams;\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Promise<Hex | undefined> {\n const provider = this.#getProvider({\n chainId,\n networkClientId,\n });\n\n return await getTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta: {\n txParams: transactionParams,\n chainId,\n } as TransactionMeta,\n });\n }\n\n 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 =\n normalizeTransactionParams(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\n const unsignedTransaction = prepareTransaction(\n chainId,\n updatedTransactionParams,\n );\n\n const signedTransaction = await this.#sign(unsignedTransaction, from);\n const rawTransaction = serializeTransaction(signedTransaction);\n\n return rawTransaction;\n }\n\n /**\n * Removes unapproved transactions from state.\n */\n clearUnapprovedTransactions(): void {\n const transactions = this.state.transactions.filter(\n ({ status }) => status !== TransactionStatus.unapproved,\n );\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState(transactions);\n });\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 *\n * @param transactionId - The ID of the transaction to stop signing.\n */\n abortTransactionSigning(transactionId: string): void {\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 /**\n * Update the transaction data of a single nested transaction within an atomic batch transaction.\n *\n * @param options - The options bag.\n * @param options.transactionId - ID of the atomic batch transaction.\n * @param options.transactionIndex - Index of the nested transaction within the atomic batch transaction.\n * @param options.transactionData - New data to set for the nested transaction.\n * @returns The updated data for the atomic batch transaction.\n */\n async updateAtomicBatchData({\n transactionId,\n transactionIndex,\n transactionData,\n }: {\n transactionId: string;\n transactionIndex: number;\n transactionData: Hex;\n }): Promise<Hex> {\n log('Updating atomic batch data', {\n transactionId,\n transactionIndex,\n transactionData,\n });\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#updateAtomicBatchData - Atomic batch data updated',\n },\n (transactionMeta) => {\n const { nestedTransactions, txParams } = transactionMeta;\n const from = txParams.from as Hex;\n const nestedTransaction = nestedTransactions?.[transactionIndex];\n\n if (!nestedTransaction) {\n throw new Error(\n `Nested transaction not found with index - ${transactionIndex}`,\n );\n }\n\n nestedTransaction.data = transactionData;\n\n const batchTransaction = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n );\n\n transactionMeta.txParams.data = batchTransaction.data;\n },\n );\n\n const draftTransaction = cloneDeep({\n ...updatedTransactionMeta,\n txParams: {\n ...updatedTransactionMeta.txParams,\n // Clear existing gas to force estimation\n gas: undefined,\n },\n });\n\n await this.#updateGasEstimate(draftTransaction);\n\n this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#updateAtomicBatchData - Gas estimate updated',\n },\n (transactionMeta) => {\n transactionMeta.txParams.gas = draftTransaction.txParams.gas;\n transactionMeta.simulationFails = draftTransaction.simulationFails;\n transactionMeta.gasLimitNoBuffer = draftTransaction.gasLimitNoBuffer;\n },\n );\n\n return updatedTransactionMeta.txParams.data as Hex;\n }\n\n /**\n * Update the batch transactions associated with a transaction.\n * These transactions will be submitted with the main transaction as a batch.\n *\n * @param request - The request object.\n * @param request.transactionId - The ID of the transaction to update.\n * @param request.batchTransactions - The new batch transactions.\n */\n updateBatchTransactions({\n transactionId,\n batchTransactions,\n }: {\n transactionId: string;\n batchTransactions: BatchTransactionParams[];\n }): void {\n log('Updating batch transactions', { transactionId, batchTransactions });\n\n this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#updateBatchTransactions - Batch transactions updated',\n },\n (transactionMeta) => {\n transactionMeta.batchTransactions = batchTransactions;\n },\n );\n }\n\n /**\n * Update the selected gas fee token for a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param contractAddress - The contract address of the selected gas fee token.\n */\n updateSelectedGasFeeToken(\n transactionId: string,\n contractAddress: Hex | undefined,\n ): void {\n this.#updateTransactionInternal({ transactionId }, (transactionMeta) => {\n const hasMatchingGasFeeToken = transactionMeta.gasFeeTokens?.some(\n (token) =>\n token.tokenAddress.toLowerCase() === contractAddress?.toLowerCase(),\n );\n\n if (contractAddress && !hasMatchingGasFeeToken) {\n throw new Error(\n `No matching gas fee token found with address - ${contractAddress}`,\n );\n }\n\n transactionMeta.selectedGasFeeToken = contractAddress;\n });\n }\n\n /**\n * Update the required transaction IDs for a transaction.\n *\n * @param request - The request object.\n * @param request.transactionId - The ID of the transaction to update.\n * @param request.requiredTransactionIds - The additional required transaction IDs.\n * @param request.append - Whether to append the IDs to any existing values. Defaults to true.\n */\n updateRequiredTransactionIds({\n transactionId,\n requiredTransactionIds,\n append,\n }: {\n transactionId: string;\n requiredTransactionIds: string[];\n append?: boolean;\n }): void {\n this.#updateTransactionInternal({ transactionId }, (transactionMeta) => {\n const { requiredTransactionIds: existing } = transactionMeta;\n\n transactionMeta.requiredTransactionIds = [\n ...(existing && append !== false ? existing : []),\n ...requiredTransactionIds,\n ];\n });\n }\n\n /**\n * Emulate a new transaction.\n *\n * @param transactionId - The transaction ID.\n */\n emulateNewTransaction(transactionId: string): void {\n const transactionMeta = this.state.transactions.find(\n (tx) => tx.id === transactionId,\n );\n\n if (!transactionMeta) {\n return;\n }\n\n if (transactionMeta.type === TransactionType.swap) {\n this.messenger.publish('TransactionController:transactionNewSwap', {\n transactionMeta,\n });\n } else if (transactionMeta.type === TransactionType.swapApproval) {\n this.messenger.publish(\n 'TransactionController:transactionNewSwapApproval',\n { transactionMeta },\n );\n }\n }\n\n /**\n * Emulate a transaction update.\n *\n * @param transactionMeta - Transaction metadata.\n */\n emulateTransactionUpdate(transactionMeta: TransactionMeta): void {\n const updatedTransactionMeta = {\n ...transactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n from: this.messenger.call('AccountsController:getSelectedAccount')\n .address,\n },\n };\n\n const transactionExists = this.state.transactions.some(\n (tx) => tx.id === updatedTransactionMeta.id,\n );\n\n if (!transactionExists) {\n this.update((state) => {\n state.transactions.push(updatedTransactionMeta);\n });\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n 'Generated from user operation',\n );\n\n this.messenger.publish('TransactionController:transactionStatusUpdated', {\n transactionMeta: updatedTransactionMeta,\n });\n }\n\n #addMetadata(transactionMeta: TransactionMeta): void {\n validateTxParams(transactionMeta.txParams);\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState([\n ...state.transactions,\n transactionMeta,\n ]);\n });\n }\n\n async #updateGasProperties(\n transactionMeta: TransactionMeta,\n { traceContext }: { traceContext?: TraceContext } = {},\n ): Promise<void> {\n const isEIP1559Compatible =\n transactionMeta.txParams.type !== TransactionEnvelopeType.legacy &&\n (await this.#getEIP1559Compatibility(transactionMeta.networkClientId));\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n const provider = this.#getProvider({ networkClientId });\n\n await this.#trace(\n { name: 'Update Gas', parentContext: traceContext },\n async () => {\n await this.#updateGasEstimate(transactionMeta);\n },\n );\n\n await this.#trace(\n { name: 'Update Gas Fees', parentContext: traceContext },\n async () =>\n await updateGasFees({\n eip1559: isEIP1559Compatible,\n ethQuery,\n gasFeeFlows: this.#gasFeeFlows,\n getGasFeeEstimates: this.#getGasFeeEstimates,\n getSavedGasFees: this.#getSavedGasFees.bind(this),\n messenger: this.messenger,\n txMeta: transactionMeta,\n }),\n );\n\n await this.#trace(\n { name: 'Update Layer 1 Gas Fees', parentContext: traceContext },\n async () =>\n await updateTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta,\n }),\n );\n }\n\n #onBootCleanup(): void {\n this.clearUnapprovedTransactions();\n this.#failIncompleteTransactions();\n }\n\n #failIncompleteTransactions(): void {\n const incompleteTransactions = this.state.transactions.filter(\n (transaction) =>\n [TransactionStatus.approved, TransactionStatus.signed].includes(\n transaction.status,\n ),\n );\n\n for (const transactionMeta of incompleteTransactions) {\n this.#failTransaction(\n transactionMeta,\n new Error('Transaction incomplete at startup'),\n );\n\n const requiredTransactionIds =\n transactionMeta.requiredTransactionIds ?? [];\n\n for (const requiredTransactionId of requiredTransactionIds) {\n const requiredTransactionMeta = this.#getTransaction(\n requiredTransactionId,\n );\n\n if (\n !requiredTransactionMeta ||\n this.#isFinalState(requiredTransactionMeta.status)\n ) {\n continue;\n }\n\n this.#failTransaction(\n requiredTransactionMeta,\n new Error('Parent transaction incomplete at startup'),\n );\n }\n }\n }\n\n async #processApproval(\n transactionMeta: TransactionMeta,\n {\n actionId,\n isExisting = false,\n publishHook,\n requireApproval,\n shouldShowRequest = true,\n traceContext,\n }: {\n actionId?: string;\n isExisting?: boolean;\n publishHook?: PublishHook;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n traceContext?: TraceContext;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.#isTransactionCompleted(transactionId);\n\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.#trace(\n { name: 'Await Approval', parentContext: traceContext },\n (context) =>\n this.#requestApproval(transactionMeta, {\n shouldShowRequest,\n traceContext: context,\n }),\n );\n\n resultCallbacks = acceptResult.resultCallbacks;\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 const approvalResult = await this.#approveTransaction(\n transactionId,\n traceContext,\n publishHook,\n );\n if (\n approvalResult === ApprovalState.SkippedViaBeforePublishHook &&\n resultCallbacks\n ) {\n resultCallbacks.success();\n }\n const updatedTransactionMeta = this.#getTransaction(\n transactionId,\n ) as TransactionMeta;\n if (approvalResult === ApprovalState.Approved) {\n this.messenger.publish(`${controllerName}:transactionApproved`, {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n }\n }\n } catch (rawError: unknown) {\n const error = rawError as Error & { code?: number; data?: Json };\n\n const { isCompleted: isTxCompleted } =\n this.#isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n if (this.#isRejectError(error)) {\n this.#rejectTransactionAndThrow(transactionId, actionId, error);\n } else {\n this.#failTransaction(meta, error, actionId);\n }\n }\n } finally {\n this.#skipSimulationTransactionIds.delete(transactionId);\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed: {\n const error = finalMeta.error as Error;\n resultCallbacks?.error(error);\n throw rpcErrors.internal(error.message);\n }\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 /**\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 * @param traceContext - The parent context for any new traces.\n * @param publishHookOverride - Custom logic to publish the transaction.\n * @returns The state of the approval.\n */\n async #approveTransaction(\n transactionId: string,\n traceContext?: unknown,\n publishHookOverride?: PublishHook,\n ): Promise<ApprovalState> {\n let clearApprovingTransactionId: (() => void) | undefined;\n let clearNonceLock: (() => void) | undefined;\n\n let transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n log('Approving transaction', transactionMeta);\n\n try {\n if (!this.#sign) {\n this.#failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return ApprovalState.NotApproved;\n } else if (!transactionMeta.chainId) {\n this.#failTransaction(\n transactionMeta,\n new Error('No chainId defined.'),\n );\n return ApprovalState.NotApproved;\n }\n\n if (this.#approvingTransactionIds.has(transactionId)) {\n log('Skipping approval as signing in progress', transactionId);\n return ApprovalState.NotApproved;\n }\n\n this.#approvingTransactionIds.add(transactionId);\n\n clearApprovingTransactionId = (): boolean =>\n this.#approvingTransactionIds.delete(transactionId);\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n const [nonce, releaseNonce] = await getNextNonce(\n transactionMeta,\n (address: string) =>\n this.#multichainTrackingHelper.getNonceLock(\n address,\n transactionMeta.networkClientId,\n ),\n );\n\n clearNonceLock = releaseNonce;\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#approveTransaction - Transaction approved',\n },\n (draftTxMeta) => {\n const { chainId, txParams } = draftTxMeta;\n const { gas, type } = txParams;\n\n draftTxMeta.status = TransactionStatus.approved;\n draftTxMeta.txParams.chainId = chainId;\n draftTxMeta.txParams.gasLimit = gas;\n draftTxMeta.txParams.nonce = nonce;\n\n if (!type && isEIP1559Transaction(txParams)) {\n draftTxMeta.txParams.type = TransactionEnvelopeType.feeMarket;\n }\n },\n );\n\n this.#onTransactionStatusChange(transactionMeta);\n\n const rawTx = await this.#trace(\n { name: 'Sign', parentContext: traceContext },\n () => this.#signTransaction(transactionMeta),\n );\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n if (!(await this.#beforePublish(transactionMeta))) {\n log('Skipping publishing transaction based on hook');\n this.messenger.publish(\n `${controllerName}:transactionPublishingSkipped`,\n transactionMeta,\n );\n return ApprovalState.SkippedViaBeforePublishHook;\n }\n\n if (!rawTx && !transactionMeta.isExternalSign) {\n return ApprovalState.NotApproved;\n }\n\n let preTxBalance: string | undefined;\n const shouldUpdatePreTxBalance =\n transactionMeta.type === TransactionType.swap;\n\n if (shouldUpdatePreTxBalance) {\n log('Determining pre-transaction balance');\n\n preTxBalance = await query(ethQuery, 'getBalance', [\n transactionMeta.txParams.from,\n ]);\n }\n\n log('Publishing transaction', transactionMeta.txParams);\n\n clearNonceLock?.();\n clearNonceLock = undefined;\n\n let publishHook = this.#defaultPublishHook.bind(this, {\n ethQuery,\n publishHookOverride,\n traceContext,\n });\n\n if (transactionMeta.batchTransactions?.length) {\n log('Found batch transactions', transactionMeta.batchTransactions);\n\n const extraTransactionsPublishHook = new ExtraTransactionsPublishHook({\n addTransactionBatch: this.addTransactionBatch.bind(this),\n getTransaction: this.#getTransactionOrThrow.bind(this),\n originalPublishHook: publishHook,\n });\n\n publishHook = extraTransactionsPublishHook.getHook();\n }\n\n const { transactionHash: hash } = await publishHook(\n transactionMeta,\n rawTx ?? '0x',\n );\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#approveTransaction - Transaction submitted',\n },\n (draftTxMeta) => {\n draftTxMeta.hash = hash;\n draftTxMeta.status = TransactionStatus.submitted;\n draftTxMeta.submittedTime = new Date().getTime();\n if (shouldUpdatePreTxBalance) {\n draftTxMeta.preTxBalance = preTxBalance;\n log('Updated pre-transaction balance', preTxBalance);\n }\n },\n );\n\n this.messenger.publish(`${controllerName}:transactionSubmitted`, {\n transactionMeta,\n });\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n transactionMeta,\n );\n this.#internalEvents.emit(`${transactionId}:finished`, transactionMeta);\n\n this.#onTransactionStatusChange(transactionMeta);\n return ApprovalState.Approved;\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 return ApprovalState.NotApproved;\n } finally {\n clearApprovingTransactionId?.();\n clearNonceLock?.();\n }\n }\n\n async #publishTransaction(\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n { skipSubmitHistory }: { skipSubmitHistory?: boolean } = {},\n ): Promise<string> {\n try {\n const transactionHash = await query(ethQuery, 'sendRawTransaction', [\n transactionMeta.rawTx,\n ]);\n\n if (skipSubmitHistory !== true) {\n this.#updateSubmitHistory(transactionMeta, transactionHash);\n }\n\n return transactionHash;\n } catch (error: unknown) {\n const errorObject = error as\n | {\n data?: { message?: string };\n message?: string;\n }\n | undefined;\n\n const errorMessage =\n errorObject?.data?.message ?? errorObject?.message ?? String(error);\n\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Rejects 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 * @param error - The error that caused the rejection.\n */\n #rejectTransaction(\n transactionId: string,\n actionId?: string,\n error?: Error,\n ): void {\n const transactionMeta = this.#getTransaction(transactionId);\n\n if (!transactionMeta) {\n return;\n }\n\n this.#deleteTransaction(transactionId);\n\n const updatedTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.rejected as const,\n error: normalizeTxError(error ?? providerErrors.userRejectedRequest()),\n };\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n updatedTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${transactionMeta.id}:finished`,\n updatedTransactionMeta,\n );\n\n this.messenger.publish(`${controllerName}:transactionRejected`, {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n\n this.#onTransactionStatusChange(updatedTransactionMeta);\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\n * transactions of the same nonce, same day and network combo can result in\n * confusing or broken experiences in the UI.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n #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 = `${String(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.#transactionHistoryLimit ||\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 #isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed ||\n status === TransactionStatus.dropped\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 #isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n async #requestApproval(\n txMeta: TransactionMeta,\n {\n shouldShowRequest,\n traceContext,\n }: { shouldShowRequest: boolean; traceContext?: TraceContext },\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 await this.#trace({\n name: 'Notification Display',\n id,\n parentContext: traceContext,\n });\n\n return (await this.messenger.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 #getTransaction(\n transactionId: string,\n ): Readonly<TransactionMeta> | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n #getTransactionOrThrow(\n transactionId: string,\n errorMessagePrefix = 'TransactionController',\n ): Readonly<TransactionMeta> {\n const txMeta = this.#getTransaction(transactionId);\n if (!txMeta) {\n throw new Error(\n `${errorMessagePrefix}: No transaction found with id ${transactionId}`,\n );\n }\n return txMeta;\n }\n\n #getApprovalId(txMeta: TransactionMeta): string {\n return String(txMeta.id);\n }\n\n #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 #getChainId(networkClientId: NetworkClientId): Hex {\n return this.#multichainTrackingHelper.getNetworkClient({ networkClientId })\n .configuration.chainId;\n }\n\n #getNetworkClientId({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClientId {\n if (networkClientId) {\n return networkClientId;\n }\n\n return this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n }).id;\n }\n\n #getEthQuery({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): EthQuery {\n return new EthQuery(this.#getProvider({ chainId, networkClientId }));\n }\n\n #getProvider({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Provider {\n return this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n networkClientId,\n }).provider;\n }\n\n #onIncomingTransactions(transactions: TransactionMeta[]): void {\n if (!transactions.length) {\n return;\n }\n\n const finalTransactions: TransactionMeta[] = [];\n\n for (const tx of transactions) {\n const { chainId } = tx;\n\n try {\n const networkClientId = this.#getNetworkClientId({ chainId });\n\n finalTransactions.push({\n ...tx,\n networkClientId,\n });\n } catch (error) {\n log('Failed to get network client ID for incoming transaction', {\n chainId,\n error,\n });\n }\n }\n\n this.update((state) => {\n const { transactions: currentTransactions } = state;\n\n state.transactions = this.#trimTransactionsForState([\n ...finalTransactions,\n ...currentTransactions,\n ]);\n\n log(\n 'Added incoming transactions to state',\n finalTransactions.length,\n finalTransactions,\n );\n });\n\n this.messenger.publish(\n `${controllerName}:incomingTransactionsReceived`,\n finalTransactions,\n );\n }\n\n #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 * @returns The new transaction.\n */\n #addExternalTransaction(transactionMeta: 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 const newTransactionMeta =\n (transactionMeta.history ?? []).length === 0 && !this.#isHistoryDisabled\n ? addInitialHistorySnapshot(transactionMeta)\n : transactionMeta;\n\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState([\n ...state.transactions,\n newTransactionMeta,\n ]);\n });\n\n return newTransactionMeta;\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 #markNonceDuplicatesDropped(transactionId: string): void {\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 sameNonceTransactions = this.state.transactions.filter(\n (transaction) =>\n transaction.id !== transactionId &&\n transaction.txParams.from === from &&\n nonce &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId &&\n transaction.type !== TransactionType.incoming,\n );\n const sameNonceTransactionIds = sameNonceTransactions.map(\n (transaction) => transaction.id,\n );\n\n if (sameNonceTransactions.length === 0) {\n return;\n }\n\n this.update((state) => {\n for (const transaction of state.transactions) {\n if (sameNonceTransactionIds.includes(transaction.id)) {\n transaction.replacedBy = transactionMeta?.hash;\n transaction.replacedById = transactionMeta?.id;\n }\n }\n });\n\n for (const transaction of this.state.transactions) {\n if (\n sameNonceTransactionIds.includes(transaction.id) &&\n transaction.status !== TransactionStatus.failed\n ) {\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 #setTransactionStatusDropped(transactionMeta: TransactionMeta): void {\n const updatedTransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.dropped as const,\n };\n this.messenger.publish(`${controllerName}:transactionDropped`, {\n transactionMeta: updatedTransactionMeta,\n });\n this.updateTransaction(\n updatedTransactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n this.#onTransactionStatusChange(updatedTransactionMeta);\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 #getTransactionWithActionId(actionId?: string): TransactionMeta | undefined {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n async #waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.#internalEvents.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 * @returns The updated TransactionMeta object.\n */\n #updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): TransactionMeta {\n const transactionMetaWithRsv = cloneDeep(transactionMeta);\n\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 transactionMetaWithRsv[key] = add0x(value.toString(16));\n }\n\n return transactionMetaWithRsv;\n }\n\n async #getEIP1559Compatibility(\n networkClientId?: NetworkClientId,\n ): Promise<boolean> {\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 async #signTransaction(\n originalTransactionMeta: TransactionMeta,\n ): Promise<string | undefined> {\n let transactionMeta = originalTransactionMeta;\n const { id: transactionId } = transactionMeta;\n\n log('Calling before sign hook', transactionMeta);\n\n const { updateTransaction } =\n (await this.#beforeSign({ transactionMeta })) ?? {};\n\n if (updateTransaction) {\n this.#updateTransactionInternal(\n { transactionId, skipResimulateCheck: true, note: 'beforeSign Hook' },\n updateTransaction,\n );\n\n log('Updated transaction after before sign hook');\n }\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n await checkGasFeeTokenBeforePublish({\n ethQuery,\n fetchGasFeeTokens: async (tx) =>\n (await this.#getGasFeeTokens(tx)).gasFeeTokens,\n transaction: transactionMeta,\n updateTransaction: (txId, fn) =>\n this.#updateTransactionInternal({ transactionId: txId }, fn),\n });\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n const { chainId, isExternalSign, txParams } = transactionMeta;\n\n if (isExternalSign) {\n log('Skipping sign as signed externally');\n return undefined;\n }\n\n const { authorizationList, from } = txParams;\n\n const signedAuthorizationList = await signAuthorizationList({\n authorizationList,\n messenger: this.messenger,\n transactionMeta,\n });\n\n if (signedAuthorizationList) {\n this.#updateTransactionInternal({ transactionId }, (txMeta) => {\n txMeta.txParams.authorizationList = signedAuthorizationList;\n });\n }\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n const finalTransactionMeta = this.#getTransactionOrThrow(transactionId);\n const { txParams: finalTxParams } = finalTransactionMeta;\n const unsignedEthTx = prepareTransaction(chainId, finalTxParams);\n\n this.#approvingTransactionIds.add(transactionId);\n\n log('Signing transaction', finalTxParams);\n\n const signedTx = await new Promise<TypedTransaction>((resolve, reject) => {\n this.#sign?.(\n unsignedEthTx,\n from,\n ...this.#getAdditionalSignArguments(finalTransactionMeta),\n ).then(resolve, reject);\n\n this.#signAbortCallbacks.set(transactionId, () =>\n reject(new Error('Signing aborted by user')),\n );\n });\n\n this.#signAbortCallbacks.delete(transactionId);\n\n if (!signedTx) {\n log('Skipping signed status as no signed transaction');\n return undefined;\n }\n\n const transactionMetaFromHook = cloneDeep(finalTransactionMeta);\n\n if (!this.#afterSign(transactionMetaFromHook, signedTx)) {\n this.updateTransaction(\n transactionMetaFromHook,\n 'TransactionController#signTransaction - Update after sign',\n );\n\n log('Skipping signed status based on hook');\n\n return undefined;\n }\n\n const transactionMetaWithRsv = {\n ...this.#updateTransactionMetaRSV(transactionMetaFromHook, signedTx),\n status: TransactionStatus.signed as const,\n txParams: finalTxParams,\n };\n\n this.updateTransaction(\n transactionMetaWithRsv,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n this.#onTransactionStatusChange(transactionMetaWithRsv);\n\n const rawTx = serializeTransaction(signedTx);\n\n const transactionMetaWithRawTx = merge({}, transactionMetaWithRsv, {\n rawTx,\n });\n\n this.updateTransaction(\n transactionMetaWithRawTx,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n\n return rawTx;\n }\n\n #onTransactionStatusChange(transactionMeta: TransactionMeta): void {\n this.messenger.publish(`${controllerName}:transactionStatusUpdated`, {\n transactionMeta,\n });\n }\n\n #getNonceTrackerTransactions(\n statuses: TransactionStatus[],\n address: string,\n chainId: string,\n ): NonceTrackerTransaction[] {\n return getAndFormatTransactionsForNonceTracker(\n chainId,\n address,\n statuses,\n this.state.transactions,\n );\n }\n\n #onConfirmedTransaction(transactionMeta: TransactionMeta): void {\n log('Processing confirmed transaction', transactionMeta.id);\n\n this.#markNonceDuplicatesDropped(transactionMeta.id);\n\n this.messenger.publish(\n `${controllerName}:transactionConfirmed`,\n transactionMeta,\n );\n\n this.#onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n this.#updatePostBalance(transactionMeta).catch((error) => {\n log('Error while updating post balance', error);\n throw error;\n });\n }\n\n async #updatePostBalance(transactionMeta: TransactionMeta): Promise<void> {\n try {\n const { networkClientId, type } = transactionMeta;\n\n if (type !== TransactionType.swap) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({ networkClientId });\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.messenger.publish(\n `${controllerName}:postTransactionBalanceUpdated`,\n {\n transactionMeta: updatedTransactionMeta,\n approvalTransactionMeta,\n },\n );\n } catch (error) {\n /* istanbul ignore next */\n log('Error while updating post transaction balance', error);\n }\n }\n\n #createNonceTracker({\n provider,\n blockTracker,\n chainId,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }): NonceTracker {\n return new NonceTracker({\n // TODO: Fix types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provider: provider as any,\n // TODO: Fix types\n blockTracker,\n getPendingTransactions: this.#getNonceTrackerPendingTransactions.bind(\n this,\n chainId,\n ),\n getConfirmedTransactions: this.#getNonceTrackerTransactions.bind(\n this,\n [TransactionStatus.confirmed],\n chainId,\n ),\n });\n }\n\n #createPendingTransactionTracker({\n provider,\n blockTracker,\n chainId,\n networkClientId,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n networkClientId: NetworkClientId;\n }): PendingTransactionTracker {\n const ethQuery = new EthQuery(provider);\n\n const pendingTransactionTracker = new PendingTransactionTracker({\n blockTracker,\n getChainId: (): Hex => chainId,\n getEthQuery: (): EthQuery => ethQuery,\n getGlobalLock: (): Promise<() => void> =>\n this.#multichainTrackingHelper.acquireNonceLockForChainIdKey({\n chainId,\n }),\n getNetworkClientId: (): NetworkClientId => networkClientId,\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n hooks: {\n beforeCheckPendingTransaction:\n this.#beforeCheckPendingTransaction.bind(this),\n },\n isResubmitEnabled: this.#pendingTransactionOptions.isResubmitEnabled,\n isTimeoutEnabled: this.#isTimeoutEnabled,\n messenger: this.messenger,\n publishTransaction: (_ethQuery, transactionMeta): Promise<string> =>\n this.#publishTransaction(_ethQuery, transactionMeta, {\n skipSubmitHistory: true,\n }),\n });\n\n this.#addPendingTransactionTrackerListeners(pendingTransactionTracker);\n\n return pendingTransactionTracker;\n }\n\n readonly #checkForPendingTransactionAndStartPolling = (): void => {\n this.#multichainTrackingHelper.checkForPendingTransactionAndStartPolling();\n };\n\n #stopAllTracking(): void {\n this.#multichainTrackingHelper.stopAllTracking();\n }\n\n #addIncomingTransactionHelperListeners(\n incomingTransactionHelper: IncomingTransactionHelper,\n ): void {\n incomingTransactionHelper.hub.on(\n 'transactions',\n this.#onIncomingTransactions.bind(this),\n );\n }\n\n #removePendingTransactionTrackerListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n ): void {\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 #addPendingTransactionTrackerListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n ): void {\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 #getNonceTrackerPendingTransactions(\n chainId: string,\n address: string,\n ): NonceTrackerTransaction[] {\n const standardPendingTransactions = this.#getNonceTrackerTransactions(\n [\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n ],\n address,\n chainId,\n );\n\n const externalPendingTransactions = this.#getExternalPendingTransactions(\n address,\n chainId,\n );\n return [...standardPendingTransactions, ...externalPendingTransactions];\n }\n\n async #publishTransactionForRetry(\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ): Promise<string> {\n try {\n return await this.#publishTransaction(ethQuery, transactionMeta);\n } catch (error: unknown) {\n if (this.#isTransactionAlreadyConfirmedError(error as Error)) {\n throw new Error('Previous transaction is already confirmed');\n }\n throw error;\n }\n }\n\n /**\n * Ensures that error is a nonce issue\n *\n * @param error - The error to check\n * @returns Whether or not the error is a nonce issue\n */\n // TODO: Replace `any` with type\n // Some networks are returning original error in the data field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #isTransactionAlreadyConfirmedError(error: any): boolean {\n return (\n Boolean(error?.message?.includes('nonce too low')) ||\n Boolean(error?.data?.message?.includes('nonce too low'))\n );\n }\n\n #getGasFeeFlows(): GasFeeFlow[] {\n if (this.#testGasFeeFlows) {\n return [new TestGasFeeFlow()];\n }\n\n return [\n new RandomisedEstimationsGasFeeFlow(),\n new LineaGasFeeFlow(),\n new DefaultGasFeeFlow(),\n ];\n }\n\n #getLayer1GasFeeFlows(): Layer1GasFeeFlow[] {\n return [new OptimismLayer1GasFeeFlow(), new ScrollLayer1GasFeeFlow()];\n }\n\n #updateTransactionInternal(\n {\n transactionId,\n note,\n skipHistory,\n skipValidation,\n skipResimulateCheck,\n }: {\n transactionId: string;\n note?: string;\n skipHistory?: boolean;\n skipValidation?: boolean;\n skipResimulateCheck?: boolean;\n },\n callback: (transactionMeta: TransactionMeta) => TransactionMeta | void,\n ): Readonly<TransactionMeta> {\n let resimulateResponse: ResimulateResponse | undefined;\n\n this.update((state) => {\n const index = state.transactions.findIndex(\n ({ id }) => id === transactionId,\n );\n\n if (index === -1) {\n throw new Error(\n `Cannot update transaction as ID not found - ${transactionId}`,\n );\n }\n\n let transactionMeta = state.transactions[index];\n\n const originalTransactionMeta = cloneDeep(transactionMeta);\n\n transactionMeta = callback(transactionMeta) ?? transactionMeta;\n\n if (skipValidation !== true) {\n transactionMeta.txParams = normalizeTransactionParams(\n transactionMeta.txParams,\n );\n\n validateTxParams(transactionMeta.txParams);\n }\n\n if (!skipResimulateCheck && this.#isSimulationEnabled()) {\n resimulateResponse = shouldResimulate(\n originalTransactionMeta,\n transactionMeta,\n );\n }\n\n const shouldSkipHistory = this.#isHistoryDisabled || skipHistory;\n\n if (!shouldSkipHistory) {\n transactionMeta = updateTransactionHistory(\n transactionMeta,\n note ?? 'Transaction updated',\n );\n }\n state.transactions[index] = transactionMeta;\n });\n\n const transactionMeta = this.#getTransaction(\n transactionId,\n ) as TransactionMeta;\n\n if (resimulateResponse?.resimulate) {\n this.#updateSimulationData(transactionMeta, {\n blockTime: resimulateResponse.blockTime,\n }).catch((error) => {\n log('Error during re-simulation', error);\n throw error;\n });\n }\n\n return transactionMeta;\n }\n\n async #updateSimulationData(\n transactionMeta: TransactionMeta,\n {\n blockTime,\n traceContext,\n }: {\n blockTime?: number;\n traceContext?: TraceContext;\n } = {},\n ): Promise<void> {\n const {\n chainId,\n id: transactionId,\n nestedTransactions,\n networkClientId,\n simulationData: prevSimulationData,\n txParams,\n } = transactionMeta;\n\n let simulationData: SimulationData = {\n error: {\n code: SimulationErrorCode.Disabled,\n message: 'Simulation disabled',\n },\n tokenBalanceChanges: [],\n };\n let gasUsed: Hex | undefined;\n let gasFeeTokens: GasFeeToken[] = [];\n let isGasFeeSponsored = false;\n\n const isBalanceChangesSkipped =\n this.#skipSimulationTransactionIds.has(transactionId);\n\n if (this.#isSimulationEnabled() && !isBalanceChangesSkipped) {\n const balanceChangesResult = await this.#trace(\n { name: 'Simulate', parentContext: traceContext },\n () =>\n getBalanceChanges({\n blockTime,\n chainId,\n ethQuery: this.#getEthQuery({ networkClientId }),\n getSimulationConfig: (url, opts) => {\n return this.#getSimulationConfig(url, {\n txMeta: transactionMeta,\n ...opts,\n });\n },\n nestedTransactions,\n txParams,\n }),\n );\n simulationData = balanceChangesResult.simulationData;\n gasUsed = balanceChangesResult.gasUsed;\n\n if (\n blockTime &&\n prevSimulationData &&\n hasSimulationDataChanged(prevSimulationData, simulationData)\n ) {\n simulationData = {\n ...simulationData,\n isUpdatedAfterSecurityCheck: true,\n };\n }\n\n const gasFeeTokensResponse = await this.#getGasFeeTokens(transactionMeta);\n\n gasFeeTokens = gasFeeTokensResponse?.gasFeeTokens ?? [];\n isGasFeeSponsored = gasFeeTokensResponse?.isGasFeeSponsored ?? false;\n }\n\n const latestTransactionMeta = this.#getTransaction(transactionId);\n\n /* istanbul ignore if */\n if (!latestTransactionMeta) {\n log(\n 'Cannot update simulation data as transaction not found',\n transactionId,\n simulationData,\n );\n\n return;\n }\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n note: 'TransactionController#updateSimulationData - Update simulation data',\n skipResimulateCheck: Boolean(blockTime),\n },\n (txMeta) => {\n txMeta.gasFeeTokens = gasFeeTokens;\n txMeta.isGasFeeSponsored = isGasFeeSponsored;\n txMeta.gasUsed = gasUsed;\n\n if (!isBalanceChangesSkipped) {\n txMeta.simulationData = simulationData;\n }\n },\n );\n\n log('Updated simulation data', transactionId, updatedTransactionMeta);\n\n await this.#runAfterSimulateHook(updatedTransactionMeta);\n }\n\n #onGasFeePollerTransactionUpdate({\n transactionId,\n gasFeeEstimates,\n gasFeeEstimatesLoaded,\n layer1GasFee,\n }: {\n transactionId: string;\n gasFeeEstimates?: GasFeeEstimates;\n gasFeeEstimatesLoaded?: boolean;\n layer1GasFee?: Hex;\n }): void {\n this.#updateTransactionInternal(\n { transactionId, skipHistory: true },\n (txMeta) => {\n updateTransactionGasProperties({\n txMeta,\n gasFeeEstimates,\n gasFeeEstimatesLoaded,\n isTxParamsGasFeeUpdatesEnabled: this.#isAutomaticGasFeeUpdateEnabled,\n layer1GasFee,\n });\n },\n );\n }\n\n #onGasFeePollerTransactionBatchUpdate({\n transactionBatchId,\n gasFeeEstimates,\n }: {\n transactionBatchId: Hex;\n gasFeeEstimates?: GasFeeEstimates;\n }): void {\n this.#updateTransactionBatch(transactionBatchId, (batch) => {\n return { ...batch, gasFeeEstimates };\n });\n }\n\n #updateTransactionBatch(\n batchId: string,\n callback: (batch: TransactionBatchMeta) => TransactionBatchMeta | void,\n ): void {\n this.update((state) => {\n const index = state.transactionBatches.findIndex((b) => b.id === batchId);\n\n if (index === -1) {\n throw new Error(`Cannot update batch, ID not found - ${batchId}`);\n }\n\n const batch = state.transactionBatches[index];\n const updated = callback(batch);\n\n state.transactionBatches[index] = updated ?? batch;\n });\n }\n\n #getSelectedAccount(): InternalAccount {\n return this.messenger.call('AccountsController:getSelectedAccount');\n }\n\n #getInternalAccounts(): Hex[] {\n const state = this.messenger.call('AccountsController:getState');\n\n return Object.values(state.internalAccounts?.accounts ?? {})\n .filter((account) => account.type === 'eip155:eoa')\n .map((account) => account.address as Hex);\n }\n\n #updateSubmitHistory(transactionMeta: TransactionMeta, hash: string): void {\n const { chainId, networkClientId, origin, rawTx, txParams } =\n transactionMeta;\n\n const { networkConfigurationsByChainId } = this.#getNetworkState();\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n\n const endpoint = networkConfiguration?.rpcEndpoints.find(\n (currentEndpoint) => currentEndpoint.networkClientId === networkClientId,\n );\n\n const networkUrl = endpoint?.url;\n const networkType = endpoint?.name ?? networkClientId;\n\n const submitHistoryEntry: SubmitHistoryEntry = {\n chainId,\n hash,\n networkType,\n networkUrl,\n origin,\n rawTransaction: rawTx as string,\n time: Date.now(),\n transaction: txParams,\n };\n\n log('Updating submit history', submitHistoryEntry);\n\n this.update((state) => {\n const { submitHistory } = state;\n\n if (submitHistory.length === SUBMIT_HISTORY_LIMIT) {\n submitHistory.pop();\n }\n\n submitHistory.unshift(submitHistoryEntry);\n });\n }\n\n async #updateGasEstimate(transactionMeta: TransactionMeta): Promise<void> {\n const { chainId, networkClientId } = transactionMeta;\n\n const isCustomNetwork =\n this.#multichainTrackingHelper.getNetworkClient({ networkClientId })\n .configuration.type === NetworkClientType.Custom;\n\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n await updateGas({\n chainId,\n ethQuery,\n isCustomNetwork,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txMeta: transactionMeta,\n });\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:addTransaction`,\n this.addTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:addTransactionBatch`,\n this.addTransactionBatch.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:confirmExternalTransaction`,\n this.confirmExternalTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:emulateNewTransaction`,\n this.emulateNewTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:emulateTransactionUpdate`,\n this.emulateTransactionUpdate.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:estimateGas`,\n this.estimateGas.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:estimateGasBatch`,\n this.estimateGasBatch.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getGasFeeTokens`,\n this.#getGasFeeTokensAction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getNonceLock`,\n this.getNonceLock.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getTransactions`,\n this.getTransactions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:updateCustodialTransaction`,\n this.updateCustodialTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:updateTransaction`,\n this.updateTransaction.bind(this),\n );\n }\n\n #deleteTransaction(transactionId: string): void {\n this.update((state) => {\n const transactions = state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n\n state.transactions = this.#trimTransactionsForState(transactions);\n });\n }\n\n #isRejectError(error: Error & { code?: number }): boolean {\n return [\n errorCodes.provider.userRejectedRequest,\n ErrorCode.RejectedUpgrade,\n ].includes(error.code as number);\n }\n\n #rejectTransactionAndThrow(\n transactionId: string,\n actionId: string | undefined,\n error: Error & { code?: number; data?: Json },\n ): void {\n this.#rejectTransaction(transactionId, actionId, error);\n\n if (error.code === errorCodes.provider.userRejectedRequest) {\n throw providerErrors.userRejectedRequest({\n message: 'MetaMask Tx Signature: User denied transaction signature.',\n data: error?.data,\n });\n }\n\n throw error;\n }\n\n #failTransaction(\n transactionMeta: TransactionMeta,\n error: Error,\n actionId?: string,\n ): void {\n let newTransactionMeta: TransactionMeta;\n\n try {\n newTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId: transactionMeta.id,\n note: 'TransactionController#failTransaction - Add error message and set status to failed',\n skipValidation: true,\n },\n (draftTransactionMeta) => {\n draftTransactionMeta.status = TransactionStatus.failed;\n\n (\n draftTransactionMeta as TransactionMeta & {\n status: TransactionStatus.failed;\n }\n ).error = normalizeTxError(error);\n },\n );\n } catch (caughtError: unknown) {\n log('Failed to mark transaction as failed', caughtError);\n\n newTransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.failed,\n error: normalizeTxError(error),\n };\n }\n\n this.messenger.publish(`${controllerName}:transactionFailed`, {\n actionId,\n error: error.message,\n transactionMeta: newTransactionMeta,\n });\n\n this.#onTransactionStatusChange(newTransactionMeta);\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n newTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${transactionMeta.id}:finished`,\n newTransactionMeta,\n );\n }\n\n async #runAfterSimulateHook(transactionMeta: TransactionMeta): Promise<void> {\n log('Calling afterSimulate hook', transactionMeta);\n\n const { id: transactionId } = transactionMeta;\n\n const result = await this.#afterSimulate({\n transactionMeta,\n });\n\n const { skipSimulation, updateTransaction } = result ?? {};\n\n if (skipSimulation) {\n this.#skipSimulationTransactionIds.add(transactionId);\n } else if (skipSimulation === false) {\n this.#skipSimulationTransactionIds.delete(transactionId);\n }\n\n if (!updateTransaction) {\n return;\n }\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n skipResimulateCheck: true,\n note: 'afterSimulate Hook',\n },\n (txMeta) => {\n txMeta.txParamsOriginal = cloneDeep(txMeta.txParams);\n updateTransaction(txMeta);\n },\n );\n\n log('Updated transaction with afterSimulate data', updatedTransactionMeta);\n }\n\n async #defaultPublishHook(\n {\n ethQuery,\n publishHookOverride,\n traceContext,\n }: {\n ethQuery: EthQuery;\n publishHookOverride?: PublishHook;\n traceContext?: TraceContext;\n },\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n let transactionHash: string | undefined;\n\n await this.#trace(\n { name: 'Publish', parentContext: traceContext },\n async () => {\n const publishHook = publishHookOverride ?? this.#publish;\n\n ({ transactionHash } = await publishHook(transactionMeta, signedTx));\n\n // eslint-disable-next-line require-atomic-updates\n transactionHash ??= await this.#publishTransaction(ethQuery, {\n ...transactionMeta,\n rawTx: signedTx,\n });\n },\n );\n\n log('Publish successful', transactionHash);\n\n return { transactionHash };\n }\n\n async #getGasFeeTokens(transaction: TransactionMeta): Promise<{\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n }> {\n const { chainId } = transaction;\n\n return await getGasFeeTokens({\n chainId,\n getSimulationConfig: this.#getSimulationConfig,\n isEIP7702GasFeeTokensEnabled: this.#isEIP7702GasFeeTokensEnabled,\n messenger: this.messenger,\n publicKeyEIP7702: this.#publicKeyEIP7702,\n transactionMeta: transaction,\n });\n }\n\n async #getGasFeeTokensAction(\n request: GetGasFeeTokensRequest,\n ): Promise<GasFeeToken[]> {\n const { chainId, data, from, to, value } = request;\n\n const ethQuery = this.#getEthQuery({ chainId });\n const delegationAddress = await getDelegationAddress(from, ethQuery);\n\n const transaction = {\n chainId,\n delegationAddress,\n isExternalSign: true,\n txParams: {\n data,\n from,\n to,\n value,\n },\n } as TransactionMeta;\n\n const result = await this.#getGasFeeTokens(transaction);\n\n return result.gasFeeTokens;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionController.cjs","sourceRoot":"","sources":["../src/TransactionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TypedTransaction } from '@ethereumjs/tx';\nimport type {\n AccountsController,\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerGetStateAction,\n} from '@metamask/accounts-controller';\nimport type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n query,\n ApprovalType,\n ORIGIN_METAMASK,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport type { TraceCallback, TraceContext } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { KeyringControllerSignEip7702AuthorizationAction } from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n BlockTracker,\n NetworkClientId,\n NetworkController,\n NetworkControllerStateChangeEvent,\n NetworkState,\n Provider,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerGetNetworkClientByIdAction,\n} from '@metamask/network-controller';\nimport { NetworkClientType } from '@metamask/network-controller';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from '@metamask/nonce-tracker';\nimport { NonceTracker } from '@metamask/nonce-tracker';\nimport type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';\nimport {\n errorCodes,\n rpcErrors,\n providerErrors,\n JsonRpcError,\n} from '@metamask/rpc-errors';\nimport type { Hex, Json } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport { EventEmitter } from 'events';\nimport { cloneDeep, mapValues, merge, noop, pickBy, sortBy } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { DefaultGasFeeFlow } from './gas-flows/DefaultGasFeeFlow';\nimport { LineaGasFeeFlow } from './gas-flows/LineaGasFeeFlow';\nimport { OptimismLayer1GasFeeFlow } from './gas-flows/OptimismLayer1GasFeeFlow';\nimport { RandomisedEstimationsGasFeeFlow } from './gas-flows/RandomisedEstimationsGasFeeFlow';\nimport { ScrollLayer1GasFeeFlow } from './gas-flows/ScrollLayer1GasFeeFlow';\nimport { TestGasFeeFlow } from './gas-flows/TestGasFeeFlow';\nimport { AccountsApiRemoteTransactionSource } from './helpers/AccountsApiRemoteTransactionSource';\nimport {\n GasFeePoller,\n updateTransactionGasProperties,\n updateTransactionGasEstimates,\n} from './helpers/GasFeePoller';\nimport type { IncomingTransactionOptions } from './helpers/IncomingTransactionHelper';\nimport { IncomingTransactionHelper } from './helpers/IncomingTransactionHelper';\nimport { MethodDataHelper } from './helpers/MethodDataHelper';\nimport { MultichainTrackingHelper } from './helpers/MultichainTrackingHelper';\nimport { PendingTransactionTracker } from './helpers/PendingTransactionTracker';\nimport type { ResimulateResponse } from './helpers/ResimulateHelper';\nimport {\n ResimulateHelper,\n hasSimulationDataChanged,\n shouldResimulate,\n} from './helpers/ResimulateHelper';\nimport { ExtraTransactionsPublishHook } from './hooks/ExtraTransactionsPublishHook';\nimport { projectLogger as log } from './logger';\nimport type {\n DappSuggestedGasFees,\n Layer1GasFeeFlow,\n SavedGasFees,\n SecurityProviderRequest,\n SendFlowHistoryEntry,\n TransactionParams,\n TransactionMeta,\n TransactionReceipt,\n SecurityAlertResponse,\n GasFeeFlow,\n SimulationData,\n GasFeeEstimates,\n GasFeeFlowResponse,\n GasPriceValue,\n FeeMarketEIP1559Values,\n SubmitHistoryEntry,\n TransactionBatchRequest,\n TransactionBatchResult,\n BatchTransactionParams,\n UpdateCustodialTransactionRequest,\n PublishHook,\n PublishBatchHook,\n GasFeeToken,\n IsAtomicBatchSupportedResult,\n IsAtomicBatchSupportedRequest,\n AfterAddHook,\n GasFeeEstimateLevel as GasFeeEstimateLevelType,\n TransactionBatchMeta,\n AfterSimulateHook,\n BeforeSignHook,\n TransactionContainerType,\n GetSimulationConfig,\n AddTransactionOptions,\n PublishHookResult,\n GetGasFeeTokensRequest,\n InternalAccount,\n} from './types';\nimport {\n GasFeeEstimateLevel,\n TransactionEnvelopeType,\n TransactionType,\n TransactionStatus,\n SimulationErrorCode,\n} from './types';\nimport { getBalanceChanges } from './utils/balance-changes';\nimport { addTransactionBatch, isAtomicBatchSupported } from './utils/batch';\nimport {\n generateEIP7702BatchTransaction,\n getDelegationAddress,\n signAuthorizationList,\n} from './utils/eip7702';\nimport { validateConfirmedExternalTransaction } from './utils/external-transactions';\nimport { updateFirstTimeInteraction } from './utils/first-time-interaction';\nimport {\n addGasBuffer,\n estimateGas,\n estimateGasBatch,\n updateGas,\n} from './utils/gas';\nimport {\n checkGasFeeTokenBeforePublish,\n getGasFeeTokens,\n} from './utils/gas-fee-tokens';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getGasFeeFlow } from './utils/gas-flow';\nimport {\n getTransactionLayer1GasFee,\n updateTransactionLayer1GasFee,\n} from './utils/layer1-gas-fee-flow';\nimport {\n getAndFormatTransactionsForNonceTracker,\n getNextNonce,\n} from './utils/nonce';\nimport { prepareTransaction, serializeTransaction } from './utils/prepare';\nimport { getTransactionParamsWithIncreasedGasFee } from './utils/retry';\nimport {\n updatePostTransactionBalance,\n updateSwapsTransaction,\n} from './utils/swaps';\nimport { determineTransactionType } from './utils/transaction-type';\nimport {\n normalizeTransactionParams,\n isEIP1559Transaction,\n validateGasValues,\n validateIfTransactionUnapproved,\n normalizeTxError,\n normalizeGasFeeValues,\n setEnvelopeType,\n} from './utils/utils';\nimport {\n ErrorCode,\n validateTransactionOrigin,\n validateTxParams,\n} from './utils/validation';\n\n/**\n * Metadata for the TransactionController state, describing how to \"anonymize\"\n * the state and which parts should be persisted.\n */\nconst metadata: StateMetadata<TransactionControllerState> = {\n transactions: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n transactionBatches: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n methodData: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastFetchedBlockNumbers: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n submitHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n};\n\nconst SUBMIT_HISTORY_LIMIT = 100;\n\n/**\n * Object with new transaction's meta and a promise resolving to the\n * transaction hash if successful.\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 /** Promise resolving to a new transaction hash. */\n result: Promise<string>;\n\n /** Meta information about this new transaction. */\n transactionMeta: TransactionMeta;\n}\n\n/**\n * Method data registry object\n */\nexport type MethodData = {\n /** Registry method raw string. */\n registryMethod: string;\n\n /** Registry method object, containing name and method arguments. */\n parsedRegistryMethod:\n | {\n name: string;\n args: { type: string }[];\n }\n | {\n // We're using `any` instead of `undefined` for compatibility with `Json`\n // TODO: Correct this type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name?: any;\n // We're using `any` instead of `undefined` for compatibility with `Json`\n // TODO: Correct this type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args?: any;\n };\n};\n\n/**\n * Transaction controller state\n */\nexport type TransactionControllerState = {\n /** A list of TransactionMeta objects. */\n transactions: TransactionMeta[];\n\n /** A list of TransactionBatchMeta objects. */\n transactionBatches: TransactionBatchMeta[];\n\n /** Object containing all known method data information. */\n methodData: Record<string, MethodData>;\n\n /** Cache to optimise incoming transaction queries. */\n lastFetchedBlockNumbers: { [key: string]: number | string };\n\n /** History of all transactions submitted from the wallet. */\n submitHistory: SubmitHistoryEntry[];\n};\n\n/**\n * Multiplier used to determine a transaction's increased gas fee during cancellation\n */\nexport const CANCEL_RATE = 1.1;\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 * Represents the `TransactionController:getState` action.\n */\nexport type TransactionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TransactionControllerState\n>;\n\n/**\n * Represents the `TransactionController:updateCustodialTransaction` action.\n */\nexport type TransactionControllerUpdateCustodialTransactionAction = {\n type: `${typeof controllerName}:updateCustodialTransaction`;\n handler: TransactionController['updateCustodialTransaction'];\n};\n\nexport type TransactionControllerEstimateGasAction = {\n type: `${typeof controllerName}:estimateGas`;\n handler: TransactionController['estimateGas'];\n};\n\nexport type TransactionControllerEstimateGasBatchAction = {\n type: `${typeof controllerName}:estimateGasBatch`;\n handler: TransactionController['estimateGasBatch'];\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 */\nexport type TransactionControllerConfirmExternalTransactionAction = {\n type: `${typeof controllerName}:confirmExternalTransaction`;\n handler: TransactionController['confirmExternalTransaction'];\n};\n\nexport type TransactionControllerGetNonceLockAction = {\n type: `${typeof controllerName}:getNonceLock`;\n handler: TransactionController['getNonceLock'];\n};\n\n/**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @returns An array of transactions matching the provided options.\n */\nexport type TransactionControllerGetTransactionsAction = {\n type: `${typeof controllerName}:getTransactions`;\n handler: TransactionController['getTransactions'];\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 be logged.\n */\nexport type TransactionControllerUpdateTransactionAction = {\n type: `${typeof controllerName}:updateTransaction`;\n handler: TransactionController['updateTransaction'];\n};\n\n/** Add a single transaction to be submitted after approval. */\nexport type TransactionControllerAddTransactionAction = {\n type: `${typeof controllerName}:addTransaction`;\n handler: TransactionController['addTransaction'];\n};\n\n/** Add a batch of transactions to be submitted after approval. */\nexport type TransactionControllerAddTransactionBatchAction = {\n type: `${typeof controllerName}:addTransactionBatch`;\n handler: TransactionController['addTransactionBatch'];\n};\n\n/**\n * Emulate a new transaction.\n *\n * @param transactionId - The transaction ID.\n */\nexport type TransactionControllerEmulateNewTransaction = {\n type: `${typeof controllerName}:emulateNewTransaction`;\n handler: TransactionController['emulateNewTransaction'];\n};\n\n/**\n * Emmulate a transaction update.\n *\n * @param transactionMeta - Transaction metadata.\n */\nexport type TransactionControllerEmulateTransactionUpdate = {\n type: `${typeof controllerName}:emulateTransactionUpdate`;\n handler: TransactionController['emulateTransactionUpdate'];\n};\n\n/**\n * Retrieve available gas fee tokens for a transaction.\n */\nexport type TransactionControllerGetGasFeeTokensAction = {\n type: `${typeof controllerName}:getGasFeeTokens`;\n handler: (request: GetGasFeeTokensRequest) => Promise<GasFeeToken[]>;\n};\n\n/**\n * The internal actions available to the TransactionController.\n */\nexport type TransactionControllerActions =\n | TransactionControllerAddTransactionAction\n | TransactionControllerAddTransactionBatchAction\n | TransactionControllerConfirmExternalTransactionAction\n | TransactionControllerEstimateGasAction\n | TransactionControllerEstimateGasBatchAction\n | TransactionControllerGetGasFeeTokensAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetStateAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateCustodialTransactionAction\n | TransactionControllerUpdateTransactionAction\n | TransactionControllerEmulateNewTransaction\n | TransactionControllerEmulateTransactionUpdate;\n\n/**\n * Configuration options for the PendingTransactionTracker\n */\nexport type PendingTransactionOptions = {\n /** Whether transaction publishing is automatically retried. */\n isResubmitEnabled?: () => boolean;\n};\n\n/** TransactionController constructor options. */\nexport type TransactionControllerOptions = {\n /** @deprecated No longer used — kept only for backward compatibility. */\n disableHistory: boolean;\n\n /** @deprecated No longer used — kept only for backward compatibility. */\n disableSendFlowHistory: boolean;\n\n /** Whether to disable additional processing on swaps transactions. */\n disableSwaps: boolean;\n\n /** Whether or not the account supports EIP-1559. */\n getCurrentAccountEIP1559Compatibility?: () => Promise<boolean>;\n\n /** Whether or not the network supports EIP-1559. */\n getCurrentNetworkEIP1559Compatibility: () => Promise<boolean>;\n\n /** Callback to retrieve pending transactions from external sources. */\n getExternalPendingTransactions?: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n /** Callback to retrieve gas fee estimates. */\n getGasFeeEstimates?: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n\n /** Gets the network client registry. */\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n /** Gets the state of the network controller. */\n getNetworkState: () => NetworkState;\n\n /** Get accounts that a given origin has permissions for. */\n getPermittedAccounts?: (origin?: string) => Promise<string[]>;\n\n /** Gets the saved gas fee config. */\n getSavedGasFees?: (chainId: Hex) => SavedGasFees | undefined;\n\n /**\n * Gets the transaction simulation configuration.\n */\n getSimulationConfig?: GetSimulationConfig;\n\n /** Configuration options for incoming transaction support. */\n incomingTransactions?: IncomingTransactionOptions & {\n /** @deprecated Ignored as Etherscan no longer used. */\n etherscanApiKeysByChainId?: Record<Hex, string>;\n };\n\n /**\n * Callback to determine whether gas fee updates should be enabled for a given transaction.\n * Returns true to enable updates, false to disable them.\n */\n isAutomaticGasFeeUpdateEnabled?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n /** Whether simulation should return EIP-7702 gas fee tokens. */\n isEIP7702GasFeeTokensEnabled?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n /** Whether the first time interaction check is enabled. */\n isFirstTimeInteractionEnabled?: () => boolean;\n\n /** Whether new transactions will be automatically simulated. */\n isSimulationEnabled?: () => boolean;\n\n /** The controller messenger. */\n messenger: TransactionControllerMessenger;\n\n /** Configuration options for pending transaction support. */\n pendingTransactions?: PendingTransactionOptions;\n\n /** Public key used to validate EIP-7702 contract signatures in feature flags. */\n publicKeyEIP7702?: Hex;\n\n /** A function for verifying a transaction, whether it is malicious or not. */\n securityProviderRequest?: SecurityProviderRequest;\n\n /** Function used to sign transactions. */\n sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n /** Initial state to set on this controller. */\n state?: Partial<TransactionControllerState>;\n\n testGasFeeFlows?: boolean;\n trace?: TraceCallback;\n\n /** Transaction history limit. */\n transactionHistoryLimit: number;\n\n /** The controller hooks. */\n hooks: {\n /** Additional logic to execute after adding a transaction. */\n afterAdd?: AfterAddHook;\n\n /** Additional logic to execute after signing a transaction. Return false to not change the status to signed. */\n afterSign?: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n /** Additional logic to execute after simulating a transaction. */\n afterSimulate?: AfterSimulateHook;\n\n /**\n * Additional logic to execute before checking pending transactions.\n * Return false to prevent the broadcast of the transaction.\n */\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n /**\n * Additional logic to execute before publishing a transaction.\n * Return false to prevent the broadcast of the transaction.\n */\n beforePublish?: (transactionMeta: TransactionMeta) => Promise<boolean>;\n\n /**\n * Additional logic to execute before signing a transaction.\n */\n beforeSign?: BeforeSignHook;\n\n /** Returns additional arguments required to sign a transaction. */\n getAdditionalSignArguments?: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n /**\n * Callback to determine whether timeout checking should be enabled for a transaction.\n * Return false to disable timeout for the transaction.\n */\n isTimeoutEnabled?: (transactionMeta: TransactionMeta) => boolean;\n\n /** Alternate logic to publish a transaction. */\n publish?: (\n transactionMeta: TransactionMeta,\n ) => Promise<{ transactionHash: string }>;\n publishBatch?: PublishBatchHook;\n };\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 */\nexport type AllowedActions =\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetStateAction\n | AddApprovalRequest\n | KeyringControllerSignEip7702AuthorizationAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerGetNetworkClientByIdAction\n | RemoteFeatureFlagControllerGetStateAction;\n\n/**\n * The external events available to the {@link TransactionController}.\n */\nexport type AllowedEvents = NetworkControllerStateChangeEvent;\n\n/**\n * Represents the `TransactionController:stateChange` event.\n */\nexport type TransactionControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TransactionControllerState\n>;\n\n/**\n * Represents the `TransactionController:incomingTransactionsReceived` event.\n */\nexport type TransactionControllerIncomingTransactionsReceivedEvent = {\n type: `${typeof controllerName}:incomingTransactionsReceived`;\n payload: [incomingTransactions: TransactionMeta[]];\n};\n\n/**\n * Represents the `TransactionController:postTransactionBalanceUpdated` event.\n */\nexport type TransactionControllerPostTransactionBalanceUpdatedEvent = {\n type: `${typeof controllerName}:postTransactionBalanceUpdated`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n approvalTransactionMeta?: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:speedUpTransactionAdded` event.\n */\nexport type TransactionControllerSpeedupTransactionAddedEvent = {\n type: `${typeof controllerName}:speedupTransactionAdded`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionApproved` event.\n */\nexport type TransactionControllerTransactionApprovedEvent = {\n type: `${typeof controllerName}:transactionApproved`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionConfirmed` event.\n */\nexport type TransactionControllerTransactionConfirmedEvent = {\n type: `${typeof controllerName}:transactionConfirmed`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionDropped` event.\n */\nexport type TransactionControllerTransactionDroppedEvent = {\n type: `${typeof controllerName}:transactionDropped`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionFailed` event.\n */\nexport type TransactionControllerTransactionFailedEvent = {\n type: `${typeof controllerName}:transactionFailed`;\n payload: [\n {\n actionId?: string;\n error: string;\n transactionMeta: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionFinished` event.\n */\nexport type TransactionControllerTransactionFinishedEvent = {\n type: `${typeof controllerName}:transactionFinished`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwapApproval` event.\n */\nexport type TransactionControllerTransactionNewSwapApprovalEvent = {\n type: `${typeof controllerName}:transactionNewSwapApproval`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwap` event.\n */\nexport type TransactionControllerTransactionNewSwapEvent = {\n type: `${typeof controllerName}:transactionNewSwap`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionNewSwapApproval` event.\n */\nexport type TransactionControllerTransactionNewSwapAndSendEvent = {\n type: `${typeof controllerName}:transactionNewSwapAndSend`;\n payload: [{ transactionMeta: TransactionMeta }];\n};\n\n/**\n * Represents the `TransactionController:transactionPublishingSkipped` event.\n */\nexport type TransactionControllerTransactionPublishingSkipped = {\n type: `${typeof controllerName}:transactionPublishingSkipped`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * Represents the `TransactionController:transactionRejected` event.\n */\nexport type TransactionControllerTransactionRejectedEvent = {\n type: `${typeof controllerName}:transactionRejected`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionStatusUpdated` event.\n */\nexport type TransactionControllerTransactionStatusUpdatedEvent = {\n type: `${typeof controllerName}:transactionStatusUpdated`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:transactionSubmitted` event.\n */\nexport type TransactionControllerTransactionSubmittedEvent = {\n type: `${typeof controllerName}:transactionSubmitted`;\n payload: [\n {\n transactionMeta: TransactionMeta;\n actionId?: string;\n },\n ];\n};\n\n/**\n * Represents the `TransactionController:unapprovedTransactionAdded` event.\n */\nexport type TransactionControllerUnapprovedTransactionAddedEvent = {\n type: `${typeof controllerName}:unapprovedTransactionAdded`;\n payload: [transactionMeta: TransactionMeta];\n};\n\n/**\n * The internal events available to the {@link TransactionController}.\n */\nexport type TransactionControllerEvents =\n | TransactionControllerIncomingTransactionsReceivedEvent\n | TransactionControllerPostTransactionBalanceUpdatedEvent\n | TransactionControllerSpeedupTransactionAddedEvent\n | TransactionControllerStateChangeEvent\n | TransactionControllerTransactionApprovedEvent\n | TransactionControllerTransactionConfirmedEvent\n | TransactionControllerTransactionDroppedEvent\n | TransactionControllerTransactionFailedEvent\n | TransactionControllerTransactionFinishedEvent\n | TransactionControllerTransactionNewSwapApprovalEvent\n | TransactionControllerTransactionNewSwapEvent\n | TransactionControllerTransactionNewSwapAndSendEvent\n | TransactionControllerTransactionPublishingSkipped\n | TransactionControllerTransactionRejectedEvent\n | TransactionControllerTransactionStatusUpdatedEvent\n | TransactionControllerTransactionSubmittedEvent\n | TransactionControllerUnapprovedTransactionAddedEvent;\n\n/**\n * The messenger of the {@link TransactionController}.\n */\nexport type TransactionControllerMessenger = Messenger<\n typeof controllerName,\n TransactionControllerActions | AllowedActions,\n TransactionControllerEvents | AllowedEvents\n>;\n\n/**\n * Possible states of the approve transaction step.\n */\nexport enum ApprovalState {\n Approved = 'approved',\n NotApproved = 'not-approved',\n SkippedViaBeforePublishHook = 'skipped-via-before-publish-hook',\n}\n\n/**\n * Get the default TransactionsController state.\n *\n * @returns The default TransactionsController state.\n */\nfunction getDefaultTransactionControllerState(): TransactionControllerState {\n return {\n methodData: {},\n transactions: [],\n transactionBatches: [],\n lastFetchedBlockNumbers: {},\n submitHistory: [],\n };\n}\n\n/**\n * Controller responsible for submitting and managing transactions.\n */\nexport class TransactionController extends BaseController<\n typeof controllerName,\n TransactionControllerState,\n TransactionControllerMessenger\n> {\n readonly #afterAdd: AfterAddHook;\n\n readonly #afterSign: (\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ) => boolean;\n\n readonly #afterSimulate: AfterSimulateHook;\n\n readonly #approvingTransactionIds: Set<string> = new Set();\n\n readonly #beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #beforePublish: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #beforeSign: BeforeSignHook;\n\n readonly #gasFeeFlows: GasFeeFlow[];\n\n readonly #getAdditionalSignArguments: (\n transactionMeta: TransactionMeta,\n ) => (TransactionMeta | undefined)[];\n\n readonly #getCurrentAccountEIP1559Compatibility: () => Promise<boolean>;\n\n readonly #getCurrentNetworkEIP1559Compatibility: (\n networkClientId?: NetworkClientId,\n ) => Promise<boolean>;\n\n readonly #getExternalPendingTransactions: (\n address: string,\n chainId?: string,\n ) => NonceTrackerTransaction[];\n\n readonly #getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n\n readonly #getNetworkState: () => NetworkState;\n\n readonly #getPermittedAccounts?: (origin?: string) => Promise<string[]>;\n\n readonly #getSavedGasFees: (chainId: Hex) => SavedGasFees | undefined;\n\n readonly #getSimulationConfig: GetSimulationConfig;\n\n readonly #incomingTransactionHelper: IncomingTransactionHelper;\n\n readonly #incomingTransactionOptions: IncomingTransactionOptions & {\n etherscanApiKeysByChainId?: Record<Hex, string>;\n };\n\n readonly #internalEvents = new EventEmitter();\n\n readonly #isAutomaticGasFeeUpdateEnabled: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n\n readonly #isEIP7702GasFeeTokensEnabled: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #isFirstTimeInteractionEnabled: () => boolean;\n\n readonly #isSimulationEnabled: () => boolean;\n\n readonly #isSwapsDisabled: boolean;\n\n readonly #isTimeoutEnabled: (transactionMeta: TransactionMeta) => boolean;\n\n readonly #layer1GasFeeFlows: Layer1GasFeeFlow[];\n\n readonly #methodDataHelper: MethodDataHelper;\n\n readonly #multichainTrackingHelper: MultichainTrackingHelper;\n\n readonly #pendingTransactionOptions: PendingTransactionOptions;\n\n readonly #publicKeyEIP7702?: Hex;\n\n readonly #publish: (\n transactionMeta: TransactionMeta,\n rawTx: string,\n ) => Promise<{ transactionHash?: string }>;\n\n readonly #publishBatchHook?: PublishBatchHook;\n\n readonly #securityProviderRequest?: SecurityProviderRequest;\n\n readonly #sign?: (\n transaction: TypedTransaction,\n from: string,\n transactionMeta?: TransactionMeta,\n ) => Promise<TypedTransaction>;\n\n readonly #signAbortCallbacks: Map<string, () => void> = new Map();\n\n readonly #skipSimulationTransactionIds: Set<string> = new Set();\n\n readonly #testGasFeeFlows: boolean;\n\n readonly #trace: TraceCallback;\n\n readonly #transactionHistoryLimit: number;\n\n /**\n * Constructs a TransactionController.\n *\n * @param options - The controller options.\n */\n constructor(options: TransactionControllerOptions) {\n const {\n disableSwaps,\n getCurrentAccountEIP1559Compatibility,\n getCurrentNetworkEIP1559Compatibility,\n getExternalPendingTransactions,\n getGasFeeEstimates,\n getNetworkClientRegistry,\n getNetworkState,\n getPermittedAccounts,\n getSavedGasFees,\n getSimulationConfig,\n hooks,\n incomingTransactions = {},\n isAutomaticGasFeeUpdateEnabled,\n isEIP7702GasFeeTokensEnabled,\n isFirstTimeInteractionEnabled,\n isSimulationEnabled,\n messenger,\n pendingTransactions = {},\n publicKeyEIP7702,\n securityProviderRequest,\n sign,\n state,\n testGasFeeFlows,\n trace,\n transactionHistoryLimit = 40,\n } = options;\n\n super({\n name: controllerName,\n metadata,\n messenger,\n state: {\n ...getDefaultTransactionControllerState(),\n ...state,\n },\n });\n\n this.messenger = messenger;\n\n this.#afterAdd =\n hooks?.afterAdd ?? ((): ReturnType<AfterAddHook> => Promise.resolve({}));\n this.#afterSign = hooks?.afterSign ?? ((): boolean => true);\n this.#afterSimulate =\n hooks?.afterSimulate ??\n ((): ReturnType<AfterSimulateHook> => Promise.resolve({}));\n this.#beforeCheckPendingTransaction =\n /* istanbul ignore next */\n hooks?.beforeCheckPendingTransaction ??\n ((): Promise<boolean> => Promise.resolve(true));\n this.#beforePublish =\n hooks?.beforePublish ?? ((): Promise<boolean> => Promise.resolve(true));\n this.#beforeSign =\n hooks?.beforeSign ??\n ((): ReturnType<BeforeSignHook> => Promise.resolve({}));\n this.#getAdditionalSignArguments =\n hooks?.getAdditionalSignArguments ??\n ((): (TransactionMeta | undefined)[] => []);\n this.#getCurrentAccountEIP1559Compatibility =\n getCurrentAccountEIP1559Compatibility ??\n ((): Promise<boolean> => Promise.resolve(true));\n this.#getCurrentNetworkEIP1559Compatibility =\n getCurrentNetworkEIP1559Compatibility;\n this.#getExternalPendingTransactions =\n getExternalPendingTransactions ?? ((): NonceTrackerTransaction[] => []);\n this.#getGasFeeEstimates =\n getGasFeeEstimates ??\n ((): Promise<GasFeeState> => Promise.resolve({} as GasFeeState));\n this.#getNetworkState = getNetworkState;\n this.#getPermittedAccounts = getPermittedAccounts;\n this.#getSavedGasFees =\n getSavedGasFees ?? ((_chainId): SavedGasFees | undefined => undefined);\n this.#getSimulationConfig =\n getSimulationConfig ??\n ((): ReturnType<GetSimulationConfig> => Promise.resolve({}));\n this.#incomingTransactionOptions = incomingTransactions;\n this.#isAutomaticGasFeeUpdateEnabled =\n isAutomaticGasFeeUpdateEnabled ??\n ((_txMeta: TransactionMeta): boolean => false);\n this.#isEIP7702GasFeeTokensEnabled =\n isEIP7702GasFeeTokensEnabled ??\n ((): Promise<boolean> => Promise.resolve(false));\n this.#isFirstTimeInteractionEnabled =\n isFirstTimeInteractionEnabled ?? ((): boolean => true);\n this.#isSimulationEnabled = isSimulationEnabled ?? ((): boolean => true);\n this.#isSwapsDisabled = disableSwaps ?? false;\n this.#isTimeoutEnabled = hooks?.isTimeoutEnabled ?? ((): boolean => true);\n this.#pendingTransactionOptions = pendingTransactions;\n this.#publicKeyEIP7702 = publicKeyEIP7702;\n this.#publish =\n hooks?.publish ??\n ((): Promise<{ transactionHash?: string }> =>\n Promise.resolve({ transactionHash: undefined }));\n this.#publishBatchHook = hooks?.publishBatch;\n this.#securityProviderRequest = securityProviderRequest;\n this.#sign = sign;\n this.#testGasFeeFlows = testGasFeeFlows === true;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n this.#transactionHistoryLimit = transactionHistoryLimit;\n\n const findNetworkClientIdByChainId = (chainId: Hex): string => {\n return this.messenger.call(\n `NetworkController:findNetworkClientIdByChainId`,\n chainId,\n );\n };\n\n this.#multichainTrackingHelper = new MultichainTrackingHelper({\n findNetworkClientIdByChainId,\n getNetworkClientById: ((networkClientId: NetworkClientId) => {\n return this.messenger.call(\n `NetworkController:getNetworkClientById`,\n networkClientId,\n );\n }) as NetworkController['getNetworkClientById'],\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners:\n this.#removePendingTransactionTrackerListeners.bind(this),\n createNonceTracker: this.#createNonceTracker.bind(this),\n createPendingTransactionTracker:\n this.#createPendingTransactionTracker.bind(this),\n onNetworkStateChange: (listener): void => {\n this.messenger.subscribe('NetworkController:stateChange', listener);\n },\n });\n\n this.#multichainTrackingHelper.initialize();\n this.#gasFeeFlows = this.#getGasFeeFlows();\n this.#layer1GasFeeFlows = this.#getLayer1GasFeeFlows();\n\n const gasFeePoller = new GasFeePoller({\n findNetworkClientIdByChainId,\n gasFeeFlows: this.#gasFeeFlows,\n getGasFeeControllerEstimates: this.#getGasFeeEstimates,\n getProvider: (networkClientId): Provider =>\n this.#getProvider({ networkClientId }),\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n getTransactionBatches: (): TransactionBatchMeta[] =>\n this.state.transactionBatches,\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n onStateChange: (listener): void => {\n this.messenger.subscribe('TransactionController:stateChange', listener);\n },\n });\n\n gasFeePoller.hub.on(\n 'transaction-updated',\n this.#onGasFeePollerTransactionUpdate.bind(this),\n );\n\n gasFeePoller.hub.on(\n 'transaction-batch-updated',\n this.#onGasFeePollerTransactionBatchUpdate.bind(this),\n );\n\n this.#methodDataHelper = new MethodDataHelper({\n getProvider: (networkClientId): Provider =>\n this.#getProvider({ networkClientId }),\n getState: (): Record<string, MethodData> => this.state.methodData,\n });\n\n this.#methodDataHelper.hub.on(\n 'update',\n ({ fourBytePrefix, methodData }) => {\n this.update((_state) => {\n _state.methodData[fourBytePrefix] = methodData;\n });\n },\n );\n\n this.#incomingTransactionHelper = new IncomingTransactionHelper({\n client: this.#incomingTransactionOptions.client,\n getCurrentAccount: (): ReturnType<\n AccountsController['getSelectedAccount']\n > => this.#getSelectedAccount(),\n getLocalTransactions: (): TransactionMeta[] => this.state.transactions,\n includeTokenTransfers:\n this.#incomingTransactionOptions.includeTokenTransfers,\n isEnabled: this.#incomingTransactionOptions.isEnabled,\n messenger: this.messenger,\n remoteTransactionSource: new AccountsApiRemoteTransactionSource(),\n trimTransactions: this.#trimTransactionsForState.bind(this),\n updateTransactions: this.#incomingTransactionOptions.updateTransactions,\n });\n\n this.#addIncomingTransactionHelperListeners(\n this.#incomingTransactionHelper,\n );\n\n // when transactionsController state changes\n // check for pending transactions and start polling if there are any\n this.messenger.subscribe(\n 'TransactionController:stateChange',\n this.#checkForPendingTransactionAndStartPolling,\n );\n\n // eslint-disable-next-line no-new\n new ResimulateHelper({\n simulateTransaction: this.#updateSimulationData.bind(this),\n onTransactionsUpdate: (listener): void => {\n this.messenger.subscribe(\n 'TransactionController:stateChange',\n listener,\n (controllerState) => controllerState.transactions,\n );\n },\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n });\n\n this.#onBootCleanup();\n this.#checkForPendingTransactionAndStartPolling();\n this.#registerActionHandlers();\n }\n\n /**\n * Stops polling and removes listeners to prepare the controller for garbage collection.\n */\n destroy(): void {\n this.#stopAllTracking();\n }\n\n /**\n * Handle new method data request.\n *\n * @param fourBytePrefix - The method prefix.\n * @param networkClientId - The ID of the network client used to fetch the method data.\n * @returns The method data object corresponding to the given signature prefix.\n */\n async handleMethodData(\n fourBytePrefix: string,\n networkClientId: NetworkClientId,\n ): Promise<MethodData> {\n return this.#methodDataHelper.lookup(fourBytePrefix, networkClientId);\n }\n\n /**\n * Add a batch of transactions to be submitted after approval.\n *\n * @param request - Request object containing the transactions to add.\n * @returns Result object containing the generated batch ID.\n */\n async addTransactionBatch(\n request: TransactionBatchRequest,\n ): Promise<TransactionBatchResult> {\n const { blockTracker } = this.messenger.call(\n `NetworkController:getNetworkClientById`,\n request.networkClientId,\n );\n\n return await addTransactionBatch({\n addTransaction: this.addTransaction.bind(this),\n estimateGas: this.estimateGas.bind(this),\n getChainId: this.#getChainId.bind(this),\n getEthQuery: (networkClientId) => this.#getEthQuery({ networkClientId }),\n getGasFeeEstimates: this.#getGasFeeEstimates,\n getInternalAccounts: this.#getInternalAccounts.bind(this),\n getSimulationConfig: this.#getSimulationConfig.bind(this),\n getPendingTransactionTracker: (networkClientId: NetworkClientId) =>\n this.#createPendingTransactionTracker({\n provider: this.#getProvider({ networkClientId }),\n blockTracker,\n chainId: this.#getChainId(networkClientId),\n networkClientId,\n }),\n getTransaction: (transactionId) =>\n this.#getTransactionOrThrow(transactionId),\n isSimulationEnabled: this.#isSimulationEnabled,\n messenger: this.messenger,\n publishBatchHook: this.#publishBatchHook,\n publicKeyEIP7702: this.#publicKeyEIP7702,\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => this.#publishTransaction(ethQuery, transactionMeta) as Promise<Hex>,\n request,\n signTransaction: this.#signTransaction.bind(this),\n update: this.update.bind(this),\n updateTransaction: this.#updateTransactionInternal.bind(this),\n });\n }\n\n /**\n * Determine which chains support atomic batch transactions with the given account address.\n *\n * @param request - Request object containing the account address and other parameters.\n * @returns Result object containing the supported chains and related information.\n */\n async isAtomicBatchSupported(\n request: IsAtomicBatchSupportedRequest,\n ): Promise<IsAtomicBatchSupportedResult> {\n return isAtomicBatchSupported({\n ...request,\n getEthQuery: (chainId) => this.#getEthQuery({ chainId }),\n messenger: this.messenger,\n publicKeyEIP7702: this.#publicKeyEIP7702,\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. A `<tx.id>:unapproved` hub event will be emitted once added.\n *\n * @param txParams - Standard parameters for an Ethereum transaction.\n * @param options - Additional options to control how the transaction is added.\n * @returns Object containing a promise resolving to the transaction hash if approved.\n */\n async addTransaction(\n txParams: TransactionParams,\n options: AddTransactionOptions,\n ): Promise<Result> {\n log('Adding transaction', txParams, options);\n\n const {\n actionId,\n assetsFiatValues,\n batchId,\n deviceConfirmedOn,\n disableGasBuffer,\n gasFeeToken,\n isGasFeeIncluded,\n isGasFeeSponsored,\n method,\n nestedTransactions,\n networkClientId,\n origin,\n publishHook,\n requestId,\n requireApproval,\n securityAlertResponse,\n skipInitialGasEstimate,\n swaps = {},\n traceContext,\n type,\n } = options;\n\n // eslint-disable-next-line no-param-reassign\n txParams = normalizeTransactionParams(txParams);\n\n if (!this.#multichainTrackingHelper.has(networkClientId)) {\n throw new Error(`Network client not found - ${networkClientId}`);\n }\n\n const chainId = this.#getChainId(networkClientId);\n\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const permittedAddresses =\n origin === undefined\n ? undefined\n : await this.#getPermittedAccounts?.(origin);\n\n const internalAccounts = this.#getInternalAccounts();\n\n await validateTransactionOrigin({\n data: txParams.data,\n from: txParams.from,\n internalAccounts,\n origin,\n permittedAddresses,\n txParams,\n type,\n });\n\n const delegationAddressPromise = getDelegationAddress(\n txParams.from as Hex,\n ethQuery,\n ).catch(() => undefined);\n\n const isEIP1559Compatible =\n await this.#getEIP1559Compatibility(networkClientId);\n\n validateTxParams(txParams, isEIP1559Compatible, chainId);\n\n if (!txParams.type) {\n // Determine transaction type based on transaction parameters and network compatibility\n setEnvelopeType(txParams, isEIP1559Compatible);\n }\n\n const isDuplicateBatchId =\n batchId?.length &&\n this.state.transactions.some(\n (tx) => tx.batchId?.toLowerCase() === batchId?.toLowerCase(),\n );\n\n if (isDuplicateBatchId && origin && origin !== ORIGIN_METAMASK) {\n throw new JsonRpcError(\n ErrorCode.DuplicateBundleId,\n 'Batch ID already exists',\n );\n }\n\n const dappSuggestedGasFees = this.#generateDappSuggestedGasFees(\n txParams,\n origin,\n );\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 let addedTransactionMeta: TransactionMeta = existingTransactionMeta\n ? cloneDeep(existingTransactionMeta)\n : {\n // Add actionId to txMeta to check if same actionId is seen again\n actionId,\n assetsFiatValues,\n batchId,\n chainId,\n dappSuggestedGasFees,\n deviceConfirmedOn,\n disableGasBuffer,\n id: random(),\n isGasFeeTokenIgnoredIfBalance: Boolean(gasFeeToken),\n isGasFeeIncluded,\n isGasFeeSponsored,\n isFirstTimeInteraction: undefined,\n nestedTransactions,\n networkClientId,\n origin,\n requestId,\n securityAlertResponse,\n selectedGasFeeToken: gasFeeToken,\n status: TransactionStatus.unapproved as const,\n time: Date.now(),\n txParams,\n type: transactionType,\n userEditedGasLimit: false,\n verifiedOnBlockchain: false,\n };\n\n const { updateTransaction } = await this.#afterAdd({\n transactionMeta: addedTransactionMeta,\n });\n\n if (updateTransaction) {\n log('Updating transaction using afterAdd hook');\n\n addedTransactionMeta.txParamsOriginal = cloneDeep(\n addedTransactionMeta.txParams,\n );\n\n updateTransaction(addedTransactionMeta);\n }\n\n // eslint-disable-next-line no-negated-condition\n if (!skipInitialGasEstimate) {\n await this.#trace(\n { name: 'Estimate Gas Properties', parentContext: traceContext },\n (context) =>\n this.#updateGasProperties(addedTransactionMeta, {\n traceContext: context,\n }),\n );\n } else {\n const newTransactionMeta = cloneDeep(addedTransactionMeta);\n\n this.#updateGasProperties(newTransactionMeta)\n .then(() => {\n this.#updateTransactionInternal(\n {\n transactionId: newTransactionMeta.id,\n skipResimulateCheck: true,\n skipValidation: true,\n },\n (tx) => {\n tx.txParams.gas = newTransactionMeta.txParams.gas;\n tx.txParams.gasPrice = newTransactionMeta.txParams.gasPrice;\n tx.txParams.maxFeePerGas =\n newTransactionMeta.txParams.maxFeePerGas;\n tx.txParams.maxPriorityFeePerGas =\n newTransactionMeta.txParams.maxPriorityFeePerGas;\n },\n );\n\n return undefined;\n })\n .catch(noop);\n }\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 addedTransactionMeta,\n method,\n );\n // eslint-disable-next-line require-atomic-updates\n addedTransactionMeta.securityProviderResponse =\n securityProviderResponse;\n }\n\n addedTransactionMeta = updateSwapsTransaction(\n addedTransactionMeta,\n transactionType,\n swaps,\n {\n isSwapsDisabled: this.#isSwapsDisabled,\n cancelTransaction: this.#rejectTransaction.bind(this),\n messenger: this.messenger,\n },\n );\n\n this.#addMetadata(addedTransactionMeta);\n\n delegationAddressPromise\n .then((delegationAddress) => {\n this.#updateTransactionInternal(\n {\n transactionId: addedTransactionMeta.id,\n skipResimulateCheck: true,\n skipValidation: true,\n },\n (tx) => {\n tx.delegationAddress = delegationAddress;\n },\n );\n\n return undefined;\n })\n .catch(noop);\n\n // eslint-disable-next-line no-negated-condition\n if (requireApproval !== false) {\n this.#updateSimulationData(addedTransactionMeta, {\n traceContext,\n }).catch((error) => {\n log('Error while updating simulation data', error);\n throw error;\n });\n\n updateFirstTimeInteraction({\n existingTransactions: this.state.transactions,\n getTransaction: (transactionId: string) =>\n this.#getTransaction(transactionId),\n isFirstTimeInteractionEnabled: this.#isFirstTimeInteractionEnabled,\n trace: this.#trace,\n traceContext,\n transactionMeta: addedTransactionMeta,\n updateTransaction: this.#updateTransactionInternal.bind(this),\n }).catch((error) => {\n log('Error while updating first interaction properties', error);\n });\n } else {\n log(\n 'Skipping simulation & first interaction update as approval not required',\n );\n }\n\n this.messenger.publish(\n `${controllerName}:unapprovedTransactionAdded`,\n addedTransactionMeta,\n );\n }\n\n return {\n result: this.#processApproval(addedTransactionMeta, {\n actionId,\n isExisting: Boolean(existingTransactionMeta),\n publishHook,\n requireApproval,\n traceContext,\n }),\n transactionMeta: addedTransactionMeta,\n };\n }\n\n startIncomingTransactionPolling(): void {\n this.#incomingTransactionHelper.start();\n }\n\n stopIncomingTransactionPolling(): void {\n this.#incomingTransactionHelper.stop();\n }\n\n /**\n * Update the incoming transactions by polling the remote transaction source.\n *\n * @param request - Request object.\n * @param request.tags - Additional tags to identify the source of the request.\n */\n async updateIncomingTransactions({\n tags,\n }: { tags?: string[] } = {}): Promise<void> {\n await this.#incomingTransactionHelper.update({ tags });\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 ): Promise<void> {\n await this.#retryTransaction({\n actionId,\n estimatedBaseFee,\n gasValues,\n label: 'cancel',\n rate: CANCEL_RATE,\n transactionId,\n transactionType: TransactionType.cancel,\n prepareTransactionParams: (txParams) => {\n delete txParams.data;\n txParams.to = txParams.from;\n txParams.value = '0x0';\n },\n afterSubmit: (newTransactionMeta) => {\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n newTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${newTransactionMeta.id}:finished`,\n newTransactionMeta,\n );\n },\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 ): Promise<void> {\n await this.#retryTransaction({\n actionId,\n estimatedBaseFee,\n gasValues,\n label: 'speed up',\n rate: SPEED_UP_RATE,\n transactionId,\n transactionType: TransactionType.retry,\n afterSubmit: (newTransactionMeta) => {\n this.messenger.publish(\n `${controllerName}:speedupTransactionAdded`,\n newTransactionMeta,\n );\n },\n });\n }\n\n async #retryTransaction({\n actionId,\n afterSubmit,\n estimatedBaseFee,\n gasValues,\n label,\n prepareTransactionParams,\n rate,\n transactionId,\n transactionType,\n }: {\n actionId?: string;\n afterSubmit?: (transactionMeta: TransactionMeta) => void;\n estimatedBaseFee?: string;\n gasValues?: GasPriceValue | FeeMarketEIP1559Values;\n label: string;\n prepareTransactionParams?: (txParams: TransactionParams) => void;\n rate: number;\n transactionId: string;\n transactionType: TransactionType;\n }): Promise<void> {\n // If transaction is found for same action id, do not create a new 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 // eslint-disable-next-line no-param-reassign\n gasValues = normalizeGasFeeValues(gasValues);\n validateGasValues(gasValues);\n }\n\n log(`Creating ${label} transaction`, transactionId, gasValues);\n\n const transactionMeta = this.#getTransaction(transactionId);\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 const newTxParams: TransactionParams =\n getTransactionParamsWithIncreasedGasFee(\n transactionMeta.txParams,\n rate,\n gasValues,\n );\n\n prepareTransactionParams?.(newTxParams);\n\n const unsignedEthTx = prepareTransaction(\n transactionMeta.chainId,\n newTxParams,\n );\n\n const signedTx = await this.#sign(\n unsignedEthTx,\n transactionMeta.txParams.from,\n );\n\n const transactionMetaWithRsv = this.#updateTransactionMetaRSV(\n transactionMeta,\n signedTx,\n );\n\n const rawTx = serializeTransaction(signedTx);\n const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;\n\n const oldFee = newTxParams.maxFeePerGas\n ? transactionMetaWithRsv.txParams.maxFeePerGas\n : transactionMetaWithRsv.txParams.gasPrice;\n\n log(`Submitting ${label} transaction`, {\n oldFee,\n newFee,\n txParams: newTxParams,\n });\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n const newTransactionMeta = {\n ...transactionMetaWithRsv,\n actionId,\n estimatedBaseFee,\n id: random(),\n originalGasEstimate: transactionMeta.txParams.gas,\n originalType: transactionMeta.type,\n rawTx,\n time: Date.now(),\n txParams: newTxParams,\n type: transactionType,\n };\n\n const hash = await this.#publishTransactionForRetry(ethQuery, {\n ...newTransactionMeta,\n origin: label,\n });\n\n newTransactionMeta.hash = hash;\n\n this.#addMetadata(newTransactionMeta);\n\n // speedUpTransaction has no approval request, so we assume the user has already approved the transaction\n this.messenger.publish(`${controllerName}:transactionApproved`, {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n this.messenger.publish(`${controllerName}:transactionSubmitted`, {\n transactionMeta: newTransactionMeta,\n actionId,\n });\n\n afterSubmit?.(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 * @param options - Additional options for the estimate.\n * @param options.ignoreDelegationSignatures - Ignore signature errors if submitting delegations to the DelegationManager.\n * @returns The gas and gas price.\n */\n async estimateGas(\n transaction: TransactionParams,\n networkClientId: NetworkClientId,\n {\n ignoreDelegationSignatures,\n }: {\n ignoreDelegationSignatures?: boolean;\n } = {},\n ): Promise<{\n gas: string;\n simulationFails: TransactionMeta['simulationFails'];\n }> {\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const { estimatedGas, simulationFails } = await estimateGas({\n chainId: this.#getChainId(networkClientId),\n ethQuery,\n ignoreDelegationSignatures,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txParams: transaction,\n });\n\n return { gas: estimatedGas, simulationFails };\n }\n\n /**\n * Estimates required gas for a batch of transactions.\n *\n * @param request - Request object.\n * @param request.chainId - Chain ID of the transactions.\n * @param request.from - Address of the sender.\n * @param request.transactions - Array of transactions within a batch request.\n * @returns Object containing the gas limit.\n */\n async estimateGasBatch({\n chainId,\n from,\n transactions,\n }: {\n chainId: Hex;\n from: Hex;\n transactions: BatchTransactionParams[];\n }): Promise<{ totalGasLimit: number; gasLimits: number[] }> {\n const ethQuery = this.#getEthQuery({\n chainId,\n });\n\n return estimateGasBatch({\n chainId,\n ethQuery,\n from,\n getSimulationConfig: this.#getSimulationConfig,\n isAtomicBatchSupported: this.isAtomicBatchSupported.bind(this),\n messenger: this.messenger,\n transactions,\n });\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 * @returns The buffered estimated gas and whether the estimation failed.\n */\n async estimateGasBuffered(\n transaction: TransactionParams,\n multiplier: number,\n networkClientId: NetworkClientId,\n ): Promise<{\n gas: string;\n simulationFails: TransactionMeta['simulationFails'];\n }> {\n const ethQuery = this.#getEthQuery({\n networkClientId,\n });\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas({\n chainId: this.#getChainId(networkClientId),\n ethQuery,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txParams: transaction,\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 be logged.\n */\n updateTransaction(transactionMeta: TransactionMeta, note: string): void {\n const { id: transactionId } = transactionMeta;\n\n this.#updateTransactionInternal({ transactionId }, () => ({\n ...transactionMeta,\n }));\n\n log('Transaction updated', { transactionId, note });\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 ): void {\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 updatedTransactionMeta = {\n ...transactionMeta,\n securityAlertResponse,\n };\n this.updateTransaction(\n updatedTransactionMeta,\n `${controllerName}:updatesecurityAlertResponse - securityAlertResponse updated`,\n );\n }\n\n /**\n * Remove transactions from state.\n *\n * @param options - The options bag.\n * @param options.address - Remove transactions from this account only. Defaults to all accounts.\n * @param options.chainId - Remove transactions for the specified chain only. Defaults to all chains.\n */\n wipeTransactions({\n address,\n chainId,\n }: {\n address?: string;\n chainId?: string;\n } = {}): void {\n if (!chainId && !address) {\n this.update((state) => {\n state.transactions = [];\n });\n\n return;\n }\n\n const newTransactions = this.state.transactions.filter(\n ({ chainId: txChainId, txParams, type }) => {\n const isMatchingNetwork = !chainId || chainId === txChainId;\n\n if (!isMatchingNetwork) {\n return true;\n }\n\n const isMatchingAddress =\n !address ||\n txParams.from?.toLowerCase() === address.toLowerCase() ||\n (type === TransactionType.incoming &&\n txParams.to?.toLowerCase() === address.toLowerCase());\n\n return !isMatchingAddress;\n },\n );\n\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState(newTransactions);\n });\n }\n\n /**\n * @deprecated No longer used. Kept only to avoid breaking changes. It now performs no operations.\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 transactionMeta.\n */\n updateTransactionSendFlowHistory(\n transactionID: string,\n _currentSendFlowHistoryLength: number,\n _sendFlowHistoryToAdd: SendFlowHistoryEntry[],\n ): TransactionMeta {\n // Return the transaction unchanged\n return this.#getTransactionOrThrow(transactionID);\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 ): Promise<void> {\n // Run validation and add external transaction to state.\n const newTransactionMeta = this.#addExternalTransaction(transactionMeta);\n\n try {\n const transactionId = newTransactionMeta.id;\n\n // Make sure status is confirmed and define gasUsed as in receipt.\n const updatedTransactionMeta = {\n ...newTransactionMeta,\n status: TransactionStatus.confirmed as const,\n txReceipt: transactionReceipt,\n };\n if (baseFeePerGas) {\n updatedTransactionMeta.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 updatedTransactionMeta,\n `${controllerName}:confirmExternalTransaction - Add external transaction`,\n );\n this.#onTransactionStatusChange(updatedTransactionMeta);\n\n // Intentional given potential duration of process.\n this.#updatePostBalance(updatedTransactionMeta).catch((error) => {\n /* istanbul ignore next */\n log('Error while updating post balance', error);\n throw error;\n });\n\n this.messenger.publish(\n `${controllerName}:transactionConfirmed`,\n updatedTransactionMeta,\n );\n } catch (error) {\n console.error('Failed to confirm external transaction', error);\n }\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: userFeeLevelParam,\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 const clonedTransactionMeta = cloneDeep(transactionMeta);\n const isTransactionGasFeeEstimatesExists = transactionMeta.gasFeeEstimates;\n const isAutomaticGasFeeUpdateEnabled =\n this.#isAutomaticGasFeeUpdateEnabled(transactionMeta);\n const userFeeLevel = userFeeLevelParam as GasFeeEstimateLevelType;\n const isOneOfFeeLevelSelected =\n Object.values(GasFeeEstimateLevel).includes(userFeeLevel);\n const shouldUpdateTxParamsGasFees =\n isTransactionGasFeeEstimatesExists &&\n isAutomaticGasFeeUpdateEnabled &&\n isOneOfFeeLevelSelected;\n\n if (shouldUpdateTxParamsGasFees) {\n updateTransactionGasEstimates({\n txMeta: clonedTransactionMeta,\n userFeeLevel,\n });\n }\n\n const txParamsUpdate = {\n gas,\n gasLimit,\n };\n\n if (shouldUpdateTxParamsGasFees) {\n // Get updated values from clonedTransactionMeta if we're using automated fee updates\n Object.assign(txParamsUpdate, {\n gasPrice: clonedTransactionMeta.txParams.gasPrice,\n maxPriorityFeePerGas:\n clonedTransactionMeta.txParams.maxPriorityFeePerGas,\n maxFeePerGas: clonedTransactionMeta.txParams.maxFeePerGas,\n });\n } else {\n Object.assign(txParamsUpdate, {\n gasPrice,\n maxPriorityFeePerGas,\n maxFeePerGas,\n });\n }\n\n const transactionGasFees = {\n txParams: pickBy(txParamsUpdate),\n defaultGasEstimates,\n estimateUsed,\n estimateSuggested,\n originalGasEstimate,\n userEditedGasLimit,\n userFeeLevel,\n };\n\n const filteredTransactionGasFees = pickBy(transactionGasFees);\n\n this.#updateTransactionInternal(\n {\n transactionId,\n skipResimulateCheck: true,\n },\n (draftTxMeta) => {\n const { txParams, ...otherProps } = filteredTransactionGasFees;\n Object.assign(draftTxMeta, otherProps);\n if (txParams) {\n Object.assign(draftTxMeta.txParams, txParams);\n }\n },\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 `${controllerName}:updatePreviousGasParams - Previous gas values updated`,\n );\n\n return this.#getTransaction(transactionId) as TransactionMeta;\n }\n\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n return this.#multichainTrackingHelper.getNonceLock(\n address,\n networkClientId,\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.containerTypes - Container types applied to the parameters.\n * @param params.data - Data to pass with the transaction.\n * @param params.from - Address to send the transaction from.\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.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.\n * @param params.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.\n * @param params.updateType - Whether to update the transaction type. Defaults to `true`.\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 containerTypes,\n data,\n from,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n updateType,\n value,\n }: {\n containerTypes?: TransactionContainerType[];\n data?: string;\n from?: string;\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n updateType?: boolean;\n value?: string;\n },\n ): Promise<Readonly<TransactionMeta> | undefined> {\n const transactionMeta = this.#getTransaction(txId);\n\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 maxFeePerGas,\n maxPriorityFeePerGas,\n },\n } as Partial<TransactionMeta>;\n\n editableParams.txParams = pickBy(\n editableParams.txParams,\n ) as TransactionParams;\n\n const updatedTransaction = merge({}, transactionMeta, editableParams);\n\n const { networkClientId } = transactionMeta;\n const provider = this.#getProvider({ networkClientId });\n const ethQuery = new EthQuery(provider);\n\n if (updateType !== false) {\n const { type } = await determineTransactionType(\n updatedTransaction.txParams,\n ethQuery,\n );\n\n updatedTransaction.type = type;\n }\n\n if (containerTypes) {\n updatedTransaction.containerTypes = containerTypes;\n }\n\n await updateTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta: updatedTransaction,\n });\n\n this.updateTransaction(\n updatedTransaction,\n `Update Editable Params for ${txId}`,\n );\n\n return this.#getTransaction(txId);\n }\n\n /**\n * Update the isActive state of a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param isActive - The active state.\n */\n setTransactionActive(transactionId: string, isActive: boolean): void {\n const transactionMeta = this.#getTransaction(transactionId);\n\n if (!transactionMeta) {\n throw new Error(`Transaction with id ${transactionId} not found`);\n }\n\n this.#updateTransactionInternal(\n {\n transactionId,\n skipValidation: true,\n skipResimulateCheck: true,\n },\n (updatedTransactionMeta) => {\n updatedTransactionMeta.isActive = isActive;\n },\n );\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 * @param opts - Options bag.\n * @param opts.hasNonce - Whether the transactions already have a nonce.\n * @returns The raw transactions.\n */\n async approveTransactionsWithSameNonce(\n listOfTxParams: (TransactionParams & { chainId: Hex })[] = [],\n { hasNonce }: { hasNonce?: boolean } = {},\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 { chainId } = initialTx;\n const networkClientId = this.#getNetworkClientId({ chainId });\n const initialTxAsEthTx = prepareTransaction(chainId, initialTx);\n const initialTxAsSerializedHex = serializeTransaction(initialTxAsEthTx);\n\n if (this.#approvingTransactionIds.has(initialTxAsSerializedHex)) {\n return '';\n }\n\n this.#approvingTransactionIds.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 const requiresNonce = hasNonce !== true;\n\n nonceLock = requiresNonce\n ? await this.getNonceLock(fromAddress, networkClientId)\n : undefined;\n\n const nonce = nonceLock\n ? add0x(nonceLock.nextNonce.toString(16))\n : initialTx.nonce;\n\n if (nonceLock) {\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n }\n\n rawTransactions = await Promise.all(\n listOfTxParams.map((txParams) => {\n txParams.nonce = nonce;\n return this.#signExternalTransaction(txParams.chainId, txParams);\n }),\n );\n } catch (error) {\n log('Error while signing transactions with same nonce', error);\n // Must set transaction to submitted/failed before releasing lock\n // continue with error chain\n throw error;\n } finally {\n nonceLock?.releaseLock();\n this.#approvingTransactionIds.delete(initialTxAsSerializedHex);\n }\n return rawTransactions;\n }\n\n /**\n * Update a custodial transaction.\n *\n * @param request - The custodial transaction update request.\n *\n * @returns The updated transaction metadata.\n */\n updateCustodialTransaction(\n request: UpdateCustodialTransactionRequest,\n ): TransactionMeta {\n const {\n transactionId,\n errorMessage,\n hash,\n status,\n gasLimit,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n type,\n } = request;\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 (\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 const updatedTransactionMeta = merge(\n {},\n transactionMeta,\n pickBy({ hash, status }),\n ) as TransactionMeta;\n\n if (updatedTransactionMeta.status === TransactionStatus.submitted) {\n updatedTransactionMeta.submittedTime = new Date().getTime();\n }\n\n if (updatedTransactionMeta.status === TransactionStatus.failed) {\n updatedTransactionMeta.error = normalizeTxError(new Error(errorMessage));\n }\n\n // Update txParams properties with a single pickBy operation\n updatedTransactionMeta.txParams = merge(\n {},\n updatedTransactionMeta.txParams,\n pickBy({\n gasLimit,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n type,\n }),\n );\n\n // Special case for type change to legacy\n if (type === TransactionEnvelopeType.legacy) {\n delete updatedTransactionMeta.txParams.maxFeePerGas;\n delete updatedTransactionMeta.txParams.maxPriorityFeePerGas;\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n `${controllerName}:updateCustodialTransaction - Custodial transaction updated`,\n );\n\n if (\n status &&\n [TransactionStatus.submitted, TransactionStatus.failed].includes(status)\n ) {\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n updatedTransactionMeta,\n );\n this.#internalEvents.emit(\n `${updatedTransactionMeta.id}:finished`,\n updatedTransactionMeta,\n );\n }\n\n return updatedTransactionMeta;\n }\n\n /**\n * Search transaction metadata for matching entries.\n *\n * @param opts - Options bag.\n * @param opts.initialList - The transactions to search. Defaults to the current state.\n * @param opts.limit - The maximum number of transactions to return. No limit by default.\n * @param opts.searchCriteria - An object containing values or functions for transaction properties to filter transactions with.\n * @returns An array of transactions matching the provided options.\n */\n getTransactions({\n initialList,\n limit,\n searchCriteria = {},\n }: {\n initialList?: TransactionMeta[];\n limit?: number;\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchCriteria?: any;\n } = {}): TransactionMeta[] {\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 (value: any): boolean => value === 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 // 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 async estimateGasFee({\n transactionParams,\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n transactionParams: TransactionParams;\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Promise<GasFeeFlowResponse> {\n const { id: networkClientId, provider } =\n this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n });\n\n const transactionMeta = {\n txParams: transactionParams,\n chainId,\n networkClientId,\n } as TransactionMeta;\n\n // Guaranteed as the default gas fee flow matches all transactions.\n const gasFeeFlow = getGasFeeFlow(\n transactionMeta,\n this.#gasFeeFlows,\n this.messenger,\n ) as GasFeeFlow;\n\n const ethQuery = new EthQuery(provider);\n\n const gasFeeControllerData = await this.#getGasFeeEstimates({\n networkClientId,\n });\n\n return gasFeeFlow.getGasFees({\n ethQuery,\n gasFeeControllerData,\n messenger: this.messenger,\n transactionMeta,\n });\n }\n\n /**\n * Determine the layer 1 gas fee for the given transaction parameters.\n *\n * @param request - The request object.\n * @param request.transactionParams - The transaction parameters to estimate the layer 1 gas fee for.\n * @param request.chainId - The ID of the chain where the transaction will be executed.\n * @param request.networkClientId - The ID of a specific network client to process the transaction.\n * @returns The layer 1 gas fee.\n */\n async getLayer1GasFee({\n transactionParams,\n chainId,\n networkClientId,\n }: {\n transactionParams: TransactionParams;\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Promise<Hex | undefined> {\n const provider = this.#getProvider({\n chainId,\n networkClientId,\n });\n\n return await getTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta: {\n txParams: transactionParams,\n chainId,\n } as TransactionMeta,\n });\n }\n\n 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 =\n normalizeTransactionParams(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\n const unsignedTransaction = prepareTransaction(\n chainId,\n updatedTransactionParams,\n );\n\n const signedTransaction = await this.#sign(unsignedTransaction, from);\n const rawTransaction = serializeTransaction(signedTransaction);\n\n return rawTransaction;\n }\n\n /**\n * Removes unapproved transactions from state.\n */\n clearUnapprovedTransactions(): void {\n const transactions = this.state.transactions.filter(\n ({ status }) => status !== TransactionStatus.unapproved,\n );\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState(transactions);\n });\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 *\n * @param transactionId - The ID of the transaction to stop signing.\n */\n abortTransactionSigning(transactionId: string): void {\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 /**\n * Update the transaction data of a single nested transaction within an atomic batch transaction.\n *\n * @param options - The options bag.\n * @param options.transactionId - ID of the atomic batch transaction.\n * @param options.transactionIndex - Index of the nested transaction within the atomic batch transaction.\n * @param options.transactionData - New data to set for the nested transaction.\n * @returns The updated data for the atomic batch transaction.\n */\n async updateAtomicBatchData({\n transactionId,\n transactionIndex,\n transactionData,\n }: {\n transactionId: string;\n transactionIndex: number;\n transactionData: Hex;\n }): Promise<Hex> {\n log('Updating atomic batch data', {\n transactionId,\n transactionIndex,\n transactionData,\n });\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n },\n (transactionMeta) => {\n const { nestedTransactions, txParams } = transactionMeta;\n const from = txParams.from as Hex;\n const nestedTransaction = nestedTransactions?.[transactionIndex];\n\n if (!nestedTransaction) {\n throw new Error(\n `Nested transaction not found with index - ${transactionIndex}`,\n );\n }\n\n nestedTransaction.data = transactionData;\n\n const batchTransaction = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n );\n\n transactionMeta.txParams.data = batchTransaction.data;\n },\n );\n\n const draftTransaction = cloneDeep({\n ...updatedTransactionMeta,\n txParams: {\n ...updatedTransactionMeta.txParams,\n // Clear existing gas to force estimation\n gas: undefined,\n },\n });\n\n await this.#updateGasEstimate(draftTransaction);\n\n this.#updateTransactionInternal(\n {\n transactionId,\n },\n (transactionMeta) => {\n transactionMeta.txParams.gas = draftTransaction.txParams.gas;\n transactionMeta.simulationFails = draftTransaction.simulationFails;\n transactionMeta.gasLimitNoBuffer = draftTransaction.gasLimitNoBuffer;\n },\n );\n\n return updatedTransactionMeta.txParams.data as Hex;\n }\n\n /**\n * Update the batch transactions associated with a transaction.\n * These transactions will be submitted with the main transaction as a batch.\n *\n * @param request - The request object.\n * @param request.transactionId - The ID of the transaction to update.\n * @param request.batchTransactions - The new batch transactions.\n */\n updateBatchTransactions({\n transactionId,\n batchTransactions,\n }: {\n transactionId: string;\n batchTransactions: BatchTransactionParams[];\n }): void {\n log('Updating batch transactions', { transactionId, batchTransactions });\n\n this.#updateTransactionInternal(\n {\n transactionId,\n },\n (transactionMeta) => {\n transactionMeta.batchTransactions = batchTransactions;\n },\n );\n }\n\n /**\n * Update the selected gas fee token for a transaction.\n *\n * @param transactionId - The ID of the transaction to update.\n * @param contractAddress - The contract address of the selected gas fee token.\n */\n updateSelectedGasFeeToken(\n transactionId: string,\n contractAddress: Hex | undefined,\n ): void {\n this.#updateTransactionInternal({ transactionId }, (transactionMeta) => {\n const hasMatchingGasFeeToken = transactionMeta.gasFeeTokens?.some(\n (token) =>\n token.tokenAddress.toLowerCase() === contractAddress?.toLowerCase(),\n );\n\n if (contractAddress && !hasMatchingGasFeeToken) {\n throw new Error(\n `No matching gas fee token found with address - ${contractAddress}`,\n );\n }\n\n transactionMeta.selectedGasFeeToken = contractAddress;\n });\n }\n\n /**\n * Update the required transaction IDs for a transaction.\n *\n * @param request - The request object.\n * @param request.transactionId - The ID of the transaction to update.\n * @param request.requiredTransactionIds - The additional required transaction IDs.\n * @param request.append - Whether to append the IDs to any existing values. Defaults to true.\n */\n updateRequiredTransactionIds({\n transactionId,\n requiredTransactionIds,\n append,\n }: {\n transactionId: string;\n requiredTransactionIds: string[];\n append?: boolean;\n }): void {\n this.#updateTransactionInternal({ transactionId }, (transactionMeta) => {\n const { requiredTransactionIds: existing } = transactionMeta;\n\n transactionMeta.requiredTransactionIds = [\n ...(existing && append !== false ? existing : []),\n ...requiredTransactionIds,\n ];\n });\n }\n\n /**\n * Emulate a new transaction.\n *\n * @param transactionId - The transaction ID.\n */\n emulateNewTransaction(transactionId: string): void {\n const transactionMeta = this.state.transactions.find(\n (tx) => tx.id === transactionId,\n );\n\n if (!transactionMeta) {\n return;\n }\n\n if (transactionMeta.type === TransactionType.swap) {\n this.messenger.publish('TransactionController:transactionNewSwap', {\n transactionMeta,\n });\n } else if (transactionMeta.type === TransactionType.swapApproval) {\n this.messenger.publish(\n 'TransactionController:transactionNewSwapApproval',\n { transactionMeta },\n );\n }\n }\n\n /**\n * Emulate a transaction update.\n *\n * @param transactionMeta - Transaction metadata.\n */\n emulateTransactionUpdate(transactionMeta: TransactionMeta): void {\n const updatedTransactionMeta = {\n ...transactionMeta,\n txParams: {\n ...transactionMeta.txParams,\n from: this.messenger.call('AccountsController:getSelectedAccount')\n .address,\n },\n };\n\n const transactionExists = this.state.transactions.some(\n (tx) => tx.id === updatedTransactionMeta.id,\n );\n\n if (!transactionExists) {\n this.update((state) => {\n state.transactions.push(updatedTransactionMeta);\n });\n }\n\n this.updateTransaction(\n updatedTransactionMeta,\n 'Generated from user operation',\n );\n\n this.messenger.publish('TransactionController:transactionStatusUpdated', {\n transactionMeta: updatedTransactionMeta,\n });\n }\n\n #addMetadata(transactionMeta: TransactionMeta): void {\n validateTxParams(transactionMeta.txParams);\n this.update((state) => {\n state.transactions = this.#trimTransactionsForState([\n ...state.transactions,\n transactionMeta,\n ]);\n });\n }\n\n async #updateGasProperties(\n transactionMeta: TransactionMeta,\n { traceContext }: { traceContext?: TraceContext } = {},\n ): Promise<void> {\n const isEIP1559Compatible =\n transactionMeta.txParams.type !== TransactionEnvelopeType.legacy &&\n (await this.#getEIP1559Compatibility(transactionMeta.networkClientId));\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n const provider = this.#getProvider({ networkClientId });\n\n await this.#trace(\n { name: 'Update Gas', parentContext: traceContext },\n async () => {\n await this.#updateGasEstimate(transactionMeta);\n },\n );\n\n await this.#trace(\n { name: 'Update Gas Fees', parentContext: traceContext },\n async () =>\n await updateGasFees({\n eip1559: isEIP1559Compatible,\n ethQuery,\n gasFeeFlows: this.#gasFeeFlows,\n getGasFeeEstimates: this.#getGasFeeEstimates,\n getSavedGasFees: this.#getSavedGasFees.bind(this),\n messenger: this.messenger,\n txMeta: transactionMeta,\n }),\n );\n\n await this.#trace(\n { name: 'Update Layer 1 Gas Fees', parentContext: traceContext },\n async () =>\n await updateTransactionLayer1GasFee({\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n messenger: this.messenger,\n provider,\n transactionMeta,\n }),\n );\n }\n\n #onBootCleanup(): void {\n this.clearUnapprovedTransactions();\n this.#failIncompleteTransactions();\n }\n\n #failIncompleteTransactions(): void {\n const incompleteTransactions = this.state.transactions.filter(\n (transaction) =>\n [TransactionStatus.approved, TransactionStatus.signed].includes(\n transaction.status,\n ),\n );\n\n for (const transactionMeta of incompleteTransactions) {\n this.#failTransaction(\n transactionMeta,\n new Error('Transaction incomplete at startup'),\n );\n\n const requiredTransactionIds =\n transactionMeta.requiredTransactionIds ?? [];\n\n for (const requiredTransactionId of requiredTransactionIds) {\n const requiredTransactionMeta = this.#getTransaction(\n requiredTransactionId,\n );\n\n if (\n !requiredTransactionMeta ||\n this.#isFinalState(requiredTransactionMeta.status)\n ) {\n continue;\n }\n\n this.#failTransaction(\n requiredTransactionMeta,\n new Error('Parent transaction incomplete at startup'),\n );\n }\n }\n }\n\n async #processApproval(\n transactionMeta: TransactionMeta,\n {\n actionId,\n isExisting = false,\n publishHook,\n requireApproval,\n shouldShowRequest = true,\n traceContext,\n }: {\n actionId?: string;\n isExisting?: boolean;\n publishHook?: PublishHook;\n requireApproval?: boolean | undefined;\n shouldShowRequest?: boolean;\n traceContext?: TraceContext;\n },\n ): Promise<string> {\n const transactionId = transactionMeta.id;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n const { meta, isCompleted } = this.#isTransactionCompleted(transactionId);\n\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.#trace(\n { name: 'Await Approval', parentContext: traceContext },\n (context) =>\n this.#requestApproval(transactionMeta, {\n shouldShowRequest,\n traceContext: context,\n }),\n );\n\n resultCallbacks = acceptResult.resultCallbacks;\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 const approvalResult = await this.#approveTransaction(\n transactionId,\n traceContext,\n publishHook,\n );\n if (\n approvalResult === ApprovalState.SkippedViaBeforePublishHook &&\n resultCallbacks\n ) {\n resultCallbacks.success();\n }\n const updatedTransactionMeta = this.#getTransaction(\n transactionId,\n ) as TransactionMeta;\n if (approvalResult === ApprovalState.Approved) {\n this.messenger.publish(`${controllerName}:transactionApproved`, {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n }\n }\n } catch (rawError: unknown) {\n const error = rawError as Error & { code?: number; data?: Json };\n\n const { isCompleted: isTxCompleted } =\n this.#isTransactionCompleted(transactionId);\n\n if (!isTxCompleted) {\n if (this.#isRejectError(error)) {\n this.#rejectTransactionAndThrow(transactionId, actionId, error);\n } else {\n this.#failTransaction(meta, error, actionId);\n }\n }\n } finally {\n this.#skipSimulationTransactionIds.delete(transactionId);\n }\n }\n\n const finalMeta = await finishedPromise;\n\n switch (finalMeta?.status) {\n case TransactionStatus.failed: {\n const error = finalMeta.error as Error;\n resultCallbacks?.error(error);\n throw rpcErrors.internal(error.message);\n }\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 /**\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 * @param traceContext - The parent context for any new traces.\n * @param publishHookOverride - Custom logic to publish the transaction.\n * @returns The state of the approval.\n */\n async #approveTransaction(\n transactionId: string,\n traceContext?: unknown,\n publishHookOverride?: PublishHook,\n ): Promise<ApprovalState> {\n let clearApprovingTransactionId: (() => void) | undefined;\n let clearNonceLock: (() => void) | undefined;\n\n let transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n log('Approving transaction', transactionMeta);\n\n try {\n if (!this.#sign) {\n this.#failTransaction(\n transactionMeta,\n new Error('No sign method defined.'),\n );\n return ApprovalState.NotApproved;\n } else if (!transactionMeta.chainId) {\n this.#failTransaction(\n transactionMeta,\n new Error('No chainId defined.'),\n );\n return ApprovalState.NotApproved;\n }\n\n if (this.#approvingTransactionIds.has(transactionId)) {\n log('Skipping approval as signing in progress', transactionId);\n return ApprovalState.NotApproved;\n }\n\n this.#approvingTransactionIds.add(transactionId);\n\n clearApprovingTransactionId = (): boolean =>\n this.#approvingTransactionIds.delete(transactionId);\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n const [nonce, releaseNonce] = await getNextNonce(\n transactionMeta,\n (address: string) =>\n this.#multichainTrackingHelper.getNonceLock(\n address,\n transactionMeta.networkClientId,\n ),\n );\n\n clearNonceLock = releaseNonce;\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n },\n (draftTxMeta) => {\n const { chainId, txParams } = draftTxMeta;\n const { gas, type } = txParams;\n\n draftTxMeta.status = TransactionStatus.approved;\n draftTxMeta.txParams.chainId = chainId;\n draftTxMeta.txParams.gasLimit = gas;\n draftTxMeta.txParams.nonce = nonce;\n\n if (!type && isEIP1559Transaction(txParams)) {\n draftTxMeta.txParams.type = TransactionEnvelopeType.feeMarket;\n }\n },\n );\n\n this.#onTransactionStatusChange(transactionMeta);\n\n const rawTx = await this.#trace(\n { name: 'Sign', parentContext: traceContext },\n () => this.#signTransaction(transactionMeta),\n );\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n if (!(await this.#beforePublish(transactionMeta))) {\n log('Skipping publishing transaction based on hook');\n this.messenger.publish(\n `${controllerName}:transactionPublishingSkipped`,\n transactionMeta,\n );\n return ApprovalState.SkippedViaBeforePublishHook;\n }\n\n if (!rawTx && !transactionMeta.isExternalSign) {\n return ApprovalState.NotApproved;\n }\n\n let preTxBalance: string | undefined;\n const shouldUpdatePreTxBalance =\n transactionMeta.type === TransactionType.swap;\n\n if (shouldUpdatePreTxBalance) {\n log('Determining pre-transaction balance');\n\n preTxBalance = await query(ethQuery, 'getBalance', [\n transactionMeta.txParams.from,\n ]);\n }\n\n log('Publishing transaction', transactionMeta.txParams);\n\n clearNonceLock?.();\n clearNonceLock = undefined;\n\n let publishHook = this.#defaultPublishHook.bind(this, {\n ethQuery,\n publishHookOverride,\n traceContext,\n });\n\n if (transactionMeta.batchTransactions?.length) {\n log('Found batch transactions', transactionMeta.batchTransactions);\n\n const extraTransactionsPublishHook = new ExtraTransactionsPublishHook({\n addTransactionBatch: this.addTransactionBatch.bind(this),\n getTransaction: this.#getTransactionOrThrow.bind(this),\n originalPublishHook: publishHook,\n });\n\n publishHook = extraTransactionsPublishHook.getHook();\n }\n\n const { transactionHash: hash } = await publishHook(\n transactionMeta,\n rawTx ?? '0x',\n );\n\n // eslint-disable-next-line require-atomic-updates\n transactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n },\n (draftTxMeta) => {\n draftTxMeta.hash = hash;\n draftTxMeta.status = TransactionStatus.submitted;\n draftTxMeta.submittedTime = new Date().getTime();\n if (shouldUpdatePreTxBalance) {\n draftTxMeta.preTxBalance = preTxBalance;\n log('Updated pre-transaction balance', preTxBalance);\n }\n },\n );\n\n this.messenger.publish(`${controllerName}:transactionSubmitted`, {\n transactionMeta,\n });\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n transactionMeta,\n );\n this.#internalEvents.emit(`${transactionId}:finished`, transactionMeta);\n\n this.#onTransactionStatusChange(transactionMeta);\n return ApprovalState.Approved;\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 return ApprovalState.NotApproved;\n } finally {\n clearApprovingTransactionId?.();\n clearNonceLock?.();\n }\n }\n\n async #publishTransaction(\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n { skipSubmitHistory }: { skipSubmitHistory?: boolean } = {},\n ): Promise<string> {\n try {\n const transactionHash = await query(ethQuery, 'sendRawTransaction', [\n transactionMeta.rawTx,\n ]);\n\n if (skipSubmitHistory !== true) {\n this.#updateSubmitHistory(transactionMeta, transactionHash);\n }\n\n return transactionHash;\n } catch (error: unknown) {\n const errorObject = error as\n | {\n data?: { message?: string };\n message?: string;\n }\n | undefined;\n\n const errorMessage =\n errorObject?.data?.message ?? errorObject?.message ?? String(error);\n\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Rejects 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 * @param error - The error that caused the rejection.\n */\n #rejectTransaction(\n transactionId: string,\n actionId?: string,\n error?: Error,\n ): void {\n const transactionMeta = this.#getTransaction(transactionId);\n\n if (!transactionMeta) {\n return;\n }\n\n this.#deleteTransaction(transactionId);\n\n const updatedTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.rejected as const,\n error: normalizeTxError(error ?? providerErrors.userRejectedRequest()),\n };\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n updatedTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${transactionMeta.id}:finished`,\n updatedTransactionMeta,\n );\n\n this.messenger.publish(`${controllerName}:transactionRejected`, {\n transactionMeta: updatedTransactionMeta,\n actionId,\n });\n\n this.#onTransactionStatusChange(updatedTransactionMeta);\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\n * transactions of the same nonce, same day and network combo can result in\n * confusing or broken experiences in the UI.\n *\n * @param transactions - The transactions to be applied to the state.\n * @returns The trimmed list of transactions.\n */\n #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 = `${String(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.#transactionHistoryLimit ||\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 #isFinalState(status: TransactionStatus): boolean {\n return (\n status === TransactionStatus.rejected ||\n status === TransactionStatus.confirmed ||\n status === TransactionStatus.failed ||\n status === TransactionStatus.dropped\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 #isLocalFinalState(status: TransactionStatus): boolean {\n return [\n TransactionStatus.confirmed,\n TransactionStatus.failed,\n TransactionStatus.rejected,\n TransactionStatus.submitted,\n ].includes(status);\n }\n\n async #requestApproval(\n txMeta: TransactionMeta,\n {\n shouldShowRequest,\n traceContext,\n }: { shouldShowRequest: boolean; traceContext?: TraceContext },\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 await this.#trace({\n name: 'Notification Display',\n id,\n parentContext: traceContext,\n });\n\n return (await this.messenger.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 #getTransaction(\n transactionId: string,\n ): Readonly<TransactionMeta> | undefined {\n const { transactions } = this.state;\n return transactions.find(({ id }) => id === transactionId);\n }\n\n #getTransactionOrThrow(\n transactionId: string,\n errorMessagePrefix = 'TransactionController',\n ): Readonly<TransactionMeta> {\n const txMeta = this.#getTransaction(transactionId);\n if (!txMeta) {\n throw new Error(\n `${errorMessagePrefix}: No transaction found with id ${transactionId}`,\n );\n }\n return txMeta;\n }\n\n #getApprovalId(txMeta: TransactionMeta): string {\n return String(txMeta.id);\n }\n\n #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 #getChainId(networkClientId: NetworkClientId): Hex {\n return this.#multichainTrackingHelper.getNetworkClient({ networkClientId })\n .configuration.chainId;\n }\n\n #getNetworkClientId({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClientId {\n if (networkClientId) {\n return networkClientId;\n }\n\n return this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n }).id;\n }\n\n #getEthQuery({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): EthQuery {\n return new EthQuery(this.#getProvider({ chainId, networkClientId }));\n }\n\n #getProvider({\n chainId,\n networkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): Provider {\n return this.#multichainTrackingHelper.getNetworkClient({\n chainId,\n networkClientId,\n }).provider;\n }\n\n #onIncomingTransactions(transactions: TransactionMeta[]): void {\n if (!transactions.length) {\n return;\n }\n\n const finalTransactions: TransactionMeta[] = [];\n\n for (const tx of transactions) {\n const { chainId } = tx;\n\n try {\n const networkClientId = this.#getNetworkClientId({ chainId });\n\n finalTransactions.push({\n ...tx,\n networkClientId,\n });\n } catch (error) {\n log('Failed to get network client ID for incoming transaction', {\n chainId,\n error,\n });\n }\n }\n\n this.update((state) => {\n const { transactions: currentTransactions } = state;\n\n state.transactions = this.#trimTransactionsForState([\n ...finalTransactions,\n ...currentTransactions,\n ]);\n\n log(\n 'Added incoming transactions to state',\n finalTransactions.length,\n finalTransactions,\n );\n });\n\n this.messenger.publish(\n `${controllerName}:incomingTransactionsReceived`,\n finalTransactions,\n );\n }\n\n #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 * @returns The new transaction.\n */\n #addExternalTransaction(transactionMeta: 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 this.update((state) => {\n state.transactions = this.#trimTransactionsForState([\n ...state.transactions,\n transactionMeta,\n ]);\n });\n\n return transactionMeta;\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 #markNonceDuplicatesDropped(transactionId: string): void {\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 sameNonceTransactions = this.state.transactions.filter(\n (transaction) =>\n transaction.id !== transactionId &&\n transaction.txParams.from === from &&\n nonce &&\n transaction.txParams.nonce === nonce &&\n transaction.chainId === chainId &&\n transaction.type !== TransactionType.incoming,\n );\n const sameNonceTransactionIds = sameNonceTransactions.map(\n (transaction) => transaction.id,\n );\n\n if (sameNonceTransactions.length === 0) {\n return;\n }\n\n this.update((state) => {\n for (const transaction of state.transactions) {\n if (sameNonceTransactionIds.includes(transaction.id)) {\n transaction.replacedBy = transactionMeta?.hash;\n transaction.replacedById = transactionMeta?.id;\n }\n }\n });\n\n for (const transaction of this.state.transactions) {\n if (\n sameNonceTransactionIds.includes(transaction.id) &&\n transaction.status !== TransactionStatus.failed\n ) {\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 #setTransactionStatusDropped(transactionMeta: TransactionMeta): void {\n const updatedTransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.dropped as const,\n };\n this.messenger.publish(`${controllerName}:transactionDropped`, {\n transactionMeta: updatedTransactionMeta,\n });\n this.updateTransaction(\n updatedTransactionMeta,\n 'TransactionController#setTransactionStatusDropped - Transaction dropped',\n );\n this.#onTransactionStatusChange(updatedTransactionMeta);\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 #getTransactionWithActionId(actionId?: string): TransactionMeta | undefined {\n return this.state.transactions.find(\n (transaction) => actionId && transaction.actionId === actionId,\n );\n }\n\n async #waitForTransactionFinished(\n transactionId: string,\n ): Promise<TransactionMeta> {\n return new Promise((resolve) => {\n this.#internalEvents.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 * @returns The updated TransactionMeta object.\n */\n #updateTransactionMetaRSV(\n transactionMeta: TransactionMeta,\n signedTx: TypedTransaction,\n ): TransactionMeta {\n const transactionMetaWithRsv = cloneDeep(transactionMeta);\n\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 transactionMetaWithRsv[key] = add0x(value.toString(16));\n }\n\n return transactionMetaWithRsv;\n }\n\n async #getEIP1559Compatibility(\n networkClientId?: NetworkClientId,\n ): Promise<boolean> {\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 async #signTransaction(\n originalTransactionMeta: TransactionMeta,\n ): Promise<string | undefined> {\n let transactionMeta = originalTransactionMeta;\n const { id: transactionId } = transactionMeta;\n\n log('Calling before sign hook', transactionMeta);\n\n const { updateTransaction } =\n (await this.#beforeSign({ transactionMeta })) ?? {};\n\n if (updateTransaction) {\n this.#updateTransactionInternal(\n { transactionId, skipResimulateCheck: true },\n updateTransaction,\n );\n\n log('Updated transaction after before sign hook');\n }\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n const { networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n await checkGasFeeTokenBeforePublish({\n ethQuery,\n fetchGasFeeTokens: async (tx) =>\n (await this.#getGasFeeTokens(tx)).gasFeeTokens,\n transaction: transactionMeta,\n updateTransaction: (txId, fn) =>\n this.#updateTransactionInternal({ transactionId: txId }, fn),\n });\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n const { chainId, isExternalSign, txParams } = transactionMeta;\n\n if (isExternalSign) {\n log('Skipping sign as signed externally');\n return undefined;\n }\n\n const { authorizationList, from } = txParams;\n\n const signedAuthorizationList = await signAuthorizationList({\n authorizationList,\n messenger: this.messenger,\n transactionMeta,\n });\n\n if (signedAuthorizationList) {\n this.#updateTransactionInternal({ transactionId }, (txMeta) => {\n txMeta.txParams.authorizationList = signedAuthorizationList;\n });\n }\n\n transactionMeta = this.#getTransactionOrThrow(transactionId);\n\n const finalTransactionMeta = this.#getTransactionOrThrow(transactionId);\n const { txParams: finalTxParams } = finalTransactionMeta;\n const unsignedEthTx = prepareTransaction(chainId, finalTxParams);\n\n this.#approvingTransactionIds.add(transactionId);\n\n log('Signing transaction', finalTxParams);\n\n const signedTx = await new Promise<TypedTransaction>((resolve, reject) => {\n this.#sign?.(\n unsignedEthTx,\n from,\n ...this.#getAdditionalSignArguments(finalTransactionMeta),\n ).then(resolve, reject);\n\n this.#signAbortCallbacks.set(transactionId, () =>\n reject(new Error('Signing aborted by user')),\n );\n });\n\n this.#signAbortCallbacks.delete(transactionId);\n\n if (!signedTx) {\n log('Skipping signed status as no signed transaction');\n return undefined;\n }\n\n const transactionMetaFromHook = cloneDeep(finalTransactionMeta);\n\n if (!this.#afterSign(transactionMetaFromHook, signedTx)) {\n this.updateTransaction(\n transactionMetaFromHook,\n 'TransactionController#signTransaction - Update after sign',\n );\n\n log('Skipping signed status based on hook');\n\n return undefined;\n }\n\n const transactionMetaWithRsv = {\n ...this.#updateTransactionMetaRSV(transactionMetaFromHook, signedTx),\n status: TransactionStatus.signed as const,\n txParams: finalTxParams,\n };\n\n this.updateTransaction(\n transactionMetaWithRsv,\n 'TransactionController#approveTransaction - Transaction signed',\n );\n\n this.#onTransactionStatusChange(transactionMetaWithRsv);\n\n const rawTx = serializeTransaction(signedTx);\n\n const transactionMetaWithRawTx = merge({}, transactionMetaWithRsv, {\n rawTx,\n });\n\n this.updateTransaction(\n transactionMetaWithRawTx,\n 'TransactionController#approveTransaction - RawTransaction added',\n );\n\n return rawTx;\n }\n\n #onTransactionStatusChange(transactionMeta: TransactionMeta): void {\n this.messenger.publish(`${controllerName}:transactionStatusUpdated`, {\n transactionMeta,\n });\n }\n\n #getNonceTrackerTransactions(\n statuses: TransactionStatus[],\n address: string,\n chainId: string,\n ): NonceTrackerTransaction[] {\n return getAndFormatTransactionsForNonceTracker(\n chainId,\n address,\n statuses,\n this.state.transactions,\n );\n }\n\n #onConfirmedTransaction(transactionMeta: TransactionMeta): void {\n log('Processing confirmed transaction', transactionMeta.id);\n\n this.#markNonceDuplicatesDropped(transactionMeta.id);\n\n this.messenger.publish(\n `${controllerName}:transactionConfirmed`,\n transactionMeta,\n );\n\n this.#onTransactionStatusChange(transactionMeta);\n\n // Intentional given potential duration of process.\n this.#updatePostBalance(transactionMeta).catch((error) => {\n log('Error while updating post balance', error);\n throw error;\n });\n }\n\n async #updatePostBalance(transactionMeta: TransactionMeta): Promise<void> {\n try {\n const { networkClientId, type } = transactionMeta;\n\n if (type !== TransactionType.swap) {\n return;\n }\n\n const ethQuery = this.#getEthQuery({ networkClientId });\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.messenger.publish(\n `${controllerName}:postTransactionBalanceUpdated`,\n {\n transactionMeta: updatedTransactionMeta,\n approvalTransactionMeta,\n },\n );\n } catch (error) {\n /* istanbul ignore next */\n log('Error while updating post transaction balance', error);\n }\n }\n\n #createNonceTracker({\n provider,\n blockTracker,\n chainId,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }): NonceTracker {\n return new NonceTracker({\n // TODO: Fix types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provider: provider as any,\n // TODO: Fix types\n blockTracker,\n getPendingTransactions: this.#getNonceTrackerPendingTransactions.bind(\n this,\n chainId,\n ),\n getConfirmedTransactions: this.#getNonceTrackerTransactions.bind(\n this,\n [TransactionStatus.confirmed],\n chainId,\n ),\n });\n }\n\n #createPendingTransactionTracker({\n provider,\n blockTracker,\n chainId,\n networkClientId,\n }: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n networkClientId: NetworkClientId;\n }): PendingTransactionTracker {\n const ethQuery = new EthQuery(provider);\n\n const pendingTransactionTracker = new PendingTransactionTracker({\n blockTracker,\n getChainId: (): Hex => chainId,\n getEthQuery: (): EthQuery => ethQuery,\n getGlobalLock: (): Promise<() => void> =>\n this.#multichainTrackingHelper.acquireNonceLockForChainIdKey({\n chainId,\n }),\n getNetworkClientId: (): NetworkClientId => networkClientId,\n getTransactions: (): TransactionMeta[] => this.state.transactions,\n hooks: {\n beforeCheckPendingTransaction:\n this.#beforeCheckPendingTransaction.bind(this),\n },\n isResubmitEnabled: this.#pendingTransactionOptions.isResubmitEnabled,\n isTimeoutEnabled: this.#isTimeoutEnabled,\n messenger: this.messenger,\n publishTransaction: (_ethQuery, transactionMeta): Promise<string> =>\n this.#publishTransaction(_ethQuery, transactionMeta, {\n skipSubmitHistory: true,\n }),\n });\n\n this.#addPendingTransactionTrackerListeners(pendingTransactionTracker);\n\n return pendingTransactionTracker;\n }\n\n readonly #checkForPendingTransactionAndStartPolling = (): void => {\n this.#multichainTrackingHelper.checkForPendingTransactionAndStartPolling();\n };\n\n #stopAllTracking(): void {\n this.#multichainTrackingHelper.stopAllTracking();\n }\n\n #addIncomingTransactionHelperListeners(\n incomingTransactionHelper: IncomingTransactionHelper,\n ): void {\n incomingTransactionHelper.hub.on(\n 'transactions',\n this.#onIncomingTransactions.bind(this),\n );\n }\n\n #removePendingTransactionTrackerListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n ): void {\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 #addPendingTransactionTrackerListeners(\n pendingTransactionTracker: PendingTransactionTracker,\n ): void {\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 #getNonceTrackerPendingTransactions(\n chainId: string,\n address: string,\n ): NonceTrackerTransaction[] {\n const standardPendingTransactions = this.#getNonceTrackerTransactions(\n [\n TransactionStatus.approved,\n TransactionStatus.signed,\n TransactionStatus.submitted,\n ],\n address,\n chainId,\n );\n\n const externalPendingTransactions = this.#getExternalPendingTransactions(\n address,\n chainId,\n );\n return [...standardPendingTransactions, ...externalPendingTransactions];\n }\n\n async #publishTransactionForRetry(\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ): Promise<string> {\n try {\n return await this.#publishTransaction(ethQuery, transactionMeta);\n } catch (error: unknown) {\n if (this.#isTransactionAlreadyConfirmedError(error as Error)) {\n throw new Error('Previous transaction is already confirmed');\n }\n throw error;\n }\n }\n\n /**\n * Ensures that error is a nonce issue\n *\n * @param error - The error to check\n * @returns Whether or not the error is a nonce issue\n */\n // TODO: Replace `any` with type\n // Some networks are returning original error in the data field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #isTransactionAlreadyConfirmedError(error: any): boolean {\n return (\n Boolean(error?.message?.includes('nonce too low')) ||\n Boolean(error?.data?.message?.includes('nonce too low'))\n );\n }\n\n #getGasFeeFlows(): GasFeeFlow[] {\n if (this.#testGasFeeFlows) {\n return [new TestGasFeeFlow()];\n }\n\n return [\n new RandomisedEstimationsGasFeeFlow(),\n new LineaGasFeeFlow(),\n new DefaultGasFeeFlow(),\n ];\n }\n\n #getLayer1GasFeeFlows(): Layer1GasFeeFlow[] {\n return [new OptimismLayer1GasFeeFlow(), new ScrollLayer1GasFeeFlow()];\n }\n\n #updateTransactionInternal(\n {\n transactionId,\n skipValidation,\n skipResimulateCheck,\n }: {\n transactionId: string;\n skipValidation?: boolean;\n skipResimulateCheck?: boolean;\n },\n callback: (transactionMeta: TransactionMeta) => TransactionMeta | void,\n ): Readonly<TransactionMeta> {\n let resimulateResponse: ResimulateResponse | undefined;\n\n this.update((state) => {\n const index = state.transactions.findIndex(\n ({ id }) => id === transactionId,\n );\n\n if (index === -1) {\n throw new Error(\n `Cannot update transaction as ID not found - ${transactionId}`,\n );\n }\n\n let transactionMeta = state.transactions[index];\n\n const originalTransactionMeta = cloneDeep(transactionMeta);\n\n transactionMeta = callback(transactionMeta) ?? transactionMeta;\n\n if (skipValidation !== true) {\n transactionMeta.txParams = normalizeTransactionParams(\n transactionMeta.txParams,\n );\n\n validateTxParams(transactionMeta.txParams);\n }\n\n if (!skipResimulateCheck && this.#isSimulationEnabled()) {\n resimulateResponse = shouldResimulate(\n originalTransactionMeta,\n transactionMeta,\n );\n }\n\n state.transactions[index] = transactionMeta;\n });\n\n const transactionMeta = this.#getTransaction(\n transactionId,\n ) as TransactionMeta;\n\n if (resimulateResponse?.resimulate) {\n this.#updateSimulationData(transactionMeta, {\n blockTime: resimulateResponse.blockTime,\n }).catch((error) => {\n log('Error during re-simulation', error);\n throw error;\n });\n }\n\n return transactionMeta;\n }\n\n async #updateSimulationData(\n transactionMeta: TransactionMeta,\n {\n blockTime,\n traceContext,\n }: {\n blockTime?: number;\n traceContext?: TraceContext;\n } = {},\n ): Promise<void> {\n const {\n chainId,\n id: transactionId,\n nestedTransactions,\n networkClientId,\n simulationData: prevSimulationData,\n txParams,\n } = transactionMeta;\n\n let simulationData: SimulationData = {\n error: {\n code: SimulationErrorCode.Disabled,\n message: 'Simulation disabled',\n },\n tokenBalanceChanges: [],\n };\n let gasUsed: Hex | undefined;\n let gasFeeTokens: GasFeeToken[] = [];\n let isGasFeeSponsored = false;\n\n const isBalanceChangesSkipped =\n this.#skipSimulationTransactionIds.has(transactionId);\n\n if (this.#isSimulationEnabled() && !isBalanceChangesSkipped) {\n const balanceChangesResult = await this.#trace(\n { name: 'Simulate', parentContext: traceContext },\n () =>\n getBalanceChanges({\n blockTime,\n chainId,\n ethQuery: this.#getEthQuery({ networkClientId }),\n getSimulationConfig: (url, opts) => {\n return this.#getSimulationConfig(url, {\n txMeta: transactionMeta,\n ...opts,\n });\n },\n nestedTransactions,\n txParams,\n }),\n );\n simulationData = balanceChangesResult.simulationData;\n gasUsed = balanceChangesResult.gasUsed;\n\n if (\n blockTime &&\n prevSimulationData &&\n hasSimulationDataChanged(prevSimulationData, simulationData)\n ) {\n simulationData = {\n ...simulationData,\n isUpdatedAfterSecurityCheck: true,\n };\n }\n\n const gasFeeTokensResponse = await this.#getGasFeeTokens(transactionMeta);\n\n gasFeeTokens = gasFeeTokensResponse?.gasFeeTokens ?? [];\n isGasFeeSponsored = gasFeeTokensResponse?.isGasFeeSponsored ?? false;\n }\n\n const latestTransactionMeta = this.#getTransaction(transactionId);\n\n /* istanbul ignore if */\n if (!latestTransactionMeta) {\n log(\n 'Cannot update simulation data as transaction not found',\n transactionId,\n simulationData,\n );\n\n return;\n }\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n skipResimulateCheck: Boolean(blockTime),\n },\n (txMeta) => {\n txMeta.gasFeeTokens = gasFeeTokens;\n txMeta.isGasFeeSponsored = isGasFeeSponsored;\n txMeta.gasUsed = gasUsed;\n\n if (!isBalanceChangesSkipped) {\n txMeta.simulationData = simulationData;\n }\n },\n );\n\n log('Updated simulation data', transactionId, updatedTransactionMeta);\n\n await this.#runAfterSimulateHook(updatedTransactionMeta);\n }\n\n #onGasFeePollerTransactionUpdate({\n transactionId,\n gasFeeEstimates,\n gasFeeEstimatesLoaded,\n layer1GasFee,\n }: {\n transactionId: string;\n gasFeeEstimates?: GasFeeEstimates;\n gasFeeEstimatesLoaded?: boolean;\n layer1GasFee?: Hex;\n }): void {\n this.#updateTransactionInternal({ transactionId }, (txMeta) => {\n updateTransactionGasProperties({\n txMeta,\n gasFeeEstimates,\n gasFeeEstimatesLoaded,\n isTxParamsGasFeeUpdatesEnabled: this.#isAutomaticGasFeeUpdateEnabled,\n layer1GasFee,\n });\n });\n }\n\n #onGasFeePollerTransactionBatchUpdate({\n transactionBatchId,\n gasFeeEstimates,\n }: {\n transactionBatchId: Hex;\n gasFeeEstimates?: GasFeeEstimates;\n }): void {\n this.#updateTransactionBatch(transactionBatchId, (batch) => {\n return { ...batch, gasFeeEstimates };\n });\n }\n\n #updateTransactionBatch(\n batchId: string,\n callback: (batch: TransactionBatchMeta) => TransactionBatchMeta | void,\n ): void {\n this.update((state) => {\n const index = state.transactionBatches.findIndex((b) => b.id === batchId);\n\n if (index === -1) {\n throw new Error(`Cannot update batch, ID not found - ${batchId}`);\n }\n\n const batch = state.transactionBatches[index];\n const updated = callback(batch);\n\n state.transactionBatches[index] = updated ?? batch;\n });\n }\n\n #getSelectedAccount(): InternalAccount {\n return this.messenger.call('AccountsController:getSelectedAccount');\n }\n\n #getInternalAccounts(): Hex[] {\n const state = this.messenger.call('AccountsController:getState');\n\n return Object.values(state.internalAccounts?.accounts ?? {})\n .filter((account) => account.type === 'eip155:eoa')\n .map((account) => account.address as Hex);\n }\n\n #updateSubmitHistory(transactionMeta: TransactionMeta, hash: string): void {\n const { chainId, networkClientId, origin, rawTx, txParams } =\n transactionMeta;\n\n const { networkConfigurationsByChainId } = this.#getNetworkState();\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n\n const endpoint = networkConfiguration?.rpcEndpoints.find(\n (currentEndpoint) => currentEndpoint.networkClientId === networkClientId,\n );\n\n const networkUrl = endpoint?.url;\n const networkType = endpoint?.name ?? networkClientId;\n\n const submitHistoryEntry: SubmitHistoryEntry = {\n chainId,\n hash,\n networkType,\n networkUrl,\n origin,\n rawTransaction: rawTx as string,\n time: Date.now(),\n transaction: txParams,\n };\n\n log('Updating submit history', submitHistoryEntry);\n\n this.update((state) => {\n const { submitHistory } = state;\n\n if (submitHistory.length === SUBMIT_HISTORY_LIMIT) {\n submitHistory.pop();\n }\n\n submitHistory.unshift(submitHistoryEntry);\n });\n }\n\n async #updateGasEstimate(transactionMeta: TransactionMeta): Promise<void> {\n const { chainId, networkClientId } = transactionMeta;\n\n const isCustomNetwork =\n this.#multichainTrackingHelper.getNetworkClient({ networkClientId })\n .configuration.type === NetworkClientType.Custom;\n\n const ethQuery = this.#getEthQuery({ networkClientId });\n\n await updateGas({\n chainId,\n ethQuery,\n isCustomNetwork,\n isSimulationEnabled: this.#isSimulationEnabled(),\n getSimulationConfig: this.#getSimulationConfig,\n messenger: this.messenger,\n txMeta: transactionMeta,\n });\n }\n\n #registerActionHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:addTransaction`,\n this.addTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:addTransactionBatch`,\n this.addTransactionBatch.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:confirmExternalTransaction`,\n this.confirmExternalTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:emulateNewTransaction`,\n this.emulateNewTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:emulateTransactionUpdate`,\n this.emulateTransactionUpdate.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:estimateGas`,\n this.estimateGas.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:estimateGasBatch`,\n this.estimateGasBatch.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getGasFeeTokens`,\n this.#getGasFeeTokensAction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getNonceLock`,\n this.getNonceLock.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getTransactions`,\n this.getTransactions.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:updateCustodialTransaction`,\n this.updateCustodialTransaction.bind(this),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:updateTransaction`,\n this.updateTransaction.bind(this),\n );\n }\n\n #deleteTransaction(transactionId: string): void {\n this.update((state) => {\n const transactions = state.transactions.filter(\n ({ id }) => id !== transactionId,\n );\n\n state.transactions = this.#trimTransactionsForState(transactions);\n });\n }\n\n #isRejectError(error: Error & { code?: number }): boolean {\n return [\n errorCodes.provider.userRejectedRequest,\n ErrorCode.RejectedUpgrade,\n ].includes(error.code as number);\n }\n\n #rejectTransactionAndThrow(\n transactionId: string,\n actionId: string | undefined,\n error: Error & { code?: number; data?: Json },\n ): void {\n this.#rejectTransaction(transactionId, actionId, error);\n\n if (error.code === errorCodes.provider.userRejectedRequest) {\n throw providerErrors.userRejectedRequest({\n message: 'MetaMask Tx Signature: User denied transaction signature.',\n data: error?.data,\n });\n }\n\n throw error;\n }\n\n #failTransaction(\n transactionMeta: TransactionMeta,\n error: Error,\n actionId?: string,\n ): void {\n let newTransactionMeta: TransactionMeta;\n\n try {\n newTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId: transactionMeta.id,\n skipValidation: true,\n },\n (draftTransactionMeta) => {\n draftTransactionMeta.status = TransactionStatus.failed;\n\n (\n draftTransactionMeta as TransactionMeta & {\n status: TransactionStatus.failed;\n }\n ).error = normalizeTxError(error);\n },\n );\n } catch (caughtError: unknown) {\n log('Failed to mark transaction as failed', caughtError);\n\n newTransactionMeta = {\n ...transactionMeta,\n status: TransactionStatus.failed,\n error: normalizeTxError(error),\n };\n }\n\n this.messenger.publish(`${controllerName}:transactionFailed`, {\n actionId,\n error: error.message,\n transactionMeta: newTransactionMeta,\n });\n\n this.#onTransactionStatusChange(newTransactionMeta);\n\n this.messenger.publish(\n `${controllerName}:transactionFinished`,\n newTransactionMeta,\n );\n\n this.#internalEvents.emit(\n `${transactionMeta.id}:finished`,\n newTransactionMeta,\n );\n }\n\n async #runAfterSimulateHook(transactionMeta: TransactionMeta): Promise<void> {\n log('Calling afterSimulate hook', transactionMeta);\n\n const { id: transactionId } = transactionMeta;\n\n const result = await this.#afterSimulate({\n transactionMeta,\n });\n\n const { skipSimulation, updateTransaction } = result ?? {};\n\n if (skipSimulation) {\n this.#skipSimulationTransactionIds.add(transactionId);\n } else if (skipSimulation === false) {\n this.#skipSimulationTransactionIds.delete(transactionId);\n }\n\n if (!updateTransaction) {\n return;\n }\n\n const updatedTransactionMeta = this.#updateTransactionInternal(\n {\n transactionId,\n skipResimulateCheck: true,\n },\n (txMeta) => {\n txMeta.txParamsOriginal = cloneDeep(txMeta.txParams);\n updateTransaction(txMeta);\n },\n );\n\n log('Updated transaction with afterSimulate data', updatedTransactionMeta);\n }\n\n async #defaultPublishHook(\n {\n ethQuery,\n publishHookOverride,\n traceContext,\n }: {\n ethQuery: EthQuery;\n publishHookOverride?: PublishHook;\n traceContext?: TraceContext;\n },\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n let transactionHash: string | undefined;\n\n await this.#trace(\n { name: 'Publish', parentContext: traceContext },\n async () => {\n const publishHook = publishHookOverride ?? this.#publish;\n\n ({ transactionHash } = await publishHook(transactionMeta, signedTx));\n\n // eslint-disable-next-line require-atomic-updates\n transactionHash ??= await this.#publishTransaction(ethQuery, {\n ...transactionMeta,\n rawTx: signedTx,\n });\n },\n );\n\n log('Publish successful', transactionHash);\n\n return { transactionHash };\n }\n\n async #getGasFeeTokens(transaction: TransactionMeta): Promise<{\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n }> {\n const { chainId } = transaction;\n\n return await getGasFeeTokens({\n chainId,\n getSimulationConfig: this.#getSimulationConfig,\n isEIP7702GasFeeTokensEnabled: this.#isEIP7702GasFeeTokensEnabled,\n messenger: this.messenger,\n publicKeyEIP7702: this.#publicKeyEIP7702,\n transactionMeta: transaction,\n });\n }\n\n async #getGasFeeTokensAction(\n request: GetGasFeeTokensRequest,\n ): Promise<GasFeeToken[]> {\n const { chainId, data, from, to, value } = request;\n\n const ethQuery = this.#getEthQuery({ chainId });\n const delegationAddress = await getDelegationAddress(from, ethQuery);\n\n const transaction = {\n chainId,\n delegationAddress,\n isExternalSign: true,\n txParams: {\n data,\n from,\n to,\n value,\n },\n } as TransactionMeta;\n\n const result = await this.#getGasFeeTokens(transaction);\n\n return result.gasFeeTokens;\n }\n}\n"]}
|