diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index 11fc740c5c..0917481818 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 ([#9800](https://github.com/MetaMask/core/pull/9800)) + ## [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..e967efa297 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; @@ -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;