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