@metamask-previews/bridge-status-controller 63.0.0-preview-a5935709 → 63.0.0-preview-93c103b6
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 -4
- package/dist/bridge-status-controller.cjs +45 -42
- package/dist/bridge-status-controller.cjs.map +1 -1
- package/dist/bridge-status-controller.d.cts +5 -4
- package/dist/bridge-status-controller.d.cts.map +1 -1
- package/dist/bridge-status-controller.d.mts +5 -4
- package/dist/bridge-status-controller.d.mts.map +1 -1
- package/dist/bridge-status-controller.mjs +10 -7
- package/dist/bridge-status-controller.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -22,10 +22,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
22
22
|
- Note, however, that the versions specified in the client's `package.json` always "win", and you are expected to keep them up to date so as not to break controller and service intercommunication.
|
|
23
23
|
- Bump `@metamask/bridge-controller` from `^63.0.0` to `^63.1.0` ([#7238](https://github.com/MetaMask/core/pull/7238))
|
|
24
24
|
|
|
25
|
-
### Removed
|
|
26
|
-
|
|
27
|
-
- Remove direct QuotesReceived event publishing to avoid race conditions that can happen when clients navigate and reset state. Update `submitTx` to accept quotesReceivedContext (replace isLoading/warnings) and propagate context to the BridgeController through the `stopPollingForQuotes call ([#7242](https://github.com/MetaMask/core/pull/7242))
|
|
28
|
-
|
|
29
25
|
## [63.0.0]
|
|
30
26
|
|
|
31
27
|
### Changed
|
|
@@ -14,6 +14,7 @@ var _BridgeStatusController_instances, _BridgeStatusController_pollingTokensByTx
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.BridgeStatusController = void 0;
|
|
16
16
|
const bridge_controller_1 = require("@metamask/bridge-controller");
|
|
17
|
+
const bridge_controller_2 = require("@metamask/bridge-controller");
|
|
17
18
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
18
19
|
const polling_controller_1 = require("@metamask/polling-controller");
|
|
19
20
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
@@ -65,7 +66,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
68
|
this.update((statusState) => {
|
|
68
|
-
statusState.txHistory[txHistoryKey].status.status =
|
|
69
|
+
statusState.txHistory[txHistoryKey].status.status = bridge_controller_2.StatusTypes.FAILED;
|
|
69
70
|
});
|
|
70
71
|
});
|
|
71
72
|
this.resetState = () => {
|
|
@@ -123,7 +124,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
123
124
|
}
|
|
124
125
|
});
|
|
125
126
|
// Restart polling if it was stopped and this is a bridge transaction
|
|
126
|
-
const isBridgeTx = (0,
|
|
127
|
+
const isBridgeTx = (0, bridge_controller_2.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
|
|
127
128
|
if (isBridgeTx) {
|
|
128
129
|
// Check if polling was stopped (no active polling token)
|
|
129
130
|
const existingPollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[targetTxMetaId];
|
|
@@ -151,8 +152,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
151
152
|
const { txHistory } = this.state;
|
|
152
153
|
const historyItems = Object.values(txHistory);
|
|
153
154
|
const incompleteHistoryItems = historyItems
|
|
154
|
-
.filter((historyItem) => historyItem.status.status ===
|
|
155
|
-
historyItem.status.status ===
|
|
155
|
+
.filter((historyItem) => historyItem.status.status === bridge_controller_2.StatusTypes.PENDING ||
|
|
156
|
+
historyItem.status.status === bridge_controller_2.StatusTypes.UNKNOWN)
|
|
156
157
|
.filter((historyItem) => {
|
|
157
158
|
// Check if we are already polling this tx, if so, skip restarting polling for that
|
|
158
159
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
|
|
@@ -160,7 +161,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
160
161
|
})
|
|
161
162
|
// Swap txs don't need to have their statuses polled
|
|
162
163
|
.filter((historyItem) => {
|
|
163
|
-
const isBridgeTx = (0,
|
|
164
|
+
const isBridgeTx = (0, bridge_controller_2.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
|
|
164
165
|
return isBridgeTx;
|
|
165
166
|
});
|
|
166
167
|
incompleteHistoryItems.forEach((historyItem) => {
|
|
@@ -198,7 +199,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
198
199
|
status: {
|
|
199
200
|
// We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that
|
|
200
201
|
// Also we know the bare minimum fields for status at this point in time
|
|
201
|
-
status:
|
|
202
|
+
status: bridge_controller_2.StatusTypes.PENDING,
|
|
202
203
|
srcChain: {
|
|
203
204
|
chainId: statusRequest.srcChainId,
|
|
204
205
|
txHash: statusRequest.srcTxHash,
|
|
@@ -225,7 +226,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
225
226
|
return;
|
|
226
227
|
}
|
|
227
228
|
const { quote } = txHistoryItem;
|
|
228
|
-
const isBridgeTx = (0,
|
|
229
|
+
const isBridgeTx = (0, bridge_controller_2.isCrossChain)(quote.srcChainId, quote.destChainId);
|
|
229
230
|
if (isBridgeTx) {
|
|
230
231
|
__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
|
|
231
232
|
bridgeTxMetaId: txId,
|
|
@@ -301,7 +302,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
301
302
|
const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
|
|
302
303
|
const { status, validationFailures } = await (0, bridge_status_1.fetchBridgeTxStatus)(statusRequest, __classPrivateFieldGet(this, _BridgeStatusController_clientId, "f"), __classPrivateFieldGet(this, _BridgeStatusController_fetchFn, "f"), __classPrivateFieldGet(this, _BridgeStatusController_config, "f").customBridgeApiBaseUrl);
|
|
303
304
|
if (validationFailures.length > 0) {
|
|
304
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
305
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.StatusValidationFailed, bridgeTxMetaId, {
|
|
305
306
|
failures: validationFailures,
|
|
306
307
|
});
|
|
307
308
|
throw new Error(`Bridge status validation failed: ${validationFailures.join(', ')}`);
|
|
@@ -309,8 +310,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
309
310
|
const newBridgeHistoryItem = {
|
|
310
311
|
...historyItem,
|
|
311
312
|
status,
|
|
312
|
-
completionTime: status.status ===
|
|
313
|
-
status.status ===
|
|
313
|
+
completionTime: status.status === bridge_controller_2.StatusTypes.COMPLETE ||
|
|
314
|
+
status.status === bridge_controller_2.StatusTypes.FAILED
|
|
314
315
|
? Date.now()
|
|
315
316
|
: undefined, // TODO make this more accurate by looking up dest txHash block time
|
|
316
317
|
attempts: undefined,
|
|
@@ -323,8 +324,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
323
324
|
state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;
|
|
324
325
|
});
|
|
325
326
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
326
|
-
const isFinalStatus = status.status ===
|
|
327
|
-
status.status ===
|
|
327
|
+
const isFinalStatus = status.status === bridge_controller_2.StatusTypes.COMPLETE ||
|
|
328
|
+
status.status === bridge_controller_2.StatusTypes.FAILED;
|
|
328
329
|
if (isFinalStatus && pollingToken) {
|
|
329
330
|
this.stopPollingByPollingToken(pollingToken);
|
|
330
331
|
delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
@@ -332,12 +333,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
332
333
|
if (historyItem.featureId) {
|
|
333
334
|
return;
|
|
334
335
|
}
|
|
335
|
-
if (status.status ===
|
|
336
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
336
|
+
if (status.status === bridge_controller_2.StatusTypes.COMPLETE) {
|
|
337
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, bridgeTxMetaId);
|
|
337
338
|
this.messenger.publish('BridgeStatusController:destinationTransactionCompleted', historyItem.quote.destAsset.assetId);
|
|
338
339
|
}
|
|
339
|
-
if (status.status ===
|
|
340
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
340
|
+
if (status.status === bridge_controller_2.StatusTypes.FAILED) {
|
|
341
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, bridgeTxMetaId);
|
|
341
342
|
}
|
|
342
343
|
}
|
|
343
344
|
}
|
|
@@ -453,7 +454,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
453
454
|
? constants_1.TraceName.BridgeTransactionApprovalCompleted
|
|
454
455
|
: constants_1.TraceName.SwapTransactionApprovalCompleted,
|
|
455
456
|
data: {
|
|
456
|
-
srcChainId: (0,
|
|
457
|
+
srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
457
458
|
stxEnabled: false,
|
|
458
459
|
},
|
|
459
460
|
}, approveTx);
|
|
@@ -475,7 +476,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
475
476
|
if (!selectedAccount) {
|
|
476
477
|
throw new Error('Failed to submit cross-chain swap transaction: unknown account in trade data');
|
|
477
478
|
}
|
|
478
|
-
const hexChainId = (0,
|
|
479
|
+
const hexChainId = (0, bridge_controller_2.formatChainIdToHex)(trade.chainId);
|
|
479
480
|
const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', hexChainId);
|
|
480
481
|
const requestOptions = {
|
|
481
482
|
actionId,
|
|
@@ -566,32 +567,34 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
566
567
|
* @param accountAddress - The address of the account to submit the transaction for
|
|
567
568
|
* @param quoteResponse - The quote response
|
|
568
569
|
* @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
|
|
569
|
-
* @param
|
|
570
|
+
* @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true
|
|
571
|
+
* @param warnings - The warnings to publish with the QuotesReceived event
|
|
570
572
|
* @returns The transaction meta
|
|
571
573
|
*/
|
|
572
|
-
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient,
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
574
|
+
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, isLoading = false, warnings = []) => {
|
|
575
|
+
// If trade is submitted before all quotes are loaded, publish QuotesReceived event
|
|
576
|
+
if (isLoading) {
|
|
577
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.QuotesReceived, undefined, (0, bridge_controller_1.getQuotesReceivedProperties)(quoteResponse, warnings));
|
|
578
|
+
}
|
|
579
|
+
this.messenger.call('BridgeController:stopPollingForQuotes');
|
|
577
580
|
const selectedAccount = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
|
|
578
581
|
if (!selectedAccount) {
|
|
579
582
|
throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
|
|
580
583
|
}
|
|
581
|
-
const isHardwareAccount = (0,
|
|
584
|
+
const isHardwareAccount = (0, bridge_controller_2.isHardwareWallet)(selectedAccount);
|
|
582
585
|
const preConfirmationProperties = (0, metrics_1.getPreConfirmationPropertiesFromQuote)(quoteResponse, isStxEnabledOnClient, isHardwareAccount);
|
|
583
586
|
// Emit Submitted event after submit button is clicked
|
|
584
587
|
!quoteResponse.featureId &&
|
|
585
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
588
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
|
|
586
589
|
let txMeta;
|
|
587
590
|
let approvalTxId;
|
|
588
591
|
const startTime = Date.now();
|
|
589
|
-
const isBridgeTx = (0,
|
|
592
|
+
const isBridgeTx = (0, bridge_controller_2.isCrossChain)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
|
|
590
593
|
// Submit non-EVM tx (Solana, BTC, Tron)
|
|
591
|
-
const isNonEvmTrade = (0,
|
|
594
|
+
const isNonEvmTrade = (0, bridge_controller_2.isNonEvmChainId)(quoteResponse.quote.srcChainId) &&
|
|
592
595
|
(typeof quoteResponse.trade === 'string' ||
|
|
593
|
-
(0,
|
|
594
|
-
(0,
|
|
596
|
+
(0, bridge_controller_2.isBitcoinTrade)(quoteResponse.trade) ||
|
|
597
|
+
(0, bridge_controller_2.isTronTrade)(quoteResponse.trade));
|
|
595
598
|
if (isNonEvmTrade) {
|
|
596
599
|
// Handle non-EVM approval if present (e.g., Tron token approvals)
|
|
597
600
|
if (quoteResponse.approval) {
|
|
@@ -600,7 +603,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
600
603
|
? constants_1.TraceName.BridgeTransactionApprovalCompleted
|
|
601
604
|
: constants_1.TraceName.SwapTransactionApprovalCompleted,
|
|
602
605
|
data: {
|
|
603
|
-
srcChainId: (0,
|
|
606
|
+
srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
604
607
|
stxEnabled: false,
|
|
605
608
|
},
|
|
606
609
|
}, async () => {
|
|
@@ -609,7 +612,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
609
612
|
}
|
|
610
613
|
catch (error) {
|
|
611
614
|
!quoteResponse.featureId &&
|
|
612
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
615
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, undefined, {
|
|
613
616
|
error_message: error?.message,
|
|
614
617
|
...preConfirmationProperties,
|
|
615
618
|
});
|
|
@@ -625,7 +628,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
625
628
|
? constants_1.TraceName.BridgeTransactionCompleted
|
|
626
629
|
: constants_1.TraceName.SwapTransactionCompleted,
|
|
627
630
|
data: {
|
|
628
|
-
srcChainId: (0,
|
|
631
|
+
srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
629
632
|
stxEnabled: false,
|
|
630
633
|
},
|
|
631
634
|
}, async () => {
|
|
@@ -634,7 +637,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
634
637
|
}
|
|
635
638
|
catch (error) {
|
|
636
639
|
!quoteResponse.featureId &&
|
|
637
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
640
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, txMeta?.id, {
|
|
638
641
|
error_message: error?.message,
|
|
639
642
|
...preConfirmationProperties,
|
|
640
643
|
});
|
|
@@ -653,7 +656,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
653
656
|
? constants_1.TraceName.BridgeTransactionCompleted
|
|
654
657
|
: constants_1.TraceName.SwapTransactionCompleted,
|
|
655
658
|
data: {
|
|
656
|
-
srcChainId: (0,
|
|
659
|
+
srcChainId: (0, bridge_controller_2.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
657
660
|
stxEnabled: isStxEnabledOnClient,
|
|
658
661
|
},
|
|
659
662
|
}, async () => {
|
|
@@ -697,12 +700,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
697
700
|
startTime,
|
|
698
701
|
approvalTxId,
|
|
699
702
|
});
|
|
700
|
-
if ((0,
|
|
703
|
+
if ((0, bridge_controller_2.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
|
|
701
704
|
// Start polling for bridge tx status
|
|
702
705
|
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
|
|
703
706
|
// Track non-EVM Swap completed event
|
|
704
707
|
if (!isBridgeTx) {
|
|
705
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
708
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, txMeta.id);
|
|
706
709
|
}
|
|
707
710
|
}
|
|
708
711
|
}
|
|
@@ -720,7 +723,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
720
723
|
*/
|
|
721
724
|
_BridgeStatusController_trackUnifiedSwapBridgeEvent.set(this, (eventName, txMetaId, eventProperties) => {
|
|
722
725
|
const baseProperties = {
|
|
723
|
-
action_type:
|
|
726
|
+
action_type: bridge_controller_2.MetricsActionType.SWAPBRIDGE_V1,
|
|
724
727
|
...(eventProperties ?? {}),
|
|
725
728
|
};
|
|
726
729
|
// This will publish events for PERPS dropped tx failures as well
|
|
@@ -735,7 +738,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
735
738
|
}
|
|
736
739
|
const requestParamProperties = (0, metrics_1.getRequestParamFromHistory)(historyItem);
|
|
737
740
|
// Always publish StatusValidationFailed event, regardless of featureId
|
|
738
|
-
if (eventName ===
|
|
741
|
+
if (eventName === bridge_controller_2.UnifiedSwapBridgeEventName.StatusValidationFailed) {
|
|
739
742
|
const { chain_id_source, chain_id_destination, token_address_source, token_address_destination, } = requestParamProperties;
|
|
740
743
|
this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, {
|
|
741
744
|
...baseProperties,
|
|
@@ -803,16 +806,16 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
803
806
|
__classPrivateFieldGet(this, _BridgeStatusController_markTxAsFailed, "f").call(this, transactionMeta);
|
|
804
807
|
// Track failed event
|
|
805
808
|
if (status !== transaction_controller_1.TransactionStatus.rejected) {
|
|
806
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
809
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Failed, id, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta));
|
|
807
810
|
}
|
|
808
811
|
}
|
|
809
812
|
});
|
|
810
813
|
this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
|
|
811
814
|
const { type, id, chainId } = transactionMeta;
|
|
812
815
|
if (type === transaction_controller_1.TransactionType.swap) {
|
|
813
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
816
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_2.UnifiedSwapBridgeEventName.Completed, id);
|
|
814
817
|
}
|
|
815
|
-
if (type === transaction_controller_1.TransactionType.bridge && !(0,
|
|
818
|
+
if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_2.isNonEvmChainId)(chainId)) {
|
|
816
819
|
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, id);
|
|
817
820
|
}
|
|
818
821
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status-controller.cjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type QuoteMetadata,\n type RequiredEventContextFromClient,\n type TxData,\n type QuoteResponse,\n type Trade,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isNonEvmChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\n isBitcoinTrade,\n isTronTrade,\n AbortReason,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { toHex } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n TransactionController,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n TraceName,\n} from './constants';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n SolanaTransactionMeta,\n BridgeHistoryItem,\n} from './types';\nimport { type BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n} from './utils/bridge-status';\nimport { getTxGasEstimates } from './utils/gas';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport {\n findAndUpdateTransactionsInBatch,\n getAddTransactionBatchParams,\n getClientRequest,\n getStatusRequestParams,\n getUSDTAllowanceResetTx,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n handleNonEvmTxResponse,\n generateActionId,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionFn: typeof TransactionController.prototype.addTransaction;\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n\n readonly #estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionFn,\n addTransactionBatchFn,\n updateTransactionFn,\n estimateGasFeeFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionFn: typeof TransactionController.prototype.addTransaction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionFn = addTransactionFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#updateTransactionFn = updateTransactionFn;\n this.#estimateGasFeeFn = estimateGasFeeFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n // Register action handlers\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:getBridgeHistoryItemByTxMetaId`,\n this.getBridgeHistoryItemByTxMetaId.bind(this),\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe(\n 'TransactionController:transactionFailed',\n ({ transactionMeta }) => {\n const { type, status, id } = transactionMeta;\n if (\n type &&\n [\n TransactionType.bridge,\n TransactionType.swap,\n TransactionType.bridgeApproval,\n TransactionType.swapApproval,\n ].includes(type) &&\n [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(status)\n ) {\n // Mark tx as failed in txHistory\n this.#markTxAsFailed(transactionMeta);\n // Track failed event\n if (status !== TransactionStatus.rejected) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n id,\n getEVMTxPropertiesFromTransactionMeta(transactionMeta),\n );\n }\n }\n },\n );\n\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n const { type, id, chainId } = transactionMeta;\n if (type === TransactionType.swap) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n id,\n );\n }\n if (type === TransactionType.bridge && !isNonEvmChainId(chainId)) {\n this.#startPollingForTxId(id);\n }\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n // Mark tx as failed in txHistory if either the approval or trade fails\n readonly #markTxAsFailed = ({ id }: TransactionMeta) => {\n const txHistoryKey = this.state.txHistory[id]\n ? id\n : Object.keys(this.state.txHistory).find(\n (key) => this.state.txHistory[key].approvalTxId === id,\n );\n if (!txHistoryKey) {\n return;\n }\n this.update((statusState) => {\n statusState.txHistory[txHistoryKey].status.status = StatusTypes.FAILED;\n });\n };\n\n resetState = () => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }) => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const { selectedNetworkClientId } = this.messenger.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const selectedChainId = selectedNetworkClient.configuration.chainId;\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }) => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this is a bridge transaction\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n\n if (isBridgeTx) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = () => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.values(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n (historyItem) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n .filter((historyItem) => {\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Swap txs don't need to have their statuses polled\n .filter((historyItem) => {\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n return isBridgeTx;\n });\n\n incompleteHistoryItems.forEach((historyItem) => {\n const bridgeTxMetaId = historyItem.txMetaId;\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(bridgeTxMetaId);\n });\n };\n\n readonly #addTxToHistory = (\n startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const {\n bridgeTxMeta,\n statusRequest,\n quoteResponse,\n startTime,\n slippagePercentage,\n initialDestAssetBalance,\n targetContractAddress,\n approvalTxId,\n isStxEnabled,\n accountAddress: selectedAddress,\n } = startPollingForBridgeTxStatusArgs;\n\n // Write all non-status fields to state so we can reference the quote in Activity list without the Bridge API\n // We know it's in progress but not the exact status yet\n const txHistoryItem = {\n txMetaId: bridgeTxMeta.id,\n batchId: bridgeTxMeta.batchId,\n quote: quoteResponse.quote,\n startTime,\n estimatedProcessingTimeInSeconds:\n quoteResponse.estimatedProcessingTimeInSeconds,\n slippagePercentage,\n pricingData: {\n amountSent: quoteResponse.sentAmount?.amount ?? '0',\n amountSentInUsd: quoteResponse.sentAmount?.usd ?? undefined,\n quotedGasInUsd: quoteResponse.gasFee?.effective?.usd ?? undefined,\n quotedReturnInUsd: quoteResponse.toTokenAmount?.usd ?? undefined,\n quotedGasAmount: quoteResponse.gasFee?.effective?.amount ?? undefined,\n },\n initialDestAssetBalance,\n targetContractAddress,\n account: selectedAddress,\n status: {\n // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that\n // Also we know the bare minimum fields for status at this point in time\n status: StatusTypes.PENDING,\n srcChain: {\n chainId: statusRequest.srcChainId,\n txHash: statusRequest.srcTxHash,\n },\n },\n hasApprovalTx: Boolean(quoteResponse.approval),\n approvalTxId,\n isStxEnabled: isStxEnabled ?? false,\n featureId: quoteResponse.featureId,\n };\n this.update((state) => {\n // Use the txMeta.id as the key so we can reference the txMeta in TransactionController\n state.txHistory[bridgeTxMeta.id] = txHistoryItem;\n });\n };\n\n readonly #startPollingForTxId = (txId: string) => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (!txHistoryItem) {\n return;\n }\n const { quote } = txHistoryItem;\n\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n if (isBridgeTx) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n this.#addTxToHistory(txHistoryMeta);\n this.#startPollingForTxId(bridgeTxMeta.id);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (pollingInput: BridgeStatusPollingInput) => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n #getMultichainSelectedAccount(accountAddress: string) {\n return this.messenger.call(\n 'AccountsController:getAccountByAddress',\n accountAddress,\n );\n }\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - 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.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string) => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Update the attempts counter\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].attempts = newAttempts;\n });\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs) => {\n const { txHistory } = this.state;\n\n if (\n shouldSkipFetchDueToFetchFailures(txHistory[bridgeTxMetaId]?.attempts)\n ) {\n return;\n }\n\n try {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const historyItem = txHistory[bridgeTxMetaId];\n const srcTxHash = this.#getSrcTxHash(bridgeTxMetaId);\n if (!srcTxHash) {\n return;\n }\n\n this.#updateSrcTxHash(bridgeTxMetaId, srcTxHash);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const { status, validationFailures } = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Skip tracking events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (e) {\n console.warn('Failed to fetch bridge tx status', e);\n this.#handleFetchFailure(bridgeTxMetaId);\n }\n };\n\n readonly #getSrcTxHash = (bridgeTxMetaId: string): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (srcTxHash) {\n return srcTxHash;\n }\n\n // Look up in TransactionController if txMeta has been updated with the srcTxHash\n const txControllerState = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = txControllerState.transactions.find(\n (tx: TransactionMeta) => tx.id === bridgeTxMetaId,\n );\n return txMeta?.hash;\n };\n\n readonly #updateSrcTxHash = (bridgeTxMetaId: string, srcTxHash: string) => {\n const { txHistory } = this.state;\n if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {\n return;\n }\n\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ) => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n /**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleNonEvmTx = async (\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n ) => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount,\n );\n const requestResponse = (await this.messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n // Create quote response with the specified trade\n // This allows the same method to handle both approvals and main trades\n const txQuoteResponse: QuoteResponse<Trade> & QuoteMetadata = {\n ...quoteResponse,\n trade,\n };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n txQuoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n };\n\n readonly #waitForHashAndReturnFinalTxMeta = async (\n hashPromise?: Awaited<\n ReturnType<TransactionController['addTransaction']>\n >['result'],\n ): Promise<TransactionMeta> => {\n const transactionHash = await hashPromise;\n const finalTransactionMeta: TransactionMeta | undefined = this.messenger\n .call('TransactionController:getState')\n .transactions.find((tx: TransactionMeta) => tx.hash === transactionHash);\n if (!finalTransactionMeta) {\n throw new Error(\n 'Failed to submit cross-chain swap tx: txMeta for txHash was not found',\n );\n }\n return finalTransactionMeta;\n };\n\n readonly #handleApprovalTx = async (\n isBridgeTx: boolean,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n requireApproval?: boolean,\n ): Promise<TransactionMeta | undefined> => {\n const { approval } = quoteResponse;\n\n if (approval) {\n const approveTx = async () => {\n await this.#handleUSDTAllowanceReset(quoteResponse);\n\n const approvalTxMeta = await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n trade: approval as TxData,\n requireApproval,\n });\n\n await handleApprovalDelay(quoteResponse);\n return approvalTxMeta;\n };\n\n return await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n approveTx,\n );\n }\n\n return undefined;\n };\n\n /**\n * Submits an EVM transaction to the TransactionController\n *\n * @param params - The parameters for the transaction\n * @param params.transactionType - The type of transaction to submit\n * @param params.trade - The trade data to confirm\n * @param params.requireApproval - Whether to require approval for the transaction\n * @returns The transaction meta\n */\n readonly #handleEvmTransaction = async ({\n transactionType,\n trade,\n requireApproval = false,\n }: {\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n }): Promise<TransactionMeta> => {\n const actionId = generateActionId().toString();\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n };\n const transactionParams: Parameters<\n TransactionController['addTransaction']\n >[0] = {\n ...trade,\n chainId: hexChainId,\n gasLimit: trade.gasLimit?.toString(),\n gas: trade.gasLimit?.toString(),\n };\n const transactionParamsWithMaxGas: TransactionParams = {\n ...transactionParams,\n ...(await this.#calculateGasFees(\n transactionParams,\n networkClientId,\n hexChainId,\n )),\n };\n\n const { result } = await this.#addTransactionFn(\n transactionParamsWithMaxGas,\n requestOptions,\n );\n\n return await this.#waitForHashAndReturnFinalTxMeta(result);\n };\n\n readonly #handleUSDTAllowanceReset = async (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval as TxData,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messenger.call(\n 'GasFeeController:getState',\n );\n const { estimates: txGasFeeEstimates } = await this.#estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n };\n\n /**\n * Submits batched EVM transactions to the TransactionController\n *\n * @param args - The parameters for the transaction\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @param args.trade - The trade data to confirm\n * @param args.approval - The approval data to confirm\n * @param args.resetApproval - The ethereum:USDT reset approval data to confirm\n * @param args.quoteResponse - The quote response\n * @param args.requireApproval - Whether to require approval for the transaction\n * @returns The approvalMeta and tradeMeta for the batched transaction\n */\n readonly #handleEvmTransactionBatch = async (\n args: Omit<\n Parameters<typeof getAddTransactionBatchParams>[0],\n 'messenger' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messenger: this.messenger,\n estimateGasFeeFn: this.#estimateGasFeeFn,\n ...args,\n });\n const txDataByType = {\n [TransactionType.bridgeApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridgeApproval,\n )?.params.data,\n [TransactionType.swapApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swapApproval,\n )?.params.data,\n [TransactionType.bridge]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridge,\n )?.params.data,\n [TransactionType.swap]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swap,\n )?.params.data,\n };\n\n const { batchId } = await this.#addTransactionBatchFn(transactionParams);\n\n const { approvalMeta, tradeMeta } = findAndUpdateTransactionsInBatch({\n messenger: this.messenger,\n updateTransactionFn: this.#updateTransactionFn,\n batchId,\n txDataByType,\n });\n\n if (!tradeMeta) {\n throw new Error(\n 'Failed to update cross-chain swap transaction batch: tradeMeta not found',\n );\n }\n\n return { approvalMeta, tradeMeta };\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param quotesReceivedContext - The context for the QuotesReceived event\n * @returns The transaction meta\n */\n submitTx = async (\n accountAddress: string,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messenger.call(\n 'BridgeController:stopPollingForQuotes',\n AbortReason.TransactionSubmitted,\n // If trade is submitted before all quotes are loaded, the QuotesReceived event is published\n // If the trade has a featureId, it means it was submitted outside of the Unified Swap and Bridge experience, so no QuotesReceived event is published\n quoteResponse.featureId ? undefined : quotesReceivedContext,\n );\n\n const selectedAccount = this.#getMultichainSelectedAccount(accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const isHardwareAccount = isHardwareWallet(selectedAccount);\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabledOnClient,\n isHardwareAccount,\n );\n // Emit Submitted event after submit button is clicked\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n preConfirmationProperties,\n );\n\n let txMeta: TransactionMeta & Partial<SolanaTransactionMeta>;\n let approvalTxId: string | undefined;\n const startTime = Date.now();\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Submit non-EVM tx (Solana, BTC, Tron)\n const isNonEvmTrade =\n isNonEvmChainId(quoteResponse.quote.srcChainId) &&\n (typeof quoteResponse.trade === 'string' ||\n isBitcoinTrade(quoteResponse.trade) ||\n isTronTrade(quoteResponse.trade));\n\n if (isNonEvmTrade) {\n // Handle non-EVM approval if present (e.g., Tron token approvals)\n if (quoteResponse.approval) {\n const approvalTxMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.approval as Trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse);\n }\n\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n txMeta?.id,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n } else {\n // Submit EVM tx\n // For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval\n // Extension does not have this issue\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && isHardwareAccount;\n\n // Handle smart transactions if enabled\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: isStxEnabledOnClient,\n },\n },\n async () => {\n if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {\n const { tradeMeta, approvalMeta } =\n await this.#handleEvmTransactionBatch({\n isBridgeTx,\n resetApproval: (await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n )) as TxData,\n approval: quoteResponse.approval as TxData,\n trade: quoteResponse.trade as TxData,\n quoteResponse,\n requireApproval,\n });\n\n approvalTxId = approvalMeta?.id;\n return tradeMeta;\n }\n // Set approval time and id if an approval tx is needed\n const approvalTxMeta = await this.#handleApprovalTx(\n isBridgeTx,\n quoteResponse,\n requireApproval,\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n await handleMobileHardwareWalletDelay(requireApproval);\n\n return await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap,\n trade: quoteResponse.trade as TxData,\n requireApproval,\n });\n },\n );\n }\n\n try {\n // Add swap or bridge tx to history\n this.#addTxToHistory({\n accountAddress: selectedAccount.address,\n bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController\n statusRequest: {\n ...getStatusRequestParams(quoteResponse),\n srcTxHash: txMeta.hash,\n },\n quoteResponse,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n isStxEnabled: isStxEnabledOnClient,\n startTime,\n approvalTxId,\n });\n\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track non-EVM Swap completed event\n if (!isBridgeTx) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n txMeta.id,\n );\n }\n }\n } catch {\n // Ignore errors here, we don't want to crash the app if this fails and tx submission succeeds\n }\n return txMeta;\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txMetaId - The txMetaId of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n T extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed,\n >(\n eventName: T,\n txMetaId?: string,\n eventProperties?: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n ...(eventProperties ?? {}),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!txMetaId) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n baseProperties,\n );\n return;\n }\n\n const historyItem: BridgeHistoryItem | undefined =\n this.state.txHistory[txMetaId];\n if (!historyItem) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n // Always publish StatusValidationFailed event, regardless of featureId\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n const {\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n } = requestParamProperties;\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n {\n ...baseProperties,\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n return;\n }\n\n // Skip tracking all other events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = transactions?.find(({ id }) => id === txMetaId);\n const approvalTxMeta = transactions?.find(\n ({ id }) => id === historyItem.approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(historyItem.quote),\n };\n\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridge-status-controller.cjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { QuoteWarning } from '@metamask/bridge-controller';\nimport {\n type QuoteMetadata,\n type RequiredEventContextFromClient,\n type TxData,\n type QuoteResponse,\n type Trade,\n getQuotesReceivedProperties,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isNonEvmChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\n isBitcoinTrade,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { toHex } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n TransactionController,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n TraceName,\n} from './constants';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n SolanaTransactionMeta,\n BridgeHistoryItem,\n} from './types';\nimport { type BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n} from './utils/bridge-status';\nimport { getTxGasEstimates } from './utils/gas';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport {\n findAndUpdateTransactionsInBatch,\n getAddTransactionBatchParams,\n getClientRequest,\n getStatusRequestParams,\n getUSDTAllowanceResetTx,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n handleNonEvmTxResponse,\n generateActionId,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionFn: typeof TransactionController.prototype.addTransaction;\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n\n readonly #estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionFn,\n addTransactionBatchFn,\n updateTransactionFn,\n estimateGasFeeFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionFn: typeof TransactionController.prototype.addTransaction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionFn = addTransactionFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#updateTransactionFn = updateTransactionFn;\n this.#estimateGasFeeFn = estimateGasFeeFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n // Register action handlers\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:getBridgeHistoryItemByTxMetaId`,\n this.getBridgeHistoryItemByTxMetaId.bind(this),\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe(\n 'TransactionController:transactionFailed',\n ({ transactionMeta }) => {\n const { type, status, id } = transactionMeta;\n if (\n type &&\n [\n TransactionType.bridge,\n TransactionType.swap,\n TransactionType.bridgeApproval,\n TransactionType.swapApproval,\n ].includes(type) &&\n [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(status)\n ) {\n // Mark tx as failed in txHistory\n this.#markTxAsFailed(transactionMeta);\n // Track failed event\n if (status !== TransactionStatus.rejected) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n id,\n getEVMTxPropertiesFromTransactionMeta(transactionMeta),\n );\n }\n }\n },\n );\n\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n const { type, id, chainId } = transactionMeta;\n if (type === TransactionType.swap) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n id,\n );\n }\n if (type === TransactionType.bridge && !isNonEvmChainId(chainId)) {\n this.#startPollingForTxId(id);\n }\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n // Mark tx as failed in txHistory if either the approval or trade fails\n readonly #markTxAsFailed = ({ id }: TransactionMeta) => {\n const txHistoryKey = this.state.txHistory[id]\n ? id\n : Object.keys(this.state.txHistory).find(\n (key) => this.state.txHistory[key].approvalTxId === id,\n );\n if (!txHistoryKey) {\n return;\n }\n this.update((statusState) => {\n statusState.txHistory[txHistoryKey].status.status = StatusTypes.FAILED;\n });\n };\n\n resetState = () => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }) => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const { selectedNetworkClientId } = this.messenger.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const selectedChainId = selectedNetworkClient.configuration.chainId;\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }) => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this is a bridge transaction\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n\n if (isBridgeTx) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = () => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.values(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n (historyItem) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n .filter((historyItem) => {\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Swap txs don't need to have their statuses polled\n .filter((historyItem) => {\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n return isBridgeTx;\n });\n\n incompleteHistoryItems.forEach((historyItem) => {\n const bridgeTxMetaId = historyItem.txMetaId;\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(bridgeTxMetaId);\n });\n };\n\n readonly #addTxToHistory = (\n startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const {\n bridgeTxMeta,\n statusRequest,\n quoteResponse,\n startTime,\n slippagePercentage,\n initialDestAssetBalance,\n targetContractAddress,\n approvalTxId,\n isStxEnabled,\n accountAddress: selectedAddress,\n } = startPollingForBridgeTxStatusArgs;\n\n // Write all non-status fields to state so we can reference the quote in Activity list without the Bridge API\n // We know it's in progress but not the exact status yet\n const txHistoryItem = {\n txMetaId: bridgeTxMeta.id,\n batchId: bridgeTxMeta.batchId,\n quote: quoteResponse.quote,\n startTime,\n estimatedProcessingTimeInSeconds:\n quoteResponse.estimatedProcessingTimeInSeconds,\n slippagePercentage,\n pricingData: {\n amountSent: quoteResponse.sentAmount?.amount ?? '0',\n amountSentInUsd: quoteResponse.sentAmount?.usd ?? undefined,\n quotedGasInUsd: quoteResponse.gasFee?.effective?.usd ?? undefined,\n quotedReturnInUsd: quoteResponse.toTokenAmount?.usd ?? undefined,\n quotedGasAmount: quoteResponse.gasFee?.effective?.amount ?? undefined,\n },\n initialDestAssetBalance,\n targetContractAddress,\n account: selectedAddress,\n status: {\n // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that\n // Also we know the bare minimum fields for status at this point in time\n status: StatusTypes.PENDING,\n srcChain: {\n chainId: statusRequest.srcChainId,\n txHash: statusRequest.srcTxHash,\n },\n },\n hasApprovalTx: Boolean(quoteResponse.approval),\n approvalTxId,\n isStxEnabled: isStxEnabled ?? false,\n featureId: quoteResponse.featureId,\n };\n this.update((state) => {\n // Use the txMeta.id as the key so we can reference the txMeta in TransactionController\n state.txHistory[bridgeTxMeta.id] = txHistoryItem;\n });\n };\n\n readonly #startPollingForTxId = (txId: string) => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (!txHistoryItem) {\n return;\n }\n const { quote } = txHistoryItem;\n\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n if (isBridgeTx) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n this.#addTxToHistory(txHistoryMeta);\n this.#startPollingForTxId(bridgeTxMeta.id);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (pollingInput: BridgeStatusPollingInput) => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n #getMultichainSelectedAccount(accountAddress: string) {\n return this.messenger.call(\n 'AccountsController:getAccountByAddress',\n accountAddress,\n );\n }\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - 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.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string) => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Update the attempts counter\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].attempts = newAttempts;\n });\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs) => {\n const { txHistory } = this.state;\n\n if (\n shouldSkipFetchDueToFetchFailures(txHistory[bridgeTxMetaId]?.attempts)\n ) {\n return;\n }\n\n try {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const historyItem = txHistory[bridgeTxMetaId];\n const srcTxHash = this.#getSrcTxHash(bridgeTxMetaId);\n if (!srcTxHash) {\n return;\n }\n\n this.#updateSrcTxHash(bridgeTxMetaId, srcTxHash);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const { status, validationFailures } = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Skip tracking events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (e) {\n console.warn('Failed to fetch bridge tx status', e);\n this.#handleFetchFailure(bridgeTxMetaId);\n }\n };\n\n readonly #getSrcTxHash = (bridgeTxMetaId: string): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (srcTxHash) {\n return srcTxHash;\n }\n\n // Look up in TransactionController if txMeta has been updated with the srcTxHash\n const txControllerState = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = txControllerState.transactions.find(\n (tx: TransactionMeta) => tx.id === bridgeTxMetaId,\n );\n return txMeta?.hash;\n };\n\n readonly #updateSrcTxHash = (bridgeTxMetaId: string, srcTxHash: string) => {\n const { txHistory } = this.state;\n if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {\n return;\n }\n\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ) => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n /**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleNonEvmTx = async (\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n ) => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount,\n );\n const requestResponse = (await this.messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n // Create quote response with the specified trade\n // This allows the same method to handle both approvals and main trades\n const txQuoteResponse: QuoteResponse<Trade> & QuoteMetadata = {\n ...quoteResponse,\n trade,\n };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n txQuoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n };\n\n readonly #waitForHashAndReturnFinalTxMeta = async (\n hashPromise?: Awaited<\n ReturnType<TransactionController['addTransaction']>\n >['result'],\n ): Promise<TransactionMeta> => {\n const transactionHash = await hashPromise;\n const finalTransactionMeta: TransactionMeta | undefined = this.messenger\n .call('TransactionController:getState')\n .transactions.find((tx: TransactionMeta) => tx.hash === transactionHash);\n if (!finalTransactionMeta) {\n throw new Error(\n 'Failed to submit cross-chain swap tx: txMeta for txHash was not found',\n );\n }\n return finalTransactionMeta;\n };\n\n readonly #handleApprovalTx = async (\n isBridgeTx: boolean,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n requireApproval?: boolean,\n ): Promise<TransactionMeta | undefined> => {\n const { approval } = quoteResponse;\n\n if (approval) {\n const approveTx = async () => {\n await this.#handleUSDTAllowanceReset(quoteResponse);\n\n const approvalTxMeta = await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n trade: approval as TxData,\n requireApproval,\n });\n\n await handleApprovalDelay(quoteResponse);\n return approvalTxMeta;\n };\n\n return await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n approveTx,\n );\n }\n\n return undefined;\n };\n\n /**\n * Submits an EVM transaction to the TransactionController\n *\n * @param params - The parameters for the transaction\n * @param params.transactionType - The type of transaction to submit\n * @param params.trade - The trade data to confirm\n * @param params.requireApproval - Whether to require approval for the transaction\n * @returns The transaction meta\n */\n readonly #handleEvmTransaction = async ({\n transactionType,\n trade,\n requireApproval = false,\n }: {\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n }): Promise<TransactionMeta> => {\n const actionId = generateActionId().toString();\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n };\n const transactionParams: Parameters<\n TransactionController['addTransaction']\n >[0] = {\n ...trade,\n chainId: hexChainId,\n gasLimit: trade.gasLimit?.toString(),\n gas: trade.gasLimit?.toString(),\n };\n const transactionParamsWithMaxGas: TransactionParams = {\n ...transactionParams,\n ...(await this.#calculateGasFees(\n transactionParams,\n networkClientId,\n hexChainId,\n )),\n };\n\n const { result } = await this.#addTransactionFn(\n transactionParamsWithMaxGas,\n requestOptions,\n );\n\n return await this.#waitForHashAndReturnFinalTxMeta(result);\n };\n\n readonly #handleUSDTAllowanceReset = async (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval as TxData,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messenger.call(\n 'GasFeeController:getState',\n );\n const { estimates: txGasFeeEstimates } = await this.#estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n };\n\n /**\n * Submits batched EVM transactions to the TransactionController\n *\n * @param args - The parameters for the transaction\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @param args.trade - The trade data to confirm\n * @param args.approval - The approval data to confirm\n * @param args.resetApproval - The ethereum:USDT reset approval data to confirm\n * @param args.quoteResponse - The quote response\n * @param args.requireApproval - Whether to require approval for the transaction\n * @returns The approvalMeta and tradeMeta for the batched transaction\n */\n readonly #handleEvmTransactionBatch = async (\n args: Omit<\n Parameters<typeof getAddTransactionBatchParams>[0],\n 'messenger' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messenger: this.messenger,\n estimateGasFeeFn: this.#estimateGasFeeFn,\n ...args,\n });\n const txDataByType = {\n [TransactionType.bridgeApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridgeApproval,\n )?.params.data,\n [TransactionType.swapApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swapApproval,\n )?.params.data,\n [TransactionType.bridge]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridge,\n )?.params.data,\n [TransactionType.swap]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swap,\n )?.params.data,\n };\n\n const { batchId } = await this.#addTransactionBatchFn(transactionParams);\n\n const { approvalMeta, tradeMeta } = findAndUpdateTransactionsInBatch({\n messenger: this.messenger,\n updateTransactionFn: this.#updateTransactionFn,\n batchId,\n txDataByType,\n });\n\n if (!tradeMeta) {\n throw new Error(\n 'Failed to update cross-chain swap transaction batch: tradeMeta not found',\n );\n }\n\n return { approvalMeta, tradeMeta };\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true\n * @param warnings - The warnings to publish with the QuotesReceived event\n * @returns The transaction meta\n */\n submitTx = async (\n accountAddress: string,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n isLoading: boolean = false,\n warnings: QuoteWarning[] = [],\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n // If trade is submitted before all quotes are loaded, publish QuotesReceived event\n if (isLoading) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesReceived,\n undefined,\n getQuotesReceivedProperties(quoteResponse, warnings),\n );\n }\n this.messenger.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount(accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const isHardwareAccount = isHardwareWallet(selectedAccount);\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabledOnClient,\n isHardwareAccount,\n );\n // Emit Submitted event after submit button is clicked\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n preConfirmationProperties,\n );\n\n let txMeta: TransactionMeta & Partial<SolanaTransactionMeta>;\n let approvalTxId: string | undefined;\n const startTime = Date.now();\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Submit non-EVM tx (Solana, BTC, Tron)\n const isNonEvmTrade =\n isNonEvmChainId(quoteResponse.quote.srcChainId) &&\n (typeof quoteResponse.trade === 'string' ||\n isBitcoinTrade(quoteResponse.trade) ||\n isTronTrade(quoteResponse.trade));\n\n if (isNonEvmTrade) {\n // Handle non-EVM approval if present (e.g., Tron token approvals)\n if (quoteResponse.approval) {\n const approvalTxMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.approval as Trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse);\n }\n\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n txMeta?.id,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n } else {\n // Submit EVM tx\n // For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval\n // Extension does not have this issue\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && isHardwareAccount;\n\n // Handle smart transactions if enabled\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: isStxEnabledOnClient,\n },\n },\n async () => {\n if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {\n const { tradeMeta, approvalMeta } =\n await this.#handleEvmTransactionBatch({\n isBridgeTx,\n resetApproval: (await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n )) as TxData,\n approval: quoteResponse.approval as TxData,\n trade: quoteResponse.trade as TxData,\n quoteResponse,\n requireApproval,\n });\n\n approvalTxId = approvalMeta?.id;\n return tradeMeta;\n }\n // Set approval time and id if an approval tx is needed\n const approvalTxMeta = await this.#handleApprovalTx(\n isBridgeTx,\n quoteResponse,\n requireApproval,\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n await handleMobileHardwareWalletDelay(requireApproval);\n\n return await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap,\n trade: quoteResponse.trade as TxData,\n requireApproval,\n });\n },\n );\n }\n\n try {\n // Add swap or bridge tx to history\n this.#addTxToHistory({\n accountAddress: selectedAccount.address,\n bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController\n statusRequest: {\n ...getStatusRequestParams(quoteResponse),\n srcTxHash: txMeta.hash,\n },\n quoteResponse,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n isStxEnabled: isStxEnabledOnClient,\n startTime,\n approvalTxId,\n });\n\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track non-EVM Swap completed event\n if (!isBridgeTx) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n txMeta.id,\n );\n }\n }\n } catch {\n // Ignore errors here, we don't want to crash the app if this fails and tx submission succeeds\n }\n return txMeta;\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txMetaId - The txMetaId of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n T extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed\n | typeof UnifiedSwapBridgeEventName.QuotesReceived,\n >(\n eventName: T,\n txMetaId?: string,\n eventProperties?: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n ...(eventProperties ?? {}),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!txMetaId) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n baseProperties,\n );\n return;\n }\n\n const historyItem: BridgeHistoryItem | undefined =\n this.state.txHistory[txMetaId];\n if (!historyItem) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n // Always publish StatusValidationFailed event, regardless of featureId\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n const {\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n } = requestParamProperties;\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n {\n ...baseProperties,\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n return;\n }\n\n // Skip tracking all other events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = transactions?.find(({ id }) => id === txMetaId);\n const approvalTxMeta = transactions?.find(\n ({ id }) => id === historyItem.approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(historyItem.quote),\n };\n\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import type { QuoteWarning } from "@metamask/bridge-controller";
|
|
2
|
+
import { type QuoteMetadata, type QuoteResponse, type Trade } from "@metamask/bridge-controller";
|
|
3
3
|
import type { TraceCallback } from "@metamask/controller-utils";
|
|
4
4
|
import type { TransactionController } from "@metamask/transaction-controller";
|
|
5
5
|
import { type TransactionMeta } from "@metamask/transaction-controller";
|
|
@@ -85,10 +85,11 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
|
|
|
85
85
|
* @param accountAddress - The address of the account to submit the transaction for
|
|
86
86
|
* @param quoteResponse - The quote response
|
|
87
87
|
* @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
|
|
88
|
-
* @param
|
|
88
|
+
* @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true
|
|
89
|
+
* @param warnings - The warnings to publish with the QuotesReceived event
|
|
89
90
|
* @returns The transaction meta
|
|
90
91
|
*/
|
|
91
|
-
submitTx: (accountAddress: string, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, isStxEnabledOnClient: boolean,
|
|
92
|
+
submitTx: (accountAddress: string, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, isStxEnabledOnClient: boolean, isLoading?: boolean, warnings?: QuoteWarning[]) => Promise<TransactionMeta & Partial<SolanaTransactionMeta>>;
|
|
92
93
|
}
|
|
93
94
|
export {};
|
|
94
95
|
//# sourceMappingURL=bridge-status-controller.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"bridge-status-controller.d.cts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,oCAAoC;AAChE,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,aAAa,EAClB,KAAK,KAAK,EAEX,oCAAoC;AAarC,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAGhE,OAAO,KAAK,EACV,qBAAqB,EAEtB,yCAAyC;AAC1C,OAAO,EAGL,KAAK,eAAe,EACrB,yCAAyC;AAG1C,OAAO,EAEL,6BAA6B,EAK9B,wBAAoB;AACrB,OAAO,KAAK,EACV,2BAA2B,EAC3B,2CAA2C,EAC3C,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EAClB,oBAAgB;AACjB,OAAO,EAAE,KAAK,+BAA+B,EAAE,oBAAgB;AAC/D,OAAO,EAAE,cAAc,EAAE,oBAAgB;AAwCzC,wEAAwE;AACxE,KAAK,wBAAwB,GAAG,uBAAuB,CAAC;AAGxD,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;;;;;;;;;;;;;;;;AACF,qBAAa,sBAAuB,SAAQ,4BAC1C,OAAO,6BAA6B,EACpC,2BAA2B,EAC3B,+BAA+B,CAChC;;gBAqBa,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,EACN,OAAO,GACR,EAAE;QACD,SAAS,EAAE,+BAA+B,CAAC;QAC3C,KAAK,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7C,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,aAAa,CAAC;QACvB,gBAAgB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;QACxE,qBAAqB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,mBAAmB,CAAC;QAClF,mBAAmB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAC9E,gBAAgB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;QACxE,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,OAAO,CAAC,EAAE,aAAa,CAAC;KACzB;IA0HD,UAAU,aAIR;IAEF,gBAAgB;iBAIL,MAAM;uBACA,OAAO;eAmBtB;IAEF;;;;;;;OAOG;IACH,+BAA+B,eAAgB;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,UAuDC;IAEF;;;;;OAKG;IACH,8BAA8B,aAClB,MAAM,KACf,iBAAiB,GAAG,SAAS,CAE9B;IA2HF;;;;;;;;;OASG;IACH,6BAA6B,kBACZ,2CAA2C,UAM1D;IAIF,YAAY,iBAAwB,wBAAwB,mBAE1D;IAsfF;;;;;;;;;OASG;IACH,QAAQ,mBACU,MAAM,iBACP,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,wBACpC,OAAO,cAClB,OAAO,aACR,YAAY,EAAE,KACvB,QAAQ,eAAe,GAAG,QAAQ,qBAAqB,CAAC,CAAC,CAiN1D;CAyGH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import type { QuoteWarning } from "@metamask/bridge-controller";
|
|
2
|
+
import { type QuoteMetadata, type QuoteResponse, type Trade } from "@metamask/bridge-controller";
|
|
3
3
|
import type { TraceCallback } from "@metamask/controller-utils";
|
|
4
4
|
import type { TransactionController } from "@metamask/transaction-controller";
|
|
5
5
|
import { type TransactionMeta } from "@metamask/transaction-controller";
|
|
@@ -85,10 +85,11 @@ export declare class BridgeStatusController extends BridgeStatusController_base<
|
|
|
85
85
|
* @param accountAddress - The address of the account to submit the transaction for
|
|
86
86
|
* @param quoteResponse - The quote response
|
|
87
87
|
* @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
|
|
88
|
-
* @param
|
|
88
|
+
* @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true
|
|
89
|
+
* @param warnings - The warnings to publish with the QuotesReceived event
|
|
89
90
|
* @returns The transaction meta
|
|
90
91
|
*/
|
|
91
|
-
submitTx: (accountAddress: string, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, isStxEnabledOnClient: boolean,
|
|
92
|
+
submitTx: (accountAddress: string, quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata, isStxEnabledOnClient: boolean, isLoading?: boolean, warnings?: QuoteWarning[]) => Promise<TransactionMeta & Partial<SolanaTransactionMeta>>;
|
|
92
93
|
}
|
|
93
94
|
export {};
|
|
94
95
|
//# sourceMappingURL=bridge-status-controller.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status-controller.d.mts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"bridge-status-controller.d.mts","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,oCAAoC;AAChE,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,aAAa,EAClB,KAAK,KAAK,EAEX,oCAAoC;AAarC,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAGhE,OAAO,KAAK,EACV,qBAAqB,EAEtB,yCAAyC;AAC1C,OAAO,EAGL,KAAK,eAAe,EACrB,yCAAyC;AAG1C,OAAO,EAEL,6BAA6B,EAK9B,wBAAoB;AACrB,OAAO,KAAK,EACV,2BAA2B,EAC3B,2CAA2C,EAC3C,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EAClB,oBAAgB;AACjB,OAAO,EAAE,KAAK,+BAA+B,EAAE,oBAAgB;AAC/D,OAAO,EAAE,cAAc,EAAE,oBAAgB;AAwCzC,wEAAwE;AACxE,KAAK,wBAAwB,GAAG,uBAAuB,CAAC;AAGxD,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;;;;;;;;;;;;;;;;AACF,qBAAa,sBAAuB,SAAQ,4BAC1C,OAAO,6BAA6B,EACpC,2BAA2B,EAC3B,+BAA+B,CAChC;;gBAqBa,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,EACN,OAAO,GACR,EAAE;QACD,SAAS,EAAE,+BAA+B,CAAC;QAC3C,KAAK,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7C,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,aAAa,CAAC;QACvB,gBAAgB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;QACxE,qBAAqB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,mBAAmB,CAAC;QAClF,mBAAmB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,iBAAiB,CAAC;QAC9E,gBAAgB,EAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;QACxE,MAAM,CAAC,EAAE;YACP,sBAAsB,CAAC,EAAE,MAAM,CAAC;SACjC,CAAC;QACF,OAAO,CAAC,EAAE,aAAa,CAAC;KACzB;IA0HD,UAAU,aAIR;IAEF,gBAAgB;iBAIL,MAAM;uBACA,OAAO;eAmBtB;IAEF;;;;;;;OAOG;IACH,+BAA+B,eAAgB;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,UAuDC;IAEF;;;;;OAKG;IACH,8BAA8B,aAClB,MAAM,KACf,iBAAiB,GAAG,SAAS,CAE9B;IA2HF;;;;;;;;;OASG;IACH,6BAA6B,kBACZ,2CAA2C,UAM1D;IAIF,YAAY,iBAAwB,wBAAwB,mBAE1D;IAsfF;;;;;;;;;OASG;IACH,QAAQ,mBACU,MAAM,iBACP,cAAc,KAAK,EAAE,KAAK,CAAC,GAAG,aAAa,wBACpC,OAAO,cAClB,OAAO,aACR,YAAY,EAAE,KACvB,QAAQ,eAAe,GAAG,QAAQ,qBAAqB,CAAC,CAAC,CAiN1D;CAyGH"}
|
|
@@ -10,7 +10,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _BridgeStatusController_instances, _BridgeStatusController_pollingTokensByTxMetaId, _BridgeStatusController_clientId, _BridgeStatusController_fetchFn, _BridgeStatusController_config, _BridgeStatusController_addTransactionFn, _BridgeStatusController_addTransactionBatchFn, _BridgeStatusController_updateTransactionFn, _BridgeStatusController_estimateGasFeeFn, _BridgeStatusController_trace, _BridgeStatusController_markTxAsFailed, _BridgeStatusController_restartPollingForIncompleteHistoryItems, _BridgeStatusController_addTxToHistory, _BridgeStatusController_startPollingForTxId, _BridgeStatusController_getMultichainSelectedAccount, _BridgeStatusController_handleFetchFailure, _BridgeStatusController_fetchBridgeTxStatus, _BridgeStatusController_getSrcTxHash, _BridgeStatusController_updateSrcTxHash, _BridgeStatusController_wipeBridgeStatusByChainId, _BridgeStatusController_handleNonEvmTx, _BridgeStatusController_waitForHashAndReturnFinalTxMeta, _BridgeStatusController_handleApprovalTx, _BridgeStatusController_handleEvmTransaction, _BridgeStatusController_handleUSDTAllowanceReset, _BridgeStatusController_calculateGasFees, _BridgeStatusController_handleEvmTransactionBatch, _BridgeStatusController_trackUnifiedSwapBridgeEvent;
|
|
13
|
-
import {
|
|
13
|
+
import { getQuotesReceivedProperties } from "@metamask/bridge-controller";
|
|
14
|
+
import { formatChainIdToHex, isNonEvmChainId, StatusTypes, UnifiedSwapBridgeEventName, formatChainIdToCaip, isCrossChain, isHardwareWallet, MetricsActionType, isBitcoinTrade, isTronTrade } from "@metamask/bridge-controller";
|
|
14
15
|
import { toHex } from "@metamask/controller-utils";
|
|
15
16
|
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
16
17
|
import { TransactionStatus, TransactionType } from "@metamask/transaction-controller";
|
|
@@ -563,14 +564,16 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
|
|
|
563
564
|
* @param accountAddress - The address of the account to submit the transaction for
|
|
564
565
|
* @param quoteResponse - The quote response
|
|
565
566
|
* @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
|
|
566
|
-
* @param
|
|
567
|
+
* @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true
|
|
568
|
+
* @param warnings - The warnings to publish with the QuotesReceived event
|
|
567
569
|
* @returns The transaction meta
|
|
568
570
|
*/
|
|
569
|
-
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient,
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
571
|
+
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, isLoading = false, warnings = []) => {
|
|
572
|
+
// If trade is submitted before all quotes are loaded, publish QuotesReceived event
|
|
573
|
+
if (isLoading) {
|
|
574
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, UnifiedSwapBridgeEventName.QuotesReceived, undefined, getQuotesReceivedProperties(quoteResponse, warnings));
|
|
575
|
+
}
|
|
576
|
+
this.messenger.call('BridgeController:stopPollingForQuotes');
|
|
574
577
|
const selectedAccount = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
|
|
575
578
|
if (!selectedAccount) {
|
|
576
579
|
throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-status-controller.mjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AASA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACZ,oCAAoC;AAErC,OAAO,EAAE,KAAK,EAAE,mCAAmC;AACnD,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;AAK/E,OAAO,EACL,iBAAiB,EACjB,eAAe,EAEhB,yCAAyC;AAC1C,OAAO,EAAE,WAAW,EAAY,wBAAwB;AAExD,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACV,wBAAoB;AASrB,OAAO,EAAE,cAAc,EAAE,oBAAgB;AACzC,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,iCAAiC,EAClC,kCAA8B;AAC/B,OAAO,EAAE,iBAAiB,EAAE,wBAAoB;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,qCAAqC,EACrC,wBAAwB,EACxB,qCAAqC,EACtC,4BAAwB;AACzB,OAAO,EACL,gCAAgC,EAChC,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,+BAA+B,EAC/B,sBAAsB,EACtB,gBAAgB,EACjB,gCAA4B;AAE7B,MAAM,QAAQ,GAA+C;IAC3D,uGAAuG;IACvG,wDAAwD;IACxD,SAAS,EAAE;QACT,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AASF,MAAM,OAAO,sBAAuB,SAAQ,+BAA+B,EAI1E;IAqBC,YAAY,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,MAAM,EACN,OAAO,GAcR;QACC,KAAK,CAAC;YACJ,IAAI,EAAE,6BAA6B;YACnC,QAAQ;YACR,SAAS;YACT,8BAA8B;YAC9B,KAAK,EAAE;gBACL,GAAG,sCAAsC;gBACzC,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;QAtDL,0DAAwD,EAAE,EAAC;QAElD,mDAA0B;QAE1B,kDAAwB;QAExB,iDAEP;QAEO,2DAAyE;QAEzE,gEAAmF;QAEnF,8DAA+E;QAE/E,2DAAyE;QAEzE,gDAAsB;QAqI/B,uEAAuE;QAC9D,iDAAkB,CAAC,EAAE,EAAE,EAAmB,EAAE,EAAE;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,KAAK,EAAE,CACvD,CAAC;YACN,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC1B,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,eAAU,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAC,SAAS,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,qBAAgB,GAAG,CAAC,EAClB,OAAO,EACP,aAAa,GAId,EAAE,EAAE;YACH,qCAAqC;YACrC,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAC,SAAS,CAAC;gBACrE,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrD,4BAA4B,CAC7B,CAAC;gBACF,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC/C,wCAAwC,EACxC,uBAAuB,CACxB,CAAC;gBACF,MAAM,eAAe,GAAG,qBAAqB,CAAC,aAAa,CAAC,OAAO,CAAC;gBAEpE,uBAAA,IAAI,yDAA2B,MAA/B,IAAI,EAA4B,OAAO,EAAE,eAAe,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QAEF;;;;;;;WAOG;QACH,oCAA+B,GAAG,CAAC,UAGlC,EAAE,EAAE;YACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;YAExC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,8CAA8C;YAC9C,IAAI,cAAkC,CAAC;YAEvC,IAAI,QAAQ,EAAE,CAAC;gBACb,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,cAAc,GAAG,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,6CAA6C;gBAC7C,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACrD,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CACnE,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,2CACE,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EACxD,EAAE,CACH,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAEzD,6BAA6B;YAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,qEAAqE;YACrE,MAAM,UAAU,GAAG,YAAY,CAC7B,WAAW,CAAC,KAAK,CAAC,UAAU,EAC5B,WAAW,CAAC,KAAK,CAAC,WAAW,CAC9B,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,yDAAyD;gBACzD,MAAM,oBAAoB,GACxB,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEhD,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,kBAAkB;oBAClB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,cAAc,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF;;;;;WAKG;QACH,mCAA8B,GAAG,CAC/B,QAAgB,EACe,EAAE;YACjC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC,CAAC;QAEF;;;WAGG;QACM,0EAA2C,GAAG,EAAE;YACvD,mFAAmF;YACnF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,sBAAsB,GAAG,YAAY;iBACxC,MAAM,CACL,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO;gBACjD,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CACpD;iBACA,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;gBACtB,mFAAmF;gBACnF,MAAM,YAAY,GAChB,uBAAA,IAAI,uDAAyB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,CAAC,YAAY,CAAC;YACvB,CAAC,CAAC;gBACF,oDAAoD;iBACnD,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;gBACtB,MAAM,UAAU,GAAG,YAAY,CAC7B,WAAW,CAAC,KAAK,CAAC,UAAU,EAC5B,WAAW,CAAC,KAAK,CAAC,WAAW,CAC9B,CAAC;gBACF,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC,CAAC;YAEL,sBAAsB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC7C,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC5C,MAAM,eAAe,GAAG,iCAAiC,CACvD,WAAW,CAAC,QAAQ,CACrB,CAAC;gBACF,IAAI,eAAe,EAAE,CAAC;oBACpB,OAAO;gBACT,CAAC;gBAED,8FAA8F;gBAC9F,uEAAuE;gBACvE,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,cAAc,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,iDAAkB,CACzB,iCAA8E,EAC9E,EAAE;YACF,MAAM,EACJ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,cAAc,EAAE,eAAe,GAChC,GAAG,iCAAiC,CAAC;YAEtC,6GAA6G;YAC7G,wDAAwD;YACxD,MAAM,aAAa,GAAG;gBACpB,QAAQ,EAAE,YAAY,CAAC,EAAE;gBACzB,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,SAAS;gBACT,gCAAgC,EAC9B,aAAa,CAAC,gCAAgC;gBAChD,kBAAkB;gBAClB,WAAW,EAAE;oBACX,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG;oBACnD,eAAe,EAAE,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,SAAS;oBAC3D,cAAc,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,SAAS;oBACjE,iBAAiB,EAAE,aAAa,CAAC,aAAa,EAAE,GAAG,IAAI,SAAS;oBAChE,eAAe,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,SAAS;iBACtE;gBACD,uBAAuB;gBACvB,qBAAqB;gBACrB,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE;oBACN,qGAAqG;oBACrG,wEAAwE;oBACxE,MAAM,EAAE,WAAW,CAAC,OAAO;oBAC3B,QAAQ,EAAE;wBACR,OAAO,EAAE,aAAa,CAAC,UAAU;wBACjC,MAAM,EAAE,aAAa,CAAC,SAAS;qBAChC;iBACF;gBACD,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAC9C,YAAY;gBACZ,YAAY,EAAE,YAAY,IAAI,KAAK;gBACnC,SAAS,EAAE,aAAa,CAAC,SAAS;aACnC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,uFAAuF;gBACvF,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,sDAAuB,CAAC,IAAY,EAAE,EAAE;YAC/C,+EAA+E;YAC/E,MAAM,oBAAoB,GAAG,uBAAA,IAAI,uDAAyB,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC;YAEhC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,UAAU,EAAE,CAAC;gBACf,uBAAA,IAAI,uDAAyB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;oBACtD,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAC;QAEF;;;;;;;;;WASG;QACH,kCAA6B,GAAG,CAC9B,aAA0D,EAC1D,EAAE;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YAEvC,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB,aAAa,CAAC,CAAC;YACpC,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,YAAY,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,yDAAyD;QACzD,kEAAkE;QAClE,iBAAY,GAAG,KAAK,EAAE,YAAsC,EAAE,EAAE;YAC9D,MAAM,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,YAAY,CAAC,CAAC;QAChD,CAAC,CAAC;QASF;;;;;;;;WAQG;QACM,qDAAsB,CAAC,cAAsB,EAAE,EAAE;YACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAE1D,MAAM,WAAW,GAAG,QAAQ;gBAC1B,CAAC,CAAC;oBACE,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;oBAC7B,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;iBAC5B;gBACH,CAAC,CAAC;oBACE,OAAO,EAAE,CAAC;oBACV,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;iBAC5B,CAAC;YAEN,0DAA0D;YAC1D,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,WAAW,CAAC,OAAO,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;gBACxD,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;gBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;YACvD,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEO,sDAAuB,KAAK,EAAE,EACrC,cAAc,GACU,EAAE,EAAE;YAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,IACE,iCAAiC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,EACtE,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,0HAA0H;gBAC1H,2GAA2G;gBAC3G,oGAAoG;gBACpG,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,uBAAA,IAAI,4CAAc,MAAlB,IAAI,EAAe,cAAc,CAAC,CAAC;gBACrD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBAED,uBAAA,IAAI,+CAAiB,MAArB,IAAI,EAAkB,cAAc,EAAE,SAAS,CAAC,CAAC;gBAEjD,MAAM,aAAa,GAAG,6BAA6B,CACjD,WAAW,CAAC,KAAK,EACjB,SAAS,CACV,CAAC;gBACF,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,mBAAmB,CAC9D,aAAa,EACb,uBAAA,IAAI,wCAAU,EACd,uBAAA,IAAI,uCAAS,EACb,uBAAA,IAAI,sCAAQ,CAAC,sBAAsB,CACpC,CAAC;gBAEF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,sBAAsB,EACjD,cAAc,EACd;wBACE,QAAQ,EAAE,kBAAkB;qBAC7B,CACF,CAAC;oBACF,MAAM,IAAI,KAAK,CACb,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;gBACJ,CAAC;gBAED,MAAM,oBAAoB,GAAG;oBAC3B,GAAG,WAAW;oBACd,MAAM;oBACN,cAAc,EACZ,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ;wBACtC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;wBAClC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;wBACZ,CAAC,CAAC,SAAS,EAAE,oEAAoE;oBACrF,QAAQ,EAAE,SAAS;iBACpB,CAAC;gBAEF,2GAA2G;gBAC3G,qFAAqF;gBACrF,yIAAyI;gBACzI,+EAA+E;gBAC/E,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,oBAAoB,CAAC;gBACzD,CAAC,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEnE,MAAM,aAAa,GACjB,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ;oBACtC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC;gBAEvC,IAAI,aAAa,IAAI,YAAY,EAAE,CAAC;oBAClC,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;oBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;oBAErD,0DAA0D;oBAC1D,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;wBAC1B,OAAO;oBACT,CAAC;oBAED,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;wBAC3C,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,cAAc,CACf,CAAC;wBACF,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,wDAAwD,EACxD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CACpC,CAAC;oBACJ,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;wBACzC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,cAAc,CACf,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;gBACpD,uBAAA,IAAI,kDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,EAAC;QAEO,+CAAgB,CAAC,cAAsB,EAAsB,EAAE;YACtE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,oGAAoG;YACpG,oGAAoG;YACpG,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAEnE,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,iFAAiF;YACjF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,gCAAgC,CACjC,CAAC;YACF,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAChD,CAAC,EAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,cAAc,CAClD,CAAC;YACF,OAAO,MAAM,EAAE,IAAI,CAAC;QACtB,CAAC,EAAC;QAEO,kDAAmB,CAAC,cAAsB,EAAE,SAAiB,EAAE,EAAE;YACxE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACjC,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,4DAA4D;QAC5D,wDAAwD;QAC/C,4DAA6B,CACpC,OAAe,EACf,eAAoB,EACpB,EAAE;YACF,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CACtE,CAAC,QAAQ,EAAE,EAAE;gBACX,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAEzD,MAAM,gBAAgB,GAAG,WAAW,CAClC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CACnC,CAAC;gBAEF,OAAO,CACL,iBAAiB,CAAC,OAAO,KAAK,OAAO;oBACrC,gBAAgB,KAAK,eAAe,CACrC,CAAC;YACJ,CAAC,CACF,CAAC;YAEF,uBAAuB,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;gBACjD,MAAM,YAAY,GAAG,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEnE,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,yBAAyB,CAC5B,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAC9C,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE;oBACtB,OAAO,GAAG,CAAC,cAAc,CAAC,CAAC;oBAC3B,OAAO,GAAG,CAAC;gBACb,CAAC,EACD,KAAK,CAAC,SAAS,CAChB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF;;;;WAIG;QAEH;;;;;;;;;;WAUG;QACM,iDAAkB,KAAK,EAC9B,KAAY,EACZ,aAA0D,EAC1D,eAAgF,EAChF,EAAE;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,gBAAgB,CAC9B,KAAK,EACL,aAAa,CAAC,KAAK,CAAC,UAAU,EAC9B,eAAe,CAChB,CAAC;YACF,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAChD,8BAA8B,EAC9B,OAAO,CACR,CAIwB,CAAC;YAE1B,iDAAiD;YACjD,uEAAuE;YACvE,MAAM,eAAe,GAAyC;gBAC5D,GAAG,aAAa;gBAChB,KAAK;aACN,CAAC;YAEF,MAAM,MAAM,GAAG,sBAAsB,CACnC,eAAe,EACf,eAAe,EACf,eAAe,CAChB,CAAC;YAEF,iFAAiF;YACjF,uNAAuN;YACvN,OAAO,MAAM,CAAC;QAChB,CAAC,EAAC;QAEO,kEAAmC,KAAK,EAC/C,WAEW,EACe,EAAE;YAC5B,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC;YAC1C,MAAM,oBAAoB,GAAgC,IAAI,CAAC,SAAS;iBACrE,IAAI,CAAC,gCAAgC,CAAC;iBACtC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;YAC3E,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;YACJ,CAAC;YACD,OAAO,oBAAoB,CAAC;QAC9B,CAAC,EAAC;QAEO,mDAAoB,KAAK,EAChC,UAAmB,EACnB,aAAqD,EACrD,eAAyB,EACa,EAAE;YACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;YAEnC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;oBAC3B,MAAM,uBAAA,IAAI,wDAA0B,MAA9B,IAAI,EAA2B,aAAa,CAAC,CAAC;oBAEpD,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,oDAAsB,MAA1B,IAAI,EAAuB;wBACtD,eAAe,EAAE,UAAU;4BACzB,CAAC,CAAC,eAAe,CAAC,cAAc;4BAChC,CAAC,CAAC,eAAe,CAAC,YAAY;wBAChC,KAAK,EAAE,QAAkB;wBACzB,eAAe;qBAChB,CAAC,CAAC;oBAEH,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;oBACzC,OAAO,cAAc,CAAC;gBACxB,CAAC,CAAC;gBAEF,OAAO,MAAM,uBAAA,IAAI,qCAAO,MAAX,IAAI,EACf;oBACE,IAAI,EAAE,UAAU;wBACd,CAAC,CAAC,SAAS,CAAC,kCAAkC;wBAC9C,CAAC,CAAC,SAAS,CAAC,gCAAgC;oBAC9C,IAAI,EAAE;wBACJ,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;wBAC/D,UAAU,EAAE,KAAK;qBAClB;iBACF,EACD,SAAS,CACV,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,EAAC;QAEF;;;;;;;;WAQG;QACM,uDAAwB,KAAK,EAAE,EACtC,eAAe,EACf,KAAK,EACL,eAAe,GAAG,KAAK,GAKxB,EAA4B,EAAE;YAC7B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC;YAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,wCAAwC,EACxC,KAAK,CAAC,IAAI,CACX,CAAC;YACF,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,gDAAgD,EAChD,UAAU,CACX,CAAC;YAEF,MAAM,cAAc,GAAG;gBACrB,QAAQ;gBACR,eAAe;gBACf,eAAe;gBACf,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,UAAU;aACnB,CAAC;YACF,MAAM,iBAAiB,GAEhB;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACpC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;aAChC,CAAC;YACF,MAAM,2BAA2B,GAAsB;gBACrD,GAAG,iBAAiB;gBACpB,GAAG,CAAC,MAAM,uBAAA,IAAI,gDAAkB,MAAtB,IAAI,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,CACX,CAAC;aACH,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAA,IAAI,gDAAkB,MAAtB,IAAI,EAC3B,2BAA2B,EAC3B,cAAc,CACf,CAAC;YAEF,OAAO,MAAM,uBAAA,IAAI,+DAAiC,MAArC,IAAI,EAAkC,MAAM,CAAC,CAAC;QAC7D,CAAC,EAAC;QAEO,2DAA4B,KAAK,EACxC,aAAqD,EACrD,EAAE;YACF,MAAM,aAAa,GAAG,MAAM,uBAAuB,CACjD,IAAI,CAAC,SAAS,EACd,aAAa,CACd,CAAC;YACF,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,uBAAA,IAAI,oDAAsB,MAA1B,IAAI,EAAuB;oBAC/B,eAAe,EAAE,eAAe,CAAC,cAAc;oBAC/C,KAAK,EAAE,aAAuB;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAC;QAEO,mDAAoB,KAAK,EAChC,iBAAoC,EACpC,eAAuB,EACvB,OAAY,EACZ,EAAE;YACF,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC7C,2BAA2B,CAC5B,CAAC;YACF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,uBAAA,IAAI,gDAAkB,MAAtB,IAAI,EAAmB;gBACpE,iBAAiB;gBACjB,OAAO;gBACP,eAAe;aAChB,CAAC,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,iBAAiB,CAAC;gBAC/D,sBAAsB,EAAE,eAAe;gBACvC,iBAAiB;aAClB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAEtD,OAAO;gBACL,YAAY;gBACZ,oBAAoB;gBACpB,GAAG,EAAE,WAAW;aACjB,CAAC;QACJ,CAAC,EAAC;QAEF;;;;;;;;;;;WAWG;QACM,4DAA6B,KAAK,EACzC,IAGC,EACD,EAAE;YACF,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC;gBAC3D,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,gBAAgB,EAAE,uBAAA,IAAI,gDAAkB;gBACxC,GAAG,IAAI;aACR,CAAC,CAAC;YACH,MAAM,YAAY,GAAG;gBACnB,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACnE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,cAAc,CACtD,EAAE,MAAM,CAAC,IAAI;gBACd,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACjE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,CACpD,EAAE,MAAM,CAAC,IAAI;gBACd,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAC3D,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAC9C,EAAE,MAAM,CAAC,IAAI;gBACd,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CACzD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAC5C,EAAE,MAAM,CAAC,IAAI;aACf,CAAC;YAEF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,uBAAA,IAAI,qDAAuB,MAA3B,IAAI,EAAwB,iBAAiB,CAAC,CAAC;YAEzE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,gCAAgC,CAAC;gBACnE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,mBAAmB,EAAE,uBAAA,IAAI,mDAAqB;gBAC9C,OAAO;gBACP,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC,EAAC;QAEF;;;;;;;;WAQG;QACH,aAAQ,GAAG,KAAK,EACd,cAAsB,EACtB,aAA0D,EAC1D,oBAA6B,EAC7B,qBAAiG,EACtC,EAAE;YAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,uCAAuC,EACvC,WAAW,CAAC,oBAAoB;YAChC,4FAA4F;YAC5F,qJAAqJ;YACrJ,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAC5D,CAAC;YAEF,MAAM,eAAe,GAAG,uBAAA,IAAI,+FAA8B,MAAlC,IAAI,EAA+B,cAAc,CAAC,CAAC;YAC3E,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,CAAC;YACD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;YAE5D,MAAM,yBAAyB,GAAG,qCAAqC,CACrE,aAAa,EACb,oBAAoB,EACpB,iBAAiB,CAClB,CAAC;YACF,sDAAsD;YACtD,CAAC,aAAa,CAAC,SAAS;gBACtB,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,SAAS,EACT,yBAAyB,CAC1B,CAAC;YAEJ,IAAI,MAAwD,CAAC;YAC7D,IAAI,YAAgC,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,MAAM,UAAU,GAAG,YAAY,CAC7B,aAAa,CAAC,KAAK,CAAC,UAAU,EAC9B,aAAa,CAAC,KAAK,CAAC,WAAW,CAChC,CAAC;YAEF,wCAAwC;YACxC,MAAM,aAAa,GACjB,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC/C,CAAC,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;oBACtC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC;oBACnC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtC,IAAI,aAAa,EAAE,CAAC;gBAClB,kEAAkE;gBAClE,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;oBAC3B,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,qCAAO,MAAX,IAAI,EAC/B;wBACE,IAAI,EAAE,UAAU;4BACd,CAAC,CAAC,SAAS,CAAC,kCAAkC;4BAC9C,CAAC,CAAC,SAAS,CAAC,gCAAgC;wBAC9C,IAAI,EAAE;4BACJ,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;4BAC/D,UAAU,EAAE,KAAK;yBAClB;qBACF,EACD,KAAK,IAAI,EAAE;wBACT,IAAI,CAAC;4BACH,OAAO,MAAM,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EACf,aAAa,CAAC,QAAiB,EAC/B,aAAa,EACb,eAAe,CAChB,CAAC;wBACJ,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,CAAC,aAAa,CAAC,SAAS;gCACtB,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,SAAS,EACT;oCACE,aAAa,EAAG,KAAe,EAAE,OAAO;oCACxC,GAAG,yBAAyB;iCAC7B,CACF,CAAC;4BACJ,MAAM,KAAK,CAAC;wBACd,CAAC;oBACH,CAAC,CACF,CAAC;oBAEF,YAAY,GAAG,cAAc,EAAE,EAAE,CAAC;oBAElC,+CAA+C;oBAC/C,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;gBAC3C,CAAC;gBAED,MAAM,GAAG,MAAM,uBAAA,IAAI,qCAAO,MAAX,IAAI,EACjB;oBACE,IAAI,EAAE,UAAU;wBACd,CAAC,CAAC,SAAS,CAAC,0BAA0B;wBACtC,CAAC,CAAC,SAAS,CAAC,wBAAwB;oBACtC,IAAI,EAAE;wBACJ,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;wBAC/D,UAAU,EAAE,KAAK;qBAClB;iBACF,EACD,KAAK,IAAI,EAAE;oBACT,IAAI,CAAC;wBACH,OAAO,MAAM,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EACf,aAAa,CAAC,KAAK,EACnB,aAAa,EACb,eAAe,CAChB,CAAC;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,CAAC,aAAa,CAAC,SAAS;4BACtB,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,MAAM,EAAE,EAAE,EACV;gCACE,aAAa,EAAG,KAAe,EAAE,OAAO;gCACxC,GAAG,yBAAyB;6BAC7B,CACF,CAAC;wBACJ,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,qHAAqH;gBACrH,qCAAqC;gBACrC,MAAM,eAAe,GACnB,uBAAA,IAAI,wCAAU,KAAK,cAAc,CAAC,MAAM,IAAI,iBAAiB,CAAC;gBAEhE,uCAAuC;gBACvC,MAAM,GAAG,MAAM,uBAAA,IAAI,qCAAO,MAAX,IAAI,EACjB;oBACE,IAAI,EAAE,UAAU;wBACd,CAAC,CAAC,SAAS,CAAC,0BAA0B;wBACtC,CAAC,CAAC,SAAS,CAAC,wBAAwB;oBACtC,IAAI,EAAE;wBACJ,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;wBAC/D,UAAU,EAAE,oBAAoB;qBACjC;iBACF,EACD,KAAK,IAAI,EAAE;oBACT,IAAI,oBAAoB,IAAI,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;wBAChE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAC/B,MAAM,uBAAA,IAAI,yDAA2B,MAA/B,IAAI,EAA4B;4BACpC,UAAU;4BACV,aAAa,EAAE,CAAC,MAAM,uBAAuB,CAC3C,IAAI,CAAC,SAAS,EACd,aAAa,CACd,CAAW;4BACZ,QAAQ,EAAE,aAAa,CAAC,QAAkB;4BAC1C,KAAK,EAAE,aAAa,CAAC,KAAe;4BACpC,aAAa;4BACb,eAAe;yBAChB,CAAC,CAAC;wBAEL,YAAY,GAAG,YAAY,EAAE,EAAE,CAAC;wBAChC,OAAO,SAAS,CAAC;oBACnB,CAAC;oBACD,uDAAuD;oBACvD,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,gDAAkB,MAAtB,IAAI,EAC/B,UAAU,EACV,aAAa,EACb,eAAe,CAChB,CAAC;oBAEF,YAAY,GAAG,cAAc,EAAE,EAAE,CAAC;oBAElC,MAAM,+BAA+B,CAAC,eAAe,CAAC,CAAC;oBAEvD,OAAO,MAAM,uBAAA,IAAI,oDAAsB,MAA1B,IAAI,EAAuB;wBACtC,eAAe,EAAE,UAAU;4BACzB,CAAC,CAAC,eAAe,CAAC,MAAM;4BACxB,CAAC,CAAC,eAAe,CAAC,IAAI;wBACxB,KAAK,EAAE,aAAa,CAAC,KAAe;wBACpC,eAAe;qBAChB,CAAC,CAAC;gBACL,CAAC,CACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,mCAAmC;gBACnC,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB;oBACnB,cAAc,EAAE,eAAe,CAAC,OAAO;oBACvC,YAAY,EAAE,MAAM,EAAE,0DAA0D;oBAChF,aAAa,EAAE;wBACb,GAAG,sBAAsB,CAAC,aAAa,CAAC;wBACxC,SAAS,EAAE,MAAM,CAAC,IAAI;qBACvB;oBACD,aAAa;oBACb,kBAAkB,EAAE,CAAC,EAAE,oGAAoG;oBAC3H,YAAY,EAAE,oBAAoB;oBAClC,SAAS;oBACT,YAAY;iBACb,CAAC,CAAC;gBAEH,IAAI,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpD,qCAAqC;oBACrC,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,MAAM,CAAC,EAAE,CAAC,CAAC;oBACrC,qCAAqC;oBACrC,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,MAAM,CAAC,EAAE,CACV,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8FAA8F;YAChG,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF;;;;;;WAMG;QACM,8DAA+B,CAOtC,SAAY,EACZ,QAAiB,EACjB,eAA4D,EAC5D,EAAE;YACF,MAAM,cAAc,GAAG;gBACrB,WAAW,EAAE,iBAAiB,CAAC,aAAa;gBAC5C,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;aAC3B,CAAC;YAEF,iEAAiE;YACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,8CAA8C,EAC9C,SAAS,EACT,cAAc,CACf,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,8CAA8C,EAC9C,SAAS,EACT,eAAe,IAAI,EAAE,CACtB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;YACvE,uEAAuE;YACvE,IAAI,SAAS,KAAK,0BAA0B,CAAC,sBAAsB,EAAE,CAAC;gBACpE,MAAM,EACJ,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,GAC1B,GAAG,sBAAsB,CAAC;gBAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,8CAA8C,EAC9C,SAAS,EACT;oBACE,GAAG,cAAc;oBACjB,eAAe;oBACf,oBAAoB;oBACpB,oBAAoB;oBACpB,yBAAyB;oBACzB,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC;iBAClD,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,oEAAoE;YACpE,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,wCAAwC,EACxC,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC1C,gCAAgC,CACjC,CAAC;YACF,MAAM,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,YAAY,EAAE,IAAI,CACvC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,CAC5C,CAAC;YAEF,MAAM,uBAAuB,GAAG;gBAC9B,GAAG,cAAc;gBACjB,GAAG,sBAAsB;gBACzB,GAAG,6BAA6B,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC9D,GAAG,uBAAuB,CAAC,WAAW,CAAC;gBACvC,GAAG,wBAAwB,CAAC,WAAW,CAAC;gBACxC,GAAG,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC;gBAChE,GAAG,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC;aAC9C,CAAC;YAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,8CAA8C,EAC9C,SAAS,EACT,uBAAuB,CACxB,CAAC;QACJ,CAAC,EAAC;QAxqCA,uBAAA,IAAI,oCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,mCAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,4CAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,iDAA0B,qBAAqB,MAAA,CAAC;QACpD,uBAAA,IAAI,+CAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,4CAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,kCAAW;YACb,sBAAsB,EACpB,MAAM,EAAE,sBAAsB,IAAI,wBAAwB;SAC7D,MAAA,CAAC;QACF,uBAAA,IAAI,iCAAU,OAAO,IAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAmB,MAAA,CAAC;QAEvE,2BAA2B;QAC3B,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,gCAAgC,EAChE,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9C,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,mBAAmB,EACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,aAAa,EAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,WAAW,EAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,kCAAkC,EAClE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAChD,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,GAAG,6BAA6B,iCAAiC,EACjE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/C,CAAC;QAEF,eAAe;QACf,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE5C,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,yCAAyC,EACzC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;YACtB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,CAAC;YAC7C,IACE,IAAI;gBACJ;oBACE,eAAe,CAAC,MAAM;oBACtB,eAAe,CAAC,IAAI;oBACpB,eAAe,CAAC,cAAc;oBAC9B,eAAe,CAAC,YAAY;iBAC7B,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChB;oBACE,iBAAiB,CAAC,MAAM;oBACxB,iBAAiB,CAAC,OAAO;oBACzB,iBAAiB,CAAC,QAAQ;iBAC3B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClB,CAAC;gBACD,iCAAiC;gBACjC,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB,eAAe,CAAC,CAAC;gBACtC,qBAAqB;gBACrB,IAAI,MAAM,KAAK,iBAAiB,CAAC,QAAQ,EAAE,CAAC;oBAC1C,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,EAAE,EACF,qCAAqC,CAAC,eAAe,CAAC,CACvD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,4CAA4C,EAC5C,CAAC,eAAe,EAAE,EAAE;YAClB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;YAC9C,IAAI,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC;gBAClC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,EAAE,CACH,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,eAAe,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjE,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CACF,CAAC;QAEF,+EAA+E;QAC/E,8CAA8C;QAC9C,mFAAmF;QACnF,uBAAA,IAAI,uEAAyC,MAA7C,IAAI,CAA2C,CAAC;IAClD,CAAC;CA4kCF;isDAzzB+B,cAAsB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CACxB,wCAAwC,EACxC,cAAc,CACf,CAAC;AACJ,CAAC","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type QuoteMetadata,\n type RequiredEventContextFromClient,\n type TxData,\n type QuoteResponse,\n type Trade,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isNonEvmChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\n isBitcoinTrade,\n isTronTrade,\n AbortReason,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { toHex } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n TransactionController,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n TraceName,\n} from './constants';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n SolanaTransactionMeta,\n BridgeHistoryItem,\n} from './types';\nimport { type BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n} from './utils/bridge-status';\nimport { getTxGasEstimates } from './utils/gas';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport {\n findAndUpdateTransactionsInBatch,\n getAddTransactionBatchParams,\n getClientRequest,\n getStatusRequestParams,\n getUSDTAllowanceResetTx,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n handleNonEvmTxResponse,\n generateActionId,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionFn: typeof TransactionController.prototype.addTransaction;\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n\n readonly #estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionFn,\n addTransactionBatchFn,\n updateTransactionFn,\n estimateGasFeeFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionFn: typeof TransactionController.prototype.addTransaction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionFn = addTransactionFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#updateTransactionFn = updateTransactionFn;\n this.#estimateGasFeeFn = estimateGasFeeFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n // Register action handlers\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:getBridgeHistoryItemByTxMetaId`,\n this.getBridgeHistoryItemByTxMetaId.bind(this),\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe(\n 'TransactionController:transactionFailed',\n ({ transactionMeta }) => {\n const { type, status, id } = transactionMeta;\n if (\n type &&\n [\n TransactionType.bridge,\n TransactionType.swap,\n TransactionType.bridgeApproval,\n TransactionType.swapApproval,\n ].includes(type) &&\n [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(status)\n ) {\n // Mark tx as failed in txHistory\n this.#markTxAsFailed(transactionMeta);\n // Track failed event\n if (status !== TransactionStatus.rejected) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n id,\n getEVMTxPropertiesFromTransactionMeta(transactionMeta),\n );\n }\n }\n },\n );\n\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n const { type, id, chainId } = transactionMeta;\n if (type === TransactionType.swap) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n id,\n );\n }\n if (type === TransactionType.bridge && !isNonEvmChainId(chainId)) {\n this.#startPollingForTxId(id);\n }\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n // Mark tx as failed in txHistory if either the approval or trade fails\n readonly #markTxAsFailed = ({ id }: TransactionMeta) => {\n const txHistoryKey = this.state.txHistory[id]\n ? id\n : Object.keys(this.state.txHistory).find(\n (key) => this.state.txHistory[key].approvalTxId === id,\n );\n if (!txHistoryKey) {\n return;\n }\n this.update((statusState) => {\n statusState.txHistory[txHistoryKey].status.status = StatusTypes.FAILED;\n });\n };\n\n resetState = () => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }) => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const { selectedNetworkClientId } = this.messenger.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const selectedChainId = selectedNetworkClient.configuration.chainId;\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }) => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this is a bridge transaction\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n\n if (isBridgeTx) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = () => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.values(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n (historyItem) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n .filter((historyItem) => {\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Swap txs don't need to have their statuses polled\n .filter((historyItem) => {\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n return isBridgeTx;\n });\n\n incompleteHistoryItems.forEach((historyItem) => {\n const bridgeTxMetaId = historyItem.txMetaId;\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(bridgeTxMetaId);\n });\n };\n\n readonly #addTxToHistory = (\n startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const {\n bridgeTxMeta,\n statusRequest,\n quoteResponse,\n startTime,\n slippagePercentage,\n initialDestAssetBalance,\n targetContractAddress,\n approvalTxId,\n isStxEnabled,\n accountAddress: selectedAddress,\n } = startPollingForBridgeTxStatusArgs;\n\n // Write all non-status fields to state so we can reference the quote in Activity list without the Bridge API\n // We know it's in progress but not the exact status yet\n const txHistoryItem = {\n txMetaId: bridgeTxMeta.id,\n batchId: bridgeTxMeta.batchId,\n quote: quoteResponse.quote,\n startTime,\n estimatedProcessingTimeInSeconds:\n quoteResponse.estimatedProcessingTimeInSeconds,\n slippagePercentage,\n pricingData: {\n amountSent: quoteResponse.sentAmount?.amount ?? '0',\n amountSentInUsd: quoteResponse.sentAmount?.usd ?? undefined,\n quotedGasInUsd: quoteResponse.gasFee?.effective?.usd ?? undefined,\n quotedReturnInUsd: quoteResponse.toTokenAmount?.usd ?? undefined,\n quotedGasAmount: quoteResponse.gasFee?.effective?.amount ?? undefined,\n },\n initialDestAssetBalance,\n targetContractAddress,\n account: selectedAddress,\n status: {\n // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that\n // Also we know the bare minimum fields for status at this point in time\n status: StatusTypes.PENDING,\n srcChain: {\n chainId: statusRequest.srcChainId,\n txHash: statusRequest.srcTxHash,\n },\n },\n hasApprovalTx: Boolean(quoteResponse.approval),\n approvalTxId,\n isStxEnabled: isStxEnabled ?? false,\n featureId: quoteResponse.featureId,\n };\n this.update((state) => {\n // Use the txMeta.id as the key so we can reference the txMeta in TransactionController\n state.txHistory[bridgeTxMeta.id] = txHistoryItem;\n });\n };\n\n readonly #startPollingForTxId = (txId: string) => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (!txHistoryItem) {\n return;\n }\n const { quote } = txHistoryItem;\n\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n if (isBridgeTx) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n this.#addTxToHistory(txHistoryMeta);\n this.#startPollingForTxId(bridgeTxMeta.id);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (pollingInput: BridgeStatusPollingInput) => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n #getMultichainSelectedAccount(accountAddress: string) {\n return this.messenger.call(\n 'AccountsController:getAccountByAddress',\n accountAddress,\n );\n }\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - 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.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string) => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Update the attempts counter\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].attempts = newAttempts;\n });\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs) => {\n const { txHistory } = this.state;\n\n if (\n shouldSkipFetchDueToFetchFailures(txHistory[bridgeTxMetaId]?.attempts)\n ) {\n return;\n }\n\n try {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const historyItem = txHistory[bridgeTxMetaId];\n const srcTxHash = this.#getSrcTxHash(bridgeTxMetaId);\n if (!srcTxHash) {\n return;\n }\n\n this.#updateSrcTxHash(bridgeTxMetaId, srcTxHash);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const { status, validationFailures } = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Skip tracking events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (e) {\n console.warn('Failed to fetch bridge tx status', e);\n this.#handleFetchFailure(bridgeTxMetaId);\n }\n };\n\n readonly #getSrcTxHash = (bridgeTxMetaId: string): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (srcTxHash) {\n return srcTxHash;\n }\n\n // Look up in TransactionController if txMeta has been updated with the srcTxHash\n const txControllerState = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = txControllerState.transactions.find(\n (tx: TransactionMeta) => tx.id === bridgeTxMetaId,\n );\n return txMeta?.hash;\n };\n\n readonly #updateSrcTxHash = (bridgeTxMetaId: string, srcTxHash: string) => {\n const { txHistory } = this.state;\n if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {\n return;\n }\n\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ) => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n /**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleNonEvmTx = async (\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n ) => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount,\n );\n const requestResponse = (await this.messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n // Create quote response with the specified trade\n // This allows the same method to handle both approvals and main trades\n const txQuoteResponse: QuoteResponse<Trade> & QuoteMetadata = {\n ...quoteResponse,\n trade,\n };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n txQuoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n };\n\n readonly #waitForHashAndReturnFinalTxMeta = async (\n hashPromise?: Awaited<\n ReturnType<TransactionController['addTransaction']>\n >['result'],\n ): Promise<TransactionMeta> => {\n const transactionHash = await hashPromise;\n const finalTransactionMeta: TransactionMeta | undefined = this.messenger\n .call('TransactionController:getState')\n .transactions.find((tx: TransactionMeta) => tx.hash === transactionHash);\n if (!finalTransactionMeta) {\n throw new Error(\n 'Failed to submit cross-chain swap tx: txMeta for txHash was not found',\n );\n }\n return finalTransactionMeta;\n };\n\n readonly #handleApprovalTx = async (\n isBridgeTx: boolean,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n requireApproval?: boolean,\n ): Promise<TransactionMeta | undefined> => {\n const { approval } = quoteResponse;\n\n if (approval) {\n const approveTx = async () => {\n await this.#handleUSDTAllowanceReset(quoteResponse);\n\n const approvalTxMeta = await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n trade: approval as TxData,\n requireApproval,\n });\n\n await handleApprovalDelay(quoteResponse);\n return approvalTxMeta;\n };\n\n return await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n approveTx,\n );\n }\n\n return undefined;\n };\n\n /**\n * Submits an EVM transaction to the TransactionController\n *\n * @param params - The parameters for the transaction\n * @param params.transactionType - The type of transaction to submit\n * @param params.trade - The trade data to confirm\n * @param params.requireApproval - Whether to require approval for the transaction\n * @returns The transaction meta\n */\n readonly #handleEvmTransaction = async ({\n transactionType,\n trade,\n requireApproval = false,\n }: {\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n }): Promise<TransactionMeta> => {\n const actionId = generateActionId().toString();\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n };\n const transactionParams: Parameters<\n TransactionController['addTransaction']\n >[0] = {\n ...trade,\n chainId: hexChainId,\n gasLimit: trade.gasLimit?.toString(),\n gas: trade.gasLimit?.toString(),\n };\n const transactionParamsWithMaxGas: TransactionParams = {\n ...transactionParams,\n ...(await this.#calculateGasFees(\n transactionParams,\n networkClientId,\n hexChainId,\n )),\n };\n\n const { result } = await this.#addTransactionFn(\n transactionParamsWithMaxGas,\n requestOptions,\n );\n\n return await this.#waitForHashAndReturnFinalTxMeta(result);\n };\n\n readonly #handleUSDTAllowanceReset = async (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval as TxData,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messenger.call(\n 'GasFeeController:getState',\n );\n const { estimates: txGasFeeEstimates } = await this.#estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n };\n\n /**\n * Submits batched EVM transactions to the TransactionController\n *\n * @param args - The parameters for the transaction\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @param args.trade - The trade data to confirm\n * @param args.approval - The approval data to confirm\n * @param args.resetApproval - The ethereum:USDT reset approval data to confirm\n * @param args.quoteResponse - The quote response\n * @param args.requireApproval - Whether to require approval for the transaction\n * @returns The approvalMeta and tradeMeta for the batched transaction\n */\n readonly #handleEvmTransactionBatch = async (\n args: Omit<\n Parameters<typeof getAddTransactionBatchParams>[0],\n 'messenger' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messenger: this.messenger,\n estimateGasFeeFn: this.#estimateGasFeeFn,\n ...args,\n });\n const txDataByType = {\n [TransactionType.bridgeApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridgeApproval,\n )?.params.data,\n [TransactionType.swapApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swapApproval,\n )?.params.data,\n [TransactionType.bridge]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridge,\n )?.params.data,\n [TransactionType.swap]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swap,\n )?.params.data,\n };\n\n const { batchId } = await this.#addTransactionBatchFn(transactionParams);\n\n const { approvalMeta, tradeMeta } = findAndUpdateTransactionsInBatch({\n messenger: this.messenger,\n updateTransactionFn: this.#updateTransactionFn,\n batchId,\n txDataByType,\n });\n\n if (!tradeMeta) {\n throw new Error(\n 'Failed to update cross-chain swap transaction batch: tradeMeta not found',\n );\n }\n\n return { approvalMeta, tradeMeta };\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param quotesReceivedContext - The context for the QuotesReceived event\n * @returns The transaction meta\n */\n submitTx = async (\n accountAddress: string,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n quotesReceivedContext?: RequiredEventContextFromClient[UnifiedSwapBridgeEventName.QuotesReceived],\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messenger.call(\n 'BridgeController:stopPollingForQuotes',\n AbortReason.TransactionSubmitted,\n // If trade is submitted before all quotes are loaded, the QuotesReceived event is published\n // If the trade has a featureId, it means it was submitted outside of the Unified Swap and Bridge experience, so no QuotesReceived event is published\n quoteResponse.featureId ? undefined : quotesReceivedContext,\n );\n\n const selectedAccount = this.#getMultichainSelectedAccount(accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const isHardwareAccount = isHardwareWallet(selectedAccount);\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabledOnClient,\n isHardwareAccount,\n );\n // Emit Submitted event after submit button is clicked\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n preConfirmationProperties,\n );\n\n let txMeta: TransactionMeta & Partial<SolanaTransactionMeta>;\n let approvalTxId: string | undefined;\n const startTime = Date.now();\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Submit non-EVM tx (Solana, BTC, Tron)\n const isNonEvmTrade =\n isNonEvmChainId(quoteResponse.quote.srcChainId) &&\n (typeof quoteResponse.trade === 'string' ||\n isBitcoinTrade(quoteResponse.trade) ||\n isTronTrade(quoteResponse.trade));\n\n if (isNonEvmTrade) {\n // Handle non-EVM approval if present (e.g., Tron token approvals)\n if (quoteResponse.approval) {\n const approvalTxMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.approval as Trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse);\n }\n\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n txMeta?.id,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n } else {\n // Submit EVM tx\n // For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval\n // Extension does not have this issue\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && isHardwareAccount;\n\n // Handle smart transactions if enabled\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: isStxEnabledOnClient,\n },\n },\n async () => {\n if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {\n const { tradeMeta, approvalMeta } =\n await this.#handleEvmTransactionBatch({\n isBridgeTx,\n resetApproval: (await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n )) as TxData,\n approval: quoteResponse.approval as TxData,\n trade: quoteResponse.trade as TxData,\n quoteResponse,\n requireApproval,\n });\n\n approvalTxId = approvalMeta?.id;\n return tradeMeta;\n }\n // Set approval time and id if an approval tx is needed\n const approvalTxMeta = await this.#handleApprovalTx(\n isBridgeTx,\n quoteResponse,\n requireApproval,\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n await handleMobileHardwareWalletDelay(requireApproval);\n\n return await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap,\n trade: quoteResponse.trade as TxData,\n requireApproval,\n });\n },\n );\n }\n\n try {\n // Add swap or bridge tx to history\n this.#addTxToHistory({\n accountAddress: selectedAccount.address,\n bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController\n statusRequest: {\n ...getStatusRequestParams(quoteResponse),\n srcTxHash: txMeta.hash,\n },\n quoteResponse,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n isStxEnabled: isStxEnabledOnClient,\n startTime,\n approvalTxId,\n });\n\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track non-EVM Swap completed event\n if (!isBridgeTx) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n txMeta.id,\n );\n }\n }\n } catch {\n // Ignore errors here, we don't want to crash the app if this fails and tx submission succeeds\n }\n return txMeta;\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txMetaId - The txMetaId of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n T extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed,\n >(\n eventName: T,\n txMetaId?: string,\n eventProperties?: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n ...(eventProperties ?? {}),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!txMetaId) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n baseProperties,\n );\n return;\n }\n\n const historyItem: BridgeHistoryItem | undefined =\n this.state.txHistory[txMetaId];\n if (!historyItem) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n // Always publish StatusValidationFailed event, regardless of featureId\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n const {\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n } = requestParamProperties;\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n {\n ...baseProperties,\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n return;\n }\n\n // Skip tracking all other events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = transactions?.find(({ id }) => id === txMetaId);\n const approvalTxMeta = transactions?.find(\n ({ id }) => id === historyItem.approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(historyItem.quote),\n };\n\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridge-status-controller.mjs","sourceRoot":"","sources":["../src/bridge-status-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type { QuoteWarning } from '@metamask/bridge-controller';\nimport {\n type QuoteMetadata,\n type RequiredEventContextFromClient,\n type TxData,\n type QuoteResponse,\n type Trade,\n getQuotesReceivedProperties,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isNonEvmChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\n isBitcoinTrade,\n isTronTrade,\n} from '@metamask/bridge-controller';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport { toHex } from '@metamask/controller-utils';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n TransactionController,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { numberToHex, type Hex } from '@metamask/utils';\n\nimport {\n BRIDGE_PROD_API_BASE_URL,\n BRIDGE_STATUS_CONTROLLER_NAME,\n DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n MAX_ATTEMPTS,\n REFRESH_INTERVAL_MS,\n TraceName,\n} from './constants';\nimport type {\n BridgeStatusControllerState,\n StartPollingForBridgeTxStatusArgsSerialized,\n FetchFunction,\n SolanaTransactionMeta,\n BridgeHistoryItem,\n} from './types';\nimport { type BridgeStatusControllerMessenger } from './types';\nimport { BridgeClientId } from './types';\nimport {\n fetchBridgeTxStatus,\n getStatusRequestWithSrcTxHash,\n shouldSkipFetchDueToFetchFailures,\n} from './utils/bridge-status';\nimport { getTxGasEstimates } from './utils/gas';\nimport {\n getFinalizedTxProperties,\n getPriceImpactFromQuote,\n getRequestMetadataFromHistory,\n getRequestParamFromHistory,\n getTradeDataFromHistory,\n getEVMTxPropertiesFromTransactionMeta,\n getTxStatusesFromHistory,\n getPreConfirmationPropertiesFromQuote,\n} from './utils/metrics';\nimport {\n findAndUpdateTransactionsInBatch,\n getAddTransactionBatchParams,\n getClientRequest,\n getStatusRequestParams,\n getUSDTAllowanceResetTx,\n handleApprovalDelay,\n handleMobileHardwareWalletDelay,\n handleNonEvmTxResponse,\n generateActionId,\n} from './utils/transaction';\n\nconst metadata: StateMetadata<BridgeStatusControllerState> = {\n // We want to persist the bridge status state so that we can show the proper data for the Activity list\n // basically match the behavior of TransactionController\n txHistory: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/** The input to start polling for the {@link BridgeStatusController} */\ntype BridgeStatusPollingInput = FetchBridgeTxStatusArgs;\n\ntype SrcTxMetaId = string;\nexport type FetchBridgeTxStatusArgs = {\n bridgeTxMetaId: string;\n};\nexport class BridgeStatusController extends StaticIntervalPollingController<BridgeStatusPollingInput>()<\n typeof BRIDGE_STATUS_CONTROLLER_NAME,\n BridgeStatusControllerState,\n BridgeStatusControllerMessenger\n> {\n #pollingTokensByTxMetaId: Record<SrcTxMetaId, string> = {};\n\n readonly #clientId: BridgeClientId;\n\n readonly #fetchFn: FetchFunction;\n\n readonly #config: {\n customBridgeApiBaseUrl: string;\n };\n\n readonly #addTransactionFn: typeof TransactionController.prototype.addTransaction;\n\n readonly #addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n\n readonly #updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n\n readonly #estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n\n readonly #trace: TraceCallback;\n\n constructor({\n messenger,\n state,\n clientId,\n fetchFn,\n addTransactionFn,\n addTransactionBatchFn,\n updateTransactionFn,\n estimateGasFeeFn,\n config,\n traceFn,\n }: {\n messenger: BridgeStatusControllerMessenger;\n state?: Partial<BridgeStatusControllerState>;\n clientId: BridgeClientId;\n fetchFn: FetchFunction;\n addTransactionFn: typeof TransactionController.prototype.addTransaction;\n addTransactionBatchFn: typeof TransactionController.prototype.addTransactionBatch;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n config?: {\n customBridgeApiBaseUrl?: string;\n };\n traceFn?: TraceCallback;\n }) {\n super({\n name: BRIDGE_STATUS_CONTROLLER_NAME,\n metadata,\n messenger,\n // Restore the persisted state\n state: {\n ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE,\n ...state,\n },\n });\n\n this.#clientId = clientId;\n this.#fetchFn = fetchFn;\n this.#addTransactionFn = addTransactionFn;\n this.#addTransactionBatchFn = addTransactionBatchFn;\n this.#updateTransactionFn = updateTransactionFn;\n this.#estimateGasFeeFn = estimateGasFeeFn;\n this.#config = {\n customBridgeApiBaseUrl:\n config?.customBridgeApiBaseUrl ?? BRIDGE_PROD_API_BASE_URL,\n };\n this.#trace = traceFn ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n // Register action handlers\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messenger.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:getBridgeHistoryItemByTxMetaId`,\n this.getBridgeHistoryItemByTxMetaId.bind(this),\n );\n\n // Set interval\n this.setIntervalLength(REFRESH_INTERVAL_MS);\n\n this.messenger.subscribe(\n 'TransactionController:transactionFailed',\n ({ transactionMeta }) => {\n const { type, status, id } = transactionMeta;\n if (\n type &&\n [\n TransactionType.bridge,\n TransactionType.swap,\n TransactionType.bridgeApproval,\n TransactionType.swapApproval,\n ].includes(type) &&\n [\n TransactionStatus.failed,\n TransactionStatus.dropped,\n TransactionStatus.rejected,\n ].includes(status)\n ) {\n // Mark tx as failed in txHistory\n this.#markTxAsFailed(transactionMeta);\n // Track failed event\n if (status !== TransactionStatus.rejected) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n id,\n getEVMTxPropertiesFromTransactionMeta(transactionMeta),\n );\n }\n }\n },\n );\n\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n const { type, id, chainId } = transactionMeta;\n if (type === TransactionType.swap) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n id,\n );\n }\n if (type === TransactionType.bridge && !isNonEvmChainId(chainId)) {\n this.#startPollingForTxId(id);\n }\n },\n );\n\n // If you close the extension, but keep the browser open, the polling continues\n // If you close the browser, the polling stops\n // Check for historyItems that do not have a status of complete and restart polling\n this.#restartPollingForIncompleteHistoryItems();\n }\n\n // Mark tx as failed in txHistory if either the approval or trade fails\n readonly #markTxAsFailed = ({ id }: TransactionMeta) => {\n const txHistoryKey = this.state.txHistory[id]\n ? id\n : Object.keys(this.state.txHistory).find(\n (key) => this.state.txHistory[key].approvalTxId === id,\n );\n if (!txHistoryKey) {\n return;\n }\n this.update((statusState) => {\n statusState.txHistory[txHistoryKey].status.status = StatusTypes.FAILED;\n });\n };\n\n resetState = () => {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n };\n\n wipeBridgeStatus = ({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork: boolean;\n }) => {\n // Wipe all networks for this address\n if (ignoreNetwork) {\n this.update((state) => {\n state.txHistory = DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE.txHistory;\n });\n } else {\n const { selectedNetworkClientId } = this.messenger.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const selectedChainId = selectedNetworkClient.configuration.chainId;\n\n this.#wipeBridgeStatusByChainId(address, selectedChainId);\n }\n };\n\n /**\n * Resets the attempts counter for a bridge transaction history item\n * and restarts polling if it was previously stopped due to max attempts\n *\n * @param identifier - Object containing either txMetaId or txHash to identify the history item\n * @param identifier.txMetaId - The transaction meta ID\n * @param identifier.txHash - The transaction hash\n */\n restartPollingForFailedAttempts = (identifier: {\n txMetaId?: string;\n txHash?: string;\n }) => {\n const { txMetaId, txHash } = identifier;\n\n if (!txMetaId && !txHash) {\n throw new Error('Either txMetaId or txHash must be provided');\n }\n\n // Find the history item by txMetaId or txHash\n let targetTxMetaId: string | undefined;\n\n if (txMetaId) {\n // Direct lookup by txMetaId\n if (this.state.txHistory[txMetaId]) {\n targetTxMetaId = txMetaId;\n }\n } else if (txHash) {\n // Search by txHash in status.srcChain.txHash\n targetTxMetaId = Object.keys(this.state.txHistory).find(\n (id) => this.state.txHistory[id].status.srcChain.txHash === txHash,\n );\n }\n\n if (!targetTxMetaId) {\n throw new Error(\n `No bridge transaction history found for ${\n txMetaId ? `txMetaId: ${txMetaId}` : `txHash: ${txHash}`\n }`,\n );\n }\n\n const historyItem = this.state.txHistory[targetTxMetaId];\n\n // Reset the attempts counter\n this.update((state) => {\n if (targetTxMetaId) {\n state.txHistory[targetTxMetaId].attempts = undefined;\n }\n });\n\n // Restart polling if it was stopped and this is a bridge transaction\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n\n if (isBridgeTx) {\n // Check if polling was stopped (no active polling token)\n const existingPollingToken =\n this.#pollingTokensByTxMetaId[targetTxMetaId];\n\n if (!existingPollingToken) {\n // Restart polling\n this.#startPollingForTxId(targetTxMetaId);\n }\n }\n };\n\n /**\n * Gets a bridge history item from the history by its transaction meta ID\n *\n * @param txMetaId - The transaction meta ID to look up\n * @returns The bridge history item if found, undefined otherwise\n */\n getBridgeHistoryItemByTxMetaId = (\n txMetaId: string,\n ): BridgeHistoryItem | undefined => {\n return this.state.txHistory[txMetaId];\n };\n\n /**\n * Restart polling for txs that are not in a final state\n * This is called during initialization\n */\n readonly #restartPollingForIncompleteHistoryItems = () => {\n // Check for historyItems that do not have a status of complete and restart polling\n const { txHistory } = this.state;\n const historyItems = Object.values(txHistory);\n const incompleteHistoryItems = historyItems\n .filter(\n (historyItem) =>\n historyItem.status.status === StatusTypes.PENDING ||\n historyItem.status.status === StatusTypes.UNKNOWN,\n )\n .filter((historyItem) => {\n // Check if we are already polling this tx, if so, skip restarting polling for that\n const pollingToken =\n this.#pollingTokensByTxMetaId[historyItem.txMetaId];\n return !pollingToken;\n })\n // Swap txs don't need to have their statuses polled\n .filter((historyItem) => {\n const isBridgeTx = isCrossChain(\n historyItem.quote.srcChainId,\n historyItem.quote.destChainId,\n );\n return isBridgeTx;\n });\n\n incompleteHistoryItems.forEach((historyItem) => {\n const bridgeTxMetaId = historyItem.txMetaId;\n const shouldSkipFetch = shouldSkipFetchDueToFetchFailures(\n historyItem.attempts,\n );\n if (shouldSkipFetch) {\n return;\n }\n\n // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus()\n // because we don't want to overwrite the existing historyItem in state\n this.#startPollingForTxId(bridgeTxMetaId);\n });\n };\n\n readonly #addTxToHistory = (\n startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const {\n bridgeTxMeta,\n statusRequest,\n quoteResponse,\n startTime,\n slippagePercentage,\n initialDestAssetBalance,\n targetContractAddress,\n approvalTxId,\n isStxEnabled,\n accountAddress: selectedAddress,\n } = startPollingForBridgeTxStatusArgs;\n\n // Write all non-status fields to state so we can reference the quote in Activity list without the Bridge API\n // We know it's in progress but not the exact status yet\n const txHistoryItem = {\n txMetaId: bridgeTxMeta.id,\n batchId: bridgeTxMeta.batchId,\n quote: quoteResponse.quote,\n startTime,\n estimatedProcessingTimeInSeconds:\n quoteResponse.estimatedProcessingTimeInSeconds,\n slippagePercentage,\n pricingData: {\n amountSent: quoteResponse.sentAmount?.amount ?? '0',\n amountSentInUsd: quoteResponse.sentAmount?.usd ?? undefined,\n quotedGasInUsd: quoteResponse.gasFee?.effective?.usd ?? undefined,\n quotedReturnInUsd: quoteResponse.toTokenAmount?.usd ?? undefined,\n quotedGasAmount: quoteResponse.gasFee?.effective?.amount ?? undefined,\n },\n initialDestAssetBalance,\n targetContractAddress,\n account: selectedAddress,\n status: {\n // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that\n // Also we know the bare minimum fields for status at this point in time\n status: StatusTypes.PENDING,\n srcChain: {\n chainId: statusRequest.srcChainId,\n txHash: statusRequest.srcTxHash,\n },\n },\n hasApprovalTx: Boolean(quoteResponse.approval),\n approvalTxId,\n isStxEnabled: isStxEnabled ?? false,\n featureId: quoteResponse.featureId,\n };\n this.update((state) => {\n // Use the txMeta.id as the key so we can reference the txMeta in TransactionController\n state.txHistory[bridgeTxMeta.id] = txHistoryItem;\n });\n };\n\n readonly #startPollingForTxId = (txId: string) => {\n // If we are already polling for this tx, stop polling for it before restarting\n const existingPollingToken = this.#pollingTokensByTxMetaId[txId];\n if (existingPollingToken) {\n this.stopPollingByPollingToken(existingPollingToken);\n }\n\n const txHistoryItem = this.state.txHistory[txId];\n if (!txHistoryItem) {\n return;\n }\n const { quote } = txHistoryItem;\n\n const isBridgeTx = isCrossChain(quote.srcChainId, quote.destChainId);\n if (isBridgeTx) {\n this.#pollingTokensByTxMetaId[txId] = this.startPolling({\n bridgeTxMetaId: txId,\n });\n }\n };\n\n /**\n * @deprecated For EVM/Solana swap/bridge txs we add tx to history in submitTx()\n * For Solana swap/bridge we start polling in submitTx()\n * For EVM bridge we listen for 'TransactionController:transactionConfirmed' and start polling there\n * No clients currently call this, safe to remove in future versions\n *\n * Adds tx to history and starts polling for the bridge tx status\n *\n * @param txHistoryMeta - The parameters for creating the history item\n */\n startPollingForBridgeTxStatus = (\n txHistoryMeta: StartPollingForBridgeTxStatusArgsSerialized,\n ) => {\n const { bridgeTxMeta } = txHistoryMeta;\n\n this.#addTxToHistory(txHistoryMeta);\n this.#startPollingForTxId(bridgeTxMeta.id);\n };\n\n // This will be called after you call this.startPolling()\n // The args passed in are the args you passed in to startPolling()\n _executePoll = async (pollingInput: BridgeStatusPollingInput) => {\n await this.#fetchBridgeTxStatus(pollingInput);\n };\n\n #getMultichainSelectedAccount(accountAddress: string) {\n return this.messenger.call(\n 'AccountsController:getAccountByAddress',\n accountAddress,\n );\n }\n\n /**\n * Handles the failure to fetch the bridge tx status\n * We eventually stop polling for the tx if we fail too many times\n * Failures (500 errors) can be due to:\n * - The srcTxHash not being available immediately for STX\n * - 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.\n *\n * @param bridgeTxMetaId - The txMetaId of the bridge tx\n */\n readonly #handleFetchFailure = (bridgeTxMetaId: string) => {\n const { attempts } = this.state.txHistory[bridgeTxMetaId];\n\n const newAttempts = attempts\n ? {\n counter: attempts.counter + 1,\n lastAttemptTime: Date.now(),\n }\n : {\n counter: 1,\n lastAttemptTime: Date.now(),\n };\n\n // If we've failed too many times, stop polling for the tx\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n if (newAttempts.counter >= MAX_ATTEMPTS && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n }\n\n // Update the attempts counter\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].attempts = newAttempts;\n });\n };\n\n readonly #fetchBridgeTxStatus = async ({\n bridgeTxMetaId,\n }: FetchBridgeTxStatusArgs) => {\n const { txHistory } = this.state;\n\n if (\n shouldSkipFetchDueToFetchFailures(txHistory[bridgeTxMetaId]?.attempts)\n ) {\n return;\n }\n\n try {\n // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx\n // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly.\n // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases\n const historyItem = txHistory[bridgeTxMetaId];\n const srcTxHash = this.#getSrcTxHash(bridgeTxMetaId);\n if (!srcTxHash) {\n return;\n }\n\n this.#updateSrcTxHash(bridgeTxMetaId, srcTxHash);\n\n const statusRequest = getStatusRequestWithSrcTxHash(\n historyItem.quote,\n srcTxHash,\n );\n const { status, validationFailures } = await fetchBridgeTxStatus(\n statusRequest,\n this.#clientId,\n this.#fetchFn,\n this.#config.customBridgeApiBaseUrl,\n );\n\n if (validationFailures.length > 0) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.StatusValidationFailed,\n bridgeTxMetaId,\n {\n failures: validationFailures,\n },\n );\n throw new Error(\n `Bridge status validation failed: ${validationFailures.join(', ')}`,\n );\n }\n\n const newBridgeHistoryItem = {\n ...historyItem,\n status,\n completionTime:\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED\n ? Date.now()\n : undefined, // TODO make this more accurate by looking up dest txHash block time\n attempts: undefined,\n };\n\n // No need to purge these on network change or account change, TransactionController does not purge either.\n // TODO In theory we can skip checking status if it's not the current account/network\n // we need to keep track of the account that this is associated with as well so that we don't show it in Activity list for other accounts\n // First stab at this will not stop polling when you are on a different account\n this.update((state) => {\n state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;\n });\n\n const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n const isFinalStatus =\n status.status === StatusTypes.COMPLETE ||\n status.status === StatusTypes.FAILED;\n\n if (isFinalStatus && pollingToken) {\n this.stopPollingByPollingToken(pollingToken);\n delete this.#pollingTokensByTxMetaId[bridgeTxMetaId];\n\n // Skip tracking events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\n );\n this.messenger.publish(\n 'BridgeStatusController:destinationTransactionCompleted',\n historyItem.quote.destAsset.assetId,\n );\n }\n if (status.status === StatusTypes.FAILED) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n bridgeTxMetaId,\n );\n }\n }\n } catch (e) {\n console.warn('Failed to fetch bridge tx status', e);\n this.#handleFetchFailure(bridgeTxMetaId);\n }\n };\n\n readonly #getSrcTxHash = (bridgeTxMetaId: string): string | undefined => {\n const { txHistory } = this.state;\n // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController\n // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX\n const srcTxHash = txHistory[bridgeTxMetaId].status.srcChain.txHash;\n\n if (srcTxHash) {\n return srcTxHash;\n }\n\n // Look up in TransactionController if txMeta has been updated with the srcTxHash\n const txControllerState = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = txControllerState.transactions.find(\n (tx: TransactionMeta) => tx.id === bridgeTxMetaId,\n );\n return txMeta?.hash;\n };\n\n readonly #updateSrcTxHash = (bridgeTxMetaId: string, srcTxHash: string) => {\n const { txHistory } = this.state;\n if (txHistory[bridgeTxMetaId].status.srcChain.txHash) {\n return;\n }\n\n this.update((state) => {\n state.txHistory[bridgeTxMetaId].status.srcChain.txHash = srcTxHash;\n });\n };\n\n // Wipes the bridge status for the given address and chainId\n // Will match only source chainId to the selectedChainId\n readonly #wipeBridgeStatusByChainId = (\n address: string,\n selectedChainId: Hex,\n ) => {\n const sourceTxMetaIdsToDelete = Object.keys(this.state.txHistory).filter(\n (txMetaId) => {\n const bridgeHistoryItem = this.state.txHistory[txMetaId];\n\n const hexSourceChainId = numberToHex(\n bridgeHistoryItem.quote.srcChainId,\n );\n\n return (\n bridgeHistoryItem.account === address &&\n hexSourceChainId === selectedChainId\n );\n },\n );\n\n sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => {\n const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId];\n\n if (pollingToken) {\n this.stopPollingByPollingToken(\n this.#pollingTokensByTxMetaId[sourceTxMetaId],\n );\n }\n });\n\n this.update((state) => {\n state.txHistory = sourceTxMetaIdsToDelete.reduce(\n (acc, sourceTxMetaId) => {\n delete acc[sourceTxMetaId];\n return acc;\n },\n state.txHistory,\n );\n });\n };\n\n /**\n * ******************************************************\n * TX SUBMISSION HANDLING\n *******************************************************\n */\n\n /**\n * Submits the transaction to the snap using the new unified ClientRequest interface\n * Works for all non-EVM chains (Solana, BTC, Tron)\n * This adds an approval tx to the ApprovalsController in the background\n * The client needs to handle the approval tx by redirecting to the confirmation page with the approvalTxId in the URL\n *\n * @param trade - The trade data (can be approval or main trade)\n * @param quoteResponse - The quote response containing metadata\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleNonEvmTx = async (\n trade: Trade,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n ) => {\n if (!selectedAccount.metadata?.snap?.id) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined snap id',\n );\n }\n\n const request = getClientRequest(\n trade,\n quoteResponse.quote.srcChainId,\n selectedAccount,\n );\n const requestResponse = (await this.messenger.call(\n 'SnapController:handleRequest',\n request,\n )) as\n | string\n | { transactionId: string }\n | { result: Record<string, string> }\n | { signature: string };\n\n // Create quote response with the specified trade\n // This allows the same method to handle both approvals and main trades\n const txQuoteResponse: QuoteResponse<Trade> & QuoteMetadata = {\n ...quoteResponse,\n trade,\n };\n\n const txMeta = handleNonEvmTxResponse(\n requestResponse,\n txQuoteResponse,\n selectedAccount,\n );\n\n // TODO remove this eventually, just returning it now to match extension behavior\n // OR if the snap can propagate the snapRequestId or keyringReqId to the ApprovalsController, this can return the approvalTxId instead and clients won't need to subscribe to the ApprovalsController state to redirect\n return txMeta;\n };\n\n readonly #waitForHashAndReturnFinalTxMeta = async (\n hashPromise?: Awaited<\n ReturnType<TransactionController['addTransaction']>\n >['result'],\n ): Promise<TransactionMeta> => {\n const transactionHash = await hashPromise;\n const finalTransactionMeta: TransactionMeta | undefined = this.messenger\n .call('TransactionController:getState')\n .transactions.find((tx: TransactionMeta) => tx.hash === transactionHash);\n if (!finalTransactionMeta) {\n throw new Error(\n 'Failed to submit cross-chain swap tx: txMeta for txHash was not found',\n );\n }\n return finalTransactionMeta;\n };\n\n readonly #handleApprovalTx = async (\n isBridgeTx: boolean,\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n requireApproval?: boolean,\n ): Promise<TransactionMeta | undefined> => {\n const { approval } = quoteResponse;\n\n if (approval) {\n const approveTx = async () => {\n await this.#handleUSDTAllowanceReset(quoteResponse);\n\n const approvalTxMeta = await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n trade: approval as TxData,\n requireApproval,\n });\n\n await handleApprovalDelay(quoteResponse);\n return approvalTxMeta;\n };\n\n return await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n approveTx,\n );\n }\n\n return undefined;\n };\n\n /**\n * Submits an EVM transaction to the TransactionController\n *\n * @param params - The parameters for the transaction\n * @param params.transactionType - The type of transaction to submit\n * @param params.trade - The trade data to confirm\n * @param params.requireApproval - Whether to require approval for the transaction\n * @returns The transaction meta\n */\n readonly #handleEvmTransaction = async ({\n transactionType,\n trade,\n requireApproval = false,\n }: {\n transactionType: TransactionType;\n trade: TxData;\n requireApproval?: boolean;\n }): Promise<TransactionMeta> => {\n const actionId = generateActionId().toString();\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n const requestOptions = {\n actionId,\n networkClientId,\n requireApproval,\n type: transactionType,\n origin: 'metamask',\n };\n const transactionParams: Parameters<\n TransactionController['addTransaction']\n >[0] = {\n ...trade,\n chainId: hexChainId,\n gasLimit: trade.gasLimit?.toString(),\n gas: trade.gasLimit?.toString(),\n };\n const transactionParamsWithMaxGas: TransactionParams = {\n ...transactionParams,\n ...(await this.#calculateGasFees(\n transactionParams,\n networkClientId,\n hexChainId,\n )),\n };\n\n const { result } = await this.#addTransactionFn(\n transactionParamsWithMaxGas,\n requestOptions,\n );\n\n return await this.#waitForHashAndReturnFinalTxMeta(result);\n };\n\n readonly #handleUSDTAllowanceReset = async (\n quoteResponse: QuoteResponse & Partial<QuoteMetadata>,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval as TxData,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messenger.call(\n 'GasFeeController:getState',\n );\n const { estimates: txGasFeeEstimates } = await this.#estimateGasFeeFn({\n transactionParams,\n chainId,\n networkClientId,\n });\n const { maxFeePerGas, maxPriorityFeePerGas } = getTxGasEstimates({\n networkGasFeeEstimates: gasFeeEstimates,\n txGasFeeEstimates,\n });\n const maxGasLimit = toHex(transactionParams.gas ?? 0);\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas: maxGasLimit,\n };\n };\n\n /**\n * Submits batched EVM transactions to the TransactionController\n *\n * @param args - The parameters for the transaction\n * @param args.isBridgeTx - Whether the transaction is a bridge transaction\n * @param args.trade - The trade data to confirm\n * @param args.approval - The approval data to confirm\n * @param args.resetApproval - The ethereum:USDT reset approval data to confirm\n * @param args.quoteResponse - The quote response\n * @param args.requireApproval - Whether to require approval for the transaction\n * @returns The approvalMeta and tradeMeta for the batched transaction\n */\n readonly #handleEvmTransactionBatch = async (\n args: Omit<\n Parameters<typeof getAddTransactionBatchParams>[0],\n 'messenger' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messenger: this.messenger,\n estimateGasFeeFn: this.#estimateGasFeeFn,\n ...args,\n });\n const txDataByType = {\n [TransactionType.bridgeApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridgeApproval,\n )?.params.data,\n [TransactionType.swapApproval]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swapApproval,\n )?.params.data,\n [TransactionType.bridge]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.bridge,\n )?.params.data,\n [TransactionType.swap]: transactionParams.transactions.find(\n ({ type }) => type === TransactionType.swap,\n )?.params.data,\n };\n\n const { batchId } = await this.#addTransactionBatchFn(transactionParams);\n\n const { approvalMeta, tradeMeta } = findAndUpdateTransactionsInBatch({\n messenger: this.messenger,\n updateTransactionFn: this.#updateTransactionFn,\n batchId,\n txDataByType,\n });\n\n if (!tradeMeta) {\n throw new Error(\n 'Failed to update cross-chain swap transaction batch: tradeMeta not found',\n );\n }\n\n return { approvalMeta, tradeMeta };\n };\n\n /**\n * Submits a cross-chain swap transaction\n *\n * @param accountAddress - The address of the account to submit the transaction for\n * @param quoteResponse - The quote response\n * @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension\n * @param isLoading - Whether the trade is submitted before all quotes are loaded, publish QuotesReceived event if true\n * @param warnings - The warnings to publish with the QuotesReceived event\n * @returns The transaction meta\n */\n submitTx = async (\n accountAddress: string,\n quoteResponse: QuoteResponse<Trade, Trade> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n isLoading: boolean = false,\n warnings: QuoteWarning[] = [],\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n // If trade is submitted before all quotes are loaded, publish QuotesReceived event\n if (isLoading) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.QuotesReceived,\n undefined,\n getQuotesReceivedProperties(quoteResponse, warnings),\n );\n }\n this.messenger.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount(accountAddress);\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap transaction: undefined multichain account',\n );\n }\n const isHardwareAccount = isHardwareWallet(selectedAccount);\n\n const preConfirmationProperties = getPreConfirmationPropertiesFromQuote(\n quoteResponse,\n isStxEnabledOnClient,\n isHardwareAccount,\n );\n // Emit Submitted event after submit button is clicked\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Submitted,\n undefined,\n preConfirmationProperties,\n );\n\n let txMeta: TransactionMeta & Partial<SolanaTransactionMeta>;\n let approvalTxId: string | undefined;\n const startTime = Date.now();\n\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Submit non-EVM tx (Solana, BTC, Tron)\n const isNonEvmTrade =\n isNonEvmChainId(quoteResponse.quote.srcChainId) &&\n (typeof quoteResponse.trade === 'string' ||\n isBitcoinTrade(quoteResponse.trade) ||\n isTronTrade(quoteResponse.trade));\n\n if (isNonEvmTrade) {\n // Handle non-EVM approval if present (e.g., Tron token approvals)\n if (quoteResponse.approval) {\n const approvalTxMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionApprovalCompleted\n : TraceName.SwapTransactionApprovalCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.approval as Trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n undefined,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n // Add delay after approval similar to EVM flow\n await handleApprovalDelay(quoteResponse);\n }\n\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: false,\n },\n },\n async () => {\n try {\n return await this.#handleNonEvmTx(\n quoteResponse.trade,\n quoteResponse,\n selectedAccount,\n );\n } catch (error) {\n !quoteResponse.featureId &&\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Failed,\n txMeta?.id,\n {\n error_message: (error as Error)?.message,\n ...preConfirmationProperties,\n },\n );\n throw error;\n }\n },\n );\n } else {\n // Submit EVM tx\n // For hardware wallets on Mobile, this is fixes an issue where the Ledger does not get prompted for the 2nd approval\n // Extension does not have this issue\n const requireApproval =\n this.#clientId === BridgeClientId.MOBILE && isHardwareAccount;\n\n // Handle smart transactions if enabled\n txMeta = await this.#trace(\n {\n name: isBridgeTx\n ? TraceName.BridgeTransactionCompleted\n : TraceName.SwapTransactionCompleted,\n data: {\n srcChainId: formatChainIdToCaip(quoteResponse.quote.srcChainId),\n stxEnabled: isStxEnabledOnClient,\n },\n },\n async () => {\n if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {\n const { tradeMeta, approvalMeta } =\n await this.#handleEvmTransactionBatch({\n isBridgeTx,\n resetApproval: (await getUSDTAllowanceResetTx(\n this.messenger,\n quoteResponse,\n )) as TxData,\n approval: quoteResponse.approval as TxData,\n trade: quoteResponse.trade as TxData,\n quoteResponse,\n requireApproval,\n });\n\n approvalTxId = approvalMeta?.id;\n return tradeMeta;\n }\n // Set approval time and id if an approval tx is needed\n const approvalTxMeta = await this.#handleApprovalTx(\n isBridgeTx,\n quoteResponse,\n requireApproval,\n );\n\n approvalTxId = approvalTxMeta?.id;\n\n await handleMobileHardwareWalletDelay(requireApproval);\n\n return await this.#handleEvmTransaction({\n transactionType: isBridgeTx\n ? TransactionType.bridge\n : TransactionType.swap,\n trade: quoteResponse.trade as TxData,\n requireApproval,\n });\n },\n );\n }\n\n try {\n // Add swap or bridge tx to history\n this.#addTxToHistory({\n accountAddress: selectedAccount.address,\n bridgeTxMeta: txMeta, // Only the id field is used by the BridgeStatusController\n statusRequest: {\n ...getStatusRequestParams(quoteResponse),\n srcTxHash: txMeta.hash,\n },\n quoteResponse,\n slippagePercentage: 0, // TODO include slippage provided by quote if using dynamic slippage, or slippage from quote request\n isStxEnabled: isStxEnabledOnClient,\n startTime,\n approvalTxId,\n });\n\n if (isNonEvmChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track non-EVM Swap completed event\n if (!isBridgeTx) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n txMeta.id,\n );\n }\n }\n } catch {\n // Ignore errors here, we don't want to crash the app if this fails and tx submission succeeds\n }\n return txMeta;\n };\n\n /**\n * Tracks post-submission events for a cross-chain swap based on the history item\n *\n * @param eventName - The name of the event to track\n * @param txMetaId - The txMetaId of the history item to track the event for\n * @param eventProperties - The properties for the event\n */\n readonly #trackUnifiedSwapBridgeEvent = <\n T extends\n | typeof UnifiedSwapBridgeEventName.Submitted\n | typeof UnifiedSwapBridgeEventName.Failed\n | typeof UnifiedSwapBridgeEventName.Completed\n | typeof UnifiedSwapBridgeEventName.StatusValidationFailed\n | typeof UnifiedSwapBridgeEventName.QuotesReceived,\n >(\n eventName: T,\n txMetaId?: string,\n eventProperties?: Pick<RequiredEventContextFromClient, T>[T],\n ) => {\n const baseProperties = {\n action_type: MetricsActionType.SWAPBRIDGE_V1,\n ...(eventProperties ?? {}),\n };\n\n // This will publish events for PERPS dropped tx failures as well\n if (!txMetaId) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n baseProperties,\n );\n return;\n }\n\n const historyItem: BridgeHistoryItem | undefined =\n this.state.txHistory[txMetaId];\n if (!historyItem) {\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const requestParamProperties = getRequestParamFromHistory(historyItem);\n // Always publish StatusValidationFailed event, regardless of featureId\n if (eventName === UnifiedSwapBridgeEventName.StatusValidationFailed) {\n const {\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n } = requestParamProperties;\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n {\n ...baseProperties,\n chain_id_source,\n chain_id_destination,\n token_address_source,\n token_address_destination,\n refresh_count: historyItem.attempts?.counter ?? 0,\n },\n );\n return;\n }\n\n // Skip tracking all other events when featureId is set (i.e. PERPS)\n if (historyItem.featureId) {\n return;\n }\n\n const selectedAccount = this.messenger.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n const txMeta = transactions?.find(({ id }) => id === txMetaId);\n const approvalTxMeta = transactions?.find(\n ({ id }) => id === historyItem.approvalTxId,\n );\n\n const requiredEventProperties = {\n ...baseProperties,\n ...requestParamProperties,\n ...getRequestMetadataFromHistory(historyItem, selectedAccount),\n ...getTradeDataFromHistory(historyItem),\n ...getTxStatusesFromHistory(historyItem),\n ...getFinalizedTxProperties(historyItem, txMeta, approvalTxMeta),\n ...getPriceImpactFromQuote(historyItem.quote),\n };\n\n this.messenger.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
package/package.json
CHANGED