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