@metamask-previews/bridge-status-controller 70.0.5-preview-8e9c439 → 70.0.5-preview-4845f8918
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -10
- package/dist/bridge-status-controller.cjs +135 -197
- package/dist/bridge-status-controller.cjs.map +1 -1
- package/dist/bridge-status-controller.d.cts.map +1 -1
- package/dist/bridge-status-controller.d.mts.map +1 -1
- package/dist/bridge-status-controller.mjs +138 -200
- package/dist/bridge-status-controller.mjs.map +1 -1
- package/dist/constants.cjs +1 -2
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +0 -1
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +0 -1
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +0 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +3 -4
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +3 -4
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/bridge-status.cjs +1 -39
- package/dist/utils/bridge-status.cjs.map +1 -1
- package/dist/utils/bridge-status.d.cts +1 -2
- package/dist/utils/bridge-status.d.cts.map +1 -1
- package/dist/utils/bridge-status.d.mts +1 -2
- package/dist/utils/bridge-status.d.mts.map +1 -1
- package/dist/utils/bridge-status.mjs +1 -38
- package/dist/utils/bridge-status.mjs.map +1 -1
- package/dist/utils/history.cjs +2 -49
- package/dist/utils/history.cjs.map +1 -1
- package/dist/utils/history.d.cts +1 -12
- package/dist/utils/history.d.cts.map +1 -1
- package/dist/utils/history.d.mts +1 -12
- package/dist/utils/history.d.mts.map +1 -1
- package/dist/utils/history.mjs +2 -46
- package/dist/utils/history.mjs.map +1 -1
- package/dist/utils/metrics.cjs +2 -27
- package/dist/utils/metrics.cjs.map +1 -1
- package/dist/utils/metrics.d.cts +2 -25
- package/dist/utils/metrics.d.cts.map +1 -1
- package/dist/utils/metrics.d.mts +2 -25
- package/dist/utils/metrics.d.mts.map +1 -1
- package/dist/utils/metrics.mjs +1 -25
- package/dist/utils/metrics.mjs.map +1 -1
- package/dist/utils/network.cjs +1 -7
- package/dist/utils/network.cjs.map +1 -1
- package/dist/utils/network.d.cts +2 -4
- package/dist/utils/network.d.cts.map +1 -1
- package/dist/utils/network.d.mts +2 -4
- package/dist/utils/network.d.mts.map +1 -1
- package/dist/utils/network.mjs +0 -5
- package/dist/utils/network.mjs.map +1 -1
- package/dist/utils/transaction.cjs +1 -1
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.mjs +1 -1
- package/dist/utils/transaction.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/utils/feature-flags.cjs +0 -12
- package/dist/utils/feature-flags.cjs.map +0 -1
- package/dist/utils/feature-flags.d.cts +0 -3
- package/dist/utils/feature-flags.d.cts.map +0 -1
- package/dist/utils/feature-flags.d.mts +0 -3
- package/dist/utils/feature-flags.d.mts.map +0 -1
- package/dist/utils/feature-flags.mjs +0 -8
- package/dist/utils/feature-flags.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
11
|
|
|
12
|
-
- Remove stale bridge transactions from `txHistory` to prevent excessive polling. Once a history item exceeds the configured maximum age, polling backs off exponentially and also checks for the src tx hash's receipt. If there is no receipt, the history item's hash is presumed to be invalid and is deleted from state. ([#8479](https://github.com/MetaMask/core/pull/8479))
|
|
13
12
|
- Add missing action types for public `BridgeStatusController` methods ([#8367](https://github.com/MetaMask/core/pull/8367))
|
|
14
13
|
- The following types are now available:
|
|
15
14
|
- `BridgeStatusControllerSubmitTxAction`
|
|
@@ -18,8 +17,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
18
17
|
|
|
19
18
|
### Changed
|
|
20
19
|
|
|
21
|
-
- **BREAKING:** Replace `transactionFailed` and `transactionConfirmed` event subscriptions with `TransactionController:transactionStatusUpdated` ([#8479](https://github.com/MetaMask/core/pull/8479))
|
|
22
|
-
- **BREAKING:** Add `RemoteFeatureFlags:getState` to allowed actions to retrieve max history item age config ([#8479](https://github.com/MetaMask/core/pull/8479))
|
|
23
20
|
- Add `account_hardware_type` field to all cross-chain swap analytics events ([#8503](https://github.com/MetaMask/core/pull/8503))
|
|
24
21
|
- `account_hardware_type` carries the specific hardware wallet brand (e.g. `'Ledger'`, `'QR Hardware'`) or `null` for software wallets
|
|
25
22
|
- `is_hardware_wallet` is now derived from `account_hardware_type !== null`, keeping both fields in sync
|
|
@@ -31,13 +28,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
31
28
|
- Bump `@metamask/base-controller` from `^9.0.1` to `^9.1.0` ([#8457](https://github.com/MetaMask/core/pull/8457))
|
|
32
29
|
- Bump `@metamask/bridge-controller` from `^70.0.1` to `^70.1.1` ([#8466](https://github.com/MetaMask/core/pull/8466), [#8474](https://github.com/MetaMask/core/pull/8474))
|
|
33
30
|
|
|
34
|
-
### Fixed
|
|
35
|
-
|
|
36
|
-
- Prevent invalid src hashes from being persisted in `txHistory` ([#8479](https://github.com/MetaMask/core/pull/8479))
|
|
37
|
-
- Make transaction status subscribers generic so that `txHistory` items get updated if there are any transaction updates matching by actionId, txMetaId, hash or type
|
|
38
|
-
- Skip saving smart transaction hashes on transaction submission. This used to make it possible for invalid src hashes to be stored in state and polled indefinitely. Instead, the txHistory item will now be updated with the confirmed tx hash when the `transactionStatusUpdated` event is published
|
|
39
|
-
- If there is no srcTxHash in state, attempt to set it based on the local TransactionController state
|
|
40
|
-
|
|
41
31
|
## [70.0.5]
|
|
42
32
|
|
|
43
33
|
### Changed
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
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
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed,
|
|
13
|
+
var _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_intentManager, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_trace, _BridgeStatusController_onTransactionFailed, _BridgeStatusController_markTxAsFailed, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_rekeyHistoryItem, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_getSrcTxHash, _BridgeStatusController_updateSrcTxHash, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_handleApprovalTx, _BridgeStatusController_handleEvmTransactionBatch, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.BridgeStatusController = void 0;
|
|
16
16
|
const bridge_controller_1 = require("@metamask/bridge-controller");
|
|
@@ -70,45 +70,60 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
70
70
|
_BridgeStatusController_config.set(this, void 0);
|
|
71
71
|
_BridgeStatusController_addTransactionBatchFn.set(this, void 0);
|
|
72
72
|
_BridgeStatusController_trace.set(this, void 0);
|
|
73
|
-
_BridgeStatusController_onTransactionFailed.set(this, ({
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
_BridgeStatusController_onTransactionFailed.set(this, ({ transactionMeta, }) => {
|
|
74
|
+
const { type, status, id: txMetaId, actionId } = transactionMeta;
|
|
75
|
+
if (type &&
|
|
76
|
+
[
|
|
77
|
+
transaction_controller_1.TransactionType.bridge,
|
|
78
|
+
transaction_controller_1.TransactionType.swap,
|
|
79
|
+
transaction_controller_1.TransactionType.bridgeApproval,
|
|
80
|
+
transaction_controller_1.TransactionType.swapApproval,
|
|
81
|
+
].includes(type) &&
|
|
82
|
+
[
|
|
83
|
+
transaction_controller_1.TransactionStatus.failed,
|
|
84
|
+
transaction_controller_1.TransactionStatus.dropped,
|
|
85
|
+
transaction_controller_1.TransactionStatus.rejected,
|
|
86
|
+
].includes(status)) {
|
|
87
|
+
__classPrivateFieldGet(this, _BridgeStatusController_markTxAsFailed, "f").call(this, transactionMeta);
|
|
88
|
+
if (status !== transaction_controller_1.TransactionStatus.rejected) {
|
|
89
|
+
let historyKey;
|
|
90
|
+
if (this.state.txHistory[txMetaId]) {
|
|
91
|
+
historyKey = txMetaId;
|
|
92
|
+
}
|
|
93
|
+
else if (actionId && this.state.txHistory[actionId]) {
|
|
94
|
+
historyKey = actionId;
|
|
95
|
+
}
|
|
96
|
+
const activeHistoryKey = historyKey ?? txMetaId;
|
|
97
|
+
// Skip account lookup and tracking when featureId is set (e.g. PERPS)
|
|
98
|
+
if (this.state.txHistory[activeHistoryKey]?.featureId) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const from = transactionMeta.txParams?.from;
|
|
102
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, activeHistoryKey, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta, from
|
|
103
|
+
? this.messenger.call('AccountsController:getAccountByAddress', from)
|
|
104
|
+
: undefined));
|
|
105
|
+
}
|
|
84
106
|
}
|
|
85
|
-
|
|
86
|
-
|
|
107
|
+
});
|
|
108
|
+
// Mark tx as failed in txHistory if either the approval or trade fails
|
|
109
|
+
_BridgeStatusController_markTxAsFailed.set(this, ({ id: txMetaId, actionId, }) => {
|
|
110
|
+
// Look up by txMetaId first
|
|
111
|
+
let txHistoryKey = this.state.txHistory[txMetaId]
|
|
112
|
+
? txMetaId
|
|
113
|
+
: undefined;
|
|
114
|
+
// If not found by txMetaId, try looking up by actionId (for pre-submission failures)
|
|
115
|
+
if (!txHistoryKey && actionId && this.state.txHistory[actionId]) {
|
|
116
|
+
txHistoryKey = actionId;
|
|
117
|
+
}
|
|
118
|
+
// If still not found, try looking up by approvalTxId
|
|
119
|
+
txHistoryKey ?? (txHistoryKey = Object.keys(this.state.txHistory).find((key) => this.state.txHistory[key].approvalTxId === txMetaId));
|
|
120
|
+
if (!txHistoryKey) {
|
|
87
121
|
return;
|
|
88
122
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
_BridgeStatusController_onTransactionConfirmed.set(this, ({ txMeta, historyKey, }) => {
|
|
93
|
-
__classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
|
|
94
|
-
historyKey,
|
|
95
|
-
txHash: txMeta.hash,
|
|
123
|
+
const key = txHistoryKey;
|
|
124
|
+
this.update((statusState) => {
|
|
125
|
+
statusState.txHistory[key].status.status = bridge_controller_1.StatusTypes.FAILED;
|
|
96
126
|
});
|
|
97
|
-
console.log('======TransactionController:transactionConfirmed', txMeta);
|
|
98
|
-
switch (txMeta.type) {
|
|
99
|
-
case transaction_controller_1.TransactionType.swap:
|
|
100
|
-
__classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
|
|
101
|
-
historyKey,
|
|
102
|
-
status: bridge_controller_1.StatusTypes.COMPLETE,
|
|
103
|
-
});
|
|
104
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, historyKey);
|
|
105
|
-
break;
|
|
106
|
-
default:
|
|
107
|
-
if (historyKey) {
|
|
108
|
-
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, historyKey);
|
|
109
|
-
}
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
127
|
});
|
|
113
128
|
this.resetState = () => {
|
|
114
129
|
this.update((state) => {
|
|
@@ -209,31 +224,30 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
209
224
|
_BridgeStatusController_restartPollingForIncompleteHistoryItems.set(this, () => {
|
|
210
225
|
// Check for historyItems that do not have a status of complete and restart polling
|
|
211
226
|
const { txHistory } = this.state;
|
|
212
|
-
const historyItems = Object.
|
|
227
|
+
const historyItems = Object.values(txHistory);
|
|
213
228
|
const incompleteHistoryItems = historyItems
|
|
214
|
-
.filter((
|
|
229
|
+
.filter((historyItem) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
|
|
215
230
|
historyItem.status.status === bridge_controller_1.StatusTypes.UNKNOWN)
|
|
216
231
|
// Only poll items with txMetaId (post-submission items)
|
|
217
|
-
.filter((
|
|
218
|
-
|
|
219
|
-
return false;
|
|
220
|
-
}
|
|
232
|
+
.filter((historyItem) => Boolean(historyItem.txMetaId))
|
|
233
|
+
.filter((historyItem) => {
|
|
221
234
|
// Check if we are already polling this tx, if so, skip restarting polling for that
|
|
222
235
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
|
|
223
236
|
return !pollingToken;
|
|
224
237
|
})
|
|
225
238
|
// Only restart polling for items that still require status updates
|
|
226
|
-
.filter((
|
|
239
|
+
.filter((historyItem) => {
|
|
227
240
|
return (0, history_1.shouldPollHistoryItem)(historyItem);
|
|
228
241
|
});
|
|
229
|
-
incompleteHistoryItems.forEach((
|
|
242
|
+
incompleteHistoryItems.forEach((historyItem) => {
|
|
243
|
+
const bridgeTxMetaId = historyItem.txMetaId;
|
|
230
244
|
const shouldSkipFetch = (0, bridge_status_1.shouldSkipFetchDueToFetchFailures)(historyItem.attempts);
|
|
231
245
|
if (shouldSkipFetch) {
|
|
232
246
|
return;
|
|
233
247
|
}
|
|
234
248
|
// We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()
|
|
235
249
|
// because we don't want to overwrite the existing historyItem in state
|
|
236
|
-
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this,
|
|
250
|
+
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeTxMetaId);
|
|
237
251
|
});
|
|
238
252
|
});
|
|
239
253
|
_BridgeStatusController_addTxToHistory.set(this, (...args) => {
|
|
@@ -242,7 +256,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
242
256
|
// Use actionId as key for pre-submission, or txMeta.id for post-submission
|
|
243
257
|
state.txHistory[historyKey] = txHistoryItem;
|
|
244
258
|
});
|
|
245
|
-
return historyKey;
|
|
246
259
|
});
|
|
247
260
|
/**
|
|
248
261
|
* Rekeys a history item from actionId to txMeta.id after successful submission.
|
|
@@ -265,6 +278,9 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
265
278
|
this.stopPollingByPollingToken(existingPollingToken);
|
|
266
279
|
}
|
|
267
280
|
const txHistoryItem = this.state.txHistory[txId];
|
|
281
|
+
if (!txHistoryItem) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
268
284
|
if ((0, history_1.shouldPollHistoryItem)(txHistoryItem)) {
|
|
269
285
|
__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
|
|
270
286
|
bridgeTxMetaId: txId,
|
|
@@ -286,8 +302,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
286
302
|
if (!bridgeTxMeta?.id) {
|
|
287
303
|
throw new Error('Cannot start polling: bridgeTxMeta.id is required for polling');
|
|
288
304
|
}
|
|
289
|
-
|
|
290
|
-
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this,
|
|
305
|
+
__classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, txHistoryMeta);
|
|
306
|
+
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeTxMeta.id);
|
|
291
307
|
};
|
|
292
308
|
// This will be called after you call this.startPolling()
|
|
293
309
|
// The args passed in are the args you passed in to startPolling()
|
|
@@ -295,45 +311,55 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
295
311
|
await __classPrivateFieldGet(this, _BridgeStatusController_fetchBridgeTxStatus, "f").call(this, pollingInput);
|
|
296
312
|
};
|
|
297
313
|
/**
|
|
298
|
-
* Handles the failure to fetch the bridge tx status
|
|
299
|
-
* We eventually stop polling for the tx if we fail too many times
|
|
314
|
+
* Handles the failure to fetch the bridge tx status
|
|
315
|
+
* We eventually stop polling for the tx if we fail too many times
|
|
300
316
|
* Failures (500 errors) can be due to:
|
|
301
317
|
* - The srcTxHash not being available immediately for STX
|
|
302
318
|
* - The srcTxHash being invalid for the chain. This case will never resolve so we stop polling for it to avoid hammering the Bridge API forever.
|
|
303
319
|
*
|
|
304
320
|
* @param bridgeTxMetaId - The txMetaId of the bridge tx
|
|
305
321
|
*/
|
|
306
|
-
_BridgeStatusController_handleFetchFailure.set(this,
|
|
307
|
-
|
|
308
|
-
const newAttempts =
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
322
|
+
_BridgeStatusController_handleFetchFailure.set(this, (bridgeTxMetaId) => {
|
|
323
|
+
const { attempts } = this.state.txHistory[bridgeTxMetaId];
|
|
324
|
+
const newAttempts = attempts
|
|
325
|
+
? {
|
|
326
|
+
counter: attempts.counter + 1,
|
|
327
|
+
lastAttemptTime: Date.now(),
|
|
328
|
+
}
|
|
329
|
+
: {
|
|
330
|
+
counter: 1,
|
|
331
|
+
lastAttemptTime: Date.now(),
|
|
332
|
+
};
|
|
333
|
+
// If we've failed too many times, stop polling for the tx
|
|
317
334
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
318
|
-
|
|
319
|
-
// If the historyItem age is less than the configured maxPendingHistoryItemAgeMs flag, wait for a valid srcTxHash
|
|
320
|
-
if (await (0, bridge_status_1.shouldWaitForFinalBridgeStatus)(this.messenger, this.state.txHistory[bridgeTxMetaId])) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
// If we've failed too many times and the srcTxHash is invalid, stop polling for the tx
|
|
324
|
-
if (pollingToken) {
|
|
335
|
+
if (newAttempts.counter >= constants_1.MAX_ATTEMPTS && pollingToken) {
|
|
325
336
|
this.stopPollingByPollingToken(pollingToken);
|
|
326
337
|
delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
338
|
+
// Track max polling reached event
|
|
339
|
+
const historyItem = this.state.txHistory[bridgeTxMetaId];
|
|
340
|
+
if (historyItem && !historyItem.featureId) {
|
|
341
|
+
const selectedAccount = (0, accounts_1.getAccountByAddress)(this.messenger, historyItem.account);
|
|
342
|
+
const requestParams = (0, metrics_1.getRequestParamFromHistory)(historyItem);
|
|
343
|
+
const requestMetadata = (0, metrics_1.getRequestMetadataFromHistory)(historyItem, selectedAccount);
|
|
344
|
+
const { security_warnings: _, ...metadataWithoutWarnings } = requestMetadata;
|
|
345
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.PollingStatusUpdated, bridgeTxMetaId, {
|
|
346
|
+
...(0, metrics_1.getTradeDataFromHistory)(historyItem),
|
|
347
|
+
...(0, metrics_1.getPriceImpactFromQuote)(historyItem.quote),
|
|
348
|
+
...metadataWithoutWarnings,
|
|
349
|
+
chain_id_source: requestParams.chain_id_source,
|
|
350
|
+
chain_id_destination: requestParams.chain_id_destination,
|
|
351
|
+
token_symbol_source: requestParams.token_symbol_source,
|
|
352
|
+
token_symbol_destination: requestParams.token_symbol_destination,
|
|
353
|
+
action_type: bridge_controller_1.MetricsActionType.SWAPBRIDGE_V1,
|
|
354
|
+
polling_status: bridge_controller_1.PollingStatus.MaxPollingReached,
|
|
355
|
+
retry_attempts: newAttempts.counter,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
327
358
|
}
|
|
328
|
-
//
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackPollingStatusUpdatedEvent, "f").call(this, bridgeTxMetaId, bridge_controller_1.PollingStatus.StaleTransactionHash);
|
|
334
|
-
// Delete the history item so polling doesn't start over on the next restart
|
|
335
|
-
__classPrivateFieldGet(this, _BridgeStatusController_deleteHistoryItem, "f").call(this, bridgeTxMetaId);
|
|
336
|
-
}
|
|
359
|
+
// Update the attempts counter
|
|
360
|
+
this.update((state) => {
|
|
361
|
+
state.txHistory[bridgeTxMetaId].attempts = newAttempts;
|
|
362
|
+
});
|
|
337
363
|
});
|
|
338
364
|
_BridgeStatusController_fetchBridgeTxStatus.set(this, async ({ bridgeTxMetaId, }) => {
|
|
339
365
|
// 1. Check for history item
|
|
@@ -362,14 +388,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
362
388
|
// We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx
|
|
363
389
|
// Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.
|
|
364
390
|
// Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases
|
|
365
|
-
const srcTxHash = __classPrivateFieldGet(this,
|
|
366
|
-
// Throw errors to increase polling attempts counter
|
|
367
|
-
if ((0, history_1.isHistoryItemTooOld)(this.messenger, historyItem)) {
|
|
368
|
-
throw new Error(`History item is too old: ${bridgeTxMetaId}}`);
|
|
369
|
-
}
|
|
391
|
+
const srcTxHash = __classPrivateFieldGet(this, _BridgeStatusController_getSrcTxHash, "f").call(this, bridgeTxMetaId);
|
|
370
392
|
if (!srcTxHash) {
|
|
371
393
|
return;
|
|
372
394
|
}
|
|
395
|
+
__classPrivateFieldGet(this, _BridgeStatusController_updateSrcTxHash, "f").call(this, bridgeTxMetaId, srcTxHash);
|
|
373
396
|
const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
|
|
374
397
|
const response = await (0, bridge_status_1.fetchBridgeTxStatus)(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), await (0, authentication_1.getJwt)(this.messenger), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
|
|
375
398
|
status = response.status;
|
|
@@ -424,65 +447,28 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
424
447
|
}
|
|
425
448
|
catch (error) {
|
|
426
449
|
console.warn('Failed to fetch bridge tx status', error);
|
|
427
|
-
|
|
450
|
+
__classPrivateFieldGet(this, _BridgeStatusController_handleFetchFailure, "f").call(this, bridgeTxMetaId);
|
|
428
451
|
}
|
|
429
452
|
});
|
|
430
|
-
|
|
431
|
-
* Returns the srcTxHash for a non-STX EVM tx, the hash from the bridge status api,
|
|
432
|
-
* or the local hash from the TransactionController if the tx is in a finalized state
|
|
433
|
-
*
|
|
434
|
-
* @param bridgeTxMetaId - The bridge tx meta id
|
|
435
|
-
* @returns The srcTxHash
|
|
436
|
-
*/
|
|
437
|
-
_BridgeStatusController_setAndGetSrcTxHash.set(this, (bridgeTxMetaId) => {
|
|
453
|
+
_BridgeStatusController_getSrcTxHash.set(this, (bridgeTxMetaId) => {
|
|
438
454
|
const { txHistory } = this.state;
|
|
439
|
-
// Prefer the srcTxHash from bridgeStatusState so we don't have to
|
|
455
|
+
// Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController
|
|
440
456
|
// But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX
|
|
441
457
|
const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;
|
|
442
|
-
if (srcTxHash
|
|
443
|
-
(0, bridge_controller_1.isNonEvmChainId)(txHistory[bridgeTxMetaId].quote.srcChainId)) {
|
|
444
|
-
// throw new Error(`Src tx hash not found for non-EVM chain: ${srcTxHash}`);
|
|
458
|
+
if (srcTxHash) {
|
|
445
459
|
return srcTxHash;
|
|
446
460
|
}
|
|
447
|
-
//
|
|
461
|
+
// Look up in TransactionController if txMeta has been updated with the srcTxHash
|
|
448
462
|
const txMeta = (0, transaction_1.getTransactionMetaById)(this.messenger, bridgeTxMetaId);
|
|
449
|
-
|
|
450
|
-
return undefined;
|
|
451
|
-
}
|
|
452
|
-
// Wait for finalized status before updating the history item
|
|
453
|
-
const localTxHash = [
|
|
454
|
-
transaction_controller_1.TransactionStatus.confirmed,
|
|
455
|
-
transaction_controller_1.TransactionStatus.dropped,
|
|
456
|
-
transaction_controller_1.TransactionStatus.rejected,
|
|
457
|
-
transaction_controller_1.TransactionStatus.failed,
|
|
458
|
-
].includes(txMeta.status)
|
|
459
|
-
? txMeta.hash
|
|
460
|
-
: undefined;
|
|
461
|
-
__classPrivateFieldGet(this, _BridgeStatusController_updateHistoryItem, "f").call(this, {
|
|
462
|
-
historyKey: bridgeTxMetaId,
|
|
463
|
-
txHash: localTxHash,
|
|
464
|
-
});
|
|
465
|
-
return localTxHash;
|
|
463
|
+
return txMeta?.hash;
|
|
466
464
|
});
|
|
467
|
-
|
|
468
|
-
|
|
465
|
+
_BridgeStatusController_updateSrcTxHash.set(this, (bridgeTxMetaId, srcTxHash) => {
|
|
466
|
+
const { txHistory } = this.state;
|
|
467
|
+
if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {
|
|
469
468
|
return;
|
|
470
469
|
}
|
|
471
|
-
this.update((
|
|
472
|
-
|
|
473
|
-
currentState.txHistory[historyKey].status.status = status;
|
|
474
|
-
}
|
|
475
|
-
if (txHash) {
|
|
476
|
-
currentState.txHistory[historyKey].status.srcChain.txHash = txHash;
|
|
477
|
-
}
|
|
478
|
-
if (attempts) {
|
|
479
|
-
currentState.txHistory[historyKey].attempts = attempts;
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
});
|
|
483
|
-
_BridgeStatusController_deleteHistoryItem.set(this, (historyKey) => {
|
|
484
|
-
this.update((currentState) => {
|
|
485
|
-
delete currentState.txHistory[historyKey];
|
|
470
|
+
this.update((state) => {
|
|
471
|
+
state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;
|
|
486
472
|
});
|
|
487
473
|
});
|
|
488
474
|
// Wipes the bridge status for the given address and chainId
|
|
@@ -498,7 +484,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
498
484
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
|
|
499
485
|
if (pollingToken) {
|
|
500
486
|
this.stopPollingByPollingToken(__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId]);
|
|
501
|
-
delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[sourceTxMetaId];
|
|
502
487
|
}
|
|
503
488
|
});
|
|
504
489
|
this.update((state) => {
|
|
@@ -665,7 +650,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
665
650
|
const actionId = (0, transaction_1.generateActionId)().toString();
|
|
666
651
|
// Add pre-submission history keyed by actionId
|
|
667
652
|
// This ensures we have quote data available if transaction fails during submission
|
|
668
|
-
|
|
653
|
+
__classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
|
|
669
654
|
accountAddress: selectedAccount.address,
|
|
670
655
|
quoteResponse,
|
|
671
656
|
slippagePercentage: 0,
|
|
@@ -692,7 +677,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
692
677
|
actionId,
|
|
693
678
|
});
|
|
694
679
|
// On success, rekey from actionId to txMeta.id and update srcTxHash
|
|
695
|
-
__classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this,
|
|
680
|
+
__classPrivateFieldGet(this, _BridgeStatusController_rekeyHistoryItem, "f").call(this, actionId, tradeTxMeta);
|
|
696
681
|
return tradeTxMeta;
|
|
697
682
|
});
|
|
698
683
|
}
|
|
@@ -712,12 +697,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
712
697
|
!isStxEnabledOnClient &&
|
|
713
698
|
!quoteResponse.quote.gasIncluded7702 &&
|
|
714
699
|
!isDelegatedAccount;
|
|
715
|
-
let historyKey = txMeta.id;
|
|
716
700
|
if (!isNonBatchEvm) {
|
|
717
701
|
// Add swap or bridge tx to history
|
|
718
|
-
|
|
702
|
+
__classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
|
|
719
703
|
accountAddress: selectedAccount.address,
|
|
720
|
-
bridgeTxMeta: txMeta, // Only the id
|
|
704
|
+
bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController
|
|
721
705
|
quoteResponse,
|
|
722
706
|
slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request
|
|
723
707
|
isStxEnabled: isStxEnabledOnClient,
|
|
@@ -730,10 +714,10 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
730
714
|
}
|
|
731
715
|
if ((0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
|
|
732
716
|
// Start polling for bridge tx status
|
|
733
|
-
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this,
|
|
717
|
+
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
|
|
734
718
|
// Track non-EVM Swap completed event
|
|
735
719
|
if (!(isBridgeTx || isTronTx)) {
|
|
736
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed,
|
|
720
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMeta.id);
|
|
737
721
|
}
|
|
738
722
|
}
|
|
739
723
|
}
|
|
@@ -832,14 +816,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
832
816
|
};
|
|
833
817
|
// Record in bridge history with actual transaction metadata
|
|
834
818
|
try {
|
|
819
|
+
// Use orderId as the history key for intent transactions
|
|
820
|
+
const bridgeHistoryKey = orderUid;
|
|
835
821
|
// Create a bridge transaction metadata that includes the original txId
|
|
836
822
|
const bridgeTxMetaForHistory = {
|
|
837
823
|
...syntheticMeta,
|
|
838
|
-
id:
|
|
824
|
+
id: bridgeHistoryKey,
|
|
839
825
|
originalTransactionId: syntheticMeta.id, // Keep original txId for TransactionController updates
|
|
840
826
|
};
|
|
841
|
-
|
|
842
|
-
const historyKey = __classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
|
|
827
|
+
__classPrivateFieldGet(this, _BridgeStatusController_addTxToHistory, "f").call(this, {
|
|
843
828
|
accountAddress,
|
|
844
829
|
bridgeTxMeta: bridgeTxMetaForHistory,
|
|
845
830
|
quoteResponse,
|
|
@@ -852,7 +837,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
852
837
|
activeAbTests,
|
|
853
838
|
});
|
|
854
839
|
// Start polling using the orderId key to route to intent manager
|
|
855
|
-
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this,
|
|
840
|
+
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, bridgeHistoryKey);
|
|
856
841
|
}
|
|
857
842
|
catch (error) {
|
|
858
843
|
console.error('📝 [submitIntent] Failed to add to bridge history', error);
|
|
@@ -868,13 +853,6 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
868
853
|
throw error;
|
|
869
854
|
}
|
|
870
855
|
};
|
|
871
|
-
_BridgeStatusController_trackPollingStatusUpdatedEvent.set(this, (historyKey, pollingStatus) => {
|
|
872
|
-
// Track polling status updated event
|
|
873
|
-
const historyItem = this.state.txHistory[historyKey];
|
|
874
|
-
if (historyItem && !historyItem.featureId) {
|
|
875
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.PollingStatusUpdated, historyKey, (0, metrics_1.getPollingStatusUpdatedProperties)(this.messenger, pollingStatus, historyItem));
|
|
876
|
-
}
|
|
877
|
-
});
|
|
878
856
|
/**
|
|
879
857
|
* Tracks post-submission events for a cross-chain swap based on the history item
|
|
880
858
|
*
|
|
@@ -982,55 +960,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
982
960
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
983
961
|
// Set interval
|
|
984
962
|
this.setIntervalLength(constants_1.REFRESH_INTERVAL_MS);
|
|
985
|
-
this.messenger.subscribe('TransactionController:
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
const { type, hash, status, id, actionId, batchId } = txMeta;
|
|
991
|
-
console.error('======TransactionController:transactionStatusUpdated', {
|
|
992
|
-
type,
|
|
993
|
-
hash,
|
|
994
|
-
status,
|
|
995
|
-
id,
|
|
996
|
-
actionId,
|
|
997
|
-
batchId,
|
|
998
|
-
});
|
|
999
|
-
// Allow event publishing if the txMeta is a swap/bridge OR if the
|
|
1000
|
-
// corresponding history item exists
|
|
1001
|
-
const isSwapOrBridgeTransaction = type &&
|
|
1002
|
-
[
|
|
1003
|
-
transaction_controller_1.TransactionType.swap,
|
|
1004
|
-
transaction_controller_1.TransactionType.bridge,
|
|
1005
|
-
transaction_controller_1.TransactionType.swapApproval,
|
|
1006
|
-
transaction_controller_1.TransactionType.bridgeApproval,
|
|
1007
|
-
].includes(type);
|
|
1008
|
-
const isApprovalConfirmation = txMeta.id === historyItem?.approvalTxId &&
|
|
1009
|
-
status === transaction_controller_1.TransactionStatus.confirmed;
|
|
1010
|
-
if ((!isSwapOrBridgeTransaction && !historyKey && !historyItem) ||
|
|
1011
|
-
isApprovalConfirmation) {
|
|
1012
|
-
console.error('======approval tx confirmed');
|
|
1013
|
-
return;
|
|
963
|
+
this.messenger.subscribe('TransactionController:transactionFailed', __classPrivateFieldGet(this, _BridgeStatusController_onTransactionFailed, "f"));
|
|
964
|
+
this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
|
|
965
|
+
const { type, id: txMetaId, chainId } = transactionMeta;
|
|
966
|
+
if (type === transaction_controller_1.TransactionType.swap) {
|
|
967
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMetaId);
|
|
1014
968
|
}
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
__classPrivateFieldGet(this, _BridgeStatusController_onTransactionConfirmed, "f").call(this, { txMeta, historyKey });
|
|
1018
|
-
break;
|
|
1019
|
-
case transaction_controller_1.TransactionStatus.failed:
|
|
1020
|
-
case transaction_controller_1.TransactionStatus.dropped:
|
|
1021
|
-
case transaction_controller_1.TransactionStatus.rejected:
|
|
1022
|
-
__classPrivateFieldGet(this, _BridgeStatusController_onTransactionFailed, "f").call(this, { txMeta, historyKey });
|
|
1023
|
-
break;
|
|
1024
|
-
default:
|
|
1025
|
-
break;
|
|
969
|
+
if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_1.isNonEvmChainId)(chainId)) {
|
|
970
|
+
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMetaId);
|
|
1026
971
|
}
|
|
1027
|
-
}, ({ transactionMeta }) => {
|
|
1028
|
-
const entry = (0, history_1.getMatchingHistoryEntryForTxMeta)(this.state.txHistory, transactionMeta);
|
|
1029
|
-
return {
|
|
1030
|
-
historyKey: entry?.[0],
|
|
1031
|
-
historyItem: entry?.[1],
|
|
1032
|
-
txMeta: transactionMeta,
|
|
1033
|
-
};
|
|
1034
972
|
});
|
|
1035
973
|
// If you close the extension, but keep the browser open, the polling continues
|
|
1036
974
|
// If you close the browser, the polling stops
|
|
@@ -1039,5 +977,5 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
1039
977
|
}
|
|
1040
978
|
}
|
|
1041
979
|
exports.BridgeStatusController = BridgeStatusController;
|
|
1042
|
-
_BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(),
|
|
980
|
+
_BridgeStatusController_pollingTokensByTxMetaId = new WeakMap(), _BridgeStatusController_intentManager = new WeakMap(), _BridgeStatusController_clientId = new WeakMap(), _BridgeStatusController_fetchFn = new WeakMap(), _BridgeStatusController_config = new WeakMap(), _BridgeStatusController_addTransactionBatchFn = new WeakMap(), _BridgeStatusController_trace = new WeakMap(), _BridgeStatusController_onTransactionFailed = new WeakMap(), _BridgeStatusController_markTxAsFailed = new WeakMap(), _BridgeStatusController_restartPollingForIncompleteHistoryItems = new WeakMap(), _BridgeStatusController_addTxToHistory = new WeakMap(), _BridgeStatusController_rekeyHistoryItem = new WeakMap(), _BridgeStatusController_startPollingForTxId = new WeakMap(), _BridgeStatusController_handleFetchFailure = new WeakMap(), _BridgeStatusController_fetchBridgeTxStatus = new WeakMap(), _BridgeStatusController_getSrcTxHash = new WeakMap(), _BridgeStatusController_updateSrcTxHash = new WeakMap(), _BridgeStatusController_wipeBridgeStatusByChainId = new WeakMap(), _BridgeStatusController_handleApprovalTx = new WeakMap(), _BridgeStatusController_handleEvmTransactionBatch = new WeakMap(), _BridgeStatusController_trackUnifiedSwapBridgeEvent = new WeakMap();
|
|
1043
981
|
//# sourceMappingURL=bridge-status-controller.cjs.map
|