@metamask-previews/transaction-controller 46.0.0-preview-edbe12d8 → 46.0.0-preview-fefdb711

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 (185) hide show
  1. package/dist/TransactionController.cjs +70 -47
  2. package/dist/TransactionController.cjs.map +1 -1
  3. package/dist/TransactionController.d.cts +65 -70
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts +65 -70
  6. package/dist/TransactionController.d.mts.map +1 -1
  7. package/dist/TransactionController.mjs +70 -47
  8. package/dist/TransactionController.mjs.map +1 -1
  9. package/dist/api/accounts-api.cjs +2 -0
  10. package/dist/api/accounts-api.cjs.map +1 -1
  11. package/dist/api/accounts-api.d.cts +2 -0
  12. package/dist/api/accounts-api.d.cts.map +1 -1
  13. package/dist/api/accounts-api.d.mts +2 -0
  14. package/dist/api/accounts-api.d.mts.map +1 -1
  15. package/dist/api/accounts-api.mjs +2 -0
  16. package/dist/api/accounts-api.mjs.map +1 -1
  17. package/dist/gas-flows/LineaGasFeeFlow.cjs +1 -1
  18. package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -1
  19. package/dist/gas-flows/LineaGasFeeFlow.d.cts.map +1 -1
  20. package/dist/gas-flows/LineaGasFeeFlow.d.mts.map +1 -1
  21. package/dist/gas-flows/LineaGasFeeFlow.mjs +1 -1
  22. package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -1
  23. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +1 -1
  24. package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -1
  25. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts +1 -1
  26. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -1
  27. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +1 -1
  28. package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -1
  29. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +1 -1
  30. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -1
  31. package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs +1 -1
  32. package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs.map +1 -1
  33. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts +1 -1
  34. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts.map +1 -1
  35. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts +1 -1
  36. package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts.map +1 -1
  37. package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs +1 -1
  38. package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs.map +1 -1
  39. package/dist/helpers/GasFeePoller.cjs +1 -0
  40. package/dist/helpers/GasFeePoller.cjs.map +1 -1
  41. package/dist/helpers/GasFeePoller.d.cts +1 -0
  42. package/dist/helpers/GasFeePoller.d.cts.map +1 -1
  43. package/dist/helpers/GasFeePoller.d.mts +1 -0
  44. package/dist/helpers/GasFeePoller.d.mts.map +1 -1
  45. package/dist/helpers/GasFeePoller.mjs +1 -0
  46. package/dist/helpers/GasFeePoller.mjs.map +1 -1
  47. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  48. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  49. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  50. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  51. package/dist/helpers/MethodDataHelper.cjs.map +1 -1
  52. package/dist/helpers/MethodDataHelper.d.cts.map +1 -1
  53. package/dist/helpers/MethodDataHelper.d.mts.map +1 -1
  54. package/dist/helpers/MethodDataHelper.mjs.map +1 -1
  55. package/dist/helpers/MultichainTrackingHelper.cjs +1 -21
  56. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  57. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  58. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  59. package/dist/helpers/MultichainTrackingHelper.mjs +1 -21
  60. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  61. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  62. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  63. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  64. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  65. package/dist/helpers/TransactionPoller.cjs +2 -0
  66. package/dist/helpers/TransactionPoller.cjs.map +1 -1
  67. package/dist/helpers/TransactionPoller.d.cts +2 -0
  68. package/dist/helpers/TransactionPoller.d.cts.map +1 -1
  69. package/dist/helpers/TransactionPoller.d.mts +2 -0
  70. package/dist/helpers/TransactionPoller.d.mts.map +1 -1
  71. package/dist/helpers/TransactionPoller.mjs +2 -0
  72. package/dist/helpers/TransactionPoller.mjs.map +1 -1
  73. package/dist/hooks/CollectPublishHook.cjs +84 -0
  74. package/dist/hooks/CollectPublishHook.cjs.map +1 -0
  75. package/dist/hooks/CollectPublishHook.d.cts +29 -0
  76. package/dist/hooks/CollectPublishHook.d.cts.map +1 -0
  77. package/dist/hooks/CollectPublishHook.d.mts +29 -0
  78. package/dist/hooks/CollectPublishHook.d.mts.map +1 -0
  79. package/dist/hooks/CollectPublishHook.mjs +80 -0
  80. package/dist/hooks/CollectPublishHook.mjs.map +1 -0
  81. package/dist/hooks/ExtraTransactionsPublishHook.cjs +84 -0
  82. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -0
  83. package/dist/hooks/ExtraTransactionsPublishHook.d.cts +18 -0
  84. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +1 -0
  85. package/dist/hooks/ExtraTransactionsPublishHook.d.mts +18 -0
  86. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +1 -0
  87. package/dist/hooks/ExtraTransactionsPublishHook.mjs +80 -0
  88. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -0
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.d.cts +1 -1
  91. package/dist/index.d.cts.map +1 -1
  92. package/dist/index.d.mts +1 -1
  93. package/dist/index.d.mts.map +1 -1
  94. package/dist/index.mjs.map +1 -1
  95. package/dist/types.cjs.map +1 -1
  96. package/dist/types.d.cts +74 -0
  97. package/dist/types.d.cts.map +1 -1
  98. package/dist/types.d.mts +74 -0
  99. package/dist/types.d.mts.map +1 -1
  100. package/dist/types.mjs.map +1 -1
  101. package/dist/utils/batch.cjs +123 -1
  102. package/dist/utils/batch.cjs.map +1 -1
  103. package/dist/utils/batch.d.cts +7 -1
  104. package/dist/utils/batch.d.cts.map +1 -1
  105. package/dist/utils/batch.d.mts +7 -1
  106. package/dist/utils/batch.d.mts.map +1 -1
  107. package/dist/utils/batch.mjs +123 -1
  108. package/dist/utils/batch.mjs.map +1 -1
  109. package/dist/utils/gas-fees.cjs +48 -3
  110. package/dist/utils/gas-fees.cjs.map +1 -1
  111. package/dist/utils/gas-fees.d.cts +11 -0
  112. package/dist/utils/gas-fees.d.cts.map +1 -1
  113. package/dist/utils/gas-fees.d.mts +11 -0
  114. package/dist/utils/gas-fees.d.mts.map +1 -1
  115. package/dist/utils/gas-fees.mjs +48 -3
  116. package/dist/utils/gas-fees.mjs.map +1 -1
  117. package/dist/utils/gas-flow.cjs +4 -0
  118. package/dist/utils/gas-flow.cjs.map +1 -1
  119. package/dist/utils/gas-flow.d.cts +1 -0
  120. package/dist/utils/gas-flow.d.cts.map +1 -1
  121. package/dist/utils/gas-flow.d.mts +1 -0
  122. package/dist/utils/gas-flow.d.mts.map +1 -1
  123. package/dist/utils/gas-flow.mjs +4 -0
  124. package/dist/utils/gas-flow.mjs.map +1 -1
  125. package/dist/utils/gas.cjs +50 -1
  126. package/dist/utils/gas.cjs.map +1 -1
  127. package/dist/utils/gas.d.cts +22 -0
  128. package/dist/utils/gas.d.cts.map +1 -1
  129. package/dist/utils/gas.d.mts +22 -0
  130. package/dist/utils/gas.d.mts.map +1 -1
  131. package/dist/utils/gas.mjs +50 -1
  132. package/dist/utils/gas.mjs.map +1 -1
  133. package/dist/utils/layer1-gas-fee-flow.cjs +5 -1
  134. package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -1
  135. package/dist/utils/layer1-gas-fee-flow.d.cts +4 -1
  136. package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -1
  137. package/dist/utils/layer1-gas-fee-flow.d.mts +4 -1
  138. package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -1
  139. package/dist/utils/layer1-gas-fee-flow.mjs +5 -1
  140. package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -1
  141. package/dist/utils/nonce.cjs +3 -3
  142. package/dist/utils/nonce.cjs.map +1 -1
  143. package/dist/utils/nonce.d.cts +2 -2
  144. package/dist/utils/nonce.d.cts.map +1 -1
  145. package/dist/utils/nonce.d.mts +2 -2
  146. package/dist/utils/nonce.d.mts.map +1 -1
  147. package/dist/utils/nonce.mjs +3 -3
  148. package/dist/utils/nonce.mjs.map +1 -1
  149. package/dist/utils/retry.cjs +4 -0
  150. package/dist/utils/retry.cjs.map +1 -1
  151. package/dist/utils/retry.d.cts +1 -0
  152. package/dist/utils/retry.d.cts.map +1 -1
  153. package/dist/utils/retry.d.mts +1 -0
  154. package/dist/utils/retry.d.mts.map +1 -1
  155. package/dist/utils/retry.mjs +4 -0
  156. package/dist/utils/retry.mjs.map +1 -1
  157. package/dist/utils/simulation-api.cjs +6 -0
  158. package/dist/utils/simulation-api.cjs.map +1 -1
  159. package/dist/utils/simulation-api.d.cts +2 -0
  160. package/dist/utils/simulation-api.d.cts.map +1 -1
  161. package/dist/utils/simulation-api.d.mts +2 -0
  162. package/dist/utils/simulation-api.d.mts.map +1 -1
  163. package/dist/utils/simulation-api.mjs +6 -0
  164. package/dist/utils/simulation-api.mjs.map +1 -1
  165. package/dist/utils/simulation.cjs +19 -5
  166. package/dist/utils/simulation.cjs.map +1 -1
  167. package/dist/utils/simulation.d.cts +3 -1
  168. package/dist/utils/simulation.d.cts.map +1 -1
  169. package/dist/utils/simulation.d.mts +3 -1
  170. package/dist/utils/simulation.d.mts.map +1 -1
  171. package/dist/utils/simulation.mjs +19 -5
  172. package/dist/utils/simulation.mjs.map +1 -1
  173. package/dist/utils/swaps.cjs +2 -1
  174. package/dist/utils/swaps.cjs.map +1 -1
  175. package/dist/utils/swaps.d.cts +1 -0
  176. package/dist/utils/swaps.d.cts.map +1 -1
  177. package/dist/utils/swaps.d.mts +1 -0
  178. package/dist/utils/swaps.d.mts.map +1 -1
  179. package/dist/utils/swaps.mjs +2 -1
  180. package/dist/utils/swaps.mjs.map +1 -1
  181. package/dist/utils/transaction-type.cjs +3 -1
  182. package/dist/utils/transaction-type.cjs.map +1 -1
  183. package/dist/utils/transaction-type.mjs +3 -1
  184. package/dist/utils/transaction-type.mjs.map +1 -1
  185. package/package.json +1 -1
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _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;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publishBatchHook, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _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;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = void 0;
19
19
  const base_controller_1 = require("@metamask/base-controller");
@@ -23,7 +23,6 @@ const network_controller_1 = require("@metamask/network-controller");
23
23
  const nonce_tracker_1 = require("@metamask/nonce-tracker");
24
24
  const rpc_errors_1 = require("@metamask/rpc-errors");
25
25
  const utils_1 = require("@metamask/utils");
26
- const async_mutex_1 = require("async-mutex");
27
26
  // This package purposefully relies on Node's EventEmitter module.
28
27
  // eslint-disable-next-line import-x/no-nodejs-modules
29
28
  const events_1 = require("events");
@@ -42,6 +41,7 @@ const MethodDataHelper_1 = require("./helpers/MethodDataHelper.cjs");
42
41
  const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.cjs");
43
42
  const PendingTransactionTracker_1 = require("./helpers/PendingTransactionTracker.cjs");
44
43
  const ResimulateHelper_1 = require("./helpers/ResimulateHelper.cjs");
44
+ const ExtraTransactionsPublishHook_1 = require("./hooks/ExtraTransactionsPublishHook.cjs");
45
45
  const logger_1 = require("./logger.cjs");
46
46
  const types_1 = require("./types.cjs");
47
47
  const batch_1 = require("./utils/batch.cjs");
@@ -154,31 +154,9 @@ class TransactionController extends base_controller_1.BaseController {
154
154
  * Constructs a TransactionController.
155
155
  *
156
156
  * @param options - The controller options.
157
- * @param options.disableHistory - Whether to disable storing history in transaction metadata.
158
- * @param options.disableSendFlowHistory - Explicitly disable transaction metadata history.
159
- * @param options.disableSwaps - Whether to disable additional processing on swaps transactions.
160
- * @param options.getCurrentAccountEIP1559Compatibility - Whether or not the account supports EIP-1559.
161
- * @param options.getCurrentNetworkEIP1559Compatibility - Whether or not the network supports EIP-1559.
162
- * @param options.getExternalPendingTransactions - Callback to retrieve pending transactions from external sources.
163
- * @param options.getGasFeeEstimates - Callback to retrieve gas fee estimates.
164
- * @param options.getNetworkClientRegistry - Gets the network client registry.
165
- * @param options.getNetworkState - Gets the state of the network controller.
166
- * @param options.getPermittedAccounts - Get accounts that a given origin has permissions for.
167
- * @param options.getSavedGasFees - Gets the saved gas fee config.
168
- * @param options.incomingTransactions - Configuration options for incoming transaction support.
169
- * @param options.isFirstTimeInteractionEnabled - Whether first time interaction checks are enabled.
170
- * @param options.isSimulationEnabled - Whether new transactions will be automatically simulated.
171
- * @param options.messenger - The controller messenger.
172
- * @param options.pendingTransactions - Configuration options for pending transaction support.
173
- * @param options.securityProviderRequest - A function for verifying a transaction, whether it is malicious or not.
174
- * @param options.sign - Function used to sign transactions.
175
- * @param options.state - Initial state to set on this controller.
176
- * @param options.testGasFeeFlows - Whether to use the test gas fee flow.
177
- * @param options.trace - Callback to generate trace information.
178
- * @param options.transactionHistoryLimit - Transaction history limit.
179
- * @param options.hooks - The controller hooks.
180
157
  */
181
- constructor({ disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, }) {
158
+ constructor(options) {
159
+ const { disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, } = options;
182
160
  super({
183
161
  name: controllerName,
184
162
  metadata,
@@ -192,11 +170,11 @@ class TransactionController extends base_controller_1.BaseController {
192
170
  _TransactionController_internalEvents.set(this, new events_1.EventEmitter());
193
171
  this.approvingTransactionIds = new Set();
194
172
  _TransactionController_methodDataHelper.set(this, void 0);
195
- this.mutex = new async_mutex_1.Mutex();
196
173
  _TransactionController_incomingTransactionChainIds.set(this, new Set());
197
174
  _TransactionController_incomingTransactionHelper.set(this, void 0);
198
175
  _TransactionController_incomingTransactionOptions.set(this, void 0);
199
176
  _TransactionController_pendingTransactionOptions.set(this, void 0);
177
+ _TransactionController_publishBatchHook.set(this, void 0);
200
178
  this.signAbortCallbacks = new Map();
201
179
  _TransactionController_trace.set(this, void 0);
202
180
  _TransactionController_transactionHistoryLimit.set(this, void 0);
@@ -227,6 +205,7 @@ class TransactionController extends base_controller_1.BaseController {
227
205
  this.securityProviderRequest = securityProviderRequest;
228
206
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
229
207
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
208
+ __classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
230
209
  __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
231
210
  this.sign = sign;
232
211
  __classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
@@ -341,8 +320,11 @@ class TransactionController extends base_controller_1.BaseController {
341
320
  getChainId: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).bind(this),
342
321
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
343
322
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
323
+ getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
344
324
  messenger: this.messagingSystem,
325
+ publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
345
326
  request,
327
+ updateTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).bind(this),
346
328
  });
347
329
  }
348
330
  /**
@@ -366,10 +348,12 @@ class TransactionController extends base_controller_1.BaseController {
366
348
  * @param txParams - Standard parameters for an Ethereum transaction.
367
349
  * @param options - Additional options to control how the transaction is added.
368
350
  * @param options.actionId - Unique ID to prevent duplicate requests.
351
+ * @param options.batchId - ID of the batch this transaction belongs to.
369
352
  * @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.
370
353
  * @param options.method - RPC method that requested the transaction.
371
354
  * @param options.nestedTransactions - Params for any nested transactions encoded in the data.
372
355
  * @param options.origin - The origin of the transaction request, such as a dApp hostname.
356
+ * @param options.publishHook - Custom logic to publish the transaction.
373
357
  * @param options.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.
374
358
  * @param options.securityAlertResponse - Response from security validator.
375
359
  * @param options.sendFlowHistory - The sendFlowHistory entries to add.
@@ -383,7 +367,7 @@ class TransactionController extends base_controller_1.BaseController {
383
367
  */
384
368
  async addTransaction(txParams, options) {
385
369
  (0, logger_1.projectLogger)('Adding transaction', txParams, options);
386
- const { actionId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
370
+ const { actionId, batchId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, publishHook, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
387
371
  txParams = (0, utils_2.normalizeTransactionParams)(txParams);
388
372
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
389
373
  throw new Error(`Network client not found - ${networkClientId}`);
@@ -417,6 +401,7 @@ class TransactionController extends base_controller_1.BaseController {
417
401
  : {
418
402
  // Add actionId to txMeta to check if same actionId is seen again
419
403
  actionId,
404
+ batchId,
420
405
  chainId,
421
406
  dappSuggestedGasFees,
422
407
  deviceConfirmedOn,
@@ -477,9 +462,10 @@ class TransactionController extends base_controller_1.BaseController {
477
462
  }
478
463
  return {
479
464
  result: this.processApproval(addedTransactionMeta, {
465
+ actionId,
480
466
  isExisting: Boolean(existingTransactionMeta),
467
+ publishHook,
481
468
  requireApproval,
482
- actionId,
483
469
  traceContext,
484
470
  }),
485
471
  transactionMeta: addedTransactionMeta,
@@ -513,7 +499,7 @@ class TransactionController extends base_controller_1.BaseController {
513
499
  * @param options.estimatedBaseFee - The estimated base fee of the transaction.
514
500
  */
515
501
  async stopTransaction(transactionId, gasValues, { estimatedBaseFee, actionId, } = {}) {
516
- return await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_retryTransaction).call(this, {
502
+ await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_retryTransaction).call(this, {
517
503
  actionId,
518
504
  estimatedBaseFee,
519
505
  gasValues,
@@ -542,7 +528,7 @@ class TransactionController extends base_controller_1.BaseController {
542
528
  * @param options.estimatedBaseFee - The estimated base fee of the transaction.
543
529
  */
544
530
  async speedUpTransaction(transactionId, gasValues, { actionId, estimatedBaseFee, } = {}) {
545
- return await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_retryTransaction).call(this, {
531
+ await __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_retryTransaction).call(this, {
546
532
  actionId,
547
533
  estimatedBaseFee,
548
534
  gasValues,
@@ -575,6 +561,7 @@ class TransactionController extends base_controller_1.BaseController {
575
561
  * @param transaction - The transaction params to estimate gas for.
576
562
  * @param multiplier - The multiplier to use for the gas buffer.
577
563
  * @param networkClientId - The network client id to use for the estimate.
564
+ * @returns The buffered estimated gas and whether the estimation failed.
578
565
  */
579
566
  async estimateGasBuffered(transaction, multiplier, networkClientId) {
580
567
  const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, {
@@ -1061,6 +1048,7 @@ class TransactionController extends base_controller_1.BaseController {
1061
1048
  * @param request.transactionParams - The transaction parameters to estimate the layer 1 gas fee for.
1062
1049
  * @param request.chainId - The ID of the chain where the transaction will be executed.
1063
1050
  * @param request.networkClientId - The ID of a specific network client to process the transaction.
1051
+ * @returns The layer 1 gas fee.
1064
1052
  */
1065
1053
  async getLayer1GasFee({ transactionParams, chainId, networkClientId, }) {
1066
1054
  const provider = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getProvider).call(this, {
@@ -1123,6 +1111,23 @@ class TransactionController extends base_controller_1.BaseController {
1123
1111
  abortCallback();
1124
1112
  this.signAbortCallbacks.delete(transactionId);
1125
1113
  }
1114
+ /**
1115
+ * Update the batch transactions associated with a transaction.
1116
+ * These transactions will be submitted with the main transaction as a batch.
1117
+ *
1118
+ * @param request - The request object.
1119
+ * @param request.transactionId - The ID of the transaction to update.
1120
+ * @param request.batchTransactions - The new batch transactions.
1121
+ */
1122
+ updateBatchTransactions({ transactionId, batchTransactions, }) {
1123
+ (0, logger_1.projectLogger)('Updating batch transactions', { transactionId, batchTransactions });
1124
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1125
+ transactionId,
1126
+ note: 'TransactionController#updateBatchTransactions - Batch transactions updated',
1127
+ }, (transactionMeta) => {
1128
+ transactionMeta.batchTransactions = batchTransactions;
1129
+ });
1130
+ }
1126
1131
  addMetadata(transactionMeta) {
1127
1132
  (0, validation_1.validateTxParams)(transactionMeta.txParams);
1128
1133
  this.update((state) => {
@@ -1172,7 +1177,7 @@ class TransactionController extends base_controller_1.BaseController {
1172
1177
  this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
1173
1178
  }
1174
1179
  }
1175
- async processApproval(transactionMeta, { isExisting = false, requireApproval, shouldShowRequest = true, actionId, traceContext, }) {
1180
+ async processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1176
1181
  const transactionId = transactionMeta.id;
1177
1182
  let resultCallbacks;
1178
1183
  const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
@@ -1199,7 +1204,7 @@ class TransactionController extends base_controller_1.BaseController {
1199
1204
  }
1200
1205
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1201
1206
  if (!isTxCompleted) {
1202
- const approvalResult = await this.approveTransaction(transactionId, traceContext);
1207
+ const approvalResult = await this.approveTransaction(transactionId, traceContext, publishHook);
1203
1208
  if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1204
1209
  resultCallbacks) {
1205
1210
  resultCallbacks.success();
@@ -1233,7 +1238,7 @@ class TransactionController extends base_controller_1.BaseController {
1233
1238
  switch (finalMeta?.status) {
1234
1239
  case types_1.TransactionStatus.failed:
1235
1240
  resultCallbacks?.error(finalMeta.error);
1236
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1241
+ throw rpc_errors_1.rpcErrors.internal(finalMeta.error.stack);
1237
1242
  case types_1.TransactionStatus.submitted:
1238
1243
  resultCallbacks?.success();
1239
1244
  return finalMeta.hash;
@@ -1251,11 +1256,14 @@ class TransactionController extends base_controller_1.BaseController {
1251
1256
  *
1252
1257
  * @param transactionId - The ID of the transaction to approve.
1253
1258
  * @param traceContext - The parent context for any new traces.
1259
+ * @param publishHookOverride - Custom logic to publish the transaction.
1260
+ * @returns The state of the approval.
1254
1261
  */
1255
- async approveTransaction(transactionId, traceContext) {
1256
- const cleanupTasks = new Array();
1257
- cleanupTasks.push(await this.mutex.acquire());
1262
+ async approveTransaction(transactionId, traceContext, publishHookOverride) {
1263
+ let clearApprovingTransactionId;
1264
+ let clearNonceLock;
1258
1265
  let transactionMeta = this.getTransactionOrThrow(transactionId);
1266
+ (0, logger_1.projectLogger)('Approving transaction', transactionMeta);
1259
1267
  try {
1260
1268
  if (!this.sign) {
1261
1269
  this.failTransaction(transactionMeta, new Error('No sign method defined.'));
@@ -1270,10 +1278,9 @@ class TransactionController extends base_controller_1.BaseController {
1270
1278
  return ApprovalState.NotApproved;
1271
1279
  }
1272
1280
  this.approvingTransactionIds.add(transactionId);
1273
- cleanupTasks.push(() => this.approvingTransactionIds.delete(transactionId));
1281
+ clearApprovingTransactionId = () => this.approvingTransactionIds.delete(transactionId);
1274
1282
  const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1275
- // must set transaction to submitted/failed before releasing lock
1276
- releaseNonce && cleanupTasks.push(releaseNonce);
1283
+ clearNonceLock = releaseNonce;
1277
1284
  transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1278
1285
  transactionId,
1279
1286
  note: 'TransactionController#approveTransaction - Transaction approved',
@@ -1310,8 +1317,19 @@ class TransactionController extends base_controller_1.BaseController {
1310
1317
  }
1311
1318
  (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1312
1319
  let hash;
1320
+ clearNonceLock?.();
1321
+ clearNonceLock = undefined;
1322
+ if (transactionMeta.batchTransactions?.length) {
1323
+ (0, logger_1.projectLogger)('Found batch transactions', transactionMeta.batchTransactions);
1324
+ const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
1325
+ addTransactionBatch: this.addTransactionBatch.bind(this),
1326
+ transactions: transactionMeta.batchTransactions,
1327
+ });
1328
+ publishHookOverride = extraTransactionsPublishHook.getHook();
1329
+ }
1313
1330
  await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
1314
- ({ transactionHash: hash } = await this.publish(transactionMeta, rawTx));
1331
+ const publishHook = publishHookOverride ?? this.publish;
1332
+ ({ transactionHash: hash } = await publishHook(transactionMeta, rawTx));
1315
1333
  if (hash === undefined) {
1316
1334
  hash = await this.publishTransaction(ethQuery, {
1317
1335
  ...transactionMeta,
@@ -1347,7 +1365,8 @@ class TransactionController extends base_controller_1.BaseController {
1347
1365
  return ApprovalState.NotApproved;
1348
1366
  }
1349
1367
  finally {
1350
- cleanupTasks.forEach((task) => task());
1368
+ clearApprovingTransactionId?.();
1369
+ clearNonceLock?.();
1351
1370
  }
1352
1371
  }
1353
1372
  async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
@@ -1702,8 +1721,8 @@ class TransactionController extends base_controller_1.BaseController {
1702
1721
  transactionMeta,
1703
1722
  });
1704
1723
  }
1705
- getNonceTrackerTransactions(status, address, chainId) {
1706
- return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, status, this.state.transactions);
1724
+ getNonceTrackerTransactions(statuses, address, chainId) {
1725
+ return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, statuses, this.state.transactions);
1707
1726
  }
1708
1727
  onConfirmedTransaction(transactionMeta) {
1709
1728
  (0, logger_1.projectLogger)('Processing confirmed transaction', transactionMeta.id);
@@ -1764,7 +1783,7 @@ class TransactionController extends base_controller_1.BaseController {
1764
1783
  }
1765
1784
  }
1766
1785
  exports.TransactionController = TransactionController;
1767
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionChainIds = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = 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, }) {
1786
+ _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionChainIds = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publishBatchHook = 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, }) {
1768
1787
  // If transaction is found for same action id, do not create a new transaction.
1769
1788
  if (this.getTransactionWithActionId(actionId)) {
1770
1789
  return;
@@ -1854,7 +1873,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1854
1873
  // TODO: Fix types
1855
1874
  blockTracker,
1856
1875
  getPendingTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerPendingTransactions).bind(this, chainId),
1857
- getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, types_1.TransactionStatus.confirmed, chainId),
1876
+ getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, [types_1.TransactionStatus.confirmed], chainId),
1858
1877
  });
1859
1878
  }, _TransactionController_createPendingTransactionTracker = function _TransactionController_createPendingTransactionTracker({ provider, blockTracker, chainId, networkClientId, }) {
1860
1879
  const ethQuery = new eth_query_1.default(provider);
@@ -1893,7 +1912,11 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1893
1912
  pendingTransactionTracker.hub.on('transaction-failed', this.failTransaction.bind(this));
1894
1913
  pendingTransactionTracker.hub.on('transaction-updated', this.updateTransaction.bind(this));
1895
1914
  }, _TransactionController_getNonceTrackerPendingTransactions = function _TransactionController_getNonceTrackerPendingTransactions(chainId, address) {
1896
- const standardPendingTransactions = this.getNonceTrackerTransactions(types_1.TransactionStatus.submitted, address, chainId);
1915
+ const standardPendingTransactions = this.getNonceTrackerTransactions([
1916
+ types_1.TransactionStatus.approved,
1917
+ types_1.TransactionStatus.signed,
1918
+ types_1.TransactionStatus.submitted,
1919
+ ], address, chainId);
1897
1920
  const externalPendingTransactions = this.getExternalPendingTransactions(address, chainId);
1898
1921
  return [...standardPendingTransactions, ...externalPendingTransactions];
1899
1922
  }, _TransactionController_getGasFeeFlows = function _TransactionController_getGasFeeFlows() {