@rango-dev/queue-manager-rango-preset 0.49.1-next.0 → 0.49.1-next.2
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/dist/helpers.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +3 -3
- package/dist/queue-manager-rango-preset.build.json +1 -1
- package/package.json +2 -2
- package/src/helpers.ts +56 -49
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/configs.ts", "../src/types.ts", "../src/actions/checkStatus.ts", "../src/helpers.ts", "../src/constants.ts", "../src/services/httpService.ts", "../src/shared.ts", "../src/numbers.ts", "../src/shared-errors.ts", "../src/services/eventEmitter.ts", "../src/actions/createTransaction.ts", "../src/actions/executeTransaction.ts", "../src/actions/scheduleNextStep.ts", "../src/actions/start.ts", "../src/queueDef.ts", "../src/hooks.ts", "../src/migration.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type { RouteExecutionEvents } from './types';\n\ninterface Emitter<Events extends Record<string, unknown>> {\n emit<K extends keyof Events>(type: K, event: Events[K]): void;\n}\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n emitter?: Emitter<RouteExecutionEvents>;\n}\n\n/*\n * this API key is limited and\n * it is only for test purpose\n */\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n BASE_URL: '',\n};\n\nexport function getConfig<K extends keyof Configs>(name: K): Configs[K] {\n return configs[name];\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n configs = nextConfigs;\n return configs;\n}\n", "import type { TargetNamespace, Wallet } from './shared';\nimport type {\n QueueContext,\n QueueDef,\n QueueStorage,\n} from '@rango-dev/queue-manager-core';\nimport type { LegacyConnectResult as ConnectResult } from '@rango-dev/wallets-core/legacy';\nimport type {\n Meta,\n Network,\n Providers,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { Transaction } from 'rango-sdk';\nimport type {\n APIErrorCode,\n EvmBlockchainMeta,\n PendingSwap,\n PendingSwapStep,\n SignerFactory,\n} from 'rango-types';\n\nexport type RemoveNameField<T, U extends string> = {\n [Property in keyof T as Exclude<Property, U>]: T[Property];\n};\n\nexport type ArrayElement<A> = A extends readonly (infer T)[] ? T : never;\n\nexport type SwapQueueDef = QueueDef<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>;\n\nexport interface SwapStorage extends QueueStorage {\n swapDetails: PendingSwap;\n}\n\nexport enum SwapActionTypes {\n START = 'START',\n SCHEDULE_NEXT_STEP = 'SCHEDULE_NEXT_STEP',\n CREATE_TRANSACTION = 'CREATE_TRANSACTION',\n EXECUTE_TRANSACTION = 'EXECUTE_TRANSACTION',\n CHECK_TRANSACTION_STATUS = 'CHECK_TRANSACTION_STATUS',\n}\n\nexport type GetCurrentAddress = (\n type: WalletType,\n network: Network\n) => string | undefined;\n\nexport enum BlockReason {\n WAIT_FOR_CONNECT_WALLET = 'waiting_for_connecting_wallet',\n WAIT_FOR_NETWORK_CHANGE = 'waiting_for_network_change',\n DEPENDS_ON_OTHER_QUEUES = 'depends_on_other_queues',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Block<T = any> {\n reason: BlockReason;\n description: string;\n details?: T;\n}\n\nexport interface SwapQueueContext extends QueueContext {\n meta: Meta;\n wallets: Wallet | null;\n providers: Providers;\n getSigners: (type: WalletType) => Promise<SignerFactory>;\n switchNetwork: (\n wallet: WalletType,\n namespaces: TargetNamespace\n ) => Promise<ConnectResult | ConnectResult[] | undefined> | undefined;\n canSwitchNetworkTo: UseQueueManagerParams['canSwitchNetworkTo'];\n state: (type: WalletType) => WalletState;\n isMobileWallet: (type: WalletType) => boolean;\n\n // Dynamically will be added to context.\n claimedBy?: string;\n resetClaimedBy?: () => void;\n}\n\nexport type LastConnectedWallet = {\n walletType: string;\n network?: string;\n accounts?: string[];\n};\n\nexport interface UseQueueManagerParams {\n lastConnectedWallet: LastConnectedWallet | null;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n evmChains: EvmBlockchainMeta[];\n canSwitchNetworkTo: (\n type: WalletType,\n network: Network,\n namespace: TargetNamespace\n ) => boolean;\n}\n\nexport enum WidgetEvents {\n RouteEvent = 'routeEvent',\n StepEvent = 'stepEvent',\n}\n\nexport type Step = Pick<\n PendingSwapStep,\n | 'diagnosisUrl'\n | 'estimatedTimeInSeconds'\n | 'explorerUrl'\n | 'feeInUsd'\n | 'executedTransactionId'\n | 'executedTransactionTime'\n | 'expectedOutputAmountHumanReadable'\n | 'fromBlockchain'\n | 'toBlockchain'\n | 'fromSymbol'\n | 'toSymbol'\n | 'toSymbolAddress'\n | 'fromSymbolAddress'\n | 'swapperType'\n | 'outputAmount'\n | 'fromAmountMaxValue'\n | 'fromAmountMinValue'\n | 'fromAmountPrecision'\n | 'fromAmountRestrictionType'\n | 'fromDecimals'\n | 'status'\n> & { swapperName: string; transaction: Transaction | null };\n\nexport type Route = Pick<\n PendingSwap,\n | 'creationTime'\n | 'finishTime'\n | 'requestId'\n | 'inputAmount'\n | 'status'\n | 'wallets'\n> & { steps: Step[]; slippage: string; infiniteApproval?: boolean };\n\nexport type SwapEvent = RouteEvent | StepEvent;\n\nexport enum RouteEventType {\n STARTED = 'started',\n FAILED = 'failed',\n SUCCEEDED = 'succeeded',\n}\n\nexport enum StepExecutionEventStatus {\n CREATE_TX = 'create_tx',\n SEND_TX = 'send_tx',\n TX_SENT = 'tx_sent',\n}\n\nexport enum StepExecutionBlockedEventStatus {\n WAITING_FOR_QUEUE = 'waiting_for_queue',\n WAITING_FOR_WALLET_CONNECT = 'waiting_for_wallet_connect',\n WAITING_FOR_NETWORK_CHANGE = 'waiting_for_network_change',\n WAITING_FOR_CHANGE_WALLET_ACCOUNT = 'waiting_for_change_wallet_account',\n}\n\nexport enum StepEventType {\n STARTED = 'started',\n FAILED = 'failed',\n SUCCEEDED = 'succeeded',\n TX_EXECUTION = 'tx_execution',\n TX_EXECUTION_BLOCKED = 'tx_execution_blocked',\n APPROVAL_TX_SUCCEEDED = 'approval_tx_succeeded',\n CHECK_STATUS = 'check_status',\n OUTPUT_REVEALED = 'output_revealed',\n}\n\nexport enum EventSeverity {\n ERROR = 'error',\n SUCCESS = 'success',\n WARNING = 'warning',\n INFO = 'info',\n}\n\nexport type Event<\n T extends StepEventType | RouteEventType,\n U extends Record<string, unknown> = Record<string, unknown>\n> = {\n type: T;\n message: string;\n messageSeverity: EventSeverity;\n} & U;\n\nexport type FailedRouteEventPayload = {\n inputAmount: string;\n inputAmountUsd: string;\n reason?: string;\n reasonCode: APIErrorCode;\n};\n\nexport type FailedStepEventPayload = FailedRouteEventPayload;\n\nexport type SucceededRouteEventPayload = {\n inputAmount: string;\n inputAmountUsd: string;\n outputAmount: string;\n outputAmountUsd: string;\n};\n\nexport type SucceededStepEventPayload = SucceededRouteEventPayload;\n\nexport type OutputRevealedEventPayload = { outputAmount: string };\n\nexport type StepExecutionEventPayload = {\n status:\n | StepExecutionEventStatus.CREATE_TX\n | StepExecutionEventStatus.SEND_TX\n | StepExecutionEventStatus.TX_SENT;\n};\n\nexport type StepBlockedEventPayload =\n | { status: StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT;\n requiredWallet?: string;\n requiredAccount?: string;\n }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT;\n requiredAccount?: string;\n }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE;\n currentNetwork?: string;\n requiredNetwork?: string;\n };\n\nexport type RouteStartedEvent = Event<RouteEventType.STARTED>;\n\nexport type RouteFailedEvent = Event<\n RouteEventType.FAILED,\n FailedRouteEventPayload\n>;\n\nexport type RouteSucceededEvent = Event<\n RouteEventType.SUCCEEDED,\n SucceededRouteEventPayload\n>;\n\nexport type StepStartedEvent = Event<StepEventType.STARTED>;\n\nexport type StepSucceededEvent = Event<\n StepEventType.SUCCEEDED,\n SucceededStepEventPayload\n>;\nexport type StepFailedEvent = Event<\n StepEventType.FAILED,\n FailedStepEventPayload\n>;\n\nexport type StepTxExecutionUpdatedEvent = Event<\n StepEventType.TX_EXECUTION,\n StepExecutionEventPayload\n>;\n\nexport type StepTxExecutionBlockedEvent = Event<\n StepEventType.TX_EXECUTION_BLOCKED,\n StepBlockedEventPayload\n>;\n\nexport type StepCheckStatusEvent = Event<StepEventType.CHECK_STATUS>;\n\nexport type StepApprovalTxSucceededEvent =\n Event<StepEventType.APPROVAL_TX_SUCCEEDED>;\n\nexport type StepOutputRevealedEvent = Event<\n StepEventType.OUTPUT_REVEALED,\n OutputRevealedEventPayload\n>;\n\nexport type StepEvent =\n | StepStartedEvent\n | StepSucceededEvent\n | StepFailedEvent\n | StepTxExecutionUpdatedEvent\n | StepTxExecutionBlockedEvent\n | StepCheckStatusEvent\n | StepApprovalTxSucceededEvent\n | StepOutputRevealedEvent;\n\nexport type RouteEvent =\n | RouteStartedEvent\n | RouteSucceededEvent\n | RouteFailedEvent;\n\nexport type RouteEventData = { route: Route; event: RouteEvent };\nexport type StepEventData = { route: Route; step: Step; event: StepEvent };\n\nexport type RouteExecutionEvents = {\n [WidgetEvents.RouteEvent]: RouteEventData;\n [WidgetEvents.StepEvent]: StepEventData;\n};\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type {\n CheckTxStatusRequest,\n Transaction,\n TransactionStatusResponse,\n} from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { type GenericSigner, SignerError } from 'rango-types';\n\nimport {\n createStepFailedEvent,\n delay,\n getCurrentStep,\n getCurrentStepTx,\n getCurrentStepTxType,\n getLastFinishedStepInput,\n getLastFinishedStepInputUsd,\n getLastSuccessfulStepOutputUsd,\n inMemoryTransactionsData,\n resetNetworkStatus,\n setCurrentStepTx,\n updateSwapStatus,\n} from '../helpers';\nimport { httpService } from '../services';\nimport { notifier } from '../services/eventEmitter';\nimport {\n getCurrentNamespaceOf,\n getNextStep,\n getRelatedWallet,\n getScannerUrl,\n MessageSeverity,\n} from '../shared';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport { StepEventType, SwapActionTypes } from '../types';\n\nconst INTERVAL_FOR_CHECK_STATUS = 5_000;\nconst INTERVAL_FOR_CHECK_APPROVAL = 5_000;\n\n/**\n * Subscribe to status of swap transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkTransactionStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n const checkStatusError = new Error('check status Error');\n\n const currentStep = getCurrentStep(swap)!;\n\n if (!currentStep?.executedTransactionId) {\n return;\n }\n const tx = getCurrentStepTx(currentStep);\n let txId = currentStep.executedTransactionId;\n let getTxReceiptFailed = false;\n let status: TransactionStatusResponse | null = null;\n let signer: GenericSigner<Transaction> | null = null;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n inMemoryTransactionsData();\n\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet) {\n signer = (await context.getSigners(sourceWallet.walletType)).getSigner(\n txType\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n /*\n * wallet is not connected yet\n * no need to do anything\n */\n }\n\n try {\n // if wallet is connected, try to get transaction reciept\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n if (signer?.wait && !receiptReceived) {\n const chainId =\n (tx?.blockChain && meta.blockchains?.[tx?.blockChain]?.chainId) ||\n undefined;\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, chainId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n let explorerUrl: string | undefined;\n const blockchainsMetaNotEmpty = !!Object.keys(meta.blockchains).length;\n if (blockchainsMetaNotEmpty) {\n explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepNamespace.network,\n meta.blockchains\n );\n }\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Swap',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse) {\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n }\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n warn(checkStatusError, {\n tags: {\n type: 'singer-error',\n reason: event.reason,\n reasonCode: event.reasonCode,\n message: extraMessage,\n messageDetail: extraMessageDetail,\n pendingSwap: swap,\n },\n context: SignerError.isSignerError(error) ? error.getErrorContext() : {},\n });\n\n getTxReceiptFailed = true;\n /*\n * We shouldn't return here, because we need to trigger check status job in backend.\n * This is not a ui requirement but the backend one.\n */\n }\n\n const requestBody: CheckTxStatusRequest = {\n requestId: swap.requestId,\n txId,\n step: currentStep.id,\n };\n\n try {\n status = await httpService().checkStatus(requestBody);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n await delay(INTERVAL_FOR_CHECK_STATUS);\n retry();\n warn(checkStatusError, {\n tags: { type: 'request-error', requestBody, pendingSwap: swap },\n });\n return;\n }\n\n /*\n * If user cancel swap during check status api call,\n * or getting transaction receipt failed,\n * we should ignore check status response and return\n */\n if (getTxReceiptFailed) {\n return failed();\n }\n if (currentStep?.status === 'failed') {\n return;\n }\n\n const outputAmount: string | null =\n status?.outputAmount ||\n (currentStep.outputAmount ? currentStep.outputAmount : null);\n const prevOutputAmount = currentStep.outputAmount || null;\n swap.extraMessage = status?.extraMessage || swap.extraMessage;\n swap.extraMessageSeverity = MessageSeverity.info;\n swap.extraMessageDetail = '';\n\n currentStep.status = status?.status || currentStep.status;\n currentStep.diagnosisUrl =\n status?.diagnosisUrl || currentStep.diagnosisUrl || null;\n currentStep.outputAmount = outputAmount || currentStep.outputAmount;\n currentStep.explorerUrl = status?.explorerUrl || currentStep.explorerUrl;\n currentStep.internalSteps = status?.steps || null;\n\n const newTransaction = status?.newTx;\n\n if (newTransaction) {\n currentStep.status = 'created';\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n setCurrentStepTx(currentStep, newTransaction);\n }\n\n if (prevOutputAmount === null && outputAmount !== null) {\n notifier({\n event: { type: StepEventType.OUTPUT_REVEALED, outputAmount },\n swap: swap,\n step: currentStep,\n });\n } else if (prevOutputAmount === null && outputAmount === null) {\n // it is needed to set notification after reloading the page\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap: swap,\n step: currentStep,\n });\n }\n\n if (currentStep.status === 'success') {\n const nextStep = getNextStep(swap, currentStep);\n swap.extraMessageDetail = '';\n swap.extraMessage = nextStep\n ? `starting next step: ${nextStep.swapperId}: ${nextStep.fromBlockchain} -> ${nextStep.toBlockchain}`\n : '';\n notifier({\n event: {\n type: StepEventType.SUCCEEDED,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n outputAmount: currentStep.outputAmount ?? '',\n outputAmountUsd: getLastSuccessfulStepOutputUsd(swap),\n },\n swap,\n step: currentStep,\n });\n } else if (currentStep.status === 'failed') {\n swap.extraMessage = 'Transaction failed in blockchain';\n swap.extraMessageSeverity = MessageSeverity.error;\n swap.extraMessageDetail = status?.extraMessage || '';\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n warn(checkStatusError, {\n tags: {\n type: 'transaction-failed',\n message: swap.extraMessage,\n messageDetails: swap.extraMessageDetail,\n pendingSwap: swap,\n },\n });\n }\n\n // Sync data with storage\n setStorage({ ...getStorage(), swapDetails: swap });\n\n if (status?.status === 'failed') {\n failed();\n } else if (\n status?.status === 'success' ||\n (status?.status === 'running' && !!status.newTx)\n ) {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK_STATUS);\n retry();\n }\n}\n\n/**\n * Subscribe to status of approval transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkApprovalStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n inMemoryTransactionsData();\n const checkApprovalStatusError = new Error('check approval status error');\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null');\n return;\n }\n const tx = getCurrentStepTx(currentStep);\n\n if (!currentStep?.executedTransactionId) {\n return;\n }\n let txId = currentStep.executedTransactionId;\n\n let signer: GenericSigner<Transaction> | null = null;\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet) {\n const walletSigners = await context.getSigners(sourceWallet.walletType);\n signer = walletSigners.getSigner(txType);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n /*\n * wallet is not connected yet\n * no need to do anything\n */\n }\n\n try {\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n // if wallet is connected, try to get transaction reciept\n if (signer?.wait && !receiptReceived) {\n const chainId =\n (tx?.blockChain && meta.blockchains?.[tx?.blockChain]?.chainId) ||\n undefined;\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, chainId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n let explorerUrl: string | undefined;\n const blockchainsMetaNotEmpty = !!Object.keys(meta.blockchains).length;\n if (blockchainsMetaNotEmpty) {\n explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepNamespace.network,\n meta.blockchains\n );\n }\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Approve',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse) {\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n }\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n warn(checkApprovalStatusError, {\n tags: {\n type: 'singer-error',\n reason: event.reason,\n reasonCode: event.reasonCode,\n message: extraMessage,\n messageDetail: extraMessageDetail,\n pendingSwap: swap,\n },\n context: SignerError.isSignerError(error) ? error.getErrorContext() : {},\n });\n return failed();\n }\n\n let isApproved = false;\n const request: { requestId: string; txId?: string } = {\n requestId: swap.requestId,\n txId: currentStep.executedTransactionId,\n };\n\n try {\n const response = await httpService().checkApproval(\n request.requestId,\n request.txId\n );\n // If user cancel swap during check status api call, we should ignore check approval response\n if (currentStep?.status === 'failed') {\n return;\n }\n\n isApproved = response.isApproved;\n if (\n !isApproved &&\n (response.txStatus === 'failed' || response.txStatus === 'success')\n ) {\n let message, details;\n if (response.txStatus === 'failed') {\n message = 'Approve transaction failed';\n details = 'Smart contract approval tx failed in blockchain.';\n } else {\n message = 'Not enough approval';\n if (response.requiredApprovedAmount && response.currentApprovedAmount) {\n details = `Required approval: ${response.requiredApprovedAmount}, current approval: ${response.currentApprovedAmount}`;\n } else {\n details = `You still don't have enough approval for this swap.`;\n }\n }\n /*\n * approve transaction failed on\n * we should fail the whole swap\n */\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'INSUFFICIENT_APPROVE',\n message: message,\n details: details,\n });\n\n const event = createStepFailedEvent(\n swap,\n message,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n\n warn(checkApprovalStatusError, {\n tags: {\n type: 'approval-failed',\n message: swap.extraMessage,\n messageDetails: swap.extraMessageDetail,\n pendingSwap: swap,\n },\n });\n\n failed();\n } else if (!isApproved) {\n // it is needed to set notification after reloading the page\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap,\n step: currentStep,\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n isApproved = false;\n warn(checkApprovalStatusError, {\n tags: { type: 'request-error', requestBody: request, pendingSwap: swap },\n });\n }\n if (isApproved) {\n currentStep.status = 'approved';\n swap.extraMessage = `Spending ${currentStep.fromSymbol} approved successfully.`;\n swap.extraMessageDetail = null;\n swap.extraMessageSeverity = MessageSeverity.success;\n currentStep.evmApprovalTransaction = null;\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.tronApprovalTransaction = null;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n notifier({\n event: { type: StepEventType.APPROVAL_TX_SUCCEEDED },\n swap: swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK_APPROVAL);\n retry();\n }\n}\n\n/**\n *\n * For doing a swap the user needs to accept a `contract` so it can use the user balance.\n * There is two types of check status:\n * 1. Checking approval transaction (Give permission to a contract)\n * 2. Checking swap transaction.\n *\n */\nexport async function checkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const swap = actions.getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null', swap.requestId);\n return;\n }\n\n /*\n * Reset network status\n * Because when check status is on `loading` or `failed` status, it shows previous message that isn't related to current state.\n */\n resetNetworkStatus(actions);\n\n if (currentStep.status === 'running') {\n await checkTransactionStatus(actions);\n } else if (currentStep.status === 'waitingForApproval') {\n await checkApprovalStatus(actions);\n }\n}\n", "/* eslint-disable destructuring/in-params */\n\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { NotifierParams } from './services/eventEmitter';\nimport type { SwapStatus, TargetNamespace, Wallet } from './shared';\nimport type {\n ArrayElement,\n LastConnectedWallet,\n Step,\n SwapQueueContext,\n SwapQueueDef,\n SwapStorage,\n UseQueueManagerParams,\n} from './types';\nimport type {\n ExecuterActions,\n Manager,\n QueueInfo,\n QueueName,\n QueueType,\n SetStorage,\n} from '@rango-dev/queue-manager-core';\nimport type {\n Meta,\n Network,\n Providers,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type {\n CreateTransactionResponse,\n EvmBlockchainMeta,\n Transaction,\n} from 'rango-sdk';\nimport type {\n APIErrorCode,\n PendingSwap,\n PendingSwapStep,\n SignerErrorCode,\n StepStatus,\n} from 'rango-types';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { Status } from '@rango-dev/queue-manager-core';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport {\n getBlockChainNameFromId,\n getEvmProvider,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport {\n PendingSwapNetworkStatus,\n SignerError,\n TransactionType,\n} from 'rango-types';\n\nimport {\n DEFAULT_ERROR_CODE,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n} from './constants';\nimport { httpService } from './services';\nimport { notifier } from './services/eventEmitter';\nimport {\n getCurrentAddressOf,\n getCurrentNamespaceOf,\n getCurrentNamespaceOfOrNull,\n getRelatedWallet,\n getRelatedWalletOrNull,\n getScannerUrl,\n MessageSeverity,\n} from './shared';\nimport {\n mapAppErrorCodesToAPIErrorCode,\n prettifyErrorMessage,\n PrettyError,\n} from './shared-errors';\nimport {\n BlockReason,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n SwapActionTypes,\n} from './types';\n\ntype WhenTaskBlocked = Parameters<NonNullable<SwapQueueDef['whenTaskBlocked']>>;\ntype WhenTaskBlockedEvent = WhenTaskBlocked[0];\ntype WhenTaskBlockedMeta = WhenTaskBlocked[1];\n\nlet swapClaimedBy: { id: string } | null = null;\n\n/**\n *\n * We simply use module-level variable to keep track of which queue has claimed the execution of parallel runnings.\n *\n */\nexport function claimQueue() {\n return {\n claimedBy: () => swapClaimedBy?.id,\n setClaimer: (queue_id: string) => {\n swapClaimedBy = {\n id: queue_id,\n };\n },\n reset: () => {\n swapClaimedBy = null;\n },\n };\n}\n\n/**\n *\n * We use module-level variable to keep track of\n * map of transactions hash to the TransactionResponse and ...\n *\n */\ntype TransactionData = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response?: any; // e.g. TransactionResponse in case of EVM transactions\n receiptReceived?: boolean; // e.g. is TransactionReceipt ready in case of EVM transactions\n};\nconst swapTransactionToDataMap: { [id: string]: TransactionData } = {};\nexport function inMemoryTransactionsData() {\n return {\n getTransactionDataByHash: (hash: string) =>\n swapTransactionToDataMap[hash] || {},\n setTransactionDataByHash: (hash: string, data: TransactionData) => {\n const r = swapTransactionToDataMap[hash];\n if (!r) {\n swapTransactionToDataMap[hash] = {};\n }\n swapTransactionToDataMap[hash].response =\n data.response || swapTransactionToDataMap[hash].response;\n swapTransactionToDataMap[hash].receiptReceived =\n data.receiptReceived ||\n swapTransactionToDataMap[hash].receiptReceived ||\n false;\n },\n };\n}\n\n/**\n *\n * Returns `steps`, if it's a `running` swap.\n * Each `PendingSwap` has a `steps` inside it, `steps` shows how many tasks should be created and run to finish the swap.\n *\n */\nexport const getCurrentStep = (swap: PendingSwap): PendingSwapStep | null => {\n return (\n swap.steps.find(\n (step) => step.status !== 'failed' && step.status !== 'success'\n ) || null\n );\n};\n\n/**\n *\n * Returns current step transaction\n *\n */\nexport const getCurrentStepTx = (\n currentStep: PendingSwapStep\n): Transaction | null => {\n const {\n evmTransaction,\n evmApprovalTransaction,\n cosmosTransaction,\n solanaTransaction,\n transferTransaction,\n starknetApprovalTransaction,\n starknetTransaction,\n tronApprovalTransaction,\n tronTransaction,\n tonTransaction,\n suiTransaction,\n } = currentStep;\n return (\n evmTransaction ||\n evmApprovalTransaction ||\n cosmosTransaction ||\n solanaTransaction ||\n transferTransaction ||\n starknetApprovalTransaction ||\n starknetTransaction ||\n tronApprovalTransaction ||\n tronTransaction ||\n tonTransaction ||\n suiTransaction\n );\n};\n\n/**\n *\n * Set current step transaction\n *\n */\nexport const setCurrentStepTx = (\n currentStep: PendingSwapStep,\n transaction: Transaction\n): PendingSwapStep => {\n currentStep.transferTransaction = null;\n currentStep.cosmosTransaction = null;\n currentStep.evmTransaction = null;\n currentStep.solanaTransaction = null;\n currentStep.evmApprovalTransaction = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.starknetTransaction = null;\n currentStep.tronApprovalTransaction = null;\n currentStep.tronTransaction = null;\n currentStep.tonTransaction = null;\n currentStep.suiTransaction = null;\n\n const txType = transaction.type;\n switch (txType) {\n case TransactionType.EVM:\n if (transaction.isApprovalTx) {\n currentStep.evmApprovalTransaction = transaction;\n } else {\n currentStep.evmTransaction = transaction;\n }\n break;\n case TransactionType.TRON:\n if (transaction.isApprovalTx) {\n currentStep.tronApprovalTransaction = transaction;\n } else {\n currentStep.tronTransaction = transaction;\n }\n break;\n case TransactionType.STARKNET:\n if (transaction.isApprovalTx) {\n currentStep.starknetApprovalTransaction = transaction;\n } else {\n currentStep.starknetTransaction = transaction;\n }\n break;\n case TransactionType.COSMOS:\n currentStep.cosmosTransaction = transaction;\n break;\n case TransactionType.SOLANA:\n currentStep.solanaTransaction = transaction;\n break;\n case TransactionType.TRANSFER:\n currentStep.transferTransaction = transaction;\n break;\n case TransactionType.TON:\n currentStep.tonTransaction = transaction;\n break;\n case TransactionType.SUI:\n currentStep.suiTransaction = transaction;\n break;\n case TransactionType.XRPL:\n currentStep.xrplTransaction = transaction;\n break;\n default:\n ((x: never) => {\n throw new Error(`${x} was unhandled!`);\n })(txType);\n }\n return currentStep;\n};\n\n/**\n *\n * Returns current step transaction type\n *\n */\nexport const getCurrentStepTxType = (\n currentStep: PendingSwapStep\n): TransactionType | undefined => {\n return getCurrentStepTx(currentStep)?.type;\n};\n\n/**\n *\n * Returns a boolean indicating that current step is an approval tx or not.\n *\n */\nexport const isApprovalCurrentStepTx = (\n currentStep: PendingSwapStep\n): boolean => {\n const {\n evmApprovalTransaction,\n starknetApprovalTransaction,\n tronApprovalTransaction,\n } = currentStep;\n return !!(\n evmApprovalTransaction ||\n starknetApprovalTransaction ||\n tronApprovalTransaction\n );\n};\n\n/**\n * When we are doing a swap, there are some common fields that will be updated together.\n * This function helps us to update a swap status and also it will update some more fields like `extraMessageSeverity` based on the input.\n */\nexport function updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus,\n nextStepStatus,\n message,\n details,\n errorCode = null,\n hasAlreadyProceededToSign,\n trace = null,\n}: {\n getStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['getStorage'];\n setStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['setStorage'];\n nextStatus?: SwapStatus;\n nextStepStatus?: StepStatus;\n message?: string;\n details?: string | null | undefined;\n errorCode?: APIErrorCode | SignerErrorCode | null;\n hasAlreadyProceededToSign?: boolean;\n trace?: Error | null | undefined;\n}): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n failureType?: APIErrorCode;\n} {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const updatedResult: {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n failureType?: APIErrorCode;\n } = {\n swap,\n step: currentStep,\n };\n if (!!nextStepStatus && !!currentStep) {\n currentStep.status = nextStepStatus;\n }\n\n if (nextStatus) {\n swap.status = nextStatus;\n }\n swap.hasAlreadyProceededToSign = hasAlreadyProceededToSign;\n if (!!nextStatus && ['failed', 'success'].includes(nextStatus)) {\n swap.finishTime = new Date().getTime().toString();\n }\n\n if (!!message || !!details) {\n swap.extraMessage = message || '';\n swap.extraMessageDetail = details || '';\n }\n\n if (!!nextStepStatus && ['failed'].includes(nextStepStatus)) {\n //if user cancel the swap, we should pass relevant reason to the server.\n const errorReason =\n details && details.includes('Warning')\n ? 'Swap canceled by user.'\n : details;\n const walletType = getRelatedWalletOrNull(swap, currentStep)?.walletType;\n swap.extraMessageSeverity = MessageSeverity.error;\n\n const failureType = mapAppErrorCodesToAPIErrorCode(errorCode);\n updatedResult.failureType = failureType;\n\n // If trace of error was available, we will send it to the api (except user rejection)\n const errorReasonForAPI =\n errorCode !== 'REJECTED_BY_USER' &&\n trace?.message &&\n typeof trace.message === 'string'\n ? trace.message\n : errorReason || '';\n\n httpService()\n .reportFailure({\n requestId: swap.requestId,\n step: currentStep?.id || 1,\n eventType: failureType,\n reason: errorReasonForAPI,\n tags: walletType\n ? {\n wallet: walletType,\n }\n : undefined,\n })\n .then()\n .catch();\n } else if (!!nextStepStatus && ['running'].includes(nextStepStatus)) {\n swap.extraMessageSeverity = MessageSeverity.info;\n } else if (\n !!nextStepStatus &&\n ['success', 'approved'].includes(nextStepStatus)\n ) {\n swap.extraMessageSeverity = MessageSeverity.success;\n } else if (\n nextStepStatus &&\n ['waitingForApproval'].includes(nextStepStatus)\n ) {\n swap.extraMessageSeverity = MessageSeverity.warning;\n }\n\n if (nextStepStatus === 'running' && currentStep) {\n currentStep.startTransactionTime = new Date().getTime();\n }\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return updatedResult;\n}\n\n/**\n *\n * Set current step transaction hash, update pending swap status, and notify user if needed\n *\n */\nexport function setStepTransactionIds(\n { getStorage, setStorage }: ExecuterActions<SwapStorage, SwapActionTypes>,\n txId: string | null,\n explorerUrl?: { url?: string; description?: string }\n): void {\n const swap = getStorage().swapDetails;\n swap.hasAlreadyProceededToSign = null;\n\n const currentStep = getCurrentStep(swap)!;\n currentStep.executedTransactionId = txId;\n currentStep.executedTransactionTime = new Date().getTime().toString();\n if (explorerUrl?.url) {\n currentStep.explorerUrl = [\n ...(currentStep.explorerUrl || []),\n {\n url: explorerUrl.url,\n description: explorerUrl.description || null,\n },\n ];\n }\n\n const isApproval = isApprovalCurrentStepTx(currentStep);\n\n if (isApproval) {\n swap.extraMessage = 'Checking approve transaction status ...';\n } else {\n swap.extraMessage = 'Checking transaction status ...';\n }\n\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION,\n status: StepExecutionEventStatus.TX_SENT,\n },\n swap: swap,\n step: currentStep,\n });\n\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap: swap,\n step: currentStep,\n });\n}\n\n/**\n * If a swap needs a wallet to be connected,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage,\n setStorage,\n }: Pick<ExecuterActions, 'getStorage' | 'setStorage'>,\n reason: string,\n reasonDetail: string\n): void {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n const isAlreadyMarked =\n currentStep.networkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet &&\n swap.networkStatusExtraMessage === reason &&\n swap.networkStatusExtraMessageDetail === reasonDetail;\n\n if (isAlreadyMarked) {\n return;\n }\n\n currentStep.networkStatus =\n PendingSwapNetworkStatus.WaitingForConnectingWallet;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n}\n\n/**\n * If a swap needs a certain network to proceed,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsSwitchingNetwork({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n\n // Generate message\n const { type } = getRequiredWallet(swap);\n const fromNamespace = getCurrentNamespaceOf(swap, currentStep);\n const reason = `Change ${type} wallet network to ${fromNamespace.network}`;\n const reasonDetail = `We\u2019re switching the connected network to ${fromNamespace.network}. Please check your wallet.`;\n\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForNetworkChange;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n * We are marking the queue as it depends on other queues to be run (on Parallel mode)\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsDependsOnOtherQueues({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n\n swap.networkStatusExtraMessage = '';\n swap.networkStatusExtraMessageDetail = '';\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForQueue;\n\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status: StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE,\n },\n swap,\n step: currentStep,\n });\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\nexport async function delay(ms: number): Promise<unknown> {\n return new Promise((res) => setTimeout(res, ms));\n}\n\n/**\n *\n * To execute a swap, we are keeping the user prefrences on what wallet they are going to use for a sepecific blockchain\n * By passing the swap and the network we are looking for, it returns the wallet name that user selected.\n *\n */\nexport const getSwapWalletType = (\n swap: PendingSwap,\n network: Network\n): WalletType => {\n return swap.wallets[network]?.walletType;\n};\n\n/**\n *\n * We are keeping the connected wallet in a specific structure (`Wallet`),\n * By using this function we normally want to check a specific wallet is connected and exists or not.\n *\n */\nexport function isWalletNull(wallet: Wallet | null): boolean {\n return (\n wallet === null ||\n wallet?.blockchains === null ||\n wallet?.blockchains.length === 0\n );\n}\n\n/**\n * In a `PendingSwap`, each step needs a wallet to proceed,\n * By using this function we can access what wallet exactly we need to run current step.\n */\nexport function getRequiredWallet(swap: PendingSwap): {\n type: WalletType | null;\n namespace: TargetNamespace | null;\n address: string | null;\n} {\n const step = getCurrentStep(swap)!;\n const currentNamespace = getCurrentNamespaceOfOrNull(swap, step);\n if (!currentNamespace) {\n return {\n type: null,\n namespace: null,\n address: null,\n };\n }\n\n const walletType = getSwapWalletType(swap, currentNamespace.network);\n const sourceWallet = swap.wallets[currentNamespace.network];\n\n return {\n type: walletType || null,\n namespace: currentNamespace,\n address: sourceWallet ? sourceWallet.address : null,\n };\n}\n\n/**\n * On EVM compatible wallets, There is one instance with different chains (like Polygon)\n * To get the chain from instance we will use this function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getChainId(provider: any): Promise<string | number | null> {\n try {\n const chainId: number | string | null =\n (await provider.request({ method: 'eth_chainId' })) || provider?.chainId;\n return chainId;\n } catch {\n return provider?.chainId;\n }\n}\n\n/**\n * For running a swap safely, we need to make sure about the state of wallet\n * which means the netowrk/chain of wallet should be exactly on what a transaction needs.\n */\nexport async function isNetworkMatchedForTransaction(\n swap: PendingSwap,\n step: PendingSwapStep,\n wallet: Wallet | null,\n meta: Meta,\n providers: Providers\n): Promise<boolean> {\n if (isWalletNull(wallet)) {\n return false;\n }\n const fromNamespace = getCurrentNamespaceOfOrNull(swap, step);\n if (!fromNamespace) {\n return false;\n }\n\n if (\n meta.evmBasedChains.find(\n (evmBlochain) => evmBlochain.name === fromNamespace.network\n )\n ) {\n try {\n const sourceWallet = swap.wallets[fromNamespace.network];\n if (sourceWallet) {\n const provider = getEvmProvider(providers, sourceWallet.walletType);\n const chainId: number | string | null = await getChainId(provider);\n if (chainId) {\n const blockChain = getBlockChainNameFromId(\n chainId,\n Object.entries(meta.blockchains).map(\n ([, blockchainMeta]) => blockchainMeta\n )\n );\n if (\n blockChain &&\n blockChain.toLowerCase() === fromNamespace.network.toLowerCase()\n ) {\n return true;\n }\n if (\n blockChain &&\n blockChain.toLowerCase() !== fromNamespace.network.toLowerCase()\n ) {\n return false;\n }\n }\n }\n } catch (e) {\n console.log(e);\n }\n return false;\n }\n return true;\n}\n\nexport const isTxAlreadyCreated = (\n swap: PendingSwap,\n step: PendingSwapStep\n): boolean => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n swap.wallets[step.tonTransaction?.blockChain || ''] ||\n swap.wallets[step.suiTransaction?.blockChain || ''] ||\n step.transferTransaction?.fromWalletAddress ||\n null;\n\n return result !== null;\n};\n\nexport function resetNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n currentStep.networkStatus = null;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\nexport function updateNetworkStatus(\n actions: Pick<\n ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>,\n 'getStorage' | 'setStorage'\n >,\n data: {\n message: string;\n details: string;\n status: PendingSwapNetworkStatus | null;\n } = {\n message: '',\n details: '',\n status: null,\n }\n): void {\n const { message, details, status } = data;\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n swap.networkStatusExtraMessage = message;\n swap.networkStatusExtraMessageDetail = details;\n currentStep.networkStatus = status;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for wallet),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required wallet is connected, unblock the queue to be run.\n */\nexport function onBlockForConnectWallet(\n event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const { ok, reason } = isRequiredWalletConnected(swap, context.state);\n\n if (!ok) {\n const currentStep = getCurrentStep(swap)!;\n const { type: walletType, address } = getRequiredWallet(swap);\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n ...(reason === 'account_miss_match'\n ? {\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n requiredAccount: address ?? undefined,\n }\n : {\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\n requiredWallet: walletType ?? undefined,\n requiredAccount: address ?? undefined,\n }),\n },\n swap: swap,\n step: currentStep,\n });\n\n markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n },\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n event.reason.description\n );\n\n return;\n }\n\n queue.unblock();\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required network is connected, unblock the queue to be run.\n * Note: it automatically try to switch the network if its `provider` supports.\n */\nexport function onBlockForChangeNetwork(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n\n if (!currentStep || swap.status !== 'running') {\n return;\n }\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n\n const requiredNetwork = getCurrentNamespaceOfOrNull(\n swap,\n currentStep\n )?.network;\n\n const requiredWallet = getRequiredWallet(swap).type;\n\n const currentNetwork = requiredWallet\n ? context.state(requiredWallet).network\n : undefined;\n\n if (result) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status: StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n requiredNetwork: requiredNetwork ?? undefined,\n currentNetwork: currentNetwork ?? undefined,\n },\n swap: result.swap,\n step: result.step,\n });\n }\n\n // Try to auto switch\n const { type, namespace } = getRequiredWallet(swap);\n if (!!type && !!namespace?.network) {\n if (context.canSwitchNetworkTo(type, namespace.network, namespace)) {\n const result = context.switchNetwork(type, namespace);\n if (result) {\n result\n .then(() => {\n queue.unblock();\n })\n .catch((error) => {\n // Update network to mark it as network change failed.\n updateNetworkStatus(\n {\n getStorage: queue.getStorage.bind(queue) as () => SwapStorage,\n setStorage: queue.setStorage.bind(\n queue\n ) as SetStorage<SwapStorage>,\n },\n {\n message: error.message,\n details: error.message,\n status: PendingSwapNetworkStatus.NetworkChangeFailed,\n }\n );\n });\n }\n }\n }\n}\n\n/**\n * Event handler for blocked tasks. (Parallel mode)\n * If a transcation execution flow is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks the blocked tasks, if there is no active `claimed` queue, try to give it to the best candidate.\n */\nexport function onDependsOnOtherQueues(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { getBlockedTasks, forceExecute, queue, manager, context } = meta;\n const { setClaimer, claimedBy, reset } = claimQueue();\n\n // We only needs those blocked tasks that have DEPENDS_ON_OTHER_QUEUES reason.\n const blockedTasks = getBlockedTasks().filter(\n (task) => task.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES\n );\n\n if (blockedTasks.length === 0) {\n return;\n }\n\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId;\n\n if (claimerId === queue.id) {\n return;\n }\n\n // Check if any queue `claimed` before, if yes, we don't should do anything.\n if (isClaimedByAnyQueue) {\n // We need to keep the latest swap messages\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n return;\n }\n\n // Prioritize current queue to be run first.\n\n let task = blockedTasks.find((task) => {\n return task.queue_id === meta.queue_id;\n });\n\n // If current task isn't available anymore, fallback to first blocked task.\n if (!task) {\n const firstBlockedTask = blockedTasks[0];\n task = firstBlockedTask;\n }\n\n setClaimer(task.queue_id);\n const claimedStorage = task.storage.get() as SwapStorage;\n const { type, namespace, address } = getRequiredWallet(\n claimedStorage.swapDetails\n );\n\n // Run\n forceExecute(task.queue_id, {\n claimedBy: claimedBy(),\n resetClaimedBy: () => {\n reset();\n // TODO: Use key generator\n if (type) {\n retryOn(\n {\n walletType: type,\n network: namespace?.network,\n accounts: address ? [address] : [],\n },\n manager,\n context.canSwitchNetworkTo\n );\n }\n },\n });\n}\n\nexport function isRequiredWalletConnected(\n swap: PendingSwap,\n getState: (type: WalletType) => WalletState\n): { ok: boolean; reason: 'not_connected' | 'account_miss_match' } {\n const { type, address } = getRequiredWallet(swap);\n if (!type || !address) {\n return { ok: false, reason: 'not_connected' };\n }\n const walletState = getState(type);\n const { accounts, connected } = walletState;\n const connectedAccounts = accounts || [];\n if (!connected) {\n return { ok: false, reason: 'not_connected' };\n }\n\n const matched = connectedAccounts.some((account) => {\n const { address: accountAddress } = readAccountAddress(account);\n return address.toLocaleLowerCase() === accountAddress.toLocaleLowerCase();\n });\n return { ok: matched, reason: 'account_miss_match' };\n}\n\nexport async function signTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setTransactionDataByHash } = inMemoryTransactionsData();\n const { getStorage, setStorage, failed, next, schedule, context } = actions;\n const { meta, getSigners, isMobileWallet } = context;\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n\n const sourceWallet = getRelatedWallet(swap, currentStep);\n const mobileWallet = isMobileWallet(sourceWallet?.walletType);\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n\n const onFinish = () => {\n // TODO resetClaimedBy is undefined here\n if (actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const tx = getCurrentStepTx(currentStep);\n const txType = tx?.type;\n const isApproval = isApprovalCurrentStepTx(currentStep);\n\n if (!tx || !txType) {\n const extraMessage = 'Unexpected Error: tx is null!';\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: undefined,\n errorCode: 'CLIENT_UNEXPECTED_BEHAVIOUR',\n });\n notifier({\n event: {\n type: StepEventType.FAILED,\n reason: extraMessage,\n reasonCode: 'CLIENT_UNEXPECTED_BEHAVIOUR',\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n failed();\n return onFinish();\n }\n\n const chainId = meta.blockchains?.[tx.blockChain]?.chainId;\n\n const hasAlreadyProceededToSign =\n typeof swap.hasAlreadyProceededToSign === 'boolean';\n\n let nextStatus: SwapStatus | undefined,\n nextStepStatus: StepStatus,\n message: string,\n details: string,\n eventType: StepEventType;\n\n if (isApproval) {\n message = `Waiting for approval of ${currentStep?.fromSymbol} coin ${\n mobileWallet ? 'on your mobile phone!' : ''\n }`;\n details =\n 'Waiting for approve transaction to be mined and confirmed successfully';\n nextStepStatus = 'waitingForApproval';\n nextStatus = undefined;\n eventType = StepEventType.TX_EXECUTION;\n } else if (hasAlreadyProceededToSign) {\n message = 'Transaction is expired. Please try again.';\n nextStepStatus = 'failed';\n nextStatus = 'failed';\n details = '';\n eventType = StepEventType.FAILED;\n } else {\n message = 'Executing transaction ...';\n nextStepStatus = 'running';\n nextStatus = 'running';\n details = `${mobileWallet ? 'Check your mobile phone!' : ''}`;\n eventType = StepEventType.TX_EXECUTION;\n }\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStepStatus,\n nextStatus,\n message: message,\n details: details,\n hasAlreadyProceededToSign: isApproval\n ? undefined\n : hasAlreadyProceededToSign,\n errorCode: hasAlreadyProceededToSign ? 'TX_EXPIRED' : undefined,\n });\n\n if (eventType === StepEventType.FAILED) {\n notifier({\n event: {\n type: eventType,\n reason: message,\n reasonCode: updateResult.failureType ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n } else {\n notifier({\n event: { type: eventType, status: StepExecutionEventStatus.SEND_TX },\n ...updateResult,\n });\n }\n\n if (hasAlreadyProceededToSign) {\n failed();\n onFinish();\n return;\n }\n\n const walletSigners = await getSigners(sourceWallet.walletType);\n\n const signer = walletSigners.getSigner(txType);\n signer.signAndSendTx(tx, walletAddress, chainId).then(\n ({ hash, response }) => {\n const explorerUrl = getScannerUrl(\n hash,\n currentStepNamespace.network,\n meta.blockchains\n );\n setStepTransactionIds(\n actions,\n hash,\n explorerUrl &&\n (!response || (response && !response.hashRequiringUpdate))\n ? {\n url: explorerUrl,\n description: isApproval ? 'Approve' : 'Swap',\n }\n : undefined\n );\n // response used for evm transactions to get receipt and track replaced\n if (response) {\n setTransactionDataByHash(hash, { response });\n }\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n next();\n onFinish();\n },\n (error) => {\n if (swap.status === 'failed') {\n return;\n }\n\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n\n warn(error, {\n tags: {\n requestId: swap.requestId,\n rpc: true,\n swapper: currentStep?.swapperId || '',\n walletType: sourceWallet?.walletType || '',\n },\n context: SignerError.isSignerError(error)\n ? error.getErrorContext()\n : {},\n });\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n trace: error?.cause,\n });\n\n notifier({\n event: {\n type: StepEventType.FAILED,\n reason: extraMessage,\n reasonCode: updateResult.failureType ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n failed();\n onFinish();\n }\n );\n}\n\nexport function checkWaitingForConnectWalletChange(params: {\n lastConnectedWallet: LastConnectedWallet;\n manager?: Manager;\n evmChains: EvmBlockchainMeta[];\n}): void {\n const { lastConnectedWallet, evmChains, manager } = params;\n const { walletType: wallet, network } = lastConnectedWallet;\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == network)) {\n return;\n }\n\n manager?.getAll().forEach((q) => {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n const currentStepRequiredWallet =\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType;\n const hasWaitingForConnect = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n // TODO double check later\n [BlockReason.WAIT_FOR_CONNECT_WALLET].includes(\n task.blockedFor?.reason\n )\n );\n }\n );\n\n const requiredNetwork = getCurrentNamespaceOfOrNull(\n swap,\n currentStep\n )?.network;\n\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == requiredNetwork)) {\n return;\n }\n\n if (\n currentStepRequiredWallet === wallet &&\n hasWaitingForConnect &&\n requiredNetwork != network\n ) {\n const queueInstance = q.list;\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(type);\n\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n description,\n },\n silent: true,\n });\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queueInstance.getStorage.bind(queueInstance),\n setStorage: queueInstance.setStorage.bind(queueInstance),\n });\n\n if (result) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n currentNetwork: network,\n requiredNetwork: requiredNetwork ?? undefined,\n },\n swap: result.swap,\n step: result.step,\n });\n }\n }\n }\n }\n });\n}\n\nexport function checkWaitingForNetworkChange(manager?: Manager): void {\n manager?.getAll().forEach((q) => {\n const hasWaitingForNetwork = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n [\n BlockReason.WAIT_FOR_NETWORK_CHANGE,\n BlockReason.DEPENDS_ON_OTHER_QUEUES,\n ].includes(task.blockedFor?.reason)\n );\n }\n );\n\n if (hasWaitingForNetwork) {\n const swap = q.list.getStorage()\n ?.swapDetails as SwapStorage['swapDetails'];\n if (swap.status === 'running') {\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type);\n\n // Change the block reason to waiting for connecting wallet\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n },\n });\n }\n }\n });\n}\n\n/**\n * Get list of all running swaps\n *\n * @param manager\n * @returns list of pending swaps\n */\nexport function getRunningSwaps(manager: Manager): PendingSwap[] {\n const queues = manager?.getAll() || new Map<QueueName, QueueInfo>();\n const result: PendingSwap[] = [];\n queues.forEach((q) => {\n // retry only on affected queues\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (!swap || swap.status !== 'running') {\n return;\n }\n result.push(swap);\n });\n return result;\n}\n\n/**\n *\n * Trying to reset notifications for pending swaps to correct message on page load.\n * We could remove this after supporting auto connect for wallets.\n *\n * @param swaps\n * @param notifier\n * @returns\n */\nexport function resetRunningSwapNotifsOnPageLoad(runningSwaps: PendingSwap[]) {\n runningSwaps.forEach((swap) => {\n const currentStep = getCurrentStep(swap);\n const eventType = StepEventType.TX_EXECUTION_BLOCKED;\n let eventSubtype:\n | StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE\n | StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT\n | undefined;\n if (\n currentStep?.networkStatus === PendingSwapNetworkStatus.WaitingForQueue\n ) {\n eventSubtype = StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE;\n } else if (swap?.status === 'running') {\n eventSubtype = StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT;\n }\n if (!!eventType && !!notifier) {\n notifier({\n event: {\n type: eventType,\n status:\n eventSubtype ?? StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE,\n },\n swap: swap,\n step: currentStep,\n });\n }\n });\n}\n\n/**\n *\n * Try to run blocked tasks by wallet and network name.\n * Goes through queues and extract blocked queues with matched wallet.\n * If found any blocked tasks with same wallet and network, runs them.\n * If not, runs only blocked tasks with matched wallet.\n *\n * @param wallet_network a string includes `wallet` type and `network` type.\n * @param manager\n * @returns\n */\nexport function retryOn(\n lastConnectedWallet: LastConnectedWallet,\n manager?: Manager,\n canSwitchNetworkTo?: UseQueueManagerParams['canSwitchNetworkTo'],\n options = { fallbackToOnlyWallet: true }\n): void {\n const { walletType: wallet, network } = lastConnectedWallet;\n if (!wallet) {\n return;\n }\n\n const walletAndNetworkMatched: QueueType[] = [];\n const onlyWalletMatched: QueueType[] = [];\n\n manager?.getAll().forEach((q) => {\n // retry only on affected queues\n if (q.status === Status.BLOCKED) {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n if (\n network &&\n getCurrentNamespaceOfOrNull(swap, currentStep)?.network ==\n network &&\n queueStorage?.swapDetails.wallets[network]?.walletType === wallet\n ) {\n walletAndNetworkMatched.push(q.list);\n } else if (\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType === wallet\n ) {\n onlyWalletMatched.push(q.list);\n }\n }\n }\n }\n });\n\n let finalQueueToBeRun: QueueType | undefined = undefined;\n if (walletAndNetworkMatched.length > 0) {\n finalQueueToBeRun = walletAndNetworkMatched[0];\n\n if (walletAndNetworkMatched.length > 1) {\n for (let i = 1; i < walletAndNetworkMatched.length; i++) {\n const currentQueue = walletAndNetworkMatched[i];\n\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: currentQueue.getStorage.bind(currentQueue),\n setStorage: currentQueue.setStorage.bind(currentQueue),\n });\n }\n }\n } else if (onlyWalletMatched.length > 0 && options.fallbackToOnlyWallet) {\n finalQueueToBeRun = onlyWalletMatched[0];\n }\n\n if (finalQueueToBeRun) {\n const finalQueueStorage = finalQueueToBeRun.getStorage() as SwapStorage;\n const currentSwap = getCurrentStep(finalQueueStorage?.swapDetails);\n\n const currentNamespace = currentSwap\n ? getCurrentNamespaceOfOrNull(finalQueueStorage.swapDetails, currentSwap)\n : null;\n if (\n !network ||\n !currentNamespace ||\n !canSwitchNetworkTo?.(wallet, network, currentNamespace)\n ) {\n finalQueueToBeRun.unblock();\n } else {\n finalQueueToBeRun.checkBlock();\n }\n }\n}\n\n/*\n *For avoiding conflict by making too many requests to wallet, we need to make sure\n *We only run one request at a time (In parallel mode).\n */\nexport function isNeedBlockQueueForParallel(step: PendingSwapStep): boolean {\n return !!step.evmTransaction || !!step.evmApprovalTransaction;\n}\n\n/*\n *Create transaction endpoint doesn't return error code on http status code,\n *For backward compatibilty with server and sdk, we use this wrapper to reject the promise.\n */\nexport async function throwOnOK(\n rawResponse: Promise<CreateTransactionResponse>\n): Promise<CreateTransactionResponse> {\n const responseBody = await rawResponse;\n if (!responseBody.ok || !responseBody.transaction) {\n throw PrettyError.CreateTransaction(\n responseBody.error || 'bad response from create tx endpoint'\n );\n }\n return responseBody;\n}\n\nexport function cancelSwap(\n swap: QueueInfo,\n manager?: Manager\n): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const { reset } = claimQueue();\n swap.actions.cancel();\n\n const updateResult = updateSwapStatus({\n getStorage: swap.actions.getStorage,\n setStorage: swap.actions.setStorage,\n message: 'Swap canceled by user.',\n details:\n \"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.\",\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'USER_CANCEL',\n });\n\n notifier({\n event: {\n type: StepEventType.FAILED,\n reasonCode: 'USER_CANCEL',\n reason: updateResult.swap.extraMessage ?? undefined,\n inputAmount: getLastFinishedStepInput(updateResult.swap),\n inputAmountUsd: getLastFinishedStepInputUsd(updateResult.swap),\n },\n\n swap: updateResult.swap,\n step: updateResult.step,\n });\n\n reset();\n if (manager) {\n manager?.retry();\n }\n\n return updateResult;\n}\n\nexport function getLastSuccessfulStep<T extends { status: StepStatus }[]>(\n steps: T\n): ArrayElement<T> | undefined {\n return steps\n .slice()\n .reverse()\n .find((step) => step.status === 'success') as ArrayElement<T> | undefined;\n}\n\nexport function getFailedStep<T extends { status: StepStatus }[]>(\n steps: T\n): ArrayElement<T> | undefined {\n return steps\n .slice()\n .reverse()\n .find((step) => step.status === 'failed') as ArrayElement<T> | undefined;\n}\n\nexport function isApprovalTX(step: Step): boolean {\n const { transaction } = step;\n const approvalTx =\n (transaction?.type === TransactionType.EVM && transaction.isApprovalTx) ||\n (transaction?.type === TransactionType.STARKNET &&\n transaction.isApprovalTx) ||\n (transaction?.type === TransactionType.TRON && transaction.isApprovalTx);\n\n return approvalTx;\n}\n\nexport function getTokenAmountInUsd(\n amount: string | number,\n usdPrice: string | number\n): string {\n const usdValue = new BigNumber(amount).multipliedBy(usdPrice);\n if (isNaN(usdValue.toNumber())) {\n return '';\n }\n return usdValue.toString();\n}\n\nexport function getSwapInputUsd(swap: PendingSwap): string {\n return getTokenAmountInUsd(\n swap.inputAmount,\n swap.steps[0].fromUsdPrice ?? ''\n );\n}\n\nexport function getSwapOutputUsd(swap: PendingSwap): string {\n const lastStep = swap.steps[swap.steps.length - 1];\n\n return getTokenAmountInUsd(\n lastStep.outputAmount ?? '',\n lastStep.toUsdPrice ?? ''\n );\n}\n\nexport function getLastFinishedStep(\n swap: PendingSwap\n): { step: PendingSwapStep; index: number } | undefined {\n const FINISHED_STATUS: PendingSwap['steps'][number]['status'][] = [\n 'success',\n 'failed',\n ];\n\n const lastFinishedStepIndex = swap.steps.findLastIndex((step) =>\n FINISHED_STATUS.includes(step.status)\n );\n\n return lastFinishedStepIndex < 0\n ? undefined\n : { step: swap.steps[lastFinishedStepIndex], index: lastFinishedStepIndex };\n}\n\nexport function getLastFinishedStepInput(swap: PendingSwap): string {\n const lastFinishedStep = getLastFinishedStep(swap);\n\n if (!lastFinishedStep) {\n return '';\n }\n\n return lastFinishedStep.index === 0\n ? swap.inputAmount\n : swap.steps[lastFinishedStep.index - 1].outputAmount ?? '';\n}\n\nexport function getLastFinishedStepInputUsd(swap: PendingSwap): string {\n const lastSuccessfulStep = getLastFinishedStep(swap);\n\n return getTokenAmountInUsd(\n getLastFinishedStepInput(swap),\n lastSuccessfulStep?.step?.fromUsdPrice ?? ''\n );\n}\n\nexport function getLastSuccessfulStepOutputUsd(swap: PendingSwap): string {\n const lastSuccessfulStep = getLastSuccessfulStep(swap.steps);\n\n return getTokenAmountInUsd(\n lastSuccessfulStep?.outputAmount ?? '',\n lastSuccessfulStep?.toUsdPrice ?? ''\n );\n}\n\nexport function createStepFailedEvent(\n swap: PendingSwap,\n message: string,\n reasonCode?: APIErrorCode\n): NotifierParams['event'] & { type: StepEventType.FAILED } {\n return {\n type: StepEventType.FAILED,\n reason: message,\n reasonCode: reasonCode ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n };\n}\n", "export const ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES =\n 'Waiting for other swaps to complete';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET = 'Waiting for connecting wallet';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET = (\n type: string | null,\n address: string | null\n): string =>\n `Please change your ${type || 'wallet'} account to ${\n address || 'proper address'\n }`;\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION = (\n type: string | null\n): string => `Please connect your ${type ?? ''} wallet.`;\nexport const ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK = (\n network: string | null\n): string => `Please change your network to ${network}.`;\n\nexport const DEFAULT_ERROR_CODE = 'CLIENT_UNEXPECTED_BEHAVIOUR';\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { NamespaceInputForConnect } from '@rango-dev/wallets-core/dist/legacy/types';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n ConfirmRouteResponse,\n MetaResponse,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type {\n PendingSwap,\n PendingSwapStep,\n SwapSavedSettings,\n SwapStepRoute,\n WalletTypeAndAddress,\n} from 'rango-types';\n\nimport BigNumber from 'bignumber.js';\n\nimport { numberToString } from './numbers';\nimport { PrettyError } from './shared-errors';\n\nexport interface PendingSwapWithQueueID {\n id: string;\n swap: PendingSwap;\n}\n\nexport type WalletBalance = {\n chain: Network;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport type Account = {\n address: string;\n loading: boolean;\n walletType: WalletType;\n error: boolean;\n explorerUrl: string | null;\n isConnected?: boolean;\n};\nexport type Blockchain = { name: string; accounts: Account[] };\nexport type Wallet = { blockchains: Blockchain[] };\n\nexport type EventType =\n | 'swap_started'\n | 'confirm_contract'\n | 'confirm_transfer'\n | 'task_failed'\n | 'task_completed'\n | 'task_canceled'\n | 'task_paused'\n | 'contract_confirmed'\n | 'confirm_approve_contract'\n | 'contract_rejected'\n | 'check_tx_status'\n | 'check_approve_tx_status'\n | 'transfer_rejected'\n | 'transfer_failed'\n | 'calling_smart_contract'\n | 'smart_contract_called'\n | 'smart_contract_call_failed'\n | 'step_completed_with_output'\n | 'waiting_for_network_change'\n | 'waiting_for_connecting_wallet'\n | 'waiting_for_change_wallet_account'\n | 'network_changed'\n | 'not_enough_balance'\n | 'not_enough_approval'\n | 'waiting_for_queue'\n | 'check_fee_failed'\n | 'route_failed_to_find'\n | 'transaction_expired';\n\nexport enum MessageSeverity {\n error = 'error',\n warning = 'warning',\n info = 'info',\n success = 'success',\n}\n\nexport type SwapStatus = 'running' | 'failed' | 'success';\n\nexport interface TargetNamespace {\n namespace: NamespaceInputForConnect['namespace'];\n network: string;\n}\nexport const getCurrentNamespaceOfOrNull = (\n swap: PendingSwap,\n step: PendingSwapStep\n): TargetNamespace | null => {\n try {\n return getCurrentNamespaceOf(swap, step);\n } catch {\n return null;\n }\n};\n\nexport const getCurrentNamespaceOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): TargetNamespace => {\n const evmNetwork =\n step.evmTransaction?.blockChain || step.evmApprovalTransaction?.blockChain;\n const starknetNetwork =\n step.starknetTransaction?.blockChain ||\n step.starknetApprovalTransaction?.blockChain;\n const tronNetwork =\n step.tronTransaction?.blockChain ||\n step.tronApprovalTransaction?.blockChain;\n const cosmosNetwork = step.cosmosTransaction?.blockChain;\n const solanaNetwork = step.solanaTransaction?.blockChain;\n const tonNetwork = step.tonTransaction?.blockChain;\n const suiNetwork = step.suiTransaction?.blockChain;\n\n if (evmNetwork) {\n return {\n namespace: 'EVM',\n network: evmNetwork,\n };\n } else if (starknetNetwork) {\n return {\n namespace: 'Starknet',\n network: starknetNetwork,\n };\n } else if (tronNetwork) {\n return {\n namespace: 'Tron',\n network: tronNetwork,\n };\n } else if (cosmosNetwork) {\n return {\n namespace: 'Cosmos',\n network: cosmosNetwork,\n };\n } else if (solanaNetwork) {\n return {\n namespace: 'Solana',\n network: solanaNetwork,\n };\n } else if (tonNetwork) {\n return {\n namespace: 'Ton',\n network: tonNetwork,\n };\n } else if (suiNetwork) {\n return {\n namespace: 'Sui',\n network: suiNetwork,\n };\n } else if (!!step.transferTransaction) {\n const transferAddress = step.transferTransaction.fromWalletAddress;\n if (!transferAddress) {\n throw PrettyError.BlockchainMissing();\n }\n const utxoNetwork = Object.keys(swap.wallets).find(\n (network) => swap.wallets[network]?.address === transferAddress\n );\n if (!utxoNetwork) {\n throw PrettyError.BlockchainMissing();\n }\n\n return {\n namespace: 'UTXO',\n network: utxoNetwork,\n };\n }\n\n throw new Error(\n 'Unsupported transaction type has been included in your swap.',\n {\n cause: step,\n }\n );\n};\n\nexport const getScannerUrl = (\n txHash: string,\n network: Network,\n blockchainMetaMap: { [key: string]: BlockchainMeta }\n): string | undefined => {\n const blockchainMeta = blockchainMetaMap[network];\n const baseUrl = blockchainMeta.info?.transactionUrl;\n if (!baseUrl) {\n return;\n }\n if (baseUrl.indexOf('/{txHash}') !== -1) {\n return baseUrl.replace('{txHash}', txHash);\n }\n return `${baseUrl}/${txHash}`;\n};\n\nexport function getNextStep(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): PendingSwapStep | null {\n return (\n swap.steps.find(\n (step) =>\n step.status !== 'failed' &&\n step.status !== 'success' &&\n step.id !== currentStep.id\n ) || null\n );\n}\n\n/**\n * Returns the wallet type and address, based on the current step of `PendingSwap`.\n *\n * @param {PendingSwap} swap - The swap.\n * @param {PendingSwapStep} step - The current step.\n * @returns {WalletTypeAndAddress} Type and address related to the current step of the swap.\n */\nexport const getCurrentWalletTypeAndAddress = (\n swap: PendingSwap,\n step: PendingSwapStep\n): WalletTypeAndAddress => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n swap.wallets[step.tonTransaction?.blockChain || ''] ||\n swap.wallets[step.suiTransaction?.blockChain || ''] ||\n (step.transferTransaction?.fromWalletAddress\n ? {\n address: step.transferTransaction.fromWalletAddress,\n walletType: Object.values(swap.wallets).find(\n (wallet) =>\n wallet.address === step.transferTransaction?.fromWalletAddress\n )?.walletType,\n }\n : null) ||\n null;\n if (result == null) {\n throw PrettyError.WalletMissing();\n }\n return result;\n};\n\n/**\n * Returns the wallet address, based on the current step of `PendingSwap`.\n */\nexport const getCurrentAddressOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): string => {\n return getCurrentWalletTypeAndAddress(swap, step).address;\n};\n\nexport function getRelatedWallet(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress {\n const { address, walletType: type } = getCurrentWalletTypeAndAddress(\n swap,\n currentStep\n );\n const walletKV =\n Object.keys(swap.wallets)\n .map((k) => ({ k, v: swap.wallets[k] }))\n .find(({ v }) => v.address === address && v.walletType === type) || null;\n const blockchain = walletKV?.k || null;\n const wallet = walletKV?.v || null;\n\n const walletType = wallet?.walletType;\n if (wallet === null) {\n throw PrettyError.AssertionFailed(\n `Wallet for source ${blockchain} not passed: walletType: ${walletType}`\n );\n }\n return wallet;\n}\n\nexport function getRelatedWalletOrNull(\n swap: PendingSwap,\n currentStep: PendingSwapStep | null\n): WalletTypeAndAddress | null {\n if (!currentStep) {\n return null;\n }\n try {\n return getRelatedWallet(swap, currentStep);\n } catch {\n return null;\n }\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = new BigNumber(0);\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nfunction mapSwapStepToPendingSwapStep(\n swap: SwapResult,\n meta: Pick<MetaResponse, 'blockchains' | 'tokens'> | null\n): SwapStepRoute {\n return {\n // from\n fromBlockchain: swap.from.blockchain,\n fromBlockchainLogo: swap.from.blockchainLogo,\n fromLogo: swap.from.logo,\n fromSymbol: swap.from.symbol,\n fromSymbolAddress: swap.from.address,\n fromDecimals: swap.from.decimals,\n fromAmountPrecision: swap.fromAmountPrecision,\n fromAmountMinValue: swap.fromAmountMinValue,\n fromAmountMaxValue: swap.fromAmountMaxValue,\n fromAmountRestrictionType: swap.fromAmountRestrictionType,\n fromUsdPrice: swap.from.usdPrice,\n\n // to\n toBlockchain: swap.to.blockchain,\n toBlockchainLogo: swap.to.blockchainLogo,\n toSymbol: swap.to.symbol,\n toSymbolAddress: swap.to.address,\n toDecimals: swap.to.decimals,\n toLogo: swap.to.logo,\n toUsdPrice: swap.to.usdPrice,\n\n // swapper\n swapperId: swap.swapperId,\n swapperLogo: swap.swapperLogo,\n swapperType: swap.swapperType,\n\n // route\n expectedOutputAmountHumanReadable: swap.toAmount,\n feeInUsd: meta\n ? // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n numberToString(getUsdFeeOfStep(swap, meta?.tokens), null, 8)\n : null,\n estimatedTimeInSeconds: swap.estimatedTimeInSeconds || null,\n internalSteps: null,\n };\n}\n\nexport function calculatePendingSwap(\n inputAmount: string,\n bestRoute: NonNullable<ConfirmRouteResponse['result']>,\n wallets: { [p: string]: WalletTypeAndAddress },\n settings: SwapSavedSettings,\n validateBalanceOrFee: boolean,\n meta: Pick<MetaResponse, 'blockchains' | 'tokens'> | null\n): PendingSwap {\n const simulationResult = bestRoute.result;\n if (!simulationResult) {\n throw Error('Simulation result should not be null');\n }\n\n return {\n creationTime: new Date().getTime().toString(),\n finishTime: null,\n requestId: bestRoute.requestId || '',\n inputAmount: inputAmount,\n wallets,\n status: 'running',\n isPaused: false,\n extraMessage: null,\n extraMessageSeverity: null,\n extraMessageDetail: null,\n extraMessageErrorCode: null,\n networkStatusExtraMessage: null,\n networkStatusExtraMessageDetail: null,\n lastNotificationTime: null,\n settings: settings,\n simulationResult: simulationResult,\n validateBalanceOrFee,\n steps:\n bestRoute.result?.swaps?.map((swap, index) => {\n const stepRoute = mapSwapStepToPendingSwapStep(swap, meta);\n return {\n id: index + 1,\n\n // route\n ...stepRoute,\n internalSwaps:\n swap?.internalSwaps?.map((internalSwap) => {\n const stepRoute = mapSwapStepToPendingSwapStep(\n internalSwap,\n meta\n );\n return stepRoute;\n }) || null,\n\n // status, tracking\n outputAmount: '',\n status: 'created',\n networkStatus: null,\n startTransactionTime: new Date().getTime(),\n externalTransactionId: null,\n executedTransactionId: null,\n executedTransactionTime: null,\n explorerUrl: null,\n diagnosisUrl: null,\n trackingCode: null,\n internalSteps: null,\n\n // transactions\n evmTransaction: null,\n evmApprovalTransaction: null,\n starknetTransaction: null,\n starknetApprovalTransaction: null,\n tronTransaction: null,\n tronApprovalTransaction: null,\n cosmosTransaction: null,\n solanaTransaction: null,\n transferTransaction: null,\n tonTransaction: null,\n suiTransaction: null,\n xrplTransaction: null,\n\n // front fields\n hasAlreadyProceededToSign: false,\n };\n }) || [],\n };\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const numberToString = (\n number: BigNumber | string | null,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null) return '';\n if (number === '') return '';\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) return n.toFormat(0, roundingMode);\n if (n.gte(1000))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(100))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(1))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n if (n.gte(0.01))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n for (let i = minDecimals || 4; i < 17; i++)\n if (n.gte(Math.pow(10, -i)))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n", "import type {\n APIErrorCode,\n SignerErrorCode as SignerErrorCodeType,\n} from 'rango-types';\nimport {\n SignerErrorCode,\n SignerError,\n isSignerErrorCode,\n isAPIErrorCode,\n} from 'rango-types';\nimport { DEFAULT_ERROR_CODE } from './constants';\n\nexport type ErrorDetail = {\n extraMessage: string;\n extraMessageDetail?: string | null | undefined;\n extraMessageErrorCode: SignerErrorCodeType | APIErrorCode | null;\n};\n\nconst ERROR_ASSERTION_FAILED = 'Assertion failed (Unexpected behaviour)';\nconst ERROR_CREATE_TRANSACTION = 'Create transaction failed in Rango Server';\nconst ERROR_INPUT_WALLET_NOT_FOUND = 'Input wallet not found';\n\ntype ErrorRoot = string | Record<string, string> | null;\n\nexport class PrettyError extends Error {\n private readonly detail?: string;\n private readonly root?: ErrorRoot;\n private readonly code?: APIErrorCode;\n public _isPrettyError = true;\n\n constructor(\n code: APIErrorCode,\n m: string,\n root?: ErrorRoot,\n detail?: string\n ) {\n super(m);\n Object.setPrototypeOf(this, PrettyError.prototype);\n PrettyError.prototype._isPrettyError = true;\n this.code = code;\n this.detail = detail;\n this.root = root;\n }\n\n static isPrettyError(obj: unknown): obj is PrettyError {\n return (\n obj instanceof PrettyError ||\n Object.prototype.hasOwnProperty.call(obj, '_isPrettyError')\n );\n }\n\n getErrorDetail(): ErrorDetail {\n const rawMessage =\n typeof this.root === 'object' && this.root && this.root.error\n ? this.root.error\n : JSON.stringify(this.root);\n const rootStr =\n typeof this.root === 'string'\n ? this.root\n : this.root instanceof Error\n ? this.root.message\n : rawMessage;\n return {\n extraMessage: this.message,\n extraMessageDetail: this.detail || rootStr,\n extraMessageErrorCode: this.code || null,\n };\n }\n\n static AssertionFailed(m: string): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_ASSERTION_FAILED,\n null,\n m\n );\n }\n\n static BadStatusCode(\n message: string,\n statusCode: number | string\n ): PrettyError {\n return new PrettyError(\n 'TX_FAIL',\n message,\n null,\n `status code = ${statusCode}`\n );\n }\n\n static CreateTransaction(detail: string): PrettyError {\n return new PrettyError(\n 'FETCH_TX_FAILED',\n ERROR_CREATE_TRANSACTION,\n null,\n detail\n );\n }\n\n static WalletMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n\n static BlockchainMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n}\n\nexport function mapAppErrorCodesToAPIErrorCode(\n errorCode: string | null\n): APIErrorCode {\n try {\n if (!errorCode) return DEFAULT_ERROR_CODE;\n if (isAPIErrorCode(errorCode)) return errorCode;\n if (isSignerErrorCode(errorCode)) {\n const t: { [key in SignerErrorCodeType]: APIErrorCode } = {\n [SignerErrorCode.REJECTED_BY_USER]: 'USER_REJECT',\n [SignerErrorCode.SIGN_TX_ERROR]: 'CALL_WALLET_FAILED',\n [SignerErrorCode.SEND_TX_ERROR]: 'SEND_TX_FAILED',\n [SignerErrorCode.TX_FAILED_IN_BLOCKCHAIN]: 'TX_FAILED_IN_BLOCKCHAIN',\n [SignerErrorCode.NOT_IMPLEMENTED]: DEFAULT_ERROR_CODE,\n [SignerErrorCode.OPERATION_UNSUPPORTED]: DEFAULT_ERROR_CODE,\n [SignerErrorCode.UNEXPECTED_BEHAVIOUR]: DEFAULT_ERROR_CODE,\n };\n return t[errorCode];\n }\n return DEFAULT_ERROR_CODE;\n } catch (err) {\n return DEFAULT_ERROR_CODE;\n }\n}\n\nexport const prettifyErrorMessage = (obj: unknown): ErrorDetail => {\n if (!obj) return { extraMessage: '', extraMessageErrorCode: null };\n if (PrettyError.isPrettyError(obj)) return obj.getErrorDetail();\n if (SignerError.isSignerError(obj)) {\n const t = obj.getErrorDetail();\n return {\n extraMessage: t.message,\n extraMessageDetail: t.detail,\n extraMessageErrorCode: t.code,\n };\n }\n if (obj instanceof Error)\n return {\n extraMessage: obj.toString(),\n extraMessageErrorCode: null,\n };\n if (typeof obj !== 'string')\n return {\n extraMessage: JSON.stringify(obj),\n extraMessageErrorCode: null,\n };\n return { extraMessage: obj, extraMessageErrorCode: null };\n};\n", "import type {\n RemoveNameField,\n Route,\n RouteEvent,\n Step,\n StepEvent,\n} from '../types';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { getConfig } from '../configs';\nimport {\n getCurrentStepTx,\n getFailedStep,\n getLastSuccessfulStep,\n getSwapInputUsd,\n getSwapOutputUsd,\n isApprovalCurrentStepTx,\n} from '../helpers';\nimport { getCurrentNamespaceOfOrNull } from '../shared';\nimport {\n EventSeverity,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n WidgetEvents,\n} from '../types';\n\nexport type NotifierParams = {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} & {\n event: RemoveNameField<StepEvent, 'message' | 'messageSeverity'>;\n};\n\nfunction createSteps(swapSteps: PendingSwapStep[]): Step[] {\n return swapSteps.map((swapStep) => {\n const {\n diagnosisUrl,\n estimatedTimeInSeconds,\n explorerUrl,\n feeInUsd,\n executedTransactionId,\n executedTransactionTime,\n expectedOutputAmountHumanReadable,\n fromBlockchain,\n toBlockchain,\n fromSymbol,\n toSymbol,\n fromSymbolAddress,\n toSymbolAddress,\n swapperType,\n swapperId,\n outputAmount,\n fromAmountMaxValue,\n fromAmountMinValue,\n fromAmountPrecision,\n fromAmountRestrictionType,\n fromDecimals,\n status: stepStatus,\n } = swapStep;\n\n const step: Step = {\n diagnosisUrl,\n estimatedTimeInSeconds,\n explorerUrl,\n feeInUsd,\n executedTransactionId,\n executedTransactionTime,\n expectedOutputAmountHumanReadable,\n fromBlockchain,\n toBlockchain,\n fromSymbol,\n toSymbol,\n fromSymbolAddress,\n toSymbolAddress,\n swapperName: swapperId,\n swapperType,\n outputAmount,\n fromAmountMaxValue,\n fromAmountMinValue,\n fromAmountPrecision,\n fromAmountRestrictionType,\n fromDecimals,\n status: stepStatus,\n transaction: getCurrentStepTx(swapStep),\n };\n\n return step;\n });\n}\n\nfunction getEventPayload(\n swap: PendingSwap,\n type: StepEventType | RouteEventType,\n swapStep?: PendingSwapStep\n): { route: Route; step: Step } {\n const {\n creationTime,\n finishTime,\n requestId,\n inputAmount,\n status,\n wallets,\n steps,\n settings,\n } = swap;\n\n const routeSteps = createSteps(steps);\n const route: Route = {\n creationTime,\n finishTime,\n requestId,\n inputAmount,\n status,\n wallets,\n steps: routeSteps,\n slippage: settings.slippage,\n infiniteApproval: settings.infiniteApprove,\n };\n\n const result: { route: Route; step: Step } = {\n route,\n step: routeSteps[routeSteps.length - 1],\n };\n if (swapStep) {\n result.step = createSteps([swapStep])[0];\n } else {\n if (type === 'failed') {\n const failedStep = getFailedStep(routeSteps);\n if (failedStep) {\n result.step = failedStep;\n }\n } else {\n const lastSuccessfulStep = getLastSuccessfulStep(routeSteps);\n if (lastSuccessfulStep) {\n result.step = lastSuccessfulStep;\n }\n }\n }\n\n return result;\n}\n\nfunction emitRouteEvent(stepEvent: StepEvent, route: Route, swap: PendingSwap) {\n let routeEvent: RouteEvent | undefined;\n const { type } = stepEvent;\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (type) {\n case StepEventType.STARTED:\n routeEvent = { ...stepEvent, type: RouteEventType.STARTED };\n break;\n case StepEventType.FAILED:\n routeEvent = {\n ...stepEvent,\n type: RouteEventType.FAILED,\n inputAmount: swap.inputAmount,\n inputAmountUsd: getSwapInputUsd(swap),\n };\n break;\n case StepEventType.SUCCEEDED: {\n routeEvent = {\n ...stepEvent,\n type: RouteEventType.SUCCEEDED,\n inputAmount: swap.inputAmount,\n inputAmountUsd: getSwapInputUsd(swap),\n outputAmount: swap.steps[swap.steps.length - 1].outputAmount ?? '',\n outputAmountUsd: getSwapOutputUsd(swap),\n };\n break;\n }\n default:\n break;\n }\n if (routeEvent) {\n const eventEmitter = getConfig('emitter');\n eventEmitter?.emit(WidgetEvents.RouteEvent, { event: routeEvent, route });\n }\n}\n\nfunction emitStepEvent(stepEvent: StepEvent, route: Route, step: Step) {\n const eventEmitter = getConfig('emitter');\n eventEmitter?.emit(WidgetEvents.StepEvent, { event: stepEvent, route, step });\n}\n\nexport function notifier(params: NotifierParams) {\n const { event } = params;\n const { type } = event;\n const { route, step } = getEventPayload(\n params.swap,\n type,\n params.step ?? undefined\n );\n const fromAsset = `${step.fromBlockchain}.${step.fromSymbol}`;\n const toAsset = `${step.toBlockchain}.${step.toSymbol}`;\n const outputAmount = step.outputAmount ?? '';\n const currentFromNamespace = !!params.step\n ? getCurrentNamespaceOfOrNull(params.swap, params.step)\n : null;\n let message = '';\n let messageSeverity: StepEvent['messageSeverity'] = EventSeverity.INFO;\n\n switch (type) {\n case StepEventType.STARTED:\n message = 'Swap process started';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.SUCCEEDED:\n message = `You received ${outputAmount} ${toAsset}, hooray!`;\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.FAILED:\n message = `Swap failed: ${\n params.swap?.extraMessage ?? 'Reason is unknown'\n }`;\n messageSeverity = EventSeverity.ERROR;\n break;\n case StepEventType.TX_EXECUTION:\n if (event.status === StepExecutionEventStatus.CREATE_TX) {\n message = 'Please wait while the transaction is created ...';\n messageSeverity = EventSeverity.INFO;\n } else if (event.status === StepExecutionEventStatus.SEND_TX) {\n if (params.step && isApprovalCurrentStepTx(params.step)) {\n message = `Please confirm '${step.swapperName}' smart contract access to ${fromAsset}`;\n } else {\n message = 'Please confirm transaction request in your wallet';\n }\n messageSeverity = EventSeverity.WARNING;\n } else if (event.status === StepExecutionEventStatus.TX_SENT) {\n message = 'Transaction sent successfully';\n messageSeverity = EventSeverity.INFO;\n }\n break;\n case StepEventType.CHECK_STATUS:\n if (params.step && isApprovalCurrentStepTx(params.step)) {\n message = 'Checking approve transaction status ...';\n } else {\n message = 'Checking transaction status ...';\n }\n messageSeverity = EventSeverity.INFO;\n break;\n case StepEventType.APPROVAL_TX_SUCCEEDED:\n message = 'Smart contract called successfully';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.OUTPUT_REVEALED:\n message = 'Transaction output amount revealed';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n\n case StepEventType.TX_EXECUTION_BLOCKED:\n if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT\n ) {\n message = 'Please connect your wallet.';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status === StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE\n ) {\n message = 'Waiting for other swaps to complete';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT\n ) {\n message = 'Please change your wallet account.';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE\n ) {\n message = `Please change your wallet network to ${currentFromNamespace?.network}.`;\n messageSeverity = EventSeverity.WARNING;\n }\n break;\n\n default:\n break;\n }\n\n if (params.step) {\n emitStepEvent({ ...event, message, messageSeverity }, route, step);\n }\n if (params.event.type === StepEventType.FAILED || !params.step) {\n emitRouteEvent({ ...event, message, messageSeverity }, route, params.swap);\n }\n}\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type { CreateTransactionRequest } from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\n\nimport {\n createStepFailedEvent,\n getCurrentStep,\n getCurrentStepTx,\n setCurrentStepTx,\n throwOnOK,\n updateSwapStatus,\n} from '../helpers';\nimport { httpService } from '../services';\nimport { notifier } from '../services/eventEmitter';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport {\n StepEventType,\n StepExecutionEventStatus,\n SwapActionTypes,\n} from '../types';\n\n/**\n *\n * When a user asks for a swap, We first create the transaction by sending a request to server\n * Server will return the transaction that need to be sent to wallet.\n * It can be failed if server goes through an error, If not, we will schedule the `EXECTUTE_TRANSACTION`.\n *\n */\nexport async function createTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setStorage, getStorage, next, schedule } = actions;\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n const transaction = getCurrentStepTx(currentStep);\n\n if (!transaction) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION,\n status: StepExecutionEventStatus.CREATE_TX,\n },\n swap,\n step: currentStep,\n });\n const request: CreateTransactionRequest = {\n requestId: swap.requestId,\n step: currentStep.id,\n userSettings: {\n slippage: swap.settings.slippage,\n infiniteApprove: swap.settings.infiniteApprove,\n },\n validations: {\n balance: swap.validateBalanceOrFee,\n fee: swap.validateBalanceOrFee,\n approve: true,\n },\n };\n try {\n // Getting transcation from server.\n\n const { transaction } = await throwOnOK(\n httpService().createTransaction(request)\n );\n\n if (transaction) {\n setCurrentStepTx(currentStep, transaction);\n }\n\n setStorage({ ...getStorage(), swapDetails: swap });\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n next();\n } catch (error: unknown) {\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n const { extraMessage, extraMessageDetail } = prettifyErrorMessage(error);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: 'FETCH_TX_FAILED',\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n\n if (error instanceof Error) {\n warn(new Error('create transaction error'), {\n tags: {\n message: error.message,\n requestBody: request,\n reason: event.reason,\n reasonCode: event.reasonCode,\n pendingSwap: swap,\n },\n });\n }\n\n actions.failed();\n }\n }\n}\n", "import type { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport {\n ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET,\n} from '../constants';\nimport {\n claimQueue,\n getCurrentStep,\n getRequiredWallet,\n isNeedBlockQueueForParallel,\n isNetworkMatchedForTransaction,\n isRequiredWalletConnected,\n isWalletNull,\n signTransaction,\n updateNetworkStatus,\n} from '../helpers';\nimport { getCurrentNamespaceOf } from '../shared';\nimport { BlockReason } from '../types';\n\n/**\n * Excecute a created transaction.\n *\n * This function implemented the parallel mode by `claim` mechanism which means\n * All the queues the meet certain situation (like multiple evm transaction) will go through\n * a `claim` mechanims that decides which queue should be run and it blocks other ones.\n *\n * A queue will be go to sign process, if the wallet and network is matched.\n */\nexport async function executeTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { getStorage, context } = actions;\n const { meta, wallets, providers } = context;\n const { claimedBy } = claimQueue();\n\n const isClaimed = context.claimedBy === context._queue?.id;\n const requestBlock: typeof actions.block = (blockedFor) => {\n actions.block(blockedFor);\n if (isClaimed && actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n\n /* Make sure wallet is connected and also the connected wallet is matched with tx by checking address. */\n const isWrongAddress = !isRequiredWalletConnected(swap, context.state).ok;\n if (isWrongAddress) {\n const { type, address } = getRequiredWallet(swap);\n const isWalletInCompatible = wallets?.blockchains?.find(\n (w) => !w.accounts?.find((account) => account.walletType === type)\n );\n const description =\n isWalletNull(wallets) || isWalletInCompatible\n ? ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type)\n : ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET(type, address);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n };\n requestBlock(blockedFor);\n return;\n }\n\n /* Wallet should be on correct network */\n const networkMatched = await isNetworkMatchedForTransaction(\n swap,\n currentStep,\n wallets,\n meta,\n providers\n );\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId && !isClaimed;\n if (isClaimedByAnyQueue && !networkMatched) {\n const details = ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES;\n\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else if (!networkMatched) {\n const fromNamespace = getCurrentNamespaceOf(swap, currentStep);\n const details = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(\n fromNamespace.network\n );\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n }\n // Update network to mark it as network changed successfully.\n updateNetworkStatus(actions, {\n message: '',\n details: 'The network has been successfully changed.',\n status: PendingSwapNetworkStatus.NetworkChanged,\n });\n\n /*\n *For avoiding conflict by making too many requests to wallet, we need to make sure\n *We only run one request at a time (In parallel mode).\n */\n const needsToBlockQueue = isNeedBlockQueueForParallel(currentStep);\n\n if (needsToBlockQueue && !isClaimed) {\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n description: ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n details: {},\n };\n requestBlock(blockedFor);\n return;\n }\n\n // All the conditions are met. We can safely send the tx to wallet for sign.\n await signTransaction(actions);\n}\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport {\n getCurrentStep,\n getLastFinishedStepInput,\n getLastFinishedStepInputUsd,\n getLastSuccessfulStep,\n getLastSuccessfulStepOutputUsd,\n isTxAlreadyCreated,\n} from '../helpers';\nimport { notifier } from '../services/eventEmitter';\nimport { StepEventType, SwapActionTypes } from '../types';\n\n/**\n *\n * This function is responsibe for scheduling the correct `action` based on `PendingSwap` status.\n * It means `action`s schedule this step to decide what should be the next step/task.\n *\n * It's acts like a `while(true)` and will `break` the loop on certain `action`s like `CHECK_STATUS`.\n *\n *\n */\nexport function scheduleNextStep({\n schedule,\n next,\n failed,\n setStorage,\n getStorage,\n}: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>): void {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const isFailed = swap.steps.find(\n (step: PendingSwapStep) => step.status === 'failed'\n );\n\n if (!!currentStep && !isFailed) {\n if (isTxAlreadyCreated(swap, currentStep)) {\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n return next();\n }\n\n if (currentStep?.executedTransactionId) {\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n return next();\n }\n\n swap.status = 'running';\n\n setStorage({ ...getStorage(), swapDetails: swap });\n\n notifier({\n event: { type: StepEventType.STARTED },\n swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.CREATE_TRANSACTION);\n next();\n } else {\n swap.status = isFailed ? 'failed' : 'success';\n swap.finishTime = new Date().getTime().toString();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n const inputAmount = getLastFinishedStepInput(swap);\n const inputAmountUsd = getLastFinishedStepInputUsd(swap);\n\n notifier({\n ...(isFailed\n ? {\n event: {\n type: StepEventType.FAILED,\n reason: swap.extraMessage ?? undefined,\n reasonCode: 'CALL_OR_SEND_FAILED',\n inputAmount,\n inputAmountUsd,\n },\n }\n : {\n event: {\n type: StepEventType.SUCCEEDED,\n inputAmount,\n inputAmountUsd,\n outputAmount:\n getLastSuccessfulStep(swap.steps)?.outputAmount ?? '',\n outputAmountUsd: getLastSuccessfulStepOutputUsd(swap),\n },\n }),\n swap: swap,\n step: null,\n });\n\n if (isFailed) {\n failed();\n } else {\n next();\n }\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { StepEventType, SwapActionTypes, SwapStorage } from '../types';\nimport { notifier } from '../services/eventEmitter';\n\nexport function start({\n schedule,\n next,\n getStorage,\n}: ExecuterActions<SwapStorage, SwapActionTypes>): void {\n const swap = getStorage().swapDetails;\n\n notifier({ event: { type: StepEventType.STARTED }, swap, step: null });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n}\n", "import { BlockReason, SwapActionTypes, SwapQueueDef } from './types';\nimport { checkStatus } from './actions/checkStatus';\nimport { createTransaction } from './actions/createTransaction';\nimport { executeTransaction } from './actions/executeTransaction';\nimport { scheduleNextStep } from './actions/scheduleNextStep';\nimport { start } from './actions/start';\nimport {\n onBlockForChangeNetwork,\n onBlockForConnectWallet,\n onDependsOnOtherQueues,\n} from './helpers';\n\n/**\n *\n * The idea behind this queue is to be able dynamically add some steps.\n * After running a swap, it can be blocked (like on waiting for switch netwrok)\n * or waits for something happend (like checking status of a transaction from server)\n *\n */\nexport const swapQueueDef: SwapQueueDef = {\n name: 'swap',\n actions: {\n [SwapActionTypes.START]: start,\n [SwapActionTypes.SCHEDULE_NEXT_STEP]: scheduleNextStep,\n [SwapActionTypes.CREATE_TRANSACTION]: createTransaction,\n [SwapActionTypes.EXECUTE_TRANSACTION]: executeTransaction,\n [SwapActionTypes.CHECK_TRANSACTION_STATUS]: checkStatus,\n },\n run: [SwapActionTypes.START],\n whenTaskBlocked: (event, meta) => {\n if (event.reason.reason === BlockReason.WAIT_FOR_CONNECT_WALLET) {\n onBlockForConnectWallet(event, meta);\n } else if (event.reason.reason === BlockReason.WAIT_FOR_NETWORK_CHANGE) {\n onBlockForChangeNetwork(event, meta);\n } else if (event.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES) {\n onDependsOnOtherQueues(event, meta);\n }\n },\n};\n", "import type { LastConnectedWallet, UseQueueManagerParams } from './types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect, useState } from 'react';\n\nimport {\n checkWaitingForConnectWalletChange,\n checkWaitingForNetworkChange,\n retryOn,\n} from './helpers';\nimport { migrated, migration } from './migration';\n\nlet isCalled = 0;\n\nfunction getLastConnectedWalletHash(\n lastConnectedWallet: LastConnectedWallet | null\n) {\n return `${lastConnectedWallet?.walletType}-${\n lastConnectedWallet?.network\n }-${lastConnectedWallet?.accounts?.toString()}`;\n}\n\n/**\n *\n * Runs a migration (old swaps from localstorage to queue manager's IndexedDB)\n * It will be run only once on page load.\n *\n */\nfunction useMigration(): {\n status: boolean;\n} {\n const isMigrated = migrated();\n const [status, setStatus] = useState<boolean>(isMigrated);\n\n useEffect(() => {\n void (async () => {\n // Preventing react to be called twice on Strict Mode (development)\n if (isCalled) {\n return;\n }\n isCalled = 1;\n\n void migration().finally(() => {\n setStatus(true);\n });\n })();\n }, []);\n\n return {\n status,\n };\n}\n\n/**\n *\n * On initial load and also connect/disconnect we may need to update swap's notified message.\n * And also if a new wallet is connected we will retry the queue to see we can resume it or not.\n *\n */\nfunction useQueueManager(params: UseQueueManagerParams): void {\n const { manager } = useManager();\n const {\n lastConnectedWallet,\n disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n clearDisconnectedWallet,\n } = params;\n\n useEffect(() => {\n if (lastConnectedWallet) {\n checkWaitingForConnectWalletChange({\n evmChains,\n lastConnectedWallet,\n manager,\n });\n retryOn(lastConnectedWallet, manager, canSwitchNetworkTo);\n }\n }, [getLastConnectedWalletHash(lastConnectedWallet)]);\n\n useEffect(() => {\n if (disconnectedWallet) {\n checkWaitingForNetworkChange(manager);\n\n /*\n *We need to reset the state value, so if a wallet disconnected twice (after reconnect),\n *this effect will be run properly.\n */\n clearDisconnectedWallet();\n }\n }, [disconnectedWallet]);\n}\n\nexport { useQueueManager, useMigration };\n", "import type { PersistedQueue } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types';\n\nimport { DB_NAME, Persistor, Status } from '@rango-dev/queue-manager-core';\nimport { v4 as uuid } from 'uuid';\n\nimport { SwapActionTypes } from './types';\n\nconst MIGRATED_KEY = 'migratedToQueueManager';\n\n/**\n *\n * If `MIGRATED_KEY` is set, it means we already migrated data from localstorage.\n *\n */\nfunction migrated(): boolean {\n return !!window.localStorage.getItem(MIGRATED_KEY);\n}\n\nasync function hasQueueManagerOnIDB(): Promise<boolean> {\n try {\n return (await (window.indexedDB as any).databases())\n .map((db: any) => db.name)\n .includes(DB_NAME);\n } catch {\n return false;\n }\n}\n\n/**\n *\n * By calling this function, we first check if the data already migrated or not,\n * If not, starting to migrating to IndexedDb with proper format that queue manager is understand.\n *\n */\nasync function migration(): Promise<boolean> {\n const swapsFromStorage = window.localStorage.getItem('pendingSwaps');\n const hasIndexDB = await hasQueueManagerOnIDB();\n\n // For new users or already migrated.\n if (!swapsFromStorage || migrated() || hasIndexDB) {\n return true;\n }\n\n // For old users, but they didn't do any swaps yet.\n const swaps: PendingSwap[] = JSON.parse(swapsFromStorage);\n const convertedSwaps: PersistedQueue[] = [];\n\n swaps.forEach((swap) => {\n /*\n *For running task we need to add some more work\n *We need to create a queue task to be run and resume the running task from queue manager.\n */\n if (swap.status === 'running') {\n const taskId = uuid();\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status: Status.RUNNING,\n storage: {\n swapDetails: swap,\n },\n state: {\n status: Status.RUNNING,\n activeTaskIndex: 0,\n tasks: {\n [taskId]: {\n blockedFor: null,\n status: Status.RUNNING,\n },\n },\n },\n tasks: [\n {\n id: taskId,\n action: SwapActionTypes.SCHEDULE_NEXT_STEP,\n },\n ],\n };\n convertedSwaps.push(convertedSwap);\n } else {\n /*\n * For failed or successful swaps, we only move it to IndexedDB,\n * And there is no need to consider them to be run.\n */\n const status = swap.status === 'success' ? Status.SUCCESS : Status.FAILED;\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status,\n storage: {\n swapDetails: swap,\n },\n state: {\n status,\n activeTaskIndex: 0,\n tasks: {},\n },\n tasks: [],\n };\n\n convertedSwaps.push(convertedSwap);\n }\n });\n\n // Getting an instance from persistor, so we can directly put our data inside it.\n const persistor = new Persistor();\n\n const promises = convertedSwaps.map(async (queue) =>\n persistor.insertQueue(queue)\n );\n await Promise.all(promises);\n\n // Mark as the data has been successfully migrated.\n window.localStorage.setItem(MIGRATED_KEY, '1');\n\n return true;\n}\n\nexport { migration, migrated };\n", "import type { Configs } from './configs';\nimport type { SwapQueueDef } from './types';\n\nimport { initConfig } from './configs';\nimport { swapQueueDef } from './queueDef';\n\nexport { PrettyError, prettifyErrorMessage } from './shared-errors';\nexport type {\n SwapQueueContext,\n SwapStorage,\n RouteExecutionEvents,\n Route,\n Step,\n RouteEvent,\n StepEvent,\n RouteEventData,\n StepEventData,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n LastConnectedWallet,\n} from './types';\nexport {\n WidgetEvents,\n StepEventType,\n RouteEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n EventSeverity,\n} from './types';\nexport type {\n PendingSwapWithQueueID,\n EventType,\n TargetNamespace,\n} from './shared';\nexport {\n getCurrentNamespaceOfOrNull,\n getRelatedWalletOrNull,\n getRelatedWallet,\n MessageSeverity,\n calculatePendingSwap,\n getUsdPrice,\n} from './shared';\nexport {\n updateSwapStatus,\n checkWaitingForNetworkChange,\n getCurrentStep,\n cancelSwap,\n getRequiredWallet,\n getRunningSwaps,\n resetRunningSwapNotifsOnPageLoad,\n isApprovalTX,\n getLastSuccessfulStep,\n} from './helpers';\nexport { useMigration, useQueueManager } from './hooks';\n\nexport function makeQueueDefinition(configs: Configs): SwapQueueDef {\n initConfig(configs);\n return swapQueueDef;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "configs", "__name", "WidgetEvents", "RouteEventType", "StepExecutionEventStatus", "StepExecutionBlockedEventStatus", "StepEventType", "EventSeverity", "warn", "SignerError", "warn", "Status", "readAccountAddress", "getBlockChainNameFromId", "getEvmProvider", "BigNumber", "PendingSwapNetworkStatus", "SignerError", "TransactionType", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "ERROR_MESSAGE_WAIT_FOR_WALLET", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "__name", "type", "address", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "network", "DEFAULT_ERROR_CODE", "RangoClient", "rango", "httpService", "__name", "RangoClient", "getConfig", "BigNumber", "BigNumber", "numberToString", "__name", "number", "minDecimals", "maxDecimals", "n", "BigNumber", "roundingMode", "maxI", "i", "SignerErrorCode", "SignerError", "isSignerErrorCode", "isAPIErrorCode", "ERROR_ASSERTION_FAILED", "ERROR_CREATE_TRANSACTION", "ERROR_INPUT_WALLET_NOT_FOUND", "PrettyError", "_PrettyError", "code", "m", "root", "detail", "__name", "obj", "rawMessage", "rootStr", "message", "statusCode", "mapAppErrorCodesToAPIErrorCode", "errorCode", "isAPIErrorCode", "isSignerErrorCode", "SignerErrorCode", "DEFAULT_ERROR_CODE", "prettifyErrorMessage", "SignerError", "MessageSeverity", "getCurrentNamespaceOfOrNull", "__name", "swap", "step", "getCurrentNamespaceOf", "evmNetwork", "starknetNetwork", "tronNetwork", "cosmosNetwork", "solanaNetwork", "tonNetwork", "suiNetwork", "transferAddress", "PrettyError", "utxoNetwork", "network", "getScannerUrl", "txHash", "blockchainMetaMap", "baseUrl", "getNextStep", "currentStep", "getCurrentWalletTypeAndAddress", "result", "wallet", "getCurrentAddressOf", "getRelatedWallet", "address", "type", "walletKV", "k", "v", "blockchain", "walletType", "getRelatedWalletOrNull", "getUsdPrice", "symbol", "allTokens", "t", "getUsdFeeOfStep", "totalFeeInUsd", "BigNumber", "i", "fee", "unitPrice", "mapSwapStepToPendingSwapStep", "meta", "numberToString", "calculatePendingSwap", "inputAmount", "bestRoute", "wallets", "settings", "validateBalanceOrFee", "simulationResult", "index", "stepRoute", "internalSwap", "createSteps", "swapSteps", "swapStep", "diagnosisUrl", "estimatedTimeInSeconds", "explorerUrl", "feeInUsd", "executedTransactionId", "executedTransactionTime", "expectedOutputAmountHumanReadable", "fromBlockchain", "toBlockchain", "fromSymbol", "toSymbol", "fromSymbolAddress", "toSymbolAddress", "swapperType", "swapperId", "outputAmount", "fromAmountMaxValue", "fromAmountMinValue", "fromAmountPrecision", "fromAmountRestrictionType", "fromDecimals", "stepStatus", "getCurrentStepTx", "__name", "getEventPayload", "swap", "type", "creationTime", "finishTime", "requestId", "inputAmount", "status", "wallets", "steps", "settings", "routeSteps", "result", "failedStep", "getFailedStep", "lastSuccessfulStep", "getLastSuccessfulStep", "emitRouteEvent", "stepEvent", "route", "routeEvent", "getSwapInputUsd", "getSwapOutputUsd", "getConfig", "emitStepEvent", "step", "notifier", "params", "event", "fromAsset", "toAsset", "currentFromNamespace", "getCurrentNamespaceOfOrNull", "message", "messageSeverity", "isApprovalCurrentStepTx", "swapClaimedBy", "claimQueue", "queue_id", "__name", "swapTransactionToDataMap", "inMemoryTransactionsData", "hash", "data", "getCurrentStep", "swap", "step", "getCurrentStepTx", "currentStep", "evmTransaction", "evmApprovalTransaction", "cosmosTransaction", "solanaTransaction", "transferTransaction", "starknetApprovalTransaction", "starknetTransaction", "tronApprovalTransaction", "tronTransaction", "tonTransaction", "suiTransaction", "setCurrentStepTx", "transaction", "txType", "TransactionType", "x", "getCurrentStepTxType", "isApprovalCurrentStepTx", "updateSwapStatus", "getStorage", "setStorage", "nextStatus", "nextStepStatus", "message", "details", "errorCode", "hasAlreadyProceededToSign", "trace", "updatedResult", "errorReason", "walletType", "getRelatedWalletOrNull", "failureType", "mapAppErrorCodesToAPIErrorCode", "errorReasonForAPI", "httpService", "setStepTransactionIds", "txId", "explorerUrl", "notifier", "markRunningSwapAsWaitingForConnectingWallet", "reason", "reasonDetail", "currentTime", "PendingSwapNetworkStatus", "markRunningSwapAsSwitchingNetwork", "type", "getRequiredWallet", "fromNamespace", "getCurrentNamespaceOf", "markRunningSwapAsDependsOnOtherQueues", "delay", "ms", "res", "getSwapWalletType", "network", "isWalletNull", "wallet", "currentNamespace", "getCurrentNamespaceOfOrNull", "sourceWallet", "getChainId", "provider", "isNetworkMatchedForTransaction", "meta", "providers", "evmBlochain", "getEvmProvider", "chainId", "blockChain", "getBlockChainNameFromId", "blockchainMeta", "e", "isTxAlreadyCreated", "resetNetworkStatus", "actions", "updateNetworkStatus", "status", "onBlockForConnectWallet", "event", "context", "queue", "ok", "isRequiredWalletConnected", "address", "ERROR_MESSAGE_WAIT_FOR_WALLET", "onBlockForChangeNetwork", "_event", "result", "requiredNetwork", "requiredWallet", "currentNetwork", "namespace", "error", "onDependsOnOtherQueues", "getBlockedTasks", "forceExecute", "manager", "setClaimer", "claimedBy", "reset", "blockedTasks", "task", "claimerId", "isClaimedByAnyQueue", "claimedStorage", "retryOn", "getState", "walletState", "accounts", "connected", "connectedAccounts", "account", "accountAddress", "readAccountAddress", "signTransaction", "setTransactionDataByHash", "failed", "next", "schedule", "getSigners", "isMobileWallet", "getRelatedWallet", "mobileWallet", "walletAddress", "getCurrentAddressOf", "currentStepNamespace", "onFinish", "tx", "isApproval", "extraMessage", "updateResult", "getLastFinishedStepInput", "getLastFinishedStepInputUsd", "eventType", "DEFAULT_ERROR_CODE", "response", "getScannerUrl", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "warn", "SignerError", "checkWaitingForConnectWalletChange", "params", "lastConnectedWallet", "evmChains", "chain", "q", "queueStorage", "currentStepRequiredWallet", "hasWaitingForConnect", "taskId", "Status", "queueInstance", "description", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "checkWaitingForNetworkChange", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "getRunningSwaps", "queues", "resetRunningSwapNotifsOnPageLoad", "runningSwaps", "eventSubtype", "canSwitchNetworkTo", "options", "walletAndNetworkMatched", "onlyWalletMatched", "finalQueueToBeRun", "i", "currentQueue", "finalQueueStorage", "currentSwap", "isNeedBlockQueueForParallel", "throwOnOK", "rawResponse", "responseBody", "PrettyError", "cancelSwap", "getLastSuccessfulStep", "steps", "getFailedStep", "isApprovalTX", "getTokenAmountInUsd", "amount", "usdPrice", "usdValue", "BigNumber", "getSwapInputUsd", "getSwapOutputUsd", "lastStep", "getLastFinishedStep", "FINISHED_STATUS", "lastFinishedStepIndex", "lastFinishedStep", "lastSuccessfulStep", "getLastSuccessfulStepOutputUsd", "createStepFailedEvent", "reasonCode", "INTERVAL_FOR_CHECK_STATUS", "INTERVAL_FOR_CHECK_APPROVAL", "checkTransactionStatus", "getStorage", "setStorage", "next", "schedule", "retry", "failed", "context", "swap", "meta", "checkStatusError", "currentStep", "getCurrentStep", "tx", "getCurrentStepTx", "txId", "getTxReceiptFailed", "status", "signer", "getTransactionDataByHash", "setTransactionDataByHash", "inMemoryTransactionsData", "txType", "getCurrentStepTxType", "sourceWallet", "getRelatedWallet", "txResponse", "receiptReceived", "chainId", "updatedTxHash", "updatedTxResponse", "currentStepNamespace", "getCurrentNamespaceOf", "explorerUrl", "getScannerUrl", "error", "extraMessage", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "event", "createStepFailedEvent", "warn", "SignerError", "requestBody", "httpService", "delay", "outputAmount", "prevOutputAmount", "newTransaction", "setCurrentStepTx", "notifier", "nextStep", "getNextStep", "getLastFinishedStepInput", "getLastFinishedStepInputUsd", "getLastSuccessfulStepOutputUsd", "__name", "checkApprovalStatus", "checkApprovalStatusError", "isApproved", "request", "response", "message", "details", "checkStatus", "actions", "resetNetworkStatus", "warn", "createTransaction", "actions", "setStorage", "getStorage", "next", "schedule", "swap", "currentStep", "getCurrentStep", "getCurrentStepTx", "notifier", "request", "transaction", "throwOnOK", "httpService", "setCurrentStepTx", "error", "extraMessage", "extraMessageDetail", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "event", "createStepFailedEvent", "warn", "__name", "PendingSwapNetworkStatus", "executeTransaction", "actions", "getStorage", "context", "meta", "wallets", "providers", "claimedBy", "claimQueue", "isClaimed", "requestBlock", "__name", "blockedFor", "swap", "currentStep", "getCurrentStep", "isRequiredWalletConnected", "type", "address", "getRequiredWallet", "isWalletInCompatible", "w", "account", "description", "isWalletNull", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "networkMatched", "isNetworkMatchedForTransaction", "details", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "fromNamespace", "getCurrentNamespaceOf", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "updateNetworkStatus", "PendingSwapNetworkStatus", "isNeedBlockQueueForParallel", "signTransaction", "scheduleNextStep", "schedule", "next", "failed", "setStorage", "getStorage", "swap", "currentStep", "getCurrentStep", "isFailed", "step", "isTxAlreadyCreated", "notifier", "inputAmount", "getLastFinishedStepInput", "inputAmountUsd", "getLastFinishedStepInputUsd", "getLastSuccessfulStep", "getLastSuccessfulStepOutputUsd", "__name", "start", "schedule", "next", "getStorage", "swap", "notifier", "__name", "swapQueueDef", "start", "scheduleNextStep", "createTransaction", "executeTransaction", "checkStatus", "event", "meta", "onBlockForConnectWallet", "onBlockForChangeNetwork", "onDependsOnOtherQueues", "useManager", "useEffect", "useState", "DB_NAME", "Persistor", "Status", "uuid", "MIGRATED_KEY", "migrated", "__name", "hasQueueManagerOnIDB", "db", "DB_NAME", "migration", "swapsFromStorage", "hasIndexDB", "swaps", "convertedSwaps", "swap", "taskId", "uuid", "convertedSwap", "Status", "status", "persistor", "Persistor", "promises", "queue", "isCalled", "getLastConnectedWalletHash", "lastConnectedWallet", "__name", "useMigration", "isMigrated", "migrated", "status", "setStatus", "useState", "useEffect", "migration", "useQueueManager", "params", "manager", "useManager", "disconnectedWallet", "evmChains", "canSwitchNetworkTo", "clearDisconnectedWallet", "checkWaitingForConnectWalletChange", "retryOn", "checkWaitingForNetworkChange", "makeQueueDefinition", "configs", "initConfig", "swapQueueDef", "__name"]
|
|
4
|
+
"sourcesContent": ["import type { RouteExecutionEvents } from './types';\n\ninterface Emitter<Events extends Record<string, unknown>> {\n emit<K extends keyof Events>(type: K, event: Events[K]): void;\n}\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n emitter?: Emitter<RouteExecutionEvents>;\n}\n\n/*\n * this API key is limited and\n * it is only for test purpose\n */\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n BASE_URL: '',\n};\n\nexport function getConfig<K extends keyof Configs>(name: K): Configs[K] {\n return configs[name];\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n configs = nextConfigs;\n return configs;\n}\n", "import type { TargetNamespace, Wallet } from './shared';\nimport type {\n QueueContext,\n QueueDef,\n QueueStorage,\n} from '@rango-dev/queue-manager-core';\nimport type { LegacyConnectResult as ConnectResult } from '@rango-dev/wallets-core/legacy';\nimport type {\n Meta,\n Network,\n Providers,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { Transaction } from 'rango-sdk';\nimport type {\n APIErrorCode,\n EvmBlockchainMeta,\n PendingSwap,\n PendingSwapStep,\n SignerFactory,\n} from 'rango-types';\n\nexport type RemoveNameField<T, U extends string> = {\n [Property in keyof T as Exclude<Property, U>]: T[Property];\n};\n\nexport type ArrayElement<A> = A extends readonly (infer T)[] ? T : never;\n\nexport type SwapQueueDef = QueueDef<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>;\n\nexport interface SwapStorage extends QueueStorage {\n swapDetails: PendingSwap;\n}\n\nexport enum SwapActionTypes {\n START = 'START',\n SCHEDULE_NEXT_STEP = 'SCHEDULE_NEXT_STEP',\n CREATE_TRANSACTION = 'CREATE_TRANSACTION',\n EXECUTE_TRANSACTION = 'EXECUTE_TRANSACTION',\n CHECK_TRANSACTION_STATUS = 'CHECK_TRANSACTION_STATUS',\n}\n\nexport type GetCurrentAddress = (\n type: WalletType,\n network: Network\n) => string | undefined;\n\nexport enum BlockReason {\n WAIT_FOR_CONNECT_WALLET = 'waiting_for_connecting_wallet',\n WAIT_FOR_NETWORK_CHANGE = 'waiting_for_network_change',\n DEPENDS_ON_OTHER_QUEUES = 'depends_on_other_queues',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Block<T = any> {\n reason: BlockReason;\n description: string;\n details?: T;\n}\n\nexport interface SwapQueueContext extends QueueContext {\n meta: Meta;\n wallets: Wallet | null;\n providers: Providers;\n getSigners: (type: WalletType) => Promise<SignerFactory>;\n switchNetwork: (\n wallet: WalletType,\n namespaces: TargetNamespace\n ) => Promise<ConnectResult | ConnectResult[] | undefined> | undefined;\n canSwitchNetworkTo: UseQueueManagerParams['canSwitchNetworkTo'];\n state: (type: WalletType) => WalletState;\n isMobileWallet: (type: WalletType) => boolean;\n\n // Dynamically will be added to context.\n claimedBy?: string;\n resetClaimedBy?: () => void;\n}\n\nexport type LastConnectedWallet = {\n walletType: string;\n network?: string;\n accounts?: string[];\n};\n\nexport interface UseQueueManagerParams {\n lastConnectedWallet: LastConnectedWallet | null;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n evmChains: EvmBlockchainMeta[];\n canSwitchNetworkTo: (\n type: WalletType,\n network: Network,\n namespace: TargetNamespace\n ) => boolean;\n}\n\nexport enum WidgetEvents {\n RouteEvent = 'routeEvent',\n StepEvent = 'stepEvent',\n}\n\nexport type Step = Pick<\n PendingSwapStep,\n | 'diagnosisUrl'\n | 'estimatedTimeInSeconds'\n | 'explorerUrl'\n | 'feeInUsd'\n | 'executedTransactionId'\n | 'executedTransactionTime'\n | 'expectedOutputAmountHumanReadable'\n | 'fromBlockchain'\n | 'toBlockchain'\n | 'fromSymbol'\n | 'toSymbol'\n | 'toSymbolAddress'\n | 'fromSymbolAddress'\n | 'swapperType'\n | 'outputAmount'\n | 'fromAmountMaxValue'\n | 'fromAmountMinValue'\n | 'fromAmountPrecision'\n | 'fromAmountRestrictionType'\n | 'fromDecimals'\n | 'status'\n> & { swapperName: string; transaction: Transaction | null };\n\nexport type Route = Pick<\n PendingSwap,\n | 'creationTime'\n | 'finishTime'\n | 'requestId'\n | 'inputAmount'\n | 'status'\n | 'wallets'\n> & { steps: Step[]; slippage: string; infiniteApproval?: boolean };\n\nexport type SwapEvent = RouteEvent | StepEvent;\n\nexport enum RouteEventType {\n STARTED = 'started',\n FAILED = 'failed',\n SUCCEEDED = 'succeeded',\n}\n\nexport enum StepExecutionEventStatus {\n CREATE_TX = 'create_tx',\n SEND_TX = 'send_tx',\n TX_SENT = 'tx_sent',\n}\n\nexport enum StepExecutionBlockedEventStatus {\n WAITING_FOR_QUEUE = 'waiting_for_queue',\n WAITING_FOR_WALLET_CONNECT = 'waiting_for_wallet_connect',\n WAITING_FOR_NETWORK_CHANGE = 'waiting_for_network_change',\n WAITING_FOR_CHANGE_WALLET_ACCOUNT = 'waiting_for_change_wallet_account',\n}\n\nexport enum StepEventType {\n STARTED = 'started',\n FAILED = 'failed',\n SUCCEEDED = 'succeeded',\n TX_EXECUTION = 'tx_execution',\n TX_EXECUTION_BLOCKED = 'tx_execution_blocked',\n APPROVAL_TX_SUCCEEDED = 'approval_tx_succeeded',\n CHECK_STATUS = 'check_status',\n OUTPUT_REVEALED = 'output_revealed',\n}\n\nexport enum EventSeverity {\n ERROR = 'error',\n SUCCESS = 'success',\n WARNING = 'warning',\n INFO = 'info',\n}\n\nexport type Event<\n T extends StepEventType | RouteEventType,\n U extends Record<string, unknown> = Record<string, unknown>\n> = {\n type: T;\n message: string;\n messageSeverity: EventSeverity;\n} & U;\n\nexport type FailedRouteEventPayload = {\n inputAmount: string;\n inputAmountUsd: string;\n reason?: string;\n reasonCode: APIErrorCode;\n};\n\nexport type FailedStepEventPayload = FailedRouteEventPayload;\n\nexport type SucceededRouteEventPayload = {\n inputAmount: string;\n inputAmountUsd: string;\n outputAmount: string;\n outputAmountUsd: string;\n};\n\nexport type SucceededStepEventPayload = SucceededRouteEventPayload;\n\nexport type OutputRevealedEventPayload = { outputAmount: string };\n\nexport type StepExecutionEventPayload = {\n status:\n | StepExecutionEventStatus.CREATE_TX\n | StepExecutionEventStatus.SEND_TX\n | StepExecutionEventStatus.TX_SENT;\n};\n\nexport type StepBlockedEventPayload =\n | { status: StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT;\n requiredWallet?: string;\n requiredAccount?: string;\n }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT;\n requiredAccount?: string;\n }\n | {\n status: StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE;\n currentNetwork?: string;\n requiredNetwork?: string;\n };\n\nexport type RouteStartedEvent = Event<RouteEventType.STARTED>;\n\nexport type RouteFailedEvent = Event<\n RouteEventType.FAILED,\n FailedRouteEventPayload\n>;\n\nexport type RouteSucceededEvent = Event<\n RouteEventType.SUCCEEDED,\n SucceededRouteEventPayload\n>;\n\nexport type StepStartedEvent = Event<StepEventType.STARTED>;\n\nexport type StepSucceededEvent = Event<\n StepEventType.SUCCEEDED,\n SucceededStepEventPayload\n>;\nexport type StepFailedEvent = Event<\n StepEventType.FAILED,\n FailedStepEventPayload\n>;\n\nexport type StepTxExecutionUpdatedEvent = Event<\n StepEventType.TX_EXECUTION,\n StepExecutionEventPayload\n>;\n\nexport type StepTxExecutionBlockedEvent = Event<\n StepEventType.TX_EXECUTION_BLOCKED,\n StepBlockedEventPayload\n>;\n\nexport type StepCheckStatusEvent = Event<StepEventType.CHECK_STATUS>;\n\nexport type StepApprovalTxSucceededEvent =\n Event<StepEventType.APPROVAL_TX_SUCCEEDED>;\n\nexport type StepOutputRevealedEvent = Event<\n StepEventType.OUTPUT_REVEALED,\n OutputRevealedEventPayload\n>;\n\nexport type StepEvent =\n | StepStartedEvent\n | StepSucceededEvent\n | StepFailedEvent\n | StepTxExecutionUpdatedEvent\n | StepTxExecutionBlockedEvent\n | StepCheckStatusEvent\n | StepApprovalTxSucceededEvent\n | StepOutputRevealedEvent;\n\nexport type RouteEvent =\n | RouteStartedEvent\n | RouteSucceededEvent\n | RouteFailedEvent;\n\nexport type RouteEventData = { route: Route; event: RouteEvent };\nexport type StepEventData = { route: Route; step: Step; event: StepEvent };\n\nexport type RouteExecutionEvents = {\n [WidgetEvents.RouteEvent]: RouteEventData;\n [WidgetEvents.StepEvent]: StepEventData;\n};\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type {\n CheckTxStatusRequest,\n Transaction,\n TransactionStatusResponse,\n} from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { type GenericSigner, SignerError } from 'rango-types';\n\nimport {\n createStepFailedEvent,\n delay,\n getCurrentStep,\n getCurrentStepTx,\n getCurrentStepTxType,\n getLastFinishedStepInput,\n getLastFinishedStepInputUsd,\n getLastSuccessfulStepOutputUsd,\n inMemoryTransactionsData,\n resetNetworkStatus,\n setCurrentStepTx,\n updateSwapStatus,\n} from '../helpers';\nimport { httpService } from '../services';\nimport { notifier } from '../services/eventEmitter';\nimport {\n getCurrentNamespaceOf,\n getNextStep,\n getRelatedWallet,\n getScannerUrl,\n MessageSeverity,\n} from '../shared';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport { StepEventType, SwapActionTypes } from '../types';\n\nconst INTERVAL_FOR_CHECK_STATUS = 5_000;\nconst INTERVAL_FOR_CHECK_APPROVAL = 5_000;\n\n/**\n * Subscribe to status of swap transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkTransactionStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n const checkStatusError = new Error('check status Error');\n\n const currentStep = getCurrentStep(swap)!;\n\n if (!currentStep?.executedTransactionId) {\n return;\n }\n const tx = getCurrentStepTx(currentStep);\n let txId = currentStep.executedTransactionId;\n let getTxReceiptFailed = false;\n let status: TransactionStatusResponse | null = null;\n let signer: GenericSigner<Transaction> | null = null;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n inMemoryTransactionsData();\n\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet) {\n signer = (await context.getSigners(sourceWallet.walletType)).getSigner(\n txType\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n /*\n * wallet is not connected yet\n * no need to do anything\n */\n }\n\n try {\n // if wallet is connected, try to get transaction reciept\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n if (signer?.wait && !receiptReceived) {\n const chainId =\n (tx?.blockChain && meta.blockchains?.[tx?.blockChain]?.chainId) ||\n undefined;\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, chainId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n let explorerUrl: string | undefined;\n const blockchainsMetaNotEmpty = !!Object.keys(meta.blockchains).length;\n if (blockchainsMetaNotEmpty) {\n explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepNamespace.network,\n meta.blockchains\n );\n }\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Swap',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse) {\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n }\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n warn(checkStatusError, {\n tags: {\n type: 'singer-error',\n reason: event.reason,\n reasonCode: event.reasonCode,\n message: extraMessage,\n messageDetail: extraMessageDetail,\n pendingSwap: swap,\n },\n context: SignerError.isSignerError(error) ? error.getErrorContext() : {},\n });\n\n getTxReceiptFailed = true;\n /*\n * We shouldn't return here, because we need to trigger check status job in backend.\n * This is not a ui requirement but the backend one.\n */\n }\n\n const requestBody: CheckTxStatusRequest = {\n requestId: swap.requestId,\n txId,\n step: currentStep.id,\n };\n\n try {\n status = await httpService().checkStatus(requestBody);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n await delay(INTERVAL_FOR_CHECK_STATUS);\n retry();\n warn(checkStatusError, {\n tags: { type: 'request-error', requestBody, pendingSwap: swap },\n });\n return;\n }\n\n /*\n * If user cancel swap during check status api call,\n * or getting transaction receipt failed,\n * we should ignore check status response and return\n */\n if (getTxReceiptFailed) {\n return failed();\n }\n if (currentStep?.status === 'failed') {\n return;\n }\n\n const outputAmount: string | null =\n status?.outputAmount ||\n (currentStep.outputAmount ? currentStep.outputAmount : null);\n const prevOutputAmount = currentStep.outputAmount || null;\n swap.extraMessage = status?.extraMessage || swap.extraMessage;\n swap.extraMessageSeverity = MessageSeverity.info;\n swap.extraMessageDetail = '';\n\n currentStep.status = status?.status || currentStep.status;\n currentStep.diagnosisUrl =\n status?.diagnosisUrl || currentStep.diagnosisUrl || null;\n currentStep.outputAmount = outputAmount || currentStep.outputAmount;\n currentStep.explorerUrl = status?.explorerUrl || currentStep.explorerUrl;\n currentStep.internalSteps = status?.steps || null;\n\n const newTransaction = status?.newTx;\n\n if (newTransaction) {\n currentStep.status = 'created';\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n setCurrentStepTx(currentStep, newTransaction);\n }\n\n if (prevOutputAmount === null && outputAmount !== null) {\n notifier({\n event: { type: StepEventType.OUTPUT_REVEALED, outputAmount },\n swap: swap,\n step: currentStep,\n });\n } else if (prevOutputAmount === null && outputAmount === null) {\n // it is needed to set notification after reloading the page\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap: swap,\n step: currentStep,\n });\n }\n\n if (currentStep.status === 'success') {\n const nextStep = getNextStep(swap, currentStep);\n swap.extraMessageDetail = '';\n swap.extraMessage = nextStep\n ? `starting next step: ${nextStep.swapperId}: ${nextStep.fromBlockchain} -> ${nextStep.toBlockchain}`\n : '';\n notifier({\n event: {\n type: StepEventType.SUCCEEDED,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n outputAmount: currentStep.outputAmount ?? '',\n outputAmountUsd: getLastSuccessfulStepOutputUsd(swap),\n },\n swap,\n step: currentStep,\n });\n } else if (currentStep.status === 'failed') {\n swap.extraMessage = 'Transaction failed in blockchain';\n swap.extraMessageSeverity = MessageSeverity.error;\n swap.extraMessageDetail = status?.extraMessage || '';\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n warn(checkStatusError, {\n tags: {\n type: 'transaction-failed',\n message: swap.extraMessage,\n messageDetails: swap.extraMessageDetail,\n pendingSwap: swap,\n },\n });\n }\n\n // Sync data with storage\n setStorage({ ...getStorage(), swapDetails: swap });\n\n if (status?.status === 'failed') {\n failed();\n } else if (\n status?.status === 'success' ||\n (status?.status === 'running' && !!status.newTx)\n ) {\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK_STATUS);\n retry();\n }\n}\n\n/**\n * Subscribe to status of approval transaction by checking from server periodically.\n * After getting the status, notify the user and schedule `SCHEDULE_NEXT_STEP`.\n */\nasync function checkApprovalStatus({\n getStorage,\n setStorage,\n next,\n schedule,\n retry,\n failed,\n context,\n}: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n>): Promise<void> {\n const swap = getStorage().swapDetails;\n const { meta } = context;\n const { getTransactionDataByHash, setTransactionDataByHash } =\n inMemoryTransactionsData();\n const checkApprovalStatusError = new Error('check approval status error');\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null');\n return;\n }\n const tx = getCurrentStepTx(currentStep);\n\n if (!currentStep?.executedTransactionId) {\n return;\n }\n let txId = currentStep.executedTransactionId;\n\n let signer: GenericSigner<Transaction> | null = null;\n try {\n const txType = getCurrentStepTxType(currentStep);\n const sourceWallet = getRelatedWallet(swap, currentStep);\n if (txType && sourceWallet) {\n const walletSigners = await context.getSigners(sourceWallet.walletType);\n signer = walletSigners.getSigner(txType);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n /*\n * wallet is not connected yet\n * no need to do anything\n */\n }\n\n try {\n const { response: txResponse, receiptReceived } =\n getTransactionDataByHash(txId);\n // if wallet is connected, try to get transaction reciept\n if (signer?.wait && !receiptReceived) {\n const chainId =\n (tx?.blockChain && meta.blockchains?.[tx?.blockChain]?.chainId) ||\n undefined;\n const { hash: updatedTxHash, response: updatedTxResponse } =\n await signer.wait(txId, chainId, txResponse);\n if (updatedTxHash !== txId) {\n currentStep.executedTransactionId =\n updatedTxHash || currentStep.executedTransactionId;\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n let explorerUrl: string | undefined;\n const blockchainsMetaNotEmpty = !!Object.keys(meta.blockchains).length;\n if (blockchainsMetaNotEmpty) {\n explorerUrl = getScannerUrl(\n currentStep.executedTransactionId,\n currentStepNamespace.network,\n meta.blockchains\n );\n }\n if (explorerUrl) {\n if (currentStep.explorerUrl && currentStep.explorerUrl?.length >= 1) {\n currentStep.explorerUrl[currentStep.explorerUrl.length - 1] = {\n url: explorerUrl,\n description: 'Replaced Approve',\n };\n }\n }\n txId = currentStep.executedTransactionId;\n if (updatedTxHash && updatedTxResponse) {\n setTransactionDataByHash(updatedTxHash, {\n response: updatedTxResponse,\n });\n }\n } else {\n setTransactionDataByHash(updatedTxHash, {\n receiptReceived: true,\n });\n }\n }\n } catch (error) {\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n warn(checkApprovalStatusError, {\n tags: {\n type: 'singer-error',\n reason: event.reason,\n reasonCode: event.reasonCode,\n message: extraMessage,\n messageDetail: extraMessageDetail,\n pendingSwap: swap,\n },\n context: SignerError.isSignerError(error) ? error.getErrorContext() : {},\n });\n return failed();\n }\n\n let isApproved = false;\n const request: { requestId: string; txId?: string } = {\n requestId: swap.requestId,\n txId: currentStep.executedTransactionId,\n };\n\n try {\n const response = await httpService().checkApproval(\n request.requestId,\n request.txId\n );\n // If user cancel swap during check status api call, we should ignore check approval response\n if (currentStep?.status === 'failed') {\n return;\n }\n\n isApproved = response.isApproved;\n if (\n !isApproved &&\n (response.txStatus === 'failed' || response.txStatus === 'success')\n ) {\n let message, details;\n if (response.txStatus === 'failed') {\n message = 'Approve transaction failed';\n details = 'Smart contract approval tx failed in blockchain.';\n } else {\n message = 'Not enough approval';\n if (response.requiredApprovedAmount && response.currentApprovedAmount) {\n details = `Required approval: ${response.requiredApprovedAmount}, current approval: ${response.currentApprovedAmount}`;\n } else {\n details = `You still don't have enough approval for this swap.`;\n }\n }\n /*\n * approve transaction failed on\n * we should fail the whole swap\n */\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'INSUFFICIENT_APPROVE',\n message: message,\n details: details,\n });\n\n const event = createStepFailedEvent(\n swap,\n message,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n\n warn(checkApprovalStatusError, {\n tags: {\n type: 'approval-failed',\n message: swap.extraMessage,\n messageDetails: swap.extraMessageDetail,\n pendingSwap: swap,\n },\n });\n\n failed();\n } else if (!isApproved) {\n // it is needed to set notification after reloading the page\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap,\n step: currentStep,\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n isApproved = false;\n warn(checkApprovalStatusError, {\n tags: { type: 'request-error', requestBody: request, pendingSwap: swap },\n });\n }\n if (isApproved) {\n currentStep.status = 'approved';\n swap.extraMessage = `Spending ${currentStep.fromSymbol} approved successfully.`;\n swap.extraMessageDetail = null;\n swap.extraMessageSeverity = MessageSeverity.success;\n currentStep.evmApprovalTransaction = null;\n currentStep.executedTransactionId = null;\n currentStep.executedTransactionTime = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.tronApprovalTransaction = null;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n notifier({\n event: { type: StepEventType.APPROVAL_TX_SUCCEEDED },\n swap: swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n } else {\n await delay(INTERVAL_FOR_CHECK_APPROVAL);\n retry();\n }\n}\n\n/**\n *\n * For doing a swap the user needs to accept a `contract` so it can use the user balance.\n * There is two types of check status:\n * 1. Checking approval transaction (Give permission to a contract)\n * 2. Checking swap transaction.\n *\n */\nexport async function checkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const swap = actions.getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n console.log('ignore check status, current step is null', swap.requestId);\n return;\n }\n\n /*\n * Reset network status\n * Because when check status is on `loading` or `failed` status, it shows previous message that isn't related to current state.\n */\n resetNetworkStatus(actions);\n\n if (currentStep.status === 'running') {\n await checkTransactionStatus(actions);\n } else if (currentStep.status === 'waitingForApproval') {\n await checkApprovalStatus(actions);\n }\n}\n", "/* eslint-disable destructuring/in-params */\n\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { NotifierParams } from './services/eventEmitter';\nimport type { SwapStatus, TargetNamespace, Wallet } from './shared';\nimport type {\n ArrayElement,\n LastConnectedWallet,\n Step,\n SwapQueueContext,\n SwapQueueDef,\n SwapStorage,\n UseQueueManagerParams,\n} from './types';\nimport type {\n ExecuterActions,\n Manager,\n QueueInfo,\n QueueName,\n QueueType,\n SetStorage,\n} from '@rango-dev/queue-manager-core';\nimport type {\n Meta,\n Network,\n Providers,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type {\n CreateTransactionResponse,\n EvmBlockchainMeta,\n Transaction,\n} from 'rango-sdk';\nimport type {\n APIErrorCode,\n PendingSwap,\n PendingSwapStep,\n SignerErrorCode,\n SignerFactory,\n StepStatus,\n} from 'rango-types';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { Status } from '@rango-dev/queue-manager-core';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport {\n getBlockChainNameFromId,\n getEvmProvider,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport {\n PendingSwapNetworkStatus,\n SignerError,\n TransactionType,\n} from 'rango-types';\n\nimport {\n DEFAULT_ERROR_CODE,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n} from './constants';\nimport { httpService } from './services';\nimport { notifier } from './services/eventEmitter';\nimport {\n getCurrentAddressOf,\n getCurrentNamespaceOf,\n getCurrentNamespaceOfOrNull,\n getRelatedWallet,\n getRelatedWalletOrNull,\n getScannerUrl,\n MessageSeverity,\n} from './shared';\nimport {\n mapAppErrorCodesToAPIErrorCode,\n prettifyErrorMessage,\n PrettyError,\n} from './shared-errors';\nimport {\n BlockReason,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n SwapActionTypes,\n} from './types';\n\ntype WhenTaskBlocked = Parameters<NonNullable<SwapQueueDef['whenTaskBlocked']>>;\ntype WhenTaskBlockedEvent = WhenTaskBlocked[0];\ntype WhenTaskBlockedMeta = WhenTaskBlocked[1];\n\nlet swapClaimedBy: { id: string } | null = null;\n\n/**\n *\n * We simply use module-level variable to keep track of which queue has claimed the execution of parallel runnings.\n *\n */\nexport function claimQueue() {\n return {\n claimedBy: () => swapClaimedBy?.id,\n setClaimer: (queue_id: string) => {\n swapClaimedBy = {\n id: queue_id,\n };\n },\n reset: () => {\n swapClaimedBy = null;\n },\n };\n}\n\n/**\n *\n * We use module-level variable to keep track of\n * map of transactions hash to the TransactionResponse and ...\n *\n */\ntype TransactionData = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response?: any; // e.g. TransactionResponse in case of EVM transactions\n receiptReceived?: boolean; // e.g. is TransactionReceipt ready in case of EVM transactions\n};\nconst swapTransactionToDataMap: { [id: string]: TransactionData } = {};\nexport function inMemoryTransactionsData() {\n return {\n getTransactionDataByHash: (hash: string) =>\n swapTransactionToDataMap[hash] || {},\n setTransactionDataByHash: (hash: string, data: TransactionData) => {\n const r = swapTransactionToDataMap[hash];\n if (!r) {\n swapTransactionToDataMap[hash] = {};\n }\n swapTransactionToDataMap[hash].response =\n data.response || swapTransactionToDataMap[hash].response;\n swapTransactionToDataMap[hash].receiptReceived =\n data.receiptReceived ||\n swapTransactionToDataMap[hash].receiptReceived ||\n false;\n },\n };\n}\n\n/**\n *\n * Returns `steps`, if it's a `running` swap.\n * Each `PendingSwap` has a `steps` inside it, `steps` shows how many tasks should be created and run to finish the swap.\n *\n */\nexport const getCurrentStep = (swap: PendingSwap): PendingSwapStep | null => {\n return (\n swap.steps.find(\n (step) => step.status !== 'failed' && step.status !== 'success'\n ) || null\n );\n};\n\n/**\n *\n * Returns current step transaction\n *\n */\nexport const getCurrentStepTx = (\n currentStep: PendingSwapStep\n): Transaction | null => {\n const {\n evmTransaction,\n evmApprovalTransaction,\n cosmosTransaction,\n solanaTransaction,\n transferTransaction,\n starknetApprovalTransaction,\n starknetTransaction,\n tronApprovalTransaction,\n tronTransaction,\n tonTransaction,\n suiTransaction,\n } = currentStep;\n return (\n evmTransaction ||\n evmApprovalTransaction ||\n cosmosTransaction ||\n solanaTransaction ||\n transferTransaction ||\n starknetApprovalTransaction ||\n starknetTransaction ||\n tronApprovalTransaction ||\n tronTransaction ||\n tonTransaction ||\n suiTransaction\n );\n};\n\n/**\n *\n * Set current step transaction\n *\n */\nexport const setCurrentStepTx = (\n currentStep: PendingSwapStep,\n transaction: Transaction\n): PendingSwapStep => {\n currentStep.transferTransaction = null;\n currentStep.cosmosTransaction = null;\n currentStep.evmTransaction = null;\n currentStep.solanaTransaction = null;\n currentStep.evmApprovalTransaction = null;\n currentStep.starknetApprovalTransaction = null;\n currentStep.starknetTransaction = null;\n currentStep.tronApprovalTransaction = null;\n currentStep.tronTransaction = null;\n currentStep.tonTransaction = null;\n currentStep.suiTransaction = null;\n\n const txType = transaction.type;\n switch (txType) {\n case TransactionType.EVM:\n if (transaction.isApprovalTx) {\n currentStep.evmApprovalTransaction = transaction;\n } else {\n currentStep.evmTransaction = transaction;\n }\n break;\n case TransactionType.TRON:\n if (transaction.isApprovalTx) {\n currentStep.tronApprovalTransaction = transaction;\n } else {\n currentStep.tronTransaction = transaction;\n }\n break;\n case TransactionType.STARKNET:\n if (transaction.isApprovalTx) {\n currentStep.starknetApprovalTransaction = transaction;\n } else {\n currentStep.starknetTransaction = transaction;\n }\n break;\n case TransactionType.COSMOS:\n currentStep.cosmosTransaction = transaction;\n break;\n case TransactionType.SOLANA:\n currentStep.solanaTransaction = transaction;\n break;\n case TransactionType.TRANSFER:\n currentStep.transferTransaction = transaction;\n break;\n case TransactionType.TON:\n currentStep.tonTransaction = transaction;\n break;\n case TransactionType.SUI:\n currentStep.suiTransaction = transaction;\n break;\n case TransactionType.XRPL:\n currentStep.xrplTransaction = transaction;\n break;\n default:\n ((x: never) => {\n throw new Error(`${x} was unhandled!`);\n })(txType);\n }\n return currentStep;\n};\n\n/**\n *\n * Returns current step transaction type\n *\n */\nexport const getCurrentStepTxType = (\n currentStep: PendingSwapStep\n): TransactionType | undefined => {\n return getCurrentStepTx(currentStep)?.type;\n};\n\n/**\n *\n * Returns a boolean indicating that current step is an approval tx or not.\n *\n */\nexport const isApprovalCurrentStepTx = (\n currentStep: PendingSwapStep\n): boolean => {\n const {\n evmApprovalTransaction,\n starknetApprovalTransaction,\n tronApprovalTransaction,\n } = currentStep;\n return !!(\n evmApprovalTransaction ||\n starknetApprovalTransaction ||\n tronApprovalTransaction\n );\n};\n\n/**\n * When we are doing a swap, there are some common fields that will be updated together.\n * This function helps us to update a swap status and also it will update some more fields like `extraMessageSeverity` based on the input.\n */\nexport function updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus,\n nextStepStatus,\n message,\n details,\n errorCode = null,\n hasAlreadyProceededToSign,\n trace = null,\n}: {\n getStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['getStorage'];\n setStorage: ExecuterActions<\n SwapStorage,\n SwapActionTypes,\n SwapQueueContext\n >['setStorage'];\n nextStatus?: SwapStatus;\n nextStepStatus?: StepStatus;\n message?: string;\n details?: string | null | undefined;\n errorCode?: APIErrorCode | SignerErrorCode | null;\n hasAlreadyProceededToSign?: boolean;\n trace?: Error | null | undefined;\n}): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n failureType?: APIErrorCode;\n} {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const updatedResult: {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n failureType?: APIErrorCode;\n } = {\n swap,\n step: currentStep,\n };\n if (!!nextStepStatus && !!currentStep) {\n currentStep.status = nextStepStatus;\n }\n\n if (nextStatus) {\n swap.status = nextStatus;\n }\n swap.hasAlreadyProceededToSign = hasAlreadyProceededToSign;\n if (!!nextStatus && ['failed', 'success'].includes(nextStatus)) {\n swap.finishTime = new Date().getTime().toString();\n }\n\n if (!!message || !!details) {\n swap.extraMessage = message || '';\n swap.extraMessageDetail = details || '';\n }\n\n if (!!nextStepStatus && ['failed'].includes(nextStepStatus)) {\n //if user cancel the swap, we should pass relevant reason to the server.\n const errorReason =\n details && details.includes('Warning')\n ? 'Swap canceled by user.'\n : details;\n const walletType = getRelatedWalletOrNull(swap, currentStep)?.walletType;\n swap.extraMessageSeverity = MessageSeverity.error;\n\n const failureType = mapAppErrorCodesToAPIErrorCode(errorCode);\n updatedResult.failureType = failureType;\n\n // If trace of error was available, we will send it to the api (except user rejection)\n const errorReasonForAPI =\n errorCode !== 'REJECTED_BY_USER' &&\n trace?.message &&\n typeof trace.message === 'string'\n ? trace.message\n : errorReason || '';\n\n httpService()\n .reportFailure({\n requestId: swap.requestId,\n step: currentStep?.id || 1,\n eventType: failureType,\n reason: errorReasonForAPI,\n tags: walletType\n ? {\n wallet: walletType,\n }\n : undefined,\n })\n .then()\n .catch();\n } else if (!!nextStepStatus && ['running'].includes(nextStepStatus)) {\n swap.extraMessageSeverity = MessageSeverity.info;\n } else if (\n !!nextStepStatus &&\n ['success', 'approved'].includes(nextStepStatus)\n ) {\n swap.extraMessageSeverity = MessageSeverity.success;\n } else if (\n nextStepStatus &&\n ['waitingForApproval'].includes(nextStepStatus)\n ) {\n swap.extraMessageSeverity = MessageSeverity.warning;\n }\n\n if (nextStepStatus === 'running' && currentStep) {\n currentStep.startTransactionTime = new Date().getTime();\n }\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return updatedResult;\n}\n\n/**\n *\n * Set current step transaction hash, update pending swap status, and notify user if needed\n *\n */\nexport function setStepTransactionIds(\n { getStorage, setStorage }: ExecuterActions<SwapStorage, SwapActionTypes>,\n txId: string | null,\n explorerUrl?: { url?: string; description?: string }\n): void {\n const swap = getStorage().swapDetails;\n swap.hasAlreadyProceededToSign = null;\n\n const currentStep = getCurrentStep(swap)!;\n currentStep.executedTransactionId = txId;\n currentStep.executedTransactionTime = new Date().getTime().toString();\n if (explorerUrl?.url) {\n currentStep.explorerUrl = [\n ...(currentStep.explorerUrl || []),\n {\n url: explorerUrl.url,\n description: explorerUrl.description || null,\n },\n ];\n }\n\n const isApproval = isApprovalCurrentStepTx(currentStep);\n\n if (isApproval) {\n swap.extraMessage = 'Checking approve transaction status ...';\n } else {\n swap.extraMessage = 'Checking transaction status ...';\n }\n\n swap.extraMessageDetail = '';\n swap.extraMessageSeverity = MessageSeverity.info;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION,\n status: StepExecutionEventStatus.TX_SENT,\n },\n swap: swap,\n step: currentStep,\n });\n\n notifier({\n event: { type: StepEventType.CHECK_STATUS },\n swap: swap,\n step: currentStep,\n });\n}\n\n/**\n * If a swap needs a wallet to be connected,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage,\n setStorage,\n }: Pick<ExecuterActions, 'getStorage' | 'setStorage'>,\n reason: string,\n reasonDetail: string\n): void {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n const isAlreadyMarked =\n currentStep.networkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet &&\n swap.networkStatusExtraMessage === reason &&\n swap.networkStatusExtraMessageDetail === reasonDetail;\n\n if (isAlreadyMarked) {\n return;\n }\n\n currentStep.networkStatus =\n PendingSwapNetworkStatus.WaitingForConnectingWallet;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n}\n\n/**\n * If a swap needs a certain network to proceed,\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsSwitchingNetwork({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n\n // Generate message\n const { type } = getRequiredWallet(swap);\n const fromNamespace = getCurrentNamespaceOf(swap, currentStep);\n const reason = `Change ${type} wallet network to ${fromNamespace.network}`;\n const reasonDetail = `We\u2019re switching the connected network to ${fromNamespace.network}. Please check your wallet.`;\n\n const currentTime = new Date();\n swap.lastNotificationTime = currentTime.getTime().toString();\n\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForNetworkChange;\n swap.networkStatusExtraMessage = reason;\n swap.networkStatusExtraMessageDetail = reasonDetail;\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\n/**\n * We are marking the queue as it depends on other queues to be run (on Parallel mode)\n * By calling this function some related fields will be updated to show a correct message and state for notfiying the user.\n */\nexport function markRunningSwapAsDependsOnOtherQueues({\n getStorage,\n setStorage,\n}: Pick<ExecuterActions, 'getStorage' | 'setStorage'>):\n | {\n swap: PendingSwap;\n step: PendingSwapStep;\n }\n | undefined {\n const swap = getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n if (!currentStep) {\n return;\n }\n\n swap.networkStatusExtraMessage = '';\n swap.networkStatusExtraMessageDetail = '';\n currentStep.networkStatus = PendingSwapNetworkStatus.WaitingForQueue;\n\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status: StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE,\n },\n swap,\n step: currentStep,\n });\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n return {\n swap,\n step: currentStep,\n };\n}\n\nexport async function delay(ms: number): Promise<unknown> {\n return new Promise((res) => setTimeout(res, ms));\n}\n\n/**\n *\n * To execute a swap, we are keeping the user prefrences on what wallet they are going to use for a sepecific blockchain\n * By passing the swap and the network we are looking for, it returns the wallet name that user selected.\n *\n */\nexport const getSwapWalletType = (\n swap: PendingSwap,\n network: Network\n): WalletType => {\n return swap.wallets[network]?.walletType;\n};\n\n/**\n *\n * We are keeping the connected wallet in a specific structure (`Wallet`),\n * By using this function we normally want to check a specific wallet is connected and exists or not.\n *\n */\nexport function isWalletNull(wallet: Wallet | null): boolean {\n return (\n wallet === null ||\n wallet?.blockchains === null ||\n wallet?.blockchains.length === 0\n );\n}\n\n/**\n * In a `PendingSwap`, each step needs a wallet to proceed,\n * By using this function we can access what wallet exactly we need to run current step.\n */\nexport function getRequiredWallet(swap: PendingSwap): {\n type: WalletType | null;\n namespace: TargetNamespace | null;\n address: string | null;\n} {\n const step = getCurrentStep(swap)!;\n const currentNamespace = getCurrentNamespaceOfOrNull(swap, step);\n if (!currentNamespace) {\n return {\n type: null,\n namespace: null,\n address: null,\n };\n }\n\n const walletType = getSwapWalletType(swap, currentNamespace.network);\n const sourceWallet = swap.wallets[currentNamespace.network];\n\n return {\n type: walletType || null,\n namespace: currentNamespace,\n address: sourceWallet ? sourceWallet.address : null,\n };\n}\n\n/**\n * On EVM compatible wallets, There is one instance with different chains (like Polygon)\n * To get the chain from instance we will use this function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function getChainId(provider: any): Promise<string | number | null> {\n try {\n const chainId: number | string | null =\n (await provider.request({ method: 'eth_chainId' })) || provider?.chainId;\n return chainId;\n } catch {\n return provider?.chainId;\n }\n}\n\n/**\n * For running a swap safely, we need to make sure about the state of wallet\n * which means the netowrk/chain of wallet should be exactly on what a transaction needs.\n */\nexport async function isNetworkMatchedForTransaction(\n swap: PendingSwap,\n step: PendingSwapStep,\n wallet: Wallet | null,\n meta: Meta,\n providers: Providers\n): Promise<boolean> {\n if (isWalletNull(wallet)) {\n return false;\n }\n const fromNamespace = getCurrentNamespaceOfOrNull(swap, step);\n if (!fromNamespace) {\n return false;\n }\n\n if (\n meta.evmBasedChains.find(\n (evmBlochain) => evmBlochain.name === fromNamespace.network\n )\n ) {\n try {\n const sourceWallet = swap.wallets[fromNamespace.network];\n if (sourceWallet) {\n const provider = getEvmProvider(providers, sourceWallet.walletType);\n const chainId: number | string | null = await getChainId(provider);\n if (chainId) {\n const blockChain = getBlockChainNameFromId(\n chainId,\n Object.entries(meta.blockchains).map(\n ([, blockchainMeta]) => blockchainMeta\n )\n );\n if (\n blockChain &&\n blockChain.toLowerCase() === fromNamespace.network.toLowerCase()\n ) {\n return true;\n }\n if (\n blockChain &&\n blockChain.toLowerCase() !== fromNamespace.network.toLowerCase()\n ) {\n return false;\n }\n }\n }\n } catch (e) {\n console.log(e);\n }\n return false;\n }\n return true;\n}\n\nexport const isTxAlreadyCreated = (\n swap: PendingSwap,\n step: PendingSwapStep\n): boolean => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n swap.wallets[step.tonTransaction?.blockChain || ''] ||\n swap.wallets[step.suiTransaction?.blockChain || ''] ||\n step.transferTransaction?.fromWalletAddress ||\n null;\n\n return result !== null;\n};\n\nexport function resetNetworkStatus(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): void {\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n currentStep.networkStatus = null;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\nexport function updateNetworkStatus(\n actions: Pick<\n ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>,\n 'getStorage' | 'setStorage'\n >,\n data: {\n message: string;\n details: string;\n status: PendingSwapNetworkStatus | null;\n } = {\n message: '',\n details: '',\n status: null,\n }\n): void {\n const { message, details, status } = data;\n const { getStorage, setStorage } = actions;\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n\n if (currentStep?.networkStatus) {\n swap.networkStatusExtraMessage = message;\n swap.networkStatusExtraMessageDetail = details;\n currentStep.networkStatus = status;\n setStorage({ ...getStorage(), swapDetails: swap });\n }\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for wallet),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required wallet is connected, unblock the queue to be run.\n */\nexport function onBlockForConnectWallet(\n event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n\n const { ok, reason } = isRequiredWalletConnected(swap, context.state);\n\n if (!ok) {\n const currentStep = getCurrentStep(swap)!;\n const { type: walletType, address } = getRequiredWallet(swap);\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n ...(reason === 'account_miss_match'\n ? {\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n requiredAccount: address ?? undefined,\n }\n : {\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\n requiredWallet: walletType ?? undefined,\n requiredAccount: address ?? undefined,\n }),\n },\n swap: swap,\n step: currentStep,\n });\n\n markRunningSwapAsWaitingForConnectingWallet(\n {\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n },\n ERROR_MESSAGE_WAIT_FOR_WALLET,\n event.reason.description\n );\n\n return;\n }\n\n queue.unblock();\n}\n\n/**\n * Event handler for blocked tasks.\n * If a transcation execution is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks if the required network is connected, unblock the queue to be run.\n * Note: it automatically try to switch the network if its `provider` supports.\n */\nexport function onBlockForChangeNetwork(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { context, queue } = meta;\n const swap = queue.getStorage().swapDetails as SwapStorage['swapDetails'];\n const currentStep = getCurrentStep(swap);\n\n if (!currentStep || swap.status !== 'running') {\n return;\n }\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n\n const requiredNetwork = getCurrentNamespaceOfOrNull(\n swap,\n currentStep\n )?.network;\n\n const requiredWallet = getRequiredWallet(swap).type;\n\n const currentNetwork = requiredWallet\n ? context.state(requiredWallet).network\n : undefined;\n\n if (result) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status: StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n requiredNetwork: requiredNetwork ?? undefined,\n currentNetwork: currentNetwork ?? undefined,\n },\n swap: result.swap,\n step: result.step,\n });\n }\n\n // Try to auto switch\n const { type, namespace } = getRequiredWallet(swap);\n if (!!type && !!namespace?.network) {\n if (context.canSwitchNetworkTo(type, namespace.network, namespace)) {\n const result = context.switchNetwork(type, namespace);\n if (result) {\n result\n .then(() => {\n queue.unblock();\n })\n .catch((error) => {\n // Update network to mark it as network change failed.\n updateNetworkStatus(\n {\n getStorage: queue.getStorage.bind(queue) as () => SwapStorage,\n setStorage: queue.setStorage.bind(\n queue\n ) as SetStorage<SwapStorage>,\n },\n {\n message: error.message,\n details: error.message,\n status: PendingSwapNetworkStatus.NetworkChangeFailed,\n }\n );\n });\n }\n }\n }\n}\n\n/**\n * Event handler for blocked tasks. (Parallel mode)\n * If a transcation execution flow is manually blocked (like for parallel or waiting for walle),\n * This function will be called by queue manager using `queue definition`.\n *\n * It checks the blocked tasks, if there is no active `claimed` queue, try to give it to the best candidate.\n */\nexport function onDependsOnOtherQueues(\n _event: WhenTaskBlockedEvent,\n meta: WhenTaskBlockedMeta\n): void {\n const { getBlockedTasks, forceExecute, queue, manager, context } = meta;\n const { setClaimer, claimedBy, reset } = claimQueue();\n\n // We only needs those blocked tasks that have DEPENDS_ON_OTHER_QUEUES reason.\n const blockedTasks = getBlockedTasks().filter(\n (task) => task.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES\n );\n\n if (blockedTasks.length === 0) {\n return;\n }\n\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId;\n\n if (claimerId === queue.id) {\n return;\n }\n\n // Check if any queue `claimed` before, if yes, we don't should do anything.\n if (isClaimedByAnyQueue) {\n // We need to keep the latest swap messages\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: queue.getStorage.bind(queue),\n setStorage: queue.setStorage.bind(queue),\n });\n return;\n }\n\n // Prioritize current queue to be run first.\n\n let task = blockedTasks.find((task) => {\n return task.queue_id === meta.queue_id;\n });\n\n // If current task isn't available anymore, fallback to first blocked task.\n if (!task) {\n const firstBlockedTask = blockedTasks[0];\n task = firstBlockedTask;\n }\n\n setClaimer(task.queue_id);\n const claimedStorage = task.storage.get() as SwapStorage;\n const { type, namespace, address } = getRequiredWallet(\n claimedStorage.swapDetails\n );\n\n // Run\n forceExecute(task.queue_id, {\n claimedBy: claimedBy(),\n resetClaimedBy: () => {\n reset();\n // TODO: Use key generator\n if (type) {\n retryOn(\n {\n walletType: type,\n network: namespace?.network,\n accounts: address ? [address] : [],\n },\n manager,\n context.canSwitchNetworkTo\n );\n }\n },\n });\n}\n\nexport function isRequiredWalletConnected(\n swap: PendingSwap,\n getState: (type: WalletType) => WalletState\n): { ok: boolean; reason: 'not_connected' | 'account_miss_match' } {\n const { type, address } = getRequiredWallet(swap);\n if (!type || !address) {\n return { ok: false, reason: 'not_connected' };\n }\n const walletState = getState(type);\n const { accounts, connected } = walletState;\n const connectedAccounts = accounts || [];\n if (!connected) {\n return { ok: false, reason: 'not_connected' };\n }\n\n const matched = connectedAccounts.some((account) => {\n const { address: accountAddress } = readAccountAddress(account);\n return address.toLocaleLowerCase() === accountAddress.toLocaleLowerCase();\n });\n return { ok: matched, reason: 'account_miss_match' };\n}\n\nexport async function signTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setTransactionDataByHash } = inMemoryTransactionsData();\n const { getStorage, setStorage, failed, next, schedule, context } = actions;\n const { meta, getSigners, isMobileWallet } = context;\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n\n const sourceWallet = getRelatedWallet(swap, currentStep);\n const mobileWallet = isMobileWallet(sourceWallet?.walletType);\n const walletAddress = getCurrentAddressOf(swap, currentStep);\n const currentStepNamespace = getCurrentNamespaceOf(swap, currentStep);\n\n const onFinish = () => {\n // TODO resetClaimedBy is undefined here\n if (actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const tx = getCurrentStepTx(currentStep);\n const txType = tx?.type;\n const isApproval = isApprovalCurrentStepTx(currentStep);\n\n if (!tx || !txType) {\n const extraMessage = 'Unexpected Error: tx is null!';\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: undefined,\n errorCode: 'CLIENT_UNEXPECTED_BEHAVIOUR',\n });\n notifier({\n event: {\n type: StepEventType.FAILED,\n reason: extraMessage,\n reasonCode: 'CLIENT_UNEXPECTED_BEHAVIOUR',\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n failed();\n return onFinish();\n }\n\n const chainId = meta.blockchains?.[tx.blockChain]?.chainId;\n\n const hasAlreadyProceededToSign =\n typeof swap.hasAlreadyProceededToSign === 'boolean';\n\n let nextStatus: SwapStatus | undefined,\n nextStepStatus: StepStatus,\n message: string,\n details: string,\n eventType: StepEventType;\n\n if (isApproval) {\n message = `Waiting for approval of ${currentStep?.fromSymbol} coin ${\n mobileWallet ? 'on your mobile phone!' : ''\n }`;\n details =\n 'Waiting for approve transaction to be mined and confirmed successfully';\n nextStepStatus = 'waitingForApproval';\n nextStatus = undefined;\n eventType = StepEventType.TX_EXECUTION;\n } else if (hasAlreadyProceededToSign) {\n message = 'Transaction is expired. Please try again.';\n nextStepStatus = 'failed';\n nextStatus = 'failed';\n details = '';\n eventType = StepEventType.FAILED;\n } else {\n message = 'Executing transaction ...';\n nextStepStatus = 'running';\n nextStatus = 'running';\n details = `${mobileWallet ? 'Check your mobile phone!' : ''}`;\n eventType = StepEventType.TX_EXECUTION;\n }\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStepStatus,\n nextStatus,\n message: message,\n details: details,\n hasAlreadyProceededToSign: isApproval\n ? undefined\n : hasAlreadyProceededToSign,\n errorCode: hasAlreadyProceededToSign ? 'TX_EXPIRED' : undefined,\n });\n\n if (eventType === StepEventType.FAILED) {\n notifier({\n event: {\n type: eventType,\n reason: message,\n reasonCode: updateResult.failureType ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n } else {\n notifier({\n event: { type: eventType, status: StepExecutionEventStatus.SEND_TX },\n ...updateResult,\n });\n }\n\n if (hasAlreadyProceededToSign) {\n failed();\n onFinish();\n return;\n }\n\n const handleSignError = (error: Error) => {\n if (swap.status === 'failed') {\n return;\n }\n\n const { extraMessage, extraMessageDetail, extraMessageErrorCode } =\n prettifyErrorMessage(error);\n\n warn(error, {\n tags: {\n requestId: swap.requestId,\n rpc: true,\n swapper: currentStep?.swapperId || '',\n walletType: sourceWallet?.walletType || '',\n },\n context: SignerError.isSignerError(error) ? error.getErrorContext() : {},\n });\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: extraMessageErrorCode,\n trace: error?.cause as Error | null | undefined, // TODO: we should define Error type with `cause` property to prevent such assertions\n });\n\n notifier({\n event: {\n type: StepEventType.FAILED,\n reason: extraMessage,\n reasonCode: updateResult.failureType ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n },\n ...updateResult,\n });\n failed();\n onFinish();\n };\n\n let walletSigners: SignerFactory;\n\n try {\n walletSigners = await getSigners(sourceWallet.walletType);\n } catch (error) {\n handleSignError(error as Error);\n return;\n }\n\n const signer = walletSigners.getSigner(txType);\n signer\n .signAndSendTx(tx, walletAddress, chainId)\n .then(({ hash, response }) => {\n const explorerUrl = getScannerUrl(\n hash,\n currentStepNamespace.network,\n meta.blockchains\n );\n setStepTransactionIds(\n actions,\n hash,\n explorerUrl &&\n (!response || (response && !response.hashRequiringUpdate))\n ? {\n url: explorerUrl,\n description: isApproval ? 'Approve' : 'Swap',\n }\n : undefined\n );\n // response used for evm transactions to get receipt and track replaced\n if (response) {\n setTransactionDataByHash(hash, { response });\n }\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n next();\n onFinish();\n }, handleSignError);\n}\n\nexport function checkWaitingForConnectWalletChange(params: {\n lastConnectedWallet: LastConnectedWallet;\n manager?: Manager;\n evmChains: EvmBlockchainMeta[];\n}): void {\n const { lastConnectedWallet, evmChains, manager } = params;\n const { walletType: wallet, network } = lastConnectedWallet;\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == network)) {\n return;\n }\n\n manager?.getAll().forEach((q) => {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n const currentStepRequiredWallet =\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType;\n const hasWaitingForConnect = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n // TODO double check later\n [BlockReason.WAIT_FOR_CONNECT_WALLET].includes(\n task.blockedFor?.reason\n )\n );\n }\n );\n\n const requiredNetwork = getCurrentNamespaceOfOrNull(\n swap,\n currentStep\n )?.network;\n\n // We only need change network for EVM chains.\n if (!evmChains.some((chain) => chain.name == requiredNetwork)) {\n return;\n }\n\n if (\n currentStepRequiredWallet === wallet &&\n hasWaitingForConnect &&\n requiredNetwork != network\n ) {\n const queueInstance = q.list;\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(type);\n\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n description,\n },\n silent: true,\n });\n\n const result = markRunningSwapAsSwitchingNetwork({\n getStorage: queueInstance.getStorage.bind(queueInstance),\n setStorage: queueInstance.setStorage.bind(queueInstance),\n });\n\n if (result) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION_BLOCKED,\n status:\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n currentNetwork: network,\n requiredNetwork: requiredNetwork ?? undefined,\n },\n swap: result.swap,\n step: result.step,\n });\n }\n }\n }\n }\n });\n}\n\nexport function checkWaitingForNetworkChange(manager?: Manager): void {\n manager?.getAll().forEach((q) => {\n const hasWaitingForNetwork = Object.keys(q.list.state.tasks).some(\n (taskId) => {\n const task = q.list.state.tasks[taskId];\n return (\n task.status === Status.BLOCKED &&\n [\n BlockReason.WAIT_FOR_NETWORK_CHANGE,\n BlockReason.DEPENDS_ON_OTHER_QUEUES,\n ].includes(task.blockedFor?.reason)\n );\n }\n );\n\n if (hasWaitingForNetwork) {\n const swap = q.list.getStorage()\n ?.swapDetails as SwapStorage['swapDetails'];\n if (swap.status === 'running') {\n const { type } = getRequiredWallet(swap);\n const description = ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type);\n\n // Change the block reason to waiting for connecting wallet\n q.list.block({\n reason: {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n },\n });\n }\n }\n });\n}\n\n/**\n * Get list of all running swaps\n *\n * @param manager\n * @returns list of pending swaps\n */\nexport function getRunningSwaps(manager: Manager): PendingSwap[] {\n const queues = manager?.getAll() || new Map<QueueName, QueueInfo>();\n const result: PendingSwap[] = [];\n queues.forEach((q) => {\n // retry only on affected queues\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n if (!swap || swap.status !== 'running') {\n return;\n }\n result.push(swap);\n });\n return result;\n}\n\n/**\n *\n * Trying to reset notifications for pending swaps to correct message on page load.\n * We could remove this after supporting auto connect for wallets.\n *\n * @param swaps\n * @param notifier\n * @returns\n */\nexport function resetRunningSwapNotifsOnPageLoad(runningSwaps: PendingSwap[]) {\n runningSwaps.forEach((swap) => {\n const currentStep = getCurrentStep(swap);\n const eventType = StepEventType.TX_EXECUTION_BLOCKED;\n let eventSubtype:\n | StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE\n | StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT\n | undefined;\n if (\n currentStep?.networkStatus === PendingSwapNetworkStatus.WaitingForQueue\n ) {\n eventSubtype = StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE;\n } else if (swap?.status === 'running') {\n eventSubtype = StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT;\n }\n if (!!eventType && !!notifier) {\n notifier({\n event: {\n type: eventType,\n status:\n eventSubtype ?? StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE,\n },\n swap: swap,\n step: currentStep,\n });\n }\n });\n}\n\n/**\n *\n * Try to run blocked tasks by wallet and network name.\n * Goes through queues and extract blocked queues with matched wallet.\n * If found any blocked tasks with same wallet and network, runs them.\n * If not, runs only blocked tasks with matched wallet.\n *\n * @param wallet_network a string includes `wallet` type and `network` type.\n * @param manager\n * @returns\n */\nexport function retryOn(\n lastConnectedWallet: LastConnectedWallet,\n manager?: Manager,\n canSwitchNetworkTo?: UseQueueManagerParams['canSwitchNetworkTo'],\n options = { fallbackToOnlyWallet: true }\n): void {\n const { walletType: wallet, network } = lastConnectedWallet;\n if (!wallet) {\n return;\n }\n\n const walletAndNetworkMatched: QueueType[] = [];\n const onlyWalletMatched: QueueType[] = [];\n\n manager?.getAll().forEach((q) => {\n // retry only on affected queues\n if (q.status === Status.BLOCKED) {\n const queueStorage = q.list.getStorage() as SwapStorage | undefined;\n const swap = queueStorage?.swapDetails;\n\n if (swap && swap.status === 'running') {\n const currentStep = getCurrentStep(swap);\n if (currentStep) {\n if (\n network &&\n getCurrentNamespaceOfOrNull(swap, currentStep)?.network ==\n network &&\n queueStorage?.swapDetails.wallets[network]?.walletType === wallet\n ) {\n walletAndNetworkMatched.push(q.list);\n } else if (\n queueStorage?.swapDetails.wallets[currentStep.fromBlockchain]\n ?.walletType === wallet\n ) {\n onlyWalletMatched.push(q.list);\n }\n }\n }\n }\n });\n\n let finalQueueToBeRun: QueueType | undefined = undefined;\n if (walletAndNetworkMatched.length > 0) {\n finalQueueToBeRun = walletAndNetworkMatched[0];\n\n if (walletAndNetworkMatched.length > 1) {\n for (let i = 1; i < walletAndNetworkMatched.length; i++) {\n const currentQueue = walletAndNetworkMatched[i];\n\n markRunningSwapAsDependsOnOtherQueues({\n getStorage: currentQueue.getStorage.bind(currentQueue),\n setStorage: currentQueue.setStorage.bind(currentQueue),\n });\n }\n }\n } else if (onlyWalletMatched.length > 0 && options.fallbackToOnlyWallet) {\n finalQueueToBeRun = onlyWalletMatched[0];\n }\n\n if (finalQueueToBeRun) {\n const finalQueueStorage = finalQueueToBeRun.getStorage() as SwapStorage;\n const currentSwap = getCurrentStep(finalQueueStorage?.swapDetails);\n\n const currentNamespace = currentSwap\n ? getCurrentNamespaceOfOrNull(finalQueueStorage.swapDetails, currentSwap)\n : null;\n if (\n !network ||\n !currentNamespace ||\n !canSwitchNetworkTo?.(wallet, network, currentNamespace)\n ) {\n finalQueueToBeRun.unblock();\n } else {\n finalQueueToBeRun.checkBlock();\n }\n }\n}\n\n/*\n *For avoiding conflict by making too many requests to wallet, we need to make sure\n *We only run one request at a time (In parallel mode).\n */\nexport function isNeedBlockQueueForParallel(step: PendingSwapStep): boolean {\n return !!step.evmTransaction || !!step.evmApprovalTransaction;\n}\n\n/*\n *Create transaction endpoint doesn't return error code on http status code,\n *For backward compatibilty with server and sdk, we use this wrapper to reject the promise.\n */\nexport async function throwOnOK(\n rawResponse: Promise<CreateTransactionResponse>\n): Promise<CreateTransactionResponse> {\n const responseBody = await rawResponse;\n if (!responseBody.ok || !responseBody.transaction) {\n throw PrettyError.CreateTransaction(\n responseBody.error || 'bad response from create tx endpoint'\n );\n }\n return responseBody;\n}\n\nexport function cancelSwap(\n swap: QueueInfo,\n manager?: Manager\n): {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} {\n const { reset } = claimQueue();\n swap.actions.cancel();\n\n const updateResult = updateSwapStatus({\n getStorage: swap.actions.getStorage,\n setStorage: swap.actions.setStorage,\n message: 'Swap canceled by user.',\n details:\n \"Warning: If you've already signed and sent a transaction, it won't be affected, but next swap steps will not be executed.\",\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n errorCode: 'USER_CANCEL',\n });\n\n notifier({\n event: {\n type: StepEventType.FAILED,\n reasonCode: 'USER_CANCEL',\n reason: updateResult.swap.extraMessage ?? undefined,\n inputAmount: getLastFinishedStepInput(updateResult.swap),\n inputAmountUsd: getLastFinishedStepInputUsd(updateResult.swap),\n },\n\n swap: updateResult.swap,\n step: updateResult.step,\n });\n\n reset();\n if (manager) {\n manager?.retry();\n }\n\n return updateResult;\n}\n\nexport function getLastSuccessfulStep<T extends { status: StepStatus }[]>(\n steps: T\n): ArrayElement<T> | undefined {\n return steps\n .slice()\n .reverse()\n .find((step) => step.status === 'success') as ArrayElement<T> | undefined;\n}\n\nexport function getFailedStep<T extends { status: StepStatus }[]>(\n steps: T\n): ArrayElement<T> | undefined {\n return steps\n .slice()\n .reverse()\n .find((step) => step.status === 'failed') as ArrayElement<T> | undefined;\n}\n\nexport function isApprovalTX(step: Step): boolean {\n const { transaction } = step;\n const approvalTx =\n (transaction?.type === TransactionType.EVM && transaction.isApprovalTx) ||\n (transaction?.type === TransactionType.STARKNET &&\n transaction.isApprovalTx) ||\n (transaction?.type === TransactionType.TRON && transaction.isApprovalTx);\n\n return approvalTx;\n}\n\nexport function getTokenAmountInUsd(\n amount: string | number,\n usdPrice: string | number\n): string {\n const usdValue = new BigNumber(amount).multipliedBy(usdPrice);\n if (isNaN(usdValue.toNumber())) {\n return '';\n }\n return usdValue.toString();\n}\n\nexport function getSwapInputUsd(swap: PendingSwap): string {\n return getTokenAmountInUsd(\n swap.inputAmount,\n swap.steps[0].fromUsdPrice ?? ''\n );\n}\n\nexport function getSwapOutputUsd(swap: PendingSwap): string {\n const lastStep = swap.steps[swap.steps.length - 1];\n\n return getTokenAmountInUsd(\n lastStep.outputAmount ?? '',\n lastStep.toUsdPrice ?? ''\n );\n}\n\nexport function getLastFinishedStep(\n swap: PendingSwap\n): { step: PendingSwapStep; index: number } | undefined {\n const FINISHED_STATUS: PendingSwap['steps'][number]['status'][] = [\n 'success',\n 'failed',\n ];\n\n const lastFinishedStepIndex = swap.steps.findLastIndex((step) =>\n FINISHED_STATUS.includes(step.status)\n );\n\n return lastFinishedStepIndex < 0\n ? undefined\n : { step: swap.steps[lastFinishedStepIndex], index: lastFinishedStepIndex };\n}\n\nexport function getLastFinishedStepInput(swap: PendingSwap): string {\n const lastFinishedStep = getLastFinishedStep(swap);\n\n if (!lastFinishedStep) {\n return '';\n }\n\n return lastFinishedStep.index === 0\n ? swap.inputAmount\n : swap.steps[lastFinishedStep.index - 1].outputAmount ?? '';\n}\n\nexport function getLastFinishedStepInputUsd(swap: PendingSwap): string {\n const lastSuccessfulStep = getLastFinishedStep(swap);\n\n return getTokenAmountInUsd(\n getLastFinishedStepInput(swap),\n lastSuccessfulStep?.step?.fromUsdPrice ?? ''\n );\n}\n\nexport function getLastSuccessfulStepOutputUsd(swap: PendingSwap): string {\n const lastSuccessfulStep = getLastSuccessfulStep(swap.steps);\n\n return getTokenAmountInUsd(\n lastSuccessfulStep?.outputAmount ?? '',\n lastSuccessfulStep?.toUsdPrice ?? ''\n );\n}\n\nexport function createStepFailedEvent(\n swap: PendingSwap,\n message: string,\n reasonCode?: APIErrorCode\n): NotifierParams['event'] & { type: StepEventType.FAILED } {\n return {\n type: StepEventType.FAILED,\n reason: message,\n reasonCode: reasonCode ?? DEFAULT_ERROR_CODE,\n inputAmount: getLastFinishedStepInput(swap),\n inputAmountUsd: getLastFinishedStepInputUsd(swap),\n };\n}\n", "export const ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES =\n 'Waiting for other swaps to complete';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET = 'Waiting for connecting wallet';\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET = (\n type: string | null,\n address: string | null\n): string =>\n `Please change your ${type || 'wallet'} account to ${\n address || 'proper address'\n }`;\nexport const ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION = (\n type: string | null\n): string => `Please connect your ${type ?? ''} wallet.`;\nexport const ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK = (\n network: string | null\n): string => `Please change your network to ${network}.`;\n\nexport const DEFAULT_ERROR_CODE = 'CLIENT_UNEXPECTED_BEHAVIOUR';\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { NamespaceInputForConnect } from '@rango-dev/wallets-core/dist/legacy/types';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n ConfirmRouteResponse,\n MetaResponse,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type {\n PendingSwap,\n PendingSwapStep,\n SwapSavedSettings,\n SwapStepRoute,\n WalletTypeAndAddress,\n} from 'rango-types';\n\nimport BigNumber from 'bignumber.js';\n\nimport { numberToString } from './numbers';\nimport { PrettyError } from './shared-errors';\n\nexport interface PendingSwapWithQueueID {\n id: string;\n swap: PendingSwap;\n}\n\nexport type WalletBalance = {\n chain: Network;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport type Account = {\n address: string;\n loading: boolean;\n walletType: WalletType;\n error: boolean;\n explorerUrl: string | null;\n isConnected?: boolean;\n};\nexport type Blockchain = { name: string; accounts: Account[] };\nexport type Wallet = { blockchains: Blockchain[] };\n\nexport type EventType =\n | 'swap_started'\n | 'confirm_contract'\n | 'confirm_transfer'\n | 'task_failed'\n | 'task_completed'\n | 'task_canceled'\n | 'task_paused'\n | 'contract_confirmed'\n | 'confirm_approve_contract'\n | 'contract_rejected'\n | 'check_tx_status'\n | 'check_approve_tx_status'\n | 'transfer_rejected'\n | 'transfer_failed'\n | 'calling_smart_contract'\n | 'smart_contract_called'\n | 'smart_contract_call_failed'\n | 'step_completed_with_output'\n | 'waiting_for_network_change'\n | 'waiting_for_connecting_wallet'\n | 'waiting_for_change_wallet_account'\n | 'network_changed'\n | 'not_enough_balance'\n | 'not_enough_approval'\n | 'waiting_for_queue'\n | 'check_fee_failed'\n | 'route_failed_to_find'\n | 'transaction_expired';\n\nexport enum MessageSeverity {\n error = 'error',\n warning = 'warning',\n info = 'info',\n success = 'success',\n}\n\nexport type SwapStatus = 'running' | 'failed' | 'success';\n\nexport interface TargetNamespace {\n namespace: NamespaceInputForConnect['namespace'];\n network: string;\n}\nexport const getCurrentNamespaceOfOrNull = (\n swap: PendingSwap,\n step: PendingSwapStep\n): TargetNamespace | null => {\n try {\n return getCurrentNamespaceOf(swap, step);\n } catch {\n return null;\n }\n};\n\nexport const getCurrentNamespaceOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): TargetNamespace => {\n const evmNetwork =\n step.evmTransaction?.blockChain || step.evmApprovalTransaction?.blockChain;\n const starknetNetwork =\n step.starknetTransaction?.blockChain ||\n step.starknetApprovalTransaction?.blockChain;\n const tronNetwork =\n step.tronTransaction?.blockChain ||\n step.tronApprovalTransaction?.blockChain;\n const cosmosNetwork = step.cosmosTransaction?.blockChain;\n const solanaNetwork = step.solanaTransaction?.blockChain;\n const tonNetwork = step.tonTransaction?.blockChain;\n const suiNetwork = step.suiTransaction?.blockChain;\n\n if (evmNetwork) {\n return {\n namespace: 'EVM',\n network: evmNetwork,\n };\n } else if (starknetNetwork) {\n return {\n namespace: 'Starknet',\n network: starknetNetwork,\n };\n } else if (tronNetwork) {\n return {\n namespace: 'Tron',\n network: tronNetwork,\n };\n } else if (cosmosNetwork) {\n return {\n namespace: 'Cosmos',\n network: cosmosNetwork,\n };\n } else if (solanaNetwork) {\n return {\n namespace: 'Solana',\n network: solanaNetwork,\n };\n } else if (tonNetwork) {\n return {\n namespace: 'Ton',\n network: tonNetwork,\n };\n } else if (suiNetwork) {\n return {\n namespace: 'Sui',\n network: suiNetwork,\n };\n } else if (!!step.transferTransaction) {\n const transferAddress = step.transferTransaction.fromWalletAddress;\n if (!transferAddress) {\n throw PrettyError.BlockchainMissing();\n }\n const utxoNetwork = Object.keys(swap.wallets).find(\n (network) => swap.wallets[network]?.address === transferAddress\n );\n if (!utxoNetwork) {\n throw PrettyError.BlockchainMissing();\n }\n\n return {\n namespace: 'UTXO',\n network: utxoNetwork,\n };\n }\n\n throw new Error(\n 'Unsupported transaction type has been included in your swap.',\n {\n cause: step,\n }\n );\n};\n\nexport const getScannerUrl = (\n txHash: string,\n network: Network,\n blockchainMetaMap: { [key: string]: BlockchainMeta }\n): string | undefined => {\n const blockchainMeta = blockchainMetaMap[network];\n const baseUrl = blockchainMeta.info?.transactionUrl;\n if (!baseUrl) {\n return;\n }\n if (baseUrl.indexOf('/{txHash}') !== -1) {\n return baseUrl.replace('{txHash}', txHash);\n }\n return `${baseUrl}/${txHash}`;\n};\n\nexport function getNextStep(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): PendingSwapStep | null {\n return (\n swap.steps.find(\n (step) =>\n step.status !== 'failed' &&\n step.status !== 'success' &&\n step.id !== currentStep.id\n ) || null\n );\n}\n\n/**\n * Returns the wallet type and address, based on the current step of `PendingSwap`.\n *\n * @param {PendingSwap} swap - The swap.\n * @param {PendingSwapStep} step - The current step.\n * @returns {WalletTypeAndAddress} Type and address related to the current step of the swap.\n */\nexport const getCurrentWalletTypeAndAddress = (\n swap: PendingSwap,\n step: PendingSwapStep\n): WalletTypeAndAddress => {\n const result =\n swap.wallets[step.evmTransaction?.blockChain || ''] ||\n swap.wallets[step.evmApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.tronTransaction?.blockChain || ''] ||\n swap.wallets[step.tronApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetTransaction?.blockChain || ''] ||\n swap.wallets[step.starknetApprovalTransaction?.blockChain || ''] ||\n swap.wallets[step.cosmosTransaction?.blockChain || ''] ||\n swap.wallets[step.solanaTransaction?.blockChain || ''] ||\n swap.wallets[step.tonTransaction?.blockChain || ''] ||\n swap.wallets[step.suiTransaction?.blockChain || ''] ||\n (step.transferTransaction?.fromWalletAddress\n ? {\n address: step.transferTransaction.fromWalletAddress,\n walletType: Object.values(swap.wallets).find(\n (wallet) =>\n wallet.address === step.transferTransaction?.fromWalletAddress\n )?.walletType,\n }\n : null) ||\n null;\n if (result == null) {\n throw PrettyError.WalletMissing();\n }\n return result;\n};\n\n/**\n * Returns the wallet address, based on the current step of `PendingSwap`.\n */\nexport const getCurrentAddressOf = (\n swap: PendingSwap,\n step: PendingSwapStep\n): string => {\n return getCurrentWalletTypeAndAddress(swap, step).address;\n};\n\nexport function getRelatedWallet(\n swap: PendingSwap,\n currentStep: PendingSwapStep\n): WalletTypeAndAddress {\n const { address, walletType: type } = getCurrentWalletTypeAndAddress(\n swap,\n currentStep\n );\n const walletKV =\n Object.keys(swap.wallets)\n .map((k) => ({ k, v: swap.wallets[k] }))\n .find(({ v }) => v.address === address && v.walletType === type) || null;\n const blockchain = walletKV?.k || null;\n const wallet = walletKV?.v || null;\n\n const walletType = wallet?.walletType;\n if (wallet === null) {\n throw PrettyError.AssertionFailed(\n `Wallet for source ${blockchain} not passed: walletType: ${walletType}`\n );\n }\n return wallet;\n}\n\nexport function getRelatedWalletOrNull(\n swap: PendingSwap,\n currentStep: PendingSwapStep | null\n): WalletTypeAndAddress | null {\n if (!currentStep) {\n return null;\n }\n try {\n return getRelatedWallet(swap, currentStep);\n } catch {\n return null;\n }\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = new BigNumber(0);\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nfunction mapSwapStepToPendingSwapStep(\n swap: SwapResult,\n meta: Pick<MetaResponse, 'blockchains' | 'tokens'> | null\n): SwapStepRoute {\n return {\n // from\n fromBlockchain: swap.from.blockchain,\n fromBlockchainLogo: swap.from.blockchainLogo,\n fromLogo: swap.from.logo,\n fromSymbol: swap.from.symbol,\n fromSymbolAddress: swap.from.address,\n fromDecimals: swap.from.decimals,\n fromAmountPrecision: swap.fromAmountPrecision,\n fromAmountMinValue: swap.fromAmountMinValue,\n fromAmountMaxValue: swap.fromAmountMaxValue,\n fromAmountRestrictionType: swap.fromAmountRestrictionType,\n fromUsdPrice: swap.from.usdPrice,\n\n // to\n toBlockchain: swap.to.blockchain,\n toBlockchainLogo: swap.to.blockchainLogo,\n toSymbol: swap.to.symbol,\n toSymbolAddress: swap.to.address,\n toDecimals: swap.to.decimals,\n toLogo: swap.to.logo,\n toUsdPrice: swap.to.usdPrice,\n\n // swapper\n swapperId: swap.swapperId,\n swapperLogo: swap.swapperLogo,\n swapperType: swap.swapperType,\n\n // route\n expectedOutputAmountHumanReadable: swap.toAmount,\n feeInUsd: meta\n ? // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n numberToString(getUsdFeeOfStep(swap, meta?.tokens), null, 8)\n : null,\n estimatedTimeInSeconds: swap.estimatedTimeInSeconds || null,\n internalSteps: null,\n };\n}\n\nexport function calculatePendingSwap(\n inputAmount: string,\n bestRoute: NonNullable<ConfirmRouteResponse['result']>,\n wallets: { [p: string]: WalletTypeAndAddress },\n settings: SwapSavedSettings,\n validateBalanceOrFee: boolean,\n meta: Pick<MetaResponse, 'blockchains' | 'tokens'> | null\n): PendingSwap {\n const simulationResult = bestRoute.result;\n if (!simulationResult) {\n throw Error('Simulation result should not be null');\n }\n\n return {\n creationTime: new Date().getTime().toString(),\n finishTime: null,\n requestId: bestRoute.requestId || '',\n inputAmount: inputAmount,\n wallets,\n status: 'running',\n isPaused: false,\n extraMessage: null,\n extraMessageSeverity: null,\n extraMessageDetail: null,\n extraMessageErrorCode: null,\n networkStatusExtraMessage: null,\n networkStatusExtraMessageDetail: null,\n lastNotificationTime: null,\n settings: settings,\n simulationResult: simulationResult,\n validateBalanceOrFee,\n steps:\n bestRoute.result?.swaps?.map((swap, index) => {\n const stepRoute = mapSwapStepToPendingSwapStep(swap, meta);\n return {\n id: index + 1,\n\n // route\n ...stepRoute,\n internalSwaps:\n swap?.internalSwaps?.map((internalSwap) => {\n const stepRoute = mapSwapStepToPendingSwapStep(\n internalSwap,\n meta\n );\n return stepRoute;\n }) || null,\n\n // status, tracking\n outputAmount: '',\n status: 'created',\n networkStatus: null,\n startTransactionTime: new Date().getTime(),\n externalTransactionId: null,\n executedTransactionId: null,\n executedTransactionTime: null,\n explorerUrl: null,\n diagnosisUrl: null,\n trackingCode: null,\n internalSteps: null,\n\n // transactions\n evmTransaction: null,\n evmApprovalTransaction: null,\n starknetTransaction: null,\n starknetApprovalTransaction: null,\n tronTransaction: null,\n tronApprovalTransaction: null,\n cosmosTransaction: null,\n solanaTransaction: null,\n transferTransaction: null,\n tonTransaction: null,\n suiTransaction: null,\n xrplTransaction: null,\n\n // front fields\n hasAlreadyProceededToSign: false,\n };\n }) || [],\n };\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const numberToString = (\n number: BigNumber | string | null,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null) return '';\n if (number === '') return '';\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) return n.toFormat(0, roundingMode);\n if (n.gte(1000))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(100))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n if (n.gte(1))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n if (n.gte(0.01))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n for (let i = minDecimals || 4; i < 17; i++)\n if (n.gte(Math.pow(10, -i)))\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n", "import type {\n APIErrorCode,\n SignerErrorCode as SignerErrorCodeType,\n} from 'rango-types';\nimport {\n SignerErrorCode,\n SignerError,\n isSignerErrorCode,\n isAPIErrorCode,\n} from 'rango-types';\nimport { DEFAULT_ERROR_CODE } from './constants';\n\nexport type ErrorDetail = {\n extraMessage: string;\n extraMessageDetail?: string | null | undefined;\n extraMessageErrorCode: SignerErrorCodeType | APIErrorCode | null;\n};\n\nconst ERROR_ASSERTION_FAILED = 'Assertion failed (Unexpected behaviour)';\nconst ERROR_CREATE_TRANSACTION = 'Create transaction failed in Rango Server';\nconst ERROR_INPUT_WALLET_NOT_FOUND = 'Input wallet not found';\n\ntype ErrorRoot = string | Record<string, string> | null;\n\nexport class PrettyError extends Error {\n private readonly detail?: string;\n private readonly root?: ErrorRoot;\n private readonly code?: APIErrorCode;\n public _isPrettyError = true;\n\n constructor(\n code: APIErrorCode,\n m: string,\n root?: ErrorRoot,\n detail?: string\n ) {\n super(m);\n Object.setPrototypeOf(this, PrettyError.prototype);\n PrettyError.prototype._isPrettyError = true;\n this.code = code;\n this.detail = detail;\n this.root = root;\n }\n\n static isPrettyError(obj: unknown): obj is PrettyError {\n return (\n obj instanceof PrettyError ||\n Object.prototype.hasOwnProperty.call(obj, '_isPrettyError')\n );\n }\n\n getErrorDetail(): ErrorDetail {\n const rawMessage =\n typeof this.root === 'object' && this.root && this.root.error\n ? this.root.error\n : JSON.stringify(this.root);\n const rootStr =\n typeof this.root === 'string'\n ? this.root\n : this.root instanceof Error\n ? this.root.message\n : rawMessage;\n return {\n extraMessage: this.message,\n extraMessageDetail: this.detail || rootStr,\n extraMessageErrorCode: this.code || null,\n };\n }\n\n static AssertionFailed(m: string): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_ASSERTION_FAILED,\n null,\n m\n );\n }\n\n static BadStatusCode(\n message: string,\n statusCode: number | string\n ): PrettyError {\n return new PrettyError(\n 'TX_FAIL',\n message,\n null,\n `status code = ${statusCode}`\n );\n }\n\n static CreateTransaction(detail: string): PrettyError {\n return new PrettyError(\n 'FETCH_TX_FAILED',\n ERROR_CREATE_TRANSACTION,\n null,\n detail\n );\n }\n\n static WalletMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n\n static BlockchainMissing(): PrettyError {\n return new PrettyError(\n 'CLIENT_UNEXPECTED_BEHAVIOUR',\n ERROR_INPUT_WALLET_NOT_FOUND,\n null,\n 'Server requested for a blockchain or address not selected by user'\n );\n }\n}\n\nexport function mapAppErrorCodesToAPIErrorCode(\n errorCode: string | null\n): APIErrorCode {\n try {\n if (!errorCode) return DEFAULT_ERROR_CODE;\n if (isAPIErrorCode(errorCode)) return errorCode;\n if (isSignerErrorCode(errorCode)) {\n const t: { [key in SignerErrorCodeType]: APIErrorCode } = {\n [SignerErrorCode.REJECTED_BY_USER]: 'USER_REJECT',\n [SignerErrorCode.SIGN_TX_ERROR]: 'CALL_WALLET_FAILED',\n [SignerErrorCode.SEND_TX_ERROR]: 'SEND_TX_FAILED',\n [SignerErrorCode.TX_FAILED_IN_BLOCKCHAIN]: 'TX_FAILED_IN_BLOCKCHAIN',\n [SignerErrorCode.NOT_IMPLEMENTED]: DEFAULT_ERROR_CODE,\n [SignerErrorCode.OPERATION_UNSUPPORTED]: DEFAULT_ERROR_CODE,\n [SignerErrorCode.UNEXPECTED_BEHAVIOUR]: DEFAULT_ERROR_CODE,\n };\n return t[errorCode];\n }\n return DEFAULT_ERROR_CODE;\n } catch (err) {\n return DEFAULT_ERROR_CODE;\n }\n}\n\nexport const prettifyErrorMessage = (obj: unknown): ErrorDetail => {\n if (!obj) return { extraMessage: '', extraMessageErrorCode: null };\n if (PrettyError.isPrettyError(obj)) return obj.getErrorDetail();\n if (SignerError.isSignerError(obj)) {\n const t = obj.getErrorDetail();\n return {\n extraMessage: t.message,\n extraMessageDetail: t.detail,\n extraMessageErrorCode: t.code,\n };\n }\n if (obj instanceof Error)\n return {\n extraMessage: obj.toString(),\n extraMessageErrorCode: null,\n };\n if (typeof obj !== 'string')\n return {\n extraMessage: JSON.stringify(obj),\n extraMessageErrorCode: null,\n };\n return { extraMessage: obj, extraMessageErrorCode: null };\n};\n", "import type {\n RemoveNameField,\n Route,\n RouteEvent,\n Step,\n StepEvent,\n} from '../types';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { getConfig } from '../configs';\nimport {\n getCurrentStepTx,\n getFailedStep,\n getLastSuccessfulStep,\n getSwapInputUsd,\n getSwapOutputUsd,\n isApprovalCurrentStepTx,\n} from '../helpers';\nimport { getCurrentNamespaceOfOrNull } from '../shared';\nimport {\n EventSeverity,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n WidgetEvents,\n} from '../types';\n\nexport type NotifierParams = {\n swap: PendingSwap;\n step: PendingSwapStep | null;\n} & {\n event: RemoveNameField<StepEvent, 'message' | 'messageSeverity'>;\n};\n\nfunction createSteps(swapSteps: PendingSwapStep[]): Step[] {\n return swapSteps.map((swapStep) => {\n const {\n diagnosisUrl,\n estimatedTimeInSeconds,\n explorerUrl,\n feeInUsd,\n executedTransactionId,\n executedTransactionTime,\n expectedOutputAmountHumanReadable,\n fromBlockchain,\n toBlockchain,\n fromSymbol,\n toSymbol,\n fromSymbolAddress,\n toSymbolAddress,\n swapperType,\n swapperId,\n outputAmount,\n fromAmountMaxValue,\n fromAmountMinValue,\n fromAmountPrecision,\n fromAmountRestrictionType,\n fromDecimals,\n status: stepStatus,\n } = swapStep;\n\n const step: Step = {\n diagnosisUrl,\n estimatedTimeInSeconds,\n explorerUrl,\n feeInUsd,\n executedTransactionId,\n executedTransactionTime,\n expectedOutputAmountHumanReadable,\n fromBlockchain,\n toBlockchain,\n fromSymbol,\n toSymbol,\n fromSymbolAddress,\n toSymbolAddress,\n swapperName: swapperId,\n swapperType,\n outputAmount,\n fromAmountMaxValue,\n fromAmountMinValue,\n fromAmountPrecision,\n fromAmountRestrictionType,\n fromDecimals,\n status: stepStatus,\n transaction: getCurrentStepTx(swapStep),\n };\n\n return step;\n });\n}\n\nfunction getEventPayload(\n swap: PendingSwap,\n type: StepEventType | RouteEventType,\n swapStep?: PendingSwapStep\n): { route: Route; step: Step } {\n const {\n creationTime,\n finishTime,\n requestId,\n inputAmount,\n status,\n wallets,\n steps,\n settings,\n } = swap;\n\n const routeSteps = createSteps(steps);\n const route: Route = {\n creationTime,\n finishTime,\n requestId,\n inputAmount,\n status,\n wallets,\n steps: routeSteps,\n slippage: settings.slippage,\n infiniteApproval: settings.infiniteApprove,\n };\n\n const result: { route: Route; step: Step } = {\n route,\n step: routeSteps[routeSteps.length - 1],\n };\n if (swapStep) {\n result.step = createSteps([swapStep])[0];\n } else {\n if (type === 'failed') {\n const failedStep = getFailedStep(routeSteps);\n if (failedStep) {\n result.step = failedStep;\n }\n } else {\n const lastSuccessfulStep = getLastSuccessfulStep(routeSteps);\n if (lastSuccessfulStep) {\n result.step = lastSuccessfulStep;\n }\n }\n }\n\n return result;\n}\n\nfunction emitRouteEvent(stepEvent: StepEvent, route: Route, swap: PendingSwap) {\n let routeEvent: RouteEvent | undefined;\n const { type } = stepEvent;\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (type) {\n case StepEventType.STARTED:\n routeEvent = { ...stepEvent, type: RouteEventType.STARTED };\n break;\n case StepEventType.FAILED:\n routeEvent = {\n ...stepEvent,\n type: RouteEventType.FAILED,\n inputAmount: swap.inputAmount,\n inputAmountUsd: getSwapInputUsd(swap),\n };\n break;\n case StepEventType.SUCCEEDED: {\n routeEvent = {\n ...stepEvent,\n type: RouteEventType.SUCCEEDED,\n inputAmount: swap.inputAmount,\n inputAmountUsd: getSwapInputUsd(swap),\n outputAmount: swap.steps[swap.steps.length - 1].outputAmount ?? '',\n outputAmountUsd: getSwapOutputUsd(swap),\n };\n break;\n }\n default:\n break;\n }\n if (routeEvent) {\n const eventEmitter = getConfig('emitter');\n eventEmitter?.emit(WidgetEvents.RouteEvent, { event: routeEvent, route });\n }\n}\n\nfunction emitStepEvent(stepEvent: StepEvent, route: Route, step: Step) {\n const eventEmitter = getConfig('emitter');\n eventEmitter?.emit(WidgetEvents.StepEvent, { event: stepEvent, route, step });\n}\n\nexport function notifier(params: NotifierParams) {\n const { event } = params;\n const { type } = event;\n const { route, step } = getEventPayload(\n params.swap,\n type,\n params.step ?? undefined\n );\n const fromAsset = `${step.fromBlockchain}.${step.fromSymbol}`;\n const toAsset = `${step.toBlockchain}.${step.toSymbol}`;\n const outputAmount = step.outputAmount ?? '';\n const currentFromNamespace = !!params.step\n ? getCurrentNamespaceOfOrNull(params.swap, params.step)\n : null;\n let message = '';\n let messageSeverity: StepEvent['messageSeverity'] = EventSeverity.INFO;\n\n switch (type) {\n case StepEventType.STARTED:\n message = 'Swap process started';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.SUCCEEDED:\n message = `You received ${outputAmount} ${toAsset}, hooray!`;\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.FAILED:\n message = `Swap failed: ${\n params.swap?.extraMessage ?? 'Reason is unknown'\n }`;\n messageSeverity = EventSeverity.ERROR;\n break;\n case StepEventType.TX_EXECUTION:\n if (event.status === StepExecutionEventStatus.CREATE_TX) {\n message = 'Please wait while the transaction is created ...';\n messageSeverity = EventSeverity.INFO;\n } else if (event.status === StepExecutionEventStatus.SEND_TX) {\n if (params.step && isApprovalCurrentStepTx(params.step)) {\n message = `Please confirm '${step.swapperName}' smart contract access to ${fromAsset}`;\n } else {\n message = 'Please confirm transaction request in your wallet';\n }\n messageSeverity = EventSeverity.WARNING;\n } else if (event.status === StepExecutionEventStatus.TX_SENT) {\n message = 'Transaction sent successfully';\n messageSeverity = EventSeverity.INFO;\n }\n break;\n case StepEventType.CHECK_STATUS:\n if (params.step && isApprovalCurrentStepTx(params.step)) {\n message = 'Checking approve transaction status ...';\n } else {\n message = 'Checking transaction status ...';\n }\n messageSeverity = EventSeverity.INFO;\n break;\n case StepEventType.APPROVAL_TX_SUCCEEDED:\n message = 'Smart contract called successfully';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n case StepEventType.OUTPUT_REVEALED:\n message = 'Transaction output amount revealed';\n messageSeverity = EventSeverity.SUCCESS;\n break;\n\n case StepEventType.TX_EXECUTION_BLOCKED:\n if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT\n ) {\n message = 'Please connect your wallet.';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status === StepExecutionBlockedEventStatus.WAITING_FOR_QUEUE\n ) {\n message = 'Waiting for other swaps to complete';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT\n ) {\n message = 'Please change your wallet account.';\n messageSeverity = EventSeverity.WARNING;\n } else if (\n event.status ===\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE\n ) {\n message = `Please change your wallet network to ${currentFromNamespace?.network}.`;\n messageSeverity = EventSeverity.WARNING;\n }\n break;\n\n default:\n break;\n }\n\n if (params.step) {\n emitStepEvent({ ...event, message, messageSeverity }, route, step);\n }\n if (params.event.type === StepEventType.FAILED || !params.step) {\n emitRouteEvent({ ...event, message, messageSeverity }, route, params.swap);\n }\n}\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type { CreateTransactionRequest } from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\n\nimport {\n createStepFailedEvent,\n getCurrentStep,\n getCurrentStepTx,\n setCurrentStepTx,\n throwOnOK,\n updateSwapStatus,\n} from '../helpers';\nimport { httpService } from '../services';\nimport { notifier } from '../services/eventEmitter';\nimport { prettifyErrorMessage } from '../shared-errors';\nimport {\n StepEventType,\n StepExecutionEventStatus,\n SwapActionTypes,\n} from '../types';\n\n/**\n *\n * When a user asks for a swap, We first create the transaction by sending a request to server\n * Server will return the transaction that need to be sent to wallet.\n * It can be failed if server goes through an error, If not, we will schedule the `EXECTUTE_TRANSACTION`.\n *\n */\nexport async function createTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { setStorage, getStorage, next, schedule } = actions;\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n const transaction = getCurrentStepTx(currentStep);\n\n if (!transaction) {\n notifier({\n event: {\n type: StepEventType.TX_EXECUTION,\n status: StepExecutionEventStatus.CREATE_TX,\n },\n swap,\n step: currentStep,\n });\n const request: CreateTransactionRequest = {\n requestId: swap.requestId,\n step: currentStep.id,\n userSettings: {\n slippage: swap.settings.slippage,\n infiniteApprove: swap.settings.infiniteApprove,\n },\n validations: {\n balance: swap.validateBalanceOrFee,\n fee: swap.validateBalanceOrFee,\n approve: true,\n },\n };\n try {\n // Getting transcation from server.\n\n const { transaction } = await throwOnOK(\n httpService().createTransaction(request)\n );\n\n if (transaction) {\n setCurrentStepTx(currentStep, transaction);\n }\n\n setStorage({ ...getStorage(), swapDetails: swap });\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n next();\n } catch (error: unknown) {\n swap.status = 'failed';\n swap.finishTime = new Date().getTime().toString();\n const { extraMessage, extraMessageDetail } = prettifyErrorMessage(error);\n\n const updateResult = updateSwapStatus({\n getStorage,\n setStorage,\n nextStatus: 'failed',\n nextStepStatus: 'failed',\n message: extraMessage,\n details: extraMessageDetail,\n errorCode: 'FETCH_TX_FAILED',\n });\n\n const event = createStepFailedEvent(\n swap,\n extraMessage,\n updateResult.failureType\n );\n\n notifier({\n event,\n ...updateResult,\n });\n\n if (error instanceof Error) {\n warn(new Error('create transaction error'), {\n tags: {\n message: error.message,\n requestBody: request,\n reason: event.reason,\n reasonCode: event.reasonCode,\n pendingSwap: swap,\n },\n });\n }\n\n actions.failed();\n }\n }\n}\n", "import type { SwapActionTypes, SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport {\n ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION,\n ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET,\n} from '../constants';\nimport {\n claimQueue,\n getCurrentStep,\n getRequiredWallet,\n isNeedBlockQueueForParallel,\n isNetworkMatchedForTransaction,\n isRequiredWalletConnected,\n isWalletNull,\n signTransaction,\n updateNetworkStatus,\n} from '../helpers';\nimport { getCurrentNamespaceOf } from '../shared';\nimport { BlockReason } from '../types';\n\n/**\n * Excecute a created transaction.\n *\n * This function implemented the parallel mode by `claim` mechanism which means\n * All the queues the meet certain situation (like multiple evm transaction) will go through\n * a `claim` mechanims that decides which queue should be run and it blocks other ones.\n *\n * A queue will be go to sign process, if the wallet and network is matched.\n */\nexport async function executeTransaction(\n actions: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>\n): Promise<void> {\n const { getStorage, context } = actions;\n const { meta, wallets, providers } = context;\n const { claimedBy } = claimQueue();\n\n const isClaimed = context.claimedBy === context._queue?.id;\n const requestBlock: typeof actions.block = (blockedFor) => {\n actions.block(blockedFor);\n if (isClaimed && actions.context.resetClaimedBy) {\n actions.context.resetClaimedBy();\n }\n };\n\n const swap = getStorage().swapDetails;\n\n const currentStep = getCurrentStep(swap)!;\n\n /* Make sure wallet is connected and also the connected wallet is matched with tx by checking address. */\n const isWrongAddress = !isRequiredWalletConnected(swap, context.state).ok;\n if (isWrongAddress) {\n const { type, address } = getRequiredWallet(swap);\n const isWalletInCompatible = wallets?.blockchains?.find(\n (w) => !w.accounts?.find((account) => account.walletType === type)\n );\n const description =\n isWalletNull(wallets) || isWalletInCompatible\n ? ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION(type)\n : ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET(type, address);\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_CONNECT_WALLET,\n description,\n };\n requestBlock(blockedFor);\n return;\n }\n\n /* Wallet should be on correct network */\n const networkMatched = await isNetworkMatchedForTransaction(\n swap,\n currentStep,\n wallets,\n meta,\n providers\n );\n const claimerId = claimedBy();\n const isClaimedByAnyQueue = !!claimerId && !isClaimed;\n if (isClaimedByAnyQueue && !networkMatched) {\n const details = ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES;\n\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n } else if (!networkMatched) {\n const fromNamespace = getCurrentNamespaceOf(swap, currentStep);\n const details = ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK(\n fromNamespace.network\n );\n\n const blockedFor = {\n reason: BlockReason.WAIT_FOR_NETWORK_CHANGE,\n details: details,\n };\n requestBlock(blockedFor);\n return;\n }\n // Update network to mark it as network changed successfully.\n updateNetworkStatus(actions, {\n message: '',\n details: 'The network has been successfully changed.',\n status: PendingSwapNetworkStatus.NetworkChanged,\n });\n\n /*\n *For avoiding conflict by making too many requests to wallet, we need to make sure\n *We only run one request at a time (In parallel mode).\n */\n const needsToBlockQueue = isNeedBlockQueueForParallel(currentStep);\n\n if (needsToBlockQueue && !isClaimed) {\n const blockedFor = {\n reason: BlockReason.DEPENDS_ON_OTHER_QUEUES,\n description: ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES,\n details: {},\n };\n requestBlock(blockedFor);\n return;\n }\n\n // All the conditions are met. We can safely send the tx to wallet for sign.\n await signTransaction(actions);\n}\n", "import type { SwapQueueContext, SwapStorage } from '../types';\nimport type { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport {\n getCurrentStep,\n getLastFinishedStepInput,\n getLastFinishedStepInputUsd,\n getLastSuccessfulStep,\n getLastSuccessfulStepOutputUsd,\n isTxAlreadyCreated,\n} from '../helpers';\nimport { notifier } from '../services/eventEmitter';\nimport { StepEventType, SwapActionTypes } from '../types';\n\n/**\n *\n * This function is responsibe for scheduling the correct `action` based on `PendingSwap` status.\n * It means `action`s schedule this step to decide what should be the next step/task.\n *\n * It's acts like a `while(true)` and will `break` the loop on certain `action`s like `CHECK_STATUS`.\n *\n *\n */\nexport function scheduleNextStep({\n schedule,\n next,\n failed,\n setStorage,\n getStorage,\n}: ExecuterActions<SwapStorage, SwapActionTypes, SwapQueueContext>): void {\n const swap = getStorage().swapDetails;\n const currentStep = getCurrentStep(swap);\n const isFailed = swap.steps.find(\n (step: PendingSwapStep) => step.status === 'failed'\n );\n\n if (!!currentStep && !isFailed) {\n if (isTxAlreadyCreated(swap, currentStep)) {\n schedule(SwapActionTypes.EXECUTE_TRANSACTION);\n return next();\n }\n\n if (currentStep?.executedTransactionId) {\n schedule(SwapActionTypes.CHECK_TRANSACTION_STATUS);\n return next();\n }\n\n swap.status = 'running';\n\n setStorage({ ...getStorage(), swapDetails: swap });\n\n notifier({\n event: { type: StepEventType.STARTED },\n swap,\n step: currentStep,\n });\n\n schedule(SwapActionTypes.CREATE_TRANSACTION);\n next();\n } else {\n swap.status = isFailed ? 'failed' : 'success';\n swap.finishTime = new Date().getTime().toString();\n\n setStorage({\n ...getStorage(),\n swapDetails: swap,\n });\n\n const inputAmount = getLastFinishedStepInput(swap);\n const inputAmountUsd = getLastFinishedStepInputUsd(swap);\n\n notifier({\n ...(isFailed\n ? {\n event: {\n type: StepEventType.FAILED,\n reason: swap.extraMessage ?? undefined,\n reasonCode: 'CALL_OR_SEND_FAILED',\n inputAmount,\n inputAmountUsd,\n },\n }\n : {\n event: {\n type: StepEventType.SUCCEEDED,\n inputAmount,\n inputAmountUsd,\n outputAmount:\n getLastSuccessfulStep(swap.steps)?.outputAmount ?? '',\n outputAmountUsd: getLastSuccessfulStepOutputUsd(swap),\n },\n }),\n swap: swap,\n step: null,\n });\n\n if (isFailed) {\n failed();\n } else {\n next();\n }\n }\n}\n", "import { ExecuterActions } from '@rango-dev/queue-manager-core';\nimport { StepEventType, SwapActionTypes, SwapStorage } from '../types';\nimport { notifier } from '../services/eventEmitter';\n\nexport function start({\n schedule,\n next,\n getStorage,\n}: ExecuterActions<SwapStorage, SwapActionTypes>): void {\n const swap = getStorage().swapDetails;\n\n notifier({ event: { type: StepEventType.STARTED }, swap, step: null });\n\n schedule(SwapActionTypes.SCHEDULE_NEXT_STEP);\n next();\n}\n", "import { BlockReason, SwapActionTypes, SwapQueueDef } from './types';\nimport { checkStatus } from './actions/checkStatus';\nimport { createTransaction } from './actions/createTransaction';\nimport { executeTransaction } from './actions/executeTransaction';\nimport { scheduleNextStep } from './actions/scheduleNextStep';\nimport { start } from './actions/start';\nimport {\n onBlockForChangeNetwork,\n onBlockForConnectWallet,\n onDependsOnOtherQueues,\n} from './helpers';\n\n/**\n *\n * The idea behind this queue is to be able dynamically add some steps.\n * After running a swap, it can be blocked (like on waiting for switch netwrok)\n * or waits for something happend (like checking status of a transaction from server)\n *\n */\nexport const swapQueueDef: SwapQueueDef = {\n name: 'swap',\n actions: {\n [SwapActionTypes.START]: start,\n [SwapActionTypes.SCHEDULE_NEXT_STEP]: scheduleNextStep,\n [SwapActionTypes.CREATE_TRANSACTION]: createTransaction,\n [SwapActionTypes.EXECUTE_TRANSACTION]: executeTransaction,\n [SwapActionTypes.CHECK_TRANSACTION_STATUS]: checkStatus,\n },\n run: [SwapActionTypes.START],\n whenTaskBlocked: (event, meta) => {\n if (event.reason.reason === BlockReason.WAIT_FOR_CONNECT_WALLET) {\n onBlockForConnectWallet(event, meta);\n } else if (event.reason.reason === BlockReason.WAIT_FOR_NETWORK_CHANGE) {\n onBlockForChangeNetwork(event, meta);\n } else if (event.reason.reason === BlockReason.DEPENDS_ON_OTHER_QUEUES) {\n onDependsOnOtherQueues(event, meta);\n }\n },\n};\n", "import type { LastConnectedWallet, UseQueueManagerParams } from './types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect, useState } from 'react';\n\nimport {\n checkWaitingForConnectWalletChange,\n checkWaitingForNetworkChange,\n retryOn,\n} from './helpers';\nimport { migrated, migration } from './migration';\n\nlet isCalled = 0;\n\nfunction getLastConnectedWalletHash(\n lastConnectedWallet: LastConnectedWallet | null\n) {\n return `${lastConnectedWallet?.walletType}-${\n lastConnectedWallet?.network\n }-${lastConnectedWallet?.accounts?.toString()}`;\n}\n\n/**\n *\n * Runs a migration (old swaps from localstorage to queue manager's IndexedDB)\n * It will be run only once on page load.\n *\n */\nfunction useMigration(): {\n status: boolean;\n} {\n const isMigrated = migrated();\n const [status, setStatus] = useState<boolean>(isMigrated);\n\n useEffect(() => {\n void (async () => {\n // Preventing react to be called twice on Strict Mode (development)\n if (isCalled) {\n return;\n }\n isCalled = 1;\n\n void migration().finally(() => {\n setStatus(true);\n });\n })();\n }, []);\n\n return {\n status,\n };\n}\n\n/**\n *\n * On initial load and also connect/disconnect we may need to update swap's notified message.\n * And also if a new wallet is connected we will retry the queue to see we can resume it or not.\n *\n */\nfunction useQueueManager(params: UseQueueManagerParams): void {\n const { manager } = useManager();\n const {\n lastConnectedWallet,\n disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n clearDisconnectedWallet,\n } = params;\n\n useEffect(() => {\n if (lastConnectedWallet) {\n checkWaitingForConnectWalletChange({\n evmChains,\n lastConnectedWallet,\n manager,\n });\n retryOn(lastConnectedWallet, manager, canSwitchNetworkTo);\n }\n }, [getLastConnectedWalletHash(lastConnectedWallet)]);\n\n useEffect(() => {\n if (disconnectedWallet) {\n checkWaitingForNetworkChange(manager);\n\n /*\n *We need to reset the state value, so if a wallet disconnected twice (after reconnect),\n *this effect will be run properly.\n */\n clearDisconnectedWallet();\n }\n }, [disconnectedWallet]);\n}\n\nexport { useQueueManager, useMigration };\n", "import type { PersistedQueue } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types';\n\nimport { DB_NAME, Persistor, Status } from '@rango-dev/queue-manager-core';\nimport { v4 as uuid } from 'uuid';\n\nimport { SwapActionTypes } from './types';\n\nconst MIGRATED_KEY = 'migratedToQueueManager';\n\n/**\n *\n * If `MIGRATED_KEY` is set, it means we already migrated data from localstorage.\n *\n */\nfunction migrated(): boolean {\n return !!window.localStorage.getItem(MIGRATED_KEY);\n}\n\nasync function hasQueueManagerOnIDB(): Promise<boolean> {\n try {\n return (await (window.indexedDB as any).databases())\n .map((db: any) => db.name)\n .includes(DB_NAME);\n } catch {\n return false;\n }\n}\n\n/**\n *\n * By calling this function, we first check if the data already migrated or not,\n * If not, starting to migrating to IndexedDb with proper format that queue manager is understand.\n *\n */\nasync function migration(): Promise<boolean> {\n const swapsFromStorage = window.localStorage.getItem('pendingSwaps');\n const hasIndexDB = await hasQueueManagerOnIDB();\n\n // For new users or already migrated.\n if (!swapsFromStorage || migrated() || hasIndexDB) {\n return true;\n }\n\n // For old users, but they didn't do any swaps yet.\n const swaps: PendingSwap[] = JSON.parse(swapsFromStorage);\n const convertedSwaps: PersistedQueue[] = [];\n\n swaps.forEach((swap) => {\n /*\n *For running task we need to add some more work\n *We need to create a queue task to be run and resume the running task from queue manager.\n */\n if (swap.status === 'running') {\n const taskId = uuid();\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status: Status.RUNNING,\n storage: {\n swapDetails: swap,\n },\n state: {\n status: Status.RUNNING,\n activeTaskIndex: 0,\n tasks: {\n [taskId]: {\n blockedFor: null,\n status: Status.RUNNING,\n },\n },\n },\n tasks: [\n {\n id: taskId,\n action: SwapActionTypes.SCHEDULE_NEXT_STEP,\n },\n ],\n };\n convertedSwaps.push(convertedSwap);\n } else {\n /*\n * For failed or successful swaps, we only move it to IndexedDB,\n * And there is no need to consider them to be run.\n */\n const status = swap.status === 'success' ? Status.SUCCESS : Status.FAILED;\n\n const convertedSwap: PersistedQueue = {\n id: swap.requestId,\n createdAt: Number(swap.creationTime),\n name: 'swap',\n status,\n storage: {\n swapDetails: swap,\n },\n state: {\n status,\n activeTaskIndex: 0,\n tasks: {},\n },\n tasks: [],\n };\n\n convertedSwaps.push(convertedSwap);\n }\n });\n\n // Getting an instance from persistor, so we can directly put our data inside it.\n const persistor = new Persistor();\n\n const promises = convertedSwaps.map(async (queue) =>\n persistor.insertQueue(queue)\n );\n await Promise.all(promises);\n\n // Mark as the data has been successfully migrated.\n window.localStorage.setItem(MIGRATED_KEY, '1');\n\n return true;\n}\n\nexport { migration, migrated };\n", "import type { Configs } from './configs';\nimport type { SwapQueueDef } from './types';\n\nimport { initConfig } from './configs';\nimport { swapQueueDef } from './queueDef';\n\nexport { PrettyError, prettifyErrorMessage } from './shared-errors';\nexport type {\n SwapQueueContext,\n SwapStorage,\n RouteExecutionEvents,\n Route,\n Step,\n RouteEvent,\n StepEvent,\n RouteEventData,\n StepEventData,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n LastConnectedWallet,\n} from './types';\nexport {\n WidgetEvents,\n StepEventType,\n RouteEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n EventSeverity,\n} from './types';\nexport type {\n PendingSwapWithQueueID,\n EventType,\n TargetNamespace,\n} from './shared';\nexport {\n getCurrentNamespaceOfOrNull,\n getRelatedWalletOrNull,\n getRelatedWallet,\n MessageSeverity,\n calculatePendingSwap,\n getUsdPrice,\n} from './shared';\nexport {\n updateSwapStatus,\n checkWaitingForNetworkChange,\n getCurrentStep,\n cancelSwap,\n getRequiredWallet,\n getRunningSwaps,\n resetRunningSwapNotifsOnPageLoad,\n isApprovalTX,\n getLastSuccessfulStep,\n} from './helpers';\nexport { useMigration, useQueueManager } from './hooks';\n\nexport function makeQueueDefinition(configs: Configs): SwapQueueDef {\n initConfig(configs);\n return swapQueueDef;\n}\n"],
|
|
5
|
+
"mappings": "iFAiBA,IAAMA,GAAuB,uCAEzBC,GAAmB,CACrB,QAASD,GACT,SAAU,EACZ,EAEO,SAASE,EAAmCC,EAAqB,CACtE,OAAOF,GAAQE,CAAI,CACrB,CAFgBC,EAAAF,EAAA,aAUT,SAASG,GAAWC,EAAsB,CAC/C,OAAAC,GAAUD,EACHC,EACT,CAHgBC,EAAAH,GAAA,cCmET,IAAKI,QACVA,EAAA,WAAa,aACbA,EAAA,UAAY,YAFFA,QAAA,IA0CAC,QACVA,EAAA,QAAU,UACVA,EAAA,OAAS,SACTA,EAAA,UAAY,YAHFA,QAAA,IAMAC,QACVA,EAAA,UAAY,YACZA,EAAA,QAAU,UACVA,EAAA,QAAU,UAHAA,QAAA,IAMAC,QACVA,EAAA,kBAAoB,oBACpBA,EAAA,2BAA6B,6BAC7BA,EAAA,2BAA6B,6BAC7BA,EAAA,kCAAoC,oCAJ1BA,QAAA,IAOAC,OACVA,EAAA,QAAU,UACVA,EAAA,OAAS,SACTA,EAAA,UAAY,YACZA,EAAA,aAAe,eACfA,EAAA,qBAAuB,uBACvBA,EAAA,sBAAwB,wBACxBA,EAAA,aAAe,eACfA,EAAA,gBAAkB,kBARRA,OAAA,IAWAC,QACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,KAAO,OAJGA,QAAA,ICrKZ,OAAS,QAAAC,OAAY,0BACrB,OAA6B,eAAAC,OAAmB,cCkChD,OAAS,QAAAC,OAAY,0BACrB,OAAS,UAAAC,OAAc,gCACvB,OAAS,4BAA4BC,OAA0B,iCAC/D,OACE,2BAAAC,GACA,kBAAAC,OACK,4BACP,OAAOC,OAAe,eACtB,OACE,4BAAAC,EACA,eAAAC,GACA,mBAAAC,MACK,cCvDA,IAAMC,GACX,sCACWC,GAAgC,gCAChCC,GAAyDC,EAAA,CACpEC,EACAC,IAEA,sBAAsBD,GAAQ,QAAQ,eACpCC,GAAW,gBACb,GANoE,0DAOzDC,GAA4CH,EACvDC,GACW,uBAAuBA,GAAQ,EAAE,WAFW,6CAG5CG,GAAwCJ,EACnDK,GACW,iCAAiCA,CAAO,IAFA,yCAIxCC,EAAqB,8BCjBlC,OAAS,eAAAC,OAAmB,YAG5B,IAAIC,GAESC,EAAcC,EAAA,IACrBF,KACJA,GAAQ,IAAIG,GAAYC,EAAU,SAAS,EAAGA,EAAU,UAAU,CAAC,EAC5DJ,IAHkB,eCY3B,OAAOK,OAAe,eCjBtB,OAAOC,OAAe,eAEf,IAAMC,GAAiBC,EAAA,CAC5BC,EACAC,EAA6B,KAC7BC,EAA6B,OAClB,CAEX,GADIF,IAAW,MACXA,IAAW,GAAI,MAAO,GAC1B,IAAMG,EAAI,IAAIC,GAAUJ,CAAM,EACxBK,EAAe,EACjBC,EAAO,IACX,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtB,GAAI,IAAIH,GAAUD,EAAE,QAAQI,EAAGF,CAAY,CAAC,EAAE,GAAGF,CAAC,EAAG,CACnDG,EAAOC,EACP,KACF,CAGF,GAAIJ,EAAE,IAAI,GAAK,EAAG,OAAOA,EAAE,SAAS,EAAGE,CAAY,EASnD,GARIF,EAAE,IAAI,GAAI,GAQVA,EAAE,IAAI,GAAG,EACX,OAAOA,EAAE,SACP,KAAK,IACHG,EACA,KAAK,IAAIJ,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAI,CACF,EACF,GAAIF,EAAE,IAAI,CAAC,EACT,OAAOA,EAAE,SACP,KAAK,IACHG,EACA,KAAK,IAAIJ,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAI,CACF,EACF,GAAIF,EAAE,IAAI,GAAI,EACZ,OAAOA,EAAE,SACP,KAAK,IACHG,EACA,KAAK,IAAIJ,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAI,CACF,EACF,QAASE,EAAIN,GAAe,EAAGM,EAAI,GAAIA,IACrC,GAAIJ,EAAE,IAAI,KAAK,IAAI,GAAI,CAACI,CAAC,CAAC,EACxB,OAAOJ,EAAE,SACP,KAAK,IACHG,EACA,KAAK,IAAIJ,GAAe,IAAK,KAAK,IAAID,GAAe,EAAGM,CAAC,CAAC,CAC5D,EACAF,CACF,EACJ,OAAIF,EAAE,UAAU,CAAC,EAAU,IAEpBA,EAAE,SACP,KAAK,IAAIG,EAAM,KAAK,IAAIJ,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAAC,EAC1EI,CACF,CACF,EAjE8B,kBCE9B,OACE,mBAAAG,EACA,eAAAC,GACA,qBAAAC,GACA,kBAAAC,OACK,cASP,IAAMC,GAAyB,0CACzBC,GAA2B,4CAC3BC,GAA+B,yBAIxBC,EAAN,MAAMC,UAAoB,KAAM,CAMrC,YACEC,EACAC,EACAC,EACAC,EACA,CACA,MAAMF,CAAC,EART,KAAO,eAAiB,GAStB,OAAO,eAAe,KAAMF,EAAY,SAAS,EACjDA,EAAY,UAAU,eAAiB,GACvC,KAAK,KAAOC,EACZ,KAAK,OAASG,EACd,KAAK,KAAOD,CACd,CA1CF,MAwBuC,CAAAE,EAAA,oBAoBrC,OAAO,cAAcC,EAAkC,CACrD,OACEA,aAAeN,GACf,OAAO,UAAU,eAAe,KAAKM,EAAK,gBAAgB,CAE9D,CAEA,gBAA8B,CAC5B,IAAMC,EACJ,OAAO,KAAK,MAAS,UAAY,KAAK,MAAQ,KAAK,KAAK,MACpD,KAAK,KAAK,MACV,KAAK,UAAU,KAAK,IAAI,EACxBC,EACJ,OAAO,KAAK,MAAS,SACjB,KAAK,KACL,KAAK,gBAAgB,MACrB,KAAK,KAAK,QACVD,EACN,MAAO,CACL,aAAc,KAAK,QACnB,mBAAoB,KAAK,QAAUC,EACnC,sBAAuB,KAAK,MAAQ,IACtC,CACF,CAEA,OAAO,gBAAgBN,EAAwB,CAC7C,OAAO,IAAIF,EACT,8BACAJ,GACA,KACAM,CACF,CACF,CAEA,OAAO,cACLO,EACAC,EACa,CACb,OAAO,IAAIV,EACT,UACAS,EACA,KACA,iBAAiBC,CAAU,EAC7B,CACF,CAEA,OAAO,kBAAkBN,EAA6B,CACpD,OAAO,IAAIJ,EACT,kBACAH,GACA,KACAO,CACF,CACF,CAEA,OAAO,eAA6B,CAClC,OAAO,IAAIJ,EACT,8BACAF,GACA,KACA,mEACF,CACF,CAEA,OAAO,mBAAiC,CACtC,OAAO,IAAIE,EACT,8BACAF,GACA,KACA,mEACF,CACF,CACF,EAEO,SAASa,GACdC,EACc,CACd,GAAI,CACF,OAAKA,EACDC,GAAeD,CAAS,EAAUA,EAClCE,GAAkBF,CAAS,EAC6B,CACxD,CAACG,EAAgB,gBAAgB,EAAG,cACpC,CAACA,EAAgB,aAAa,EAAG,qBACjC,CAACA,EAAgB,aAAa,EAAG,iBACjC,CAACA,EAAgB,uBAAuB,EAAG,0BAC3C,CAACA,EAAgB,eAAe,EAAGC,EACnC,CAACD,EAAgB,qBAAqB,EAAGC,EACzC,CAACD,EAAgB,oBAAoB,EAAGC,CAC1C,EACSJ,CAAS,EAEbI,EAdgBA,CAezB,MAAc,CACZ,OAAOA,CACT,CACF,CAtBgBX,EAAAM,GAAA,kCAwBT,IAAMM,EAAuBZ,EAACC,GAA8B,CACjE,GAAI,CAACA,EAAK,MAAO,CAAE,aAAc,GAAI,sBAAuB,IAAK,EACjE,GAAIP,EAAY,cAAcO,CAAG,EAAG,OAAOA,EAAI,eAAe,EAC9D,GAAIY,GAAY,cAAcZ,CAAG,EAAG,CAClC,IAAM,EAAIA,EAAI,eAAe,EAC7B,MAAO,CACL,aAAc,EAAE,QAChB,mBAAoB,EAAE,OACtB,sBAAuB,EAAE,IAC3B,CACF,CACA,OAAIA,aAAe,MACV,CACL,aAAcA,EAAI,SAAS,EAC3B,sBAAuB,IACzB,EACE,OAAOA,GAAQ,SACV,CACL,aAAc,KAAK,UAAUA,CAAG,EAChC,sBAAuB,IACzB,EACK,CAAE,aAAcA,EAAK,sBAAuB,IAAK,CAC1D,EAtBoC,wBF9D7B,IAAKa,QACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,KAAO,OACPA,EAAA,QAAU,UAJAA,QAAA,IAaCC,EAA8BC,EAAA,CACzCC,EACAC,IAC2B,CAC3B,GAAI,CACF,OAAOC,EAAsBF,EAAMC,CAAI,CACzC,MAAQ,CACN,OAAO,IACT,CACF,EAT2C,+BAW9BC,EAAwBH,EAAA,CACnCC,EACAC,IACoB,CACpB,IAAME,EACJF,EAAK,gBAAgB,YAAcA,EAAK,wBAAwB,WAC5DG,EACJH,EAAK,qBAAqB,YAC1BA,EAAK,6BAA6B,WAC9BI,EACJJ,EAAK,iBAAiB,YACtBA,EAAK,yBAAyB,WAC1BK,EAAgBL,EAAK,mBAAmB,WACxCM,EAAgBN,EAAK,mBAAmB,WACxCO,EAAaP,EAAK,gBAAgB,WAClCQ,EAAaR,EAAK,gBAAgB,WAExC,GAAIE,EACF,MAAO,CACL,UAAW,MACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,WACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,OACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,SACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,SACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,MACX,QAASA,CACX,EACK,GAAIC,EACT,MAAO,CACL,UAAW,MACX,QAASA,CACX,EACK,GAAMR,EAAK,oBAAqB,CACrC,IAAMS,EAAkBT,EAAK,oBAAoB,kBACjD,GAAI,CAACS,EACH,MAAMC,EAAY,kBAAkB,EAEtC,IAAMC,EAAc,OAAO,KAAKZ,EAAK,OAAO,EAAE,KAC3Ca,GAAYb,EAAK,QAAQa,CAAO,GAAG,UAAYH,CAClD,EACA,GAAI,CAACE,EACH,MAAMD,EAAY,kBAAkB,EAGtC,MAAO,CACL,UAAW,OACX,QAASC,CACX,CACF,CAEA,MAAM,IAAI,MACR,+DACA,CACE,MAAOX,CACT,CACF,CACF,EA5EqC,yBA8ExBa,GAAgBf,EAAA,CAC3BgB,EACAF,EACAG,IACuB,CAEvB,IAAMC,EADiBD,EAAkBH,CAAO,EACjB,MAAM,eACrC,GAAKI,EAGL,OAAIA,EAAQ,QAAQ,WAAW,IAAM,GAC5BA,EAAQ,QAAQ,WAAYF,CAAM,EAEpC,GAAGE,CAAO,IAAIF,CAAM,EAC7B,EAd6B,iBAgBtB,SAASG,GACdlB,EACAmB,EACwB,CACxB,OACEnB,EAAK,MAAM,KACRC,GACCA,EAAK,SAAW,UAChBA,EAAK,SAAW,WAChBA,EAAK,KAAOkB,EAAY,EAC5B,GAAK,IAET,CAZgBpB,EAAAmB,GAAA,eAqBT,IAAME,GAAiCrB,EAAA,CAC5CC,EACAC,IACyB,CACzB,IAAMoB,EACJrB,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,GAClDD,EAAK,QAAQC,EAAK,wBAAwB,YAAc,EAAE,GAC1DD,EAAK,QAAQC,EAAK,iBAAiB,YAAc,EAAE,GACnDD,EAAK,QAAQC,EAAK,yBAAyB,YAAc,EAAE,GAC3DD,EAAK,QAAQC,EAAK,qBAAqB,YAAc,EAAE,GACvDD,EAAK,QAAQC,EAAK,6BAA6B,YAAc,EAAE,GAC/DD,EAAK,QAAQC,EAAK,mBAAmB,YAAc,EAAE,GACrDD,EAAK,QAAQC,EAAK,mBAAmB,YAAc,EAAE,GACrDD,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,GAClDD,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,IACjDA,EAAK,qBAAqB,kBACvB,CACE,QAASA,EAAK,oBAAoB,kBAClC,WAAY,OAAO,OAAOD,EAAK,OAAO,EAAE,KACrCsB,GACCA,EAAO,UAAYrB,EAAK,qBAAqB,iBACjD,GAAG,UACL,EACA,OACJ,KACF,GAAIoB,GAAU,KACZ,MAAMV,EAAY,cAAc,EAElC,OAAOU,CACT,EA7B8C,kCAkCjCE,GAAsBxB,EAAA,CACjCC,EACAC,IAEOmB,GAA+BpB,EAAMC,CAAI,EAAE,QAJjB,uBAO5B,SAASuB,EACdxB,EACAmB,EACsB,CACtB,GAAM,CAAE,QAAAM,EAAS,WAAYC,CAAK,EAAIN,GACpCpB,EACAmB,CACF,EACMQ,EACJ,OAAO,KAAK3B,EAAK,OAAO,EACrB,IAAK4B,IAAO,CAAE,EAAAA,EAAG,EAAG5B,EAAK,QAAQ4B,CAAC,CAAE,EAAE,EACtC,KAAK,CAAC,CAAE,EAAAC,CAAE,IAAMA,EAAE,UAAYJ,GAAWI,EAAE,aAAeH,CAAI,GAAK,KAClEI,EAAaH,GAAU,GAAK,KAC5BL,EAASK,GAAU,GAAK,KAExBI,EAAaT,GAAQ,WAC3B,GAAIA,IAAW,KACb,MAAMX,EAAY,gBAChB,qBAAqBmB,CAAU,4BAA4BC,CAAU,EACvE,EAEF,OAAOT,CACT,CAtBgBvB,EAAAyB,EAAA,oBAwBT,SAASQ,GACdhC,EACAmB,EAC6B,CAC7B,GAAI,CAACA,EACH,OAAO,KAET,GAAI,CACF,OAAOK,EAAiBxB,EAAMmB,CAAW,CAC3C,MAAQ,CACN,OAAO,IACT,CACF,CAZgBpB,EAAAiC,GAAA,0BAcT,IAAMC,GAAclC,EAAA,CACzB+B,EACAI,EACAT,EACAU,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeN,GACjBM,EAAE,QAAQ,YAAY,IAAMF,GAAQ,YAAY,GAChDE,EAAE,UAAYX,CAClB,GACc,UAAY,KAZD,eAepB,SAASY,GACdpC,EACAkC,EACW,CACX,IAAIG,EAAgB,IAAIC,GAAU,CAAC,EACnC,QAASC,EAAI,EAAGA,EAAIvC,EAAK,IAAI,OAAQuC,IAAK,CACxC,IAAMC,EAAMxC,EAAK,IAAIuC,CAAC,EACtB,GAAIC,EAAI,cAAgB,uBACtB,SAGF,IAAMC,EAAYT,GAChBQ,EAAI,MAAM,WACVA,EAAI,MAAM,OACVA,EAAI,MAAM,QACVN,CACF,EACAG,EAAgBA,EAAc,KAC5B,IAAIC,GAAUE,EAAI,MAAM,EAAE,aAAaC,GAAa,CAAC,CACvD,CACF,CAEA,OAAOJ,CACT,CAvBgBvC,EAAAsC,GAAA,mBAyBhB,SAASM,GACP3C,EACA4C,EACe,CACf,MAAO,CAEL,eAAgB5C,EAAK,KAAK,WAC1B,mBAAoBA,EAAK,KAAK,eAC9B,SAAUA,EAAK,KAAK,KACpB,WAAYA,EAAK,KAAK,OACtB,kBAAmBA,EAAK,KAAK,QAC7B,aAAcA,EAAK,KAAK,SACxB,oBAAqBA,EAAK,oBAC1B,mBAAoBA,EAAK,mBACzB,mBAAoBA,EAAK,mBACzB,0BAA2BA,EAAK,0BAChC,aAAcA,EAAK,KAAK,SAGxB,aAAcA,EAAK,GAAG,WACtB,iBAAkBA,EAAK,GAAG,eAC1B,SAAUA,EAAK,GAAG,OAClB,gBAAiBA,EAAK,GAAG,QACzB,WAAYA,EAAK,GAAG,SACpB,OAAQA,EAAK,GAAG,KAChB,WAAYA,EAAK,GAAG,SAGpB,UAAWA,EAAK,UAChB,YAAaA,EAAK,YAClB,YAAaA,EAAK,YAGlB,kCAAmCA,EAAK,SACxC,SAAU4C,EAENC,GAAeR,GAAgBrC,EAAM4C,GAAM,MAAM,EAAG,KAAM,CAAC,EAC3D,KACJ,uBAAwB5C,EAAK,wBAA0B,KACvD,cAAe,IACjB,CACF,CAzCSD,EAAA4C,GAAA,gCA2CF,SAASG,GACdC,EACAC,EACAC,EACAC,EACAC,EACAP,EACa,CACb,IAAMQ,EAAmBJ,EAAU,OACnC,GAAI,CAACI,EACH,MAAM,MAAM,sCAAsC,EAGpD,MAAO,CACL,aAAc,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAC5C,WAAY,KACZ,UAAWJ,EAAU,WAAa,GAClC,YAAaD,EACb,QAAAE,EACA,OAAQ,UACR,SAAU,GACV,aAAc,KACd,qBAAsB,KACtB,mBAAoB,KACpB,sBAAuB,KACvB,0BAA2B,KAC3B,gCAAiC,KACjC,qBAAsB,KACtB,SAAUC,EACV,iBAAkBE,EAClB,qBAAAD,EACA,MACEH,EAAU,QAAQ,OAAO,IAAI,CAAChD,EAAMqD,IAAU,CAC5C,IAAMC,EAAYX,GAA6B3C,EAAM4C,CAAI,EACzD,MAAO,CACL,GAAIS,EAAQ,EAGZ,GAAGC,EACH,cACEtD,GAAM,eAAe,IAAKuD,GACNZ,GAChBY,EACAX,CACF,CAED,GAAK,KAGR,aAAc,GACd,OAAQ,UACR,cAAe,KACf,qBAAsB,IAAI,KAAK,EAAE,QAAQ,EACzC,sBAAuB,KACvB,sBAAuB,KACvB,wBAAyB,KACzB,YAAa,KACb,aAAc,KACd,aAAc,KACd,cAAe,KAGf,eAAgB,KAChB,uBAAwB,KACxB,oBAAqB,KACrB,4BAA6B,KAC7B,gBAAiB,KACjB,wBAAyB,KACzB,kBAAmB,KACnB,kBAAmB,KACnB,oBAAqB,KACrB,eAAgB,KAChB,eAAgB,KAChB,gBAAiB,KAGjB,0BAA2B,EAC7B,CACF,CAAC,GAAK,CAAC,CACX,CACF,CAhFgB7C,EAAA+C,GAAA,wBG1VhB,SAASU,GAAYC,EAAsC,CACzD,OAAOA,EAAU,IAAKC,GAAa,CACjC,GAAM,CACJ,aAAAC,EACA,uBAAAC,EACA,YAAAC,EACA,SAAAC,EACA,sBAAAC,EACA,wBAAAC,EACA,kCAAAC,EACA,eAAAC,EACA,aAAAC,EACA,WAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,0BAAAC,EACA,aAAAC,EACA,OAAQC,CACV,EAAItB,EA4BJ,MA1BmB,CACjB,aAAAC,EACA,uBAAAC,EACA,YAAAC,EACA,SAAAC,EACA,sBAAAC,EACA,wBAAAC,EACA,kCAAAC,EACA,eAAAC,EACA,aAAAC,EACA,WAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,YAAaE,EACb,YAAAD,EACA,aAAAE,EACA,mBAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,0BAAAC,EACA,aAAAC,EACA,OAAQC,EACR,YAAaC,EAAiBvB,CAAQ,CACxC,CAGF,CAAC,CACH,CAvDSwB,EAAA1B,GAAA,eAyDT,SAAS2B,GACPC,EACAC,EACA3B,EAC8B,CAC9B,GAAM,CACJ,aAAA4B,EACA,WAAAC,EACA,UAAAC,EACA,YAAAC,EACA,OAAAC,EACA,QAAAC,EACA,MAAAC,EACA,SAAAC,CACF,EAAIT,EAEEU,EAAatC,GAAYoC,CAAK,EAa9BG,EAAuC,CAC3C,MAbmB,CACnB,aAAAT,EACA,WAAAC,EACA,UAAAC,EACA,YAAAC,EACA,OAAAC,EACA,QAAAC,EACA,MAAOG,EACP,SAAUD,EAAS,SACnB,iBAAkBA,EAAS,eAC7B,EAIE,KAAMC,EAAWA,EAAW,OAAS,CAAC,CACxC,EACA,GAAIpC,EACFqC,EAAO,KAAOvC,GAAY,CAACE,CAAQ,CAAC,EAAE,CAAC,UAEnC2B,IAAS,SAAU,CACrB,IAAMW,EAAaC,GAAcH,CAAU,EACvCE,IACFD,EAAO,KAAOC,EAElB,KAAO,CACL,IAAME,EAAqBC,EAAsBL,CAAU,EACvDI,IACFH,EAAO,KAAOG,EAElB,CAGF,OAAOH,CACT,CAlDSb,EAAAC,GAAA,mBAoDT,SAASiB,GAAeC,EAAsBC,EAAclB,EAAmB,CAC7E,IAAImB,EACE,CAAE,KAAAlB,CAAK,EAAIgB,EAEjB,OAAQhB,EAAM,CACZ,cACEkB,EAAa,CAAE,GAAGF,EAAW,cAA6B,EAC1D,MACF,aACEE,EAAa,CACX,GAAGF,EACH,cACA,YAAajB,EAAK,YAClB,eAAgBoB,GAAgBpB,CAAI,CACtC,EACA,MACF,gBAA8B,CAC5BmB,EAAa,CACX,GAAGF,EACH,iBACA,YAAajB,EAAK,YAClB,eAAgBoB,GAAgBpB,CAAI,EACpC,aAAcA,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EAAE,cAAgB,GAChE,gBAAiBqB,GAAiBrB,CAAI,CACxC,EACA,KACF,CACA,QACE,KACJ,CACImB,GACmBG,EAAU,SAAS,GAC1B,kBAA8B,CAAE,MAAOH,EAAY,MAAAD,CAAM,CAAC,CAE5E,CAlCSpB,EAAAkB,GAAA,kBAoCT,SAASO,GAAcN,EAAsBC,EAAcM,EAAY,CAChDF,EAAU,SAAS,GAC1B,iBAA6B,CAAE,MAAOL,EAAW,MAAAC,EAAO,KAAAM,CAAK,CAAC,CAC9E,CAHS1B,EAAAyB,GAAA,iBAKF,SAASE,EAASC,EAAwB,CAC/C,GAAM,CAAE,MAAAC,CAAM,EAAID,EACZ,CAAE,KAAAzB,CAAK,EAAI0B,EACX,CAAE,MAAAT,EAAO,KAAAM,CAAK,EAAIzB,GACtB2B,EAAO,KACPzB,EACAyB,EAAO,MAAQ,MACjB,EACME,EAAY,GAAGJ,EAAK,cAAc,IAAIA,EAAK,UAAU,GACrDK,EAAU,GAAGL,EAAK,YAAY,IAAIA,EAAK,QAAQ,GAC/ClC,EAAekC,EAAK,cAAgB,GACpCM,EAAyBJ,EAAO,KAClCK,EAA4BL,EAAO,KAAMA,EAAO,IAAI,EACpD,KACAM,EAAU,GACVC,SAEJ,OAAQhC,EAAM,CACZ,cACE+B,EAAU,uBACVC,YACA,MACF,gBACED,EAAU,gBAAgB1C,CAAY,IAAIuC,CAAO,YACjDI,YACA,MACF,aACED,EAAU,gBACRN,EAAO,MAAM,cAAgB,mBAC/B,GACAO,UACA,MACF,mBACMN,EAAM,sBACRK,EAAU,mDACVC,UACSN,EAAM,oBACXD,EAAO,MAAQQ,GAAwBR,EAAO,IAAI,EACpDM,EAAU,mBAAmBR,EAAK,WAAW,8BAA8BI,CAAS,GAEpFI,EAAU,oDAEZC,aACSN,EAAM,qBACfK,EAAU,gCACVC,UAEF,MACF,mBACMP,EAAO,MAAQQ,GAAwBR,EAAO,IAAI,EACpDM,EAAU,0CAEVA,EAAU,kCAEZC,SACA,MACF,4BACED,EAAU,qCACVC,YACA,MACF,sBACED,EAAU,qCACVC,YACA,MAEF,2BAEIN,EAAM,uCAGNK,EAAU,8BACVC,aAEAN,EAAM,8BAENK,EAAU,sCACVC,aAEAN,EAAM,8CAGNK,EAAU,qCACVC,aAEAN,EAAM,wCAGNK,EAAU,wCAAwCF,GAAsB,OAAO,IAC/EG,aAEF,MAEF,QACE,KACJ,CAEIP,EAAO,MACTH,GAAc,CAAE,GAAGI,EAAO,QAAAK,EAAS,gBAAAC,CAAgB,EAAGf,EAAOM,CAAI,GAE/DE,EAAO,MAAM,iBAAiC,CAACA,EAAO,OACxDV,GAAe,CAAE,GAAGW,EAAO,QAAAK,EAAS,gBAAAC,CAAgB,EAAGf,EAAOQ,EAAO,IAAI,CAE7E,CAtGgB5B,EAAA2B,EAAA,YN9FhB,IAAIU,GAAuC,KAOpC,SAASC,IAAa,CAC3B,MAAO,CACL,UAAW,IAAMD,IAAe,GAChC,WAAaE,GAAqB,CAChCF,GAAgB,CACd,GAAIE,CACN,CACF,EACA,MAAO,IAAM,CACXF,GAAgB,IAClB,CACF,CACF,CAZgBG,EAAAF,GAAA,cAyBhB,IAAMG,EAA8D,CAAC,EAC9D,SAASC,IAA2B,CACzC,MAAO,CACL,yBAA2BC,GACzBF,EAAyBE,CAAI,GAAK,CAAC,EACrC,yBAA0B,CAACA,EAAcC,IAA0B,CACvDH,EAAyBE,CAAI,IAErCF,EAAyBE,CAAI,EAAI,CAAC,GAEpCF,EAAyBE,CAAI,EAAE,SAC7BC,EAAK,UAAYH,EAAyBE,CAAI,EAAE,SAClDF,EAAyBE,CAAI,EAAE,gBAC7BC,EAAK,iBACLH,EAAyBE,CAAI,EAAE,iBAC/B,EACJ,CACF,CACF,CAjBgBH,EAAAE,GAAA,4BAyBT,IAAMG,EAAiBL,EAACM,GAE3BA,EAAK,MAAM,KACRC,GAASA,EAAK,SAAW,UAAYA,EAAK,SAAW,SACxD,GAAK,KAJqB,kBAajBC,EAAmBR,EAC9BS,GACuB,CACvB,GAAM,CACJ,eAAAC,EACA,uBAAAC,EACA,kBAAAC,EACA,kBAAAC,EACA,oBAAAC,EACA,4BAAAC,EACA,oBAAAC,EACA,wBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,eAAAC,CACF,EAAIX,EACJ,OACEC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,CAEJ,EA7BgC,oBAoCnBC,GAAmBrB,EAAA,CAC9BS,EACAa,IACoB,CACpBb,EAAY,oBAAsB,KAClCA,EAAY,kBAAoB,KAChCA,EAAY,eAAiB,KAC7BA,EAAY,kBAAoB,KAChCA,EAAY,uBAAyB,KACrCA,EAAY,4BAA8B,KAC1CA,EAAY,oBAAsB,KAClCA,EAAY,wBAA0B,KACtCA,EAAY,gBAAkB,KAC9BA,EAAY,eAAiB,KAC7BA,EAAY,eAAiB,KAE7B,IAAMc,EAASD,EAAY,KAC3B,OAAQC,EAAQ,CACd,KAAKC,EAAgB,IACfF,EAAY,aACdb,EAAY,uBAAyBa,EAErCb,EAAY,eAAiBa,EAE/B,MACF,KAAKE,EAAgB,KACfF,EAAY,aACdb,EAAY,wBAA0Ba,EAEtCb,EAAY,gBAAkBa,EAEhC,MACF,KAAKE,EAAgB,SACfF,EAAY,aACdb,EAAY,4BAA8Ba,EAE1Cb,EAAY,oBAAsBa,EAEpC,MACF,KAAKE,EAAgB,OACnBf,EAAY,kBAAoBa,EAChC,MACF,KAAKE,EAAgB,OACnBf,EAAY,kBAAoBa,EAChC,MACF,KAAKE,EAAgB,SACnBf,EAAY,oBAAsBa,EAClC,MACF,KAAKE,EAAgB,IACnBf,EAAY,eAAiBa,EAC7B,MACF,KAAKE,EAAgB,IACnBf,EAAY,eAAiBa,EAC7B,MACF,KAAKE,EAAgB,KACnBf,EAAY,gBAAkBa,EAC9B,MACF,SACIG,GAAa,CACb,MAAM,IAAI,MAAM,GAAGA,CAAC,iBAAiB,CACvC,GAAGF,CAAM,CACb,CACA,OAAOd,CACT,EA/DgC,oBAsEnBiB,GAAuB1B,EAClCS,GAEOD,EAAiBC,CAAW,GAAG,KAHJ,wBAWvBkB,GAA0B3B,EACrCS,GACY,CACZ,GAAM,CACJ,uBAAAE,EACA,4BAAAI,EACA,wBAAAE,CACF,EAAIR,EACJ,MAAO,CAAC,EACNE,GACAI,GACAE,EAEJ,EAbuC,2BAmBhC,SAASW,EAAiB,CAC/B,WAAAC,EACA,WAAAC,EACA,WAAAC,EACA,eAAAC,EACA,QAAAC,EACA,QAAAC,EACA,UAAAC,EAAY,KACZ,0BAAAC,EACA,MAAAC,EAAQ,IACV,EAsBE,CACA,IAAM/B,EAAOuB,EAAW,EAAE,YACpBpB,EAAcJ,EAAeC,CAAI,EACjCgC,EAIF,CACF,KAAAhC,EACA,KAAMG,CACR,EAkBA,GAjBMuB,GAAoBvB,IACxBA,EAAY,OAASuB,GAGnBD,IACFzB,EAAK,OAASyB,GAEhBzB,EAAK,0BAA4B8B,EAC3BL,GAAc,CAAC,SAAU,SAAS,EAAE,SAASA,CAAU,IAC3DzB,EAAK,WAAa,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,IAG5C2B,GAAaC,KACjB5B,EAAK,aAAe2B,GAAW,GAC/B3B,EAAK,mBAAqB4B,GAAW,IAGjCF,GAAkB,CAAC,QAAQ,EAAE,SAASA,CAAc,EAAG,CAE3D,IAAMO,EACJL,GAAWA,EAAQ,SAAS,SAAS,EACjC,yBACAA,EACAM,EAAaC,GAAuBnC,EAAMG,CAAW,GAAG,WAC9DH,EAAK,6BAEL,IAAMoC,EAAcC,GAA+BR,CAAS,EAC5DG,EAAc,YAAcI,EAG5B,IAAME,EACJT,IAAc,oBACdE,GAAO,SACP,OAAOA,EAAM,SAAY,SACrBA,EAAM,QACNE,GAAe,GAErBM,EAAY,EACT,cAAc,CACb,UAAWvC,EAAK,UAChB,KAAMG,GAAa,IAAM,EACzB,UAAWiC,EACX,OAAQE,EACR,KAAMJ,EACF,CACE,OAAQA,CACV,EACA,MACN,CAAC,EACA,KAAK,EACL,MAAM,CACX,MAAaR,GAAkB,CAAC,SAAS,EAAE,SAASA,CAAc,EAChE1B,EAAK,4BAEH0B,GACF,CAAC,UAAW,UAAU,EAAE,SAASA,CAAc,EAE/C1B,EAAK,+BAEL0B,GACA,CAAC,oBAAoB,EAAE,SAASA,CAAc,IAE9C1B,EAAK,gCAGP,OAAI0B,IAAmB,WAAavB,IAClCA,EAAY,qBAAuB,IAAI,KAAK,EAAE,QAAQ,GAGxDqB,EAAW,CACT,GAAGD,EAAW,EACd,YAAavB,CACf,CAAC,EAEMgC,CACT,CAtHgBtC,EAAA4B,EAAA,oBA6HT,SAASkB,GACd,CAAE,WAAAjB,EAAY,WAAAC,CAAW,EACzBiB,EACAC,EACM,CACN,IAAM1C,EAAOuB,EAAW,EAAE,YAC1BvB,EAAK,0BAA4B,KAEjC,IAAMG,EAAcJ,EAAeC,CAAI,EACvCG,EAAY,sBAAwBsC,EACpCtC,EAAY,wBAA0B,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAChEuC,GAAa,MACfvC,EAAY,YAAc,CACxB,GAAIA,EAAY,aAAe,CAAC,EAChC,CACE,IAAKuC,EAAY,IACjB,YAAaA,EAAY,aAAe,IAC1C,CACF,GAGiBrB,GAAwBlB,CAAW,EAGpDH,EAAK,aAAe,0CAEpBA,EAAK,aAAe,kCAGtBA,EAAK,mBAAqB,GAC1BA,EAAK,4BAELwB,EAAW,CACT,GAAGD,EAAW,EACd,YAAavB,CACf,CAAC,EAED2C,EAAS,CACP,MAAO,CACL,oBACA,gBACF,EACA,KAAM3C,EACN,KAAMG,CACR,CAAC,EAEDwC,EAAS,CACP,MAAO,CAAE,mBAAiC,EAC1C,KAAM3C,EACN,KAAMG,CACR,CAAC,CACH,CAnDgBT,EAAA8C,GAAA,yBAyDT,SAASI,GACd,CACE,WAAArB,EACA,WAAAC,CACF,EACAqB,EACAC,EACM,CACN,IAAM9C,EAAOuB,EAAW,EAAE,YACpBpB,EAAcJ,EAAeC,CAAI,EACvC,GAAI,CAACG,EACH,OAEF,IAAM4C,EAAc,IAAI,KACxB/C,EAAK,qBAAuB+C,EAAY,QAAQ,EAAE,SAAS,EAGzD,EAAA5C,EAAY,gBACV6C,EAAyB,4BAC3BhD,EAAK,4BAA8B6C,GACnC7C,EAAK,kCAAoC8C,KAM3C3C,EAAY,cACV6C,EAAyB,2BAC3BhD,EAAK,0BAA4B6C,EACjC7C,EAAK,gCAAkC8C,EAEvCtB,EAAW,CACT,GAAGD,EAAW,EACd,YAAavB,CACf,CAAC,EACH,CAnCgBN,EAAAkD,GAAA,+CAyCT,SAASK,GAAkC,CAChD,WAAA1B,EACA,WAAAC,CACF,EAKc,CACZ,IAAMxB,EAAOuB,EAAW,EAAE,YAEpBpB,EAAcJ,EAAeC,CAAI,EACvC,GAAI,CAACG,EACH,OAIF,GAAM,CAAE,KAAA+C,CAAK,EAAIC,EAAkBnD,CAAI,EACjCoD,EAAgBC,EAAsBrD,EAAMG,CAAW,EACvD0C,EAAS,UAAUK,CAAI,sBAAsBE,EAAc,OAAO,GAClEN,EAAe,iDAA4CM,EAAc,OAAO,8BAEhFL,EAAc,IAAI,KACxB,OAAA/C,EAAK,qBAAuB+C,EAAY,QAAQ,EAAE,SAAS,EAE3D5C,EAAY,cAAgB6C,EAAyB,wBACrDhD,EAAK,0BAA4B6C,EACjC7C,EAAK,gCAAkC8C,EAEvCtB,EAAW,CACT,GAAGD,EAAW,EACd,YAAavB,CACf,CAAC,EAEM,CACL,KAAAA,EACA,KAAMG,CACR,CACF,CAtCgBT,EAAAuD,GAAA,qCA4CT,SAASK,GAAsC,CACpD,WAAA/B,EACA,WAAAC,CACF,EAKc,CACZ,IAAMxB,EAAOuB,EAAW,EAAE,YACpBpB,EAAcJ,EAAeC,CAAI,EACvC,GAAKG,EAIL,OAAAH,EAAK,0BAA4B,GACjCA,EAAK,gCAAkC,GACvCG,EAAY,cAAgB6C,EAAyB,gBAErDL,EAAS,CACP,MAAO,CACL,4BACA,0BACF,EACA,KAAA3C,EACA,KAAMG,CACR,CAAC,EAEDqB,EAAW,CACT,GAAGD,EAAW,EACd,YAAavB,CACf,CAAC,EAEM,CACL,KAAAA,EACA,KAAMG,CACR,CACF,CArCgBT,EAAA4D,GAAA,yCAuChB,eAAsBC,GAAMC,EAA8B,CACxD,OAAO,IAAI,QAASC,GAAQ,WAAWA,EAAKD,CAAE,CAAC,CACjD,CAFsB9D,EAAA6D,GAAA,SAUf,IAAMG,GAAoBhE,EAAA,CAC/BM,EACA2D,IAEO3D,EAAK,QAAQ2D,CAAO,GAAG,WAJC,qBAa1B,SAASC,GAAaC,EAAgC,CAC3D,OACEA,IAAW,MACXA,GAAQ,cAAgB,MACxBA,GAAQ,YAAY,SAAW,CAEnC,CANgBnE,EAAAkE,GAAA,gBAYT,SAAST,EAAkBnD,EAIhC,CACA,IAAMC,EAAOF,EAAeC,CAAI,EAC1B8D,EAAmBC,EAA4B/D,EAAMC,CAAI,EAC/D,GAAI,CAAC6D,EACH,MAAO,CACL,KAAM,KACN,UAAW,KACX,QAAS,IACX,EAGF,IAAM5B,EAAawB,GAAkB1D,EAAM8D,EAAiB,OAAO,EAC7DE,EAAehE,EAAK,QAAQ8D,EAAiB,OAAO,EAE1D,MAAO,CACL,KAAM5B,GAAc,KACpB,UAAW4B,EACX,QAASE,EAAeA,EAAa,QAAU,IACjD,CACF,CAvBgBtE,EAAAyD,EAAA,qBA8BhB,eAAec,GAAWC,EAAgD,CACxE,GAAI,CAGF,OADG,MAAMA,EAAS,QAAQ,CAAE,OAAQ,aAAc,CAAC,GAAMA,GAAU,OAErE,MAAQ,CACN,OAAOA,GAAU,OACnB,CACF,CARexE,EAAAuE,GAAA,cAcf,eAAsBE,GACpBnE,EACAC,EACA4D,EACAO,EACAC,EACkB,CAClB,GAAIT,GAAaC,CAAM,EACrB,MAAO,GAET,IAAMT,EAAgBW,EAA4B/D,EAAMC,CAAI,EAC5D,GAAI,CAACmD,EACH,MAAO,GAGT,GACEgB,EAAK,eAAe,KACjBE,GAAgBA,EAAY,OAASlB,EAAc,OACtD,EACA,CACA,GAAI,CACF,IAAMY,EAAehE,EAAK,QAAQoD,EAAc,OAAO,EACvD,GAAIY,EAAc,CAChB,IAAME,EAAWK,GAAeF,EAAWL,EAAa,UAAU,EAC5DQ,EAAkC,MAAMP,GAAWC,CAAQ,EACjE,GAAIM,EAAS,CACX,IAAMC,EAAaC,GACjBF,EACA,OAAO,QAAQJ,EAAK,WAAW,EAAE,IAC/B,CAAC,CAAC,CAAEO,CAAc,IAAMA,CAC1B,CACF,EACA,GACEF,GACAA,EAAW,YAAY,IAAMrB,EAAc,QAAQ,YAAY,EAE/D,MAAO,GAET,GACEqB,GACAA,EAAW,YAAY,IAAMrB,EAAc,QAAQ,YAAY,EAE/D,MAAO,EAEX,CACF,CACF,OAASwB,EAAG,CACV,QAAQ,IAAIA,CAAC,CACf,CACA,MAAO,EACT,CACA,MAAO,EACT,CApDsBlF,EAAAyE,GAAA,kCAsDf,IAAMU,GAAqBnF,EAAA,CAChCM,EACAC,KAGED,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,GAClDD,EAAK,QAAQC,EAAK,wBAAwB,YAAc,EAAE,GAC1DD,EAAK,QAAQC,EAAK,iBAAiB,YAAc,EAAE,GACnDD,EAAK,QAAQC,EAAK,yBAAyB,YAAc,EAAE,GAC3DD,EAAK,QAAQC,EAAK,qBAAqB,YAAc,EAAE,GACvDD,EAAK,QAAQC,EAAK,6BAA6B,YAAc,EAAE,GAC/DD,EAAK,QAAQC,EAAK,mBAAmB,YAAc,EAAE,GACrDD,EAAK,QAAQC,EAAK,mBAAmB,YAAc,EAAE,GACrDD,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,GAClDD,EAAK,QAAQC,EAAK,gBAAgB,YAAc,EAAE,GAClDA,EAAK,qBAAqB,mBAC1B,QAEgB,KAlBc,sBAqB3B,SAAS6E,GACdC,EACM,CACN,GAAM,CAAE,WAAAxD,EAAY,WAAAC,CAAW,EAAIuD,EAC7B/E,EAAOuB,EAAW,EAAE,YACpBpB,EAAcJ,EAAeC,CAAI,EAEnCG,GAAa,gBACfA,EAAY,cAAgB,KAC5BqB,EAAW,CAAE,GAAGD,EAAW,EAAG,YAAavB,CAAK,CAAC,EAErD,CAXgBN,EAAAoF,GAAA,sBAaT,SAASE,GACdD,EAIAjF,EAII,CACF,QAAS,GACT,QAAS,GACT,OAAQ,IACV,EACM,CACN,GAAM,CAAE,QAAA6B,EAAS,QAAAC,EAAS,OAAAqD,CAAO,EAAInF,EAC/B,CAAE,WAAAyB,EAAY,WAAAC,CAAW,EAAIuD,EAC7B/E,EAAOuB,EAAW,EAAE,YACpBpB,EAAcJ,EAAeC,CAAI,EAEnCG,GAAa,gBACfH,EAAK,0BAA4B2B,EACjC3B,EAAK,gCAAkC4B,EACvCzB,EAAY,cAAgB8E,EAC5BzD,EAAW,CAAE,GAAGD,EAAW,EAAG,YAAavB,CAAK,CAAC,EAErD,CA1BgBN,EAAAsF,GAAA,uBAmCT,SAASE,GACdC,EACAf,EACM,CACN,GAAM,CAAE,QAAAgB,EAAS,MAAAC,CAAM,EAAIjB,EACrBpE,EAAOqF,EAAM,WAAW,EAAE,YAE1B,CAAE,GAAAC,EAAI,OAAAzC,CAAO,EAAI0C,GAA0BvF,EAAMoF,EAAQ,KAAK,EAEpE,GAAI,CAACE,EAAI,CACP,IAAMnF,EAAcJ,EAAeC,CAAI,EACjC,CAAE,KAAMkC,EAAY,QAAAsD,CAAQ,EAAIrC,EAAkBnD,CAAI,EAC5D2C,EAAS,CACP,MAAO,CACL,4BACA,GAAIE,IAAW,qBACX,CACE,2CAEA,gBAAiB2C,GAAW,MAC9B,EACA,CACE,oCAEA,eAAgBtD,GAAc,OAC9B,gBAAiBsD,GAAW,MAC9B,CACN,EACA,KAAMxF,EACN,KAAMG,CACR,CAAC,EAEDyC,GACE,CACE,WAAYyC,EAAM,WAAW,KAAKA,CAAK,EACvC,WAAYA,EAAM,WAAW,KAAKA,CAAK,CACzC,EACAI,GACAN,EAAM,OAAO,WACf,EAEA,MACF,CAEAE,EAAM,QAAQ,CAChB,CA7CgB3F,EAAAwF,GAAA,2BAuDT,SAASQ,GACdC,EACAvB,EACM,CACN,GAAM,CAAE,QAAAgB,EAAS,MAAAC,CAAM,EAAIjB,EACrBpE,EAAOqF,EAAM,WAAW,EAAE,YAC1BlF,EAAcJ,EAAeC,CAAI,EAEvC,GAAI,CAACG,GAAeH,EAAK,SAAW,UAClC,OAGF,IAAM4F,EAAS3C,GAAkC,CAC/C,WAAYoC,EAAM,WAAW,KAAKA,CAAK,EACvC,WAAYA,EAAM,WAAW,KAAKA,CAAK,CACzC,CAAC,EAEKQ,EAAkB9B,EACtB/D,EACAG,CACF,GAAG,QAEG2F,EAAiB3C,EAAkBnD,CAAI,EAAE,KAEzC+F,EAAiBD,EACnBV,EAAQ,MAAMU,CAAc,EAAE,QAC9B,OAEAF,GACFjD,EAAS,CACP,MAAO,CACL,4BACA,oCACA,gBAAiBkD,GAAmB,OACpC,eAAgBE,GAAkB,MACpC,EACA,KAAMH,EAAO,KACb,KAAMA,EAAO,IACf,CAAC,EAIH,GAAM,CAAE,KAAA1C,EAAM,UAAA8C,CAAU,EAAI7C,EAAkBnD,CAAI,EAClD,GAAMkD,GAAU8C,GAAW,SACrBZ,EAAQ,mBAAmBlC,EAAM8C,EAAU,QAASA,CAAS,EAAG,CAClE,IAAMJ,EAASR,EAAQ,cAAclC,EAAM8C,CAAS,EAChDJ,GACFA,EACG,KAAK,IAAM,CACVP,EAAM,QAAQ,CAChB,CAAC,EACA,MAAOY,GAAU,CAEhBjB,GACE,CACE,WAAYK,EAAM,WAAW,KAAKA,CAAK,EACvC,WAAYA,EAAM,WAAW,KAC3BA,CACF,CACF,EACA,CACE,QAASY,EAAM,QACf,QAASA,EAAM,QACf,OAAQjD,EAAyB,mBACnC,CACF,CACF,CAAC,CAEP,CAEJ,CAtEgBtD,EAAAgG,GAAA,2BA+ET,SAASQ,GACdP,EACAvB,EACM,CACN,GAAM,CAAE,gBAAA+B,EAAiB,aAAAC,EAAc,MAAAf,EAAO,QAAAgB,EAAS,QAAAjB,CAAQ,EAAIhB,EAC7D,CAAE,WAAAkC,EAAY,UAAAC,EAAW,MAAAC,CAAM,EAAIhH,GAAW,EAG9CiH,EAAeN,EAAgB,EAAE,OACpCO,GAASA,EAAK,OAAO,kCACxB,EAEA,GAAID,EAAa,SAAW,EAC1B,OAGF,IAAME,EAAYJ,EAAU,EACtBK,EAAsB,CAAC,CAACD,EAE9B,GAAIA,IAActB,EAAM,GACtB,OAIF,GAAIuB,EAAqB,CAEvBtD,GAAsC,CACpC,WAAY+B,EAAM,WAAW,KAAKA,CAAK,EACvC,WAAYA,EAAM,WAAW,KAAKA,CAAK,CACzC,CAAC,EACD,MACF,CAIA,IAAIqB,EAAOD,EAAa,KAAMC,GACrBA,EAAK,WAAatC,EAAK,QAC/B,EAGIsC,IAEHA,EADyBD,EAAa,CAAC,GAIzCH,EAAWI,EAAK,QAAQ,EACxB,IAAMG,EAAiBH,EAAK,QAAQ,IAAI,EAClC,CAAE,KAAAxD,EAAM,UAAA8C,EAAW,QAAAR,CAAQ,EAAIrC,EACnC0D,EAAe,WACjB,EAGAT,EAAaM,EAAK,SAAU,CAC1B,UAAWH,EAAU,EACrB,eAAgB,IAAM,CACpBC,EAAM,EAEFtD,GACF4D,GACE,CACE,WAAY5D,EACZ,QAAS8C,GAAW,QACpB,SAAUR,EAAU,CAACA,CAAO,EAAI,CAAC,CACnC,EACAa,EACAjB,EAAQ,kBACV,CAEJ,CACF,CAAC,CACH,CAtEgB1F,EAAAwG,GAAA,0BAwET,SAASX,GACdvF,EACA+G,EACiE,CACjE,GAAM,CAAE,KAAA7D,EAAM,QAAAsC,CAAQ,EAAIrC,EAAkBnD,CAAI,EAChD,GAAI,CAACkD,GAAQ,CAACsC,EACZ,MAAO,CAAE,GAAI,GAAO,OAAQ,eAAgB,EAE9C,IAAMwB,EAAcD,EAAS7D,CAAI,EAC3B,CAAE,SAAA+D,EAAU,UAAAC,CAAU,EAAIF,EAC1BG,EAAoBF,GAAY,CAAC,EACvC,OAAKC,EAQE,CAAE,GAJOC,EAAkB,KAAMC,GAAY,CAClD,GAAM,CAAE,QAASC,CAAe,EAAIC,GAAmBF,CAAO,EAC9D,OAAO5B,EAAQ,kBAAkB,IAAM6B,EAAe,kBAAkB,CAC1E,CAAC,EACqB,OAAQ,oBAAqB,EAP1C,CAAE,GAAI,GAAO,OAAQ,eAAgB,CAQhD,CApBgB3H,EAAA6F,GAAA,6BAsBhB,eAAsBgC,GACpBxC,EACe,CACf,GAAM,CAAE,yBAAAyC,CAAyB,EAAI5H,GAAyB,EACxD,CAAE,WAAA2B,EAAY,WAAAC,EAAY,OAAAiG,EAAQ,KAAAC,EAAM,SAAAC,EAAU,QAAAvC,CAAQ,EAAIL,EAC9D,CAAE,KAAAX,EAAM,WAAAwD,EAAY,eAAAC,CAAe,EAAIzC,EACvCpF,EAAOuB,EAAW,EAAE,YAEpBpB,EAAcJ,EAAeC,CAAI,EAEjCgE,EAAe8D,EAAiB9H,EAAMG,CAAW,EACjD4H,EAAeF,EAAe7D,GAAc,UAAU,EACtDgE,EAAgBC,GAAoBjI,EAAMG,CAAW,EACrD+H,EAAuB7E,EAAsBrD,EAAMG,CAAW,EAE9DgI,EAAWzI,EAAA,IAAM,CAEjBqF,EAAQ,QAAQ,gBAClBA,EAAQ,QAAQ,eAAe,CAEnC,EALiB,YAOXqD,EAAKlI,EAAiBC,CAAW,EACjCc,EAASmH,GAAI,KACbC,EAAahH,GAAwBlB,CAAW,EAEtD,GAAI,CAACiI,GAAM,CAACnH,EAAQ,CAClB,IAAMqH,EAAe,gCACfC,EAAejH,EAAiB,CACpC,WAAAC,EACA,WAAAC,EACA,WAAY,SACZ,eAAgB,SAChB,QAAS8G,EACT,QAAS,OACT,UAAW,6BACb,CAAC,EACD,OAAA3F,EAAS,CACP,MAAO,CACL,cACA,OAAQ2F,EACR,WAAY,8BACZ,YAAaE,EAAyBxI,CAAI,EAC1C,eAAgByI,EAA4BzI,CAAI,CAClD,EACA,GAAGuI,CACL,CAAC,EACDd,EAAO,EACAU,EAAS,CAClB,CAEA,IAAM3D,EAAUJ,EAAK,cAAcgE,EAAG,UAAU,GAAG,QAE7CtG,EACJ,OAAO9B,EAAK,2BAA8B,UAExCyB,EACFC,EACAC,EACAC,EACA8G,EAEEL,GACF1G,EAAU,2BAA2BxB,GAAa,UAAU,SAC1D4H,EAAe,wBAA0B,EAC3C,GACAnG,EACE,yEACFF,EAAiB,qBACjBD,EAAa,OACbiH,kBACS5G,GACTH,EAAU,4CACVD,EAAiB,SACjBD,EAAa,SACbG,EAAU,GACV8G,aAEA/G,EAAU,4BACVD,EAAiB,UACjBD,EAAa,UACbG,EAAU,GAAGmG,EAAe,2BAA6B,EAAE,GAC3DW,kBAGF,IAAMH,EAAejH,EAAiB,CACpC,WAAAC,EACA,WAAAC,EACA,eAAAE,EACA,WAAAD,EACA,QAASE,EACT,QAASC,EACT,0BAA2ByG,EACvB,OACAvG,EACJ,UAAWA,EAA4B,aAAe,MACxD,CAAC,EAoBD,GAlBI4G,aACF/F,EAAS,CACP,MAAO,CACL,KAAM+F,EACN,OAAQ/G,EACR,WAAY4G,EAAa,aAAeI,EACxC,YAAaH,EAAyBxI,CAAI,EAC1C,eAAgByI,EAA4BzI,CAAI,CAClD,EACA,GAAGuI,CACL,CAAC,EAED5F,EAAS,CACP,MAAO,CAAE,KAAM+F,EAAW,gBAAyC,EACnE,GAAGH,CACL,CAAC,EAGCzG,EAA2B,CAC7B2F,EAAO,EACPU,EAAS,EACT,MACF,CAEA,IAAMS,GAAkBlJ,EAACuG,GAAiB,CACxC,GAAIjG,EAAK,SAAW,SAClB,OAGF,GAAM,CAAE,aAAAsI,EAAc,mBAAAO,GAAoB,sBAAAC,EAAsB,EAC9DC,EAAqB9C,CAAK,EAE5B+C,GAAK/C,EAAO,CACV,KAAM,CACJ,UAAWjG,EAAK,UAChB,IAAK,GACL,QAASG,GAAa,WAAa,GACnC,WAAY6D,GAAc,YAAc,EAC1C,EACA,QAASiF,GAAY,cAAchD,CAAK,EAAIA,EAAM,gBAAgB,EAAI,CAAC,CACzE,CAAC,EAED,IAAMsC,GAAejH,EAAiB,CACpC,WAAAC,EACA,WAAAC,EACA,WAAY,SACZ,eAAgB,SAChB,QAAS8G,EACT,QAASO,GACT,UAAWC,GACX,MAAO7C,GAAO,KAChB,CAAC,EAEDtD,EAAS,CACP,MAAO,CACL,cACA,OAAQ2F,EACR,WAAYC,GAAa,aAAeI,EACxC,YAAaH,EAAyBxI,CAAI,EAC1C,eAAgByI,EAA4BzI,CAAI,CAClD,EACA,GAAGuI,EACL,CAAC,EACDd,EAAO,EACPU,EAAS,CACX,EAzCwB,mBA2CpBe,GAEJ,GAAI,CACFA,GAAgB,MAAMtB,EAAW5D,EAAa,UAAU,CAC1D,OAASiC,EAAO,CACd2C,GAAgB3C,CAAc,EAC9B,MACF,CAEeiD,GAAc,UAAUjI,CAAM,EAE1C,cAAcmH,EAAIJ,EAAexD,CAAO,EACxC,KAAK,CAAC,CAAE,KAAA3E,EAAM,SAAAsJ,CAAS,IAAM,CAC5B,IAAMzG,GAAc0G,GAClBvJ,EACAqI,EAAqB,QACrB9D,EAAK,WACP,EACA5B,GACEuC,EACAlF,EACA6C,KACG,CAACyG,GAAaA,GAAY,CAACA,EAAS,qBACnC,CACE,IAAKzG,GACL,YAAa2F,EAAa,UAAY,MACxC,EACA,MACN,EAEIc,GACF3B,EAAyB3H,EAAM,CAAE,SAAAsJ,CAAS,CAAC,EAE7CxB,4BAAiD,EACjDD,EAAK,EACLS,EAAS,CACX,EAAGS,EAAe,CACtB,CA1MsBlJ,EAAA6H,GAAA,mBA4Mf,SAAS8B,GAAmCC,EAI1C,CACP,GAAM,CAAE,oBAAAC,EAAqB,UAAAC,EAAW,QAAAnD,CAAQ,EAAIiD,EAC9C,CAAE,WAAYzF,EAAQ,QAAAF,CAAQ,EAAI4F,EAEnCC,EAAU,KAAMC,GAAUA,EAAM,MAAQ9F,CAAO,GAIpD0C,GAAS,OAAO,EAAE,QAASqD,GAAM,CAC/B,IAAMC,EAAeD,EAAE,KAAK,WAAW,EACjC1J,EAAO2J,GAAc,YAC3B,GAAI3J,GAAQA,EAAK,SAAW,UAAW,CACrC,IAAMG,EAAcJ,EAAeC,CAAI,EACvC,GAAIG,EAAa,CACf,IAAMyJ,EACJD,GAAc,YAAY,QAAQxJ,EAAY,cAAc,GACxD,WACA0J,EAAuB,OAAO,KAAKH,EAAE,KAAK,MAAM,KAAK,EAAE,KAC1DI,GAAW,CACV,IAAMpD,EAAOgD,EAAE,KAAK,MAAM,MAAMI,CAAM,EACtC,OACEpD,EAAK,SAAWqD,GAAO,SAEvB,gCAAoC,EAAE,SACpCrD,EAAK,YAAY,MACnB,CAEJ,CACF,EAEMb,EAAkB9B,EACtB/D,EACAG,CACF,GAAG,QAGH,GAAI,CAACqJ,EAAU,KAAMC,GAAUA,EAAM,MAAQ5D,CAAe,EAC1D,OAGF,GACE+D,IAA8B/F,GAC9BgG,GACAhE,GAAmBlC,EACnB,CACA,IAAMqG,EAAgBN,EAAE,KAClB,CAAE,KAAAxG,CAAK,EAAIC,EAAkBnD,CAAI,EACjCiK,EAAcC,GAAsChH,CAAI,EAE9DwG,EAAE,KAAK,MAAM,CACX,OAAQ,CACN,oCACA,YAAAO,CACF,EACA,OAAQ,EACV,CAAC,EAED,IAAMrE,EAAS3C,GAAkC,CAC/C,WAAY+G,EAAc,WAAW,KAAKA,CAAa,EACvD,WAAYA,EAAc,WAAW,KAAKA,CAAa,CACzD,CAAC,EAEGpE,GACFjD,EAAS,CACP,MAAO,CACL,4BACA,oCAEA,eAAgBgB,EAChB,gBAAiBkC,GAAmB,MACtC,EACA,KAAMD,EAAO,KACb,KAAMA,EAAO,IACf,CAAC,CAEL,CACF,CACF,CACF,CAAC,CACH,CAnFgBlG,EAAA2J,GAAA,sCAqFT,SAASc,GAA6B9D,EAAyB,CACpEA,GAAS,OAAO,EAAE,QAASqD,GAAM,CAc/B,GAb6B,OAAO,KAAKA,EAAE,KAAK,MAAM,KAAK,EAAE,KAC1DI,GAAW,CACV,IAAMpD,EAAOgD,EAAE,KAAK,MAAM,MAAMI,CAAM,EACtC,OACEpD,EAAK,SAAWqD,GAAO,SACvB,uDAGA,EAAE,SAASrD,EAAK,YAAY,MAAM,CAEtC,CACF,EAE0B,CACxB,IAAM1G,EAAO0J,EAAE,KAAK,WAAW,GAC3B,YACJ,GAAI1J,EAAK,SAAW,UAAW,CAC7B,GAAM,CAAE,KAAAkD,CAAK,EAAIC,EAAkBnD,CAAI,EACjCiK,EAAcG,GAA0ClH,CAAI,EAGlEwG,EAAE,KAAK,MAAM,CACX,OAAQ,CACN,uCACA,YAAAO,CACF,CACF,CAAC,CACH,CACF,CACF,CAAC,CACH,CAhCgBvK,EAAAyK,GAAA,gCAwCT,SAASE,GAAgBhE,EAAiC,CAC/D,IAAMiE,EAASjE,GAAS,OAAO,GAAK,IAAI,IAClCT,EAAwB,CAAC,EAC/B,OAAA0E,EAAO,QAASZ,GAAM,CAGpB,IAAM1J,EADe0J,EAAE,KAAK,WAAW,GACZ,YACvB,CAAC1J,GAAQA,EAAK,SAAW,WAG7B4F,EAAO,KAAK5F,CAAI,CAClB,CAAC,EACM4F,CACT,CAbgBlG,EAAA2K,GAAA,mBAwBT,SAASE,GAAiCC,EAA6B,CAC5EA,EAAa,QAASxK,GAAS,CAC7B,IAAMG,EAAcJ,EAAeC,CAAI,EACjC0I,yBACF+B,EAKFtK,GAAa,gBAAkB6C,EAAyB,gBAExDyH,sBACSzK,GAAM,SAAW,YAC1ByK,gCAEI/B,GAAe/F,GACnBA,EAAS,CACP,MAAO,CACL,KAAM+F,EACN,OACE+B,sBACJ,EACA,KAAMzK,EACN,KAAMG,CACR,CAAC,CAEL,CAAC,CACH,CA3BgBT,EAAA6K,GAAA,oCAwCT,SAASzD,GACdyC,EACAlD,EACAqE,EACAC,EAAU,CAAE,qBAAsB,EAAK,EACjC,CACN,GAAM,CAAE,WAAY9G,EAAQ,QAAAF,CAAQ,EAAI4F,EACxC,GAAI,CAAC1F,EACH,OAGF,IAAM+G,EAAuC,CAAC,EACxCC,EAAiC,CAAC,EAExCxE,GAAS,OAAO,EAAE,QAASqD,GAAM,CAE/B,GAAIA,EAAE,SAAWK,GAAO,QAAS,CAC/B,IAAMJ,EAAeD,EAAE,KAAK,WAAW,EACjC1J,EAAO2J,GAAc,YAE3B,GAAI3J,GAAQA,EAAK,SAAW,UAAW,CACrC,IAAMG,EAAcJ,EAAeC,CAAI,EACnCG,IAEAwD,GACAI,EAA4B/D,EAAMG,CAAW,GAAG,SAC9CwD,GACFgG,GAAc,YAAY,QAAQhG,CAAO,GAAG,aAAeE,EAE3D+G,EAAwB,KAAKlB,EAAE,IAAI,EAEnCC,GAAc,YAAY,QAAQxJ,EAAY,cAAc,GACxD,aAAe0D,GAEnBgH,EAAkB,KAAKnB,EAAE,IAAI,EAGnC,CACF,CACF,CAAC,EAED,IAAIoB,EACJ,GAAIF,EAAwB,OAAS,GAGnC,GAFAE,EAAoBF,EAAwB,CAAC,EAEzCA,EAAwB,OAAS,EACnC,QAASG,EAAI,EAAGA,EAAIH,EAAwB,OAAQG,IAAK,CACvD,IAAMC,EAAeJ,EAAwBG,CAAC,EAE9CzH,GAAsC,CACpC,WAAY0H,EAAa,WAAW,KAAKA,CAAY,EACrD,WAAYA,EAAa,WAAW,KAAKA,CAAY,CACvD,CAAC,CACH,OAEOH,EAAkB,OAAS,GAAKF,EAAQ,uBACjDG,EAAoBD,EAAkB,CAAC,GAGzC,GAAIC,EAAmB,CACrB,IAAMG,EAAoBH,EAAkB,WAAW,EACjDI,EAAcnL,EAAekL,GAAmB,WAAW,EAE3DnH,EAAmBoH,EACrBnH,EAA4BkH,EAAkB,YAAaC,CAAW,EACtE,KAEF,CAACvH,GACD,CAACG,GACD,CAAC4G,IAAqB7G,EAAQF,EAASG,CAAgB,EAEvDgH,EAAkB,QAAQ,EAE1BA,EAAkB,WAAW,CAEjC,CACF,CA5EgBpL,EAAAoH,GAAA,WAkFT,SAASqE,GAA4BlL,EAAgC,CAC1E,MAAO,CAAC,CAACA,EAAK,gBAAkB,CAAC,CAACA,EAAK,sBACzC,CAFgBP,EAAAyL,GAAA,+BAQhB,eAAsBC,GACpBC,EACoC,CACpC,IAAMC,EAAe,MAAMD,EAC3B,GAAI,CAACC,EAAa,IAAM,CAACA,EAAa,YACpC,MAAMC,EAAY,kBAChBD,EAAa,OAAS,sCACxB,EAEF,OAAOA,CACT,CAVsB5L,EAAA0L,GAAA,aAYf,SAASI,GACdxL,EACAqG,EAIA,CACA,GAAM,CAAE,MAAAG,CAAM,EAAIhH,GAAW,EAC7BQ,EAAK,QAAQ,OAAO,EAEpB,IAAMuI,EAAejH,EAAiB,CACpC,WAAYtB,EAAK,QAAQ,WACzB,WAAYA,EAAK,QAAQ,WACzB,QAAS,yBACT,QACE,4HACF,WAAY,SACZ,eAAgB,SAChB,UAAW,aACb,CAAC,EAED,OAAA2C,EAAS,CACP,MAAO,CACL,cACA,WAAY,cACZ,OAAQ4F,EAAa,KAAK,cAAgB,OAC1C,YAAaC,EAAyBD,EAAa,IAAI,EACvD,eAAgBE,EAA4BF,EAAa,IAAI,CAC/D,EAEA,KAAMA,EAAa,KACnB,KAAMA,EAAa,IACrB,CAAC,EAED/B,EAAM,EACFH,GACFA,GAAS,MAAM,EAGVkC,CACT,CAxCgB7I,EAAA8L,GAAA,cA0CT,SAASC,EACdC,EAC6B,CAC7B,OAAOA,EACJ,MAAM,EACN,QAAQ,EACR,KAAMzL,GAASA,EAAK,SAAW,SAAS,CAC7C,CAPgBP,EAAA+L,EAAA,yBAST,SAASE,GACdD,EAC6B,CAC7B,OAAOA,EACJ,MAAM,EACN,QAAQ,EACR,KAAMzL,GAASA,EAAK,SAAW,QAAQ,CAC5C,CAPgBP,EAAAiM,GAAA,iBAST,SAASC,GAAa3L,EAAqB,CAChD,GAAM,CAAE,YAAAe,CAAY,EAAIf,EAOxB,OALGe,GAAa,OAASE,EAAgB,KAAOF,EAAY,cACzDA,GAAa,OAASE,EAAgB,UACrCF,EAAY,cACbA,GAAa,OAASE,EAAgB,MAAQF,EAAY,YAG/D,CATgBtB,EAAAkM,GAAA,gBAWT,SAASC,GACdC,EACAC,EACQ,CACR,IAAMC,EAAW,IAAIC,GAAUH,CAAM,EAAE,aAAaC,CAAQ,EAC5D,OAAI,MAAMC,EAAS,SAAS,CAAC,EACpB,GAEFA,EAAS,SAAS,CAC3B,CATgBtM,EAAAmM,GAAA,uBAWT,SAASK,GAAgBlM,EAA2B,CACzD,OAAO6L,GACL7L,EAAK,YACLA,EAAK,MAAM,CAAC,EAAE,cAAgB,EAChC,CACF,CALgBN,EAAAwM,GAAA,mBAOT,SAASC,GAAiBnM,EAA2B,CAC1D,IAAMoM,EAAWpM,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EAEjD,OAAO6L,GACLO,EAAS,cAAgB,GACzBA,EAAS,YAAc,EACzB,CACF,CAPgB1M,EAAAyM,GAAA,oBAST,SAASE,GACdrM,EACsD,CACtD,IAAMsM,EAA4D,CAChE,UACA,QACF,EAEMC,EAAwBvM,EAAK,MAAM,cAAeC,GACtDqM,EAAgB,SAASrM,EAAK,MAAM,CACtC,EAEA,OAAOsM,EAAwB,EAC3B,OACA,CAAE,KAAMvM,EAAK,MAAMuM,CAAqB,EAAG,MAAOA,CAAsB,CAC9E,CAfgB7M,EAAA2M,GAAA,uBAiBT,SAAS7D,EAAyBxI,EAA2B,CAClE,IAAMwM,EAAmBH,GAAoBrM,CAAI,EAEjD,OAAKwM,EAIEA,EAAiB,QAAU,EAC9BxM,EAAK,YACLA,EAAK,MAAMwM,EAAiB,MAAQ,CAAC,EAAE,cAAgB,GALlD,EAMX,CAVgB9M,EAAA8I,EAAA,4BAYT,SAASC,EAA4BzI,EAA2B,CACrE,IAAMyM,EAAqBJ,GAAoBrM,CAAI,EAEnD,OAAO6L,GACLrD,EAAyBxI,CAAI,EAC7ByM,GAAoB,MAAM,cAAgB,EAC5C,CACF,CAPgB/M,EAAA+I,EAAA,+BAST,SAASiE,GAA+B1M,EAA2B,CACxE,IAAMyM,EAAqBhB,EAAsBzL,EAAK,KAAK,EAE3D,OAAO6L,GACLY,GAAoB,cAAgB,GACpCA,GAAoB,YAAc,EACpC,CACF,CAPgB/M,EAAAgN,GAAA,kCAST,SAASC,GACd3M,EACA2B,EACAiL,EAC0D,CAC1D,MAAO,CACL,cACA,OAAQjL,EACR,WAAYiL,GAAcjE,EAC1B,YAAaH,EAAyBxI,CAAI,EAC1C,eAAgByI,EAA4BzI,CAAI,CAClD,CACF,CAZgBN,EAAAiN,GAAA,yBDrmDhB,IAAME,GAA4B,IAC5BC,GAA8B,IAMpC,eAAeC,GAAuB,CACpC,WAAAC,EACA,WAAAC,EACA,KAAAC,EACA,SAAAC,EACA,MAAAC,EACA,OAAAC,EACA,QAAAC,CACF,EAIkB,CAChB,IAAMC,EAAOP,EAAW,EAAE,YACpB,CAAE,KAAAQ,CAAK,EAAIF,EACXG,EAAmB,IAAI,MAAM,oBAAoB,EAEjDC,EAAcC,EAAeJ,CAAI,EAEvC,GAAI,CAACG,GAAa,sBAChB,OAEF,IAAME,EAAKC,EAAiBH,CAAW,EACnCI,EAAOJ,EAAY,sBACnBK,EAAqB,GACrBC,EAA2C,KAC3CC,EAA4C,KAC1C,CAAE,yBAAAC,EAA0B,yBAAAC,CAAyB,EACzDC,GAAyB,EAE3B,GAAI,CACF,IAAMC,EAASC,GAAqBZ,CAAW,EACzCa,EAAeC,EAAiBjB,EAAMG,CAAW,EACnDW,GAAUE,IACZN,GAAU,MAAMX,EAAQ,WAAWiB,EAAa,UAAU,GAAG,UAC3DF,CACF,EAGJ,MAAgB,CAKhB,CAEA,GAAI,CAEF,GAAM,CAAE,SAAUI,EAAY,gBAAAC,CAAgB,EAC5CR,EAAyBJ,CAAI,EAC/B,GAAIG,GAAQ,MAAQ,CAACS,EAAiB,CACpC,IAAMC,EACHf,GAAI,YAAcJ,EAAK,cAAcI,GAAI,UAAU,GAAG,SACvD,OACI,CAAE,KAAMgB,EAAe,SAAUC,CAAkB,EACvD,MAAMZ,EAAO,KAAKH,EAAMa,EAASF,CAAU,EAC7C,GAAIG,IAAkBd,EAAM,CAC1BJ,EAAY,sBACVkB,GAAiBlB,EAAY,sBAC/B,IAAMoB,EAAuBC,EAAsBxB,EAAMG,CAAW,EAChEsB,EAC4B,CAAC,CAAC,OAAO,KAAKxB,EAAK,WAAW,EAAE,SAE9DwB,EAAcC,GACZvB,EAAY,sBACZoB,EAAqB,QACrBtB,EAAK,WACP,GAEEwB,GACEtB,EAAY,aAAeA,EAAY,aAAa,QAAU,IAChEA,EAAY,YAAYA,EAAY,YAAY,OAAS,CAAC,EAAI,CAC5D,IAAKsB,EACL,YAAa,eACf,GAGJlB,EAAOJ,EAAY,sBACfkB,GAAiBC,GACnBV,EAAyBS,EAAe,CACtC,SAAUC,CACZ,CAAC,CAEL,MACEV,EAAyBS,EAAe,CACtC,gBAAiB,EACnB,CAAC,CAEL,CACF,OAASM,EAAO,CACd,GAAM,CAAE,aAAAC,EAAc,mBAAAC,EAAoB,sBAAAC,CAAsB,EAC9DC,EAAqBJ,CAAK,EACtBK,EAAeC,EAAiB,CACpC,WAAAxC,EACA,WAAAC,EACA,WAAY,SACZ,eAAgB,SAChB,QAASkC,EACT,QAASC,EACT,UAAWC,CACb,CAAC,EAEKI,EAAQC,GACZnC,EACA4B,EACAI,EAAa,WACf,EAEAI,GAAKlC,EAAkB,CACrB,KAAM,CACJ,KAAM,eACN,OAAQgC,EAAM,OACd,WAAYA,EAAM,WAClB,QAASN,EACT,cAAeC,EACf,YAAa7B,CACf,EACA,QAASqC,GAAY,cAAcV,CAAK,EAAIA,EAAM,gBAAgB,EAAI,CAAC,CACzE,CAAC,EAEDnB,EAAqB,EAKvB,CAEA,IAAM8B,EAAoC,CACxC,UAAWtC,EAAK,UAChB,KAAAO,EACA,KAAMJ,EAAY,EACpB,EAEA,GAAI,CACFM,EAAS,MAAM8B,EAAY,EAAE,YAAYD,CAAW,CAEtD,MAAY,CACV,MAAME,GAAMlD,EAAyB,EACrCO,EAAM,EACNuC,GAAKlC,EAAkB,CACrB,KAAM,CAAE,KAAM,gBAAiB,YAAAoC,EAAa,YAAatC,CAAK,CAChE,CAAC,EACD,MACF,CAOA,GAAIQ,EACF,OAAOV,EAAO,EAEhB,GAAIK,GAAa,SAAW,SAC1B,OAGF,IAAMsC,EACJhC,GAAQ,eACPN,EAAY,aAAeA,EAAY,aAAe,MACnDuC,EAAmBvC,EAAY,cAAgB,KACrDH,EAAK,aAAeS,GAAQ,cAAgBT,EAAK,aACjDA,EAAK,4BACLA,EAAK,mBAAqB,GAE1BG,EAAY,OAASM,GAAQ,QAAUN,EAAY,OACnDA,EAAY,aACVM,GAAQ,cAAgBN,EAAY,cAAgB,KACtDA,EAAY,aAAesC,GAAgBtC,EAAY,aACvDA,EAAY,YAAcM,GAAQ,aAAeN,EAAY,YAC7DA,EAAY,cAAgBM,GAAQ,OAAS,KAE7C,IAAMkC,EAAiBlC,GAAQ,MAwB/B,GAtBIkC,IACFxC,EAAY,OAAS,UACrBA,EAAY,sBAAwB,KACpCA,EAAY,wBAA0B,KACtCyC,GAAiBzC,EAAawC,CAAc,GAG1CD,IAAqB,MAAQD,IAAiB,KAChDI,EAAS,CACP,MAAO,CAAE,uBAAqC,aAAAJ,CAAa,EAC3D,KAAMzC,EACN,KAAMG,CACR,CAAC,EACQuC,IAAqB,MAAQD,IAAiB,MAEvDI,EAAS,CACP,MAAO,CAAE,mBAAiC,EAC1C,KAAM7C,EACN,KAAMG,CACR,CAAC,EAGCA,EAAY,SAAW,UAAW,CACpC,IAAM2C,EAAWC,GAAY/C,EAAMG,CAAW,EAC9CH,EAAK,mBAAqB,GAC1BA,EAAK,aAAe8C,EAChB,uBAAuBA,EAAS,SAAS,KAAKA,EAAS,cAAc,OAAOA,EAAS,YAAY,GACjG,GACJD,EAAS,CACP,MAAO,CACL,iBACA,YAAaG,EAAyBhD,CAAI,EAC1C,eAAgBiD,EAA4BjD,CAAI,EAChD,aAAcG,EAAY,cAAgB,GAC1C,gBAAiB+C,GAA+BlD,CAAI,CACtD,EACA,KAAAA,EACA,KAAMG,CACR,CAAC,CACH,MAAWA,EAAY,SAAW,WAChCH,EAAK,aAAe,mCACpBA,EAAK,6BACLA,EAAK,mBAAqBS,GAAQ,cAAgB,GAClDT,EAAK,OAAS,SACdA,EAAK,WAAa,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAChDoC,GAAKlC,EAAkB,CACrB,KAAM,CACJ,KAAM,qBACN,QAASF,EAAK,aACd,eAAgBA,EAAK,mBACrB,YAAaA,CACf,CACF,CAAC,GAIHN,EAAW,CAAE,GAAGD,EAAW,EAAG,YAAaO,CAAK,CAAC,EAE7CS,GAAQ,SAAW,SACrBX,EAAO,EAEPW,GAAQ,SAAW,WAClBA,GAAQ,SAAW,WAAeA,EAAO,OAE1Cb,sBAA2C,EAC3CD,EAAK,IAEL,MAAM6C,GAAMlD,EAAyB,EACrCO,EAAM,EAEV,CApPesD,EAAA3D,GAAA,0BA0Pf,eAAe4D,GAAoB,CACjC,WAAA3D,EACA,WAAAC,EACA,KAAAC,EACA,SAAAC,EACA,MAAAC,EACA,OAAAC,EACA,QAAAC,CACF,EAIkB,CAChB,IAAMC,EAAOP,EAAW,EAAE,YACpB,CAAE,KAAAQ,CAAK,EAAIF,EACX,CAAE,yBAAAY,EAA0B,yBAAAC,CAAyB,EACzDC,GAAyB,EACrBwC,EAA2B,IAAI,MAAM,6BAA6B,EAElElD,EAAcC,EAAeJ,CAAI,EACvC,GAAI,CAACG,EAAa,CAChB,QAAQ,IAAI,2CAA2C,EACvD,MACF,CACA,IAAME,EAAKC,EAAiBH,CAAW,EAEvC,GAAI,CAACA,GAAa,sBAChB,OAEF,IAAII,EAAOJ,EAAY,sBAEnBO,EAA4C,KAChD,GAAI,CACF,IAAMI,EAASC,GAAqBZ,CAAW,EACzCa,EAAeC,EAAiBjB,EAAMG,CAAW,EACnDW,GAAUE,IAEZN,GADsB,MAAMX,EAAQ,WAAWiB,EAAa,UAAU,GAC/C,UAAUF,CAAM,EAG3C,MAAgB,CAKhB,CAEA,GAAI,CACF,GAAM,CAAE,SAAUI,EAAY,gBAAAC,CAAgB,EAC5CR,EAAyBJ,CAAI,EAE/B,GAAIG,GAAQ,MAAQ,CAACS,EAAiB,CACpC,IAAMC,EACHf,GAAI,YAAcJ,EAAK,cAAcI,GAAI,UAAU,GAAG,SACvD,OACI,CAAE,KAAMgB,EAAe,SAAUC,CAAkB,EACvD,MAAMZ,EAAO,KAAKH,EAAMa,EAASF,CAAU,EAC7C,GAAIG,IAAkBd,EAAM,CAC1BJ,EAAY,sBACVkB,GAAiBlB,EAAY,sBAC/B,IAAMoB,EAAuBC,EAAsBxB,EAAMG,CAAW,EAChEsB,EAC4B,CAAC,CAAC,OAAO,KAAKxB,EAAK,WAAW,EAAE,SAE9DwB,EAAcC,GACZvB,EAAY,sBACZoB,EAAqB,QACrBtB,EAAK,WACP,GAEEwB,GACEtB,EAAY,aAAeA,EAAY,aAAa,QAAU,IAChEA,EAAY,YAAYA,EAAY,YAAY,OAAS,CAAC,EAAI,CAC5D,IAAKsB,EACL,YAAa,kBACf,GAGJlB,EAAOJ,EAAY,sBACfkB,GAAiBC,GACnBV,EAAyBS,EAAe,CACtC,SAAUC,CACZ,CAAC,CAEL,MACEV,EAAyBS,EAAe,CACtC,gBAAiB,EACnB,CAAC,CAEL,CACF,OAASM,EAAO,CACd,GAAM,CAAE,aAAAC,EAAc,mBAAAC,EAAoB,sBAAAC,CAAsB,EAC9DC,EAAqBJ,CAAK,EACtBK,EAAeC,EAAiB,CACpC,WAAAxC,EACA,WAAAC,EACA,WAAY,SACZ,eAAgB,SAChB,QAASkC,EACT,QAASC,EACT,UAAWC,CACb,CAAC,EAEKI,EAAQC,GACZnC,EACA4B,EACAI,EAAa,WACf,EAEA,OAAAa,EAAS,CACP,MAAAX,EACA,GAAGF,CACL,CAAC,EACDI,GAAKiB,EAA0B,CAC7B,KAAM,CACJ,KAAM,eACN,OAAQnB,EAAM,OACd,WAAYA,EAAM,WAClB,QAASN,EACT,cAAeC,EACf,YAAa7B,CACf,EACA,QAASqC,GAAY,cAAcV,CAAK,EAAIA,EAAM,gBAAgB,EAAI,CAAC,CACzE,CAAC,EACM7B,EAAO,CAChB,CAEA,IAAIwD,EAAa,GACXC,EAAgD,CACpD,UAAWvD,EAAK,UAChB,KAAMG,EAAY,qBACpB,EAEA,GAAI,CACF,IAAMqD,EAAW,MAAMjB,EAAY,EAAE,cACnCgB,EAAQ,UACRA,EAAQ,IACV,EAEA,GAAIpD,GAAa,SAAW,SAC1B,OAIF,GADAmD,EAAaE,EAAS,WAEpB,CAACF,IACAE,EAAS,WAAa,UAAYA,EAAS,WAAa,WACzD,CACA,IAAIC,EAASC,EACTF,EAAS,WAAa,UACxBC,EAAU,6BACVC,EAAU,qDAEVD,EAAU,sBACND,EAAS,wBAA0BA,EAAS,sBAC9CE,EAAU,sBAAsBF,EAAS,sBAAsB,uBAAuBA,EAAS,qBAAqB,GAEpHE,EAAU,uDAOd,IAAM1B,EAAeC,EAAiB,CACpC,WAAAxC,EACA,WAAAC,EACA,WAAY,SACZ,eAAgB,SAChB,UAAW,uBACX,QAAS+D,EACT,QAASC,CACX,CAAC,EAEKxB,EAAQC,GACZnC,EACAyD,EACAzB,EAAa,WACf,EAEAa,EAAS,CACP,MAAAX,EACA,GAAGF,CACL,CAAC,EAEDI,GAAKiB,EAA0B,CAC7B,KAAM,CACJ,KAAM,kBACN,QAASrD,EAAK,aACd,eAAgBA,EAAK,mBACrB,YAAaA,CACf,CACF,CAAC,EAEDF,EAAO,CACT,MAAYwD,GAEVT,EAAS,CACP,MAAO,CAAE,mBAAiC,EAC1C,KAAA7C,EACA,KAAMG,CACR,CAAC,CAGL,MAAY,CACVmD,EAAa,GACblB,GAAKiB,EAA0B,CAC7B,KAAM,CAAE,KAAM,gBAAiB,YAAaE,EAAS,YAAavD,CAAK,CACzE,CAAC,CACH,CACIsD,GACFnD,EAAY,OAAS,WACrBH,EAAK,aAAe,YAAYG,EAAY,UAAU,0BACtDH,EAAK,mBAAqB,KAC1BA,EAAK,+BACLG,EAAY,uBAAyB,KACrCA,EAAY,sBAAwB,KACpCA,EAAY,wBAA0B,KACtCA,EAAY,4BAA8B,KAC1CA,EAAY,wBAA0B,KAEtCT,EAAW,CACT,GAAGD,EAAW,EACd,YAAaO,CACf,CAAC,EAED6C,EAAS,CACP,MAAO,CAAE,4BAA0C,EACnD,KAAM7C,EACN,KAAMG,CACR,CAAC,EAEDP,sBAA2C,EAC3CD,EAAK,IAEL,MAAM6C,GAAMjD,EAA2B,EACvCM,EAAM,EAEV,CA9OesD,EAAAC,GAAA,uBAwPf,eAAsBO,GACpBC,EACe,CACf,IAAM5D,EAAO4D,EAAQ,WAAW,EAAE,YAC5BzD,EAAcC,EAAeJ,CAAI,EACvC,GAAI,CAACG,EAAa,CAChB,QAAQ,IAAI,4CAA6CH,EAAK,SAAS,EACvE,MACF,CAMA6D,GAAmBD,CAAO,EAEtBzD,EAAY,SAAW,UACzB,MAAMX,GAAuBoE,CAAO,EAC3BzD,EAAY,SAAW,sBAChC,MAAMiD,GAAoBQ,CAAO,CAErC,CArBsBT,EAAAQ,GAAA,eQ1hBtB,OAAS,QAAAG,OAAY,0BA0BrB,eAAsBC,GACpBC,EACe,CACf,GAAM,CAAE,WAAAC,EAAY,WAAAC,EAAY,KAAAC,EAAM,SAAAC,CAAS,EAAIJ,EAC7CK,EAAOH,EAAW,EAAE,YAEpBI,EAAcC,EAAeF,CAAI,EAGvC,GAAI,CAFgBG,EAAiBF,CAAW,EAE9B,CAChBG,EAAS,CACP,MAAO,CACL,oBACA,kBACF,EACA,KAAAJ,EACA,KAAMC,CACR,CAAC,EACD,IAAMI,EAAoC,CACxC,UAAWL,EAAK,UAChB,KAAMC,EAAY,GAClB,aAAc,CACZ,SAAUD,EAAK,SAAS,SACxB,gBAAiBA,EAAK,SAAS,eACjC,EACA,YAAa,CACX,QAASA,EAAK,qBACd,IAAKA,EAAK,qBACV,QAAS,EACX,CACF,EACA,GAAI,CAGF,GAAM,CAAE,YAAAM,CAAY,EAAI,MAAMC,GAC5BC,EAAY,EAAE,kBAAkBH,CAAO,CACzC,EAEIC,GACFG,GAAiBR,EAAaK,CAAW,EAG3CV,EAAW,CAAE,GAAGC,EAAW,EAAG,YAAaG,CAAK,CAAC,EACjDD,uBAA4C,EAC5CD,EAAK,CACP,OAASY,EAAgB,CACvBV,EAAK,OAAS,SACdA,EAAK,WAAa,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAChD,GAAM,CAAE,aAAAW,EAAc,mBAAAC,CAAmB,EAAIC,EAAqBH,CAAK,EAEjEI,EAAeC,EAAiB,CACpC,WAAAlB,EACA,WAAAD,EACA,WAAY,SACZ,eAAgB,SAChB,QAASe,EACT,QAASC,EACT,UAAW,iBACb,CAAC,EAEKI,EAAQC,GACZjB,EACAW,EACAG,EAAa,WACf,EAEAV,EAAS,CACP,MAAAY,EACA,GAAGF,CACL,CAAC,EAEGJ,aAAiB,OACnBQ,GAAK,IAAI,MAAM,0BAA0B,EAAG,CAC1C,KAAM,CACJ,QAASR,EAAM,QACf,YAAaL,EACb,OAAQW,EAAM,OACd,WAAYA,EAAM,WAClB,YAAahB,CACf,CACF,CAAC,EAGHL,EAAQ,OAAO,CACjB,CACF,CACF,CAtFsBwB,EAAAzB,GAAA,qBC3BtB,OAAS,4BAAA0B,OAAgC,cA+BzC,eAAsBC,GACpBC,EACe,CACf,GAAM,CAAE,WAAAC,EAAY,QAAAC,CAAQ,EAAIF,EAC1B,CAAE,KAAAG,EAAM,QAAAC,EAAS,UAAAC,CAAU,EAAIH,EAC/B,CAAE,UAAAI,CAAU,EAAIC,GAAW,EAE3BC,EAAYN,EAAQ,YAAcA,EAAQ,QAAQ,GAClDO,EAAqCC,EAACC,GAAe,CACzDX,EAAQ,MAAMW,CAAU,EACpBH,GAAaR,EAAQ,QAAQ,gBAC/BA,EAAQ,QAAQ,eAAe,CAEnC,EAL2C,gBAOrCY,EAAOX,EAAW,EAAE,YAEpBY,EAAcC,EAAeF,CAAI,EAIvC,GADuB,CAACG,GAA0BH,EAAMV,EAAQ,KAAK,EAAE,GACnD,CAClB,GAAM,CAAE,KAAAc,EAAM,QAAAC,CAAQ,EAAIC,EAAkBN,CAAI,EAC1CO,EAAuBf,GAAS,aAAa,KAChDgB,GAAM,CAACA,EAAE,UAAU,KAAMC,GAAYA,EAAQ,aAAeL,CAAI,CACnE,EACMM,EACJC,GAAanB,CAAO,GAAKe,EACrBK,GAA0CR,CAAI,EAC9CS,GAAuDT,EAAMC,CAAO,EAEpEN,EAAa,CACjB,uCACA,YAAAW,CACF,EACAb,EAAaE,CAAU,EACvB,MACF,CAGA,IAAMe,EAAiB,MAAMC,GAC3Bf,EACAC,EACAT,EACAD,EACAE,CACF,EAGA,GAD4B,CAAC,CADXC,EAAU,GACe,CAACE,GACjB,CAACkB,EAAgB,CAC1C,IAAME,EAAUC,GAEVlB,EAAa,CACjB,iCACA,QAASiB,CACX,EACAnB,EAAaE,CAAU,EACvB,MACF,SAAW,CAACe,EAAgB,CAC1B,IAAMI,EAAgBC,EAAsBnB,EAAMC,CAAW,EACvDe,EAAUI,GACdF,EAAc,OAChB,EAEMnB,EAAa,CACjB,oCACA,QAASiB,CACX,EACAnB,EAAaE,CAAU,EACvB,MACF,CAcA,GAZAsB,GAAoBjC,EAAS,CAC3B,QAAS,GACT,QAAS,6CACT,OAAQkC,GAAyB,cACnC,CAAC,EAMyBC,GAA4BtB,CAAW,GAExC,CAACL,EAAW,CACnC,IAAMG,EAAa,CACjB,iCACA,YAAakB,GACb,QAAS,CAAC,CACZ,EACApB,EAAaE,CAAU,EACvB,MACF,CAGA,MAAMyB,GAAgBpC,CAAO,CAC/B,CAhGsBU,EAAAX,GAAA,sBCVf,SAASsC,GAAiB,CAC/B,SAAAC,EACA,KAAAC,EACA,OAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAA0E,CACxE,IAAMC,EAAOD,EAAW,EAAE,YACpBE,EAAcC,EAAeF,CAAI,EACjCG,EAAWH,EAAK,MAAM,KACzBI,GAA0BA,EAAK,SAAW,QAC7C,EAEA,GAAMH,GAAe,CAACE,EAAU,CAC9B,GAAIE,GAAmBL,EAAMC,CAAW,EACtC,OAAAN,uBAA4C,EACrCC,EAAK,EAGd,GAAIK,GAAa,sBACf,OAAAN,4BAAiD,EAC1CC,EAAK,EAGdI,EAAK,OAAS,UAEdF,EAAW,CAAE,GAAGC,EAAW,EAAG,YAAaC,CAAK,CAAC,EAEjDM,EAAS,CACP,MAAO,CAAE,cAA4B,EACrC,KAAAN,EACA,KAAMC,CACR,CAAC,EAEDN,sBAA2C,EAC3CC,EAAK,CACP,KAAO,CACLI,EAAK,OAASG,EAAW,SAAW,UACpCH,EAAK,WAAa,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAEhDF,EAAW,CACT,GAAGC,EAAW,EACd,YAAaC,CACf,CAAC,EAED,IAAMO,EAAcC,EAAyBR,CAAI,EAC3CS,EAAiBC,EAA4BV,CAAI,EAEvDM,EAAS,CACP,GAAIH,EACA,CACE,MAAO,CACL,cACA,OAAQH,EAAK,cAAgB,OAC7B,WAAY,sBACZ,YAAAO,EACA,eAAAE,CACF,CACF,EACA,CACE,MAAO,CACL,iBACA,YAAAF,EACA,eAAAE,EACA,aACEE,EAAsBX,EAAK,KAAK,GAAG,cAAgB,GACrD,gBAAiBY,GAA+BZ,CAAI,CACtD,CACF,EACJ,KAAMA,EACN,KAAM,IACR,CAAC,EAEGG,EACFN,EAAO,EAEPD,EAAK,CAET,CACF,CA/EgBiB,EAAAnB,GAAA,oBCpBT,SAASoB,GAAM,CACpB,SAAAC,EACA,KAAAC,EACA,WAAAC,CACF,EAAwD,CACtD,IAAMC,EAAOD,EAAW,EAAE,YAE1BE,EAAS,CAAE,MAAO,CAAE,cAA4B,EAAG,KAAAD,EAAM,KAAM,IAAK,CAAC,EAErEH,sBAA2C,EAC3CC,EAAK,CACP,CAXgBI,EAAAN,GAAA,SCeT,IAAMO,GAA6B,CACxC,KAAM,OACN,QAAS,CACN,MAAwBC,GACxB,mBAAqCC,GACrC,mBAAqCC,GACrC,oBAAsCC,GACtC,yBAA2CC,EAC9C,EACA,IAAK,QAAsB,EAC3B,gBAAiB,CAACC,EAAOC,IAAS,CAC5BD,EAAM,OAAO,yCACfE,GAAwBF,EAAOC,CAAI,EAC1BD,EAAM,OAAO,sCACtBG,GAAwBH,EAAOC,CAAI,EAC1BD,EAAM,OAAO,oCACtBI,GAAuBJ,EAAOC,CAAI,CAEtC,CACF,ECpCA,OAAS,cAAAI,OAAkB,iCAC3B,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QCApC,OAAS,WAAAC,GAAS,aAAAC,GAAW,UAAAC,OAAc,gCAC3C,OAAS,MAAMC,OAAY,OAI3B,IAAMC,GAAe,yBAOrB,SAASC,IAAoB,CAC3B,MAAO,CAAC,CAAC,OAAO,aAAa,QAAQD,EAAY,CACnD,CAFSE,EAAAD,GAAA,YAIT,eAAeE,IAAyC,CACtD,GAAI,CACF,OAAQ,MAAO,OAAO,UAAkB,UAAU,GAC/C,IAAKC,GAAYA,EAAG,IAAI,EACxB,SAASC,EAAO,CACrB,MAAQ,CACN,MAAO,EACT,CACF,CAReH,EAAAC,GAAA,wBAgBf,eAAeG,IAA8B,CAC3C,IAAMC,EAAmB,OAAO,aAAa,QAAQ,cAAc,EAC7DC,EAAa,MAAML,GAAqB,EAG9C,GAAI,CAACI,GAAoBN,GAAS,GAAKO,EACrC,MAAO,GAIT,IAAMC,EAAuB,KAAK,MAAMF,CAAgB,EAClDG,EAAmC,CAAC,EAE1CD,EAAM,QAASE,GAAS,CAKtB,GAAIA,EAAK,SAAW,UAAW,CAC7B,IAAMC,EAASC,GAAK,EAEdC,EAAgC,CACpC,GAAIH,EAAK,UACT,UAAW,OAAOA,EAAK,YAAY,EACnC,KAAM,OACN,OAAQI,GAAO,QACf,QAAS,CACP,YAAaJ,CACf,EACA,MAAO,CACL,OAAQI,GAAO,QACf,gBAAiB,EACjB,MAAO,CACL,CAACH,CAAM,EAAG,CACR,WAAY,KACZ,OAAQG,GAAO,OACjB,CACF,CACF,EACA,MAAO,CACL,CACE,GAAIH,EACJ,2BACF,CACF,CACF,EACAF,EAAe,KAAKI,CAAa,CACnC,KAAO,CAKL,IAAME,EAASL,EAAK,SAAW,UAAYI,GAAO,QAAUA,GAAO,OAE7DD,EAAgC,CACpC,GAAIH,EAAK,UACT,UAAW,OAAOA,EAAK,YAAY,EACnC,KAAM,OACN,OAAAK,EACA,QAAS,CACP,YAAaL,CACf,EACA,MAAO,CACL,OAAAK,EACA,gBAAiB,EACjB,MAAO,CAAC,CACV,EACA,MAAO,CAAC,CACV,EAEAN,EAAe,KAAKI,CAAa,CACnC,CACF,CAAC,EAGD,IAAMG,EAAY,IAAIC,GAEhBC,EAAWT,EAAe,IAAI,MAAOU,GACzCH,EAAU,YAAYG,CAAK,CAC7B,EACA,aAAM,QAAQ,IAAID,CAAQ,EAG1B,OAAO,aAAa,QAAQnB,GAAc,GAAG,EAEtC,EACT,CAtFeE,EAAAI,GAAA,aDvBf,IAAIe,GAAW,EAEf,SAASC,GACPC,EACA,CACA,MAAO,GAAGA,GAAqB,UAAU,IACvCA,GAAqB,OACvB,IAAIA,GAAqB,UAAU,SAAS,CAAC,EAC/C,CANSC,EAAAF,GAAA,8BAcT,SAASG,IAEP,CACA,IAAMC,EAAaC,GAAS,EACtB,CAACC,EAAQC,CAAS,EAAIC,GAAkBJ,CAAU,EAExD,OAAAK,GAAU,IAAM,EACR,SAEAV,KAGJA,GAAW,EAENW,GAAU,EAAE,QAAQ,IAAM,CAC7BH,EAAU,EAAI,CAChB,CAAC,KAEL,EAAG,CAAC,CAAC,EAEE,CACL,OAAAD,CACF,CACF,CAvBSJ,EAAAC,GAAA,gBA+BT,SAASQ,GAAgBC,EAAqC,CAC5D,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EACzB,CACJ,oBAAAb,EACA,mBAAAc,EACA,UAAAC,EACA,mBAAAC,EACA,wBAAAC,CACF,EAAIN,EAEJH,GAAU,IAAM,CACVR,IACFkB,GAAmC,CACjC,UAAAH,EACA,oBAAAf,EACA,QAAAY,CACF,CAAC,EACDO,GAAQnB,EAAqBY,EAASI,CAAkB,EAE5D,EAAG,CAACjB,GAA2BC,CAAmB,CAAC,CAAC,EAEpDQ,GAAU,IAAM,CACVM,IACFM,GAA6BR,CAAO,EAMpCK,EAAwB,EAE5B,EAAG,CAACH,CAAkB,CAAC,CACzB,CAhCSb,EAAAS,GAAA,mBEKF,SAASW,GAAoBC,EAAgC,CAClE,OAAAC,GAAWD,CAAO,EACXE,EACT,CAHgBC,EAAAJ,GAAA",
|
|
6
|
+
"names": ["RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "configs", "__name", "WidgetEvents", "RouteEventType", "StepExecutionEventStatus", "StepExecutionBlockedEventStatus", "StepEventType", "EventSeverity", "warn", "SignerError", "warn", "Status", "readAccountAddress", "getBlockChainNameFromId", "getEvmProvider", "BigNumber", "PendingSwapNetworkStatus", "SignerError", "TransactionType", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "ERROR_MESSAGE_WAIT_FOR_WALLET", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "__name", "type", "address", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "network", "DEFAULT_ERROR_CODE", "RangoClient", "rango", "httpService", "__name", "RangoClient", "getConfig", "BigNumber", "BigNumber", "numberToString", "__name", "number", "minDecimals", "maxDecimals", "n", "BigNumber", "roundingMode", "maxI", "i", "SignerErrorCode", "SignerError", "isSignerErrorCode", "isAPIErrorCode", "ERROR_ASSERTION_FAILED", "ERROR_CREATE_TRANSACTION", "ERROR_INPUT_WALLET_NOT_FOUND", "PrettyError", "_PrettyError", "code", "m", "root", "detail", "__name", "obj", "rawMessage", "rootStr", "message", "statusCode", "mapAppErrorCodesToAPIErrorCode", "errorCode", "isAPIErrorCode", "isSignerErrorCode", "SignerErrorCode", "DEFAULT_ERROR_CODE", "prettifyErrorMessage", "SignerError", "MessageSeverity", "getCurrentNamespaceOfOrNull", "__name", "swap", "step", "getCurrentNamespaceOf", "evmNetwork", "starknetNetwork", "tronNetwork", "cosmosNetwork", "solanaNetwork", "tonNetwork", "suiNetwork", "transferAddress", "PrettyError", "utxoNetwork", "network", "getScannerUrl", "txHash", "blockchainMetaMap", "baseUrl", "getNextStep", "currentStep", "getCurrentWalletTypeAndAddress", "result", "wallet", "getCurrentAddressOf", "getRelatedWallet", "address", "type", "walletKV", "k", "v", "blockchain", "walletType", "getRelatedWalletOrNull", "getUsdPrice", "symbol", "allTokens", "t", "getUsdFeeOfStep", "totalFeeInUsd", "BigNumber", "i", "fee", "unitPrice", "mapSwapStepToPendingSwapStep", "meta", "numberToString", "calculatePendingSwap", "inputAmount", "bestRoute", "wallets", "settings", "validateBalanceOrFee", "simulationResult", "index", "stepRoute", "internalSwap", "createSteps", "swapSteps", "swapStep", "diagnosisUrl", "estimatedTimeInSeconds", "explorerUrl", "feeInUsd", "executedTransactionId", "executedTransactionTime", "expectedOutputAmountHumanReadable", "fromBlockchain", "toBlockchain", "fromSymbol", "toSymbol", "fromSymbolAddress", "toSymbolAddress", "swapperType", "swapperId", "outputAmount", "fromAmountMaxValue", "fromAmountMinValue", "fromAmountPrecision", "fromAmountRestrictionType", "fromDecimals", "stepStatus", "getCurrentStepTx", "__name", "getEventPayload", "swap", "type", "creationTime", "finishTime", "requestId", "inputAmount", "status", "wallets", "steps", "settings", "routeSteps", "result", "failedStep", "getFailedStep", "lastSuccessfulStep", "getLastSuccessfulStep", "emitRouteEvent", "stepEvent", "route", "routeEvent", "getSwapInputUsd", "getSwapOutputUsd", "getConfig", "emitStepEvent", "step", "notifier", "params", "event", "fromAsset", "toAsset", "currentFromNamespace", "getCurrentNamespaceOfOrNull", "message", "messageSeverity", "isApprovalCurrentStepTx", "swapClaimedBy", "claimQueue", "queue_id", "__name", "swapTransactionToDataMap", "inMemoryTransactionsData", "hash", "data", "getCurrentStep", "swap", "step", "getCurrentStepTx", "currentStep", "evmTransaction", "evmApprovalTransaction", "cosmosTransaction", "solanaTransaction", "transferTransaction", "starknetApprovalTransaction", "starknetTransaction", "tronApprovalTransaction", "tronTransaction", "tonTransaction", "suiTransaction", "setCurrentStepTx", "transaction", "txType", "TransactionType", "x", "getCurrentStepTxType", "isApprovalCurrentStepTx", "updateSwapStatus", "getStorage", "setStorage", "nextStatus", "nextStepStatus", "message", "details", "errorCode", "hasAlreadyProceededToSign", "trace", "updatedResult", "errorReason", "walletType", "getRelatedWalletOrNull", "failureType", "mapAppErrorCodesToAPIErrorCode", "errorReasonForAPI", "httpService", "setStepTransactionIds", "txId", "explorerUrl", "notifier", "markRunningSwapAsWaitingForConnectingWallet", "reason", "reasonDetail", "currentTime", "PendingSwapNetworkStatus", "markRunningSwapAsSwitchingNetwork", "type", "getRequiredWallet", "fromNamespace", "getCurrentNamespaceOf", "markRunningSwapAsDependsOnOtherQueues", "delay", "ms", "res", "getSwapWalletType", "network", "isWalletNull", "wallet", "currentNamespace", "getCurrentNamespaceOfOrNull", "sourceWallet", "getChainId", "provider", "isNetworkMatchedForTransaction", "meta", "providers", "evmBlochain", "getEvmProvider", "chainId", "blockChain", "getBlockChainNameFromId", "blockchainMeta", "e", "isTxAlreadyCreated", "resetNetworkStatus", "actions", "updateNetworkStatus", "status", "onBlockForConnectWallet", "event", "context", "queue", "ok", "isRequiredWalletConnected", "address", "ERROR_MESSAGE_WAIT_FOR_WALLET", "onBlockForChangeNetwork", "_event", "result", "requiredNetwork", "requiredWallet", "currentNetwork", "namespace", "error", "onDependsOnOtherQueues", "getBlockedTasks", "forceExecute", "manager", "setClaimer", "claimedBy", "reset", "blockedTasks", "task", "claimerId", "isClaimedByAnyQueue", "claimedStorage", "retryOn", "getState", "walletState", "accounts", "connected", "connectedAccounts", "account", "accountAddress", "readAccountAddress", "signTransaction", "setTransactionDataByHash", "failed", "next", "schedule", "getSigners", "isMobileWallet", "getRelatedWallet", "mobileWallet", "walletAddress", "getCurrentAddressOf", "currentStepNamespace", "onFinish", "tx", "isApproval", "extraMessage", "updateResult", "getLastFinishedStepInput", "getLastFinishedStepInputUsd", "eventType", "DEFAULT_ERROR_CODE", "handleSignError", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "warn", "SignerError", "walletSigners", "response", "getScannerUrl", "checkWaitingForConnectWalletChange", "params", "lastConnectedWallet", "evmChains", "chain", "q", "queueStorage", "currentStepRequiredWallet", "hasWaitingForConnect", "taskId", "Status", "queueInstance", "description", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "checkWaitingForNetworkChange", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "getRunningSwaps", "queues", "resetRunningSwapNotifsOnPageLoad", "runningSwaps", "eventSubtype", "canSwitchNetworkTo", "options", "walletAndNetworkMatched", "onlyWalletMatched", "finalQueueToBeRun", "i", "currentQueue", "finalQueueStorage", "currentSwap", "isNeedBlockQueueForParallel", "throwOnOK", "rawResponse", "responseBody", "PrettyError", "cancelSwap", "getLastSuccessfulStep", "steps", "getFailedStep", "isApprovalTX", "getTokenAmountInUsd", "amount", "usdPrice", "usdValue", "BigNumber", "getSwapInputUsd", "getSwapOutputUsd", "lastStep", "getLastFinishedStep", "FINISHED_STATUS", "lastFinishedStepIndex", "lastFinishedStep", "lastSuccessfulStep", "getLastSuccessfulStepOutputUsd", "createStepFailedEvent", "reasonCode", "INTERVAL_FOR_CHECK_STATUS", "INTERVAL_FOR_CHECK_APPROVAL", "checkTransactionStatus", "getStorage", "setStorage", "next", "schedule", "retry", "failed", "context", "swap", "meta", "checkStatusError", "currentStep", "getCurrentStep", "tx", "getCurrentStepTx", "txId", "getTxReceiptFailed", "status", "signer", "getTransactionDataByHash", "setTransactionDataByHash", "inMemoryTransactionsData", "txType", "getCurrentStepTxType", "sourceWallet", "getRelatedWallet", "txResponse", "receiptReceived", "chainId", "updatedTxHash", "updatedTxResponse", "currentStepNamespace", "getCurrentNamespaceOf", "explorerUrl", "getScannerUrl", "error", "extraMessage", "extraMessageDetail", "extraMessageErrorCode", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "event", "createStepFailedEvent", "warn", "SignerError", "requestBody", "httpService", "delay", "outputAmount", "prevOutputAmount", "newTransaction", "setCurrentStepTx", "notifier", "nextStep", "getNextStep", "getLastFinishedStepInput", "getLastFinishedStepInputUsd", "getLastSuccessfulStepOutputUsd", "__name", "checkApprovalStatus", "checkApprovalStatusError", "isApproved", "request", "response", "message", "details", "checkStatus", "actions", "resetNetworkStatus", "warn", "createTransaction", "actions", "setStorage", "getStorage", "next", "schedule", "swap", "currentStep", "getCurrentStep", "getCurrentStepTx", "notifier", "request", "transaction", "throwOnOK", "httpService", "setCurrentStepTx", "error", "extraMessage", "extraMessageDetail", "prettifyErrorMessage", "updateResult", "updateSwapStatus", "event", "createStepFailedEvent", "warn", "__name", "PendingSwapNetworkStatus", "executeTransaction", "actions", "getStorage", "context", "meta", "wallets", "providers", "claimedBy", "claimQueue", "isClaimed", "requestBlock", "__name", "blockedFor", "swap", "currentStep", "getCurrentStep", "isRequiredWalletConnected", "type", "address", "getRequiredWallet", "isWalletInCompatible", "w", "account", "description", "isWalletNull", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION", "ERROR_MESSAGE_WAIT_FOR_WALLET_DESCRIPTION_WRONG_WALLET", "networkMatched", "isNetworkMatchedForTransaction", "details", "ERROR_MESSAGE_DEPENDS_ON_OTHER_QUEUES", "fromNamespace", "getCurrentNamespaceOf", "ERROR_MESSAGE_WAIT_FOR_CHANGE_NETWORK", "updateNetworkStatus", "PendingSwapNetworkStatus", "isNeedBlockQueueForParallel", "signTransaction", "scheduleNextStep", "schedule", "next", "failed", "setStorage", "getStorage", "swap", "currentStep", "getCurrentStep", "isFailed", "step", "isTxAlreadyCreated", "notifier", "inputAmount", "getLastFinishedStepInput", "inputAmountUsd", "getLastFinishedStepInputUsd", "getLastSuccessfulStep", "getLastSuccessfulStepOutputUsd", "__name", "start", "schedule", "next", "getStorage", "swap", "notifier", "__name", "swapQueueDef", "start", "scheduleNextStep", "createTransaction", "executeTransaction", "checkStatus", "event", "meta", "onBlockForConnectWallet", "onBlockForChangeNetwork", "onDependsOnOtherQueues", "useManager", "useEffect", "useState", "DB_NAME", "Persistor", "Status", "uuid", "MIGRATED_KEY", "migrated", "__name", "hasQueueManagerOnIDB", "db", "DB_NAME", "migration", "swapsFromStorage", "hasIndexDB", "swaps", "convertedSwaps", "swap", "taskId", "uuid", "convertedSwap", "Status", "status", "persistor", "Persistor", "promises", "queue", "isCalled", "getLastConnectedWalletHash", "lastConnectedWallet", "__name", "useMigration", "isMigrated", "migrated", "status", "setStatus", "useState", "useEffect", "migration", "useQueueManager", "params", "manager", "useManager", "disconnectedWallet", "evmChains", "canSwitchNetworkTo", "clearDisconnectedWallet", "checkWaitingForConnectWalletChange", "retryOn", "checkWaitingForNetworkChange", "makeQueueDefinition", "configs", "initConfig", "swapQueueDef", "__name"]
|
|
7
7
|
}
|