@metamask-previews/transaction-controller 46.0.0-preview-5b37150f → 46.0.0-preview-def92ff7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -1
- package/dist/TransactionController.cjs +17 -54
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +2 -20
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +2 -20
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +17 -54
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -71
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -71
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/batch.cjs +2 -129
- package/dist/utils/batch.cjs.map +1 -1
- package/dist/utils/batch.d.cts +1 -8
- package/dist/utils/batch.d.cts.map +1 -1
- package/dist/utils/batch.d.mts +1 -8
- package/dist/utils/batch.d.mts.map +1 -1
- package/dist/utils/batch.mjs +2 -129
- package/dist/utils/batch.mjs.map +1 -1
- package/dist/utils/validation.cjs +1 -19
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.cts +0 -12
- package/dist/utils/validation.d.cts.map +1 -1
- package/dist/utils/validation.d.mts +0 -12
- package/dist/utils/validation.d.mts.map +1 -1
- package/dist/utils/validation.mjs +0 -17
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +4 -4
- package/dist/hooks/CollectPublishHook.cjs +0 -84
- package/dist/hooks/CollectPublishHook.cjs.map +0 -1
- package/dist/hooks/CollectPublishHook.d.cts +0 -29
- package/dist/hooks/CollectPublishHook.d.cts.map +0 -1
- package/dist/hooks/CollectPublishHook.d.mts +0 -29
- package/dist/hooks/CollectPublishHook.d.mts.map +0 -1
- package/dist/hooks/CollectPublishHook.mjs +0 -80
- package/dist/hooks/CollectPublishHook.mjs.map +0 -1
- package/dist/hooks/ExtraTransactionsPublishHook.cjs +0 -76
- package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +0 -1
- package/dist/hooks/ExtraTransactionsPublishHook.d.cts +0 -18
- package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +0 -1
- package/dist/hooks/ExtraTransactionsPublishHook.d.mts +0 -18
- package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +0 -1
- package/dist/hooks/ExtraTransactionsPublishHook.mjs +0 -72
- package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -24,7 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
24
24
|
|
|
25
25
|
### Changed
|
|
26
26
|
|
|
27
|
-
- Throw if `addTransactionBatch` is called with any nested transaction with `to` matching internal account ([#5369](https://github.com/MetaMask/core/pull/5369))
|
|
28
27
|
- **BREAKING:** Support atomic batch transactions ([#5306](https://github.com/MetaMask/core/pull/5306))
|
|
29
28
|
- Require `AccountsController:getState` action permission in messenger.
|
|
30
29
|
- Require `RemoteFeatureFlagController:getState` action permission in messenger.
|
|
@@ -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,
|
|
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;
|
|
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,6 +23,7 @@ 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");
|
|
26
27
|
// This package purposefully relies on Node's EventEmitter module.
|
|
27
28
|
// eslint-disable-next-line import-x/no-nodejs-modules
|
|
28
29
|
const events_1 = require("events");
|
|
@@ -41,7 +42,6 @@ const MethodDataHelper_1 = require("./helpers/MethodDataHelper.cjs");
|
|
|
41
42
|
const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.cjs");
|
|
42
43
|
const PendingTransactionTracker_1 = require("./helpers/PendingTransactionTracker.cjs");
|
|
43
44
|
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");
|
|
@@ -192,11 +192,11 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
192
192
|
_TransactionController_internalEvents.set(this, new events_1.EventEmitter());
|
|
193
193
|
this.approvingTransactionIds = new Set();
|
|
194
194
|
_TransactionController_methodDataHelper.set(this, void 0);
|
|
195
|
+
this.mutex = new async_mutex_1.Mutex();
|
|
195
196
|
_TransactionController_incomingTransactionChainIds.set(this, new Set());
|
|
196
197
|
_TransactionController_incomingTransactionHelper.set(this, void 0);
|
|
197
198
|
_TransactionController_incomingTransactionOptions.set(this, void 0);
|
|
198
199
|
_TransactionController_pendingTransactionOptions.set(this, void 0);
|
|
199
|
-
_TransactionController_publishBatchHook.set(this, void 0);
|
|
200
200
|
this.signAbortCallbacks = new Map();
|
|
201
201
|
_TransactionController_trace.set(this, void 0);
|
|
202
202
|
_TransactionController_transactionHistoryLimit.set(this, void 0);
|
|
@@ -227,7 +227,6 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
227
227
|
this.securityProviderRequest = securityProviderRequest;
|
|
228
228
|
__classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
|
|
229
229
|
__classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
|
|
230
|
-
__classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
|
|
231
230
|
__classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
|
|
232
231
|
this.sign = sign;
|
|
233
232
|
__classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
|
|
@@ -341,12 +340,8 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
341
340
|
addTransaction: this.addTransaction.bind(this),
|
|
342
341
|
getChainId: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).bind(this),
|
|
343
342
|
getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
|
|
344
|
-
getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
|
|
345
|
-
getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
|
|
346
343
|
messenger: this.messagingSystem,
|
|
347
|
-
publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
|
|
348
344
|
request,
|
|
349
|
-
updateTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).bind(this),
|
|
350
345
|
});
|
|
351
346
|
}
|
|
352
347
|
/**
|
|
@@ -370,12 +365,10 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
370
365
|
* @param txParams - Standard parameters for an Ethereum transaction.
|
|
371
366
|
* @param options - Additional options to control how the transaction is added.
|
|
372
367
|
* @param options.actionId - Unique ID to prevent duplicate requests.
|
|
373
|
-
* @param options.batchId - ID of the batch this transaction belongs to.
|
|
374
368
|
* @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.
|
|
375
369
|
* @param options.method - RPC method that requested the transaction.
|
|
376
370
|
* @param options.nestedTransactions - Params for any nested transactions encoded in the data.
|
|
377
371
|
* @param options.origin - The origin of the transaction request, such as a dApp hostname.
|
|
378
|
-
* @param options.publishHook - Custom logic to publish the transaction.
|
|
379
372
|
* @param options.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.
|
|
380
373
|
* @param options.securityAlertResponse - Response from security validator.
|
|
381
374
|
* @param options.sendFlowHistory - The sendFlowHistory entries to add.
|
|
@@ -389,7 +382,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
389
382
|
*/
|
|
390
383
|
async addTransaction(txParams, options) {
|
|
391
384
|
(0, logger_1.projectLogger)('Adding transaction', txParams, options);
|
|
392
|
-
const { actionId,
|
|
385
|
+
const { actionId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
|
|
393
386
|
txParams = (0, utils_2.normalizeTransactionParams)(txParams);
|
|
394
387
|
if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
|
|
395
388
|
throw new Error(`Network client not found - ${networkClientId}`);
|
|
@@ -423,7 +416,6 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
423
416
|
: {
|
|
424
417
|
// Add actionId to txMeta to check if same actionId is seen again
|
|
425
418
|
actionId,
|
|
426
|
-
batchId,
|
|
427
419
|
chainId,
|
|
428
420
|
dappSuggestedGasFees,
|
|
429
421
|
deviceConfirmedOn,
|
|
@@ -484,10 +476,9 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
484
476
|
}
|
|
485
477
|
return {
|
|
486
478
|
result: this.processApproval(addedTransactionMeta, {
|
|
487
|
-
actionId,
|
|
488
479
|
isExisting: Boolean(existingTransactionMeta),
|
|
489
|
-
publishHook,
|
|
490
480
|
requireApproval,
|
|
481
|
+
actionId,
|
|
491
482
|
traceContext,
|
|
492
483
|
}),
|
|
493
484
|
transactionMeta: addedTransactionMeta,
|
|
@@ -1131,22 +1122,6 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1131
1122
|
abortCallback();
|
|
1132
1123
|
this.signAbortCallbacks.delete(transactionId);
|
|
1133
1124
|
}
|
|
1134
|
-
/**
|
|
1135
|
-
* Update the batch transactions associated with a transaction.
|
|
1136
|
-
* These transactions will be submitted with the main transaction as a batch.
|
|
1137
|
-
*
|
|
1138
|
-
* @param request - The request object.
|
|
1139
|
-
* @param request.transactionId - The ID of the transaction to update.
|
|
1140
|
-
* @param request.batchTransactions - The new batch transactions.
|
|
1141
|
-
*/
|
|
1142
|
-
updateBatchTransactions({ transactionId, batchTransactions, }) {
|
|
1143
|
-
__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
|
|
1144
|
-
transactionId,
|
|
1145
|
-
note: 'TransactionController#updateBatchTransactions - Batch transactions updated',
|
|
1146
|
-
}, (transactionMeta) => {
|
|
1147
|
-
transactionMeta.batchTransactions = batchTransactions;
|
|
1148
|
-
});
|
|
1149
|
-
}
|
|
1150
1125
|
addMetadata(transactionMeta) {
|
|
1151
1126
|
(0, validation_1.validateTxParams)(transactionMeta.txParams);
|
|
1152
1127
|
this.update((state) => {
|
|
@@ -1196,7 +1171,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1196
1171
|
this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
|
|
1197
1172
|
}
|
|
1198
1173
|
}
|
|
1199
|
-
async processApproval(transactionMeta, {
|
|
1174
|
+
async processApproval(transactionMeta, { isExisting = false, requireApproval, shouldShowRequest = true, actionId, traceContext, }) {
|
|
1200
1175
|
const transactionId = transactionMeta.id;
|
|
1201
1176
|
let resultCallbacks;
|
|
1202
1177
|
const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
|
|
@@ -1223,7 +1198,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1223
1198
|
}
|
|
1224
1199
|
const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
|
|
1225
1200
|
if (!isTxCompleted) {
|
|
1226
|
-
const approvalResult = await this.approveTransaction(transactionId, traceContext
|
|
1201
|
+
const approvalResult = await this.approveTransaction(transactionId, traceContext);
|
|
1227
1202
|
if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
|
|
1228
1203
|
resultCallbacks) {
|
|
1229
1204
|
resultCallbacks.success();
|
|
@@ -1257,7 +1232,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1257
1232
|
switch (finalMeta?.status) {
|
|
1258
1233
|
case types_1.TransactionStatus.failed:
|
|
1259
1234
|
resultCallbacks?.error(finalMeta.error);
|
|
1260
|
-
throw rpc_errors_1.rpcErrors.internal(finalMeta.error.
|
|
1235
|
+
throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
|
|
1261
1236
|
case types_1.TransactionStatus.submitted:
|
|
1262
1237
|
resultCallbacks?.success();
|
|
1263
1238
|
return finalMeta.hash;
|
|
@@ -1275,12 +1250,10 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1275
1250
|
*
|
|
1276
1251
|
* @param transactionId - The ID of the transaction to approve.
|
|
1277
1252
|
* @param traceContext - The parent context for any new traces.
|
|
1278
|
-
* @param publishHookOverride - Custom logic to publish the transaction.
|
|
1279
|
-
* @returns The approval state of the transaction.
|
|
1280
1253
|
*/
|
|
1281
|
-
async approveTransaction(transactionId, traceContext
|
|
1282
|
-
|
|
1283
|
-
|
|
1254
|
+
async approveTransaction(transactionId, traceContext) {
|
|
1255
|
+
const cleanupTasks = new Array();
|
|
1256
|
+
cleanupTasks.push(await this.mutex.acquire());
|
|
1284
1257
|
let transactionMeta = this.getTransactionOrThrow(transactionId);
|
|
1285
1258
|
try {
|
|
1286
1259
|
if (!this.sign) {
|
|
@@ -1296,9 +1269,10 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1296
1269
|
return ApprovalState.NotApproved;
|
|
1297
1270
|
}
|
|
1298
1271
|
this.approvingTransactionIds.add(transactionId);
|
|
1299
|
-
|
|
1272
|
+
cleanupTasks.push(() => this.approvingTransactionIds.delete(transactionId));
|
|
1300
1273
|
const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
|
|
1301
|
-
|
|
1274
|
+
// must set transaction to submitted/failed before releasing lock
|
|
1275
|
+
releaseNonce && cleanupTasks.push(releaseNonce);
|
|
1302
1276
|
transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
|
|
1303
1277
|
transactionId,
|
|
1304
1278
|
note: 'TransactionController#approveTransaction - Transaction approved',
|
|
@@ -1335,18 +1309,8 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1335
1309
|
}
|
|
1336
1310
|
(0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
|
|
1337
1311
|
let hash;
|
|
1338
|
-
clearNonceLock?.();
|
|
1339
|
-
clearNonceLock = undefined;
|
|
1340
|
-
if (transactionMeta.batchTransactions?.length) {
|
|
1341
|
-
const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
|
|
1342
|
-
addTransactionBatch: this.addTransactionBatch.bind(this),
|
|
1343
|
-
transactions: transactionMeta.batchTransactions,
|
|
1344
|
-
});
|
|
1345
|
-
publishHookOverride = extraTransactionsPublishHook.getHook();
|
|
1346
|
-
}
|
|
1347
1312
|
await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
|
|
1348
|
-
|
|
1349
|
-
({ transactionHash: hash } = await publishHook(transactionMeta, rawTx));
|
|
1313
|
+
({ transactionHash: hash } = await this.publish(transactionMeta, rawTx));
|
|
1350
1314
|
if (hash === undefined) {
|
|
1351
1315
|
hash = await this.publishTransaction(ethQuery, {
|
|
1352
1316
|
...transactionMeta,
|
|
@@ -1382,8 +1346,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1382
1346
|
return ApprovalState.NotApproved;
|
|
1383
1347
|
}
|
|
1384
1348
|
finally {
|
|
1385
|
-
|
|
1386
|
-
clearNonceLock?.();
|
|
1349
|
+
cleanupTasks.forEach((task) => task());
|
|
1387
1350
|
}
|
|
1388
1351
|
}
|
|
1389
1352
|
async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
|
|
@@ -1800,7 +1763,7 @@ class TransactionController extends base_controller_1.BaseController {
|
|
|
1800
1763
|
}
|
|
1801
1764
|
}
|
|
1802
1765
|
exports.TransactionController = TransactionController;
|
|
1803
|
-
_TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionChainIds = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(),
|
|
1766
|
+
_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, }) {
|
|
1804
1767
|
// If transaction is found for same action id, do not create a new transaction.
|
|
1805
1768
|
if (this.getTransactionWithActionId(actionId)) {
|
|
1806
1769
|
return;
|