Skip to content

feat: stop polling when bridge history item is stale or has an invalid src hash#8479

Merged
micaelae merged 29 commits intomainfrom
swaps4380-invalid-src-hash
Apr 22, 2026
Merged

feat: stop polling when bridge history item is stale or has an invalid src hash#8479
micaelae merged 29 commits intomainfrom
swaps4380-invalid-src-hash

Conversation

@micaelae
Copy link
Copy Markdown
Member

@micaelae micaelae commented Apr 16, 2026

Explanation

Problem

Bridge txHistory persists invalid or premature src tx hashes (specially STX), and pending items could be polled indefinitely, spamming providers and leaving bad state after restarts.

Solution

  • Subscribe to TransactionController:transactionStatusUpdated instead of transactionFailed / transactionConfirmed, and update history item matching the tx id, action id, hash, batch, or approval

  • Skips persisting STX src hashes on submit. Set the hash when the tx is confirmed, or backfill from TransactionController as needed

  • If a transaction is deemed "too old", fetch the status once, then check if the tx has been mined on chain. If The src hash is nonexistent, stop polling and delete the history item to prevent re-polling on the next restart

References

Fixes https://consensyssoftware.atlassian.net/browse/SWAPS-4380

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

Medium Risk
Changes bridge status polling/state management and switches to TransactionController:transactionStatusUpdated, which can affect analytics, history reconciliation, and when polling starts/stops. Also deletes old pending history entries based on a remote-configured age threshold, so misconfiguration or matching bugs could drop legitimate items.

Overview
Prevents indefinite bridge status polling by introducing an age threshold (maxPendingHistoryItemAgeMs, default 2 days) sourced from remote feature flags and, for stale pending items, fetching status once then checking eth_getTransactionReceipt; if the src hash appears invalid, polling is stopped, a new invalid_transaction_hash polling reason is tracked, and the history entry is removed to avoid re-polling on restart.

Refactors BridgeStatusController transaction subscriptions to use TransactionController:transactionStatusUpdated (replacing transactionFailed/transactionConfirmed), adds more robust history matching (by id, actionId, batchId, txHash, and approvalTxId), and avoids persisting smart-transaction src hashes until a finalized status is observed; metrics generation is updated accordingly (centralized polling-status properties and improved error_message formatting).

Reviewed by Cursor Bugbot for commit dbfbe65. Bugbot is set up for automated code reviews on this repo. Configure here.

@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch 4 times, most recently from cecef86 to b0227e9 Compare April 20, 2026 21:44
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from b0227e9 to 449f0ed Compare April 20, 2026 22:02
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from 449f0ed to 28dd789 Compare April 20, 2026 22:15
@micaelae
Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.1.0-preview-8e9c439
@metamask-previews/accounts-controller@37.2.0-preview-8e9c439
@metamask-previews/address-book-controller@7.1.1-preview-8e9c439
@metamask-previews/ai-controllers@0.6.3-preview-8e9c439
@metamask-previews/analytics-controller@1.0.1-preview-8e9c439
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-8e9c439
@metamask-previews/announcement-controller@8.1.0-preview-8e9c439
@metamask-previews/app-metadata-controller@2.0.1-preview-8e9c439
@metamask-previews/approval-controller@9.0.1-preview-8e9c439
@metamask-previews/assets-controller@6.0.0-preview-8e9c439
@metamask-previews/assets-controllers@104.1.0-preview-8e9c439
@metamask-previews/authenticated-user-storage@0.0.0-preview-8e9c439
@metamask-previews/base-controller@9.1.0-preview-8e9c439
@metamask-previews/base-data-service@0.1.1-preview-8e9c439
@metamask-previews/bridge-controller@70.1.1-preview-8e9c439
@metamask-previews/bridge-status-controller@70.0.5-preview-8e9c439
@metamask-previews/build-utils@3.0.4-preview-8e9c439
@metamask-previews/chain-agnostic-permission@1.5.0-preview-8e9c439
@metamask-previews/chomp-api-service@1.0.0-preview-8e9c439
@metamask-previews/claims-controller@0.5.0-preview-8e9c439
@metamask-previews/client-controller@1.0.1-preview-8e9c439
@metamask-previews/compliance-controller@2.0.0-preview-8e9c439
@metamask-previews/composable-controller@12.0.1-preview-8e9c439
@metamask-previews/config-registry-controller@0.2.0-preview-8e9c439
@metamask-previews/connectivity-controller@0.2.0-preview-8e9c439
@metamask-previews/controller-utils@11.20.0-preview-8e9c439
@metamask-previews/core-backend@6.2.1-preview-8e9c439
@metamask-previews/delegation-controller@3.0.0-preview-8e9c439
@metamask-previews/earn-controller@12.0.0-preview-8e9c439
@metamask-previews/eip-5792-middleware@3.0.3-preview-8e9c439
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-8e9c439
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-8e9c439
@metamask-previews/ens-controller@19.1.1-preview-8e9c439
@metamask-previews/eth-block-tracker@15.0.1-preview-8e9c439
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-8e9c439
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-8e9c439
@metamask-previews/foundryup@1.0.1-preview-8e9c439
@metamask-previews/gas-fee-controller@26.1.1-preview-8e9c439
@metamask-previews/gator-permissions-controller@4.0.0-preview-8e9c439
@metamask-previews/geolocation-controller@0.1.2-preview-8e9c439
@metamask-previews/json-rpc-engine@10.2.4-preview-8e9c439
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-8e9c439
@metamask-previews/keyring-controller@25.2.0-preview-8e9c439
@metamask-previews/logging-controller@8.0.1-preview-8e9c439
@metamask-previews/message-manager@14.1.1-preview-8e9c439
@metamask-previews/messenger@1.1.1-preview-8e9c439
@metamask-previews/messenger-cli@0.2.0-preview-8e9c439
@metamask-previews/money-account-balance-service@0.2.0-preview-8e9c439
@metamask-previews/money-account-controller@0.1.0-preview-8e9c439
@metamask-previews/money-account-upgrade-controller@0.0.0-preview-8e9c439
@metamask-previews/multichain-account-service@8.0.1-preview-8e9c439
@metamask-previews/multichain-api-middleware@2.0.0-preview-8e9c439
@metamask-previews/multichain-network-controller@3.0.6-preview-8e9c439
@metamask-previews/multichain-transactions-controller@7.0.4-preview-8e9c439
@metamask-previews/name-controller@9.1.1-preview-8e9c439
@metamask-previews/network-controller@30.0.1-preview-8e9c439
@metamask-previews/network-enablement-controller@5.0.2-preview-8e9c439
@metamask-previews/notification-services-controller@23.1.0-preview-8e9c439
@metamask-previews/permission-controller@12.3.0-preview-8e9c439
@metamask-previews/permission-log-controller@5.1.0-preview-8e9c439
@metamask-previews/perps-controller@3.2.0-preview-8e9c439
@metamask-previews/phishing-controller@17.1.1-preview-8e9c439
@metamask-previews/polling-controller@16.0.4-preview-8e9c439
@metamask-previews/preferences-controller@23.1.0-preview-8e9c439
@metamask-previews/profile-metrics-controller@3.1.3-preview-8e9c439
@metamask-previews/profile-sync-controller@28.0.2-preview-8e9c439
@metamask-previews/ramps-controller@13.2.0-preview-8e9c439
@metamask-previews/rate-limit-controller@7.0.1-preview-8e9c439
@metamask-previews/react-data-query@0.2.0-preview-8e9c439
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-8e9c439
@metamask-previews/sample-controllers@4.0.4-preview-8e9c439
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-8e9c439
@metamask-previews/selected-network-controller@26.1.0-preview-8e9c439
@metamask-previews/shield-controller@5.1.1-preview-8e9c439
@metamask-previews/signature-controller@39.2.0-preview-8e9c439
@metamask-previews/social-controllers@2.0.0-preview-8e9c439
@metamask-previews/storage-service@1.0.1-preview-8e9c439
@metamask-previews/subscription-controller@6.1.2-preview-8e9c439
@metamask-previews/transaction-controller@64.3.0-preview-8e9c439
@metamask-previews/transaction-pay-controller@19.2.1-preview-8e9c439
@metamask-previews/user-operation-controller@41.2.0-preview-8e9c439

@micaelae micaelae marked this pull request as ready for review April 21, 2026 17:07
@micaelae micaelae requested review from a team as code owners April 21, 2026 17:07
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
@micaelae micaelae force-pushed the swaps4380-invalid-src-hash branch from 5b420db to 86fb638 Compare April 21, 2026 22:41
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
@micaelae micaelae enabled auto-merge April 21, 2026 23:24
@micaelae
Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.1.0-preview-92fa59a42
@metamask-previews/accounts-controller@37.2.0-preview-92fa59a42
@metamask-previews/address-book-controller@7.1.1-preview-92fa59a42
@metamask-previews/ai-controllers@0.6.3-preview-92fa59a42
@metamask-previews/analytics-controller@1.0.1-preview-92fa59a42
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-92fa59a42
@metamask-previews/announcement-controller@8.1.0-preview-92fa59a42
@metamask-previews/app-metadata-controller@2.0.1-preview-92fa59a42
@metamask-previews/approval-controller@9.0.1-preview-92fa59a42
@metamask-previews/assets-controller@6.0.0-preview-92fa59a42
@metamask-previews/assets-controllers@104.1.0-preview-92fa59a42
@metamask-previews/authenticated-user-storage@1.0.0-preview-92fa59a42
@metamask-previews/base-controller@9.1.0-preview-92fa59a42
@metamask-previews/base-data-service@0.1.1-preview-92fa59a42
@metamask-previews/bridge-controller@70.1.1-preview-92fa59a42
@metamask-previews/bridge-status-controller@70.0.5-preview-92fa59a42
@metamask-previews/build-utils@3.0.4-preview-92fa59a42
@metamask-previews/chain-agnostic-permission@1.5.0-preview-92fa59a42
@metamask-previews/chomp-api-service@1.0.0-preview-92fa59a42
@metamask-previews/claims-controller@0.5.0-preview-92fa59a42
@metamask-previews/client-controller@1.0.1-preview-92fa59a42
@metamask-previews/compliance-controller@2.0.0-preview-92fa59a42
@metamask-previews/composable-controller@12.0.1-preview-92fa59a42
@metamask-previews/config-registry-controller@0.2.0-preview-92fa59a42
@metamask-previews/connectivity-controller@0.2.0-preview-92fa59a42
@metamask-previews/controller-utils@11.20.0-preview-92fa59a42
@metamask-previews/core-backend@6.2.1-preview-92fa59a42
@metamask-previews/delegation-controller@3.0.0-preview-92fa59a42
@metamask-previews/earn-controller@12.0.0-preview-92fa59a42
@metamask-previews/eip-5792-middleware@3.0.3-preview-92fa59a42
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-92fa59a42
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-92fa59a42
@metamask-previews/ens-controller@19.1.1-preview-92fa59a42
@metamask-previews/eth-block-tracker@15.0.1-preview-92fa59a42
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-92fa59a42
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-92fa59a42
@metamask-previews/foundryup@1.0.1-preview-92fa59a42
@metamask-previews/gas-fee-controller@26.1.1-preview-92fa59a42
@metamask-previews/gator-permissions-controller@4.0.0-preview-92fa59a42
@metamask-previews/geolocation-controller@0.1.2-preview-92fa59a42
@metamask-previews/json-rpc-engine@10.2.4-preview-92fa59a42
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-92fa59a42
@metamask-previews/keyring-controller@25.2.0-preview-92fa59a42
@metamask-previews/logging-controller@8.0.1-preview-92fa59a42
@metamask-previews/message-manager@14.1.1-preview-92fa59a42
@metamask-previews/messenger@1.1.1-preview-92fa59a42
@metamask-previews/messenger-cli@0.2.0-preview-92fa59a42
@metamask-previews/money-account-balance-service@0.2.0-preview-92fa59a42
@metamask-previews/money-account-controller@0.1.0-preview-92fa59a42
@metamask-previews/money-account-upgrade-controller@1.0.0-preview-92fa59a42
@metamask-previews/multichain-account-service@8.0.1-preview-92fa59a42
@metamask-previews/multichain-api-middleware@2.0.0-preview-92fa59a42
@metamask-previews/multichain-network-controller@3.0.6-preview-92fa59a42
@metamask-previews/multichain-transactions-controller@7.0.4-preview-92fa59a42
@metamask-previews/name-controller@9.1.1-preview-92fa59a42
@metamask-previews/network-controller@30.0.1-preview-92fa59a42
@metamask-previews/network-enablement-controller@5.0.2-preview-92fa59a42
@metamask-previews/notification-services-controller@23.1.0-preview-92fa59a42
@metamask-previews/permission-controller@12.3.0-preview-92fa59a42
@metamask-previews/permission-log-controller@5.1.0-preview-92fa59a42
@metamask-previews/perps-controller@3.2.0-preview-92fa59a42
@metamask-previews/phishing-controller@17.1.1-preview-92fa59a42
@metamask-previews/polling-controller@16.0.4-preview-92fa59a42
@metamask-previews/preferences-controller@23.1.0-preview-92fa59a42
@metamask-previews/profile-metrics-controller@3.1.3-preview-92fa59a42
@metamask-previews/profile-sync-controller@28.0.2-preview-92fa59a42
@metamask-previews/ramps-controller@13.2.0-preview-92fa59a42
@metamask-previews/rate-limit-controller@7.0.1-preview-92fa59a42
@metamask-previews/react-data-query@0.2.0-preview-92fa59a42
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-92fa59a42
@metamask-previews/sample-controllers@4.0.4-preview-92fa59a42
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-92fa59a42
@metamask-previews/selected-network-controller@26.1.0-preview-92fa59a42
@metamask-previews/shield-controller@5.1.1-preview-92fa59a42
@metamask-previews/signature-controller@39.2.0-preview-92fa59a42
@metamask-previews/social-controllers@2.0.0-preview-92fa59a42
@metamask-previews/storage-service@1.0.1-preview-92fa59a42
@metamask-previews/subscription-controller@6.1.2-preview-92fa59a42
@metamask-previews/transaction-controller@64.3.0-preview-92fa59a42
@metamask-previews/transaction-pay-controller@19.2.1-preview-92fa59a42
@metamask-previews/user-operation-controller@41.2.0-preview-92fa59a42

Comment thread packages/bridge-status-controller/src/utils/bridge-status.ts
Comment thread packages/bridge-status-controller/src/utils/history.ts Outdated
Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit dbfbe65. Configure here.

Comment thread packages/bridge-status-controller/src/bridge-status-controller.ts
@micaelae micaelae added this pull request to the merge queue Apr 22, 2026
Merged via the queue into main with commit 7a01c95 Apr 22, 2026
358 checks passed
@micaelae micaelae deleted the swaps4380-invalid-src-hash branch April 22, 2026 18:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants