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 history/sendFlowHistory and removes all internal history recording/trimming, simplifying incoming tx handling and updating types, tests, and exports.

  • Deprecations:
    • Mark TransactionMeta.history and sendFlowHistory as deprecated; deprecate disableHistory, disableSendFlowHistory, and transactionHistoryLimit options.
  • Removals/Refactors:
    • Delete history utilities (utils/history.*) and related tests; stop creating/updating history snapshots.
    • Remove transaction trimming and history mutation paths (e.g., #trimTransactionsForState, history notes); updateTransaction now logs note only.
    • Remove updateTransactionSendFlowHistory API and all send-flow history handling.
    • Drop exports tied to history (DISPLAYED_TRANSACTION_HISTORY_PATHS, MAX_TRANSACTION_HISTORY_LENGTH).
  • Behavior changes:
    • Controller no longer trims transactions when adding/updating/clearing; incoming transactions helper simplified (no trim callback).
    • Tests updated to reflect ordering/absence of history fields.
  • Docs/Changelog:
    • CHANGELOG entry announcing deprecations and refactor.

Written by Cursor Bugbot for commit 87558a8. 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

readonly #trace: TraceCallback;

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

Choose a reason for hiding this comment

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

Bug: Commented-out code left in production code

A commented-out line // readonly #transactionHistoryLimit: number; was left in the codebase. This appears to be leftover from the deprecation process where the #transactionHistoryLimit property was removed but the line was commented out instead of being fully deleted.

Fix in Cursor Fix in Web

/** 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.

);

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?

...transactionMeta,
}));

log(`Transaction ${transactionId} updated. ${note}`);
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
log(`Transaction ${transactionId} updated. ${note}`);
log('Transaction updated', {transactionId, note});

* @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?

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.

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