Skip to content

Conversation

@runway-github
Copy link
Contributor

@runway-github runway-github bot commented Oct 24, 2025

Description

This PR fixed and aligns the gasless transaction logic vie 7702 and
smart transactions .
It ensures consistent handling of Smart Transactions, sendBundle
support, and EIP-7702 activation.

Changes

Updated useIsGaslessSupported hook

Gasless is now considered supported when:

  • Smart Transactions are enabled and the chain supports
    sendBundle, or
  • Smart Transactions are disabled and the chain supports EIP-7702
    (is7702Supported).

Updated isEIP7702GasFeeTokensEnabled

EIP-7702 gas fee tokens are now enabled when:

  • Smart Transactions are not enabled, or
  • The chain does not support sendBundle.

This prevents EIP-7702 activation when full Smart Transaction support is
available.

Changelog

CHANGELOG entry: null

Related issues

Fixes: #21613
https://github.com/MetaMask/mobile-planning/issues/2356

Manual testing steps

Feature: Pay gas fees using an alternative token on Arbitrum mainnet

  Scenario: User sends a token transaction using USDC to pay for gas fees
    Given user has USDC to pay for the transaction
    And the user has an upgraded account on Arbitrum mainnet
    And the user has insufficient ETH balance to cover gas fees

    When the user sends a USDC token transaction on Arbitrum mainnet
    And selects USDC as the gas fee token in the "Network Fee" row
    And confirms the transaction

    Then the transaction should be successfully submitted
    And the user should see on Etherscan that gas fees were paid in USDC
    And the USDC balance of the account should decrease accordingly

Screenshots/Recordings

Screencast.from.2025-10-24.15-48-57.webm

Before

After

Pre-merge author checklist

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the
    app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described
    in the ticket it closes and includes the necessary testing evidence such
    as recordings and or screenshots.

Note

Aligns gasless support to use Smart Transactions only when sendBundle is supported, otherwise fall back to EIP-7702; gates 7702 gas fee tokens when full Smart Tx support is available, with comprehensive test updates.

  • Hooks
    • useIsGaslessSupported: Uses selectShouldUseSmartTransaction; adds sendBundle check and short-circuits 7702 checks when Smart Tx + sendBundle are supported; sets isSupported when Smart Tx + sendBundle OR EIP-7702 conditions pass; adds JSDoc.
  • Controller
    • transaction-controller-init: Updates isEIP7702GasFeeTokensEnabled to enable 7702 gas fee tokens only when Smart Tx is disabled or sendBundle is unsupported.
  • Tests
    • useIsGaslessSupported.test: Reorganizes and extends cases for Smart Tx, EIP-7702, and edge cases; adds SMART_TRANSACTIONS_ENABLED_STATE; asserts behavior when sendBundle unsupported.
    • transaction-controller-init.test: Adds test for isEIP7702GasFeeTokensEnabled behavior.

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

3267c1b

…port logic (#21604)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

This PR fixed and aligns the gasless transaction logic vie 7702 and
smart transactions .
It ensures consistent handling of Smart Transactions, `sendBundle`
support, and EIP-7702 activation.

### Changes

#### Updated `useIsGaslessSupported` hook
Gasless is now considered supported when:
- Smart Transactions are enabled **and** the chain supports
`sendBundle`, or
- Smart Transactions are disabled **and** the chain supports EIP-7702
(`is7702Supported`).

#### Updated `isEIP7702GasFeeTokensEnabled`
EIP-7702 gas fee tokens are now enabled when:
- Smart Transactions are **not** enabled, or
- The chain **does not** support `sendBundle`.

This prevents EIP-7702 activation when full Smart Transaction support is
available.

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes: #21613
MetaMask/mobile-planning#2356

## **Manual testing steps**

```gherkin
Feature: Pay gas fees using an alternative token on Arbitrum mainnet

  Scenario: User sends a token transaction using USDC to pay for gas fees
    Given user has USDC to pay for the transaction
    And the user has an upgraded account on Arbitrum mainnet
    And the user has insufficient ETH balance to cover gas fees

    When the user sends a USDC token transaction on Arbitrum mainnet
    And selects USDC as the gas fee token in the "Network Fee" row
    And confirms the transaction

    Then the transaction should be successfully submitted
    And the user should see on Etherscan that gas fees were paid in USDC
    And the USDC balance of the account should decrease accordingly
```

## **Screenshots/Recordings**

[Screencast from 2025-10-24
15-48-57.webm](https://github.com/user-attachments/assets/ac5e2ac8-5849-4057-8f95-658e632c40cb)


<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates gasless logic to require Smart Transactions plus sendBundle
support or EIP-7702, and enables EIP-7702 gas fee tokens when Smart
Transactions are off or sendBundle is unsupported, with accompanying
tests.
> 
> - **Hooks**
>   - `useIsGaslessSupported`:
> - Switch to `selectShouldUseSmartTransaction` and gate gasless on
`isSmartTransaction && sendBundle` or EIP-7702.
> - Short-circuit `isAtomicBatchSupported`/`isRelaySupported` when smart
+ sendBundle is supported.
>     - Adds helper `isSmartTransactionAndBundleSupported` and JSDoc.
> - **Controller**
>   - `transaction-controller-init.ts`:
> - `isEIP7702GasFeeTokensEnabled` now returns true when smart
transactions are disabled or `sendBundle` is not supported.
> - **Tests**
> - Revamp `useIsGaslessSupported.test.ts` to cover Smart Tx vs EIP-7702
paths, sendBundle gating, and edge cases.
> - Add test for `isEIP7702GasFeeTokensEnabled` option behavior in
`transaction-controller-init.test.ts`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1f6024d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@runway-github runway-github bot requested a review from a team as a code owner October 24, 2025 15:18
@github-actions
Copy link
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot metamaskbot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Oct 24, 2025
@sonarqubecloud
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size-M team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants