@metamask/bridge-status-controller 44.0.0 → 45.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -2
- package/dist/bridge-status-controller.cjs +1 -1
- package/dist/bridge-status-controller.cjs.map +1 -1
- package/dist/bridge-status-controller.mjs +2 -2
- package/dist/bridge-status-controller.mjs.map +1 -1
- package/dist/constants.cjs +2 -2
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +1 -1
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +1 -1
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +1 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/utils/transaction.cjs +6 -6
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.d.cts +5 -1
- package/dist/utils/transaction.d.cts.map +1 -1
- package/dist/utils/transaction.d.mts +5 -1
- package/dist/utils/transaction.d.mts.map +1 -1
- package/dist/utils/transaction.mjs +5 -5
- package/dist/utils/transaction.mjs.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -7,10 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [
|
|
10
|
+
## [45.0.0]
|
|
11
11
|
|
|
12
12
|
### Changed
|
|
13
13
|
|
|
14
|
+
- Bump `@metamask/bridge-controller` from `^44.0.1` to `^45.0.0` ([#6716](https://github.com/MetaMask/core/pull/6716), [#6629](https://github.com/MetaMask/core/pull/6716))
|
|
15
|
+
|
|
16
|
+
## [44.1.0]
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Revert accidental breaking changes included in v44.0.0 ([#6454](https://github.com/MetaMask/core/pull/6454))
|
|
21
|
+
- Refactor `handleLineaDelay` to `handleApprovalDelay` for improved abstraction and add support for Base chain by using an array and `includes` for chain ID checks ([#6674](https://github.com/MetaMask/core/pull/6674))
|
|
22
|
+
|
|
23
|
+
## [44.0.0] [DEPRECATED]
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- This version was deprecated because it accidentally included additional breaking changes; use v44.1.0 or later versions instead
|
|
14
28
|
- **BREAKING:** Bump peer dependency `@metamask/bridge-controller` from `^43.0.0` to `^44.0.0` ([#6652](https://github.com/MetaMask/core/pull/6652), [#6676](https://github.com/MetaMask/core/pull/6676))
|
|
15
29
|
|
|
16
30
|
## [43.1.0]
|
|
@@ -558,7 +572,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
558
572
|
|
|
559
573
|
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
|
|
560
574
|
|
|
561
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@
|
|
575
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@45.0.0...HEAD
|
|
576
|
+
[45.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@44.1.0...@metamask/bridge-status-controller@45.0.0
|
|
577
|
+
[44.1.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@44.0.0...@metamask/bridge-status-controller@44.1.0
|
|
562
578
|
[44.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@43.1.0...@metamask/bridge-status-controller@44.0.0
|
|
563
579
|
[43.1.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@43.0.0...@metamask/bridge-status-controller@43.1.0
|
|
564
580
|
[43.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-status-controller@42.0.0...@metamask/bridge-status-controller@43.0.0
|
|
@@ -434,7 +434,7 @@ class BridgeStatusController extends (0, polling_controller_1.StaticIntervalPoll
|
|
|
434
434
|
trade: approval,
|
|
435
435
|
requireApproval,
|
|
436
436
|
});
|
|
437
|
-
await (0, transaction_1.
|
|
437
|
+
await (0, transaction_1.handleApprovalDelay)(quoteResponse);
|
|
438
438
|
return approvalTxMeta;
|
|
439
439
|
};
|
|
440
440
|
return await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
|
|
@@ -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 type {\n QuoteMetadata,\n RequiredEventContextFromClient,\n TxData,\n QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isSolanaChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\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 handleLineaDelay,\n handleMobileHardwareWalletDelay,\n handleSolanaTxResponse,\n} from './utils/transaction';\nimport { generateActionId } 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 anonymous: 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.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messagingSystem.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.messagingSystem.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.messagingSystem.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 && !isSolanaChainId(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.messagingSystem.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messagingSystem.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,\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 };\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() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\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 if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\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.messagingSystem.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 keyring rpc method\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 quoteResponse - The quote response\n * @param quoteResponse.quote - The quote\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleSolanaTx = async (\n quoteResponse: QuoteResponse<string> & 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(quoteResponse, selectedAccount);\n const requestResponse = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n request,\n )) as string | { result: Record<string, string> } | { signature: string };\n\n // The extension client actually redirects before it can do anytyhing with this meta\n const txMeta = handleSolanaTxResponse(\n requestResponse,\n quoteResponse,\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 =\n this.messagingSystem\n .call('TransactionController:getState')\n .transactions.find(\n (tx: TransactionMeta) => tx.hash === transactionHash,\n );\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<string | TxData> & 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,\n requireApproval,\n });\n\n await handleLineaDelay(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.messagingSystem.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.messagingSystem.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<TxData | string> & QuoteMetadata,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messagingSystem,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messagingSystem.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 'messagingSystem' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messagingSystem: this.messagingSystem,\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 messagingSystem: this.messagingSystem,\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 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 * @returns The transaction meta\n */\n submitTx = async (\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messagingSystem.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount();\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 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 SOLANA tx\n if (\n isSolanaChainId(quoteResponse.quote.srcChainId) &&\n typeof quoteResponse.trade === 'string'\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.#handleSolanaTx(\n quoteResponse as QuoteResponse<string> & QuoteMetadata,\n selectedAccount,\n );\n } catch (error) {\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.messagingSystem,\n quoteResponse,\n ),\n approval: quoteResponse.approval,\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 (isSolanaChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track Solana 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.SnapConfirmationViewed\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 if (!txMetaId) {\n this.messagingSystem.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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messagingSystem.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 requestParamProperties = getRequestParamFromHistory(historyItem);\n\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.messagingSystem.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 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.messagingSystem.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 {\n QuoteMetadata,\n RequiredEventContextFromClient,\n TxData,\n QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isSolanaChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\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 handleSolanaTxResponse,\n} from './utils/transaction';\nimport { generateActionId } 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 anonymous: 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.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messagingSystem.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.messagingSystem.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.messagingSystem.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 && !isSolanaChainId(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.messagingSystem.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messagingSystem.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,\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 };\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() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\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 if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\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.messagingSystem.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 keyring rpc method\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 quoteResponse - The quote response\n * @param quoteResponse.quote - The quote\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleSolanaTx = async (\n quoteResponse: QuoteResponse<string> & 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(quoteResponse, selectedAccount);\n const requestResponse = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n request,\n )) as string | { result: Record<string, string> } | { signature: string };\n\n // The extension client actually redirects before it can do anytyhing with this meta\n const txMeta = handleSolanaTxResponse(\n requestResponse,\n quoteResponse,\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 =\n this.messagingSystem\n .call('TransactionController:getState')\n .transactions.find(\n (tx: TransactionMeta) => tx.hash === transactionHash,\n );\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<string | TxData> & 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,\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.messagingSystem.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.messagingSystem.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<TxData | string> & QuoteMetadata,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messagingSystem,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messagingSystem.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 'messagingSystem' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messagingSystem: this.messagingSystem,\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 messagingSystem: this.messagingSystem,\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 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 * @returns The transaction meta\n */\n submitTx = async (\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messagingSystem.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount();\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 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 SOLANA tx\n if (\n isSolanaChainId(quoteResponse.quote.srcChainId) &&\n typeof quoteResponse.trade === 'string'\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.#handleSolanaTx(\n quoteResponse as QuoteResponse<string> & QuoteMetadata,\n selectedAccount,\n );\n } catch (error) {\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.messagingSystem,\n quoteResponse,\n ),\n approval: quoteResponse.approval,\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 (isSolanaChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track Solana 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.SnapConfirmationViewed\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 if (!txMetaId) {\n this.messagingSystem.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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messagingSystem.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 requestParamProperties = getRequestParamFromHistory(historyItem);\n\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.messagingSystem.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 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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
|
@@ -20,7 +20,7 @@ import { BridgeClientId } from "./types.mjs";
|
|
|
20
20
|
import { fetchBridgeTxStatus, getStatusRequestWithSrcTxHash, shouldSkipFetchDueToFetchFailures } from "./utils/bridge-status.mjs";
|
|
21
21
|
import { getTxGasEstimates } from "./utils/gas.mjs";
|
|
22
22
|
import { getFinalizedTxProperties, getPriceImpactFromQuote, getRequestMetadataFromHistory, getRequestParamFromHistory, getTradeDataFromHistory, getEVMTxPropertiesFromTransactionMeta, getTxStatusesFromHistory, getPreConfirmationPropertiesFromQuote } from "./utils/metrics.mjs";
|
|
23
|
-
import { findAndUpdateTransactionsInBatch, getAddTransactionBatchParams, getClientRequest, getStatusRequestParams, getUSDTAllowanceResetTx,
|
|
23
|
+
import { findAndUpdateTransactionsInBatch, getAddTransactionBatchParams, getClientRequest, getStatusRequestParams, getUSDTAllowanceResetTx, handleApprovalDelay, handleMobileHardwareWalletDelay, handleSolanaTxResponse } from "./utils/transaction.mjs";
|
|
24
24
|
import { generateActionId } from "./utils/transaction.mjs";
|
|
25
25
|
const metadata = {
|
|
26
26
|
// We want to persist the bridge status state so that we can show the proper data for the Activity list
|
|
@@ -431,7 +431,7 @@ export class BridgeStatusController extends StaticIntervalPollingController() {
|
|
|
431
431
|
trade: approval,
|
|
432
432
|
requireApproval,
|
|
433
433
|
});
|
|
434
|
-
await
|
|
434
|
+
await handleApprovalDelay(quoteResponse);
|
|
435
435
|
return approvalTxMeta;
|
|
436
436
|
};
|
|
437
437
|
return await __classPrivateFieldGet(this, _BridgeStatusController_trace, "f").call(this, {
|
|
@@ -1 +1 @@
|
|
|
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 {\n QuoteMetadata,\n RequiredEventContextFromClient,\n TxData,\n QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isSolanaChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\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 handleLineaDelay,\n handleMobileHardwareWalletDelay,\n handleSolanaTxResponse,\n} from './utils/transaction';\nimport { generateActionId } 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 anonymous: 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.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messagingSystem.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.messagingSystem.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.messagingSystem.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 && !isSolanaChainId(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.messagingSystem.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messagingSystem.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,\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 };\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() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\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 if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\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.messagingSystem.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 keyring rpc method\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 quoteResponse - The quote response\n * @param quoteResponse.quote - The quote\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleSolanaTx = async (\n quoteResponse: QuoteResponse<string> & 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(quoteResponse, selectedAccount);\n const requestResponse = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n request,\n )) as string | { result: Record<string, string> } | { signature: string };\n\n // The extension client actually redirects before it can do anytyhing with this meta\n const txMeta = handleSolanaTxResponse(\n requestResponse,\n quoteResponse,\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 =\n this.messagingSystem\n .call('TransactionController:getState')\n .transactions.find(\n (tx: TransactionMeta) => tx.hash === transactionHash,\n );\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<string | TxData> & 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,\n requireApproval,\n });\n\n await handleLineaDelay(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.messagingSystem.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.messagingSystem.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<TxData | string> & QuoteMetadata,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messagingSystem,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messagingSystem.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 'messagingSystem' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messagingSystem: this.messagingSystem,\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 messagingSystem: this.messagingSystem,\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 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 * @returns The transaction meta\n */\n submitTx = async (\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messagingSystem.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount();\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 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 SOLANA tx\n if (\n isSolanaChainId(quoteResponse.quote.srcChainId) &&\n typeof quoteResponse.trade === 'string'\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.#handleSolanaTx(\n quoteResponse as QuoteResponse<string> & QuoteMetadata,\n selectedAccount,\n );\n } catch (error) {\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.messagingSystem,\n quoteResponse,\n ),\n approval: quoteResponse.approval,\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 (isSolanaChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track Solana 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.SnapConfirmationViewed\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 if (!txMetaId) {\n this.messagingSystem.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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messagingSystem.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 requestParamProperties = getRequestParamFromHistory(historyItem);\n\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.messagingSystem.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 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.messagingSystem.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":";;;;;;;;;;;;AAQA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EAClB,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,EACvB,gCAA4B;AAC7B,OAAO,EAAE,gBAAgB,EAAE,gCAA4B;AAEvD,MAAM,QAAQ,GAA+C;IAC3D,uGAAuG;IACvG,wDAAwD;IACxD,SAAS,EAAE;QACT,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,KAAK;QAChB,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;gBACjB,OAAO;aACR;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;gBACjB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAC,SAAS,CAAC;gBACrE,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC3D,4BAA4B,CAC7B,CAAC;gBACF,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACrD,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;aAC3D;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;gBACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;aAC/D;YAED,8CAA8C;YAC9C,IAAI,cAAkC,CAAC;YAEvC,IAAI,QAAQ,EAAE;gBACZ,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAClC,cAAc,GAAG,QAAQ,CAAC;iBAC3B;aACF;iBAAM,IAAI,MAAM,EAAE;gBACjB,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;aACH;YAED,IAAI,CAAC,cAAc,EAAE;gBACnB,MAAM,IAAI,KAAK,CACb,2CACE,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EACxD,EAAE,CACH,CAAC;aACH;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;oBAClB,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC;iBACtD;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;gBACd,yDAAyD;gBACzD,MAAM,oBAAoB,GACxB,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;gBAEhD,IAAI,CAAC,oBAAoB,EAAE;oBACzB,kBAAkB;oBAClB,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,cAAc,CAAC,CAAC;iBAC3C;aACF;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;oBACnB,OAAO;iBACR;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,CAAC,MAAM;oBAC3C,eAAe,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI,SAAS;oBAC1D,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,SAAS;oBAChE,iBAAiB,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS;oBAC/D,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,SAAS;iBACrE;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;aACpC,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;gBACxB,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;aACtD;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO;aACR;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;gBACd,uBAAA,IAAI,uDAAyB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;oBACtD,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAC;aACJ;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;QAQF;;;;;;;;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;gBACvD,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;gBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;aACtD;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;gBACA,OAAO;aACR;YAED,IAAI;gBACF,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;oBACd,OAAO;iBACR;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;oBACjC,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;iBACH;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;oBACf,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;oBACjC,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;oBAC7C,OAAO,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAAC;oBAErD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,QAAQ,EAAE;wBAC1C,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,cAAc,CACf,CAAC;qBACH;oBACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE;wBACxC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,cAAc,CACf,CAAC;qBACH;iBACF;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;gBACpD,uBAAA,IAAI,kDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;aAC1C;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;gBACb,OAAO,SAAS,CAAC;aAClB;YAED,iFAAiF;YACjF,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACjD,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;gBACpD,OAAO;aACR;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;oBAChB,IAAI,CAAC,yBAAyB,CAC5B,uBAAA,IAAI,uDAAyB,CAAC,cAAc,CAAC,CAC9C,CAAC;iBACH;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;;;;;;;;;WASG;QACM,iDAAkB,KAAK,EAC9B,aAAoD,EACpD,eAAgF,EAChF,EAAE;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;gBACvC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;aACH;YAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YACjE,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CACtD,8BAA8B,EAC9B,OAAO,CACR,CAAwE,CAAC;YAE1E,oFAAoF;YACpF,MAAM,MAAM,GAAG,sBAAsB,CACnC,eAAe,EACf,aAAa,EACb,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,GACxB,IAAI,CAAC,eAAe;iBACjB,IAAI,CAAC,gCAAgC,CAAC;iBACtC,YAAY,CAAC,IAAI,CAChB,CAAC,EAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CACrD,CAAC;YACN,IAAI,CAAC,oBAAoB,EAAE;gBACzB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;aACH;YACD,OAAO,oBAAoB,CAAC;QAC9B,CAAC,EAAC;QAEO,mDAAoB,KAAK,EAChC,UAAmB,EACnB,aAA6D,EAC7D,eAAyB,EACa,EAAE;YACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;YAEnC,IAAI,QAAQ,EAAE;gBACZ,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,QAAQ;wBACf,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;aACH;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,eAAe,CAAC,IAAI,CAC/C,wCAAwC,EACxC,KAAK,CAAC,IAAI,CACX,CAAC;YACF,IAAI,CAAC,eAAe,EAAE;gBACpB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;aACH;YACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC/C,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,aAA6D,EAC7D,EAAE;YACF,MAAM,aAAa,GAAG,MAAM,uBAAuB,CACjD,IAAI,CAAC,eAAe,EACpB,aAAa,CACd,CAAC;YACF,IAAI,aAAa,EAAE;gBACjB,MAAM,uBAAA,IAAI,oDAAsB,MAA1B,IAAI,EAAuB;oBAC/B,eAAe,EAAE,eAAe,CAAC,cAAc;oBAC/C,KAAK,EAAE,aAAa;iBACrB,CAAC,CAAC;aACJ;QACH,CAAC,EAAC;QAEO,mDAAoB,KAAK,EAChC,iBAAoC,EACpC,eAAuB,EACvB,OAAY,EACZ,EAAE;YACF,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACnD,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,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,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,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,mBAAmB,EAAE,uBAAA,IAAI,mDAAqB;gBAC9C,OAAO;gBACP,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;aACH;YAED,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC,EAAC;QAEF;;;;;;WAMG;QACH,aAAQ,GAAG,KAAK,EACd,aAA6D,EAC7D,oBAA6B,EAC8B,EAAE;YAC7D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAEnE,MAAM,eAAe,GAAG,uBAAA,IAAI,+FAA8B,MAAlC,IAAI,CAAgC,CAAC;YAC7D,IAAI,CAAC,eAAe,EAAE;gBACpB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;aACH;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,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,SAAS,EACT,yBAAyB,CAC1B,CAAC;YAEF,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,mBAAmB;YACnB,IACE,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC/C,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ,EACvC;gBACA,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;wBACF,OAAO,MAAM,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EACf,aAAsD,EACtD,eAAe,CAChB,CAAC;qBACH;oBAAC,OAAO,KAAK,EAAE;wBACd,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,MAAM,EAAE,EAAE,EACV;4BACE,aAAa,EAAG,KAAe,EAAE,OAAO;4BACxC,GAAG,yBAAyB;yBAC7B,CACF,CAAC;wBACF,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC,CACF,CAAC;aACH;iBAAM;gBACL,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;wBAC/D,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAC/B,MAAM,uBAAA,IAAI,yDAA2B,MAA/B,IAAI,EAA4B;4BACpC,UAAU;4BACV,aAAa,EAAE,MAAM,uBAAuB,CAC1C,IAAI,CAAC,eAAe,EACpB,aAAa,CACd;4BACD,QAAQ,EAAE,aAAa,CAAC,QAAQ;4BAChC,KAAK,EAAE,aAAa,CAAC,KAAe;4BACpC,aAAa;4BACb,eAAe;yBAChB,CAAC,CAAC;wBAEL,YAAY,GAAG,YAAY,EAAE,EAAE,CAAC;wBAChC,OAAO,SAAS,CAAC;qBAClB;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;aACH;YAED,IAAI;gBACF,mCAAmC;gBACnC,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB;oBACnB,cAAc,EAAE,eAAe,CAAC,OAAO;oBACvC,YAAY,EAAE,MAAM;oBACpB,aAAa,EAAE;wBACb,GAAG,sBAAsB,CAAC,aAAa,CAAC;wBACxC,SAAS,EAAE,MAAM,CAAC,IAAI;qBACvB;oBACD,aAAa;oBACb,kBAAkB,EAAE,CAAC;oBACrB,YAAY,EAAE,oBAAoB;oBAClC,SAAS;oBACT,YAAY;iBACb,CAAC,CAAC;gBAEH,IAAI,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;oBACnD,qCAAqC;oBACrC,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,MAAM,CAAC,EAAE,CAAC,CAAC;oBACrC,oCAAoC;oBACpC,IAAI,CAAC,UAAU,EAAE;wBACf,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,MAAM,CAAC,EAAE,CACV,CAAC;qBACH;iBACF;aACF;YAAC,MAAM;gBACN,8FAA8F;aAC/F;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF;;;;;;WAMG;QACM,8DAA+B,CAQtC,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,IAAI,CAAC,QAAQ,EAAE;gBACb,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,8CAA8C,EAC9C,SAAS,EACT,cAAc,CACf,CAAC;gBACF,OAAO;aACR;YAED,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,EAAE;gBAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,8CAA8C,EAC9C,SAAS,EACT,eAAe,IAAI,EAAE,CACtB,CAAC;gBACF,OAAO;aACR;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC/C,wCAAwC,EACxC,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAChD,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,sBAAsB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;YAEvE,IAAI,SAAS,KAAK,0BAA0B,CAAC,sBAAsB,EAAE;gBACnE,MAAM,EACJ,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,GAC1B,GAAG,sBAAsB,CAAC;gBAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,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;aACR;YAED,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,eAAe,CAAC,IAAI,CACvB,8CAA8C,EAC9C,SAAS,EACT,uBAAuB,CACxB,CAAC;QACJ,CAAC,EAAC;QAnlCA,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,eAAe,CAAC,qBAAqB,CACxC,GAAG,6BAA6B,gCAAgC,EAChE,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9C,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,6BAA6B,mBAAmB,EACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,6BAA6B,aAAa,EAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,6BAA6B,WAAW,EAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,6BAA6B,kCAAkC,EAClE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAChD,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,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,eAAe,CAAC,SAAS,CAC5B,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;gBACA,iCAAiC;gBACjC,uBAAA,IAAI,8CAAgB,MAApB,IAAI,EAAiB,eAAe,CAAC,CAAC;gBACtC,qBAAqB;gBACrB,IAAI,MAAM,KAAK,iBAAiB,CAAC,QAAQ,EAAE;oBACzC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,MAAM,EACjC,EAAE,EACF,qCAAqC,CAAC,eAAe,CAAC,CACvD,CAAC;iBACH;aACF;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,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;gBACjC,uBAAA,IAAI,2DAA6B,MAAjC,IAAI,EACF,0BAA0B,CAAC,SAAS,EACpC,EAAE,CACH,CAAC;aACH;YACD,IAAI,IAAI,KAAK,eAAe,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;gBAChE,uBAAA,IAAI,mDAAqB,MAAzB,IAAI,EAAsB,EAAE,CAAC,CAAC;aAC/B;QACH,CAAC,CACF,CAAC;QAEF,+EAA+E;QAC/E,8CAA8C;QAC9C,mFAAmF;QACnF,uBAAA,IAAI,uEAAyC,MAA7C,IAAI,CAA2C,CAAC;IAClD,CAAC;CAu/BF;;IApuBG,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAC9B,iDAAiD,CAClD,CAAC;AACJ,CAAC","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport type {\n QuoteMetadata,\n RequiredEventContextFromClient,\n TxData,\n QuoteResponse,\n} from '@metamask/bridge-controller';\nimport {\n formatChainIdToHex,\n isSolanaChainId,\n StatusTypes,\n UnifiedSwapBridgeEventName,\n formatChainIdToCaip,\n isCrossChain,\n isHardwareWallet,\n MetricsActionType,\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 handleSolanaTxResponse,\n} from './utils/transaction';\nimport { generateActionId } 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 anonymous: 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.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:startPollingForBridgeTxStatus`,\n this.startPollingForBridgeTxStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:wipeBridgeStatus`,\n this.wipeBridgeStatus.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:resetState`,\n this.resetState.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:submitTx`,\n this.submitTx.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n `${BRIDGE_STATUS_CONTROLLER_NAME}:restartPollingForFailedAttempts`,\n this.restartPollingForFailedAttempts.bind(this),\n );\n this.messagingSystem.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.messagingSystem.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.messagingSystem.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 && !isSolanaChainId(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.messagingSystem.call(\n 'NetworkController:getState',\n );\n const selectedNetworkClient = this.messagingSystem.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,\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 };\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() {\n return this.messagingSystem.call(\n 'AccountsController:getSelectedMultichainAccount',\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 if (status.status === StatusTypes.COMPLETE) {\n this.#trackUnifiedSwapBridgeEvent(\n UnifiedSwapBridgeEventName.Completed,\n bridgeTxMetaId,\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.messagingSystem.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 keyring rpc method\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 quoteResponse - The quote response\n * @param quoteResponse.quote - The quote\n * @param selectedAccount - The account to submit the transaction for\n * @returns The transaction meta\n */\n readonly #handleSolanaTx = async (\n quoteResponse: QuoteResponse<string> & 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(quoteResponse, selectedAccount);\n const requestResponse = (await this.messagingSystem.call(\n 'SnapController:handleRequest',\n request,\n )) as string | { result: Record<string, string> } | { signature: string };\n\n // The extension client actually redirects before it can do anytyhing with this meta\n const txMeta = handleSolanaTxResponse(\n requestResponse,\n quoteResponse,\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 =\n this.messagingSystem\n .call('TransactionController:getState')\n .transactions.find(\n (tx: TransactionMeta) => tx.hash === transactionHash,\n );\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<string | TxData> & 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,\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.messagingSystem.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.messagingSystem.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<TxData | string> & QuoteMetadata,\n ) => {\n const resetApproval = await getUSDTAllowanceResetTx(\n this.messagingSystem,\n quoteResponse,\n );\n if (resetApproval) {\n await this.#handleEvmTransaction({\n transactionType: TransactionType.bridgeApproval,\n trade: resetApproval,\n });\n }\n };\n\n readonly #calculateGasFees = async (\n transactionParams: TransactionParams,\n networkClientId: string,\n chainId: Hex,\n ) => {\n const { gasFeeEstimates } = this.messagingSystem.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 'messagingSystem' | 'estimateGasFeeFn'\n >,\n ) => {\n const transactionParams = await getAddTransactionBatchParams({\n messagingSystem: this.messagingSystem,\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 messagingSystem: this.messagingSystem,\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 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 * @returns The transaction meta\n */\n submitTx = async (\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n isStxEnabledOnClient: boolean,\n ): Promise<TransactionMeta & Partial<SolanaTransactionMeta>> => {\n this.messagingSystem.call('BridgeController:stopPollingForQuotes');\n\n const selectedAccount = this.#getMultichainSelectedAccount();\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 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 SOLANA tx\n if (\n isSolanaChainId(quoteResponse.quote.srcChainId) &&\n typeof quoteResponse.trade === 'string'\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.#handleSolanaTx(\n quoteResponse as QuoteResponse<string> & QuoteMetadata,\n selectedAccount,\n );\n } catch (error) {\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.messagingSystem,\n quoteResponse,\n ),\n approval: quoteResponse.approval,\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 (isSolanaChainId(quoteResponse.quote.srcChainId)) {\n // Start polling for bridge tx status\n this.#startPollingForTxId(txMeta.id);\n // Track Solana 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.SnapConfirmationViewed\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 if (!txMetaId) {\n this.messagingSystem.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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n eventProperties ?? {},\n );\n return;\n }\n\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n historyItem.account,\n );\n\n const { transactions } = this.messagingSystem.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 requestParamProperties = getRequestParamFromHistory(historyItem);\n\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.messagingSystem.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 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.messagingSystem.call(\n 'BridgeController:trackUnifiedSwapBridgeEvent',\n eventName,\n requiredEventProperties,\n );\n };\n}\n"]}
|
package/dist/constants.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TraceName = exports.
|
|
3
|
+
exports.TraceName = exports.APPROVAL_DELAY_MS = exports.BRIDGE_PROD_API_BASE_URL = exports.DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE = exports.BRIDGE_STATUS_CONTROLLER_NAME = exports.MAX_ATTEMPTS = exports.REFRESH_INTERVAL_MS = void 0;
|
|
4
4
|
exports.REFRESH_INTERVAL_MS = 10 * 1000; // 10 seconds
|
|
5
5
|
exports.MAX_ATTEMPTS = 7; // at 7 attempts, delay is 10:40, cumulative time is 21:10
|
|
6
6
|
exports.BRIDGE_STATUS_CONTROLLER_NAME = 'BridgeStatusController';
|
|
@@ -8,7 +8,7 @@ exports.DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE = {
|
|
|
8
8
|
txHistory: {},
|
|
9
9
|
};
|
|
10
10
|
exports.BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';
|
|
11
|
-
exports.
|
|
11
|
+
exports.APPROVAL_DELAY_MS = 5000;
|
|
12
12
|
var TraceName;
|
|
13
13
|
(function (TraceName) {
|
|
14
14
|
TraceName["BridgeTransactionApprovalCompleted"] = "Bridge Transaction Approval Completed";
|
package/dist/constants.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC9C,QAAA,YAAY,GAAG,CAAC,CAAC,CAAC,0DAA0D;AAE5E,QAAA,6BAA6B,GAAG,wBAAwB,CAAC;AAEzD,QAAA,sCAAsC,GACjD;IACE,SAAS,EAAE,EAAE;CACd,CAAC;AAES,QAAA,wBAAwB,GAAG,mCAAmC,CAAC;AAE/D,QAAA,
|
|
1
|
+
{"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC9C,QAAA,YAAY,GAAG,CAAC,CAAC,CAAC,0DAA0D;AAE5E,QAAA,6BAA6B,GAAG,wBAAwB,CAAC;AAEzD,QAAA,sCAAsC,GACjD;IACE,SAAS,EAAE,EAAE;CACd,CAAC;AAES,QAAA,wBAAwB,GAAG,mCAAmC,CAAC;AAE/D,QAAA,iBAAiB,GAAG,IAAI,CAAC;AAEtC,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,yFAA4E,CAAA;IAC5E,wEAA2D,CAAA;IAC3D,qFAAwE,CAAA;IACxE,oEAAuD,CAAA;AACzD,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB","sourcesContent":["import type { BridgeStatusControllerState } from './types';\n\nexport const REFRESH_INTERVAL_MS = 10 * 1000; // 10 seconds\nexport const MAX_ATTEMPTS = 7; // at 7 attempts, delay is 10:40, cumulative time is 21:10\n\nexport const BRIDGE_STATUS_CONTROLLER_NAME = 'BridgeStatusController';\n\nexport const DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE: BridgeStatusControllerState =\n {\n txHistory: {},\n };\n\nexport const BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';\n\nexport const APPROVAL_DELAY_MS = 5000;\n\nexport enum TraceName {\n BridgeTransactionApprovalCompleted = 'Bridge Transaction Approval Completed',\n BridgeTransactionCompleted = 'Bridge Transaction Completed',\n SwapTransactionApprovalCompleted = 'Swap Transaction Approval Completed',\n SwapTransactionCompleted = 'Swap Transaction Completed',\n}\n"]}
|
package/dist/constants.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const MAX_ATTEMPTS = 7;
|
|
|
4
4
|
export declare const BRIDGE_STATUS_CONTROLLER_NAME = "BridgeStatusController";
|
|
5
5
|
export declare const DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE: BridgeStatusControllerState;
|
|
6
6
|
export declare const BRIDGE_PROD_API_BASE_URL = "https://bridge.api.cx.metamask.io";
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const APPROVAL_DELAY_MS = 5000;
|
|
8
8
|
export declare enum TraceName {
|
|
9
9
|
BridgeTransactionApprovalCompleted = "Bridge Transaction Approval Completed",
|
|
10
10
|
BridgeTransactionCompleted = "Bridge Transaction Completed",
|
package/dist/constants.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,oBAAgB;AAE3D,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AAEtE,eAAO,MAAM,sCAAsC,EAAE,2BAGlD,CAAC;AAEJ,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,oBAAgB;AAE3D,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AAEtE,eAAO,MAAM,sCAAsC,EAAE,2BAGlD,CAAC;AAEJ,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,oBAAY,SAAS;IACnB,kCAAkC,0CAA0C;IAC5E,0BAA0B,iCAAiC;IAC3D,gCAAgC,wCAAwC;IACxE,wBAAwB,+BAA+B;CACxD"}
|
package/dist/constants.d.mts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const MAX_ATTEMPTS = 7;
|
|
|
4
4
|
export declare const BRIDGE_STATUS_CONTROLLER_NAME = "BridgeStatusController";
|
|
5
5
|
export declare const DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE: BridgeStatusControllerState;
|
|
6
6
|
export declare const BRIDGE_PROD_API_BASE_URL = "https://bridge.api.cx.metamask.io";
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const APPROVAL_DELAY_MS = 5000;
|
|
8
8
|
export declare enum TraceName {
|
|
9
9
|
BridgeTransactionApprovalCompleted = "Bridge Transaction Approval Completed",
|
|
10
10
|
BridgeTransactionCompleted = "Bridge Transaction Completed",
|
package/dist/constants.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,oBAAgB;AAE3D,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AAEtE,eAAO,MAAM,sCAAsC,EAAE,2BAGlD,CAAC;AAEJ,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,oBAAgB;AAE3D,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,eAAO,MAAM,6BAA6B,2BAA2B,CAAC;AAEtE,eAAO,MAAM,sCAAsC,EAAE,2BAGlD,CAAC;AAEJ,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,oBAAY,SAAS;IACnB,kCAAkC,0CAA0C;IAC5E,0BAA0B,iCAAiC;IAC3D,gCAAgC,wCAAwC;IACxE,wBAAwB,+BAA+B;CACxD"}
|
package/dist/constants.mjs
CHANGED
|
@@ -5,7 +5,7 @@ export const DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE = {
|
|
|
5
5
|
txHistory: {},
|
|
6
6
|
};
|
|
7
7
|
export const BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';
|
|
8
|
-
export const
|
|
8
|
+
export const APPROVAL_DELAY_MS = 5000;
|
|
9
9
|
export var TraceName;
|
|
10
10
|
(function (TraceName) {
|
|
11
11
|
TraceName["BridgeTransactionApprovalCompleted"] = "Bridge Transaction Approval Completed";
|
package/dist/constants.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,0DAA0D;AAEzF,MAAM,CAAC,MAAM,6BAA6B,GAAG,wBAAwB,CAAC;AAEtE,MAAM,CAAC,MAAM,sCAAsC,GACjD;IACE,SAAS,EAAE,EAAE;CACd,CAAC;AAEJ,MAAM,CAAC,MAAM,wBAAwB,GAAG,mCAAmC,CAAC;AAE5E,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,0DAA0D;AAEzF,MAAM,CAAC,MAAM,6BAA6B,GAAG,wBAAwB,CAAC;AAEtE,MAAM,CAAC,MAAM,sCAAsC,GACjD;IACE,SAAS,EAAE,EAAE;CACd,CAAC;AAEJ,MAAM,CAAC,MAAM,wBAAwB,GAAG,mCAAmC,CAAC;AAE5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,yFAA4E,CAAA;IAC5E,wEAA2D,CAAA;IAC3D,qFAAwE,CAAA;IACxE,oEAAuD,CAAA;AACzD,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB","sourcesContent":["import type { BridgeStatusControllerState } from './types';\n\nexport const REFRESH_INTERVAL_MS = 10 * 1000; // 10 seconds\nexport const MAX_ATTEMPTS = 7; // at 7 attempts, delay is 10:40, cumulative time is 21:10\n\nexport const BRIDGE_STATUS_CONTROLLER_NAME = 'BridgeStatusController';\n\nexport const DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE: BridgeStatusControllerState =\n {\n txHistory: {},\n };\n\nexport const BRIDGE_PROD_API_BASE_URL = 'https://bridge.api.cx.metamask.io';\n\nexport const APPROVAL_DELAY_MS = 5000;\n\nexport enum TraceName {\n BridgeTransactionApprovalCompleted = 'Bridge Transaction Approval Completed',\n BridgeTransactionCompleted = 'Bridge Transaction Completed',\n SwapTransactionApprovalCompleted = 'Swap Transaction Approval Completed',\n SwapTransactionCompleted = 'Swap Transaction Completed',\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.findAndUpdateTransactionsInBatch = exports.getAddTransactionBatchParams = exports.toBatchTxParams = exports.getClientRequest = exports.handleMobileHardwareWalletDelay = exports.
|
|
3
|
+
exports.findAndUpdateTransactionsInBatch = exports.getAddTransactionBatchParams = exports.toBatchTxParams = exports.getClientRequest = exports.handleMobileHardwareWalletDelay = exports.handleApprovalDelay = exports.handleSolanaTxResponse = exports.getTxMetaFields = exports.getStatusRequestParams = exports.getUSDTAllowanceResetTx = exports.generateActionId = void 0;
|
|
4
4
|
const bridge_controller_1 = require("@metamask/bridge-controller");
|
|
5
5
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
6
6
|
const keyring_api_1 = require("@metamask/keyring-api");
|
|
@@ -102,15 +102,15 @@ const handleSolanaTxResponse = (snapResponse, quoteResponse, selectedAccount) =>
|
|
|
102
102
|
};
|
|
103
103
|
};
|
|
104
104
|
exports.handleSolanaTxResponse = handleSolanaTxResponse;
|
|
105
|
-
const
|
|
106
|
-
if (bridge_controller_1.ChainId.LINEA
|
|
105
|
+
const handleApprovalDelay = async (quoteResponse) => {
|
|
106
|
+
if ([bridge_controller_1.ChainId.LINEA, bridge_controller_1.ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {
|
|
107
107
|
const debugLog = (0, utils_1.createProjectLogger)('bridge');
|
|
108
|
-
debugLog('Delaying submitting bridge tx to make Linea confirmation more likely');
|
|
109
|
-
const waitPromise = new Promise((resolve) => setTimeout(resolve, constants_1.
|
|
108
|
+
debugLog('Delaying submitting bridge tx to make Linea and Base confirmation more likely');
|
|
109
|
+
const waitPromise = new Promise((resolve) => setTimeout(resolve, constants_1.APPROVAL_DELAY_MS));
|
|
110
110
|
await waitPromise;
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
|
-
exports.
|
|
113
|
+
exports.handleApprovalDelay = handleApprovalDelay;
|
|
114
114
|
/**
|
|
115
115
|
* Adds a delay for hardware wallet transactions on mobile to fix an issue
|
|
116
116
|
* where the Ledger does not get prompted for the 2nd approval.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\n };\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { APPROVAL_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleApprovalDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if ([ChainId.LINEA, ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea and Base confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\n };\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
|
|
@@ -161,7 +161,7 @@ export declare const handleSolanaTxResponse: (snapResponse: string | {
|
|
|
161
161
|
} | {
|
|
162
162
|
signature: string;
|
|
163
163
|
}, quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
|
|
164
|
-
export declare const
|
|
164
|
+
export declare const handleApprovalDelay: (quoteResponse: QuoteResponse<TxData | string>) => Promise<void>;
|
|
165
165
|
/**
|
|
166
166
|
* Adds a delay for hardware wallet transactions on mobile to fix an issue
|
|
167
167
|
* where the Ledger does not get prompted for the 2nd approval.
|
|
@@ -245,6 +245,10 @@ export declare const findAndUpdateTransactionsInBatch: ({ messagingSystem, updat
|
|
|
245
245
|
lendingWithdraw?: string | undefined;
|
|
246
246
|
perpsDeposit?: string | undefined;
|
|
247
247
|
personal_sign?: string | undefined;
|
|
248
|
+
predictBuy?: string | undefined;
|
|
249
|
+
predictClaim?: string | undefined;
|
|
250
|
+
predictDeposit?: string | undefined;
|
|
251
|
+
predictSell?: string | undefined;
|
|
248
252
|
retry?: string | undefined;
|
|
249
253
|
revokeDelegation?: string | undefined;
|
|
250
254
|
simpleSend?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"transaction.d.cts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAmB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAyFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEhB,CAAC"}
|
|
@@ -161,7 +161,7 @@ export declare const handleSolanaTxResponse: (snapResponse: string | {
|
|
|
161
161
|
} | {
|
|
162
162
|
signature: string;
|
|
163
163
|
}, quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata, selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string]) => TransactionMeta & SolanaTransactionMeta;
|
|
164
|
-
export declare const
|
|
164
|
+
export declare const handleApprovalDelay: (quoteResponse: QuoteResponse<TxData | string>) => Promise<void>;
|
|
165
165
|
/**
|
|
166
166
|
* Adds a delay for hardware wallet transactions on mobile to fix an issue
|
|
167
167
|
* where the Ledger does not get prompted for the 2nd approval.
|
|
@@ -245,6 +245,10 @@ export declare const findAndUpdateTransactionsInBatch: ({ messagingSystem, updat
|
|
|
245
245
|
lendingWithdraw?: string | undefined;
|
|
246
246
|
perpsDeposit?: string | undefined;
|
|
247
247
|
personal_sign?: string | undefined;
|
|
248
|
+
predictBuy?: string | undefined;
|
|
249
|
+
predictClaim?: string | undefined;
|
|
250
|
+
predictDeposit?: string | undefined;
|
|
251
|
+
predictSell?: string | undefined;
|
|
248
252
|
retry?: string | undefined;
|
|
249
253
|
revokeDelegation?: string | undefined;
|
|
250
254
|
simpleSend?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"transaction.d.mts","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,oCAAoC;AAC1D,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,oCAAoC;AAErC,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,yCAAyC;AAC1C,OAAO,EAEL,eAAe,EACf,KAAK,eAAe,EACrB,yCAAyC;AAQ1C,OAAO,KAAK,EACV,+BAA+B,EAC/B,qBAAqB,EACtB,qBAAiB;AAElB,eAAO,MAAM,gBAAgB,cAAgD,CAAC;AAE9E,eAAO,MAAM,uBAAuB,oEAEnB,cAAc,MAAM,GAAG,MAAM,CAAC,GAAG,aAAa;;;;;;;;cAqB9D,CAAC;AAEF,eAAO,MAAM,sBAAsB,kBAClB,cAAc,MAAM,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU9C,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,KAAK,cAAc,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GACvE,aAAa,iBACA,MAAM,KACpB,KACD,eAAe,EACf,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAmB1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,iBAE7B,MAAM,GACN;IAAE,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBACV,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAC/E,eAAe,GAAG,qBAsDpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,kBACf,cAAc,MAAM,GAAG,MAAM,CAAC,kBAY9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,oBACzB,OAAO,kBAQzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,kBACZ,KAAK,cAAc,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,aAAa,mBACrD,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAmBjF,CAAC;AAEF,eAAO,MAAM,eAAe,gBACb,OAAO,mCACa,MAAM;;;;MAMtC,sBAiBF,CAAC;AAEF,eAAO,MAAM,4BAA4B;;gBAmB3B,OAAO;WACZ,MAAM;mBACE,KAAK,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,aAAa;sBACtD,OAAO,sBAAsB,SAAS,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;iFAyFxE,CAAC;AAEF,eAAO,MAAM,gCAAgC;;yBAOtB,OAAO,sBAAsB,SAAS,CAAC,iBAAiB;aACpE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEhB,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { createProjectLogger } from "@metamask/utils";
|
|
|
6
6
|
import { BigNumber } from "bignumber.js";
|
|
7
7
|
import { v4 as uuid } from "uuid";
|
|
8
8
|
import { calculateGasFees } from "./gas.mjs";
|
|
9
|
-
import {
|
|
9
|
+
import { APPROVAL_DELAY_MS } from "../constants.mjs";
|
|
10
10
|
export const generateActionId = () => (Date.now() + Math.random()).toString();
|
|
11
11
|
export const getUSDTAllowanceResetTx = async (messagingSystem, quoteResponse) => {
|
|
12
12
|
const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);
|
|
@@ -94,11 +94,11 @@ export const handleSolanaTxResponse = (snapResponse, quoteResponse, selectedAcco
|
|
|
94
94
|
isBridgeTx,
|
|
95
95
|
};
|
|
96
96
|
};
|
|
97
|
-
export const
|
|
98
|
-
if (ChainId.LINEA
|
|
97
|
+
export const handleApprovalDelay = async (quoteResponse) => {
|
|
98
|
+
if ([ChainId.LINEA, ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {
|
|
99
99
|
const debugLog = createProjectLogger('bridge');
|
|
100
|
-
debugLog('Delaying submitting bridge tx to make Linea confirmation more likely');
|
|
101
|
-
const waitPromise = new Promise((resolve) => setTimeout(resolve,
|
|
100
|
+
debugLog('Delaying submitting bridge tx to make Linea and Base confirmation more likely');
|
|
101
|
+
const waitPromise = new Promise((resolve) => setTimeout(resolve, APPROVAL_DELAY_MS));
|
|
102
102
|
await waitPromise;
|
|
103
103
|
}
|
|
104
104
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { LINEA_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleLineaDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if (ChainId.LINEA === quoteResponse.quote.srcChainId) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, LINEA_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\n };\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsControllerState } from '@metamask/accounts-controller';\nimport type { TxData } from '@metamask/bridge-controller';\nimport {\n ChainId,\n formatChainIdToHex,\n getEthUsdtResetData,\n isCrossChain,\n isEthUsdt,\n type QuoteMetadata,\n type QuoteResponse,\n} from '@metamask/bridge-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport { SolScope } from '@metamask/keyring-api';\nimport type {\n BatchTransactionParams,\n TransactionController,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n TransactionType,\n type TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createProjectLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport { v4 as uuid } from 'uuid';\n\nimport { calculateGasFees } from './gas';\nimport type { TransactionBatchSingleRequest } from '../../../transaction-controller/src/types';\nimport { APPROVAL_DELAY_MS } from '../constants';\nimport type {\n BridgeStatusControllerMessenger,\n SolanaTransactionMeta,\n} from '../types';\n\nexport const generateActionId = () => (Date.now() + Math.random()).toString();\n\nexport const getUSDTAllowanceResetTx = async (\n messagingSystem: BridgeStatusControllerMessenger,\n quoteResponse: QuoteResponse<TxData | string> & QuoteMetadata,\n) => {\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n if (\n quoteResponse.approval &&\n isEthUsdt(hexChainId, quoteResponse.quote.srcAsset.address)\n ) {\n const allowance = new BigNumber(\n await messagingSystem.call(\n 'BridgeController:getBridgeERC20Allowance',\n quoteResponse.quote.srcAsset.address,\n hexChainId,\n ),\n );\n const shouldResetApproval =\n allowance.lt(quoteResponse.sentAmount.amount) && allowance.gt(0);\n if (shouldResetApproval) {\n return { ...quoteResponse.approval, data: getEthUsdtResetData() };\n }\n }\n return undefined;\n};\n\nexport const getStatusRequestParams = (\n quoteResponse: QuoteResponse<string | TxData>,\n) => {\n return {\n bridgeId: quoteResponse.quote.bridgeId,\n bridge: quoteResponse.quote.bridges[0],\n srcChainId: quoteResponse.quote.srcChainId,\n destChainId: quoteResponse.quote.destChainId,\n quote: quoteResponse.quote,\n refuel: Boolean(quoteResponse.quote.refuel),\n };\n};\n\nexport const getTxMetaFields = (\n quoteResponse: Omit<QuoteResponse<string | TxData>, 'approval' | 'trade'> &\n QuoteMetadata,\n approvalTxId?: string,\n): Omit<\n TransactionMeta,\n 'networkClientId' | 'status' | 'time' | 'txParams' | 'id'\n> => {\n return {\n destinationChainId: formatChainIdToHex(quoteResponse.quote.destChainId),\n sourceTokenAmount: quoteResponse.quote.srcTokenAmount,\n sourceTokenSymbol: quoteResponse.quote.srcAsset.symbol,\n sourceTokenDecimals: quoteResponse.quote.srcAsset.decimals,\n sourceTokenAddress: quoteResponse.quote.srcAsset.address,\n\n destinationTokenAmount: quoteResponse.quote.destTokenAmount,\n destinationTokenSymbol: quoteResponse.quote.destAsset.symbol,\n destinationTokenDecimals: quoteResponse.quote.destAsset.decimals,\n destinationTokenAddress: quoteResponse.quote.destAsset.address,\n\n chainId: formatChainIdToHex(quoteResponse.quote.srcChainId),\n approvalTxId,\n // this is the decimal (non atomic) amount (not USD value) of source token to swap\n swapTokenValue: quoteResponse.sentAmount.amount,\n };\n};\n\nexport const handleSolanaTxResponse = (\n snapResponse:\n | string\n | { result: Record<string, string> }\n | { signature: string },\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n): TransactionMeta & SolanaTransactionMeta => {\n const selectedAccountAddress = selectedAccount.address;\n const snapId = selectedAccount.metadata.snap?.id;\n let hash;\n // Handle different response formats\n if (typeof snapResponse === 'string') {\n hash = snapResponse;\n } else if (snapResponse && typeof snapResponse === 'object') {\n // If it's an object with result property, try to get the signature\n if (\n typeof snapResponse === 'object' &&\n 'result' in snapResponse &&\n snapResponse.result &&\n typeof snapResponse.result === 'object'\n ) {\n // Try to extract signature from common locations in response object\n hash =\n snapResponse.result.signature ||\n snapResponse.result.txid ||\n snapResponse.result.hash ||\n snapResponse.result.txHash;\n }\n if (\n typeof snapResponse === 'object' &&\n 'signature' in snapResponse &&\n snapResponse.signature &&\n typeof snapResponse.signature === 'string'\n ) {\n hash = snapResponse.signature;\n }\n }\n\n const hexChainId = formatChainIdToHex(quoteResponse.quote.srcChainId);\n const isBridgeTx = isCrossChain(\n quoteResponse.quote.srcChainId,\n quoteResponse.quote.destChainId,\n );\n\n // Create a transaction meta object with bridge-specific fields\n return {\n ...getTxMetaFields(quoteResponse),\n time: Date.now(),\n id: hash ?? uuid(),\n chainId: hexChainId,\n networkClientId: snapId ?? hexChainId,\n txParams: { from: selectedAccountAddress, data: quoteResponse.trade },\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n status: TransactionStatus.submitted,\n hash, // Add the transaction signature as hash\n origin: snapId,\n // Add an explicit bridge flag to mark this as a Solana transaction\n isSolana: true, // TODO deprecate this and use chainId\n isBridgeTx,\n };\n};\n\nexport const handleApprovalDelay = async (\n quoteResponse: QuoteResponse<TxData | string>,\n) => {\n if ([ChainId.LINEA, ChainId.BASE].includes(quoteResponse.quote.srcChainId)) {\n const debugLog = createProjectLogger('bridge');\n debugLog(\n 'Delaying submitting bridge tx to make Linea and Base confirmation more likely',\n );\n const waitPromise = new Promise((resolve) =>\n setTimeout(resolve, APPROVAL_DELAY_MS),\n );\n await waitPromise;\n }\n};\n\n/**\n * Adds a delay for hardware wallet transactions on mobile to fix an issue\n * where the Ledger does not get prompted for the 2nd approval.\n * Extension does not have this issue.\n *\n * @param requireApproval - Whether the delay should be applied\n */\nexport const handleMobileHardwareWalletDelay = async (\n requireApproval: boolean,\n) => {\n if (requireApproval) {\n const mobileHardwareWalletDelay = new Promise((resolve) =>\n setTimeout(resolve, 1000),\n );\n await mobileHardwareWalletDelay;\n }\n};\n\nexport const getClientRequest = (\n quoteResponse: Omit<QuoteResponse<string>, 'approval'> & QuoteMetadata,\n selectedAccount: AccountsControllerState['internalAccounts']['accounts'][string],\n) => {\n const clientReqId = uuid();\n\n return {\n origin: 'metamask',\n snapId: selectedAccount.metadata.snap?.id as never,\n handler: 'onClientRequest' as never,\n request: {\n id: clientReqId,\n jsonrpc: '2.0',\n method: 'signAndSendTransactionWithoutConfirmation',\n params: {\n account: { address: selectedAccount.address },\n transaction: quoteResponse.trade,\n scope: SolScope.Mainnet,\n },\n },\n };\n};\n\nexport const toBatchTxParams = (\n disable7702: boolean,\n { chainId, gasLimit, ...trade }: TxData,\n {\n maxFeePerGas,\n maxPriorityFeePerGas,\n gas,\n }: { maxFeePerGas?: string; maxPriorityFeePerGas?: string; gas?: string },\n): BatchTransactionParams => {\n const params = {\n ...trade,\n data: trade.data as `0x${string}`,\n to: trade.to as `0x${string}`,\n value: trade.value as `0x${string}`,\n };\n if (!disable7702) {\n return params;\n }\n\n return {\n ...params,\n gas: toHex(gas ?? 0),\n maxFeePerGas: toHex(maxFeePerGas ?? 0),\n maxPriorityFeePerGas: toHex(maxPriorityFeePerGas ?? 0),\n };\n};\n\nexport const getAddTransactionBatchParams = async ({\n messagingSystem,\n isBridgeTx,\n approval,\n resetApproval,\n trade,\n quoteResponse: {\n quote: {\n feeData: { txFee },\n gasIncluded,\n gasIncluded7702,\n },\n sentAmount,\n toTokenAmount,\n },\n requireApproval = false,\n estimateGasFeeFn,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n isBridgeTx: boolean;\n trade: TxData;\n quoteResponse: Omit<QuoteResponse, 'approval' | 'trade'> & QuoteMetadata;\n estimateGasFeeFn: typeof TransactionController.prototype.estimateGasFee;\n approval?: TxData;\n resetApproval?: TxData;\n requireApproval?: boolean;\n}) => {\n const isGasless = gasIncluded || gasIncluded7702;\n const selectedAccount = messagingSystem.call(\n 'AccountsController:getAccountByAddress',\n trade.from,\n );\n if (!selectedAccount) {\n throw new Error(\n 'Failed to submit cross-chain swap batch transaction: unknown account in trade data',\n );\n }\n const hexChainId = formatChainIdToHex(trade.chainId);\n const networkClientId = messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n hexChainId,\n );\n\n // When an active quote has gasIncluded7702 set to true,\n // enable 7702 gasless txs for smart accounts\n const disable7702 = gasIncluded7702 !== true;\n const transactions: TransactionBatchSingleRequest[] = [];\n if (resetApproval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n resetApproval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, resetApproval, gasFees),\n });\n }\n if (approval) {\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n approval,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx\n ? TransactionType.bridgeApproval\n : TransactionType.swapApproval,\n params: toBatchTxParams(disable7702, approval, gasFees),\n });\n }\n const gasFees = await calculateGasFees(\n disable7702,\n messagingSystem,\n estimateGasFeeFn,\n trade,\n networkClientId,\n hexChainId,\n isGasless ? txFee : undefined,\n );\n transactions.push({\n type: isBridgeTx ? TransactionType.bridge : TransactionType.swap,\n params: toBatchTxParams(disable7702, trade, gasFees),\n assetsFiatValues: {\n sending: sentAmount?.valueInCurrency?.toString(),\n receiving: toTokenAmount?.valueInCurrency?.toString(),\n },\n });\n const transactionParams: Parameters<\n TransactionController['addTransactionBatch']\n >[0] = {\n disable7702,\n isGasFeeIncluded: Boolean(gasIncluded7702),\n networkClientId,\n requireApproval,\n origin: 'metamask',\n from: trade.from as `0x${string}`,\n transactions,\n };\n\n return transactionParams;\n};\n\nexport const findAndUpdateTransactionsInBatch = ({\n messagingSystem,\n updateTransactionFn,\n batchId,\n txDataByType,\n}: {\n messagingSystem: BridgeStatusControllerMessenger;\n updateTransactionFn: typeof TransactionController.prototype.updateTransaction;\n batchId: string;\n txDataByType: { [key in TransactionType]?: string };\n}) => {\n const txs = messagingSystem.call(\n 'TransactionController:getState',\n ).transactions;\n const txBatch: {\n approvalMeta?: TransactionMeta;\n tradeMeta?: TransactionMeta;\n } = {\n approvalMeta: undefined,\n tradeMeta: undefined,\n };\n\n // This is a workaround to update the tx type after the tx is signed\n // TODO: remove this once the tx type for batch txs is preserved in the tx controller\n Object.entries(txDataByType).forEach(([txType, txData]) => {\n // Find transaction by batchId and either matching data or delegation characteristics\n const txMeta = txs.find((tx) => {\n if (tx.batchId !== batchId) {\n return false;\n }\n\n // For 7702 delegated transactions, check for delegation-specific fields\n // These transactions might have authorizationList or delegationAddress\n const is7702Transaction =\n (Array.isArray(tx.txParams.authorizationList) &&\n tx.txParams.authorizationList.length > 0) ||\n Boolean(tx.delegationAddress);\n\n if (is7702Transaction) {\n // For 7702 transactions, we need to match based on transaction type\n // since the data field might be different (batch execute call)\n if (\n txType === TransactionType.swap &&\n tx.type === TransactionType.batch\n ) {\n return true;\n }\n // Also check if it's an approval transaction for 7702\n if (\n txType === TransactionType.swapApproval &&\n tx.txParams.data === txData\n ) {\n return true;\n }\n }\n\n // Default matching logic for non-7702 transactions\n return tx.txParams.data === txData;\n });\n\n if (txMeta) {\n const updatedTx = { ...txMeta, type: txType as TransactionType };\n updateTransactionFn(updatedTx, `Update tx type to ${txType}`);\n txBatch[\n [TransactionType.bridgeApproval, TransactionType.swapApproval].includes(\n txType as TransactionType,\n )\n ? 'approvalMeta'\n : 'tradeMeta'\n ] = updatedTx;\n }\n });\n\n return txBatch;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/bridge-status-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "45.0.0",
|
|
4
4
|
"description": "Manages bridge-related status fetching functionality for MetaMask",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@metamask/accounts-controller": "^33.1.0",
|
|
61
61
|
"@metamask/auto-changelog": "^3.4.4",
|
|
62
|
-
"@metamask/bridge-controller": "^
|
|
62
|
+
"@metamask/bridge-controller": "^45.0.0",
|
|
63
63
|
"@metamask/gas-fee-controller": "^24.0.0",
|
|
64
|
-
"@metamask/network-controller": "^24.
|
|
64
|
+
"@metamask/network-controller": "^24.2.0",
|
|
65
65
|
"@metamask/snaps-controllers": "^14.0.1",
|
|
66
66
|
"@metamask/transaction-controller": "^60.4.0",
|
|
67
67
|
"@types/jest": "^27.4.1",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"peerDependencies": {
|
|
79
79
|
"@metamask/accounts-controller": "^33.0.0",
|
|
80
|
-
"@metamask/bridge-controller": "^
|
|
80
|
+
"@metamask/bridge-controller": "^45.0.0",
|
|
81
81
|
"@metamask/gas-fee-controller": "^24.0.0",
|
|
82
82
|
"@metamask/network-controller": "^24.0.0",
|
|
83
83
|
"@metamask/snaps-controllers": "^14.0.0",
|