Skip to content

feat(transaction-pay-controller): atomic quoting for subsidized max Money Account deposits - #10224

Merged
OGPoyraz merged 19 commits into
mainfrom
ogp/CONF-1949
Sep 22, 2026
Merged

OGPoyraz merged 19 commits into
mainfrom
ogp/CONF-1949

Conversation

@OGPoyraz

@OGPoyraz OGPoyraz commented Sep 14, 2026 •

Copy link
Copy Markdown
Member

Explanation

Enable atomic EXACT_OUTPUT Relay execution for subsidized max deposits, with vault/transaction calls embedded instead of submitted as a separate second leg.

Atomic max quoting

  • When atomic max is enabled, atomic: true (or omitted) requests atomic EXACT_OUTPUT first. The destination amount comes from the source-token budget rescaled to destination decimals, rounding down, for fixed-spread subsidized stablecoin routes that exchange 1:1 without additional fees. It does not reuse the pre-Max required amount or require a discovery quote.
  • If that atomic quote is subsidized, return it directly. Otherwise, request a non-atomic max EXACT_INPUT quote for separate second-leg execution.
  • With atomic: false, start with non-atomic EXACT_INPUT. If subsidized, use its output amount to rebuild calldata and required assets on a clone before requesting atomic EXACT_OUTPUT.
  • Preserve isMaxAmount throughout and leave the original transaction unchanged while preparing atomic calls. Non-max behavior is unchanged.

Feature flag and error handling

Eligibility is controlled by confirmations_pay_extended.payStrategies.relay.atomicMaxEnabled, replacing the earlier atomicMaxPromotionEnabled name. Its shape remains { default?: boolean; transactionTypes?: Partial<Record<TransactionType, boolean>> }. It defaults to disabled, and configured overrides match top-level or nested transaction types. There is no hardcoded Money Account eligibility fallback.

When disabled, existing max transaction-embedding restrictions still apply; clients requesting a non-atomic max deposit should set atomic: false.

Atomic promotion failures retain the Atomic promotion failed prefix through standard quote-error handling and pay-strategy fallback. The special terminal-error branch in the quote orchestrator is removed. Atomic preparation/fetch errors are not silently converted into non-atomic retries.

Max routing lives in relay-max.ts. Legacy gas-station handling remains intact; removing it is deferred to a separate PR. No public API signatures changed.

Client coordination

Companion draft: metamask-mobile#36412. Clients can use the atomic hint to reflect expected route subsidy. Correct atomic hints now avoid the initial discovery quote. Client package integration and live route validation remain pending.

Validation Status

  • Package test suite: 54 suites, 1,479 tests passed.
  • Package build, including workspace dependencies: passed.
  • Changed-file ESLint, formatting, and package changelog validation: passed.
  • Built-module smoke checks: passed for decimal rescaling, one-quote subsidized execution, unsubsidized fallback, transaction immutability, and rejection of sub-unit output.
  • Regression coverage includes explicit/default atomic hints, stale pre-Max amounts, both decimal conversion directions, disabled flags, non-Money Account eligibility, strategy fallback, and max ERC-20 transfer recipients.
  • Test-inclusive TypeScript checking still reports pre-existing errors. Comparison against the previous PR head found no newly introduced diagnostics in changed files.
  • Live client/Relay and simulator verification have not been performed for this revision. Existing screenshots and recording below are retained as earlier flow evidence.

Screenshot & recordings

Exact Input for Max ARB token:
Exact Input for Max ARB token

Exact output for Max USDC token:
Exact Output for Max USDC token

Recording:

Simulator.Screen.Recording.-.iPhone.17.Pro.Max.-.2026-09-14.at.14.57.04.mov

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
  • 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 max-deposit quoting, amount embedding, validation, and submit routing for subsidized Relay routes; mistakes could mis-size deposits or leave users without quotes, but behavior is feature-flag gated and heavily tested.

Overview
Adds subsidized max Relay deposits that can run as atomic EXACT_OUTPUT quotes with embedded transaction calls, behind payStrategies.relay.atomicMaxEnabled (off by default, with per-TransactionType overrides).

Max quoting now routes through getRelayMaxQuote: when the flag is on, the client atomic hint drives whether to request atomic max first (source budget rescaled to destination decimals, rounded down) or start with non-atomic EXACT_INPUT and promote to atomic when Relay returns a subsidized quote. Promotion rebuilds calldata via getAmountData on a cloned transaction without mutating the original. Unsubsidized atomic attempts fall back to non-atomic max; promotion/validation failures surface as QuoteError with an Atomic promotion failed prefix so orchestration can fall back to other pay strategies and clear stale quotes on refresh.

Relay quoting loosens the “max + embedded tx” guard when atomic max is enabled, validates promoted atomic max quotes in a separate batch (wrapping validation errors as promotion failures), and submit skips the separate Money Account vault step when the promoted quote already inlines the deposit calls in Relay execute.

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

@OGPoyraz

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@10.0.1-preview-e81860e6b
@metamask-previews/accounts-controller@40.0.0-preview-e81860e6b
@metamask-previews/address-book-controller@8.0.0-preview-e81860e6b
@metamask-previews/ai-controllers@2.0.0-preview-e81860e6b
@metamask-previews/analytics-controller@3.0.0-preview-e81860e6b
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-e81860e6b
@metamask-previews/announcement-controller@9.0.0-preview-e81860e6b
@metamask-previews/app-metadata-controller@3.0.0-preview-e81860e6b
@metamask-previews/approval-controller@10.0.0-preview-e81860e6b
@metamask-previews/assets-controller@16.0.0-preview-e81860e6b
@metamask-previews/assets-controllers@112.0.1-preview-e81860e6b
@metamask-previews/authenticated-user-storage@4.0.0-preview-e81860e6b
@metamask-previews/base-controller@10.0.0-preview-e81860e6b
@metamask-previews/base-data-service@2.0.0-preview-e81860e6b
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-e81860e6b
@metamask-previews/bridge-controller@81.1.0-preview-e81860e6b
@metamask-previews/bridge-status-controller@76.2.0-preview-e81860e6b
@metamask-previews/build-utils@4.0.0-preview-e81860e6b
@metamask-previews/chain-agnostic-permission@2.0.0-preview-e81860e6b
@metamask-previews/chomp-api-service@5.0.0-preview-e81860e6b
@metamask-previews/claims-controller@1.0.1-preview-e81860e6b
@metamask-previews/client-controller@2.0.0-preview-e81860e6b
@metamask-previews/client-utils@3.0.0-preview-e81860e6b
@metamask-previews/compliance-controller@3.0.0-preview-e81860e6b
@metamask-previews/composable-controller@13.0.0-preview-e81860e6b
@metamask-previews/config-registry-controller@4.0.0-preview-e81860e6b
@metamask-previews/connectivity-controller@1.0.0-preview-e81860e6b
@metamask-previews/controller-utils@13.0.0-preview-e81860e6b
@metamask-previews/core-backend@10.0.1-preview-e81860e6b
@metamask-previews/cryptography@0.0.0-preview-e81860e6b
@metamask-previews/delegation-controller@4.0.0-preview-e81860e6b
@metamask-previews/earn-controller@13.0.0-preview-e81860e6b
@metamask-previews/eip-5792-middleware@4.0.0-preview-e81860e6b
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-e81860e6b
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-e81860e6b
@metamask-previews/eth-block-tracker@16.0.0-preview-e81860e6b
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-e81860e6b
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-e81860e6b
@metamask-previews/foundryup@2.0.0-preview-e81860e6b
@metamask-previews/gas-fee-controller@27.0.0-preview-e81860e6b
@metamask-previews/gator-permissions-controller@6.0.0-preview-e81860e6b
@metamask-previews/geolocation-controller@2.0.0-preview-e81860e6b
@metamask-previews/java-tron-up@2.0.0-preview-e81860e6b
@metamask-previews/json-rpc-engine@11.0.0-preview-e81860e6b
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-e81860e6b
@metamask-previews/keyring-controller@28.0.0-preview-e81860e6b
@metamask-previews/kyc-controller@0.3.0-preview-e81860e6b
@metamask-previews/local-node-utils@2.0.0-preview-e81860e6b
@metamask-previews/logging-controller@10.0.0-preview-e81860e6b
@metamask-previews/message-manager@15.0.0-preview-e81860e6b
@metamask-previews/messenger@3.0.0-preview-e81860e6b
@metamask-previews/messenger-cli@1.0.0-preview-e81860e6b
@metamask-previews/money-account-api-data-service@1.0.0-preview-e81860e6b
@metamask-previews/money-account-balance-service@3.0.0-preview-e81860e6b
@metamask-previews/money-account-controller@2.0.0-preview-e81860e6b
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-e81860e6b
@metamask-previews/money-account-utils@2.0.0-preview-e81860e6b
@metamask-previews/multichain-account-service@14.0.0-preview-e81860e6b
@metamask-previews/multichain-api-middleware@5.0.0-preview-e81860e6b
@metamask-previews/multichain-network-controller@4.0.0-preview-e81860e6b
@metamask-previews/multichain-transactions-controller@8.0.0-preview-e81860e6b
@metamask-previews/name-controller@10.0.0-preview-e81860e6b
@metamask-previews/network-connection-banner-controller@1.0.0-preview-e81860e6b
@metamask-previews/network-controller@37.0.0-preview-e81860e6b
@metamask-previews/network-enablement-controller@7.0.0-preview-e81860e6b
@metamask-previews/notification-services-controller@28.0.1-preview-e81860e6b
@metamask-previews/passkey-controller@4.0.0-preview-e81860e6b
@metamask-previews/permission-controller@14.0.0-preview-e81860e6b
@metamask-previews/permission-log-controller@6.0.0-preview-e81860e6b
@metamask-previews/perps-controller@17.1.0-preview-e81860e6b
@metamask-previews/phishing-controller@18.0.0-preview-e81860e6b
@metamask-previews/platform-api-docs@0.2.0-preview-e81860e6b
@metamask-previews/polling-controller@17.0.0-preview-e81860e6b
@metamask-previews/preferences-controller@24.0.0-preview-e81860e6b
@metamask-previews/profile-metrics-controller@5.1.0-preview-e81860e6b
@metamask-previews/profile-sync-controller@32.1.1-preview-e81860e6b
@metamask-previews/ramps-controller@22.0.0-preview-e81860e6b
@metamask-previews/rate-limit-controller@8.0.0-preview-e81860e6b
@metamask-previews/react-data-query@2.0.0-preview-e81860e6b
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-e81860e6b
@metamask-previews/sample-controllers@6.0.0-preview-e81860e6b
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-e81860e6b
@metamask-previews/selected-network-controller@27.0.0-preview-e81860e6b
@metamask-previews/sentinel-api-service@2.0.0-preview-e81860e6b
@metamask-previews/shield-controller@7.0.1-preview-e81860e6b
@metamask-previews/signature-controller@40.0.0-preview-e81860e6b
@metamask-previews/smart-transactions-controller@27.0.1-preview-e81860e6b
@metamask-previews/snap-account-service@3.0.0-preview-e81860e6b
@metamask-previews/social-controllers@3.0.1-preview-e81860e6b
@metamask-previews/solana-test-validator-up@2.0.0-preview-e81860e6b
@metamask-previews/stellar-quickstart-up@0.0.0-preview-e81860e6b
@metamask-previews/storage-service@2.0.0-preview-e81860e6b
@metamask-previews/subscription-controller@9.0.1-preview-e81860e6b
@metamask-previews/transaction-controller@70.0.0-preview-e81860e6b
@metamask-previews/transaction-pay-controller@28.0.2-preview-e81860e6b
@metamask-previews/user-operation-controller@42.0.0-preview-e81860e6b
@metamask-previews/utils@12.0.0-preview-e81860e6b
@metamask-previews/wallet@13.0.0-preview-e81860e6b
@metamask-previews/wallet-cli@0.0.0-preview-e81860e6b

@OGPoyraz
OGPoyraz marked this pull request as ready for review September 14, 2026 12:00
@OGPoyraz
OGPoyraz requested review from a team as code owners September 14, 2026 12:00
@OGPoyraz
OGPoyraz deployed to default-branch September 14, 2026 12:00 — with GitHub Actions Active

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
@matthewwalsh0
matthewwalsh0 self-requested a review September 14, 2026 12:30
Comment thread packages/transaction-pay-controller/src/types.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-submit-execute.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
@OGPoyraz

Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-max.ts Outdated
@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@10.0.1-preview-6616ef8e1
@metamask-previews/accounts-controller@40.0.0-preview-6616ef8e1
@metamask-previews/address-book-controller@8.0.0-preview-6616ef8e1
@metamask-previews/ai-controllers@2.0.0-preview-6616ef8e1
@metamask-previews/analytics-controller@3.0.0-preview-6616ef8e1
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6616ef8e1
@metamask-previews/announcement-controller@9.0.0-preview-6616ef8e1
@metamask-previews/app-metadata-controller@3.0.0-preview-6616ef8e1
@metamask-previews/approval-controller@10.0.0-preview-6616ef8e1
@metamask-previews/assets-controller@16.1.0-preview-6616ef8e1
@metamask-previews/assets-controllers@112.0.2-preview-6616ef8e1
@metamask-previews/authenticated-user-storage@4.0.0-preview-6616ef8e1
@metamask-previews/base-controller@10.0.0-preview-6616ef8e1
@metamask-previews/base-data-service@2.0.0-preview-6616ef8e1
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-6616ef8e1
@metamask-previews/bridge-controller@81.1.0-preview-6616ef8e1
@metamask-previews/bridge-status-controller@76.2.0-preview-6616ef8e1
@metamask-previews/build-utils@4.0.0-preview-6616ef8e1
@metamask-previews/chain-agnostic-permission@2.0.0-preview-6616ef8e1
@metamask-previews/chomp-api-service@5.0.0-preview-6616ef8e1
@metamask-previews/claims-controller@1.0.1-preview-6616ef8e1
@metamask-previews/client-controller@2.0.0-preview-6616ef8e1
@metamask-previews/client-utils@3.0.1-preview-6616ef8e1
@metamask-previews/compliance-controller@3.0.0-preview-6616ef8e1
@metamask-previews/composable-controller@13.0.0-preview-6616ef8e1
@metamask-previews/config-registry-controller@4.0.0-preview-6616ef8e1
@metamask-previews/connectivity-controller@1.0.0-preview-6616ef8e1
@metamask-previews/controller-utils@13.0.0-preview-6616ef8e1
@metamask-previews/core-backend@11.0.0-preview-6616ef8e1
@metamask-previews/cryptography@0.0.0-preview-6616ef8e1
@metamask-previews/delegation-controller@4.0.0-preview-6616ef8e1
@metamask-previews/earn-controller@13.0.0-preview-6616ef8e1
@metamask-previews/eip-5792-middleware@4.0.0-preview-6616ef8e1
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-6616ef8e1
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-6616ef8e1
@metamask-previews/eth-block-tracker@16.0.0-preview-6616ef8e1
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-6616ef8e1
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-6616ef8e1
@metamask-previews/foundryup@2.0.0-preview-6616ef8e1
@metamask-previews/gas-fee-controller@27.0.0-preview-6616ef8e1
@metamask-previews/gator-permissions-controller@6.0.0-preview-6616ef8e1
@metamask-previews/geolocation-controller@2.0.0-preview-6616ef8e1
@metamask-previews/java-tron-up@2.0.0-preview-6616ef8e1
@metamask-previews/json-rpc-engine@11.0.0-preview-6616ef8e1
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-6616ef8e1
@metamask-previews/keyring-controller@28.0.0-preview-6616ef8e1
@metamask-previews/kyc-controller@0.3.0-preview-6616ef8e1
@metamask-previews/local-node-utils@2.0.0-preview-6616ef8e1
@metamask-previews/logging-controller@10.0.0-preview-6616ef8e1
@metamask-previews/message-manager@15.0.0-preview-6616ef8e1
@metamask-previews/messenger@3.0.0-preview-6616ef8e1
@metamask-previews/messenger-cli@1.0.0-preview-6616ef8e1
@metamask-previews/money-account-api-data-service@1.0.0-preview-6616ef8e1
@metamask-previews/money-account-balance-service@3.0.0-preview-6616ef8e1
@metamask-previews/money-account-controller@2.0.0-preview-6616ef8e1
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-6616ef8e1
@metamask-previews/money-account-utils@2.0.0-preview-6616ef8e1
@metamask-previews/multichain-account-service@14.0.0-preview-6616ef8e1
@metamask-previews/multichain-api-middleware@5.0.0-preview-6616ef8e1
@metamask-previews/multichain-network-controller@4.0.0-preview-6616ef8e1
@metamask-previews/multichain-transactions-controller@8.0.0-preview-6616ef8e1
@metamask-previews/name-controller@10.0.0-preview-6616ef8e1
@metamask-previews/network-connection-banner-controller@1.0.0-preview-6616ef8e1
@metamask-previews/network-controller@37.0.0-preview-6616ef8e1
@metamask-previews/network-enablement-controller@7.0.0-preview-6616ef8e1
@metamask-previews/notification-services-controller@28.0.1-preview-6616ef8e1
@metamask-previews/passkey-controller@4.0.0-preview-6616ef8e1
@metamask-previews/permission-controller@14.0.0-preview-6616ef8e1
@metamask-previews/permission-log-controller@6.0.0-preview-6616ef8e1
@metamask-previews/perps-controller@17.1.0-preview-6616ef8e1
@metamask-previews/phishing-controller@18.1.0-preview-6616ef8e1
@metamask-previews/platform-api-docs@0.2.0-preview-6616ef8e1
@metamask-previews/polling-controller@17.0.0-preview-6616ef8e1
@metamask-previews/preferences-controller@24.0.0-preview-6616ef8e1
@metamask-previews/profile-metrics-controller@5.1.0-preview-6616ef8e1
@metamask-previews/profile-sync-controller@32.1.1-preview-6616ef8e1
@metamask-previews/ramps-controller@22.0.0-preview-6616ef8e1
@metamask-previews/rate-limit-controller@8.0.0-preview-6616ef8e1
@metamask-previews/react-data-query@2.0.0-preview-6616ef8e1
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-6616ef8e1
@metamask-previews/sample-controllers@6.0.0-preview-6616ef8e1
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-6616ef8e1
@metamask-previews/selected-network-controller@27.0.0-preview-6616ef8e1
@metamask-previews/sentinel-api-service@2.0.0-preview-6616ef8e1
@metamask-previews/shield-controller@7.0.1-preview-6616ef8e1
@metamask-previews/signature-controller@40.0.0-preview-6616ef8e1
@metamask-previews/smart-transactions-controller@27.0.1-preview-6616ef8e1
@metamask-previews/snap-account-service@3.0.0-preview-6616ef8e1
@metamask-previews/social-controllers@3.0.1-preview-6616ef8e1
@metamask-previews/solana-test-validator-up@2.0.0-preview-6616ef8e1
@metamask-previews/stellar-quickstart-up@0.0.0-preview-6616ef8e1
@metamask-previews/storage-service@2.0.0-preview-6616ef8e1
@metamask-previews/subscription-controller@9.0.1-preview-6616ef8e1
@metamask-previews/transaction-controller@70.0.1-preview-6616ef8e1
@metamask-previews/transaction-pay-controller@28.0.2-preview-6616ef8e1
@metamask-previews/user-operation-controller@42.0.0-preview-6616ef8e1
@metamask-previews/utils@12.0.0-preview-6616ef8e1
@metamask-previews/wallet@13.0.0-preview-6616ef8e1
@metamask-previews/wallet-cli@0.0.0-preview-6616ef8e1

@OGPoyraz

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@10.0.1-preview-aa57e3d17
@metamask-previews/accounts-controller@40.0.0-preview-aa57e3d17
@metamask-previews/address-book-controller@8.0.0-preview-aa57e3d17
@metamask-previews/ai-controllers@2.0.0-preview-aa57e3d17
@metamask-previews/analytics-controller@3.0.0-preview-aa57e3d17
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-aa57e3d17
@metamask-previews/announcement-controller@9.0.0-preview-aa57e3d17
@metamask-previews/app-metadata-controller@3.0.0-preview-aa57e3d17
@metamask-previews/approval-controller@10.0.0-preview-aa57e3d17
@metamask-previews/assets-controller@16.1.0-preview-aa57e3d17
@metamask-previews/assets-controllers@112.0.2-preview-aa57e3d17
@metamask-previews/authenticated-user-storage@4.0.0-preview-aa57e3d17
@metamask-previews/base-controller@10.0.0-preview-aa57e3d17
@metamask-previews/base-data-service@2.0.0-preview-aa57e3d17
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-aa57e3d17
@metamask-previews/bridge-controller@81.1.0-preview-aa57e3d17
@metamask-previews/bridge-status-controller@76.2.0-preview-aa57e3d17
@metamask-previews/build-utils@4.0.0-preview-aa57e3d17
@metamask-previews/chain-agnostic-permission@2.0.0-preview-aa57e3d17
@metamask-previews/chomp-api-service@5.0.0-preview-aa57e3d17
@metamask-previews/claims-controller@1.0.1-preview-aa57e3d17
@metamask-previews/client-controller@2.0.0-preview-aa57e3d17
@metamask-previews/client-utils@3.0.1-preview-aa57e3d17
@metamask-previews/compliance-controller@3.0.0-preview-aa57e3d17
@metamask-previews/composable-controller@13.0.0-preview-aa57e3d17
@metamask-previews/config-registry-controller@4.0.0-preview-aa57e3d17
@metamask-previews/connectivity-controller@1.0.0-preview-aa57e3d17
@metamask-previews/controller-utils@13.0.0-preview-aa57e3d17
@metamask-previews/core-backend@11.0.0-preview-aa57e3d17
@metamask-previews/cryptography@0.0.0-preview-aa57e3d17
@metamask-previews/delegation-controller@4.0.0-preview-aa57e3d17
@metamask-previews/earn-controller@13.0.0-preview-aa57e3d17
@metamask-previews/eip-5792-middleware@4.0.0-preview-aa57e3d17
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-aa57e3d17
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-aa57e3d17
@metamask-previews/eth-block-tracker@16.0.0-preview-aa57e3d17
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-aa57e3d17
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-aa57e3d17
@metamask-previews/foundryup@2.0.0-preview-aa57e3d17
@metamask-previews/gas-fee-controller@27.0.0-preview-aa57e3d17
@metamask-previews/gator-permissions-controller@6.0.0-preview-aa57e3d17
@metamask-previews/geolocation-controller@2.0.0-preview-aa57e3d17
@metamask-previews/java-tron-up@2.0.0-preview-aa57e3d17
@metamask-previews/json-rpc-engine@11.0.0-preview-aa57e3d17
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-aa57e3d17
@metamask-previews/keyring-controller@28.0.0-preview-aa57e3d17
@metamask-previews/kyc-controller@0.3.0-preview-aa57e3d17
@metamask-previews/local-node-utils@2.0.0-preview-aa57e3d17
@metamask-previews/logging-controller@10.0.0-preview-aa57e3d17
@metamask-previews/message-manager@15.0.0-preview-aa57e3d17
@metamask-previews/messenger@3.0.0-preview-aa57e3d17
@metamask-previews/messenger-cli@1.0.0-preview-aa57e3d17
@metamask-previews/money-account-api-data-service@1.0.0-preview-aa57e3d17
@metamask-previews/money-account-balance-service@3.0.0-preview-aa57e3d17
@metamask-previews/money-account-controller@2.0.0-preview-aa57e3d17
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-aa57e3d17
@metamask-previews/money-account-utils@2.0.0-preview-aa57e3d17
@metamask-previews/multichain-account-service@14.0.0-preview-aa57e3d17
@metamask-previews/multichain-api-middleware@5.0.0-preview-aa57e3d17
@metamask-previews/multichain-network-controller@4.0.0-preview-aa57e3d17
@metamask-previews/multichain-transactions-controller@8.0.0-preview-aa57e3d17
@metamask-previews/name-controller@10.0.0-preview-aa57e3d17
@metamask-previews/network-connection-banner-controller@1.0.0-preview-aa57e3d17
@metamask-previews/network-controller@37.0.0-preview-aa57e3d17
@metamask-previews/network-enablement-controller@7.0.0-preview-aa57e3d17
@metamask-previews/notification-services-controller@29.0.0-preview-aa57e3d17
@metamask-previews/passkey-controller@4.0.0-preview-aa57e3d17
@metamask-previews/permission-controller@14.0.0-preview-aa57e3d17
@metamask-previews/permission-log-controller@6.0.0-preview-aa57e3d17
@metamask-previews/perps-controller@17.1.0-preview-aa57e3d17
@metamask-previews/phishing-controller@18.1.0-preview-aa57e3d17
@metamask-previews/platform-api-docs@0.2.0-preview-aa57e3d17
@metamask-previews/polling-controller@17.0.0-preview-aa57e3d17
@metamask-previews/preferences-controller@24.0.0-preview-aa57e3d17
@metamask-previews/profile-metrics-controller@5.1.0-preview-aa57e3d17
@metamask-previews/profile-sync-controller@32.1.1-preview-aa57e3d17
@metamask-previews/ramps-controller@23.0.0-preview-aa57e3d17
@metamask-previews/rate-limit-controller@8.0.0-preview-aa57e3d17
@metamask-previews/react-data-query@2.0.0-preview-aa57e3d17
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-aa57e3d17
@metamask-previews/sample-controllers@6.0.0-preview-aa57e3d17
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-aa57e3d17
@metamask-previews/selected-network-controller@27.0.0-preview-aa57e3d17
@metamask-previews/sentinel-api-service@2.0.0-preview-aa57e3d17
@metamask-previews/shield-controller@7.0.1-preview-aa57e3d17
@metamask-previews/signature-controller@40.0.0-preview-aa57e3d17
@metamask-previews/smart-transactions-controller@27.0.1-preview-aa57e3d17
@metamask-previews/snap-account-service@3.0.0-preview-aa57e3d17
@metamask-previews/social-controllers@3.0.1-preview-aa57e3d17
@metamask-previews/solana-test-validator-up@2.0.0-preview-aa57e3d17
@metamask-previews/stellar-quickstart-up@0.0.0-preview-aa57e3d17
@metamask-previews/storage-service@2.0.0-preview-aa57e3d17
@metamask-previews/subscription-controller@9.0.1-preview-aa57e3d17
@metamask-previews/transaction-controller@70.1.0-preview-aa57e3d17
@metamask-previews/transaction-pay-controller@29.0.0-preview-aa57e3d17
@metamask-previews/user-operation-controller@42.0.0-preview-aa57e3d17
@metamask-previews/utils@12.0.0-preview-aa57e3d17
@metamask-previews/wallet@13.0.0-preview-aa57e3d17
@metamask-previews/wallet-cli@0.0.0-preview-aa57e3d17

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
@OGPoyraz

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@10.0.1-preview-d43f7b9f4
@metamask-previews/accounts-controller@40.0.0-preview-d43f7b9f4
@metamask-previews/address-book-controller@8.0.0-preview-d43f7b9f4
@metamask-previews/ai-controllers@2.0.0-preview-d43f7b9f4
@metamask-previews/analytics-controller@3.0.0-preview-d43f7b9f4
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-d43f7b9f4
@metamask-previews/announcement-controller@9.0.0-preview-d43f7b9f4
@metamask-previews/app-metadata-controller@3.0.0-preview-d43f7b9f4
@metamask-previews/approval-controller@10.0.0-preview-d43f7b9f4
@metamask-previews/assets-controller@16.1.0-preview-d43f7b9f4
@metamask-previews/assets-controllers@112.0.2-preview-d43f7b9f4
@metamask-previews/authenticated-user-storage@4.0.0-preview-d43f7b9f4
@metamask-previews/base-controller@10.0.0-preview-d43f7b9f4
@metamask-previews/base-data-service@2.0.0-preview-d43f7b9f4
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-d43f7b9f4
@metamask-previews/bridge-controller@81.1.0-preview-d43f7b9f4
@metamask-previews/bridge-status-controller@76.2.0-preview-d43f7b9f4
@metamask-previews/build-utils@4.0.0-preview-d43f7b9f4
@metamask-previews/chain-agnostic-permission@2.0.0-preview-d43f7b9f4
@metamask-previews/chomp-api-service@5.0.0-preview-d43f7b9f4
@metamask-previews/claims-controller@1.0.1-preview-d43f7b9f4
@metamask-previews/client-controller@2.0.0-preview-d43f7b9f4
@metamask-previews/client-utils@3.0.1-preview-d43f7b9f4
@metamask-previews/compliance-controller@3.0.0-preview-d43f7b9f4
@metamask-previews/composable-controller@13.0.0-preview-d43f7b9f4
@metamask-previews/config-registry-controller@4.0.0-preview-d43f7b9f4
@metamask-previews/connectivity-controller@1.0.0-preview-d43f7b9f4
@metamask-previews/controller-utils@13.0.0-preview-d43f7b9f4
@metamask-previews/core-backend@11.0.0-preview-d43f7b9f4
@metamask-previews/cryptography@0.0.0-preview-d43f7b9f4
@metamask-previews/delegation-controller@4.0.0-preview-d43f7b9f4
@metamask-previews/earn-controller@13.0.0-preview-d43f7b9f4
@metamask-previews/eip-5792-middleware@4.0.0-preview-d43f7b9f4
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-d43f7b9f4
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-d43f7b9f4
@metamask-previews/eth-block-tracker@16.0.0-preview-d43f7b9f4
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-d43f7b9f4
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-d43f7b9f4
@metamask-previews/foundryup@2.0.0-preview-d43f7b9f4
@metamask-previews/gas-fee-controller@27.0.0-preview-d43f7b9f4
@metamask-previews/gator-permissions-controller@6.0.0-preview-d43f7b9f4
@metamask-previews/geolocation-controller@2.0.0-preview-d43f7b9f4
@metamask-previews/java-tron-up@2.0.0-preview-d43f7b9f4
@metamask-previews/json-rpc-engine@11.0.0-preview-d43f7b9f4
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-d43f7b9f4
@metamask-previews/keyring-controller@28.0.0-preview-d43f7b9f4
@metamask-previews/kyc-controller@0.3.0-preview-d43f7b9f4
@metamask-previews/local-node-utils@2.0.0-preview-d43f7b9f4
@metamask-previews/logging-controller@10.0.0-preview-d43f7b9f4
@metamask-previews/message-manager@15.0.0-preview-d43f7b9f4
@metamask-previews/messenger@3.0.0-preview-d43f7b9f4
@metamask-previews/messenger-cli@1.0.0-preview-d43f7b9f4
@metamask-previews/money-account-api-data-service@1.0.0-preview-d43f7b9f4
@metamask-previews/money-account-balance-service@3.0.0-preview-d43f7b9f4
@metamask-previews/money-account-controller@2.0.0-preview-d43f7b9f4
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-d43f7b9f4
@metamask-previews/money-account-utils@2.0.0-preview-d43f7b9f4
@metamask-previews/multichain-account-service@14.0.0-preview-d43f7b9f4
@metamask-previews/multichain-api-middleware@5.0.0-preview-d43f7b9f4
@metamask-previews/multichain-network-controller@4.0.0-preview-d43f7b9f4
@metamask-previews/multichain-transactions-controller@8.0.0-preview-d43f7b9f4
@metamask-previews/name-controller@10.0.0-preview-d43f7b9f4
@metamask-previews/network-connection-banner-controller@1.0.0-preview-d43f7b9f4
@metamask-previews/network-controller@37.0.0-preview-d43f7b9f4
@metamask-previews/network-enablement-controller@7.0.0-preview-d43f7b9f4
@metamask-previews/notification-services-controller@29.0.0-preview-d43f7b9f4
@metamask-previews/passkey-controller@4.0.0-preview-d43f7b9f4
@metamask-previews/permission-controller@14.0.0-preview-d43f7b9f4
@metamask-previews/permission-log-controller@6.0.0-preview-d43f7b9f4
@metamask-previews/perps-controller@17.1.0-preview-d43f7b9f4
@metamask-previews/phishing-controller@18.1.0-preview-d43f7b9f4
@metamask-previews/platform-api-docs@0.2.0-preview-d43f7b9f4
@metamask-previews/polling-controller@17.0.0-preview-d43f7b9f4
@metamask-previews/preferences-controller@24.0.0-preview-d43f7b9f4
@metamask-previews/profile-metrics-controller@5.1.0-preview-d43f7b9f4
@metamask-previews/profile-sync-controller@32.1.1-preview-d43f7b9f4
@metamask-previews/ramps-controller@23.0.0-preview-d43f7b9f4
@metamask-previews/rate-limit-controller@8.0.0-preview-d43f7b9f4
@metamask-previews/react-data-query@2.0.0-preview-d43f7b9f4
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-d43f7b9f4
@metamask-previews/sample-controllers@6.0.0-preview-d43f7b9f4
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-d43f7b9f4
@metamask-previews/selected-network-controller@27.0.0-preview-d43f7b9f4
@metamask-previews/sentinel-api-service@2.0.0-preview-d43f7b9f4
@metamask-previews/shield-controller@7.0.1-preview-d43f7b9f4
@metamask-previews/signature-controller@40.0.0-preview-d43f7b9f4
@metamask-previews/smart-transactions-controller@27.0.1-preview-d43f7b9f4
@metamask-previews/snap-account-service@3.0.0-preview-d43f7b9f4
@metamask-previews/social-controllers@3.0.1-preview-d43f7b9f4
@metamask-previews/solana-test-validator-up@2.0.0-preview-d43f7b9f4
@metamask-previews/stellar-quickstart-up@0.0.0-preview-d43f7b9f4
@metamask-previews/storage-service@2.0.0-preview-d43f7b9f4
@metamask-previews/subscription-controller@9.0.1-preview-d43f7b9f4
@metamask-previews/transaction-controller@70.1.0-preview-d43f7b9f4
@metamask-previews/transaction-pay-controller@29.0.0-preview-d43f7b9f4
@metamask-previews/user-operation-controller@42.0.0-preview-d43f7b9f4
@metamask-previews/utils@12.0.0-preview-d43f7b9f4
@metamask-previews/wallet@13.0.0-preview-d43f7b9f4
@metamask-previews/wallet-cli@0.0.0-preview-d43f7b9f4

Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-quotes.ts Outdated
Comment thread packages/transaction-pay-controller/src/strategy/relay/relay-max.ts Outdated
Comment thread packages/transaction-pay-controller/src/utils/feature-flags.ts Outdated
Comment thread packages/transaction-pay-controller/src/utils/feature-flags.ts Outdated
Comment thread packages/transaction-pay-controller/src/utils/quotes.ts Outdated
@OGPoyraz

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@10.0.1-preview-d3f9964be
@metamask-previews/accounts-controller@40.0.0-preview-d3f9964be
@metamask-previews/address-book-controller@8.0.0-preview-d3f9964be
@metamask-previews/ai-controllers@2.0.0-preview-d3f9964be
@metamask-previews/analytics-controller@3.1.0-preview-d3f9964be
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-d3f9964be
@metamask-previews/announcement-controller@9.0.0-preview-d3f9964be
@metamask-previews/app-metadata-controller@3.0.0-preview-d3f9964be
@metamask-previews/approval-controller@10.0.0-preview-d3f9964be
@metamask-previews/assets-controller@16.1.0-preview-d3f9964be
@metamask-previews/assets-controllers@112.0.2-preview-d3f9964be
@metamask-previews/authenticated-user-storage@4.0.0-preview-d3f9964be
@metamask-previews/base-controller@10.0.0-preview-d3f9964be
@metamask-previews/base-data-service@2.0.0-preview-d3f9964be
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-d3f9964be
@metamask-previews/bridge-controller@81.2.0-preview-d3f9964be
@metamask-previews/bridge-status-controller@76.3.0-preview-d3f9964be
@metamask-previews/build-utils@4.0.0-preview-d3f9964be
@metamask-previews/chain-agnostic-permission@2.0.0-preview-d3f9964be
@metamask-previews/chomp-api-service@5.0.0-preview-d3f9964be
@metamask-previews/claims-controller@1.0.1-preview-d3f9964be
@metamask-previews/client-controller@2.0.0-preview-d3f9964be
@metamask-previews/client-utils@3.0.2-preview-d3f9964be
@metamask-previews/compliance-controller@3.0.0-preview-d3f9964be
@metamask-previews/composable-controller@13.0.0-preview-d3f9964be
@metamask-previews/config-registry-controller@4.0.0-preview-d3f9964be
@metamask-previews/connectivity-controller@1.0.0-preview-d3f9964be
@metamask-previews/controller-utils@13.0.0-preview-d3f9964be
@metamask-previews/core-backend@11.0.0-preview-d3f9964be
@metamask-previews/cryptography@0.0.0-preview-d3f9964be
@metamask-previews/delegation-controller@4.0.0-preview-d3f9964be
@metamask-previews/earn-controller@13.0.0-preview-d3f9964be
@metamask-previews/eip-5792-middleware@4.0.0-preview-d3f9964be
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-d3f9964be
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-d3f9964be
@metamask-previews/eth-block-tracker@16.0.0-preview-d3f9964be
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-d3f9964be
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-d3f9964be
@metamask-previews/foundryup@2.0.0-preview-d3f9964be
@metamask-previews/gas-fee-controller@27.0.0-preview-d3f9964be
@metamask-previews/gator-permissions-controller@6.0.0-preview-d3f9964be
@metamask-previews/geolocation-controller@2.0.0-preview-d3f9964be
@metamask-previews/java-tron-up@2.0.0-preview-d3f9964be
@metamask-previews/json-rpc-engine@11.0.0-preview-d3f9964be
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-d3f9964be
@metamask-previews/keyring-controller@28.0.0-preview-d3f9964be
@metamask-previews/kyc-controller@0.4.0-preview-d3f9964be
@metamask-previews/local-node-utils@2.0.0-preview-d3f9964be
@metamask-previews/logging-controller@10.0.0-preview-d3f9964be
@metamask-previews/message-manager@15.0.0-preview-d3f9964be
@metamask-previews/messenger@3.0.0-preview-d3f9964be
@metamask-previews/messenger-cli@1.0.0-preview-d3f9964be
@metamask-previews/money-account-api-data-service@1.0.0-preview-d3f9964be
@metamask-previews/money-account-balance-service@3.0.0-preview-d3f9964be
@metamask-previews/money-account-controller@2.0.0-preview-d3f9964be
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-d3f9964be
@metamask-previews/money-account-utils@2.0.0-preview-d3f9964be
@metamask-previews/multichain-account-service@14.0.0-preview-d3f9964be
@metamask-previews/multichain-api-middleware@5.0.0-preview-d3f9964be
@metamask-previews/multichain-network-controller@4.0.0-preview-d3f9964be
@metamask-previews/multichain-transactions-controller@8.0.0-preview-d3f9964be
@metamask-previews/name-controller@10.0.0-preview-d3f9964be
@metamask-previews/network-connection-banner-controller@1.0.0-preview-d3f9964be
@metamask-previews/network-controller@37.0.0-preview-d3f9964be
@metamask-previews/network-enablement-controller@7.0.0-preview-d3f9964be
@metamask-previews/notification-services-controller@29.0.0-preview-d3f9964be
@metamask-previews/passkey-controller@4.0.0-preview-d3f9964be
@metamask-previews/permission-controller@14.0.0-preview-d3f9964be
@metamask-previews/permission-log-controller@6.0.0-preview-d3f9964be
@metamask-previews/perps-controller@17.3.0-preview-d3f9964be
@metamask-previews/phishing-controller@18.1.0-preview-d3f9964be
@metamask-previews/platform-api-docs@0.2.1-preview-d3f9964be
@metamask-previews/polling-controller@17.0.0-preview-d3f9964be
@metamask-previews/preferences-controller@24.0.0-preview-d3f9964be
@metamask-previews/profile-metrics-controller@5.1.0-preview-d3f9964be
@metamask-previews/profile-sync-controller@32.1.1-preview-d3f9964be
@metamask-previews/ramps-controller@24.0.0-preview-d3f9964be
@metamask-previews/rate-limit-controller@8.0.0-preview-d3f9964be
@metamask-previews/react-data-query@2.0.0-preview-d3f9964be
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-d3f9964be
@metamask-previews/sample-controllers@6.0.0-preview-d3f9964be
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-d3f9964be
@metamask-previews/selected-network-controller@27.0.0-preview-d3f9964be
@metamask-previews/sentinel-api-service@2.0.0-preview-d3f9964be
@metamask-previews/shield-controller@7.0.1-preview-d3f9964be
@metamask-previews/signature-controller@40.0.0-preview-d3f9964be
@metamask-previews/smart-transactions-controller@27.0.1-preview-d3f9964be
@metamask-previews/snap-account-service@3.0.0-preview-d3f9964be
@metamask-previews/social-controllers@3.0.2-preview-d3f9964be
@metamask-previews/solana-test-validator-up@2.0.0-preview-d3f9964be
@metamask-previews/stellar-quickstart-up@0.0.0-preview-d3f9964be
@metamask-previews/storage-service@2.0.0-preview-d3f9964be
@metamask-previews/subscription-controller@9.1.0-preview-d3f9964be
@metamask-previews/transaction-controller@70.1.0-preview-d3f9964be
@metamask-previews/transaction-pay-controller@29.0.1-preview-d3f9964be
@metamask-previews/user-operation-controller@42.0.0-preview-d3f9964be
@metamask-previews/utils@12.0.0-preview-d3f9964be
@metamask-previews/wallet@14.0.0-preview-d3f9964be
@metamask-previews/wallet-cli@0.0.0-preview-d3f9964be

matthewwalsh0
matthewwalsh0 previously approved these changes Sep 22, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 5fd8ff1. Configure here.

...transaction,
nestedTransactions,
requiredAssets,
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale txParams in atomic max quotes

High Severity

Atomic max preparation rewrites nested calldata and requiredAssets on a clone, but leaves txParams on the pre-max deposit amount. Quote-time getDelegationTransaction and later execute validation still read that stale txParams, so the embedded vault call can lock the original amount while the paired transfer uses the source-budget size.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5fd8ff1. Configure here.

@OGPoyraz
OGPoyraz added this pull request to the merge queue Sep 22, 2026
Merged via the queue into main with commit fa6fa55 Sep 22, 2026
42 checks passed
@OGPoyraz
OGPoyraz deleted the ogp/CONF-1949 branch September 22, 2026 13:58
@OGPoyraz OGPoyraz mentioned this pull request Sep 23, 2026
1 of 4 tasks
pull Bot pushed a commit to Reality2byte/metamask-mobile that referenced this pull request Sep 23, 2026
…#36412)

## Description

Use directional Relay fixed-spread routes and the Core atomic-max
feature gate to choose the initial quote for Max Money Account deposits.

- Leave `atomic` unset (Core defaults to atomic) only when atomic max is
enabled for the transaction and the selected source-to-destination route
matches `confirmations_relay_fixed_spread`.
- Set `atomic: false` for Max deposits when the gate is absent/disabled
or the route does not match. This preserves non-atomic Max support when
Core does not permit embedded Max transactions.
- Match Core flag semantics: a matching top-level or nested
transaction-type override takes precedence over `default`; an absent
default is `false`.
- Refresh the hint when eligibility or the selected route changes while
Max is active.
- Clear the Max-specific override when selecting a partial or manual
amount. Keep non-Money-Account flows unchanged.

The route match predicts subsidy; Core remains responsible for verifying
the returned quote and selecting the final execution mode.

### Quote behavior

With atomic max enabled, for Relay execute routes:

- Matching route and subsidized response: one atomic `EXACT_OUTPUT`
quote, using the source budget adjusted to destination decimals for the
1:1 subsidized stablecoin route.
- Non-atomic hint and unsubsidized response: one `EXACT_INPUT` quote,
with the vault transaction handled in the separate second leg.
- Atomic hint but unsubsidized response: Core retries with non-atomic
`EXACT_INPUT`.
- Non-atomic hint but subsidized response: Core promotes to atomic
`EXACT_OUTPUT` using the returned output amount.

When the atomic-max gate is disabled, a subsidized quote remains
non-atomic; subsidy alone does not enable the feature. Atomic
preparation/fetch errors are not silently retried as non-atomic quotes.

## Configuration

Enable atomic max for Money Account deposits under the existing
`confirmations_pay_extended` flag:

```json
{
  "payStrategies": {
    "relay": {
      "atomicMaxEnabled": {
        "default": false,
        "transactionTypes": {
          "moneyAccountDeposit": true
        }
      }
    }
  }
}
```

Merge this into the existing flag value without removing other settings.
`transactionTypes` is a type-to-boolean object, **not an array**. Nested
`moneyAccountDeposit` transactions inside a parent `batch` are
supported. A matching directional route in
`confirmations_relay_fixed_spread` is also needed for the client to hint
atomic-first execution.

## Dependency / Draft Status

Depends on MetaMask/core#10224.

This PR now integrates `@metamask/transaction-pay-controller` through
`previewBuilds`, using `29.0.1-preview-d3f9964be`, with the
corresponding lockfile changes. The preview contains the Core atomic-max
implementation; the base dependency declaration remains `^28.0.2`.

Keep this PR in draft until integrated live-flow validation is complete.
Replace the preview with the appropriate published Core release before
production rollout.

## Testing

- Four targeted suites passed locally: **193 tests**, covering the
custom-amount hook, confirmations selectors, fixed-spread route
matching, and payment-override clearing.
- Added coverage for absent/disabled gates, default and per-type
enablement, nested transaction matching, active-Max gate/route changes,
and Max/manual transitions.
- Changed-file LSP diagnostics: clean.
- Changed-file ESLint: no errors; one existing React Compiler warning
remains. Formatting passed.
- Direct comparison against the installed Core preview confirmed
Mobile/Core gate parity across six configuration cases.
- Read-only inspection of a running simulator confirmed the tested
USDC-to-mUSD route matched, but an array-shaped `transactionTypes`
override left the gate disabled and produced `EXACT_INPUT`. Evaluating
the corrected object enabled the gate without changing runtime state.
- Live `EXACT_OUTPUT` quoting with the corrected configuration and
end-to-end deposit execution remain unverified.

## References

- https://consensyssoftware.atlassian.net/browse/CONF-1949
- MetaMask/core#10224

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes Max deposit quoting hints and transaction-pay config, which
can alter Relay quote mode (atomic vs non-atomic) for money-account
deposits when feature flags are enabled.
> 
> **Overview**
> **Money Account deposit Max** no longer always forces `atomic: false`.
The custom-amount hook now reads the relay **atomic-max** gate
(`confirmations_pay_extended.payStrategies.relay.atomicMaxEnabled`) and
whether the pay token → destination pair matches
**`confirmations_relay_fixed_spread`**. When both apply, it leaves
`atomic` unset so Core can default to atomic quoting; otherwise Max
still sets `atomic: false`.
> 
> A new **`selectRelayAtomicMaxEnabled`** selector resolves the gate
with per–transaction-type overrides (including nested batch deposits),
defaulting to off when absent. An effect **re-applies** the hint while
Max stays on if the gate or route eligibility changes.
> 
> **`@metamask/transaction-pay-controller`** is bumped to **^29.1.0**
(lockfile updated). Tests cover gate on/off, route match/mismatch, live
flag toggles, and clearing atomic on partial/manual amounts.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
4937716. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
pull Bot pushed a commit to Reality2byte/core that referenced this pull request Sep 23, 2026
## Explanation

Release `1275.0.0` with a **major** version bump for
`@metamask/transaction-controller` and a **minor** version bump for
`@metamask/transaction-pay-controller`.

- **`@metamask/transaction-controller`** `70.1.0` → `71.0.0` (major)
- **`@metamask/transaction-pay-controller`** `29.0.2` → `29.1.0` (minor)

### `@metamask/transaction-controller@71.0.0`

**Breaking:** Move sponsorship and signing decisions to optional
approval-time `isSponsored` and `shouldSign` hooks
([MetaMask#10109](MetaMask#10109))
- The hooks default to non-sponsored and local signing when omitted.
Sponsored transactions skip the `shouldSign` hook and local signing,
while transactions that skip local signing retain an existing nonce and
require a publish hook.
- `isGasFeeSponsored` and `isExternalSign` remain in the public types as
deprecated compatibility properties but no longer control the
transaction lifecycle; `isGasFeeSponsored` remains available as
migration metadata.
- Add `TransactionMeta.isGasFeeSponsoredAvailable` and refresh it during
approval preparation when simulation is enabled so sponsorship hooks
receive current availability without overriding simulation preferences.

Other changes:
- Add `membershipSubscription` transaction type
([MetaMask#10340](MetaMask#10340))
- Bump `bn.js` from `^5.2.1` to `^5.2.5`
([MetaMask#10362](MetaMask#10362))

### `@metamask/transaction-pay-controller@29.1.0`

- Support subsidized max Relay deposits using atomic `EXACT_OUTPUT`
quotes with transaction calls embedded, gated by
`payStrategies.relay.atomicMaxEnabled`
([MetaMask#10224](MetaMask#10224))
- Bump `bn.js` from `^5.2.1` to `^5.2.5`
([MetaMask#10362](MetaMask#10362))
- Bump `immer` from `^9.0.6` to `^9.0.21`
([MetaMask#10331](MetaMask#10331))

### Dependency updates

16 packages had their `@metamask/transaction-controller` dependency
range updated to `^71.0.0` with `package.json` changes under this
release branch. Changelog entries for those packages will be generated
by commenting `@metamaskbot update-changelogs` on this PR.

## References

- [MetaMask#10109](MetaMask#10109) — Move
sponsorship and signing decisions to optional approval-time hooks
- [MetaMask#10340](MetaMask#10340) — Add
`membershipSubscription` transaction type
- [MetaMask#10224](MetaMask#10224) — Support
subsidized max Relay deposits using atomic `EXACT_OUTPUT` quotes

## 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
- [x] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/core/tree/main/docs/processes/updating-changelogs.md)
- [ ] I've introduced [breaking
changes](https://github.com/MetaMask/core/tree/main/docs/processes/breaking-changes.md)
in this PR and have prepared draft pull requests for clients and
consumer packages to resolve them

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **High Risk**
> The major transaction-controller release changes core transaction
approval, sponsorship, and signing behavior across many downstream
packages that depend on it.
> 
> **Overview**
> Release **`1275.0.0`** cuts published versions for
**`@metamask/transaction-controller`** `71.0.0` (major) and
**`@metamask/transaction-pay-controller`** `29.1.0` (minor), and bumps
the monorepo root version accordingly.
> 
> The transaction-controller release documents **breaking**
approval-time behavior: sponsorship and signing now flow through
optional **`isSponsored`** / **`shouldSign`** hooks instead of
**`isGasFeeSponsored`** / **`isExternalSign`**, plus a new
**`membershipSubscription`** transaction type. This PR mostly
**propagates** that major by setting dependent packages’
`@metamask/transaction-controller` ranges to **`^71.0.0`**, updating
**`yarn.lock`**, and recording bump entries in package changelogs
(including transaction-pay’s dependency bump under `29.1.0`).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
b93ad54. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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