diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index a7a5fb27ac0..e8fd55c7a4d 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -20,6 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use the `transactionHistoryLimit` feature flag in `RemoteFeatureFlagController` instead. - This option will be removed in a future version. +### Fixed + +- Set `isExternalSign` for sponsored transactions to skip nonce assignment ([#7659](https://github.com/MetaMask/core/pull/7659)) + ## [62.9.2] ### Changed diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 2f5f942d70e..d2a4b4b1694 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -1351,6 +1351,8 @@ export class TransactionController extends BaseController< const existingTransactionMeta = this.#getTransactionWithActionId(actionId); // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it. + // EIP-7702 batch transactions (with nestedTransactions) are signed externally via delegation + const isEIP7702Batch = Boolean(nestedTransactions?.length); let addedTransactionMeta: TransactionMeta = existingTransactionMeta ? cloneDeep(existingTransactionMeta) : { @@ -1363,6 +1365,7 @@ export class TransactionController extends BaseController< deviceConfirmedOn, disableGasBuffer, id: random(), + isExternalSign: isEIP7702Batch, isGasFeeTokenIgnoredIfBalance: Boolean(gasFeeToken), isGasFeeIncluded, isGasFeeSponsored, @@ -1457,6 +1460,8 @@ export class TransactionController extends BaseController< this.#addMetadata(addedTransactionMeta); + // Record delegationAddress for metrics, but do not use it to determine isExternalSign. + // Only EIP-7702 batch transactions (with nestedTransactions) should have isExternalSign = true. delegationAddressPromise .then((delegationAddress) => { this.#updateTransactionInternal(