diff --git a/app/scripts/controllers/mmi-controller.ts b/app/scripts/controllers/mmi-controller.ts index 9f2701b2c0b9..f94388aa5e8f 100644 --- a/app/scripts/controllers/mmi-controller.ts +++ b/app/scripts/controllers/mmi-controller.ts @@ -311,7 +311,7 @@ export class MMIController { } } - const txList = this.txStateManager.getTransactions({}, [], false); // Includes all transactions, but we are looping through keyrings. Currently filtering is done in updateCustodianTransactions :-/ + const txList = this.txStateManager.getTransactions(); // Includes all transactions, but we are looping through keyrings. Currently filtering is done in updateCustodianTransactions :-/ try { updateCustodianTransactions({ diff --git a/app/scripts/lib/transaction/metrics.test.ts b/app/scripts/lib/transaction/metrics.test.ts index 7dcedd4e467e..c4ddf9d29e5a 100644 --- a/app/scripts/lib/transaction/metrics.test.ts +++ b/app/scripts/lib/transaction/metrics.test.ts @@ -115,6 +115,7 @@ describe('Transaction metrics', () => { type: TransactionType.simpleSend, origin: ORIGIN_METAMASK, chainId: mockChainId, + networkClientId: 'testNetworkClientId', time: 1624408066355, defaultGasEstimates: { gas: '0x7b0d', diff --git a/app/scripts/lib/transaction/smart-transactions.test.ts b/app/scripts/lib/transaction/smart-transactions.test.ts index 1cf266c3e141..25bb409dffa1 100644 --- a/app/scripts/lib/transaction/smart-transactions.test.ts +++ b/app/scripts/lib/transaction/smart-transactions.test.ts @@ -150,6 +150,7 @@ function withRequest( }, type: TransactionType.simpleSend, chainId: CHAIN_IDS.MAINNET, + networkClientId: 'testNetworkClientId', time: 1624408066355, defaultGasEstimates: { gas: '0x7b0d', diff --git a/app/scripts/lib/transaction/util.test.ts b/app/scripts/lib/transaction/util.test.ts index fbbee025381b..4d78ea51cfa5 100644 --- a/app/scripts/lib/transaction/util.test.ts +++ b/app/scripts/lib/transaction/util.test.ts @@ -50,6 +50,7 @@ const TRANSACTION_PARAMS_MOCK: TransactionParams = { const TRANSACTION_OPTIONS_MOCK: AddTransactionOptions = { actionId: 'mockActionId', + networkClientId: 'mockNetworkClientId', origin: 'mockOrigin', requireApproval: false, type: TransactionType.simpleSend, @@ -151,23 +152,6 @@ describe('Transaction Utils', () => { }); }); - it('adds transaction with networkClientId if process.env.TRANSACTION_MULTICHAIN is set', async () => { - process.env.TRANSACTION_MULTICHAIN = '1'; - - await addTransaction(request); - - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledTimes(1); - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledWith(TRANSACTION_PARAMS_MOCK, { - ...TRANSACTION_OPTIONS_MOCK, - networkClientId: 'mockNetworkClientId', - }); - process.env.TRANSACTION_MULTICHAIN = ''; - }); - it('returns transaction meta', async () => { const transactionMeta = await addTransaction(request); expect(transactionMeta).toStrictEqual(TRANSACTION_META_MOCK); @@ -541,27 +525,6 @@ describe('Transaction Utils', () => { }); }); - it('adds transaction with networkClientId if process.env.TRANSACTION_MULTICHAIN is set', async () => { - process.env.TRANSACTION_MULTICHAIN = '1'; - - await addDappTransaction(dappRequest); - - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledTimes(1); - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledWith(TRANSACTION_PARAMS_MOCK, { - ...TRANSACTION_OPTIONS_MOCK, - networkClientId: 'mockNetworkClientId', - method: DAPP_REQUEST_MOCK.method, - requireApproval: true, - securityAlertResponse: DAPP_REQUEST_MOCK.securityAlertResponse, - type: undefined, - }); - process.env.TRANSACTION_MULTICHAIN = ''; - }); - it('returns transaction hash', async () => { const transactionHash = await addDappTransaction(dappRequest); expect(transactionHash).toStrictEqual(TRANSACTION_META_MOCK.hash); diff --git a/app/scripts/lib/transaction/util.ts b/app/scripts/lib/transaction/util.ts index 0bbf93afd8a8..34f27d321e0b 100644 --- a/app/scripts/lib/transaction/util.ts +++ b/app/scripts/lib/transaction/util.ts @@ -46,7 +46,7 @@ type BaseAddTransactionRequest = { }; type FinalAddTransactionRequest = BaseAddTransactionRequest & { - transactionOptions: AddTransactionOptions; + transactionOptions: Partial; }; export type AddTransactionRequest = FinalAddTransactionRequest & { @@ -66,7 +66,7 @@ export async function addDappTransaction( const { id: actionId, method, origin } = dappRequest; const { securityAlertResponse, traceContext } = dappRequest; - const transactionOptions: AddTransactionOptions = { + const transactionOptions: Partial = { actionId, method, origin, @@ -143,10 +143,11 @@ async function addTransactionWithController( transactionParams, networkClientId, } = request; + const { result, transactionMeta } = await transactionController.addTransaction(transactionParams, { ...transactionOptions, - ...(process.env.TRANSACTION_MULTICHAIN ? { networkClientId } : {}), + networkClientId, }); return { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index d60d937e1c3c..a1cbabb9bcbe 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -236,10 +236,7 @@ import { TOKEN_TRANSFER_LOG_TOPIC_HASH, TRANSFER_SINFLE_LOG_TOPIC_HASH, } from '../../shared/lib/transactions-controller-utils'; -import { - getCurrentChainId, - getProviderConfig, -} from '../../shared/modules/selectors/networks'; +import { getProviderConfig } from '../../shared/modules/selectors/networks'; import { endTrace, trace } from '../../shared/lib/trace'; // eslint-disable-next-line import/no-restricted-paths import { isSnapId } from '../../ui/helpers/utils/snaps'; @@ -652,7 +649,9 @@ export default class MetamaskController extends EventEmitter { }); this.tokenListController = new TokenListController({ - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId({ + metamask: this.networkController.state, + }), preventPollingOnNetworkRestart: !this.#isTokenListPollingRequired( this.preferencesController.state, ), @@ -676,7 +675,7 @@ export default class MetamaskController extends EventEmitter { }); this.assetsContractController = new AssetsContractController({ messenger: assetsContractControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), }); const tokensControllerMessenger = this.controllerMessenger.getRestricted({ @@ -699,7 +698,7 @@ export default class MetamaskController extends EventEmitter { state: initState.TokensController, provider: this.provider, messenger: tokensControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), }); const nftControllerMessenger = this.controllerMessenger.getRestricted({ @@ -725,7 +724,7 @@ export default class MetamaskController extends EventEmitter { this.nftController = new NftController({ state: initState.NftController, messenger: nftControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), onNftAdded: ({ address, symbol, tokenId, standard, source }) => this.metaMetricsController.trackEvent({ event: MetaMetricsEventName.NftAdded, @@ -760,7 +759,7 @@ export default class MetamaskController extends EventEmitter { this.nftDetectionController = new NftDetectionController({ messenger: nftDetectionControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), getOpenSeaApiKey: () => this.nftController.openSeaApiKey, getBalancesInSingleCall: this.assetsContractController.getBalancesInSingleCall.bind( @@ -849,13 +848,10 @@ export default class MetamaskController extends EventEmitter { legacyAPIEndpoint: `${gasApiBaseUrl}/networks//gasPrices`, EIP1559APIEndpoint: `${gasApiBaseUrl}/networks//suggestedGasFees`, getCurrentNetworkLegacyGasAPICompatibility: () => { - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); return chainId === CHAIN_IDS.BSC; }, - getChainId: () => - getCurrentChainId({ metamask: this.networkController.state }), + getChainId: () => this.#getGlobalChainId(), }); this.appStateController = new AppStateController({ @@ -950,7 +946,7 @@ export default class MetamaskController extends EventEmitter { ppomInit: () => PPOMModule.default(process.env.PPOM_URI), }, state: initState.PPOMController, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), securityAlertsEnabled: this.preferencesController.state.securityAlertsEnabled, onPreferencesChange: preferencesMessenger.subscribe.bind( @@ -1916,8 +1912,8 @@ export default class MetamaskController extends EventEmitter { ], allowedEvents: [`NetworkController:stateChange`], }); + this.txController = new TransactionController({ - blockTracker: this.blockTracker, getCurrentNetworkEIP1559Compatibility: this.networkController.getEIP1559Compatibility.bind( this.networkController, @@ -1935,10 +1931,10 @@ export default class MetamaskController extends EventEmitter { ), getNetworkState: () => this.networkController.state, getPermittedAccounts: this.getPermittedAccounts.bind(this), - getSavedGasFees: () => - this.preferencesController.state.advancedGasFee[ - getCurrentChainId({ metamask: this.networkController.state }) - ], + getSavedGasFees: () => { + const globalChainId = this.#getGlobalChainId(); + return this.preferencesController.state.advancedGasFee[globalChainId]; + }, incomingTransactions: { etherscanApiKeysByChainId: { [CHAIN_IDS.MAINNET]: process.env.ETHERSCAN_API_KEY, @@ -1946,26 +1942,17 @@ export default class MetamaskController extends EventEmitter { }, includeTokenTransfers: false, isEnabled: () => - Boolean( - this.preferencesController.state.incomingTransactionsPreferences?.[ - getCurrentChainId({ metamask: this.networkController.state }) - ] && this.onboardingController.state.completedOnboarding, - ), + this.preferencesController.state.incomingTransactionsPreferences?.[ + this.#getGlobalChainId() + ] && this.onboardingController.state.completedOnboarding, queryEntireHistory: false, updateTransactions: false, }, isFirstTimeInteractionEnabled: () => this.preferencesController.state.securityAlertsEnabled, - isMultichainEnabled: process.env.TRANSACTION_MULTICHAIN, isSimulationEnabled: () => this.preferencesController.state.useTransactionSimulations, messenger: transactionControllerMessenger, - onNetworkStateChange: (listener) => { - networkControllerMessenger.subscribe( - 'NetworkController:networkDidChange', - () => listener(), - ); - }, pendingTransactions: { isResubmitEnabled: () => { const state = this._getMetaMaskState(); @@ -1975,7 +1962,6 @@ export default class MetamaskController extends EventEmitter { ); }, }, - provider: this.provider, testGasFeeFlows: process.env.TEST_GAS_FEE_FLOWS, trace, hooks: { @@ -2155,12 +2141,12 @@ export default class MetamaskController extends EventEmitter { this.swapsController = new SwapsController( { messenger: swapsControllerMessenger, - // TODO: Remove once TransactionController exports this action type getBufferedGasLimit: async (txMeta, multiplier) => { const { gas: gasLimit, simulationFails } = await this.txController.estimateGasBuffered( txMeta.txParams, multiplier, + this.#getGlobalNetworkClientId(), ); return { gasLimit, simulationFails }; @@ -2223,7 +2209,11 @@ export default class MetamaskController extends EventEmitter { this.smartTransactionsController = new SmartTransactionsController({ supportedChainIds: getAllowedSmartTransactionsChainIds(), clientId: ClientId.Extension, - getNonceLock: this.txController.getNonceLock.bind(this.txController), + getNonceLock: (address) => + this.txController.getNonceLock( + address, + this.#getGlobalNetworkClientId(), + ), confirmExternalTransaction: this.txController.confirmExternalTransaction.bind(this.txController), trackMetaMetricsEvent: this.metaMetricsController.trackEvent.bind( @@ -2704,7 +2694,10 @@ export default class MetamaskController extends EventEmitter { } triggerNetworkrequests() { - this.txController.startIncomingTransactionPolling(); + this.txController.startIncomingTransactionPolling([ + this.#getGlobalNetworkClientId(), + ]); + this.tokenDetectionController.enable(); this.getInfuraFeatureFlags(); } @@ -2942,13 +2935,13 @@ export default class MetamaskController extends EventEmitter { 'PreferencesController:stateChange', previousValueComparator(async (prevState, currState) => { const { currentLocale } = currState; - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); await updateCurrentLocale(currentLocale); if (currState.incomingTransactionsPreferences?.[chainId]) { - this.txController.startIncomingTransactionPolling(); + this.txController.startIncomingTransactionPolling([ + this.#getGlobalNetworkClientId(), + ]); } else { this.txController.stopIncomingTransactionPolling(); } @@ -3018,7 +3011,15 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger.subscribe( 'NetworkController:networkDidChange', async () => { - await this.txController.updateIncomingTransactions(); + await this.txController.updateIncomingTransactions([ + this.#getGlobalNetworkClientId(), + ]); + + await this.txController.stopIncomingTransactionPolling(); + + await this.txController.startIncomingTransactionPolling([ + this.#getGlobalNetworkClientId(), + ]); }, ); @@ -4520,9 +4521,7 @@ export default class MetamaskController extends EventEmitter { async _addAccountsWithBalance() { try { // Scan accounts until we find an empty one - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); const ethQuery = new EthQuery(this.provider); const accounts = await this.keyringController.getAccounts(); let address = accounts[accounts.length - 1]; @@ -5051,15 +5050,24 @@ export default class MetamaskController extends EventEmitter { async resetAccount() { const selectedAddress = this.accountsController.getSelectedAccount().address; - this.txController.wipeTransactions(false, selectedAddress); + + const globalChainId = this.#getGlobalChainId(); + + this.txController.wipeTransactions({ + address: selectedAddress, + chainId: globalChainId, + }); + this.smartTransactionsController.wipeSmartTransactions({ address: selectedAddress, ignoreNetwork: false, }); + this.bridgeStatusController.wipeBridgeStatus({ address: selectedAddress, ignoreNetwork: false, }); + this.networkController.resetConnection(); return selectedAddress; @@ -5187,8 +5195,7 @@ export default class MetamaskController extends EventEmitter { internalAccounts: this.accountsController.listAccounts(), dappRequest, networkClientId: - dappRequest?.networkClientId ?? - this.networkController.state.selectedNetworkClientId, + dappRequest?.networkClientId ?? this.#getGlobalNetworkClientId(), selectedAccount: this.accountsController.getAccountByAddress( transactionParams.from, ), @@ -5196,7 +5203,7 @@ export default class MetamaskController extends EventEmitter { transactionOptions, transactionParams, userOperationController: this.userOperationController, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), ppomController: this.ppomController, securityAlertsEnabled: this.preferencesController.state?.securityAlertsEnabled, @@ -6546,13 +6553,13 @@ export default class MetamaskController extends EventEmitter { * Returns the nonce that will be associated with a transaction once approved * * @param {string} address - The hex string address for the transaction - * @param networkClientId - The optional networkClientId to get the nonce lock with + * @param networkClientId - The networkClientId to get the nonce lock with * @returns {Promise} */ async getPendingNonce(address, networkClientId) { const { nonceDetails, releaseLock } = await this.txController.getNonceLock( address, - process.env.TRANSACTION_MULTICHAIN ? networkClientId : undefined, + networkClientId, ); const pendingNonce = nonceDetails.params.highestSuggested; @@ -6565,13 +6572,13 @@ export default class MetamaskController extends EventEmitter { * Returns the next nonce according to the nonce-tracker * * @param {string} address - The hex string address for the transaction - * @param networkClientId - The optional networkClientId to get the nonce lock with + * @param networkClientId - The networkClientId to get the nonce lock with * @returns {Promise} */ async getNextNonce(address, networkClientId) { const nonceLock = await this.txController.getNonceLock( address, - process.env.TRANSACTION_MULTICHAIN ? networkClientId : undefined, + networkClientId, ); nonceLock.releaseLock(); return nonceLock.nextNonce; @@ -7378,4 +7385,28 @@ export default class MetamaskController extends EventEmitter { return useTokenDetection || petnamesEnabled || useTransactionSimulations; } + + /** + * @deprecated Avoid new references to the global network. + * Will be removed once multi-chain support is fully implemented. + * @returns {string} The chain ID of the currently selected network. + */ + #getGlobalChainId() { + const globalNetworkClientId = this.#getGlobalNetworkClientId(); + + const globalNetworkClient = this.networkController.getNetworkClientById( + globalNetworkClientId, + ); + + return globalNetworkClient.configuration.chainId; + } + + /** + * @deprecated Avoid new references to the global network. + * Will be removed once multi-chain support is fully implemented. + * @returns {string} The network client ID of the currently selected network client. + */ + #getGlobalNetworkClientId() { + return this.networkController.state.selectedNetworkClientId; + } } diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index a596277154eb..f7115f9364bd 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -21,7 +21,10 @@ import { } from '@metamask/keyring-api'; import { ControllerMessenger } from '@metamask/base-controller'; import { LoggingController, LogType } from '@metamask/logging-controller'; -import { TransactionController } from '@metamask/transaction-controller'; +import { + CHAIN_IDS, + TransactionController, +} from '@metamask/transaction-controller'; import { RatesController, TokenListController, @@ -1206,7 +1209,10 @@ describe('MetaMaskController', () => { ).toHaveBeenCalledTimes(1); expect( metamaskController.txController.wipeTransactions, - ).toHaveBeenCalledWith(false, selectedAddressMock); + ).toHaveBeenCalledWith({ + address: selectedAddressMock, + chainId: CHAIN_IDS.MAINNET, + }); expect( metamaskController.smartTransactionsController.wipeSmartTransactions, ).toHaveBeenCalledWith({ diff --git a/builds.yml b/builds.yml index 3963aeda93e5..7985f464b73f 100644 --- a/builds.yml +++ b/builds.yml @@ -276,8 +276,6 @@ env: - NODE_DEBUG: '' # Used by react-devtools-core - EDITOR_URL: '' - # Determines if feature flagged Multichain Transactions should be used - - TRANSACTION_MULTICHAIN: '' # Determines if Barad Dur features should be used - BARAD_DUR: '' # Determines if feature flagged Chain permissions diff --git a/package.json b/package.json index e7827cb6d92b..803853059703 100644 --- a/package.json +++ b/package.json @@ -347,7 +347,7 @@ "@metamask/snaps-sdk": "^6.12.0", "@metamask/snaps-utils": "^8.6.0", "@metamask/solana-wallet-snap": "^0.1.9", - "@metamask/transaction-controller": "^40.1.0", + "@metamask/transaction-controller": "^41.0.0", "@metamask/user-operation-controller": "^16.0.0", "@metamask/utils": "^10.0.1", "@ngraveio/bc-ur": "^1.1.12", diff --git a/ui/ducks/swaps/swaps.js b/ui/ducks/swaps/swaps.js index bc1c675e4d21..e044fdf42b3f 100644 --- a/ui/ducks/swaps/swaps.js +++ b/ui/ducks/swaps/swaps.js @@ -589,6 +589,7 @@ export const fetchSwapsLivenessAndFeatureFlags = () => { await dispatch(fetchSmartTransactionsLiveness()); const transactions = await getTransactions({ searchCriteria: { + chainId, from: getSelectedInternalAccount(state)?.address, }, }); diff --git a/ui/pages/confirmations/hooks/alerts/transactions/useFirstTimeInteractionAlert.test.ts b/ui/pages/confirmations/hooks/alerts/transactions/useFirstTimeInteractionAlert.test.ts index 964b218e8501..6689d6610248 100644 --- a/ui/pages/confirmations/hooks/alerts/transactions/useFirstTimeInteractionAlert.test.ts +++ b/ui/pages/confirmations/hooks/alerts/transactions/useFirstTimeInteractionAlert.test.ts @@ -22,6 +22,7 @@ const CONFIRMATION_MOCK = genUnapprovedContractInteractionConfirmation({ const TRANSACTION_META_MOCK = { id: TRANSACTION_ID_MOCK, chainId: '0x5', + networkClientId: 'testNetworkClientId', status: TransactionStatus.submitted, type: TransactionType.contractInteraction, txParams: { diff --git a/ui/pages/confirmations/hooks/alerts/transactions/usePendingTransactionAlerts.test.ts b/ui/pages/confirmations/hooks/alerts/transactions/usePendingTransactionAlerts.test.ts index 5d2c16a518e5..b9b3d12dc7d0 100644 --- a/ui/pages/confirmations/hooks/alerts/transactions/usePendingTransactionAlerts.test.ts +++ b/ui/pages/confirmations/hooks/alerts/transactions/usePendingTransactionAlerts.test.ts @@ -22,6 +22,7 @@ const CONFIRMATION_MOCK = genUnapprovedContractInteractionConfirmation({ const TRANSACTION_META_MOCK = { id: TRANSACTION_ID_MOCK, chainId: '0x5', + networkClientId: 'testNetworkClientId', status: TransactionStatus.submitted, type: TransactionType.contractInteraction, txParams: { diff --git a/ui/pages/confirmations/hooks/alerts/transactions/useResimulationAlert.test.ts b/ui/pages/confirmations/hooks/alerts/transactions/useResimulationAlert.test.ts index 174b6ec0398a..49209f69df9c 100644 --- a/ui/pages/confirmations/hooks/alerts/transactions/useResimulationAlert.test.ts +++ b/ui/pages/confirmations/hooks/alerts/transactions/useResimulationAlert.test.ts @@ -22,6 +22,7 @@ const CONFIRMATION_MOCK = genUnapprovedContractInteractionConfirmation({ const TRANSACTION_META_MOCK = { id: TRANSACTION_ID_MOCK, chainId: '0x5', + networkClientId: 'testNetworkClientId', status: TransactionStatus.submitted, type: TransactionType.contractInteraction, txParams: { diff --git a/ui/pages/confirmations/hooks/alerts/transactions/useSigningOrSubmittingAlerts.test.ts b/ui/pages/confirmations/hooks/alerts/transactions/useSigningOrSubmittingAlerts.test.ts index d1960827c0b1..08ed8f2aac7d 100644 --- a/ui/pages/confirmations/hooks/alerts/transactions/useSigningOrSubmittingAlerts.test.ts +++ b/ui/pages/confirmations/hooks/alerts/transactions/useSigningOrSubmittingAlerts.test.ts @@ -28,6 +28,7 @@ const CONFIRMATION_MOCK = genUnapprovedContractInteractionConfirmation({ const TRANSACTION_META_MOCK = { id: TRANSACTION_ID_MOCK, chainId: '0x5', + networkClientId: 'testNetworkClientId', status: TransactionStatus.submitted, type: TransactionType.contractInteraction, txParams: { diff --git a/ui/store/actions.ts b/ui/store/actions.ts index 2ad3046e9040..9b402f476a7e 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -1129,7 +1129,6 @@ export function updateAndApproveTx( export async function getTransactions( filters: { - filterToCurrentNetwork?: boolean; searchCriteria?: Partial & Partial; } = {}, ): Promise { diff --git a/yarn.lock b/yarn.lock index 91cc4445c553..c88156929c17 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6431,9 +6431,9 @@ __metadata: languageName: node linkType: hard -"@metamask/transaction-controller@npm:^40.1.0": - version: 40.1.0 - resolution: "@metamask/transaction-controller@npm:40.1.0" +"@metamask/transaction-controller@npm:^41.0.0": + version: 41.0.0 + resolution: "@metamask/transaction-controller@npm:41.0.0" dependencies: "@ethereumjs/common": "npm:^3.2.0" "@ethereumjs/tx": "npm:^4.2.0" @@ -6460,7 +6460,7 @@ __metadata: "@metamask/approval-controller": ^7.0.0 "@metamask/gas-fee-controller": ^22.0.0 "@metamask/network-controller": ^22.0.0 - checksum: 10/1057af5b0da2d51e46e7568fc0e7fdbe6aed34a013cf56a5a35ad694cbedcb726a5823bbe70b980d1dc9560138acf9d82ac5f0e06f7d17e11b46abacd466dc42 + checksum: 10/67a00b2eade35fc4e635a6bcbbcd847b3986b3bdcc9730ff2c8f81234df18ed11149203c13d6bad616e859f7e25879efab36b6dc4be05a4e747b4280ae2f300d languageName: node linkType: hard @@ -26566,7 +26566,7 @@ __metadata: "@metamask/solana-wallet-snap": "npm:^0.1.9" "@metamask/test-bundler": "npm:^1.0.0" "@metamask/test-dapp": "npm:8.13.0" - "@metamask/transaction-controller": "npm:^40.1.0" + "@metamask/transaction-controller": "npm:^41.0.0" "@metamask/user-operation-controller": "npm:^16.0.0" "@metamask/utils": "npm:^10.0.1" "@ngraveio/bc-ur": "npm:^1.1.12"