Skip to content

feat: Support bidirectional pay strategy fallback#8577

Merged
pedronfigueiredo merged 1 commit intomainfrom
pnf/bidirectional-fallback
Apr 27, 2026
Merged

feat: Support bidirectional pay strategy fallback#8577
pedronfigueiredo merged 1 commit intomainfrom
pnf/bidirectional-fallback

Conversation

@pedronfigueiredo
Copy link
Copy Markdown
Contributor

@pedronfigueiredo pedronfigueiredo commented Apr 24, 2026

Summary

This PR enables controller-level fallback from Across to later configured pay strategies, including Relay, when Across can quote but cannot execute the planned transaction mode.

Across already has quote-time limitations, such as same-chain swaps. The issue here is an execution limitation that is only known after quote construction and gas planning: first-time EIP-7702 upgrades that require an authorization list. If Across is ordered first, the controller should not store an unusable Across quote when a later provider can still quote and execute the request.

Changes

  • Keeps supports as the pre-quote strategy capability check and allows it to be async.
  • Adds checkQuoteSupport for provider limitations discovered after quote construction and gas planning.
  • Carries requiresAuthorizationList from TransactionController:estimateGasBatch through transaction-pay gas quote metadata.
  • Updates Across to reject explicit txParams.authorizationList before quotes and reject metamask.requiresAuthorizationList after gas planning, while still allowing is7702 quotes for already-upgraded accounts.
  • Adds focused tests for fallback after post-quote support rejection and for the distinction between is7702 and requiresAuthorizationList.

Note

Medium Risk
Changes quote/strategy selection flow (including new post-quote validation) and extends estimateGasBatch output, which can alter which pay provider is chosen and how EIP-7702 batches are executed.

Overview
Adds a new post-quote capability check for pay strategies (checkQuoteSupport) and updates quote selection to skip unsupported strategies and fall back to later strategies when either pre-quote support or post-quote checks fail.

Extends TransactionController:estimateGasBatch to optionally return requiresAuthorizationList when EIP-7702 batch estimation implies a first-time account upgrade, and propagates this flag through pay quote gas planning into Across quote metadata.

Updates AcrossStrategy to reject requests that already include txParams.authorizationList, and to reject quotes whose planned execution would require an authorization list (while still allowing other is7702 quotes); includes new/updated tests and changelog entries reflecting the fallback behavior.

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

@pedronfigueiredo pedronfigueiredo changed the title [codex] Support bidirectional pay strategy fallback feat: Support bidirectional pay strategy fallback Apr 24, 2026
@pedronfigueiredo pedronfigueiredo force-pushed the pnf/bidirectional-fallback branch from 0385e59 to a6b006a Compare April 24, 2026 13:43
@pedronfigueiredo pedronfigueiredo marked this pull request as ready for review April 24, 2026 13:44
@pedronfigueiredo pedronfigueiredo requested review from a team as code owners April 24, 2026 13:44
@pedronfigueiredo pedronfigueiredo force-pushed the pnf/bidirectional-fallback branch from a6b006a to d52a6ae Compare April 24, 2026 13:47
@pedronfigueiredo pedronfigueiredo force-pushed the pnf/bidirectional-fallback branch from d52a6ae to 09f054c Compare April 24, 2026 13:52
@pedronfigueiredo pedronfigueiredo requested a review from jpuri April 24, 2026 14:56
@pedronfigueiredo pedronfigueiredo self-assigned this Apr 24, 2026
Copy link
Copy Markdown
Contributor

@jpuri jpuri left a comment

Choose a reason for hiding this comment

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

Changes look good to me

@pedronfigueiredo pedronfigueiredo added this pull request to the merge queue Apr 27, 2026
Merged via the queue into main with commit d95c104 Apr 27, 2026
358 checks passed
@pedronfigueiredo pedronfigueiredo deleted the pnf/bidirectional-fallback branch April 27, 2026 08:36
@OGPoyraz OGPoyraz mentioned this pull request Apr 28, 2026
4 tasks
pull Bot pushed a commit to Reality2byte/core that referenced this pull request Apr 28, 2026
## Explanation

Release `942.0.0` with major version bumps for two packages:

- **`@metamask/transaction-controller`** `64.4.0` → `65.0.0`
- **`@metamask/transaction-pay-controller`** `19.3.0` → `20.0.0`

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

**Breaking:** Adds `KeyringControllerGetStateAction` to `AllowedActions`
to enable keyring-based EIP-7702 account compatibility checks in
`addTransactionBatch`. Clients must add `KeyringController:getState` to
the TransactionController messenger's allowed actions.

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

**Breaking:** Fix mUSD conversion for hardware wallets on EIP-7702
chains by gating relay and Across 7702 paths on the account keyring type
via `KeyringController:getState`. The
`TransactionPayControllerMessenger` now requires
`KeyringController:getState` permission.

### Dependency updates

14 packages had their `@metamask/transaction-controller` dependency
range updated to `^65.0.0` with corresponding changelog entries under
`[Unreleased]`.

## References

- [MetaMask#8388](MetaMask#8388) — EIP-7702 keyring
compatibility
- [MetaMask#8592](MetaMask#8592) — Expose
`wipeTransactions` via messenger
- [MetaMask#8607](MetaMask#8607) — Rename
`executeEnabled` → `gaslessEnabled`
- [MetaMask#8577](MetaMask#8577) — Across EIP-7702
authorization list fallback

## 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)
- [x] 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]
> **Medium Risk**
> Primarily a release/version bump, but it upgrades to
`@metamask/transaction-controller@65.0.0` and
`@metamask/transaction-pay-controller@20.0.0`, which include
**breaking** messenger permission/allowed-action changes that can break
consumers at runtime if not updated.
> 
> **Overview**
> Bumps the monorepo version to `942.0.0` and releases **major** updates
for `@metamask/transaction-controller` (`64.4.0` → `65.0.0`) and
`@metamask/transaction-pay-controller` (`19.3.0` → `20.0.0`).
> 
> Propagates `@metamask/transaction-controller` dependency range updates
to `^65.0.0` across multiple packages (e.g.
assets/bridge/network/shield/subscription/user-operation controllers)
with corresponding `[Unreleased]` changelog entries, and updates
`yarn.lock` accordingly.
> 
> Documents breaking changes in `transaction-controller@65.0.0`
(requires `KeyringController:getState` allowed action for EIP-7702 batch
compatibility checks) and `transaction-pay-controller@20.0.0` (requires
`KeyringController:getState` to gate 7702 paths for hardware-wallet mUSD
conversion).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
de55ba7. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
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