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