Skip to content

Conversation

@vinistevam
Copy link
Contributor

@vinistevam vinistevam commented Dec 5, 2025

Explanation

This PR deprecates the history and sendFlowHistory properties and all the code related.

Problem
Extension state size has been identified as a major root cause for the app becoming bricked, particularly for power users. Analysis by the platform team revealed that history and sendFlowHistory are among the biggest contributors to excessive state size, leading to frequent disk writes and the infinite spinner issue.

References

fixes https://github.com/MetaMask/MetaMask-planning/issues/2465

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Deprecates and removes internal handling of history and sendFlowHistory from TransactionController and types, simplifying updates and state while keeping deprecated fields for compatibility.

  • Transaction Controller:
    • Remove history tracking: delete utils/history and all calls to addInitialHistorySnapshot/updateTransactionHistory.
    • Deprecate history and sendFlowHistory on TransactionMeta; mark related types (TransactionHistory, TransactionHistoryEntry, SendFlowHistoryEntry) as deprecated.
    • Deprecate constructor options disableHistory and disableSendFlowHistory (no longer used); keep for backward compatibility.
    • Make updateTransactionSendFlowHistory a no-op returning the transaction unchanged.
    • Change updateTransaction to log the note instead of writing to history.
    • Remove exports of history-related constants/types from index.ts.
  • Tests:
    • Remove assertions and fixtures referencing transaction history/sendFlowHistory; delete utils/history.test.ts; adjust unit/integration tests accordingly.
  • Docs/Meta:
    • Update CHANGELOG with deprecation notice.
    • Minor comment typo fix ("mainnet").

Written by Cursor Bugbot for commit 0e32918. This will update automatically on new commits. Configure here.

@vinistevam
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Dec 9, 2025

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-f557eade",
  "@metamask-previews/accounts-controller": "35.0.0-preview-f557eade",
  "@metamask-previews/address-book-controller": "7.0.1-preview-f557eade",
  "@metamask-previews/analytics-controller": "0.0.0-preview-f557eade",
  "@metamask-previews/announcement-controller": "8.0.0-preview-f557eade",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-f557eade",
  "@metamask-previews/approval-controller": "8.0.0-preview-f557eade",
  "@metamask-previews/assets-controllers": "93.1.0-preview-f557eade",
  "@metamask-previews/base-controller": "9.0.0-preview-f557eade",
  "@metamask-previews/bridge-controller": "64.0.0-preview-f557eade",
  "@metamask-previews/bridge-status-controller": "64.0.1-preview-f557eade",
  "@metamask-previews/build-utils": "3.0.4-preview-f557eade",
  "@metamask-previews/chain-agnostic-permission": "1.3.0-preview-f557eade",
  "@metamask-previews/claims-controller": "0.2.0-preview-f557eade",
  "@metamask-previews/composable-controller": "12.0.0-preview-f557eade",
  "@metamask-previews/controller-utils": "11.16.0-preview-f557eade",
  "@metamask-previews/core-backend": "5.0.0-preview-f557eade",
  "@metamask-previews/delegation-controller": "2.0.0-preview-f557eade",
  "@metamask-previews/earn-controller": "11.0.0-preview-f557eade",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-f557eade",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-f557eade",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-f557eade",
  "@metamask-previews/ens-controller": "19.0.0-preview-f557eade",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-f557eade",
  "@metamask-previews/eth-block-tracker": "15.0.0-preview-f557eade",
  "@metamask-previews/eth-json-rpc-middleware": "22.0.0-preview-f557eade",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-f557eade",
  "@metamask-previews/foundryup": "1.0.1-preview-f557eade",
  "@metamask-previews/gas-fee-controller": "26.0.0-preview-f557eade",
  "@metamask-previews/gator-permissions-controller": "0.7.0-preview-f557eade",
  "@metamask-previews/json-rpc-engine": "10.2.0-preview-f557eade",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-f557eade",
  "@metamask-previews/keyring-controller": "25.0.0-preview-f557eade",
  "@metamask-previews/logging-controller": "7.0.1-preview-f557eade",
  "@metamask-previews/message-manager": "14.1.0-preview-f557eade",
  "@metamask-previews/messenger": "0.3.0-preview-f557eade",
  "@metamask-previews/multichain-account-service": "4.0.0-preview-f557eade",
  "@metamask-previews/multichain-api-middleware": "1.2.5-preview-f557eade",
  "@metamask-previews/multichain-network-controller": "3.0.0-preview-f557eade",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-f557eade",
  "@metamask-previews/name-controller": "9.0.0-preview-f557eade",
  "@metamask-previews/network-controller": "27.0.0-preview-f557eade",
  "@metamask-previews/network-enablement-controller": "4.0.0-preview-f557eade",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-f557eade",
  "@metamask-previews/permission-controller": "12.1.1-preview-f557eade",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-f557eade",
  "@metamask-previews/phishing-controller": "16.1.0-preview-f557eade",
  "@metamask-previews/polling-controller": "16.0.0-preview-f557eade",
  "@metamask-previews/preferences-controller": "22.0.0-preview-f557eade",
  "@metamask-previews/profile-metrics-controller": "1.0.0-preview-f557eade",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-f557eade",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-f557eade",
  "@metamask-previews/remote-feature-flag-controller": "3.0.0-preview-f557eade",
  "@metamask-previews/sample-controllers": "4.0.0-preview-f557eade",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-f557eade",
  "@metamask-previews/selected-network-controller": "26.0.0-preview-f557eade",
  "@metamask-previews/shield-controller": "3.1.0-preview-f557eade",
  "@metamask-previews/signature-controller": "37.0.0-preview-f557eade",
  "@metamask-previews/storage-service": "0.0.0-preview-f557eade",
  "@metamask-previews/subscription-controller": "5.4.0-preview-f557eade",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-f557eade",
  "@metamask-previews/transaction-controller": "62.5.0-preview-f557eade",
  "@metamask-previews/transaction-pay-controller": "10.4.0-preview-f557eade",
  "@metamask-previews/user-operation-controller": "41.0.0-preview-f557eade"
}

@vinistevam
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-d717276a",
  "@metamask-previews/accounts-controller": "35.0.0-preview-d717276a",
  "@metamask-previews/address-book-controller": "7.0.1-preview-d717276a",
  "@metamask-previews/analytics-controller": "0.0.0-preview-d717276a",
  "@metamask-previews/announcement-controller": "8.0.0-preview-d717276a",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-d717276a",
  "@metamask-previews/approval-controller": "8.0.0-preview-d717276a",
  "@metamask-previews/assets-controllers": "93.1.0-preview-d717276a",
  "@metamask-previews/base-controller": "9.0.0-preview-d717276a",
  "@metamask-previews/bridge-controller": "64.1.0-preview-d717276a",
  "@metamask-previews/bridge-status-controller": "64.1.0-preview-d717276a",
  "@metamask-previews/build-utils": "3.0.4-preview-d717276a",
  "@metamask-previews/chain-agnostic-permission": "1.3.0-preview-d717276a",
  "@metamask-previews/claims-controller": "0.2.0-preview-d717276a",
  "@metamask-previews/composable-controller": "12.0.0-preview-d717276a",
  "@metamask-previews/controller-utils": "11.16.0-preview-d717276a",
  "@metamask-previews/core-backend": "5.0.0-preview-d717276a",
  "@metamask-previews/delegation-controller": "2.0.0-preview-d717276a",
  "@metamask-previews/earn-controller": "11.0.0-preview-d717276a",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-d717276a",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-d717276a",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-d717276a",
  "@metamask-previews/ens-controller": "19.0.0-preview-d717276a",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-d717276a",
  "@metamask-previews/eth-block-tracker": "15.0.0-preview-d717276a",
  "@metamask-previews/eth-json-rpc-middleware": "22.0.1-preview-d717276a",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-d717276a",
  "@metamask-previews/foundryup": "1.0.1-preview-d717276a",
  "@metamask-previews/gas-fee-controller": "26.0.0-preview-d717276a",
  "@metamask-previews/gator-permissions-controller": "0.8.0-preview-d717276a",
  "@metamask-previews/json-rpc-engine": "10.2.0-preview-d717276a",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-d717276a",
  "@metamask-previews/keyring-controller": "25.0.0-preview-d717276a",
  "@metamask-previews/logging-controller": "7.0.1-preview-d717276a",
  "@metamask-previews/message-manager": "14.1.0-preview-d717276a",
  "@metamask-previews/messenger": "0.3.0-preview-d717276a",
  "@metamask-previews/multichain-account-service": "4.0.1-preview-d717276a",
  "@metamask-previews/multichain-api-middleware": "1.2.5-preview-d717276a",
  "@metamask-previews/multichain-network-controller": "3.0.0-preview-d717276a",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-d717276a",
  "@metamask-previews/name-controller": "9.0.0-preview-d717276a",
  "@metamask-previews/network-controller": "27.0.0-preview-d717276a",
  "@metamask-previews/network-enablement-controller": "4.0.0-preview-d717276a",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-d717276a",
  "@metamask-previews/permission-controller": "12.1.1-preview-d717276a",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-d717276a",
  "@metamask-previews/phishing-controller": "16.1.0-preview-d717276a",
  "@metamask-previews/polling-controller": "16.0.0-preview-d717276a",
  "@metamask-previews/preferences-controller": "22.0.0-preview-d717276a",
  "@metamask-previews/profile-metrics-controller": "1.0.0-preview-d717276a",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-d717276a",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-d717276a",
  "@metamask-previews/remote-feature-flag-controller": "3.0.0-preview-d717276a",
  "@metamask-previews/sample-controllers": "4.0.0-preview-d717276a",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-d717276a",
  "@metamask-previews/selected-network-controller": "26.0.0-preview-d717276a",
  "@metamask-previews/shield-controller": "4.0.0-preview-d717276a",
  "@metamask-previews/signature-controller": "38.0.0-preview-d717276a",
  "@metamask-previews/storage-service": "0.0.0-preview-d717276a",
  "@metamask-previews/subscription-controller": "5.4.0-preview-d717276a",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-d717276a",
  "@metamask-previews/transaction-controller": "62.6.0-preview-d717276a",
  "@metamask-previews/transaction-pay-controller": "10.5.0-preview-d717276a",
  "@metamask-previews/user-operation-controller": "41.0.0-preview-d717276a"
}

@vinistevam vinistevam changed the title refactor: remove transaction history and sendFlowHistory refactor: deprecate transaction history and sendFlowHistory properties Dec 11, 2025
@vinistevam vinistevam marked this pull request as ready for review December 11, 2025 13:53
@vinistevam vinistevam requested review from a team as code owners December 11, 2025 13:53
@vinistevam
Copy link
Contributor Author

Extension draft PR: MetaMask/metamask-extension#38665

/** TransactionController constructor options. */
export type TransactionControllerOptions = {
/** Whether to disable storing history in transaction metadata. */
/** @deprecated Whether to disable storing history in transaction metadata. */
Copy link
Member

@matthewwalsh0 matthewwalsh0 Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we update all the deprecated comments to just confirm No longer used for example?

readonly #trace: TraceCallback;

readonly #transactionHistoryLimit: number;
// readonly #transactionHistoryLimit: number;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't related to the history properties, but how many transactions we retain. We need to keep this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reverted a changes related with transactionHistoryLimit

);

this.update((state) => {
state.transactions = this.#trimTransactionsForState(newTransactions);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We still need to trim the transactions according to the transaction state limit?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reverted #trimTransactionsForState.

* @param sendFlowHistoryToAdd - The sendFlowHistory entries to add.
* @returns The updated transactionMeta.
*/
updateTransactionSendFlowHistory(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're avoiding breaking changes in this PR, should we empty this and mark it deprecated?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Marked as deprecated and removed code.

it('does not if all unique transactions are truncated', async () => {
const helper = new IncomingTransactionHelper({
...CONTROLLER_ARGS_MOCK,
trimTransactions: (): TransactionMeta[] => [],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still needed as mentioned in other comment.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rollback this change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants