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