Skip to content

fix(transaction-pay-controller, transaction-controller): support Predict same-chain withdraw on swap-only Relay routes#8735

Merged
dan437 merged 1 commit into
mainfrom
predict-withdraw-from-override-swap-route
May 12, 2026
Merged

fix(transaction-pay-controller, transaction-controller): support Predict same-chain withdraw on swap-only Relay routes#8735
dan437 merged 1 commit into
mainfrom
predict-withdraw-from-override-swap-route

Conversation

@dan437
Copy link
Copy Markdown
Contributor

@dan437 dan437 commented May 7, 2026

Explanation

Since the Polymarket pUSD migration on April 28 2026, Predict same-chain withdraws on Polygon (e.g. pUSD → USDC) sometimes fail with transaction gas limit too high (cap: 33554432, tx: 42121000).

Two interacting bugs:

  1. transaction-pay-controllercalculateSourceNetworkCost always uses fromOverride = Safe proxy for Predict withdraws. That works for deposit-style Relay routes but breaks for the swap-aggregator routes that same-chain destinations now use post-migration: DEX aggregators reject contract callers (anti-MEV msg.sender == tx.origin checks etc.), so the swap step reverts in simulation.
  2. transaction-controllerestimateGasBatch's 7702 path always calls estimateGas, even when every batch entry already has a gas value. The non-7702 path has had an allTransactionsHaveGas short-circuit since #7405; the 7702 path was missed. When TPC tries the EOA from, the swap sub-call reverts (EOA has no source token until the prepended Safe.execTransaction sub-call runs mid-batch), the whole 7702 batch falls back to ~block-gas-limit × buffer ≈ 42M, and Polygon's per-tx gascap rejects it.

Fix

  • TPC relay-quotes.ts: gate fromOverride = Safe proxy on the route having a deposit step. Same-chain swap routes use the relay params' EOA from instead. Gas-fee-token lookup keeps using the Safe proxy (gated on isPredictWithdraw && refundTo) so the gasless flow still works for users with 0 POL.
  • TPC constants.ts: add POLYGON_PUSD_ADDRESS and include it in STABLECOINS[Polygon] for correct stablecoin display.
  • TC gas.ts: mirror the existing non-7702 short-circuit in the 7702 branch — when every transaction has a provided gas, sum them and skip simulation.

Verified end-to-end on mobile (yalc-linked): Polygon pUSD → USDC withdraw produces a sane fee both with POL and gasless (paid in pUSD). BNB cross-chain unchanged.

References

N/A

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 gas estimation behavior for EIP-7702 batches and alters Relay quote simulation from selection for Predict withdraws; mistakes could impact fee estimation and transaction success for these flows.

Overview
Fixes Predict same-chain withdraws on swap-only Relay routes by gating the Safe-proxy from override to only routes that include a deposit step, while still using the Safe proxy for gas-fee-token eligibility checks.

Updates estimateGasBatch’s EIP-7702 path to fallback to summed caller-provided per-tx gas limits when node simulation fails (instead of block-gas-limit fallback), via a new getProvidedBatchGasLimits helper and added test coverage.

Adds POLYGON_PUSD_ADDRESS and includes it in Polygon STABLECOINS for stablecoin display/fiat-rate handling, with new constants tests.

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

@dan437 dan437 requested review from a team as code owners May 7, 2026 13:22
@dan437 dan437 temporarily deployed to default-branch May 7, 2026 13:22 — with GitHub Actions Inactive
Comment thread packages/transaction-controller/src/utils/gas.ts
@dan437 dan437 force-pushed the predict-withdraw-from-override-swap-route branch 4 times, most recently from 53d29bd to 3157ea4 Compare May 11, 2026 14:45
@dan437 dan437 enabled auto-merge May 11, 2026 15:14
@dan437 dan437 force-pushed the predict-withdraw-from-override-swap-route branch 2 times, most recently from c7b3e5f to d321241 Compare May 12, 2026 05:04
…ess Predict same-chain withdraw on swap-only Relay routes
@dan437 dan437 force-pushed the predict-withdraw-from-override-swap-route branch from d321241 to 8c1c30a Compare May 12, 2026 09:13
@dan437 dan437 dismissed matthewwalsh0’s stale review May 12, 2026 09:23

I've resolved the comment and tested it. We want to merge it shortly to avoid changelog conflicts that keep happening.

@dan437 dan437 added this pull request to the merge queue May 12, 2026
Merged via the queue into main with commit b2e132c May 12, 2026
366 checks passed
@dan437 dan437 deleted the predict-withdraw-from-override-swap-route branch May 12, 2026 09:27
@OGPoyraz OGPoyraz mentioned this pull request May 13, 2026
4 tasks
pull Bot pushed a commit to Reality2byte/core that referenced this pull request May 13, 2026
## Explanation

Release `980.0.0` with minor version bumps for:

- **`@metamask/transaction-controller`** `65.3.0` → `65.4.0`
- **`@metamask/transaction-pay-controller`** `22.3.1` → `22.4.0`

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

#### Added
- Add optional `fiat` object (with `orderId` and `provider` properties)
to `MetamaskPayMetadata` type for persisting fiat on-ramp order data on
transactions
- Add `predictAcrossWithdraw` to the `TransactionType` enum

#### Changed
- `estimateGasBatch` now falls back to the sum of per-tx `gas` values in
the EIP-7702 path when node simulation fails, instead of returning the
block-gas-limit fallback
- Bump `@metamask/network-controller` from `^31.0.0` to `^32.0.0`
- Bump `@metamask/accounts-controller` from `^38.1.0` to `^38.1.1`
- Bump `@metamask/controller-utils` from `^12.0.0` to `^12.1.0`

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

#### Added
- Add Across quote support for post-quote Predict withdraw flows

#### Changed
- Derive fiat order source amount from on-chain transaction data
(`order.txHash`) with fallback to `order.cryptoAmount`
- Persist fiat order ID and provider code on `transaction.metamaskPay`
before polling, so activity views can query order status after
controller state cleanup
- Bump `@metamask/assets-controller` from `^7.1.1` to `^7.1.2`
- Bump `@metamask/assets-controllers` from `^108.0.0` to `^108.1.0`

#### Fixed
- For postquote payments payment token for MM Pay transaction should not
be reset when accountOverride is changed

### Dependency updates

14 packages had their `@metamask/transaction-controller` dependency
range updated from `^65.3.0` to `^65.4.0` with corresponding changelog
entries under `[Unreleased]`:
- `@metamask/assets-controller`
- `@metamask/assets-controllers`
- `@metamask/bridge-controller`
- `@metamask/bridge-status-controller`
- `@metamask/earn-controller`
- `@metamask/eip-5792-middleware`
- `@metamask/gator-permissions-controller`
- `@metamask/network-enablement-controller`
- `@metamask/perps-controller`
- `@metamask/phishing-controller`
- `@metamask/profile-metrics-controller`
- `@metamask/shield-controller`
- `@metamask/subscription-controller`
- `@metamask/user-operation-controller`

## References

- [MetaMask#8694](MetaMask#8694) — Add fiat on-ramp
order data persistence on transactions
- [MetaMask#8759](MetaMask#8759) — Add
`predictAcrossWithdraw` transaction type
- [MetaMask#8735](MetaMask#8735) — EIP-7702 gas
estimation fallback improvements
- [MetaMask#8760](MetaMask#8760) — Across quote
support for post-quote Predict withdraw
- [MetaMask#8787](MetaMask#8787) — Fix payment
token reset on accountOverride change

## 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]
> **Medium Risk**
> Mainly a release/version bump, but it pulls in updated
`@metamask/transaction-controller` behavior (gas estimation fallback,
new metadata/type fields) across many dependent controllers, which could
affect transaction handling paths.
> 
> **Overview**
> Bumps the monorepo release to `980.0.0`, publishes
`@metamask/transaction-controller@65.4.0`, and publishes
`@metamask/transaction-pay-controller@22.4.0` (with corresponding
changelog link updates).
> 
> Propagates the `@metamask/transaction-controller` dependency range
from `^65.3.0` to `^65.4.0` across multiple packages (e.g.
assets/bridge/network-enablement/perps/phishing/shield/subscription/user-operation
controllers) and records the bumps in each package’s `[Unreleased]`
changelog entries, with `yarn.lock` updates to match.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
699b516. 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