diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index aa09687e4c2..6985ad72b9e 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `MantleLayer1GasFeeFlow` with `tokenRatio` conversion for accurate MNT-denominated gas estimates for Mantle and MantleSepolia ([#8386](https://github.com/MetaMask/core/pull/8386)) +### Changed + +- Skip simulation when transaction `containerTypes` includes `EnforcedSimulations` ([#8431](https://github.com/MetaMask/core/pull/8431)) + ## [64.2.0] ### Added diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index a505259940e..ea4c95a0dea 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -2345,6 +2345,37 @@ describe('TransactionController', () => { }); }); + it('skips simulation when containerTypes includes EnforcedSimulations', async () => { + const { controller } = setupController(); + + const { transactionMeta } = await controller.addTransaction( + { + from: ACCOUNT_MOCK, + to: ACCOUNT_MOCK, + }, + { + networkClientId: NETWORK_CLIENT_ID_MOCK, + }, + ); + + await flushPromises(); + + expect(getBalanceChangesMock).toHaveBeenCalledTimes(1); + + shouldResimulateMock.mockReturnValue({ + blockTime: 123, + resimulate: true, + }); + + await controller.updateEditableParams(transactionMeta.id, { + containerTypes: [TransactionContainerType.EnforcedSimulations], + }); + + await flushPromises(); + + expect(getBalanceChangesMock).toHaveBeenCalledTimes(1); + }); + describe('with beforeSign hook', () => { it('calls beforeSign hook', async () => { const beforeSignHook = jest.fn().mockResolvedValueOnce({}); diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 5493d4c6e5b..b78422231e7 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -122,7 +122,6 @@ import type { TransactionBatchMeta, AfterSimulateHook, BeforeSignHook, - TransactionContainerType, GetSimulationConfig, AddTransactionOptions, PublishHookResult, @@ -131,6 +130,7 @@ import type { } from './types'; import { GasFeeEstimateLevel, + TransactionContainerType, TransactionEnvelopeType, TransactionType, TransactionStatus, @@ -4241,6 +4241,15 @@ export class TransactionController extends BaseController< return transactionMeta; } + #isBalanceChangesSkipped(transactionMeta: TransactionMeta): boolean { + return ( + this.#skipSimulationTransactionIds.has(transactionMeta.id) || + transactionMeta.containerTypes?.includes( + TransactionContainerType.EnforcedSimulations, + ) === true + ); + } + async #updateSimulationData( transactionMeta: TransactionMeta, { @@ -4272,7 +4281,7 @@ export class TransactionController extends BaseController< let isGasFeeSponsored = false; const isBalanceChangesSkipped = - this.#skipSimulationTransactionIds.has(transactionId); + this.#isBalanceChangesSkipped(transactionMeta); if (this.#isSimulationEnabled() && !isBalanceChangesSkipped) { const balanceChangesResult = await this.#trace( @@ -4336,7 +4345,7 @@ export class TransactionController extends BaseController< txMeta.isGasFeeSponsored = isGasFeeSponsored; txMeta.gasUsed = gasUsed; - if (!isBalanceChangesSkipped) { + if (!this.#isBalanceChangesSkipped(txMeta)) { txMeta.simulationData = simulationData; } },