@metamask-previews/bridge-status-controller 63.0.0-preview-ecf10eb2 → 63.0.0-preview-a5935709
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -2
- package/dist/bridge-status-controller.cjs +56 -71
- package/dist/bridge-status-controller.cjs.map +1 -1
- package/dist/bridge-status-controller.d.cts +4 -5
- package/dist/bridge-status-controller.d.cts.map +1 -1
- package/dist/bridge-status-controller.d.mts +4 -5
- package/dist/bridge-status-controller.d.mts.map +1 -1
- package/dist/bridge-status-controller.mjs +26 -41
- package/dist/bridge-status-controller.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/transaction.cjs +17 -3
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.d.cts +38 -1
- package/dist/utils/transaction.d.cts.map +1 -1
- package/dist/utils/transaction.d.mts +38 -1
- package/dist/utils/transaction.d.mts.map +1 -1
- package/dist/utils/transaction.mjs +16 -3
- package/dist/utils/transaction.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,8 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
|
-
- Improve type safety by replacing tx data type assertions with type predicates ([#7228](https://github.com/MetaMask/core/pull/7228))
|
|
13
|
-
- Submit `resetApproval` tx before the tx approval if it is included in the quoteResponse ([#7228](https://github.com/MetaMask/core/pull/7228))
|
|
14
12
|
- Move peer dependencies for controller and service packages to direct dependencies ([#7209](https://github.com/MetaMask/core/pull/7209), [#7220](https://github.com/MetaMask/core/pull/7220), [#7236](https://github.com/MetaMask/core/pull/7236))
|
|
15
13
|
- The dependencies moved are:
|
|
16
14
|
- `@metamask/accounts-controller` (^35.0.0)
|
|
@@ -24,6 +22,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
24
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.
|
|
25
23
|
- Bump `@metamask/bridge-controller` from `^63.0.0` to `^63.1.0` ([#7238](https://github.com/MetaMask/core/pull/7238))
|
|
26
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
|
+
|
|
27
29
|
## [63.0.0]
|
|
28
30
|
|
|
29
31
|
### Changed
|
|
@@ -14,7 +14,6 @@ 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");
|
|
18
17
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
19
18
|
const polling_controller_1 = require("@metamask/polling-controller");
|
|
20
19
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
@@ -66,7 +65,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
66
65
|
return;
|
|
67
66
|
}
|
|
68
67
|
this.update((statusState) => {
|
|
69
|
-
statusState.txHistory[txHistoryKey].status.status =
|
|
68
|
+
statusState.txHistory[txHistoryKey].status.status = bridge_controller_1.StatusTypes.FAILED;
|
|
70
69
|
});
|
|
71
70
|
});
|
|
72
71
|
this.resetState = () => {
|
|
@@ -124,7 +123,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
124
123
|
}
|
|
125
124
|
});
|
|
126
125
|
// Restart polling if it was stopped and this is a bridge transaction
|
|
127
|
-
const isBridgeTx = (0,
|
|
126
|
+
const isBridgeTx = (0, bridge_controller_1.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
|
|
128
127
|
if (isBridgeTx) {
|
|
129
128
|
// Check if polling was stopped (no active polling token)
|
|
130
129
|
const existingPollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[targetTxMetaId];
|
|
@@ -152,8 +151,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
152
151
|
const { txHistory } = this.state;
|
|
153
152
|
const historyItems = Object.values(txHistory);
|
|
154
153
|
const incompleteHistoryItems = historyItems
|
|
155
|
-
.filter((historyItem) => historyItem.status.status ===
|
|
156
|
-
historyItem.status.status ===
|
|
154
|
+
.filter((historyItem) => historyItem.status.status === bridge_controller_1.StatusTypes.PENDING ||
|
|
155
|
+
historyItem.status.status === bridge_controller_1.StatusTypes.UNKNOWN)
|
|
157
156
|
.filter((historyItem) => {
|
|
158
157
|
// Check if we are already polling this tx, if so, skip restarting polling for that
|
|
159
158
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[historyItem.txMetaId];
|
|
@@ -161,7 +160,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
161
160
|
})
|
|
162
161
|
// Swap txs don't need to have their statuses polled
|
|
163
162
|
.filter((historyItem) => {
|
|
164
|
-
const isBridgeTx = (0,
|
|
163
|
+
const isBridgeTx = (0, bridge_controller_1.isCrossChain)(historyItem.quote.srcChainId, historyItem.quote.destChainId);
|
|
165
164
|
return isBridgeTx;
|
|
166
165
|
});
|
|
167
166
|
incompleteHistoryItems.forEach((historyItem) => {
|
|
@@ -199,7 +198,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
199
198
|
status: {
|
|
200
199
|
// We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that
|
|
201
200
|
// Also we know the bare minimum fields for status at this point in time
|
|
202
|
-
status:
|
|
201
|
+
status: bridge_controller_1.StatusTypes.PENDING,
|
|
203
202
|
srcChain: {
|
|
204
203
|
chainId: statusRequest.srcChainId,
|
|
205
204
|
txHash: statusRequest.srcTxHash,
|
|
@@ -226,7 +225,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
226
225
|
return;
|
|
227
226
|
}
|
|
228
227
|
const { quote } = txHistoryItem;
|
|
229
|
-
const isBridgeTx = (0,
|
|
228
|
+
const isBridgeTx = (0, bridge_controller_1.isCrossChain)(quote.srcChainId, quote.destChainId);
|
|
230
229
|
if (isBridgeTx) {
|
|
231
230
|
__classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[txId] = this.startPolling({
|
|
232
231
|
bridgeTxMetaId: txId,
|
|
@@ -302,7 +301,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
302
301
|
const statusRequest = (0, bridge_status_1.getStatusRequestWithSrcTxHash)(historyItem.quote, srcTxHash);
|
|
303
302
|
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);
|
|
304
303
|
if (validationFailures.length > 0) {
|
|
305
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
304
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.StatusValidationFailed, bridgeTxMetaId, {
|
|
306
305
|
failures: validationFailures,
|
|
307
306
|
});
|
|
308
307
|
throw new Error(`Bridge status validation failed: ${validationFailures.join(', ')}`);
|
|
@@ -310,8 +309,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
310
309
|
const newBridgeHistoryItem = {
|
|
311
310
|
...historyItem,
|
|
312
311
|
status,
|
|
313
|
-
completionTime: status.status ===
|
|
314
|
-
status.status ===
|
|
312
|
+
completionTime: status.status === bridge_controller_1.StatusTypes.COMPLETE ||
|
|
313
|
+
status.status === bridge_controller_1.StatusTypes.FAILED
|
|
315
314
|
? Date.now()
|
|
316
315
|
: undefined, // TODO make this more accurate by looking up dest txHash block time
|
|
317
316
|
attempts: undefined,
|
|
@@ -324,8 +323,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
324
323
|
state.txHistory[bridgeTxMetaId] = newBridgeHistoryItem;
|
|
325
324
|
});
|
|
326
325
|
const pollingToken = __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
327
|
-
const isFinalStatus = status.status ===
|
|
328
|
-
status.status ===
|
|
326
|
+
const isFinalStatus = status.status === bridge_controller_1.StatusTypes.COMPLETE ||
|
|
327
|
+
status.status === bridge_controller_1.StatusTypes.FAILED;
|
|
329
328
|
if (isFinalStatus && pollingToken) {
|
|
330
329
|
this.stopPollingByPollingToken(pollingToken);
|
|
331
330
|
delete __classPrivateFieldGet(this, _BridgeStatusController_pollingTokensByTxMetaId, "f")[bridgeTxMetaId];
|
|
@@ -333,12 +332,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
333
332
|
if (historyItem.featureId) {
|
|
334
333
|
return;
|
|
335
334
|
}
|
|
336
|
-
if (status.status ===
|
|
337
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
335
|
+
if (status.status === bridge_controller_1.StatusTypes.COMPLETE) {
|
|
336
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, bridgeTxMetaId);
|
|
338
337
|
this.messenger.publish('BridgeStatusController:destinationTransactionCompleted', historyItem.quote.destAsset.assetId);
|
|
339
338
|
}
|
|
340
|
-
if (status.status ===
|
|
341
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
339
|
+
if (status.status === bridge_controller_1.StatusTypes.FAILED) {
|
|
340
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, bridgeTxMetaId);
|
|
342
341
|
}
|
|
343
342
|
}
|
|
344
343
|
}
|
|
@@ -434,10 +433,11 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
434
433
|
}
|
|
435
434
|
return finalTransactionMeta;
|
|
436
435
|
});
|
|
437
|
-
_BridgeStatusController_handleApprovalTx.set(this, async (isBridgeTx,
|
|
436
|
+
_BridgeStatusController_handleApprovalTx.set(this, async (isBridgeTx, quoteResponse, requireApproval) => {
|
|
437
|
+
const { approval } = quoteResponse;
|
|
438
438
|
if (approval) {
|
|
439
439
|
const approveTx = async () => {
|
|
440
|
-
await __classPrivateFieldGet(this, _BridgeStatusController_handleUSDTAllowanceReset, "f").call(this,
|
|
440
|
+
await __classPrivateFieldGet(this, _BridgeStatusController_handleUSDTAllowanceReset, "f").call(this, quoteResponse);
|
|
441
441
|
const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
|
|
442
442
|
transactionType: isBridgeTx
|
|
443
443
|
? transaction_controller_1.TransactionType.bridgeApproval
|
|
@@ -445,7 +445,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
445
445
|
trade: approval,
|
|
446
446
|
requireApproval,
|
|
447
447
|
});
|
|
448
|
-
await (0, transaction_1.handleApprovalDelay)(
|
|
448
|
+
await (0, transaction_1.handleApprovalDelay)(quoteResponse);
|
|
449
449
|
return approvalTxMeta;
|
|
450
450
|
};
|
|
451
451
|
return await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
|
|
@@ -453,7 +453,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
453
453
|
? constants_1.TraceName.BridgeTransactionApprovalCompleted
|
|
454
454
|
: constants_1.TraceName.SwapTransactionApprovalCompleted,
|
|
455
455
|
data: {
|
|
456
|
-
srcChainId: (0,
|
|
456
|
+
srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
457
457
|
stxEnabled: false,
|
|
458
458
|
},
|
|
459
459
|
}, approveTx);
|
|
@@ -475,7 +475,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
475
475
|
if (!selectedAccount) {
|
|
476
476
|
throw new Error('Failed to submit cross-chain swap transaction: unknown account in trade data');
|
|
477
477
|
}
|
|
478
|
-
const hexChainId = (0,
|
|
478
|
+
const hexChainId = (0, bridge_controller_1.formatChainIdToHex)(trade.chainId);
|
|
479
479
|
const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', hexChainId);
|
|
480
480
|
const requestOptions = {
|
|
481
481
|
actionId,
|
|
@@ -497,7 +497,8 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
497
497
|
const { result } = await __classPrivateFieldGet(this, _BridgeStatusController_addTransactionFn, "f").call(this, transactionParamsWithMaxGas, requestOptions);
|
|
498
498
|
return await __classPrivateFieldGet(this, _BridgeStatusController_waitForHashAndReturnFinalTxMeta, "f").call(this, result);
|
|
499
499
|
});
|
|
500
|
-
_BridgeStatusController_handleUSDTAllowanceReset.set(this, async (
|
|
500
|
+
_BridgeStatusController_handleUSDTAllowanceReset.set(this, async (quoteResponse) => {
|
|
501
|
+
const resetApproval = await (0, transaction_1.getUSDTAllowanceResetTx)(this.messenger, quoteResponse);
|
|
501
502
|
if (resetApproval) {
|
|
502
503
|
await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
|
|
503
504
|
transactionType: transaction_controller_1.TransactionType.bridgeApproval,
|
|
@@ -565,51 +566,50 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
565
566
|
* @param accountAddress - The address of the account to submit the transaction for
|
|
566
567
|
* @param quoteResponse - The quote response
|
|
567
568
|
* @param isStxEnabledOnClient - Whether smart transactions are enabled on the client, for example the getSmartTransactionsEnabled selector value from the extension
|
|
568
|
-
* @param
|
|
569
|
-
* @param warnings - The warnings to publish with the QuotesReceived event
|
|
569
|
+
* @param quotesReceivedContext - The context for the QuotesReceived event
|
|
570
570
|
* @returns The transaction meta
|
|
571
571
|
*/
|
|
572
|
-
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient,
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
this.messenger.call('BridgeController:stopPollingForQuotes');
|
|
572
|
+
this.submitTx = async (accountAddress, quoteResponse, isStxEnabledOnClient, quotesReceivedContext) => {
|
|
573
|
+
this.messenger.call('BridgeController:stopPollingForQuotes', bridge_controller_1.AbortReason.TransactionSubmitted,
|
|
574
|
+
// If trade is submitted before all quotes are loaded, the QuotesReceived event is published
|
|
575
|
+
// 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
|
|
576
|
+
quoteResponse.featureId ? undefined : quotesReceivedContext);
|
|
578
577
|
const selectedAccount = __classPrivateFieldGet(this, _BridgeStatusController_instances, "m", _BridgeStatusController_getMultichainSelectedAccount).call(this, accountAddress);
|
|
579
578
|
if (!selectedAccount) {
|
|
580
579
|
throw new Error('Failed to submit cross-chain swap transaction: undefined multichain account');
|
|
581
580
|
}
|
|
582
|
-
const isHardwareAccount = (0,
|
|
581
|
+
const isHardwareAccount = (0, bridge_controller_1.isHardwareWallet)(selectedAccount);
|
|
583
582
|
const preConfirmationProperties = (0, metrics_1.getPreConfirmationPropertiesFromQuote)(quoteResponse, isStxEnabledOnClient, isHardwareAccount);
|
|
584
583
|
// Emit Submitted event after submit button is clicked
|
|
585
584
|
!quoteResponse.featureId &&
|
|
586
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
585
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Submitted, undefined, preConfirmationProperties);
|
|
587
586
|
let txMeta;
|
|
588
587
|
let approvalTxId;
|
|
589
588
|
const startTime = Date.now();
|
|
590
|
-
const isBridgeTx = (0,
|
|
589
|
+
const isBridgeTx = (0, bridge_controller_1.isCrossChain)(quoteResponse.quote.srcChainId, quoteResponse.quote.destChainId);
|
|
591
590
|
// Submit non-EVM tx (Solana, BTC, Tron)
|
|
592
|
-
|
|
591
|
+
const isNonEvmTrade = (0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId) &&
|
|
592
|
+
(typeof quoteResponse.trade === 'string' ||
|
|
593
|
+
(0, bridge_controller_1.isBitcoinTrade)(quoteResponse.trade) ||
|
|
594
|
+
(0, bridge_controller_1.isTronTrade)(quoteResponse.trade));
|
|
595
|
+
if (isNonEvmTrade) {
|
|
593
596
|
// Handle non-EVM approval if present (e.g., Tron token approvals)
|
|
594
|
-
if (quoteResponse.approval
|
|
597
|
+
if (quoteResponse.approval) {
|
|
595
598
|
const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
|
|
596
599
|
name: isBridgeTx
|
|
597
600
|
? constants_1.TraceName.BridgeTransactionApprovalCompleted
|
|
598
601
|
: constants_1.TraceName.SwapTransactionApprovalCompleted,
|
|
599
602
|
data: {
|
|
600
|
-
srcChainId: (0,
|
|
603
|
+
srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
601
604
|
stxEnabled: false,
|
|
602
605
|
},
|
|
603
606
|
}, async () => {
|
|
604
607
|
try {
|
|
605
|
-
return quoteResponse.approval
|
|
606
|
-
(0, bridge_controller_2.isTronTrade)(quoteResponse.approval)
|
|
607
|
-
? await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.approval, quoteResponse, selectedAccount)
|
|
608
|
-
: undefined;
|
|
608
|
+
return await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.approval, quoteResponse, selectedAccount);
|
|
609
609
|
}
|
|
610
610
|
catch (error) {
|
|
611
611
|
!quoteResponse.featureId &&
|
|
612
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
612
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, undefined, {
|
|
613
613
|
error_message: error?.message,
|
|
614
614
|
...preConfirmationProperties,
|
|
615
615
|
});
|
|
@@ -618,28 +618,23 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
618
618
|
});
|
|
619
619
|
approvalTxId = approvalTxMeta?.id;
|
|
620
620
|
// Add delay after approval similar to EVM flow
|
|
621
|
-
await (0, transaction_1.handleApprovalDelay)(quoteResponse
|
|
621
|
+
await (0, transaction_1.handleApprovalDelay)(quoteResponse);
|
|
622
622
|
}
|
|
623
623
|
txMeta = await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
|
|
624
624
|
name: isBridgeTx
|
|
625
625
|
? constants_1.TraceName.BridgeTransactionCompleted
|
|
626
626
|
: constants_1.TraceName.SwapTransactionCompleted,
|
|
627
627
|
data: {
|
|
628
|
-
srcChainId: (0,
|
|
628
|
+
srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
629
629
|
stxEnabled: false,
|
|
630
630
|
},
|
|
631
631
|
}, async () => {
|
|
632
632
|
try {
|
|
633
|
-
if (!((0, bridge_controller_2.isTronTrade)(quoteResponse.trade) ||
|
|
634
|
-
(0, bridge_controller_2.isBitcoinTrade)(quoteResponse.trade) ||
|
|
635
|
-
typeof quoteResponse.trade === 'string')) {
|
|
636
|
-
throw new Error('Failed to submit cross-chain swap transaction: trade is not a non-EVM transaction');
|
|
637
|
-
}
|
|
638
633
|
return await __classPrivateFieldGet(this, _BridgeStatusController_handleNonEvmTx, "f").call(this, quoteResponse.trade, quoteResponse, selectedAccount);
|
|
639
634
|
}
|
|
640
635
|
catch (error) {
|
|
641
636
|
!quoteResponse.featureId &&
|
|
642
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
637
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, txMeta?.id, {
|
|
643
638
|
error_message: error?.message,
|
|
644
639
|
...preConfirmationProperties,
|
|
645
640
|
});
|
|
@@ -658,20 +653,15 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
658
653
|
? constants_1.TraceName.BridgeTransactionCompleted
|
|
659
654
|
: constants_1.TraceName.SwapTransactionCompleted,
|
|
660
655
|
data: {
|
|
661
|
-
srcChainId: (0,
|
|
656
|
+
srcChainId: (0, bridge_controller_1.formatChainIdToCaip)(quoteResponse.quote.srcChainId),
|
|
662
657
|
stxEnabled: isStxEnabledOnClient,
|
|
663
658
|
},
|
|
664
659
|
}, async () => {
|
|
665
|
-
if (!(0, bridge_controller_1.isEvmTxData)(quoteResponse.trade)) {
|
|
666
|
-
throw new Error('Failed to submit cross-chain swap transaction: trade is not an EVM transaction');
|
|
667
|
-
}
|
|
668
660
|
if (isStxEnabledOnClient || quoteResponse.quote.gasIncluded7702) {
|
|
669
661
|
const { tradeMeta, approvalMeta } = await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransactionBatch, "f").call(this, {
|
|
670
662
|
isBridgeTx,
|
|
671
|
-
resetApproval:
|
|
672
|
-
approval: quoteResponse.approval
|
|
673
|
-
? quoteResponse.approval
|
|
674
|
-
: undefined,
|
|
663
|
+
resetApproval: (await (0, transaction_1.getUSDTAllowanceResetTx)(this.messenger, quoteResponse)),
|
|
664
|
+
approval: quoteResponse.approval,
|
|
675
665
|
trade: quoteResponse.trade,
|
|
676
666
|
quoteResponse,
|
|
677
667
|
requireApproval,
|
|
@@ -680,12 +670,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
680
670
|
return tradeMeta;
|
|
681
671
|
}
|
|
682
672
|
// Set approval time and id if an approval tx is needed
|
|
683
|
-
const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleApprovalTx, "f").call(this, isBridgeTx, quoteResponse
|
|
684
|
-
? quoteResponse.approval
|
|
685
|
-
: undefined, quoteResponse.resetApproval &&
|
|
686
|
-
(0, bridge_controller_1.isEvmTxData)(quoteResponse.resetApproval)
|
|
687
|
-
? quoteResponse.resetApproval
|
|
688
|
-
: undefined, requireApproval);
|
|
673
|
+
const approvalTxMeta = await __classPrivateFieldGet(this, _BridgeStatusController_handleApprovalTx, "f").call(this, isBridgeTx, quoteResponse, requireApproval);
|
|
689
674
|
approvalTxId = approvalTxMeta?.id;
|
|
690
675
|
await (0, transaction_1.handleMobileHardwareWalletDelay)(requireApproval);
|
|
691
676
|
return await __classPrivateFieldGet(this, _BridgeStatusController_handleEvmTransaction, "f").call(this, {
|
|
@@ -712,12 +697,12 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
712
697
|
startTime,
|
|
713
698
|
approvalTxId,
|
|
714
699
|
});
|
|
715
|
-
if ((0,
|
|
700
|
+
if ((0, bridge_controller_1.isNonEvmChainId)(quoteResponse.quote.srcChainId)) {
|
|
716
701
|
// Start polling for bridge tx status
|
|
717
702
|
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, txMeta.id);
|
|
718
703
|
// Track non-EVM Swap completed event
|
|
719
704
|
if (!isBridgeTx) {
|
|
720
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
705
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, txMeta.id);
|
|
721
706
|
}
|
|
722
707
|
}
|
|
723
708
|
}
|
|
@@ -735,7 +720,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
735
720
|
*/
|
|
736
721
|
_BridgeStatusController_trackUnifiedSwapBridgeEvent.set(this, (eventName, txMetaId, eventProperties) => {
|
|
737
722
|
const baseProperties = {
|
|
738
|
-
action_type:
|
|
723
|
+
action_type: bridge_controller_1.MetricsActionType.SWAPBRIDGE_V1,
|
|
739
724
|
...(eventProperties ?? {}),
|
|
740
725
|
};
|
|
741
726
|
// This will publish events for PERPS dropped tx failures as well
|
|
@@ -750,7 +735,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
750
735
|
}
|
|
751
736
|
const requestParamProperties = (0, metrics_1.getRequestParamFromHistory)(historyItem);
|
|
752
737
|
// Always publish StatusValidationFailed event, regardless of featureId
|
|
753
|
-
if (eventName ===
|
|
738
|
+
if (eventName === bridge_controller_1.UnifiedSwapBridgeEventName.StatusValidationFailed) {
|
|
754
739
|
const { chain_id_source, chain_id_destination, token_address_source, token_address_destination, } = requestParamProperties;
|
|
755
740
|
this.messenger.call('BridgeController:trackUnifiedSwapBridgeEvent', eventName, {
|
|
756
741
|
...baseProperties,
|
|
@@ -818,16 +803,16 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
818
803
|
__classPrivateFieldGet(this, _BridgeStatusController_markTxAsFailed, "f").call(this, transactionMeta);
|
|
819
804
|
// Track failed event
|
|
820
805
|
if (status !== transaction_controller_1.TransactionStatus.rejected) {
|
|
821
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
806
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Failed, id, (0, metrics_1.getEVMTxPropertiesFromTransactionMeta)(transactionMeta));
|
|
822
807
|
}
|
|
823
808
|
}
|
|
824
809
|
});
|
|
825
810
|
this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
|
|
826
811
|
const { type, id, chainId } = transactionMeta;
|
|
827
812
|
if (type === transaction_controller_1.TransactionType.swap) {
|
|
828
|
-
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this,
|
|
813
|
+
__classPrivateFieldGet(this, _BridgeStatusController_trackUnifiedSwapBridgeEvent, "f").call(this, bridge_controller_1.UnifiedSwapBridgeEventName.Completed, id);
|
|
829
814
|
}
|
|
830
|
-
if (type === transaction_controller_1.TransactionType.bridge && !(0,
|
|
815
|
+
if (type === transaction_controller_1.TransactionType.bridge && !(0, bridge_controller_1.isNonEvmChainId)(chainId)) {
|
|
831
816
|
__classPrivateFieldGet(this, _BridgeStatusController_startPollingForTxId, "f").call(this, id);
|
|
832
817
|
}
|
|
833
818
|
});
|