Skip to content

Conversation

@khanti42
Copy link
Contributor

@khanti42 khanti42 commented Nov 5, 2025

Explanation

This PR introduces a new boolean flag, isGasFeeSponsored, across the Transaction Controller and Bridge Status Controller to indicate when a transaction’s gas fee is sponsored (i.e., paid by MetaMask or another service provider).

This complements the existing isGasFeeIncluded flag, which tracks when the gas cost is embedded within the transaction itself. Together, these flags enable more accurate handling of different gas payment scenarios.

Especially needed for the fully sponsored scenario for SEI and MONAD chain.

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 isGasFeeSponsored flag end-to-end (types, plumbing, and tests) for transaction batches and addTransaction, and passes quote gasSponsored through BridgeStatusController.

  • Transaction Controller:
    • Types: Add isGasFeeSponsored to TransactionBatchRequest and AddTransactionOptions in src/types.ts.
    • Controller: Accept and persist isGasFeeSponsored in addTransaction; pass through in addTransactionBatch (EIP-7702 path) via utils/batch.ts.
    • Tests: Update expectations and add tests to verify isGasFeeSponsored propagation (TransactionController.test.ts, utils/batch.test.ts).
    • Docs: Update CHANGELOG.md noting new support.
  • Bridge Status Controller:
    • Batch Params: Map quote gasSponsored => isGasFeeSponsored in getAddTransactionBatchParams (src/utils/transaction.ts).
    • Tests/Snapshots: Update snapshots to include isGasFeeSponsored; update CHANGELOG.md.

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

@khanti42 khanti42 requested review from a team as code owners November 5, 2025 19:08
@khanti42
Copy link
Contributor Author

khanti42 commented Nov 6, 2025

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 6, 2025

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

@khanti42 khanti42 force-pushed the chore/addIsGasFeeSponsoredField branch from ab5f7a6 to e983f05 Compare November 6, 2025 08:54
@khanti42 khanti42 requested a review from a team as a code owner November 6, 2025 08:54
@khanti42
Copy link
Contributor Author

khanti42 commented Nov 6, 2025

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 6, 2025

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

>[0] = {
disable7702,
isGasFeeIncluded: Boolean(gasIncluded7702),
isGasFeeSponsored: Boolean(gasSponsored),
Copy link

Choose a reason for hiding this comment

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

Bug: Gas Sponsorship Not Reflected in Quote Response

The gasSponsored property is destructured from quoteResponse.quote but it's not included in the quoteResponse parameter type definition. Looking at the context, the function signature shows quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & Partial<QuoteMetadata>, but gasSponsored is not part of the quote object's known structure based on the imports from @metamask/bridge-controller. This could result in gasSponsored being undefined and isGasFeeSponsored always being false, even when gas is actually sponsored.

Fix in Cursor Fix in Web

@Battambang
Copy link
Contributor

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 6, 2025

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

@Battambang Battambang force-pushed the chore/addIsGasFeeSponsoredField branch from 7b44fb9 to c307071 Compare November 7, 2025 12:42
Battambang
Battambang previously approved these changes Nov 7, 2025
vinistevam
vinistevam previously approved these changes Nov 7, 2025
@khanti42 khanti42 enabled auto-merge (squash) November 7, 2025 13:36
const { result } = await addTransaction(txParams, {
batchId,
isGasFeeIncluded: userRequest.isGasFeeIncluded,
isGasFeeSponsored: userRequest.isGasFeeSponsored,
Copy link
Member

Choose a reason for hiding this comment

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

This is only for EIP-7702 flow, do we also want want to pass it for the hook fallback via STX or sequentially?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The requirement is 7702 support from the chain to activate sponsorship. If 7702 is not supported by the chain then sponsorship cannot happen.

Copy link
Contributor

Choose a reason for hiding this comment

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

Current gas fees sponsored use case is only for EIP-7702 delegation flow.

const { result } = await addTransaction(txParams, {
batchId,
isGasFeeIncluded: userRequest.isGasFeeIncluded,
isGasFeeSponsored: userRequest.isGasFeeSponsored,
Copy link
Member

Choose a reason for hiding this comment

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

Minor, is it worth asserting this is passed in one of the existing unit tests?

@khanti42 khanti42 merged commit f35ae4c into main Nov 7, 2025
271 checks passed
@khanti42 khanti42 deleted the chore/addIsGasFeeSponsoredField branch November 7, 2025 18:50
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.

6 participants