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