Skip to content

Conversation

@matthewwalsh0
Copy link
Member

@matthewwalsh0 matthewwalsh0 commented Oct 30, 2025

Explanation

Only check if transaction pay quotes need refreshing when quotes exist in the controller state.

Also:

  • Reset isLoading state if quote update fails.
  • Get fiat rates using address from request rather than quote.
  • Ignore unnecessary token amount when calculating totals.
  • Use correct feature flag.
  • Clear state if transaction rejected.
  • Add additional logging to quote retrieval errors.

References

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, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

Note

Introduce quote-refresh polling based on existing quotes, correct feature flag keys, improve fee/fiat calculations, and refine transaction/quote refresh behavior.

  • Controller (src/TransactionPayController.ts):
    • Replace queueRefreshQuotes with QuoteRefresher and ensure isLoading reset after updateQuotes.
  • Helpers:
    • Add QuoteRefresher to poll refreshQuotes only when transactionData contains quotes; prevents concurrent updates and handles errors.
  • Strategies:
    • Bridge (bridge-quotes.ts):
      • Wrap quote fetch in try/catch with logging; throw clearer error.
      • Use confirmations_pay feature flag key.
      • Use request.sourceTokenAddress for source fiat rate.
    • Relay (relay-quotes.ts):
      • Wrap quote fetch in try/catch with logging; throw clearer error.
      • Use confirmations_pay feature flag key.
      • Compute source network cost across all step items.
  • Quotes Utils (utils/quotes.ts):
    • Build requests by matching sourceAmounts to tokens by address.
    • Export refreshQuotes; remove internal polling; respect per-strategy refresh intervals; set loading during refresh.
  • Totals (utils/totals.ts):
    • Exclude tokens marked skipIfBalance when balance ≥ amount from totals.
  • Transactions (utils/transaction.ts):
    • Remove state when transactions are finalized or deleted.
  • Tests & Changelog:
    • Add/adjust tests for refresher, strategies, totals, quotes, and transaction removal.
    • Update CHANGELOG.md with fixes (ignore tokens without quotes; correct feature flag).

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

@matthewwalsh0
Copy link
Member 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": "2.0.0-preview-24bcd769",
  "@metamask-previews/accounts-controller": "34.0.0-preview-24bcd769",
  "@metamask-previews/address-book-controller": "7.0.0-preview-24bcd769",
  "@metamask-previews/announcement-controller": "8.0.0-preview-24bcd769",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-24bcd769",
  "@metamask-previews/approval-controller": "8.0.0-preview-24bcd769",
  "@metamask-previews/assets-controllers": "85.0.0-preview-24bcd769",
  "@metamask-previews/base-controller": "9.0.0-preview-24bcd769",
  "@metamask-previews/bridge-controller": "57.0.0-preview-24bcd769",
  "@metamask-previews/bridge-status-controller": "57.0.0-preview-24bcd769",
  "@metamask-previews/build-utils": "3.0.4-preview-24bcd769",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-24bcd769",
  "@metamask-previews/composable-controller": "12.0.0-preview-24bcd769",
  "@metamask-previews/controller-utils": "11.15.0-preview-24bcd769",
  "@metamask-previews/core-backend": "4.0.0-preview-24bcd769",
  "@metamask-previews/delegation-controller": "1.0.0-preview-24bcd769",
  "@metamask-previews/earn-controller": "9.0.0-preview-24bcd769",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-24bcd769",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-24bcd769",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-24bcd769",
  "@metamask-previews/ens-controller": "18.0.0-preview-24bcd769",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-24bcd769",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-24bcd769",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-24bcd769",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-24bcd769",
  "@metamask-previews/foundryup": "1.0.1-preview-24bcd769",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-24bcd769",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-24bcd769",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-24bcd769",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-24bcd769",
  "@metamask-previews/keyring-controller": "24.0.0-preview-24bcd769",
  "@metamask-previews/logging-controller": "7.0.0-preview-24bcd769",
  "@metamask-previews/message-manager": "14.0.0-preview-24bcd769",
  "@metamask-previews/messenger": "0.3.0-preview-24bcd769",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-24bcd769",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-24bcd769",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-24bcd769",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-24bcd769",
  "@metamask-previews/name-controller": "9.0.0-preview-24bcd769",
  "@metamask-previews/network-controller": "25.0.0-preview-24bcd769",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-24bcd769",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-24bcd769",
  "@metamask-previews/permission-controller": "12.1.0-preview-24bcd769",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-24bcd769",
  "@metamask-previews/phishing-controller": "15.0.0-preview-24bcd769",
  "@metamask-previews/polling-controller": "15.0.0-preview-24bcd769",
  "@metamask-previews/preferences-controller": "21.0.0-preview-24bcd769",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-24bcd769",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-24bcd769",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-24bcd769",
  "@metamask-previews/sample-controllers": "3.0.0-preview-24bcd769",
  "@metamask-previews/seedless-onboarding-controller": "5.0.0-preview-24bcd769",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-24bcd769",
  "@metamask-previews/shield-controller": "1.1.0-preview-24bcd769",
  "@metamask-previews/signature-controller": "35.0.0-preview-24bcd769",
  "@metamask-previews/subscription-controller": "3.1.0-preview-24bcd769",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-24bcd769",
  "@metamask-previews/transaction-controller": "61.0.0-preview-24bcd769",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-24bcd769",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-24bcd769"
}

@matthewwalsh0
Copy link
Member Author

@metamaskbot publish-preview

@matthewwalsh0 matthewwalsh0 changed the title fix: native polygon source in transaction bridge feat: optimise transaction pay quote refresh Oct 30, 2025
@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": "2.0.0-preview-14bbab23",
  "@metamask-previews/accounts-controller": "34.0.0-preview-14bbab23",
  "@metamask-previews/address-book-controller": "7.0.0-preview-14bbab23",
  "@metamask-previews/announcement-controller": "8.0.0-preview-14bbab23",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-14bbab23",
  "@metamask-previews/approval-controller": "8.0.0-preview-14bbab23",
  "@metamask-previews/assets-controllers": "85.0.0-preview-14bbab23",
  "@metamask-previews/base-controller": "9.0.0-preview-14bbab23",
  "@metamask-previews/bridge-controller": "57.0.0-preview-14bbab23",
  "@metamask-previews/bridge-status-controller": "57.0.0-preview-14bbab23",
  "@metamask-previews/build-utils": "3.0.4-preview-14bbab23",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-14bbab23",
  "@metamask-previews/composable-controller": "12.0.0-preview-14bbab23",
  "@metamask-previews/controller-utils": "11.15.0-preview-14bbab23",
  "@metamask-previews/core-backend": "4.0.0-preview-14bbab23",
  "@metamask-previews/delegation-controller": "1.0.0-preview-14bbab23",
  "@metamask-previews/earn-controller": "9.0.0-preview-14bbab23",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-14bbab23",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-14bbab23",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-14bbab23",
  "@metamask-previews/ens-controller": "18.0.0-preview-14bbab23",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-14bbab23",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-14bbab23",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-14bbab23",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-14bbab23",
  "@metamask-previews/foundryup": "1.0.1-preview-14bbab23",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-14bbab23",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-14bbab23",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-14bbab23",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-14bbab23",
  "@metamask-previews/keyring-controller": "24.0.0-preview-14bbab23",
  "@metamask-previews/logging-controller": "7.0.0-preview-14bbab23",
  "@metamask-previews/message-manager": "14.0.0-preview-14bbab23",
  "@metamask-previews/messenger": "0.3.0-preview-14bbab23",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-14bbab23",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-14bbab23",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-14bbab23",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-14bbab23",
  "@metamask-previews/name-controller": "9.0.0-preview-14bbab23",
  "@metamask-previews/network-controller": "25.0.0-preview-14bbab23",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-14bbab23",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-14bbab23",
  "@metamask-previews/permission-controller": "12.1.0-preview-14bbab23",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-14bbab23",
  "@metamask-previews/phishing-controller": "15.0.0-preview-14bbab23",
  "@metamask-previews/polling-controller": "15.0.0-preview-14bbab23",
  "@metamask-previews/preferences-controller": "21.0.0-preview-14bbab23",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-14bbab23",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-14bbab23",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-14bbab23",
  "@metamask-previews/sample-controllers": "3.0.0-preview-14bbab23",
  "@metamask-previews/seedless-onboarding-controller": "5.0.0-preview-14bbab23",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-14bbab23",
  "@metamask-previews/shield-controller": "1.1.0-preview-14bbab23",
  "@metamask-previews/signature-controller": "35.0.0-preview-14bbab23",
  "@metamask-previews/subscription-controller": "3.1.0-preview-14bbab23",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-14bbab23",
  "@metamask-previews/transaction-controller": "61.0.0-preview-14bbab23",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-14bbab23",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-14bbab23"
}

@matthewwalsh0
Copy link
Member 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": "2.0.0-preview-7df8698e",
  "@metamask-previews/accounts-controller": "34.0.0-preview-7df8698e",
  "@metamask-previews/address-book-controller": "7.0.0-preview-7df8698e",
  "@metamask-previews/announcement-controller": "8.0.0-preview-7df8698e",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-7df8698e",
  "@metamask-previews/approval-controller": "8.0.0-preview-7df8698e",
  "@metamask-previews/assets-controllers": "85.0.0-preview-7df8698e",
  "@metamask-previews/base-controller": "9.0.0-preview-7df8698e",
  "@metamask-previews/bridge-controller": "57.0.0-preview-7df8698e",
  "@metamask-previews/bridge-status-controller": "57.0.0-preview-7df8698e",
  "@metamask-previews/build-utils": "3.0.4-preview-7df8698e",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-7df8698e",
  "@metamask-previews/composable-controller": "12.0.0-preview-7df8698e",
  "@metamask-previews/controller-utils": "11.15.0-preview-7df8698e",
  "@metamask-previews/core-backend": "4.0.0-preview-7df8698e",
  "@metamask-previews/delegation-controller": "1.0.0-preview-7df8698e",
  "@metamask-previews/earn-controller": "9.0.0-preview-7df8698e",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-7df8698e",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-7df8698e",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-7df8698e",
  "@metamask-previews/ens-controller": "18.0.0-preview-7df8698e",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-7df8698e",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-7df8698e",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-7df8698e",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-7df8698e",
  "@metamask-previews/foundryup": "1.0.1-preview-7df8698e",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-7df8698e",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-7df8698e",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-7df8698e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-7df8698e",
  "@metamask-previews/keyring-controller": "24.0.0-preview-7df8698e",
  "@metamask-previews/logging-controller": "7.0.0-preview-7df8698e",
  "@metamask-previews/message-manager": "14.0.0-preview-7df8698e",
  "@metamask-previews/messenger": "0.3.0-preview-7df8698e",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-7df8698e",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-7df8698e",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-7df8698e",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-7df8698e",
  "@metamask-previews/name-controller": "9.0.0-preview-7df8698e",
  "@metamask-previews/network-controller": "25.0.0-preview-7df8698e",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-7df8698e",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-7df8698e",
  "@metamask-previews/permission-controller": "12.1.0-preview-7df8698e",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-7df8698e",
  "@metamask-previews/phishing-controller": "15.0.0-preview-7df8698e",
  "@metamask-previews/polling-controller": "15.0.0-preview-7df8698e",
  "@metamask-previews/preferences-controller": "21.0.0-preview-7df8698e",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-7df8698e",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-7df8698e",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-7df8698e",
  "@metamask-previews/sample-controllers": "3.0.0-preview-7df8698e",
  "@metamask-previews/seedless-onboarding-controller": "5.0.0-preview-7df8698e",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-7df8698e",
  "@metamask-previews/shield-controller": "1.1.0-preview-7df8698e",
  "@metamask-previews/signature-controller": "35.0.0-preview-7df8698e",
  "@metamask-previews/subscription-controller": "3.1.0-preview-7df8698e",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-7df8698e",
  "@metamask-previews/transaction-controller": "61.0.0-preview-7df8698e",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-7df8698e",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-7df8698e"
}

@matthewwalsh0 matthewwalsh0 force-pushed the fix/pay-polygon-bridge branch from 7df8698 to 7983b22 Compare October 31, 2025 02:42
@matthewwalsh0 matthewwalsh0 marked this pull request as ready for review October 31, 2025 02:47
@matthewwalsh0 matthewwalsh0 requested review from a team as code owners October 31, 2025 02:47
*
* @param quote - Relay quote.
* @param messenger - Controller messenger.
* @returns Total source network cost in USD and fiat.
Copy link
Contributor

Choose a reason for hiding this comment

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

what is the difference between USD and fiat? Is fiat the user's selected currency?

Copy link
Member Author

@matthewwalsh0 matthewwalsh0 Oct 31, 2025

Choose a reason for hiding this comment

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

Exactly, I've made a point of providing both everywhere so it's easy to access since Perps and Predict force USD everywhere.

I've confirmed the difference in the FiatRates and FiatValue JSDoc.

@matthewwalsh0 matthewwalsh0 merged commit f46b795 into main Oct 31, 2025
264 checks passed
@matthewwalsh0 matthewwalsh0 deleted the fix/pay-polygon-bridge branch October 31, 2025 09:47
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