diff --git a/packages/bridge-status-controller/CHANGELOG.md b/packages/bridge-status-controller/CHANGELOG.md index 0448775d65a..617e4af3005 100644 --- a/packages/bridge-status-controller/CHANGELOG.md +++ b/packages/bridge-status-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add isGasFeeSponsored field in transaction batch params ([#7064](https://github.com/MetaMask/core/pull/7064)) + ## [59.0.0] ### Changed diff --git a/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap b/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap index 73eb5e665d0..862bbfc80da 100644 --- a/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap +++ b/packages/bridge-status-controller/src/__snapshots__/bridge-status-controller.test.ts.snap @@ -1252,6 +1252,7 @@ Array [ "disable7702": true, "from": "0xaccount1", "isGasFeeIncluded": false, + "isGasFeeSponsored": false, "networkClientId": "arbitrum", "origin": "metamask", "requireApproval": false, @@ -2952,6 +2953,7 @@ Array [ "disable7702": true, "from": "0xaccount1", "isGasFeeIncluded": false, + "isGasFeeSponsored": false, "networkClientId": "arbitrum", "origin": "metamask", "requireApproval": false, diff --git a/packages/bridge-status-controller/src/utils/transaction.ts b/packages/bridge-status-controller/src/utils/transaction.ts index e60dce0a756..ee9381c4282 100644 --- a/packages/bridge-status-controller/src/utils/transaction.ts +++ b/packages/bridge-status-controller/src/utils/transaction.ts @@ -300,6 +300,7 @@ export const getAddTransactionBatchParams = async ({ feeData: { txFee }, gasIncluded, gasIncluded7702, + gasSponsored, }, sentAmount, toTokenAmount, @@ -393,6 +394,7 @@ export const getAddTransactionBatchParams = async ({ >[0] = { disable7702, isGasFeeIncluded: Boolean(gasIncluded7702), + isGasFeeSponsored: Boolean(gasSponsored), networkClientId, requireApproval, origin: 'metamask', diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index ccb7cc1d150..42270b3aa93 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Calculate operator fee for OP stack networks and include it in `layer1GasFee` ([#6979](https://github.com/MetaMask/core/pull/6979)) +- Add support for `isGasFeeSponsored` field in transaction batch and add transaction options ([#7064](https://github.com/MetaMask/core/pull/7064)) ## [61.1.0] diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index bb18eb1a17d..e9c865d50e7 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -1692,6 +1692,7 @@ describe('TransactionController', () => { id: expect.any(String), isFirstTimeInteraction: undefined, isGasFeeIncluded: undefined, + isGasFeeSponsored: undefined, nestedTransactions: undefined, networkClientId: NETWORK_CLIENT_ID_MOCK, origin: undefined, diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index c385bd4a62a..b89a718bafc 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -1216,6 +1216,7 @@ export class TransactionController extends BaseController< deviceConfirmedOn, disableGasBuffer, isGasFeeIncluded, + isGasFeeSponsored, method, nestedTransactions, networkClientId, @@ -1315,6 +1316,7 @@ export class TransactionController extends BaseController< disableGasBuffer, id: random(), isGasFeeIncluded, + isGasFeeSponsored, isFirstTimeInteraction: undefined, nestedTransactions, networkClientId, diff --git a/packages/transaction-controller/src/types.ts b/packages/transaction-controller/src/types.ts index 16ade4dbe8a..b23a567785f 100644 --- a/packages/transaction-controller/src/types.ts +++ b/packages/transaction-controller/src/types.ts @@ -1726,6 +1726,9 @@ export type TransactionBatchRequest = { /** Whether MetaMask will be compensated for the gas fee by the transaction. */ isGasFeeIncluded?: boolean; + /** Whether MetaMask will sponsor the gas fee for the transaction. */ + isGasFeeSponsored?: boolean; + /** ID of the network client to submit the transaction. */ networkClientId: NetworkClientId; @@ -2061,6 +2064,9 @@ export type AddTransactionOptions = { /** Whether MetaMask will be compensated for the gas fee by the transaction. */ isGasFeeIncluded?: boolean; + /** Whether MetaMask will sponsor the gas fee for the transaction. */ + isGasFeeSponsored?: boolean; + /** RPC method that requested the transaction. */ method?: string; diff --git a/packages/transaction-controller/src/utils/batch.test.ts b/packages/transaction-controller/src/utils/batch.test.ts index 313736e6364..14834f3944a 100644 --- a/packages/transaction-controller/src/utils/batch.test.ts +++ b/packages/transaction-controller/src/utils/batch.test.ts @@ -810,6 +810,33 @@ describe('Batch Utils', () => { }, ); + it.each([true, false])( + 'passes isGasFeeSponsored flag (%s) through to addTransaction when provided (EIP-7702 path)', + async (isGasFeeSponsored) => { + isAccountUpgradedToEIP7702Mock.mockResolvedValueOnce({ + delegationAddress: undefined, + isSupported: true, + }); + + addTransactionMock.mockResolvedValueOnce({ + transactionMeta: TRANSACTION_META_MOCK, + result: Promise.resolve(''), + }); + + request.request.isGasFeeSponsored = isGasFeeSponsored; + + await addTransactionBatch(request); + + expect(addTransactionMock).toHaveBeenCalledTimes(1); + expect(addTransactionMock).toHaveBeenCalledWith( + expect.any(Object), + expect.objectContaining({ + isGasFeeSponsored, + }), + ); + }, + ); + describe('validates security', () => { it('using transaction params', async () => { isAccountUpgradedToEIP7702Mock.mockResolvedValueOnce({ diff --git a/packages/transaction-controller/src/utils/batch.ts b/packages/transaction-controller/src/utils/batch.ts index fbc27322937..3e5ead32db8 100644 --- a/packages/transaction-controller/src/utils/batch.ts +++ b/packages/transaction-controller/src/utils/batch.ts @@ -401,6 +401,7 @@ async function addTransactionBatchWith7702( const { result } = await addTransaction(txParams, { batchId, isGasFeeIncluded: userRequest.isGasFeeIncluded, + isGasFeeSponsored: userRequest.isGasFeeSponsored, nestedTransactions, networkClientId, origin,