diff --git a/packages/bridge-controller/src/bridge-controller.ts b/packages/bridge-controller/src/bridge-controller.ts index 15412820f4a..94b69705a89 100644 --- a/packages/bridge-controller/src/bridge-controller.ts +++ b/packages/bridge-controller/src/bridge-controller.ts @@ -237,6 +237,25 @@ export class BridgeController extends StaticIntervalPollingController { + const quotes = await fetchBridgeQuotes( + request, + null as never, + this.#clientId, + this.#fetchFn, + this.#config.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL, + ); + + const quotesWithL1GasFees = await this.#appendL1GasFees(quotes); + const quotesWithSolanaFees = await this.#appendSolanaFees(quotes); + + return quotesWithL1GasFees ?? quotesWithSolanaFees ?? quotes; + }), + ); + } + _executePoll = async (pollingInput: BridgePollingInput) => { await this.#fetchBridgeQuotes(pollingInput); }; diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index c04b13f5bee..a9c56f27a26 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -120,6 +120,7 @@ import type { AfterSimulateHook, BeforeSignHook, TransactionContainerType, + TransactionAsset, } from './types'; import { GasFeeEstimateLevel, @@ -1106,6 +1107,7 @@ export class TransactionController extends BaseController< * @param txParams - Standard parameters for an Ethereum transaction. * @param options - Additional options to control how the transaction is added. * @param options.actionId - Unique ID to prevent duplicate requests. + * @param options.assets - Assets required by the transaction. * @param options.batchId - A custom ID for the batch this transaction belongs to. * @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction. * @param options.disableGasBuffer - Whether to disable the gas estimation buffer. @@ -1128,6 +1130,7 @@ export class TransactionController extends BaseController< txParams: TransactionParams, options: { actionId?: string; + assets?: TransactionAsset[]; batchId?: Hex; deviceConfirmedOn?: WalletDevice; disableGasBuffer?: boolean; @@ -1151,6 +1154,7 @@ export class TransactionController extends BaseController< const { actionId, + assets, batchId, deviceConfirmedOn, disableGasBuffer, @@ -1244,6 +1248,7 @@ export class TransactionController extends BaseController< : { // Add actionId to txMeta to check if same actionId is seen again actionId, + assets, batchId, chainId, dappSuggestedGasFees, diff --git a/packages/transaction-controller/src/hooks/ExtraTransactionsPublishHook.ts b/packages/transaction-controller/src/hooks/ExtraTransactionsPublishHook.ts index 7ea4ca9bc6c..9f8af7d3bd0 100644 --- a/packages/transaction-controller/src/hooks/ExtraTransactionsPublishHook.ts +++ b/packages/transaction-controller/src/hooks/ExtraTransactionsPublishHook.ts @@ -93,8 +93,8 @@ export class ExtraTransactionsPublishHook { })); const transactions: TransactionBatchSingleRequest[] = [ - firstTransaction, ...extraTransactions, + firstTransaction, ]; log('Adding transaction batch', { @@ -107,9 +107,10 @@ export class ExtraTransactionsPublishHook { from, networkClientId, transactions, - disable7702: true, - disableHook: false, + disable7702: false, + disableHook: true, disableSequential: true, + requireApproval: false, }); return resultPromise.promise; diff --git a/packages/transaction-controller/src/index.ts b/packages/transaction-controller/src/index.ts index 42aebe08e81..59b1147b421 100644 --- a/packages/transaction-controller/src/index.ts +++ b/packages/transaction-controller/src/index.ts @@ -69,6 +69,7 @@ export type { SimulationError, SimulationToken, SimulationTokenBalanceChange, + TransactionAsset, TransactionBatchMeta, TransactionBatchRequest, TransactionBatchResult, diff --git a/packages/transaction-controller/src/types.ts b/packages/transaction-controller/src/types.ts index 1a9e7a36693..e9ca3aaad26 100644 --- a/packages/transaction-controller/src/types.ts +++ b/packages/transaction-controller/src/types.ts @@ -39,6 +39,8 @@ export type TransactionMeta = { */ actionId?: string; + assets?: TransactionAsset[]; + /** * Base fee of the block as a hex value, introduced in EIP-1559. */ @@ -1877,3 +1879,8 @@ export type BeforeSignHook = (request: { } | undefined >; + +export type TransactionAsset = { + address: Hex; + amount: Hex; +}; diff --git a/packages/transaction-controller/src/utils/batch.ts b/packages/transaction-controller/src/utils/batch.ts index 53d489662f5..d8259a6cd9c 100644 --- a/packages/transaction-controller/src/utils/batch.ts +++ b/packages/transaction-controller/src/utils/batch.ts @@ -271,6 +271,7 @@ async function addTransactionBatchWith7702( const { addTransaction, getChainId, + getTransaction, messenger, publicKeyEIP7702, request: userRequest, @@ -321,6 +322,12 @@ async function addTransactionBatchWith7702( ), ); + const existingTransaction = transactions.find((tx) => tx.existingTransaction); + + const existingTransactionMeta = existingTransaction + ? getTransaction(existingTransaction.existingTransaction?.id as string) + : undefined; + const batchParams = generateEIP7702BatchTransaction(from, nestedTransactions); const txParams: TransactionParams = { @@ -328,6 +335,10 @@ async function addTransactionBatchWith7702( ...batchParams, }; + if (existingTransactionMeta) { + txParams.nonce = existingTransactionMeta.txParams.nonce; + } + if (!isSupported) { const upgradeContractAddress = getEIP7702UpgradeContractAddress( chainId, @@ -383,7 +394,13 @@ async function addTransactionBatchWith7702( }); // Wait for the transaction to be published. - await result; + const transactionHash = await result; + + if (existingTransaction) { + existingTransaction?.existingTransaction?.onPublish?.({ + transactionHash, + }); + } return { batchId, diff --git a/packages/transaction-controller/src/utils/eip7702.ts b/packages/transaction-controller/src/utils/eip7702.ts index ef970f939f7..0eb4996edf0 100644 --- a/packages/transaction-controller/src/utils/eip7702.ts +++ b/packages/transaction-controller/src/utils/eip7702.ts @@ -131,16 +131,6 @@ export function generateEIP7702BatchTransaction( (param) => transaction[param] !== undefined, ); - if (unsupported.length) { - const errorData = unsupported - .map((param) => `${param}: ${transaction[param]}`) - .join(', '); - - throw new Error( - `EIP-7702 batch transactions do not support gas parameters per call - ${errorData}`, - ); - } - return [ to ?? '0x0000000000000000000000000000000000000000', value ?? '0x0',