@metamask/transaction-controller 62.5.0 → 62.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/dist/TransactionController.cjs +105 -48
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +33 -21
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +33 -21
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +106 -49
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +1 -1
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.mjs +1 -1
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/api/simulation-api.cjs +1 -1
- package/dist/api/simulation-api.cjs.map +1 -1
- package/dist/api/simulation-api.mjs +1 -1
- package/dist/api/simulation-api.mjs.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +28 -17
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts +1 -6
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +1 -6
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +28 -17
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +1 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +1 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
- package/dist/helpers/GasFeePoller.cjs.map +1 -1
- package/dist/helpers/GasFeePoller.mjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs +2 -2
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +2 -2
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +88 -22
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts +7 -6
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts +7 -6
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +88 -22
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/helpers/ResimulateHelper.cjs.map +1 -1
- package/dist/helpers/ResimulateHelper.d.cts +1 -4
- package/dist/helpers/ResimulateHelper.d.cts.map +1 -1
- package/dist/helpers/ResimulateHelper.d.mts +1 -4
- package/dist/helpers/ResimulateHelper.d.mts.map +1 -1
- package/dist/helpers/ResimulateHelper.mjs.map +1 -1
- package/dist/helpers/TransactionPoller.cjs.map +1 -1
- package/dist/helpers/TransactionPoller.d.cts.map +1 -1
- package/dist/helpers/TransactionPoller.d.mts.map +1 -1
- package/dist/helpers/TransactionPoller.mjs.map +1 -1
- package/dist/hooks/CollectPublishHook.cjs +1 -1
- package/dist/hooks/CollectPublishHook.cjs.map +1 -1
- package/dist/hooks/CollectPublishHook.d.cts.map +1 -1
- package/dist/hooks/CollectPublishHook.d.mts.map +1 -1
- package/dist/hooks/CollectPublishHook.mjs +1 -1
- package/dist/hooks/CollectPublishHook.mjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs +5 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +6 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +6 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +5 -0
- package/dist/types.mjs.map +1 -1
- package/dist/utils/balance-changes.cjs +5 -5
- package/dist/utils/balance-changes.cjs.map +1 -1
- package/dist/utils/balance-changes.d.cts.map +1 -1
- package/dist/utils/balance-changes.d.mts.map +1 -1
- package/dist/utils/balance-changes.mjs +5 -5
- package/dist/utils/balance-changes.mjs.map +1 -1
- package/dist/utils/balance.cjs.map +1 -1
- package/dist/utils/balance.d.cts.map +1 -1
- package/dist/utils/balance.d.mts.map +1 -1
- package/dist/utils/balance.mjs.map +1 -1
- package/dist/utils/batch.cjs +9 -4
- package/dist/utils/batch.cjs.map +1 -1
- package/dist/utils/batch.d.cts.map +1 -1
- package/dist/utils/batch.d.mts.map +1 -1
- package/dist/utils/batch.mjs +9 -4
- package/dist/utils/batch.mjs.map +1 -1
- package/dist/utils/eip7702.cjs +4 -3
- package/dist/utils/eip7702.cjs.map +1 -1
- package/dist/utils/eip7702.d.cts +1 -1
- package/dist/utils/eip7702.d.cts.map +1 -1
- package/dist/utils/eip7702.d.mts +1 -1
- package/dist/utils/eip7702.d.mts.map +1 -1
- package/dist/utils/eip7702.mjs +4 -3
- package/dist/utils/eip7702.mjs.map +1 -1
- package/dist/utils/external-transactions.cjs.map +1 -1
- package/dist/utils/external-transactions.d.cts.map +1 -1
- package/dist/utils/external-transactions.d.mts.map +1 -1
- package/dist/utils/external-transactions.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +22 -7
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +24 -0
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +24 -0
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +20 -6
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/first-time-interaction.cjs +3 -5
- package/dist/utils/first-time-interaction.cjs.map +1 -1
- package/dist/utils/first-time-interaction.d.cts.map +1 -1
- package/dist/utils/first-time-interaction.d.mts.map +1 -1
- package/dist/utils/first-time-interaction.mjs +3 -5
- package/dist/utils/first-time-interaction.mjs.map +1 -1
- package/dist/utils/gas-fee-tokens.cjs +1 -1
- package/dist/utils/gas-fee-tokens.cjs.map +1 -1
- package/dist/utils/gas-fee-tokens.d.cts.map +1 -1
- package/dist/utils/gas-fee-tokens.d.mts.map +1 -1
- package/dist/utils/gas-fee-tokens.mjs +1 -1
- package/dist/utils/gas-fee-tokens.mjs.map +1 -1
- package/dist/utils/gas-fees.cjs +1 -3
- package/dist/utils/gas-fees.cjs.map +1 -1
- package/dist/utils/gas-fees.d.cts +1 -1
- package/dist/utils/gas-fees.d.cts.map +1 -1
- package/dist/utils/gas-fees.d.mts +1 -1
- package/dist/utils/gas-fees.d.mts.map +1 -1
- package/dist/utils/gas-fees.mjs +1 -3
- package/dist/utils/gas-fees.mjs.map +1 -1
- package/dist/utils/gas.cjs +71 -15
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.d.cts +18 -12
- package/dist/utils/gas.d.cts.map +1 -1
- package/dist/utils/gas.d.mts +18 -12
- package/dist/utils/gas.d.mts.map +1 -1
- package/dist/utils/gas.mjs +70 -15
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -1
- package/dist/utils/prepare.cjs.map +1 -1
- package/dist/utils/prepare.d.cts +1 -1
- package/dist/utils/prepare.d.cts.map +1 -1
- package/dist/utils/prepare.d.mts +1 -1
- package/dist/utils/prepare.d.mts.map +1 -1
- package/dist/utils/prepare.mjs.map +1 -1
- package/dist/utils/swaps.cjs.map +1 -1
- package/dist/utils/swaps.mjs.map +1 -1
- package/dist/utils/utils.cjs +10 -10
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.cts +4 -4
- package/dist/utils/utils.d.cts.map +1 -1
- package/dist/utils/utils.d.mts +4 -4
- package/dist/utils/utils.d.mts.map +1 -1
- package/dist/utils/utils.mjs +10 -10
- package/dist/utils/utils.mjs.map +1 -1
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingTransactionTracker.mjs","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport type { Hex } 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, merge } from 'lodash';\n\nimport { TransactionPoller } from './TransactionPoller';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta, TransactionReceipt } from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\n/**\n * We wait this many blocks before emitting a 'transaction-dropped' event\n * This is because we could be talking to a node that is out of sync\n */\nconst DROPPED_BLOCK_COUNT = 3;\n\nconst RECEIPT_STATUS_SUCCESS = '0x1';\nconst RECEIPT_STATUS_FAILURE = '0x0';\nconst MAX_RETRY_BLOCK_DISTANCE = 50;\n\nconst KNOWN_TRANSACTION_ERRORS = [\n 'replacement transaction underpriced',\n 'known transaction',\n 'gas price too low to replace',\n 'transaction with the same hash was already imported',\n 'gateway timeout',\n 'nonce too low',\n];\n\nconst log = createModuleLogger(projectLogger, 'pending-transactions');\n\ntype SuccessfulTransactionReceipt = TransactionReceipt & {\n blockNumber: string;\n blockHash: string;\n};\n\ntype Events = {\n 'transaction-confirmed': [txMeta: TransactionMeta];\n 'transaction-dropped': [txMeta: TransactionMeta];\n 'transaction-failed': [txMeta: TransactionMeta, error: Error];\n 'transaction-updated': [txMeta: TransactionMeta, note: string];\n};\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface PendingTransactionTrackerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\nexport class PendingTransactionTracker {\n hub: PendingTransactionTrackerEventEmitter;\n\n readonly #droppedBlockCountByHash: Map<string, number>;\n\n readonly #getChainId: () => string;\n\n readonly #getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n\n readonly #getNetworkClientId: () => NetworkClientId;\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #isResubmitEnabled: () => boolean;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly #listener: any;\n\n readonly #log: debug.Debugger;\n\n readonly #getGlobalLock: () => Promise<() => void>;\n\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<string>;\n\n #running: boolean;\n\n readonly #transactionPoller: TransactionPoller;\n\n #transactionToForcePoll: TransactionMeta | undefined;\n\n readonly #beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n constructor({\n blockTracker,\n getChainId,\n getEthQuery,\n getGlobalLock,\n getNetworkClientId,\n getTransactions,\n hooks,\n isResubmitEnabled,\n messenger,\n publishTransaction,\n }: {\n blockTracker: BlockTracker;\n getChainId: () => Hex;\n getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n getNetworkClientId: () => string;\n getTransactions: () => TransactionMeta[];\n isResubmitEnabled?: () => boolean;\n getGlobalLock: () => Promise<() => void>;\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<string>;\n hooks?: {\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n };\n messenger: TransactionControllerMessenger;\n }) {\n this.hub = new EventEmitter() as PendingTransactionTrackerEventEmitter;\n\n this.#droppedBlockCountByHash = new Map();\n this.#getChainId = getChainId;\n this.#getEthQuery = getEthQuery;\n this.#getNetworkClientId = getNetworkClientId;\n this.#getTransactions = getTransactions;\n this.#isResubmitEnabled = isResubmitEnabled ?? (() => true);\n this.#listener = this.#onLatestBlock.bind(this);\n this.#getGlobalLock = getGlobalLock;\n this.#publishTransaction = publishTransaction;\n this.#running = false;\n this.#transactionToForcePoll = undefined;\n\n this.#transactionPoller = new TransactionPoller({\n blockTracker,\n chainId: getChainId(),\n messenger,\n });\n\n this.#beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ??\n /* istanbul ignore next */\n (() => Promise.resolve(true));\n\n this.#log = createModuleLogger(\n log,\n `${getChainId()}:${getNetworkClientId()}`,\n );\n }\n\n startIfPendingTransactions = () => {\n const pendingTransactions = this.#getPendingTransactions();\n\n if (pendingTransactions.length) {\n this.#start(pendingTransactions);\n } else {\n this.stop();\n }\n };\n\n /**\n * Adds a transaction to the polling mechanism for monitoring its status.\n *\n * This method forcefully adds a single transaction to the list of transactions\n * being polled, ensuring that its status is checked, event emitted but no update is performed.\n * It overrides the default behavior by prioritizing the given transaction for polling.\n *\n * @param transactionMeta - The transaction metadata to be added for polling.\n *\n * The transaction will now be monitored for updates, such as confirmation or failure.\n */\n addTransactionToPoll(transactionMeta: TransactionMeta): void {\n this.#start([transactionMeta]);\n this.#transactionToForcePoll = transactionMeta;\n }\n\n /**\n * Force checks the network if the given transaction is confirmed and updates it's status.\n *\n * @param txMeta - The transaction to check\n */\n async forceCheckTransaction(txMeta: TransactionMeta) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransaction(txMeta);\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to check transaction', error);\n } finally {\n releaseLock();\n }\n }\n\n #start(pendingTransactions: TransactionMeta[]) {\n this.#transactionPoller.setPendingTransactions(pendingTransactions);\n\n if (this.#running) {\n return;\n }\n\n this.#transactionPoller.start(this.#listener);\n this.#running = true;\n\n this.#log('Started polling');\n }\n\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#transactionPoller.stop();\n this.#running = false;\n\n this.#log('Stopped polling');\n }\n\n async #onLatestBlock(latestBlockNumber: string) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransactions();\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to check transactions', error);\n } finally {\n releaseLock();\n }\n\n try {\n await this.#resubmitTransactions(latestBlockNumber);\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to resubmit transactions', error);\n }\n }\n\n async #checkTransactions() {\n this.#log('Checking transactions');\n\n const pendingTransactions: TransactionMeta[] = [\n ...this.#getPendingTransactions(),\n ...(this.#transactionToForcePoll ? [this.#transactionToForcePoll] : []),\n ];\n\n if (!pendingTransactions.length) {\n this.#log('No pending transactions to check');\n return;\n }\n\n this.#log('Found pending transactions to check', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n await Promise.all(\n pendingTransactions.map((tx) => this.#checkTransaction(tx)),\n );\n }\n\n async #resubmitTransactions(latestBlockNumber: string) {\n if (!this.#isResubmitEnabled() || !this.#running) {\n return;\n }\n\n this.#log('Resubmitting transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n this.#log('No pending transactions to resubmit');\n return;\n }\n\n this.#log('Found pending transactions to resubmit', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n for (const txMeta of pendingTransactions) {\n try {\n await this.#resubmitTransaction(txMeta, latestBlockNumber);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n /* istanbul ignore next */\n const errorMessage =\n error.value?.message?.toLowerCase() ||\n error.message?.toLowerCase() ||\n String(error);\n\n if (this.#isKnownTransactionError(errorMessage)) {\n this.#log('Ignoring known transaction error', errorMessage);\n continue;\n }\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was an error when resubmitting this transaction.',\n );\n }\n }\n }\n\n #isKnownTransactionError(errorMessage: string) {\n return KNOWN_TRANSACTION_ERRORS.some((knownError) =>\n errorMessage.includes(knownError),\n );\n }\n\n async #resubmitTransaction(\n txMeta: TransactionMeta,\n latestBlockNumber: string,\n ) {\n if (!this.#isResubmitDue(txMeta, latestBlockNumber)) {\n return;\n }\n\n if (!(await this.#beforeCheckPendingTransaction(txMeta))) {\n return;\n }\n\n const ethQuery = this.#getEthQuery(txMeta.networkClientId);\n await this.#publishTransaction(ethQuery, txMeta);\n\n const retryCount = (txMeta.retryCount ?? 0) + 1;\n\n this.#updateTransaction(\n merge({}, txMeta, { retryCount }),\n 'PendingTransactionTracker:transaction-retry - Retry count increased',\n );\n }\n\n #isResubmitDue(txMeta: TransactionMeta, latestBlockNumber: string): boolean {\n const txMetaWithFirstRetryBlockNumber = cloneDeep(txMeta);\n\n if (!txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber) {\n txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber = latestBlockNumber;\n\n this.#updateTransaction(\n txMetaWithFirstRetryBlockNumber,\n 'PendingTransactionTracker:#isResubmitDue - First retry block number set',\n );\n }\n\n const { firstRetryBlockNumber } = txMetaWithFirstRetryBlockNumber;\n\n const blocksSinceFirstRetry =\n Number.parseInt(latestBlockNumber, 16) -\n Number.parseInt(firstRetryBlockNumber, 16);\n\n const retryCount = txMeta.retryCount || 0;\n\n // Exponential backoff to limit retries at publishing\n // Capped at ~15 minutes between retries\n const requiredBlocksSinceFirstRetry = Math.min(\n MAX_RETRY_BLOCK_DISTANCE,\n Math.pow(2, retryCount),\n );\n\n return blocksSinceFirstRetry >= requiredBlocksSinceFirstRetry;\n }\n\n #cleanTransactionToForcePoll(transactionId: string) {\n if (this.#transactionToForcePoll?.id === transactionId) {\n this.#transactionToForcePoll = undefined;\n }\n }\n\n async #checkTransaction(txMeta: TransactionMeta) {\n const { hash, id, isIntentComplete } = txMeta;\n\n if (isIntentComplete) {\n await this.#onTransactionConfirmed(txMeta);\n return;\n }\n\n if (!hash && (await this.#beforeCheckPendingTransaction(txMeta))) {\n const error = new Error(\n 'We had an error while submitting this transaction, please try again.',\n );\n\n error.name = 'NoTxHashError';\n\n this.#failTransaction(txMeta, error);\n\n return;\n }\n\n if (this.#isNonceTaken(txMeta)) {\n this.#log('Nonce already taken', id);\n this.#dropTransaction(txMeta);\n return;\n }\n\n try {\n const receipt = await this.#getTransactionReceipt(hash);\n const isSuccess = receipt?.status === RECEIPT_STATUS_SUCCESS;\n const isFailure = receipt?.status === RECEIPT_STATUS_FAILURE;\n\n if (isFailure) {\n this.#log('Transaction receipt has failed status');\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction dropped or replaced'),\n );\n\n return;\n }\n\n const { blockNumber, blockHash } = receipt || {};\n\n if (isSuccess && blockNumber && blockHash) {\n await this.#onTransactionConfirmed(txMeta, {\n ...receipt,\n blockNumber,\n blockHash,\n });\n\n return;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n this.#log('Failed to check transaction', id, error);\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was a problem loading this transaction.',\n );\n\n return;\n }\n\n if (await this.#isTransactionDropped(txMeta)) {\n this.#dropTransaction(txMeta);\n }\n }\n\n async #onTransactionConfirmed(\n txMeta: TransactionMeta,\n receipt?: SuccessfulTransactionReceipt,\n ) {\n const { id } = txMeta;\n const { blockHash } = receipt ?? {};\n\n this.#log('Transaction confirmed', id);\n\n if (this.#transactionToForcePoll) {\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-confirmed', txMeta);\n return;\n }\n\n const updatedTxMeta = cloneDeep(txMeta);\n\n if (receipt && blockHash) {\n const { baseFeePerGas, timestamp: blockTimestamp } =\n await this.#getBlockByHash(blockHash, false);\n\n updatedTxMeta.baseFeePerGas = baseFeePerGas;\n updatedTxMeta.blockTimestamp = blockTimestamp;\n updatedTxMeta.txParams = {\n ...updatedTxMeta.txParams,\n gasUsed: receipt.gasUsed,\n };\n updatedTxMeta.txReceipt = receipt;\n updatedTxMeta.verifiedOnBlockchain = true;\n }\n\n updatedTxMeta.status = TransactionStatus.confirmed;\n\n this.#updateTransaction(\n updatedTxMeta,\n 'PendingTransactionTracker:#onTransactionConfirmed - Transaction confirmed',\n );\n\n this.hub.emit('transaction-confirmed', updatedTxMeta);\n }\n\n async #isTransactionDropped(txMeta: TransactionMeta) {\n const {\n hash,\n id,\n txParams: { nonce, from },\n } = txMeta;\n\n /* istanbul ignore next */\n if (!nonce || !hash) {\n return false;\n }\n\n const networkNextNonceHex = await this.#getNetworkTransactionCount(from);\n const networkNextNonceNumber = parseInt(networkNextNonceHex, 16);\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber >= networkNextNonceNumber) {\n return false;\n }\n\n let droppedBlockCount = this.#droppedBlockCountByHash.get(hash);\n\n if (droppedBlockCount === undefined) {\n droppedBlockCount = 0;\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount);\n }\n\n if (droppedBlockCount < DROPPED_BLOCK_COUNT) {\n this.#log('Incrementing dropped block count', { id, droppedBlockCount });\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount + 1);\n return false;\n }\n\n this.#log('Hit dropped block count', id);\n\n this.#droppedBlockCountByHash.delete(hash);\n return true;\n }\n\n #isNonceTaken(txMeta: TransactionMeta): boolean {\n const { id, txParams } = txMeta;\n\n return this.#getChainTransactions().some(\n (tx) =>\n tx.id !== id &&\n tx.txParams.from === txParams.from &&\n tx.status === TransactionStatus.confirmed &&\n tx.txParams.nonce &&\n tx.txParams.nonce === txParams.nonce &&\n tx.type !== TransactionType.incoming &&\n tx.isTransfer === undefined,\n );\n }\n\n #getPendingTransactions(): TransactionMeta[] {\n return this.#getNetworkClientTransactions().filter(\n (tx) =>\n tx.status === TransactionStatus.submitted &&\n !tx.verifiedOnBlockchain &&\n !tx.isUserOperation,\n );\n }\n\n #warnTransaction(txMeta: TransactionMeta, error: string, message: string) {\n this.#updateTransaction(\n {\n ...txMeta,\n warning: { error, message },\n },\n 'PendingTransactionTracker:#warnTransaction - Warning added',\n );\n }\n\n #failTransaction(txMeta: TransactionMeta, error: Error) {\n this.#log('Transaction failed', txMeta.id, error);\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-failed', txMeta, error);\n }\n\n #dropTransaction(txMeta: TransactionMeta) {\n this.#log('Transaction dropped', txMeta.id);\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-dropped', txMeta);\n }\n\n #updateTransaction(txMeta: TransactionMeta, note: string) {\n this.hub.emit('transaction-updated', txMeta, note);\n }\n\n async #getTransactionReceipt(\n txHash?: string,\n ): Promise<TransactionReceipt | undefined> {\n return await query(this.#getEthQuery(), 'getTransactionReceipt', [txHash]);\n }\n\n async #getBlockByHash(\n blockHash: string,\n includeTransactionDetails: boolean,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return await query(this.#getEthQuery(), 'getBlockByHash', [\n blockHash,\n includeTransactionDetails,\n ]);\n }\n\n async #getNetworkTransactionCount(address: string): Promise<string> {\n return await query(this.#getEthQuery(), 'getTransactionCount', [address]);\n }\n\n #getChainTransactions(): TransactionMeta[] {\n const chainId = this.#getChainId();\n return this.#getTransactions().filter((tx) => tx.chainId === chainId);\n }\n\n #getNetworkClientTransactions(): TransactionMeta[] {\n const networkClientId = this.#getNetworkClientId();\n return this.#getTransactions().filter(\n (tx) => tx.networkClientId === networkClientId,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PendingTransactionTracker.mjs","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,mCAAmC;AAOnD,kEAAkE;AAClE,sDAAsD;AACtD,OAAO,YAAY,eAAe;;;AAGlC,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AACxD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAG9D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAiB;AAC9D,OAAO,EAAE,kBAAkB,EAAE,mCAA+B;AAE5D;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,wBAAwB,GAAG;IAC/B,qCAAqC;IACrC,mBAAmB;IACnB,8BAA8B;IAC9B,qDAAqD;IACrD,iBAAiB;IACjB,eAAe;CAChB,CAAC;AAEF,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AA6BtE,MAAM,OAAO,yBAAyB;IA4CpC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,KAAK,EACL,iBAAiB,EACjB,SAAS,EACT,kBAAkB,GAoBnB;;QAxEQ,2EAEa;QAEb,qEAA8C;QAE9C,8DAAiE;QAEjE,wDAA0B;QAE1B,yDAA8D;QAE9D,2DAA0C;QAE1C,gEAA2C;QAE3C,6DAA0C;QAE1C,+DAAkC;QAE3C,gCAAgC;QAChC,8DAA8D;QACrD,sDAAe;QAEf,iDAAqB;QAErB,uDAA2C;QAE3C,gEAGY;QAErB,qDAAkB;QAET,gEAAyC;QAEzC,+DAAsC;QAE/C,oEAAqD;QAqErD,+BAA0B,GAAG,GAAS,EAAE;YACtC,MAAM,mBAAmB,GAAG,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,CAA0B,CAAC;YAE3D,IAAI,mBAAmB,CAAC,MAAM,EAAE,CAAC;gBAC/B,uBAAA,IAAI,8EAAO,MAAX,IAAI,EAAQ,mBAAmB,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QA3CA,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,EAA2C,CAAC;QAEvE,uBAAA,IAAI,sDAA4B,IAAI,GAAG,EAAE,MAAA,CAAC;QAC1C,uBAAA,IAAI,yCAAe,UAAU,MAAA,CAAC;QAC9B,uBAAA,IAAI,0CAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,4CAAkB,aAAa,MAAA,CAAC;QACpC,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,8CAAoB,eAAe,MAAA,CAAC;QACxC,uBAAA,IAAI,gDAAsB,iBAAiB,IAAI,CAAC,GAAY,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QACrE,uBAAA,IAAI,uCAAa,uBAAA,IAAI,sFAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAA,CAAC;QAChD,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,sCAAY,KAAK,MAAA,CAAC;QACtB,uBAAA,IAAI,iDAAuB,IAAI,GAAG,EAAE,MAAA,CAAC;QACrC,uBAAA,IAAI,qDAA2B,SAAS,MAAA,CAAC;QAEzC,uBAAA,IAAI,gDAAsB,IAAI,iBAAiB,CAAC;YAC9C,YAAY;YACZ,OAAO,EAAE,UAAU,EAAE;YACrB,SAAS;SACV,CAAC,MAAA,CAAC;QAEH,uBAAA,IAAI,4DACF,KAAK,EAAE,6BAA6B;YACpC,0BAA0B;YAC1B,CAAC,GAAqB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAA,CAAC;QAElD,uBAAA,IAAI,+CAAqB,gBAAgB,MAAA,CAAC;QAE1C,uBAAA,IAAI,kCAAQ,kBAAkB,CAC5B,GAAG,EACH,GAAG,UAAU,EAAE,IAAI,kBAAkB,EAAE,EAAE,CAC1C,MAAA,CAAC;IACJ,CAAC;IAYD;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,eAAgC;QACnD,uBAAA,IAAI,8EAAO,MAAX,IAAI,EAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAC/B,uBAAA,IAAI,qDAA2B,eAAe,MAAA,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CAAC,MAAuB;QACjD,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,gDAAe,MAAnB,IAAI,CAAiB,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,uBAAA,IAAI,yFAAkB,MAAtB,IAAI,EAAmB,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0BAA0B;YAC1B,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,6BAA6B,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAeD,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,0CAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,oDAAmB,CAAC,IAAI,EAAE,CAAC;QAC/B,uBAAA,IAAI,sCAAY,KAAK,MAAA,CAAC;QAEtB,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,iBAAiB,CAAC,CAAC;IAC/B,CAAC;CAgfF;8nCAtgBQ,mBAAsC;IAC3C,uBAAA,IAAI,oDAAmB,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAEpE,IAAI,uBAAA,IAAI,0CAAS,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,oDAAmB,CAAC,KAAK,CAAC,uBAAA,IAAI,2CAAU,CAAC,CAAC;IAC9C,uBAAA,IAAI,sCAAY,IAAI,MAAA,CAAC;IAErB,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,iBAAiB,CAAC,CAAC;AAC/B,CAAC,6CAaD,KAAK,mDAAgB,iBAAyB;IAC5C,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,gDAAe,MAAnB,IAAI,CAAiB,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,CAAqB,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,8BAA8B,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,iCAAiC,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;AACH,CAAC,iDAED,KAAK;IACH,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,uBAAuB,CAAC,CAAC;IAEnC,MAAM,mBAAmB,GAAsB;QAC7C,GAAG,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,CAA0B;QACjC,GAAG,CAAC,uBAAA,IAAI,yDAAwB,CAAC,CAAC,CAAC,CAAC,uBAAA,IAAI,yDAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IAEF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;QAChC,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,kCAAkC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,qCAAqC,EAAE;QAC/C,KAAK,EAAE,mBAAmB,CAAC,MAAM;QACjC,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CACf,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,uBAAA,IAAI,yFAAkB,MAAtB,IAAI,EAAmB,EAAE,CAAC,CAAC,CAC5D,CAAC;AACJ,CAAC,oDAED,KAAK,0DAAuB,iBAAyB;IACnD,IAAI,CAAC,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,IAAI,CAAC,uBAAA,IAAI,0CAAS,EAAE,CAAC;QACjD,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,2BAA2B,CAAC,CAAC;IAEvC,MAAM,mBAAmB,GAAG,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,CAA0B,CAAC;IAE3D,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;QAChC,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,qCAAqC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,wCAAwC,EAAE;QAClD,KAAK,EAAE,mBAAmB,CAAC,MAAM;QACjC,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,uBAAA,IAAI,4FAAqB,MAAzB,IAAI,EAAsB,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC3D,gCAAgC;YAChC,8DAA8D;QAChE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,0BAA0B;YAC1B,MAAM,YAAY,GAChB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE;gBACnC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;gBAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;YAEhB,IAAI,uBAAA,IAAI,gGAAyB,MAA7B,IAAI,EAA0B,YAAY,CAAC,EAAE,CAAC;gBAChD,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,kCAAkC,EAAE,YAAY,CAAC,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EACF,MAAM,EACN,KAAK,CAAC,OAAO,EACb,wDAAwD,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,mHAEwB,YAAoB;IAC3C,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAClD,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAClC,CAAC;AACJ,CAAC,mDAED,KAAK,yDACH,MAAuB,EACvB,iBAAyB;IAEzB,IAAI,CAAC,uBAAA,IAAI,sFAAe,MAAnB,IAAI,EAAgB,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,uBAAA,IAAI,gEAA+B,MAAnC,IAAI,EAAgC,MAAM,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAA,IAAI,8CAAa,MAAjB,IAAI,EAAc,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3D,MAAM,uBAAA,IAAI,qDAAoB,MAAxB,IAAI,EAAqB,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEhD,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EACF,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,EACjC,qEAAqE,CACtE,CAAC;AACJ,CAAC,+FAEc,MAAuB,EAAE,iBAAyB;IAC/D,MAAM,+BAA+B,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC,+BAA+B,CAAC,qBAAqB,EAAE,CAAC;QAC3D,+BAA+B,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;QAE1E,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EACF,+BAA+B,EAC/B,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,qBAAqB,EAAE,GAAG,+BAA+B,CAAC;IAElE,MAAM,qBAAqB,GACzB,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAE1C,qDAAqD;IACrD,wCAAwC;IACxC,MAAM,6BAA6B,GAAG,IAAI,CAAC,GAAG,CAC5C,wBAAwB,EACxB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CACxB,CAAC;IAEF,OAAO,qBAAqB,IAAI,6BAA6B,CAAC;AAChE,CAAC,2HAE4B,aAAqB;IAChD,IAAI,uBAAA,IAAI,yDAAwB,EAAE,EAAE,KAAK,aAAa,EAAE,CAAC;QACvD,uBAAA,IAAI,qDAA2B,SAAS,MAAA,CAAC;IAC3C,CAAC;AACH,CAAC,gDAED,KAAK,sDAAmB,MAAuB;IAC7C,MAAM,EACJ,IAAI,EACJ,EAAE,EACF,gBAAgB,EAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,GACnB,GAAG,MAAM,CAAC;IAEX,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,MAAM,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,uBAAA,IAAI,gEAA+B,MAAnC,IAAI,EAAgC,MAAM,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,sEAAsE,CACvE,CAAC;QAEF,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC;QAE7B,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EAAkB,MAAM,EAAE,KAAK,CAAC,CAAC;QAErC,OAAO;IACT,CAAC;IAED,IAAI,uBAAA,IAAI,qFAAc,MAAlB,IAAI,EAAe,MAAM,CAAC,EAAE,CAAC;QAC/B,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACrC,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EAAkB,MAAM,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,uBAAA,IAAI,8FAAuB,MAA3B,IAAI,EAAwB,IAAI,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,KAAK,sBAAsB,CAAC;QAC7D,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,KAAK,sBAAsB,CAAC;QAE7D,IAAI,SAAS,EAAE,CAAC;YACd,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,uCAAuC,CAAC,CAAC;YAEnD,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EACF,MAAM,EACN,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAC7C,CAAC;YAEF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAEjD,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;YAC1C,MAAM,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,MAAM,EAAE;gBACzC,GAAG,OAAO;gBACV,WAAW;gBACX,SAAS;aACV,CAAC,CAAC;YAEH,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAElD,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,mGAA4B,MAAhC,IAAI,EAA6B,IAAI,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAE7C,0DAA0D;QAC1D,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,MAAM,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YACxD,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EAAkB,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,6BAA6B,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAEpD,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EACF,MAAM,EACL,KAA6B,CAAC,OAAO,EACtC,+CAA+C,CAChD,CAAC;IACJ,CAAC;AACH,CAAC,sDAED,KAAK,4DACH,MAAuB,EACvB,OAAsC;IAEtC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEpC,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAEvC,IAAI,uBAAA,IAAI,yDAAwB,EAAE,CAAC;QACjC,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,EAA8B,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,GAChD,MAAM,uBAAA,IAAI,uFAAgB,MAApB,IAAI,EAAiB,SAAS,EAAE,KAAK,CAAC,CAAC;QAE/C,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC;QAC5C,aAAa,CAAC,cAAc,GAAG,cAAc,CAAC;QAC9C,aAAa,CAAC,QAAQ,GAAG;YACvB,GAAG,aAAa,CAAC,QAAQ;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC;QAClC,aAAa,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,aAAa,CAAC,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC;IAEnD,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EACF,aAAa,EACb,2EAA2E,CAC5E,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC,oDAED,KAAK,0DACH,MAAuB,EACvB,SAAiB;IAEjB,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,EAAE,KAAK,EAAE,GACpB,GAAG,MAAM,CAAC;IAEX,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,uBAAA,IAAI,mDAAkB,MAAtB,IAAI,EAAmB,MAAM,CAAC,EAAE,CAAC;QACpC,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,kCAAkC,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,uBAAA,IAAI,4CAAW,CAAC,CAAC;IAE/D,wDAAwD;IACxD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QAC/C,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,mCAAmC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uFAAuF;IACvF,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAExC,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;QAC5B,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,wCAAwC,EAAE;YAClD,gBAAgB,EAAE,WAAW;YAC7B,SAAS;SACV,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,IAAI,CAAC,CAAC;QAE3D,2CAA2C;QAC3C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,uBAAA,IAAI,sCAAK,MAAT,IAAI,EACF,yDAAyD,EACzD,aAAa,CACd,CAAC;YAEF,uBAAA,IAAI,qDAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+CAA+C;QAC/C,IAAI,QAAQ,GAAG,uBAAA,IAAI,qDAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElD,QAAQ,KAAR,QAAQ,GAAK,CAAC,EAAC;QACf,QAAQ,IAAI,CAAC,CAAC;QACd,uBAAA,IAAI,qDAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE7C,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,8BAA8B,EAAE;YACxC,aAAa;YACb,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAClD,uBAAA,IAAI,qDAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEtC,uBAAA,IAAI,wFAAiB,MAArB,IAAI,EACF,MAAM,EACN,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAC5D,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,qCAAqC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,oDAED,KAAK,0DACH,MAAuB,EACvB,SAAiB;IAEjB,MAAM,EACJ,IAAI,EACJ,EAAE,EACF,QAAQ,EAAE,EAAE,KAAK,EAAE,GACpB,GAAG,MAAM,CAAC;IAEX,0BAA0B;IAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAExC,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,iBAAiB,GAAG,uBAAA,IAAI,0DAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEhE,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,iBAAiB,GAAG,CAAC,CAAC;QACtB,uBAAA,IAAI,0DAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,iBAAiB,GAAG,mBAAmB,EAAE,CAAC;QAC5C,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,kCAAkC,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACzE,uBAAA,IAAI,0DAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAEzC,uBAAA,IAAI,0DAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC,6FAEa,MAAuB;IACnC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEhC,OAAO,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,CAAwB,CAAC,IAAI,CACtC,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,EAAE,KAAK,EAAE;QACZ,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAClC,EAAE,CAAC,MAAM,KAAK,iBAAiB,CAAC,SAAS;QACzC,EAAE,CAAC,QAAQ,CAAC,KAAK;QACjB,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK;QACpC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,QAAQ;QACpC,EAAE,CAAC,UAAU,KAAK,SAAS,CAC9B,CAAC;AACJ,CAAC;IAGC,OAAO,uBAAA,IAAI,qGAA8B,MAAlC,IAAI,CAAgC,CAAC,MAAM,CAChD,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,MAAM,KAAK,iBAAiB,CAAC,SAAS;QACzC,CAAC,EAAE,CAAC,oBAAoB;QACxB,CAAC,EAAE,CAAC,eAAe,CACtB,CAAC;AACJ,CAAC,mGAGC,MAAuB,EACvB,KAAa,EACb,OAAe;IAEf,uBAAA,IAAI,0FAAmB,MAAvB,IAAI,EACF;QACE,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC5B,EACD,4DAA4D,CAC7D,CAAC;AACJ,CAAC,mGAEgB,MAAuB,EAAE,KAAY;IACpD,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClD,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,EAA8B,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC,mGAEgB,MAAuB;IACtC,uBAAA,IAAI,sCAAK,MAAT,IAAI,EAAM,qBAAqB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,EAA8B,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC,uGAEkB,MAAuB,EAAE,IAAY;IACtD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC,qDAED,KAAK,2DACH,MAAe;IAEf,OAAO,MAAM,KAAK,CAAC,uBAAA,IAAI,8CAAa,MAAjB,IAAI,CAAe,EAAE,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC,oDAED,KAAK,0DAAuB,MAAe;IACzC,OAAO,MAAM,KAAK,CAAC,uBAAA,IAAI,8CAAa,MAAjB,IAAI,CAAe,EAAE,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5E,CAAC,8CAED,KAAK,oDACH,SAAiB,EACjB,yBAAkC;IAIlC,OAAO,MAAM,KAAK,CAAC,uBAAA,IAAI,8CAAa,MAAjB,IAAI,CAAe,EAAE,gBAAgB,EAAE;QACxD,SAAS;QACT,yBAAyB;KAC1B,CAAC,CAAC;AACL,CAAC,0DAED,KAAK,gEAA6B,OAAe;IAC/C,OAAO,MAAM,KAAK,CAAC,uBAAA,IAAI,8CAAa,MAAjB,IAAI,CAAe,EAAE,qBAAqB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5E,CAAC;IAGC,MAAM,OAAO,GAAG,uBAAA,IAAI,6CAAY,MAAhB,IAAI,CAAc,CAAC;IACnC,OAAO,uBAAA,IAAI,kDAAiB,MAArB,IAAI,CAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACxE,CAAC;IAGC,MAAM,eAAe,GAAG,uBAAA,IAAI,qDAAoB,MAAxB,IAAI,CAAsB,CAAC;IACnD,OAAO,uBAAA,IAAI,kDAAiB,MAArB,IAAI,CAAmB,CAAC,MAAM,CACnC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,KAAK,eAAe,CAC/C,CAAC;AACJ,CAAC","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport type { Hex, Json } 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, merge } from 'lodash';\n\nimport { TransactionPoller } from './TransactionPoller';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta, TransactionReceipt } from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport { getTimeoutAttempts } from '../utils/feature-flags';\n\n/**\n * We wait this many blocks before emitting a 'transaction-dropped' event\n * This is because we could be talking to a node that is out of sync\n */\nconst DROPPED_BLOCK_COUNT = 3;\n\nconst RECEIPT_STATUS_SUCCESS = '0x1';\nconst RECEIPT_STATUS_FAILURE = '0x0';\nconst MAX_RETRY_BLOCK_DISTANCE = 50;\n\nconst KNOWN_TRANSACTION_ERRORS = [\n 'replacement transaction underpriced',\n 'known transaction',\n 'gas price too low to replace',\n 'transaction with the same hash was already imported',\n 'gateway timeout',\n 'nonce too low',\n];\n\nconst log = createModuleLogger(projectLogger, 'pending-transactions');\n\ntype SuccessfulTransactionReceipt = TransactionReceipt & {\n blockNumber: string;\n blockHash: string;\n};\n\ntype Events = {\n 'transaction-confirmed': [txMeta: TransactionMeta];\n 'transaction-dropped': [txMeta: TransactionMeta];\n 'transaction-failed': [txMeta: TransactionMeta, error: Error];\n 'transaction-updated': [txMeta: TransactionMeta, note: string];\n};\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface PendingTransactionTrackerEventEmitter extends EventEmitter {\n on<EventName extends keyof Events>(\n eventName: EventName,\n listener: (...args: Events[EventName]) => void,\n ): this;\n\n emit<EventName extends keyof Events>(\n eventName: EventName,\n ...args: Events[EventName]\n ): boolean;\n}\n\nexport class PendingTransactionTracker {\n hub: PendingTransactionTrackerEventEmitter;\n\n readonly #beforeCheckPendingTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n\n readonly #droppedBlockCountByHash: Map<string, number>;\n\n readonly #isTimeoutEnabled: (transactionMeta: TransactionMeta) => boolean;\n\n readonly #getChainId: () => string;\n\n readonly #getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n\n readonly #getGlobalLock: () => Promise<() => void>;\n\n readonly #getNetworkClientId: () => NetworkClientId;\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #isResubmitEnabled: () => boolean;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly #listener: any;\n\n readonly #log: debug.Debugger;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<string>;\n\n #running: boolean;\n\n readonly #timeoutCountByHash: Map<string, number>;\n\n readonly #transactionPoller: TransactionPoller;\n\n #transactionToForcePoll: TransactionMeta | undefined;\n\n constructor({\n blockTracker,\n getChainId,\n getEthQuery,\n getGlobalLock,\n getNetworkClientId,\n getTransactions,\n isTimeoutEnabled,\n hooks,\n isResubmitEnabled,\n messenger,\n publishTransaction,\n }: {\n blockTracker: BlockTracker;\n getChainId: () => Hex;\n getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n getGlobalLock: () => Promise<() => void>;\n getNetworkClientId: () => string;\n getTransactions: () => TransactionMeta[];\n hooks?: {\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n };\n isResubmitEnabled?: () => boolean;\n isTimeoutEnabled: (transactionMeta: TransactionMeta) => boolean;\n messenger: TransactionControllerMessenger;\n publishTransaction: (\n ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<string>;\n }) {\n this.hub = new EventEmitter() as PendingTransactionTrackerEventEmitter;\n\n this.#droppedBlockCountByHash = new Map();\n this.#getChainId = getChainId;\n this.#getEthQuery = getEthQuery;\n this.#getGlobalLock = getGlobalLock;\n this.#getNetworkClientId = getNetworkClientId;\n this.#getTransactions = getTransactions;\n this.#isResubmitEnabled = isResubmitEnabled ?? ((): boolean => true);\n this.#listener = this.#onLatestBlock.bind(this);\n this.#messenger = messenger;\n this.#publishTransaction = publishTransaction;\n this.#running = false;\n this.#timeoutCountByHash = new Map();\n this.#transactionToForcePoll = undefined;\n\n this.#transactionPoller = new TransactionPoller({\n blockTracker,\n chainId: getChainId(),\n messenger,\n });\n\n this.#beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ??\n /* istanbul ignore next */\n ((): Promise<boolean> => Promise.resolve(true));\n\n this.#isTimeoutEnabled = isTimeoutEnabled;\n\n this.#log = createModuleLogger(\n log,\n `${getChainId()}:${getNetworkClientId()}`,\n );\n }\n\n startIfPendingTransactions = (): void => {\n const pendingTransactions = this.#getPendingTransactions();\n\n if (pendingTransactions.length) {\n this.#start(pendingTransactions);\n } else {\n this.stop();\n }\n };\n\n /**\n * Adds a transaction to the polling mechanism for monitoring its status.\n *\n * This method forcefully adds a single transaction to the list of transactions\n * being polled, ensuring that its status is checked, event emitted but no update is performed.\n * It overrides the default behavior by prioritizing the given transaction for polling.\n *\n * @param transactionMeta - The transaction metadata to be added for polling.\n *\n * The transaction will now be monitored for updates, such as confirmation or failure.\n */\n addTransactionToPoll(transactionMeta: TransactionMeta): void {\n this.#start([transactionMeta]);\n this.#transactionToForcePoll = transactionMeta;\n }\n\n /**\n * Force checks the network if the given transaction is confirmed and updates it's status.\n *\n * @param txMeta - The transaction to check\n */\n async forceCheckTransaction(txMeta: TransactionMeta): Promise<void> {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransaction(txMeta);\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to check transaction', error);\n } finally {\n releaseLock();\n }\n }\n\n #start(pendingTransactions: TransactionMeta[]): void {\n this.#transactionPoller.setPendingTransactions(pendingTransactions);\n\n if (this.#running) {\n return;\n }\n\n this.#transactionPoller.start(this.#listener);\n this.#running = true;\n\n this.#log('Started polling');\n }\n\n stop(): void {\n if (!this.#running) {\n return;\n }\n\n this.#transactionPoller.stop();\n this.#running = false;\n\n this.#log('Stopped polling');\n }\n\n async #onLatestBlock(latestBlockNumber: string): Promise<void> {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransactions();\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to check transactions', error);\n } finally {\n releaseLock();\n }\n\n try {\n await this.#resubmitTransactions(latestBlockNumber);\n } catch (error) {\n /* istanbul ignore next */\n this.#log('Failed to resubmit transactions', error);\n }\n }\n\n async #checkTransactions(): Promise<void> {\n this.#log('Checking transactions');\n\n const pendingTransactions: TransactionMeta[] = [\n ...this.#getPendingTransactions(),\n ...(this.#transactionToForcePoll ? [this.#transactionToForcePoll] : []),\n ];\n\n if (!pendingTransactions.length) {\n this.#log('No pending transactions to check');\n return;\n }\n\n this.#log('Found pending transactions to check', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n await Promise.all(\n pendingTransactions.map((tx) => this.#checkTransaction(tx)),\n );\n }\n\n async #resubmitTransactions(latestBlockNumber: string): Promise<void> {\n if (!this.#isResubmitEnabled() || !this.#running) {\n return;\n }\n\n this.#log('Resubmitting transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n this.#log('No pending transactions to resubmit');\n return;\n }\n\n this.#log('Found pending transactions to resubmit', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n for (const txMeta of pendingTransactions) {\n try {\n await this.#resubmitTransaction(txMeta, latestBlockNumber);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n /* istanbul ignore next */\n const errorMessage =\n error.value?.message?.toLowerCase() ??\n error.message?.toLowerCase() ??\n String(error);\n\n if (this.#isKnownTransactionError(errorMessage)) {\n this.#log('Ignoring known transaction error', errorMessage);\n continue;\n }\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was an error when resubmitting this transaction.',\n );\n }\n }\n }\n\n #isKnownTransactionError(errorMessage: string): boolean {\n return KNOWN_TRANSACTION_ERRORS.some((knownError) =>\n errorMessage.includes(knownError),\n );\n }\n\n async #resubmitTransaction(\n txMeta: TransactionMeta,\n latestBlockNumber: string,\n ): Promise<void> {\n if (!this.#isResubmitDue(txMeta, latestBlockNumber)) {\n return;\n }\n\n if (!(await this.#beforeCheckPendingTransaction(txMeta))) {\n return;\n }\n\n const ethQuery = this.#getEthQuery(txMeta.networkClientId);\n await this.#publishTransaction(ethQuery, txMeta);\n\n const retryCount = (txMeta.retryCount ?? 0) + 1;\n\n this.#updateTransaction(\n merge({}, txMeta, { retryCount }),\n 'PendingTransactionTracker:transaction-retry - Retry count increased',\n );\n }\n\n #isResubmitDue(txMeta: TransactionMeta, latestBlockNumber: string): boolean {\n const txMetaWithFirstRetryBlockNumber = cloneDeep(txMeta);\n\n if (!txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber) {\n txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber = latestBlockNumber;\n\n this.#updateTransaction(\n txMetaWithFirstRetryBlockNumber,\n 'PendingTransactionTracker:#isResubmitDue - First retry block number set',\n );\n }\n\n const { firstRetryBlockNumber } = txMetaWithFirstRetryBlockNumber;\n\n const blocksSinceFirstRetry =\n Number.parseInt(latestBlockNumber, 16) -\n Number.parseInt(firstRetryBlockNumber, 16);\n\n const retryCount = txMeta.retryCount ?? 0;\n\n // Exponential backoff to limit retries at publishing\n // Capped at ~15 minutes between retries\n const requiredBlocksSinceFirstRetry = Math.min(\n MAX_RETRY_BLOCK_DISTANCE,\n Math.pow(2, retryCount),\n );\n\n return blocksSinceFirstRetry >= requiredBlocksSinceFirstRetry;\n }\n\n #cleanTransactionToForcePoll(transactionId: string): void {\n if (this.#transactionToForcePoll?.id === transactionId) {\n this.#transactionToForcePoll = undefined;\n }\n }\n\n async #checkTransaction(txMeta: TransactionMeta): Promise<void> {\n const {\n hash,\n id,\n isIntentComplete,\n txParams: { from },\n } = txMeta;\n\n if (isIntentComplete) {\n await this.#onTransactionConfirmed(txMeta);\n return;\n }\n\n if (!hash && (await this.#beforeCheckPendingTransaction(txMeta))) {\n const error = new Error(\n 'We had an error while submitting this transaction, please try again.',\n );\n\n error.name = 'NoTxHashError';\n\n this.#failTransaction(txMeta, error);\n\n return;\n }\n\n if (this.#isNonceTaken(txMeta)) {\n this.#log('Nonce already taken', id);\n this.#dropTransaction(txMeta);\n return;\n }\n\n try {\n const receipt = await this.#getTransactionReceipt(hash);\n const isSuccess = receipt?.status === RECEIPT_STATUS_SUCCESS;\n const isFailure = receipt?.status === RECEIPT_STATUS_FAILURE;\n\n if (isFailure) {\n this.#log('Transaction receipt has failed status');\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction dropped or replaced'),\n );\n\n return;\n }\n\n const { blockNumber, blockHash } = receipt ?? {};\n\n if (isSuccess && blockNumber && blockHash) {\n await this.#onTransactionConfirmed(txMeta, {\n ...receipt,\n blockNumber,\n blockHash,\n });\n\n return;\n }\n\n this.#log('No receipt status', { hash, receipt });\n\n const nextNonceHex = await this.#getNetworkTransactionCount(from);\n const nextNonce = parseInt(nextNonceHex, 16);\n\n // Check if transaction should be failed due to no receipt\n if (!receipt && (await this.#isTransactionTimeout(txMeta, nextNonce))) {\n return;\n }\n\n if (await this.#isTransactionDropped(txMeta, nextNonce)) {\n this.#dropTransaction(txMeta);\n }\n } catch (error) {\n this.#log('Failed to check transaction', id, error);\n\n this.#warnTransaction(\n txMeta,\n (error as { message: string }).message,\n 'There was a problem loading this transaction.',\n );\n }\n }\n\n async #onTransactionConfirmed(\n txMeta: TransactionMeta,\n receipt?: SuccessfulTransactionReceipt,\n ): Promise<void> {\n const { id } = txMeta;\n const { blockHash } = receipt ?? {};\n\n this.#log('Transaction confirmed', id);\n\n if (this.#transactionToForcePoll) {\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-confirmed', txMeta);\n return;\n }\n\n const updatedTxMeta = cloneDeep(txMeta);\n\n if (receipt && blockHash) {\n const { baseFeePerGas, timestamp: blockTimestamp } =\n await this.#getBlockByHash(blockHash, false);\n\n updatedTxMeta.baseFeePerGas = baseFeePerGas;\n updatedTxMeta.blockTimestamp = blockTimestamp;\n updatedTxMeta.txParams = {\n ...updatedTxMeta.txParams,\n gasUsed: receipt.gasUsed,\n };\n updatedTxMeta.txReceipt = receipt;\n updatedTxMeta.verifiedOnBlockchain = true;\n }\n\n updatedTxMeta.status = TransactionStatus.confirmed;\n\n this.#updateTransaction(\n updatedTxMeta,\n 'PendingTransactionTracker:#onTransactionConfirmed - Transaction confirmed',\n );\n\n this.hub.emit('transaction-confirmed', updatedTxMeta);\n }\n\n async #isTransactionTimeout(\n txMeta: TransactionMeta,\n nextNonce: number,\n ): Promise<boolean> {\n const {\n chainId,\n hash,\n id: transactionId,\n txParams: { nonce },\n } = txMeta;\n\n if (!hash || !nonce) {\n return false;\n }\n\n if (!this.#isTimeoutEnabled(txMeta)) {\n this.#log('Timeout disabled for transaction', txMeta);\n return false;\n }\n\n const threshold = getTimeoutAttempts(chainId, this.#messenger);\n\n // Feature is disabled if threshold is undefined or zero\n if (threshold === undefined || threshold === 0) {\n this.#log('Timeout disabled due to threshold', { chainId, threshold });\n return false;\n }\n\n // Skip timeout if this transaction's nonce is a queued transaction with a future nonce\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber > nextNonce) {\n this.#log('Skipping timeout as queued transaction', {\n transactionNonce: nonceNumber,\n nextNonce,\n });\n return false;\n }\n\n try {\n // Check if transaction exists on the network\n const transaction = await this.#getTransactionByHash(hash);\n\n // If transaction exists, reset the counter\n if (transaction !== null) {\n this.#log(\n 'Transaction found on network, resetting timeout counter',\n transactionId,\n );\n\n this.#timeoutCountByHash.delete(hash);\n return false;\n }\n\n // Transaction doesn't exist, increment counter\n let attempts = this.#timeoutCountByHash.get(hash);\n\n attempts ??= 0;\n attempts += 1;\n this.#timeoutCountByHash.set(hash, attempts);\n\n this.#log('Incrementing timeout counter', {\n transactionId,\n attempts,\n threshold,\n });\n\n if (attempts < threshold) {\n return false;\n }\n\n this.#log('Hit timeout threshold', transactionId);\n this.#timeoutCountByHash.delete(hash);\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction not found on network after timeout'),\n );\n\n return true;\n } catch (error) {\n this.#log('Failed to check transaction by hash', transactionId, error);\n return false;\n }\n }\n\n async #isTransactionDropped(\n txMeta: TransactionMeta,\n nextNonce: number,\n ): Promise<boolean> {\n const {\n hash,\n id,\n txParams: { nonce },\n } = txMeta;\n\n /* istanbul ignore next */\n if (!nonce || !hash) {\n return false;\n }\n\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber >= nextNonce) {\n return false;\n }\n\n let droppedBlockCount = this.#droppedBlockCountByHash.get(hash);\n\n if (droppedBlockCount === undefined) {\n droppedBlockCount = 0;\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount);\n }\n\n if (droppedBlockCount < DROPPED_BLOCK_COUNT) {\n this.#log('Incrementing dropped block count', { id, droppedBlockCount });\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount + 1);\n return false;\n }\n\n this.#log('Hit dropped block count', id);\n\n this.#droppedBlockCountByHash.delete(hash);\n return true;\n }\n\n #isNonceTaken(txMeta: TransactionMeta): boolean {\n const { id, txParams } = txMeta;\n\n return this.#getChainTransactions().some(\n (tx) =>\n tx.id !== id &&\n tx.txParams.from === txParams.from &&\n tx.status === TransactionStatus.confirmed &&\n tx.txParams.nonce &&\n tx.txParams.nonce === txParams.nonce &&\n tx.type !== TransactionType.incoming &&\n tx.isTransfer === undefined,\n );\n }\n\n #getPendingTransactions(): TransactionMeta[] {\n return this.#getNetworkClientTransactions().filter(\n (tx) =>\n tx.status === TransactionStatus.submitted &&\n !tx.verifiedOnBlockchain &&\n !tx.isUserOperation,\n );\n }\n\n #warnTransaction(\n txMeta: TransactionMeta,\n error: string,\n message: string,\n ): void {\n this.#updateTransaction(\n {\n ...txMeta,\n warning: { error, message },\n },\n 'PendingTransactionTracker:#warnTransaction - Warning added',\n );\n }\n\n #failTransaction(txMeta: TransactionMeta, error: Error): void {\n this.#log('Transaction failed', txMeta.id, error);\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-failed', txMeta, error);\n }\n\n #dropTransaction(txMeta: TransactionMeta): void {\n this.#log('Transaction dropped', txMeta.id);\n this.#cleanTransactionToForcePoll(txMeta.id);\n this.hub.emit('transaction-dropped', txMeta);\n }\n\n #updateTransaction(txMeta: TransactionMeta, note: string): void {\n this.hub.emit('transaction-updated', txMeta, note);\n }\n\n async #getTransactionReceipt(\n txHash?: string,\n ): Promise<TransactionReceipt | undefined> {\n return await query(this.#getEthQuery(), 'getTransactionReceipt', [txHash]);\n }\n\n async #getTransactionByHash(txHash?: string): Promise<Json> {\n return await query(this.#getEthQuery(), 'getTransactionByHash', [txHash]);\n }\n\n async #getBlockByHash(\n blockHash: string,\n includeTransactionDetails: boolean,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return await query(this.#getEthQuery(), 'getBlockByHash', [\n blockHash,\n includeTransactionDetails,\n ]);\n }\n\n async #getNetworkTransactionCount(address: string): Promise<string> {\n return await query(this.#getEthQuery(), 'getTransactionCount', [address]);\n }\n\n #getChainTransactions(): TransactionMeta[] {\n const chainId = this.#getChainId();\n return this.#getTransactions().filter((tx) => tx.chainId === chainId);\n }\n\n #getNetworkClientTransactions(): TransactionMeta[] {\n const networkClientId = this.#getNetworkClientId();\n return this.#getTransactions().filter(\n (tx) => tx.networkClientId === networkClientId,\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResimulateHelper.cjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate() {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta) {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = () => {\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void) {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string) {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string) {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n) {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResimulateHelper.cjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate(): void {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta): void {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = (): void => {\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void): void {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string): void {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string): void {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): ResimulateResponse {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
@@ -24,10 +24,7 @@ export declare class ResimulateHelper {
|
|
|
24
24
|
* @param newTransactionMeta - The new transaction metadata.
|
|
25
25
|
* @returns Whether the transaction should be resimulated.
|
|
26
26
|
*/
|
|
27
|
-
export declare function shouldResimulate(originalTransactionMeta: TransactionMeta, newTransactionMeta: TransactionMeta):
|
|
28
|
-
blockTime: number | undefined;
|
|
29
|
-
resimulate: boolean;
|
|
30
|
-
};
|
|
27
|
+
export declare function shouldResimulate(originalTransactionMeta: TransactionMeta, newTransactionMeta: TransactionMeta): ResimulateResponse;
|
|
31
28
|
/**
|
|
32
29
|
* Determine if the simulation data has changed.
|
|
33
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResimulateHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,cAAc,EACd,eAAe,EAEhB,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;IACzC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E,CAAC;AAEF,qBAAa,gBAAgB;;gBAUf,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,uBAAuB;CAqF3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,uBAAuB,EAAE,eAAe,EACxC,kBAAkB,EAAE,eAAe
|
|
1
|
+
{"version":3,"file":"ResimulateHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,cAAc,EACd,eAAe,EAEhB,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;IACzC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E,CAAC;AAEF,qBAAa,gBAAgB;;gBAUf,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,uBAAuB;CAqF3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,uBAAuB,EAAE,eAAe,EACxC,kBAAkB,EAAE,eAAe,GAClC,kBAAkB,CA0CpB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,sBAAsB,EAAE,cAAc,EACtC,iBAAiB,EAAE,cAAc,GAChC,OAAO,CAmDT"}
|
|
@@ -24,10 +24,7 @@ export declare class ResimulateHelper {
|
|
|
24
24
|
* @param newTransactionMeta - The new transaction metadata.
|
|
25
25
|
* @returns Whether the transaction should be resimulated.
|
|
26
26
|
*/
|
|
27
|
-
export declare function shouldResimulate(originalTransactionMeta: TransactionMeta, newTransactionMeta: TransactionMeta):
|
|
28
|
-
blockTime: number | undefined;
|
|
29
|
-
resimulate: boolean;
|
|
30
|
-
};
|
|
27
|
+
export declare function shouldResimulate(originalTransactionMeta: TransactionMeta, newTransactionMeta: TransactionMeta): ResimulateResponse;
|
|
31
28
|
/**
|
|
32
29
|
* Determine if the simulation data has changed.
|
|
33
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResimulateHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,cAAc,EACd,eAAe,EAEhB,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;IACzC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E,CAAC;AAEF,qBAAa,gBAAgB;;gBAUf,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,uBAAuB;CAqF3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,uBAAuB,EAAE,eAAe,EACxC,kBAAkB,EAAE,eAAe
|
|
1
|
+
{"version":3,"file":"ResimulateHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,cAAc,EACd,eAAe,EAEhB,qBAAiB;AAKlB,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;IACzC,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrD,mBAAmB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E,CAAC;AAEF,qBAAa,gBAAgB;;gBAUf,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,EAAE,uBAAuB;CAqF3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,uBAAuB,EAAE,eAAe,EACxC,kBAAkB,EAAE,eAAe,GAClC,kBAAkB,CA0CpB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,sBAAsB,EAAE,cAAc,EACtC,iBAAiB,EAAE,cAAc,GAChC,OAAO,CAmDT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResimulateHelper.mjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate() {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta) {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = () => {\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void) {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string) {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string) {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n) {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResimulateHelper.mjs","sourceRoot":"","sources":["../../src/helpers/ResimulateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { remove0x } from '@metamask/utils';\nimport { BN } from 'bn.js';\nimport { isEqual } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport { TransactionStatus } from '../types';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n TransactionMeta,\n TransactionParams,\n} from '../types';\nimport { getPercentageChange } from '../utils/utils';\n\nconst log = createModuleLogger(projectLogger, 'resimulate-helper');\n\nexport const RESIMULATE_PARAMS = ['to', 'value', 'data'] as const;\nexport const BLOCKAID_RESULT_TYPE_MALICIOUS = 'Malicious';\nexport const VALUE_COMPARISON_PERCENT_THRESHOLD = 5;\nexport const BLOCK_TIME_ADDITIONAL_SECONDS = 60;\nexport const RESIMULATE_INTERVAL_MS = 3000;\n\nexport type ResimulateResponse = {\n blockTime?: number;\n resimulate: boolean;\n};\n\nexport type ResimulateHelperOptions = {\n getTransactions: () => TransactionMeta[];\n onTransactionsUpdate: (listener: () => void) => void;\n simulateTransaction: (transactionMeta: TransactionMeta) => Promise<void>;\n};\n\nexport class ResimulateHelper {\n // Map of transactionId <=> timeoutId\n readonly #timeoutIds: Map<string, NodeJS.Timeout> = new Map();\n\n readonly #getTransactions: () => TransactionMeta[];\n\n readonly #simulateTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<void>;\n\n constructor({\n getTransactions,\n simulateTransaction,\n onTransactionsUpdate,\n }: ResimulateHelperOptions) {\n this.#getTransactions = getTransactions;\n this.#simulateTransaction = simulateTransaction;\n\n onTransactionsUpdate(this.#onTransactionsUpdate.bind(this));\n }\n\n #onTransactionsUpdate(): void {\n const unapprovedTransactions = this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n\n const unapprovedTransactionIds = new Set(\n unapprovedTransactions.map((tx) => tx.id),\n );\n\n // Combine unapproved transaction IDs and currently active resimulations\n const allTransactionIds = new Set([\n ...unapprovedTransactionIds,\n ...this.#timeoutIds.keys(),\n ]);\n\n allTransactionIds.forEach((transactionId) => {\n const transactionMeta = unapprovedTransactions.find(\n (tx) => tx.id === transactionId,\n ) as TransactionMeta;\n\n if (transactionMeta?.isActive) {\n this.#start(transactionMeta);\n } else {\n this.#stop(transactionId);\n }\n });\n }\n\n #start(transactionMeta: TransactionMeta): void {\n const { id: transactionId } = transactionMeta;\n if (this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n const listener = (): void => {\n this.#simulateTransaction(transactionMeta)\n .catch((error) => {\n /* istanbul ignore next */\n log('Error during transaction resimulation', error);\n })\n .finally(() => {\n // Schedule the next execution\n if (this.#timeoutIds.has(transactionId)) {\n this.#queueUpdate(transactionId, listener);\n }\n });\n };\n\n // Start the first execution\n this.#queueUpdate(transactionId, listener);\n log(\n `Started resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #queueUpdate(transactionId: string, listener: () => void): void {\n const timeoutId = setTimeout(listener, RESIMULATE_INTERVAL_MS);\n this.#timeoutIds.set(transactionId, timeoutId);\n }\n\n #stop(transactionId: string): void {\n if (!this.#timeoutIds.has(transactionId)) {\n return;\n }\n\n this.#removeListener(transactionId);\n log(\n `Stopped resimulating transaction ${transactionId} every ${RESIMULATE_INTERVAL_MS} milliseconds`,\n );\n }\n\n #removeListener(id: string): void {\n const timeoutId = this.#timeoutIds.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.#timeoutIds.delete(id);\n }\n }\n}\n\n/**\n * Determine if a transaction should be resimulated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction should be resimulated.\n */\nexport function shouldResimulate(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): ResimulateResponse {\n const { id: transactionId } = newTransactionMeta;\n\n const parametersUpdated = isParametersUpdated(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const securityAlert = hasNewSecurityAlert(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const valueAndNativeBalanceMismatch = hasValueAndNativeBalanceMismatch(\n originalTransactionMeta,\n newTransactionMeta,\n );\n\n const resimulate =\n parametersUpdated || securityAlert || valueAndNativeBalanceMismatch;\n\n let blockTime: number | undefined;\n\n if (securityAlert || valueAndNativeBalanceMismatch) {\n const nowSeconds = Math.floor(Date.now() / 1000);\n blockTime = nowSeconds + BLOCK_TIME_ADDITIONAL_SECONDS;\n }\n\n if (resimulate) {\n log('Transaction should be resimulated', {\n transactionId,\n blockTime,\n parametersUpdated,\n securityAlert,\n valueAndNativeBalanceMismatch,\n });\n }\n\n return {\n blockTime,\n resimulate,\n };\n}\n\n/**\n * Determine if the simulation data has changed.\n *\n * @param originalSimulationData - The original simulation data.\n * @param newSimulationData - The new simulation data.\n * @returns Whether the simulation data has changed.\n */\nexport function hasSimulationDataChanged(\n originalSimulationData: SimulationData,\n newSimulationData: SimulationData,\n): boolean {\n if (isEqual(originalSimulationData, newSimulationData)) {\n return false;\n }\n\n if (\n isBalanceChangeUpdated(\n originalSimulationData?.nativeBalanceChange,\n newSimulationData?.nativeBalanceChange,\n )\n ) {\n log('Simulation data native balance changed');\n return true;\n }\n\n if (\n originalSimulationData.tokenBalanceChanges.length !==\n newSimulationData.tokenBalanceChanges.length\n ) {\n return true;\n }\n\n for (const originalTokenBalanceChange of originalSimulationData.tokenBalanceChanges) {\n const newTokenBalanceChange = newSimulationData.tokenBalanceChanges.find(\n ({ address, id }) =>\n address === originalTokenBalanceChange.address &&\n id === originalTokenBalanceChange.id,\n );\n\n if (!newTokenBalanceChange) {\n log('Missing new token balance', {\n address: originalTokenBalanceChange.address,\n id: originalTokenBalanceChange.id,\n });\n\n return true;\n }\n\n if (\n isBalanceChangeUpdated(originalTokenBalanceChange, newTokenBalanceChange)\n ) {\n log('Simulation data token balance changed', {\n originalTokenBalanceChange,\n newTokenBalanceChange,\n });\n\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Determine if the transaction parameters have been updated.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction parameters have been updated.\n */\nfunction isParametersUpdated(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { id: transactionId, txParams: newParams } = newTransactionMeta;\n const { txParams: originalParams } = originalTransactionMeta;\n\n if (!originalParams || isEqual(originalParams, newParams)) {\n return false;\n }\n\n const params = Object.keys(newParams) as (keyof TransactionParams)[];\n\n const updatedProperties = params.filter(\n (param) => newParams[param] !== originalParams[param],\n );\n\n log('Transaction parameters updated', {\n transactionId,\n updatedProperties,\n originalParams,\n newParams,\n });\n\n return RESIMULATE_PARAMS.some((param) => updatedProperties.includes(param));\n}\n\n/**\n * Determine if a transaction has a new security alert.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a new security alert.\n */\nfunction hasNewSecurityAlert(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { securityAlertResponse: originalSecurityAlertResponse } =\n originalTransactionMeta;\n\n const { id: transactionId, securityAlertResponse: newSecurityAlertResponse } =\n newTransactionMeta;\n\n if (isEqual(originalSecurityAlertResponse, newSecurityAlertResponse)) {\n return false;\n }\n\n log('Security alert updated', {\n transactionId,\n originalSecurityAlertResponse,\n newSecurityAlertResponse,\n });\n\n return (\n newSecurityAlertResponse?.result_type === BLOCKAID_RESULT_TYPE_MALICIOUS\n );\n}\n\n/**\n * Determine if a transaction has a value and simulation native balance mismatch.\n *\n * @param originalTransactionMeta - The original transaction metadata.\n * @param newTransactionMeta - The new transaction metadata.\n * @returns Whether the transaction has a value and simulation native balance mismatch.\n */\nfunction hasValueAndNativeBalanceMismatch(\n originalTransactionMeta: TransactionMeta,\n newTransactionMeta: TransactionMeta,\n): boolean {\n const { simulationData: originalSimulationData } = originalTransactionMeta;\n\n const { simulationData: newSimulationData, txParams: newTxParams } =\n newTransactionMeta;\n\n if (\n !newSimulationData ||\n isEqual(originalSimulationData, newSimulationData)\n ) {\n return false;\n }\n\n const newValue = newTxParams?.value ?? '0x0';\n\n const newNativeBalanceDifference =\n newSimulationData?.nativeBalanceChange?.difference ?? '0x0';\n\n return !percentageChangeWithinThreshold(\n newValue as Hex,\n newNativeBalanceDifference,\n false,\n newSimulationData?.nativeBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if a balance change has been updated.\n *\n * @param originalBalanceChange - The original balance change.\n * @param newBalanceChange - The new balance change.\n * @returns Whether the balance change has been updated.\n */\nfunction isBalanceChangeUpdated(\n originalBalanceChange?: SimulationBalanceChange,\n newBalanceChange?: SimulationBalanceChange,\n): boolean {\n return !percentageChangeWithinThreshold(\n originalBalanceChange?.difference ?? '0x0',\n newBalanceChange?.difference ?? '0x0',\n originalBalanceChange?.isDecrease === false,\n newBalanceChange?.isDecrease === false,\n );\n}\n\n/**\n * Determine if the percentage change between two values is within a threshold.\n *\n * @param originalValue - The original value.\n * @param newValue - The new value.\n * @param originalNegative - Whether the original value is negative.\n * @param newNegative - Whether the new value is negative.\n * @returns Whether the percentage change between the two values is within a threshold.\n */\nfunction percentageChangeWithinThreshold(\n originalValue: Hex,\n newValue: Hex,\n originalNegative?: boolean,\n newNegative?: boolean,\n): boolean {\n let originalValueBN = new BN(remove0x(originalValue), 'hex');\n let newValueBN = new BN(remove0x(newValue), 'hex');\n\n if (originalNegative) {\n originalValueBN = originalValueBN.neg();\n }\n\n if (newNegative) {\n newValueBN = newValueBN.neg();\n }\n\n return (\n getPercentageChange(originalValueBN, newValueBN) <=\n VALUE_COMPARISON_PERCENT_THRESHOLD\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAAqD;AAErD,mCAAiC;AAEjC,0CAA0C;AAG1C,8DAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAa,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,+BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,8BAAY,IAAI,MAAA,CAAC;QAErB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAEd,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,8BAAY,KAAK,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAa,SAAS,MAAA,CAAC;QAC3B,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAC3B,uBAAA,IAAI,0CAAwB,SAAS,MAAA,CAAC;QAEtC,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;QACpB,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;QAEzB,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAsC;QAC3D,MAAM,4BAA4B,GAAG,CAAC,uBAAA,IAAI,8CAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CACd,CAAC;QAEF,uBAAA,IAAI,0CAAwB,mBAAmB,MAAA,CAAC;QAEhD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,aAAa,GAAG,CAAC,IAAA,gBAAO,EAC5B,4BAA4B,EAC5B,wBAAwB,CACzB,CAAC;QAEF,IAAI,CAAC,uBAAA,IAAI,kCAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,mCAAmC,EAAE,wBAAwB,CAAC,CAAC;QAEnE,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAE3B,IAAI,uBAAA,IAAI,+CAAsB,EAAE,CAAC;YAC/B,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;YACzB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAChB,CAAC;IACH,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>): void {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop(): void {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]): void {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue(): void {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber): Promise<void> =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(\n isAccelerated: boolean,\n latestBlockNumber?: string,\n ): Promise<void> {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout(): void {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker(): void {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAanE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CAgGrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAanE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CAgGrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;;;AAIrD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,OAAO,EAAE,2BAA2B,EAAE,mCAA+B;AAErE,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,+BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,8BAAY,IAAI,MAAA,CAAC;QAErB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAEd,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,8BAAY,KAAK,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAa,SAAS,MAAA,CAAC;QAC3B,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAC3B,uBAAA,IAAI,0CAAwB,SAAS,MAAA,CAAC;QAEtC,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;QACpB,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;QAEzB,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAsC;QAC3D,MAAM,4BAA4B,GAAG,CAAC,uBAAA,IAAI,8CAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CACd,CAAC;QAEF,uBAAA,IAAI,0CAAwB,mBAAmB,MAAA,CAAC;QAEhD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,aAAa,GAAG,CAAC,OAAO,CAC5B,4BAA4B,EAC5B,wBAAwB,CACzB,CAAC;QAEF,IAAI,CAAC,uBAAA,IAAI,kCAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,mCAAmC,EAAE,wBAAwB,CAAC,CAAC;QAEnE,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAE3B,IAAI,uBAAA,IAAI,+CAAsB,EAAE,CAAC;YAC/B,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;YACzB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAChB,CAAC;IACH,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPoller.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;;;AAIrD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,OAAO,EAAE,2BAA2B,EAAE,mCAA+B;AAErE,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAmB5B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GAKV;;QA1BD,8CAAoB,CAAC,EAAC;QAEb,kDAA4B;QAE5B,6CAAc;QAEd,+CAA2C;QAEpD,0DAA4D;QAE5D,8CAAyD;QAEzD,yDAAyC;QAEzC,qCAAW,KAAK,EAAC;QAEjB,6CAA0B;QAWxB,uBAAA,IAAI,mCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,8BAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,gCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAsD;QAC1D,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,+BAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,8BAAY,IAAI,MAAA,CAAC;QAErB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAEd,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,8BAAY,KAAK,MAAA,CAAC;QACtB,uBAAA,IAAI,+BAAa,SAAS,MAAA,CAAC;QAC3B,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAC3B,uBAAA,IAAI,0CAAwB,SAAS,MAAA,CAAC;QAEtC,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;QACpB,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;QAEzB,GAAG,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAsC;QAC3D,MAAM,4BAA4B,GAAG,CAAC,uBAAA,IAAI,8CAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CACd,CAAC;QAEF,uBAAA,IAAI,0CAAwB,mBAAmB,MAAA,CAAC;QAEhD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,aAAa,GAAG,CAAC,OAAO,CAC5B,4BAA4B,EAC5B,wBAAwB,CACzB,CAAC;QAEF,IAAI,CAAC,uBAAA,IAAI,kCAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,mCAAmC,EAAE,wBAAwB,CAAC,CAAC;QAEnE,uBAAA,IAAI,uCAAqB,CAAC,MAAA,CAAC;QAE3B,IAAI,uBAAA,IAAI,+CAAsB,EAAE,CAAC;YAC/B,uBAAA,IAAI,yEAAkB,MAAtB,IAAI,CAAoB,CAAC;YACzB,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;QAChB,CAAC;IACH,CAAC;CAsEF;;IAnEG,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,2BAA2B,CAC1D,uBAAA,IAAI,kCAAS,EACb,uBAAA,IAAI,oCAAW,CAChB,CAAC;IAEF,IAAI,uBAAA,IAAI,2CAAkB,IAAI,QAAQ,EAAE,CAAC;QACvC,kEAAkE;QAClE,uBAAA,IAAI,2CAAyB,CAAC,iBAAiB,EAAiB,EAAE,CAChE,uBAAA,IAAI,iEAAU,MAAd,IAAI,EAAW,KAAK,EAAE,iBAAiB,CAAC,MAAA,CAAC;QAE3C,uBAAA,IAAI,uCAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAA,IAAI,+CAAsB,CAAC,CAAC;QAE5D,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAEpC,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,oEAAa,MAAjB,IAAI,CAAe,CAAC;IAEpB,kEAAkE;IAClE,uBAAA,IAAI,8BAAY,UAAU,CAAC,KAAK,IAAI,EAAE;QACpC,MAAM,uBAAA,IAAI,iEAAU,MAAd,IAAI,EAAW,IAAI,CAAC,CAAC;QAC3B,uBAAA,IAAI,8DAAO,MAAX,IAAI,CAAS,CAAC;IAChB,CAAC,EAAE,UAAU,CAAC,MAAA,CAAC;AACjB,CAAC,gCAED,KAAK,sCACH,aAAsB,EACtB,iBAA0B;IAE1B,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,sBAAsB,EAAE,uBAAA,IAAI,2CAAkB,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,sBAAsB,GAC1B,iBAAiB,IAAI,CAAC,MAAM,uBAAA,IAAI,uCAAc,CAAC,cAAc,EAAE,CAAC,CAAC;IAEnE,MAAM,uBAAA,IAAI,mCAAU,EAAE,KAAhB,IAAI,EAAa,sBAAsB,CAAC,CAAC;IAE/C,IAAI,aAAa,IAAI,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnC,2IAA0B,CAAC,MAAA,CAAC;IAC9B,CAAC;AACH,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,kCAAS,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,YAAY,CAAC,uBAAA,IAAI,kCAAS,CAAC,CAAC;IAC5B,uBAAA,IAAI,8BAAY,SAAS,MAAA,CAAC;AAC5B,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,+CAAsB,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,uCAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,uBAAA,IAAI,+CAAsB,CAAC,CAAC;IACxE,uBAAA,IAAI,2CAAyB,SAAS,MAAA,CAAC;AACzC,CAAC","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>): void {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop(): void {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]): void {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue(): void {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber): Promise<void> =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(\n isAccelerated: boolean,\n latestBlockNumber?: string,\n ): Promise<void> {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout(): void {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker(): void {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
|
|
@@ -81,7 +81,7 @@ _CollectPublishHook_results = new WeakMap(), _CollectPublishHook_transactionCoun
|
|
|
81
81
|
promise: publishPromise,
|
|
82
82
|
signedTransaction: signedTx,
|
|
83
83
|
});
|
|
84
|
-
__classPrivateFieldSet(this, _CollectPublishHook_results, (0, lodash_1.sortBy)(__classPrivateFieldGet(this, _CollectPublishHook_results, "f"), (
|
|
84
|
+
__classPrivateFieldSet(this, _CollectPublishHook_results, (0, lodash_1.sortBy)(__classPrivateFieldGet(this, _CollectPublishHook_results, "f"), (result) => result.nonce), "f");
|
|
85
85
|
if (__classPrivateFieldGet(this, _CollectPublishHook_results, "f").length === __classPrivateFieldGet(this, _CollectPublishHook_transactionCount, "f")) {
|
|
86
86
|
log('All transactions signed');
|
|
87
87
|
const signedTransactions = __classPrivateFieldGet(this, _CollectPublishHook_results, "f").map((result) => result.signedTransaction);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAA4E;AAC5E,mCAAgC;AAEhC,0CAA0C;AAG1C,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAMtE;;;GAGG;AACH,MAAa,kBAAkB;IAW7B,YAAY,gBAAwB;;QAVpC,8CAII;QAEK,uDAA0B;QAE1B,mDAAyD;QAGhE,uBAAA,IAAI,oCAAiB,IAAA,6BAAqB,GAAE,MAAA,CAAC;QAC7C,uBAAA,IAAI,+BAAY,EAAE,MAAA,CAAC;QACnB,uBAAA,IAAI,wCAAqB,gBAAgB,MAAA,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,uBAAA,IAAI,+DAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,uBAAA,IAAI,wCAAc,CAAC,OAAO,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAwB;QAC9B,GAAG,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEtC,IAAI,iBAAiB,CAAC,MAAM,KAAK,uBAAA,IAAI,4CAAkB,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAA,IAAI,mCAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,uBAAA,IAAI,mCAAS,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAE7C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAExB,KAAK,MAAM,MAAM,IAAI,uBAAA,IAAI,mCAAS,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CAuCF;AAhGD,gDAgGC;iQApCG,eAAgC,EAChC,QAAgB;IAEhB,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;IACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE5C,GAAG,CAAC,wBAAwB,EAAE;QAC5B,KAAK,EAAE,YAAY;QACnB,QAAQ;QACR,eAAe;KAChB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAA,6BAAqB,GAAqB,CAAC;IAElE,uBAAA,IAAI,mCAAS,CAAC,IAAI,CAAC;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,cAAc;QACvB,iBAAiB,EAAE,QAAe;KACnC,CAAC,CAAC;IAEH,uBAAA,IAAI,+BAAY,IAAA,eAAM,EAAC,uBAAA,IAAI,mCAAS,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"CollectPublishHook.cjs","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeferredPromise, Hex } from '@metamask/utils';\nimport { createDeferredPromise, createModuleLogger } from '@metamask/utils';\nimport { sortBy } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { PublishHook, PublishHookResult, TransactionMeta } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'collect-publish-hook');\n\nexport type CollectPublishHookResult = {\n signedTransactions: Hex[];\n};\n\n/**\n * Custom publish logic that collects multiple signed transactions until a specific number is reached.\n * Used by batch transactions to publish multiple transactions at once.\n */\nexport class CollectPublishHook {\n #results: {\n nonce: number;\n promise: DeferredPromise<PublishHookResult>;\n signedTransaction: Hex;\n }[];\n\n readonly #transactionCount: number;\n\n readonly #readyPromise: DeferredPromise<CollectPublishHookResult>;\n\n constructor(transactionCount: number) {\n this.#readyPromise = createDeferredPromise();\n this.#results = [];\n this.#transactionCount = transactionCount;\n }\n\n /**\n * @returns The publish hook function to be passed to `addTransaction`.\n */\n getHook(): PublishHook {\n return this.#hook.bind(this);\n }\n\n /**\n * @returns A promise that resolves when all transactions are signed.\n */\n ready(): Promise<CollectPublishHookResult> {\n return this.#readyPromise.promise;\n }\n\n /**\n * Resolve all publish promises with the provided transaction hashes.\n *\n * @param transactionHashes - The transaction hashes to pass to the original publish promises.\n */\n success(transactionHashes: Hex[]): void {\n log('Success', { transactionHashes });\n\n if (transactionHashes.length !== this.#transactionCount) {\n throw new Error('Transaction hash count mismatch');\n }\n\n for (let i = 0; i < this.#results.length; i++) {\n const result = this.#results[i];\n const transactionHash = transactionHashes[i];\n\n result.promise.resolve({ transactionHash });\n }\n }\n\n error(error: unknown): void {\n log('Error', { error });\n\n for (const result of this.#results) {\n result.promise.reject(error);\n }\n }\n\n #hook(\n transactionMeta: TransactionMeta,\n signedTx: string,\n ): Promise<PublishHookResult> {\n const nonceHex = transactionMeta.txParams.nonce ?? '0x0';\n const nonceDecimal = parseInt(nonceHex, 16);\n\n log('Processing transaction', {\n nonce: nonceDecimal,\n signedTx,\n transactionMeta,\n });\n\n const publishPromise = createDeferredPromise<PublishHookResult>();\n\n this.#results.push({\n nonce: nonceDecimal,\n promise: publishPromise,\n signedTransaction: signedTx as Hex,\n });\n\n this.#results = sortBy(this.#results, (result) => result.nonce);\n\n if (this.#results.length === this.#transactionCount) {\n log('All transactions signed');\n\n const signedTransactions = this.#results.map(\n (result) => result.signedTransaction,\n );\n\n this.#readyPromise.resolve({\n signedTransactions,\n });\n }\n\n return publishPromise.promise;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectPublishHook.d.cts","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,GAAG,EAAE,wBAAwB;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAsC,qBAAiB;AAIhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;;gBAWjB,gBAAgB,EAAE,MAAM;IAMpC;;OAEG;IACH,OAAO,IAAI,WAAW;IAItB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAI1C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"CollectPublishHook.d.cts","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,GAAG,EAAE,wBAAwB;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAsC,qBAAiB;AAIhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;;gBAWjB,gBAAgB,EAAE,MAAM;IAMpC;;OAEG;IACH,OAAO,IAAI,WAAW;IAItB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAI1C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,GAAG,IAAI;IAevC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CA6C5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectPublishHook.d.mts","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,GAAG,EAAE,wBAAwB;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAsC,qBAAiB;AAIhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;;gBAWjB,gBAAgB,EAAE,MAAM;IAMpC;;OAEG;IACH,OAAO,IAAI,WAAW;IAItB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAI1C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"CollectPublishHook.d.mts","sourceRoot":"","sources":["../../src/hooks/CollectPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,GAAG,EAAE,wBAAwB;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAsC,qBAAiB;AAIhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,kBAAkB,EAAE,GAAG,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;;gBAWjB,gBAAgB,EAAE,MAAM;IAMpC;;OAEG;IACH,OAAO,IAAI,WAAW;IAItB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAI1C;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,GAAG,IAAI;IAevC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CA6C5B"}
|
|
@@ -78,7 +78,7 @@ _CollectPublishHook_results = new WeakMap(), _CollectPublishHook_transactionCoun
|
|
|
78
78
|
promise: publishPromise,
|
|
79
79
|
signedTransaction: signedTx,
|
|
80
80
|
});
|
|
81
|
-
__classPrivateFieldSet(this, _CollectPublishHook_results, sortBy(__classPrivateFieldGet(this, _CollectPublishHook_results, "f"), (
|
|
81
|
+
__classPrivateFieldSet(this, _CollectPublishHook_results, sortBy(__classPrivateFieldGet(this, _CollectPublishHook_results, "f"), (result) => result.nonce), "f");
|
|
82
82
|
if (__classPrivateFieldGet(this, _CollectPublishHook_results, "f").length === __classPrivateFieldGet(this, _CollectPublishHook_transactionCount, "f")) {
|
|
83
83
|
log('All transactions signed');
|
|
84
84
|
const signedTransactions = __classPrivateFieldGet(this, _CollectPublishHook_results, "f").map((result) => result.signedTransaction);
|