@metamask/transaction-controller 54.1.0 → 54.3.0

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/TransactionController.cjs +639 -705
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +3 -124
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +3 -124
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +639 -705
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/api/simulation-api.cjs.map +1 -0
  11. package/dist/{utils → api}/simulation-api.d.cts +2 -0
  12. package/dist/api/simulation-api.d.cts.map +1 -0
  13. package/dist/{utils → api}/simulation-api.d.mts +2 -0
  14. package/dist/api/simulation-api.d.mts.map +1 -0
  15. package/dist/api/simulation-api.mjs.map +1 -0
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +1 -1
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/types.cjs.map +1 -1
  23. package/dist/types.d.cts +16 -1
  24. package/dist/types.d.cts.map +1 -1
  25. package/dist/types.d.mts +16 -1
  26. package/dist/types.d.mts.map +1 -1
  27. package/dist/types.mjs.map +1 -1
  28. package/dist/utils/batch.cjs +17 -10
  29. package/dist/utils/batch.cjs.map +1 -1
  30. package/dist/utils/batch.d.cts.map +1 -1
  31. package/dist/utils/batch.d.mts.map +1 -1
  32. package/dist/utils/batch.mjs +17 -10
  33. package/dist/utils/batch.mjs.map +1 -1
  34. package/dist/utils/gas.cjs +1 -1
  35. package/dist/utils/gas.cjs.map +1 -1
  36. package/dist/utils/gas.mjs +1 -1
  37. package/dist/utils/gas.mjs.map +1 -1
  38. package/dist/utils/simulation.cjs +2 -1
  39. package/dist/utils/simulation.cjs.map +1 -1
  40. package/dist/utils/simulation.d.cts +1 -1
  41. package/dist/utils/simulation.d.cts.map +1 -1
  42. package/dist/utils/simulation.d.mts +1 -1
  43. package/dist/utils/simulation.d.mts.map +1 -1
  44. package/dist/utils/simulation.mjs +2 -1
  45. package/dist/utils/simulation.mjs.map +1 -1
  46. package/package.json +2 -2
  47. package/dist/utils/simulation-api.cjs.map +0 -1
  48. package/dist/utils/simulation-api.d.cts.map +0 -1
  49. package/dist/utils/simulation-api.d.mts.map +0 -1
  50. package/dist/utils/simulation-api.mjs.map +0 -1
  51. /package/dist/{utils → api}/simulation-api.cjs +0 -0
  52. /package/dist/{utils → api}/simulation-api.mjs +0 -0
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- 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");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
2
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
3
  if (kind === "m") throw new TypeError("Private method is not writable");
9
4
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
5
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
6
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
7
  };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publishBatchHook, _TransactionController_publicKeyEIP7702, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_rejectTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_markNonceDuplicatesDropped, _TransactionController_signTransaction, _TransactionController_onConfirmedTransaction, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory, _TransactionController_updateGasEstimate, _TransactionController_registerActionHandlers, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow;
16
+ var _TransactionController_instances, _TransactionController_afterAdd, _TransactionController_afterSign, _TransactionController_approvingTransactionIds, _TransactionController_beforeCheckPendingTransaction, _TransactionController_beforePublish, _TransactionController_gasFeeFlows, _TransactionController_getAdditionalSignArguments, _TransactionController_getCurrentAccountEIP1559Compatibility, _TransactionController_getCurrentNetworkEIP1559Compatibility, _TransactionController_getExternalPendingTransactions, _TransactionController_getGasFeeEstimates, _TransactionController_getNetworkState, _TransactionController_getPermittedAccounts, _TransactionController_getSavedGasFees, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_internalEvents, _TransactionController_isAutomaticGasFeeUpdateEnabled, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isHistoryDisabled, _TransactionController_isSendFlowHistoryDisabled, _TransactionController_isSimulationEnabled, _TransactionController_isSwapsDisabled, _TransactionController_layer1GasFeeFlows, _TransactionController_methodDataHelper, _TransactionController_multichainTrackingHelper, _TransactionController_pendingTransactionOptions, _TransactionController_publicKeyEIP7702, _TransactionController_publish, _TransactionController_publishBatchHook, _TransactionController_securityProviderRequest, _TransactionController_sign, _TransactionController_signAbortCallbacks, _TransactionController_testGasFeeFlows, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _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_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_onIncomingTransactions, _TransactionController_generateDappSuggestedGasFees, _TransactionController_addExternalTransaction, _TransactionController_markNonceDuplicatesDropped, _TransactionController_setTransactionStatusDropped, _TransactionController_getTransactionWithActionId, _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_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_publishTransactionForRetry, _TransactionController_isTransactionAlreadyConfirmedError, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory, _TransactionController_updateGasEstimate, _TransactionController_registerActionHandlers, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow, _TransactionController_failTransaction;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = void 0;
19
19
  const base_controller_1 = require("@metamask/base-controller");
@@ -122,42 +122,13 @@ function getDefaultTransactionControllerState() {
122
122
  * Controller responsible for submitting and managing transactions.
123
123
  */
124
124
  class TransactionController extends base_controller_1.BaseController {
125
- failTransaction(transactionMeta, error, actionId) {
126
- let newTransactionMeta;
127
- try {
128
- newTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
129
- transactionId: transactionMeta.id,
130
- note: 'TransactionController#failTransaction - Add error message and set status to failed',
131
- skipValidation: true,
132
- }, (draftTransactionMeta) => {
133
- draftTransactionMeta.status = types_1.TransactionStatus.failed;
134
- draftTransactionMeta.error = (0, utils_2.normalizeTxError)(error);
135
- });
136
- }
137
- catch (err) {
138
- (0, logger_1.projectLogger)('Failed to mark transaction as failed', err);
139
- newTransactionMeta = {
140
- ...transactionMeta,
141
- status: types_1.TransactionStatus.failed,
142
- error: (0, utils_2.normalizeTxError)(error),
143
- };
144
- }
145
- this.messagingSystem.publish(`${controllerName}:transactionFailed`, {
146
- actionId,
147
- error: error.message,
148
- transactionMeta: newTransactionMeta,
149
- });
150
- this.onTransactionStatusChange(newTransactionMeta);
151
- this.messagingSystem.publish(`${controllerName}:transactionFinished`, newTransactionMeta);
152
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, newTransactionMeta);
153
- }
154
125
  /**
155
126
  * Constructs a TransactionController.
156
127
  *
157
128
  * @param options - The controller options.
158
129
  */
159
130
  constructor(options) {
160
- const { disableHistory, disableSendFlowHistory, disableSwaps, isAutomaticGasFeeUpdateEnabled, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, publicKeyEIP7702, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, } = options;
131
+ const { disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, hooks, incomingTransactions = {}, isAutomaticGasFeeUpdateEnabled, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, publicKeyEIP7702, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, } = options;
161
132
  super({
162
133
  name: controllerName,
163
134
  metadata,
@@ -168,61 +139,76 @@ class TransactionController extends base_controller_1.BaseController {
168
139
  },
169
140
  });
170
141
  _TransactionController_instances.add(this);
171
- _TransactionController_internalEvents.set(this, new events_1.EventEmitter());
172
- this.approvingTransactionIds = new Set();
173
- _TransactionController_methodDataHelper.set(this, void 0);
142
+ _TransactionController_afterAdd.set(this, void 0);
143
+ _TransactionController_afterSign.set(this, void 0);
144
+ _TransactionController_approvingTransactionIds.set(this, new Set());
145
+ _TransactionController_beforeCheckPendingTransaction.set(this, void 0);
146
+ _TransactionController_beforePublish.set(this, void 0);
147
+ _TransactionController_gasFeeFlows.set(this, void 0);
148
+ _TransactionController_getAdditionalSignArguments.set(this, void 0);
149
+ _TransactionController_getCurrentAccountEIP1559Compatibility.set(this, void 0);
150
+ _TransactionController_getCurrentNetworkEIP1559Compatibility.set(this, void 0);
151
+ _TransactionController_getExternalPendingTransactions.set(this, void 0);
152
+ _TransactionController_getGasFeeEstimates.set(this, void 0);
153
+ _TransactionController_getNetworkState.set(this, void 0);
154
+ _TransactionController_getPermittedAccounts.set(this, void 0);
155
+ _TransactionController_getSavedGasFees.set(this, void 0);
174
156
  _TransactionController_incomingTransactionHelper.set(this, void 0);
175
157
  _TransactionController_incomingTransactionOptions.set(this, void 0);
158
+ _TransactionController_internalEvents.set(this, new events_1.EventEmitter());
159
+ _TransactionController_isAutomaticGasFeeUpdateEnabled.set(this, void 0);
160
+ _TransactionController_isFirstTimeInteractionEnabled.set(this, void 0);
161
+ _TransactionController_isHistoryDisabled.set(this, void 0);
162
+ _TransactionController_isSendFlowHistoryDisabled.set(this, void 0);
163
+ _TransactionController_isSimulationEnabled.set(this, void 0);
164
+ _TransactionController_isSwapsDisabled.set(this, void 0);
165
+ _TransactionController_layer1GasFeeFlows.set(this, void 0);
166
+ _TransactionController_methodDataHelper.set(this, void 0);
167
+ _TransactionController_multichainTrackingHelper.set(this, void 0);
176
168
  _TransactionController_pendingTransactionOptions.set(this, void 0);
177
- _TransactionController_publishBatchHook.set(this, void 0);
178
169
  _TransactionController_publicKeyEIP7702.set(this, void 0);
179
- this.signAbortCallbacks = new Map();
170
+ _TransactionController_publish.set(this, void 0);
171
+ _TransactionController_publishBatchHook.set(this, void 0);
172
+ _TransactionController_securityProviderRequest.set(this, void 0);
173
+ _TransactionController_sign.set(this, void 0);
174
+ _TransactionController_signAbortCallbacks.set(this, new Map());
175
+ _TransactionController_testGasFeeFlows.set(this, void 0);
180
176
  _TransactionController_trace.set(this, void 0);
181
177
  _TransactionController_transactionHistoryLimit.set(this, void 0);
182
- _TransactionController_isFirstTimeInteractionEnabled.set(this, void 0);
183
- _TransactionController_isSimulationEnabled.set(this, void 0);
184
- _TransactionController_testGasFeeFlows.set(this, void 0);
185
- _TransactionController_multichainTrackingHelper.set(this, void 0);
186
178
  _TransactionController_checkForPendingTransactionAndStartPolling.set(this, () => {
187
179
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").checkForPendingTransactionAndStartPolling();
188
180
  });
189
181
  this.messagingSystem = messenger;
190
- this.isTxParamsGasFeeUpdatesEnabled =
191
- isAutomaticGasFeeUpdateEnabled ?? ((_txMeta) => false);
192
- this.getNetworkState = getNetworkState;
193
- this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;
194
- this.isHistoryDisabled = disableHistory ?? false;
195
- this.isSwapsDisabled = disableSwaps ?? false;
182
+ __classPrivateFieldSet(this, _TransactionController_afterAdd, hooks?.afterAdd ?? (() => Promise.resolve({})), "f");
183
+ __classPrivateFieldSet(this, _TransactionController_afterSign, hooks?.afterSign ?? (() => true), "f");
184
+ __classPrivateFieldSet(this, _TransactionController_beforeCheckPendingTransaction,
185
+ /* istanbul ignore next */
186
+ hooks?.beforeCheckPendingTransaction ?? (() => Promise.resolve(true)), "f");
187
+ __classPrivateFieldSet(this, _TransactionController_beforePublish, hooks?.beforePublish ?? (() => Promise.resolve(true)), "f");
188
+ __classPrivateFieldSet(this, _TransactionController_getAdditionalSignArguments, hooks?.getAdditionalSignArguments ?? (() => []), "f");
189
+ __classPrivateFieldSet(this, _TransactionController_getCurrentAccountEIP1559Compatibility, getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true)), "f");
190
+ __classPrivateFieldSet(this, _TransactionController_getCurrentNetworkEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, "f");
191
+ __classPrivateFieldSet(this, _TransactionController_getExternalPendingTransactions, getExternalPendingTransactions ?? (() => []), "f");
192
+ __classPrivateFieldSet(this, _TransactionController_getGasFeeEstimates, getGasFeeEstimates || (() => Promise.resolve({})), "f");
193
+ __classPrivateFieldSet(this, _TransactionController_getNetworkState, getNetworkState, "f");
194
+ __classPrivateFieldSet(this, _TransactionController_getPermittedAccounts, getPermittedAccounts, "f");
195
+ __classPrivateFieldSet(this, _TransactionController_getSavedGasFees, getSavedGasFees ?? ((_chainId) => undefined), "f");
196
+ __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
197
+ __classPrivateFieldSet(this, _TransactionController_isAutomaticGasFeeUpdateEnabled, isAutomaticGasFeeUpdateEnabled ?? ((_txMeta) => false), "f");
196
198
  __classPrivateFieldSet(this, _TransactionController_isFirstTimeInteractionEnabled, isFirstTimeInteractionEnabled ?? (() => true), "f");
199
+ __classPrivateFieldSet(this, _TransactionController_isHistoryDisabled, disableHistory ?? false, "f");
200
+ __classPrivateFieldSet(this, _TransactionController_isSendFlowHistoryDisabled, disableSendFlowHistory ?? false, "f");
197
201
  __classPrivateFieldSet(this, _TransactionController_isSimulationEnabled, isSimulationEnabled ?? (() => true), "f");
198
- this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined);
199
- this.getCurrentAccountEIP1559Compatibility =
200
- getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true));
201
- this.getCurrentNetworkEIP1559Compatibility =
202
- getCurrentNetworkEIP1559Compatibility;
203
- this.getGasFeeEstimates =
204
- getGasFeeEstimates || (() => Promise.resolve({}));
205
- this.getPermittedAccounts = getPermittedAccounts;
206
- this.getExternalPendingTransactions =
207
- getExternalPendingTransactions ?? (() => []);
208
- this.securityProviderRequest = securityProviderRequest;
209
- __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
202
+ __classPrivateFieldSet(this, _TransactionController_isSwapsDisabled, disableSwaps ?? false, "f");
210
203
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
211
- __classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
212
204
  __classPrivateFieldSet(this, _TransactionController_publicKeyEIP7702, publicKeyEIP7702, "f");
213
- __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
214
- this.sign = sign;
205
+ __classPrivateFieldSet(this, _TransactionController_publish, hooks?.publish ?? (() => Promise.resolve({ transactionHash: undefined })), "f");
206
+ __classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
207
+ __classPrivateFieldSet(this, _TransactionController_securityProviderRequest, securityProviderRequest, "f");
208
+ __classPrivateFieldSet(this, _TransactionController_sign, sign, "f");
215
209
  __classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
216
210
  __classPrivateFieldSet(this, _TransactionController_trace, trace ?? ((_request, fn) => fn?.()), "f");
217
- this.afterSign = hooks?.afterSign ?? (() => true);
218
- this.beforeCheckPendingTransaction =
219
- /* istanbul ignore next */
220
- hooks?.beforeCheckPendingTransaction ?? (() => Promise.resolve(true));
221
- this.beforePublish = hooks?.beforePublish ?? (() => Promise.resolve(true));
222
- this.getAdditionalSignArguments =
223
- hooks?.getAdditionalSignArguments ?? (() => []);
224
- this.publish =
225
- hooks?.publish ?? (() => Promise.resolve({ transactionHash: undefined }));
211
+ __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
226
212
  const findNetworkClientIdByChainId = (chainId) => {
227
213
  return this.messagingSystem.call(`NetworkController:findNetworkClientIdByChainId`, chainId);
228
214
  };
@@ -240,15 +226,15 @@ class TransactionController extends base_controller_1.BaseController {
240
226
  },
241
227
  }), "f");
242
228
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").initialize();
243
- this.gasFeeFlows = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getGasFeeFlows).call(this);
244
- this.layer1GasFeeFlows = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getLayer1GasFeeFlows).call(this);
229
+ __classPrivateFieldSet(this, _TransactionController_gasFeeFlows, __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getGasFeeFlows).call(this), "f");
230
+ __classPrivateFieldSet(this, _TransactionController_layer1GasFeeFlows, __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getLayer1GasFeeFlows).call(this), "f");
245
231
  const gasFeePoller = new GasFeePoller_1.GasFeePoller({
246
232
  findNetworkClientIdByChainId,
247
- gasFeeFlows: this.gasFeeFlows,
248
- getGasFeeControllerEstimates: this.getGasFeeEstimates,
233
+ gasFeeFlows: __classPrivateFieldGet(this, _TransactionController_gasFeeFlows, "f"),
234
+ getGasFeeControllerEstimates: __classPrivateFieldGet(this, _TransactionController_getGasFeeEstimates, "f"),
249
235
  getProvider: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getProvider).call(this, { networkClientId }),
250
236
  getTransactions: () => this.state.transactions,
251
- layer1GasFeeFlows: this.layer1GasFeeFlows,
237
+ layer1GasFeeFlows: __classPrivateFieldGet(this, _TransactionController_layer1GasFeeFlows, "f"),
252
238
  messenger: this.messagingSystem,
253
239
  onStateChange: (listener) => {
254
240
  this.messagingSystem.subscribe('TransactionController:stateChange', listener);
@@ -277,7 +263,7 @@ class TransactionController extends base_controller_1.BaseController {
277
263
  isEnabled: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").isEnabled,
278
264
  queryEntireHistory: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").queryEntireHistory,
279
265
  remoteTransactionSource: new AccountsApiRemoteTransactionSource_1.AccountsApiRemoteTransactionSource(),
280
- trimTransactions: this.trimTransactionsForState.bind(this),
266
+ trimTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).bind(this),
281
267
  updateCache,
282
268
  updateTransactions: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").updateTransactions,
283
269
  }), "f");
@@ -292,7 +278,7 @@ class TransactionController extends base_controller_1.BaseController {
292
278
  },
293
279
  getTransactions: () => this.state.transactions,
294
280
  });
295
- this.onBootCleanup();
281
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onBootCleanup).call(this);
296
282
  __classPrivateFieldGet(this, _TransactionController_checkForPendingTransactionAndStartPolling, "f").call(this);
297
283
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_registerActionHandlers).call(this);
298
284
  }
@@ -324,7 +310,7 @@ class TransactionController extends base_controller_1.BaseController {
324
310
  getChainId: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).bind(this),
325
311
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
326
312
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
327
- getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
313
+ getTransaction: (transactionId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransactionOrThrow).call(this, transactionId),
328
314
  messenger: this.messagingSystem,
329
315
  publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
330
316
  publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
@@ -385,7 +371,7 @@ class TransactionController extends base_controller_1.BaseController {
385
371
  });
386
372
  const permittedAddresses = origin === undefined
387
373
  ? undefined
388
- : await this.getPermittedAccounts?.(origin);
374
+ : await __classPrivateFieldGet(this, _TransactionController_getPermittedAccounts, "f")?.call(this, origin);
389
375
  const selectedAddress = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getSelectedAccount).call(this).address;
390
376
  const internalAccounts = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).call(this);
391
377
  await (0, validation_1.validateTransactionOrigin)({
@@ -399,7 +385,7 @@ class TransactionController extends base_controller_1.BaseController {
399
385
  type,
400
386
  });
401
387
  const delegationAddressPromise = (0, eip7702_1.getDelegationAddress)(txParams.from, ethQuery).catch(() => undefined);
402
- const isEIP1559Compatible = await this.getEIP1559Compatibility(networkClientId);
388
+ const isEIP1559Compatible = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEIP1559Compatibility).call(this, networkClientId);
403
389
  (0, validation_1.validateTxParams)(txParams, isEIP1559Compatible, chainId);
404
390
  if (!txParams.type) {
405
391
  // Determine transaction type based on transaction parameters and network compatibility
@@ -410,10 +396,10 @@ class TransactionController extends base_controller_1.BaseController {
410
396
  if (isDuplicateBatchId && origin && origin !== controller_utils_1.ORIGIN_METAMASK) {
411
397
  throw new rpc_errors_1.JsonRpcError(validation_1.ErrorCode.DuplicateBundleId, 'Batch ID already exists');
412
398
  }
413
- const dappSuggestedGasFees = this.generateDappSuggestedGasFees(txParams, origin);
399
+ const dappSuggestedGasFees = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_generateDappSuggestedGasFees).call(this, txParams, origin);
414
400
  const transactionType = type ?? (await (0, transaction_type_1.determineTransactionType)(txParams, ethQuery)).type;
415
401
  const delegationAddress = await delegationAddressPromise;
416
- const existingTransactionMeta = this.getTransactionWithActionId(actionId);
402
+ const existingTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransactionWithActionId).call(this, actionId);
417
403
  // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.
418
404
  let addedTransactionMeta = existingTransactionMeta
419
405
  ? (0, lodash_1.cloneDeep)(existingTransactionMeta)
@@ -439,30 +425,38 @@ class TransactionController extends base_controller_1.BaseController {
439
425
  userEditedGasLimit: false,
440
426
  verifiedOnBlockchain: false,
441
427
  };
442
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Estimate Gas Properties', parentContext: traceContext }, (context) => this.updateGasProperties(addedTransactionMeta, {
428
+ const { updateTransaction } = await __classPrivateFieldGet(this, _TransactionController_afterAdd, "f").call(this, {
429
+ transactionMeta: addedTransactionMeta,
430
+ });
431
+ if (updateTransaction) {
432
+ (0, logger_1.projectLogger)('Updating transaction using afterAdd hook');
433
+ addedTransactionMeta.txParamsOriginal = (0, lodash_1.cloneDeep)(addedTransactionMeta.txParams);
434
+ updateTransaction(addedTransactionMeta);
435
+ }
436
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Estimate Gas Properties', parentContext: traceContext }, (context) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateGasProperties).call(this, addedTransactionMeta, {
443
437
  traceContext: context,
444
438
  }));
445
439
  // Checks if a transaction already exists with a given actionId
446
440
  if (!existingTransactionMeta) {
447
441
  // Set security provider response
448
- if (method && this.securityProviderRequest) {
449
- const securityProviderResponse = await this.securityProviderRequest(addedTransactionMeta, method);
442
+ if (method && __classPrivateFieldGet(this, _TransactionController_securityProviderRequest, "f")) {
443
+ const securityProviderResponse = await __classPrivateFieldGet(this, _TransactionController_securityProviderRequest, "f").call(this, addedTransactionMeta, method);
450
444
  addedTransactionMeta.securityProviderResponse =
451
445
  securityProviderResponse;
452
446
  }
453
- if (!this.isSendFlowHistoryDisabled) {
447
+ if (!__classPrivateFieldGet(this, _TransactionController_isSendFlowHistoryDisabled, "f")) {
454
448
  addedTransactionMeta.sendFlowHistory = sendFlowHistory ?? [];
455
449
  }
456
450
  // Initial history push
457
- if (!this.isHistoryDisabled) {
451
+ if (!__classPrivateFieldGet(this, _TransactionController_isHistoryDisabled, "f")) {
458
452
  addedTransactionMeta = (0, history_1.addInitialHistorySnapshot)(addedTransactionMeta);
459
453
  }
460
454
  addedTransactionMeta = (0, swaps_1.updateSwapsTransaction)(addedTransactionMeta, transactionType, swaps, {
461
- isSwapsDisabled: this.isSwapsDisabled,
455
+ isSwapsDisabled: __classPrivateFieldGet(this, _TransactionController_isSwapsDisabled, "f"),
462
456
  cancelTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).bind(this),
463
457
  messenger: this.messagingSystem,
464
458
  });
465
- this.addMetadata(addedTransactionMeta);
459
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_addMetadata).call(this, addedTransactionMeta);
466
460
  if (requireApproval !== false) {
467
461
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateSimulationData).call(this, addedTransactionMeta, {
468
462
  traceContext,
@@ -482,7 +476,7 @@ class TransactionController extends base_controller_1.BaseController {
482
476
  this.messagingSystem.publish(`${controllerName}:unapprovedTransactionAdded`, addedTransactionMeta);
483
477
  }
484
478
  return {
485
- result: this.processApproval(addedTransactionMeta, {
479
+ result: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_processApproval).call(this, addedTransactionMeta, {
486
480
  actionId,
487
481
  isExisting: Boolean(existingTransactionMeta),
488
482
  publishHook,
@@ -621,7 +615,7 @@ class TransactionController extends base_controller_1.BaseController {
621
615
  if (!securityAlertResponse) {
622
616
  throw new Error('updateSecurityAlertResponse: securityAlertResponse should not be null');
623
617
  }
624
- const transactionMeta = this.getTransaction(transactionId);
618
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
625
619
  if (!transactionMeta) {
626
620
  throw new Error(`Cannot update security alert response as no transaction metadata found`);
627
621
  }
@@ -654,7 +648,7 @@ class TransactionController extends base_controller_1.BaseController {
654
648
  return !isMatchingAddress;
655
649
  });
656
650
  this.update((state) => {
657
- state.transactions = this.trimTransactionsForState(newTransactions);
651
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, newTransactions);
658
652
  });
659
653
  }
660
654
  /**
@@ -666,7 +660,7 @@ class TransactionController extends base_controller_1.BaseController {
666
660
  */
667
661
  async confirmExternalTransaction(transactionMeta, transactionReceipt, baseFeePerGas) {
668
662
  // Run validation and add external transaction to state.
669
- const newTransactionMeta = this.addExternalTransaction(transactionMeta);
663
+ const newTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_addExternalTransaction).call(this, transactionMeta);
670
664
  try {
671
665
  const transactionId = newTransactionMeta.id;
672
666
  // Make sure status is confirmed and define gasUsed as in receipt.
@@ -682,9 +676,9 @@ class TransactionController extends base_controller_1.BaseController {
682
676
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_markNonceDuplicatesDropped).call(this, transactionId);
683
677
  // Update external provided transaction with updated gas values and confirmed status.
684
678
  this.updateTransaction(updatedTransactionMeta, `${controllerName}:confirmExternalTransaction - Add external transaction`);
685
- this.onTransactionStatusChange(updatedTransactionMeta);
679
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, updatedTransactionMeta);
686
680
  // Intentional given potential duration of process.
687
- this.updatePostBalance(updatedTransactionMeta).catch((error) => {
681
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updatePostBalance).call(this, updatedTransactionMeta).catch((error) => {
688
682
  /* istanbul ignore next */
689
683
  (0, logger_1.projectLogger)('Error while updating post balance', error);
690
684
  throw error;
@@ -704,10 +698,10 @@ class TransactionController extends base_controller_1.BaseController {
704
698
  * @returns The updated transactionMeta.
705
699
  */
706
700
  updateTransactionSendFlowHistory(transactionID, currentSendFlowHistoryLength, sendFlowHistoryToAdd) {
707
- if (this.isSendFlowHistoryDisabled) {
701
+ if (__classPrivateFieldGet(this, _TransactionController_isSendFlowHistoryDisabled, "f")) {
708
702
  throw new Error('Send flow history is disabled for the current transaction controller');
709
703
  }
710
- const transactionMeta = this.getTransaction(transactionID);
704
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionID);
711
705
  if (!transactionMeta) {
712
706
  throw new Error(`Cannot update send flow history as no transaction metadata found`);
713
707
  }
@@ -720,7 +714,7 @@ class TransactionController extends base_controller_1.BaseController {
720
714
  };
721
715
  this.updateTransaction(updatedTransactionMeta, `${controllerName}:updateTransactionSendFlowHistory - sendFlowHistory updated`);
722
716
  }
723
- return this.getTransaction(transactionID);
717
+ return __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionID);
724
718
  }
725
719
  /**
726
720
  * Update the gas values of a transaction.
@@ -741,7 +735,7 @@ class TransactionController extends base_controller_1.BaseController {
741
735
  * @returns The updated transactionMeta.
742
736
  */
743
737
  updateTransactionGasFees(transactionId, { defaultGasEstimates, estimateUsed, estimateSuggested, gas, gasLimit, gasPrice, maxPriorityFeePerGas, maxFeePerGas, originalGasEstimate, userEditedGasLimit, userFeeLevel, }) {
744
- const transactionMeta = this.getTransaction(transactionId);
738
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
745
739
  if (!transactionMeta) {
746
740
  throw new Error(`Cannot update transaction as no transaction metadata found`);
747
741
  }
@@ -769,7 +763,7 @@ class TransactionController extends base_controller_1.BaseController {
769
763
  // merge updated gas values with existing transaction meta
770
764
  const updatedMeta = (0, lodash_1.merge)({}, transactionMeta, transactionGasFees);
771
765
  this.updateTransaction(updatedMeta, `${controllerName}:updateTransactionGasFees - gas values updated`);
772
- return this.getTransaction(transactionId);
766
+ return __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
773
767
  }
774
768
  /**
775
769
  * Update the previous gas values of a transaction.
@@ -782,7 +776,7 @@ class TransactionController extends base_controller_1.BaseController {
782
776
  * @returns The updated transactionMeta.
783
777
  */
784
778
  updatePreviousGasParams(transactionId, { gasLimit, maxFeePerGas, maxPriorityFeePerGas, }) {
785
- const transactionMeta = this.getTransaction(transactionId);
779
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
786
780
  if (!transactionMeta) {
787
781
  throw new Error(`Cannot update transaction as no transaction metadata found`);
788
782
  }
@@ -801,7 +795,7 @@ class TransactionController extends base_controller_1.BaseController {
801
795
  // merge updated previous gas values with existing transaction meta
802
796
  const updatedMeta = (0, lodash_1.merge)({}, transactionMeta, transactionPreviousGas);
803
797
  this.updateTransaction(updatedMeta, `${controllerName}:updatePreviousGasParams - Previous gas values updated`);
804
- return this.getTransaction(transactionId);
798
+ return __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
805
799
  }
806
800
  async getNonceLock(address, networkClientId) {
807
801
  return __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, networkClientId);
@@ -822,7 +816,7 @@ class TransactionController extends base_controller_1.BaseController {
822
816
  * @returns The updated transaction metadata.
823
817
  */
824
818
  async updateEditableParams(txId, { data, from, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, to, value, }) {
825
- const transactionMeta = this.getTransaction(txId);
819
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, txId);
826
820
  if (!transactionMeta) {
827
821
  throw new Error(`Cannot update editable params as no transaction metadata found`);
828
822
  }
@@ -847,13 +841,13 @@ class TransactionController extends base_controller_1.BaseController {
847
841
  const { type } = await (0, transaction_type_1.determineTransactionType)(updatedTransaction.txParams, ethQuery);
848
842
  updatedTransaction.type = type;
849
843
  await (0, layer1_gas_fee_flow_1.updateTransactionLayer1GasFee)({
850
- layer1GasFeeFlows: this.layer1GasFeeFlows,
844
+ layer1GasFeeFlows: __classPrivateFieldGet(this, _TransactionController_layer1GasFeeFlows, "f"),
851
845
  messenger: this.messagingSystem,
852
846
  provider,
853
847
  transactionMeta: updatedTransaction,
854
848
  });
855
849
  this.updateTransaction(updatedTransaction, `Update Editable Params for ${txId}`);
856
- return this.getTransaction(txId);
850
+ return __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, txId);
857
851
  }
858
852
  /**
859
853
  * Update the isActive state of a transaction.
@@ -862,7 +856,7 @@ class TransactionController extends base_controller_1.BaseController {
862
856
  * @param isActive - The active state.
863
857
  */
864
858
  setTransactionActive(transactionId, isActive) {
865
- const transactionMeta = this.getTransaction(transactionId);
859
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
866
860
  if (!transactionMeta) {
867
861
  throw new Error(`Transaction with id ${transactionId} not found`);
868
862
  }
@@ -896,10 +890,10 @@ class TransactionController extends base_controller_1.BaseController {
896
890
  const networkClientId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNetworkClientId).call(this, { chainId });
897
891
  const initialTxAsEthTx = (0, prepare_1.prepareTransaction)(chainId, initialTx);
898
892
  const initialTxAsSerializedHex = (0, prepare_1.serializeTransaction)(initialTxAsEthTx);
899
- if (this.approvingTransactionIds.has(initialTxAsSerializedHex)) {
893
+ if (__classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").has(initialTxAsSerializedHex)) {
900
894
  return '';
901
895
  }
902
- this.approvingTransactionIds.add(initialTxAsSerializedHex);
896
+ __classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").add(initialTxAsSerializedHex);
903
897
  let rawTransactions, nonceLock;
904
898
  try {
905
899
  // TODO: we should add a check to verify that all transactions have the same from address
@@ -916,7 +910,7 @@ class TransactionController extends base_controller_1.BaseController {
916
910
  }
917
911
  rawTransactions = await Promise.all(listOfTxParams.map((txParams) => {
918
912
  txParams.nonce = nonce;
919
- return this.signExternalTransaction(txParams.chainId, txParams);
913
+ return __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_signExternalTransaction).call(this, txParams.chainId, txParams);
920
914
  }));
921
915
  }
922
916
  catch (err) {
@@ -927,7 +921,7 @@ class TransactionController extends base_controller_1.BaseController {
927
921
  }
928
922
  finally {
929
923
  nonceLock?.releaseLock();
930
- this.approvingTransactionIds.delete(initialTxAsSerializedHex);
924
+ __classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").delete(initialTxAsSerializedHex);
931
925
  }
932
926
  return rawTransactions;
933
927
  }
@@ -940,7 +934,7 @@ class TransactionController extends base_controller_1.BaseController {
940
934
  */
941
935
  updateCustodialTransaction(request) {
942
936
  const { transactionId, errorMessage, hash, status, gasLimit, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, type, } = request;
943
- const transactionMeta = this.getTransaction(transactionId);
937
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
944
938
  if (!transactionMeta) {
945
939
  throw new Error(`Cannot update custodial transaction as no transaction metadata found`);
946
940
  }
@@ -1073,9 +1067,9 @@ class TransactionController extends base_controller_1.BaseController {
1073
1067
  networkClientId,
1074
1068
  };
1075
1069
  // Guaranteed as the default gas fee flow matches all transactions.
1076
- const gasFeeFlow = (0, gas_flow_1.getGasFeeFlow)(transactionMeta, this.gasFeeFlows, this.messagingSystem);
1070
+ const gasFeeFlow = (0, gas_flow_1.getGasFeeFlow)(transactionMeta, __classPrivateFieldGet(this, _TransactionController_gasFeeFlows, "f"), this.messagingSystem);
1077
1071
  const ethQuery = new eth_query_1.default(provider);
1078
- const gasFeeControllerData = await this.getGasFeeEstimates({
1072
+ const gasFeeControllerData = await __classPrivateFieldGet(this, _TransactionController_getGasFeeEstimates, "f").call(this, {
1079
1073
  networkClientId,
1080
1074
  });
1081
1075
  return gasFeeFlow.getGasFees({
@@ -1100,7 +1094,7 @@ class TransactionController extends base_controller_1.BaseController {
1100
1094
  networkClientId,
1101
1095
  });
1102
1096
  return await (0, layer1_gas_fee_flow_1.getTransactionLayer1GasFee)({
1103
- layer1GasFeeFlows: this.layer1GasFeeFlows,
1097
+ layer1GasFeeFlows: __classPrivateFieldGet(this, _TransactionController_layer1GasFeeFlows, "f"),
1104
1098
  messenger: this.messagingSystem,
1105
1099
  provider,
1106
1100
  transactionMeta: {
@@ -1109,33 +1103,13 @@ class TransactionController extends base_controller_1.BaseController {
1109
1103
  },
1110
1104
  });
1111
1105
  }
1112
- async signExternalTransaction(chainId, transactionParams) {
1113
- if (!this.sign) {
1114
- throw new Error('No sign method defined.');
1115
- }
1116
- const normalizedTransactionParams = (0, utils_2.normalizeTransactionParams)(transactionParams);
1117
- const type = (0, utils_2.isEIP1559Transaction)(normalizedTransactionParams)
1118
- ? types_1.TransactionEnvelopeType.feeMarket
1119
- : types_1.TransactionEnvelopeType.legacy;
1120
- const updatedTransactionParams = {
1121
- ...normalizedTransactionParams,
1122
- type,
1123
- gasLimit: normalizedTransactionParams.gas,
1124
- chainId,
1125
- };
1126
- const { from } = updatedTransactionParams;
1127
- const unsignedTransaction = (0, prepare_1.prepareTransaction)(chainId, updatedTransactionParams);
1128
- const signedTransaction = await this.sign(unsignedTransaction, from);
1129
- const rawTransaction = (0, prepare_1.serializeTransaction)(signedTransaction);
1130
- return rawTransaction;
1131
- }
1132
1106
  /**
1133
1107
  * Removes unapproved transactions from state.
1134
1108
  */
1135
1109
  clearUnapprovedTransactions() {
1136
1110
  const transactions = this.state.transactions.filter(({ status }) => status !== types_1.TransactionStatus.unapproved);
1137
1111
  this.update((state) => {
1138
- state.transactions = this.trimTransactionsForState(transactions);
1112
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, transactions);
1139
1113
  });
1140
1114
  }
1141
1115
  /**
@@ -1145,16 +1119,16 @@ class TransactionController extends base_controller_1.BaseController {
1145
1119
  * @param transactionId - The ID of the transaction to stop signing.
1146
1120
  */
1147
1121
  abortTransactionSigning(transactionId) {
1148
- const transactionMeta = this.getTransaction(transactionId);
1122
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1149
1123
  if (!transactionMeta) {
1150
1124
  throw new Error(`Cannot abort signing as no transaction metadata found`);
1151
1125
  }
1152
- const abortCallback = this.signAbortCallbacks.get(transactionId);
1126
+ const abortCallback = __classPrivateFieldGet(this, _TransactionController_signAbortCallbacks, "f").get(transactionId);
1153
1127
  if (!abortCallback) {
1154
1128
  throw new Error(`Cannot abort signing as transaction is not waiting for signing`);
1155
1129
  }
1156
1130
  abortCallback();
1157
- this.signAbortCallbacks.delete(transactionId);
1131
+ __classPrivateFieldGet(this, _TransactionController_signAbortCallbacks, "f").delete(transactionId);
1158
1132
  }
1159
1133
  /**
1160
1134
  * Update the transaction data of a single nested transaction within an atomic batch transaction.
@@ -1236,537 +1210,11 @@ class TransactionController extends base_controller_1.BaseController {
1236
1210
  transactionMeta.selectedGasFeeToken = contractAddress;
1237
1211
  });
1238
1212
  }
1239
- addMetadata(transactionMeta) {
1240
- (0, validation_1.validateTxParams)(transactionMeta.txParams);
1241
- this.update((state) => {
1242
- state.transactions = this.trimTransactionsForState([
1243
- ...state.transactions,
1244
- transactionMeta,
1245
- ]);
1246
- });
1247
- }
1248
- async updateGasProperties(transactionMeta, { traceContext } = {}) {
1249
- const isEIP1559Compatible = transactionMeta.txParams.type !== types_1.TransactionEnvelopeType.legacy &&
1250
- (await this.getEIP1559Compatibility(transactionMeta.networkClientId));
1251
- const { networkClientId } = transactionMeta;
1252
- const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1253
- const provider = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getProvider).call(this, { networkClientId });
1254
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Gas', parentContext: traceContext }, async () => {
1255
- await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateGasEstimate).call(this, transactionMeta);
1256
- });
1257
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Gas Fees', parentContext: traceContext }, async () => await (0, gas_fees_1.updateGasFees)({
1258
- eip1559: isEIP1559Compatible,
1259
- ethQuery,
1260
- gasFeeFlows: this.gasFeeFlows,
1261
- getGasFeeEstimates: this.getGasFeeEstimates,
1262
- getSavedGasFees: this.getSavedGasFees.bind(this),
1263
- messenger: this.messagingSystem,
1264
- txMeta: transactionMeta,
1265
- }));
1266
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Layer 1 Gas Fees', parentContext: traceContext }, async () => await (0, layer1_gas_fee_flow_1.updateTransactionLayer1GasFee)({
1267
- layer1GasFeeFlows: this.layer1GasFeeFlows,
1268
- messenger: this.messagingSystem,
1269
- provider,
1270
- transactionMeta,
1271
- }));
1272
- }
1273
- onBootCleanup() {
1274
- this.clearUnapprovedTransactions();
1275
- this.failIncompleteTransactions();
1276
- }
1277
- failIncompleteTransactions() {
1278
- const incompleteTransactions = this.state.transactions.filter((transaction) => [types_1.TransactionStatus.approved, types_1.TransactionStatus.signed].includes(transaction.status));
1279
- for (const transactionMeta of incompleteTransactions) {
1280
- this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
1281
- }
1282
- }
1283
- async processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1284
- const transactionId = transactionMeta.id;
1285
- let resultCallbacks;
1286
- const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
1287
- const finishedPromise = isCompleted
1288
- ? Promise.resolve(meta)
1289
- : this.waitForTransactionFinished(transactionId);
1290
- if (meta && !isExisting && !isCompleted) {
1291
- try {
1292
- if (requireApproval !== false) {
1293
- const acceptResult = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Await Approval', parentContext: traceContext }, (context) => this.requestApproval(transactionMeta, {
1294
- shouldShowRequest,
1295
- traceContext: context,
1296
- }));
1297
- resultCallbacks = acceptResult.resultCallbacks;
1298
- const approvalValue = acceptResult.value;
1299
- const updatedTransaction = approvalValue?.txMeta;
1300
- if (updatedTransaction) {
1301
- (0, logger_1.projectLogger)('Updating transaction with approval data', {
1302
- customNonce: updatedTransaction.customNonceValue,
1303
- params: updatedTransaction.txParams,
1304
- });
1305
- this.updateTransaction(updatedTransaction, 'TransactionController#processApproval - Updated with approval data');
1306
- }
1307
- }
1308
- const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1309
- if (!isTxCompleted) {
1310
- const approvalResult = await this.approveTransaction(transactionId, traceContext, publishHook);
1311
- if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1312
- resultCallbacks) {
1313
- resultCallbacks.success();
1314
- }
1315
- const updatedTransactionMeta = this.getTransaction(transactionId);
1316
- this.messagingSystem.publish(`${controllerName}:transactionApproved`, {
1317
- transactionMeta: updatedTransactionMeta,
1318
- actionId,
1319
- });
1320
- }
1321
- }
1322
- catch (rawError) {
1323
- const error = rawError;
1324
- const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1325
- if (!isTxCompleted) {
1326
- if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isRejectError).call(this, error)) {
1327
- __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransactionAndThrow).call(this, transactionId, actionId, error);
1328
- }
1329
- else {
1330
- this.failTransaction(meta, error, actionId);
1331
- }
1332
- }
1333
- }
1334
- }
1335
- const finalMeta = await finishedPromise;
1336
- switch (finalMeta?.status) {
1337
- case types_1.TransactionStatus.failed:
1338
- const error = finalMeta.error;
1339
- resultCallbacks?.error(error);
1340
- throw rpc_errors_1.rpcErrors.internal(error.message);
1341
- case types_1.TransactionStatus.submitted:
1342
- resultCallbacks?.success();
1343
- return finalMeta.hash;
1344
- default:
1345
- const internalError = rpc_errors_1.rpcErrors.internal(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finalMeta || transactionId)}`);
1346
- resultCallbacks?.error(internalError);
1347
- throw internalError;
1348
- }
1349
- }
1350
- /**
1351
- * Approves a transaction and updates it's status in state. If this is not a
1352
- * retry transaction, a nonce will be generated. The transaction is signed
1353
- * using the sign configuration property, then published to the blockchain.
1354
- * A `<tx.id>:finished` hub event is fired after success or failure.
1355
- *
1356
- * @param transactionId - The ID of the transaction to approve.
1357
- * @param traceContext - The parent context for any new traces.
1358
- * @param publishHookOverride - Custom logic to publish the transaction.
1359
- * @returns The state of the approval.
1360
- */
1361
- async approveTransaction(transactionId, traceContext, publishHookOverride) {
1362
- let clearApprovingTransactionId;
1363
- let clearNonceLock;
1364
- let transactionMeta = this.getTransactionOrThrow(transactionId);
1365
- (0, logger_1.projectLogger)('Approving transaction', transactionMeta);
1366
- try {
1367
- if (!this.sign) {
1368
- this.failTransaction(transactionMeta, new Error('No sign method defined.'));
1369
- return ApprovalState.NotApproved;
1370
- }
1371
- else if (!transactionMeta.chainId) {
1372
- this.failTransaction(transactionMeta, new Error('No chainId defined.'));
1373
- return ApprovalState.NotApproved;
1374
- }
1375
- if (this.approvingTransactionIds.has(transactionId)) {
1376
- (0, logger_1.projectLogger)('Skipping approval as signing in progress', transactionId);
1377
- return ApprovalState.NotApproved;
1378
- }
1379
- this.approvingTransactionIds.add(transactionId);
1380
- clearApprovingTransactionId = () => this.approvingTransactionIds.delete(transactionId);
1381
- const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1382
- clearNonceLock = releaseNonce;
1383
- transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1384
- transactionId,
1385
- note: 'TransactionController#approveTransaction - Transaction approved',
1386
- }, (draftTxMeta) => {
1387
- const { chainId, txParams } = draftTxMeta;
1388
- const { gas, type } = txParams;
1389
- draftTxMeta.status = types_1.TransactionStatus.approved;
1390
- draftTxMeta.txParams.chainId = chainId;
1391
- draftTxMeta.txParams.gasLimit = gas;
1392
- draftTxMeta.txParams.nonce = nonce;
1393
- if (!type && (0, utils_2.isEIP1559Transaction)(txParams)) {
1394
- draftTxMeta.txParams.type = types_1.TransactionEnvelopeType.feeMarket;
1395
- }
1396
- });
1397
- this.onTransactionStatusChange(transactionMeta);
1398
- const rawTx = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Sign', parentContext: traceContext }, () => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_signTransaction).call(this, transactionMeta));
1399
- if (!(await this.beforePublish(transactionMeta))) {
1400
- (0, logger_1.projectLogger)('Skipping publishing transaction based on hook');
1401
- this.messagingSystem.publish(`${controllerName}:transactionPublishingSkipped`, transactionMeta);
1402
- return ApprovalState.SkippedViaBeforePublishHook;
1403
- }
1404
- if (!rawTx && !transactionMeta.isExternalSign) {
1405
- return ApprovalState.NotApproved;
1406
- }
1407
- const { networkClientId } = transactionMeta;
1408
- const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1409
- let preTxBalance;
1410
- const shouldUpdatePreTxBalance = transactionMeta.type === types_1.TransactionType.swap;
1411
- if (shouldUpdatePreTxBalance) {
1412
- (0, logger_1.projectLogger)('Determining pre-transaction balance');
1413
- preTxBalance = await (0, controller_utils_1.query)(ethQuery, 'getBalance', [
1414
- transactionMeta.txParams.from,
1415
- ]);
1416
- }
1417
- (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1418
- let hash;
1419
- clearNonceLock?.();
1420
- clearNonceLock = undefined;
1421
- if (transactionMeta.batchTransactions?.length) {
1422
- (0, logger_1.projectLogger)('Found batch transactions', transactionMeta.batchTransactions);
1423
- const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
1424
- addTransactionBatch: this.addTransactionBatch.bind(this),
1425
- transactions: transactionMeta.batchTransactions,
1426
- });
1427
- publishHookOverride = extraTransactionsPublishHook.getHook();
1428
- }
1429
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
1430
- const publishHook = publishHookOverride ?? this.publish;
1431
- ({ transactionHash: hash } = await publishHook(transactionMeta, rawTx ?? '0x'));
1432
- if (hash === undefined) {
1433
- hash = await this.publishTransaction(ethQuery, {
1434
- ...transactionMeta,
1435
- rawTx,
1436
- });
1437
- }
1438
- });
1439
- (0, logger_1.projectLogger)('Publish successful', hash);
1440
- transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1441
- transactionId,
1442
- note: 'TransactionController#approveTransaction - Transaction submitted',
1443
- }, (draftTxMeta) => {
1444
- draftTxMeta.hash = hash;
1445
- draftTxMeta.status = types_1.TransactionStatus.submitted;
1446
- draftTxMeta.submittedTime = new Date().getTime();
1447
- if (shouldUpdatePreTxBalance) {
1448
- draftTxMeta.preTxBalance = preTxBalance;
1449
- (0, logger_1.projectLogger)('Updated pre-transaction balance', preTxBalance);
1450
- }
1451
- });
1452
- this.messagingSystem.publish(`${controllerName}:transactionSubmitted`, {
1453
- transactionMeta,
1454
- });
1455
- this.messagingSystem.publish(`${controllerName}:transactionFinished`, transactionMeta);
1456
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionId}:finished`, transactionMeta);
1457
- this.onTransactionStatusChange(transactionMeta);
1458
- return ApprovalState.Approved;
1459
- // TODO: Replace `any` with type
1460
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1461
- }
1462
- catch (error) {
1463
- this.failTransaction(transactionMeta, error);
1464
- return ApprovalState.NotApproved;
1465
- }
1466
- finally {
1467
- clearApprovingTransactionId?.();
1468
- clearNonceLock?.();
1469
- }
1470
- }
1471
- async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
1472
- const transactionHash = await (0, controller_utils_1.query)(ethQuery, 'sendRawTransaction', [
1473
- transactionMeta.rawTx,
1474
- ]);
1475
- if (skipSubmitHistory !== true) {
1476
- __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateSubmitHistory).call(this, transactionMeta, transactionHash);
1477
- }
1478
- return transactionHash;
1479
- }
1480
- /**
1481
- * Trim the amount of transactions that are set on the state. Checks
1482
- * if the length of the tx history is longer then desired persistence
1483
- * limit and then if it is removes the oldest confirmed or rejected tx.
1484
- * Pending or unapproved transactions will not be removed by this
1485
- * operation. For safety of presenting a fully functional transaction UI
1486
- * representation, this function will not break apart transactions with the
1487
- * same nonce, created on the same day, per network. Not accounting for
1488
- * transactions of the same nonce, same day and network combo can result in
1489
- * confusing or broken experiences in the UI.
1490
- *
1491
- * @param transactions - The transactions to be applied to the state.
1492
- * @returns The trimmed list of transactions.
1493
- */
1494
- trimTransactionsForState(transactions) {
1495
- const nonceNetworkSet = new Set();
1496
- const txsToKeep = [...transactions]
1497
- .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order
1498
- .filter((tx) => {
1499
- const { chainId, status, txParams, time } = tx;
1500
- if (txParams) {
1501
- const key = `${String(txParams.nonce)}-${(0, controller_utils_1.convertHexToDecimal)(chainId)}-${new Date(time).toDateString()}`;
1502
- if (nonceNetworkSet.has(key)) {
1503
- return true;
1504
- }
1505
- else if (nonceNetworkSet.size < __classPrivateFieldGet(this, _TransactionController_transactionHistoryLimit, "f") ||
1506
- !this.isFinalState(status)) {
1507
- nonceNetworkSet.add(key);
1508
- return true;
1509
- }
1510
- }
1511
- return false;
1512
- });
1513
- txsToKeep.reverse(); // Ascending time order
1514
- return txsToKeep;
1515
- }
1516
- /**
1517
- * Determines if the transaction is in a final state.
1518
- *
1519
- * @param status - The transaction status.
1520
- * @returns Whether the transaction is in a final state.
1521
- */
1522
- isFinalState(status) {
1523
- return (status === types_1.TransactionStatus.rejected ||
1524
- status === types_1.TransactionStatus.confirmed ||
1525
- status === types_1.TransactionStatus.failed);
1526
- }
1527
- /**
1528
- * Whether the transaction has at least completed all local processing.
1529
- *
1530
- * @param status - The transaction status.
1531
- * @returns Whether the transaction is in a final state.
1532
- */
1533
- isLocalFinalState(status) {
1534
- return [
1535
- types_1.TransactionStatus.confirmed,
1536
- types_1.TransactionStatus.failed,
1537
- types_1.TransactionStatus.rejected,
1538
- types_1.TransactionStatus.submitted,
1539
- ].includes(status);
1540
- }
1541
- async requestApproval(txMeta, { shouldShowRequest, traceContext, }) {
1542
- const id = this.getApprovalId(txMeta);
1543
- const { origin } = txMeta;
1544
- const type = controller_utils_1.ApprovalType.Transaction;
1545
- const requestData = { txId: txMeta.id };
1546
- await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, {
1547
- name: 'Notification Display',
1548
- id,
1549
- parentContext: traceContext,
1550
- });
1551
- return (await this.messagingSystem.call('ApprovalController:addRequest', {
1552
- id,
1553
- origin: origin || controller_utils_1.ORIGIN_METAMASK,
1554
- type,
1555
- requestData,
1556
- expectsResult: true,
1557
- }, shouldShowRequest));
1558
- }
1559
- getTransaction(transactionId) {
1560
- const { transactions } = this.state;
1561
- return transactions.find(({ id }) => id === transactionId);
1562
- }
1563
- getTransactionOrThrow(transactionId, errorMessagePrefix = 'TransactionController') {
1564
- const txMeta = this.getTransaction(transactionId);
1565
- if (!txMeta) {
1566
- throw new Error(`${errorMessagePrefix}: No transaction found with id ${transactionId}`);
1567
- }
1568
- return txMeta;
1569
- }
1570
- getApprovalId(txMeta) {
1571
- return String(txMeta.id);
1572
- }
1573
- isTransactionCompleted(transactionId) {
1574
- const transaction = this.getTransaction(transactionId);
1575
- if (!transaction) {
1576
- return { meta: undefined, isCompleted: false };
1577
- }
1578
- const isCompleted = this.isLocalFinalState(transaction.status);
1579
- return { meta: transaction, isCompleted };
1580
- }
1581
- onIncomingTransactions(transactions) {
1582
- if (!transactions.length) {
1583
- return;
1584
- }
1585
- const finalTransactions = transactions.map((tx) => {
1586
- const { chainId } = tx;
1587
- const networkClientId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNetworkClientId).call(this, { chainId });
1588
- return {
1589
- ...tx,
1590
- networkClientId,
1591
- };
1592
- });
1593
- this.update((state) => {
1594
- const { transactions: currentTransactions } = state;
1595
- state.transactions = this.trimTransactionsForState([
1596
- ...finalTransactions,
1597
- ...currentTransactions,
1598
- ]);
1599
- (0, logger_1.projectLogger)('Added incoming transactions to state', finalTransactions.length, finalTransactions);
1600
- });
1601
- this.messagingSystem.publish(`${controllerName}:incomingTransactionsReceived`, finalTransactions);
1602
- }
1603
- generateDappSuggestedGasFees(txParams, origin) {
1604
- if (!origin || origin === controller_utils_1.ORIGIN_METAMASK) {
1605
- return undefined;
1606
- }
1607
- const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;
1608
- if (gasPrice === undefined &&
1609
- maxFeePerGas === undefined &&
1610
- maxPriorityFeePerGas === undefined &&
1611
- gas === undefined) {
1612
- return undefined;
1613
- }
1614
- const dappSuggestedGasFees = {};
1615
- if (gasPrice !== undefined) {
1616
- dappSuggestedGasFees.gasPrice = gasPrice;
1617
- }
1618
- else if (maxFeePerGas !== undefined ||
1619
- maxPriorityFeePerGas !== undefined) {
1620
- dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;
1621
- dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;
1622
- }
1623
- if (gas !== undefined) {
1624
- dappSuggestedGasFees.gas = gas;
1625
- }
1626
- return dappSuggestedGasFees;
1627
- }
1628
- /**
1629
- * Validates and adds external provided transaction to state.
1630
- *
1631
- * @param transactionMeta - Nominated external transaction to be added to state.
1632
- * @returns The new transaction.
1633
- */
1634
- addExternalTransaction(transactionMeta) {
1635
- const { chainId } = transactionMeta;
1636
- const { transactions } = this.state;
1637
- const fromAddress = transactionMeta?.txParams?.from;
1638
- const sameFromAndNetworkTransactions = transactions.filter((transaction) => transaction.txParams.from === fromAddress &&
1639
- transaction.chainId === chainId);
1640
- const confirmedTxs = sameFromAndNetworkTransactions.filter((transaction) => transaction.status === types_1.TransactionStatus.confirmed);
1641
- const pendingTxs = sameFromAndNetworkTransactions.filter((transaction) => transaction.status === types_1.TransactionStatus.submitted);
1642
- (0, external_transactions_1.validateConfirmedExternalTransaction)(transactionMeta, confirmedTxs, pendingTxs);
1643
- // Make sure provided external transaction has non empty history array
1644
- const newTransactionMeta = (transactionMeta.history ?? []).length === 0 && !this.isHistoryDisabled
1645
- ? (0, history_1.addInitialHistorySnapshot)(transactionMeta)
1646
- : transactionMeta;
1647
- this.update((state) => {
1648
- state.transactions = this.trimTransactionsForState([
1649
- ...state.transactions,
1650
- newTransactionMeta,
1651
- ]);
1652
- });
1653
- return newTransactionMeta;
1654
- }
1655
- /**
1656
- * Method to set transaction status to dropped.
1657
- *
1658
- * @param transactionMeta - TransactionMeta of transaction to be marked as dropped.
1659
- */
1660
- setTransactionStatusDropped(transactionMeta) {
1661
- const updatedTransactionMeta = {
1662
- ...transactionMeta,
1663
- status: types_1.TransactionStatus.dropped,
1664
- };
1665
- this.messagingSystem.publish(`${controllerName}:transactionDropped`, {
1666
- transactionMeta: updatedTransactionMeta,
1667
- });
1668
- this.updateTransaction(updatedTransactionMeta, 'TransactionController#setTransactionStatusDropped - Transaction dropped');
1669
- this.onTransactionStatusChange(updatedTransactionMeta);
1670
- }
1671
- /**
1672
- * Get transaction with provided actionId.
1673
- *
1674
- * @param actionId - Unique ID to prevent duplicate requests
1675
- * @returns the filtered transaction
1676
- */
1677
- getTransactionWithActionId(actionId) {
1678
- return this.state.transactions.find((transaction) => actionId && transaction.actionId === actionId);
1679
- }
1680
- async waitForTransactionFinished(transactionId) {
1681
- return new Promise((resolve) => {
1682
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").once(`${transactionId}:finished`, (txMeta) => {
1683
- resolve(txMeta);
1684
- });
1685
- });
1686
- }
1687
- /**
1688
- * Updates the r, s, and v properties of a TransactionMeta object
1689
- * with values from a signed transaction.
1690
- *
1691
- * @param transactionMeta - The TransactionMeta object to update.
1692
- * @param signedTx - The encompassing type for all transaction types containing r, s, and v values.
1693
- * @returns The updated TransactionMeta object.
1694
- */
1695
- updateTransactionMetaRSV(transactionMeta, signedTx) {
1696
- const transactionMetaWithRsv = (0, lodash_1.cloneDeep)(transactionMeta);
1697
- for (const key of ['r', 's', 'v']) {
1698
- const value = signedTx[key];
1699
- if (value === undefined || value === null) {
1700
- continue;
1701
- }
1702
- transactionMetaWithRsv[key] = (0, utils_1.add0x)(value.toString(16));
1703
- }
1704
- return transactionMetaWithRsv;
1705
- }
1706
- async getEIP1559Compatibility(networkClientId) {
1707
- const currentNetworkIsEIP1559Compatible = await this.getCurrentNetworkEIP1559Compatibility(networkClientId);
1708
- const currentAccountIsEIP1559Compatible = await this.getCurrentAccountEIP1559Compatibility();
1709
- return (currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible);
1710
- }
1711
- onTransactionStatusChange(transactionMeta) {
1712
- this.messagingSystem.publish(`${controllerName}:transactionStatusUpdated`, {
1713
- transactionMeta,
1714
- });
1715
- }
1716
- getNonceTrackerTransactions(statuses, address, chainId) {
1717
- return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, statuses, this.state.transactions);
1718
- }
1719
- async updatePostBalance(transactionMeta) {
1720
- try {
1721
- const { networkClientId, type } = transactionMeta;
1722
- if (type !== types_1.TransactionType.swap) {
1723
- return;
1724
- }
1725
- const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1726
- const { updatedTransactionMeta, approvalTransactionMeta } = await (0, swaps_1.updatePostTransactionBalance)(transactionMeta, {
1727
- ethQuery,
1728
- getTransaction: this.getTransaction.bind(this),
1729
- updateTransaction: this.updateTransaction.bind(this),
1730
- });
1731
- this.messagingSystem.publish(`${controllerName}:postTransactionBalanceUpdated`, {
1732
- transactionMeta: updatedTransactionMeta,
1733
- approvalTransactionMeta,
1734
- });
1735
- }
1736
- catch (error) {
1737
- /* istanbul ignore next */
1738
- (0, logger_1.projectLogger)('Error while updating post transaction balance', error);
1739
- }
1740
- }
1741
- async publishTransactionForRetry(ethQuery, transactionMeta) {
1742
- try {
1743
- return await this.publishTransaction(ethQuery, transactionMeta);
1744
- }
1745
- catch (error) {
1746
- if (this.isTransactionAlreadyConfirmedError(error)) {
1747
- throw new Error('Previous transaction is already confirmed');
1748
- }
1749
- throw error;
1750
- }
1751
- }
1752
- /**
1753
- * Ensures that error is a nonce issue
1754
- *
1755
- * @param error - The error to check
1756
- * @returns Whether or not the error is a nonce issue
1757
- */
1758
- // TODO: Replace `any` with type
1759
- // Some networks are returning original error in the data field
1760
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1761
- isTransactionAlreadyConfirmedError(error) {
1762
- return (error?.message?.includes('nonce too low') ||
1763
- error?.data?.message?.includes('nonce too low'));
1764
- }
1765
1213
  }
1766
1214
  exports.TransactionController = TransactionController;
1767
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_publicKeyEIP7702 = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_multichainTrackingHelper = 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, }) {
1215
+ _TransactionController_afterAdd = new WeakMap(), _TransactionController_afterSign = new WeakMap(), _TransactionController_approvingTransactionIds = new WeakMap(), _TransactionController_beforeCheckPendingTransaction = new WeakMap(), _TransactionController_beforePublish = new WeakMap(), _TransactionController_gasFeeFlows = new WeakMap(), _TransactionController_getAdditionalSignArguments = new WeakMap(), _TransactionController_getCurrentAccountEIP1559Compatibility = new WeakMap(), _TransactionController_getCurrentNetworkEIP1559Compatibility = new WeakMap(), _TransactionController_getExternalPendingTransactions = new WeakMap(), _TransactionController_getGasFeeEstimates = new WeakMap(), _TransactionController_getNetworkState = new WeakMap(), _TransactionController_getPermittedAccounts = new WeakMap(), _TransactionController_getSavedGasFees = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_internalEvents = new WeakMap(), _TransactionController_isAutomaticGasFeeUpdateEnabled = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isHistoryDisabled = new WeakMap(), _TransactionController_isSendFlowHistoryDisabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_isSwapsDisabled = new WeakMap(), _TransactionController_layer1GasFeeFlows = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_multichainTrackingHelper = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publicKeyEIP7702 = new WeakMap(), _TransactionController_publish = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_securityProviderRequest = new WeakMap(), _TransactionController_sign = new WeakMap(), _TransactionController_signAbortCallbacks = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = 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, }) {
1768
1216
  // If transaction is found for same action id, do not create a new transaction.
1769
- if (this.getTransactionWithActionId(actionId)) {
1217
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransactionWithActionId).call(this, actionId)) {
1770
1218
  return;
1771
1219
  }
1772
1220
  if (gasValues) {
@@ -1775,20 +1223,20 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1775
1223
  (0, utils_2.validateGasValues)(gasValues);
1776
1224
  }
1777
1225
  (0, logger_1.projectLogger)(`Creating ${label} transaction`, transactionId, gasValues);
1778
- const transactionMeta = this.getTransaction(transactionId);
1226
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1779
1227
  /* istanbul ignore next */
1780
1228
  if (!transactionMeta) {
1781
1229
  return;
1782
1230
  }
1783
1231
  /* istanbul ignore next */
1784
- if (!this.sign) {
1232
+ if (!__classPrivateFieldGet(this, _TransactionController_sign, "f")) {
1785
1233
  throw new Error('No sign method defined.');
1786
1234
  }
1787
1235
  const newTxParams = (0, retry_1.getTransactionParamsWithIncreasedGasFee)(transactionMeta.txParams, rate, gasValues);
1788
1236
  prepareTransactionParams?.(newTxParams);
1789
1237
  const unsignedEthTx = (0, prepare_1.prepareTransaction)(transactionMeta.chainId, newTxParams);
1790
- const signedTx = await this.sign(unsignedEthTx, transactionMeta.txParams.from);
1791
- const transactionMetaWithRsv = this.updateTransactionMetaRSV(transactionMeta, signedTx);
1238
+ const signedTx = await __classPrivateFieldGet(this, _TransactionController_sign, "f").call(this, unsignedEthTx, transactionMeta.txParams.from);
1239
+ const transactionMetaWithRsv = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionMetaRSV).call(this, transactionMeta, signedTx);
1792
1240
  const rawTx = (0, prepare_1.serializeTransaction)(signedTx);
1793
1241
  const newFee = newTxParams.maxFeePerGas ?? newTxParams.gasPrice;
1794
1242
  const oldFee = newTxParams.maxFeePerGas
@@ -1813,12 +1261,12 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1813
1261
  txParams: newTxParams,
1814
1262
  type: transactionType,
1815
1263
  };
1816
- const hash = await this.publishTransactionForRetry(ethQuery, {
1264
+ const hash = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_publishTransactionForRetry).call(this, ethQuery, {
1817
1265
  ...newTransactionMeta,
1818
1266
  origin: label,
1819
1267
  });
1820
1268
  newTransactionMeta.hash = hash;
1821
- this.addMetadata(newTransactionMeta);
1269
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_addMetadata).call(this, newTransactionMeta);
1822
1270
  // speedUpTransaction has no approval request, so we assume the user has already approved the transaction
1823
1271
  this.messagingSystem.publish(`${controllerName}:transactionApproved`, {
1824
1272
  transactionMeta: newTransactionMeta,
@@ -1829,8 +1277,262 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1829
1277
  actionId,
1830
1278
  });
1831
1279
  afterSubmit?.(newTransactionMeta);
1280
+ }, _TransactionController_signExternalTransaction = async function _TransactionController_signExternalTransaction(chainId, transactionParams) {
1281
+ if (!__classPrivateFieldGet(this, _TransactionController_sign, "f")) {
1282
+ throw new Error('No sign method defined.');
1283
+ }
1284
+ const normalizedTransactionParams = (0, utils_2.normalizeTransactionParams)(transactionParams);
1285
+ const type = (0, utils_2.isEIP1559Transaction)(normalizedTransactionParams)
1286
+ ? types_1.TransactionEnvelopeType.feeMarket
1287
+ : types_1.TransactionEnvelopeType.legacy;
1288
+ const updatedTransactionParams = {
1289
+ ...normalizedTransactionParams,
1290
+ type,
1291
+ gasLimit: normalizedTransactionParams.gas,
1292
+ chainId,
1293
+ };
1294
+ const { from } = updatedTransactionParams;
1295
+ const unsignedTransaction = (0, prepare_1.prepareTransaction)(chainId, updatedTransactionParams);
1296
+ const signedTransaction = await __classPrivateFieldGet(this, _TransactionController_sign, "f").call(this, unsignedTransaction, from);
1297
+ const rawTransaction = (0, prepare_1.serializeTransaction)(signedTransaction);
1298
+ return rawTransaction;
1299
+ }, _TransactionController_addMetadata = function _TransactionController_addMetadata(transactionMeta) {
1300
+ (0, validation_1.validateTxParams)(transactionMeta.txParams);
1301
+ this.update((state) => {
1302
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, [
1303
+ ...state.transactions,
1304
+ transactionMeta,
1305
+ ]);
1306
+ });
1307
+ }, _TransactionController_updateGasProperties = async function _TransactionController_updateGasProperties(transactionMeta, { traceContext } = {}) {
1308
+ const isEIP1559Compatible = transactionMeta.txParams.type !== types_1.TransactionEnvelopeType.legacy &&
1309
+ (await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEIP1559Compatibility).call(this, transactionMeta.networkClientId));
1310
+ const { networkClientId } = transactionMeta;
1311
+ const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1312
+ const provider = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getProvider).call(this, { networkClientId });
1313
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Gas', parentContext: traceContext }, async () => {
1314
+ await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateGasEstimate).call(this, transactionMeta);
1315
+ });
1316
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Gas Fees', parentContext: traceContext }, async () => await (0, gas_fees_1.updateGasFees)({
1317
+ eip1559: isEIP1559Compatible,
1318
+ ethQuery,
1319
+ gasFeeFlows: __classPrivateFieldGet(this, _TransactionController_gasFeeFlows, "f"),
1320
+ getGasFeeEstimates: __classPrivateFieldGet(this, _TransactionController_getGasFeeEstimates, "f"),
1321
+ getSavedGasFees: __classPrivateFieldGet(this, _TransactionController_getSavedGasFees, "f").bind(this),
1322
+ messenger: this.messagingSystem,
1323
+ txMeta: transactionMeta,
1324
+ }));
1325
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Update Layer 1 Gas Fees', parentContext: traceContext }, async () => await (0, layer1_gas_fee_flow_1.updateTransactionLayer1GasFee)({
1326
+ layer1GasFeeFlows: __classPrivateFieldGet(this, _TransactionController_layer1GasFeeFlows, "f"),
1327
+ messenger: this.messagingSystem,
1328
+ provider,
1329
+ transactionMeta,
1330
+ }));
1331
+ }, _TransactionController_onBootCleanup = function _TransactionController_onBootCleanup() {
1332
+ this.clearUnapprovedTransactions();
1333
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failIncompleteTransactions).call(this);
1334
+ }, _TransactionController_failIncompleteTransactions = function _TransactionController_failIncompleteTransactions() {
1335
+ const incompleteTransactions = this.state.transactions.filter((transaction) => [types_1.TransactionStatus.approved, types_1.TransactionStatus.signed].includes(transaction.status));
1336
+ for (const transactionMeta of incompleteTransactions) {
1337
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).call(this, transactionMeta, new Error('Transaction incomplete at startup'));
1338
+ }
1339
+ }, _TransactionController_processApproval = async function _TransactionController_processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1340
+ const transactionId = transactionMeta.id;
1341
+ let resultCallbacks;
1342
+ const { meta, isCompleted } = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isTransactionCompleted).call(this, transactionId);
1343
+ const finishedPromise = isCompleted
1344
+ ? Promise.resolve(meta)
1345
+ : __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_waitForTransactionFinished).call(this, transactionId);
1346
+ if (meta && !isExisting && !isCompleted) {
1347
+ try {
1348
+ if (requireApproval !== false) {
1349
+ const acceptResult = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Await Approval', parentContext: traceContext }, (context) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_requestApproval).call(this, transactionMeta, {
1350
+ shouldShowRequest,
1351
+ traceContext: context,
1352
+ }));
1353
+ resultCallbacks = acceptResult.resultCallbacks;
1354
+ const approvalValue = acceptResult.value;
1355
+ const updatedTransaction = approvalValue?.txMeta;
1356
+ if (updatedTransaction) {
1357
+ (0, logger_1.projectLogger)('Updating transaction with approval data', {
1358
+ customNonce: updatedTransaction.customNonceValue,
1359
+ params: updatedTransaction.txParams,
1360
+ });
1361
+ this.updateTransaction(updatedTransaction, 'TransactionController#processApproval - Updated with approval data');
1362
+ }
1363
+ }
1364
+ const { isCompleted: isTxCompleted } = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isTransactionCompleted).call(this, transactionId);
1365
+ if (!isTxCompleted) {
1366
+ const approvalResult = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_approveTransaction).call(this, transactionId, traceContext, publishHook);
1367
+ if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1368
+ resultCallbacks) {
1369
+ resultCallbacks.success();
1370
+ }
1371
+ const updatedTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1372
+ this.messagingSystem.publish(`${controllerName}:transactionApproved`, {
1373
+ transactionMeta: updatedTransactionMeta,
1374
+ actionId,
1375
+ });
1376
+ }
1377
+ }
1378
+ catch (rawError) {
1379
+ const error = rawError;
1380
+ const { isCompleted: isTxCompleted } = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isTransactionCompleted).call(this, transactionId);
1381
+ if (!isTxCompleted) {
1382
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isRejectError).call(this, error)) {
1383
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransactionAndThrow).call(this, transactionId, actionId, error);
1384
+ }
1385
+ else {
1386
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).call(this, meta, error, actionId);
1387
+ }
1388
+ }
1389
+ }
1390
+ }
1391
+ const finalMeta = await finishedPromise;
1392
+ switch (finalMeta?.status) {
1393
+ case types_1.TransactionStatus.failed:
1394
+ const error = finalMeta.error;
1395
+ resultCallbacks?.error(error);
1396
+ throw rpc_errors_1.rpcErrors.internal(error.message);
1397
+ case types_1.TransactionStatus.submitted:
1398
+ resultCallbacks?.success();
1399
+ return finalMeta.hash;
1400
+ default:
1401
+ const internalError = rpc_errors_1.rpcErrors.internal(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finalMeta || transactionId)}`);
1402
+ resultCallbacks?.error(internalError);
1403
+ throw internalError;
1404
+ }
1405
+ }, _TransactionController_approveTransaction =
1406
+ /**
1407
+ * Approves a transaction and updates it's status in state. If this is not a
1408
+ * retry transaction, a nonce will be generated. The transaction is signed
1409
+ * using the sign configuration property, then published to the blockchain.
1410
+ * A `<tx.id>:finished` hub event is fired after success or failure.
1411
+ *
1412
+ * @param transactionId - The ID of the transaction to approve.
1413
+ * @param traceContext - The parent context for any new traces.
1414
+ * @param publishHookOverride - Custom logic to publish the transaction.
1415
+ * @returns The state of the approval.
1416
+ */
1417
+ async function _TransactionController_approveTransaction(transactionId, traceContext, publishHookOverride) {
1418
+ let clearApprovingTransactionId;
1419
+ let clearNonceLock;
1420
+ let transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransactionOrThrow).call(this, transactionId);
1421
+ (0, logger_1.projectLogger)('Approving transaction', transactionMeta);
1422
+ try {
1423
+ if (!__classPrivateFieldGet(this, _TransactionController_sign, "f")) {
1424
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).call(this, transactionMeta, new Error('No sign method defined.'));
1425
+ return ApprovalState.NotApproved;
1426
+ }
1427
+ else if (!transactionMeta.chainId) {
1428
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).call(this, transactionMeta, new Error('No chainId defined.'));
1429
+ return ApprovalState.NotApproved;
1430
+ }
1431
+ if (__classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").has(transactionId)) {
1432
+ (0, logger_1.projectLogger)('Skipping approval as signing in progress', transactionId);
1433
+ return ApprovalState.NotApproved;
1434
+ }
1435
+ __classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").add(transactionId);
1436
+ clearApprovingTransactionId = () => __classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").delete(transactionId);
1437
+ const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1438
+ clearNonceLock = releaseNonce;
1439
+ transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1440
+ transactionId,
1441
+ note: 'TransactionController#approveTransaction - Transaction approved',
1442
+ }, (draftTxMeta) => {
1443
+ const { chainId, txParams } = draftTxMeta;
1444
+ const { gas, type } = txParams;
1445
+ draftTxMeta.status = types_1.TransactionStatus.approved;
1446
+ draftTxMeta.txParams.chainId = chainId;
1447
+ draftTxMeta.txParams.gasLimit = gas;
1448
+ draftTxMeta.txParams.nonce = nonce;
1449
+ if (!type && (0, utils_2.isEIP1559Transaction)(txParams)) {
1450
+ draftTxMeta.txParams.type = types_1.TransactionEnvelopeType.feeMarket;
1451
+ }
1452
+ });
1453
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, transactionMeta);
1454
+ const rawTx = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Sign', parentContext: traceContext }, () => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_signTransaction).call(this, transactionMeta));
1455
+ if (!(await __classPrivateFieldGet(this, _TransactionController_beforePublish, "f").call(this, transactionMeta))) {
1456
+ (0, logger_1.projectLogger)('Skipping publishing transaction based on hook');
1457
+ this.messagingSystem.publish(`${controllerName}:transactionPublishingSkipped`, transactionMeta);
1458
+ return ApprovalState.SkippedViaBeforePublishHook;
1459
+ }
1460
+ if (!rawTx && !transactionMeta.isExternalSign) {
1461
+ return ApprovalState.NotApproved;
1462
+ }
1463
+ const { networkClientId } = transactionMeta;
1464
+ const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1465
+ let preTxBalance;
1466
+ const shouldUpdatePreTxBalance = transactionMeta.type === types_1.TransactionType.swap;
1467
+ if (shouldUpdatePreTxBalance) {
1468
+ (0, logger_1.projectLogger)('Determining pre-transaction balance');
1469
+ preTxBalance = await (0, controller_utils_1.query)(ethQuery, 'getBalance', [
1470
+ transactionMeta.txParams.from,
1471
+ ]);
1472
+ }
1473
+ (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1474
+ let hash;
1475
+ clearNonceLock?.();
1476
+ clearNonceLock = undefined;
1477
+ if (transactionMeta.batchTransactions?.length) {
1478
+ (0, logger_1.projectLogger)('Found batch transactions', transactionMeta.batchTransactions);
1479
+ const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
1480
+ addTransactionBatch: this.addTransactionBatch.bind(this),
1481
+ transactions: transactionMeta.batchTransactions,
1482
+ });
1483
+ publishHookOverride = extraTransactionsPublishHook.getHook();
1484
+ }
1485
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
1486
+ const publishHook = publishHookOverride ?? __classPrivateFieldGet(this, _TransactionController_publish, "f");
1487
+ ({ transactionHash: hash } = await publishHook(transactionMeta, rawTx ?? '0x'));
1488
+ if (hash === undefined) {
1489
+ hash = await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_publishTransaction).call(this, ethQuery, {
1490
+ ...transactionMeta,
1491
+ rawTx,
1492
+ });
1493
+ }
1494
+ });
1495
+ (0, logger_1.projectLogger)('Publish successful', hash);
1496
+ transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1497
+ transactionId,
1498
+ note: 'TransactionController#approveTransaction - Transaction submitted',
1499
+ }, (draftTxMeta) => {
1500
+ draftTxMeta.hash = hash;
1501
+ draftTxMeta.status = types_1.TransactionStatus.submitted;
1502
+ draftTxMeta.submittedTime = new Date().getTime();
1503
+ if (shouldUpdatePreTxBalance) {
1504
+ draftTxMeta.preTxBalance = preTxBalance;
1505
+ (0, logger_1.projectLogger)('Updated pre-transaction balance', preTxBalance);
1506
+ }
1507
+ });
1508
+ this.messagingSystem.publish(`${controllerName}:transactionSubmitted`, {
1509
+ transactionMeta,
1510
+ });
1511
+ this.messagingSystem.publish(`${controllerName}:transactionFinished`, transactionMeta);
1512
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionId}:finished`, transactionMeta);
1513
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, transactionMeta);
1514
+ return ApprovalState.Approved;
1515
+ // TODO: Replace `any` with type
1516
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1517
+ }
1518
+ catch (error) {
1519
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).call(this, transactionMeta, error);
1520
+ return ApprovalState.NotApproved;
1521
+ }
1522
+ finally {
1523
+ clearApprovingTransactionId?.();
1524
+ clearNonceLock?.();
1525
+ }
1526
+ }, _TransactionController_publishTransaction = async function _TransactionController_publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
1527
+ const transactionHash = await (0, controller_utils_1.query)(ethQuery, 'sendRawTransaction', [
1528
+ transactionMeta.rawTx,
1529
+ ]);
1530
+ if (skipSubmitHistory !== true) {
1531
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateSubmitHistory).call(this, transactionMeta, transactionHash);
1532
+ }
1533
+ return transactionHash;
1832
1534
  }, _TransactionController_rejectTransaction = function _TransactionController_rejectTransaction(transactionId, actionId, error) {
1833
- const transactionMeta = this.getTransaction(transactionId);
1535
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1834
1536
  if (!transactionMeta) {
1835
1537
  return;
1836
1538
  }
@@ -1846,7 +1548,74 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1846
1548
  transactionMeta: updatedTransactionMeta,
1847
1549
  actionId,
1848
1550
  });
1849
- this.onTransactionStatusChange(updatedTransactionMeta);
1551
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, updatedTransactionMeta);
1552
+ }, _TransactionController_trimTransactionsForState = function _TransactionController_trimTransactionsForState(transactions) {
1553
+ const nonceNetworkSet = new Set();
1554
+ const txsToKeep = [...transactions]
1555
+ .sort((a, b) => (a.time > b.time ? -1 : 1)) // Descending time order
1556
+ .filter((tx) => {
1557
+ const { chainId, status, txParams, time } = tx;
1558
+ if (txParams) {
1559
+ const key = `${String(txParams.nonce)}-${(0, controller_utils_1.convertHexToDecimal)(chainId)}-${new Date(time).toDateString()}`;
1560
+ if (nonceNetworkSet.has(key)) {
1561
+ return true;
1562
+ }
1563
+ else if (nonceNetworkSet.size < __classPrivateFieldGet(this, _TransactionController_transactionHistoryLimit, "f") ||
1564
+ !__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isFinalState).call(this, status)) {
1565
+ nonceNetworkSet.add(key);
1566
+ return true;
1567
+ }
1568
+ }
1569
+ return false;
1570
+ });
1571
+ txsToKeep.reverse(); // Ascending time order
1572
+ return txsToKeep;
1573
+ }, _TransactionController_isFinalState = function _TransactionController_isFinalState(status) {
1574
+ return (status === types_1.TransactionStatus.rejected ||
1575
+ status === types_1.TransactionStatus.confirmed ||
1576
+ status === types_1.TransactionStatus.failed);
1577
+ }, _TransactionController_isLocalFinalState = function _TransactionController_isLocalFinalState(status) {
1578
+ return [
1579
+ types_1.TransactionStatus.confirmed,
1580
+ types_1.TransactionStatus.failed,
1581
+ types_1.TransactionStatus.rejected,
1582
+ types_1.TransactionStatus.submitted,
1583
+ ].includes(status);
1584
+ }, _TransactionController_requestApproval = async function _TransactionController_requestApproval(txMeta, { shouldShowRequest, traceContext, }) {
1585
+ const id = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getApprovalId).call(this, txMeta);
1586
+ const { origin } = txMeta;
1587
+ const type = controller_utils_1.ApprovalType.Transaction;
1588
+ const requestData = { txId: txMeta.id };
1589
+ await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, {
1590
+ name: 'Notification Display',
1591
+ id,
1592
+ parentContext: traceContext,
1593
+ });
1594
+ return (await this.messagingSystem.call('ApprovalController:addRequest', {
1595
+ id,
1596
+ origin: origin || controller_utils_1.ORIGIN_METAMASK,
1597
+ type,
1598
+ requestData,
1599
+ expectsResult: true,
1600
+ }, shouldShowRequest));
1601
+ }, _TransactionController_getTransaction = function _TransactionController_getTransaction(transactionId) {
1602
+ const { transactions } = this.state;
1603
+ return transactions.find(({ id }) => id === transactionId);
1604
+ }, _TransactionController_getTransactionOrThrow = function _TransactionController_getTransactionOrThrow(transactionId, errorMessagePrefix = 'TransactionController') {
1605
+ const txMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1606
+ if (!txMeta) {
1607
+ throw new Error(`${errorMessagePrefix}: No transaction found with id ${transactionId}`);
1608
+ }
1609
+ return txMeta;
1610
+ }, _TransactionController_getApprovalId = function _TransactionController_getApprovalId(txMeta) {
1611
+ return String(txMeta.id);
1612
+ }, _TransactionController_isTransactionCompleted = function _TransactionController_isTransactionCompleted(transactionId) {
1613
+ const transaction = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1614
+ if (!transaction) {
1615
+ return { meta: undefined, isCompleted: false };
1616
+ }
1617
+ const isCompleted = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isLocalFinalState).call(this, transaction.status);
1618
+ return { meta: transaction, isCompleted };
1850
1619
  }, _TransactionController_getChainId = function _TransactionController_getChainId(networkClientId) {
1851
1620
  return __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNetworkClient({ networkClientId })
1852
1621
  .configuration.chainId;
@@ -1864,8 +1633,73 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1864
1633
  chainId,
1865
1634
  networkClientId,
1866
1635
  }).provider;
1636
+ }, _TransactionController_onIncomingTransactions = function _TransactionController_onIncomingTransactions(transactions) {
1637
+ if (!transactions.length) {
1638
+ return;
1639
+ }
1640
+ const finalTransactions = transactions.map((tx) => {
1641
+ const { chainId } = tx;
1642
+ const networkClientId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNetworkClientId).call(this, { chainId });
1643
+ return {
1644
+ ...tx,
1645
+ networkClientId,
1646
+ };
1647
+ });
1648
+ this.update((state) => {
1649
+ const { transactions: currentTransactions } = state;
1650
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, [
1651
+ ...finalTransactions,
1652
+ ...currentTransactions,
1653
+ ]);
1654
+ (0, logger_1.projectLogger)('Added incoming transactions to state', finalTransactions.length, finalTransactions);
1655
+ });
1656
+ this.messagingSystem.publish(`${controllerName}:incomingTransactionsReceived`, finalTransactions);
1657
+ }, _TransactionController_generateDappSuggestedGasFees = function _TransactionController_generateDappSuggestedGasFees(txParams, origin) {
1658
+ if (!origin || origin === controller_utils_1.ORIGIN_METAMASK) {
1659
+ return undefined;
1660
+ }
1661
+ const { gasPrice, maxFeePerGas, maxPriorityFeePerGas, gas } = txParams;
1662
+ if (gasPrice === undefined &&
1663
+ maxFeePerGas === undefined &&
1664
+ maxPriorityFeePerGas === undefined &&
1665
+ gas === undefined) {
1666
+ return undefined;
1667
+ }
1668
+ const dappSuggestedGasFees = {};
1669
+ if (gasPrice !== undefined) {
1670
+ dappSuggestedGasFees.gasPrice = gasPrice;
1671
+ }
1672
+ else if (maxFeePerGas !== undefined ||
1673
+ maxPriorityFeePerGas !== undefined) {
1674
+ dappSuggestedGasFees.maxFeePerGas = maxFeePerGas;
1675
+ dappSuggestedGasFees.maxPriorityFeePerGas = maxPriorityFeePerGas;
1676
+ }
1677
+ if (gas !== undefined) {
1678
+ dappSuggestedGasFees.gas = gas;
1679
+ }
1680
+ return dappSuggestedGasFees;
1681
+ }, _TransactionController_addExternalTransaction = function _TransactionController_addExternalTransaction(transactionMeta) {
1682
+ const { chainId } = transactionMeta;
1683
+ const { transactions } = this.state;
1684
+ const fromAddress = transactionMeta?.txParams?.from;
1685
+ const sameFromAndNetworkTransactions = transactions.filter((transaction) => transaction.txParams.from === fromAddress &&
1686
+ transaction.chainId === chainId);
1687
+ const confirmedTxs = sameFromAndNetworkTransactions.filter((transaction) => transaction.status === types_1.TransactionStatus.confirmed);
1688
+ const pendingTxs = sameFromAndNetworkTransactions.filter((transaction) => transaction.status === types_1.TransactionStatus.submitted);
1689
+ (0, external_transactions_1.validateConfirmedExternalTransaction)(transactionMeta, confirmedTxs, pendingTxs);
1690
+ // Make sure provided external transaction has non empty history array
1691
+ const newTransactionMeta = (transactionMeta.history ?? []).length === 0 && !__classPrivateFieldGet(this, _TransactionController_isHistoryDisabled, "f")
1692
+ ? (0, history_1.addInitialHistorySnapshot)(transactionMeta)
1693
+ : transactionMeta;
1694
+ this.update((state) => {
1695
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, [
1696
+ ...state.transactions,
1697
+ newTransactionMeta,
1698
+ ]);
1699
+ });
1700
+ return newTransactionMeta;
1867
1701
  }, _TransactionController_markNonceDuplicatesDropped = function _TransactionController_markNonceDuplicatesDropped(transactionId) {
1868
- const transactionMeta = this.getTransaction(transactionId);
1702
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
1869
1703
  if (!transactionMeta) {
1870
1704
  return;
1871
1705
  }
@@ -1893,9 +1727,41 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1893
1727
  for (const transaction of this.state.transactions) {
1894
1728
  if (sameNonceTransactionIds.includes(transaction.id) &&
1895
1729
  transaction.status !== types_1.TransactionStatus.failed) {
1896
- this.setTransactionStatusDropped(transaction);
1730
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_setTransactionStatusDropped).call(this, transaction);
1897
1731
  }
1898
1732
  }
1733
+ }, _TransactionController_setTransactionStatusDropped = function _TransactionController_setTransactionStatusDropped(transactionMeta) {
1734
+ const updatedTransactionMeta = {
1735
+ ...transactionMeta,
1736
+ status: types_1.TransactionStatus.dropped,
1737
+ };
1738
+ this.messagingSystem.publish(`${controllerName}:transactionDropped`, {
1739
+ transactionMeta: updatedTransactionMeta,
1740
+ });
1741
+ this.updateTransaction(updatedTransactionMeta, 'TransactionController#setTransactionStatusDropped - Transaction dropped');
1742
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, updatedTransactionMeta);
1743
+ }, _TransactionController_getTransactionWithActionId = function _TransactionController_getTransactionWithActionId(actionId) {
1744
+ return this.state.transactions.find((transaction) => actionId && transaction.actionId === actionId);
1745
+ }, _TransactionController_waitForTransactionFinished = async function _TransactionController_waitForTransactionFinished(transactionId) {
1746
+ return new Promise((resolve) => {
1747
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").once(`${transactionId}:finished`, (txMeta) => {
1748
+ resolve(txMeta);
1749
+ });
1750
+ });
1751
+ }, _TransactionController_updateTransactionMetaRSV = function _TransactionController_updateTransactionMetaRSV(transactionMeta, signedTx) {
1752
+ const transactionMetaWithRsv = (0, lodash_1.cloneDeep)(transactionMeta);
1753
+ for (const key of ['r', 's', 'v']) {
1754
+ const value = signedTx[key];
1755
+ if (value === undefined || value === null) {
1756
+ continue;
1757
+ }
1758
+ transactionMetaWithRsv[key] = (0, utils_1.add0x)(value.toString(16));
1759
+ }
1760
+ return transactionMetaWithRsv;
1761
+ }, _TransactionController_getEIP1559Compatibility = async function _TransactionController_getEIP1559Compatibility(networkClientId) {
1762
+ const currentNetworkIsEIP1559Compatible = await __classPrivateFieldGet(this, _TransactionController_getCurrentNetworkEIP1559Compatibility, "f").call(this, networkClientId);
1763
+ const currentAccountIsEIP1559Compatible = await __classPrivateFieldGet(this, _TransactionController_getCurrentAccountEIP1559Compatibility, "f").call(this);
1764
+ return (currentNetworkIsEIP1559Compatible && currentAccountIsEIP1559Compatible);
1899
1765
  }, _TransactionController_signTransaction = async function _TransactionController_signTransaction(transactionMeta) {
1900
1766
  const { isExternalSign, txParams } = transactionMeta;
1901
1767
  if (isExternalSign) {
@@ -1911,45 +1777,72 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1911
1777
  transactionMeta,
1912
1778
  });
1913
1779
  const unsignedEthTx = (0, prepare_1.prepareTransaction)(transactionMeta.chainId, finalTxParams);
1914
- this.approvingTransactionIds.add(transactionMeta.id);
1780
+ __classPrivateFieldGet(this, _TransactionController_approvingTransactionIds, "f").add(transactionMeta.id);
1915
1781
  const signedTx = await new Promise((resolve, reject) => {
1916
- this.sign?.(unsignedEthTx, from, ...this.getAdditionalSignArguments(transactionMeta)).then(resolve, reject);
1917
- this.signAbortCallbacks.set(transactionMeta.id, () => reject(new Error('Signing aborted by user')));
1782
+ __classPrivateFieldGet(this, _TransactionController_sign, "f")?.call(this, unsignedEthTx, from, ...__classPrivateFieldGet(this, _TransactionController_getAdditionalSignArguments, "f").call(this, transactionMeta)).then(resolve, reject);
1783
+ __classPrivateFieldGet(this, _TransactionController_signAbortCallbacks, "f").set(transactionMeta.id, () => reject(new Error('Signing aborted by user')));
1918
1784
  });
1919
- this.signAbortCallbacks.delete(transactionMeta.id);
1785
+ __classPrivateFieldGet(this, _TransactionController_signAbortCallbacks, "f").delete(transactionMeta.id);
1920
1786
  if (!signedTx) {
1921
1787
  (0, logger_1.projectLogger)('Skipping signed status as no signed transaction');
1922
1788
  return undefined;
1923
1789
  }
1924
1790
  const transactionMetaFromHook = (0, lodash_1.cloneDeep)(transactionMeta);
1925
- if (!this.afterSign(transactionMetaFromHook, signedTx)) {
1791
+ if (!__classPrivateFieldGet(this, _TransactionController_afterSign, "f").call(this, transactionMetaFromHook, signedTx)) {
1926
1792
  this.updateTransaction(transactionMetaFromHook, 'TransactionController#signTransaction - Update after sign');
1927
1793
  (0, logger_1.projectLogger)('Skipping signed status based on hook');
1928
1794
  return undefined;
1929
1795
  }
1930
1796
  const transactionMetaWithRsv = {
1931
- ...this.updateTransactionMetaRSV(transactionMetaFromHook, signedTx),
1797
+ ...__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionMetaRSV).call(this, transactionMetaFromHook, signedTx),
1932
1798
  status: types_1.TransactionStatus.signed,
1933
1799
  txParams: finalTxParams,
1934
1800
  };
1935
1801
  this.updateTransaction(transactionMetaWithRsv, 'TransactionController#approveTransaction - Transaction signed');
1936
- this.onTransactionStatusChange(transactionMetaWithRsv);
1802
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, transactionMetaWithRsv);
1937
1803
  const rawTx = (0, prepare_1.serializeTransaction)(signedTx);
1938
1804
  const transactionMetaWithRawTx = (0, lodash_1.merge)({}, transactionMetaWithRsv, {
1939
1805
  rawTx,
1940
1806
  });
1941
1807
  this.updateTransaction(transactionMetaWithRawTx, 'TransactionController#approveTransaction - RawTransaction added');
1942
1808
  return rawTx;
1809
+ }, _TransactionController_onTransactionStatusChange = function _TransactionController_onTransactionStatusChange(transactionMeta) {
1810
+ this.messagingSystem.publish(`${controllerName}:transactionStatusUpdated`, {
1811
+ transactionMeta,
1812
+ });
1813
+ }, _TransactionController_getNonceTrackerTransactions = function _TransactionController_getNonceTrackerTransactions(statuses, address, chainId) {
1814
+ return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, statuses, this.state.transactions);
1943
1815
  }, _TransactionController_onConfirmedTransaction = function _TransactionController_onConfirmedTransaction(transactionMeta) {
1944
1816
  (0, logger_1.projectLogger)('Processing confirmed transaction', transactionMeta.id);
1945
1817
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_markNonceDuplicatesDropped).call(this, transactionMeta.id);
1946
1818
  this.messagingSystem.publish(`${controllerName}:transactionConfirmed`, transactionMeta);
1947
- this.onTransactionStatusChange(transactionMeta);
1819
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, transactionMeta);
1948
1820
  // Intentional given potential duration of process.
1949
- this.updatePostBalance(transactionMeta).catch((error) => {
1821
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updatePostBalance).call(this, transactionMeta).catch((error) => {
1950
1822
  (0, logger_1.projectLogger)('Error while updating post balance', error);
1951
1823
  throw error;
1952
1824
  });
1825
+ }, _TransactionController_updatePostBalance = async function _TransactionController_updatePostBalance(transactionMeta) {
1826
+ try {
1827
+ const { networkClientId, type } = transactionMeta;
1828
+ if (type !== types_1.TransactionType.swap) {
1829
+ return;
1830
+ }
1831
+ const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId });
1832
+ const { updatedTransactionMeta, approvalTransactionMeta } = await (0, swaps_1.updatePostTransactionBalance)(transactionMeta, {
1833
+ ethQuery,
1834
+ getTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).bind(this),
1835
+ updateTransaction: this.updateTransaction.bind(this),
1836
+ });
1837
+ this.messagingSystem.publish(`${controllerName}:postTransactionBalanceUpdated`, {
1838
+ transactionMeta: updatedTransactionMeta,
1839
+ approvalTransactionMeta,
1840
+ });
1841
+ }
1842
+ catch (error) {
1843
+ /* istanbul ignore next */
1844
+ (0, logger_1.projectLogger)('Error while updating post transaction balance', error);
1845
+ }
1953
1846
  }, _TransactionController_createNonceTracker = function _TransactionController_createNonceTracker({ provider, blockTracker, chainId, }) {
1954
1847
  return new nonce_tracker_1.NonceTracker({
1955
1848
  // TODO: Fix types
@@ -1958,7 +1851,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1958
1851
  // TODO: Fix types
1959
1852
  blockTracker,
1960
1853
  getPendingTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerPendingTransactions).bind(this, chainId),
1961
- getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, [types_1.TransactionStatus.confirmed], chainId),
1854
+ getConfirmedTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerTransactions).bind(this, [types_1.TransactionStatus.confirmed], chainId),
1962
1855
  });
1963
1856
  }, _TransactionController_createPendingTransactionTracker = function _TransactionController_createPendingTransactionTracker({ provider, blockTracker, chainId, networkClientId, }) {
1964
1857
  const ethQuery = new eth_query_1.default(provider);
@@ -1973,11 +1866,11 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1973
1866
  chainId,
1974
1867
  }),
1975
1868
  messenger: this.messagingSystem,
1976
- publishTransaction: (_ethQuery, transactionMeta) => this.publishTransaction(_ethQuery, transactionMeta, {
1869
+ publishTransaction: (_ethQuery, transactionMeta) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_publishTransaction).call(this, _ethQuery, transactionMeta, {
1977
1870
  skipSubmitHistory: true,
1978
1871
  }),
1979
1872
  hooks: {
1980
- beforeCheckPendingTransaction: this.beforeCheckPendingTransaction.bind(this),
1873
+ beforeCheckPendingTransaction: __classPrivateFieldGet(this, _TransactionController_beforeCheckPendingTransaction, "f").bind(this),
1981
1874
  },
1982
1875
  });
1983
1876
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_addPendingTransactionTrackerListeners).call(this, pendingTransactionTracker);
@@ -1985,7 +1878,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1985
1878
  }, _TransactionController_stopAllTracking = function _TransactionController_stopAllTracking() {
1986
1879
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").stopAllTracking();
1987
1880
  }, _TransactionController_addIncomingTransactionHelperListeners = function _TransactionController_addIncomingTransactionHelperListeners(incomingTransactionHelper) {
1988
- incomingTransactionHelper.hub.on('transactions', this.onIncomingTransactions.bind(this));
1881
+ incomingTransactionHelper.hub.on('transactions', __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onIncomingTransactions).bind(this));
1989
1882
  }, _TransactionController_removePendingTransactionTrackerListeners = function _TransactionController_removePendingTransactionTrackerListeners(pendingTransactionTracker) {
1990
1883
  pendingTransactionTracker.hub.removeAllListeners('transaction-confirmed');
1991
1884
  pendingTransactionTracker.hub.removeAllListeners('transaction-dropped');
@@ -1993,17 +1886,30 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1993
1886
  pendingTransactionTracker.hub.removeAllListeners('transaction-updated');
1994
1887
  }, _TransactionController_addPendingTransactionTrackerListeners = function _TransactionController_addPendingTransactionTrackerListeners(pendingTransactionTracker) {
1995
1888
  pendingTransactionTracker.hub.on('transaction-confirmed', __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onConfirmedTransaction).bind(this));
1996
- pendingTransactionTracker.hub.on('transaction-dropped', this.setTransactionStatusDropped.bind(this));
1997
- pendingTransactionTracker.hub.on('transaction-failed', this.failTransaction.bind(this));
1889
+ pendingTransactionTracker.hub.on('transaction-dropped', __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_setTransactionStatusDropped).bind(this));
1890
+ pendingTransactionTracker.hub.on('transaction-failed', __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_failTransaction).bind(this));
1998
1891
  pendingTransactionTracker.hub.on('transaction-updated', this.updateTransaction.bind(this));
1999
1892
  }, _TransactionController_getNonceTrackerPendingTransactions = function _TransactionController_getNonceTrackerPendingTransactions(chainId, address) {
2000
- const standardPendingTransactions = this.getNonceTrackerTransactions([
1893
+ const standardPendingTransactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerTransactions).call(this, [
2001
1894
  types_1.TransactionStatus.approved,
2002
1895
  types_1.TransactionStatus.signed,
2003
1896
  types_1.TransactionStatus.submitted,
2004
1897
  ], address, chainId);
2005
- const externalPendingTransactions = this.getExternalPendingTransactions(address, chainId);
1898
+ const externalPendingTransactions = __classPrivateFieldGet(this, _TransactionController_getExternalPendingTransactions, "f").call(this, address, chainId);
2006
1899
  return [...standardPendingTransactions, ...externalPendingTransactions];
1900
+ }, _TransactionController_publishTransactionForRetry = async function _TransactionController_publishTransactionForRetry(ethQuery, transactionMeta) {
1901
+ try {
1902
+ return await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_publishTransaction).call(this, ethQuery, transactionMeta);
1903
+ }
1904
+ catch (error) {
1905
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isTransactionAlreadyConfirmedError).call(this, error)) {
1906
+ throw new Error('Previous transaction is already confirmed');
1907
+ }
1908
+ throw error;
1909
+ }
1910
+ }, _TransactionController_isTransactionAlreadyConfirmedError = function _TransactionController_isTransactionAlreadyConfirmedError(error) {
1911
+ return (error?.message?.includes('nonce too low') ||
1912
+ error?.data?.message?.includes('nonce too low'));
2007
1913
  }, _TransactionController_getGasFeeFlows = function _TransactionController_getGasFeeFlows() {
2008
1914
  if (__classPrivateFieldGet(this, _TransactionController_testGasFeeFlows, "f")) {
2009
1915
  return [new TestGasFeeFlow_1.TestGasFeeFlow()];
@@ -2032,13 +1938,13 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2032
1938
  if (!skipResimulateCheck && __classPrivateFieldGet(this, _TransactionController_isSimulationEnabled, "f").call(this)) {
2033
1939
  resimulateResponse = (0, ResimulateHelper_1.shouldResimulate)(originalTransactionMeta, transactionMeta);
2034
1940
  }
2035
- const shouldSkipHistory = this.isHistoryDisabled || skipHistory;
1941
+ const shouldSkipHistory = __classPrivateFieldGet(this, _TransactionController_isHistoryDisabled, "f") || skipHistory;
2036
1942
  if (!shouldSkipHistory) {
2037
1943
  transactionMeta = (0, history_1.updateTransactionHistory)(transactionMeta, note ?? 'Transaction updated');
2038
1944
  }
2039
1945
  state.transactions[index] = transactionMeta;
2040
1946
  });
2041
- const transactionMeta = this.getTransaction(transactionId);
1947
+ const transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
2042
1948
  if (resimulateResponse?.resimulate) {
2043
1949
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateSimulationData).call(this, transactionMeta, {
2044
1950
  blockTime: resimulateResponse.blockTime,
@@ -2071,7 +1977,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2071
1977
  try {
2072
1978
  const { count } = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Account Address Relationship', parentContext: traceContext }, () => (0, accounts_api_1.getAccountAddressRelationship)(request));
2073
1979
  const isFirstTimeInteraction = count === undefined ? undefined : count === 0;
2074
- const finalTransactionMeta = this.getTransaction(transactionId);
1980
+ const finalTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
2075
1981
  /* istanbul ignore if */
2076
1982
  if (!finalTransactionMeta) {
2077
1983
  (0, logger_1.projectLogger)('Cannot update first time interaction as transaction not found', transactionId);
@@ -2126,7 +2032,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2126
2032
  };
2127
2033
  }
2128
2034
  }
2129
- const finalTransactionMeta = this.getTransaction(transactionId);
2035
+ const finalTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getTransaction).call(this, transactionId);
2130
2036
  /* istanbul ignore if */
2131
2037
  if (!finalTransactionMeta) {
2132
2038
  (0, logger_1.projectLogger)('Cannot update simulation data as transaction not found', transactionId, simulationData);
@@ -2147,7 +2053,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2147
2053
  txMeta,
2148
2054
  gasFeeEstimates,
2149
2055
  gasFeeEstimatesLoaded,
2150
- isTxParamsGasFeeUpdatesEnabled: this.isTxParamsGasFeeUpdatesEnabled,
2056
+ isTxParamsGasFeeUpdatesEnabled: __classPrivateFieldGet(this, _TransactionController_isAutomaticGasFeeUpdateEnabled, "f"),
2151
2057
  layer1GasFee,
2152
2058
  });
2153
2059
  });
@@ -2160,7 +2066,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2160
2066
  .map((account) => account.address);
2161
2067
  }, _TransactionController_updateSubmitHistory = function _TransactionController_updateSubmitHistory(transactionMeta, hash) {
2162
2068
  const { chainId, networkClientId, origin, rawTx, txParams } = transactionMeta;
2163
- const { networkConfigurationsByChainId } = this.getNetworkState();
2069
+ const { networkConfigurationsByChainId } = __classPrivateFieldGet(this, _TransactionController_getNetworkState, "f").call(this);
2164
2070
  const networkConfiguration = networkConfigurationsByChainId[chainId];
2165
2071
  const endpoint = networkConfiguration?.rpcEndpoints.find((currentEndpoint) => currentEndpoint.networkClientId === networkClientId);
2166
2072
  const networkUrl = endpoint?.url;
@@ -2201,7 +2107,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2201
2107
  }, _TransactionController_deleteTransaction = function _TransactionController_deleteTransaction(transactionId) {
2202
2108
  this.update((state) => {
2203
2109
  const transactions = state.transactions.filter(({ id }) => id !== transactionId);
2204
- state.transactions = this.trimTransactionsForState(transactions);
2110
+ state.transactions = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_trimTransactionsForState).call(this, transactions);
2205
2111
  });
2206
2112
  }, _TransactionController_isRejectError = function _TransactionController_isRejectError(error) {
2207
2113
  return [
@@ -2217,5 +2123,33 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2217
2123
  });
2218
2124
  }
2219
2125
  throw error;
2126
+ }, _TransactionController_failTransaction = function _TransactionController_failTransaction(transactionMeta, error, actionId) {
2127
+ let newTransactionMeta;
2128
+ try {
2129
+ newTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2130
+ transactionId: transactionMeta.id,
2131
+ note: 'TransactionController#failTransaction - Add error message and set status to failed',
2132
+ skipValidation: true,
2133
+ }, (draftTransactionMeta) => {
2134
+ draftTransactionMeta.status = types_1.TransactionStatus.failed;
2135
+ draftTransactionMeta.error = (0, utils_2.normalizeTxError)(error);
2136
+ });
2137
+ }
2138
+ catch (err) {
2139
+ (0, logger_1.projectLogger)('Failed to mark transaction as failed', err);
2140
+ newTransactionMeta = {
2141
+ ...transactionMeta,
2142
+ status: types_1.TransactionStatus.failed,
2143
+ error: (0, utils_2.normalizeTxError)(error),
2144
+ };
2145
+ }
2146
+ this.messagingSystem.publish(`${controllerName}:transactionFailed`, {
2147
+ actionId,
2148
+ error: error.message,
2149
+ transactionMeta: newTransactionMeta,
2150
+ });
2151
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_onTransactionStatusChange).call(this, newTransactionMeta);
2152
+ this.messagingSystem.publish(`${controllerName}:transactionFinished`, newTransactionMeta);
2153
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, newTransactionMeta);
2220
2154
  };
2221
2155
  //# sourceMappingURL=TransactionController.cjs.map