From 4c6667fe5e4f2020598880376e930a1183826ddc Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 7 Aug 2026 12:38:28 +0100 Subject: [PATCH 1/3] feat: extend isSimulationEnabled to accept optional TransactionMeta argument --- packages/transaction-controller/CHANGELOG.md | 4 ++++ .../src/TransactionController.test.ts | 24 +++++++++++++++++++ .../src/TransactionController.ts | 12 +++++----- .../transaction-controller/src/utils/batch.ts | 2 +- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index 11fc740c5c..5f9e0badbb 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Extend `isSimulationEnabled` option to accept an optional `TransactionMeta` argument, enabling callback consumers to inspect the relevant transaction ([#XXXX](https://github.com/MetaMask/core/pull/XXXX)) + ## [69.5.1] ### Changed diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index 97a14a14ea..15f2e8ae9b 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -2662,6 +2662,30 @@ describe('TransactionController', () => { }); }); + it('passes the transaction meta to the isSimulationEnabled callback', async () => { + const isSimulationEnabled = jest.fn().mockReturnValue(true); + + const { controller } = setupController({ + options: { isSimulationEnabled }, + }); + + const { transactionMeta } = await controller.addTransaction( + { + from: ACCOUNT_MOCK, + to: ACCOUNT_MOCK, + }, + { + networkClientId: NETWORK_CLIENT_ID_MOCK, + }, + ); + + await flushPromises(); + + expect(isSimulationEnabled).toHaveBeenCalledWith( + expect.objectContaining({ id: transactionMeta.id }), + ); + }); + it('unless approval not required', async () => { getBalanceChangesMock.mockResolvedValueOnce({ simulationData: SIMULATION_DATA_RESULT_MOCK, diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 244a0318ee..a78d062b72 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -374,7 +374,7 @@ export type TransactionControllerOptions = { isFirstTimeInteractionEnabled?: () => boolean; /** Whether new transactions will be automatically simulated. */ - isSimulationEnabled?: () => boolean; + isSimulationEnabled?: (transactionMeta?: TransactionMeta) => boolean; /** Whether timeout checking is enabled for a transaction. */ isTimeoutEnabled?: (transactionMeta: TransactionMeta) => boolean; @@ -750,7 +750,7 @@ export class TransactionController extends BaseController< readonly #isFirstTimeInteractionEnabled: () => boolean; - readonly #isSimulationEnabled: () => boolean; + readonly #isSimulationEnabled: (transactionMeta?: TransactionMeta) => boolean; readonly #isSwapsDisabled: boolean; @@ -843,7 +843,7 @@ export class TransactionController extends BaseController< ((): Promise => Promise.resolve(false)); this.#isFirstTimeInteractionEnabled = isFirstTimeInteractionEnabled ?? ((): boolean => true); - this.#isSimulationEnabled = isSimulationEnabled ?? ((): boolean => true); + this.#isSimulationEnabled = isSimulationEnabled ?? ((_txMeta?: TransactionMeta): boolean => true); this.#isSwapsDisabled = disableSwaps ?? false; this.#isTimeoutEnabled = isTimeoutEnabled ?? ((): boolean => true); this.#publicKeyEIP7702 = publicKeyEIP7702; @@ -4039,7 +4039,7 @@ export class TransactionController extends BaseController< validateTxParams(transactionMeta.txParams); } - if (!skipResimulateCheck && this.#isSimulationEnabled()) { + if (!skipResimulateCheck && this.#isSimulationEnabled(transactionMeta)) { resimulateResponse = shouldResimulate( originalTransactionMeta, transactionMeta, @@ -4109,7 +4109,7 @@ export class TransactionController extends BaseController< this.#simulationRequestTokens.set(transactionId, simulationRequestToken); try { - const isSimulationEnabled = this.#isSimulationEnabled(); + const isSimulationEnabled = this.#isSimulationEnabled(transactionMeta); const isBalanceChangesSkipped = this.#isBalanceChangesSkipped(transactionMeta); @@ -4327,7 +4327,7 @@ export class TransactionController extends BaseController< await updateGas({ isCustomNetwork, - isSimulationEnabled: this.#isSimulationEnabled(), + isSimulationEnabled: this.#isSimulationEnabled(transactionMeta), getSimulationConfig: this.#getSimulationConfig, messenger: this.messenger, txMeta: transactionMeta, diff --git a/packages/transaction-controller/src/utils/batch.ts b/packages/transaction-controller/src/utils/batch.ts index 5978fbf277..16e5c0c4bc 100644 --- a/packages/transaction-controller/src/utils/batch.ts +++ b/packages/transaction-controller/src/utils/batch.ts @@ -85,7 +85,7 @@ type AddTransactionBatchRequest = { ) => PendingTransactionTracker; getSimulationConfig: GetSimulationConfig; getTransaction: (id: string) => TransactionMeta; - isSimulationEnabled: () => boolean; + isSimulationEnabled: (transactionMeta?: TransactionMeta) => boolean; messenger: TransactionControllerMessenger; publishBatchHook?: PublishBatchHook; publishTransaction: (transactionMeta: TransactionMeta) => Promise; From 4f49a1ad3348daf3179aadb1f41c20d2fea933c0 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 7 Aug 2026 12:43:09 +0100 Subject: [PATCH 2/3] fix: simplify isSimulationEnabled default fallback to pass Prettier check --- packages/transaction-controller/src/TransactionController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index a78d062b72..e967efa297 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -843,7 +843,7 @@ export class TransactionController extends BaseController< ((): Promise => Promise.resolve(false)); this.#isFirstTimeInteractionEnabled = isFirstTimeInteractionEnabled ?? ((): boolean => true); - this.#isSimulationEnabled = isSimulationEnabled ?? ((_txMeta?: TransactionMeta): boolean => true); + this.#isSimulationEnabled = isSimulationEnabled ?? ((): boolean => true); this.#isSwapsDisabled = disableSwaps ?? false; this.#isTimeoutEnabled = isTimeoutEnabled ?? ((): boolean => true); this.#publicKeyEIP7702 = publicKeyEIP7702; From eae8df2277be8ed345b05d5e1547839db45e9967 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Fri, 7 Aug 2026 12:45:50 +0100 Subject: [PATCH 3/3] fix: update changelog PR link placeholder --- packages/transaction-controller/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index 5f9e0badbb..0917481818 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Extend `isSimulationEnabled` option to accept an optional `TransactionMeta` argument, enabling callback consumers to inspect the relevant transaction ([#XXXX](https://github.com/MetaMask/core/pull/XXXX)) +- Extend `isSimulationEnabled` option to accept an optional `TransactionMeta` argument, enabling callback consumers to inspect the relevant transaction ([#9800](https://github.com/MetaMask/core/pull/9800)) ## [69.5.1]