Skip to content

Conversation

@matthewwalsh0
Copy link
Member

@matthewwalsh0 matthewwalsh0 commented Oct 12, 2025

Explanation

Add the initial version of the TransactionPayController.

This intends to migrate the majority of the MetaMask Pay functionality from the mobile client, so it can be used without duplication in the extension.

For an architecture overview, see ARCHITECTURE.md.

Includes:

  • Required token generation from ERC-20 token transfers and required gas fees.
  • Alternate pay strategies using MetaMask bridge infrastructure or Relay.
  • Publish hook for TransactionController to submit and wait for quotes.
  • Token and balance generation using asset controllers.
  • Payment token selection using updatePaymentToken action / method.
  • Automatic quote and total generation on transaction creation and update.

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

Adds @metamask/transaction-pay-controller to power MetaMask Pay with bridge/relay strategies, automatic required-token detection, quote orchestration, and a TransactionController publish hook.

  • New Package: @metamask/transaction-pay-controller
    • Controller to fund transactions by supplying required ERC-20/native tokens across chains.
    • Detects required tokens (ERC-20 transfers via 0xa9059cbb, gas fees), selects payment token, computes source amounts, fetches quotes, and aggregates totals.
    • Strategies:
      • BridgeStrategy: fetches via BridgeController, submits via BridgeStatusController, supports batch txs and configurable refresh intervals.
      • RelayStrategy: fetches from Relay API, submits txs directly; supports Hyperliquid/Polygon-native normalization and skip-original-tx flow.
    • Publish Hook: TransactionPayPublishHook executes strategy quotes on publish and awaits completion.
    • Utilities: required-token parsing, gas cost calc, quote refresh queue, totals calc, token/rate/balance helpers.
    • Comprehensive tests, TypeDoc, Jest config, and exports.
  • Monorepo Integration:
    • Update README.md (package list + dependency graph), CODEOWNERS, teams.json.
    • Add tsconfig references, yarn.lock entries, and changelog/license/metadata files.

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

@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch from 0e50e56 to 4c6b861 Compare October 20, 2025 09:35
@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch 2 times, most recently from f286d34 to 1854460 Compare October 27, 2025 12:20
@matthewwalsh0 matthewwalsh0 changed the base branch from main to feat/transaction-controller-intent-complete October 27, 2025 12:20
@matthewwalsh0 matthewwalsh0 changed the base branch from feat/transaction-controller-intent-complete to main October 27, 2025 12:21
@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch 3 times, most recently from f319b5c to ab1550f Compare October 27, 2025 13:16
@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": "1.6.0-preview-6bf4b220",
  "@metamask-previews/accounts-controller": "33.2.0-preview-6bf4b220",
  "@metamask-previews/address-book-controller": "6.2.1-preview-6bf4b220",
  "@metamask-previews/announcement-controller": "7.1.1-preview-6bf4b220",
  "@metamask-previews/app-metadata-controller": "1.1.1-preview-6bf4b220",
  "@metamask-previews/approval-controller": "7.2.1-preview-6bf4b220",
  "@metamask-previews/assets-controllers": "83.1.0-preview-6bf4b220",
  "@metamask-previews/base-controller": "8.4.2-preview-6bf4b220",
  "@metamask-previews/bridge-controller": "55.0.0-preview-6bf4b220",
  "@metamask-previews/bridge-status-controller": "55.0.0-preview-6bf4b220",
  "@metamask-previews/build-utils": "3.0.4-preview-6bf4b220",
  "@metamask-previews/chain-agnostic-permission": "1.2.1-preview-6bf4b220",
  "@metamask-previews/composable-controller": "11.1.1-preview-6bf4b220",
  "@metamask-previews/controller-utils": "11.14.1-preview-6bf4b220",
  "@metamask-previews/core-backend": "3.0.0-preview-6bf4b220",
  "@metamask-previews/delegation-controller": "0.8.1-preview-6bf4b220",
  "@metamask-previews/earn-controller": "8.0.2-preview-6bf4b220",
  "@metamask-previews/eip-5792-middleware": "1.2.4-preview-6bf4b220",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-6bf4b220",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-6bf4b220",
  "@metamask-previews/ens-controller": "17.1.1-preview-6bf4b220",
  "@metamask-previews/error-reporting-service": "2.2.2-preview-6bf4b220",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-6bf4b220",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-6bf4b220",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-6bf4b220",
  "@metamask-previews/foundryup": "1.0.1-preview-6bf4b220",
  "@metamask-previews/gas-fee-controller": "24.1.1-preview-6bf4b220",
  "@metamask-previews/gator-permissions-controller": "0.2.2-preview-6bf4b220",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-6bf4b220",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-6bf4b220",
  "@metamask-previews/keyring-controller": "23.2.0-preview-6bf4b220",
  "@metamask-previews/logging-controller": "6.1.1-preview-6bf4b220",
  "@metamask-previews/message-manager": "13.0.2-preview-6bf4b220",
  "@metamask-previews/messenger": "0.3.0-preview-6bf4b220",
  "@metamask-previews/multichain-account-service": "1.6.2-preview-6bf4b220",
  "@metamask-previews/multichain-api-middleware": "1.2.2-preview-6bf4b220",
  "@metamask-previews/multichain-network-controller": "1.0.2-preview-6bf4b220",
  "@metamask-previews/multichain-transactions-controller": "5.1.1-preview-6bf4b220",
  "@metamask-previews/name-controller": "8.1.1-preview-6bf4b220",
  "@metamask-previews/network-controller": "24.3.1-preview-6bf4b220",
  "@metamask-previews/network-enablement-controller": "2.1.2-preview-6bf4b220",
  "@metamask-previews/notification-services-controller": "18.3.1-preview-6bf4b220",
  "@metamask-previews/permission-controller": "11.1.1-preview-6bf4b220",
  "@metamask-previews/permission-log-controller": "4.1.1-preview-6bf4b220",
  "@metamask-previews/phishing-controller": "14.1.3-preview-6bf4b220",
  "@metamask-previews/polling-controller": "14.0.2-preview-6bf4b220",
  "@metamask-previews/preferences-controller": "20.1.1-preview-6bf4b220",
  "@metamask-previews/profile-sync-controller": "25.1.2-preview-6bf4b220",
  "@metamask-previews/rate-limit-controller": "6.1.1-preview-6bf4b220",
  "@metamask-previews/remote-feature-flag-controller": "1.9.1-preview-6bf4b220",
  "@metamask-previews/sample-controllers": "2.0.2-preview-6bf4b220",
  "@metamask-previews/seedless-onboarding-controller": "4.1.1-preview-6bf4b220",
  "@metamask-previews/selected-network-controller": "24.0.2-preview-6bf4b220",
  "@metamask-previews/shield-controller": "0.4.0-preview-6bf4b220",
  "@metamask-previews/signature-controller": "34.0.2-preview-6bf4b220",
  "@metamask-previews/subscription-controller": "2.1.0-preview-6bf4b220",
  "@metamask-previews/token-search-discovery-controller": "3.5.1-preview-6bf4b220",
  "@metamask-previews/transaction-controller": "60.10.0-preview-6bf4b220",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-6bf4b220",
  "@metamask-previews/user-operation-controller": "39.2.1-preview-6bf4b220"
}

@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch from 6bf4b22 to 77daf0c Compare October 27, 2025 18:16
@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": "1.6.0-preview-77daf0c7",
  "@metamask-previews/accounts-controller": "33.2.0-preview-77daf0c7",
  "@metamask-previews/address-book-controller": "6.2.1-preview-77daf0c7",
  "@metamask-previews/announcement-controller": "7.1.1-preview-77daf0c7",
  "@metamask-previews/app-metadata-controller": "1.1.1-preview-77daf0c7",
  "@metamask-previews/approval-controller": "7.2.1-preview-77daf0c7",
  "@metamask-previews/assets-controllers": "83.1.0-preview-77daf0c7",
  "@metamask-previews/base-controller": "8.4.2-preview-77daf0c7",
  "@metamask-previews/bridge-controller": "55.0.0-preview-77daf0c7",
  "@metamask-previews/bridge-status-controller": "55.0.0-preview-77daf0c7",
  "@metamask-previews/build-utils": "3.0.4-preview-77daf0c7",
  "@metamask-previews/chain-agnostic-permission": "1.2.1-preview-77daf0c7",
  "@metamask-previews/composable-controller": "11.1.1-preview-77daf0c7",
  "@metamask-previews/controller-utils": "11.14.1-preview-77daf0c7",
  "@metamask-previews/core-backend": "3.0.0-preview-77daf0c7",
  "@metamask-previews/delegation-controller": "0.8.1-preview-77daf0c7",
  "@metamask-previews/earn-controller": "8.0.2-preview-77daf0c7",
  "@metamask-previews/eip-5792-middleware": "1.2.4-preview-77daf0c7",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-77daf0c7",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-77daf0c7",
  "@metamask-previews/ens-controller": "17.1.1-preview-77daf0c7",
  "@metamask-previews/error-reporting-service": "2.2.2-preview-77daf0c7",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-77daf0c7",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-77daf0c7",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-77daf0c7",
  "@metamask-previews/foundryup": "1.0.1-preview-77daf0c7",
  "@metamask-previews/gas-fee-controller": "24.1.1-preview-77daf0c7",
  "@metamask-previews/gator-permissions-controller": "0.2.2-preview-77daf0c7",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-77daf0c7",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-77daf0c7",
  "@metamask-previews/keyring-controller": "23.2.0-preview-77daf0c7",
  "@metamask-previews/logging-controller": "6.1.1-preview-77daf0c7",
  "@metamask-previews/message-manager": "13.0.2-preview-77daf0c7",
  "@metamask-previews/messenger": "0.3.0-preview-77daf0c7",
  "@metamask-previews/multichain-account-service": "1.6.2-preview-77daf0c7",
  "@metamask-previews/multichain-api-middleware": "1.2.2-preview-77daf0c7",
  "@metamask-previews/multichain-network-controller": "1.0.2-preview-77daf0c7",
  "@metamask-previews/multichain-transactions-controller": "5.1.1-preview-77daf0c7",
  "@metamask-previews/name-controller": "8.1.1-preview-77daf0c7",
  "@metamask-previews/network-controller": "24.3.1-preview-77daf0c7",
  "@metamask-previews/network-enablement-controller": "2.1.2-preview-77daf0c7",
  "@metamask-previews/notification-services-controller": "18.3.1-preview-77daf0c7",
  "@metamask-previews/permission-controller": "11.1.1-preview-77daf0c7",
  "@metamask-previews/permission-log-controller": "4.1.1-preview-77daf0c7",
  "@metamask-previews/phishing-controller": "14.1.3-preview-77daf0c7",
  "@metamask-previews/polling-controller": "14.0.2-preview-77daf0c7",
  "@metamask-previews/preferences-controller": "20.1.1-preview-77daf0c7",
  "@metamask-previews/profile-sync-controller": "25.1.2-preview-77daf0c7",
  "@metamask-previews/rate-limit-controller": "6.1.1-preview-77daf0c7",
  "@metamask-previews/remote-feature-flag-controller": "1.9.1-preview-77daf0c7",
  "@metamask-previews/sample-controllers": "2.0.2-preview-77daf0c7",
  "@metamask-previews/seedless-onboarding-controller": "4.1.1-preview-77daf0c7",
  "@metamask-previews/selected-network-controller": "24.0.2-preview-77daf0c7",
  "@metamask-previews/shield-controller": "0.4.0-preview-77daf0c7",
  "@metamask-previews/signature-controller": "34.0.2-preview-77daf0c7",
  "@metamask-previews/subscription-controller": "2.1.0-preview-77daf0c7",
  "@metamask-previews/token-search-discovery-controller": "3.5.1-preview-77daf0c7",
  "@metamask-previews/transaction-controller": "60.10.0-preview-77daf0c7",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-77daf0c7",
  "@metamask-previews/user-operation-controller": "39.2.1-preview-77daf0c7"
}

@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": "1.6.0-preview-9fa15fd0",
  "@metamask-previews/accounts-controller": "33.2.0-preview-9fa15fd0",
  "@metamask-previews/address-book-controller": "6.2.1-preview-9fa15fd0",
  "@metamask-previews/announcement-controller": "7.1.1-preview-9fa15fd0",
  "@metamask-previews/app-metadata-controller": "1.1.1-preview-9fa15fd0",
  "@metamask-previews/approval-controller": "7.2.1-preview-9fa15fd0",
  "@metamask-previews/assets-controllers": "83.1.0-preview-9fa15fd0",
  "@metamask-previews/base-controller": "8.4.2-preview-9fa15fd0",
  "@metamask-previews/bridge-controller": "55.0.0-preview-9fa15fd0",
  "@metamask-previews/bridge-status-controller": "55.0.0-preview-9fa15fd0",
  "@metamask-previews/build-utils": "3.0.4-preview-9fa15fd0",
  "@metamask-previews/chain-agnostic-permission": "1.2.1-preview-9fa15fd0",
  "@metamask-previews/composable-controller": "11.1.1-preview-9fa15fd0",
  "@metamask-previews/controller-utils": "11.14.1-preview-9fa15fd0",
  "@metamask-previews/core-backend": "3.0.0-preview-9fa15fd0",
  "@metamask-previews/delegation-controller": "0.8.1-preview-9fa15fd0",
  "@metamask-previews/earn-controller": "8.0.2-preview-9fa15fd0",
  "@metamask-previews/eip-5792-middleware": "1.2.4-preview-9fa15fd0",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-9fa15fd0",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-9fa15fd0",
  "@metamask-previews/ens-controller": "17.1.1-preview-9fa15fd0",
  "@metamask-previews/error-reporting-service": "2.2.2-preview-9fa15fd0",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-9fa15fd0",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-9fa15fd0",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-9fa15fd0",
  "@metamask-previews/foundryup": "1.0.1-preview-9fa15fd0",
  "@metamask-previews/gas-fee-controller": "24.1.1-preview-9fa15fd0",
  "@metamask-previews/gator-permissions-controller": "0.2.2-preview-9fa15fd0",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-9fa15fd0",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-9fa15fd0",
  "@metamask-previews/keyring-controller": "23.2.0-preview-9fa15fd0",
  "@metamask-previews/logging-controller": "6.1.1-preview-9fa15fd0",
  "@metamask-previews/message-manager": "13.0.2-preview-9fa15fd0",
  "@metamask-previews/messenger": "0.3.0-preview-9fa15fd0",
  "@metamask-previews/multichain-account-service": "1.6.2-preview-9fa15fd0",
  "@metamask-previews/multichain-api-middleware": "1.2.2-preview-9fa15fd0",
  "@metamask-previews/multichain-network-controller": "1.0.2-preview-9fa15fd0",
  "@metamask-previews/multichain-transactions-controller": "5.1.1-preview-9fa15fd0",
  "@metamask-previews/name-controller": "8.1.1-preview-9fa15fd0",
  "@metamask-previews/network-controller": "24.3.1-preview-9fa15fd0",
  "@metamask-previews/network-enablement-controller": "2.1.2-preview-9fa15fd0",
  "@metamask-previews/notification-services-controller": "18.3.1-preview-9fa15fd0",
  "@metamask-previews/permission-controller": "11.1.1-preview-9fa15fd0",
  "@metamask-previews/permission-log-controller": "4.1.1-preview-9fa15fd0",
  "@metamask-previews/phishing-controller": "14.1.3-preview-9fa15fd0",
  "@metamask-previews/polling-controller": "14.0.2-preview-9fa15fd0",
  "@metamask-previews/preferences-controller": "20.1.1-preview-9fa15fd0",
  "@metamask-previews/profile-sync-controller": "25.1.2-preview-9fa15fd0",
  "@metamask-previews/rate-limit-controller": "6.1.1-preview-9fa15fd0",
  "@metamask-previews/remote-feature-flag-controller": "1.9.1-preview-9fa15fd0",
  "@metamask-previews/sample-controllers": "2.0.2-preview-9fa15fd0",
  "@metamask-previews/seedless-onboarding-controller": "4.1.1-preview-9fa15fd0",
  "@metamask-previews/selected-network-controller": "24.0.2-preview-9fa15fd0",
  "@metamask-previews/shield-controller": "0.4.0-preview-9fa15fd0",
  "@metamask-previews/signature-controller": "34.0.2-preview-9fa15fd0",
  "@metamask-previews/subscription-controller": "2.1.0-preview-9fa15fd0",
  "@metamask-previews/token-search-discovery-controller": "3.5.1-preview-9fa15fd0",
  "@metamask-previews/transaction-controller": "60.10.0-preview-9fa15fd0",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-9fa15fd0",
  "@metamask-previews/user-operation-controller": "39.2.1-preview-9fa15fd0"
}

@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": "1.6.0-preview-fa44f49b",
  "@metamask-previews/accounts-controller": "33.2.0-preview-fa44f49b",
  "@metamask-previews/address-book-controller": "6.2.1-preview-fa44f49b",
  "@metamask-previews/announcement-controller": "7.1.1-preview-fa44f49b",
  "@metamask-previews/app-metadata-controller": "1.1.1-preview-fa44f49b",
  "@metamask-previews/approval-controller": "7.2.1-preview-fa44f49b",
  "@metamask-previews/assets-controllers": "83.1.0-preview-fa44f49b",
  "@metamask-previews/base-controller": "8.4.2-preview-fa44f49b",
  "@metamask-previews/bridge-controller": "55.0.0-preview-fa44f49b",
  "@metamask-previews/bridge-status-controller": "55.0.0-preview-fa44f49b",
  "@metamask-previews/build-utils": "3.0.4-preview-fa44f49b",
  "@metamask-previews/chain-agnostic-permission": "1.2.1-preview-fa44f49b",
  "@metamask-previews/composable-controller": "11.1.1-preview-fa44f49b",
  "@metamask-previews/controller-utils": "11.14.1-preview-fa44f49b",
  "@metamask-previews/core-backend": "3.0.0-preview-fa44f49b",
  "@metamask-previews/delegation-controller": "0.8.1-preview-fa44f49b",
  "@metamask-previews/earn-controller": "8.0.2-preview-fa44f49b",
  "@metamask-previews/eip-5792-middleware": "1.2.4-preview-fa44f49b",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-fa44f49b",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-fa44f49b",
  "@metamask-previews/ens-controller": "17.1.1-preview-fa44f49b",
  "@metamask-previews/error-reporting-service": "2.2.2-preview-fa44f49b",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-fa44f49b",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-fa44f49b",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-fa44f49b",
  "@metamask-previews/foundryup": "1.0.1-preview-fa44f49b",
  "@metamask-previews/gas-fee-controller": "24.1.1-preview-fa44f49b",
  "@metamask-previews/gator-permissions-controller": "0.2.2-preview-fa44f49b",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-fa44f49b",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-fa44f49b",
  "@metamask-previews/keyring-controller": "23.2.0-preview-fa44f49b",
  "@metamask-previews/logging-controller": "6.1.1-preview-fa44f49b",
  "@metamask-previews/message-manager": "13.0.2-preview-fa44f49b",
  "@metamask-previews/messenger": "0.3.0-preview-fa44f49b",
  "@metamask-previews/multichain-account-service": "1.6.2-preview-fa44f49b",
  "@metamask-previews/multichain-api-middleware": "1.2.2-preview-fa44f49b",
  "@metamask-previews/multichain-network-controller": "1.0.2-preview-fa44f49b",
  "@metamask-previews/multichain-transactions-controller": "5.1.1-preview-fa44f49b",
  "@metamask-previews/name-controller": "8.1.1-preview-fa44f49b",
  "@metamask-previews/network-controller": "24.3.1-preview-fa44f49b",
  "@metamask-previews/network-enablement-controller": "2.1.2-preview-fa44f49b",
  "@metamask-previews/notification-services-controller": "18.3.1-preview-fa44f49b",
  "@metamask-previews/permission-controller": "11.1.1-preview-fa44f49b",
  "@metamask-previews/permission-log-controller": "4.1.1-preview-fa44f49b",
  "@metamask-previews/phishing-controller": "14.1.3-preview-fa44f49b",
  "@metamask-previews/polling-controller": "14.0.2-preview-fa44f49b",
  "@metamask-previews/preferences-controller": "20.1.1-preview-fa44f49b",
  "@metamask-previews/profile-sync-controller": "25.1.2-preview-fa44f49b",
  "@metamask-previews/rate-limit-controller": "6.1.1-preview-fa44f49b",
  "@metamask-previews/remote-feature-flag-controller": "1.9.1-preview-fa44f49b",
  "@metamask-previews/sample-controllers": "2.0.2-preview-fa44f49b",
  "@metamask-previews/seedless-onboarding-controller": "4.1.1-preview-fa44f49b",
  "@metamask-previews/selected-network-controller": "24.0.2-preview-fa44f49b",
  "@metamask-previews/shield-controller": "0.4.0-preview-fa44f49b",
  "@metamask-previews/signature-controller": "34.0.2-preview-fa44f49b",
  "@metamask-previews/subscription-controller": "2.1.0-preview-fa44f49b",
  "@metamask-previews/token-search-discovery-controller": "3.5.1-preview-fa44f49b",
  "@metamask-previews/transaction-controller": "60.10.0-preview-fa44f49b",
  "@metamask-previews/transaction-pay-controller": "0.0.0-preview-fa44f49b",
  "@metamask-previews/user-operation-controller": "39.2.1-preview-fa44f49b"
}

@matthewwalsh0 matthewwalsh0 marked this pull request as ready for review October 29, 2025 09:35
@matthewwalsh0 matthewwalsh0 requested review from a team as code owners October 29, 2025 09:35
cursor[bot]

This comment was marked as outdated.

@matthewwalsh0 matthewwalsh0 marked this pull request as draft October 29, 2025 09:36
@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch from fa44f49 to 1d50e78 Compare October 29, 2025 13:54
@matthewwalsh0 matthewwalsh0 marked this pull request as ready for review October 29, 2025 14:51
cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch from bbdeed2 to b7ddd1f Compare October 30, 2025 00:31
cursor[bot]

This comment was marked as outdated.

OGPoyraz
OGPoyraz previously approved these changes Oct 30, 2025
cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@matthewwalsh0
Copy link
Member Author

@metamaskbot publish-preview

Copy link
Member

@FrederikBolding FrederikBolding left a comment

Choose a reason for hiding this comment

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

CODEOWNERS LGTM

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

OGPoyraz
OGPoyraz previously approved these changes Oct 30, 2025
@matthewwalsh0 matthewwalsh0 force-pushed the feat/transaction-pay-controller branch from a4e3b6c to 4d0ac75 Compare October 30, 2025 09:55
@matthewwalsh0 matthewwalsh0 merged commit 3c080ce into main Oct 30, 2025
260 checks passed
@matthewwalsh0 matthewwalsh0 deleted the feat/transaction-pay-controller branch October 30, 2025 10:28
@matthewwalsh0
Copy link
Member Author

@metamaskbot publish-preview

decimals: number,
fiatRates: FiatRates,
) {
const amountRawValue = new BigNumber(amountRawInput);
Copy link
Contributor

Choose a reason for hiding this comment

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

do we need to pass 16 here to denote a hexadecimal value?

Copy link
Member Author

Choose a reason for hiding this comment

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

If the value starts with 0x, it should be automatic.


const sourceAmounts = tokens
.map((t) => calculateSourceAmount(paymentToken, t, messenger))
.filter(Boolean) as TransactionPaySourceAmount[];
Copy link
Contributor

Choose a reason for hiding this comment

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

This filter changes the length of the sourceAmounts array compared to the initial tokens array, this could cause issues on quotes.ts when relying on tokens[i] to select a certain token.

Copy link
Member Author

Choose a reason for hiding this comment

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

Good spot, this is probably okay for now since it's the second gas fee token that is most likely to be removed if the user has balance, but safer to lookup by the token address on the source amount.

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.

7 participants