@metamask-previews/transaction-controller 69.4.0-preview-b5147cfe0 → 69.4.0-preview-3dcc9952b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - Bump `@metamask/network-controller` from `^35.0.0` to `^35.0.1` ([#9758](https://github.com/MetaMask/core/pull/9758))
13
+
14
+ ### Fixed
15
+
16
+ - Refresh gas fee token quotes independently of balance changes for enforced-simulation transactions, and prevent stale simulation responses from overwriting newer transaction state. ([#9757](https://github.com/MetaMask/core/pull/9757))
17
+
10
18
  ## [69.4.0]
11
19
 
12
20
  ### Added
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _TransactionController_instances, _TransactionController_afterAdd, _TransactionController_approvingTransactionIds, _TransactionController_beforeCheckPendingTransaction, _TransactionController_beforePublish, _TransactionController_beforeSign, _TransactionController_gasFeeFlows, _TransactionController_getPermittedAccounts, _TransactionController_getSavedGasFees, _TransactionController_getSimulationConfig, _TransactionController_internalEvents, _TransactionController_isAutomaticGasFeeUpdateEnabled, _TransactionController_isEIP7702GasFeeTokensEnabled, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_isSwapsDisabled, _TransactionController_isTimeoutEnabled, _TransactionController_layer1GasFeeFlows, _TransactionController_methodDataHelper, _TransactionController_multichainTrackingHelper, _TransactionController_publicKeyEIP7702, _TransactionController_publish, _TransactionController_publishBatchHook, _TransactionController_signAbortCallbacks, _TransactionController_skipSimulationTransactionIds, _TransactionController_testGasFeeFlows, _TransactionController_trace, _TransactionController_retryTransaction, _TransactionController_signExternalTransaction, _TransactionController_addMetadata, _TransactionController_updateGasProperties, _TransactionController_onBootCleanup, _TransactionController_failIncompleteTransactions, _TransactionController_processApproval, _TransactionController_approveTransaction, _TransactionController_publishTransaction, _TransactionController_rejectTransaction, _TransactionController_trimTransactionsForState, _TransactionController_isFinalState, _TransactionController_isLocalFinalState, _TransactionController_requestApproval, _TransactionController_getTransaction, _TransactionController_getTransactionOrThrow, _TransactionController_getApprovalId, _TransactionController_isTransactionCompleted, _TransactionController_generateDappSuggestedGasFees, _TransactionController_addExternalTransaction, _TransactionController_markNonceDuplicatesDropped, _TransactionController_setTransactionStatusDropped, _TransactionController_waitForTransactionFinished, _TransactionController_updateTransactionMetaRSV, _TransactionController_getEIP1559Compatibility, _TransactionController_signTransaction, _TransactionController_onTransactionStatusChange, _TransactionController_getNonceTrackerTransactions, _TransactionController_onConfirmedTransaction, _TransactionController_updatePostBalance, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_publishTransactionForRetry, _TransactionController_isTransactionAlreadyConfirmedError, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_isBalanceChangesSkipped, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_onGasFeePollerTransactionBatchUpdate, _TransactionController_updateTransactionBatch, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory, _TransactionController_updateGasEstimate, _TransactionController_registerActionHandlers, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow, _TransactionController_failTransaction, _TransactionController_defaultPublishHook, _TransactionController_getGasFeeTokens;
13
+ var _TransactionController_instances, _TransactionController_afterAdd, _TransactionController_approvingTransactionIds, _TransactionController_beforeCheckPendingTransaction, _TransactionController_beforePublish, _TransactionController_beforeSign, _TransactionController_gasFeeFlows, _TransactionController_getPermittedAccounts, _TransactionController_getSavedGasFees, _TransactionController_getSimulationConfig, _TransactionController_internalEvents, _TransactionController_isAutomaticGasFeeUpdateEnabled, _TransactionController_isEIP7702GasFeeTokensEnabled, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_isSwapsDisabled, _TransactionController_isTimeoutEnabled, _TransactionController_layer1GasFeeFlows, _TransactionController_methodDataHelper, _TransactionController_multichainTrackingHelper, _TransactionController_publicKeyEIP7702, _TransactionController_publish, _TransactionController_publishBatchHook, _TransactionController_signAbortCallbacks, _TransactionController_skipSimulationTransactionIds, _TransactionController_simulationRequestTokens, _TransactionController_testGasFeeFlows, _TransactionController_trace, _TransactionController_retryTransaction, _TransactionController_signExternalTransaction, _TransactionController_addMetadata, _TransactionController_updateGasProperties, _TransactionController_onBootCleanup, _TransactionController_failIncompleteTransactions, _TransactionController_processApproval, _TransactionController_approveTransaction, _TransactionController_publishTransaction, _TransactionController_rejectTransaction, _TransactionController_trimTransactionsForState, _TransactionController_isFinalState, _TransactionController_isLocalFinalState, _TransactionController_requestApproval, _TransactionController_getTransaction, _TransactionController_getTransactionOrThrow, _TransactionController_getApprovalId, _TransactionController_isTransactionCompleted, _TransactionController_generateDappSuggestedGasFees, _TransactionController_addExternalTransaction, _TransactionController_markNonceDuplicatesDropped, _TransactionController_setTransactionStatusDropped, _TransactionController_waitForTransactionFinished, _TransactionController_updateTransactionMetaRSV, _TransactionController_getEIP1559Compatibility, _TransactionController_signTransaction, _TransactionController_onTransactionStatusChange, _TransactionController_getNonceTrackerTransactions, _TransactionController_onConfirmedTransaction, _TransactionController_updatePostBalance, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_publishTransactionForRetry, _TransactionController_isTransactionAlreadyConfirmedError, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_isBalanceChangesSkipped, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_onGasFeePollerTransactionBatchUpdate, _TransactionController_updateTransactionBatch, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory, _TransactionController_updateGasEstimate, _TransactionController_registerActionHandlers, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow, _TransactionController_failTransaction, _TransactionController_defaultPublishHook, _TransactionController_getGasFeeTokens;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
@@ -210,6 +210,7 @@ class TransactionController extends base_controller_1.BaseController {
210
210
  _TransactionController_publishBatchHook.set(this, void 0);
211
211
  _TransactionController_signAbortCallbacks.set(this, new Map());
212
212
  _TransactionController_skipSimulationTransactionIds.set(this, new Set());
213
+ _TransactionController_simulationRequestTokens.set(this, new Map());
213
214
  _TransactionController_testGasFeeFlows.set(this, void 0);
214
215
  _TransactionController_trace.set(this, void 0);
215
216
  _TransactionController_checkForPendingTransactionAndStartPolling.set(this, () => {
@@ -1462,7 +1463,7 @@ class TransactionController extends base_controller_1.BaseController {
1462
1463
  }
1463
1464
  }
1464
1465
  exports.TransactionController = TransactionController;
1465
- _TransactionController_afterAdd = new WeakMap(), _TransactionController_approvingTransactionIds = new WeakMap(), _TransactionController_beforeCheckPendingTransaction = new WeakMap(), _TransactionController_beforePublish = new WeakMap(), _TransactionController_beforeSign = new WeakMap(), _TransactionController_gasFeeFlows = new WeakMap(), _TransactionController_getPermittedAccounts = new WeakMap(), _TransactionController_getSavedGasFees = new WeakMap(), _TransactionController_getSimulationConfig = new WeakMap(), _TransactionController_internalEvents = new WeakMap(), _TransactionController_isAutomaticGasFeeUpdateEnabled = new WeakMap(), _TransactionController_isEIP7702GasFeeTokensEnabled = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_isSwapsDisabled = new WeakMap(), _TransactionController_isTimeoutEnabled = new WeakMap(), _TransactionController_layer1GasFeeFlows = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_multichainTrackingHelper = new WeakMap(), _TransactionController_publicKeyEIP7702 = new WeakMap(), _TransactionController_publish = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_signAbortCallbacks = new WeakMap(), _TransactionController_skipSimulationTransactionIds = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_checkForPendingTransactionAndStartPolling = new WeakMap(), _TransactionController_instances = new WeakSet(), _TransactionController_retryTransaction = async function _TransactionController_retryTransaction({ actionId, afterSubmit, estimatedBaseFee, gasValues, label, prepareTransactionParams, rate, transactionId, transactionType, }) {
1466
+ _TransactionController_afterAdd = new WeakMap(), _TransactionController_approvingTransactionIds = new WeakMap(), _TransactionController_beforeCheckPendingTransaction = new WeakMap(), _TransactionController_beforePublish = new WeakMap(), _TransactionController_beforeSign = new WeakMap(), _TransactionController_gasFeeFlows = new WeakMap(), _TransactionController_getPermittedAccounts = new WeakMap(), _TransactionController_getSavedGasFees = new WeakMap(), _TransactionController_getSimulationConfig = new WeakMap(), _TransactionController_internalEvents = new WeakMap(), _TransactionController_isAutomaticGasFeeUpdateEnabled = new WeakMap(), _TransactionController_isEIP7702GasFeeTokensEnabled = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_isSwapsDisabled = new WeakMap(), _TransactionController_isTimeoutEnabled = new WeakMap(), _TransactionController_layer1GasFeeFlows = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_multichainTrackingHelper = new WeakMap(), _TransactionController_publicKeyEIP7702 = new WeakMap(), _TransactionController_publish = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_signAbortCallbacks = new WeakMap(), _TransactionController_skipSimulationTransactionIds = new WeakMap(), _TransactionController_simulationRequestTokens = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_checkForPendingTransactionAndStartPolling = new WeakMap(), _TransactionController_instances = new WeakSet(), _TransactionController_retryTransaction = async function _TransactionController_retryTransaction({ actionId, afterSubmit, estimatedBaseFee, gasValues, label, prepareTransactionParams, rate, transactionId, transactionType, }) {
1466
1467
  if (gasValues) {
1467
1468
  // Not good practice to reassign a parameter but temporarily avoiding a larger refactor.
1468
1469
  // eslint-disable-next-line no-param-reassign
@@ -2207,65 +2208,83 @@ async function _TransactionController_approveTransaction(transactionId, traceCon
2207
2208
  let gasFeeTokens = [];
2208
2209
  let isGasFeeSponsored = false;
2209
2210
  let simulationRevert;
2210
- const isBalanceChangesSkipped = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isBalanceChangesSkipped).call(this, transactionMeta);
2211
- if (__classPrivateFieldGet(this, _TransactionController_isSimulationEnabled, "f").call(this) && !isBalanceChangesSkipped) {
2212
- const balanceChangesResult = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Simulate', parentContext: traceContext }, () => (0, balance_changes_js_1.getBalanceChanges)({
2213
- blockTime,
2214
- chainId,
2215
- messenger: this.messenger,
2216
- networkClientId,
2217
- getSimulationConfig: (url, opts) => {
2218
- return __classPrivateFieldGet(this, _TransactionController_getSimulationConfig, "f").call(this, url, {
2219
- txMeta: transactionMeta,
2220
- ...opts,
2221
- });
2222
- },
2223
- nestedTransactions,
2224
- txParams,
2225
- }));
2226
- simulationData = balanceChangesResult.simulationData;
2227
- gasUsed = balanceChangesResult.gasUsed;
2228
- simulationRevert = balanceChangesResult.simulationRevert;
2229
- if (blockTime &&
2230
- prevSimulationData &&
2231
- (0, ResimulateHelper_js_1.hasSimulationDataChanged)(prevSimulationData, simulationData)) {
2232
- simulationData = {
2233
- ...simulationData,
2234
- isUpdatedAfterSecurityCheck: true,
2235
- };
2236
- }
2237
- const gasFeeTokensResponse = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getGasFeeTokens).call(this, transactionMeta);
2238
- gasFeeTokens = gasFeeTokensResponse?.gasFeeTokens ?? [];
2239
- isGasFeeSponsored = gasFeeTokensResponse?.isGasFeeSponsored ?? false;
2240
- }
2241
- const latestTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
2242
- /* istanbul ignore if */
2243
- if (!latestTransactionMeta) {
2244
- (0, logger_js_1.projectLogger)('Cannot update simulation data as transaction not found', transactionId, simulationData);
2245
- return;
2246
- }
2247
- const updatedTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2248
- transactionId,
2249
- skipResimulateCheck: Boolean(blockTime),
2250
- }, (txMeta) => {
2251
- txMeta.gasFeeTokens = gasFeeTokens;
2252
- txMeta.isGasFeeSponsored =
2253
- txMeta.isGasFeeSponsored ?? isGasFeeSponsored;
2254
- if (txMeta.isGasFeeSponsored) {
2255
- txMeta.isExternalSign = true;
2256
- }
2257
- txMeta.gasUsed = gasUsed;
2258
- if (!__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isBalanceChangesSkipped).call(this, txMeta)) {
2259
- txMeta.simulationData = simulationData;
2260
- if (simulationRevert) {
2261
- txMeta.revert = {
2262
- ...txMeta.revert,
2263
- simulation: simulationRevert,
2211
+ const simulationRequestToken = Symbol(transactionId);
2212
+ __classPrivateFieldGet(this, _TransactionController_simulationRequestTokens, "f").set(transactionId, simulationRequestToken);
2213
+ try {
2214
+ const isSimulationEnabled = __classPrivateFieldGet(this, _TransactionController_isSimulationEnabled, "f").call(this);
2215
+ const isBalanceChangesSkipped = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isBalanceChangesSkipped).call(this, transactionMeta);
2216
+ if (isSimulationEnabled && !isBalanceChangesSkipped) {
2217
+ const balanceChangesResult = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Simulate', parentContext: traceContext }, () => (0, balance_changes_js_1.getBalanceChanges)({
2218
+ blockTime,
2219
+ chainId,
2220
+ messenger: this.messenger,
2221
+ networkClientId,
2222
+ getSimulationConfig: (url, opts) => {
2223
+ return __classPrivateFieldGet(this, _TransactionController_getSimulationConfig, "f").call(this, url, {
2224
+ txMeta: transactionMeta,
2225
+ ...opts,
2226
+ });
2227
+ },
2228
+ nestedTransactions,
2229
+ txParams,
2230
+ }));
2231
+ simulationData = balanceChangesResult.simulationData;
2232
+ gasUsed = balanceChangesResult.gasUsed;
2233
+ simulationRevert = balanceChangesResult.simulationRevert;
2234
+ if (blockTime &&
2235
+ prevSimulationData &&
2236
+ (0, ResimulateHelper_js_1.hasSimulationDataChanged)(prevSimulationData, simulationData)) {
2237
+ simulationData = {
2238
+ ...simulationData,
2239
+ isUpdatedAfterSecurityCheck: true,
2264
2240
  };
2265
2241
  }
2266
2242
  }
2267
- });
2268
- (0, logger_js_1.projectLogger)('Updated simulation data', transactionId, updatedTransactionMeta);
2243
+ if (isSimulationEnabled) {
2244
+ const gasFeeTokensResponse = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getGasFeeTokens).call(this, transactionMeta);
2245
+ gasFeeTokens = gasFeeTokensResponse?.gasFeeTokens ?? [];
2246
+ isGasFeeSponsored = gasFeeTokensResponse?.isGasFeeSponsored ?? false;
2247
+ }
2248
+ if (__classPrivateFieldGet(this, _TransactionController_simulationRequestTokens, "f").get(transactionId) !==
2249
+ simulationRequestToken) {
2250
+ (0, logger_js_1.projectLogger)('Ignoring stale simulation data', transactionId);
2251
+ return;
2252
+ }
2253
+ const latestTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
2254
+ /* istanbul ignore if */
2255
+ if (!latestTransactionMeta) {
2256
+ (0, logger_js_1.projectLogger)('Cannot update simulation data as transaction not found', transactionId, simulationData);
2257
+ return;
2258
+ }
2259
+ const updatedTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2260
+ transactionId,
2261
+ skipResimulateCheck: Boolean(blockTime),
2262
+ }, (txMeta) => {
2263
+ txMeta.gasFeeTokens = gasFeeTokens;
2264
+ txMeta.isGasFeeSponsored =
2265
+ txMeta.isGasFeeSponsored ?? isGasFeeSponsored;
2266
+ if (txMeta.isGasFeeSponsored) {
2267
+ txMeta.isExternalSign = true;
2268
+ }
2269
+ if (!__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isBalanceChangesSkipped).call(this, txMeta)) {
2270
+ txMeta.gasUsed = gasUsed;
2271
+ txMeta.simulationData = simulationData;
2272
+ if (simulationRevert) {
2273
+ txMeta.revert = {
2274
+ ...txMeta.revert,
2275
+ simulation: simulationRevert,
2276
+ };
2277
+ }
2278
+ }
2279
+ });
2280
+ (0, logger_js_1.projectLogger)('Updated simulation data', transactionId, updatedTransactionMeta);
2281
+ }
2282
+ finally {
2283
+ if (__classPrivateFieldGet(this, _TransactionController_simulationRequestTokens, "f").get(transactionId) ===
2284
+ simulationRequestToken) {
2285
+ __classPrivateFieldGet(this, _TransactionController_simulationRequestTokens, "f").delete(transactionId);
2286
+ }
2287
+ }
2269
2288
  }, _TransactionController_onGasFeePollerTransactionUpdate = function _TransactionController_onGasFeePollerTransactionUpdate({ transactionId, gasFeeEstimates, gasFeeEstimatesLoaded, layer1GasFee, }) {
2270
2289
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, { transactionId }, (txMeta) => {
2271
2290
  (0, GasFeePoller_js_1.updateTransactionGasProperties)({