{"version":3,"sources":["../src/index.ts","../src/abi/pandaByteCore.json","../src/config.ts","../src/hooks/useDynamicAuth.tsx","../src/services/apiService.ts","../src/services/localStorageService.ts","../src/lib/utils/auth/auth.utils.ts","../src/store/store.ts","../src/store/slices/ui/walletProvider/modal.slice.ts","../src/store/slices/ui/index.ts","../src/store/slices/blockchain/network.slice.ts","../src/store/slices/blockchain/token.slice.ts","../src/types/blockchain/transactions.types.ts","../src/store/slices/blockchain/transactions.slice.ts","../src/store/slices/blockchain/websocket.slice.ts","../src/store/slices/blockchain/index.ts","../src/components/common/synchronizers/network-state-synchronizer.tsx","../src/components/common/synchronizers/token-state-synchronizer.tsx","../src/components/common/synchronizers/transactions-state-synchronizer.tsx","../node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/engine.io-parser/build/esm/index.js","../node_modules/@socket.io/component-emitter/lib/esm/index.js","../node_modules/engine.io-client/build/esm/globals.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/polling-xhr.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/engine.io-client/build/esm/index.js","../node_modules/socket.io-client/build/esm/url.js","../node_modules/socket.io-parser/build/esm/index.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-client/build/esm/on.js","../node_modules/socket.io-client/build/esm/socket.js","../node_modules/socket.io-client/build/esm/contrib/backo2.js","../node_modules/socket.io-client/build/esm/manager.js","../node_modules/socket.io-client/build/esm/index.js","../src/services/webSocketService.ts","../src/components/common/synchronizers/websocket-state-synchronizer.tsx","../src/hooks/walletProvider/use-transaction-modal.ts","../src/hooks/walletProvider/useBlockExplorerUrl.ts","../src/hooks/walletProvider/useDebounce.ts","../src/hooks/walletProvider/useTokenActions.ts","../src/store/selectors/blockchain/blockchain.selectors.ts","../src/hooks/walletProvider/useTokens.ts","../src/hooks/walletProvider/useTokenSearch.ts","../src/services/walletProvider/TransactionService.ts","../src/abi/erc20.json","../src/hooks/walletProvider/useWalletAddress.ts","../src/hooks/walletProvider/useWalletProvider.tsx","../src/hooks/walletProvider/deposit/useDeposit.ts","../src/hooks/walletProvider/deposit/useSwapInfo.ts","../src/hooks/walletProvider/deposit/useDepositFormState.ts","../src/lib/utils.ts","../src/hooks/walletProvider/deposit/useGasManger.ts","../src/hooks/walletProvider/deposit/useDepositCalclulations.ts","../src/hooks/walletProvider/deposit/useDepositTransaction.ts","../src/hooks/walletProvider/swap/useSwapAllowance.ts","../src/hooks/walletProvider/swap/useSwapFormState.ts","../src/hooks/walletProvider/swap/useSwapGasManager.ts","../src/hooks/walletProvider/swap/useSwapNew.ts","../src/hooks/walletProvider/swap/useSwapQuote.ts","../src/hooks/walletProvider/swap/useSwapTransaction.ts","../src/hooks/walletProvider/swap/useSwapTokenPrices.ts","../src/hooks/walletProvider/withdrawal/useWithdraw.ts","../src/hooks/walletProvider/withdrawal/useWithdrawalNetworkCheck.ts","../src/hooks/walletProvider/withdrawal/useWithdrawFormState.ts","../src/hooks/walletProvider/withdrawal/useWithdrawCalculations.ts","../src/hooks/walletProvider/withdrawal/useWithdrawTransaction.ts","../src/hooks/walletProvider/tip/useTip.ts","../src/hooks/walletProvider/tip/useTipFormState.ts","../src/hooks/walletProvider/tip/useTipTransaction.ts","../src/context/auth/auth-context.ts","../src/lib/utils/wallet-provider/wallet-provider.utils.ts","../src/components/ui/sonner.tsx","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/features/walletProvider/deposit/deposit-panel.tsx","../src/components/common/walletProvider/token-list-modal.tsx","../src/components/ui/dialog.tsx","../src/components/ui/command.tsx","../src/components/common/walletProvider/network-selector.tsx","../src/components/ui/select.tsx","../src/components/common/walletProvider/token-list-rows.tsx","../src/components/ui/label.tsx","../src/components/common/walletProvider/copy-wallet-address-button.tsx","../src/components/ui/tooltip.tsx","../src/components/features/walletProvider/deposit/deposit-panel-web2.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/features/walletProvider/deposit/deposit-transactions-pending.tsx","../src/components/features/walletProvider/swap/swap-panel.tsx","../src/components/ui/separator.tsx","../src/components/ui/popover.tsx","../src/components/ui/collapsible.tsx","../src/components/features/walletProvider/swap/swap-confirm-modal.tsx","../src/components/ui/skeleton.tsx","../src/components/features/walletProvider/swap/swap-panel-skeleton.tsx","../src/components/features/walletProvider/tabs-sidebar.tsx","../src/components/features/walletProvider/transaction-modal.tsx","../src/components/ui/tabs.tsx","../src/components/features/walletProvider/transaction-panel-with-tabs.tsx","../src/components/features/walletProvider/withdraw/withdraw-panel.tsx","../src/components/ui/alert.tsx","../src/components/features/walletProvider/panel-tab-switcher.tsx","../src/components/features/walletProvider/tip/tip-panel.tsx","../src/components/features/walletProvider/tip/tip-transaction-pending.tsx","../src/components/ui/card.tsx","../src/components/features/walletProvider/wallet/wallet-info-panel.tsx","../src/components/features/profile/profile-info-card.tsx","../src/components/ui/badge.tsx","../src/components/features/profile/profile-info-card-skeleton.tsx","../src/components/ui/avatar.tsx","../src/components/features/walletProvider/transction-modal-skeleton.tsx","../src/components/features/walletProvider/wallet/wallet-info-skeleton.tsx","../src/components/features/walletProvider/withdraw/withdraw-summary.tsx","../src/components/features/walletProvider/withdraw/withdraw-transaction-pending.tsx","../src/components/features/walletProvider/withdraw/withdrawal-success-modal.tsx"],"sourcesContent":["import \"./index.css\";\n\n// Core hooks - The main SDK functionality\nexport * from \"./hooks/useDynamicAuth\";\nexport * from \"./hooks/walletProvider/use-transaction-modal\";\nexport * from \"./hooks/walletProvider/useBlockExplorerUrl\";\nexport * from \"./hooks/walletProvider/useDebounce\";\nexport * from \"./hooks/walletProvider/useTokenActions\";\nexport * from \"./hooks/walletProvider/useTokens\";\nexport * from \"./hooks/walletProvider/useTokenSearch\";\nexport * from \"./hooks/walletProvider/useWalletAddress\";\nexport * from \"./hooks/walletProvider/useWalletProvider\";\n\n// Deposit hooks\nexport * from \"./hooks/walletProvider/deposit/useDeposit\";\nexport * from \"./hooks/walletProvider/deposit/useDepositCalclulations\";\nexport * from \"./hooks/walletProvider/deposit/useDepositFormState\";\nexport * from \"./hooks/walletProvider/deposit/useDepositTransaction\";\nexport * from \"./hooks/walletProvider/deposit/useGasManger\";\nexport * from \"./hooks/walletProvider/deposit/useSwapInfo\";\n\n// Swap hooks\nexport * from \"./hooks/walletProvider/swap/useSwapAllowance\";\nexport * from \"./hooks/walletProvider/swap/useSwapFormState\";\nexport * from \"./hooks/walletProvider/swap/useSwapGasManager\";\nexport * from \"./hooks/walletProvider/swap/useSwapNew\";\nexport * from \"./hooks/walletProvider/swap/useSwapQuote\";\nexport * from \"./hooks/walletProvider/swap/useSwapTokenPrices\";\nexport * from \"./hooks/walletProvider/swap/useSwapTransaction\";\n\n// Withdrawal hooks\nexport * from \"./hooks/walletProvider/withdrawal/useWithdraw\";\nexport * from \"./hooks/walletProvider/withdrawal/useWithdrawalNetworkCheck\";\nexport * from \"./hooks/walletProvider/withdrawal/useWithdrawCalculations\";\nexport * from \"./hooks/walletProvider/withdrawal/useWithdrawFormState\";\nexport * from \"./hooks/walletProvider/withdrawal/useWithdrawTransaction\";\n\n// Tip hooks\nexport * from \"./hooks/walletProvider/tip/useTip\";\nexport * from \"./hooks/walletProvider/tip/useTipFormState\";\nexport * from \"./hooks/walletProvider/tip/useTipTransaction\";\n\n// Context and providers\nexport * from \"./context/auth/auth-context\";\n\n// Utilities\nexport * from \"./lib/utils\";\nexport * from \"./lib/utils/auth/auth.utils\";\nexport * from \"./lib/utils/wallet-provider/wallet-provider.utils\";\n\n// Services\nexport * from \"./services/apiService\";\nexport * from \"./services/localStorageService\";\nexport * from \"./services/webSocketService\";\nexport * from \"./services/walletProvider/TransactionService\";\n\n// State management\nexport * from \"./store/store\";\nexport * from \"./store/selectors/blockchain/blockchain.selectors\";\n// export * from \"./store/slices/blockchain/index\";\n// export * from \"./store/slices/blockchain/network.slice\";\n// export * from \"./store/slices/blockchain/token.slice\";\n// export * from \"./store/slices/blockchain/transactions.slice\";\n// export * from \"./store/slices/blockchain/websocket.slice\";\n// export * from \"./store/slices/ui/index\";\n// export * from \"./store/slices/ui/walletProvider/modal.slice\";\n\n// Types\nexport * from \"./types/auth/auth.types\";\nexport * from \"./types/blockchain/swap.types\";\nexport * from \"./types/blockchain/transactions.types\";\nexport * from \"./types/walletProvider/swap-hooks.types\";\nexport * from \"./types/walletProvider/transaction-service.types\";\nexport * from \"./types/walletProvider/wallet-provider.types\";\nexport * from \"./types/websockets/websockets.types\";\n\n// Configuration\nexport * from \"./config\";\n\n// ABI exports - Smart contract interfaces\nexport { default as erc20Abi } from \"./abi/erc20.json\";\nexport { default as pandaByteCoreAbi } from \"./abi/pandaByteCore.json\";\n\n// Core feature components\n\n// toaster\nexport * from \"./components/ui/sonner\";\n\n// deposit panel\nexport * from \"./components/features/walletProvider/deposit/deposit-panel\";\nexport * from \"./components/features/walletProvider/deposit/deposit-panel-web2\";\nexport * from \"./components/features/walletProvider/deposit/deposit-transactions-pending\";\n\n// swap panel\nexport * from \"./components/features/walletProvider/swap/swap-panel\";\nexport * from \"./components/features/walletProvider/swap/swap-panel-skeleton\";\n\n// transaction modal components\nexport * from \"./components/features/walletProvider/tabs-sidebar\";\nexport * from \"./components/features/walletProvider/transaction-modal\";\nexport * from \"./components/features/walletProvider/transction-modal-skeleton\";\n\n// wallet info panel\nexport * from \"./components/features/walletProvider/wallet/wallet-info-panel\";\nexport * from \"./components/features/walletProvider/wallet/wallet-info-skeleton\";\n\n// withdrawal panel\nexport * from \"./components/features/walletProvider/withdraw/withdraw-panel\";\nexport * from \"./components/features/walletProvider/withdraw/withdraw-summary\";\nexport * from \"./components/features/walletProvider/withdraw/withdraw-transaction-pending\";\nexport * from \"./components/features/walletProvider/withdraw/withdrawal-success-modal\";\n\n// tip panel\nexport * from \"./components/features/walletProvider/tip/tip-panel\";\nexport * from \"./components/features/walletProvider/tip/tip-transaction-pending\";\n\n// Profile components\nexport * from \"./components/features/profile/profile-info-card\";\nexport * from \"./components/features/profile/profile-info-card-skeleton\";\n\n// Common wallet provider components\nexport * from \"./components/common/walletProvider/copy-wallet-address-button\";\nexport * from \"./components/common/walletProvider/network-selector\";\nexport * from \"./components/common/walletProvider/token-list-modal\";\nexport * from \"./components/common/walletProvider/token-list-rows\";\n\n// State synchronizers\nexport * from \"./components/common/synchronizers/network-state-synchronizer\";\nexport * from \"./components/common/synchronizers/token-state-synchronizer\";\nexport * from \"./components/common/synchronizers/transactions-state-synchronizer\";\nexport * from \"./components/common/synchronizers/websocket-state-synchronizer\";\n\n// // UI components\n// export * from \"./components/ui/alert\";\n// export * from \"./components/ui/avatar\";\n// export * from \"./components/ui/badge\";\n// export * from \"./components/ui/button\";\n// export * from \"./components/ui/card\";\n// export * from \"./components/ui/collapsible\";\n// export * from \"./components/ui/command\";\n// export * from \"./components/ui/dialog\";\n// export * from \"./components/ui/dropdown-menu\";\n// export * from \"./components/ui/input\";\n// export * from \"./components/ui/label\";\n// export * from \"./components/ui/popover\";\n// export * from \"./components/ui/select\";\n// export * from \"./components/ui/separator\";\n// export * from \"./components/ui/skeleton\";\n// export * from \"./components/ui/sonner\";\n// export * from \"./components/ui/tabs\";\n// export * from \"./components/ui/tooltip\";\n","[\r\n    {\r\n     \"inputs\": [],\r\n     \"stateMutability\": \"nonpayable\",\r\n     \"type\": \"constructor\"\r\n    },\r\n    {\r\n     \"inputs\": [],\r\n     \"name\": \"ECDSAInvalidSignature\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"length\",\r\n       \"type\": \"uint256\"\r\n      }\r\n     ],\r\n     \"name\": \"ECDSAInvalidSignatureLength\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"bytes32\",\r\n       \"name\": \"s\",\r\n       \"type\": \"bytes32\"\r\n      }\r\n     ],\r\n     \"name\": \"ECDSAInvalidSignatureS\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"inputs\": [],\r\n     \"name\": \"InvalidInitialization\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"inputs\": [],\r\n     \"name\": \"NotInitializing\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"value\",\r\n       \"type\": \"uint256\"\r\n      },\r\n      {\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"length\",\r\n       \"type\": \"uint256\"\r\n      }\r\n     ],\r\n     \"name\": \"StringsInsufficientHexLength\",\r\n     \"type\": \"error\"\r\n    },\r\n    {\r\n     \"anonymous\": false,\r\n     \"inputs\": [\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"uint64\",\r\n       \"name\": \"version\",\r\n       \"type\": \"uint64\"\r\n      }\r\n     ],\r\n     \"name\": \"Initialized\",\r\n     \"type\": \"event\"\r\n    },\r\n    {\r\n     \"anonymous\": false,\r\n     \"inputs\": [\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"address\",\r\n       \"name\": \"user\",\r\n       \"type\": \"address\"\r\n      },\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"address\",\r\n       \"name\": \"token\",\r\n       \"type\": \"address\"\r\n      },\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"amount\",\r\n       \"type\": \"uint256\"\r\n      },\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"string\",\r\n       \"name\": \"transactionId\",\r\n       \"type\": \"string\"\r\n      },\r\n      {\r\n       \"indexed\": false,\r\n       \"internalType\": \"string\",\r\n       \"name\": \"encodedData\",\r\n       \"type\": \"string\"\r\n      }\r\n     ],\r\n     \"name\": \"Withdrawal\",\r\n     \"type\": \"event\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"address\",\r\n       \"name\": \"tokenAddress\",\r\n       \"type\": \"address\"\r\n      },\r\n      {\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"amount\",\r\n       \"type\": \"uint256\"\r\n      },\r\n      {\r\n       \"internalType\": \"string\",\r\n       \"name\": \"transactionId\",\r\n       \"type\": \"string\"\r\n      },\r\n      {\r\n       \"internalType\": \"string\",\r\n       \"name\": \"encodedData\",\r\n       \"type\": \"string\"\r\n      },\r\n      {\r\n       \"internalType\": \"uint256\",\r\n       \"name\": \"expiryTimestamp\",\r\n       \"type\": \"uint256\"\r\n      },\r\n      {\r\n       \"internalType\": \"bytes\",\r\n       \"name\": \"signature\",\r\n       \"type\": \"bytes\"\r\n      }\r\n     ],\r\n     \"name\": \"Withdraw_Web\",\r\n     \"outputs\": [],\r\n     \"stateMutability\": \"nonpayable\",\r\n     \"type\": \"function\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"address\",\r\n       \"name\": \"_newSigner\",\r\n       \"type\": \"address\"\r\n      }\r\n     ],\r\n     \"name\": \"changeSigner\",\r\n     \"outputs\": [],\r\n     \"stateMutability\": \"nonpayable\",\r\n     \"type\": \"function\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"bytes32\",\r\n       \"name\": \"_messageHash\",\r\n       \"type\": \"bytes32\"\r\n      }\r\n     ],\r\n     \"name\": \"getEthSignedMessageHash\",\r\n     \"outputs\": [\r\n      {\r\n       \"internalType\": \"bytes32\",\r\n       \"name\": \"\",\r\n       \"type\": \"bytes32\"\r\n      }\r\n     ],\r\n     \"stateMutability\": \"pure\",\r\n     \"type\": \"function\"\r\n    },\r\n    {\r\n     \"inputs\": [\r\n      {\r\n       \"internalType\": \"string\",\r\n       \"name\": \"message\",\r\n       \"type\": \"string\"\r\n      },\r\n      {\r\n       \"internalType\": \"bytes\",\r\n       \"name\": \"signature\",\r\n       \"type\": \"bytes\"\r\n      }\r\n     ],\r\n     \"name\": \"verifyMessage\",\r\n     \"outputs\": [\r\n      {\r\n       \"internalType\": \"bool\",\r\n       \"name\": \"\",\r\n       \"type\": \"bool\"\r\n      }\r\n     ],\r\n     \"stateMutability\": \"view\",\r\n     \"type\": \"function\"\r\n    }\r\n   ]","import pandaABI from \"@/abi/pandaByteCore.json\";\n\nexport interface SdkConfig {\n\tapiBaseUrl: string;\n\tapiKey: string;\n\tnetworkId: number;\n\tjwtType: \"dyn\" | \"cust\";\n\tallowanceAddress: `0x${string}`;\n\t// WebSocket configuration\n\twsUrl: string;\n\twsKey: string;\n\tchatWsUrl?: string;\n\t// Additional API configuration\n\tgameUrlApiPassword?: string;\n\tlogout?: {\n\t\tkeysToClear?: string[];\n\t\tkeyPrefixesToClear?: string[];\n\t};\n\tfeatures?: {\n\t\tenableNetworkStateSync?: boolean;\n\t\tenableTokenStateSync?: boolean;\n\t\tenableWebSocketStateSync?: boolean;\n\t\tenableTransactionStateSync?: boolean;\n\t};\n\t// Smart contract ABIs\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tabi: any;\n\twithdrawFunctionName: string;\n}\n\nlet config: SdkConfig = {\n\tapiBaseUrl: \"\",\n\tapiKey: \"\",\n\tnetworkId: 1,\n\tjwtType: \"dyn\",\n\tallowanceAddress: \"0x111111125421ca6dc452d289314280a0f8842a65\",\n\t// WebSocket configuration\n\twsUrl: \"\",\n\twsKey: \"\",\n\tchatWsUrl: \"\",\n\t// Additional API configuration\n\tgameUrlApiPassword: \"\",\n\tlogout: {\n\t\tkeysToClear: [],\n\t\tkeyPrefixesToClear: [],\n\t},\n\tfeatures: {\n\t\tenableNetworkStateSync: true,\n\t\tenableTokenStateSync: true,\n\t\tenableWebSocketStateSync: true,\n\t\tenableTransactionStateSync: true,\n\t},\n\tabi: pandaABI,\n\twithdrawFunctionName: \"Withdraw_Web\",\n};\n\nexport const setSdkConfig = (newConfig: Partial<SdkConfig>) => {\n\tconfig = { ...config, ...newConfig };\n};\n\nexport const getSdkConfig = (): SdkConfig => {\n\tif (!config.apiBaseUrl || !config.apiKey) {\n\t\tconsole.warn(\n\t\t\t\"SDK not initialized. Please call setSdkConfig with your configuration.\"\n\t\t);\n\t}\n\tif (!config.wsUrl || !config.wsKey) {\n\t\tconsole.warn(\n\t\t\t\"WebSocket configuration incomplete. WebSocket features may not work properly.\"\n\t\t);\n\t}\n\treturn config;\n};\n","import { getSdkConfig } from \"@/config\";\nimport {\n\tcreateContext,\n\tuseContext,\n\tuseState,\n\tuseEffect,\n\tuseCallback,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n\tgetAuthToken,\n\tuseDynamicContext,\n\tuseIsLoggedIn,\n} from \"@dynamic-labs/sdk-react-core\";\nimport ApiService from \"@/services/apiService\";\nimport LocalStorageService from \"@/services/localStorageService\";\nimport type { UserData } from \"@/services/localStorageService\";\nimport type {\n\tAuthContextType,\n\tUser,\n\tAccountStatus,\n\tRegisterWalletRequestBody,\n} from \"@/types/auth/auth.types\";\nimport {\n\tconvertApiUserToUser,\n\tconvertUserToUserData,\n\tcreateTemporaryUser,\n} from \"@/lib/utils/auth/auth.utils\";\nimport { useAppStore } from \"@/store/store\";\nimport { NetworkStateSynchronizer } from \"@/components/common/synchronizers/network-state-synchronizer\";\nimport { TokenStateSynchronizer } from \"@/components/common/synchronizers/token-state-synchronizer\";\nimport { TransactionStateSynchronizer } from \"@/components/common/synchronizers/transactions-state-synchronizer\";\nimport { WebSocketStateSynchronizer } from \"@/components/common/synchronizers/websocket-state-synchronizer\";\n\n// 1. CREATE THE CONTEXT\n// The context is created with an undefined initial value.\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\n// 2. CREATE THE PROVIDER COMPONENT\n// This component will hold all the state and logic.\nexport const AuthProvider = ({ children }: { children: ReactNode }) => {\n\tconst {\n\t\tuser: dynamicUser,\n\t\tprimaryWallet,\n\t\tsetShowAuthFlow,\n\t\thandleLogOut,\n\t} = useDynamicContext();\n\tconst isLoggedIn = useIsLoggedIn();\n\tconst authToken = getAuthToken();\n\tconst [user, setUser] = useState<User | null>(null);\n\tconst [userData, setUserData] = useState<UserData | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [isAuthCheckComplete, setIsAuthCheckComplete] = useState(false);\n\tconst [showLoginModal, setShowLoginModal] = useState(false);\n\tconst [accountStatus, setAccountStatus] = useState<AccountStatus>(\"guest\");\n\tconst storageService = LocalStorageService.getInstance();\n\tconst apiService = ApiService.getInstance();\n\n\tconst handleFetchOrSetTemporaryUser = useCallback(\n\t\tasync (chainId?: number) => {\n\t\t\tif (!dynamicUser || !primaryWallet) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsLoading(true);\n\t\t\ttry {\n\t\t\t\tconst response = await apiService.fetchUserInfo(\n\t\t\t\t\tauthToken as string,\n\t\t\t\t\tchainId\n\t\t\t\t);\n\n\t\t\t\t// console.log(\"response.data\", response.data);\n\t\t\t\tif (response.error) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tresponse.message\n\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t.includes(\"user not found\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// --- UPDATED LOGIC ---\n\t\t\t\t\t\t// Set the status to 'pending_registration' to trigger the modal.\n\t\t\t\t\t\tsetAccountStatus(\"pending_registration\");\n\t\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t\t\tsetIsAuthCheckComplete(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(response.message);\n\t\t\t\t}\n\n\t\t\t\tsetAccountStatus(\"authenticated\");\n\t\t\t\tconst convertedUser = convertApiUserToUser(response.data);\n\n\t\t\t\t// console.log(\n\t\t\t\t// \t\"Converted User log in useDynamicAuth:\",\n\t\t\t\t// \tconvertedUser\n\t\t\t\t// );\n\t\t\t\tconst convertedUserData = convertUserToUserData(convertedUser);\n\n\t\t\t\tsetUser(convertedUser);\n\t\t\t\tsetUserData(convertedUserData);\n\t\t\t\tstorageService.saveUserData(convertedUserData);\n\t\t\t} catch (error) {\n\t\t\t\tif (\n\t\t\t\t\t!(\n\t\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\t\terror.message.toLowerCase().includes(\"user not found\")\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"API fetch failed, creating temporary user:\",\n\t\t\t\t\t\terror\n\t\t\t\t\t);\n\n\t\t\t\t\tsetAccountStatus(\"authenticated\");\n\t\t\t\t\tconst tempUser = createTemporaryUser(\n\t\t\t\t\t\tdynamicUser,\n\t\t\t\t\t\tprimaryWallet\n\t\t\t\t\t);\n\t\t\t\t\tconst tempUserData = convertUserToUserData(tempUser);\n\n\t\t\t\t\tsetUser(tempUser);\n\t\t\t\t\tsetUserData(tempUserData);\n\t\t\t\t\tstorageService.saveUserData(tempUserData);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tsetIsAuthCheckComplete(true);\n\t\t\t}\n\t\t},\n\t\t[dynamicUser, primaryWallet, apiService, authToken, storageService]\n\t);\n\n\tuseEffect(\n\t\t() => {\n\t\t\tif (primaryWallet) {\n\t\t\t\thandleFetchOrSetTemporaryUser();\n\t\t\t} else {\n\t\t\t\tsetUser(null);\n\t\t\t\tsetUserData(null);\n\t\t\t\tsetAccountStatus(\"guest\");\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tsetIsAuthCheckComplete(true);\n\t\t\t}\n\n\t\t\t// if (isLoggedIn) {\n\t\t\t// \tif (!user) {\n\t\t\t// \t\t// Fetch user data only if it doesn't exist\n\t\t\t// \t\thandleFetchOrSetTemporaryUser();\n\t\t\t// \t}\n\t\t\t// } else {\n\t\t\t// \t// User is not logged in, clear all data\n\t\t\t// \tsetUser(null);\n\t\t\t// \tsetUserData(null);\n\t\t\t// \tsetAccountStatus(\"guest\");\n\t\t\t// \tsetIsLoading(false);\n\t\t\t// \tsetIsAuthCheckComplete(true);\n\t\t\t// }\n\t\t},\n\t\t[primaryWallet]\n\t\t// [isLoggedIn, user]\n\t);\n\n\tconst onRegisterSubmit = async (nickname: string, referrer_id?: string) => {\n\t\tif (!primaryWallet?.address || !authToken) {\n\t\t\tthrow new Error(\"Wallet address or auth token is not available.\");\n\t\t}\n\t\tconst requestBody: RegisterWalletRequestBody = {\n\t\t\twallet_address: primaryWallet.address,\n\t\t\tnickname: nickname,\n\t\t\treferrer_id: referrer_id ? referrer_id : \"\",\n\t\t\tlogin_type: \"wallet\", //this is faulty for now, I have to ask dhiraj from where shoud login_type be taken\n\t\t};\n\t\tawait apiService.registerWallet(requestBody, authToken);\n\t\tawait refreshUserData(); // Re-fetch will update status to 'authenticated' and close modal\n\t};\n\n\tconst login = () => {\n\t\tsetShowAuthFlow(true);\n\t\tsetShowLoginModal(false);\n\t};\n\n\tconst clearTransactions = useAppStore(\n\t\t(state) => state.blockchain.transaction._updateAndPersist\n\t);\n\n\tconst logout = useCallback(async () => {\n\t\tconsole.log(\"Logging out user\");\n\n\t\ttry {\n\t\t\tconst sdkConfig = getSdkConfig();\n\t\t\tconst keysToClear = sdkConfig?.logout?.keysToClear || [];\n\t\t\tconst keyPrefixesToClear =\n\t\t\t\tsdkConfig?.logout?.keyPrefixesToClear || [];\n\t\t\t// Clear specific user data from localStorage\n\t\t\tkeysToClear.forEach((key) => {\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t});\n\n\t\t\t// Clear items by prefix\n\t\t\tif (keyPrefixesToClear.length > 0) {\n\t\t\t\tObject.keys(localStorage).forEach((key) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tkeyPrefixesToClear.some((prefix) =>\n\t\t\t\t\t\t\tkey.startsWith(prefix)\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Clear Dynamic SDK authentication\n\t\t\tawait handleLogOut();\n\n\t\t\t// Clear transaction store\n\t\t\tclearTransactions([]);\n\n\t\t\tconsole.log(\n\t\t\t\t\"User logged out successfully and localStorage cleared\"\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error during logout:\", error);\n\t\t}\n\t}, [handleLogOut, clearTransactions]);\n\tconst refreshUserData = async (chainId?: number) => {\n\t\tif (isLoggedIn) {\n\t\t\tawait handleFetchOrSetTemporaryUser(chainId);\n\t\t}\n\t};\n\n\t// The value object passed to the provider\n\tconst value: AuthContextType = {\n\t\tuser,\n\t\tuserData,\n\t\tisLoggedIn,\n\t\tisWalletConnected: isLoggedIn,\n\t\tisLoading,\n\t\tisAuthCheckComplete,\n\t\tauthToken: authToken as string,\n\t\tlogin,\n\t\tlogout,\n\t\trefreshUserData,\n\t\tshowLoginModal,\n\t\tsetShowLoginModal,\n\t\taccountStatus,\n\t\tonRegisterSubmit,\n\t};\n\n\tconst sdkConfig = getSdkConfig();\n\tconst features = sdkConfig?.features;\n\n\treturn (\n\t\t<AuthContext.Provider value={value}>\n\t\t\t<main className=\"qw-sdk\">{children}</main>\n\t\t\t{features?.enableNetworkStateSync !== false && (\n\t\t\t\t<NetworkStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableTokenStateSync !== false && (\n\t\t\t\t<TokenStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableWebSocketStateSync && (\n\t\t\t\t<WebSocketStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableTransactionStateSync !== false && (\n\t\t\t\t<TransactionStateSynchronizer />\n\t\t\t)}\n\t\t</AuthContext.Provider>\n\t);\n};\n\n// 3. CREATE THE CONSUMER HOOK\n// This is the clean, public-facing hook that components will use.\n// eslint-disable-next-line\nexport function useDynamicAuth(): AuthContextType {\n\tconst context = useContext(AuthContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\"useAuth must be used within an AuthProvider\");\n\t}\n\treturn context;\n}\n","import {\n\tRegisterWalletRequestBody,\n\tUserInfoApiResponse,\n} from \"@/types/auth/auth.types\";\n\nimport type {\n\tGetTokenListRequest,\n\tGetTokenListResponse,\n\tGetConversionRequest,\n\tGetConversionResponse,\n\tGetAllowanceRequest,\n\tGetAllowanceResponse,\n\tSwapRequest,\n\tSwapResponse,\n\tGetGasFeeRequest,\n\tGetGasFeeResponse,\n\tTokenPriceRequest,\n\tTokenPriceResponse,\n\tGetDstSwapRequest,\n\tGetDstSwapResponse,\n\tDepositWalletSwapRequest,\n\tDepositWalletSwapResponse,\n} from \"@/types/blockchain/swap.types\";\n\nimport type {\n\tCheckTransactionStatusRequest,\n\tCheckTransactionStatusResponse,\n} from \"@/types/walletProvider/transaction-service.types\";\n\n// Additional types for transaction status check\n\ninterface ApiResponse<T> {\n\terror: boolean;\n\tmessage: string;\n\tdata: T;\n}\n\nimport { getSdkConfig } from \"@/config\";\n\nclass ApiService {\n\tprivate static instance: ApiService;\n\tprivate get baseUrl() {\n\t\treturn getSdkConfig().apiBaseUrl;\n\t}\n\tprivate get apiKey() {\n\t\treturn getSdkConfig().apiKey;\n\t}\n\tprivate get networkId() {\n\t\treturn getSdkConfig().networkId;\n\t}\n\tprivate get jwtType() {\n\t\treturn getSdkConfig().jwtType;\n\t}\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): ApiService {\n\t\tif (!ApiService.instance) {\n\t\t\tApiService.instance = new ApiService();\n\t\t}\n\t\treturn ApiService.instance;\n\t}\n\n\tprivate async makeRequest<T>(\n\t\tendpoint: string,\n\t\tmethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" = \"GET\",\n\t\tdata?: unknown,\n\t\ttoken?: string,\n\t\tadditionalConfigs?: RequestInit\n\t): Promise<ApiResponse<T>> {\n\t\tconst url = `${this.baseUrl}${endpoint}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\tconst config: RequestInit = {\n\t\t\t...additionalConfigs,\n\t\t\tmethod,\n\t\t\theaders,\n\t\t};\n\n\t\tif (data && (method === \"POST\" || method === \"PUT\")) {\n\t\t\tconfig.body = JSON.stringify(data);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, config);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`HTTP error!\\n status: ${response.status} \\n message: ${response.text} statusText: ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await response.json();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"API request failed:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// --- CREDENTIALS-RELATED API SERVICES ---\n\tasync fetchUserInfo(\n\t\tjwtToken: string,\n\t\tchainId?: number\n\t): Promise<ApiResponse<UserInfoApiResponse>> {\n\t\tconst data = {\n\t\t\tapi_key: this.apiKey,\n\t\t\tnetwork: chainId || this.networkId,\n\t\t\tjwt_type: this.jwtType,\n\t\t};\n\n\t\treturn this.makeRequest<UserInfoApiResponse>(\n\t\t\t\"/api/fetchInfo\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync checkNickName(\n\t\tnickname: string,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<null>> {\n\t\tconst data = { api_key: this.apiKey, nickname: nickname };\n\t\treturn this.makeRequest<null>(\n\t\t\t\"/api/checkNickname\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync registerWallet(\n\t\tbody: RegisterWalletRequestBody,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<null>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: this.jwtType };\n\t\treturn this.makeRequest<null>(\n\t\t\t\"/api/registerWalletV2\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\n\t// --- GAMES-RELATED API SERVICES ---\n\n\t// --- SWAP-RELATED API SERVICES ---\n\tasync getTokenList(\n\t\tbody: GetTokenListRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<GetTokenListResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<GetTokenListResponse>(\n\t\t\t\"/apiSwap/getTokenList\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync getConversion(\n\t\tbody: GetConversionRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<GetConversionResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<GetConversionResponse>(\n\t\t\t\"/apiSwap/getConversion\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync getAllowance(\n\t\tbody: GetAllowanceRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<GetAllowanceResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<GetAllowanceResponse>(\n\t\t\t\"/apiSwap/getAllowance\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync swap(\n\t\tbody: SwapRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<SwapResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<SwapResponse>(\n\t\t\t\"/apiSwap/swap\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync getGasFee(\n\t\tbody: GetGasFeeRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<GetGasFeeResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<GetGasFeeResponse>(\n\t\t\t\"/apiSwap/getGasFee\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync getTokenPrice(\n\t\tbody: TokenPriceRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<TokenPriceResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<TokenPriceResponse>(\n\t\t\t\"/apiSwap/tokenPrice\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync getDstSwap(\n\t\tbody: GetDstSwapRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<GetDstSwapResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<GetDstSwapResponse>(\n\t\t\t\"/apiSwap/getDstSwap\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n\tasync depositWalletSwap(\n\t\tbody: DepositWalletSwapRequest,\n\t\tjwtToken: string\n\t): Promise<ApiResponse<DepositWalletSwapResponse>> {\n\t\tconst data = { ...body, api_key: this.apiKey, jwt_type: \"dyn\" };\n\t\treturn this.makeRequest<DepositWalletSwapResponse>(\n\t\t\t\"/apiSwap/depositWalletSwap\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t}\n}\n\nexport default ApiService;\nexport type {\n\tApiResponse,\n\tCheckTransactionStatusRequest,\n\tCheckTransactionStatusResponse,\n};\n","export interface UserData {\n\tid: string;\n\tusername: string;\n\temail: string;\n\tbalance: number;\n\tvipLevel: string;\n\tisVerified: boolean;\n\tjoinDate: string;\n\ttotalWagered: number;\n\ttotalWon: number;\n\tgamesPlayed: number;\n\twinRate: number;\n\tbiggestWin: number;\n\tfavoriteGame: string;\n\treferralId?: string; // Optional, only if the user has a referral ID\n\tachievements: Achievement[];\n\tbonuses: Bonus[];\n\tgameHistory: GameHistory[];\n\tfavorites: number[];\n}\n\nexport interface Achievement {\n\tid: string;\n\ttitle: string;\n\tdescription: string;\n\tcompleted: boolean;\n\tprogress?: number;\n\tmaxProgress?: number;\n\treward: string;\n\tunlockedAt?: string;\n}\n\nexport interface Bonus {\n\tid: string;\n\ttype: string;\n\ttitle: string;\n\tdescription: string;\n\tamount: number;\n\tclaimed: boolean;\n\texpiresAt: string;\n\tclaimedAt?: string;\n}\n\nexport interface GameHistory {\n\tid: string;\n\tgameId: number;\n\tgameName: string;\n\taction: \"won\" | \"lost\";\n\tamount: number;\n\ttimestamp: string;\n}\n\nexport interface ChatMessage {\n\tid: string;\n\tuser: string;\n\tmessage: string;\n\ttimestamp: string;\n\troom: string;\n\tavatar: string;\n\tvip: boolean;\n\tisBot?: boolean;\n}\n\n// Bet History Cache Types\n\nclass LocalStorageService {\n\tprivate static instance: LocalStorageService;\n\n\t// This is the key for your application's specific user data.\n\tprivate USER_DATA_KEY = \"memewin_userData\";\n\tprivate CHAT_MESSAGES_KEY = \"memewin_chatMessages\";\n\n\t// This is the key for the JWT provided by the Dynamic SDK.\n\tprivate DYNAMIC_AUTH_TOKEN_KEY = \"dynamic_authentication_token\";\n\n\t// This is the key for saving Bet History Transactions\n\tprivate BET_HISTORY_CACHE_KEY = \"bet_history_cache\";\n\n\tstatic getInstance(): LocalStorageService {\n\t\tif (!LocalStorageService.instance) {\n\t\t\tLocalStorageService.instance = new LocalStorageService();\n\t\t\tconsole.warn(\"LocalStorageService initialized\");\n\t\t}\n\t\treturn LocalStorageService.instance;\n\t}\n\n\t// Helper to ensure code runs only in the browser\n\tprivate isBrowser(): boolean {\n\t\treturn (\n\t\t\ttypeof window !== \"undefined\" && typeof localStorage !== \"undefined\"\n\t\t);\n\t}\n\n\t/**\n\t * [NEW] Retrieves the raw JWT authentication token stored by the Dynamic SDK.\n\t * @returns The token string, or null if it's not found.\n\t */\n\tgetAuthToken(): string | null {\n\t\tif (!this.isBrowser()) return null;\n\t\ttry {\n\t\t\tconst token = localStorage.getItem(this.DYNAMIC_AUTH_TOKEN_KEY);\n\t\t\t// The token is often stored as a JSON string (with quotes), so we parse it.\n\t\t\treturn token ? JSON.parse(token) : null;\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t\"Failed to get or parse auth token from localStorage:\",\n\t\t\t\terror\n\t\t\t);\n\t\t\t// Fallback for cases where it might not be a JSON string\n\t\t\treturn this.isBrowser()\n\t\t\t\t? localStorage.getItem(this.DYNAMIC_AUTH_TOKEN_KEY)\n\t\t\t\t: null;\n\t\t}\n\t}\n\n\t// User Data Management\n\tsaveUserData(userData: UserData): void {\n\t\tif (!this.isBrowser()) return;\n\t\tlocalStorage.setItem(this.USER_DATA_KEY, JSON.stringify(userData));\n\t}\n\n\tgetUserData(): UserData | null {\n\t\tif (!this.isBrowser()) return null;\n\t\tconst data = localStorage.getItem(this.USER_DATA_KEY);\n\t\treturn data ? JSON.parse(data) : null;\n\t}\n\n\tupdateBalance(newBalance: number): void {\n\t\tconst userData = this.getUserData();\n\t\tif (userData) {\n\t\t\tuserData.balance = newBalance;\n\t\t\tthis.saveUserData(userData);\n\t\t}\n\t}\n\n\t// Chat Messages\n\tsaveChatMessages(messages: ChatMessage[]): void {\n\t\tif (!this.isBrowser()) return;\n\t\tlocalStorage.setItem(this.CHAT_MESSAGES_KEY, JSON.stringify(messages));\n\t}\n\n\tgetChatMessages(): ChatMessage[] {\n\t\tif (!this.isBrowser()) return [];\n\t\tconst data = localStorage.getItem(this.CHAT_MESSAGES_KEY);\n\t\treturn data ? JSON.parse(data) : [];\n\t}\n\n\taddChatMessage(message: ChatMessage): void {\n\t\tif (!this.isBrowser()) return;\n\t\tconst messages = this.getChatMessages();\n\t\tmessages.push(message);\n\t\t// Keep only last 100 messages per room\n\t\tconst filteredMessages = messages.slice(-100);\n\t\tthis.saveChatMessages(filteredMessages);\n\t}\n\n\t// Game History\n\taddGameHistory(entry: GameHistory): void {\n\t\tconst userData = this.getUserData();\n\t\tif (userData) {\n\t\t\tuserData.gameHistory.unshift(entry);\n\t\t\tuserData.gameHistory = userData.gameHistory.slice(0, 50); // Keep last 50 games\n\n\t\t\t// Update stats\n\t\t\tuserData.gamesPlayed++;\n\t\t\tuserData.totalWagered += Math.abs(entry.amount);\n\t\t\tif (entry.action === \"won\") {\n\t\t\t\tuserData.totalWon += entry.amount;\n\t\t\t\tif (entry.amount > userData.biggestWin) {\n\t\t\t\t\tuserData.biggestWin = entry.amount;\n\t\t\t\t}\n\t\t\t}\n\t\t\tuserData.winRate =\n\t\t\t\t(userData.totalWon / userData.totalWagered) * 100;\n\n\t\t\tthis.saveUserData(userData);\n\t\t\tthis.checkAchievements(userData);\n\t\t}\n\t}\n\n\t// Achievements System\n\tcheckAchievements(userData: UserData): void {\n\t\tconst achievements = userData.achievements;\n\n\t\t// First Win Achievement\n\t\tconst firstWin = achievements.find((a) => a.id === \"first_win\");\n\t\tif (firstWin && !firstWin.completed && userData.totalWon > 0) {\n\t\t\tfirstWin.completed = true;\n\t\t\tfirstWin.unlockedAt = new Date().toISOString();\n\t\t}\n\n\t\t// High Roller Achievement\n\t\tconst highRoller = achievements.find((a) => a.id === \"high_roller\");\n\t\tif (\n\t\t\thighRoller &&\n\t\t\t!highRoller.completed &&\n\t\t\tuserData.biggestWin >= 1000\n\t\t) {\n\t\t\thighRoller.completed = true;\n\t\t\thighRoller.unlockedAt = new Date().toISOString();\n\t\t}\n\n\t\t// Lucky Seven Achievement\n\t\tconst luckySeven = achievements.find((a) => a.id === \"lucky_seven\");\n\t\tif (luckySeven && !luckySeven.completed) {\n\t\t\tconst recentWins = userData.gameHistory\n\t\t\t\t.slice(0, 7)\n\t\t\t\t.filter((g) => g.action === \"won\");\n\t\t\tluckySeven.progress = recentWins.length;\n\t\t\tif (recentWins.length === 7) {\n\t\t\t\tluckySeven.completed = true;\n\t\t\t\tluckySeven.unlockedAt = new Date().toISOString();\n\t\t\t}\n\t\t}\n\n\t\tthis.saveUserData(userData);\n\t}\n\n\t// Bonus Management\n\tclaimBonus(bonusId: string): boolean {\n\t\tconst userData = this.getUserData();\n\t\tif (userData) {\n\t\t\tconst bonus = userData.bonuses.find((b) => b.id === bonusId);\n\t\t\tif (\n\t\t\t\tbonus &&\n\t\t\t\t!bonus.claimed &&\n\t\t\t\tnew Date() < new Date(bonus.expiresAt)\n\t\t\t) {\n\t\t\t\tbonus.claimed = true;\n\t\t\t\tbonus.claimedAt = new Date().toISOString();\n\t\t\t\tuserData.balance += bonus.amount;\n\t\t\t\tthis.saveUserData(userData);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Favorites Management\n\ttoggleFavorite(gameId: number): boolean {\n\t\tconst userData = this.getUserData();\n\t\tif (userData) {\n\t\t\tconst index = userData.favorites.indexOf(gameId);\n\t\t\tif (index > -1) {\n\t\t\t\tuserData.favorites.splice(index, 1);\n\t\t\t\tthis.saveUserData(userData);\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tuserData.favorites.push(gameId);\n\t\t\t\tthis.saveUserData(userData);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tisFavorite(gameId: number): boolean {\n\t\tconst userData = this.getUserData();\n\t\treturn userData ? userData.favorites.includes(gameId) : false;\n\t}\n\n\t// Initialize default user data\n\tinitializeUserData(username: string, email: string): UserData {\n\t\tconst userData: UserData = {\n\t\t\tid: Date.now().toString(),\n\t\t\tusername,\n\t\t\temail,\n\t\t\tbalance: 1000, // Starting bonus\n\t\t\tvipLevel: \"Bronze\",\n\t\t\tisVerified: false,\n\t\t\tjoinDate: new Date().toISOString(),\n\t\t\ttotalWagered: 0,\n\t\t\ttotalWon: 0,\n\t\t\tgamesPlayed: 0,\n\t\t\twinRate: 0,\n\t\t\tbiggestWin: 0,\n\t\t\tfavoriteGame: \"None\",\n\t\t\tachievements: [\n\t\t\t\t{\n\t\t\t\t\tid: \"first_win\",\n\t\t\t\t\ttitle: \"First Win\",\n\t\t\t\t\tdescription: \"Win your first game\",\n\t\t\t\t\tcompleted: false,\n\t\t\t\t\treward: \"$10\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"high_roller\",\n\t\t\t\t\ttitle: \"High Roller\",\n\t\t\t\t\tdescription: \"Win over $1000 in a single game\",\n\t\t\t\t\tcompleted: false,\n\t\t\t\t\treward: \"50 Free Spins\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"lucky_seven\",\n\t\t\t\t\ttitle: \"Lucky Seven\",\n\t\t\t\t\tdescription: \"Win 7 games in a row\",\n\t\t\t\t\tcompleted: false,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tmaxProgress: 7,\n\t\t\t\t\treward: \"$100 Bonus\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"vip_status\",\n\t\t\t\t\ttitle: \"VIP Status\",\n\t\t\t\t\tdescription: \"Reach VIP level 5\",\n\t\t\t\t\tcompleted: false,\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tmaxProgress: 5,\n\t\t\t\t\treward: \"VIP Lounge Access\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tbonuses: [\n\t\t\t\t{\n\t\t\t\t\tid: \"welcome_bonus\",\n\t\t\t\t\ttype: \"deposit\",\n\t\t\t\t\ttitle: \"Welcome Bonus\",\n\t\t\t\t\tdescription: \"200% up to $500\",\n\t\t\t\t\tamount: 500,\n\t\t\t\t\tclaimed: false,\n\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\tDate.now() + 7 * 24 * 60 * 60 * 1000\n\t\t\t\t\t).toISOString(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"free_spins\",\n\t\t\t\t\ttype: \"spins\",\n\t\t\t\t\ttitle: \"Free Spins\",\n\t\t\t\t\tdescription: \"25 free spins on slots\",\n\t\t\t\t\tamount: 25,\n\t\t\t\t\tclaimed: false,\n\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\tDate.now() + 3 * 24 * 60 * 60 * 1000\n\t\t\t\t\t).toISOString(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"daily_bonus\",\n\t\t\t\t\ttype: \"daily\",\n\t\t\t\t\ttitle: \"Daily Bonus\",\n\t\t\t\t\tdescription: \"Daily login bonus\",\n\t\t\t\t\tamount: 50,\n\t\t\t\t\tclaimed: false,\n\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\tDate.now() + 24 * 60 * 60 * 1000\n\t\t\t\t\t).toISOString(),\n\t\t\t\t},\n\t\t\t],\n\t\t\tgameHistory: [],\n\t\t\tfavorites: [],\n\t\t};\n\n\t\tthis.saveUserData(userData);\n\t\treturn userData;\n\t}\n\n\t// Bet History Management\n\n\tclearUserData(): void {\n\t\tif (!this.isBrowser()) return;\n\n\t\t// Clear main user data\n\t\tlocalStorage.removeItem(this.USER_DATA_KEY);\n\t\tlocalStorage.removeItem(this.CHAT_MESSAGES_KEY);\n\n\t\t// Also clear Dynamic SDK authentication token\n\t\tlocalStorage.removeItem(this.DYNAMIC_AUTH_TOKEN_KEY);\n\n\t\t// Clear transaction notifications\n\t\tlocalStorage.removeItem(\"app_transaction_notifications\");\n\n\t\t// Clear any other Dynamic SDK related keys and user-specific data\n\t\tconst keysToRemove: string[] = [];\n\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\tconst key = localStorage.key(i);\n\t\t\tif (\n\t\t\t\tkey &&\n\t\t\t\t(key.startsWith(\"dynamic_\") ||\n\t\t\t\t\tkey.startsWith(\"dyn_\") ||\n\t\t\t\t\tkey.includes(\"dynamic\") ||\n\t\t\t\t\tkey.startsWith(\"userBalance_\") ||\n\t\t\t\t\tkey.startsWith(\"memewin_\") ||\n\t\t\t\t\tkey.includes(\"transaction\") ||\n\t\t\t\t\tkey.includes(\"wallet\") ||\n\t\t\t\t\tkey.startsWith(`${this.BET_HISTORY_CACHE_KEY}_`))\n\t\t\t) {\n\t\t\t\tkeysToRemove.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Remove all identified keys\n\t\tkeysToRemove.forEach((key) => localStorage.removeItem(key));\n\t}\n\n\t// --- Generic helpers (added) ---\n\t/**\n\t * Store an arbitrary JSON-serializable value under a custom key.\n\t */\n\tsetItem<T>(key: string, value: T): void {\n\t\tif (!this.isBrowser()) return;\n\t\ttry {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"localStorage setItem failed\", key, e);\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve an arbitrary JSON value previously stored. Returns null if missing or parse fails.\n\t */\n\tgetItem<T>(key: string): T | null {\n\t\tif (!this.isBrowser()) return null;\n\t\ttry {\n\t\t\tconst raw = localStorage.getItem(key);\n\t\t\treturn raw ? (JSON.parse(raw) as T) : null;\n\t\t} catch (e) {\n\t\t\tconsole.warn(\"localStorage getItem failed\", key, e);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nexport default LocalStorageService;\n","import type { User, UserInfoApiResponse } from \"@/types/auth/auth.types\";\nimport { UserProfile } from \"@dynamic-labs/sdk-react-core\";\nimport LocalStorageService from \"@/services/localStorageService\";\nimport type { UserData } from \"@/services/localStorageService\";\nimport {\n\tWallet,\n\tWalletConnectorCore,\n} from \"@dynamic-labs/wallet-connector-core\";\n\n/**\n * Maps the raw user data object from the API to the application's internal `User` model.\n * This function acts as a crucial \"anti-corruption layer,\" ensuring that the rest of the application\n * works with a clean, consistent, and predictable user object, regardless of the API's structure.\n *\n * @param apiUser - The raw user object received directly from the backend (`UserInfoApiResponse`).\n * @returns A clean, normalized `User` object ready for use in the application's state.\n */\nconst convertApiUserToUser = (apiUser: UserInfoApiResponse): User => {\n\t// Gracefully handle cases where social data might be missing from the API response.\n\n\t// console.log(\"This is apiUser\", apiUser);\n\n\tconst socialData = apiUser.social?.data || [];\n\n\t// Isolate specific social profiles to make logic clearer and more robust.\n\tconst walletData = socialData.find((item) => item.format === \"blockchain\");\n\tconst emailData = socialData.find((item) => item.format === \"email\");\n\tconst oauthData = socialData.find((item) => item.format === \"oauth\");\n\n\t// Determine the primary authentication method based on the available social data.\n\t// This can be useful for UI elements, like showing a \"connected with Google\" badge.\n\tlet authMethod: \"email\" | \"wallet\" | \"oauth\" = \"wallet\"; // Default assumption\n\tif (walletData) authMethod = \"wallet\";\n\telse if (oauthData) authMethod = \"oauth\";\n\telse if (emailData) authMethod = \"email\";\n\n\t// Construct the final, normalized User object for the application.\n\treturn {\n\t\tid: apiUser.sessionId,\n\t\tusername: apiUser.username,\n\t\tnickname: apiUser.nickname,\n\t\tautowd: apiUser.auto_wd,\n\t\t// Prioritize the verified email from social data, but fall back to the API's email.\n\t\temail: emailData?.publicIdentifier || apiUser.email,\n\t\t// Use the OAuth provider's photo as the avatar, if available.\n\t\tavatar: oauthData?.oauthAccountPhotos?.[0],\n\t\tbalance: apiUser.balance,\n\t\tbalanceToken: apiUser.balanceToken,\n\t\t// Make the VIP level more presentable for the UI.\n\t\tvipLevel: `Level ${apiUser.layer}`,\n\t\tisVerified: apiUser.status === \"ACTIVE\",\n\t\t// Prioritize the wallet address from social data, but fall back to the API's address.\n\t\twalletAddress: walletData?.address || apiUser.wallet_address,\n\t\tauthMethod,\n\t\tstatus: apiUser.status,\n\t\tcountry: apiUser.country,\n\t\tphone: apiUser.phone,\n\t\tsessionId: apiUser.sessionId,\n\t\tlastLogin: apiUser.last_login,\n\t\treferralId: apiUser.referral_id,\n\t\tdepositTotal: apiUser.depo_total,\n\t\twithdrawTotal: apiUser.wd_total,\n\t\tpendingDepo: apiUser.pendingDepo,\n\t\tautodepo: apiUser.auto_depo as \"ON\" | \"OFF\",\n\t\tpendingWd: apiUser.pendingWd,\n\t\t// Pass the raw social data through for any components that might need it.\n\t\tsocialData: socialData,\n\t};\n};\n\n/**\n * Transforms the application's internal `User` object into the `UserData` format\n * suitable for persisting in `localStorage`. This is essential for preserving long-term,\n * client-side data that doesn't need to be fetched from the API on every session.\n *\n * @param user - The application's internal, normalized `User` object.\n * @returns A `UserData` object ready to be stringified and saved to `localStorage`.\n */\nconst convertUserToUserData = (user: User): UserData => {\n\tconst storageService = LocalStorageService.getInstance();\n\t// IMPORTANT: First, retrieve any existing data from localStorage.\n\tconst existingData = storageService.getUserData();\n\n\t// console.log(\"existingData from convertedUserToUserData\", existingData);\n\n\t// This \"hydration\" or \"merge\" pattern is critical. It updates core user info\n\t// while preserving long-term stats that are only stored on the client.\n\treturn {\n\t\t// --- Data updated from the live User object ---\n\t\tid: user.id,\n\t\tusername: user.username,\n\t\temail: user.email || \"\",\n\t\tbalance: user.balance,\n\t\tvipLevel: user.vipLevel,\n\t\tisVerified: user.isVerified,\n\t\treferralId: user.referralId || \"\",\n\n\t\t// --- Data preserved from existing localStorage entry ---\n\t\t// If there's no existing joinDate, set it to now. Otherwise, keep the old one.\n\t\tjoinDate: existingData?.joinDate || new Date().toISOString(),\n\t\ttotalWagered: existingData?.totalWagered || 0,\n\t\ttotalWon: existingData?.totalWon || 0,\n\t\tgamesPlayed: existingData?.gamesPlayed || 0,\n\t\twinRate: existingData?.winRate || 0,\n\t\tbiggestWin: existingData?.biggestWin || 0,\n\t\tfavoriteGame: existingData?.favoriteGame || \"Crash\", // Default favorite game\n\t\tachievements: existingData?.achievements || [],\n\t\tbonuses: existingData?.bonuses || [],\n\t\tgameHistory: existingData?.gameHistory || [],\n\t\tfavorites: existingData?.favorites || [],\n\t};\n};\n\n/**\n * Constructs a temporary, partial `User` object as a fallback mechanism.\n * This is used when the main backend API call fails or is in progress, allowing the UI\n * to render a basic, personalized state using data from the authentication provider (Dynamic SDK).\n * This provides a graceful degradation of the user experience instead of a blank screen.\n *\n * @param dynamicUser - The user object from the `useDynamicContext` hook.\n * @param primaryWallet - The primary wallet object from the `useDynamicContext` hook.\n * @returns A temporary `User` object with sensible default values.\n */\nconst createTemporaryUser = (\n\tdynamicUser: UserProfile | null,\n\tprimaryWallet: Wallet<WalletConnectorCore.WalletConnector> | null\n): User => {\n\treturn {\n\t\t// --- Information derived from the auth provider ---\n\t\tid: dynamicUser?.userId || \"temp-id\",\n\t\t// Create a username from the best available info, with multiple fallbacks.\n\t\t// 1. Try the first name.\n\t\t// 2. Try the part of the email before the '@'.\n\t\t// 3. Try the first 8 characters of the wallet address.\n\t\t// 4. Finally, default to \"User\".\n\t\tautowd: \"OFF\", // Default to OFF for temporary users\n\t\tusername:\n\t\t\tdynamicUser?.firstName ||\n\t\t\tdynamicUser?.email?.split(\"@\")[0] ||\n\t\t\tprimaryWallet?.address?.slice(0, 8) ||\n\t\t\t\"User\",\n\t\tnickname: dynamicUser?.firstName || \"Player\",\n\t\temail: dynamicUser?.email,\n\t\twalletAddress: primaryWallet?.address,\n\n\t\t// --- Sensible defaults for a temporary/unloaded state ---\n\t\tavatar: undefined,\n\t\tbalance: 0,\n\t\tbalanceToken: [],\n\t\tvipLevel: \"Bronze\",\n\t\tisVerified: false,\n\t\tauthMethod: \"wallet\",\n\t\tstatus: \"ACTIVE\", // Assume active until told otherwise\n\t\tcountry: \"Unknown\",\n\t\tphone: \"\",\n\t\tsessionId: \"temp-session\",\n\t\tlastLogin: new Date().toISOString(),\n\t\treferralId: \"\",\n\t\tdepositTotal: 0,\n\t\twithdrawTotal: 0,\n\t\tsocialData: [],\n\t\tautodepo: \"OFF\",\n\t\tpendingDepo: false,\n\t\tpendingWd: false, // Default to false for temporary users\n\t};\n};\n\nexport { convertApiUserToUser, convertUserToUserData, createTemporaryUser };\n","import { create, StateCreator } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { immer } from \"zustand/middleware/immer\";\nimport { UiDefinitionSlice, createUiDefinitionSlice } from \"./slices/ui\";\nimport { createBlockchainSlice, BlockchainSlice } from \"./slices/blockchain\";\n\ntype AppStore = {\n\tuiDefinition: UiDefinitionSlice;\n\tblockchain: BlockchainSlice;\n\tdynamicLoaded: boolean;\n\tsetDynamicLoaded: (loaded: boolean) => void;\n};\n\n// --- THIS IS THE NEW HELPER TYPE ---\n// It creates a reusable blueprint for all our slices.\n// It tells TypeScript that our `set` function will always come from Immer.\n// The [['zustand/immer', never]] part is the key to adding the middleware's type signature.\nexport type AppStateCreator<T> = StateCreator<\n\tAppStore,\n\t[[\"zustand/immer\", never]],\n\t[],\n\tT\n>;\n\nconst useAppStore = create<AppStore>()(\n\tdevtools(\n\t\timmer((...args) => ({\n\t\t\tuiDefinition: createUiDefinitionSlice(...args),\n\t\t\tblockchain: createBlockchainSlice(...args),\n\t\t\tdynamicLoaded: false, // Initial state for dynamic loading\n\t\t\tsetDynamicLoaded: (loaded: boolean) => {\n\t\t\t\tuseAppStore.setState({ dynamicLoaded: loaded });\n\t\t\t},\n\t\t}))\n\t)\n);\n\n// --- ADD THIS TEMPORARY CODE FOR TESTING ---\n// if (import.meta.env.DEV) {\n// \t(window as any).useAppStore = useAppStore;\n// }\n\nexport type { AppStore };\nexport { useAppStore };\n","import { AppStateCreator } from \"@/store/store\";\n\nexport type TransactionModalTab =\n\t| \"deposit\"\n\t| \"tip\"\n\t| \"withdraw\"\n\t| \"swap\"\n\t| \"walletInfo\";\n\nexport interface ModalSliceState {\n\tisTransactionModalOpen: boolean;\n\tactiveTransactionModalTab: TransactionModalTab;\n}\n\nexport interface ModalSliceActions {\n\topenTransactionModal: (tab?: TransactionModalTab) => void;\n\tcloseTransactionModal: () => void;\n\tsetActiveTransactionModalTab: (tab: TransactionModalTab) => void;\n}\n\nconst initialState: ModalSliceState = {\n\tisTransactionModalOpen: false,\n\tactiveTransactionModalTab: \"deposit\",\n};\n\nexport const createModalSlice: AppStateCreator<\n\tModalSliceState & ModalSliceActions\n> = (set) => ({\n\t...initialState,\n\topenTransactionModal: (tab = \"deposit\") =>\n\t\tset((state) => {\n\t\t\tstate.uiDefinition.modal.isTransactionModalOpen = true;\n\t\t\tstate.uiDefinition.modal.activeTransactionModalTab = tab;\n\t\t}),\n\tcloseTransactionModal: () =>\n\t\tset((state) => {\n\t\t\tstate.uiDefinition.modal.isTransactionModalOpen = false;\n\t\t}),\n\tsetActiveTransactionModalTab: (tab) =>\n\t\tset((state) => {\n\t\t\tstate.uiDefinition.modal.activeTransactionModalTab = tab;\n\t\t}),\n});\n","import { AppStateCreator } from \"@/store/store\";\n\nimport {\n\tcreateModalSlice,\n\tModalSliceState,\n\tModalSliceActions,\n} from \"./walletProvider/modal.slice\";\n\n/**\n * The complete type for the entire 'uiDefinition' branch.\n * It combines all individual slice types from this domain.\n */\nexport type UiDefinitionSlice = {\n\tmodal: ModalSliceState & ModalSliceActions;\n};\n\n/**\n * The state creator for the 'uiDefinition' slice.\n * It combines all the individual slice creators into a single slice object.\n */\nexport const createUiDefinitionSlice: AppStateCreator<UiDefinitionSlice> = (\n\t...args\n) => ({\n\tmodal: createModalSlice(...args),\n});\n","import { AppStateCreator } from \"@/store/store\";\n\n// --- TYPE DEFINITIONS ---\ninterface EvmNetwork {\n\tname: string;\n\tvanityName?: string;\n}\nexport interface NetworkSliceState {\n\tnetwork: EvmNetwork | null;\n\tchainId: number | null;\n\tchainLogo: string | null;\n}\nexport interface NetworkSliceActions {\n\tsetNetworkData: (data: NetworkSliceState) => void;\n\tclearNetworkData: () => void;\n\tsetChainLogo: (logo: string) => void;\n}\n\n// --- HYDRATION LOGIC ---\nconst NETWORK_KEY = \"app_network\";\nconst CHAIN_ID_KEY = \"app_chainId\";\nconst CHAIN_LOGO_KEY = \"app_chainLogo\";\n\n/**\n * A helper function that runs ONCE to get the initial state.\n * It safely reads from localStorage, handling SSR and potential errors.\n */\nconst getInitialState = (): NetworkSliceState => {\n\t// On the server, there's no localStorage. Return a clean state.\n\tif (typeof window === \"undefined\") {\n\t\treturn { network: null, chainId: null, chainLogo: null };\n\t}\n\ttry {\n\t\tconst storedNetwork = localStorage.getItem(NETWORK_KEY);\n\t\tconst storedChainId = localStorage.getItem(CHAIN_ID_KEY);\n\t\tconst storedChainLogo = localStorage.getItem(CHAIN_LOGO_KEY);\n\n\t\treturn {\n\t\t\tnetwork: storedNetwork ? JSON.parse(storedNetwork) : null,\n\t\t\tchainId: storedChainId ? parseInt(storedChainId, 10) : null,\n\t\t\tchainLogo: storedChainLogo || null,\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t\"Failed to hydrate network state from localStorage:\",\n\t\t\terror\n\t\t);\n\t\treturn { network: null, chainId: null, chainLogo: null };\n\t}\n};\n\n// --- SLICE CREATOR ---\nexport const createNetworkSlice: AppStateCreator<\n\tNetworkSliceState & NetworkSliceActions\n> = (set) => ({\n\t...getInitialState(), // The slice is now initialized with data from localStorage!\n\n\tsetNetworkData: (data) => {\n\t\t// This action now handles BOTH setting state and persisting to localStorage.\n\t\ttry {\n\t\t\tif (!(data.network && data.chainId && data.chainLogo)) {\n\t\t\t\tlocalStorage.removeItem(NETWORK_KEY);\n\t\t\t\tlocalStorage.removeItem(CHAIN_ID_KEY);\n\t\t\t\tlocalStorage.removeItem(CHAIN_LOGO_KEY);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlocalStorage.setItem(NETWORK_KEY, JSON.stringify(data.network));\n\t\t\tlocalStorage.setItem(CHAIN_ID_KEY, String(data.chainId));\n\t\t\tlocalStorage.setItem(CHAIN_LOGO_KEY, data.chainLogo);\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t\"Failed to persist network data to localStorage:\",\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\n\t\t// Update the Zustand state.\n\t\tset((state) => {\n\t\t\tstate.blockchain.network.network = data.network;\n\t\t\tstate.blockchain.network.chainId = data.chainId;\n\t\t\tstate.blockchain.network.chainLogo = data.chainLogo;\n\t\t});\n\t},\n\n\tclearNetworkData: () => {\n\t\t// This action clears both the state and the localStorage.\n\t\tlocalStorage.removeItem(NETWORK_KEY);\n\t\tlocalStorage.removeItem(CHAIN_ID_KEY);\n\t\tlocalStorage.removeItem(CHAIN_LOGO_KEY);\n\t\tset((state) => {\n\t\t\tstate.blockchain.network.network = null;\n\t\t\tstate.blockchain.network.chainId = null;\n\t\t\tstate.blockchain.network.chainLogo = null;\n\t\t});\n\t},\n\n\tsetChainLogo: (logo) => {\n\t\tlocalStorage.setItem(CHAIN_LOGO_KEY, logo);\n\t\tset((state) => {\n\t\t\tstate.blockchain.network.chainLogo = logo;\n\t\t});\n\t},\n});\n","import { AppStateCreator } from \"@/store/store\";\nimport ApiService from \"@/services/apiService\";\nimport { GetTokenListRequest, Token } from \"@/types/blockchain/swap.types\";\nimport { User } from \"@/types/auth/auth.types\";\n\n// --- STATE AND ACTION TYPES ---\n\ntype TokenFetchStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\nexport interface TokenSliceState {\n  tokens: Token[];\n  // We will use selectors for specific tokens, keeping the state minimal.\n  tokenFetchStatus: TokenFetchStatus;\n}\n\n/**\n * Actions for managing token state in the blockchain slice.\n */\nexport interface TokenSliceActions {\n  /**\n   * Fetches the list of tokens for the current network and user.\n   * Handles polling, retry logic, and guards against missing dependencies.\n   *\n   * @param force - If true, forces a refetch even if tokens are already loaded.\n   * @param deps - Dependencies required for fetching (user, authToken, etc).\n   * @returns A promise that resolves when the fetch is complete.\n   */\n  fetchTokens: (\n    force?: boolean,\n    deps?: { user: User | null; authToken: string | null }\n  ) => Promise<void>;\n\n  /**\n   * Clears the token state, resetting to initial values.\n   * Used internally for cleanup or when dependencies are missing.\n   */\n  _clearTokens: () => void;\n}\n\n// --- INITIAL STATE ---\n\nconst initialState: TokenSliceState = {\n  tokens: [],\n  tokenFetchStatus: \"idle\",\n};\n\n// --- SLICE CREATOR ---\n\nexport const createTokenSlice: AppStateCreator<\n  TokenSliceState & TokenSliceActions\n> = (set, get) => ({\n  ...initialState,\n\n  _clearTokens: () => {\n    set((state) => {\n      state.blockchain.token = {\n        ...state.blockchain.token,\n        ...initialState,\n      };\n    });\n  },\n\n  fetchTokens: async (\n    force = false,\n    deps?: { user: User | null; authToken: string | null }\n  ) => {\n    // --- 1. Get Dependencies from the Global Store ---\n    const { chainId } = get().blockchain.network;\n    if (!deps) return;\n    const { user, authToken } = deps;\n    const { tokenFetchStatus, tokens } = get().blockchain.token;\n\n    // console.log(\"==============================================\");\n\n    // --- 2. GUARDS ---\n    if (!user?.username || !user.walletAddress || !chainId || !authToken) {\n      // If essential data is missing, reset to idle and abort.\n      get().blockchain.token._clearTokens();\n      return;\n    }\n    // Prevent re-fetching if already loading or if data is present and not forced\n    if (\n      tokenFetchStatus === \"loading\" ||\n      (tokenFetchStatus === \"success\" && tokens.length > 0 && !force)\n    ) {\n      return;\n    }\n    // console.log(\"+++++++++++++++++++++++++++++++++++++++++++\");\n\n    set((state) => {\n      state.blockchain.token.tokenFetchStatus = \"loading\";\n    });\n\n    // --- 3. API CALL WITH RETRY LOGIC ---\n    let retryCount = 0;\n    const maxRetries = 5;\n\n    const executeFetch = async () => {\n      try {\n        const api = ApiService.getInstance();\n        const requestBody: GetTokenListRequest = {\n          network: String(chainId),\n          walletAddress: user.walletAddress!,\n          username: user.username,\n        };\n\n        const response = await api.getTokenList(requestBody, authToken);\n\n        if (response.error) {\n          throw new Error(response.message);\n        }\n\n        const data = response.data || [];\n\n        // --- 4. POLLING LOGIC ---\n        // As per the reference code, if a specific condition is met, retry.\n        if (data.length === 3 && retryCount < maxRetries) {\n          retryCount++;\n          setTimeout(executeFetch, 500); // Poll after 500ms\n          return;\n        }\n\n        // --- 5. DATA AUGMENTATION ---\n        const augmentedData = [\n          ...data,\n          // Add your custom token here if it's not in the API response\n        ];\n\n        set((state) => {\n          state.blockchain.token.tokens = augmentedData;\n          state.blockchain.token.tokenFetchStatus = \"success\";\n        });\n      } catch (error) {\n        console.error(\n          `Failed to fetch tokens (attempt ${retryCount + 1}):`,\n          error\n        );\n        if (retryCount < maxRetries) {\n          // Implement retry logic for specific errors if needed\n          retryCount++;\n          setTimeout(executeFetch, 1000 * retryCount); // Simple exponential backoff\n        } else {\n          set((state) => {\n            state.blockchain.token.tokenFetchStatus = \"error\";\n            state.blockchain.token.tokens = [];\n          });\n        }\n      }\n    };\n\n    await executeFetch();\n  },\n});\n","/**\n * Defines the possible states of a transaction as it moves through its lifecycle.\n */\nexport enum TransactionStatus {\n\tPENDING = \"pending\", // Transaction has been initiated by the user, awaiting confirmation.\n\tCONFIRMED = \"confirmed\", // Transaction is successful and confirmed on the blockchain.\n\tSUBMITTED = \"submitted\", // A special status for swaps, indicating it's sent but not yet final.\n\tFAILED = \"failed\", // Transaction has failed, been rejected, or timed out.\n}\n\n/**\n * Defines the types of transactions the system can track.\n */\nexport enum TransactionType {\n\tDEPOSIT = \"deposit\",\n\tWITHDRAW = \"withdraw\",\n\tSWAP = \"swap\",\n\tTIP = \"tip\",\n}\n\n/**\n * The specific data payload for an auto-deposit/withdrawal status update.\n */\nexport interface AutoDepoWdStatusPayload {\n\tstatus: \"enabled\" | \"disabled\";\n\treason?: string;\n}\n\n/**\n * A discriminated union of all possible incoming WebSocket messages.\n * This allows for exhaustive type checking in our message handler.\n */\nexport type WebSocketMessage =\n\t| { type: \"DEPOSITNOTIFICATION\"; data: TransactionNotificationData }\n\t| { type: \"WITHDRAWNOTIFICATION\"; data: TransactionNotificationData }\n\t| { type: \"AUTODEPOWDSTATUSNOTIFICATION\"; data: AutoDepoWdStatusPayload };\n\n/**\n * Represents the structure of the data object received from a WebSocket notification\n * for a deposit or withdrawal event.\n */\nexport interface TransactionNotificationData {\n\ttxId: string;\n\tamount: number;\n\tcurrency: string;\n\tstatus: \"CONFIRMED\" | \"REJECTED\"; // The status from the backend\n}\n\n/**\n * Represents a single transaction object as it is stored and managed\n * within our application's state (e.g., in the Zustand store).\n */\nexport interface AppTransaction {\n\t/** A unique ID generated by the client for React keys (e.g., Date.now()). */\n\tid: number;\n\t/** The on-chain transaction hash (e.g., \"0x...\"). */\n\thash?: string;\n\t/** The type of the transaction. */\n\ttype: TransactionType;\n\t/** The current status of the transaction within our app. */\n\tstatus: TransactionStatus;\n\t/** The amount of the transaction. */\n\tamount: number | string;\n\t/** The symbol of the token involved (e.g., \"USDT\"). */\n\ttokenSymbol: string;\n\t/** The network name or chain ID where the transaction occurred. */\n\tnetwork: string | number;\n\t/** The client-side timestamp of when the transaction was initiated. */\n\ttimestamp: number;\n\n\t// --- Optional fields for specific transaction types ---\n\tfromToken?: string; // For swaps\n\ttoToken?: string; // For swaps\n\n\t// --- Internal properties for state management ---\n\terror?: string | null; // To store any failure reasons\n\ttimeoutId?: NodeJS.Timeout | null; // To manage failsafe timeouts\n\tserverTxId?: string; // To store the txId from the WebSocket for reference\n}\n","import { AppStateCreator } from \"@/store/store\";\nimport {\n\tAppTransaction,\n\tTransactionStatus,\n\tTransactionType, // Make sure TransactionType is imported\n\tTransactionNotificationData,\n} from \"@/types/blockchain/transactions.types\";\n\n// --- CONSTANTS ---\nconst STORAGE_KEY = \"app_transaction_notifications\";\nconst TRANSACTION_TIMEOUT_MS = 5 * 60 * 1000;\nconst SWAP_SUBMITTED_DELAY_MS = 1000;\nconst SWAP_AUTO_REMOVE_DELAY_MS = 8000;\nconst FINALIZED_AUTO_REMOVE_DELAY_MS = 10 * 60 * 1000;\n\n// --- STATE AND ACTION TYPES ---\nexport interface TransactionSliceState {\n\ttransactions: AppTransaction[];\n\tpendingCount: number;\n}\nexport interface TransactionSliceActions {\n\taddTransaction: (\n\t\ttxData: Omit<AppTransaction, \"id\" | \"timestamp\" | \"status\">\n\t) => void;\n\tprocessWebSocketUpdate: (wsData: TransactionNotificationData) => void;\n\tinitializeTransactions: () => void;\n\t_removeTransaction: (txId: number) => void;\n\t_monitorTransaction: (txId: number) => void; // Internal helper for failsafe monitoring\n\t_updateTransaction: (\n\t\ttxId: number,\n\t\tupdates: Partial<AppTransaction>\n\t) => void; // Internal helper to update a transaction\n\t_updateAndPersist: (newTransactions: AppTransaction[]) => void; // Internal helper for state and persistence\n}\n\n// --- PERSISTENCE LOGIC ---\nconst getInitialState = (): TransactionSliceState => {\n\tif (typeof window === \"undefined\")\n\t\treturn { transactions: [], pendingCount: 0 };\n\ttry {\n\t\tconst stored = localStorage.getItem(STORAGE_KEY);\n\t\tif (!stored) return { transactions: [], pendingCount: 0 };\n\n\t\tconst parsed = JSON.parse(stored) as AppTransaction[];\n\t\tconst validTransactions = parsed.filter((tx) => {\n\t\t\tconst isRecent = Date.now() - tx.timestamp < 24 * 60 * 60 * 1000;\n\t\t\treturn tx.status === TransactionStatus.PENDING || isRecent;\n\t\t});\n\t\tconst pendingCount = validTransactions.filter(\n\t\t\t(tx) => tx.status === TransactionStatus.PENDING\n\t\t).length;\n\t\treturn { transactions: validTransactions, pendingCount };\n\t} catch (error) {\n\t\tconsole.error(\"Error hydrating transaction state:\", error);\n\t\treturn { transactions: [], pendingCount: 0 };\n\t}\n};\n\n// --- SLICE CREATOR ---\nexport const createTransactionSlice: AppStateCreator<\n\tTransactionSliceState & TransactionSliceActions\n> = (set, get) => ({\n\t...getInitialState(),\n\n\t_updateAndPersist: (newTransactions: AppTransaction[]) => {\n\t\tconst pendingCount = newTransactions.filter(\n\t\t\t(tx) => tx.status === TransactionStatus.PENDING\n\t\t).length;\n\t\tset((state) => {\n\t\t\tstate.blockchain.transaction.transactions = newTransactions;\n\t\t\tstate.blockchain.transaction.pendingCount = pendingCount;\n\t\t});\n\t\ttry {\n\t\t\tlocalStorage.setItem(STORAGE_KEY, JSON.stringify(newTransactions));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error saving transaction state:\", error);\n\t\t}\n\t},\n\n\t_updateTransaction: (txId: number, updates: Partial<AppTransaction>) => {\n\t\tconst currentTxs = get().blockchain.transaction.transactions;\n\t\tconst newTxs = currentTxs.map((tx) =>\n\t\t\ttx.id === txId ? { ...tx, ...updates } : tx\n\t\t);\n\t\tget().blockchain.transaction._updateAndPersist(newTxs);\n\t},\n\n\t_removeTransaction: (txId: number) => {\n\t\tconst currentTxs = get().blockchain.transaction.transactions;\n\t\tconst newTxs = currentTxs.filter((t) => t.id !== txId);\n\t\tget().blockchain.transaction._updateAndPersist(newTxs);\n\t},\n\n\t_monitorTransaction: (txId: number) => {\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tconst tx = get().blockchain.transaction.transactions.find(\n\t\t\t\t(t) => t.id === txId\n\t\t\t);\n\t\t\tif (tx?.status === TransactionStatus.PENDING) {\n\t\t\t\tget().blockchain.transaction._updateTransaction(txId, {\n\t\t\t\t\tstatus: TransactionStatus.FAILED,\n\t\t\t\t\terror: \"Transaction timeout\",\n\t\t\t\t});\n\t\t\t}\n\t\t}, TRANSACTION_TIMEOUT_MS);\n\t\tget().blockchain.transaction._updateTransaction(txId, { timeoutId });\n\t},\n\n\taddTransaction: (txData) => {\n\t\tconst newTransaction: AppTransaction = {\n\t\t\t...txData,\n\t\t\tid: Date.now(),\n\t\t\ttimestamp: Date.now(),\n\t\t\tstatus: TransactionStatus.PENDING,\n\t\t};\n\t\tconst newTransactions = [\n\t\t\tnewTransaction,\n\t\t\t...get().blockchain.transaction.transactions,\n\t\t].slice(0, 50);\n\t\tget().blockchain.transaction._updateAndPersist(newTransactions);\n\n\t\t// --- SPECIAL SWAP HANDLING (RESTORED) ---\n\t\tif (newTransaction.type === TransactionType.SWAP) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tget().blockchain.transaction._updateTransaction(\n\t\t\t\t\tnewTransaction.id,\n\t\t\t\t\t{ status: TransactionStatus.SUBMITTED }\n\t\t\t\t);\n\t\t\t\tsetTimeout(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tget().blockchain.transaction._removeTransaction(\n\t\t\t\t\t\t\tnewTransaction.id\n\t\t\t\t\t\t),\n\t\t\t\t\tSWAP_AUTO_REMOVE_DELAY_MS\n\t\t\t\t);\n\t\t\t}, SWAP_SUBMITTED_DELAY_MS);\n\t\t} else {\n\t\t\t// Start failsafe monitor for non-swap transactions\n\t\t\tget().blockchain.transaction._monitorTransaction(newTransaction.id);\n\t\t}\n\t},\n\n\tprocessWebSocketUpdate: (wsData) => {\n\t\tconst { txId, amount, currency, status } = wsData;\n\t\tconst newStatus =\n\t\t\tstatus === \"CONFIRMED\"\n\t\t\t\t? TransactionStatus.CONFIRMED\n\t\t\t\t: TransactionStatus.FAILED;\n\t\tlet txToUpdate: AppTransaction | undefined;\n\n\t\tconst currentTxs = get().blockchain.transaction.transactions;\n\n\t\t// --- RESILIENT MATCHING LOGIC (RESTORED) ---\n\t\t// eslint-disable-next-line\n\t\ttxToUpdate = currentTxs.find(\n\t\t\t(tx) =>\n\t\t\t\ttx.status === TransactionStatus.PENDING &&\n\t\t\t\t(tx.hash === txId ||\n\t\t\t\t\ttx.serverTxId === txId ||\n\t\t\t\t\t(Number(tx.amount) === amount &&\n\t\t\t\t\t\ttx.tokenSymbol.toUpperCase() ===\n\t\t\t\t\t\t\tcurrency.toUpperCase() &&\n\t\t\t\t\t\tDate.now() - tx.timestamp < 10 * 60 * 1000)) // 10 minute window\n\t\t);\n\n\t\tif (txToUpdate) {\n\t\t\tif (txToUpdate.timeoutId) clearTimeout(txToUpdate.timeoutId);\n\n\t\t\tconst updates: Partial<AppTransaction> = {\n\t\t\t\tstatus: newStatus,\n\t\t\t\tserverTxId: txId,\n\t\t\t\ttimeoutId: null,\n\t\t\t};\n\t\t\tif (status === \"REJECTED\")\n\t\t\t\tupdates.error = \"Transaction rejected by network\";\n\n\t\t\tget().blockchain.transaction._updateTransaction(\n\t\t\t\ttxToUpdate.id,\n\t\t\t\tupdates\n\t\t\t);\n\n\t\t\tsetTimeout(\n\t\t\t\t() =>\n\t\t\t\t\tget().blockchain.transaction._removeTransaction(\n\t\t\t\t\t\ttxToUpdate!.id\n\t\t\t\t\t),\n\t\t\t\tFINALIZED_AUTO_REMOVE_DELAY_MS\n\t\t\t);\n\t\t}\n\t},\n\n\tinitializeTransactions: () => {\n\t\tconst state = get().blockchain.transaction;\n\t\t// --- RESUME MONITORING ON HYDRATION (RESTORED) ---\n\t\tstate.transactions\n\t\t\t.filter(\n\t\t\t\t(tx) =>\n\t\t\t\t\ttx.status === TransactionStatus.PENDING &&\n\t\t\t\t\ttx.type !== TransactionType.SWAP\n\t\t\t)\n\t\t\t.forEach((tx) =>\n\t\t\t\tget().blockchain.transaction._monitorTransaction(tx.id)\n\t\t\t);\n\n\t\t// --- PERIODIC CLEANUP LOGIC (RESTORED) ---\n\t\tsetInterval(() => {\n\t\t\tconst currentTxs = get().blockchain.transaction.transactions;\n\t\t\tconst validTxs = currentTxs.filter((tx) => {\n\t\t\t\tconst isRecent =\n\t\t\t\t\tDate.now() - tx.timestamp < 24 * 60 * 60 * 1000;\n\t\t\t\treturn tx.status === TransactionStatus.PENDING || isRecent;\n\t\t\t});\n\t\t\tif (validTxs.length !== currentTxs.length) {\n\t\t\t\tget().blockchain.transaction._updateAndPersist(validTxs);\n\t\t\t}\n\t\t}, 60 * 60 * 1000); // Every hour\n\t},\n});\n","import { AppStateCreator } from \"@/store/store\";\n\nexport type WsConnectionStatus =\n\t| \"disconnected\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"reconnecting\"\n\t| \"error\";\n\nexport interface WebSocketSliceState {\n\tconnectionStatus: WsConnectionStatus;\n}\nexport interface WebSocketSliceActions {\n\tsetConnectionStatus: (status: WsConnectionStatus) => void;\n}\n\nconst initialState: WebSocketSliceState = { connectionStatus: \"disconnected\" };\n\nexport const createWebSocketSlice: AppStateCreator<\n\tWebSocketSliceState & WebSocketSliceActions\n> = (set) => ({\n\t...initialState,\n\tsetConnectionStatus: (status) => {\n\t\tset((state) => {\n\t\t\tstate.blockchain.websocket.connectionStatus = status;\n\t\t});\n\t},\n});\n","import { AppStateCreator } from \"@/store/store\";\nimport {\n\tcreateNetworkSlice,\n\tNetworkSliceActions,\n\tNetworkSliceState,\n} from \"./network.slice\";\nimport {\n\tcreateTokenSlice,\n\tTokenSliceActions,\n\tTokenSliceState,\n} from \"./token.slice\";\nimport {\n\tcreateTransactionSlice,\n\tTransactionSliceActions,\n\tTransactionSliceState,\n} from \"./transactions.slice\";\nimport {\n\tcreateWebSocketSlice,\n\tWebSocketSliceActions,\n\tWebSocketSliceState,\n} from \"./websocket.slice\";\n\n/**\n * The complete type for the entire 'blockchain' Slice.\n * It combines all individual slice types from this domain.\n */\nexport type BlockchainSlice = {\n\tnetwork: NetworkSliceState & NetworkSliceActions;\n\ttoken: TokenSliceState & TokenSliceActions;\n\ttransaction: TransactionSliceState & TransactionSliceActions;\n\twebsocket: WebSocketSliceState & WebSocketSliceActions;\n};\n\n/**\n * The state creator for the 'blockchain' branch.\n * It combines all the individual slice creators into a single slice object,\n * namespacing them for clarity.\n */\nexport const createBlockchainSlice: AppStateCreator<BlockchainSlice> = (\n\t...args\n) => ({\n\tnetwork: createNetworkSlice(...args),\n\ttoken: createTokenSlice(...args),\n\ttransaction: createTransactionSlice(...args),\n\twebsocket: createWebSocketSlice(...args),\n});\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport {\n\tuseDynamicContext,\n\tdynamicEvents,\n\tEvmNetwork,\n\tgetNetwork,\n} from \"@dynamic-labs/sdk-react-core\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n\n// Helper type to safely access evmNetworks from the generic connector\nexport interface EvmWalletConnector {\n\tevmNetworks?: EvmNetwork[];\n\t[key: string]: unknown;\n}\n\n/**\n * An invisible \"bridge\" component that synchronizes the user's current wallet\n * network state from the Dynamic SDK into our central Zustand store.\n */\nexport const NetworkStateSynchronizer = () => {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst { setNetworkData } = useAppStore((state) => state.blockchain.network);\n\tconst { refreshUserData } = useDynamicAuth();\n\n\tuseEffect(() => {\n\t\tconst updateNetworkState = async () => {\n\t\t\tif (!primaryWallet?.connector) {\n\t\t\t\tsetNetworkData({\n\t\t\t\t\tnetwork: null,\n\t\t\t\t\tchainId: null,\n\t\t\t\t\tchainLogo: null,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst chainId = await getNetwork(primaryWallet.connector);\n\n\t\t\t\t// console.log(\"primaryWallet.chain\", primaryWallet.chain);\n\t\t\t\t// console.log(\"chainId\", chainId);\n\n\t\t\t\tif (!chainId)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Could not determine chain ID from wallet.\"\n\t\t\t\t\t);\n\n\t\t\t\t// --- THE REFINED LOGIC ---\n\t\t\t\t// Cast the generic connector to our specific type to access evmNetworks.\n\t\t\t\tconst connector =\n\t\t\t\t\tprimaryWallet.connector as unknown as EvmWalletConnector;\n\n\t\t\t\t// Find the full network configuration object from the connector's list.\n\t\t\t\tconst currentNetworkConfig = connector.evmNetworks?.find(\n\t\t\t\t\t(net: EvmNetwork) => net.chainId === chainId\n\t\t\t\t);\n\n\t\t\t\tif (!currentNetworkConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No network configuration found for chain ID ${chainId}.`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Use the vanityName if it exists, otherwise fall back to the name.\n\t\t\t\tconst networkName =\n\t\t\t\t\tcurrentNetworkConfig.vanityName ||\n\t\t\t\t\tcurrentNetworkConfig.name;\n\t\t\t\tconst chainLogo = currentNetworkConfig.iconUrls?.[0] || null;\n\n\t\t\t\t// The \"network\" state will now hold a clean object with the best possible name.\n\t\t\t\tsetNetworkData({\n\t\t\t\t\tnetwork: {\n\t\t\t\t\t\tname: networkName,\n\t\t\t\t\t\tvanityName: currentNetworkConfig.vanityName,\n\t\t\t\t\t},\n\t\t\t\t\tchainId: Number(chainId),\n\t\t\t\t\tchainLogo,\n\t\t\t\t});\n\n\t\t\t\trefreshUserData(Number(chainId));\n\n\t\t\t\t// --- THE CRITICAL ADDITION ---\n\t\t\t\t// After successfully updating the network, trigger a refresh of the user profile.\n\t\t\t\t// This will call the /fetchInfo API and update our `user` object with the\n\t\t\t\t// correct, network-specific `balanceToken` array.\n\t\t\t\t// console.log(\n\t\t\t\t// \t\"Network changed. Triggering user profile refresh...\"\n\t\t\t\t// );\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to update network state:\", error);\n\t\t\t\tsetNetworkData({\n\t\t\t\t\tnetwork: null,\n\t\t\t\t\tchainId: null,\n\t\t\t\t\tchainLogo: null,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst handleNetworkChange = () => {\n\t\t\tupdateNetworkState();\n\t\t};\n\n\t\t// Subscribe to the correct event.\n\t\tdynamicEvents.on(\"primaryWalletNetworkChanged\", handleNetworkChange);\n\n\t\t// Initial run.\n\t\tupdateNetworkState();\n\n\t\t// Cleanup.\n\t\treturn () => {\n\t\t\tdynamicEvents.off(\n\t\t\t\t\"primaryWalletNetworkChanged\",\n\t\t\t\thandleNetworkChange\n\t\t\t);\n\t\t};\n\t}, [primaryWallet, setNetworkData]);\n\n\treturn null;\n};\n","// \"use a client\";\n\n// import { useEffect, useRef } from \"react\";\n// import { useAppStore } from \"@/store/store\";\n// import { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n\n// /**\n//  * An invisible \"bridge\" component with a single responsibility:\n//  * to synchronize the user's token list with the current network.\n//  * It listens for changes to the `chainId` in the `network` slice and\n//  * triggers the `fetchTokens` action in the `token` slice.\n//  */\n// export const TokenStateSynchronizer = () => {\n// \t// 1. Get the relevant STATE from the store.\n// \t// We select the `chainId` to use as our primary trigger.\n// \tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n// \tconst { user, authToken } = useDynamicAuth();\n\n// \t// 2. Get the relevant ACTIONS from the store.\n// \tconst fetchTokens = useAppStore(\n// \t\t(state) => state.blockchain.token.fetchTokens\n// \t);\n// \tconst clearTokens = useAppStore(\n// \t\t(state) => state.blockchain.token._clearTokens\n// \t);\n\n// \t// 3. Use a ref to track the last network we fetched tokens for.\n// \t// This is a crucial optimization to prevent redundant API calls.\n// \tconst lastFetchedChainId = useRef<number | null>(null);\n\n// \t// 4. The main effect that triggers the data fetching.\n// \tuseEffect(() => {\n// \t\t// Guard clause: If there is no chainId, the user is likely disconnected.\n// \t\t// We should clear any existing token data.\n// \t\tif (!chainId) {\n// \t\t\tclearTokens();\n// \t\t\tlastFetchedChainId.current = null; // Reset the ref\n// \t\t\treturn;\n// \t\t}\n\n// \t\t// Optimization: If the current chainId is the same as the one we last\n// \t\t// fetched for, do nothing. This prevents re-fetching when other\n// \t\t// parts of the app cause a re-render.\n// \t\tif (chainId === lastFetchedChainId.current) {\n// \t\t\treturn;\n// \t\t}\n\n// \t\t// If we've reached here, the network has changed.\n// \t\tconsole.log(\n// \t\t\t`Network changed to Chain ID: ${chainId}. Fetching new token list...`,\n// \t\t\t`Passing user and authToken: ${user} and ${authToken.slice(\n// \t\t\t\t0,\n// \t\t\t\t10\n// \t\t\t)}...`\n// \t\t);\n\n// \t\t// Trigger the fetch action for the new network.\n// \t\tfetchTokens(false, { user, authToken });\n\n// \t\t// After triggering the fetch, update the ref to the current chainId.\n// \t\tlastFetchedChainId.current = chainId;\n// \t}, [chainId]); // This effect re-runs whenever the chainId changes.\n// \t// }, [chainId, fetchTokens, clearTokens]); // This effect re-runs whenever the chainId changes.\n\n// \t// This component renders nothing to the DOM.\n// \treturn null;\n// };\n\n\"use client\";\n\nimport { useEffect, useRef, useCallback } from \"react\"; // <-- Import useCallback\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n\nexport const TokenStateSynchronizer = () => {\n\t// --- 1. Get State & Dependencies ---\n\tconst { user, authToken } = useDynamicAuth();\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\n\t// --- 2. Get Actions from the store ---\n\tconst fetchTokensAction = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\tconst clearTokensAction = useAppStore(\n\t\t(state) => state.blockchain.token._clearTokens\n\t);\n\n\t// --- 3. THE FIX (Part 1): Wrap actions in useCallback ---\n\t// This memoizes the functions, making them stable dependencies for the main useEffect.\n\tconst fetchTokens = useCallback(\n\t\t(...args: Parameters<typeof fetchTokensAction>) => {\n\t\t\treturn fetchTokensAction(...args);\n\t\t},\n\t\t[fetchTokensAction]\n\t);\n\n\tconst clearTokens = useCallback(() => {\n\t\treturn clearTokensAction();\n\t}, [clearTokensAction]);\n\n\tconst lastFetchedChainId = useRef<number | null>(null);\n\n\t// --- 4. The main effect ---\n\tuseEffect(() => {\n\t\t// Guard clause: If dependencies aren't ready, clear the state.\n\t\tif (!chainId || !user || !authToken) {\n\t\t\tclearTokens();\n\t\t\tlastFetchedChainId.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif (chainId === lastFetchedChainId.current) {\n\t\t\treturn;\n\t\t}\n\n\t\t// console.log(\n\t\t// \t`Network changed to Chain ID: ${chainId}. Fetching new token list...`\n\t\t// );\n\n\t\t// --- 5. THE FIX (Part 2): Call the action with the correct arguments ---\n\t\t// The dependencies object is the first argument.\n\t\tfetchTokens(true, { user, authToken });\n\n\t\tlastFetchedChainId.current = chainId;\n\n\t\t// --- 6. THE FIX (Part 3): Add `user` and `authToken` to the dependency array ---\n\t\t// This ensures the effect re-runs if the user logs in on the same network.\n\t}, [chainId, user, authToken, fetchTokens, clearTokens]);\n\n\treturn null;\n};\n","// v1\n// \"use client\";\n\n// import { useEffect, useRef } from \"react\";\n// import { useAppStore } from \"@/store/store\";\n// import { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n// import WebSocketService from \"@/services/webSocketService\";\n\n// export const TransactionStateSynchronizer = () => {\n// \tconst { user, isLoggedIn } = useDynamicAuth();\n// \tconst { processWebSocketUpdate, _monitorPendingTransactions } = useAppStore(\n// \t\t(state) => state.blockchain.transaction\n// \t);\n\n// \t// A ref to ensure we only start monitoring once per mount\n// \tconst didMount = useRef(false);\n\n// \tuseEffect(() => {\n// \t\tif (isLoggedIn && user?.username) {\n// \t\t\tWebSocketService.connect(user.username);\n\n// \t\t\tconst unsubscribeDeposits = WebSocketService.subscribeToDeposits(\n// \t\t\t\tprocessWebSocketUpdate\n// \t\t\t);\n// \t\t\tconst unsubscribeWithdraws = WebSocketService.subscribeToWithdraws(\n// \t\t\t\tprocessWebSocketUpdate\n// \t\t\t);\n// \t\t\t// On initial mount for a logged-in user, check if we need to resume monitoring\n// \t\t\tif (!didMount.current) {\n// \t\t\t\t_monitorPendingTransactions();\n// \t\t\t\tdidMount.current = true;\n// \t\t\t}\n\n// \t\t\treturn () => {\n// \t\t\t\tunsubscribeDeposits();\n// \t\t\t\tunsubscribeWithdraws();\n// \t\t\t\t// We don't necessarily want to disconnect on every re-render,\n// \t\t\t\t// only when the user logs out.\n// \t\t\t};\n// \t\t} else {\n// \t\t\t// If user logs out, disconnect the socket.\n// \t\t\tWebSocketService.disconnect();\n// \t\t\tdidMount.current = false; // Reset for next login\n// \t\t}\n// \t}, [\n// \t\tisLoggedIn,\n// \t\tuser?.username,\n// \t\tprocessWebSocketUpdate,\n// \t\t_monitorPendingTransactions,\n// \t]);\n\n// \treturn null;\n// };\n\n\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport WebSocketService from \"@/services/webSocketService\";\n\n/**\n * An invisible \"bridge\" component with two primary responsibilities:\n * 1. To initialize the transaction monitoring system on application startup.\n * 2. To manage the WebSocket connection based on the user's authentication state.\n */\nexport const TransactionStateSynchronizer = () => {\n\tconst { user, isLoggedIn } = useDynamicAuth();\n\n\t// Get all necessary actions from the transaction slice.\n\tconst { processWebSocketUpdate, initializeTransactions } = useAppStore(\n\t\t(state) => state.blockchain.transaction\n\t);\n\n\t// A ref to ensure initialization only ever runs once for the entire application lifecycle.\n\tconst didInitialize = useRef(false);\n\n\t// --- EFFECT 1: Initialization ---\n\t// This effect runs only ONCE when the component first mounts.\n\tuseEffect(() => {\n\t\t// The ref guard prevents this logic from ever running a second time.\n\t\tif (!didInitialize.current) {\n\t\t\t// This single action handles both loading from localStorage and resuming monitoring.\n\t\t\tinitializeTransactions();\n\t\t\tdidInitialize.current = true;\n\t\t}\n\t}, [initializeTransactions]); // `initializeTransactions` is a stable function, so this effectively runs once.\n\n\t// --- EFFECT 2: WebSocket Connection Management ---\n\t// This effect is responsible for reacting to changes in the user's login status.\n\tuseEffect(() => {\n\t\tif (isLoggedIn && user?.username) {\n\t\t\t// If the user is logged in, connect the WebSocket and subscribe to events.\n\t\t\tWebSocketService.connect(user.username);\n\n\t\t\tconst unsubscribeDeposits = WebSocketService.subscribeToDeposits(\n\t\t\t\tprocessWebSocketUpdate\n\t\t\t);\n\t\t\tconst unsubscribeWithdraws = WebSocketService.subscribeToWithdraws(\n\t\t\t\tprocessWebSocketUpdate\n\t\t\t);\n\t\t\t// Add other subscriptions (like auto-status) here in the future.\n\n\t\t\t// The cleanup function for this effect will run when the user logs out.\n\t\t\treturn () => {\n\t\t\t\tunsubscribeDeposits();\n\t\t\t\tunsubscribeWithdraws();\n\t\t\t};\n\t\t} else {\n\t\t\t// If the user is not logged in, ensure the WebSocket is disconnected.\n\t\t\tWebSocketService.disconnect();\n\t\t}\n\t}, [isLoggedIn, user?.username, processWebSocketUpdate]);\n\n\treturn null;\n};\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach((key) => {\n    PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n    if (withNativeBlob && data instanceof Blob) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(data, callback);\n        }\n    }\n    else if (withNativeArrayBuffer &&\n        (data instanceof ArrayBuffer || isView(data))) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(new Blob([data]), callback);\n        }\n    }\n    // plain string\n    return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n    const fileReader = new FileReader();\n    fileReader.onload = function () {\n        const content = fileReader.result.split(\",\")[1];\n        callback(\"b\" + (content || \"\"));\n    };\n    return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n    if (data instanceof Uint8Array) {\n        return data;\n    }\n    else if (data instanceof ArrayBuffer) {\n        return new Uint8Array(data);\n    }\n    else {\n        return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n    }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n    if (withNativeBlob && packet.data instanceof Blob) {\n        return packet.data.arrayBuffer().then(toArray).then(callback);\n    }\n    else if (withNativeArrayBuffer &&\n        (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n        return callback(toArray(packet.data));\n    }\n    encodePacket(packet, false, (encoded) => {\n        if (!TEXT_ENCODER) {\n            TEXT_ENCODER = new TextEncoder();\n        }\n        callback(TEXT_ENCODER.encode(encoded));\n    });\n}\nexport { encodePacket };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n    let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n    for (i = 0; i < len; i += 3) {\n        base64 += chars[bytes[i] >> 2];\n        base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n        base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n        base64 += chars[bytes[i + 2] & 63];\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + '=';\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + '==';\n    }\n    return base64;\n};\nexport const decode = (base64) => {\n    let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup[base64.charCodeAt(i)];\n        encoded2 = lookup[base64.charCodeAt(i + 1)];\n        encoded3 = lookup[base64.charCodeAt(i + 2)];\n        encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE, } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n    if (typeof encodedPacket !== \"string\") {\n        return {\n            type: \"message\",\n            data: mapBinary(encodedPacket, binaryType),\n        };\n    }\n    const type = encodedPacket.charAt(0);\n    if (type === \"b\") {\n        return {\n            type: \"message\",\n            data: decodeBase64Packet(encodedPacket.substring(1), binaryType),\n        };\n    }\n    const packetType = PACKET_TYPES_REVERSE[type];\n    if (!packetType) {\n        return ERROR_PACKET;\n    }\n    return encodedPacket.length > 1\n        ? {\n            type: PACKET_TYPES_REVERSE[type],\n            data: encodedPacket.substring(1),\n        }\n        : {\n            type: PACKET_TYPES_REVERSE[type],\n        };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n    if (withNativeArrayBuffer) {\n        const decoded = decode(data);\n        return mapBinary(decoded, binaryType);\n    }\n    else {\n        return { base64: true, data }; // fallback for old browsers\n    }\n};\nconst mapBinary = (data, binaryType) => {\n    switch (binaryType) {\n        case \"blob\":\n            if (data instanceof Blob) {\n                // from WebSocket + binaryType \"blob\"\n                return data;\n            }\n            else {\n                // from HTTP long-polling or WebTransport\n                return new Blob([data]);\n            }\n        case \"arraybuffer\":\n        default:\n            if (data instanceof ArrayBuffer) {\n                // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n                return data;\n            }\n            else {\n                // from WebTransport (Uint8Array)\n                return data.buffer;\n            }\n    }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET, } from \"./commons.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n    // some packets may be added to the array while encoding, so the initial length must be saved\n    const length = packets.length;\n    const encodedPackets = new Array(length);\n    let count = 0;\n    packets.forEach((packet, i) => {\n        // force base64 encoding for binary packets\n        encodePacket(packet, false, (encodedPacket) => {\n            encodedPackets[i] = encodedPacket;\n            if (++count === length) {\n                callback(encodedPackets.join(SEPARATOR));\n            }\n        });\n    });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n    const encodedPackets = encodedPayload.split(SEPARATOR);\n    const packets = [];\n    for (let i = 0; i < encodedPackets.length; i++) {\n        const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n        packets.push(decodedPacket);\n        if (decodedPacket.type === \"error\") {\n            break;\n        }\n    }\n    return packets;\n};\nexport function createPacketEncoderStream() {\n    return new TransformStream({\n        transform(packet, controller) {\n            encodePacketToBinary(packet, (encodedPacket) => {\n                const payloadLength = encodedPacket.length;\n                let header;\n                // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n                if (payloadLength < 126) {\n                    header = new Uint8Array(1);\n                    new DataView(header.buffer).setUint8(0, payloadLength);\n                }\n                else if (payloadLength < 65536) {\n                    header = new Uint8Array(3);\n                    const view = new DataView(header.buffer);\n                    view.setUint8(0, 126);\n                    view.setUint16(1, payloadLength);\n                }\n                else {\n                    header = new Uint8Array(9);\n                    const view = new DataView(header.buffer);\n                    view.setUint8(0, 127);\n                    view.setBigUint64(1, BigInt(payloadLength));\n                }\n                // first bit indicates whether the payload is plain text (0) or binary (1)\n                if (packet.data && typeof packet.data !== \"string\") {\n                    header[0] |= 0x80;\n                }\n                controller.enqueue(header);\n                controller.enqueue(encodedPacket);\n            });\n        },\n    });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n    return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n    if (chunks[0].length === size) {\n        return chunks.shift();\n    }\n    const buffer = new Uint8Array(size);\n    let j = 0;\n    for (let i = 0; i < size; i++) {\n        buffer[i] = chunks[0][j++];\n        if (j === chunks[0].length) {\n            chunks.shift();\n            j = 0;\n        }\n    }\n    if (chunks.length && j < chunks[0].length) {\n        chunks[0] = chunks[0].slice(j);\n    }\n    return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n    if (!TEXT_DECODER) {\n        TEXT_DECODER = new TextDecoder();\n    }\n    const chunks = [];\n    let state = 0 /* State.READ_HEADER */;\n    let expectedLength = -1;\n    let isBinary = false;\n    return new TransformStream({\n        transform(chunk, controller) {\n            chunks.push(chunk);\n            while (true) {\n                if (state === 0 /* State.READ_HEADER */) {\n                    if (totalLength(chunks) < 1) {\n                        break;\n                    }\n                    const header = concatChunks(chunks, 1);\n                    isBinary = (header[0] & 0x80) === 0x80;\n                    expectedLength = header[0] & 0x7f;\n                    if (expectedLength < 126) {\n                        state = 3 /* State.READ_PAYLOAD */;\n                    }\n                    else if (expectedLength === 126) {\n                        state = 1 /* State.READ_EXTENDED_LENGTH_16 */;\n                    }\n                    else {\n                        state = 2 /* State.READ_EXTENDED_LENGTH_64 */;\n                    }\n                }\n                else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {\n                    if (totalLength(chunks) < 2) {\n                        break;\n                    }\n                    const headerArray = concatChunks(chunks, 2);\n                    expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n                    state = 3 /* State.READ_PAYLOAD */;\n                }\n                else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {\n                    if (totalLength(chunks) < 8) {\n                        break;\n                    }\n                    const headerArray = concatChunks(chunks, 8);\n                    const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n                    const n = view.getUint32(0);\n                    if (n > Math.pow(2, 53 - 32) - 1) {\n                        // the maximum safe integer in JavaScript is 2^53 - 1\n                        controller.enqueue(ERROR_PACKET);\n                        break;\n                    }\n                    expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n                    state = 3 /* State.READ_PAYLOAD */;\n                }\n                else {\n                    if (totalLength(chunks) < expectedLength) {\n                        break;\n                    }\n                    const data = concatChunks(chunks, expectedLength);\n                    controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n                    state = 0 /* State.READ_HEADER */;\n                }\n                if (expectedLength === 0 || expectedLength > maxPayload) {\n                    controller.enqueue(ERROR_PACKET);\n                    break;\n                }\n            }\n        },\n    });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload, };\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n  if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n\n  // Remove event specific arrays for event types that no\n  // one is subscribed for to avoid memory leak.\n  if (callbacks.length === 0) {\n    delete this._callbacks['$' + event];\n  }\n\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n\n  var args = new Array(arguments.length - 1)\n    , callbacks = this._callbacks['$' + event];\n\n  for (var i = 1; i < arguments.length; i++) {\n    args[i - 1] = arguments[i];\n  }\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n","export const nextTick = (() => {\n    const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n    if (isPromiseAvailable) {\n        return (cb) => Promise.resolve().then(cb);\n    }\n    else {\n        return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n    }\n})();\nexport const globalThisShim = (() => {\n    if (typeof self !== \"undefined\") {\n        return self;\n    }\n    else if (typeof window !== \"undefined\") {\n        return window;\n    }\n    else {\n        return Function(\"return this\")();\n    }\n})();\nexport const defaultBinaryType = \"arraybuffer\";\nexport function createCookieJar() { }\n","import { globalThisShim as globalThis } from \"./globals.node.js\";\nexport function pick(obj, ...attr) {\n    return attr.reduce((acc, k) => {\n        if (obj.hasOwnProperty(k)) {\n            acc[k] = obj[k];\n        }\n        return acc;\n    }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n    if (opts.useNativeTimers) {\n        obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n        obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n    }\n    else {\n        obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n        obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n    }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n    if (typeof obj === \"string\") {\n        return utf8Length(obj);\n    }\n    // arraybuffer or blob\n    return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n    let c = 0, length = 0;\n    for (let i = 0, l = str.length; i < l; i++) {\n        c = str.charCodeAt(i);\n        if (c < 0x80) {\n            length += 1;\n        }\n        else if (c < 0x800) {\n            length += 2;\n        }\n        else if (c < 0xd800 || c >= 0xe000) {\n            length += 3;\n        }\n        else {\n            i++;\n            length += 4;\n        }\n    }\n    return length;\n}\n/**\n * Generates a random 8-characters string.\n */\nexport function randomString() {\n    return (Date.now().toString(36).substring(3) +\n        Math.random().toString(36).substring(2, 5));\n}\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n    let str = '';\n    for (let i in obj) {\n        if (obj.hasOwnProperty(i)) {\n            if (str.length)\n                str += '&';\n            str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n        }\n    }\n    return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n    let qry = {};\n    let pairs = qs.split('&');\n    for (let i = 0, l = pairs.length; i < l; i++) {\n        let pair = pairs[i].split('=');\n        qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n    }\n    return qry;\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nexport class TransportError extends Error {\n    constructor(reason, description, context) {\n        super(reason);\n        this.description = description;\n        this.context = context;\n        this.type = \"TransportError\";\n    }\n}\nexport class Transport extends Emitter {\n    /**\n     * Transport abstract constructor.\n     *\n     * @param {Object} opts - options\n     * @protected\n     */\n    constructor(opts) {\n        super();\n        this.writable = false;\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.query = opts.query;\n        this.socket = opts.socket;\n        this.supportsBinary = !opts.forceBase64;\n    }\n    /**\n     * Emits an error.\n     *\n     * @param {String} reason\n     * @param description\n     * @param context - the error context\n     * @return {Transport} for chaining\n     * @protected\n     */\n    onError(reason, description, context) {\n        super.emitReserved(\"error\", new TransportError(reason, description, context));\n        return this;\n    }\n    /**\n     * Opens the transport.\n     */\n    open() {\n        this.readyState = \"opening\";\n        this.doOpen();\n        return this;\n    }\n    /**\n     * Closes the transport.\n     */\n    close() {\n        if (this.readyState === \"opening\" || this.readyState === \"open\") {\n            this.doClose();\n            this.onClose();\n        }\n        return this;\n    }\n    /**\n     * Sends multiple packets.\n     *\n     * @param {Array} packets\n     */\n    send(packets) {\n        if (this.readyState === \"open\") {\n            this.write(packets);\n        }\n        else {\n            // this might happen if the transport was silently closed in the beforeunload event handler\n        }\n    }\n    /**\n     * Called upon open\n     *\n     * @protected\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        this.writable = true;\n        super.emitReserved(\"open\");\n    }\n    /**\n     * Called with data.\n     *\n     * @param {String} data\n     * @protected\n     */\n    onData(data) {\n        const packet = decodePacket(data, this.socket.binaryType);\n        this.onPacket(packet);\n    }\n    /**\n     * Called with a decoded packet.\n     *\n     * @protected\n     */\n    onPacket(packet) {\n        super.emitReserved(\"packet\", packet);\n    }\n    /**\n     * Called upon close.\n     *\n     * @protected\n     */\n    onClose(details) {\n        this.readyState = \"closed\";\n        super.emitReserved(\"close\", details);\n    }\n    /**\n     * Pauses the transport, in order not to lose packets during an upgrade.\n     *\n     * @param onPause\n     */\n    pause(onPause) { }\n    createUri(schema, query = {}) {\n        return (schema +\n            \"://\" +\n            this._hostname() +\n            this._port() +\n            this.opts.path +\n            this._query(query));\n    }\n    _hostname() {\n        const hostname = this.opts.hostname;\n        return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n    }\n    _port() {\n        if (this.opts.port &&\n            ((this.opts.secure && Number(this.opts.port !== 443)) ||\n                (!this.opts.secure && Number(this.opts.port) !== 80))) {\n            return \":\" + this.opts.port;\n        }\n        else {\n            return \"\";\n        }\n    }\n    _query(query) {\n        const encodedQuery = encode(query);\n        return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n    }\n}\n","import { Transport } from \"../transport.js\";\nimport { randomString } from \"../util.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n    constructor() {\n        super(...arguments);\n        this._polling = false;\n    }\n    get name() {\n        return \"polling\";\n    }\n    /**\n     * Opens the socket (triggers polling). We write a PING message to determine\n     * when the transport is open.\n     *\n     * @protected\n     */\n    doOpen() {\n        this._poll();\n    }\n    /**\n     * Pauses polling.\n     *\n     * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n     * @package\n     */\n    pause(onPause) {\n        this.readyState = \"pausing\";\n        const pause = () => {\n            this.readyState = \"paused\";\n            onPause();\n        };\n        if (this._polling || !this.writable) {\n            let total = 0;\n            if (this._polling) {\n                total++;\n                this.once(\"pollComplete\", function () {\n                    --total || pause();\n                });\n            }\n            if (!this.writable) {\n                total++;\n                this.once(\"drain\", function () {\n                    --total || pause();\n                });\n            }\n        }\n        else {\n            pause();\n        }\n    }\n    /**\n     * Starts polling cycle.\n     *\n     * @private\n     */\n    _poll() {\n        this._polling = true;\n        this.doPoll();\n        this.emitReserved(\"poll\");\n    }\n    /**\n     * Overloads onData to detect payloads.\n     *\n     * @protected\n     */\n    onData(data) {\n        const callback = (packet) => {\n            // if its the first message we consider the transport open\n            if (\"opening\" === this.readyState && packet.type === \"open\") {\n                this.onOpen();\n            }\n            // if its a close packet, we close the ongoing requests\n            if (\"close\" === packet.type) {\n                this.onClose({ description: \"transport closed by the server\" });\n                return false;\n            }\n            // otherwise bypass onData and handle the message\n            this.onPacket(packet);\n        };\n        // decode payload\n        decodePayload(data, this.socket.binaryType).forEach(callback);\n        // if an event did not trigger closing\n        if (\"closed\" !== this.readyState) {\n            // if we got data we're not polling\n            this._polling = false;\n            this.emitReserved(\"pollComplete\");\n            if (\"open\" === this.readyState) {\n                this._poll();\n            }\n            else {\n            }\n        }\n    }\n    /**\n     * For polling, send a close packet.\n     *\n     * @protected\n     */\n    doClose() {\n        const close = () => {\n            this.write([{ type: \"close\" }]);\n        };\n        if (\"open\" === this.readyState) {\n            close();\n        }\n        else {\n            // in case we're trying to close while\n            // handshaking is in progress (GH-164)\n            this.once(\"open\", close);\n        }\n    }\n    /**\n     * Writes a packets payload.\n     *\n     * @param {Array} packets - data packets\n     * @protected\n     */\n    write(packets) {\n        this.writable = false;\n        encodePayload(packets, (data) => {\n            this.doWrite(data, () => {\n                this.writable = true;\n                this.emitReserved(\"drain\");\n            });\n        });\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @private\n     */\n    uri() {\n        const schema = this.opts.secure ? \"https\" : \"http\";\n        const query = this.query || {};\n        // cache busting is forced\n        if (false !== this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = randomString();\n        }\n        if (!this.supportsBinary && !query.sid) {\n            query.b64 = 1;\n        }\n        return this.createUri(schema, query);\n    }\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n    value = typeof XMLHttpRequest !== 'undefined' &&\n        'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n    // if XMLHttp support is disabled in IE then it will throw\n    // when trying to create\n}\nexport const hasCORS = value;\n","import { Polling } from \"./polling.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globals.node.js\";\nimport { hasCORS } from \"../contrib/has-cors.js\";\nfunction empty() { }\nexport class BaseXHR extends Polling {\n    /**\n     * XHR Polling constructor.\n     *\n     * @param {Object} opts\n     * @package\n     */\n    constructor(opts) {\n        super(opts);\n        if (typeof location !== \"undefined\") {\n            const isSSL = \"https:\" === location.protocol;\n            let port = location.port;\n            // some user agents have empty `location.port`\n            if (!port) {\n                port = isSSL ? \"443\" : \"80\";\n            }\n            this.xd =\n                (typeof location !== \"undefined\" &&\n                    opts.hostname !== location.hostname) ||\n                    port !== opts.port;\n        }\n    }\n    /**\n     * Sends data.\n     *\n     * @param {String} data to send.\n     * @param {Function} called upon flush.\n     * @private\n     */\n    doWrite(data, fn) {\n        const req = this.request({\n            method: \"POST\",\n            data: data,\n        });\n        req.on(\"success\", fn);\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr post error\", xhrStatus, context);\n        });\n    }\n    /**\n     * Starts a poll cycle.\n     *\n     * @private\n     */\n    doPoll() {\n        const req = this.request();\n        req.on(\"data\", this.onData.bind(this));\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr poll error\", xhrStatus, context);\n        });\n        this.pollXhr = req;\n    }\n}\nexport class Request extends Emitter {\n    /**\n     * Request constructor\n     *\n     * @param {Object} options\n     * @package\n     */\n    constructor(createRequest, uri, opts) {\n        super();\n        this.createRequest = createRequest;\n        installTimerFunctions(this, opts);\n        this._opts = opts;\n        this._method = opts.method || \"GET\";\n        this._uri = uri;\n        this._data = undefined !== opts.data ? opts.data : null;\n        this._create();\n    }\n    /**\n     * Creates the XHR object and sends the request.\n     *\n     * @private\n     */\n    _create() {\n        var _a;\n        const opts = pick(this._opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n        opts.xdomain = !!this._opts.xd;\n        const xhr = (this._xhr = this.createRequest(opts));\n        try {\n            xhr.open(this._method, this._uri, true);\n            try {\n                if (this._opts.extraHeaders) {\n                    // @ts-ignore\n                    xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n                    for (let i in this._opts.extraHeaders) {\n                        if (this._opts.extraHeaders.hasOwnProperty(i)) {\n                            xhr.setRequestHeader(i, this._opts.extraHeaders[i]);\n                        }\n                    }\n                }\n            }\n            catch (e) { }\n            if (\"POST\" === this._method) {\n                try {\n                    xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n                }\n                catch (e) { }\n            }\n            try {\n                xhr.setRequestHeader(\"Accept\", \"*/*\");\n            }\n            catch (e) { }\n            (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n            // ie6 check\n            if (\"withCredentials\" in xhr) {\n                xhr.withCredentials = this._opts.withCredentials;\n            }\n            if (this._opts.requestTimeout) {\n                xhr.timeout = this._opts.requestTimeout;\n            }\n            xhr.onreadystatechange = () => {\n                var _a;\n                if (xhr.readyState === 3) {\n                    (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(\n                    // @ts-ignore\n                    xhr.getResponseHeader(\"set-cookie\"));\n                }\n                if (4 !== xhr.readyState)\n                    return;\n                if (200 === xhr.status || 1223 === xhr.status) {\n                    this._onLoad();\n                }\n                else {\n                    // make sure the `error` event handler that's user-set\n                    // does not throw in the same tick and gets caught here\n                    this.setTimeoutFn(() => {\n                        this._onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n                    }, 0);\n                }\n            };\n            xhr.send(this._data);\n        }\n        catch (e) {\n            // Need to defer since .create() is called directly from the constructor\n            // and thus the 'error' event can only be only bound *after* this exception\n            // occurs.  Therefore, also, we cannot throw here at all.\n            this.setTimeoutFn(() => {\n                this._onError(e);\n            }, 0);\n            return;\n        }\n        if (typeof document !== \"undefined\") {\n            this._index = Request.requestsCount++;\n            Request.requests[this._index] = this;\n        }\n    }\n    /**\n     * Called upon error.\n     *\n     * @private\n     */\n    _onError(err) {\n        this.emitReserved(\"error\", err, this._xhr);\n        this._cleanup(true);\n    }\n    /**\n     * Cleans up house.\n     *\n     * @private\n     */\n    _cleanup(fromError) {\n        if (\"undefined\" === typeof this._xhr || null === this._xhr) {\n            return;\n        }\n        this._xhr.onreadystatechange = empty;\n        if (fromError) {\n            try {\n                this._xhr.abort();\n            }\n            catch (e) { }\n        }\n        if (typeof document !== \"undefined\") {\n            delete Request.requests[this._index];\n        }\n        this._xhr = null;\n    }\n    /**\n     * Called upon load.\n     *\n     * @private\n     */\n    _onLoad() {\n        const data = this._xhr.responseText;\n        if (data !== null) {\n            this.emitReserved(\"data\", data);\n            this.emitReserved(\"success\");\n            this._cleanup();\n        }\n    }\n    /**\n     * Aborts the request.\n     *\n     * @package\n     */\n    abort() {\n        this._cleanup();\n    }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n    // @ts-ignore\n    if (typeof attachEvent === \"function\") {\n        // @ts-ignore\n        attachEvent(\"onunload\", unloadHandler);\n    }\n    else if (typeof addEventListener === \"function\") {\n        const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n        addEventListener(terminationEvent, unloadHandler, false);\n    }\n}\nfunction unloadHandler() {\n    for (let i in Request.requests) {\n        if (Request.requests.hasOwnProperty(i)) {\n            Request.requests[i].abort();\n        }\n    }\n}\nconst hasXHR2 = (function () {\n    const xhr = newRequest({\n        xdomain: false,\n    });\n    return xhr && xhr.responseType !== null;\n})();\n/**\n * HTTP long-polling based on the built-in `XMLHttpRequest` object.\n *\n * Usage: browser\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n */\nexport class XHR extends BaseXHR {\n    constructor(opts) {\n        super(opts);\n        const forceBase64 = opts && opts.forceBase64;\n        this.supportsBinary = hasXHR2 && !forceBase64;\n    }\n    request(opts = {}) {\n        Object.assign(opts, { xd: this.xd }, this.opts);\n        return new Request(newRequest, this.uri(), opts);\n    }\n}\nfunction newRequest(opts) {\n    const xdomain = opts.xdomain;\n    // XMLHttpRequest can be disabled on IE\n    try {\n        if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n            return new XMLHttpRequest();\n        }\n    }\n    catch (e) { }\n    if (!xdomain) {\n        try {\n            return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n        }\n        catch (e) { }\n    }\n}\n","import { Transport } from \"../transport.js\";\nimport { pick, randomString } from \"../util.js\";\nimport { encodePacket } from \"engine.io-parser\";\nimport { globalThisShim as globalThis, nextTick } from \"../globals.node.js\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n    typeof navigator.product === \"string\" &&\n    navigator.product.toLowerCase() === \"reactnative\";\nexport class BaseWS extends Transport {\n    get name() {\n        return \"websocket\";\n    }\n    doOpen() {\n        const uri = this.uri();\n        const protocols = this.opts.protocols;\n        // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n        const opts = isReactNative\n            ? {}\n            : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n        if (this.opts.extraHeaders) {\n            opts.headers = this.opts.extraHeaders;\n        }\n        try {\n            this.ws = this.createSocket(uri, protocols, opts);\n        }\n        catch (err) {\n            return this.emitReserved(\"error\", err);\n        }\n        this.ws.binaryType = this.socket.binaryType;\n        this.addEventListeners();\n    }\n    /**\n     * Adds event listeners to the socket\n     *\n     * @private\n     */\n    addEventListeners() {\n        this.ws.onopen = () => {\n            if (this.opts.autoUnref) {\n                this.ws._socket.unref();\n            }\n            this.onOpen();\n        };\n        this.ws.onclose = (closeEvent) => this.onClose({\n            description: \"websocket connection closed\",\n            context: closeEvent,\n        });\n        this.ws.onmessage = (ev) => this.onData(ev.data);\n        this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n    }\n    write(packets) {\n        this.writable = false;\n        // encodePacket efficient as it uses WS framing\n        // no need for encodePayload\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            encodePacket(packet, this.supportsBinary, (data) => {\n                // Sometimes the websocket has already been closed but the browser didn't\n                // have a chance of informing us about it yet, in that case send will\n                // throw an error\n                try {\n                    this.doWrite(packet, data);\n                }\n                catch (e) {\n                }\n                if (lastPacket) {\n                    // fake drain\n                    // defer to next tick to allow Socket to clear writeBuffer\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emitReserved(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    doClose() {\n        if (typeof this.ws !== \"undefined\") {\n            this.ws.onerror = () => { };\n            this.ws.close();\n            this.ws = null;\n        }\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @private\n     */\n    uri() {\n        const schema = this.opts.secure ? \"wss\" : \"ws\";\n        const query = this.query || {};\n        // append timestamp to URI\n        if (this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = randomString();\n        }\n        // communicate binary support capabilities\n        if (!this.supportsBinary) {\n            query.b64 = 1;\n        }\n        return this.createUri(schema, query);\n    }\n}\nconst WebSocketCtor = globalThis.WebSocket || globalThis.MozWebSocket;\n/**\n * WebSocket transport based on the built-in `WebSocket` object.\n *\n * Usage: browser, Node.js (since v21), Deno, Bun\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @see https://caniuse.com/mdn-api_websocket\n * @see https://nodejs.org/api/globals.html#websocket\n */\nexport class WS extends BaseWS {\n    createSocket(uri, protocols, opts) {\n        return !isReactNative\n            ? protocols\n                ? new WebSocketCtor(uri, protocols)\n                : new WebSocketCtor(uri)\n            : new WebSocketCtor(uri, protocols, opts);\n    }\n    doWrite(_packet, data) {\n        this.ws.send(data);\n    }\n}\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"../globals.node.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\n/**\n * WebTransport transport based on the built-in `WebTransport` object.\n *\n * Usage: browser, Node.js (with the `@fails-components/webtransport` package)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport\n * @see https://caniuse.com/webtransport\n */\nexport class WT extends Transport {\n    get name() {\n        return \"webtransport\";\n    }\n    doOpen() {\n        try {\n            // @ts-ignore\n            this._transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n        }\n        catch (err) {\n            return this.emitReserved(\"error\", err);\n        }\n        this._transport.closed\n            .then(() => {\n            this.onClose();\n        })\n            .catch((err) => {\n            this.onError(\"webtransport error\", err);\n        });\n        // note: we could have used async/await, but that would require some additional polyfills\n        this._transport.ready.then(() => {\n            this._transport.createBidirectionalStream().then((stream) => {\n                const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n                const reader = stream.readable.pipeThrough(decoderStream).getReader();\n                const encoderStream = createPacketEncoderStream();\n                encoderStream.readable.pipeTo(stream.writable);\n                this._writer = encoderStream.writable.getWriter();\n                const read = () => {\n                    reader\n                        .read()\n                        .then(({ done, value }) => {\n                        if (done) {\n                            return;\n                        }\n                        this.onPacket(value);\n                        read();\n                    })\n                        .catch((err) => {\n                    });\n                };\n                read();\n                const packet = { type: \"open\" };\n                if (this.query.sid) {\n                    packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n                }\n                this._writer.write(packet).then(() => this.onOpen());\n            });\n        });\n    }\n    write(packets) {\n        this.writable = false;\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            this._writer.write(packet).then(() => {\n                if (lastPacket) {\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emitReserved(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    doClose() {\n        var _a;\n        (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();\n    }\n}\n","import { XHR } from \"./polling-xhr.node.js\";\nimport { WS } from \"./websocket.node.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n    websocket: WS,\n    webtransport: WT,\n    polling: XHR,\n};\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n    if (str.length > 8000) {\n        throw \"URI too long\";\n    }\n    const src = str, b = str.indexOf('['), e = str.indexOf(']');\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n    let m = re.exec(str || ''), uri = {}, i = 14;\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n    uri.pathNames = pathNames(uri, uri['path']);\n    uri.queryKey = queryKey(uri, uri['query']);\n    return uri;\n}\nfunction pathNames(obj, path) {\n    const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n    if (path.slice(0, 1) == '/' || path.length === 0) {\n        names.splice(0, 1);\n    }\n    if (path.slice(-1) == '/') {\n        names.splice(names.length - 1, 1);\n    }\n    return names;\n}\nfunction queryKey(uri, query) {\n    const data = {};\n    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n        if ($1) {\n            data[$1] = $2;\n        }\n    });\n    return data;\n}\n","import { transports as DEFAULT_TRANSPORTS } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nimport { createCookieJar, defaultBinaryType, nextTick, } from \"./globals.node.js\";\nconst withEventListeners = typeof addEventListener === \"function\" &&\n    typeof removeEventListener === \"function\";\nconst OFFLINE_EVENT_LISTENERS = [];\nif (withEventListeners) {\n    // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the\n    // script, so we create one single event listener here which will forward the event to the socket instances\n    addEventListener(\"offline\", () => {\n        OFFLINE_EVENT_LISTENERS.forEach((listener) => listener());\n    }, false);\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that\n * successfully establishes the connection.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithoutUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithoutUpgrade({\n *   transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithUpgrade\n * @see Socket\n */\nexport class SocketWithoutUpgrade extends Emitter {\n    /**\n     * Socket constructor.\n     *\n     * @param {String|Object} uri - uri or options\n     * @param {Object} opts - options\n     */\n    constructor(uri, opts) {\n        super();\n        this.binaryType = defaultBinaryType;\n        this.writeBuffer = [];\n        this._prevBufferLen = 0;\n        this._pingInterval = -1;\n        this._pingTimeout = -1;\n        this._maxPayload = -1;\n        /**\n         * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the\n         * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.\n         */\n        this._pingTimeoutTime = Infinity;\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = null;\n        }\n        if (uri) {\n            const parsedUri = parse(uri);\n            opts.hostname = parsedUri.host;\n            opts.secure =\n                parsedUri.protocol === \"https\" || parsedUri.protocol === \"wss\";\n            opts.port = parsedUri.port;\n            if (parsedUri.query)\n                opts.query = parsedUri.query;\n        }\n        else if (opts.host) {\n            opts.hostname = parse(opts.host).host;\n        }\n        installTimerFunctions(this, opts);\n        this.secure =\n            null != opts.secure\n                ? opts.secure\n                : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n        if (opts.hostname && !opts.port) {\n            // if no port is specified manually, use the protocol default\n            opts.port = this.secure ? \"443\" : \"80\";\n        }\n        this.hostname =\n            opts.hostname ||\n                (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n        this.port =\n            opts.port ||\n                (typeof location !== \"undefined\" && location.port\n                    ? location.port\n                    : this.secure\n                        ? \"443\"\n                        : \"80\");\n        this.transports = [];\n        this._transportsByName = {};\n        opts.transports.forEach((t) => {\n            const transportName = t.prototype.name;\n            this.transports.push(transportName);\n            this._transportsByName[transportName] = t;\n        });\n        this.opts = Object.assign({\n            path: \"/engine.io\",\n            agent: false,\n            withCredentials: false,\n            upgrade: true,\n            timestampParam: \"t\",\n            rememberUpgrade: false,\n            addTrailingSlash: true,\n            rejectUnauthorized: true,\n            perMessageDeflate: {\n                threshold: 1024,\n            },\n            transportOptions: {},\n            closeOnBeforeunload: false,\n        }, opts);\n        this.opts.path =\n            this.opts.path.replace(/\\/$/, \"\") +\n                (this.opts.addTrailingSlash ? \"/\" : \"\");\n        if (typeof this.opts.query === \"string\") {\n            this.opts.query = decode(this.opts.query);\n        }\n        if (withEventListeners) {\n            if (this.opts.closeOnBeforeunload) {\n                // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n                // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n                // closed/reloaded)\n                this._beforeunloadEventListener = () => {\n                    if (this.transport) {\n                        // silently close the transport\n                        this.transport.removeAllListeners();\n                        this.transport.close();\n                    }\n                };\n                addEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n            }\n            if (this.hostname !== \"localhost\") {\n                this._offlineEventListener = () => {\n                    this._onClose(\"transport close\", {\n                        description: \"network connection lost\",\n                    });\n                };\n                OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener);\n            }\n        }\n        if (this.opts.withCredentials) {\n            this._cookieJar = createCookieJar();\n        }\n        this._open();\n    }\n    /**\n     * Creates transport of the given type.\n     *\n     * @param {String} name - transport name\n     * @return {Transport}\n     * @private\n     */\n    createTransport(name) {\n        const query = Object.assign({}, this.opts.query);\n        // append engine.io protocol identifier\n        query.EIO = protocol;\n        // transport name\n        query.transport = name;\n        // session id if we already have one\n        if (this.id)\n            query.sid = this.id;\n        const opts = Object.assign({}, this.opts, {\n            query,\n            socket: this,\n            hostname: this.hostname,\n            secure: this.secure,\n            port: this.port,\n        }, this.opts.transportOptions[name]);\n        return new this._transportsByName[name](opts);\n    }\n    /**\n     * Initializes transport to use and starts probe.\n     *\n     * @private\n     */\n    _open() {\n        if (this.transports.length === 0) {\n            // Emit error on next tick so it can be listened to\n            this.setTimeoutFn(() => {\n                this.emitReserved(\"error\", \"No transports available\");\n            }, 0);\n            return;\n        }\n        const transportName = this.opts.rememberUpgrade &&\n            SocketWithoutUpgrade.priorWebsocketSuccess &&\n            this.transports.indexOf(\"websocket\") !== -1\n            ? \"websocket\"\n            : this.transports[0];\n        this.readyState = \"opening\";\n        const transport = this.createTransport(transportName);\n        transport.open();\n        this.setTransport(transport);\n    }\n    /**\n     * Sets the current transport. Disables the existing one (if any).\n     *\n     * @private\n     */\n    setTransport(transport) {\n        if (this.transport) {\n            this.transport.removeAllListeners();\n        }\n        // set up transport\n        this.transport = transport;\n        // set up transport listeners\n        transport\n            .on(\"drain\", this._onDrain.bind(this))\n            .on(\"packet\", this._onPacket.bind(this))\n            .on(\"error\", this._onError.bind(this))\n            .on(\"close\", (reason) => this._onClose(\"transport close\", reason));\n    }\n    /**\n     * Called when connection is deemed open.\n     *\n     * @private\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        SocketWithoutUpgrade.priorWebsocketSuccess =\n            \"websocket\" === this.transport.name;\n        this.emitReserved(\"open\");\n        this.flush();\n    }\n    /**\n     * Handles a packet.\n     *\n     * @private\n     */\n    _onPacket(packet) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            this.emitReserved(\"packet\", packet);\n            // Socket is live - any packet counts\n            this.emitReserved(\"heartbeat\");\n            switch (packet.type) {\n                case \"open\":\n                    this.onHandshake(JSON.parse(packet.data));\n                    break;\n                case \"ping\":\n                    this._sendPacket(\"pong\");\n                    this.emitReserved(\"ping\");\n                    this.emitReserved(\"pong\");\n                    this._resetPingTimeout();\n                    break;\n                case \"error\":\n                    const err = new Error(\"server error\");\n                    // @ts-ignore\n                    err.code = packet.data;\n                    this._onError(err);\n                    break;\n                case \"message\":\n                    this.emitReserved(\"data\", packet.data);\n                    this.emitReserved(\"message\", packet.data);\n                    break;\n            }\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon handshake completion.\n     *\n     * @param {Object} data - handshake obj\n     * @private\n     */\n    onHandshake(data) {\n        this.emitReserved(\"handshake\", data);\n        this.id = data.sid;\n        this.transport.query.sid = data.sid;\n        this._pingInterval = data.pingInterval;\n        this._pingTimeout = data.pingTimeout;\n        this._maxPayload = data.maxPayload;\n        this.onOpen();\n        // In case open handler closes socket\n        if (\"closed\" === this.readyState)\n            return;\n        this._resetPingTimeout();\n    }\n    /**\n     * Sets and resets ping timeout timer based on server pings.\n     *\n     * @private\n     */\n    _resetPingTimeout() {\n        this.clearTimeoutFn(this._pingTimeoutTimer);\n        const delay = this._pingInterval + this._pingTimeout;\n        this._pingTimeoutTime = Date.now() + delay;\n        this._pingTimeoutTimer = this.setTimeoutFn(() => {\n            this._onClose(\"ping timeout\");\n        }, delay);\n        if (this.opts.autoUnref) {\n            this._pingTimeoutTimer.unref();\n        }\n    }\n    /**\n     * Called on `drain` event\n     *\n     * @private\n     */\n    _onDrain() {\n        this.writeBuffer.splice(0, this._prevBufferLen);\n        // setting prevBufferLen = 0 is very important\n        // for example, when upgrading, upgrade packet is sent over,\n        // and a nonzero prevBufferLen could cause problems on `drain`\n        this._prevBufferLen = 0;\n        if (0 === this.writeBuffer.length) {\n            this.emitReserved(\"drain\");\n        }\n        else {\n            this.flush();\n        }\n    }\n    /**\n     * Flush write buffers.\n     *\n     * @private\n     */\n    flush() {\n        if (\"closed\" !== this.readyState &&\n            this.transport.writable &&\n            !this.upgrading &&\n            this.writeBuffer.length) {\n            const packets = this._getWritablePackets();\n            this.transport.send(packets);\n            // keep track of current length of writeBuffer\n            // splice writeBuffer and callbackBuffer on `drain`\n            this._prevBufferLen = packets.length;\n            this.emitReserved(\"flush\");\n        }\n    }\n    /**\n     * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n     * long-polling)\n     *\n     * @private\n     */\n    _getWritablePackets() {\n        const shouldCheckPayloadSize = this._maxPayload &&\n            this.transport.name === \"polling\" &&\n            this.writeBuffer.length > 1;\n        if (!shouldCheckPayloadSize) {\n            return this.writeBuffer;\n        }\n        let payloadSize = 1; // first packet type\n        for (let i = 0; i < this.writeBuffer.length; i++) {\n            const data = this.writeBuffer[i].data;\n            if (data) {\n                payloadSize += byteLength(data);\n            }\n            if (i > 0 && payloadSize > this._maxPayload) {\n                return this.writeBuffer.slice(0, i);\n            }\n            payloadSize += 2; // separator + packet type\n        }\n        return this.writeBuffer;\n    }\n    /**\n     * Checks whether the heartbeat timer has expired but the socket has not yet been notified.\n     *\n     * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the\n     * `write()` method then the message would not be buffered by the Socket.IO client.\n     *\n     * @return {boolean}\n     * @private\n     */\n    /* private */ _hasPingExpired() {\n        if (!this._pingTimeoutTime)\n            return true;\n        const hasExpired = Date.now() > this._pingTimeoutTime;\n        if (hasExpired) {\n            this._pingTimeoutTime = 0;\n            nextTick(() => {\n                this._onClose(\"ping timeout\");\n            }, this.setTimeoutFn);\n        }\n        return hasExpired;\n    }\n    /**\n     * Sends a message.\n     *\n     * @param {String} msg - message.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @return {Socket} for chaining.\n     */\n    write(msg, options, fn) {\n        this._sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a message. Alias of {@link Socket#write}.\n     *\n     * @param {String} msg - message.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @return {Socket} for chaining.\n     */\n    send(msg, options, fn) {\n        this._sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param {String} type: packet type.\n     * @param {String} data.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @private\n     */\n    _sendPacket(type, data, options, fn) {\n        if (\"function\" === typeof data) {\n            fn = data;\n            data = undefined;\n        }\n        if (\"function\" === typeof options) {\n            fn = options;\n            options = null;\n        }\n        if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n            return;\n        }\n        options = options || {};\n        options.compress = false !== options.compress;\n        const packet = {\n            type: type,\n            data: data,\n            options: options,\n        };\n        this.emitReserved(\"packetCreate\", packet);\n        this.writeBuffer.push(packet);\n        if (fn)\n            this.once(\"flush\", fn);\n        this.flush();\n    }\n    /**\n     * Closes the connection.\n     */\n    close() {\n        const close = () => {\n            this._onClose(\"forced close\");\n            this.transport.close();\n        };\n        const cleanupAndClose = () => {\n            this.off(\"upgrade\", cleanupAndClose);\n            this.off(\"upgradeError\", cleanupAndClose);\n            close();\n        };\n        const waitForUpgrade = () => {\n            // wait for upgrade to finish since we can't send packets while pausing a transport\n            this.once(\"upgrade\", cleanupAndClose);\n            this.once(\"upgradeError\", cleanupAndClose);\n        };\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.readyState = \"closing\";\n            if (this.writeBuffer.length) {\n                this.once(\"drain\", () => {\n                    if (this.upgrading) {\n                        waitForUpgrade();\n                    }\n                    else {\n                        close();\n                    }\n                });\n            }\n            else if (this.upgrading) {\n                waitForUpgrade();\n            }\n            else {\n                close();\n            }\n        }\n        return this;\n    }\n    /**\n     * Called upon transport error\n     *\n     * @private\n     */\n    _onError(err) {\n        SocketWithoutUpgrade.priorWebsocketSuccess = false;\n        if (this.opts.tryAllTransports &&\n            this.transports.length > 1 &&\n            this.readyState === \"opening\") {\n            this.transports.shift();\n            return this._open();\n        }\n        this.emitReserved(\"error\", err);\n        this._onClose(\"transport error\", err);\n    }\n    /**\n     * Called upon transport close.\n     *\n     * @private\n     */\n    _onClose(reason, description) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            // clear timers\n            this.clearTimeoutFn(this._pingTimeoutTimer);\n            // stop event from firing again for transport\n            this.transport.removeAllListeners(\"close\");\n            // ensure transport won't stay open\n            this.transport.close();\n            // ignore further transport communication\n            this.transport.removeAllListeners();\n            if (withEventListeners) {\n                if (this._beforeunloadEventListener) {\n                    removeEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n                }\n                if (this._offlineEventListener) {\n                    const i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);\n                    if (i !== -1) {\n                        OFFLINE_EVENT_LISTENERS.splice(i, 1);\n                    }\n                }\n            }\n            // set ready state\n            this.readyState = \"closed\";\n            // clear session id\n            this.id = null;\n            // emit close event\n            this.emitReserved(\"close\", reason, description);\n            // clean buffers after, so users can still\n            // grab the buffers on `close` event\n            this.writeBuffer = [];\n            this._prevBufferLen = 0;\n        }\n    }\n}\nSocketWithoutUpgrade.protocol = protocol;\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithUpgrade({\n *   transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see Socket\n */\nexport class SocketWithUpgrade extends SocketWithoutUpgrade {\n    constructor() {\n        super(...arguments);\n        this._upgrades = [];\n    }\n    onOpen() {\n        super.onOpen();\n        if (\"open\" === this.readyState && this.opts.upgrade) {\n            for (let i = 0; i < this._upgrades.length; i++) {\n                this._probe(this._upgrades[i]);\n            }\n        }\n    }\n    /**\n     * Probes a transport.\n     *\n     * @param {String} name - transport name\n     * @private\n     */\n    _probe(name) {\n        let transport = this.createTransport(name);\n        let failed = false;\n        SocketWithoutUpgrade.priorWebsocketSuccess = false;\n        const onTransportOpen = () => {\n            if (failed)\n                return;\n            transport.send([{ type: \"ping\", data: \"probe\" }]);\n            transport.once(\"packet\", (msg) => {\n                if (failed)\n                    return;\n                if (\"pong\" === msg.type && \"probe\" === msg.data) {\n                    this.upgrading = true;\n                    this.emitReserved(\"upgrading\", transport);\n                    if (!transport)\n                        return;\n                    SocketWithoutUpgrade.priorWebsocketSuccess =\n                        \"websocket\" === transport.name;\n                    this.transport.pause(() => {\n                        if (failed)\n                            return;\n                        if (\"closed\" === this.readyState)\n                            return;\n                        cleanup();\n                        this.setTransport(transport);\n                        transport.send([{ type: \"upgrade\" }]);\n                        this.emitReserved(\"upgrade\", transport);\n                        transport = null;\n                        this.upgrading = false;\n                        this.flush();\n                    });\n                }\n                else {\n                    const err = new Error(\"probe error\");\n                    // @ts-ignore\n                    err.transport = transport.name;\n                    this.emitReserved(\"upgradeError\", err);\n                }\n            });\n        };\n        function freezeTransport() {\n            if (failed)\n                return;\n            // Any callback called by transport should be ignored since now\n            failed = true;\n            cleanup();\n            transport.close();\n            transport = null;\n        }\n        // Handle any error that happens while probing\n        const onerror = (err) => {\n            const error = new Error(\"probe error: \" + err);\n            // @ts-ignore\n            error.transport = transport.name;\n            freezeTransport();\n            this.emitReserved(\"upgradeError\", error);\n        };\n        function onTransportClose() {\n            onerror(\"transport closed\");\n        }\n        // When the socket is closed while we're probing\n        function onclose() {\n            onerror(\"socket closed\");\n        }\n        // When the socket is upgraded while we're probing\n        function onupgrade(to) {\n            if (transport && to.name !== transport.name) {\n                freezeTransport();\n            }\n        }\n        // Remove all listeners on the transport and on self\n        const cleanup = () => {\n            transport.removeListener(\"open\", onTransportOpen);\n            transport.removeListener(\"error\", onerror);\n            transport.removeListener(\"close\", onTransportClose);\n            this.off(\"close\", onclose);\n            this.off(\"upgrading\", onupgrade);\n        };\n        transport.once(\"open\", onTransportOpen);\n        transport.once(\"error\", onerror);\n        transport.once(\"close\", onTransportClose);\n        this.once(\"close\", onclose);\n        this.once(\"upgrading\", onupgrade);\n        if (this._upgrades.indexOf(\"webtransport\") !== -1 &&\n            name !== \"webtransport\") {\n            // favor WebTransport\n            this.setTimeoutFn(() => {\n                if (!failed) {\n                    transport.open();\n                }\n            }, 200);\n        }\n        else {\n            transport.open();\n        }\n    }\n    onHandshake(data) {\n        this._upgrades = this._filterUpgrades(data.upgrades);\n        super.onHandshake(data);\n    }\n    /**\n     * Filters upgrades, returning only those matching client transports.\n     *\n     * @param {Array} upgrades - server upgrades\n     * @private\n     */\n    _filterUpgrades(upgrades) {\n        const filteredUpgrades = [];\n        for (let i = 0; i < upgrades.length; i++) {\n            if (~this.transports.indexOf(upgrades[i]))\n                filteredUpgrades.push(upgrades[i]);\n        }\n        return filteredUpgrades;\n    }\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * @example\n * import { Socket } from \"engine.io-client\";\n *\n * const socket = new Socket();\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see SocketWithUpgrade\n */\nexport class Socket extends SocketWithUpgrade {\n    constructor(uri, opts = {}) {\n        const o = typeof uri === \"object\" ? uri : opts;\n        if (!o.transports ||\n            (o.transports && typeof o.transports[0] === \"string\")) {\n            o.transports = (o.transports || [\"polling\", \"websocket\", \"webtransport\"])\n                .map((transportName) => DEFAULT_TRANSPORTS[transportName])\n                .filter((t) => !!t);\n        }\n        super(uri, o);\n    }\n}\n","import { Socket } from \"./socket.js\";\nexport { Socket };\nexport { SocketWithoutUpgrade, SocketWithUpgrade, } from \"./socket.js\";\nexport const protocol = Socket.protocol;\nexport { Transport, TransportError } from \"./transport.js\";\nexport { transports } from \"./transports/index.js\";\nexport { installTimerFunctions } from \"./util.js\";\nexport { parse } from \"./contrib/parseuri.js\";\nexport { nextTick } from \"./globals.node.js\";\nexport { Fetch } from \"./transports/polling-fetch.js\";\nexport { XHR as NodeXHR } from \"./transports/polling-xhr.node.js\";\nexport { XHR } from \"./transports/polling-xhr.js\";\nexport { WS as NodeWebSocket } from \"./transports/websocket.node.js\";\nexport { WS as WebSocket } from \"./transports/websocket.js\";\nexport { WT as WebTransport } from \"./transports/webtransport.js\";\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n *        Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n    let obj = uri;\n    // default to window.location\n    loc = loc || (typeof location !== \"undefined\" && location);\n    if (null == uri)\n        uri = loc.protocol + \"//\" + loc.host;\n    // relative path support\n    if (typeof uri === \"string\") {\n        if (\"/\" === uri.charAt(0)) {\n            if (\"/\" === uri.charAt(1)) {\n                uri = loc.protocol + uri;\n            }\n            else {\n                uri = loc.host + uri;\n            }\n        }\n        if (!/^(https?|wss?):\\/\\//.test(uri)) {\n            if (\"undefined\" !== typeof loc) {\n                uri = loc.protocol + \"//\" + uri;\n            }\n            else {\n                uri = \"https://\" + uri;\n            }\n        }\n        // parse\n        obj = parse(uri);\n    }\n    // make sure we treat `localhost:80` and `localhost` equally\n    if (!obj.port) {\n        if (/^(http|ws)$/.test(obj.protocol)) {\n            obj.port = \"80\";\n        }\n        else if (/^(http|ws)s$/.test(obj.protocol)) {\n            obj.port = \"443\";\n        }\n    }\n    obj.path = obj.path || \"/\";\n    const ipv6 = obj.host.indexOf(\":\") !== -1;\n    const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n    // define unique id\n    obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n    // define href\n    obj.href =\n        obj.protocol +\n            \"://\" +\n            host +\n            (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n    return obj;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n    \"connect\",\n    \"connect_error\",\n    \"disconnect\",\n    \"disconnecting\",\n    \"newListener\",\n    \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n    PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n    PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n    PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n    PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n    PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n    PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n    PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n    /**\n     * Encoder constructor\n     *\n     * @param {function} replacer - custom replacer to pass down to JSON.parse\n     */\n    constructor(replacer) {\n        this.replacer = replacer;\n    }\n    /**\n     * Encode a packet as a single string if non-binary, or as a\n     * buffer sequence, depending on packet type.\n     *\n     * @param {Object} obj - packet object\n     */\n    encode(obj) {\n        if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n            if (hasBinary(obj)) {\n                return this.encodeAsBinary({\n                    type: obj.type === PacketType.EVENT\n                        ? PacketType.BINARY_EVENT\n                        : PacketType.BINARY_ACK,\n                    nsp: obj.nsp,\n                    data: obj.data,\n                    id: obj.id,\n                });\n            }\n        }\n        return [this.encodeAsString(obj)];\n    }\n    /**\n     * Encode packet as string.\n     */\n    encodeAsString(obj) {\n        // first is type\n        let str = \"\" + obj.type;\n        // attachments if we have them\n        if (obj.type === PacketType.BINARY_EVENT ||\n            obj.type === PacketType.BINARY_ACK) {\n            str += obj.attachments + \"-\";\n        }\n        // if we have a namespace other than `/`\n        // we append it followed by a comma `,`\n        if (obj.nsp && \"/\" !== obj.nsp) {\n            str += obj.nsp + \",\";\n        }\n        // immediately followed by the id\n        if (null != obj.id) {\n            str += obj.id;\n        }\n        // json data\n        if (null != obj.data) {\n            str += JSON.stringify(obj.data, this.replacer);\n        }\n        return str;\n    }\n    /**\n     * Encode packet as 'buffer sequence' by removing blobs, and\n     * deconstructing packet into object with placeholders and\n     * a list of buffers.\n     */\n    encodeAsBinary(obj) {\n        const deconstruction = deconstructPacket(obj);\n        const pack = this.encodeAsString(deconstruction.packet);\n        const buffers = deconstruction.buffers;\n        buffers.unshift(pack); // add packet info to beginning of data list\n        return buffers; // write all the buffers\n    }\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n    return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n    /**\n     * Decoder constructor\n     *\n     * @param {function} reviver - custom reviver to pass down to JSON.stringify\n     */\n    constructor(reviver) {\n        super();\n        this.reviver = reviver;\n    }\n    /**\n     * Decodes an encoded packet string into packet JSON.\n     *\n     * @param {String} obj - encoded packet\n     */\n    add(obj) {\n        let packet;\n        if (typeof obj === \"string\") {\n            if (this.reconstructor) {\n                throw new Error(\"got plaintext data when reconstructing a packet\");\n            }\n            packet = this.decodeString(obj);\n            const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n            if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n                packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n                // binary packet's json\n                this.reconstructor = new BinaryReconstructor(packet);\n                // no attachments, labeled binary but no binary data to follow\n                if (packet.attachments === 0) {\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n            else {\n                // non-binary full packet\n                super.emitReserved(\"decoded\", packet);\n            }\n        }\n        else if (isBinary(obj) || obj.base64) {\n            // raw binary data\n            if (!this.reconstructor) {\n                throw new Error(\"got binary data when not reconstructing a packet\");\n            }\n            else {\n                packet = this.reconstructor.takeBinaryData(obj);\n                if (packet) {\n                    // received final buffer\n                    this.reconstructor = null;\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n        }\n        else {\n            throw new Error(\"Unknown type: \" + obj);\n        }\n    }\n    /**\n     * Decode a packet String (JSON data)\n     *\n     * @param {String} str\n     * @return {Object} packet\n     */\n    decodeString(str) {\n        let i = 0;\n        // look up type\n        const p = {\n            type: Number(str.charAt(0)),\n        };\n        if (PacketType[p.type] === undefined) {\n            throw new Error(\"unknown packet type \" + p.type);\n        }\n        // look up attachments if type binary\n        if (p.type === PacketType.BINARY_EVENT ||\n            p.type === PacketType.BINARY_ACK) {\n            const start = i + 1;\n            while (str.charAt(++i) !== \"-\" && i != str.length) { }\n            const buf = str.substring(start, i);\n            if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n                throw new Error(\"Illegal attachments\");\n            }\n            p.attachments = Number(buf);\n        }\n        // look up namespace (if any)\n        if (\"/\" === str.charAt(i + 1)) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (\",\" === c)\n                    break;\n                if (i === str.length)\n                    break;\n            }\n            p.nsp = str.substring(start, i);\n        }\n        else {\n            p.nsp = \"/\";\n        }\n        // look up id\n        const next = str.charAt(i + 1);\n        if (\"\" !== next && Number(next) == next) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (null == c || Number(c) != c) {\n                    --i;\n                    break;\n                }\n                if (i === str.length)\n                    break;\n            }\n            p.id = Number(str.substring(start, i + 1));\n        }\n        // look up json data\n        if (str.charAt(++i)) {\n            const payload = this.tryParse(str.substr(i));\n            if (Decoder.isPayloadValid(p.type, payload)) {\n                p.data = payload;\n            }\n            else {\n                throw new Error(\"invalid payload\");\n            }\n        }\n        return p;\n    }\n    tryParse(str) {\n        try {\n            return JSON.parse(str, this.reviver);\n        }\n        catch (e) {\n            return false;\n        }\n    }\n    static isPayloadValid(type, payload) {\n        switch (type) {\n            case PacketType.CONNECT:\n                return isObject(payload);\n            case PacketType.DISCONNECT:\n                return payload === undefined;\n            case PacketType.CONNECT_ERROR:\n                return typeof payload === \"string\" || isObject(payload);\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                return (Array.isArray(payload) &&\n                    (typeof payload[0] === \"number\" ||\n                        (typeof payload[0] === \"string\" &&\n                            RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                return Array.isArray(payload);\n        }\n    }\n    /**\n     * Deallocates a parser's resources\n     */\n    destroy() {\n        if (this.reconstructor) {\n            this.reconstructor.finishedReconstruction();\n            this.reconstructor = null;\n        }\n    }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n    constructor(packet) {\n        this.packet = packet;\n        this.buffers = [];\n        this.reconPack = packet;\n    }\n    /**\n     * Method to be called when binary data received from connection\n     * after a BINARY_EVENT packet.\n     *\n     * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n     * @return {null | Object} returns null if more binary data is expected or\n     *   a reconstructed packet object if all buffers have been received.\n     */\n    takeBinaryData(binData) {\n        this.buffers.push(binData);\n        if (this.buffers.length === this.reconPack.attachments) {\n            // done with buffer list\n            const packet = reconstructPacket(this.reconPack, this.buffers);\n            this.finishedReconstruction();\n            return packet;\n        }\n        return null;\n    }\n    /**\n     * Cleans up binary packet reconstruction variables.\n     */\n    finishedReconstruction() {\n        this.reconPack = null;\n        this.buffers = [];\n    }\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n    (typeof File !== \"undefined\" &&\n        toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n    return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n        (withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n    if (!obj || typeof obj !== \"object\") {\n        return false;\n    }\n    if (Array.isArray(obj)) {\n        for (let i = 0, l = obj.length; i < l; i++) {\n            if (hasBinary(obj[i])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (isBinary(obj)) {\n        return true;\n    }\n    if (obj.toJSON &&\n        typeof obj.toJSON === \"function\" &&\n        arguments.length === 1) {\n        return hasBinary(obj.toJSON(), true);\n    }\n    for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n            return true;\n        }\n    }\n    return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n    const buffers = [];\n    const packetData = packet.data;\n    const pack = packet;\n    pack.data = _deconstructPacket(packetData, buffers);\n    pack.attachments = buffers.length; // number of binary 'attachments'\n    return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (isBinary(data)) {\n        const placeholder = { _placeholder: true, num: buffers.length };\n        buffers.push(data);\n        return placeholder;\n    }\n    else if (Array.isArray(data)) {\n        const newData = new Array(data.length);\n        for (let i = 0; i < data.length; i++) {\n            newData[i] = _deconstructPacket(data[i], buffers);\n        }\n        return newData;\n    }\n    else if (typeof data === \"object\" && !(data instanceof Date)) {\n        const newData = {};\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                newData[key] = _deconstructPacket(data[key], buffers);\n            }\n        }\n        return newData;\n    }\n    return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n    packet.data = _reconstructPacket(packet.data, buffers);\n    delete packet.attachments; // no longer useful\n    return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (data && data._placeholder === true) {\n        const isIndexValid = typeof data.num === \"number\" &&\n            data.num >= 0 &&\n            data.num < buffers.length;\n        if (isIndexValid) {\n            return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n        }\n        else {\n            throw new Error(\"illegal attachments\");\n        }\n    }\n    else if (Array.isArray(data)) {\n        for (let i = 0; i < data.length; i++) {\n            data[i] = _reconstructPacket(data[i], buffers);\n        }\n    }\n    else if (typeof data === \"object\") {\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                data[key] = _reconstructPacket(data[key], buffers);\n            }\n        }\n    }\n    return data;\n}\n","export function on(obj, ev, fn) {\n    obj.on(ev, fn);\n    return function subDestroy() {\n        obj.off(ev, fn);\n    };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n    connect: 1,\n    connect_error: 1,\n    disconnect: 1,\n    disconnecting: 1,\n    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n    newListener: 1,\n    removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n *   console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n *   // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n *   console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n    /**\n     * `Socket` constructor.\n     */\n    constructor(io, nsp, opts) {\n        super();\n        /**\n         * Whether the socket is currently connected to the server.\n         *\n         * @example\n         * const socket = io();\n         *\n         * socket.on(\"connect\", () => {\n         *   console.log(socket.connected); // true\n         * });\n         *\n         * socket.on(\"disconnect\", () => {\n         *   console.log(socket.connected); // false\n         * });\n         */\n        this.connected = false;\n        /**\n         * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n         * be transmitted by the server.\n         */\n        this.recovered = false;\n        /**\n         * Buffer for packets received before the CONNECT packet\n         */\n        this.receiveBuffer = [];\n        /**\n         * Buffer for packets that will be sent once the socket is connected\n         */\n        this.sendBuffer = [];\n        /**\n         * The queue of packets to be sent with retry in case of failure.\n         *\n         * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n         * @private\n         */\n        this._queue = [];\n        /**\n         * A sequence to generate the ID of the {@link QueuedPacket}.\n         * @private\n         */\n        this._queueSeq = 0;\n        this.ids = 0;\n        /**\n         * A map containing acknowledgement handlers.\n         *\n         * The `withError` attribute is used to differentiate handlers that accept an error as first argument:\n         *\n         * - `socket.emit(\"test\", (err, value) => { ... })` with `ackTimeout` option\n         * - `socket.timeout(5000).emit(\"test\", (err, value) => { ... })`\n         * - `const value = await socket.emitWithAck(\"test\")`\n         *\n         * From those that don't:\n         *\n         * - `socket.emit(\"test\", (value) => { ... });`\n         *\n         * In the first case, the handlers will be called with an error when:\n         *\n         * - the timeout is reached\n         * - the socket gets disconnected\n         *\n         * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive\n         * an acknowledgement from the server.\n         *\n         * @private\n         */\n        this.acks = {};\n        this.flags = {};\n        this.io = io;\n        this.nsp = nsp;\n        if (opts && opts.auth) {\n            this.auth = opts.auth;\n        }\n        this._opts = Object.assign({}, opts);\n        if (this.io._autoConnect)\n            this.open();\n    }\n    /**\n     * Whether the socket is currently disconnected\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"connect\", () => {\n     *   console.log(socket.disconnected); // false\n     * });\n     *\n     * socket.on(\"disconnect\", () => {\n     *   console.log(socket.disconnected); // true\n     * });\n     */\n    get disconnected() {\n        return !this.connected;\n    }\n    /**\n     * Subscribe to open, close and packet events\n     *\n     * @private\n     */\n    subEvents() {\n        if (this.subs)\n            return;\n        const io = this.io;\n        this.subs = [\n            on(io, \"open\", this.onopen.bind(this)),\n            on(io, \"packet\", this.onpacket.bind(this)),\n            on(io, \"error\", this.onerror.bind(this)),\n            on(io, \"close\", this.onclose.bind(this)),\n        ];\n    }\n    /**\n     * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n     *\n     * @example\n     * const socket = io();\n     *\n     * console.log(socket.active); // true\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   if (reason === \"io server disconnect\") {\n     *     // the disconnection was initiated by the server, you need to manually reconnect\n     *     console.log(socket.active); // false\n     *   }\n     *   // else the socket will automatically try to reconnect\n     *   console.log(socket.active); // true\n     * });\n     */\n    get active() {\n        return !!this.subs;\n    }\n    /**\n     * \"Opens\" the socket.\n     *\n     * @example\n     * const socket = io({\n     *   autoConnect: false\n     * });\n     *\n     * socket.connect();\n     */\n    connect() {\n        if (this.connected)\n            return this;\n        this.subEvents();\n        if (!this.io[\"_reconnecting\"])\n            this.io.open(); // ensure open\n        if (\"open\" === this.io._readyState)\n            this.onopen();\n        return this;\n    }\n    /**\n     * Alias for {@link connect()}.\n     */\n    open() {\n        return this.connect();\n    }\n    /**\n     * Sends a `message` event.\n     *\n     * This method mimics the WebSocket.send() method.\n     *\n     * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n     *\n     * @example\n     * socket.send(\"hello\");\n     *\n     * // this is equivalent to\n     * socket.emit(\"message\", \"hello\");\n     *\n     * @return self\n     */\n    send(...args) {\n        args.unshift(\"message\");\n        this.emit.apply(this, args);\n        return this;\n    }\n    /**\n     * Override `emit`.\n     * If the event is in `events`, it's emitted normally.\n     *\n     * @example\n     * socket.emit(\"hello\", \"world\");\n     *\n     * // all serializable datastructures are supported (no need to call JSON.stringify)\n     * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n     *\n     * // with an acknowledgement from the server\n     * socket.emit(\"hello\", \"world\", (val) => {\n     *   // ...\n     * });\n     *\n     * @return self\n     */\n    emit(ev, ...args) {\n        var _a, _b, _c;\n        if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n            throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n        }\n        args.unshift(ev);\n        if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n            this._addToQueue(args);\n            return this;\n        }\n        const packet = {\n            type: PacketType.EVENT,\n            data: args,\n        };\n        packet.options = {};\n        packet.options.compress = this.flags.compress !== false;\n        // event ack callback\n        if (\"function\" === typeof args[args.length - 1]) {\n            const id = this.ids++;\n            const ack = args.pop();\n            this._registerAckCallback(id, ack);\n            packet.id = id;\n        }\n        const isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;\n        const isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());\n        const discardPacket = this.flags.volatile && !isTransportWritable;\n        if (discardPacket) {\n        }\n        else if (isConnected) {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        }\n        else {\n            this.sendBuffer.push(packet);\n        }\n        this.flags = {};\n        return this;\n    }\n    /**\n     * @private\n     */\n    _registerAckCallback(id, ack) {\n        var _a;\n        const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n        if (timeout === undefined) {\n            this.acks[id] = ack;\n            return;\n        }\n        // @ts-ignore\n        const timer = this.io.setTimeoutFn(() => {\n            delete this.acks[id];\n            for (let i = 0; i < this.sendBuffer.length; i++) {\n                if (this.sendBuffer[i].id === id) {\n                    this.sendBuffer.splice(i, 1);\n                }\n            }\n            ack.call(this, new Error(\"operation has timed out\"));\n        }, timeout);\n        const fn = (...args) => {\n            // @ts-ignore\n            this.io.clearTimeoutFn(timer);\n            ack.apply(this, args);\n        };\n        fn.withError = true;\n        this.acks[id] = fn;\n    }\n    /**\n     * Emits an event and waits for an acknowledgement\n     *\n     * @example\n     * // without timeout\n     * const response = await socket.emitWithAck(\"hello\", \"world\");\n     *\n     * // with a specific timeout\n     * try {\n     *   const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n     * } catch (err) {\n     *   // the server did not acknowledge the event in the given delay\n     * }\n     *\n     * @return a Promise that will be fulfilled when the server acknowledges the event\n     */\n    emitWithAck(ev, ...args) {\n        return new Promise((resolve, reject) => {\n            const fn = (arg1, arg2) => {\n                return arg1 ? reject(arg1) : resolve(arg2);\n            };\n            fn.withError = true;\n            args.push(fn);\n            this.emit(ev, ...args);\n        });\n    }\n    /**\n     * Add the packet to the queue.\n     * @param args\n     * @private\n     */\n    _addToQueue(args) {\n        let ack;\n        if (typeof args[args.length - 1] === \"function\") {\n            ack = args.pop();\n        }\n        const packet = {\n            id: this._queueSeq++,\n            tryCount: 0,\n            pending: false,\n            args,\n            flags: Object.assign({ fromQueue: true }, this.flags),\n        };\n        args.push((err, ...responseArgs) => {\n            if (packet !== this._queue[0]) {\n                // the packet has already been acknowledged\n                return;\n            }\n            const hasError = err !== null;\n            if (hasError) {\n                if (packet.tryCount > this._opts.retries) {\n                    this._queue.shift();\n                    if (ack) {\n                        ack(err);\n                    }\n                }\n            }\n            else {\n                this._queue.shift();\n                if (ack) {\n                    ack(null, ...responseArgs);\n                }\n            }\n            packet.pending = false;\n            return this._drainQueue();\n        });\n        this._queue.push(packet);\n        this._drainQueue();\n    }\n    /**\n     * Send the first packet of the queue, and wait for an acknowledgement from the server.\n     * @param force - whether to resend a packet that has not been acknowledged yet\n     *\n     * @private\n     */\n    _drainQueue(force = false) {\n        if (!this.connected || this._queue.length === 0) {\n            return;\n        }\n        const packet = this._queue[0];\n        if (packet.pending && !force) {\n            return;\n        }\n        packet.pending = true;\n        packet.tryCount++;\n        this.flags = packet.flags;\n        this.emit.apply(this, packet.args);\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param packet\n     * @private\n     */\n    packet(packet) {\n        packet.nsp = this.nsp;\n        this.io._packet(packet);\n    }\n    /**\n     * Called upon engine `open`.\n     *\n     * @private\n     */\n    onopen() {\n        if (typeof this.auth == \"function\") {\n            this.auth((data) => {\n                this._sendConnectPacket(data);\n            });\n        }\n        else {\n            this._sendConnectPacket(this.auth);\n        }\n    }\n    /**\n     * Sends a CONNECT packet to initiate the Socket.IO session.\n     *\n     * @param data\n     * @private\n     */\n    _sendConnectPacket(data) {\n        this.packet({\n            type: PacketType.CONNECT,\n            data: this._pid\n                ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n                : data,\n        });\n    }\n    /**\n     * Called upon engine or manager `error`.\n     *\n     * @param err\n     * @private\n     */\n    onerror(err) {\n        if (!this.connected) {\n            this.emitReserved(\"connect_error\", err);\n        }\n    }\n    /**\n     * Called upon engine `close`.\n     *\n     * @param reason\n     * @param description\n     * @private\n     */\n    onclose(reason, description) {\n        this.connected = false;\n        delete this.id;\n        this.emitReserved(\"disconnect\", reason, description);\n        this._clearAcks();\n    }\n    /**\n     * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from\n     * the server.\n     *\n     * @private\n     */\n    _clearAcks() {\n        Object.keys(this.acks).forEach((id) => {\n            const isBuffered = this.sendBuffer.some((packet) => String(packet.id) === id);\n            if (!isBuffered) {\n                // note: handlers that do not accept an error as first argument are ignored here\n                const ack = this.acks[id];\n                delete this.acks[id];\n                if (ack.withError) {\n                    ack.call(this, new Error(\"socket has been disconnected\"));\n                }\n            }\n        });\n    }\n    /**\n     * Called with socket packet.\n     *\n     * @param packet\n     * @private\n     */\n    onpacket(packet) {\n        const sameNamespace = packet.nsp === this.nsp;\n        if (!sameNamespace)\n            return;\n        switch (packet.type) {\n            case PacketType.CONNECT:\n                if (packet.data && packet.data.sid) {\n                    this.onconnect(packet.data.sid, packet.data.pid);\n                }\n                else {\n                    this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n                }\n                break;\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                this.onevent(packet);\n                break;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                this.onack(packet);\n                break;\n            case PacketType.DISCONNECT:\n                this.ondisconnect();\n                break;\n            case PacketType.CONNECT_ERROR:\n                this.destroy();\n                const err = new Error(packet.data.message);\n                // @ts-ignore\n                err.data = packet.data.data;\n                this.emitReserved(\"connect_error\", err);\n                break;\n        }\n    }\n    /**\n     * Called upon a server event.\n     *\n     * @param packet\n     * @private\n     */\n    onevent(packet) {\n        const args = packet.data || [];\n        if (null != packet.id) {\n            args.push(this.ack(packet.id));\n        }\n        if (this.connected) {\n            this.emitEvent(args);\n        }\n        else {\n            this.receiveBuffer.push(Object.freeze(args));\n        }\n    }\n    emitEvent(args) {\n        if (this._anyListeners && this._anyListeners.length) {\n            const listeners = this._anyListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, args);\n            }\n        }\n        super.emit.apply(this, args);\n        if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n            this._lastOffset = args[args.length - 1];\n        }\n    }\n    /**\n     * Produces an ack callback to emit with an event.\n     *\n     * @private\n     */\n    ack(id) {\n        const self = this;\n        let sent = false;\n        return function (...args) {\n            // prevent double callbacks\n            if (sent)\n                return;\n            sent = true;\n            self.packet({\n                type: PacketType.ACK,\n                id: id,\n                data: args,\n            });\n        };\n    }\n    /**\n     * Called upon a server acknowledgement.\n     *\n     * @param packet\n     * @private\n     */\n    onack(packet) {\n        const ack = this.acks[packet.id];\n        if (typeof ack !== \"function\") {\n            return;\n        }\n        delete this.acks[packet.id];\n        // @ts-ignore FIXME ack is incorrectly inferred as 'never'\n        if (ack.withError) {\n            packet.data.unshift(null);\n        }\n        // @ts-ignore\n        ack.apply(this, packet.data);\n    }\n    /**\n     * Called upon server connect.\n     *\n     * @private\n     */\n    onconnect(id, pid) {\n        this.id = id;\n        this.recovered = pid && this._pid === pid;\n        this._pid = pid; // defined only if connection state recovery is enabled\n        this.connected = true;\n        this.emitBuffered();\n        this.emitReserved(\"connect\");\n        this._drainQueue(true);\n    }\n    /**\n     * Emit buffered events (received and emitted).\n     *\n     * @private\n     */\n    emitBuffered() {\n        this.receiveBuffer.forEach((args) => this.emitEvent(args));\n        this.receiveBuffer = [];\n        this.sendBuffer.forEach((packet) => {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        });\n        this.sendBuffer = [];\n    }\n    /**\n     * Called upon server disconnect.\n     *\n     * @private\n     */\n    ondisconnect() {\n        this.destroy();\n        this.onclose(\"io server disconnect\");\n    }\n    /**\n     * Called upon forced client/server side disconnections,\n     * this method ensures the manager stops tracking us and\n     * that reconnections don't get triggered for this.\n     *\n     * @private\n     */\n    destroy() {\n        if (this.subs) {\n            // clean subscriptions to avoid reconnections\n            this.subs.forEach((subDestroy) => subDestroy());\n            this.subs = undefined;\n        }\n        this.io[\"_destroy\"](this);\n    }\n    /**\n     * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n     *\n     * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   // console.log(reason); prints \"io client disconnect\"\n     * });\n     *\n     * socket.disconnect();\n     *\n     * @return self\n     */\n    disconnect() {\n        if (this.connected) {\n            this.packet({ type: PacketType.DISCONNECT });\n        }\n        // remove socket from pool\n        this.destroy();\n        if (this.connected) {\n            // fire events\n            this.onclose(\"io client disconnect\");\n        }\n        return this;\n    }\n    /**\n     * Alias for {@link disconnect()}.\n     *\n     * @return self\n     */\n    close() {\n        return this.disconnect();\n    }\n    /**\n     * Sets the compress flag.\n     *\n     * @example\n     * socket.compress(false).emit(\"hello\");\n     *\n     * @param compress - if `true`, compresses the sending data\n     * @return self\n     */\n    compress(compress) {\n        this.flags.compress = compress;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n     * ready to send messages.\n     *\n     * @example\n     * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n     *\n     * @returns self\n     */\n    get volatile() {\n        this.flags.volatile = true;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n     * given number of milliseconds have elapsed without an acknowledgement from the server:\n     *\n     * @example\n     * socket.timeout(5000).emit(\"my-event\", (err) => {\n     *   if (err) {\n     *     // the server did not acknowledge the event in the given delay\n     *   }\n     * });\n     *\n     * @returns self\n     */\n    timeout(timeout) {\n        this.flags.timeout = timeout;\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * @example\n     * socket.onAny((event, ...args) => {\n     *   console.log(`got ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * @example\n     * socket.prependAny((event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * }\n     *\n     * socket.onAny(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAny(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAny();\n     *\n     * @param listener\n     */\n    offAny(listener) {\n        if (!this._anyListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAny() {\n        return this._anyListeners || [];\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.onAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.prependAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * }\n     *\n     * socket.onAnyOutgoing(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAnyOutgoing(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAnyOutgoing();\n     *\n     * @param [listener] - the catch-all listener (optional)\n     */\n    offAnyOutgoing(listener) {\n        if (!this._anyOutgoingListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyOutgoingListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyOutgoingListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAnyOutgoing() {\n        return this._anyOutgoingListeners || [];\n    }\n    /**\n     * Notify the listeners for each packet sent\n     *\n     * @param packet\n     *\n     * @private\n     */\n    notifyOutgoingListeners(packet) {\n        if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n            const listeners = this._anyOutgoingListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, packet.data);\n            }\n        }\n    }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n    opts = opts || {};\n    this.ms = opts.min || 100;\n    this.max = opts.max || 10000;\n    this.factor = opts.factor || 2;\n    this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n    this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n    var ms = this.ms * Math.pow(this.factor, this.attempts++);\n    if (this.jitter) {\n        var rand = Math.random();\n        var deviation = Math.floor(rand * this.jitter * ms);\n        ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n    }\n    return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n    this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n    this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n    this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n    this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n    constructor(uri, opts) {\n        var _a;\n        super();\n        this.nsps = {};\n        this.subs = [];\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = undefined;\n        }\n        opts = opts || {};\n        opts.path = opts.path || \"/socket.io\";\n        this.opts = opts;\n        installTimerFunctions(this, opts);\n        this.reconnection(opts.reconnection !== false);\n        this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n        this.reconnectionDelay(opts.reconnectionDelay || 1000);\n        this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n        this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n        this.backoff = new Backoff({\n            min: this.reconnectionDelay(),\n            max: this.reconnectionDelayMax(),\n            jitter: this.randomizationFactor(),\n        });\n        this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n        this._readyState = \"closed\";\n        this.uri = uri;\n        const _parser = opts.parser || parser;\n        this.encoder = new _parser.Encoder();\n        this.decoder = new _parser.Decoder();\n        this._autoConnect = opts.autoConnect !== false;\n        if (this._autoConnect)\n            this.open();\n    }\n    reconnection(v) {\n        if (!arguments.length)\n            return this._reconnection;\n        this._reconnection = !!v;\n        if (!v) {\n            this.skipReconnect = true;\n        }\n        return this;\n    }\n    reconnectionAttempts(v) {\n        if (v === undefined)\n            return this._reconnectionAttempts;\n        this._reconnectionAttempts = v;\n        return this;\n    }\n    reconnectionDelay(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelay;\n        this._reconnectionDelay = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n        return this;\n    }\n    randomizationFactor(v) {\n        var _a;\n        if (v === undefined)\n            return this._randomizationFactor;\n        this._randomizationFactor = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n        return this;\n    }\n    reconnectionDelayMax(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelayMax;\n        this._reconnectionDelayMax = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n        return this;\n    }\n    timeout(v) {\n        if (!arguments.length)\n            return this._timeout;\n        this._timeout = v;\n        return this;\n    }\n    /**\n     * Starts trying to reconnect if reconnection is enabled and we have not\n     * started reconnecting yet\n     *\n     * @private\n     */\n    maybeReconnectOnOpen() {\n        // Only try to reconnect if it's the first time we're connecting\n        if (!this._reconnecting &&\n            this._reconnection &&\n            this.backoff.attempts === 0) {\n            // keeps reconnection from firing twice for the same reconnection loop\n            this.reconnect();\n        }\n    }\n    /**\n     * Sets the current transport `socket`.\n     *\n     * @param {Function} fn - optional, callback\n     * @return self\n     * @public\n     */\n    open(fn) {\n        if (~this._readyState.indexOf(\"open\"))\n            return this;\n        this.engine = new Engine(this.uri, this.opts);\n        const socket = this.engine;\n        const self = this;\n        this._readyState = \"opening\";\n        this.skipReconnect = false;\n        // emit `open`\n        const openSubDestroy = on(socket, \"open\", function () {\n            self.onopen();\n            fn && fn();\n        });\n        const onError = (err) => {\n            this.cleanup();\n            this._readyState = \"closed\";\n            this.emitReserved(\"error\", err);\n            if (fn) {\n                fn(err);\n            }\n            else {\n                // Only do this if there is no fn to handle the error\n                this.maybeReconnectOnOpen();\n            }\n        };\n        // emit `error`\n        const errorSub = on(socket, \"error\", onError);\n        if (false !== this._timeout) {\n            const timeout = this._timeout;\n            // set timer\n            const timer = this.setTimeoutFn(() => {\n                openSubDestroy();\n                onError(new Error(\"timeout\"));\n                socket.close();\n            }, timeout);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(() => {\n                this.clearTimeoutFn(timer);\n            });\n        }\n        this.subs.push(openSubDestroy);\n        this.subs.push(errorSub);\n        return this;\n    }\n    /**\n     * Alias for open()\n     *\n     * @return self\n     * @public\n     */\n    connect(fn) {\n        return this.open(fn);\n    }\n    /**\n     * Called upon transport open.\n     *\n     * @private\n     */\n    onopen() {\n        // clear old subs\n        this.cleanup();\n        // mark as open\n        this._readyState = \"open\";\n        this.emitReserved(\"open\");\n        // add new subs\n        const socket = this.engine;\n        this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), \n        // @ts-ignore\n        on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n    }\n    /**\n     * Called upon a ping.\n     *\n     * @private\n     */\n    onping() {\n        this.emitReserved(\"ping\");\n    }\n    /**\n     * Called with data.\n     *\n     * @private\n     */\n    ondata(data) {\n        try {\n            this.decoder.add(data);\n        }\n        catch (e) {\n            this.onclose(\"parse error\", e);\n        }\n    }\n    /**\n     * Called when parser fully decodes a packet.\n     *\n     * @private\n     */\n    ondecoded(packet) {\n        // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n        nextTick(() => {\n            this.emitReserved(\"packet\", packet);\n        }, this.setTimeoutFn);\n    }\n    /**\n     * Called upon socket error.\n     *\n     * @private\n     */\n    onerror(err) {\n        this.emitReserved(\"error\", err);\n    }\n    /**\n     * Creates a new socket for the given `nsp`.\n     *\n     * @return {Socket}\n     * @public\n     */\n    socket(nsp, opts) {\n        let socket = this.nsps[nsp];\n        if (!socket) {\n            socket = new Socket(this, nsp, opts);\n            this.nsps[nsp] = socket;\n        }\n        else if (this._autoConnect && !socket.active) {\n            socket.connect();\n        }\n        return socket;\n    }\n    /**\n     * Called upon a socket close.\n     *\n     * @param socket\n     * @private\n     */\n    _destroy(socket) {\n        const nsps = Object.keys(this.nsps);\n        for (const nsp of nsps) {\n            const socket = this.nsps[nsp];\n            if (socket.active) {\n                return;\n            }\n        }\n        this._close();\n    }\n    /**\n     * Writes a packet.\n     *\n     * @param packet\n     * @private\n     */\n    _packet(packet) {\n        const encodedPackets = this.encoder.encode(packet);\n        for (let i = 0; i < encodedPackets.length; i++) {\n            this.engine.write(encodedPackets[i], packet.options);\n        }\n    }\n    /**\n     * Clean up transport subscriptions and packet buffer.\n     *\n     * @private\n     */\n    cleanup() {\n        this.subs.forEach((subDestroy) => subDestroy());\n        this.subs.length = 0;\n        this.decoder.destroy();\n    }\n    /**\n     * Close the current socket.\n     *\n     * @private\n     */\n    _close() {\n        this.skipReconnect = true;\n        this._reconnecting = false;\n        this.onclose(\"forced close\");\n    }\n    /**\n     * Alias for close()\n     *\n     * @private\n     */\n    disconnect() {\n        return this._close();\n    }\n    /**\n     * Called when:\n     *\n     * - the low-level engine is closed\n     * - the parser encountered a badly formatted packet\n     * - all sockets are disconnected\n     *\n     * @private\n     */\n    onclose(reason, description) {\n        var _a;\n        this.cleanup();\n        (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        this.emitReserved(\"close\", reason, description);\n        if (this._reconnection && !this.skipReconnect) {\n            this.reconnect();\n        }\n    }\n    /**\n     * Attempt a reconnection.\n     *\n     * @private\n     */\n    reconnect() {\n        if (this._reconnecting || this.skipReconnect)\n            return this;\n        const self = this;\n        if (this.backoff.attempts >= this._reconnectionAttempts) {\n            this.backoff.reset();\n            this.emitReserved(\"reconnect_failed\");\n            this._reconnecting = false;\n        }\n        else {\n            const delay = this.backoff.duration();\n            this._reconnecting = true;\n            const timer = this.setTimeoutFn(() => {\n                if (self.skipReconnect)\n                    return;\n                this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n                // check again for the case socket closed in above events\n                if (self.skipReconnect)\n                    return;\n                self.open((err) => {\n                    if (err) {\n                        self._reconnecting = false;\n                        self.reconnect();\n                        this.emitReserved(\"reconnect_error\", err);\n                    }\n                    else {\n                        self.onreconnect();\n                    }\n                });\n            }, delay);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(() => {\n                this.clearTimeoutFn(timer);\n            });\n        }\n    }\n    /**\n     * Called upon successful reconnect.\n     *\n     * @private\n     */\n    onreconnect() {\n        const attempt = this.backoff.attempts;\n        this._reconnecting = false;\n        this.backoff.reset();\n        this.emitReserved(\"reconnect\", attempt);\n    }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n    if (typeof uri === \"object\") {\n        opts = uri;\n        uri = undefined;\n    }\n    opts = opts || {};\n    const parsed = url(uri, opts.path || \"/socket.io\");\n    const source = parsed.source;\n    const id = parsed.id;\n    const path = parsed.path;\n    const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n    const newConnection = opts.forceNew ||\n        opts[\"force new connection\"] ||\n        false === opts.multiplex ||\n        sameNamespace;\n    let io;\n    if (newConnection) {\n        io = new Manager(source, opts);\n    }\n    else {\n        if (!cache[id]) {\n            cache[id] = new Manager(source, opts);\n        }\n        io = cache[id];\n    }\n    if (parsed.query && !opts.query) {\n        opts.query = parsed.queryKey;\n    }\n    return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n    Manager,\n    Socket,\n    io: lookup,\n    connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\nexport { Fetch, NodeXHR, XHR, NodeWebSocket, WebSocket, WebTransport, } from \"engine.io-client\";\n","import { io, Socket } from \"socket.io-client\";\nimport {\n\tAutoDepoWdStatusPayload,\n\tTransactionNotificationData,\n} from \"@/types/blockchain/transactions.types\";\nimport {\n\tCallback,\n\tLiveChatMessagePayload,\n\tReceivedChatMessage,\n} from \"@/types/websockets/websockets.types\";\nimport { getSdkConfig } from \"@/config\";\n/*\n * WebSocketService.ts\n * This service manages WebSocket connections and subscriptions for transaction notifications.\n * It uses Socket.IO for real-time communication with the backend.\n */\nclass WebSocketService {\n\tprivate static instance: WebSocketService;\n\tprivate socket: Socket | null = null;\n\tprivate chatSocket: Socket | null = null; // Separate socket for live chat\n\tprivate reconnectTimeout: NodeJS.Timeout | null = null;\n\tprivate chatReconnectTimeout: NodeJS.Timeout | null = null;\n\tprivate reconnectAttempts = 0;\n\tprivate readonly MAX_RECONNECT_ATTEMPTS = 5;\n\n\t// Cache last known identifiers to avoid localStorage usage on reconnect\n\tprivate lastUserId: string | null = null;\n\n\t// Track connection status explicitly (instead of abusing function name checks)\n\tprivate status:\n\t\t| \"idle\"\n\t\t| \"connecting\"\n\t\t| \"connected\"\n\t\t| \"reconnecting\"\n\t\t| \"disconnected\"\n\t\t| \"error\" = \"idle\";\n\tprivate chatStatus:\n\t\t| \"idle\"\n\t\t| \"connecting\"\n\t\t| \"connected\"\n\t\t| \"reconnecting\"\n\t\t| \"disconnected\"\n\t\t| \"error\" = \"idle\";\n\n\t// Callbacks sets for the subscription model\n\n\t// For deposit notifications\n\tprivate depositCallbacks = new Set<Callback<TransactionNotificationData>>();\n\t// For withdrawal notifications\n\tprivate withdrawCallbacks = new Set<\n\t\tCallback<TransactionNotificationData>\n\t>();\n\t// For auto status updates\n\tprivate autoStatusCallbacks = new Set<Callback<AutoDepoWdStatusPayload>>();\n\t// For live chat messages\n\tprivate chatMessageCallbacks = new Set<Callback<ReceivedChatMessage>>();\n\n\t// Callback for the service's own status changes\n\tpublic onStatusChange: Callback<string> = () => {};\n\tpublic onChatStatusChange: Callback<string> = () => {};\n\n\tstatic getInstance(): WebSocketService {\n\t\tif (!WebSocketService.instance) {\n\t\t\tWebSocketService.instance = new WebSocketService();\n\t\t}\n\t\treturn WebSocketService.instance;\n\t}\n\n\tconnect(userId: string): void {\n\t\tif (\n\t\t\tthis.socket?.connected ||\n\t\t\tthis.status === \"connecting\" ||\n\t\t\tthis.status === \"reconnecting\"\n\t\t)\n\t\t\treturn;\n\n\t\tthis.status = \"connecting\";\n\t\tthis.onStatusChange(\"connecting\");\n\t\t// Remember the last used userId for reconnection attempts\n\t\tthis.lastUserId = userId;\n\n\t\tconst config = getSdkConfig();\n\t\tconst wsUrl = `${config.wsUrl}?wsKey=${config.wsKey}&userId=${userId}`;\n\n\t\t// Ensure old connection is fully terminated before creating a new one\n\t\tthis.socket?.disconnect();\n\n\t\tthis.socket = io(wsUrl, {\n\t\t\ttransports: [\"websocket\"],\n\t\t\tautoConnect: true,\n\t\t\treconnection: true,\n\t\t\treconnectionAttempts: 5,\n\t\t\treconnectionDelay: 1000,\n\t\t\treconnectionDelayMax: 5000,\n\t\t\ttimeout: 10000,\n\t\t});\n\n\t\tthis.socket.on(\"connect\", this.handleConnect);\n\t\tthis.socket.on(\"disconnect\", this.handleDisconnect);\n\t\tthis.socket.on(\"connect_error\", this.handleConnectError);\n\t}\n\n\t// Live chat connection method\n\n\tdisconnect(): void {\n\t\tif (this.reconnectTimeout) clearTimeout(this.reconnectTimeout);\n\t\tthis.socket?.off(\"connect\", this.handleConnect);\n\t\tthis.socket?.off(\"disconnect\", this.handleDisconnect);\n\t\tthis.socket?.off(\"connect_error\", this.handleConnectError);\n\t\tthis.socket?.disconnect();\n\t\tthis.socket = null;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis.status = \"disconnected\";\n\t\tthis.onStatusChange(\"disconnected\");\n\t\t// console.log(\"WebSocket: Manually disconnected.\");\n\t}\n\n\t// Disconnect from live chat\n\tdisconnectFromChat(): void {\n\t\tif (this.chatReconnectTimeout) clearTimeout(this.chatReconnectTimeout);\n\n\t\tthis.chatSocket?.disconnect();\n\t\tthis.chatSocket = null;\n\t\tthis.chatStatus = \"disconnected\";\n\t\tthis.onChatStatusChange(\"disconnected\");\n\t\t// console.log(\"Chat WebSocket: Manually disconnected.\");\n\t}\n\n\t// ---- Event Handlers ----\n\tprivate handleConnect = () => {\n\t\t// console.log(\"WebSocket: Connected successfully.\");\n\t\tthis.status = \"connected\";\n\t\tthis.onStatusChange(\"connected\");\n\t\tthis.reconnectAttempts = 0;\n\t\tif (this.reconnectTimeout) clearTimeout(this.reconnectTimeout);\n\t};\n\n\tprivate handleDisconnect = (reason: string) => {\n\t\tthis.status = \"disconnected\";\n\t\tthis.onStatusChange(\"disconnected\");\n\t\t// console.log(\"WebSocket: Disconnected, reason:\", reason);\n\t\tif (\n\t\t\treason !== \"io client disconnect\" &&\n\t\t\tthis.reconnectAttempts < this.MAX_RECONNECT_ATTEMPTS\n\t\t) {\n\t\t\tthis.status = \"reconnecting\";\n\t\t\tthis.onStatusChange(\"reconnecting\");\n\t\t\tthis.reconnectAttempts++;\n\t\t\tthis.reconnectTimeout = setTimeout(() => {\n\t\t\t\t// Reconnect using the last provided dynamic userId\n\t\t\t\tthis.connect(this.lastUserId || \"\");\n\t\t\t}, 2000 * this.reconnectAttempts);\n\t\t}\n\t};\n\n\tprivate handleConnectError = (error: Error) => {\n\t\tconsole.error(\"WebSocket Connection Error:\", error);\n\t\tthis.status = \"error\";\n\t\tthis.onStatusChange(\"error\");\n\t\tthis.handleDisconnect(\"connect_error\"); // Trigger reconnect logic\n\t};\n\n\t// --- Subscription Methods ---\n\tsubscribeToDeposits = (callback: Callback<TransactionNotificationData>) =>\n\t\tthis.subscribe(this.depositCallbacks, callback);\n\tsubscribeToWithdraws = (callback: Callback<TransactionNotificationData>) =>\n\t\tthis.subscribe(this.withdrawCallbacks, callback);\n\tsubscribeToAutoStatus = (callback: Callback<AutoDepoWdStatusPayload>) =>\n\t\tthis.subscribe(this.autoStatusCallbacks, callback);\n\tsubscribeToChatMessages = (callback: Callback<ReceivedChatMessage>) =>\n\t\tthis.subscribe(this.chatMessageCallbacks, callback);\n\n\tprivate subscribe<T>(\n\t\tcallbackSet: Set<Callback<T>>,\n\t\tcallback: Callback<T>\n\t): () => void {\n\t\tcallbackSet.add(callback);\n\t\treturn () => callbackSet.delete(callback);\n\t}\n\n\t// --- Chat Methods ---\n\tsendChatMessage(message: LiveChatMessagePayload): boolean {\n\t\t// Only allow sending when chat is fully connected\n\t\tif (!this.chatSocket?.connected || this.chatStatus !== \"connected\") {\n\t\t\t// console.warn(\n\t\t\t// \t\"Chat WebSocket is not connected. Cannot send message.\"\n\t\t\t// );\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.chatSocket.emit(\"send_message\", {\n\t\t\t\ttext: message.text,\n\t\t\t\tsender: message.sender,\n\t\t\t\tisAgent: message.isAgent || \"false\",\n\t\t\t});\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error sending chat message:\", error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Get connection status\n\tisConnected(): boolean {\n\t\treturn this.socket?.connected || false;\n\t}\n\n\tisChatConnected(): boolean {\n\t\treturn this.chatSocket?.connected || false;\n\t}\n\n\t// Expose status for UI to control input state\n\tgetStatus(): typeof this.status {\n\t\treturn this.status;\n\t}\n\n\tgetChatStatus(): typeof this.chatStatus {\n\t\treturn this.chatStatus;\n\t}\n\n\t// Helper: can UI allow sending messages?\n\tcanSendChatMessage(): boolean {\n\t\treturn this.chatStatus === \"connected\" && !!this.chatSocket?.connected;\n\t}\n}\n\nexport default WebSocketService.getInstance();\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport WebSocketService from \"@/services/webSocketService\";\nimport { WsConnectionStatus } from \"@/store/slices/blockchain/websocket.slice\";\n\nexport const WebSocketStateSynchronizer = () => {\n\tconst setConnectionStatus = useAppStore(\n\t\t(state) => state.blockchain.websocket.setConnectionStatus\n\t);\n\n\tuseEffect(() => {\n\t\t// The service's onStatusChange property is a simple callback.\n\t\t// We assign our Zustand action to it.\n\t\tWebSocketService.onStatusChange = (status: string) => {\n\t\t\tsetConnectionStatus(status as WsConnectionStatus);\n\t\t};\n\t}, [setConnectionStatus]);\n\n\treturn null;\n};\n","import { useEffect } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { TransactionModalTab } from \"@/store/slices/ui/walletProvider/modal.slice\";\n\nexport const useTransactionModal = () => {\n\tconst navigate = useNavigate();\n\tconst location = useLocation();\n\n\tconst {\n\t\tisTransactionModalOpen,\n\t\tactiveTransactionModalTab,\n\t\topenTransactionModal,\n\t\tcloseTransactionModal,\n\t\tsetActiveTransactionModalTab,\n\t} = useAppStore((state) => state.uiDefinition.modal);\n\n\t// Effect 1: Sync URL to State on URL parameter changes\n\tuseEffect(() => {\n\t\tconst searchParams = new URLSearchParams(location.search);\n\t\tconst tabFromUrl = searchParams.get(\"tab\") as TransactionModalTab;\n\t\tif (tabFromUrl) {\n\t\t\tsetActiveTransactionModalTab(tabFromUrl);\n\t\t\topenTransactionModal(tabFromUrl);\n\t\t}\n\t}, [location.search, setActiveTransactionModalTab, openTransactionModal]); // React to URL parameter changes\n\n\t// Effect 2: Sync State to URL on tab change\n\tuseEffect(() => {\n\t\tconst currentParams = new URLSearchParams(location.search);\n\t\tif (isTransactionModalOpen) {\n\t\t\tcurrentParams.set(\"tab\", activeTransactionModalTab);\n\t\t} else {\n\t\t\tcurrentParams.delete(\"tab\");\n\t\t}\n\t\t// Use replace to avoid polluting browser history\n\t\tnavigate(`${location.pathname}?${currentParams.toString()}`, {\n\t\t\treplace: true,\n\t\t});\n\t}, [\n\t\tisTransactionModalOpen,\n\t\tactiveTransactionModalTab,\n\t\tlocation.pathname,\n\t\tlocation.search,\n\t\tnavigate,\n\t]);\n\n\treturn {\n\t\tisOpen: isTransactionModalOpen,\n\t\tactiveTab: activeTransactionModalTab,\n\t\topenModal: openTransactionModal,\n\t\tcloseModal: closeTransactionModal,\n\t\tsetActiveTab: setActiveTransactionModalTab,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\n\n/**\n * Hook to get the block explorer URL for the current network\n * Returns the appropriate explorer URL based on the user's current network\n * Falls back to Polygon scan if unable to determine the network\n */\nexport const useBlockExplorerUrl = () => {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst [blockExplorerUrl, setBlockExplorerUrl] = useState<string | null>(\n\t\tnull\n\t);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tuseEffect(() => {\n\t\tconst getBlockExplorerUrl = async () => {\n\t\t\tif (primaryWallet?.connector) {\n\t\t\t\ttry {\n\t\t\t\t\tsetIsLoading(true);\n\t\t\t\t\tconst urls =\n\t\t\t\t\t\tawait primaryWallet.connector.getBlockExplorerUrlsForCurrentNetwork();\n\t\t\t\t\tif (urls && urls.length > 0) {\n\t\t\t\t\t\tsetBlockExplorerUrl(urls[0]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to Polygon scan if no URLs found\n\t\t\t\t\t\tsetBlockExplorerUrl(\"https://polygonscan.com\");\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Failed to get block explorer URL:\", error);\n\t\t\t\t\t// Fallback to Polygon scan if unable to get dynamic URL\n\t\t\t\t\tsetBlockExplorerUrl(\"https://polygonscan.com\");\n\t\t\t\t} finally {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No wallet connected, use default\n\t\t\t\tsetBlockExplorerUrl(\"https://polygonscan.com\");\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t};\n\n\t\tgetBlockExplorerUrl();\n\t}, [primaryWallet]);\n\n\t/**\n\t * Helper function to get a complete transaction URL\n\t * @param transactionHash - The transaction hash to create URL for\n\t * @returns Complete URL to view transaction on block explorer\n\t */\n\tconst getTransactionUrl = (transactionHash: string) => {\n\t\tif (!blockExplorerUrl || !transactionHash) return null;\n\t\treturn `${blockExplorerUrl}tx/${transactionHash}`;\n\t};\n\n\t/**\n\t * Helper function to get a complete address URL\n\t * @param address - The address to create URL for\n\t * @returns Complete URL to view address on block explorer\n\t */\n\tconst getAddressUrl = (address: string) => {\n\t\tif (!blockExplorerUrl || !address) return null;\n\t\treturn `${blockExplorerUrl}address/${address}`;\n\t};\n\n\treturn {\n\t\tblockExplorerUrl,\n\t\tisLoading,\n\t\tgetTransactionUrl,\n\t\tgetAddressUrl,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * A custom hook to debounce a value.\n * @param value The value to debounce.\n * @param delay The debounce delay in milliseconds.\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n\tconst [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n\tuseEffect(() => {\n\t\tconst handler = setTimeout(() => {\n\t\t\tsetDebouncedValue(value);\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tclearTimeout(handler);\n\t\t};\n\t}, [value, delay]);\n\n\treturn debouncedValue;\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { Token } from \"@/types/blockchain/swap.types\";\nimport { toast } from \"sonner\";\nimport type { SearchTokenResult } from \"@/types/walletProvider/transaction-service.types\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\n\nexport const useTokenActions = () => {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst [isAddingToWallet, setIsAddingToWallet] = useState(false);\n\n\tconst addTokenToMetamask = useCallback(\n\t\tasync (token: Token | SearchTokenResult) => {\n\t\t\t// For email authenticated users, show a different message\n\t\t\tif (primaryWallet?.connector.isEmbeddedWallet) {\n\t\t\t\ttoast.info(\n\t\t\t\t\t\"Token bookmarking is not available for email authentication. Use wallet connection for this feature.\"\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!window.ethereum) {\n\t\t\t\ttoast.error(\"MetaMask is not installed.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsAddingToWallet(true);\n\t\t\ttry {\n\t\t\t\tawait window.ethereum.request({\n\t\t\t\t\tmethod: \"wallet_watchAsset\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\ttype: \"ERC20\",\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\taddress: token.address,\n\t\t\t\t\t\t\tsymbol: token.symbol,\n\t\t\t\t\t\t\tdecimals: token.decimals,\n\t\t\t\t\t\t\timage:\n\t\t\t\t\t\t\t\t\"logoURI\" in token ? token.logoURI : token.icon,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\ttoast.success(`${token.symbol} added to your wallet!`);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to add token to MetaMask:\", error);\n\t\t\t\ttoast.error(\"Failed to add token.\");\n\t\t\t} finally {\n\t\t\t\tsetIsAddingToWallet(false);\n\t\t\t}\n\t\t},\n\t\t[primaryWallet]\n\t);\n\n\t// Future logic for bookmarking would go here\n\tconst handleBookmark = useCallback((token: Token) => {\n\t\t// ... logic to call Zustand action to update bookmarks ...\n\t\tconsole.log(\"Bookmarking:\", token.symbol);\n\t}, []);\n\n\treturn { isAddingToWallet, addTokenToMetamask, handleBookmark };\n};\n","import { AppStore } from \"@/store/store\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { TransactionStatus } from \"@/types/blockchain/transactions.types\";\nimport { createSelector } from \"reselect\";\n\n// --- BASE SELECTORS for the Blockchain domain ---\nconst selectTransactions = (state: AppStore) =>\n\tstate.blockchain.transaction.transactions;\nconst selectAllTokens = (state: AppStore) => state.blockchain.token.tokens;\n\n// --- TRANSACTION SELECTORS ---\n\n/**\n * Selects the count of transactions that are currently in the \"pending\" state.\n */\nexport const selectPendingTransactionCount = createSelector(\n\t[selectTransactions],\n\t(transactions) =>\n\t\ttransactions.filter((tx) => tx.status === TransactionStatus.PENDING)\n\t\t\t.length\n);\n\n/**\n * Selects the most recently added transaction from the list.\n */\nexport const selectMostRecentTransaction = createSelector(\n\t[selectTransactions],\n\t(transactions) => (transactions.length > 0 ? transactions[0] : null)\n);\n\n// --- TOKEN SELECTORS ---\n// This is also the perfect home for token-related selectors.\n\n/**\n * Selects the native token from the full token list.\n */\nexport const selectNativeToken = createSelector(\n\t[selectAllTokens],\n\t(tokens: Token[]) => tokens.find((t) => t.tags?.includes(\"native\")) || null\n);\n\n/**\n * Selects the USDT token from the full token list.\n */\nexport const selectUsdtToken = createSelector(\n\t[selectAllTokens],\n\t(tokens: Token[]) =>\n\t\ttokens.find((t) => t.symbol.toUpperCase() === \"USDT\") || null\n);\n\n// --- TOKEN SELECTORS (Now Complete) ---\n/**\n * [NEW] Selects the USDX token from the full token list, case-insensitively.\n */\nexport const selectUsdxToken = createSelector(\n\t[selectAllTokens],\n\t(tokens: Token[]) =>\n\t\ttokens.find((t) => t.symbol.toUpperCase() === \"USDX\") || null\n);\n","\"use client\";\n\nimport { useAppStore } from \"@/store/store\";\nimport {\n\tselectNativeToken,\n\tselectUsdtToken,\n\tselectUsdxToken,\n} from \"@/store/selectors/blockchain/blockchain.selectors\";\nimport { useCallback, useMemo } from \"react\";\nimport { useDynamicAuth } from \"../useDynamicAuth\";\n\n/**\n * A dedicated \"Selector Hook\" that provides a clean, public-facing API\n * for accessing all token-related state from the central Zustand store.\n *\n * It uses memoized selectors for performance and provides a consistent data\n * shape to any UI component that consumes it.\n */\nexport const useTokens = () => {\n\t// --- 1. Select State and Actions from the Store ---\n\tconst { user, authToken } = useDynamicAuth();\n\n\t// Select the raw state from the token slice\n\tconst tokens = useAppStore((state) => state.blockchain.token.tokens);\n\tconst tokenFetchStatus = useAppStore(\n\t\t(state) => state.blockchain.token.tokenFetchStatus\n\t);\n\t// Select the primary action from the token slice\n\tconst fetchTokens = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\n\t// --- 2. Use Memoized Selectors to Get Derived Data ---\n\t// This is highly efficient. These values will only be recalculated if the\n\t// underlying `tokens` array actually changes.\n\tconst nativeToken = useAppStore(selectNativeToken);\n\tconst usdt = useAppStore(selectUsdtToken);\n\tconst usdx = useAppStore(selectUsdxToken);\n\n\t// --- 3. Compute Derived UI State ---\n\t// Create the `isTokensLoading` boolean for easy use in UI components.\n\tconst isTokensLoading = useMemo(\n\t\t() => tokenFetchStatus === \"loading\" || tokenFetchStatus === \"idle\",\n\t\t[tokenFetchStatus]\n\t);\n\n\tconst refreshTokens = useCallback(() => {\n\t\t// This is the critical step: we ensure the action receives the auth context.\n\t\t// The `force: true` flag ensures the guard clause in the slice is bypassed.\n\t\tfetchTokens(true, { user, authToken });\n\t}, [fetchTokens, user, authToken]);\n\n\t// --- 4. Return the Final, Public API ---\n\t// This return object's structure perfectly mirrors your original useTokens hook.\n\treturn {\n\t\ttokens,\n\t\tnativeToken,\n\t\tusdt,\n\t\tusdx,\n\t\tisTokensLoading,\n\t\tfetchTokens,\n\t\trefreshTokens,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport type { SearchTokenResult } from \"@/types/walletProvider/transaction-service.types\";\n// import { useDebounce } from \"@/hooks/walletProvider/useDebounce\";\n\nexport const useTokenSearch = (searchQuery: string) => {\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\tconst { user, authToken, isLoggedIn } = useDynamicAuth();\n\n\tconst [searchResults, setSearchResults] = useState<SearchTokenResult[]>([]);\n\tconst [isSearching, setIsSearching] = useState(false);\n\n\t// Debounce the search query to prevent API spam\n\t// const [debouncedQuery] = useDebounce(searchQuery, 500);\n\n\tuseEffect(() => {\n\t\tlet isActive = true;\n\n\t\tconst search = async () => {\n\t\t\tif (\n\t\t\t\t// !debouncedQuery ||\n\t\t\t\t!searchQuery ||\n\t\t\t\t!isLoggedIn ||\n\t\t\t\t!chainId ||\n\t\t\t\t!user?.username ||\n\t\t\t\t!authToken\n\t\t\t) {\n\t\t\t\tsetSearchResults([]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsSearching(true);\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst response = await transactionService.searchToken(\n\t\t\t\t\t{\n\t\t\t\t\t\tnetwork: chainId,\n\t\t\t\t\t\t// searchWord: deuboncedQuery,\n\t\t\t\t\t\tsearchWord: searchQuery,\n\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t},\n\t\t\t\t\tauthToken\n\t\t\t\t);\n\n\t\t\t\tif (isActive && !response.error && response.data) {\n\t\t\t\t\tsetSearchResults(response.data);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Token search failed:\", error);\n\t\t\t} finally {\n\t\t\t\tif (isActive) setIsSearching(false);\n\t\t\t}\n\t\t};\n\n\t\tsearch();\n\n\t\treturn () => {\n\t\t\tisActive = false;\n\t\t};\n\t}, [\n\t\t// debouncedQuery,\n\t\tsearchQuery,\n\t\tchainId,\n\t\tuser?.username,\n\t\tauthToken,\n\t\tisLoggedIn,\n\t]);\n\n\treturn { searchResults, isSearching };\n};\n","import { ethers } from \"ethers\";\nimport abiErc20 from \"@/abi/erc20.json\";\nimport { getAuthToken } from \"@dynamic-labs/sdk-react-core\";\n\nimport {\n\tApproveTokenParams,\n\tApproveTokenResult,\n\tCheckAllowanceParams,\n\tCheckAllowanceResult,\n\tExecuteSwapParams,\n\tExecuteSwapResult,\n\tSwapTransactionData,\n\tExecuteTokenTransferParams,\n\tExecuteTokenTransferResult,\n\tRecordDepositParams,\n\tRecordDepositResult,\n\tRecordSwapDepositParams,\n\tRecordSwapDepositResult,\n\tRecordManualDepositParams,\n\tRecordManualDepositResult,\n\tGetTokenConversionParams,\n\tGetTokenConversionResult,\n\tCachedConversionData,\n\tGetDestinationWalletResult,\n\tGetDestinationSwapInfoResult,\n\tGetTokenPriceParams,\n\tGetTokenPriceResult,\n\tAllowanceData,\n\tWalletAgentData,\n\tSwapInfo,\n\tTokenPriceData,\n\tDepositData,\n\tSwapDepositData,\n\tConversionData,\n\tCacheKey,\n\tCheckTransactionStatusRequest,\n\tCheckTransactionStatusResponse,\n\tCheckTransactionStatusData,\n\t// ...existing imports...\n\tGetWithdrawWalletRequest,\n\tGetWithdrawWalletResponse,\n\tWithdrawToken,\n\tRiskWithdrawRequest,\n\tRiskWithdrawResponse,\n\tPreWithdrawRequest,\n\tPreWithdrawResponse,\n\tPreWithdrawData,\n\tSearchTokenRequest,\n\tSearchTokenResponse,\n\tWalletAgentApiRequest,\n\tPrimaryWalletWithClient,\n\tGetTipWalletResult,\n\tTipWalletResponse,\n} from \"@/types/walletProvider/transaction-service.types\";\nimport { getSdkConfig } from \"@/config\";\nimport { parseAbi, parseUnits } from \"viem\";\nimport { SendTransactionParameters } from \"viem/zksync\";\nimport { ApiResponse } from \"../apiService\";\n\n/**\n * TransactionService.ts\n * Provides centralized transaction handling capabilities across the application.\n * Handles blockchain interactions, API calls, and transaction state management.\n */\nclass TransactionService {\n\tprivate static instance: TransactionService;\n\tprivate get baseUrl() {\n\t\treturn getSdkConfig().apiBaseUrl;\n\t}\n\tprivate get apiKey() {\n\t\treturn getSdkConfig().apiKey;\n\t}\n\t// private get abi() {\n\t// \treturn getSdkConfig().abi;\n\t// }\n\tprivate get jwtType() {\n\t\treturn getSdkConfig().jwtType;\n\t}\n\tprivate primaryWallet: PrimaryWalletWithClient | null = null; // Store the primaryWallet for authentication-aware transactions\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): TransactionService {\n\t\tif (!TransactionService.instance) {\n\t\t\tTransactionService.instance = new TransactionService();\n\t\t}\n\t\treturn TransactionService.instance;\n\t}\n\n\t/**\n\t * Set the primary wallet for authentication-aware transactions\n\t * This should be called from hooks that have access to useDynamicContext\n\t */\n\tsetPrimaryWallet(primaryWallet: PrimaryWalletWithClient | null = null) {\n\t\tthis.primaryWallet = primaryWallet;\n\t}\n\n\tprivate async makeRequest<T>(\n\t\tendpoint: string,\n\t\tmethod: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" = \"GET\",\n\t\tdata?: unknown,\n\t\ttoken?: string,\n\t\tadditionalConfigs?: RequestInit\n\t): Promise<ApiResponse<T>> {\n\t\tconst url = `${this.baseUrl}${endpoint}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\tconst config: RequestInit = {\n\t\t\t...additionalConfigs,\n\t\t\tmethod,\n\t\t\theaders,\n\t\t};\n\n\t\tif (data && (method === \"POST\" || method === \"PUT\")) {\n\t\t\tconfig.body = JSON.stringify(data);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, config);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`HTTP error!\\n status: ${response.status} \\n message: ${response.text} statusText: ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await response.json();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"API request failed:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// --- BLOCKCHAIN TRANSACTION METHODS ---\n\n\t/**\n\t * Handle token approval for spending by contract\n\t */\n\tasync approveToken(\n\t\tparams: ApproveTokenParams\n\t): Promise<ApproveTokenResult> {\n\t\tconst {\n\t\t\ttokenAddress,\n\t\t\tspenderAddress,\n\t\t\t// username,\n\t\t\tunlimited = true,\n\t\t} = params;\n\n\t\ttry {\n\t\t\tconst maxAmount = unlimited\n\t\t\t\t? \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"\n\t\t\t\t: ethers.parseUnits(\"1000000\", 18);\n\n\t\t\tconst walletClient = await this.primaryWallet?.getWalletClient();\n\n\t\t\tconst hash = await walletClient?.writeContract({\n\t\t\t\taddress: tokenAddress as `0x${string}`,\n\t\t\t\tabi: abiErc20,\n\t\t\t\tfunctionName: \"approve\",\n\t\t\t\targs: [spenderAddress, maxAmount],\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttxHash: hash || \"tempHash\",\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Token approval failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttxHash: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Check token allowance for a specific spender\n\t */\n\tasync checkAllowance(\n\t\tparams: CheckAllowanceParams\n\t): Promise<CheckAllowanceResult> {\n\t\tconst {\n\t\t\ttokenAddress,\n\t\t\townerAddress,\n\t\t\tspenderAddress,\n\t\t\tnetwork,\n\t\t\tusername,\n\t\t} = params;\n\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork,\n\t\t\t\tfromToken: tokenAddress,\n\t\t\t\twalletAddress: ownerAddress,\n\t\t\t\tusername: username || localStorage.getItem(\"username\"),\n\t\t\t\tspender: spenderAddress,\n\t\t\t};\n\t\t\tconst response = await this.makeRequest<AllowanceData>(\n\t\t\t\t\"/apiSwap/getAllowance\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to check allowance\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst allowanceAmount = response.data.allowance;\n\t\t\treturn {\n\t\t\t\thasAllowance: Number(allowanceAmount) > 0,\n\t\t\t\tallowanceAmount,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Allowance check failed:\", error);\n\t\t\treturn {\n\t\t\t\thasAllowance: false,\n\t\t\t\tallowanceAmount: \"0\",\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Execute a token swap\n\t */\n\tasync executeSwap(params: ExecuteSwapParams): Promise<ExecuteSwapResult> {\n\t\tconst {\n\t\t\tnetwork,\n\t\t\tfromToken,\n\t\t\ttoToken,\n\t\t\tamount,\n\t\t\twalletAddress,\n\t\t\treceiver,\n\t\t\tslippage = \"Auto\",\n\t\t\tusername,\n\t\t\tprimaryWallet, // Use the primary wallet for authentication\n\t\t} = params;\n\n\t\tif (!primaryWallet) {\n\t\t\tthrow new Error(\"Primary wallet is not set\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst swapData = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork,\n\t\t\t\tfromToken,\n\t\t\t\ttoToken,\n\t\t\t\tamount,\n\t\t\t\twalletAddress,\n\t\t\t\tslippage,\n\t\t\t\tusername,\n\t\t\t\t...(receiver && { receiver }),\n\t\t\t};\n\n\t\t\tconst swapResponse = await this.makeRequest<SwapTransactionData>(\n\t\t\t\t\"/apiSwap/swap\",\n\t\t\t\t\"POST\",\n\t\t\t\tswapData\n\t\t\t);\n\n\t\t\tif (swapResponse.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tswapResponse.message || \"Swap preparation failed\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Execute transaction\n\t\t\tconst txDetails = swapResponse.data;\n\n\t\t\tconst tx = {\n\t\t\t\tto: txDetails.to,\n\t\t\t\tdata: txDetails.data,\n\t\t\t\tvalue: txDetails.value,\n\t\t\t\tfrom: walletAddress,\n\t\t\t};\n\n\t\t\tconst walletClient = await this.primaryWallet?.getWalletClient();\n\t\t\tconst hash = await walletClient?.sendTransaction(\n\t\t\t\ttx as unknown as SendTransactionParameters\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttxHash: hash || \"tempHash\",\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Swap execution failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttxHash: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Execute a direct token transfer (ERC-20)\n\t */\n\tasync executeTokenTransfer(\n\t\tparams: ExecuteTokenTransferParams\n\t): Promise<ExecuteTokenTransferResult> {\n\t\tconst {\n\t\t\ttokenAddress,\n\t\t\trecipientAddress,\n\t\t\tamount,\n\t\t\tdecimals = 6,\n\t\t\tisNative = false,\n\t\t} = params;\n\t\ttry {\n\t\t\tconst walletClient = await this.primaryWallet?.getWalletClient();\n\n\t\t\tif (!isNative) {\n\t\t\t\tconst hash = await walletClient?.writeContract({\n\t\t\t\t\taddress: tokenAddress as `0x${string}`,\n\t\t\t\t\tabi: parseAbi([\n\t\t\t\t\t\t\"function transfer(address to, uint256 amount) returns (bool)\",\n\t\t\t\t\t]),\n\t\t\t\t\tfunctionName: \"transfer\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\trecipientAddress as `0x${string}`,\n\t\t\t\t\t\tparseUnits(amount.toString(), decimals),\n\t\t\t\t\t],\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\ttxHash: hash || \"tempHash\",\n\t\t\t\t\terror: null,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst hash = await walletClient?.sendTransaction({\n\t\t\t\tto: recipientAddress as `0x${string}`,\n\t\t\t\tvalue: parseUnits(amount.toString(), 18), // amount in ETH/MATIC etc.\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttxHash: hash || \"tempHash\",\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Token transfer failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttxHash: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t// --- API METHODS ---\n\n\t/**\n\t * Record deposit in the backend system\n\t */\n\tasync recordDeposit(\n\t\tparams: RecordDepositParams,\n\t\tjwtToken?: string\n\t): Promise<RecordDepositResult> {\n\t\tconst {\n\t\t\tusername,\n\t\t\ttoAddress,\n\t\t\ttxHash,\n\t\t\tnetwork,\n\t\t\tamount,\n\t\t\ttokenAddress,\n\t\t\twalletAddress,\n\t\t\ttoken_type,\n\t\t\tcountry = \"\",\n\t\t\tcity = \"\",\n\t\t\tipAddress = \"\",\n\t\t} = params;\n\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tusername,\n\t\t\t\tto_address: toAddress,\n\t\t\t\thash: txHash,\n\t\t\t\tnetwork,\n\t\t\t\tamount,\n\t\t\t\ttokenAddress,\n\t\t\t\twalletAddress,\n\t\t\t\tcountry,\n\t\t\t\tcity,\n\t\t\t\tip_address: ipAddress,\n\t\t\t\tjwt_type: this.jwtType,\n\t\t\t\ttoken_type,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<DepositData>(\n\t\t\t\t\"/api/depositWallet\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken || getAuthToken()\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(response.message || \"Failed to record deposit\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: response.data,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Recording deposit failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Record swap deposit in the backend system\n\t */\n\tasync recordSwapDeposit(\n\t\tparams: RecordSwapDepositParams,\n\t\tjwtToken?: string\n\t): Promise<RecordSwapDepositResult> {\n\t\tconst { username, txHash, network, amount } = params;\n\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tusername,\n\t\t\t\thash: txHash,\n\t\t\t\tnetwork,\n\t\t\t\tamount,\n\t\t\t\tjwt_type: this.jwtType,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<SwapDepositData>(\n\t\t\t\t\"/api/depositWalletSwap\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken || getAuthToken()\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to record swap deposit\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: response.data,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Recording swap deposit failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Record manual deposit in the backend system when autodepo is OFF\n\t */\n\tasync recordManualDeposit(\n\t\t// eslint-disable-next-line\n\t\t_params: RecordManualDepositParams,\n\t\t// eslint-disable-next-line\n\t\t_jwtToken?: string\n\t): Promise<RecordManualDepositResult> {\n\t\t// Currently commented out in original implementation\n\t\ttry {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: null,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Recording manual deposit failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tdata: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get token conversion rate with caching\n\t */\n\tasync getTokenConversion(\n\t\tparams: GetTokenConversionParams\n\t): Promise<GetTokenConversionResult> {\n\t\tconst { network, fromToken, toToken, amount, username } = params;\n\n\t\tif (!amount) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tconversion: null,\n\t\t\t\terror: new Error(\"Amount is required for conversion\"),\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(\n\t\t\t\tnetwork.toString(),\n\t\t\t\tfromToken,\n\t\t\t\ttoToken\n\t\t\t);\n\t\t\tconst cachedConversion = this.getCachedConversion(cacheKey);\n\n\t\t\tif (cachedConversion) {\n\t\t\t\tconst rate =\n\t\t\t\t\tcachedConversion.toAmount / cachedConversion.fromAmount;\n\t\t\t\tconst calculatedToAmount = amount * rate;\n\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tconversion: {\n\t\t\t\t\t\tfromToken,\n\t\t\t\t\t\ttoToken,\n\t\t\t\t\t\tfromAmount: amount,\n\t\t\t\t\t\ttoAmount: calculatedToAmount,\n\t\t\t\t\t},\n\t\t\t\t\terror: null,\n\t\t\t\t\tfromCache: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork,\n\t\t\t\tfromToken,\n\t\t\t\ttoToken,\n\t\t\t\tamount: 1,\n\t\t\t\tusername,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<ConversionData>(\n\t\t\t\t\"/apiSwap/getConvert\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to get token conversion\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst baseConversion = response.data;\n\t\t\tthis.setCachedConversion(cacheKey, baseConversion);\n\n\t\t\tconst rate = baseConversion.toAmount / baseConversion.fromAmount;\n\t\t\tconst calculatedToAmount = amount * rate;\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tconversion: {\n\t\t\t\t\tfromToken,\n\t\t\t\t\ttoToken,\n\t\t\t\t\tfromAmount: amount,\n\t\t\t\t\ttoAmount: calculatedToAmount,\n\t\t\t\t},\n\t\t\t\terror: null,\n\t\t\t\tfromCache: false,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting token conversion failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tconversion: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Fetch destination wallet for deposit\n\t */\n\tasync getDestinationWallet(\n\t\tnetworkId: number,\n\t\tjwtToken?: string\n\t): Promise<GetDestinationWalletResult> {\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork: networkId,\n\t\t\t\tjwt_type: this.jwtType,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<WalletAgentData>(\n\t\t\t\t\"/api/getWalletAgent\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken || getAuthToken()\n\t\t\t);\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to get destination wallet\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\twalletAddress: response.data.wallet_address,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting destination wallet failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\twalletAddress: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync getTipWallet(\n\t\tnetworkId: number | string,\n\t\tjwtToken?: string\n\t): Promise<GetTipWalletResult> {\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork: networkId,\n\t\t\t\tjwt_type: this.jwtType,\n\t\t\t};\n\n\t\t\tconst response = (await this.makeRequest<TipWalletResponse>(\n\t\t\t\t\"/api/getTipWallet\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken || getAuthToken()\n\t\t\t)) as unknown as TipWalletResponse;\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(response.message || \"Failed to get tip wallet\");\n\t\t\t}\n\n\t\t\tconst tipWallet =\n\t\t\t\tresponse.tip_wallet ?? response.data?.tip_wallet ?? null;\n\t\t\tconst tipMinimum =\n\t\t\t\tresponse.tip_min ?? response.data?.tip_min ?? null;\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttipWallet,\n\t\t\t\ttipMinimum,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting tip wallet failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttipWallet: null,\n\t\t\t\ttipMinimum: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Fetch wallet agent data\n\t * @param network The blockchain network to use\n\t * @param jwtToken Optional JWT token for authentication\n\t * @returns The wallet agent data or an error\n\t */\n\tasync getWalletAgentData(\n\t\tnetwork: string,\n\t\tjwtToken?: string\n\t): Promise<ApiResponse<WalletAgentData>> {\n\t\ttry {\n\t\t\tconst data: WalletAgentApiRequest = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork,\n\t\t\t\tjwt_type: this.jwtType,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<WalletAgentData>(\n\t\t\t\t\"/api/getWalletAgent\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to get wallet agent\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting wallet agent data failed:\", error);\n\t\t\treturn {\n\t\t\t\tdata: {\n\t\t\t\t\tsetting: {\n\t\t\t\t\t\tdeposit_min: \"\",\n\t\t\t\t\t\twithdraw: \"\",\n\t\t\t\t\t\ttip_min: \"\",\n\t\t\t\t\t\tfee: \"\",\n\t\t\t\t\t},\n\t\t\t\t\twallet_address: \"\",\n\t\t\t\t},\n\t\t\t\terror: true,\n\t\t\t\tmessage: (error as Error).message || \"Unknown error\",\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get destination swap information\n\t */\n\tasync getDestinationSwapInfo(\n\t\tnetworkId: string,\n\t\tusername: string,\n\t\tjwtToken?: string\n\t): Promise<GetDestinationSwapInfoResult> {\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork: networkId || localStorage.getItem(\"network\"),\n\t\t\t\tusername,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<SwapInfo>(\n\t\t\t\t\"/apiSwap/getDstSwap\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to get destination swap info\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tswapInfo: response.data,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting destination swap info failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tswapInfo: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get token price information\n\t */\n\tasync getTokenPrice(\n\t\tparams: GetTokenPriceParams,\n\t\tjwtToken?: string\n\t): Promise<GetTokenPriceResult> {\n\t\tconst { network, fromToken, toToken, username } = params;\n\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t\tnetwork,\n\t\t\t\tfromToken,\n\t\t\t\ttoToken,\n\t\t\t\tusername,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<TokenPriceData>(\n\t\t\t\t\"/apiSwap/tokenPrice\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken\n\t\t\t);\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tresponse.message || \"Failed to get token price\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tpriceData: response.data,\n\t\t\t\terror: null,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Getting token price failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tpriceData: null,\n\t\t\t\terror: error as Error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Check transaction status via API\n\t */\n\tasync checkTransactionStatus(\n\t\tparams: CheckTransactionStatusRequest,\n\t\tjwtToken?: string\n\t): Promise<CheckTransactionStatusResponse> {\n\t\ttry {\n\t\t\tconst data = {\n\t\t\t\t...params,\n\t\t\t\tapi_key: this.apiKey,\n\t\t\t};\n\n\t\t\tconst response = await this.makeRequest<CheckTransactionStatusData>(\n\t\t\t\t\"/dynamic/checkTransactionStatus\",\n\t\t\t\t\"POST\",\n\t\t\t\tdata,\n\t\t\t\tjwtToken\n\t\t\t);\n\n\t\t\treturn response as unknown as CheckTransactionStatusResponse;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Checking transaction status failed:\", error);\n\t\t\treturn {\n\t\t\t\terror: true,\n\t\t\t\ttransaction_status: \"FAILED\",\n\t\t\t};\n\t\t}\n\t}\n\n\t// --- PRIVATE CACHE MANAGEMENT METHODS ---\n\n\tprivate getCachedConversion(\n\t\tcacheKey: CacheKey\n\t): CachedConversionData | null {\n\t\ttry {\n\t\t\tconst cached = localStorage.getItem(cacheKey);\n\t\t\tif (cached) {\n\t\t\t\tconst parsedCache = JSON.parse(cached);\n\t\t\t\tif (!this.isCacheExpired(parsedCache)) {\n\t\t\t\t\treturn parsedCache;\n\t\t\t\t} else {\n\t\t\t\t\tlocalStorage.removeItem(cacheKey);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Error reading cached conversion:\", error);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate setCachedConversion(\n\t\tcacheKey: CacheKey,\n\t\tconversionData: ConversionData\n\t): void {\n\t\ttry {\n\t\t\tconst cacheData: CachedConversionData = {\n\t\t\t\t...conversionData,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tlocalStorage.setItem(cacheKey, JSON.stringify(cacheData));\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Error saving conversion to cache:\", error);\n\t\t}\n\t}\n\n\tprivate generateCacheKey(\n\t\tnetwork: string,\n\t\tfromToken: string,\n\t\ttoToken: string\n\t): CacheKey {\n\t\treturn `token_conversion_${network}_${fromToken}_${toToken}`;\n\t}\n\n\tprivate isCacheExpired(\n\t\tcachedData: CachedConversionData,\n\t\texpirationTimeMs = 2 * 60 * 1000\n\t): boolean {\n\t\tif (!cachedData.timestamp) return true;\n\t\treturn Date.now() - cachedData.timestamp > expirationTimeMs;\n\t}\n\n\t// --- PUBLIC CACHE MANAGEMENT METHODS ---\n\n\t/**\n\t * Clear all cached conversion rates or specific token pair\n\t */\n\tclearConversionCache(cacheKey: CacheKey | null = null): void {\n\t\ttry {\n\t\t\tif (cacheKey) {\n\t\t\t\tlocalStorage.removeItem(cacheKey);\n\t\t\t} else {\n\t\t\t\tconst keysToRemove = [];\n\t\t\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\t\t\tconst key = localStorage.key(i);\n\t\t\t\t\tif (key && key.startsWith(\"token_conversion_\")) {\n\t\t\t\t\t\tkeysToRemove.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tkeysToRemove.forEach((key) => localStorage.removeItem(key));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Error clearing conversion cache:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Fetch available withdrawal tokens from API\n\t */\n\t/**\n\t * Fetch available withdrawal tokens from API\n\t */\n\tasync fetchWithdrawTokens(\n\t\tparams: Omit<GetWithdrawWalletRequest, \"api_key\" | \"jwt_type\">,\n\t\tjwtToken?: string\n\t): Promise<GetWithdrawWalletResponse> {\n\t\tconst response = await this.makeRequest<WithdrawToken[]>(\n\t\t\t\"/api/getWithdrawWallet\",\n\t\t\t\"POST\",\n\t\t\t{ ...params, api_key: this.apiKey, jwt_type: this.jwtType },\n\t\t\tjwtToken\n\t\t);\n\t\treturn {\n\t\t\terror: response.error,\n\t\t\tdata: response.data,\n\t\t};\n\t}\n\n\t/**\n\t * Refetch account balance after successful operations\n\t */\n\tasync refetchBalance(\n\t\tparams: {\n\t\t\tapi_key: string;\n\t\t\tjwt_type: string;\n\t\t\tnetwork: number | string;\n\t\t},\n\t\tjwtToken?: string\n\t): // eslint-disable-next-line\n\tPromise<ApiResponse<any>> {\n\t\t// eslint-disable-next-line\n\t\treturn this.makeRequest<any>(\n\t\t\t\"/api/fetchInfo\",\n\t\t\t\"POST\",\n\t\t\tparams,\n\t\t\tjwtToken\n\t\t);\n\t}\n\n\t/**\n\t * Execute manual withdrawal when autowd is OFF\n\t */\n\tasync withdrawWalletManual(\n\t\tparams: {\n\t\t\t// api_key: string;\n\t\t\tusername: string;\n\t\t\tnetwork: number | string;\n\t\t\tamount: string | number;\n\t\t\ttoken_type: string;\n\t\t\ttoken_address: string;\n\t\t\tdst_wallet: string;\n\t\t\tcountry?: string;\n\t\t\tcity?: string;\n\t\t\tip_address?: string;\n\t\t},\n\t\tjwtToken?: string\n\t): Promise<{ error: boolean; message?: string }> {\n\t\tconst response = await this.makeRequest<{\n\t\t\terror: boolean;\n\t\t\tmessage?: string;\n\t\t}>(\n\t\t\t\"/api/withdrawWalletManual\",\n\t\t\t\"POST\",\n\t\t\t{ ...params, api_key: this.apiKey },\n\t\t\tjwtToken\n\t\t);\n\t\treturn response;\n\t}\n\n\t/**\n\t * Perform risk check before proceeding with withdrawal\n\t */\n\tasync performRiskCheck(\n\t\tparams: Omit<RiskWithdrawRequest, \"api_key\" | \"jwt_type\">,\n\t\tjwtToken?: string\n\t): Promise<RiskWithdrawResponse> {\n\t\tconst data = {\n\t\t\t...params,\n\t\t\tapi_key: this.apiKey,\n\t\t\tjwt_type: this.jwtType,\n\t\t};\n\t\tconst response = await this.makeRequest<RiskWithdrawResponse>(\n\t\t\t\"/api/riskWithdraw\",\n\t\t\t\"POST\",\n\t\t\tdata,\n\t\t\tjwtToken\n\t\t);\n\t\treturn response as unknown as RiskWithdrawResponse;\n\t}\n\n\t/**\n\t * Fetch pre-withdrawal data from the API\n\t */\n\tasync fetchPreWithdrawData(\n\t\tparams: Omit<PreWithdrawRequest, \"api_key\" | \"jwt_type\">,\n\t\tjwtToken?: string\n\t): Promise<PreWithdrawResponse> {\n\t\tconst response = await this.makeRequest<PreWithdrawData>(\n\t\t\t\"/api/preWithdraw/\",\n\t\t\t\"POST\",\n\t\t\t{ ...params, api_key: this.apiKey, jwt_type: this.jwtType },\n\t\t\tjwtToken\n\t\t);\n\t\treturn {\n\t\t\terror: response.error,\n\t\t\tmessage: response.message,\n\t\t\tdata: response.data,\n\t\t};\n\t}\n\n\t/**\n\t * Search for tokens using the apiSwap/searchToken endpoint\n\t */\n\tpublic async searchToken(\n\t\tparams: Omit<SearchTokenRequest, \"api_key\" | \"jwt_type\">,\n\t\tjwtToken?: string\n\t): Promise<SearchTokenResponse> {\n\t\tconst response = await this.makeRequest<SearchTokenResponse[\"data\"]>(\n\t\t\t\"/apiSwap/searchToken\",\n\t\t\t\"POST\",\n\t\t\t{ ...params, api_key: this.apiKey, jwt_type: this.jwtType },\n\t\t\tjwtToken\n\t\t);\n\t\treturn {\n\t\t\terror: response.error,\n\t\t\tdata: response.data,\n\t\t};\n\t}\n}\n\nexport default TransactionService;\n","[\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [],\n\t\t\"name\": \"name\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"string\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": false,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"_spender\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"_value\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"approve\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"bool\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"nonpayable\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [],\n\t\t\"name\": \"totalSupply\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": false,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"_from\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"_to\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"_value\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"transferFrom\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"bool\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"nonpayable\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [],\n\t\t\"name\": \"decimals\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"uint8\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"_owner\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"balanceOf\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"balance\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [],\n\t\t\"name\": \"symbol\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"string\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": false,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"_to\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"_value\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"transfer\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"bool\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"nonpayable\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"constant\": true,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"_owner\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"_spender\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"allowance\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"payable\": false,\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"payable\": true,\n\t\t\"stateMutability\": \"payable\",\n\t\t\"type\": \"fallback\"\n\t},\n\t{\n\t\t\"anonymous\": false,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"indexed\": true,\n\t\t\t\t\"name\": \"owner\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"indexed\": true,\n\t\t\t\t\"name\": \"spender\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"indexed\": false,\n\t\t\t\t\"name\": \"value\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"Approval\",\n\t\t\"type\": \"event\"\n\t},\n\t{\n\t\t\"anonymous\": false,\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"indexed\": true,\n\t\t\t\t\"name\": \"from\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"indexed\": true,\n\t\t\t\t\"name\": \"to\",\n\t\t\t\t\"type\": \"address\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"indexed\": false,\n\t\t\t\t\"name\": \"value\",\n\t\t\t\t\"type\": \"uint256\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"Transfer\",\n\t\t\"type\": \"event\"\n\t}\n]\n","\"use client\";\n\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n\n/**\n * A hook that provides wallet address information for copy functionality.\n * This hook combines data from both the Dynamic SDK and the custom auth context\n * to provide the most accurate wallet address information.\n *\n * @returns An object containing wallet address and related information\n */\nexport const useWalletAddress = () => {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst { user, isLoggedIn, isWalletConnected } = useDynamicAuth();\n\n\t// Get the wallet address from the primary source (Dynamic SDK)\n\tconst walletAddress = primaryWallet?.address || user?.walletAddress;\n\n\t// Determine if we have a valid wallet connection\n\tconst hasWallet = isLoggedIn && isWalletConnected && !!walletAddress;\n\n\treturn {\n\t\t/** The current wallet address */\n\t\taddress: walletAddress,\n\t\t/** Whether the user has a connected wallet */\n\t\thasWallet,\n\t\t/** Whether the user is logged in */\n\t\tisLoggedIn,\n\t\t/** Whether a wallet is connected */\n\t\tisWalletConnected,\n\t\t/** The primary wallet object from Dynamic SDK */\n\t\tprimaryWallet,\n\t\t/** User information from auth context */\n\t\tuser,\n\t};\n};\n\nexport default useWalletAddress;\n","\"use client\";\n\nimport { getSdkConfig } from \"@/config\";\nimport { createContext, useContext, useCallback } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n\tgetAuthToken,\n\tuseDynamicContext,\n\tuseIsLoggedIn,\n\tUserProfile,\n} from \"@dynamic-labs/sdk-react-core\";\nimport type { WalletProviderContextType } from \"@/types/walletProvider/wallet-provider.types\";\nimport { useAppStore } from \"@/store/store\";\nimport { NetworkStateSynchronizer } from \"@/components/common/synchronizers/network-state-synchronizer\";\nimport { TokenStateSynchronizer } from \"@/components/common/synchronizers/token-state-synchronizer\";\nimport { TransactionStateSynchronizer } from \"@/components/common/synchronizers/transactions-state-synchronizer\";\nimport { WebSocketStateSynchronizer } from \"@/components/common/synchronizers/websocket-state-synchronizer\";\n\n// 1. CREATE THE CONTEXT for the generic Wallet Provider\nconst WalletProviderContext = createContext<\n\tWalletProviderContextType | undefined\n>(undefined);\n\n// 2. CREATE THE PROVIDER COMPONENT\n// This component holds the essential, generic wallet state and logic.\nexport const WalletProvider = ({ children }: { children: ReactNode }) => {\n\tconst { user, primaryWallet, setShowAuthFlow, handleLogOut } =\n\t\tuseDynamicContext();\n\tconst isLoggedIn = useIsLoggedIn();\n\tconst authToken = getAuthToken();\n\n\tconst login = () => {\n\t\tsetShowAuthFlow(true);\n\t};\n\n\tconst clearTransactions = useAppStore(\n\t\t(state) => state.blockchain.transaction._updateAndPersist\n\t);\n\n\tconst logout = useCallback(async () => {\n\t\tconsole.log(\"Logging out user from WalletProvider\");\n\n\t\ttry {\n\t\t\tconst sdkConfig = getSdkConfig();\n\t\t\tconst keysToClear = sdkConfig?.logout?.keysToClear || [];\n\t\t\tconst keyPrefixesToClear =\n\t\t\t\tsdkConfig?.logout?.keyPrefixesToClear || [];\n\n\t\t\t// Clear specific user data from localStorage based on config\n\t\t\tkeysToClear.forEach((key) => {\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t});\n\n\t\t\t// Clear items by prefix based on config\n\t\t\tif (keyPrefixesToClear.length > 0) {\n\t\t\t\tObject.keys(localStorage).forEach((key) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tkeyPrefixesToClear.some((prefix) =>\n\t\t\t\t\t\t\tkey.startsWith(prefix)\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Clear Dynamic SDK authentication\n\t\t\tawait handleLogOut();\n\n\t\t\t// Clear transaction store\n\t\t\tclearTransactions([]);\n\n\t\t\tconsole.log(\n\t\t\t\t\"User logged out successfully and localStorage cleared via WalletProvider\"\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error during WalletProvider logout:\", error);\n\t\t}\n\t}, [handleLogOut, clearTransactions]);\n\n\t// The value object passed to the provider\n\tconst value: WalletProviderContextType = {\n\t\tuser: user as UserProfile,\n\t\tisLoggedIn,\n\t\tisWalletConnected: isLoggedIn,\n\t\tauthToken: authToken || null,\n\t\tprimaryWallet,\n\t\tlogin,\n\t\tlogout,\n\t};\n\n\tconst sdkConfig = getSdkConfig();\n\tconst features = sdkConfig?.features;\n\n\treturn (\n\t\t<WalletProviderContext.Provider value={value}>\n\t\t\t{children}\n\t\t\t{features?.enableNetworkStateSync !== false && (\n\t\t\t\t<NetworkStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableTokenStateSync !== false && (\n\t\t\t\t<TokenStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableWebSocketStateSync && (\n\t\t\t\t<WebSocketStateSynchronizer />\n\t\t\t)}\n\t\t\t{features?.enableTransactionStateSync !== false && (\n\t\t\t\t<TransactionStateSynchronizer />\n\t\t\t)}\n\t\t</WalletProviderContext.Provider>\n\t);\n};\n\n// 3. CREATE THE CONSUMER HOOK\n// This is the clean, SDK-facing hook that other internal hooks will use.\n// eslint-disable-next-line\nexport function useWalletProvider(): WalletProviderContextType {\n\tconst context = useContext(WalletProviderContext);\n\tif (context === undefined) {\n\t\tthrow new Error(\n\t\t\t\"useWalletProvider must be used within a WalletProvider\"\n\t\t);\n\t}\n\treturn context;\n}\n","// Localization: import the translation hook\n\n// Wrap user-facing messages with translations in the walletProvider.depositPanel namespace.\n// If this hook uses toast or error strings, prefer keys under walletProvider.depositPanel.errors/*.\n\n// Deposit localization accessor (no `any` or fuzzy fallbacks)\nconst useDepositI18n = () => {\n\treturn {\n\t\terrors: {\n\t\t\tselectTokenAndAmount: \"Please select a token and enter an amount\",\n\t\t\tinsufficientBalance: \"Insufficient balance for this transaction\",\n\t\t\tamountTooHighGas: \"Amount is too high when accounting for gas fees\",\n\t\t\tcheckForm: \"Please check the form and try again\",\n\t\t\tpendingDeposit:\n\t\t\t\t\"You have a pending deposit. Please wait for it to complete\",\n\t\t},\n\t\tstatus: {\n\t\t\tprocessing: \"Proceed in your wallet\",\n\t\t\tawaitingApproval: \"Awaiting Approval\",\n\t\t\tcalculatingRate: \"Calculating Rate...\",\n\t\t\tinsufficientBalance: \"Insufficient Balance\",\n\t\t},\n\t\tprompts: {\n\t\t\tselectToken: \"Select Token\",\n\t\t\tenterAmount: \"Enter Amount\",\n\t\t},\n\t\tbuttons: {\n\t\t\tdepositUsd: (amount: string) => `Deposit ${amount}`,\n\t\t},\n\t\tminimumIs: (min: string) => `Minimum is $${min}`,\n\t};\n};\n\n/*\n * =============================================================================\n * HOOK API DOCUMENTATION (FINAL)\n * =============================================================================\n *\n * This is the main, public-facing hook for the entire Deposit feature. It follows\n * the \"Divide and Conquer\" principle by composing five specialized, single-\n * responsibility child hooks into a single, cohesive API for the UI.\n *\n * --- CHILD HOOKS ---\n *\n * 1. `useTokens`\n *    - RESPONSIBILITY: Provides the list of available tokens for the current network.\n *    - RETURNS: { tokens, nativeToken, usdt, usdx, isTokensLoading, fetchTokens }\n *\n * 2. `useSwapInfo`\n *    - RESPONSIBILITY: Fetches the destination wallet info required for swaps.\n *    - RETURNS: { dstSwapInfo, isLoading }\n *\n * 3. `useDepositFormState`\n *    - RESPONSIBILITY: Manages all user inputs and core form state (token, amount).\n *    - RETURNS: { selectedToken, depositAmount, depositType, isBalanceInsufficient,\n *                 formattedBalance, selectToken, handleAmountChange, setMaxAmount,\n *                 validateDeposit, resetFormState }\n *\n * 4. `useGasManager`\n *    - RESPONSIBILITY: Manages all logic related to gas fees and native tokens.\n *    - RETURNS: { gasReservationAmount, isLowBalance, isNativeCurrency,\n *                 tooltipMessage, showTooltip }\n *\n * 5. `useDepositCalculations`\n *    - RESPONSIBILITY: Manages async conversion rate calculations for UI feedback.\n *    - RETURNS: { minRequiredAmount, usdtConversionAmount, isFetchingConversion }\n *\n * 6. `useDepositTransaction`\n *    - RESPONSIBILITY: Manages the entire on-chain transaction lifecycle.\n *    - RETURNS: { isLoading, isApproving, isApproved, isPending,\n *                 transactionHash, timeLeft, executeTransaction, resetTransactionState }\n *\n * --- MAIN `useDeposit` HOOK ---\n *\n *    - RESPONSIBILITY: Composes all child hooks, provides final validation, and\n *      returns a unified API for the UI component, including computed helpers\n *      like `getButtonText` and `isDepositDisabled`.\n *\n * =============================================================================\n */\n\nimport { useCallback, useEffect } from \"react\";\nimport { toast } from \"sonner\";\n\n// Import all our specialized child hooks\nimport { useTokens } from \"@/hooks/walletProvider/useTokens\";\nimport { useSwapInfo } from \"./useSwapInfo\";\nimport { useDepositFormState } from \"./useDepositFormState\";\nimport { useGasManager } from \"@/hooks/walletProvider/deposit/useGasManger\";\nimport { useDepositCalculations } from \"@/hooks/walletProvider/deposit/useDepositCalclulations\";\nimport { useDepositTransaction } from \"./useDepositTransaction\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { useAppStore } from \"@/store/store\";\n\nexport const useDeposit = () => {\n\t// i18n accessors for messages and labels\n\tconst i18n = useDepositI18n();\n\t// --- 1. COMPOSE THE CHILD HOOKS IN LOGICAL ORDER ---\n\n\t// Provider hooks (data sources)\n\tconst { user } = useDynamicAuth(); // Get accInfo for pendingDepo checks\n\tconst { isTokensLoading } = useTokens();\n\tconst { dstSwapInfo } = useSwapInfo();\n\n\t// Get current chainId from store to monitor network changes\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\n\t// State management and calculation hooks\n\tconst {\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tdepositType,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tsetDepositAmount,\n\t\tsetIsBalanceInsufficient,\n\t\tresetFormState,\n\t} = useDepositFormState();\n\n\tconst {\n\t\tgasReservationAmount,\n\t\tisLowBalance,\n\t\tisNativeCurrency,\n\t\ttooltipMessage,\n\t\tshowTooltip,\n\t} = useGasManager({ selectedToken });\n\n\tconst {\n\t\tminRequiredAmount,\n\t\tusdtConversionAmount,\n\t\tisFetchingConversion,\n\t\tisFetchingMinDepositAmount,\n\t} = useDepositCalculations({ selectedToken, depositAmount, dstSwapInfo });\n\n\t// --- 1.5. MONITOR NETWORK CHANGES AND RESET FORM ---\n\t// This effect clears the selected token when the network changes\n\t// to prevent the bug where a token from the previous network remains selected\n\tuseEffect(() => {\n\t\tif (selectedToken && chainId) {\n\t\t\tresetPage();\n\t\t}\n\t}, [chainId]);\n\n\t// The final execution engine\n\tconst {\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\ttransactionHash,\n\t\ttimeLeft,\n\t\texecuteTransaction,\n\t\tresetTransactionState,\n\t} = useDepositTransaction({\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tdepositType,\n\t\tdstSwapInfo,\n\t\tisBalanceInsufficient,\n\t\tminRequiredAmount,\n\t\tonTransactionComplete: resetFormState, // Reset form when transaction completes\n\t});\n\n\t// --- 2. IMPLEMENT THE FINAL ORCHESTRATION & HELPER LOGIC ---\n\n\t/**\n\t * The final, public-facing executeDeposit function. It performs the last\n\t * set of checks that depend on state from multiple child hooks before\n\t * calling the transaction executor.\n\t */\n\n\tconst setMaxAmount = useCallback(() => {\n\t\tif (!selectedToken) return;\n\t\tif (isNativeCurrency) {\n\t\t\tconst balance = parseFloat(selectedToken.balance);\n\t\t\tconst maxAmount = Math.max(0, balance - gasReservationAmount);\n\t\t\tsetDepositAmount(String(maxAmount));\n\t\t} else {\n\t\t\tsetDepositAmount(selectedToken.balance);\n\t\t}\n\t\tsetIsBalanceInsufficient(false);\n\t}, [\n\t\tselectedToken,\n\t\tisNativeCurrency,\n\t\tgasReservationAmount,\n\t\tsetDepositAmount,\n\t\tsetIsBalanceInsufficient,\n\t]);\n\n\tconst validateDeposit = useCallback(() => {\n\t\tif (\n\t\t\t!selectedToken ||\n\t\t\t!depositAmount ||\n\t\t\tparseFloat(depositAmount) <= 0\n\t\t) {\n\t\t\ttoast.error(i18n.errors.selectTokenAndAmount);\n\t\t\treturn false;\n\t\t}\n\t\tif (parseFloat(depositAmount) > parseFloat(selectedToken.balance)) {\n\t\t\tsetIsBalanceInsufficient(true);\n\t\t\ttoast.error(i18n.errors.insufficientBalance);\n\t\t\treturn false;\n\t\t}\n\t\t// if (parseFloat(depositAmount) < minRequiredAmount) {\n\t\t// \ttoast.error(\n\t\t// \t\t`Minimum deposit is ${minRequiredAmount.toFixed(4)} ${\n\t\t// \t\t\tselectedToken.symbol\n\t\t// \t\t}`\n\t\t// \t);\n\t\t// \treturn false;\n\t\t// }\n\t\tsetIsBalanceInsufficient(false);\n\t\treturn true;\n\t}, [\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tminRequiredAmount,\n\t\tsetIsBalanceInsufficient,\n\t]);\n\n\tconst executeDeposit = useCallback(async () => {\n\t\t// This is the faithful implementation of your original pre-flight checks.\n\t\tif (user && user.pendingDepo === true) {\n\t\t\ttoast.warning(i18n.errors.pendingDeposit);\n\t\t\treturn;\n\t\t}\n\n\t\t// Commenting out the gas reservation check as this does not exist in Dhiraj's Code\n\t\t// if (isNativeCurrency) {\n\t\t// \tconst totalNeeded = parseFloat(depositAmount);\n\t\t// \t// Ensure the deposit amount doesn't consume the gas reservation\n\n\t\t// \tif (\n\t\t// \t\ttotalNeeded >\n\t\t// \t\tparseFloat(selectedToken!.balance) - gasReservationAmount\n\t\t// \t) {\n\t\t// \t\ttoast.error(\"Amount is too high when accounting for gas fees.\");\n\t\t// \t\treturn;\n\t\t// \t}\n\t\t// }\n\n\t\tif (!validateDeposit()) {\n\t\t\ttoast.error(i18n.errors.checkForm);\n\t\t\treturn;\n\t\t}\n\n\t\t// If all checks pass, call the actual transaction execution logic.\n\t\tawait executeTransaction();\n\t}, [\n\t\tuser,\n\t\tisNativeCurrency,\n\t\tdepositAmount,\n\t\tselectedToken,\n\t\tgasReservationAmount,\n\t\tvalidateDeposit,\n\t\tminRequiredAmount,\n\t\texecuteTransaction,\n\t]);\n\n\t/**\n\t * Resets the state of all relevant child hooks.\n\t */\n\tconst resetPage = useCallback(() => {\n\t\tresetFormState();\n\t\tresetTransactionState();\n\t}, [resetFormState, resetTransactionState]);\n\n\t/**\n\t * A UI helper that computes the correct button text based on the\n\t * combined state from multiple child hooks.\n\t */\n\tconst getButtonText = useCallback(() => {\n\t\tif (isPending) return `Confirming on Blockchain ${timeLeft}s`;\n\t\tif (isLoading) return i18n.status.processing;\n\t\tif (isApproving) return i18n.status.awaitingApproval;\n\t\tif (!selectedToken) return i18n.prompts.selectToken;\n\t\tif (!depositAmount || parseFloat(depositAmount) <= 0)\n\t\t\treturn i18n.prompts.enterAmount;\n\t\tif (isFetchingConversion) return i18n.status.calculatingRate;\n\t\tif (isBalanceInsufficient) return i18n.status.insufficientBalance;\n\n\t\tconst displayAmount =\n\t\t\tusdtConversionAmount.toFixed(2) === \"0.00\"\n\t\t\t\t? \" < $0.01\"\n\t\t\t\t: usdtConversionAmount.toFixed(2);\n\t\treturn `${i18n.buttons.depositUsd(displayAmount)} USD`;\n\t}, [\n\t\tisLoading,\n\t\tisApproving,\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tisBalanceInsufficient,\n\t\tminRequiredAmount,\n\t\tusdtConversionAmount,\n\t\tisFetchingConversion,\n\t\tisPending,\n\t\ttimeLeft,\n\t]);\n\n\t/**\n\t * A UI helper that computes if the main action button should be disabled.\n\t */\n\tconst isDepositDisabled = useCallback(() => {\n\t\treturn (\n\t\t\tisLoading ||\n\t\t\tisApproving ||\n\t\t\tisPending ||\n\t\t\t!selectedToken ||\n\t\t\t!depositAmount ||\n\t\t\tparseFloat(depositAmount) <= 0 ||\n\t\t\tisBalanceInsufficient ||\n\t\t\t// parseFloat(depositAmount) < minRequiredAmount ||\n\t\t\tuser?.pendingDepo === true\n\t\t);\n\t}, [\n\t\tisLoading,\n\t\tisApproving,\n\t\tisPending,\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tisBalanceInsufficient,\n\t\tminRequiredAmount,\n\t\tuser,\n\t]);\n\n\t// --- 3. RETURN THE COMPLETE, UNIFIED API ---\n\t// This return object has 100% parity with your requested list.\n\treturn {\n\t\t// State\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tdepositType,\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tminRequiredAmount,\n\t\tusdtConversionAmount,\n\t\ttransactionHash,\n\t\ttimeLeft,\n\t\tgasReservationAmount,\n\t\tisLowBalance,\n\t\tisNativeCurrency,\n\t\tisFetchingMinDepositAmount,\n\t\tMINIMUM_DEPOSIT_AMOUNT: 1, // This is now sourced from a central place\n\t\tisTokensLoading,\n\n\t\t// Actions\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tsetMaxAmount,\n\t\texecuteDeposit,\n\t\tresetPage,\n\n\t\t// UI Helpers\n\t\tgetButtonText,\n\t\tisDepositDisabled,\n\t\ttooltipMessage,\n\t\tshowTooltip,\n\t\tisFetchingConversion,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { SwapInfo } from \"@/types/walletProvider/transaction-service.types\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\n\n/**\n * A dedicated, robust hook to fetch and provide the destination wallet\n * information required for performing swaps.\n *\n * It is resilient to race conditions and memory leaks by using a useEffect\n * cleanup function to cancel obsolete state updates.\n *\n * @returns An object containing the `dstSwapInfo` and a `isLoading` flag.\n */\nexport const useSwapInfo = () => {\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\tconst { user, authToken, isLoggedIn } = useDynamicAuth();\n\tconst username = user?.username;\n\n\tconst [dstSwapInfo, setDstSwapInfo] = useState<SwapInfo | null>(null);\n\tconst [isLoading, setIsLoading] = useState(false);\n\n\tuseEffect(() => {\n\t\t// A flag to prevent state updates if the component unmounts or the dependencies change\n\t\t// before the async operation completes.\n\t\tlet isActive = true;\n\n\t\tconst fetchDstSwap = async () => {\n\t\t\t// Guard clause: Do not run if essential information is missing.\n\t\t\tif (!isLoggedIn || !chainId || !username || !authToken) {\n\t\t\t\tsetDstSwapInfo(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsLoading(true);\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst result = await transactionService.getDestinationSwapInfo(\n\t\t\t\t\tString(chainId),\n\t\t\t\t\tusername,\n\t\t\t\t\tauthToken\n\t\t\t\t);\n\n\t\t\t\t// --- THE CRITICAL CHECK ---\n\t\t\t\t// Only update the state if this effect is still the \"active\" one.\n\t\t\t\tif (isActive) {\n\t\t\t\t\tif (result.success && result.swapInfo) {\n\t\t\t\t\t\tsetDstSwapInfo(result.swapInfo);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDstSwapInfo(null);\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\"Failed to fetch destination swap info:\",\n\t\t\t\t\t\t\tresult.error\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tsetDstSwapInfo(null);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"An unexpected error occurred while fetching swap info:\",\n\t\t\t\t\t\terror\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfetchDstSwap();\n\n\t\t// --- THE CLEANUP FUNCTION ---\n\t\t// This function runs when the component unmounts OR when the effect is re-run\n\t\t// due to a dependency change (e.g., the user switches networks).\n\t\treturn () => {\n\t\t\tisActive = false;\n\t\t};\n\t}, [chainId, isLoggedIn, username, authToken]);\n\n\treturn {\n\t\tdstSwapInfo,\n\t\tisLoading,\n\t};\n};\n","\"use client\";\n\nimport { useState, useMemo, useCallback, useEffect } from \"react\";\nimport { sanitizeAmountInput, formatFullAmount } from \"@/lib/utils\";\nimport { Token } from \"@/types/blockchain/swap.types\";\n\nexport const useDepositFormState = () => {\n\t// --- STATE ---\n\tconst [selectedToken, setSelectedToken] = useState<Token | null>(null);\n\tconst [depositAmount, setDepositAmount] = useState(\"\");\n\tconst [depositType, setDepositType] = useState<\"direct\" | \"swap\">(\"direct\");\n\tconst [isBalanceInsufficient, setIsBalanceInsufficient] = useState(false);\n\n\t// --- DERIVED STATE ---\n\tconst formattedBalance = useMemo(() => {\n\t\tif (!selectedToken?.balance) return \"0.00\";\n\t\treturn parseFloat(formatFullAmount(selectedToken.balance)).toFixed(6);\n\t}, [selectedToken]);\n\n\t// --- ACTIONS ---\n\tconst selectToken = useCallback((token: Token) => {\n\t\tlet tokenType = token.tags?.includes(\"native\") ? \"swap\" : \"direct\";\n\t\tif ([\"USDT\", \"USDC\", \"USD₮0\"].includes(token.symbol)) {\n\t\t\ttokenType = \"direct\";\n\t\t} else {\n\t\t\ttokenType = \"swap\";\n\t\t}\n\t\tsetDepositType(tokenType as \"direct\" | \"swap\");\n\t\tsetSelectedToken(token);\n\t\tsetDepositAmount(\"\");\n\t\tsetIsBalanceInsufficient(false);\n\t}, []);\n\n\tconst handleAmountChange = useCallback((value: string) => {\n\t\tconst sanitizedValue = sanitizeAmountInput(value);\n\t\tsetDepositAmount(sanitizedValue);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (selectedToken && depositAmount) {\n\t\t\tsetIsBalanceInsufficient(\n\t\t\t\tparseFloat(depositAmount) > parseFloat(selectedToken.balance)\n\t\t\t);\n\t\t} else {\n\t\t\tsetIsBalanceInsufficient(false);\n\t\t}\n\t}, [depositAmount, selectedToken]);\n\n\t// --- THE DEFINITIVE FIX IS HERE ---\n\n\tconst resetFormState = useCallback(() => {\n\t\tsetSelectedToken(null);\n\t\tsetDepositAmount(\"\");\n\t\tsetIsBalanceInsufficient(false);\n\t\tsetDepositType(\"direct\");\n\t}, []);\n\n\treturn {\n\t\t// State\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tdepositType,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\n\t\t// Actions\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tresetFormState,\n\t\tsetDepositAmount, // Expose the raw setter for the main hook to use\n\t\tsetIsBalanceInsufficient, // Expose for the main hook\n\t};\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n// Helper function to capitalize text\nexport function capitalize(text: string | undefined): string {\n\tif (!text) return \"\";\n\treturn text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n}\n\n// Helper function to capitalize each word\nexport function capitalizeWords(text: string | undefined): string {\n\tif (!text) return \"\";\n\treturn text\n\t\t.split(\" \")\n\t\t.map(\n\t\t\t(word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t)\n\t\t.join(\" \");\n}\nexport function truncateNumber(number: string, decimals: number) {\n\tif (number === undefined || number === null) return \"0\";\n\tconst num = parseFloat(number);\n\tif (isNaN(num)) return \"0\";\n\n\tconst factor = Math.pow(10, decimals);\n\tconst truncated = Math.trunc(num * factor) / factor;\n\n\treturn truncated.toFixed(decimals);\n}\n\n/**\n * Utility functions for sanitizing user input across the application\n */\n\n/**\n * Sanitizes decimal input by replacing commas with dots and removing invalid characters\n * @param value - The input value to sanitize\n * @returns Sanitized value that only contains valid decimal characters\n */\nexport const sanitizeDecimalInput = (value: string): string => {\n\t// Replace comma with dot\n\tlet sanitized = value.replace(/,/g, \".\");\n\n\t// Remove all characters except digits, dots, and minus sign at the start\n\tsanitized = sanitized.replace(/[^\\d.-]/g, \"\");\n\n\t// Ensure only one dot exists\n\tconst parts = sanitized.split(\".\");\n\tif (parts.length > 2) {\n\t\tsanitized = parts[0] + \".\" + parts.slice(1).join(\"\");\n\t}\n\n\t// Ensure minus sign only appears at the start\n\tif (sanitized.includes(\"-\")) {\n\t\tconst isNegative = sanitized.startsWith(\"-\");\n\t\tsanitized = sanitized.replace(/-/g, \"\");\n\t\tif (isNegative) {\n\t\t\tsanitized = \"-\" + sanitized;\n\t\t}\n\t}\n\n\treturn sanitized;\n};\n\n/**\n * Sanitizes nickname input by removing special characters\n * Only allows alphanumeric characters and underscores\n * @param value - The input value to sanitize\n * @returns Sanitized value with only valid characters\n */\nexport const sanitizeNicknameInput = (value: string): string => {\n\t// Remove special characters, only allow alphanumeric and underscore\n\treturn value.replace(/[^a-zA-Z0-9_]/g, \"\");\n};\n\n/**\n * Sanitizes referral ID input by removing special characters and spaces\n * Only allows alphanumeric characters\n * @param value - The input value to sanitize\n * @returns Sanitized value with only valid characters\n */\nexport const sanitizeReferralIdInput = (value: string): string => {\n\t// Remove all non-alphanumeric characters\n\treturn value.replace(/[^a-zA-Z0-9]/g, \"\");\n};\n\n/**\n * Sanitizes a string to allow only valid numeric input for amounts.\n * Handles decimal points, precision, and leading zeros.\n */\nexport const sanitizeAmountInput = (value: string): string => {\n\tlet sanitized = value.replace(/[^0-9.]/g, \"\");\n\n\tif ((sanitized.match(/\\./g) || []).length > 1) {\n\t\tsanitized = sanitized.substring(0, sanitized.lastIndexOf(\".\"));\n\t}\n\n\tif (sanitized.includes(\".\")) {\n\t\tconst parts = sanitized.split(\".\");\n\t\tsanitized = `${parts[0]}.${parts[1].substring(0, 6)}`;\n\t}\n\n\tif (\n\t\tsanitized.startsWith(\"0\") &&\n\t\tsanitized !== \"0\" &&\n\t\t!sanitized.startsWith(\"0.\")\n\t) {\n\t\tsanitized = sanitized.replace(/^0+/, \"\");\n\t}\n\n\tif (sanitized.startsWith(\".\")) {\n\t\tsanitized = `0${sanitized}`;\n\t}\n\n\treturn sanitized;\n};\n\n/**\n * Formats a full token balance, handling potential scientific notation.\n */\nexport const formatFullAmount = (amount: string | number): string => {\n\tconst amountStr = String(amount);\n\tif (amountStr.includes(\"e\")) {\n\t\tconst parsed = parseFloat(amountStr);\n\t\treturn parsed.toLocaleString(\"fullwide\", {\n\t\t\tuseGrouping: false,\n\t\t\tmaximumFractionDigits: 20,\n\t\t});\n\t}\n\treturn amountStr;\n};\n\n/**\n * Utility functions for localStorage caching with expiration\n */\nexport interface CacheData<T> {\n\tdata: T;\n\ttimestamp: number;\n}\n\n/**\n * Saves data to localStorage with a timestamp\n */\nexport const saveToCache = <T>(key: string, data: T): void => {\n\ttry {\n\t\tconst cacheData: CacheData<T> = {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tlocalStorage.setItem(key, JSON.stringify(cacheData));\n\t} catch (error) {\n\t\tconsole.error(`Error saving to cache (${key}):`, error);\n\t}\n};\n\n/**\n * Loads data from localStorage and checks if it's still valid based on duration\n * @param key - The localStorage key\n * @param maxAge - Maximum age in milliseconds\n * @returns The cached data if valid, null if expired or not found\n */\nexport const loadFromCache = <T>(key: string, maxAge: number): T | null => {\n\ttry {\n\t\tconst cached = localStorage.getItem(key);\n\t\tif (cached) {\n\t\t\tconst { data, timestamp }: CacheData<T> = JSON.parse(cached);\n\t\t\tconst now = Date.now();\n\n\t\t\t// Check if cache is still valid\n\t\t\tif (now - timestamp < maxAge) {\n\t\t\t\treturn data;\n\t\t\t} else {\n\t\t\t\t// Cache expired, remove it\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`Error loading from cache (${key}):`, error);\n\t\tlocalStorage.removeItem(key);\n\t}\n\treturn null;\n};\n\n/**\n * Clears expired cache entries\n * @param key - The localStorage key\n * @param maxAge - Maximum age in milliseconds\n */\nexport const clearExpiredCache = (key: string, maxAge: number): void => {\n\ttry {\n\t\tconst cached = localStorage.getItem(key);\n\t\tif (cached) {\n\t\t\tconst { timestamp }: CacheData<unknown> = JSON.parse(cached);\n\t\t\tconst now = Date.now();\n\n\t\t\tif (now - timestamp >= maxAge) {\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`Error clearing expired cache (${key}):`, error);\n\t\tlocalStorage.removeItem(key);\n\t}\n};\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { Token } from \"@/types/blockchain/swap.types\";\n\n// --- HOOK'S \"CONTRACT\" ---\n// We define the props this hook needs to receive from the main useDeposit hook.\ninterface UseGasManagerProps {\n\tselectedToken: Token | null;\n}\n\n/**\n * Manages all complex logic related to gas fees, native currency detection,\n * and the associated UI feedback (tooltips and balance checks). This is a faithful\n * implementation of the reference code's gas management logic.\n */\nexport const useGasManager = ({ selectedToken }: UseGasManagerProps) => {\n\t// --- STATE ---\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\tconst [gasReservationAmount, setGasReservationAmount] = useState(0);\n\tconst [isLowBalance, setIsLowBalance] = useState(false);\n\tconst [tooltipMessage, setTooltipMessage] = useState(\"\");\n\tconst [showTooltip, setShowTooltip] = useState(false);\n\n\t// --- DERIVED STATE (isNativeCurrency) ---\n\t// This is a faithful implementation of your original isNativeCurrency function.\n\tconst isNativeCurrency = useMemo(() => {\n\t\tif (!selectedToken) return false;\n\t\treturn selectedToken.tags?.includes(\"native\") || false;\n\t}, [selectedToken]);\n\n\t// --- LOGIC IMPLEMENTATION (getGasReservationAmount) ---\n\t// This is a faithful implementation of your original getGasReservationAmount.\n\t// It is now a simple function within the hook, not an async callback.\n\tuseEffect(() => {\n\t\tconst getGasAmount = () => {\n\t\t\tconst feeMap: Record<number, number> = {\n\t\t\t\t1: 0.015, // Ethereum\n\t\t\t\t137: 0.1, // Polygon\n\t\t\t\t42161: 0.0012, // Arbitrum\n\t\t\t\t10: 0.0012, // Optimism\n\t\t\t\t324: 0.0015, // zkSync Era\n\t\t\t\t8453: 0.0012, // Base\n\t\t\t\t56: 0.0015, // BNB Chain\n\t\t\t\t43114: 0.003, // Avalanche\n\t\t\t\t59144: 0.0015, // Linea\n\t\t\t};\n\t\t\treturn feeMap[chainId || 0] || 0.0025; // Default fallback\n\t\t};\n\t\tsetGasReservationAmount(getGasAmount());\n\t}, [chainId]);\n\n\t// --- LOGIC IMPLEMENTATION (Tooltip and Low Balance Checks) ---\n\t// This is a faithful implementation of your two separate useEffects for tooltips,\n\t// combined into one for efficiency.\n\tuseEffect(() => {\n\t\tif (selectedToken && isNativeCurrency) {\n\t\t\t// Logic for native tokens\n\t\t\tconst balance = parseFloat(selectedToken.balance || \"0\");\n\n\t\t\tsetIsLowBalance(balance < gasReservationAmount);\n\t\t\tsetShowTooltip(true);\n\t\t\tsetTooltipMessage(\n\t\t\t\t`${gasReservationAmount} ${selectedToken.symbol} is reserved to cover gas fees.`\n\t\t\t);\n\t\t} else {\n\t\t\t// Logic for non-native tokens\n\t\t\tsetIsLowBalance(false);\n\t\t\tsetShowTooltip(false);\n\t\t\tsetTooltipMessage(\"\");\n\t\t}\n\t}, [selectedToken, isNativeCurrency, gasReservationAmount]);\n\n\treturn {\n\t\tgasReservationAmount,\n\t\tisLowBalance,\n\t\tisNativeCurrency,\n\t\ttooltipMessage,\n\t\tshowTooltip,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { SwapInfo } from \"@/types/walletProvider/transaction-service.types\";\nimport { toast } from \"sonner\";\n// import { useDebounce } from \"../useDebounce\";\n\n// --- HOOK'S \"CONTRACT\" ---\n// We define the props this hook needs to receive from the main useDeposit hook.\ninterface UseDepositCalculationsProps {\n\tselectedToken: Token | null;\n\tdepositAmount: string;\n\tdstSwapInfo: SwapInfo | null;\n}\n\n/**\n * A dedicated, self-contained hook with a single responsibility:\n * to manage all asynchronous, off-chain calculations needed for the deposit UI.\n *\n * It is responsible for:\n * 1. Calculating the dynamic minimum deposit amount for non-stablecoin tokens.\n * 2. Calculating the real-time USDT conversion value for the user's input amount.\n *\n * It is resilient to race conditions and memory leaks.\n */\nexport const useDepositCalculations = ({\n\tselectedToken,\n\tdepositAmount,\n\tdstSwapInfo,\n}: UseDepositCalculationsProps) => {\n\t// --- 1. Get Dependencies from State and Context ---\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\tconst { user, authToken } = useDynamicAuth();\n\tconst username = user?.username;\n\n\t// --- 2. Manage the Hook's Own State ---\n\tconst [minRequiredAmount, setMinRequiredAmount] = useState<number | null>(\n\t\tnull\n\t);\n\tconst [usdtConversionAmount, setUsdtConversionAmount] = useState(0);\n\tconst [isFetchingMinDepositAmount, setIsFetchingMinDepositAmount] =\n\t\tuseState(false);\n\tconst [isFetchingConversion, setIsFetchingConversion] = useState(false);\n\n\t// --- DEBOUNCING FOR PERFORMANCE ---\n\t// We debounce the user's input to prevent API spam while they are typing.\n\t// Lightweight inline debounce via a ref/timer to avoid extra hook churn\n\tconst debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\t// Deduplication refs to avoid firing the same request repeatedly\n\tconst lastUsdDepsRef = useRef<string>(\"\");\n\tconst lastMinDepsRef = useRef<string>(\"\");\n\n\t// --- 3. The Core Logic Effects ---\n\n\t// Effect for calculating the minimum required deposit amount.\n\tuseEffect(() => {\n\t\tconst calculateMinAmount = async () => {\n\t\t\t// Guard clause: Don't run if the necessary data isn't available.\n\t\t\tif (!selectedToken || !username || !chainId || !dstSwapInfo) {\n\t\t\t\tsetMinRequiredAmount(null); // Reset to default\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For stablecoins, the minimum is fixed and doesn't require an API call.\n\t\t\tif (\n\t\t\t\t[\"USDT\", \"USDC\", \"55Swap\", \"USD₮0\"].includes(\n\t\t\t\t\tselectedToken.symbol\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsetIsFetchingMinDepositAmount(true);\n\t\t\t\ttry {\n\t\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\t\tconst response =\n\t\t\t\t\t\tawait transactionService.getWalletAgentData(\n\t\t\t\t\t\t\tString(chainId),\n\t\t\t\t\t\t\tauthToken\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t!response.error &&\n\t\t\t\t\t\tresponse.data?.setting?.deposit_min\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst minAmount = parseFloat(\n\t\t\t\t\t\t\tresponse.data.setting.deposit_min\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMinRequiredAmount(\n\t\t\t\t\t\t\tisNaN(minAmount) ? null : minAmount\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetMinRequiredAmount(null);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t`Error fetching minimum deposit amount. Please try again. ${error}`\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Failed to fetch wallet agent config for deposit:\",\n\t\t\t\t\t\terror\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tsetIsFetchingMinDepositAmount(false);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// maybe i need to comment out this shit later\n\t\t\tsetIsFetchingConversion(true);\n\n\t\t\tsetIsFetchingMinDepositAmount(true);\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\n\t\t\t\tconst result = await transactionService.getTokenConversion({\n\t\t\t\t\tnetwork: chainId,\n\t\t\t\t\t// Find out how much of the selected token is equal to our minimum USD deposit.\n\t\t\t\t\tfromToken: dstSwapInfo.token_address,\n\t\t\t\t\ttoToken: selectedToken.address,\n\t\t\t\t\tamount: 1,\n\t\t\t\t\tusername,\n\t\t\t\t});\n\n\t\t\t\tif (result.success && result.conversion) {\n\t\t\t\t\t// The API tells us the equivalent `fromAmount` needed.\n\t\t\t\t\tsetMinRequiredAmount(result.conversion.toAmount);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\ttoast.error(\n\t\t\t\t\t`Error fetching minimum deposit amount. Please try again. ${error}`\n\t\t\t\t);\n\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Failed to calculate minimum deposit amount:\",\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetIsFetchingMinDepositAmount(false);\n\t\t\t\t// maybe i need to comment out this shit later\n\t\t\t\tsetIsFetchingConversion(false);\n\t\t\t}\n\t\t};\n\n\t\t// Dedupe: run only if deps changed meaningfully\n\t\tconst minKey = JSON.stringify({\n\t\t\tchainId,\n\t\t\tusername,\n\t\t\tselected: selectedToken?.address,\n\t\t\tdst: dstSwapInfo?.token_address,\n\t\t});\n\t\tif (lastMinDepsRef.current !== minKey) {\n\t\t\tlastMinDepsRef.current = minKey;\n\t\t\tcalculateMinAmount();\n\t\t}\n\t}, [selectedToken, chainId, username, depositAmount]);\n\n\tuseEffect(() => {\n\t\tlet isActive = true;\n\n\t\tconst calculateUsdValue = async () => {\n\t\t\tif (\n\t\t\t\t!selectedToken ||\n\t\t\t\t!depositAmount ||\n\t\t\t\t!username ||\n\t\t\t\t!chainId ||\n\t\t\t\t!dstSwapInfo ||\n\t\t\t\tparseFloat(depositAmount) <= 0\n\t\t\t) {\n\t\t\t\tsetUsdtConversionAmount(0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\t[\"USDT\", \"USDC\", \"55Swap\", \"USD₮0\"].includes(\n\t\t\t\t\tselectedToken.symbol\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tsetUsdtConversionAmount(parseFloat(depositAmount));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsFetchingConversion(true);\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst result = await transactionService.getTokenConversion({\n\t\t\t\t\tnetwork: chainId,\n\t\t\t\t\tfromToken: selectedToken.address,\n\t\t\t\t\ttoToken: dstSwapInfo.token_address,\n\t\t\t\t\tamount: parseFloat(depositAmount),\n\t\t\t\t\tusername,\n\t\t\t\t});\n\n\t\t\t\tif (isActive && result.success && result.conversion) {\n\t\t\t\t\tsetUsdtConversionAmount(result.conversion.toAmount);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (isActive) setUsdtConversionAmount(0);\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Failed to calculate USDT conversion value:\",\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tif (isActive) setIsFetchingConversion(false);\n\t\t\t}\n\t\t};\n\n\t\t// Debounce and dedupe: only call when inputs settle and actually change\n\t\tconst usdKey = JSON.stringify({\n\t\t\tchainId,\n\t\t\tusername,\n\t\t\tselected: selectedToken?.address,\n\t\t\tdst: dstSwapInfo?.token_address,\n\t\t\tamount: depositAmount,\n\t\t});\n\t\tif (lastUsdDepsRef.current !== usdKey) {\n\t\t\tlastUsdDepsRef.current = usdKey;\n\t\t\tif (debounceTimerRef.current)\n\t\t\t\tclearTimeout(debounceTimerRef.current);\n\t\t\tdebounceTimerRef.current = setTimeout(() => {\n\t\t\t\tcalculateUsdValue();\n\t\t\t}, 400);\n\t\t}\n\n\t\treturn () => {\n\t\t\tisActive = false;\n\t\t\tif (debounceTimerRef.current) {\n\t\t\t\tclearTimeout(debounceTimerRef.current);\n\t\t\t\tdebounceTimerRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [selectedToken, depositAmount, chainId, username]);\n\n\t// --- 4. Return the Final API ---\n\treturn {\n\t\tminRequiredAmount: minRequiredAmount as number,\n\t\tusdtConversionAmount,\n\t\tisFetchingConversion,\n\t\tisFetchingMinDepositAmount,\n\t};\n};\n","//================================= v3 =================================\n\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport {\n\tTransactionType,\n\tTransactionStatus,\n} from \"@/types/blockchain/transactions.types\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { toast } from \"sonner\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { getSdkConfig } from \"@/config\";\nimport confetti from \"canvas-confetti\";\nimport { PrimaryWalletWithClient } from \"@/types/walletProvider/transaction-service.types\";\n\n// --- HOOK'S \"CONTRACT\" (What it needs to receive) ---\ninterface UseDepositTransactionProps {\n\tselectedToken: Token | null;\n\tdepositAmount: string;\n\tdepositType: \"direct\" | \"swap\";\n\tdstSwapInfo: { token_address: string; wallet_address: string } | null;\n\tisBalanceInsufficient: boolean;\n\tminRequiredAmount: number;\n\tonTransactionComplete?: () => void; // Callback when transaction completes (success or failure)\n}\n\n// --- MAIN HOOK ---\nexport const useDepositTransaction = ({\n\tselectedToken,\n\tdepositAmount,\n\tdepositType,\n\tdstSwapInfo,\n\t// isBalanceInsufficient,\n\t// minRequiredAmount,\n\tonTransactionComplete,\n}: UseDepositTransactionProps) => {\n\tconst { allowanceAddress: spenderAddress } = getSdkConfig();\n\t// --- STATE ---\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [isApproving, setIsApproving] = useState(false);\n\tconst [isApproved, setIsApproved] = useState(false);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst [transactionHash, setTransactionHash] = useState<string | null>(null);\n\tconst [timeLeft, setTimeLeft] = useState(0);\n\n\t// --- ZUSTAND & CONTEXT CONNECTIONS ---\n\tconst { addTransaction, _updateTransaction } = useAppStore(\n\t\t(state) => state.blockchain.transaction\n\t);\n\tconst fetchTokens = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\tconst { chainId, network } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\tconst { user, refreshUserData, authToken } = useDynamicAuth();\n\tconst { primaryWallet } = useDynamicContext();\n\n\tconst pollingIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\tconst retryCountRef = useRef<number>(0);\n\tconst transactionService = TransactionService.getInstance();\n\n\t// Set primary wallet for authentication-aware transactions\n\tuseEffect(() => {\n\t\tif (primaryWallet) {\n\t\t\ttransactionService.setPrimaryWallet(\n\t\t\t\tprimaryWallet as unknown as PrimaryWalletWithClient\n\t\t\t);\n\t\t}\n\t}, [primaryWallet, transactionService]);\n\n\t// --- LOGIC ---\n\n\t// Check allowance when token or user changes\n\tuseEffect(() => {\n\t\tif (\n\t\t\t!selectedToken ||\n\t\t\t!user?.walletAddress ||\n\t\t\tselectedToken.tags?.includes(\"native\")\n\t\t) {\n\t\t\tsetIsApproved(true);\n\t\t\treturn;\n\t\t}\n\t\tconst check = async () => {\n\t\t\tconst { hasAllowance } = await transactionService.checkAllowance({\n\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\townerAddress: user.walletAddress!,\n\t\t\t\tspenderAddress: spenderAddress, // Use the actual spender address from env\n\t\t\t\tnetwork: network?.name || String(chainId),\n\t\t\t\tusername: user.username,\n\t\t\t});\n\n\t\t\tconsole.log(\"Allowance check result:\", hasAllowance);\n\t\t\tsetIsApproved(hasAllowance);\n\t\t};\n\t\tcheck();\n\t}, [\n\t\tselectedToken,\n\t\tuser,\n\t\tchainId,\n\t\tnetwork,\n\t\ttransactionService,\n\t\tspenderAddress,\n\t]);\n\n\t// Countdown timer logic\n\tuseEffect(() => {\n\t\tif (!isPending || timeLeft <= 0) {\n\t\t\tif (pollingIntervalRef.current)\n\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t\treturn;\n\t\t}\n\t\tconst timer = setInterval(\n\t\t\t() => setTimeLeft((prev) => (prev > 0 ? prev - 1 : 0)),\n\t\t\t1000\n\t\t);\n\t\treturn () => clearInterval(timer);\n\t}, [isPending, timeLeft]);\n\n\t// Fallback polling logic with retry handling\n\tconst pollTransactionStatus = useCallback(\n\t\tasync (hash: string, retryCount = 0) => {\n\t\t\tconst MAX_RETRIES = 30; // Maximum number of retries (90 seconds with 3-second intervals)\n\n\t\t\ttry {\n\t\t\t\tconst response =\n\t\t\t\t\tawait transactionService.checkTransactionStatus({\n\t\t\t\t\t\ttransaction_type: \"DEPO\",\n\t\t\t\t\t\thash,\n\t\t\t\t\t\tusername: user?.username || \"\",\n\t\t\t\t\t});\n\n\t\t\t\tconsole.log(\"Polling response:\", response);\n\n\t\t\t\t// If error is true (which indicates \"Transaction Not Found\")\n\t\t\t\tif (response.error === true) {\n\t\t\t\t\t// Increment retry count\n\t\t\t\t\tif (retryCount < MAX_RETRIES) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`Transaction not found, retry ${\n\t\t\t\t\t\t\t\tretryCount + 1\n\t\t\t\t\t\t\t}/${MAX_RETRIES}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn; // Continue polling\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Max retries reached\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"Max retries reached for transaction polling\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (pollingIntervalRef.current) {\n\t\t\t\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetIsPending(false);\n\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\"Transaction confirmation timeout. Please check your wallet or try again.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Call completion callback for timeout/failed transaction\n\t\t\t\t\t\tif (onTransactionComplete) {\n\t\t\t\t\t\t\tonTransactionComplete();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check for successful confirmation\n\t\t\t\tconst tx = useAppStore\n\t\t\t\t\t.getState()\n\t\t\t\t\t.blockchain.transaction.transactions.find(\n\t\t\t\t\t\t(t) => t.hash === hash\n\t\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\ttx &&\n\t\t\t\t\tresponse.error === false &&\n\t\t\t\t\tresponse.transaction_status === \"CONFIRMED\"\n\t\t\t\t) {\n\t\t\t\t\tif (pollingIntervalRef.current)\n\t\t\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t\t\t\tsetIsPending(false);\n\t\t\t\t\t_updateTransaction(tx.id, {\n\t\t\t\t\t\tstatus: TransactionStatus.CONFIRMED,\n\t\t\t\t\t});\n\t\t\t\t\ttoast.success(\"Deposit Confirmed!\");\n\t\t\t\t\tconfetti({\n\t\t\t\t\t\tspread: 360,\n\t\t\t\t\t\tticks: 50,\n\t\t\t\t\t\tgravity: 0,\n\t\t\t\t\t\tdecay: 0.94,\n\t\t\t\t\t\tstartVelocity: 30,\n\t\t\t\t\t\tcolors: [\n\t\t\t\t\t\t\t\"#FFE400\",\n\t\t\t\t\t\t\t\"#FFBD00\",\n\t\t\t\t\t\t\t\"#E89400\",\n\t\t\t\t\t\t\t\"#FFCA6C\",\n\t\t\t\t\t\t\t\"#FDFFB8\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tparticleCount: 40,\n\t\t\t\t\t\tscalar: 1.2,\n\t\t\t\t\t\tshapes: [\"star\", \"circle\"],\n\t\t\t\t\t});\n\t\t\t\t\trefreshUserData();\n\n\t\t\t\t\t// Refresh token list after successful deposit\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fetchTokens(true, { user, authToken });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"Failed to refresh tokens after deposit:\",\n\t\t\t\t\t\t\terror\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Call completion callback for successful transaction\n\t\t\t\t\tif (onTransactionComplete) {\n\t\t\t\t\t\tonTransactionComplete();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Polling failed:\", error);\n\t\t\t\t// Don't stop polling on network errors, but limit retries\n\t\t\t\tif (retryCount >= MAX_RETRIES) {\n\t\t\t\t\tif (pollingIntervalRef.current) {\n\t\t\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t\t\t\t}\n\t\t\t\t\tsetIsPending(false);\n\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\"Unable to confirm transaction. Please check manually.\"\n\t\t\t\t\t);\n\t\t\t\t\t// Call completion callback for failed transaction\n\t\t\t\t\tif (onTransactionComplete) {\n\t\t\t\t\t\tonTransactionComplete();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\t_updateTransaction,\n\t\t\trefreshUserData,\n\t\t\ttransactionService,\n\t\t\tfetchTokens,\n\t\t\tuser,\n\t\t\tauthToken,\n\t\t\tonTransactionComplete,\n\t\t\t// user?.username,\n\t\t]\n\t);\n\n\tuseEffect(() => {\n\t\tif (isPending && transactionHash) {\n\t\t\tretryCountRef.current = 0; // Reset retry count when starting new polling\n\t\t\tpollingIntervalRef.current = setInterval(() => {\n\t\t\t\tpollTransactionStatus(transactionHash, retryCountRef.current);\n\t\t\t\tretryCountRef.current += 1; // Increment retry count\n\t\t\t}, 3000);\n\t\t}\n\t\treturn () => {\n\t\t\tif (pollingIntervalRef.current)\n\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t};\n\t}, [isPending, transactionHash, pollTransactionStatus]);\n\n\t// This is the definitive, faithful implementation of your original executeTransaction function\n\tconst executeTransaction = useCallback(async () => {\n\t\tif (!selectedToken || !depositAmount || !user || !chainId || !network)\n\t\t\treturn;\n\n\t\t// Pre-flight checks from your original code\n\t\tif (user.pendingDepo) {\n\t\t\ttoast.warning(\"A deposit is still processing.\");\n\t\t\treturn;\n\t\t}\n\t\t// will enable it in future when the application is production ready currently comemented to avoid blocking UI (development purposes only)\n\t\t// if (\n\t\t// \tisBalanceInsufficient ||\n\t\t// \tparseFloat(depositAmount) < minRequiredAmount\n\t\t// ) {\n\t\t// \ttoast.error(\"Invalid amount or insufficient balance.\");\n\t\t// \treturn;\n\t\t// }\n\n\t\tsetIsLoading(true);\n\t\tlet depositSuccess = false;\n\t\ttry {\n\t\t\tconst isAutoDepositOn = user.autodepo?.toUpperCase() !== \"OFF\";\n\t\t\tlet txResult: {\n\t\t\t\tsuccess: boolean;\n\t\t\t\ttxHash: string | null;\n\t\t\t\terror: Error | null;\n\t\t\t};\n\n\t\t\tif (!isApproved && !selectedToken.tags?.includes(\"native\")) {\n\t\t\t\tsetIsApproving(true);\n\t\t\t\tconst approveResult = await transactionService.approveToken({\n\t\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\t\tspenderAddress: spenderAddress,\n\t\t\t\t});\n\t\t\t\tif (!approveResult.success)\n\t\t\t\t\tthrow approveResult.error || new Error(\"Approval failed\");\n\t\t\t\tsetIsApproving(false);\n\t\t\t\tsetIsApproved(true);\n\t\t\t}\n\n\t\t\tconst destinationWalletResult =\n\t\t\t\tawait transactionService.getDestinationWallet(\n\t\t\t\t\tchainId,\n\t\t\t\t\tauthToken\n\t\t\t\t);\n\t\t\tif (\n\t\t\t\t!destinationWalletResult.success ||\n\t\t\t\t!destinationWalletResult.walletAddress\n\t\t\t) {\n\t\t\t\tthrow (\n\t\t\t\t\tdestinationWalletResult.error ||\n\t\t\t\t\tnew Error(\"Could not get destination wallet.\")\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst destinationAddress = destinationWalletResult.walletAddress;\n\n\t\t\tif (!isAutoDepositOn) {\n\t\t\t\ttxResult = await transactionService.executeTokenTransfer({\n\t\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\t\trecipientAddress: destinationAddress,\n\t\t\t\t\tamount: depositAmount,\n\t\t\t\t\tdecimals: selectedToken.decimals,\n\t\t\t\t});\n\t\t\t\tif (!txResult.success || !txResult.txHash)\n\t\t\t\t\tthrow txResult.error || new Error(\"Manual transfer failed\");\n\t\t\t\tawait transactionService.recordManualDeposit({\n\t\t\t\t\tusername: user.username,\n\t\t\t\t\ttxHash: txResult.txHash,\n\t\t\t\t\tnetwork: network.name,\n\t\t\t\t\tamount: depositAmount,\n\t\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\t\ttoAddress: destinationAddress,\n\t\t\t\t\ttokenType: selectedToken.symbol,\n\t\t\t\t\tdstWallet: destinationAddress,\n\t\t\t\t});\n\t\t\t\tdepositSuccess = true;\n\t\t\t} else {\n\t\t\t\tconst isStablecoin = [\n\t\t\t\t\t\"USDT\",\n\t\t\t\t\t\"USDC\",\n\t\t\t\t\t\"55Swap\",\n\t\t\t\t\t\"USD₮0\",\n\t\t\t\t].includes(selectedToken.symbol);\n\t\t\t\tif (isStablecoin || depositType === \"direct\") {\n\t\t\t\t\ttxResult = await transactionService.executeTokenTransfer({\n\t\t\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\t\t\trecipientAddress: destinationAddress,\n\t\t\t\t\t\tamount: depositAmount,\n\t\t\t\t\t\tdecimals: selectedToken.decimals,\n\t\t\t\t\t});\n\t\t\t\t\tdepositSuccess = txResult.success;\n\t\t\t\t} else if (depositType === \"swap\" && dstSwapInfo) {\n\t\t\t\t\ttxResult = await transactionService.executeSwap({\n\t\t\t\t\t\tnetwork: network.name,\n\t\t\t\t\t\tfromToken: selectedToken.address,\n\t\t\t\t\t\ttoToken: dstSwapInfo.token_address,\n\t\t\t\t\t\tamount: depositAmount,\n\t\t\t\t\t\twalletAddress: user.walletAddress!,\n\t\t\t\t\t\treceiver: dstSwapInfo.wallet_address,\n\t\t\t\t\t\tslippage: \"1\",\n\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t\tprimaryWallet:\n\t\t\t\t\t\t\tprimaryWallet as unknown as PrimaryWalletWithClient,\n\t\t\t\t\t});\n\t\t\t\t\tdepositSuccess = txResult.success;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid deposit path\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!depositSuccess || !txResult.txHash) {\n\t\t\t\tthrow (\n\t\t\t\t\ttxResult.error ||\n\t\t\t\t\tnew Error(\"Transaction failed to return a hash.\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetTransactionHash(txResult.txHash);\n\t\t\tsetIsPending(true);\n\t\t\tsetTimeLeft(90);\n\t\t\taddTransaction({\n\t\t\t\thash: txResult.txHash,\n\t\t\t\ttype: TransactionType.DEPOSIT,\n\t\t\t\tamount: depositAmount,\n\t\t\t\ttokenSymbol: selectedToken.symbol,\n\t\t\t\tnetwork: chainId,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Deposit transaction failed:\", error);\n\t\t\tconsole.error(\"Error details:\", {\n\t\t\t\tmessage: (error as Error)?.message,\n\t\t\t\tshortMessage: (error as { shortMessage?: string })\n\t\t\t\t\t?.shortMessage,\n\t\t\t\tcode: (error as { code?: unknown })?.code,\n\t\t\t\tselectedToken: selectedToken?.symbol,\n\t\t\t\tdepositAmount,\n\t\t\t\tisApproved,\n\t\t\t\tdepositType,\n\t\t\t\tuserAutoDepo: user?.autodepo,\n\t\t\t});\n\n\t\t\tlet message = \"Deposit failed.\";\n\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\tif (\n\t\t\t\t\t\"shortMessage\" in error &&\n\t\t\t\t\ttypeof (error as { shortMessage?: unknown })\n\t\t\t\t\t\t.shortMessage === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { shortMessage: string }).shortMessage;\n\t\t\t\t} else if (\n\t\t\t\t\t\"message\" in error &&\n\t\t\t\t\ttypeof (error as { message?: unknown }).message === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { message: string }).message;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoast.error(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tuser,\n\t\tchainId,\n\t\tnetwork,\n\t\tisApproved,\n\t\tdepositType,\n\t\tdstSwapInfo,\n\t\taddTransaction,\n\t\ttransactionService,\n\t\tprimaryWallet,\n\t\tspenderAddress,\n\t]);\n\n\tconst resetTransactionState = useCallback(() => {\n\t\tsetIsLoading(false);\n\t\tsetIsApproving(false);\n\t\tsetIsPending(false);\n\t\tsetTransactionHash(null);\n\t\tsetTimeLeft(0);\n\t\tretryCountRef.current = 0; // Reset retry count\n\t\tif (pollingIntervalRef.current)\n\t\t\tclearInterval(pollingIntervalRef.current);\n\t}, []);\n\n\treturn {\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\ttransactionHash,\n\t\ttimeLeft,\n\t\texecuteTransaction,\n\t\tresetTransactionState,\n\t};\n};\n","/**\n * useSwapAllowance.ts\n * Manages token allowance checking and approval for swaps\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport LocalStorageService from \"@/services/localStorageService\";\nimport {\n\tUseSwapAllowanceParams,\n\tUseSwapAllowanceReturn,\n} from \"@/types/walletProvider/swap-hooks.types\";\nimport { useAppStore } from \"@/store/store\";\n\nexport const useSwapAllowance = ({\n\tfromToken,\n\tallowanceAddress = \"0x111111125421ca6dc452d289314280a0f8842a65\",\n}: UseSwapAllowanceParams): UseSwapAllowanceReturn => {\n\t// --- STATE ---\n\tconst [isTokenAllowed, setIsTokenAllowed] = useState<boolean>(true);\n\tconst [isApproveLoading, setIsApproveLoading] = useState<boolean>(false);\n\tconst [isApproveSuccess, setIsApproveSuccess] = useState<boolean>(false);\n\tconst [isApproveError, setIsApproveError] = useState<boolean>(false);\n\tconst [approveErrorMsg, setApproveErrorMsg] = useState<string>(\"\");\n\tconst [tokenAproveStarted, setTokenAproveStarted] =\n\t\tuseState<boolean>(false);\n\n\t// --- DEPENDENCIES ---\n\tconst { address } = useAccount();\n\tconst localStorageService = LocalStorageService.getInstance();\n\tconst username = localStorageService.getUserData()?.username;\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\n\t/**\n\t * Check token allowance when fromToken or chain changes\n\t */\n\tconst checkTokenAllowance = useCallback(async (): Promise<boolean> => {\n\t\tif (!fromToken || !address || !username || !chainId) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst { hasAllowance } = await transactionService.checkAllowance({\n\t\t\t\ttokenAddress: fromToken.address,\n\t\t\t\townerAddress: address,\n\t\t\t\tspenderAddress: allowanceAddress,\n\t\t\t\tnetwork: chainId.toString(),\n\t\t\t\tusername,\n\t\t\t});\n\n\t\t\tsetIsTokenAllowed(hasAllowance);\n\t\t\treturn hasAllowance;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to check allowance:\", error);\n\t\t\treturn false;\n\t\t}\n\t}, [fromToken]);\n\n\t/**\n\t * Handle token approval\n\t */\n\tconst approveToken = useCallback(async (): Promise<boolean> => {\n\t\tif (!fromToken || !address) return false;\n\n\t\tsetTokenAproveStarted(true);\n\t\tsetIsApproveLoading(true);\n\t\tsetIsApproveError(false);\n\t\tsetApproveErrorMsg(\"\");\n\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst { success, txHash, error } =\n\t\t\t\tawait transactionService.approveToken({\n\t\t\t\t\ttokenAddress: fromToken.address,\n\t\t\t\t\tspenderAddress: allowanceAddress,\n\t\t\t\t\tusername,\n\t\t\t\t});\n\n\t\t\tconsole.log(\"Approval response:\", success, txHash, error);\n\n\t\t\tif (success) {\n\t\t\t\tsetIsApproveSuccess(true);\n\t\t\t\tsetIsTokenAllowed(true);\n\t\t\t\t// Re-check allowance to be sure\n\t\t\t\tawait checkTokenAllowance();\n\t\t\t\t// setIsTokenAllowed(true);\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tsetIsApproveError(true);\n\t\t\t\tsetApproveErrorMsg(error?.message || \"Failed to approve token\");\n\t\t\t\t// setIsTokenAllowed(false);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetIsApproveError(true);\n\t\t\tsetApproveErrorMsg(\n\t\t\t\t(error as Error).message || \"Failed to approve token\"\n\t\t\t);\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tsetIsApproveLoading(false);\n\t\t\tsetTokenAproveStarted(false);\n\t\t}\n\t}, [fromToken]);\n\n\t/**\n\t * Reset approval-related state\n\t */\n\tconst resetPermitState = useCallback(() => {\n\t\tsetIsApproveSuccess(false);\n\t\tsetIsApproveError(false);\n\t\tsetApproveErrorMsg(\"\");\n\t\tsetTokenAproveStarted(false);\n\t\tsetIsApproveLoading(false);\n\t}, []);\n\n\t/**\n\t * Effect to check allowance when fromToken changes\n\t */\n\tuseEffect(() => {\n\t\tif (fromToken) {\n\t\t\tcheckTokenAllowance();\n\t\t}\n\t}, [fromToken, checkTokenAllowance]);\n\n\treturn {\n\t\t// State\n\t\tisTokenAllowed,\n\t\tisApproveLoading,\n\t\tisApproveSuccess,\n\t\tisApproveError,\n\t\tapproveErrorMsg,\n\t\ttokenAproveStarted,\n\n\t\t// Actions\n\t\tcheckTokenAllowance,\n\t\tapproveToken,\n\t\tresetPermitState,\n\t};\n};\n","/**\n * useSwapFormState.ts\n * Manages all user inputs and core form state for token swapping\n */\n\nimport { useState, useCallback } from \"react\";\nimport React from \"react\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { UseSwapFormStateReturn } from \"@/types/walletProvider/swap-hooks.types\";\n\nexport const useSwapFormState = (): UseSwapFormStateReturn => {\n\t// --- STATE ---\n\tconst [fromToken, setFromToken] = useState<Token | null>(null);\n\tconst [toToken, setToToken] = useState<Token | null>(null);\n\tconst [exchangeAmount, setExchangeAmount] = useState<string>(\"\");\n\tconst [receivedAmount, setReceivedAmount] = useState<string>(\"\");\n\tconst [isReversedQuote, setIsReversedQuote] = useState<boolean>(false);\n\n\t// --- DERIVED STATE ---\n\tconst isValidSwap = Boolean(\n\t\tfromToken && toToken && fromToken.address !== toToken.address\n\t);\n\n\t// --- ACTIONS ---\n\n\t/**\n\t * Set the 'from' token with special handling to prevent same token selection\n\t */\n\tconst updateFromToken = useCallback(\n\t\t(token: Token | null) => {\n\t\t\tif (toToken && token && toToken.address === token.address) {\n\t\t\t\t// If selecting the same token as 'to', swap them\n\t\t\t\t// setFromToken(token);\n\t\t\t\tsetToToken(fromToken);\n\t\t\t} else {\n\t\t\t\tsetFromToken(token);\n\t\t\t}\n\t\t},\n\t\t[toToken, fromToken]\n\t);\n\n\t/**\n\t * Set the 'to' token with special handling to prevent same token selection\n\t */\n\tconst updateToToken = useCallback(\n\t\t(token: Token | null) => {\n\t\t\tif (fromToken && token && fromToken.address === token.address) {\n\t\t\t\t// If selecting the same token as 'from', swap them\n\t\t\t\t// setToToken(token);\n\t\t\t\tsetFromToken(toToken);\n\t\t\t} else {\n\t\t\t\tsetToToken(token);\n\t\t\t}\n\t\t},\n\t\t[fromToken, toToken]\n\t);\n\n\t/**\n\t * Switch fromToken and toToken\n\t */\n\tconst switchTokens = useCallback(() => {\n\t\tif (fromToken || toToken) {\n\t\t\tconst tempFrom = fromToken;\n\t\t\tconst tempTo = toToken;\n\t\t\tconst tempExchange = exchangeAmount;\n\t\t\tconst tempReceived = receivedAmount;\n\n\t\t\tsetFromToken(tempTo);\n\t\t\tsetToToken(tempFrom);\n\t\t\tsetExchangeAmount(tempReceived);\n\t\t\tsetReceivedAmount(tempExchange);\n\t\t\tsetIsReversedQuote(!isReversedQuote);\n\t\t}\n\t}, [fromToken, toToken, exchangeAmount, receivedAmount, isReversedQuote]);\n\n\t/**\n\t * Handle exchange amount input change\n\t */\n\tconst handleExchangeAmountChange = useCallback(\n\t\t(\n\t\t\tvalue: string | React.ChangeEvent<HTMLInputElement>,\n\t\t\tdecimal: number = 6\n\t\t) => {\n\t\t\tlet sanitizedValue: string =\n\t\t\t\ttypeof value === \"string\" ? value : value.target.value;\n\n\t\t\tsanitizedValue = sanitizedValue.replace(/[^0-9.]/g, \"\");\n\n\t\t\tconst decimalCount = (sanitizedValue.match(/\\./g) || []).length;\n\t\t\tif (decimalCount > 1) {\n\t\t\t\tsanitizedValue = sanitizedValue.substring(\n\t\t\t\t\t0,\n\t\t\t\t\tsanitizedValue.lastIndexOf(\".\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (sanitizedValue.includes(\".\")) {\n\t\t\t\tconst parts = sanitizedValue.split(\".\");\n\t\t\t\tsanitizedValue = `${parts[0]}.${parts[1].slice(0, decimal)}`;\n\t\t\t}\n\n\t\t\tsetExchangeAmount(sanitizedValue);\n\t\t\t// Clear receivedAmount to trigger a new quote calculation\n\t\t\t// and set isReversedQuote to false to indicate we're calculating in the normal direction\n\t\t\tif (receivedAmount) {\n\t\t\t\tsetReceivedAmount(\"\");\n\t\t\t}\n\t\t\tsetIsReversedQuote(false);\n\t\t},\n\t\t[receivedAmount]\n\t);\n\n\t/**\n\t * Handle received amount input change\n\t */\n\tconst handleReceivedAmountChange = useCallback(\n\t\t(\n\t\t\tvalue: string | React.ChangeEvent<HTMLInputElement>,\n\t\t\tdecimal: number = 6\n\t\t) => {\n\t\t\tlet sanitizedValue: string =\n\t\t\t\ttypeof value === \"string\" ? value : value.target.value;\n\n\t\t\tsanitizedValue = sanitizedValue.replace(/[^0-9.]/g, \"\");\n\n\t\t\tconst decimalCount = (sanitizedValue.match(/\\./g) || []).length;\n\t\t\tif (decimalCount > 1) {\n\t\t\t\tsanitizedValue = sanitizedValue.substring(\n\t\t\t\t\t0,\n\t\t\t\t\tsanitizedValue.lastIndexOf(\".\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (sanitizedValue.includes(\".\")) {\n\t\t\t\tconst parts = sanitizedValue.split(\".\");\n\t\t\t\tsanitizedValue = `${parts[0]}.${parts[1].slice(0, decimal)}`;\n\t\t\t}\n\n\t\t\tsetReceivedAmount(sanitizedValue);\n\t\t\t// Clear exchangeAmount to trigger a new quote calculation\n\t\t\t// and set isReversedQuote to true to indicate we're calculating in the reverse direction\n\t\t\tif (exchangeAmount) {\n\t\t\t\tsetExchangeAmount(\"\");\n\t\t\t}\n\t\t\tsetIsReversedQuote(true);\n\t\t},\n\t\t[exchangeAmount]\n\t);\n\n\t/**\n\t * Set maximum amount based on available balance\n\t * Note: Gas reservation logic is handled by the calling component through useSwapGasManager\n\t */\n\tconst setMaxAmount = useCallback(\n\t\t(gasReservationAmount?: number) => {\n\t\t\tif (fromToken && fromToken.balance) {\n\t\t\t\tconst balance = parseFloat(fromToken.balance);\n\t\t\t\tlet maxAmount = balance;\n\n\t\t\t\t// If gas reservation amount is provided (for native tokens), subtract it\n\t\t\t\tif (gasReservationAmount && gasReservationAmount > 0) {\n\t\t\t\t\tmaxAmount = Math.max(0, balance - gasReservationAmount);\n\t\t\t\t}\n\n\t\t\t\tif (maxAmount <= 0) {\n\t\t\t\t\tsetExchangeAmount(\"0\");\n\t\t\t\t} else {\n\t\t\t\t\tsetExchangeAmount(maxAmount.toString());\n\t\t\t\t}\n\t\t\t\tsetReceivedAmount(\"\");\n\t\t\t\tsetIsReversedQuote(false);\n\t\t\t}\n\t\t},\n\t\t[fromToken]\n\t);\n\n\t/**\n\t * Reset token selections\n\t */\n\tconst resetTokens = useCallback(() => {\n\t\tsetFromToken(null);\n\t\tsetToToken(null);\n\t\tsetExchangeAmount(\"\");\n\t\tsetReceivedAmount(\"\");\n\t\tsetIsReversedQuote(false);\n\t}, []);\n\n\t/**\n\t * Reset amounts but keep token selections\n\t */\n\tconst resetAmounts = useCallback(() => {\n\t\tsetExchangeAmount(\"\");\n\t\tsetReceivedAmount(\"\");\n\t\tsetIsReversedQuote(false);\n\t}, []);\n\n\t/**\n\t * Reset the entire form state\n\t */\n\tconst resetFormState = useCallback(() => {\n\t\tsetFromToken(null);\n\t\tsetToToken(null);\n\t\tsetExchangeAmount(\"\");\n\t\tsetReceivedAmount(\"\");\n\t\tsetIsReversedQuote(false);\n\t}, []);\n\n\treturn {\n\t\t// State\n\t\tfromToken,\n\t\ttoToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tisReversedQuote,\n\t\tisValidSwap,\n\n\t\t// Actions\n\t\tsetFromToken: updateFromToken,\n\t\tsetToToken: updateToToken,\n\t\tswitchTokens,\n\t\thandleExchangeAmountChange,\n\t\thandleReceivedAmountChange,\n\t\tsetMaxAmount,\n\t\tresetTokens,\n\t\tresetAmounts,\n\t\tresetFormState,\n\n\t\t// Raw setters for internal use by other hooks\n\t\t_setExchangeAmount: setExchangeAmount,\n\t\t_setReceivedAmount: setReceivedAmount,\n\t\t_setIsReversedQuote: setIsReversedQuote,\n\t};\n};\n","/**\n * useSwapGasManager.ts\n * Manages gas fees, tooltips, and native currency logic for swaps\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport {\n\tUseSwapGasManagerParams,\n\tUseSwapGasManagerReturn,\n} from \"@/types/walletProvider/swap-hooks.types\";\n\nexport const useSwapGasManager = ({\n\tfromToken,\n}: UseSwapGasManagerParams): UseSwapGasManagerReturn => {\n\t// --- STATE ---\n\tconst [gasReservationAmount, setGasReservationAmount] = useState<number>(0);\n\tconst [isLowBalance, setIsLowBalance] = useState<boolean>(false);\n\tconst [toolTipMessage, setToolTipMessage] = useState<string>(\"\");\n\tconst [showToolTip, setShowToolTip] = useState<boolean>(false);\n\n\t// --- DEPENDENCIES ---\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\n\t/**\n\t * Function to determine gas fee reservation based on network\n\t * @returns {Promise<number>} Gas fee reservation amount\n\t */\n\tconst getGasReservationAmount = useCallback(async (): Promise<number> => {\n\t\t// Set default fee\n\t\tlet fee = 0.0025; // Default gas reservation for other networks\n\n\t\ttry {\n\t\t\tswitch (Number(chainId)) {\n\t\t\t\tcase 1: // Ethereum\n\t\t\t\t\tfee = 0.015;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 137: // Polygon\n\t\t\t\t\tfee = 0.1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 42161: // Arbitrum\n\t\t\t\t\tfee = 0.0012;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 10: // Optimism\n\t\t\t\t\tfee = 0.0012;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 324: // zkSync Era\n\t\t\t\t\tfee = 0.0015;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8453: // Base\n\t\t\t\t\tfee = 0.0012;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 56: // BNB Chain\n\t\t\t\t\tfee = 0.0015;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 43114: // Avalanche\n\t\t\t\t\tfee = 0.003;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 59144: // Linea\n\t\t\t\t\tfee = 0.0015;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tfee = 0.0025; // Default gas reservation for other networks\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error getting network ID:\", error);\n\t\t}\n\n\t\treturn fee;\n\t}, [chainId]);\n\n\t/**\n\t * Check if token is a native currency\n\t * @returns {boolean} True if native currency\n\t */\n\tconst isNativeCurrency = useCallback((): boolean => {\n\t\tif (!fromToken) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nativeToken = fromToken.tags?.includes(\"native\") || false;\n\t\treturn nativeToken;\n\t}, [fromToken]);\n\n\t/**\n\t * Get message for tooltip\n\t */\n\tconst getMessage = useCallback(async (): Promise<string> => {\n\t\tif (fromToken) {\n\t\t\ttry {\n\t\t\t\tconst gasAmount = await getGasReservationAmount();\n\t\t\t\t// const isNative = isNativeCurrency();\n\n\t\t\t\t// if (isNative) {\n\t\t\t\treturn `${gasAmount} ${fromToken.symbol} is reserved to cover gas fees and avoid transaction failure.`;\n\t\t\t\t// }\n\t\t\t\t// return \"\";\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error getting gas reservation amount:\", error);\n\t\t\t\treturn `A small amount of ${fromToken.symbol} is reserved to cover gas fees and avoid transaction failure.`;\n\t\t\t}\n\t\t}\n\t\treturn \"\";\n\t}, [\n\t\tfromToken,\n\t\tgetGasReservationAmount,\n\t\t// isNativeCurrency\n\t]);\n\n\t// Update tooltip message when fromToken or gas amount changes\n\tuseEffect(() => {\n\t\tconst updateTooltip = async () => {\n\t\t\t// const message = await getMessage();\n\t\t\t// setToolTipMessage(message);\n\t\t\t// setShowToolTip(!!message);\n\n\t\t\tif (fromToken) {\n\t\t\t\tconst isNative = isNativeCurrency();\n\t\t\t\tif (isNative) {\n\t\t\t\t\tsetShowToolTip(true);\n\t\t\t\t\tconst message = await getMessage();\n\t\t\t\t\tsetToolTipMessage(message);\n\t\t\t\t} else {\n\t\t\t\t\tsetShowToolTip(false);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetShowToolTip(false);\n\t\t\t}\n\t\t};\n\n\t\tupdateTooltip();\n\t}, [fromToken, getMessage, isNativeCurrency]);\n\n\t// Update gas reservation amount and USD values when needed\n\tuseEffect(() => {\n\t\tconst updateGasAndValues = async () => {\n\t\t\ttry {\n\t\t\t\tconst gasAmount = await getGasReservationAmount();\n\t\t\t\tsetGasReservationAmount(gasAmount);\n\n\t\t\t\t// Check if balance is low for native currency (match original logic)\n\t\t\t\tif (fromToken && isNativeCurrency() && fromToken.balance) {\n\t\t\t\t\tconst balance = parseFloat(fromToken.balance || \"0\");\n\t\t\t\t\tconst isLow = balance < gasAmount;\n\t\t\t\t\tsetIsLowBalance(isLow);\n\t\t\t\t} else {\n\t\t\t\t\tsetIsLowBalance(false);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error updating gas values:\", error);\n\t\t\t}\n\t\t};\n\n\t\tupdateGasAndValues();\n\t}, [chainId, fromToken, getGasReservationAmount, isNativeCurrency]);\n\n\treturn {\n\t\t// State\n\t\tgasReservationAmount,\n\t\tisLowBalance,\n\t\ttoolTipMessage,\n\t\tshowToolTip,\n\n\t\t// Computed values\n\t\tisNativeCurrency,\n\n\t\t// Actions\n\t\tgetGasReservationAmount,\n\t\tgetMessage,\n\t};\n};\n","/**\n * useSwap.ts\n * Main orchestrating hook for token swap operations\n *\n * This hook follows the \"Divide and Conquer\" principle by composing specialized,\n * single-responsibility child hooks into a single, cohesive API for the UI.\n *\n * --- CHILD HOOKS ---\n *\n * 1. `useSwapFormState`\n *    - RESPONSIBILITY: Manages all user inputs and core form state (tokens, amounts)\n *    - RETURNS: { fromToken, toToken, exchangeAmount, receivedAmount, isReversedQuote,\n *                 setFromToken, setToToken, handleAmountChanges, resetFormState, etc. }\n *\n * 2. `useSwapQuote`\n *    - RESPONSIBILITY: Manages token conversion calculations and quote fetching\n *    - RETURNS: { conversion, isFetching, getExchangeRate, fetchQuote }\n *\n * 3. `useSwapGasManager`\n *    - RESPONSIBILITY: Manages gas fees, tooltips, and native currency logic\n *    - RETURNS: { gasReservationAmount, isLowBalance, toolTipMessage, showToolTip, isNativeCurrency }\n *\n * 4. `useSwapAllowance`\n *    - RESPONSIBILITY: Manages token allowance checking and approval\n *    - RETURNS: { isTokenAllowed, isApproveLoading, approveToken, resetPermitState }\n *\n * 5. `useSwapTransaction`\n *    - RESPONSIBILITY: Manages the swap transaction execution and state\n *    - RETURNS: { isLoading, executeSwap, validateSwap, resetSwapState, txHash }\n *\n * --- MAIN `useSwap` HOOK ---\n *\n *    - RESPONSIBILITY: Composes all child hooks, provides final validation, and\n *      returns a unified API for the UI component.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useTokens } from \"@/hooks/walletProvider/useTokens\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { useAppStore } from \"@/store/store\";\n\n// Import all specialized child hooks\nimport { useSwapFormState } from \"./useSwapFormState\";\nimport { useSwapQuote } from \"./useSwapQuote\";\nimport { useSwapGasManager } from \"./useSwapGasManager\";\nimport { useSwapAllowance } from \"./useSwapAllowance\";\nimport { useSwapTransaction } from \"./useSwapTransaction\";\nimport { useSwapTokenPrices } from \"./useSwapTokenPrices\";\n\n// Import types\nimport {\n\tUseSwapOptions,\n\tUseSwapReturn,\n\tSwapTransactionResult,\n} from \"@/types/walletProvider/swap-hooks.types\";\n\nconst useSwap = (options: UseSwapOptions = {}): UseSwapReturn => {\n\t// --- 1. COMPOSE THE CHILD HOOKS IN LOGICAL ORDER ---\n\n\t// Get chainId from store to listen for network changes\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\n\t// Additional state for slippage and other settings\n\tconst [slippage, setSlippage] = useState<string>(\"Auto\");\n\tconst [isTokenPermit, setIsTokenPermit] = useState<boolean>(true);\n\tconst [allowanceAddress] = useState<string>(\n\t\toptions.allowanceAddress || \"0x111111125421ca6dc452d289314280a0f8842a65\"\n\t);\n\n\t// A. Form State Management (Core state)\n\tconst {\n\t\tfromToken,\n\t\ttoToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tisReversedQuote,\n\t\tsetFromToken,\n\t\tsetToToken,\n\t\tswitchTokens,\n\t\thandleExchangeAmountChange,\n\t\thandleReceivedAmountChange,\n\t\tsetMaxAmount,\n\t\tresetTokens,\n\t\tresetAmounts,\n\t\tresetFormState,\n\t\t_setExchangeAmount,\n\t\t_setReceivedAmount,\n\t} = useSwapFormState();\n\n\t// B. Quote and Conversion Management\n\tconst {\n\t\tconversion,\n\t\tisFetching,\n\t\tminRequiredAmount,\n\t\testimatedGas,\n\t\tsetConversion,\n\t\tgetExchangeRate,\n\t\tfetchQuote,\n\t\tsetMinRequiredAmount,\n\t} = useSwapQuote({\n\t\tfromToken,\n\t\ttoToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tisReversedQuote,\n\t\t_setExchangeAmount,\n\t\t_setReceivedAmount,\n\t});\n\n\t// C. Gas and Native Currency Management\n\tconst {\n\t\tgasReservationAmount,\n\t\tisLowBalance,\n\t\ttoolTipMessage,\n\t\tshowToolTip,\n\t\tisNativeCurrency,\n\t\tgetGasReservationAmount,\n\t} = useSwapGasManager({ fromToken });\n\n\t// D. Token Allowance Management\n\tconst {\n\t\tisTokenAllowed,\n\t\tisApproveLoading,\n\t\tisApproveSuccess,\n\t\tisApproveError,\n\t\tapproveErrorMsg,\n\t\ttokenAproveStarted,\n\t\tcheckTokenAllowance,\n\t\tapproveToken,\n\t\tresetPermitState: resetAllowancePermitState,\n\t} = useSwapAllowance({ fromToken, allowanceAddress });\n\n\t// E. Transaction Execution\n\tconst {\n\t\tisLoading,\n\t\tcheckSuccess,\n\t\ttransactionSuccess,\n\t\tsuccessPop,\n\t\ttxHash,\n\t\tcompletedExchangeAmount,\n\t\tcompletedReceivedAmount,\n\t\texecuteSwap: executeSwapTransaction,\n\t\tvalidateSwap,\n\t\tresetSwapState,\n\t\tsetSuccessPop,\n\t} = useSwapTransaction({\n\t\tfromToken,\n\t\ttoToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tslippage,\n\t\tonTransactionComplete: resetFormState,\n\t});\n\n\t// F. Token Data (from existing hook)\n\tconst { fetchTokens, tokens } = useTokens();\n\n\t// G. Token Price Management\n\tconst {\n\t\tfromTokenUsdPrice,\n\t\ttoTokenUsdPrice,\n\t\tisFetchingPrices,\n\t\tfetchTokenPrices,\n\t} = useSwapTokenPrices({ fromToken, toToken });\n\n\t// --- 2. ORCHESTRATION & HELPER LOGIC ---\n\n\t/**\n\t * Execute the swap with all pre-flight checks\n\t */\n\tconst executeSwap =\n\t\tuseCallback(async (): Promise<SwapTransactionResult> => {\n\t\t\tif (!validateSwap()) {\n\t\t\t\treturn { success: false, error: \"Validation failed\" };\n\t\t\t}\n\n\t\t\t// Check if approval is needed for non-native tokens\n\t\t\tif (!isTokenAllowed && !isNativeCurrency()) {\n\t\t\t\tconst approvalResult = await approveToken();\n\t\t\t\tif (!approvalResult) {\n\t\t\t\t\treturn { success: false, error: \"Token approval failed\" };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Execute the actual swap\n\t\t\treturn await executeSwapTransaction();\n\t\t}, [\n\t\t\tvalidateSwap,\n\t\t\tisTokenAllowed,\n\t\t\tisNativeCurrency,\n\t\t\tapproveToken,\n\t\t\texecuteSwapTransaction,\n\t\t]);\n\n\t/**\n\t * Reset the entire swap state\n\t */\n\tconst resetPage = useCallback(() => {\n\t\tresetFormState();\n\t\tresetSwapState();\n\t\tresetAllowancePermitState();\n\t}, [resetFormState, resetSwapState, resetAllowancePermitState]);\n\n\t/**\n\t * Enhanced setMaxAmount that handles gas reservation for native tokens\n\t */\n\tconst enhancedSetMaxAmount = useCallback(async () => {\n\t\tif (fromToken && fromToken.balance) {\n\t\t\tlet gasReservation = 0;\n\n\t\t\t// If it's a native currency, get gas reservation amount\n\t\t\tif (isNativeCurrency()) {\n\t\t\t\tgasReservation = await getGasReservationAmount();\n\t\t\t}\n\n\t\t\tsetMaxAmount(gasReservation);\n\t\t}\n\t}, [fromToken, isNativeCurrency, getGasReservationAmount, setMaxAmount]);\n\t/**\n\t * Enhanced token update functions that preserve functionality\n\t */\n\tconst updateFromToken = useCallback(\n\t\t(token: Token | null) => {\n\t\t\tif (toToken && token && toToken.address === token.address) {\n\t\t\t\t// Switch tokens if selecting the same token\n\t\t\t\tconst temp = fromToken;\n\t\t\t\tsetFromToken(token);\n\t\t\t\tsetToToken(temp);\n\t\t\t} else {\n\t\t\t\tsetFromToken(token);\n\t\t\t}\n\t\t},\n\t\t[fromToken, toToken, setFromToken, setToToken]\n\t);\n\n\tconst updateToToken = useCallback(\n\t\t(token: Token | null) => {\n\t\t\tif (fromToken && token && fromToken.address === token.address) {\n\t\t\t\t// Switch tokens if selecting the same token\n\t\t\t\tconst temp = toToken;\n\t\t\t\tsetToToken(token);\n\t\t\t\tsetFromToken(temp);\n\t\t\t} else {\n\t\t\t\tsetToToken(token);\n\t\t\t}\n\t\t},\n\t\t[fromToken, toToken, setFromToken, setToToken]\n\t);\n\n\t/**\n\t * Determine if gas fee information should be shown\n\t */\n\tconst showGasFee = Boolean(\n\t\texchangeAmount &&\n\t\t\treceivedAmount &&\n\t\t\tfromToken &&\n\t\t\ttoToken &&\n\t\t\tparseFloat(exchangeAmount) > 0\n\t);\n\n\t/**\n\t * Enhanced resetPermitState that maintains backwards compatibility\n\t */\n\tconst resetPermitState = useCallback(() => {\n\t\t// Reset both permit state and allowance state\n\t\tsetIsTokenPermit(true);\n\t\tresetAllowancePermitState();\n\t}, [resetAllowancePermitState]);\n\n\t// Add effect to sync selected tokens with refreshed token data (with debounce)\n\tuseEffect(() => {\n\t\tif (!tokens || !Array.isArray(tokens)) return;\n\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\t// Update fromToken if it exists and tokens have been refreshed\n\t\t\tif (fromToken && fromToken.address) {\n\t\t\t\tconst updatedFromToken = tokens.find(\n\t\t\t\t\t(token: Token) =>\n\t\t\t\t\t\ttoken.address?.toLowerCase() ===\n\t\t\t\t\t\tfromToken.address?.toLowerCase()\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tupdatedFromToken &&\n\t\t\t\t\tupdatedFromToken.balance !== fromToken.balance\n\t\t\t\t) {\n\t\t\t\t\tsetFromToken(updatedFromToken);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update toToken if it exists and tokens have been refreshed\n\t\t\tif (toToken && toToken.address) {\n\t\t\t\tconst updatedToToken = tokens.find(\n\t\t\t\t\t(token: Token) =>\n\t\t\t\t\t\ttoken.address?.toLowerCase() ===\n\t\t\t\t\t\ttoToken.address?.toLowerCase()\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tupdatedToToken &&\n\t\t\t\t\tupdatedToToken.balance !== toToken.balance\n\t\t\t\t) {\n\t\t\t\t\tsetToToken(updatedToToken);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 500); // 500ms debounce\n\n\t\treturn () => clearTimeout(timeoutId);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [tokens, fromToken?.address, toToken?.address]);\n\n\t// Add effect to reset tokens when network changes\n\tuseEffect(() => {\n\t\tif (chainId) {\n\t\t\t// Reset the form state when network changes to prevent\n\t\t\t// tokens from previous network being retained\n\t\t\tsetConversion(null);\n\t\t\tresetFormState();\n\t\t\tresetSwapState();\n\t\t\tresetAllowancePermitState();\n\t\t}\n\t\t// Only depend on chainId changes, not initial load\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [chainId]);\n\n\t// --- 3. RETURN THE COMPLETE, UNIFIED API ---\n\t// This maintains 100% compatibility with the original useSwap hook interface\n\treturn {\n\t\t// Core state (backwards compatible)\n\t\tfromToken,\n\t\ttoToken,\n\t\tsetFromToken: updateFromToken,\n\t\tsetToToken: updateToToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tconversion,\n\t\testimatedGas,\n\t\tslippage,\n\t\tsetSlippage,\n\t\tisLoading,\n\t\tisFetching,\n\t\tisApproveLoading,\n\t\tisApproveSuccess,\n\t\tisApproveError,\n\t\tapproveErrorMsg,\n\t\tisTokenAllowed,\n\t\tisTokenPermit: isTokenPermit, // Now a real state variable\n\t\tsetIsTokenPermit,\n\t\tcheckSuccess,\n\t\ttransactionSuccess,\n\t\tsuccessPop,\n\t\ttxHash,\n\t\tcompletedExchangeAmount,\n\t\tcompletedReceivedAmount,\n\t\tshowGasFee,\n\t\tisLowBalance,\n\t\tgasReservationAmount,\n\t\tisNativeCurrency,\n\t\ttokenAproveStarted,\n\n\t\t// Actions (backwards compatible)\n\t\tsetConversion,\n\t\tswitchTokens,\n\t\tresetTokens,\n\t\tresetAmounts,\n\t\thandleExchangeAmountChange,\n\t\thandleReceivedAmountChange,\n\t\tsetMaxAmount: enhancedSetMaxAmount,\n\t\texecuteSwap,\n\t\tapproveToken,\n\t\tresetSwapState,\n\t\tresetPermitState,\n\t\tgetExchangeRate,\n\t\ttoolTipMessage,\n\t\tshowToolTip,\n\n\t\t// Additional methods for completeness\n\t\tvalidateSwap,\n\t\tresetPage,\n\t\tfetchTokens,\n\t\ttokens,\n\t\tsetSuccessPop,\n\t\tminRequiredAmount,\n\t\tsetMinRequiredAmount,\n\t\tfetchQuote,\n\t\tcheckTokenAllowance,\n\t\tgetGasReservationAmount,\n\n\t\t// Token price data\n\t\tfromTokenUsdPrice,\n\t\ttoTokenUsdPrice,\n\t\tisFetchingPrices,\n\t\tfetchTokenPrices,\n\t};\n};\n\nexport default useSwap;\n","/**\n * useSwapQuote.ts\n * Manages token conversion calculations and quote fetching\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport {\n\tUseSwapQuoteParams,\n\tUseSwapQuoteReturn,\n\tSwapConversion,\n} from \"@/types/walletProvider/swap-hooks.types\";\nimport LocalStorageService from \"@/services/localStorageService\";\nimport { useAppStore } from \"@/store/store\";\n\nexport const useSwapQuote = ({\n\tfromToken,\n\ttoToken,\n\texchangeAmount,\n\treceivedAmount,\n\tisReversedQuote,\n\t_setExchangeAmount,\n\t_setReceivedAmount,\n}: UseSwapQuoteParams): UseSwapQuoteReturn => {\n\t// --- STATE ---\n\tconst [conversion, setConversion] = useState<SwapConversion | null>(null);\n\tconst [isFetching, setIsFetching] = useState<boolean>(false);\n\tconst [minRequiredAmount, setMinRequiredAmount] = useState<string>(\"0.01\");\n\tconst [estimatedGas, setEstimatedGas] = useState<string>(\"0\");\n\n\t// --- DEPENDENCIES ---\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\tconst localStorageService = LocalStorageService.getInstance();\n\tconst username = localStorageService.getUserData()?.username;\n\n\t/**\n\t * Calculate and get the current exchange rate\n\t * @returns {number} Exchange rate - how many toTokens you get for 1 fromToken\n\t */\n\tconst getExchangeRate = useCallback((): number => {\n\t\tif (\n\t\t\t!fromToken ||\n\t\t\t!toToken ||\n\t\t\t!exchangeAmount ||\n\t\t\t!receivedAmount ||\n\t\t\tparseFloat(exchangeAmount) === 0\n\t\t) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst rate = parseFloat(receivedAmount) / parseFloat(exchangeAmount);\n\t\treturn isNaN(rate) ? 0 : rate;\n\t}, [fromToken, toToken, exchangeAmount, receivedAmount]);\n\n\t/**\n\t * Fetch quote from the conversion service\n\t */\n\tconst fetchQuote = useCallback(async (): Promise<void> => {\n\t\tif (!fromToken || !toToken || !username) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If both amounts are empty, do nothing\n\t\tif (!exchangeAmount && !receivedAmount) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If isReversedQuote is true, the receivedAmount should be used as the source\n\t\t// If isReversedQuote is false, the exchangeAmount should be used as the source\n\t\tconst sourceAmount = isReversedQuote ? receivedAmount : exchangeAmount;\n\n\t\t// Check if we have a valid source amount\n\t\tif (!sourceAmount || parseFloat(sourceAmount) <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsFetching(true);\n\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst networkId = chainId;\n\n\t\t\tconst response = await transactionService.getTokenConversion({\n\t\t\t\tnetwork: networkId as number,\n\t\t\t\tfromToken: isReversedQuote\n\t\t\t\t\t? toToken.address\n\t\t\t\t\t: fromToken.address,\n\t\t\t\ttoToken: isReversedQuote ? fromToken.address : toToken.address,\n\t\t\t\tamount: parseFloat(sourceAmount),\n\t\t\t\tusername,\n\t\t\t});\n\n\t\t\tif (response.success && response.conversion) {\n\t\t\t\tsetConversion(response.conversion);\n\n\t\t\t\t// Set estimated gas if available\n\t\t\t\tsetEstimatedGas(\n\t\t\t\t\tresponse.conversion.estimateGas?.toString() || \"0\"\n\t\t\t\t);\n\n\t\t\t\tconst decimalValue = parseInt(\n\t\t\t\t\tlocalStorage.getItem(\"decimals\") || \"6\"\n\t\t\t\t);\n\n\t\t\t\t// Update the target amount based on the quote direction\n\t\t\t\tif (isReversedQuote) {\n\t\t\t\t\tconst formattedAmount = parseFloat(\n\t\t\t\t\t\tresponse.conversion.toAmount.toString()\n\t\t\t\t\t).toFixed(decimalValue);\n\t\t\t\t\t_setExchangeAmount(formattedAmount);\n\t\t\t\t} else {\n\t\t\t\t\tconst formattedAmount = parseFloat(\n\t\t\t\t\t\tresponse.conversion.toAmount.toString()\n\t\t\t\t\t).toFixed(decimalValue);\n\t\t\t\t\t_setReceivedAmount(formattedAmount);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to fetch quote:\", error);\n\t\t\tsetConversion(null);\n\t\t} finally {\n\t\t\tsetIsFetching(false);\n\t\t}\n\t}, [\n\t\tfromToken,\n\t\ttoToken,\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\tisReversedQuote,\n\t\t_setExchangeAmount,\n\t\t_setReceivedAmount,\n\t\tusername,\n\t\tchainId,\n\t]);\n\n\t/**\n\t * Effect to get quote when swap parameters change\n\t */\n\tuseEffect(() => {\n\t\tfetchQuote();\n\t}, [fetchQuote]);\n\n\treturn {\n\t\t// State\n\t\tconversion,\n\t\tisFetching,\n\t\tminRequiredAmount,\n\t\testimatedGas, // Export the estimated gas value\n\n\t\t// Actions\n\t\tgetExchangeRate,\n\t\tsetConversion,\n\t\tfetchQuote,\n\t\tsetMinRequiredAmount,\n\t};\n};\n","/**\n * useSwapTransaction.ts\n * Manages the swap transaction execution and state\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { useAppStore } from \"@/store/store\";\nimport { TransactionType } from \"@/types/blockchain/transactions.types\";\nimport {\n\tUseSwapTransactionParams,\n\tUseSwapTransactionReturn,\n\tSwapTransactionResult,\n} from \"@/types/walletProvider/swap-hooks.types\";\nimport { PrimaryWalletWithClient } from \"@/types/walletProvider/transaction-service.types\";\n\nexport const useSwapTransaction = ({\n\tfromToken,\n\ttoToken,\n\texchangeAmount,\n\treceivedAmount,\n\tslippage,\n\tonTransactionComplete,\n}: UseSwapTransactionParams): UseSwapTransactionReturn => {\n\t// --- STATE ---\n\tconst [isLoading, setIsLoading] = useState<boolean>(false);\n\tconst [checkSuccess, setCheckSuccess] = useState<boolean>(false);\n\tconst [transactionSuccess, setTransactionSuccess] =\n\t\tuseState<boolean>(false);\n\tconst [successPop, setSuccessPop] = useState<boolean>(false);\n\tconst [txHash, setTxHash] = useState<string>(\"\");\n\t// Store transaction amounts before they get reset\n\tconst [completedExchangeAmount, setCompletedExchangeAmount] =\n\t\tuseState<string>(\"\");\n\tconst [completedReceivedAmount, setCompletedReceivedAmount] =\n\t\tuseState<string>(\"\");\n\n\t// --- DEPENDENCIES ---\n\tconst { user, authToken } = useDynamicAuth();\n\tconst { primaryWallet } = useDynamicContext();\n\tconst network = useAppStore((state) => state.blockchain.network);\n\tconst { addTransaction } = useAppStore(\n\t\t(state) => state.blockchain.transaction\n\t);\n\tconst fetchTokens = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\n\t/**\n\t * Validate swap parameters\n\t */\n\tconst validateSwap = useCallback((): boolean => {\n\t\tif (!fromToken || !toToken) return false;\n\t\tif (!exchangeAmount || parseFloat(exchangeAmount) <= 0) return false;\n\t\tif (parseFloat(exchangeAmount) > parseFloat(fromToken.balance))\n\t\t\treturn false;\n\t\tif (fromToken.address === toToken.address) return false;\n\t\treturn true;\n\t}, [fromToken, toToken, exchangeAmount]);\n\t/**\n\t * Execute the swap transaction\n\t */\n\tconst executeSwap =\n\t\tuseCallback(async (): Promise<SwapTransactionResult> => {\n\t\t\tif (!validateSwap()) {\n\t\t\t\treturn { success: false, error: \"Invalid swap parameters\" };\n\t\t\t}\n\n\t\t\tsetIsLoading(true);\n\t\t\tsetCheckSuccess(false);\n\t\t\tsetTransactionSuccess(false);\n\n\t\t\ttry {\n\t\t\t\tconst userWalletAddress = primaryWallet?.address || \"\";\n\n\t\t\t\tif (!userWalletAddress) {\n\t\t\t\t\tthrow new Error(\"Wallet address not found\");\n\t\t\t\t}\n\n\t\t\t\tconst swapParams = {\n\t\t\t\t\tnetwork: network?.chainId?.toString() || \"1\",\n\t\t\t\t\tfromToken: fromToken!.address,\n\t\t\t\t\ttoToken: toToken!.address,\n\t\t\t\t\tamount: exchangeAmount,\n\t\t\t\t\twalletAddress: userWalletAddress,\n\t\t\t\t\tslippage: slippage === \"Auto\" ? \"1\" : slippage,\n\t\t\t\t\tusername: user?.username as string,\n\t\t\t\t\tprimaryWallet:\n\t\t\t\t\t\tprimaryWallet as unknown as PrimaryWalletWithClient,\n\t\t\t\t};\n\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst result = await transactionService.executeSwap(swapParams);\n\n\t\t\t\tif (result.success && result.txHash) {\n\t\t\t\t\t// Store transaction amounts before they get reset\n\t\t\t\t\tsetCompletedExchangeAmount(exchangeAmount);\n\t\t\t\t\tsetCompletedReceivedAmount(receivedAmount);\n\n\t\t\t\t\tsetTxHash(result.txHash);\n\t\t\t\t\tsetCheckSuccess(true);\n\t\t\t\t\tsetTransactionSuccess(true);\n\t\t\t\t\tsetSuccessPop(true);\n\n\t\t\t\t\t// Add transaction notification (matching original format)\n\t\t\t\t\tconst networkName = network?.network?.name;\n\t\t\t\t\taddTransaction({\n\t\t\t\t\t\thash: result.txHash,\n\t\t\t\t\t\ttype: TransactionType.SWAP,\n\t\t\t\t\t\tamount: exchangeAmount,\n\t\t\t\t\t\ttokenSymbol: fromToken!.symbol,\n\t\t\t\t\t\tnetwork: networkName as string,\n\t\t\t\t\t\t// Optional swap-specific fields (as strings)\n\t\t\t\t\t\tfromToken: fromToken!.symbol,\n\t\t\t\t\t\ttoToken: toToken!.symbol,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Refresh token list after successful swap\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fetchTokens(true, { user, authToken });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"Failed to refresh tokens after swap:\",\n\t\t\t\t\t\t\terror\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Call completion callback\n\t\t\t\t\tif (onTransactionComplete) {\n\t\t\t\t\t\tonTransactionComplete();\n\t\t\t\t\t}\n\t\t\t\t\treturn { success: true, txHash: result.txHash };\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tresult.error?.message || \"Swap transaction failed\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Swap execution failed:\", error);\n\t\t\t\tsetCheckSuccess(false);\n\t\t\t\tsetTransactionSuccess(false);\n\t\t\t\treturn { success: false, error: (error as Error).message };\n\t\t\t} finally {\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}, [\n\t\t\tvalidateSwap,\n\t\t\tfromToken,\n\t\t\ttoToken,\n\t\t\texchangeAmount,\n\t\t\treceivedAmount,\n\t\t\tslippage,\n\t\t\tprimaryWallet,\n\t\t\tnetwork,\n\t\t\taddTransaction,\n\t\t\tonTransactionComplete,\n\t\t\tuser?.username,\n\t\t\tfetchTokens,\n\t\t]);\n\n\t/**\n\t * Reset the swap state after a successful transaction\n\t */\n\tconst resetSwapState = useCallback(() => {\n\t\tsetCheckSuccess(false);\n\t\tsetTransactionSuccess(false);\n\t\tsetSuccessPop(false);\n\t\tsetTxHash(\"\");\n\t\tsetCompletedExchangeAmount(\"\");\n\t\tsetCompletedReceivedAmount(\"\");\n\t\tsetIsLoading(false);\n\t}, []);\n\n\treturn {\n\t\t// State\n\t\tisLoading,\n\t\tcheckSuccess,\n\t\ttransactionSuccess,\n\t\tsuccessPop,\n\t\ttxHash,\n\t\tcompletedExchangeAmount,\n\t\tcompletedReceivedAmount,\n\n\t\t// Actions\n\t\texecuteSwap,\n\t\tvalidateSwap,\n\t\tresetSwapState,\n\t\tsetSuccessPop,\n\t};\n};\n","/**\n * useSwapTokenPrices.ts\n * Manages USD price fetching for swap tokens\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport {\n\tUseSwapTokenPricesParams,\n\tUseSwapTokenPricesReturn,\n} from \"@/types/walletProvider/swap-hooks.types\";\nimport { useAppStore } from \"@/store/store\";\nimport LocalStorageService from \"@/services/localStorageService\";\n\nexport const useSwapTokenPrices = ({\n\tfromToken,\n\ttoToken,\n}: UseSwapTokenPricesParams): UseSwapTokenPricesReturn => {\n\t// --- STATE ---\n\tconst [fromTokenUsdPrice, setFromTokenUsdPrice] = useState<string>(\"\");\n\tconst [toTokenUsdPrice, setToTokenUsdPrice] = useState<string>(\"\");\n\tconst [isFetchingPrices, setIsFetchingPrices] = useState<boolean>(false);\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\n\t// --- DEPENDENCIES ---\n\tconst username = useMemo(() => {\n\t\treturn LocalStorageService.getInstance().getUserData()?.username;\n\t}, []);\n\n\t/**\n\t * Fetch USD prices for both tokens - manual trigger function\n\t */\n\tconst fetchTokenPrices = useCallback(async (): Promise<void> => {\n\t\tif (!fromToken || !toToken || !chainId || !username) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsFetchingPrices(true);\n\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst response = await transactionService.getTokenPrice({\n\t\t\t\tnetwork: chainId?.toString(),\n\t\t\t\tfromToken: fromToken.address,\n\t\t\t\ttoToken: toToken.address,\n\t\t\t\tusername,\n\t\t\t});\n\n\t\t\tif (response.success && response.priceData) {\n\t\t\t\tconst { token_1, token_2 } = response.priceData;\n\t\t\t\tsetFromTokenUsdPrice(token_1);\n\t\t\t\tsetToTokenUsdPrice(token_2);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error fetching token prices:\", error);\n\t\t\tsetFromTokenUsdPrice(\"\");\n\t\t\tsetToTokenUsdPrice(\"\");\n\t\t} finally {\n\t\t\tsetIsFetchingPrices(false);\n\t\t}\n\t}, [fromToken, toToken, username, chainId]);\n\n\t/**\n\t * Update token prices when tokens change\n\t */\n\tuseEffect(() => {\n\t\tif (!fromToken || !toToken || !chainId || !username) {\n\t\t\tsetFromTokenUsdPrice(\"\");\n\t\t\tsetToTokenUsdPrice(\"\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet cancelled = false;\n\n\t\tconst fetchPrices = async (): Promise<void> => {\n\t\t\tsetIsFetchingPrices(true);\n\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst response = await transactionService.getTokenPrice({\n\t\t\t\t\tnetwork: chainId?.toString(),\n\t\t\t\t\tfromToken: fromToken.address,\n\t\t\t\t\ttoToken: toToken.address,\n\t\t\t\t\tusername,\n\t\t\t\t});\n\n\t\t\t\tif (!cancelled && response.success && response.priceData) {\n\t\t\t\t\tconst { token_1, token_2 } = response.priceData;\n\t\t\t\t\tsetFromTokenUsdPrice(token_1);\n\t\t\t\t\tsetToTokenUsdPrice(token_2);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tconsole.error(\"Error fetching token prices:\", error);\n\t\t\t\t\tsetFromTokenUsdPrice(\"\");\n\t\t\t\t\tsetToTokenUsdPrice(\"\");\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsFetchingPrices(false);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst timeoutId = setTimeout(fetchPrices, 100); // Small debounce\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tclearTimeout(timeoutId);\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [fromToken?.address, toToken?.address, chainId, username]);\n\n\treturn {\n\t\t// State\n\t\tfromTokenUsdPrice,\n\t\ttoTokenUsdPrice,\n\t\tisFetchingPrices,\n\n\t\t// Actions\n\t\tfetchTokenPrices,\n\t};\n};\n","/*\n * =============================================================================\n * HOOK API DOCUMENTATION (FINAL)\n * =============================================================================\n *\n * This is the main, public-facing hook for the entire Deposit feature. It follows\n * the \"Divide and Conquer\" principle by composing five specialized, single-\n * responsibility child hooks into a single, cohesive API for the UI.\n *\n * --- CHILD HOOKS ---\n *\n * 1. `useTokens`\n *    - RESPONSIBILITY: Provides the list of available tokens for the current network.\n *    - RETURNS: { tokens, nativeToken, usdt, usdx, isTokensLoading, fetchTokens }\n *\n * 2. `useSwapInfo`\n *    - RESPONSIBILITY: Fetches the destination wallet info required for swaps.\n *    - RETURNS: { dstSwapInfo, isLoading }\n *\n * 3. `useDepositFormState`\n *    - RESPONSIBILITY: Manages all user inputs and core form state (token, amount).\n *    - RETURNS: { selectedToken, depositAmount, depositType, isBalanceInsufficient,\n *                 formattedBalance, selectToken, handleAmountChange, setMaxAmount,\n *                 validateDeposit, resetFormState }\n *\n * 4. `useGasManager`\n *    - RESPONSIBILITY: Manages all logic related to gas fees and native tokens.\n *    - RETURNS: { gasReservationAmount, isLowBalance, isNativeCurrency,\n *                 tooltipMessage, showTooltip }\n *\n * 5. `useDepositCalculations`\n *    - RESPONSIBILITY: Manages async conversion rate calculations for UI feedback.\n *    - RETURNS: { minRequiredAmount, usdtConversionAmount, isFetchingConversion }\n *\n * 6. `useDepositTransaction`\n *    - RESPONSIBILITY: Manages the entire on-chain transaction lifecycle.\n *    - RETURNS: { isLoading, isApproving, isApproved, isPending,\n *                 transactionHash, timeLeft, executeTransaction, resetTransactionState }\n *\n * --- MAIN `useDeposit` HOOK ---\n *\n *    - RESPONSIBILITY: Composes all child hooks, provides final validation, and\n *      returns a unified API for the UI component, including computed helpers\n *      like `getButtonText` and `isDepositDisabled`.\n *\n * =============================================================================\n */\n\nimport { useCallback, useState, useEffect } from \"react\";\nimport { toast } from \"sonner\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\n// Localization: import the translation hook\n\n// Wrap user-facing messages with translations in the walletProvider.withdrawPanel namespace.\n// If this hook uses toast or error strings, prefer keys under walletProvider.withdrawPanel.errors/*.\n\n// Withdraw localization accessor (no `any` or fuzzy fallbacks)\nconst useWithdrawI18n = () => {\n\treturn {\n\t\terrors: {\n\t\t\tpendingWithdrawal: \"You already have a pending withdrawal\",\n\t\t\tinvalidAddress: \"Invalid Address\",\n\t\t\tenterAmount: \"Enter Amount\",\n\t\t\tnetworkNotSupported: \"Network Not Supported\",\n\t\t},\n\t\tstatus: {\n\t\t\tprocessing: \"Proceed in your wallet\",\n\t\t\tinsufficientBalance: \"Insufficient Balance\",\n\t\t\tpendingWithdrawal: \"Already Have Pending Withdrawal\",\n\t\t},\n\t\tbuttons: {\n\t\t\twithdraw: (amount: string, symbol: string) =>\n\t\t\t\t`Withdraw ${amount} ${symbol}`,\n\t\t\tminimum: (amount: string, symbol: string) =>\n\t\t\t\t`Minimum ${amount} ${symbol}`,\n\t\t},\n\t};\n};\n\n// Import all five specialized child hooks\nimport { useWithdrawalNetworkCheck } from \"./useWithdrawalNetworkCheck\";\nimport { useWithdrawFormState } from \"./useWithdrawFormState\";\nimport { useWithdrawCalculations } from \"./useWithdrawCalculations\";\nimport { useWithdrawTransaction } from \"./useWithdrawTransaction\";\n\nexport const useWithdraw = () => {\n\t// --- 1. COMPOSE THE CHILD HOOKS IN A STRICT, TOP-DOWN ORDER ---\n\n\t// Initialize localization\n\tconst i18n = useWithdrawI18n();\n\n\t// A. Get Global Context and Source State\n\tconst { user, refreshUserData } = useDynamicAuth();\n\tconst { isNetworkSupported } = useWithdrawalNetworkCheck();\n\n\t// B. Initialize the SELF-SUFFICIENT Form State and Token Fetching Hook\n\tconst {\n\t\tavailableTokens,\n\t\tisLoadingTokens,\n\t\tfetchWithdrawTokensApi,\n\t\twithdrawAmount,\n\t\twithdrawAddress,\n\t\tselectedToken,\n\t\tisAddressValid,\n\t\tisBalanceInsufficient,\n\t\tisBelowMinimum,\n\t\tmaxWithdrawAmount,\n\t\thandleAmountChange,\n\t\thandleAddressChange,\n\t\tsetMaxAmount,\n\t\tupdateSelectedToken,\n\t\tresetFormState,\n\t\tvalidateWithdrawal,\n\t} = useWithdrawFormState();\n\tconsole.log({ withdrawAddress });\n\t// C. Call the \"Calculator\" hooks\n\tconst { fee, totalPayout, minWithdrawAmount, isFetchingMinWithdrawAmount } =\n\t\tuseWithdrawCalculations({\n\t\t\twithdrawAmount,\n\t\t});\n\n\t// D. Call the \"Executor\" hook\n\tconst {\n\t\tisLoading: isTransactionLoading,\n\t\tisPending,\n\t\ttransactionHash,\n\t\ttimeLeft,\n\t\tisWithdrawalSuccessful,\n\t\tshowReservedModal,\n\t\tsetShowReservedModal,\n\t\texecuteWithdrawTransaction,\n\t\tstartTimer,\n\t\thandleSpecialMessages,\n\t\tresetTransactionState,\n\t} = useWithdrawTransaction({\n\t\tselectedToken,\n\t\twithdrawAmount,\n\t\twithdrawAddress,\n\t\tonTransactionComplete: resetFormState, // Reset form when transaction completes\n\t});\n\n\t// E. Manage Final UI State that is local to this hook\n\tconst [showingConfetti, setShowingConfetti] = useState(false);\n\tconst [showSuccessModal, setShowSuccessModal] = useState(false);\n\n\t// F. Effect to show success modal when withdrawal is successful\n\tuseEffect(() => {\n\t\tif (isWithdrawalSuccessful) {\n\t\t\t// Small delay to let confetti start first\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tsetShowSuccessModal(true);\n\t\t\t}, 1000);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\t}, [isWithdrawalSuccessful]);\n\n\t// --- 2. ORCHESTRATION & FINAL HELPER LOGIC (Faithful Implementation) ---\n\n\tconst executeWithdraw = useCallback(async () => {\n\t\t// This is the orchestration logic from your original reference code.\n\t\tif (!validateWithdrawal()) {\n\t\t\t// The form state hook will have already shown a specific toast message.\n\t\t\treturn;\n\t\t}\n\t\tif (user?.pendingWd === true) {\n\t\t\ttoast.error(i18n.errors.pendingWithdrawal);\n\t\t\treturn;\n\t\t}\n\t\tawait executeWithdrawTransaction();\n\t}, [validateWithdrawal, user, executeWithdrawTransaction, i18n]);\n\n\tconst resetPage = useCallback(() => {\n\t\tresetFormState();\n\t\tresetTransactionState();\n\t\tsetShowSuccessModal(false);\n\t}, [resetFormState, resetTransactionState]);\n\n\tconst getButtonText = useCallback((): string => {\n\t\tif (user?.pendingWd) return i18n.status.pendingWithdrawal;\n\t\tif (isPending) return `Confirming on Blockchain ${timeLeft}s`;\n\n\t\tif (isTransactionLoading) return i18n.status.processing;\n\t\tif (!withdrawAmount || Number(withdrawAmount) <= 0)\n\t\t\treturn i18n.errors.enterAmount;\n\t\tif (isBelowMinimum)\n\t\t\treturn i18n.buttons.minimum(\n\t\t\t\tminWithdrawAmount.toFixed(2),\n\t\t\t\tselectedToken?.token_symbol || \"\"\n\t\t\t);\n\t\tif (isBalanceInsufficient) return i18n.status.insufficientBalance;\n\t\tif (!isAddressValid) return i18n.errors.invalidAddress;\n\t\tif (!isNetworkSupported) return i18n.errors.networkNotSupported;\n\t\treturn i18n.buttons.withdraw(\n\t\t\twithdrawAmount,\n\t\t\tselectedToken?.token_symbol || \"\"\n\t\t);\n\t}, [\n\t\tisTransactionLoading,\n\t\twithdrawAmount,\n\t\tisBelowMinimum,\n\t\tisBalanceInsufficient,\n\t\tisAddressValid,\n\t\tisNetworkSupported,\n\t\tselectedToken,\n\t\tminWithdrawAmount,\n\t\tuser?.pendingWd,\n\t\ti18n,\n\t\tisPending,\n\t\ttimeLeft,\n\t]);\n\n\tconst isWithdrawDisabled = useCallback((): boolean => {\n\t\treturn (\n\t\t\t!isNetworkSupported ||\n\t\t\tisTransactionLoading ||\n\t\t\tisLoadingTokens ||\n\t\t\tisPending ||\n\t\t\tuser?.pendingWd === true ||\n\t\t\t!withdrawAmount ||\n\t\t\tparseFloat(withdrawAmount) <= 0 ||\n\t\t\tisBalanceInsufficient ||\n\t\t\tisBelowMinimum ||\n\t\t\t!isAddressValid\n\t\t);\n\t}, [\n\t\tisNetworkSupported,\n\t\tisTransactionLoading,\n\t\tisLoadingTokens,\n\t\tisPending,\n\t\tuser?.pendingWd,\n\t\twithdrawAmount,\n\t\tisBalanceInsufficient,\n\t\tisBelowMinimum,\n\t\tisAddressValid,\n\t]);\n\n\t// --- 3. RETURN THE COMPLETE, UNIFIED API ---\n\t// This return object has 100% parity with your requested list.\n\treturn {\n\t\t// State\n\t\tselectedToken,\n\t\twithdrawAmount,\n\t\twithdrawAddress,\n\t\twithdrawTokenSymbol: selectedToken?.token_symbol,\n\t\tfee,\n\t\ttotalPayout,\n\t\tmaxWithdrawAmount,\n\t\tisPending,\n\t\ttimeLeft,\n\t\ttimerActive: isPending && timeLeft > 0,\n\t\tisLoading:\n\t\t\tisTransactionLoading ||\n\t\t\tisLoadingTokens ||\n\t\t\tisFetchingMinWithdrawAmount,\n\t\tisAmountValid: !isBelowMinimum && !isBalanceInsufficient,\n\t\tisAddressValid,\n\t\tisWithdrawalSuccessful,\n\t\twithdrawTxHash: transactionHash,\n\t\tshowingConfetti,\n\t\tshowSuccessModal,\n\t\tisBalanceInsufficient,\n\t\tisBelowMinimum,\n\t\tisNetworkSupported,\n\t\tshowReservedModal,\n\t\tavailableTokens,\n\t\tisLoadingTokens,\n\t\tisTransactionLoading,\n\t\ttokenWD: selectedToken,\n\t\tminWithdrawAmount,\n\t\tisFetchingMinWithdrawAmount,\n\n\t\t// Actions\n\t\thandleAmountChange,\n\t\thandleAddressChange,\n\t\tsetMaxAmount,\n\t\t// selectWithdrawToken: updateSelectedToken, // Alias for clarity\n\t\tupdateSelectedToken,\n\t\tfetchWithdrawTokensApi,\n\t\texecuteWithdraw,\n\t\tresetPage,\n\t\tstartTimer, // Internal to useWithdrawTransaction\n\t\thandleSpecialMessages, // Internal to useWithdrawTransaction\n\t\tsetShowingConfetti: (value: boolean) => setShowingConfetti(value),\n\t\tsetShowReservedModal,\n\t\trefetchBalance: refreshUserData,\n\t\tsetShowSuccessModal,\n\n\t\t// UI Helpers\n\t\tgetButtonText,\n\t\tisWithdrawDisabled,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport {\n\tuseDynamicContext,\n\tdynamicEvents,\n\tgetNetwork,\n} from \"@dynamic-labs/sdk-react-core\";\n\n/**\n * An array of chain IDs where withdrawal functionality is supported.\n */\nexport const SUPPORTED_WITHDRAWAL_NETWORKS: number[] = [42161, 137, 56];\n\n/**\n * A specialized, self-contained hook that actively listens for network changes\n * and determines if the current network is supported for withdrawals.\n *\n * This hook is a faithful and robust implementation of the original reference logic.\n *\n * @returns An object containing a boolean flag `isNetworkSupported`.\n */\nexport const useWithdrawalNetworkCheck = () => {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst [isNetworkSupported, setIsNetworkSupported] = useState(true); // Default to true to prevent initial UI flicker\n\n\tuseEffect(() => {\n\t\t// This is the core logic, directly translated from your reference code.\n\t\tconst checkNetworkSupport = async () => {\n\t\t\ttry {\n\t\t\t\tif (!primaryWallet?.connector) {\n\t\t\t\t\t// If there's no wallet, we can consider it unsupported for now.\n\t\t\t\t\tsetIsNetworkSupported(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst networkId = await getNetwork(primaryWallet.connector);\n\n\t\t\t\tif (!networkId) {\n\t\t\t\t\tconsole.error(\"Failed to fetch network ID\");\n\t\t\t\t\tsetIsNetworkSupported(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// The check is now against our centralized configuration.\n\t\t\t\tsetIsNetworkSupported(\n\t\t\t\t\tSUPPORTED_WITHDRAWAL_NETWORKS.includes(Number(networkId))\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error checking network support:\", error);\n\t\t\t\tsetIsNetworkSupported(false);\n\t\t\t}\n\t\t};\n\n\t\t// --- Lifecycle Management ---\n\n\t\t// 1. Initial check when the wallet is available.\n\t\tcheckNetworkSupport();\n\n\t\t// 2. Set up the event listener to react to network changes in real-time.\n\t\tconst handleNetworkChange = () => {\n\t\t\tcheckNetworkSupport();\n\t\t};\n\n\t\tdynamicEvents.on(\"primaryWalletNetworkChanged\", handleNetworkChange);\n\n\t\t// 3. The crucial cleanup function to prevent memory leaks.\n\t\treturn () => {\n\t\t\tdynamicEvents.off(\n\t\t\t\t\"primaryWalletNetworkChanged\",\n\t\t\t\thandleNetworkChange\n\t\t\t);\n\t\t};\n\n\t\t// This effect correctly re-runs only when the primary wallet object itself changes.\n\t}, [primaryWallet]);\n\n\treturn {\n\t\tisNetworkSupported,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { WithdrawToken } from \"@/types/walletProvider/transaction-service.types\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { useAppStore } from \"@/store/store\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { toast } from \"sonner\";\n\n// A simple utility for basic address format validation.\nconst validateAddress = (address: string): boolean => {\n\treturn /^0x[a-fA-F0-9]{40}$/.test(address);\n};\n\n/**\n * A specialized hook with a single responsibility: to manage all user inputs\n * and the state of the withdrawal form itself.\n *\n * It is the primary \"state source\" for the withdrawal feature.\n */\nexport const useWithdrawFormState = () => {\n\t// --- 1. Get Dependencies from Global Context ---\n\tconst { user, authToken, isLoggedIn } = useDynamicAuth();\n\n\t// The user's total balance from the auth context.\n\tconst maxWithdrawAmount = useMemo(\n\t\t() => user?.balance || 0,\n\t\t[user?.balance]\n\t);\n\n\t// maybe I'll be needing getNetwork here later if getting chainId from store becomes a problem\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\n\t// --- 2. Manage the Hook's Own State ---\n\n\t// State for network and token selection\n\tconst [availableTokens, setAvailableTokens] = useState<WithdrawToken[]>([]);\n\tconst [isLoadingTokens, setIsLoadingTokens] = useState(false);\n\n\t// State for withdrawal form inputs\n\tconst [withdrawAmount, setWithdrawAmount] = useState(\"\");\n\tconst [withdrawAddress, setWithdrawAddress] = useState(\"\");\n\tconst [selectedToken, setSelectedToken] = useState<WithdrawToken | null>(\n\t\tnull\n\t);\n\tconst [withdrawTokenSymbol, setWithdrawTokenSymbol] = useState(\"USDT\"); // Default symbol\n\n\t// State for input validation\n\tconst [isAddressValid, setIsAddressValid] = useState(true);\n\tconst [isBalanceInsufficient, setIsBalanceInsufficient] = useState(false);\n\tconst [isBelowMinimum, setIsBelowMinimum] = useState(false);\n\n\t// --- 3. CORE LOGIC: FETCHING AND STATE INITIALIZATION ---\n\tconst fetchWithdrawTokensApi = useCallback(async () => {\n\t\tif (!chainId) {\n\t\t\tsetAvailableTokens([]);\n\t\t\treturn;\n\t\t}\n\t\tsetIsLoadingTokens(true);\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst response = await transactionService.fetchWithdrawTokens(\n\t\t\t\t{ network: chainId },\n\t\t\t\tauthToken\n\t\t\t);\n\n\t\t\tif (response.error === false && Array.isArray(response.data)) {\n\t\t\t\tconst tokens = response.data;\n\t\t\t\tsetAvailableTokens(tokens);\n\t\t\t\tif (tokens.length > 0) {\n\t\t\t\t\tsetSelectedToken(tokens[0]);\n\t\t\t\t\tsetWithdrawTokenSymbol(\n\t\t\t\t\t\ttokens[0]?.token_symbol || \"Backup Value\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetAvailableTokens([]);\n\t\t\t\tconst errorMessage =\n\t\t\t\t\t\"message\" in response &&\n\t\t\t\t\ttypeof response.message === \"string\"\n\t\t\t\t\t\t? response.message\n\t\t\t\t\t\t: \"Could not load withdrawal tokens for this network.\";\n\t\t\t\ttoast.error(errorMessage);\n\t\t\t\tconsole.error(\"Error fetching withdraw tokens:\", errorMessage);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetAvailableTokens([]);\n\t\t\tconsole.error(\"Error fetching withdraw tokens:\", error);\n\t\t\ttoast.error(\"An error occurred while fetching withdrawal tokens.\");\n\t\t} finally {\n\t\t\tsetIsLoadingTokens(false);\n\t\t}\n\t}, [chainId, authToken]);\n\n\tuseEffect(() => {\n\t\tif (isLoggedIn && chainId) {\n\t\t\tfetchWithdrawTokensApi();\n\t\t}\n\t}, [isLoggedIn, chainId, fetchWithdrawTokensApi]);\n\n\t// useEffect(() => {\n\t// \t// console.log(\"Fetching withdraw tokens for chainId:\", chainId);\n\t// \tfetchWithdrawTokens();\n\t// }, []);\n\n\t// useEffect(() => {\n\t// \tconsole.log(\"Fetching withdraw tokens for chainId:\", chainId);\n\t// \tconsole.log(\"Is user logged in?\", isLoggedIn);\n\t// \tif (isLoggedIn && chainId) {\n\t// \t\tfetchWithdrawTokens();\n\t// \t} else {\n\t// \t\tsetAvailableTokens([]);\n\t// \t}\n\t// }, [isLoggedIn, chainId]);\n\n\t// Fetch tokens when the hook is initialized or when the chainId changes\n\t// useEffect(() => {\n\t// \tif (isLoggedIn && chainId) {\n\t// \t\tfetchWithdrawTokens();\n\t// \t} else {\n\t// \t\tsetAvailableTokens([]);\n\t// \t}\n\t// }, [chainId]);\n\n\t// --- 4. Logic Effects ---\n\n\t// Effect to set the initial state when data becomes available.\n\t// useEffect(() => {\n\t// \t// Set the first available token as the default selection.\n\t// \tif (!selectedToken && availableTokens.length > 0) {\n\t// \t\tsetSelectedToken(availableTokens[0]);\n\t// \t}\n\t// \t// Set the user's own wallet as the default destination address.\n\t// \tif (!withdrawAddress && user?.walletAddress) {\n\t// \t\tsetWithdrawAddress(user.walletAddress);\n\t// \t\tsetIsAddressValid(validateAddress(user.walletAddress));\n\t// \t}\n\t// }, [availableTokens, user?.walletAddress, selectedToken, withdrawAddress]);\n\n\t// --- 4. Core Action Handlers (Callbacks) ---\n\n\t/**\n\t * Handle changes to the withdrawal address\n\t */\n\tconst handleAddressChange = useCallback((value: string) => {\n\t\tsetWithdrawAddress(value);\n\t\tsetIsAddressValid(validateAddress(value));\n\t}, []);\n\n\t/**\n\t * Handle changes to the withdrawal amount\n\t */\n\tconst handleAmountChange = useCallback(\n\t\t(value: string, minAmount: number) => {\n\t\t\t// This is a faithful implementation of your original sanitization logic.\n\t\t\tlet sanitizedValue = value.replace(/[^0-9.]/g, \"\");\n\n\t\t\t// Handle decimal point logic\n\t\t\tconst decimalCount = (sanitizedValue.match(/\\./g) || []).length;\n\t\t\tif (decimalCount > 1) {\n\t\t\t\tsanitizedValue = sanitizedValue.substring(\n\t\t\t\t\t0,\n\t\t\t\t\tsanitizedValue.lastIndexOf(\".\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// handle decimal precision\n\t\t\tif (sanitizedValue.includes(\".\")) {\n\t\t\t\tconst parts = sanitizedValue.split(\".\");\n\t\t\t\tsanitizedValue = `${parts[0]}.${parts[1].slice(0, 2)}`; // only 2 decimal places for withdrawals\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tsanitizedValue.startsWith(\"0\") &&\n\t\t\t\tsanitizedValue !== \"0\" &&\n\t\t\t\t!sanitizedValue.startsWith(\"0.\")\n\t\t\t) {\n\t\t\t\tsanitizedValue = sanitizedValue.replace(/^0+/, \"\"); // Remove leading zeros\n\t\t\t}\n\n\t\t\tif (sanitizedValue.startsWith(\".\")) {\n\t\t\t\tsanitizedValue = `0${sanitizedValue}`;\n\t\t\t}\n\n\t\t\t//  Check amount validity\n\t\t\tconst amount = parseFloat(sanitizedValue) || 0;\n\n\t\t\tif (amount > maxWithdrawAmount) {\n\t\t\t\tsetIsBalanceInsufficient(true);\n\t\t\t} else {\n\t\t\t\tsetIsBalanceInsufficient(false);\n\t\t\t}\n\n\t\t\t//  Check if amount is below minmum\n\t\t\tif (amount > 0 && amount < minAmount) {\n\t\t\t\tsetIsBelowMinimum(true);\n\t\t\t} else {\n\t\t\t\tsetIsBelowMinimum(false);\n\t\t\t}\n\n\t\t\tsetWithdrawAmount(sanitizedValue);\n\t\t},\n\t\t[maxWithdrawAmount]\n\t);\n\n\t/**\n\t * Update token selection\n\t */\n\tconst updateSelectedToken = useCallback((token: WithdrawToken) => {\n\t\tsetSelectedToken(token);\n\t\tsetWithdrawTokenSymbol(token.token_symbol);\n\t}, []);\n\n\t/**\n\t * Set maximum withdrawal amount\n\t */\n\tconst setMaxAmount = useCallback(() => {\n\t\tif (maxWithdrawAmount > 0) {\n\t\t\tsetWithdrawAmount(maxWithdrawAmount.toString());\n\t\t\t// Also update validation state when setting max\n\t\t\t// setIsBalanceInsufficient(false);\n\t\t\t// setIsBelowMinimum(false); // Assuming max is always > min\n\t\t}\n\t}, [maxWithdrawAmount]);\n\n\t/**\n\t * Change the withdrawal token\n\t */\n\t// const selectWithdrawToken = (token: WithdrawToken) => {\n\t// \tsetWithdrawTokenSymbol(token.token_symbol);\n\t// };\n\n\tconst resetFormState = useCallback(() => {\n\t\tsetWithdrawAmount(\"\");\n\t\tsetIsAddressValid(true);\n\t\tsetIsBalanceInsufficient(false);\n\t\tsetIsBelowMinimum(false);\n\t\tsetWithdrawTokenSymbol(\"USDT\"); // Reset to default symbol\n\t\t// Do not reset the selected token or address, as these are often convenient to keep.\n\t}, []);\n\n\tconst validateWithdrawal = useCallback(() => {\n\t\tconst amount = parseFloat(withdrawAmount) || 0;\n\t\tif (\n\t\t\tisBalanceInsufficient ||\n\t\t\tisBelowMinimum ||\n\t\t\t!isAddressValid ||\n\t\t\tamount <= 0\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}, [withdrawAmount, isAddressValid, isBalanceInsufficient, isBelowMinimum]);\n\n\t// --- 5. Return the Final, Public API ---\n\treturn {\n\t\t// \t\t// State\n\t\twithdrawAmount,\n\t\twithdrawAddress,\n\t\tselectedToken,\n\t\twithdrawTokenSymbol,\n\t\tisAddressValid,\n\t\tisBalanceInsufficient,\n\t\tisBelowMinimum,\n\t\tmaxWithdrawAmount,\n\t\tavailableTokens,\n\t\tisLoadingTokens,\n\t\t// \t\t// Actions\n\t\thandleAmountChange,\n\t\thandleAddressChange,\n\t\tsetMaxAmount,\n\t\t// \t\t// selectWithdrawToken,\n\t\tsetWithdrawTokenSymbol,\n\t\tfetchWithdrawTokensApi,\n\t\tupdateSelectedToken,\n\t\tresetFormState,\n\t\tvalidateWithdrawal,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { useDebounce } from \"../useDebounce\";\n\n// --- HOOK'S \"CONTRACT\" ---\ninterface UseWithdrawCalculationsProps {\n\twithdrawAmount: string;\n}\n\n/**\n * The definitive, feature-complete hook for all off-chain withdrawal calculations.\n *\n * It is responsible for:\n * 1. Fetching the DYNAMIC minimum withdrawal amount from the /getWalletAgent API.\n * 2. Calculating the withdrawal fee based on the user's input.\n * 3. Calculating the final total payout.\n */\nexport const useWithdrawCalculations = ({\n\twithdrawAmount,\n}: UseWithdrawCalculationsProps) => {\n\t// --- 1. Get Dependencies from State and Context ---\n\tconst { chainId } = useAppStore((state) => state.blockchain.network);\n\tconst { authToken } = useDynamicAuth();\n\n\t// Debounce the withdrawal amount to prevent excessive calculations (300ms)\n\tconst debouncedWithdrawAmount = useDebounce(withdrawAmount, 300);\n\n\t// --- 2. Manage the Hook's Own State ---\n\tconst [fee, setFee] = useState<number>(0);\n\tconst [totalPayout, setTotalPayout] = useState(0);\n\tconst [minWithdrawAmount, setMinWithdrawAmount] = useState<number>(0);\n\tconst [isFetchingMinWithdrawAmount, setIsFetchingMinWithdrawAmount] =\n\t\tuseState(false);\n\n\t// --- 3. The Core Logic Effects ---\n\n\t// Effect 1: Synchronous Fee and Payout calculation (debounced)\n\tuseEffect(() => {\n\t\tconst amount = parseFloat(debouncedWithdrawAmount);\n\t\tif (isNaN(amount) || amount <= 0) {\n\t\t\tsetTotalPayout(0);\n\t\t\treturn;\n\t\t}\n\t\tconst calculatedFee = amount * 0.01; // 1% fee\n\t\tconst calculatedPayout = amount - calculatedFee;\n\t\tsetTotalPayout(calculatedPayout);\n\t}, [debouncedWithdrawAmount]);\n\n\t// Effect 2: Asynchronous fetching of the DYNAMIC Minimum Withdrawal Amount\n\tuseEffect(() => {\n\t\tconst fetchWithdrawConfig = async () => {\n\t\t\ttry {\n\t\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\t\tconst response = await transactionService.getWalletAgentData(\n\t\t\t\t\tString(chainId), // Pass network as string if needed by service\n\t\t\t\t\tauthToken\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\t!response.error &&\n\t\t\t\t\tresponse.data?.setting?.withdraw &&\n\t\t\t\t\tresponse.data?.setting?.fee\n\t\t\t\t) {\n\t\t\t\t\tconst minAmount = parseFloat(\n\t\t\t\t\t\tresponse.data.setting.withdraw\n\t\t\t\t\t);\n\t\t\t\t\tconst feeAmount = parseFloat(response.data.setting.fee);\n\n\t\t\t\t\tsetMinWithdrawAmount(Number(minAmount));\n\t\t\t\t\tsetFee(Number(feeAmount));\n\t\t\t\t}\n\t\t\t\tsetIsFetchingMinWithdrawAmount(false);\n\t\t\t} catch (error) {\n\t\t\t\tsetIsFetchingMinWithdrawAmount(false);\n\t\t\t\tconsole.error(\"Failed to fetch wallet agent config:\", error);\n\t\t\t}\n\t\t};\n\n\t\tsetIsFetchingMinWithdrawAmount(true);\n\t\tfetchWithdrawConfig();\n\t}, [chainId]);\n\n\t// --- 4. Return the Final, Public API ---\n\treturn {\n\t\tfee: fee as number, // The calculated fee\n\t\ttotalPayout,\n\t\tminWithdrawAmount: minWithdrawAmount as number, // The dynamic, API-driven value\n\t\tisFetchingMinWithdrawAmount, // A loading state for the UI to consume\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport {\n\tWithdrawToken,\n\tPreWithdrawData,\n\tPrimaryWalletWithClient,\n} from \"@/types/walletProvider/transaction-service.types\";\nimport {\n\tTransactionType,\n\tTransactionStatus,\n} from \"@/types/blockchain/transactions.types\";\nimport { toast } from \"sonner\";\nimport confetti from \"canvas-confetti\";\n// import pandaABI from \"@/abi/pandaByteCore.json\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { getSdkConfig } from \"@/config\";\nimport { ethers } from \"ethers\";\n\n// --- HOOK'S \"CONTRACT\" (What it needs to receive) ---\ninterface UseWithdrawTransactionProps {\n\tselectedToken: WithdrawToken | null;\n\twithdrawAmount: string;\n\twithdrawAddress: string;\n\tonTransactionComplete?: () => void; // Callback when transaction completes (success or failure)\n}\n\n/**\n * The definitive, feature-complete hook for the withdrawal transaction lifecycle.\n * This is a FAITHFUL implementation of the logic from the original reference code.\n */\nexport const useWithdrawTransaction = ({\n\tselectedToken,\n\twithdrawAmount,\n\twithdrawAddress,\n\tonTransactionComplete,\n}: UseWithdrawTransactionProps) => {\n\t// --- Withdrawal Transaction State ---\n\n\t// These state variables track the lifecycle and status of a withdrawal transaction.\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst [transactionHash, setTransactionHash] = useState<string | null>(null);\n\tconst [timeLeft, setTimeLeft] = useState(0);\n\tconst [isWithdrawalSuccessful, setIsWithdrawalSuccessful] = useState(false);\n\tconst { abi, withdrawFunctionName } = getSdkConfig();\n\t// eslint-disable-next-line\n\tconst [_preWithdrawData, setPreWithdrawData] =\n\t\tuseState<PreWithdrawData | null>(null);\n\n\t// Reserved modal state\n\tconst [showReservedModal, setShowReservedModal] = useState(false);\n\tconst { primaryWallet } = useDynamicContext();\n\n\t// --- Authentication & Service Instances ---\n\t// Used for user context and API calls.\n\tconst { user, authToken, refreshUserData } = useDynamicAuth();\n\n\t// --- Zustand Store Selectors ---\n\t// Used for transaction management and network info.\n\tconst { addTransaction, _updateTransaction } = useAppStore(\n\t\t(state) => state.blockchain.transaction\n\t);\n\tconst { chainId, network } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\tconst fetchTokens = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\tconst transactionService = TransactionService.getInstance();\n\n\t// --- Internal Refs ---\n\t// Used for polling intervals.\n\tconst pollingIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n\t// --- Wagmi Contract Simulation & Execution ---\n\t// Used for gas estimation and contract write.\n\n\t/**\n\t * Polls the backend for the status of a withdrawal transaction and updates state accordingly.\n\t * Handles transaction status transitions and updates local state/store.\n\t */\n\tconst pollTransactionStatus = useCallback(\n\t\tasync (hash: string) => {\n\t\t\ttry {\n\t\t\t\tif (!user?.username || !authToken) return;\n\t\t\t\tconst response =\n\t\t\t\t\tawait transactionService.checkTransactionStatus(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttransaction_type: \"WD\",\n\t\t\t\t\t\t\thash,\n\t\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tauthToken\n\t\t\t\t\t);\n\n\t\t\t\tconst tx = useAppStore\n\t\t\t\t\t.getState()\n\t\t\t\t\t.blockchain.transaction.transactions.find(\n\t\t\t\t\t\t(t) => t.hash === hash\n\t\t\t\t\t);\n\t\t\t\tif (!tx) return;\n\n\t\t\t\tconst txStatus = response.transaction_status;\n\t\t\t\tif (\n\t\t\t\t\ttxStatus === \"CONFIRMED\" ||\n\t\t\t\t\ttxStatus === \"FAILED\" ||\n\t\t\t\t\ttxStatus === \"REJECTED\"\n\t\t\t\t) {\n\t\t\t\t\tif (pollingIntervalRef.current)\n\t\t\t\t\t\tclearInterval(pollingIntervalRef.current);\n\n\t\t\t\t\tconst newStatus =\n\t\t\t\t\t\ttxStatus === \"CONFIRMED\"\n\t\t\t\t\t\t\t? TransactionStatus.CONFIRMED\n\t\t\t\t\t\t\t: TransactionStatus.FAILED;\n\t\t\t\t\t_updateTransaction(tx.id, {\n\t\t\t\t\t\tstatus: newStatus,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\ttxStatus === \"REJECTED\"\n\t\t\t\t\t\t\t\t? \"Transaction Rejected\"\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t});\n\n\t\t\t\t\tsetIsPending(false);\n\t\t\t\t\tsetIsWithdrawalSuccessful(\n\t\t\t\t\t\tnewStatus === TransactionStatus.CONFIRMED\n\t\t\t\t\t);\n\n\t\t\t\t\tif (newStatus === TransactionStatus.CONFIRMED) {\n\t\t\t\t\t\ttoast.success(\"Withdrawal Confirmed!\");\n\t\t\t\t\t\tconfetti({\n\t\t\t\t\t\t\tspread: 360,\n\t\t\t\t\t\t\tticks: 50,\n\t\t\t\t\t\t\tgravity: 0,\n\t\t\t\t\t\t\tdecay: 0.94,\n\t\t\t\t\t\t\tstartVelocity: 30,\n\t\t\t\t\t\t\tcolors: [\n\t\t\t\t\t\t\t\t\"#FFE400\",\n\t\t\t\t\t\t\t\t\"#FFBD00\",\n\t\t\t\t\t\t\t\t\"#E89400\",\n\t\t\t\t\t\t\t\t\"#FFCA6C\",\n\t\t\t\t\t\t\t\t\"#FDFFB8\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tparticleCount: 40,\n\t\t\t\t\t\t\tscalar: 1.2,\n\t\t\t\t\t\t\tshapes: [\"star\", \"circle\"],\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Refresh token list after successful withdrawal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fetchTokens(true, { user, authToken });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\"Failed to refresh tokens after withdrawal:\",\n\t\t\t\t\t\t\t\terror\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.error(\"Withdrawal failed or was rejected.\");\n\t\t\t\t\t}\n\n\t\t\t\t\trefreshUserData();\n\t\t\t\t\t// Call completion callback for both successful and failed transactions\n\t\t\t\t\tif (onTransactionComplete) {\n\t\t\t\t\t\tonTransactionComplete();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Polling for withdrawal status failed:\", error);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tuser,\n\t\t\tauthToken,\n\t\t\t_updateTransaction,\n\t\t\trefreshUserData,\n\t\t\ttransactionService,\n\t\t\tonTransactionComplete,\n\t\t\tfetchTokens,\n\t\t]\n\t);\n\n\t// --- Effects: Transaction Status Polling & Countdown ---\n\n\t// Handles polling for transaction status and countdown timer for pending transactions.\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisPending &&\n\t\t\ttransactionHash &&\n\t\t\ttransactionHash !== \"manual_approval_pending\"\n\t\t) {\n\t\t\tpollingIntervalRef.current = setInterval(\n\t\t\t\t() => pollTransactionStatus(transactionHash),\n\t\t\t\t3000\n\t\t\t);\n\t\t}\n\t\treturn () => {\n\t\t\tif (pollingIntervalRef.current)\n\t\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t};\n\t}, [isPending, transactionHash, pollTransactionStatus]);\n\n\tuseEffect(() => {\n\t\tif (!isPending || timeLeft <= 0) return;\n\t\tconst timer = setInterval(\n\t\t\t() => setTimeLeft((prev) => (prev > 0 ? prev - 1 : 0)),\n\t\t\t1000\n\t\t);\n\t\treturn () => clearInterval(timer);\n\t}, [isPending, timeLeft]);\n\n\t/**\n\t * Start countdown timer for pending transactions\n\t */\n\tconst startTimer = useCallback(() => {\n\t\tsetTimeLeft(90);\n\t}, []);\n\n\t/**\n\t * Handle special error messages\n\t */\n\tconst handleSpecialMessages = useCallback(\n\t\t(msg: string | undefined): boolean => {\n\t\t\tif (!msg) return false;\n\t\t\tif (msg === \"Reserved\") {\n\t\t\t\tsetShowReservedModal(true);\n\t\t\t\treturn true; // Return true to indicate a special case was handled\n\t\t\t}\n\t\t\tif (msg === \"not_enough\") {\n\t\t\t\ttoast.error(\n\t\t\t\t\t\"Insufficient balance. Please check your available funds.\"\n\t\t\t\t);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// For any other message, show it as a generic error\n\t\t\ttoast.error(msg);\n\t\t\treturn false; // Return false for generic errors\n\t\t},\n\t\t[]\n\t);\n\n\t/**\n\t * This is the faithful implementation of your original `processWithdraw` function.\n\t * Its only job is to execute the final on-chain transaction.\n\t */\n\tconst processWithdraw = useCallback(\n\t\tasync (data: PreWithdrawData) => {\n\t\t\ttry {\n\t\t\t\tif (!data || !data.expiry) {\n\t\t\t\t\ttoast.error(\"Withdrawal data is incomplete.\");\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t\tthrow new Error(\"Withdrawal data is incomplete.\");\n\t\t\t\t}\n\n\t\t\t\tconst decimals = data.decimal || 6;\n\n\t\t\t\tconst finalWdAmountFun = ethers.parseUnits(\n\t\t\t\t\twithdrawAmount.toString(),\n\t\t\t\t\tdecimals\n\t\t\t\t);\n\n\t\t\t\tconst walletClient = await (\n\t\t\t\t\tprimaryWallet as unknown as PrimaryWalletWithClient\n\t\t\t\t)?.getWalletClient();\n\t\t\t\tconsole.log(abi);\n\t\t\t\tconst hash = await walletClient.writeContract({\n\t\t\t\t\taddress: data.contractAddress as `0x${string}`,\n\t\t\t\t\tabi,\n\t\t\t\t\tfunctionName: withdrawFunctionName,\n\t\t\t\t\targs: [\n\t\t\t\t\t\tdata.tokenAddress,\n\t\t\t\t\t\tfinalWdAmountFun,\n\t\t\t\t\t\tdata.transactionId,\n\t\t\t\t\t\tdata.encodedData,\n\t\t\t\t\t\tdata.expiry,\n\t\t\t\t\t\tdata.signature,\n\t\t\t\t\t],\n\t\t\t\t});\n\n\t\t\t\tif (!hash) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Transaction was sent, but a hash was not returned.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsetTransactionHash(hash);\n\t\t\t\t\tsetIsPending(true);\n\t\t\t\t\tstartTimer(); // Call the internal timer function\n\t\t\t\t\taddTransaction({\n\t\t\t\t\t\thash: hash,\n\t\t\t\t\t\ttype: TransactionType.WITHDRAW,\n\t\t\t\t\t\tamount: withdrawAmount,\n\t\t\t\t\t\ttokenSymbol: selectedToken!.token_symbol,\n\t\t\t\t\t\tnetwork: chainId!,\n\t\t\t\t\t});\n\t\t\t\t}, 500);\n\t\t\t\treturn hash;\n\t\t\t} catch (error) {\n\t\t\t\tlet message =\n\t\t\t\t\t\"Cannot withdraw at the moment, please try again later!\";\n\t\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t\"shortMessage\" in error &&\n\t\t\t\t\t\ttypeof (error as { shortMessage?: unknown })\n\t\t\t\t\t\t\t.shortMessage === \"string\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tmessage = (error as { shortMessage: string })\n\t\t\t\t\t\t\t.shortMessage;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t\"message\" in error &&\n\t\t\t\t\t\ttypeof (error as { message?: unknown }).message ===\n\t\t\t\t\t\t\t\"string\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tmessage = (error as { message: string }).message;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole.error(\"Error processing withdrawal:\", error);\n\t\t\t\ttoast.error(message);\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tsetIsWithdrawalSuccessful(false);\n\t\t\t\tsetTransactionHash(\"\");\n\t\t\t\tsetIsPending(false);\n\t\t\t\tsetTimeLeft(0);\n\t\t\t\tthrow error; // Re-throw the error to be handled by the caller\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\twithdrawAmount,\n\t\t\tselectedToken,\n\t\t\taddTransaction,\n\t\t\tchainId,\n\t\t\tstartTimer,\n\t\t\tprimaryWallet,\n\t\t]\n\t);\n\n\t// --- Withdrawal transaction execution function ---\n\t/**\n\t * Executes the withdrawal transaction (auto or manual) and manages all related state and side effects.\n\t * Handles both auto and manual withdrawal flows, including contract simulation and backend submission.\n\t */\n\tconst executeWithdrawTransaction = useCallback(async () => {\n\t\tif (\n\t\t\t!selectedToken ||\n\t\t\t!user ||\n\t\t\t!authToken ||\n\t\t\t!chainId ||\n\t\t\t!network?.name\n\t\t) {\n\t\t\ttoast.error(\n\t\t\t\t\"Cannot proceed: User or network information is missing.\"\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsLoading(true);\n\t\tsetIsWithdrawalSuccessful(false);\n\n\t\ttry {\n\t\t\tconst isAutoWithdrawOn = user.autowd?.toUpperCase() !== \"OFF\";\n\t\t\tlet finalTxHash: string | null = null;\n\n\t\t\tif (isAutoWithdrawOn) {\n\t\t\t\t// --- AUTO WITHDRAW FLOW ---\n\t\t\t\t// Performs risk check, pre-withdrawal data fetch, contract simulation, and execution.\n\t\t\t\tconst riskResult = await transactionService.performRiskCheck(\n\t\t\t\t\t{\n\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t\tamount: withdrawAmount,\n\t\t\t\t\t},\n\t\t\t\t\tauthToken\n\t\t\t\t);\n\n\t\t\t\t// console.log(\"Risk Check Result:\", riskResult);\n\n\t\t\t\tif (\n\t\t\t\t\triskResult.error ||\n\t\t\t\t\triskResult.status?.toLowerCase() === \"critical\"\n\t\t\t\t) {\n\t\t\t\t\thandleSpecialMessages(riskResult.status?.toLowerCase());\n\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\triskResult.status || \"Withdrawal failed risk check.\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// console.log({\n\t\t\t\t// \tusername: user.username,\n\t\t\t\t// \tto_address: user.walletAddress as string,\n\t\t\t\t// \ttoken_address: selectedToken.token_address,\n\t\t\t\t// \tamount: withdrawAmount,\n\t\t\t\t// \tnetwork: chainId,\n\t\t\t\t// \ttoken_type: selectedToken.token_symbol,\n\t\t\t\t// });\n\n\t\t\t\tconst preWithdrawResult =\n\t\t\t\t\tawait transactionService.fetchPreWithdrawData(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t\t\tto_address: user.walletAddress as string,\n\t\t\t\t\t\t\ttoken_address: selectedToken.token_address,\n\t\t\t\t\t\t\tamount: withdrawAmount,\n\t\t\t\t\t\t\tnetwork: chainId,\n\t\t\t\t\t\t\ttoken_type: selectedToken.token_symbol,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tauthToken\n\t\t\t\t\t);\n\n\t\t\t\tif (preWithdrawResult.error)\n\t\t\t\t\tthrow new Error(preWithdrawResult.message);\n\t\t\t\tsetPreWithdrawData(preWithdrawResult.data);\n\n\t\t\t\t// This is a short delay to allow the `useSimulateContract` hook to react to the new `preWithdrawData`\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\n\t\t\t\tfinalTxHash = (await processWithdraw(\n\t\t\t\t\tpreWithdrawResult.data\n\t\t\t\t)) as `0x${string}`;\n\t\t\t} else {\n\t\t\t\t// --- MANUAL WITHDRAW FLOW ---\n\n\t\t\t\t// Submits withdrawal for manual approval via backend.\n\t\t\t\tconst manualResult =\n\t\t\t\t\tawait transactionService.withdrawWalletManual(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tusername: user.username,\n\t\t\t\t\t\t\tnetwork: chainId,\n\t\t\t\t\t\t\tamount: withdrawAmount,\n\t\t\t\t\t\t\ttoken_type: selectedToken.token_symbol,\n\t\t\t\t\t\t\ttoken_address: selectedToken.token_address,\n\t\t\t\t\t\t\tdst_wallet: primaryWallet?.address as string,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tauthToken\n\t\t\t\t\t);\n\n\t\t\t\tif (manualResult.error) throw new Error(manualResult.message);\n\t\t\t\ttoast.success(\"Withdrawal submitted for manual approval.\");\n\t\t\t\tfinalTxHash = \"manual_approval_pending\";\n\t\t\t}\n\n\t\t\t// --- POST-SUBMISSION STATE UPDATES ---\n\t\t\tif (!finalTxHash)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Transaction was submitted but no hash was returned.\"\n\t\t\t\t);\n\n\t\t\tsetTransactionHash(finalTxHash);\n\t\t\tsetIsPending(true);\n\t\t\tstartTimer(); // Start the countdown timer\n\t\t\taddTransaction({\n\t\t\t\thash: finalTxHash,\n\t\t\t\ttype: TransactionType.WITHDRAW,\n\t\t\t\tamount: withdrawAmount,\n\t\t\t\ttokenSymbol: selectedToken.token_symbol,\n\t\t\t\tnetwork: chainId,\n\t\t\t});\n\t\t\trefreshUserData();\n\t\t} catch (error) {\n\t\t\tlet message = \"Withdrawal failed.\";\n\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\tif (\n\t\t\t\t\t\"shortMessage\" in error &&\n\t\t\t\t\ttypeof (error as { shortMessage?: unknown })\n\t\t\t\t\t\t.shortMessage === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { shortMessage: string }).shortMessage;\n\t\t\t\t} else if (\n\t\t\t\t\t\"message\" in error &&\n\t\t\t\t\ttypeof (error as { message?: unknown }).message === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { message: string }).message;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttoast.error(message);\n\t\t\tconsole.error(\"Withdrawal execution failed:\", error);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [\n\t\tselectedToken,\n\t\twithdrawAmount,\n\t\twithdrawAddress,\n\t\tuser,\n\t\tauthToken,\n\t\tchainId,\n\t\tnetwork,\n\t\taddTransaction,\n\t\trefreshUserData,\n\t\ttransactionService,\n\t\thandleSpecialMessages,\n\t\tprocessWithdraw,\n\t\tstartTimer,\n\t]);\n\n\t/**\n\t * Resets all withdrawal transaction state variables to their initial values.\n\t * Useful for clearing the form and state after a transaction completes or fails.\n\t */\n\tconst resetTransactionState = useCallback(() => {\n\t\tsetIsLoading(false);\n\t\tsetIsPending(false);\n\t\tsetTransactionHash(null);\n\t\tsetTimeLeft(0);\n\t\tsetIsWithdrawalSuccessful(false);\n\t\tsetPreWithdrawData(null);\n\t\tif (pollingIntervalRef.current)\n\t\t\tclearInterval(pollingIntervalRef.current);\n\t}, []);\n\n\t/**\n\t * Returns the public API for the withdrawal transaction hook.\n\t */\n\treturn {\n\t\tisLoading,\n\t\tisPending,\n\t\ttransactionHash,\n\t\ttimeLeft,\n\t\tshowReservedModal,\n\t\tisWithdrawalSuccessful,\n\n\t\thandleSpecialMessages,\n\t\tstartTimer,\n\t\tsetShowReservedModal,\n\t\texecuteWithdrawTransaction,\n\t\tresetTransactionState,\n\t};\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useTipFormState } from \"./useTipFormState\";\nimport { useTipTransaction } from \"./useTipTransaction\";\nimport { useGasManager } from \"@/hooks/walletProvider/deposit/useGasManger\";\nimport { useAppStore } from \"@/store/store\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\n\nconst useTipI18n = () => {\n\treturn useMemo(\n\t\t() => ({\n\t\t\terrors: {\n\t\t\t\tselectTokenAndAmount:\n\t\t\t\t\t\"Please select a token and enter an amount.\",\n\t\t\t\tinsufficientBalance: \"Insufficient balance.\",\n\t\t\t\tbelowMinimum: (min: string) =>\n\t\t\t\t\t`Amount must be at least ${min}.`,\n\t\t\t\tmissingWallet:\n\t\t\t\t\t\"Unable to fetch tip wallet. Please try again later.\",\n\t\t\t\tcheckForm: \"Please verify your tip details.\",\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\tprocessing: \"Sending tip...\",\n\t\t\t\tawaitingApproval: \"Awaiting approval...\",\n\t\t\t\tcalculatingRate: \"Calculating...\",\n\t\t\t\tinsufficientBalance: \"Insufficient balance\",\n\t\t\t\tfetchingWallet: \"Preparing tip wallet...\",\n\t\t\t},\n\t\t\tprompts: {\n\t\t\t\tselectToken: \"Select token\",\n\t\t\t\tenterAmount: \"Enter amount\",\n\t\t\t},\n\t\t\tbuttons: {\n\t\t\t\ttipUsd: (amount: string) => `Tip ${amount}`,\n\t\t\t\ttip: \"Tip\",\n\t\t\t},\n\t\t\tminimumIs: (min: string) => `Minimum tip is ${min}`,\n\t\t}),\n\t\t[]\n\t);\n};\n\nexport const useTip = () => {\n\tconst i18n = useTipI18n();\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\n\tconst {\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tresetFormState,\n\t\tsetTipAmount,\n\t\tsetIsBalanceInsufficient,\n\t} = useTipFormState();\n\n\tconst { gasReservationAmount, isNativeCurrency } = useGasManager({\n\t\tselectedToken,\n\t});\n\n\tconst [tipWalletAddress, setTipWalletAddress] = useState<string | null>(\n\t\tnull\n\t);\n\tconst [minTipAmount, setMinTipAmount] = useState<number>(0);\n\tconst [isFetchingWallet, setIsFetchingWallet] = useState(false);\n\n\tconst fetchTipWallet = useCallback(async () => {\n\t\tif (!chainId) {\n\t\t\treturn null;\n\t\t}\n\t\tsetIsFetchingWallet(true);\n\t\ttry {\n\t\t\tconst transactionService = TransactionService.getInstance();\n\t\t\tconst result = await transactionService.getTipWallet(chainId);\n\t\t\tif (result.success && result.tipWallet) {\n\t\t\t\tsetTipWalletAddress(result.tipWallet);\n\t\t\t\tconst parsedMin = parseFloat(result.tipMinimum ?? \"0\");\n\t\t\t\tsetMinTipAmount(Number.isFinite(parsedMin) ? parsedMin : 0);\n\t\t\t\treturn result.tipWallet;\n\t\t\t}\n\t\t\ttoast.error(i18n.errors.missingWallet);\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to fetch tip wallet:\", error);\n\t\t\ttoast.error(i18n.errors.missingWallet);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tsetIsFetchingWallet(false);\n\t\t}\n\t}, [chainId, i18n]);\n\n\tuseEffect(() => {\n\t\tfetchTipWallet();\n\t}, [fetchTipWallet]);\n\n\t// --- 1.5. MONITOR NETWORK CHANGES AND RESET FORM ---\n\t// This effect clears the selected token when the network changes\n\t// to prevent the bug where a token from the previous network remains selected\n\tuseEffect(() => {\n\t\tif (selectedToken && chainId) {\n\t\t\t// Reset the form when network changes to prevent cross-network token selection\n\t\t\tresetFormState();\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [chainId]); // Only depend on chainId to trigger on network changes\n\n\tconst {\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\ttransactionHash,\n\t\texecuteTransaction,\n\t\tresetTransactionState,\n\t} = useTipTransaction({\n\t\tselectedToken,\n\t\ttipAmount,\n\t\ttipWalletAddress,\n\t\tfetchTipWallet,\n\t\tonTransactionComplete: resetFormState,\n\t});\n\n\tconst setMaxAmount = useCallback(() => {\n\t\tif (!selectedToken) return;\n\t\tif (isNativeCurrency) {\n\t\t\tconst balance = parseFloat(selectedToken.balance);\n\t\t\tconst maxAmount = Math.max(0, balance - gasReservationAmount);\n\t\t\tsetTipAmount(String(maxAmount));\n\t\t} else {\n\t\t\tsetTipAmount(selectedToken.balance);\n\t\t}\n\t\tsetIsBalanceInsufficient(false);\n\t}, [\n\t\tselectedToken,\n\t\tisNativeCurrency,\n\t\tgasReservationAmount,\n\t\tsetTipAmount,\n\t\tsetIsBalanceInsufficient,\n\t]);\n\n\tconst validateTip = useCallback(() => {\n\t\tif (!selectedToken || !tipAmount || parseFloat(tipAmount) <= 0) {\n\t\t\ttoast.error(i18n.errors.selectTokenAndAmount);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (parseFloat(tipAmount) > parseFloat(selectedToken.balance)) {\n\t\t\tsetIsBalanceInsufficient(true);\n\t\t\ttoast.error(i18n.errors.insufficientBalance);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (minTipAmount > 0 && parseFloat(tipAmount) < minTipAmount) {\n\t\t\ttoast.error(\n\t\t\t\ti18n.errors.belowMinimum(\n\t\t\t\t\t`${minTipAmount.toFixed(2)} ${selectedToken.symbol}`\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tsetIsBalanceInsufficient(false);\n\t\treturn true;\n\t}, [\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tminTipAmount,\n\t\ti18n.errors,\n\t\tsetIsBalanceInsufficient,\n\t]);\n\n\tconst executeTip = useCallback(async () => {\n\t\tif (!tipWalletAddress) {\n\t\t\tconst address = await fetchTipWallet();\n\t\t\tif (!address) {\n\t\t\t\ttoast.error(i18n.errors.missingWallet);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!validateTip()) {\n\t\t\ttoast.error(i18n.errors.checkForm);\n\t\t\treturn;\n\t\t}\n\n\t\tawait executeTransaction();\n\t}, [\n\t\ttipWalletAddress,\n\t\tfetchTipWallet,\n\t\ti18n.errors,\n\t\tvalidateTip,\n\t\texecuteTransaction,\n\t]);\n\n\tconst resetPage = useCallback(() => {\n\t\tresetFormState();\n\t\tresetTransactionState();\n\t}, [resetFormState, resetTransactionState]);\n\n\tconst usdEstimate = useMemo(() => {\n\t\tif (!selectedToken || !tipAmount) return 0;\n\t\tconst price = parseFloat(selectedToken.usd_price ?? \"0\");\n\t\tif (!Number.isFinite(price) || price <= 0) return 0;\n\t\treturn price * parseFloat(tipAmount);\n\t}, [selectedToken, tipAmount]);\n\n\tconst getButtonText = useCallback(() => {\n\t\tif (isLoading) return i18n.status.processing;\n\t\tif (isApproving) return i18n.status.awaitingApproval;\n\t\tif (isFetchingWallet) return i18n.status.fetchingWallet;\n\t\tif (!selectedToken) return i18n.prompts.selectToken;\n\t\tif (!tipAmount || parseFloat(tipAmount) <= 0)\n\t\t\treturn i18n.prompts.enterAmount;\n\t\tif (isBalanceInsufficient) return i18n.status.insufficientBalance;\n\t\tif (minTipAmount > 0 && parseFloat(tipAmount) < minTipAmount)\n\t\t\treturn i18n.minimumIs(\n\t\t\t\t`${minTipAmount.toFixed(2)} ${selectedToken.symbol}`\n\t\t\t);\n\n\t\t// const displayAmount = usdEstimate.toFixed(2);\n\t\t// return usdEstimate > 0\n\t\t// \t? i18n.buttons.tipUsd(\n\t\t// \t\t\tdisplayAmount === \"0.00\" ? \"< 0.01\" : displayAmount\n\t\t// \t  )\n\t\treturn i18n.buttons.tip;\n\t}, [\n\t\tisLoading,\n\t\tisApproving,\n\t\tisFetchingWallet,\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tminTipAmount,\n\t\ti18n,\n\t\t// usdEstimate,\n\t]);\n\n\tconst isTipDisabled = useCallback(() => {\n\t\treturn (\n\t\t\tisLoading ||\n\t\t\tisApproving ||\n\t\t\tisPending ||\n\t\t\tisFetchingWallet ||\n\t\t\t!selectedToken ||\n\t\t\t!tipAmount ||\n\t\t\tparseFloat(tipAmount) <= 0 ||\n\t\t\tisBalanceInsufficient ||\n\t\t\t(minTipAmount > 0 && parseFloat(tipAmount) < minTipAmount)\n\t\t);\n\t}, [\n\t\tisLoading,\n\t\tisApproving,\n\t\tisPending,\n\t\tisFetchingWallet,\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tminTipAmount,\n\t]);\n\n\treturn {\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\ttransactionHash,\n\t\tminTipAmount,\n\t\tusdEstimate,\n\t\tisFetchingWallet,\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tsetMaxAmount,\n\t\texecuteTip,\n\t\tresetPage,\n\t\tgetButtonText,\n\t\tisTipDisabled,\n\t};\n};\n","\"use client\";\n\nimport { useState, useMemo, useCallback, useEffect } from \"react\";\nimport { sanitizeAmountInput, formatFullAmount } from \"@/lib/utils\";\nimport { Token } from \"@/types/blockchain/swap.types\";\n\nexport const useTipFormState = () => {\n\tconst [selectedToken, setSelectedToken] = useState<Token | null>(null);\n\tconst [tipAmount, setTipAmount] = useState(\"\");\n\tconst [isBalanceInsufficient, setIsBalanceInsufficient] = useState(false);\n\n\tconst formattedBalance = useMemo(() => {\n\t\tif (!selectedToken?.balance) return \"0.00\";\n\t\treturn parseFloat(formatFullAmount(selectedToken.balance)).toFixed(6);\n\t}, [selectedToken]);\n\n\tconst selectToken = useCallback((token: Token) => {\n\t\tsetSelectedToken(token);\n\t\tsetTipAmount(\"\");\n\t\tsetIsBalanceInsufficient(false);\n\t}, []);\n\n\tconst handleAmountChange = useCallback((value: string) => {\n\t\tconst sanitizedValue = sanitizeAmountInput(value);\n\t\tsetTipAmount(sanitizedValue);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (selectedToken && tipAmount) {\n\t\t\tsetIsBalanceInsufficient(\n\t\t\t\tparseFloat(tipAmount) > parseFloat(selectedToken.balance)\n\t\t\t);\n\t\t} else {\n\t\t\tsetIsBalanceInsufficient(false);\n\t\t}\n\t}, [tipAmount, selectedToken]);\n\n\tconst resetFormState = useCallback(() => {\n\t\tsetSelectedToken(null);\n\t\tsetTipAmount(\"\");\n\t\tsetIsBalanceInsufficient(false);\n\t}, []);\n\n\treturn {\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tresetFormState,\n\t\tsetTipAmount,\n\t\tsetIsBalanceInsufficient,\n\t};\n};\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport {\n\tTransactionStatus,\n\tTransactionType,\n} from \"@/types/blockchain/transactions.types\";\nimport TransactionService from \"@/services/walletProvider/TransactionService\";\nimport { toast } from \"sonner\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport confetti from \"canvas-confetti\";\nimport { PrimaryWalletWithClient } from \"@/types/walletProvider/transaction-service.types\";\n\ninterface UseTipTransactionProps {\n\tselectedToken: Token | null;\n\ttipAmount: string;\n\ttipWalletAddress: string | null;\n\tfetchTipWallet?: () => Promise<string | null>;\n\tonTransactionComplete?: () => void;\n}\n\nconst spenderAddress =\n\timport.meta.env.VITE_ALLOWANCE_ADDRESS ||\n\t\"0x111111125421ca6dc452d289314280a0f8842a65\";\n\nexport const useTipTransaction = ({\n\tselectedToken,\n\ttipAmount,\n\ttipWalletAddress,\n\tfetchTipWallet,\n\tonTransactionComplete,\n}: UseTipTransactionProps) => {\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [isApproving, setIsApproving] = useState(false);\n\tconst [isApproved, setIsApproved] = useState(false);\n\tconst [isPending, setIsPending] = useState(false);\n\tconst [transactionHash, setTransactionHash] = useState<string | null>(null);\n\tconst [timeLeft, setTimeLeft] = useState(0);\n\tconst { addTransaction, _updateTransaction } = useAppStore(\n\t\t(state) => state.blockchain.transaction\n\t);\n\tconst fetchTokens = useAppStore(\n\t\t(state) => state.blockchain.token.fetchTokens\n\t);\n\tconst { chainId, network } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\tconst { user, refreshUserData, authToken } = useDynamicAuth();\n\tconst { primaryWallet } = useDynamicContext();\n\n\tconst transactionService = TransactionService.getInstance();\n\tconst pollingIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\tconst retryCountRef = useRef<number>(0);\n\n\tuseEffect(() => {\n\t\tif (primaryWallet) {\n\t\t\ttransactionService.setPrimaryWallet(\n\t\t\t\tprimaryWallet as unknown as PrimaryWalletWithClient\n\t\t\t);\n\t\t}\n\t}, [primaryWallet, transactionService]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\t!selectedToken ||\n\t\t\t!user?.walletAddress ||\n\t\t\tselectedToken.tags?.includes(\"native\")\n\t\t) {\n\t\t\tsetIsApproved(true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst checkAllowance = async () => {\n\t\t\tconst { hasAllowance } = await transactionService.checkAllowance({\n\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\townerAddress: user.walletAddress!,\n\t\t\t\tspenderAddress,\n\t\t\t\tnetwork: network?.name || String(chainId),\n\t\t\t\tusername: user.username,\n\t\t\t});\n\n\t\t\tsetIsApproved(hasAllowance);\n\t\t};\n\n\t\tcheckAllowance();\n\t}, [selectedToken, user, chainId, network, transactionService]);\n\n\t// No countdown/polling needed for TIP; success is immediate on send\n\n\t// Polling removed for TIP flow\n\n\t// No interval lifecycle; success is immediate\n\n\tconst resolveTipWalletAddress = useCallback(async () => {\n\t\tif (tipWalletAddress) {\n\t\t\treturn tipWalletAddress;\n\t\t}\n\t\tif (fetchTipWallet) {\n\t\t\treturn await fetchTipWallet();\n\t\t}\n\t\treturn null;\n\t}, [tipWalletAddress, fetchTipWallet]);\n\n\tconst executeTransaction = useCallback(async () => {\n\t\tif (!selectedToken || !tipAmount || !user || !chainId || !network) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsLoading(true);\n\n\t\ttry {\n\t\t\tif (!isApproved && !selectedToken.tags?.includes(\"native\")) {\n\t\t\t\tsetIsApproving(true);\n\t\t\t\tconst approveResult = await transactionService.approveToken({\n\t\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\t\tspenderAddress,\n\t\t\t\t});\n\t\t\t\tif (!approveResult.success) {\n\t\t\t\t\tthrow (\n\t\t\t\t\t\tapproveResult.error ||\n\t\t\t\t\t\tnew Error(\"Approval failed before tip\")\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsetIsApproving(false);\n\t\t\t\tsetIsApproved(true);\n\t\t\t}\n\n\t\t\tconst destinationAddress = await resolveTipWalletAddress();\n\t\t\tif (!destinationAddress) {\n\t\t\t\tthrow new Error(\"Tip wallet address unavailable\");\n\t\t\t}\n\t\t\tconst isNativeToken = selectedToken.tags?.includes(\"native\");\n\n\t\t\tconst txResult = await transactionService.executeTokenTransfer({\n\t\t\t\ttokenAddress: selectedToken.address,\n\t\t\t\trecipientAddress: destinationAddress,\n\t\t\t\tamount: tipAmount,\n\t\t\t\tdecimals: selectedToken.decimals,\n\t\t\t\tisNative: isNativeToken,\n\t\t\t});\n\n\t\t\tif (!txResult.success || !txResult.txHash) {\n\t\t\t\tthrow (\n\t\t\t\t\ttxResult.error ||\n\t\t\t\t\tnew Error(\"Tip transaction failed to provide a hash\")\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetTransactionHash(txResult.txHash);\n\t\t\taddTransaction({\n\t\t\t\thash: txResult.txHash,\n\t\t\t\ttype: TransactionType.TIP,\n\t\t\t\tamount: tipAmount,\n\t\t\t\ttokenSymbol: selectedToken.symbol,\n\t\t\t\tnetwork: chainId,\n\t\t\t});\n\n\t\t\t// Immediately mark the tip as confirmed without polling any API\n\t\t\tconst tx = useAppStore\n\t\t\t\t.getState()\n\t\t\t\t.blockchain.transaction.transactions.find(\n\t\t\t\t\t(t) => t.hash === txResult.txHash\n\t\t\t\t);\n\t\t\tif (tx) {\n\t\t\t\t_updateTransaction(tx.id, {\n\t\t\t\t\tstatus: TransactionStatus.CONFIRMED,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Success feedback and data refresh\n\t\t\ttoast.success(\"Tip sent successfully!\");\n\t\t\tconfetti();\n\t\t\trefreshUserData();\n\t\t\ttry {\n\t\t\t\tawait fetchTokens(true, { user, authToken });\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\"Failed to refresh tokens after tip:\", error);\n\t\t\t}\n\n\t\t\tif (onTransactionComplete) {\n\t\t\t\tonTransactionComplete();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Tip transaction failed:\", error);\n\n\t\t\tlet message = \"Tip failed.\";\n\t\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\t\tif (\n\t\t\t\t\t\"shortMessage\" in error &&\n\t\t\t\t\ttypeof (error as { shortMessage?: unknown })\n\t\t\t\t\t\t.shortMessage === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { shortMessage: string }).shortMessage;\n\t\t\t\t} else if (\n\t\t\t\t\t\"message\" in error &&\n\t\t\t\t\ttypeof (error as { message?: unknown }).message === \"string\"\n\t\t\t\t) {\n\t\t\t\t\tmessage = (error as { message: string }).message;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttoast.error(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tuser,\n\t\tchainId,\n\t\tnetwork,\n\t\tisApproved,\n\t\ttransactionService,\n\t\taddTransaction,\n\t\tresolveTipWalletAddress,\n\t\t_updateTransaction,\n\t\tfetchTokens,\n\t\trefreshUserData,\n\t\tauthToken,\n\t\tuser,\n\t]);\n\n\tconst resetTransactionState = useCallback(() => {\n\t\tsetIsLoading(false);\n\t\tsetIsApproving(false);\n\t\tsetIsPending(false);\n\t\tsetTransactionHash(null);\n\t\tsetTimeLeft(0);\n\t\tretryCountRef.current = 0;\n\t\tif (pollingIntervalRef.current) {\n\t\t\tclearInterval(pollingIntervalRef.current);\n\t\t}\n\t}, []);\n\n\treturn {\n\t\ttimeLeft,\n\t\tisLoading,\n\t\tisApproving,\n\t\tisApproved,\n\t\tisPending,\n\t\ttransactionHash,\n\t\texecuteTransaction,\n\t\tresetTransactionState,\n\t};\n};\n","// src/context/auth/AuthContext.ts\nimport { createContext } from \"react\";\nimport type { AuthContextType } from \"@/types/auth/auth.types\";\n\nexport const AuthContext = createContext<AuthContextType | undefined>(\n\tundefined\n);\n","import { Token } from \"@/types/blockchain/swap.types\";\nimport { EvmNetwork } from \"@dynamic-labs/types\";\n\n// Helper functions\nconst formatAmount = (amount: string, decimalPrecision: 2 | 6) => {\n\tif (!amount) return decimalPrecision === 2 ? \"0.00\" : \"0.000000\";\n\tconst num = parseFloat(amount);\n\tif (num === 0) return decimalPrecision === 2 ? \"0.00\" : \"0.000000\";\n\tif (num < 0.01)\n\t\treturn decimalPrecision === 2 ? \"< 0.00\" : num.toString().slice(0, 8);\n\treturn num.toFixed(decimalPrecision);\n};\n\nconst formatUSD = (amount: string, price: string) => {\n\tif (!amount || !price) return \"$0.00\";\n\tconst usdValue = parseFloat(amount) * parseFloat(price);\n\tif (usdValue < 0.01) return \"< $0.01\";\n\treturn `$${usdValue.toFixed(3)}`;\n};\n\nconst calculateTokenAmountToUsdAmount = (amount: number, usdAmount: number) => {\n\t// console.log(\"CALCULATE TOKEN AMOUNT TO USD AMOUNT:\", amount, usdAmount);\n\tconst usdValue = amount * usdAmount;\n\tconst truncatedValue = Math.trunc(usdValue * 1000) / 1000;\n\n\tconst result = isNaN(usdValue)\n\t\t? \"0\"\n\t\t: truncatedValue\n\t\t\t\t.toString()\n\t\t\t\t.replace(/(\\.\\d*?)0+$/, \"$1\")\n\t\t\t\t.replace(/\\.$/, \"\");\n\treturn `$${result}`;\n};\n\n// Helper function to get default tokens (USDT, USDC)\nconst getDefaultTokens = (): Token[] => [\n\t{\n\t\tsymbol: \"USDT\",\n\t\tname: \"Tether USD\",\n\t\tdecimals: 6,\n\t\taddress: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n\t\ticon: \"https://coin-images.coingecko.com/coins/images/325/large/Tether.png\",\n\t\ttags: [\"stablecoin\"],\n\t\tbalance: \"0\",\n\t\tusd_price: \"1.00\",\n\t},\n\t{\n\t\tsymbol: \"USDC\",\n\t\tname: \"USD Coin\",\n\t\tdecimals: 6,\n\t\taddress: \"0xA0b86a33E6416c73F6D76f09b5c9c96F2e6E4E37\",\n\t\ticon: \"https://coin-images.coingecko.com/coins/images/6319/large/USD_Coin_icon.png\",\n\t\ttags: [\"stablecoin\"],\n\t\tbalance: \"0\",\n\t\tusd_price: \"1.00\",\n\t},\n];\n\nconst getDefaultNetworks = (): EvmNetwork[] => [\n\t{\n\t\tnetworkId: 1,\n\t\tname: \"Ethereum\",\n\t\tvanityName: \"Ethereum Mainnet\",\n\t\tchainId: 1,\n\t\ticonUrls: [\n\t\t\t\"https://www.citypng.com/public/uploads/preview/ethereum-eth-round-logo-icon-png-701751694969815akblwl2552.png\",\n\t\t],\n\t\trpcUrls: [\"https://mainnet.infura.io/v3/your-key\"],\n\t\tnativeCurrency: {\n\t\t\tname: \"Ether\",\n\t\t\tsymbol: \"ETH\",\n\t\t\tdecimals: 18,\n\t\t},\n\t\tblockExplorerUrls: [\"https://etherscan.io\"],\n\t},\n\t{\n\t\tnetworkId: 137,\n\t\tname: \"Polygon\",\n\t\tvanityName: \"Polygon Mainnet\",\n\t\tchainId: 137,\n\t\ticonUrls: [\n\t\t\t\"https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Polygon_Icon.svg/1200px-Polygon_Icon.svg.png\",\n\t\t],\n\t\trpcUrls: [\"https://polygon-mainnet.infura.io/v3/your-key\"],\n\t\tnativeCurrency: {\n\t\t\tname: \"Matic\",\n\t\t\tsymbol: \"MATIC\",\n\t\t\tdecimals: 18,\n\t\t},\n\t\tblockExplorerUrls: [\"https://polygonscan.com\"],\n\t},\n\t{\n\t\tnetworkId: 56,\n\t\tname: \"Binance Smart Chain\",\n\t\tvanityName: \"BSC Mainnet\",\n\t\tchainId: 56,\n\t\ticonUrls: [\n\t\t\t\"https://img.stakely.io/faucet-blockchains/logos/bsc-chain-bnb.png\",\n\t\t],\n\t\trpcUrls: [\"https://bsc-dataseed.binance.org/\"],\n\t\tnativeCurrency: {\n\t\t\tname: \"Binance Coin\",\n\t\t\tsymbol: \"BNB\",\n\t\t\tdecimals: 18,\n\t\t},\n\t\tblockExplorerUrls: [\"https://bscscan.com\"],\n\t},\n\t{\n\t\tnetworkId: 42161,\n\t\tname: \"Arbitrum\",\n\t\tvanityName: \"Arbitrum One\",\n\t\tchainId: 42161,\n\t\ticonUrls: [\n\t\t\t\"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR6mQ1pwxVT3lqCTZWhuUZzKTOqT0ZmYh2oeg&sg\",\n\t\t],\n\t\trpcUrls: [\"https://arb1.arbitrum.io/rpc\"],\n\t\tnativeCurrency: {\n\t\t\tname: \"Ether\",\n\t\t\tsymbol: \"ETH\",\n\t\t\tdecimals: 18,\n\t\t},\n\t\tblockExplorerUrls: [\"https://arbiscan.io\"],\n\t},\n];\n\nexport {\n\tformatAmount,\n\tformatUSD,\n\tcalculateTokenAmountToUsdAmount,\n\tgetDefaultTokens,\n\tgetDefaultNetworks,\n};\n","import { useTheme } from \"next-themes\";\nimport { Toaster as Sonner, ToasterProps } from \"sonner\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n\tconst { theme = \"system\" } = useTheme();\n\n\treturn (\n\t\t<Sonner\n\t\t\ttheme={theme as ToasterProps[\"theme\"]}\n\t\t\tclassName=\"toaster group\"\n\t\t\tstyle={\n\t\t\t\t{\n\t\t\t\t\t\"--normal-bg\": \"#1c1e22\",\n\t\t\t\t\t\"--normal-text\": \"#c0c0c0\",\n\t\t\t\t\t\"--normal-border\": \"#ffffff12\",\n\t\t\t\t} as React.CSSProperties\n\t\t\t}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\nexport { Toaster };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n\t\"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-primary text-foreground shadow-xs hover:bg-primary/90\",\n\t\t\t\tdefault2:\n\t\t\t\t\t\"bg-primary/90 text-foreground shadow-xs hover:bg-primary\",\n\t\t\t\tdefaultBlue:\n\t\t\t\t\t\"text-[#1677ff] hover:text-[#1677ff] bg-[#242424] hover:bg-[#242424] transition-colors duration-300\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n\t\t\t\tghost: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n\t\t\t\tghostBlue:\n\t\t\t\t\t\"hover:text-[#1677ff] bg-transparent transition-colors duration-300\",\n\t\t\t\tlink: \"text-primary underline-offset-4 hover:underline\",\n\t\t\t\tclean: \"hover:!bg-white/10 !text-whtie/90 hover:!text-white\",\n\t\t\t\tcleanX: \"\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n\t\t\t\tsm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n\t\t\t\tlg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n\t\t\t\ticon: \"size-9\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t}\n);\n\nfunction Button({\n\tclassName,\n\tvariant,\n\tsize,\n\tasChild = false,\n\t...props\n}: React.ComponentProps<\"button\"> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tasChild?: boolean;\n\t}) {\n\tconst Comp = asChild ? Slot : \"button\";\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"button\"\n\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n// eslint-disable-next-line\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n\treturn (\n\t\t<input\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tclassName={cn(\n\t\t\t\t\"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n\t\t\t\t\"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\t\t\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input };\n","// TODO: NEED TO ADD ANOTHER NEW PROP web2 based on that it will show a new U.I.\n\"use client\";\nimport { useDeposit } from \"@/hooks/walletProvider/deposit/useDeposit\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaChevronDown,\n\tfaSpinner,\n\tfaLock,\n\tfaArrowRotateRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { useState, useMemo, useEffect, useRef } from \"react\";\nimport { TokenListModal } from \"@/components/common/walletProvider/token-list-modal\";\nimport { NetworkSelector } from \"@/components/common/walletProvider/network-selector\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { Label } from \"@/components/ui/label\";\nimport { CopyWalletAddressButton } from \"@/components/common/walletProvider/copy-wallet-address-button\";\nimport { useWalletAddress } from \"@/hooks/walletProvider/useWalletAddress\";\nimport { cn } from \"@/lib/utils\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ninterface DepositPanelProps {\n\tisLobbyPage?: boolean;\n\tisEmbeddedWallet?: boolean;\n\ttabSwitcher?: React.ReactNode;\n\tdepositType?: \"depositA\" | \"depositB\";\n}\n\nexport const DepositPanel = ({\n\tisLobbyPage = false,\n\tisEmbeddedWallet = false,\n\ttabSwitcher,\n\tdepositType = \"depositA\",\n}: DepositPanelProps) => {\n\tconst { address: walletAddress } = useWalletAddress();\n\n\t// --- 1. Connect to the Master Logic Hook ---\n\t// We now destructure ALL the necessary state for the UI.\n\tconst {\n\t\tselectedToken,\n\t\tdepositAmount,\n\t\tisPending,\n\t\t// transactionHash,\n\t\t// timeLeft,\n\t\tisApproved,\n\t\tisBalanceInsufficient,\n\t\tisLowBalance,\n\t\tisLoading,\n\n\t\thandleAmountChange,\n\t\tselectToken,\n\t\tsetMaxAmount,\n\t\texecuteDeposit,\n\t\tgetButtonText,\n\t\tisDepositDisabled,\n\t\tresetPage,\n\t\t// --- NEWLY ADDED STATE FOR UI ---\n\t\tformattedBalance,\n\t\tminRequiredAmount,\n\t\tgasReservationAmount,\n\t\tisFetchingMinDepositAmount,\n\t\t// usdtConversionAmount,\n\t\t// isFetchingConversion, // To show a loading state for USD value\n\t} = useDeposit();\n\n\tconst [isTokenModalOpen, setIsTokenModalOpen] = useState(false);\n\tconst [isNetworkSwitching, setIsNetworkSwitching] = useState(false);\n\tconst prevIsPending = useRef(isPending);\n\n\tuseEffect(() => {\n\t\tif (prevIsPending.current && !isPending) {\n\t\t\tresetPage();\n\t\t}\n\t\tprevIsPending.current = isPending;\n\t}, [isPending, resetPage]);\n\t// const [\n\n\t// \tisMaxed,\n\t// \t setIsMaxed] = useState(false);\n\n\t// Dynamic font size based on character length (not words since this is numeric input)\n\tconst dynamicFontClass = useMemo(() => {\n\t\tconst textLength = depositAmount.length;\n\n\t\tif (textLength > 20) {\n\t\t\treturn \"!text-sm placeholder:text-sm\";\n\t\t}\n\t\tif (textLength > 16) {\n\t\t\t// If length is 18 or more\n\t\t\t// console.log(\"Applying text-sm for length:\", textLength);\n\t\t\treturn \"!text-base placeholder:text-base\";\n\t\t}\n\t\t// Smaller font for long inputs\n\t\tif (textLength > 13) {\n\t\t\t// If length is 17 (because >=18 would be caught above)\n\t\t\t// console.log(\"Applying text-base for length:\", textLength);\n\t\t\treturn \"!text-lg placeholder:text-lg\";\n\t\t}\n\t\t// Medium font for moderately long inputs\n\t\tif (textLength > 12) {\n\t\t\t// If length is 13, 14, 15, 16\n\t\t\t// console.log(\"Applying !text-lg for length:\", textLength);\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\tif (textLength > 8) {\n\t\t\t// If length is 9, 10, 11, 12\n\t\t\t// console.log(\"Applying !text-xl for length:\", textLength);\n\t\t\treturn \"!text-2xl placeholder:text-2xl\";\n\t\t}\n\t\treturn \"!text-[36px] placeholder:text-[36px]\";\n\t}, [depositAmount]);\n\n\tconst handleSetMaxAmount = () => {\n\t\tif (selectedToken) {\n\t\t\tsetMaxAmount();\n\t\t\t// setIsMaxed(true);\n\t\t}\n\t};\n\tconst handleAmountChangeWrapper = (value: string) => {\n\t\thandleAmountChange(value);\n\t\t// setIsMaxed(false);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{/* Main container with dark background and rounded corners matching the image */}\n\t\t\t<div className=\"bg-[#1c1e22] dark:bg-[#1c1e22] p-2 pt-3 w-[90dvw] sm:w-[80dvw] md:w-[60dvw] lg:w-[40dvw] 3xl:w-[30dvw] space-y-[5px] border border-[#ffffff12] dark:border-[#ffffff12] rounded-[24px] shadow-lg\">\n\t\t\t\t{/* --- HEADER --- */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2.5\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{tabSwitcher}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t// setIsMaxed(false);\n\t\t\t\t\t\t\t\tresetPage();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"Reset Form\"\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#C0C0C0] hover:text-[#fff] dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"size-full opacity-70\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NetworkSelector\n\t\t\t\t\t\tonSwitchingChange={setIsNetworkSwitching}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- MAIN CONTENT --- */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"py-4 px-[16px] space-y-1 min-h-[120px]\",\n\t\t\t\t\t\t\"placeholder:text-muted-foreground bg-[#24262b] dark:bg-[#24262b] rounded-[12px]\",\n\t\t\t\t\t\t\"shadow-xs outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\t\t\t\t\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* \"You Pay\" Label */}\n\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t<Label className=\"text-[#9b9b9b] dark:text-[#9b9b9b] text-[14px] font-normal\">\n\t\t\t\t\t\t\tYou Pay\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Amount Input with Token Selector - Main Section */}\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t{/* Large Amount Input with Token Selector Overlay */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex h-full w-full bg-transparent\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\tvalue={depositAmount}\n\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\thandleAmountChangeWrapper(e.target.value)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"!p-0 w-full !bg-transparent !border-none !pr-2 !shadow-none focus-visible:ring-0 placeholder:text-muted-foreground/40 text-white\",\n\n\t\t\t\t\t\t\t\t\tisBalanceInsufficient || isLowBalance\n\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252] caret-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\tdynamicFontClass\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdisabled={!selectedToken}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{/* Token Selector - Positioned absolutely on the right */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tonClick={() => setIsTokenModalOpen(true)}\n\t\t\t\t\t\t\t\tclassName={`flex items-center gap-2 !py-1 px-2 rounded-full ${\n\t\t\t\t\t\t\t\t\t!selectedToken\n\t\t\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1]\"\n\t\t\t\t\t\t\t\t\t\t: \"bg-transparent hover:bg-transparent\"\n\t\t\t\t\t\t\t\t} text-[#f4f4f4] dark:text-[#f4f4f4] shadow-xs`}\n\t\t\t\t\t\t\t\tdisabled={isNetworkSwitching}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\tsrc={selectedToken.icon}\n\t\t\t\t\t\t\t\t\t\t\talt={selectedToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-2 text-base\">\n\t\t\t\t\t\t\t\t\t\t{selectedToken?.symbol\n\t\t\t\t\t\t\t\t\t\t\t? selectedToken.symbol\n\t\t\t\t\t\t\t\t\t\t\t: \"Select Token\"}\n\n\t\t\t\t\t\t\t\t\t\t{!isApproved && selectedToken && (\n\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={faLock}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3 text-yellow-500\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/* Conditionally render the spinner ONLY on this button */}\n\t\t\t\t\t\t\t\t{isNetworkSwitching ? (\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-5 animate-spin\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-5\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Balance and Max Button */}\n\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t\t{/* Minimum amount indicator */}\n\t\t\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-white dark:text-white opacity-25 dark:opacity-25 italic text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{isFetchingMinDepositAmount ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"animate-pulse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tCalculating...\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\tMin:{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{minRequiredAmount &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminRequiredAmount.toFixed(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{selectedToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className=\"flex items-center ml-auto gap-2 text-[#9b9b9b] dark:text-[#9b9b9b] text-sm\">\n\t\t\t\t\t\t\t\t\tBalance:{\" \"}\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\t\t\tisBalanceInsufficient ||\n\t\t\t\t\t\t\t\t\t\t\tisLowBalance\n\t\t\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{Number(formattedBalance).toFixed(2)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<TooltipProvider>\n\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\topen={\n\t\t\t\t\t\t\t\t\t\t\t\tselectedToken?.address.includes(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"0xee\"\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleSetMaxAmount}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!selectedToken}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`text-[#4285f4] hover:text-[#4285f4]/70 p-0 h-auto font-medium`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tMax\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipContent\n\t\t\t\t\t\t\t\t\t\t\t\tside=\"right\"\n\t\t\t\t\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-[250px] bg-[#000000d9] dark:bg-[#000000d9] px-2 py-[6px] rounded-[6px]\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\twordWrap: \"break-word\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"0 6px 16px 0 rgba(0, 0, 0, 0.08),0 3px 6px -4px rgba(0, 0, 0, 0.12),0 9px 28px 8px rgba(0, 0, 0, 0.05)\",\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-normal leading-[1.5714285714285714] text-white\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{`${gasReservationAmount} ${selectedToken?.symbol} is reserved to cover\n\t\t\t\t\t\t\t\t\t\t\t\t\tgas fees and avoid\n\t\t\t\t\t\t\t\t\t\t\t\t\ttransaction failure.`}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t</TooltipProvider>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* USD Conversion */}\n\t\t\t\t\t\t{/* {selectedToken && depositAmount && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{isFetchingConversion ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"animate-pulse\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tCalculating...{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t`Deposit $${usdtConversionAmount.toFixed(\n\t\t\t\t\t\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t\t\t\t\t\t)} USD`\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)} */}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Wallet Address Copy Section */}\n\t\t\t\t\t{!isLobbyPage && isEmbeddedWallet && walletAddress && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between p-3 bg-muted/20 rounded-lg border border-border\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{isEmbeddedWallet\n\t\t\t\t\t\t\t\t\t\t? \"Email Wallet Address\"\n\t\t\t\t\t\t\t\t\t\t: \"Wallet Address\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<code className=\"text-sm font-mono\">\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(0, 6)}...\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(-4)}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<CopyWalletAddressButton\n\t\t\t\t\t\t\t\taddress={walletAddress}\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- FOOTER --- */}\n\t\t\t\t<div className=\" pt-0\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={executeDeposit}\n\t\t\t\t\t\tdisabled={isDepositDisabled() || isNetworkSwitching}\n\t\t\t\t\t\tvariant={\"default\"}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full h-auto text-[20px] p-4 font-normal rounded-[16px]\",\n\t\t\t\t\t\t\t\"hover:text-white dark:hover:text-white\",\n\t\t\t\t\t\t\tisPending\n\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t: \"disabled:text-[#9b9b9b4d] dark:disabled:text-[#9b9b9b4d] disabled:opacity-100\",\n\t\t\t\t\t\t\t// Check if transaction is being processed first (even if button is disabled)\n\t\t\t\t\t\t\tisLoading\n\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t: (!isDepositDisabled() &&\n\t\t\t\t\t\t\t\t\t\t!isNetworkSwitching) ||\n\t\t\t\t\t\t\t\t  (selectedToken &&\n\t\t\t\t\t\t\t\t\t\tdepositAmount &&\n\t\t\t\t\t\t\t\t\t\tparseFloat(depositAmount) > 0 &&\n\t\t\t\t\t\t\t\t\t\t!isBalanceInsufficient &&\n\t\t\t\t\t\t\t\t\t\t!isNetworkSwitching)\n\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1] text-white dark:hover:text-white dark:hover:bg-[#1266f1]\"\n\t\t\t\t\t\t\t\t: \"disabled:bg-[#24262b] dark:disabled:bg-[#24262b] disabled:hover:bg-[#24262b] dark:disabled:hover:bg-[#24262b] bg-[#24262b] dark:bg-[#24262b] hover:bg-[#24262b] dark:hover:bg-[#24262b]\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{getButtonText()}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{/* The separate, full-screen token list modal */}\n\t\t\t<TokenListModal\n\t\t\t\thideInstantDepositToken={depositType === \"depositB\"}\n\t\t\t\tisOpen={isTokenModalOpen}\n\t\t\t\tonClose={() => setIsTokenModalOpen(false)}\n\t\t\t\t// isTokenAllowed={isApproved}\n\t\t\t\tonSelectToken={(token) => {\n\t\t\t\t\t// Handle both Token and SearchTokenResult types\n\t\t\t\t\tif (token && typeof token === \"object\") {\n\t\t\t\t\t\t// Check if it's a SearchTokenResult (from search)\n\t\t\t\t\t\tif (\"logoURI\" in token && !(\"balance\" in token)) {\n\t\t\t\t\t\t\t// Convert SearchTokenResult to Token format\n\t\t\t\t\t\t\tconst convertedToken: Token = {\n\t\t\t\t\t\t\t\tsymbol: token.symbol,\n\t\t\t\t\t\t\t\tname: token.name,\n\t\t\t\t\t\t\t\tdecimals: token.decimals,\n\t\t\t\t\t\t\t\taddress: token.address,\n\t\t\t\t\t\t\t\ticon: token.logoURI, // Convert logoURI to icon\n\t\t\t\t\t\t\t\ttags:\n\t\t\t\t\t\t\t\t\ttoken.tags?.map((tag) =>\n\t\t\t\t\t\t\t\t\t\ttypeof tag === \"string\"\n\t\t\t\t\t\t\t\t\t\t\t? tag\n\t\t\t\t\t\t\t\t\t\t\t: tag.toString()\n\t\t\t\t\t\t\t\t\t) || [],\n\t\t\t\t\t\t\t\tbalance: \"0\", // Default balance for search results\n\t\t\t\t\t\t\t\tusd_price: \"0\", // Default price for search results\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tselectToken(convertedToken);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\"icon\" in token &&\n\t\t\t\t\t\t\t\"balance\" in token &&\n\t\t\t\t\t\t\t\"usd_price\" in token\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// It's already a Token object\n\t\t\t\t\t\t\tselectToken(token as Token);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetIsTokenModalOpen(false);\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","\"use client\";\nimport { useMemo, useState, useEffect } from \"react\";\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\";\nimport {\n\tCommand,\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandInput,\n\tCommandList,\n} from \"@/components/ui/command\";\n// import { Skeleton } from \"@/components/ui/skeleton\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { Button } from \"@/components/ui/button\";\n// import { ArrowLeft, RefreshCw } from \"lucide-react\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { SearchTokenResult } from \"@/types/walletProvider/transaction-service.types\";\nimport { useTokenActions } from \"@/hooks/walletProvider/useTokenActions\";\nimport { useTokens } from \"@/hooks/walletProvider/useTokens\";\nimport { useTokenSearch } from \"@/hooks/walletProvider/useTokenSearch\";\nimport { useDebounce } from \"@/hooks/walletProvider/useDebounce\"; // Import useDebounce\nimport { NetworkSelector } from \"./network-selector\";\nimport { SearchResultRow, TokenRow } from \"./token-list-rows\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaChevronLeft,\n\tfaTriangleExclamation,\n\tfaSearch,\n\tfaSpinner,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faArrowRotateRight } from \"@fortawesome/pro-duotone-svg-icons\";\n\n/**\n * @typedef {object} TokenListModalProps\n * @property {boolean} isOpen - Controls whether the modal is visible or hidden. This is a required prop.\n * @property {() => void} onClose - A required callback function that is invoked when the user initiates a close action (e.g., clicking the close button or the overlay).\n * @property {(token: Token | SearchTokenResult) => void} onSelectToken - A required callback function that is invoked when a user selects a token from the list. It receives the selected token object as its argument.\n * @property {boolean} [showAllTokens=false] - Optional. If `true`, the modal will display all available tokens by default. If `false`, it will only show tokens that the user owns (i.e., has a balance of).\n * @property {boolean} [isSwapPanelModal=false] - Optional. If `true`, the modal will render a specific UI variant tailored for a swap panel context, which may alter the layout and information displayed.\n * @property {boolean} [hideInstantDepositToken=false] - Optional. If `true`, the section displaying \"Instant Deposit\" or \"Popular\" token shortcuts will be hidden from the UI.\n * @property {boolean} [hideTopSection=false] - Optional. If `true`, the entire top section of the modal (which typically includes shortcuts and balance info) will be hidden, leaving only the search bar and the token list.\n */\ninterface TokenListModalProps {\n\t/**\n\t * Controls whether the modal is visible or hidden. This is a required prop.\n\t * @example <TokenListModal isOpen={isModalVisible} ... />\n\t */\n\tisOpen: boolean;\n\n\t/**\n\t * A required callback function that is invoked when the user initiates a close action\n\t * (e.g., clicking the close button, pressing Escape, or clicking the overlay).\n\t * @example <TokenListModal onClose={() => setIsModalVisible(false)} ... />\n\t */\n\tonClose: () => void;\n\n\t/**\n\t * A required callback function that is invoked when a user selects a token from the list.\n\t * It receives the selected token object, which can be of type `Token` or `SearchTokenResult`.\n\t * @param {Token | SearchTokenResult} token - The token object that the user selected.\n\t * @example <TokenListModal onSelectToken={(token) => handleTokenSelection(token)} ... />\n\t */\n\tonSelectToken: (token: Token | SearchTokenResult) => void;\n\n\t/**\n\t * Optional. If `true`, the modal will display all available tokens by default.\n\t * If `false`, it will only show tokens that the user owns (i.e., has a positive balance).\n\t * @default false\n\t */\n\tshowAllTokens?: boolean;\n\n\t/**\n\t * Optional. If `true`, the modal will render a specific UI variant tailored for a swap panel context.\n\t * This may alter the layout, token row information, and header content.\n\t * @default false\n\t */\n\tisSwapPanelModal?: boolean;\n\n\t/**\n\t * Optional. If `true`, the section displaying \"Instant Deposit\" or \"Popular\" token shortcuts\n\t * will be hidden from the UI.\n\t * @default false\n\t */\n\thideInstantDepositToken?: boolean;\n\n\t/**\n\t * Optional. If `true`, the entire top section of the modal (which typically includes\n\t * shortcuts and the wallet balance display) will be hidden, leaving only the search bar and token list.\n\t * @default false\n\t */\n\thideTopSection?: boolean;\n}\n\nexport const TokenListModal = ({\n\tisOpen,\n\tonClose,\n\tonSelectToken,\n\tshowAllTokens = false, // Set default value to false\n\tisSwapPanelModal = false,\n\thideInstantDepositToken = false,\n\thideTopSection = false,\n}: // isTokenAllowed,\nTokenListModalProps) => {\n\tconst { tokens, isTokensLoading, refreshTokens } = useTokens();\n\tconst { user } = useDynamicAuth();\n\tconst [searchQuery, setSearchQuery] = useState(\"\");\n\tconst debouncedSearchQuery = useDebounce(searchQuery, 300); // Debounce search query\n\tconst { searchResults, isSearching } = useTokenSearch(debouncedSearchQuery); // Use debounced query\n\tconst { addTokenToMetamask } = useTokenActions();\n\t// Reset search query on close\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetSearchQuery(\"\");\n\t\t}\n\t}, [isOpen]);\n\n\t// Transform search results to include owned token data when available\n\tconst enhancedSearchResults: (SearchTokenResult & {\n\t\tbalance?: string;\n\t\tusd_price?: string;\n\t\tusdAmount?: string;\n\t\ticon?: string;\n\t\tisTokenOwned?: boolean;\n\t})[] = useMemo(() => {\n\t\tif (!searchResults.length || !tokens.length) return searchResults;\n\n\t\tconst enhanceSearchResult = searchResults.map((searchResult) => {\n\t\t\t// Find corresponding owned token by address (case insensitive)\n\t\t\tconst ownedToken = tokens.find(\n\t\t\t\t(token) =>\n\t\t\t\t\ttoken.address.toLowerCase() ===\n\t\t\t\t\tsearchResult.address.toLowerCase()\n\t\t\t);\n\n\t\t\tif (ownedToken && parseFloat(ownedToken.balance) >= 0.000001) {\n\t\t\t\t// Return search result with owned token data structure\n\t\t\t\treturn {\n\t\t\t\t\t...searchResult,\n\t\t\t\t\tbalance: ownedToken.balance,\n\t\t\t\t\tusd_price: ownedToken.usd_price,\n\t\t\t\t\tusdAmount: ownedToken.usdAmount,\n\t\t\t\t\ticon: ownedToken.icon, // Add icon from owned token\n\t\t\t\t\t// Keep original tags format for SearchTokenResult\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Return original search result with defaults for balance and price\n\t\t\treturn {\n\t\t\t\t...searchResult,\n\t\t\t\tbalance: \"0\",\n\t\t\t\tusd_price: \"0\",\n\t\t\t\ticon: searchResult.logoURI,\n\t\t\t};\n\t\t});\n\t\tenhanceSearchResult.sort((a, b) => {\n\t\t\tconst balanceA = parseFloat(a.balance);\n\t\t\tconst balanceB = parseFloat(b.balance);\n\n\t\t\treturn balanceB - balanceA;\n\t\t});\n\t\treturn enhanceSearchResult;\n\t}, [searchResults, tokens]);\n\n\tconst { ownedTokens, otherTokens } = useMemo(() => {\n\t\tconst lowerCaseQuery = searchQuery.toLowerCase();\n\n\t\t// If there's a search query, filter all tokens regardless of the showAllTokens prop\n\t\tif (searchQuery) {\n\t\t\tconst filtered = tokens.filter(\n\t\t\t\t(t) =>\n\t\t\t\t\tt.name.toLowerCase().includes(lowerCaseQuery) ||\n\t\t\t\t\tt.symbol.toLowerCase().includes(lowerCaseQuery) ||\n\t\t\t\t\tt.address.toLowerCase().includes(lowerCaseQuery)\n\t\t\t);\n\n\t\t\tconst owned = filtered.filter((t) => parseFloat(t.balance) > 0);\n\t\t\tconst other = filtered.filter((t) => parseFloat(t.balance) <= 0);\n\n\t\t\t// Sort OWNED tokens by their fiatValue in DESCENDING order.\n\t\t\towned.sort((a, b) => {\n\t\t\t\tconst balanceA = parseFloat(a.balance);\n\t\t\t\tconst usdPriceA = parseFloat(a.usd_price);\n\t\t\t\tconst fiatValueA =\n\t\t\t\t\tisNaN(balanceA) || isNaN(usdPriceA)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: balanceA * usdPriceA;\n\n\t\t\t\tconst balanceB = parseFloat(b.balance);\n\t\t\t\tconst usdPriceB = parseFloat(b.usd_price);\n\t\t\t\tconst fiatValueB =\n\t\t\t\t\tisNaN(balanceB) || isNaN(usdPriceB)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: balanceB * usdPriceB;\n\n\t\t\t\treturn fiatValueB - fiatValueA;\n\t\t\t});\n\n\t\t\t// Sort OTHER tokens alphabetically by their symbol.\n\t\t\tother.sort((a, b) => a.symbol.localeCompare(b.symbol));\n\n\t\t\treturn { ownedTokens: owned, otherTokens: other };\n\t\t}\n\n\t\t// If showAllTokens is true and there's no search query, show all tokens\n\t\tif (showAllTokens) {\n\t\t\tconst owned = tokens.filter(\n\t\t\t\t(t) => parseFloat(t.balance) >= 0.000001\n\t\t\t);\n\t\t\tconst other = tokens.filter((t) => parseFloat(t.balance) <= 0);\n\n\t\t\t// Sort OWNED tokens by their fiatValue in DESCENDING order.\n\t\t\towned.sort((a, b) => {\n\t\t\t\tconst balanceA = parseFloat(a.balance);\n\t\t\t\tconst usdPriceA = parseFloat(a.usd_price);\n\t\t\t\tconst fiatValueA =\n\t\t\t\t\tisNaN(balanceA) || isNaN(usdPriceA)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: balanceA * usdPriceA;\n\n\t\t\t\tconst balanceB = parseFloat(b.balance);\n\t\t\t\tconst usdPriceB = parseFloat(b.usd_price);\n\t\t\t\tconst fiatValueB =\n\t\t\t\t\tisNaN(balanceB) || isNaN(usdPriceB)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: balanceB * usdPriceB;\n\n\t\t\t\treturn fiatValueB - fiatValueA;\n\t\t\t});\n\n\t\t\t// Sort OTHER tokens alphabetically by their symbol.\n\t\t\tother.sort((a, b) => a.symbol.localeCompare(b.symbol));\n\n\t\t\treturn { ownedTokens: owned, otherTokens: other };\n\t\t}\n\n\t\t// Default behavior: If no search query and showAllTokens is false, only show owned tokens\n\t\tconst ownedOnly = tokens.filter(\n\t\t\t(t) => parseFloat(t.balance) >= 0.000001\n\t\t);\n\n\t\t// Sort by fiatValue in DESCENDING order\n\t\townedOnly.sort((a, b) => {\n\t\t\tconst balanceA = parseFloat(a.balance);\n\t\t\tconst usdPriceA = parseFloat(a.usd_price);\n\t\t\tconst fiatValueA =\n\t\t\t\tisNaN(balanceA) || isNaN(usdPriceA) ? 0 : balanceA * usdPriceA;\n\n\t\t\tconst balanceB = parseFloat(b.balance);\n\t\t\tconst usdPriceB = parseFloat(b.usd_price);\n\t\t\tconst fiatValueB =\n\t\t\t\tisNaN(balanceB) || isNaN(usdPriceB) ? 0 : balanceB * usdPriceB;\n\n\t\t\treturn fiatValueB - fiatValueA;\n\t\t});\n\n\t\treturn { ownedTokens: ownedOnly, otherTokens: [] };\n\t}, [tokens, searchQuery, showAllTokens]);\n\n\tconst instantDepositTokens = useMemo(() => {\n\t\treturn (\n\t\t\t(user?.balanceToken\n\t\t\t\t?.map((bt) =>\n\t\t\t\t\ttokens.find(\n\t\t\t\t\t\t(t) =>\n\t\t\t\t\t\t\tt.address.toLowerCase() ==\n\t\t\t\t\t\t\tbt.tokenContractAddress.toLowerCase()\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t.filter(Boolean) as Token[]) || []\n\t\t);\n\t}, [user, tokens]);\n\n\tconst handleShortcutClick = (token: Token | undefined) => {\n\t\tif (token) onSelectToken(token);\n\t};\n\n\tconst isLoading =\n\t\tisTokensLoading || (isSearching && !!debouncedSearchQuery);\n\tconst showSearchResults =\n\t\tdebouncedSearchQuery && enhancedSearchResults.length > 0;\n\n\treturn isSwapPanelModal ? (\n\t\t<Dialog open={isOpen} onOpenChange={onClose}>\n\t\t\t<DialogTitle className=\"sr-only\">Select A Token</DialogTitle>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"w-[420px] outline !bg-[#181a1f] outline-[#ffffff21] font-arial p-0 gap-0 flex flex-col rounded-[20px] h-[761.883px]\"\n\t\t\t\tshowCloseButton={false}\n\t\t\t>\n\t\t\t\t<Command className=\"bg-transparent\">\n\t\t\t\t\t<div className=\"px-[20px]  pt-[13px] space-y-[9px] \">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t{/* Close Button */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tclassName=\"opacity-50 size-[32px]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faChevronLeft}\n\t\t\t\t\t\t\t\t\tfontSize={16}\n\t\t\t\t\t\t\t\t\tclassName=\"text-white opacity-50 dark:text-white cursor-pointer\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t{/* Network Selector Dropdown */}\n\t\t\t\t\t\t\t<NetworkSelector />\n\n\t\t\t\t\t\t\t{/* Refetch Tokens button */}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"size-3\"\n\t\t\t\t\t\t\t\tonClick={refreshTokens}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\t\tfontSize={12}\n\t\t\t\t\t\t\t\t\tclassName={`text-[#ff8a00] ${\n\t\t\t\t\t\t\t\t\t\tisTokensLoading ? \"animate-spin\" : \"\"\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"space-y-[20px]\">\n\t\t\t\t\t\t\t{/* Token Search Box */}\n\t\t\t\t\t\t\t<div className=\"space-y-[11px]\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 font-[485] mb-0.5 rounded-[10px] h-10 border border-[#ffffff12] bg-[#1a1d25] px-4 py-4\">\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faSearch}\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 shrink-0 opacity-50 text-[#9b9b9b]\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<CommandInput\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search tokens\"\n\t\t\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearchQuery}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-base placeholder:text-[#9b9b9b]/80 text-[#9b9b9b] p-0 h-auto font-arial\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Instant Deposit Tokens */}\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t\t\t{tokens\n\t\t\t\t\t\t\t\t\t\t.filter((token) =>\n\t\t\t\t\t\t\t\t\t\t\ttoken.tags.includes(\"popular\")\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.map((token) => (\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tkey={token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\thandleShortcutClick(token)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full hover:bg-[#1e3050] bg-[#ffffff12]  leading-0 font-medium text-white dark:text-white text-sm p-[5px_10px_4px_5px] border-[#ffffff12] border font-arial\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={token.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talt={token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t{token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<CommandList\n\t\t\t\t\t\tclassName=\"flex-grow mt-4  p-0 max-h-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tscrollbarWidth: \"thin\",\n\t\t\t\t\t\t\tscrollbarColor: \"#ffffff80 transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!isLoading &&\n\t\t\t\t\t\t\t!showSearchResults &&\n\t\t\t\t\t\t\townedTokens.length === 0 && (\n\t\t\t\t\t\t\t\t<CommandEmpty className=\"text-lg py-[20px] h-[200px] grid place-content-center leading-[28.3px] font-arial\">\n\t\t\t\t\t\t\t\t\t{searchQuery ? (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-center pt-[70px]\">\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-lg text-white leading-[28.3px] mb-[5px] \">\n\t\t\t\t\t\t\t\t\t\t\t\tToken not found\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-[#aaaaaa] text-sm leading-[24px]\">\n\t\t\t\t\t\t\t\t\t\t\t\tTry changing your search query\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-[5px]\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faTriangleExclamation}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[#facc15]\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"font-arial text-[#aaaaaa]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tNo tokens found\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-[#aaaaaa] font-arial\">\n\t\t\t\t\t\t\t\t\t\t\t\tSearch by name or paste a\n\t\t\t\t\t\t\t\t\t\t\t\tcontract address to load your\n\t\t\t\t\t\t\t\t\t\t\t\ttokens\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-center text-[#aaaaaa] mt-5 gap-2\">\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\tcolor=\"#4285f4\"\n\t\t\t\t\t\t\t\t\tclassName=\"animate-spin\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\tSearching For token\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : showSearchResults ? (\n\t\t\t\t\t\t\t<CommandGroup className=\"font-arial px-0\">\n\t\t\t\t\t\t\t\t{enhancedSearchResults.map((token) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<SearchResultRow\n\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={\n\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(token.balance) > 0\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{ownedTokens.length > 0 && (\n\t\t\t\t\t\t\t\t\t<CommandGroup\n\t\t\t\t\t\t\t\t\t\theading={\n\t\t\t\t\t\t\t\t\t\t\tsearchQuery ? \"Your Tokens\" : \"\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-arial text-[#aaaaaa] px-0\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ownedTokens.map((token) => {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TokenRow\n\t\t\t\t\t\t\t\t\t\t\t\t\thideTopSection={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thideTopSection\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(token.balance) >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t0\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{/* Show other tokens when searching OR when showAllTokens is true */}\n\t\t\t\t\t\t\t\t{(searchQuery || showAllTokens) && (\n\t\t\t\t\t\t\t\t\t<CommandGroup className=\"font-arial px-0\">\n\t\t\t\t\t\t\t\t\t\t{/* <div>Hello There</div> */}\n\t\t\t\t\t\t\t\t\t\t{otherTokens.map((token) => (\n\t\t\t\t\t\t\t\t\t\t\t<TokenRow\n\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\t// hideTopSection={hideTopSection}\n\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={false}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</CommandList>\n\t\t\t\t</Command>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t) : (\n\t\t<Dialog open={isOpen} onOpenChange={onClose}>\n\t\t\t<DialogTitle className=\"sr-only\">Select A Token</DialogTitle>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"w-[420px] outline !bg-[#181a1f] outline-[#ffffff21] font-arial p-0 gap-0 flex flex-col rounded-[20px] h-[761.883px]\"\n\t\t\t\tshowCloseButton={false}\n\t\t\t>\n\t\t\t\t<Command className=\"bg-transparent\">\n\t\t\t\t\t<div className=\"px-[20px]  pt-[13px] space-y-[9px] \">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tclassName=\"opacity-50 size-[32px]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faChevronLeft}\n\t\t\t\t\t\t\t\t\tfontSize={16}\n\t\t\t\t\t\t\t\t\tclassName=\"text-white opacity-50 dark:text-white cursor-pointer\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<NetworkSelector />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{!hideTopSection && (\n\t\t\t\t\t\t\t<div className=\"space-y-[20px]\">\n\t\t\t\t\t\t\t\t{!hideInstantDepositToken && (\n\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-[15px] leading-[23.6px] text-[#4285f4] font-arial\">\n\t\t\t\t\t\t\t\t\t\t\tInstant Deposit{\" \"}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{instantDepositTokens.map(\n\t\t\t\t\t\t\t\t\t\t\t\t(token) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleShortcutClick(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoken\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full hover:bg-[#1e3050] bg-[#ffffff12] leading-0 font-medium text-white dark:text-white text-sm p-[5px_10px_4px_5px] border-[#ffffff12] border font-arial\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={token.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt={token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{token.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t<div className=\"space-y-[11px]\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-4.5\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-[15px] leading-[23.6px] font-normal text-[#4285f4] font-arial\">\n\t\t\t\t\t\t\t\t\t\t\tYour Wallet Balance{\" \"}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-3\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={refreshTokens}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize={12}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={`text-[#ff8a00]  ${\n\t\t\t\t\t\t\t\t\t\t\t\t\tisTokensLoading\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"animate-spin\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 font-[485] mb-0.5 rounded-[10px] h-10 border border-[#ffffff12] bg-[#1a1d25] px-4 py-4\">\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faSearch}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 shrink-0 text-[#9b9b9b] opacity-50\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<CommandInput\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search tokens\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\t\t\t\tonValueChange={setSearchQuery}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-base placeholder:text-[#9b9b9b]/80 text-[#9b9b9b] p-0 h-auto font-arial\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<CommandList\n\t\t\t\t\t\tclassName={`flex-grow  ${\n\t\t\t\t\t\t\thideTopSection ? \"mt-4\" : \"\"\n\t\t\t\t\t\t} p-0 max-h-full`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tscrollbarWidth: \"thin\",\n\t\t\t\t\t\t\tscrollbarColor: \"#ffffff80 transparent\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!isLoading &&\n\t\t\t\t\t\t\t!showSearchResults &&\n\t\t\t\t\t\t\townedTokens.length === 0 && (\n\t\t\t\t\t\t\t\t<CommandEmpty className=\"text-lg py-[20px] h-[200px] grid place-content-center leading-[28.3px] font-arial\">\n\t\t\t\t\t\t\t\t\t{searchQuery ? (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-center pt-[70px]\">\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-lg text-white leading-[28.3px] mb-[5px] \">\n\t\t\t\t\t\t\t\t\t\t\t\tToken not found\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-[#aaaaaa] text-sm leading-[24px]\">\n\t\t\t\t\t\t\t\t\t\t\t\tTry changing your search query\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-[5px]\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faTriangleExclamation}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[#facc15]\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"font-arial text-[#aaaaaa]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tNo tokens found\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-[#aaaaaa] font-arial\">\n\t\t\t\t\t\t\t\t\t\t\t\tSearch by name or paste a\n\t\t\t\t\t\t\t\t\t\t\t\tcontract address to load your\n\t\t\t\t\t\t\t\t\t\t\t\ttokens\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center text-[#aaaaaa] mt-5 gap-2\">\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\tcolor=\"#4285f4\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"animate-spin\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\tSearching For token\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/* {[...Array(8)].map((_, i) => (\n\t\t\t\t\t\t\t\t\t<Skeleton key={i} className=\"h-16 w-full\" />\n\t\t\t\t\t\t\t\t))} */}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : showSearchResults ? (\n\t\t\t\t\t\t\t<CommandGroup className=\"font-arial px-0\">\n\t\t\t\t\t\t\t\t{enhancedSearchResults.map((token) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<SearchResultRow\n\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={\n\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(token.balance) > 0\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{ownedTokens.length > 0 && (\n\t\t\t\t\t\t\t\t\t<CommandGroup\n\t\t\t\t\t\t\t\t\t\theading={\n\t\t\t\t\t\t\t\t\t\t\tsearchQuery || showAllTokens\n\t\t\t\t\t\t\t\t\t\t\t\t? \"Your Tokens\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-arial px-0\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ownedTokens.map((token) => {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TokenRow\n\t\t\t\t\t\t\t\t\t\t\t\t\thideTopSection={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thideTopSection\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tNumber(token.balance) >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t0\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{/* Show other tokens when searching OR when showAllTokens is true */}\n\t\t\t\t\t\t\t\t{(searchQuery || showAllTokens) &&\n\t\t\t\t\t\t\t\t\totherTokens.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<CommandGroup\n\t\t\t\t\t\t\t\t\t\t\theading=\"Other Results\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-arial text-[#aaa] px-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{otherTokens.map((token) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<TokenRow\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAddToWallet={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taddTokenToMetamask\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisTokenOwned={false}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</CommandList>\n\t\t\t\t</Command>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg p-6 shadow-lg duration-200 sm:max-w-lg\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-2 text-center sm:text-left\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Command as CommandPrimitive } from \"cmdk\";\n// import { SearchIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\n\nfunction Command({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n\treturn (\n\t\t<CommandPrimitive\n\t\t\tdata-slot=\"command\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandDialog({\n\ttitle = \"Command Palette\",\n\tdescription = \"Search for a command to run...\",\n\tchildren,\n\tclassName,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof Dialog> & {\n\ttitle?: string;\n\tdescription?: string;\n\tclassName?: string;\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<Dialog {...props}>\n\t\t\t<DialogHeader className=\"sr-only\">\n\t\t\t\t<DialogTitle>{title}</DialogTitle>\n\t\t\t\t<DialogDescription>{description}</DialogDescription>\n\t\t\t</DialogHeader>\n\t\t\t<DialogContent\n\t\t\t\tclassName={cn(\"overflow-hidden p-0\", className)}\n\t\t\t\tshowCloseButton={showCloseButton}\n\t\t\t>\n\t\t\t\t<Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n\t\t\t\t\t{children}\n\t\t\t\t</Command>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n\nfunction CommandInput({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n\treturn (\n\t\t// <div\n\t\t// \tdata-slot=\"command-input-wrapper\"\n\t\t// \tclassName=\"flex items-center gap-2\"\n\t\t// >\n\t\t// \t<SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n\t\t<CommandPrimitive.Input\n\t\t\tdata-slot=\"command-input\"\n\t\t\tclassName={cn(\n\t\t\t\t\"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t\t// </div>\n\t);\n}\n\nfunction CommandList({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n\treturn (\n\t\t<CommandPrimitive.List\n\t\t\tdata-slot=\"command-list\"\n\t\t\tclassName={cn(\n\t\t\t\t\"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandEmpty({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n\treturn (\n\t\t<CommandPrimitive.Empty\n\t\t\tdata-slot=\"command-empty\"\n\t\t\tclassName={cn(\"py-6 text-center text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandGroup({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n\treturn (\n\t\t<CommandPrimitive.Group\n\t\t\tdata-slot=\"command-group\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n\treturn (\n\t\t<CommandPrimitive.Separator\n\t\t\tdata-slot=\"command-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandItem({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n\tconst itemRef = React.useRef<HTMLDivElement>(null);\n\n\tconst handleMouseLeave = () => {\n\t\tif (itemRef.current) {\n\t\t\titemRef.current.setAttribute(\"data-selected\", \"false\");\n\t\t}\n\t};\n\tconst handleMouseEnter = () => {\n\t\tif (itemRef.current)\n\t\t\titemRef.current.setAttribute(\"data-selected\", \"true\");\n\t};\n\n\treturn (\n\t\t<CommandPrimitive.Item\n\t\t\tref={itemRef}\n\t\t\tdata-slot=\"command-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CommandShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"command-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tCommand,\n\tCommandDialog,\n\tCommandInput,\n\tCommandList,\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandItem,\n\tCommandShortcut,\n\tCommandSeparator,\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useAppStore } from \"@/store/store\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectItemIndicator,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { EvmNetwork, useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faSpinner } from \"@fortawesome/pro-solid-svg-icons\";\n\n// Helper type to safely access evmNetworks from the generic connector\ninterface EvmWalletConnector {\n\tevmNetworks?: EvmNetwork[];\n\t[key: string]: unknown;\n}\n\ninterface NetworkSelectorProps {\n\tclassName?: string;\n\t/** A callback that reports the network switching status to the parent. */\n\tonSwitchingChange?: (isSwitching: boolean) => void;\n}\n\nexport const NetworkSelector = ({\n\tclassName,\n\tonSwitchingChange,\n}: NetworkSelectorProps) => {\n\t// --- 1. Get Global State and Context ---\n\tconst { chainId, chainLogo, setChainLogo } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\tconst { primaryWallet } = useDynamicContext();\n\n\t// --- 2. Manage Local UI State for the Switching Process ---\n\tconst [isSwitching, setIsSwitching] = useState(false);\n\tconst [switchSuccess, setSwitchSuccess] = useState(false);\n\tconst [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\tconst [switchingOnChain, setSwitchingOnChain] = useState<number | null>(\n\t\tnull\n\t);\n\tconst [currentNetwork, setCurrentNetwork] = useState<EvmNetwork | null>(\n\t\tnull\n\t);\n\n\t// Find the currently selected network object - moved before early return\n\tuseEffect(() => {\n\t\tif (primaryWallet?.connector) {\n\t\t\tconst connector =\n\t\t\t\tprimaryWallet.connector as unknown as EvmWalletConnector;\n\t\t\tconst currentNet = connector.evmNetworks?.find(\n\t\t\t\t(net: EvmNetwork) => net.chainId === chainId\n\t\t\t);\n\t\t\tsetCurrentNetwork(currentNet || null);\n\t\t}\n\t}, [chainId, primaryWallet?.connector]);\n\n\t// --- THE CRITICAL FIX: The `useEffect` to report status changes ---\n\tuseEffect(() => {\n\t\t// Whenever our internal `isSwitching` state changes, we call the prop\n\t\t// to inform the parent component.\n\t\tonSwitchingChange?.(isSwitching);\n\t}, [isSwitching, onSwitchingChange]);\n\n\tconst handleNetworkChange = async (newChainIdStr: string) => {\n\t\tif (!primaryWallet) {\n\t\t\ttoast.error(\"Wallet not connected.\");\n\t\t\treturn;\n\t\t}\n\t\tconst newChainId = parseInt(newChainIdStr);\n\t\t// Prevent action if already on the selected network\n\t\tif (chainId === newChainId) return;\n\n\t\t// get data for new chain and instantly update it\n\t\tconst newNetwork = supportedNetworks.find(\n\t\t\t(net) => net.chainId === newChainId\n\t\t);\n\n\t\tsetCurrentNetwork(newNetwork || null);\n\t\tsetChainLogo(newNetwork?.iconUrls?.[0] || \"\");\n\n\t\tsetIsSwitching(true);\n\t\tsetSwitchSuccess(false);\n\t\tsetSwitchingOnChain(newChainId);\n\n\t\ttry {\n\t\t\tawait primaryWallet.connector.switchNetwork({\n\t\t\t\tnetworkChainId: newChainId,\n\t\t\t});\n\n\t\t\t// If switchNetwork resolves without error, the switch was successful.\n\t\t\tsetSwitchSuccess(true);\n\t\t\tsetIsSwitching(false);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to switch network:\", error);\n\t\t\ttoast.error(\n\t\t\t\t\"Failed to switch network. Please try from your wallet.\"\n\t\t\t);\n\t\t} finally {\n\t\t\t// Reset state after a delay, regardless of outcome.\n\t\t\tsetTimeout(() => {\n\t\t\t\t// setIsSwitching(false);\n\t\t\t\tsetSwitchSuccess(false);\n\t\t\t}, 1000);\n\t\t}\n\t};\n\n\tif (!primaryWallet?.connector) {\n\t\treturn null;\n\t}\n\tconst connector = primaryWallet.connector as unknown as EvmWalletConnector;\n\tconst supportedNetworks = connector.evmNetworks || [];\n\n\treturn (\n\t\t<Select\n\t\t\tvalue={String(chainId)}\n\t\t\tonValueChange={handleNetworkChange}\n\t\t\topen={isSwitching || isDropdownOpen}\n\t\t\tonOpenChange={setIsDropdownOpen}\n\t\t\tdisabled={isSwitching} // Disable the trigger while a switch is in progress\n\t\t>\n\t\t\t<SelectTrigger\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"hover:!bg-white/10 !p-[5px] border-none duration-300 transition-colors !bg-transparent justify-end shadow-none \",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* drop-shadow-[0_6px_16px_0_rgba(0,0,0,0.08),0_3px_6px_-4px_rgba(0,0,0,0.12),0_9px_28px_8px_rgba(0,0,0,0.05)] */}\n\t\t\t\t<SelectValue placeholder={\"Select Network\"}>\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-white dark:text-white\">\n\t\t\t\t\t\t{chainLogo && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chainLogo}\n\t\t\t\t\t\t\t\talt={\"Network logo\"}\n\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<span className=\"flex-grow font-medium text-base truncate\">\n\t\t\t\t\t\t\t{currentNetwork?.vanityName ||\n\t\t\t\t\t\t\t\tcurrentNetwork?.name ||\n\t\t\t\t\t\t\t\t\"Switching...\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/* --- 3. The Visual Feedback --- */}\n\t\t\t\t\t\t{/* {switchSuccess && (\n\t\t\t\t\t\t\t<CheckCircle className=\"h-4 w-4 font-medium text-green-500\" />\n\t\t\t\t\t\t)} */}\n\t\t\t\t\t</div>\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent className=\"bg-[#1c1c22] dark:bg-[#1c1c22] border-none !p-0\">\n\t\t\t\t{supportedNetworks.map((net) => (\n\t\t\t\t\t<SelectItem\n\t\t\t\t\t\tkey={net.chainId}\n\t\t\t\t\t\tvalue={String(net.chainId)}\n\t\t\t\t\t\tdisabled={isSwitching}\n\t\t\t\t\t\tclassName=\"px-4 py-2\n\t\t\t\t\t\t focus:bg-accent focus:text-white [&_svg:not([class*='text-'])]:text-white relative flex w-full cursor-default items-center justify-between gap-2 rounded-sm pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\n\t\t\t\t\t\ttext-white\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex items-center w-full gap-2\">\n\t\t\t\t\t\t\t{net.iconUrls?.[0] && (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={net.iconUrls[0]}\n\t\t\t\t\t\t\t\t\talt={net.name}\n\t\t\t\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\t\t\t\theight={20}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<p className=\"text-white dark:text-white\">\n\t\t\t\t\t\t\t\t{net.vanityName || net.name}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{isSwitching &&\n\t\t\t\t\t\t!switchSuccess &&\n\t\t\t\t\t\tnet.chainId === switchingOnChain ? (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin text-white\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<SelectItemIndicator>\n\t\t\t\t\t\t\t\t<span className=\"flex size-3.5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faCheck}\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-4 text-white\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</SelectItemIndicator>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n","import * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Select({\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n\treturn <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n\treturn <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n\treturn <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n\tclassName,\n\tsize = \"default\",\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n\tsize?: \"sm\" | \"default\";\n}) {\n\treturn (\n\t\t<SelectPrimitive.Trigger\n\t\t\tdata-slot=\"select-trigger\"\n\t\t\tdata-size={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<SelectPrimitive.Icon asChild>\n\t\t\t\t<ChevronDownIcon\n\t\t\t\t\tclassName=\"size-6 text-white font-bold\"\n\t\t\t\t\tfontWeight={500}\n\t\t\t\t/>\n\t\t\t</SelectPrimitive.Icon>\n\t\t</SelectPrimitive.Trigger>\n\t);\n}\n\nfunction SelectContent({\n\tclassName,\n\tchildren,\n\tposition = \"popper\",\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n\treturn (\n\t\t<SelectPrimitive.Portal>\n\t\t\t<SelectPrimitive.Content\n\t\t\t\tdata-slot=\"select-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tposition={position}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<SelectScrollUpButton />\n\t\t\t\t<SelectPrimitive.Viewport\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-0.5 py-1\",\n\t\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\t\"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</SelectPrimitive.Viewport>\n\t\t\t\t<SelectScrollDownButton />\n\t\t\t</SelectPrimitive.Content>\n\t\t</SelectPrimitive.Portal>\n\t);\n}\n\nfunction SelectLabel({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n\treturn (\n\t\t<SelectPrimitive.Label\n\t\t\tdata-slot=\"select-label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground px-2 py-1.5 text-xs\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SelectItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n\treturn (\n\t\t<SelectPrimitive.Item\n\t\t\tdata-slot=\"select-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center justify-between gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<SelectPrimitive.ItemText className=\"w-full\">\n\t\t\t\t{children}\n\t\t\t</SelectPrimitive.ItemText>\n\t\t</SelectPrimitive.Item>\n\t);\n}\n\nfunction SelectSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n\treturn (\n\t\t<SelectPrimitive.Separator\n\t\t\tdata-slot=\"select-separator\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-border pointer-events-none -mx-1 my-1 h-px\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction SelectItemIndicator({\n\tchildren,\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ItemIndicator>) {\n\treturn (\n\t\t<SelectPrimitive.ItemIndicator\n\t\t\tdata-slot=\"select-item-indicator\"\n\t\t\tclassName={cn(className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</SelectPrimitive.ItemIndicator>\n\t);\n}\n\nfunction SelectScrollUpButton({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollUpButton\n\t\t\tdata-slot=\"select-scroll-up-button\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex cursor-default items-center justify-center py-1\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronUpIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollUpButton>\n\t);\n}\n\nfunction SelectScrollDownButton({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollDownButton\n\t\t\tdata-slot=\"select-scroll-down-button\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex cursor-default items-center justify-center py-1\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronDownIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollDownButton>\n\t);\n}\n\nexport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectItemIndicator,\n\tSelectLabel,\n\tSelectScrollDownButton,\n\tSelectScrollUpButton,\n\tSelectSeparator,\n\tSelectTrigger,\n\tSelectValue,\n};\n","import { Button } from \"@/components/ui/button\";\nimport { CommandItem } from \"@/components/ui/command\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { SearchTokenResult } from \"@/types/walletProvider/transaction-service.types\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faPlus, faArrowRotateRight } from \"@fortawesome/pro-solid-svg-icons\";\nimport { useAppStore } from \"@/store/store\";\nimport { faCirclePlus } from \"@fortawesome/pro-light-svg-icons\";\n\n// --- Helper Functions ---\n// const FallbackIcon = () => <div className=\"w-10 h-10 rounded-full bg-muted\" />;\n\n// --- TokenRow for Owned Tokens ---\ninterface TokenRowProps {\n\ttoken: Token;\n\tonSelect: (token: Token) => void;\n\tonAddToWallet: (token: Token) => void;\n\tisSwapPanelModal?: boolean;\n\tisTokenOwned?: boolean; // Optional prop to indicate if the token is owned\n\thideTopSection?: boolean;\n}\n\nexport const TokenRow = ({\n\ttoken,\n\tonSelect,\n\tonAddToWallet,\n\tisTokenOwned,\n\tisSwapPanelModal,\n\thideTopSection = false,\n}: TokenRowProps) => {\n\tconst balance = parseFloat(token.balance);\n\tconst usdPrice = parseFloat(token.usd_price);\n\tconst fiatValue =\n\t\tisNaN(balance) || isNaN(usdPrice) ? 0 : balance * usdPrice;\n\tconst { chainLogo, chainId } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\t// console.log(\"TokenRow Render:\", { token, balance, usdPrice, fiatValue });\n\treturn (\n\t\t<CommandItem\n\t\t\tvalue={`${token.name} ${token.symbol} ${token.address}`}\n\t\t\tonSelect={() => onSelect(token)}\n\t\t\tclassName=\"w-full data-[selected=true]:!bg-[#98a1c014] rounded-none !px-[20px] !py-[10px]\"\n\t\t>\n\t\t\t<div className=\"flex justify-between items-center gap-2 w-full\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t{token.icon && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={token.icon || \"\"}\n\t\t\t\t\t\t\talt={token.name}\n\t\t\t\t\t\t\twidth={32}\n\t\t\t\t\t\t\theight={32}\n\t\t\t\t\t\t\tclassName=\"rounded-full text-[#aaa]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isSwapPanelModal && chainLogo && chainId && (\n\t\t\t\t\t\t<div className=\"absolute -bottom-[2.5px] -right-[2.5px] rounded-[4px] border border-black \">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chainLogo}\n\t\t\t\t\t\t\t\talt={chainId.toString()}\n\t\t\t\t\t\t\t\tclassName=\"m-auto rounded-full size-[14px]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-grow\">\n\t\t\t\t\t<p className=\"font-medium text-base text-white leading-[25.1px] font-arial opacity-60\">\n\t\t\t\t\t\t{token.name}\n\t\t\t\t\t</p>\n\t\t\t\t\t<div className=\"flex items-center font-[300] leading-[18.9px]  text-xs gap-2 font-arial\">\n\t\t\t\t\t\t<p className={\"text-white font-arial\"}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\tisTokenOwned && Number(balance) > 0.000001\n\t\t\t\t\t\t\t\t\t\t? \"text-[#4285f4]\"\n\t\t\t\t\t\t\t\t\t\t: \"text-white/50\"\n\t\t\t\t\t\t\t\t} font-arial`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{Number(balance) < 0.000001 && \"<\"}\n\t\t\t\t\t\t\t\t{Number(balance) < 0.000001\n\t\t\t\t\t\t\t\t\t? \"0.000000\"\n\t\t\t\t\t\t\t\t\t: balance.toFixed(6)}\n\t\t\t\t\t\t\t</span>{\" \"}\n\t\t\t\t\t\t\t<span className=\"opacity-50\">{token.symbol}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{!token.address.startsWith(\"0xee\") && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"text-[#aaaaaa]/50 font-arial\">\n\t\t\t\t\t\t\t\t\t{token.address.slice(0, 4)}...\n\t\t\t\t\t\t\t\t\t{token.address.slice(-4)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\t\t\t\t\twidth: \"15px\",\n\t\t\t\t\t\t\t\t\t\theight: \"15px\",\n\t\t\t\t\t\t\t\t\t\tmarginLeft: \"-4px\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tonAddToWallet(token);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseEnter={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tconst hiddenIcon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (icon) icon.style.opacity = \"0\";\n\t\t\t\t\t\t\t\t\t\tif (hiddenIcon)\n\t\t\t\t\t\t\t\t\t\t\thiddenIcon.style.opacity = \"1\";\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseLeave={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tconst hiddenIcon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (icon) icon.style.opacity = \"1\";\n\t\t\t\t\t\t\t\t\t\tif (hiddenIcon)\n\t\t\t\t\t\t\t\t\t\t\thiddenIcon.style.opacity = \"0\";\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faPlus}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-[#aaaaaa]/50 addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.2s ease\",\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: \"2\",\n\t\t\t\t\t\t\t\t\t\t\tleft: \"0\",\n\t\t\t\t\t\t\t\t\t\t\topacity: \"1\",\n\t\t\t\t\t\t\t\t\t\t\theight: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"11px\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faCirclePlus}\n\t\t\t\t\t\t\t\t\t\tfontSize={11}\n\t\t\t\t\t\t\t\t\t\tclassName=\"addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.2s ease\",\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: \"2\",\n\t\t\t\t\t\t\t\t\t\t\tleft: \"0\",\n\t\t\t\t\t\t\t\t\t\t\topacity: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"#f6851b\", // Change color to match the theme\n\t\t\t\t\t\t\t\t\t\t\theight: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"11px\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-right text-white/70\">\n\t\t\t\t\t{!hideTopSection &&\n\t\t\t\t\t\ttoken.usd_price.toLowerCase() === \"unavailable\" && (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"h-5 w-5 text-white/50\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t{!hideTopSection ? (\n\t\t\t\t\t\tfiatValue > 0 &&\n\t\t\t\t\t\t(fiatValue < 0.01 ? (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={`font-normal text-xl font-sans text-[#fffc]`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{\"<\"} $0.01\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={`font-normal text-xl font-sans text-[#fffc]`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${fiatValue.toFixed(2)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t))\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className={\"text-white/50\"}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\tisTokenOwned\n\t\t\t\t\t\t\t\t\t\t? \"text-[#4285f4]\"\n\t\t\t\t\t\t\t\t\t\t: \"text-white/50\"\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{balance.toFixed(6)}\n\t\t\t\t\t\t\t</span>{\" \"}\n\t\t\t\t\t\t\t{token.symbol}{\" \"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</CommandItem>\n\t);\n};\n\ninterface SearchResultRowProps {\n\ttoken: SearchTokenResult & {\n\t\tbalance?: string;\n\t\tusd_price?: string;\n\t\tusdAmount?: string;\n\t\ticon?: string;\n\t};\n\tisSwapPanelModal?: boolean;\n\tonSelect: (token: SearchTokenResult) => void;\n\tonAddToWallet: (token: SearchTokenResult) => void;\n\tisTokenOwned?: boolean;\n}\n\nexport const SearchResultRow = ({\n\ttoken,\n\tonSelect,\n\tonAddToWallet,\n\tisTokenOwned,\n\tisSwapPanelModal,\n}: SearchResultRowProps) => {\n\t// Use balance and usd_price if available, otherwise default to 0\n\tconst balance = token.balance ? parseFloat(token.balance) : 0;\n\tconst usdPrice = token.usd_price ? parseFloat(token.usd_price) : 0;\n\tconst fiatValue =\n\t\tisNaN(balance) || isNaN(usdPrice) ? 0 : balance * usdPrice;\n\tconst { chainLogo, chainId } = useAppStore(\n\t\t(state) => state.blockchain.network\n\t);\n\treturn (\n\t\t<CommandItem\n\t\t\tvalue={`${token.name} ${token.symbol} ${token.address}`}\n\t\t\tonSelect={() => onSelect(token)}\n\t\t\tclassName=\"w-full data-[selected=true]:!bg-[#98a1c014] rounded-none !px-[20px] !py-[10px]\"\n\t\t>\n\t\t\t<div className=\"flex justify-between items-center gap-2 w-full\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t{token.icon && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={token.icon || \"\"}\n\t\t\t\t\t\t\talt={token.name}\n\t\t\t\t\t\t\twidth={32}\n\t\t\t\t\t\t\theight={32}\n\t\t\t\t\t\t\tclassName=\"rounded-full text-[#aaa]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isSwapPanelModal && chainLogo && chainId && (\n\t\t\t\t\t\t<div className=\"absolute -bottom-[2.5px] -right-[2.5px] rounded-[4px] border border-black \">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={chainLogo}\n\t\t\t\t\t\t\t\talt={chainId.toString()}\n\t\t\t\t\t\t\t\tclassName=\"m-auto rounded-full size-[14px]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-grow\">\n\t\t\t\t\t<p className=\"font-medium text-base text-white leading-[25.1px] font-arial opacity-60\">\n\t\t\t\t\t\t{token.name}\n\t\t\t\t\t</p>\n\t\t\t\t\t<div className=\"flex items-center font-[300] leading-[18.9px]  text-xs gap-2 font-arial\">\n\t\t\t\t\t\t<p className={\"text-white font-arial\"}>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\tisTokenOwned && Number(balance) > 0.000001\n\t\t\t\t\t\t\t\t\t\t? \"text-[#4285f4]\"\n\t\t\t\t\t\t\t\t\t\t: \"text-white/50\"\n\t\t\t\t\t\t\t\t} font-arial`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{Number(balance) < 0.000001 && \"<\"}\n\t\t\t\t\t\t\t\t{Number(balance) < 0.000001\n\t\t\t\t\t\t\t\t\t? \"0.000000\"\n\t\t\t\t\t\t\t\t\t: balance.toFixed(6)}\n\t\t\t\t\t\t\t</span>{\" \"}\n\t\t\t\t\t\t\t<span className=\"opacity-50\">{token.symbol}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{!token.address.startsWith(\"0xee\") && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"text-[#aaaaaa]/50 font-arial\">\n\t\t\t\t\t\t\t\t\t{token.address.slice(0, 4)}...\n\t\t\t\t\t\t\t\t\t{token.address.slice(-4)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\t\t\t\t\twidth: \"15px\",\n\t\t\t\t\t\t\t\t\t\theight: \"15px\",\n\t\t\t\t\t\t\t\t\t\tmarginLeft: \"-4px\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tonAddToWallet(token);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseEnter={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tconst hiddenIcon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (icon) icon.style.opacity = \"0\";\n\t\t\t\t\t\t\t\t\t\tif (hiddenIcon)\n\t\t\t\t\t\t\t\t\t\t\thiddenIcon.style.opacity = \"1\";\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseLeave={(e) => {\n\t\t\t\t\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tconst hiddenIcon =\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.querySelector<HTMLElement>(\n\t\t\t\t\t\t\t\t\t\t\t\t\".addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (icon) icon.style.opacity = \"1\";\n\t\t\t\t\t\t\t\t\t\tif (hiddenIcon)\n\t\t\t\t\t\t\t\t\t\t\thiddenIcon.style.opacity = \"0\";\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faPlus}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-[#aaaaaa]/50 addTokenToMmIcon\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.2s ease\",\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: \"2\",\n\t\t\t\t\t\t\t\t\t\t\tleft: \"0\",\n\t\t\t\t\t\t\t\t\t\t\topacity: \"1\",\n\t\t\t\t\t\t\t\t\t\t\theight: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"11px\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faCirclePlus}\n\t\t\t\t\t\t\t\t\t\tfontSize={11}\n\t\t\t\t\t\t\t\t\t\tclassName=\"addTokenToMmIconHiddne\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.2s ease\",\n\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\t\t\t\ttop: \"2\",\n\t\t\t\t\t\t\t\t\t\t\tleft: \"0\",\n\t\t\t\t\t\t\t\t\t\t\topacity: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"#f6851b\", // Change color to match the theme\n\t\t\t\t\t\t\t\t\t\t\theight: \"11px\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"11px\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-right text-white/70\">\n\t\t\t\t\t{token.usd_price &&\n\t\t\t\t\t\ttoken.usd_price.toLowerCase() === \"unavailable\" && (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"h-5 w-5 text-white/50\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t{fiatValue > 0 &&\n\t\t\t\t\t\t(fiatValue < 0.01 ? (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={`font-normal text-xl font-sans text-[#fffc]`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{\"<\"} $0.01\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={`font-normal text-lg font-sans text-[#fffc]`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${fiatValue.toFixed(2)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</CommandItem>\n\t);\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n  className,\n  ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n  return (\n    <LabelPrimitive.Root\n      data-slot=\"label\"\n      className={cn(\n        \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Label }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { toast } from \"sonner\";\n\ninterface CopyWalletAddressButtonProps {\n\t/** The wallet address to copy */\n\taddress?: string;\n\t/** Optional custom className for styling */\n\tclassName?: string;\n\t/** Button variant */\n\tvariant?: \"default\" | \"outline\" | \"ghost\" | \"secondary\";\n\t/** Button size */\n\tsize?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n\t/** Whether to show the address text alongside the copy button */\n\tshowAddress?: boolean;\n\t/** How many characters to show from start and end when showAddress is true */\n\taddressTruncateLength?: number;\n\t/** Custom label for the button */\n\tlabel?: string;\n\t/** Whether to show only the icon */\n\ticonOnly?: boolean;\n\t/** Custom success message */\n\tsuccessMessage?: string;\n\t/** Custom error message */\n\terrorMessage?: string;\n}\n\n/**\n * A reusable button component for copying wallet addresses to clipboard.\n *\n * Features:\n * - Copies wallet address to clipboard\n * - Shows visual feedback with check icon\n * - Displays toast notification\n * - Configurable appearance and behavior\n * - Handles edge cases (no address, clipboard API not available)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <CopyWalletAddressButton address=\"0x1234...5678\" />\n *\n * // With address display\n * <CopyWalletAddressButton\n *   address=\"0x1234...5678\"\n *   showAddress\n *   variant=\"outline\"\n * />\n *\n * // Icon only\n * <CopyWalletAddressButton\n *   address=\"0x1234...5678\"\n *   iconOnly\n *   size=\"icon\"\n * />\n * ```\n */\nexport const CopyWalletAddressButton = ({\n\taddress,\n\tclassName,\n\tvariant = \"ghost\",\n\tsize = \"sm\",\n\tshowAddress = false,\n\taddressTruncateLength = 6,\n\tlabel = \"Copy Address\",\n\ticonOnly = false,\n\tsuccessMessage = \"Address copied to clipboard!\",\n\terrorMessage = \"Failed to copy address\",\n}: CopyWalletAddressButtonProps) => {\n\tconst [isCopied, setIsCopied] = useState(false);\n\n\t/**\n\t * Handles copying the wallet address to clipboard\n\t */\n\tconst handleCopy = async () => {\n\t\tif (!address) {\n\t\t\ttoast.error(\"No wallet address available\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Check if clipboard API is available\n\t\t\tif (navigator.clipboard && window.isSecureContext) {\n\t\t\t\tawait navigator.clipboard.writeText(address);\n\t\t\t} else {\n\t\t\t\t// Fallback for older browsers or non-secure contexts\n\t\t\t\tconst textArea = document.createElement(\"textarea\");\n\t\t\t\ttextArea.value = address;\n\t\t\t\ttextArea.style.position = \"absolute\";\n\t\t\t\ttextArea.style.left = \"-999999px\";\n\t\t\t\tdocument.body.prepend(textArea);\n\t\t\t\ttextArea.select();\n\t\t\t\tdocument.execCommand(\"copy\");\n\t\t\t\ttextArea.remove();\n\t\t\t}\n\n\t\t\t// Show success state\n\t\t\tsetIsCopied(true);\n\t\t\ttoast.success(successMessage);\n\n\t\t\t// Reset the copied state after 2 seconds\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsCopied(false);\n\t\t\t}, 2000);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to copy address:\", error);\n\t\t\ttoast.error(errorMessage);\n\t\t}\n\t};\n\n\t/**\n\t * Formats the address for display with truncation\n\t */\n\tconst formatAddress = (addr: string): string => {\n\t\tif (!addr || addr.length <= addressTruncateLength * 2 + 3) {\n\t\t\treturn addr;\n\t\t}\n\t\treturn `${addr.slice(0, addressTruncateLength)}...${addr.slice(\n\t\t\t-addressTruncateLength\n\t\t)}`;\n\t};\n\n\t// Don't render if no address is provided\n\tif (!address) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Button\n\t\t\tvariant={variant}\n\t\t\tsize={size}\n\t\t\tonClick={handleCopy}\n\t\t\tclassName={cn(\n\t\t\t\t\"transition-all duration-200\",\n\t\t\t\tisCopied && \"text-green-600 dark:text-green-400\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdisabled={isCopied}\n\t\t>\n\t\t\t{/* Icon */}\n\t\t\t{isCopied ? (\n\t\t\t\t<Check className=\"h-4 w-4\" />\n\t\t\t) : (\n\t\t\t\t<Copy className=\"h-4 w-4\" />\n\t\t\t)}\n\n\t\t\t{/* Text content */}\n\t\t\t{!iconOnly && (\n\t\t\t\t<span className=\"ml-2\">\n\t\t\t\t\t{showAddress ? formatAddress(address) : label}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</Button>\n\t);\n};\n\nexport default CopyWalletAddressButton;\n","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction TooltipProvider({\n\tdelayDuration = 0,\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n\treturn (\n\t\t<TooltipPrimitive.Provider\n\t\t\tdata-slot=\"tooltip-provider\"\n\t\t\tdelayDuration={delayDuration}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction Tooltip({\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n\t\t</TooltipProvider>\n\t);\n}\n\nfunction TooltipTrigger({\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n\treturn <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n\tclassName,\n\tsideOffset = 0,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n\treturn (\n\t\t<TooltipPrimitive.Portal>\n\t\t\t<TooltipPrimitive.Content\n\t\t\t\tdata-slot=\"tooltip-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<TooltipPrimitive.Arrow className=\"bg-[#000000d9] fill-[#000000d9] z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n\t\t\t</TooltipPrimitive.Content>\n\t\t</TooltipPrimitive.Portal>\n\t);\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaChevronDown,\n\tfaXmark,\n\tfaCopy,\n\tfaSpinner,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { cn } from \"@/lib/utils\";\nimport QRCode from \"qrcode\";\nimport { toast } from \"sonner\";\nimport { getDefaultTokens } from \"@/lib/utils/wallet-provider/wallet-provider.utils\";\nimport { EvmNetwork } from \"@dynamic-labs/sdk-react-core\";\n\n// Types\n\ninterface DepositPanelWeb2Props {\n\twalletAddress: string;\n\tcountDown?: number; // in seconds\n\tamount: string;\n\ttokens: Token[];\n\tnetworks?: EvmNetwork[];\n\tonTokenSelect: (token: Token) => void;\n\tonNetworkSelect?: (network: EvmNetwork) => void;\n}\n\ninterface DepositPanelWeb2ModalProps extends DepositPanelWeb2Props {\n\tisOpen: boolean;\n\tonClose: () => void;\n}\n\n// Countdown Timer Component\nconst CountdownTimer = ({\n\tonTimeout,\n\tcountDown,\n}: {\n\tonTimeout: () => void;\n\tcountDown?: number;\n}) => {\n\tconst [timeLeft, setTimeLeft] = useState(\n\t\t(countDown && countDown * 60) || 300\n\t); // 5 minutes in seconds\n\n\tuseEffect(() => {\n\t\tif (timeLeft <= 0) {\n\t\t\ttoast.warning(\"Session Expired\", {\n\t\t\t\tdescription:\n\t\t\t\t\t\"Your deposit session has expired. Please try again.\",\n\t\t\t\tduration: 4000,\n\t\t\t});\n\t\t\tonTimeout();\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setInterval(() => {\n\t\t\tsetTimeLeft((prev) => prev - 1);\n\t\t}, 1000);\n\n\t\treturn () => clearInterval(timer);\n\t}, [timeLeft, onTimeout]);\n\n\tconst formatTime = (seconds: number) => {\n\t\tconst mins = Math.floor(seconds / 60);\n\t\tconst secs = seconds % 60;\n\t\treturn `${mins}:${secs.toString().padStart(2, \"0\")}`;\n\t};\n\n\treturn (\n\t\t<div className=\"text-center p-4\">\n\t\t\t<div className=\"text-3xl font-semibold tracking-wider text-white/60\">\n\t\t\t\t{formatTime(timeLeft)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\n// QR Code Component\nconst QRCodeDisplay = ({ address }: { address: string }) => {\n\tconst [qrCodeUrl, setQrCodeUrl] = useState<string>(\"\");\n\n\tuseEffect(() => {\n\t\tconst generateQR = async () => {\n\t\t\ttry {\n\t\t\t\tconst url = await QRCode.toDataURL(address, {\n\t\t\t\t\twidth: 200,\n\t\t\t\t\tmargin: 2,\n\t\t\t\t\tcolor: {\n\t\t\t\t\t\tdark: \"#000000\",\n\t\t\t\t\t\tlight: \"#FFFFFF\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tsetQrCodeUrl(url);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Error generating QR code:\", err);\n\t\t\t\ttoast.error(\"QR Code Error\", {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Failed to generate QR code. Please try again.\",\n\t\t\t\t\tduration: 3000,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tif (address) {\n\t\t\tgenerateQR();\n\t\t}\n\t}, [address]);\n\n\treturn (\n\t\t<div className=\"flex flex-col items-end space-y-4\">\n\t\t\t{qrCodeUrl && (\n\t\t\t\t<div className=\"bg-white p-1.5 rounded-lg\">\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={qrCodeUrl}\n\t\t\t\t\t\talt=\"Wallet Address QR Code\"\n\t\t\t\t\t\tclassName=\"w-48 h-48\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\n// Network Selector Component for Deposit Panel Web2 using DropdownMenu\nconst NetworkSelector = ({\n\tnetworks,\n\tselectedNetwork,\n\tonNetworkSelect,\n\tisSwitching = false,\n}: {\n\tnetworks: EvmNetwork[];\n\tselectedNetwork: EvmNetwork | null;\n\tonNetworkSelect: (network: EvmNetwork) => void;\n\tisSwitching?: boolean;\n}) => {\n\tconst [switchingChainId, setSwitchingChainId] = useState<number | null>(\n\t\tnull\n\t);\n\n\tconst handleNetworkChange = async (network: EvmNetwork) => {\n\t\t// Prevent action if already on the selected network\n\t\tif (selectedNetwork?.chainId === network.chainId) return;\n\n\t\tsetSwitchingChainId(network.chainId);\n\n\t\ttry {\n\t\t\t// Call the callback to inform parent about network selection\n\t\t\tonNetworkSelect(network);\n\n\t\t\t// Show success toast\n\t\t\t// toast.success(\"Network Selected\", {\n\t\t\t// \tdescription: `Switched to ${\n\t\t\t// \t\tnetwork.vanityName || network.name\n\t\t\t// \t}`,\n\t\t\t// \tduration: 2000,\n\t\t\t// });\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to select network:\", error);\n\t\t\t// toast.error(\"Network selection failed\", {\n\t\t\t// \tdescription: \"Please try again\",\n\t\t\t// \tduration: 3000,\n\t\t\t// });\n\t\t} finally {\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetSwitchingChainId(null);\n\t\t\t}, 1000);\n\t\t}\n\t};\n\n\tif (!networks || networks.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName=\"flex h-auto items-center justify-between w-full py-2 px-3 bg-[#24262b] border-0 outline-0 rounded-lg text-white hover:bg-[#1a1a1a] hover:outline-2 hover:outline-[#4285f4] transition-all duration-200\"\n\t\t\t\t\tdisabled={isSwitching}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center space-x-3\">\n\t\t\t\t\t\t{selectedNetwork?.iconUrls?.[0] ? (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={selectedNetwork.iconUrls[0]}\n\t\t\t\t\t\t\t\talt={selectedNetwork.name}\n\t\t\t\t\t\t\t\tclassName=\"size-7 rounded-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"size-7 bg-[#4285f4] rounded-full flex items-center justify-center text-white text-xs\">\n\t\t\t\t\t\t\t\t{\"🌐\"}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t<div className=\"font-semibold text-[#f4f4f4] text-xs\">\n\t\t\t\t\t\t\t\t{selectedNetwork?.vanityName ||\n\t\t\t\t\t\t\t\t\tselectedNetwork?.name ||\n\t\t\t\t\t\t\t\t\t\"Select Network\"}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\tclassName=\"h-4 w-4 text-[#9b9b9b]\"\n\t\t\t\t\t/>\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tclassName=\"w-full min-w-[var(--radix-dropdown-menu-trigger-width)] bg-[#131313] border border-[#ffffff20] rounded-lg p-1\"\n\t\t\t\talign=\"start\"\n\t\t\t>\n\t\t\t\t{networks.map((network) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={network.chainId}\n\t\t\t\t\t\tonSelect={() => handleNetworkChange(network)}\n\t\t\t\t\t\tdisabled={isSwitching}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center space-x-3 px-3 py-2 rounded-lg cursor-pointer transition-all duration-200\"\n\t\t\t\t\t\t\t// !network.isActive && \"opacity-50 cursor-not-allowed\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t{network.iconUrls?.[0] ? (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={network.iconUrls[0]}\n\t\t\t\t\t\t\t\t\talt={network.name}\n\t\t\t\t\t\t\t\t\tclassName=\"size-7 rounded-full\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"size-7 bg-[#4285f4] rounded-full flex items-center justify-center text-white text-xs\">\n\t\t\t\t\t\t\t\t\t{network.iconUrls?.[0] || \"🌐\"}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{selectedNetwork?.chainId === network.chainId && (\n\t\t\t\t\t\t\t\t<div className=\"absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-[#131313]\"></div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{isSwitching &&\n\t\t\t\t\t\t\t\tnetwork.chainId === switchingChainId && (\n\t\t\t\t\t\t\t\t\t<div className=\"absolute -top-1 -right-1 w-3 h-3 bg-[#4285f4] rounded-full border-2 border-[#131313] flex items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-2 w-2 animate-spin text-white\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<div className=\"font-semibold text-xs\">\n\t\t\t\t\t\t\t\t{network.vanityName || network.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n\n// Token Selector Component using Shadcn Dropdown\nconst TokenSelector = ({\n\ttokens,\n\tselectedToken,\n\tonTokenSelect,\n}: {\n\ttokens: Token[];\n\tselectedToken: Token;\n\tonTokenSelect: (token: Token) => void;\n}) => {\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName=\"flex h-auto items-center justify-between w-full py-2 px-3 bg-[#24262b] border-0 outline-0 rounded-lg text-white hover:bg-[#24262b] hover:outline-2 hover:outline-[#4285f4] transition-all duration-200\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center space-x-3\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={selectedToken.icon}\n\t\t\t\t\t\t\talt={selectedToken.symbol}\n\t\t\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t<div className=\"font-semibold text-[#f4f4f4] text-xs\">\n\t\t\t\t\t\t\t\t{selectedToken.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-[10px] text-[#9b9b9b]\">\n\t\t\t\t\t\t\t\t{selectedToken.symbol}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\tclassName=\"h-4 w-4 text-[#9b9b9b]\"\n\t\t\t\t\t/>\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent\n\t\t\t\tclassName=\"w-full min-w-[var(--radix-dropdown-menu-trigger-width)] bg-[#131313] border border-[#ffffff20] rounded-lg p-1\"\n\t\t\t\talign=\"start\"\n\t\t\t>\n\t\t\t\t{tokens.map((token) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tkey={token.address}\n\t\t\t\t\t\tonSelect={() => onTokenSelect(token)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex items-center space-x-3 px-3 py-2 rounded-lg cursor-pointer transition-all duration-200\"\n\t\t\t\t\t\t\t// selectedToken.address === token.address\n\t\t\t\t\t\t\t// \t? \"bg-[#4285f4] hover:bg-[#4285f4] text-white\"\n\t\t\t\t\t\t\t// \t: \"text-[#f4f4f4] hover:bg-[#1a1a1a] hover:text-white\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={token.icon}\n\t\t\t\t\t\t\t\talt={token.symbol}\n\t\t\t\t\t\t\t\tclassName=\"size-7\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{selectedToken.address === token.address && (\n\t\t\t\t\t\t\t\t<div className=\"absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-[#131313]\"></div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<div className=\"font-semibold text-xs\">\n\t\t\t\t\t\t\t\t{token.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-[10px] opacity-80\">\n\t\t\t\t\t\t\t\t{token.symbol} • {token.address.slice(0, 6)}...\n\t\t\t\t\t\t\t\t{token.address.slice(-4)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n\n// Main Modal Component\nexport const DepositPanelWeb2Modal = ({\n\twalletAddress,\n\tamount,\n\ttokens,\n\tnetworks,\n\tonNetworkSelect,\n\tonTokenSelect,\n\tisOpen,\n\tonClose,\n\tcountDown = 30, // default to 30 minutes\n}: DepositPanelWeb2ModalProps) => {\n\tconst [selectedToken, setSelectedToken] = useState<Token>(\n\t\ttokens[0] || getDefaultTokens()[0]\n\t);\n\tconst [selectedNetwork, setSelectedNetwork] = useState<EvmNetwork | null>(\n\t\tnetworks?.[0] || null\n\t);\n\n\tconst handleTimeout = () => {\n\t\tonClose();\n\t};\n\n\tconst copyToClipboard = async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(walletAddress);\n\t\t\ttoast.success(\"Address Copied!\", {\n\t\t\t\tdescription: \"Wallet address has been copied to clipboard\",\n\t\t\t\tduration: 2000,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error(\"Failed to copy address:\", err);\n\t\t\ttoast.error(\"Copy Failed\", {\n\t\t\t\tdescription: \"Failed to copy address to clipboard\",\n\t\t\t\tduration: 3000,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleNetworkSelection = (network: EvmNetwork) => {\n\t\tsetSelectedNetwork(network);\n\t\tonNetworkSelect?.(network);\n\t};\n\n\tconst handleTokenSelection = (token: Token) => {\n\t\tsetSelectedToken(token);\n\t\tonTokenSelect?.(token);\n\t};\n\n\treturn (\n\t\t<Dialog open={isOpen} onOpenChange={onClose}>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"bg-[#1c1e22] border border-[#ffffff12] max-w-md w-full mx-auto p-0\"\n\t\t\t\tshowCloseButton={false}\n\t\t\t>\n\t\t\t\t<div className=\"p-6 space-y-3\">\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<h2 className=\"text-xl font-semibold text-white\">\n\t\t\t\t\t\t\tDeposit Payment\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tclassName=\"text-[#9b9b9b] hover:text-white\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faXmark}\n\t\t\t\t\t\t\t\tclassName=\"h-5 w-5\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"grid grid-cols-2 w-full gap-4\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{/* Network Selector */}\n\t\t\t\t\t\t\t<div className=\"mb-2\">\n\t\t\t\t\t\t\t\t<label className=\"block text-sm font-medium text-[#9b9b9b] mb-1\">\n\t\t\t\t\t\t\t\t\tSelect Network\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t{networks && networks.length > 0 && (\n\t\t\t\t\t\t\t\t\t<NetworkSelector\n\t\t\t\t\t\t\t\t\t\tnetworks={networks}\n\t\t\t\t\t\t\t\t\t\tselectedNetwork={selectedNetwork}\n\t\t\t\t\t\t\t\t\t\tonNetworkSelect={handleNetworkSelection}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* Token Selector */}\n\t\t\t\t\t\t\t<div className=\"mb-2\">\n\t\t\t\t\t\t\t\t<label className=\"block text-sm font-medium text-[#9b9b9b] mb-1\">\n\t\t\t\t\t\t\t\t\tSelect Token\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<TokenSelector\n\t\t\t\t\t\t\t\t\ttokens={\n\t\t\t\t\t\t\t\t\t\ttokens.length > 0\n\t\t\t\t\t\t\t\t\t\t\t? tokens\n\t\t\t\t\t\t\t\t\t\t\t: getDefaultTokens()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tselectedToken={selectedToken}\n\t\t\t\t\t\t\t\t\tonTokenSelect={handleTokenSelection}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Amount Display */}\n\t\t\t\t\t\t\t<div className=\"w-full mb-2\">\n\t\t\t\t\t\t\t\t<label className=\"block text-sm font-medium text-[#9b9b9b] mb-1\">\n\t\t\t\t\t\t\t\t\tAmount to Pay\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div className=\"bg-[#24262b] rounded-lg py-2 px-3\">\n\t\t\t\t\t\t\t\t\t<p className=\"text-xl font-semibold text-white\">\n\t\t\t\t\t\t\t\t\t\t{amount} {selectedToken.symbol}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* QR Code */}\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<label className=\"block text-sm font-medium text-[#9b9b9b] ml-5 mb-1\">\n\t\t\t\t\t\t\t\tScan to Pay\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<QRCodeDisplay address={walletAddress} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Wallet Address */}\n\t\t\t\t\t<div className=\"mb-2 mt-2\">\n\t\t\t\t\t\t<label className=\"block text-sm font-medium text-[#9b9b9b] mb-1\">\n\t\t\t\t\t\t\tWallet Address\n\t\t\t\t\t\t</label>\n\n\t\t\t\t\t\t<div className=\"flex items-center space-x-2 bg-[#24262b] rounded-lg px-3 px-3 py-2 w-full\">\n\t\t\t\t\t\t\t<code className=\"text-sm font-mono text-white flex-1 truncate\">\n\t\t\t\t\t\t\t\t{walletAddress}\n\t\t\t\t\t\t\t</code>{\" \"}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={copyToClipboard}\n\t\t\t\t\t\t\t\tclassName=\"text-[#fff]/50 hover:text-[#1266f1]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faCopy}\n\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Countdown Timer */}\n\t\t\t\t\t<CountdownTimer\n\t\t\t\t\t\tonTimeout={handleTimeout}\n\t\t\t\t\t\tcountDown={countDown}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Close Button */}\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tclassName=\"w-full h-auto bg-[#4285f4] hover:bg-[#1266f1] text-white py-4 text-lg font-medium\"\n\t\t\t\t\t>\n\t\t\t\t\t\tClose\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n\n// Export Component with Trigger Button\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction DropdownMenu({\n\tmodal = true,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root> & {\n\tmodal?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Root\n\t\t\tdata-slot=\"dropdown-menu\"\n\t\t\tmodal={modal}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuPortal({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal\n\t\t\tdata-slot=\"dropdown-menu-portal\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuTrigger({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Trigger\n\t\t\tdata-slot=\"dropdown-menu-trigger\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuContent({\n\tclassName,\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal>\n\t\t\t<DropdownMenuPrimitive.Content\n\t\t\t\tdata-slot=\"dropdown-menu-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</DropdownMenuPrimitive.Portal>\n\t);\n}\n\nfunction DropdownMenuGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Group\n\t\t\tdata-slot=\"dropdown-menu-group\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Item\n\t\t\tdata-slot=\"dropdown-menu-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.CheckboxItem\n\t\t\tdata-slot=\"dropdown-menu-checkbox-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.CheckboxItem>\n\t);\n}\n\nfunction DropdownMenuRadioGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioGroup\n\t\t\tdata-slot=\"dropdown-menu-radio-group\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuRadioItem({\n\tclassName,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioItem\n\t\t\tdata-slot=\"dropdown-menu-radio-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CircleIcon className=\"size-2 fill-current\" />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.RadioItem>\n\t);\n}\n\nfunction DropdownMenuLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Label\n\t\t\tdata-slot=\"dropdown-menu-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Separator\n\t\t\tdata-slot=\"dropdown-menu-separator\"\n\t\t\tclassName={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"dropdown-menu-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground ml-auto text-xs tracking-widest\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSub({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n\t);\n}\n\nfunction DropdownMenuSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubTrigger\n\t\t\tdata-slot=\"dropdown-menu-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"ml-auto size-4\" />\n\t\t</DropdownMenuPrimitive.SubTrigger>\n\t);\n}\n\nfunction DropdownMenuSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubContent\n\t\t\tdata-slot=\"dropdown-menu-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuPortal,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuLabel,\n\tDropdownMenuItem,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuSubContent,\n};\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinner, faCheckCircle } from \"@fortawesome/pro-solid-svg-icons\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { useEffect, useState } from \"react\";\n\ninterface TransactionPendingProps {\n\ttransactionHash: string | null;\n\ttimeLeft: number;\n\tonNewDeposit: () => void;\n}\n\nexport const DepositTransactionPending = ({\n\ttransactionHash,\n\ttimeLeft,\n\tonNewDeposit,\n}: TransactionPendingProps) => {\n\t// We can get the real-time status directly from the transaction slice\n\tconst tx = useAppStore((state) =>\n\t\tstate.blockchain.transaction.transactions.find(\n\t\t\t(t) => t.hash === transactionHash\n\t\t)\n\t);\n\n\tconst [blockExplorerUrl, setBlockExplorerUrl] = useState<string | null>(\n\t\tnull\n\t);\n\n\tconst { primaryWallet } = useDynamicContext();\n\tconst isConfirmed = tx?.status === \"confirmed\";\n\n\tuseEffect(() => {\n\t\tprimaryWallet?.connector\n\t\t\t.getBlockExplorerUrlsForCurrentNetwork()\n\t\t\t.then((urls) => {\n\t\t\t\tif (urls && urls.length > 0) {\n\t\t\t\t\tsetBlockExplorerUrl(urls[0]);\n\t\t\t\t}\n\t\t\t});\n\t}, [primaryWallet]);\n\n\tconsole.log(\"Block Explorer URL:\", blockExplorerUrl);\n\n\treturn (\n\t\t<div className=\"text-center space-y-4\">\n\t\t\t{isConfirmed ? (\n\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\ticon={faCheckCircle}\n\t\t\t\t\tclassName=\"mx-auto h-12 w-12 text-green-500\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\tclassName=\"mx-auto h-12 w-12 animate-spin text-primary\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<h4 className=\"font-semibold text-[#f4f4f4] text-lg\">\n\t\t\t\t{isConfirmed ? \"Deposit Confirmed!\" : \"Transaction Submitted\"}\n\t\t\t</h4>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t{isConfirmed\n\t\t\t\t\t? \"Your balance has been updated.\"\n\t\t\t\t\t: \"Waiting for blockchain confirmation. This can take a few minutes.\"}\n\t\t\t</p>\n\n\t\t\t{/* Countdown timer is only shown while pending */}\n\t\t\t{!isConfirmed && (\n\t\t\t\t<p className=\"text-2xl text-[#9b9b9b] font-bold\">{timeLeft}s</p>\n\t\t\t)}\n\n\t\t\t{transactionHash && (\n\t\t\t\t<a\n\t\t\t\t\thref={`${blockExplorerUrl}/tx/${transactionHash}`} // This should be dynamic based on network\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"text-xs text-[#4285f4] hover:text-[#4285f4]/70 underline break-all block\"\n\t\t\t\t>\n\t\t\t\t\tView on Explorer\n\t\t\t\t</a>\n\t\t\t)}\n\n\t\t\t<Button\n\t\t\t\tonClick={onNewDeposit}\n\t\t\t\tvariant=\"defaultBlue\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName=\"w-full text-[#f4f4f4] hover:text-[#f4f4f4] bg-[#4285f4] hover:bg-[#1266f1] dark:hover:hover:bg-[#1266f1]\"\n\t\t\t>\n\t\t\t\t{isConfirmed ? \"Make Another Deposit\" : \"Start a New Deposit\"}\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from \"react\";\n// import { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\n// import { Alert, AlertDescription } from \"@/components/ui/alert\";\nimport { toast } from \"sonner\";\nimport confetti from \"canvas-confetti\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faSpinnerThird } from \"@fortawesome/pro-light-svg-icons\";\n\nimport {\n\tfaCog,\n\tfaArrowRotateRight,\n\tfaChevronDown,\n\tfaSpinner,\n\t// faTriangleExclamation,\n\tfaLock,\n\tfaGasPump,\n\tfaCrop,\n\tfaCropSimple,\n\tfaArrowUpArrowDown,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from \"@/components/ui/popover\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { Label } from \"@/components/ui/label\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport useSwap from \"@/hooks/walletProvider/swap/useSwapNew\";\nimport { TokenListModal } from \"@/components/common/walletProvider/token-list-modal\";\nimport { NetworkSelector } from \"@/components/common/walletProvider/network-selector\";\nimport { CopyWalletAddressButton } from \"@/components/common/walletProvider/copy-wallet-address-button\";\nimport { useWalletAddress } from \"@/hooks/walletProvider/useWalletAddress\";\nimport { cn } from \"@/lib/utils\";\n// import { useBlockExplorerUrl } from \"@/hooks/walletProvider/useBlockExplorerUrl\";\nimport {\n\tformatAmount,\n\tformatUSD,\n} from \"@/lib/utils/wallet-provider/wallet-provider.utils\";\nimport { useAppStore } from \"@/store/store\";\nimport { selectNativeToken } from \"@/store/selectors/blockchain/blockchain.selectors\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { SwapConfirmModal } from \"./swap-confirm-modal\";\nimport { useTokens } from \"@/hooks/walletProvider/useTokens\";\n\n// Slippage presets\nconst slippagePresets = [\"Auto\", \"0.1\", \"0.5\", \"1.0\", \"2.5\", \"5\"];\n\n// Helper function to enforce decimal precision\nconst enforceDecimalPrecision = (value: string, precision: 2 | 6): string => {\n\tif (!value) return value;\n\n\t// Allow only numbers and one decimal point\n\tconst sanitized = value.replace(/[^0-9.]/g, \"\");\n\n\t// Prevent multiple decimal points\n\tconst parts = sanitized.split(\".\");\n\tif (parts.length > 2) {\n\t\treturn parts[0] + \".\" + parts.slice(1).join(\"\");\n\t}\n\n\t// If there's a decimal part, limit it to the specified precision\n\tif (parts.length === 2) {\n\t\tconst decimals = parts[1].slice(0, precision);\n\t\t// Always include the decimal point if user typed it, even if no decimals follow yet\n\t\treturn parts[0] + \".\" + decimals;\n\t}\n\n\treturn sanitized;\n};\n\nexport const SwapPanel = ({\n\tisLobbyPage = false,\n\tisEmbeddedWallet,\n}: {\n\tisLobbyPage?: boolean;\n\tisEmbeddedWallet?: boolean;\n}) => {\n\tconst { address: walletAddress } = useWalletAddress();\n\t// const { getTransactionUrl } = useBlockExplorerUrl();\n\n\t// Network state for detecting changes\n\tconst chainId = useAppStore((state) => state.blockchain.network.chainId);\n\tconst nativeToken = useAppStore(selectNativeToken);\n\n\t// Destructure all swap hook properties\n\tconst {\n\t\t// Token state\n\t\tfromToken,\n\t\ttoToken,\n\t\tsetFromToken,\n\t\tsetToToken,\n\t\tswitchTokens,\n\n\t\t// Amount state\n\t\texchangeAmount,\n\t\treceivedAmount,\n\t\thandleExchangeAmountChange,\n\t\thandleReceivedAmountChange,\n\t\tresetAmounts,\n\n\t\t// Quote and conversion\n\t\tconversion,\n\t\tsetConversion,\n\t\tisFetching,\n\t\tgetExchangeRate,\n\t\testimatedGas,\n\n\t\t// Transaction state\n\t\tslippage,\n\t\tsetSlippage,\n\t\tisLoading,\n\t\tisApproveLoading,\n\t\tisTokenAllowed,\n\t\texecuteSwap,\n\t\tapproveToken,\n\n\t\t// Gas and balance\n\t\tisLowBalance,\n\t\t// toolTipMessage,\n\t\t// showToolTip,\n\n\t\t// UI state\n\t\ttransactionSuccess,\n\t\ttxHash,\n\t\tcompletedExchangeAmount,\n\t\tcompletedReceivedAmount,\n\t\tresetSwapState,\n\t\tgasReservationAmount,\n\n\t\t// Price information\n\t\tfromTokenUsdPrice,\n\t\ttoTokenUsdPrice,\n\n\t\t// Validation\n\t\tvalidateSwap,\n\t} = useSwap();\n\n\t// Local UI state\n\tconst [fromTokenModalOpen, setFromTokenModalOpen] = useState(false);\n\tconst [toTokenModalOpen, setToTokenModalOpen] = useState(false);\n\tconst [showTransactionDetails, setShowTransactionDetails] = useState(false);\n\t// const [customSlippage, setCustomSlippage] = useState(\"1.0\");\n\tconst [isSettingsOpen, setIsSettingsOpen] = useState(false);\n\tconst [layout, setLayout] = useState<\"ltr\" | \"rtl\">(\"ltr\");\n\tconst [decimalPrecision, setDecimalPrecision] = useState<2 | 6>(6);\n\tconst [isLoadingNativeToken, setIsLoadingNativeToken] = useState(false);\n\tconst [fullPrecisionAmount, setFullPrecisionAmount] = useState(\"\");\n\tconst [isConfirmModalOpen, setIsConfirmModalOpen] = useState(false);\n\tconst { isTokensLoading } = useTokens();\n\n\t// Effect to switch exchange amount when decimal precision changes\n\tuseEffect(() => {\n\t\tconst newAmount = enforceDecimalPrecision(\n\t\t\tfullPrecisionAmount,\n\t\t\tdecimalPrecision\n\t\t);\n\t\thandleExchangeAmountChange(newAmount);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [decimalPrecision, fullPrecisionAmount]);\n\n\t// Effect to handle confetti and toast on transaction success\n\tuseEffect(() => {\n\t\tif (\n\t\t\ttransactionSuccess &&\n\t\t\ttxHash &&\n\t\t\tcompletedExchangeAmount &&\n\t\t\tcompletedReceivedAmount\n\t\t) {\n\t\t\t// Trigger confetti\n\t\t\tconfetti({\n\t\t\t\tparticleCount: 100,\n\t\t\t\tspread: 70,\n\t\t\t\torigin: { y: 0.6 },\n\t\t\t\tcolors: [\"#10b981\", \"#3b82f6\", \"#f59e0b\", \"#ef4444\", \"#8b5cf6\"],\n\t\t\t});\n\n\t\t\t// Show success toast\n\t\t\ttoast.success(`Swap successful! `, {\n\t\t\t\tdescription:\n\t\t\t\t\t\"Your transaction has been confirmed on the blockchain\",\n\t\t\t\tduration: 5000,\n\t\t\t});\n\t\t}\n\t}, [transactionSuccess, txHash]);\n\n\t// Effect to automatically select native token when network changes\n\tuseEffect(() => {\n\t\tif (chainId) {\n\t\t\tif (fromToken?.address === nativeToken?.address) return;\n\t\t\tsetIsLoadingNativeToken(true);\n\t\t\tif (!isTokensLoading) {\n\t\t\t\tif (!fromToken?.address) {\n\t\t\t\t\tsetFromToken(nativeToken);\n\t\t\t\t\tsetIsLoadingNativeToken(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [chainId, isTokensLoading]);\n\n\tconst getSwapButtonText = () => {\n\t\tif (!fromToken || !toToken) return \"Select Tokens\";\n\t\tif (!exchangeAmount && !receivedAmount) return \"Enter Amount\";\n\t\tif (isFetching) return \"Getting quote...\";\n\t\tif (isLoading) return \"Proceed in wallet\";\n\t\tif (isApproveLoading) return \"Approving...\";\n\t\tif (!isTokenAllowed) return \"Approve and swap\";\n\t\tif (validateSwap()) return \"Swap\";\n\t\tif (parseFloat(exchangeAmount) > parseFloat(fromToken.balance))\n\t\t\treturn `Insufficient ${fromToken.symbol} balance`;\n\t\tif (fromToken.address === toToken.address)\n\t\t\treturn \"Cannot swap the same token\";\n\t\treturn \"Enter amount\";\n\t};\n\n\tconst isSwapDisabled = () => {\n\t\treturn (\n\t\t\t!fromToken ||\n\t\t\t!toToken ||\n\t\t\t(!exchangeAmount && !receivedAmount) ||\n\t\t\tisFetching ||\n\t\t\tisLoading ||\n\t\t\tisApproveLoading ||\n\t\t\t!validateSwap()\n\t\t);\n\t};\n\n\t// Custom handlers with decimal precision enforcement\n\tconst handleExchangeAmountChangeWithPrecision = (value: string) => {\n\t\tconst enforcedValue = enforceDecimalPrecision(value, 6);\n\t\tsetFullPrecisionAmount(enforcedValue);\n\t};\n\n\tconst handleReceivedAmountChangeWithPrecision = (value: string) => {\n\t\tconst enforcedValue = enforceDecimalPrecision(value, decimalPrecision);\n\t\thandleReceivedAmountChange(enforcedValue);\n\t};\n\n\tconst handleSwapExecution = async () => {\n\t\tawait executeSwap();\n\t\tsetIsConfirmModalOpen(false);\n\t};\n\n\tconst handleApproveToken = async () => {\n\t\tconsole.log({ isTokenAllowed });\n\t\tif (!isTokenAllowed) {\n\t\t\tawait approveToken();\n\t\t}\n\t\tsetIsConfirmModalOpen(true);\n\t};\n\n\t// console.log(\"fromToken.balance\", fromToken?.balance);\n\tconst dynamicExchangeFontClass = useMemo(() => {\n\t\tconst textLength = exchangeAmount.length;\n\n\t\tif (textLength > 20) {\n\t\t\treturn \"!text-sm placeholder:text-sm\";\n\t\t}\n\t\tif (textLength > 16) {\n\t\t\t// If length is 18 or more\n\t\t\treturn \"!text-base placeholder:text-base\";\n\t\t}\n\t\t// Smaller font for long inputs\n\t\tif (textLength > 13) {\n\t\t\t// If length is 17 (because >=18 would be caught above)\n\t\t\treturn \"!text-lg placeholder:text-lg\";\n\t\t}\n\t\t// Medium font for moderately long inputs\n\t\tif (textLength > 12) {\n\t\t\t// If length is 13, 14, 15, 16\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\tif (textLength > 8) {\n\t\t\t// If length is 9, 10, 11, 12\n\t\t\treturn \"!text-2xl placeholder:text-2xl\";\n\t\t}\n\t\treturn \"!text-[36px] placeholder:text-[36px]\";\n\t}, [exchangeAmount]);\n\n\tconst dynamicReceiveFontClass = useMemo(() => {\n\t\tconst textLength = receivedAmount.length;\n\n\t\tif (textLength > 20) {\n\t\t\treturn \"!text-sm placeholder:text-sm\";\n\t\t}\n\t\tif (textLength > 16) {\n\t\t\t// If length is 18 or more\n\t\t\treturn \"!text-base placeholder:text-base\";\n\t\t}\n\t\t// Smaller font for long inputs\n\t\tif (textLength > 13) {\n\t\t\t// If length is 17 (because >=18 would be caught above)\n\t\t\treturn \"!text-lg placeholder:text-lg\";\n\t\t}\n\t\t// Medium font for moderately long inputs\n\t\tif (textLength > 12) {\n\t\t\t// If length is 13, 14, 15, 16\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\tif (textLength > 8) {\n\t\t\t// If length is 9, 10, 11, 12\n\t\t\treturn \"!text-2xl placeholder:text-2xl\";\n\t\t}\n\t\treturn \"!text-[36px] placeholder:text-[36px]\";\n\t}, [receivedAmount]);\n\n\treturn (\n\t\t<div className=\"gap-4  bg-[#1c1e22] border border-[#ffffff12] w-fit rounded-3xl pt-[8px] px-0 flex flex-col justify-center items-end\">\n\t\t\t<NetworkSelector className=\"mr-[15px]\" />\n\n\t\t\t<div className=\"bg-[#131313] border-[0.5px] border-[#ffffff12] py-[12px] pt-[13px] px-[10px] w-[90dvw] sm:w-[80dvw] md:w-[60dvw] lg:w-[40dvw] 3xl:w-[30dvw] rounded-3xl shadow-lg\">\n\t\t\t\t{/* Network Header */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2.5 pb-[10px]\">\n\t\t\t\t\t<span className=\"px-[8px] font-bold text-base leading-[24px] text-[#f4f4f4]\">\n\t\t\t\t\t\tSwap\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Additional Functionality Buttons */}\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t{/* Reset Button */}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tresetAmounts();\n\t\t\t\t\t\t\t\tresetSwapState();\n\t\t\t\t\t\t\t\tsetConversion(null);\n\t\t\t\t\t\t\t\tsetFullPrecisionAmount(\"\");\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#737373] dark:text-[#737373] hover:text-white dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"size-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t{/* Decimal Precision Switcher */}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tsetDecimalPrecision(\n\t\t\t\t\t\t\t\t\tdecimalPrecision === 2 ? 6 : 2\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-base text-[#737373] dark:text-[#737373] hover:text-white dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t.{decimalPrecision}\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t{/* Layout Direction Switcher */}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tsetLayout(layout === \"ltr\" ? \"rtl\" : \"ltr\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#737373] dark:text-[#737373] hover:text-white dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{layout === \"ltr\" ? (\n\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faCropSimple} />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faCrop} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t{/* Slippage Tolerance Adjust */}\n\t\t\t\t\t\t<Popover\n\t\t\t\t\t\t\topen={isSettingsOpen}\n\t\t\t\t\t\t\tonOpenChange={setIsSettingsOpen}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#737373] dark:text-[#737373] hover:text-white dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faCog}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\tclassName=\"w-80.5 h-[305.14px] rounded-[12px] shadow-[0_0_1px_#00000003,0_4px_8px_#0000000a,0_16px_24px_#0000000a,0_24px_32px_#00000003] bg-[#131313] border-none !outline-1 outline-solid !outline-white/10\"\n\t\t\t\t\t\t\t\talign=\"end\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t{/* Label & Current Slippage Indicator */}\n\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-end\">\n\t\t\t\t\t\t\t\t\t\t<Label className=\"font-arial text-[#9b9b9b] text-base leading-[25.1px] \">\n\t\t\t\t\t\t\t\t\t\t\tMax. Slippage\n\t\t\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 text-[#f4f4f4] text-base leading-[25.1px] \">\n\t\t\t\t\t\t\t\t\t\t\t{slippage}\n\t\t\t\t\t\t\t\t\t\t\t{/* {\" \"}\n\t\t\t\t\t\t\t\t\t\t\t{slippage.toLowerCase() !==\n\t\t\t\t\t\t\t\t\t\t\t\t\"auto\" && \"%\"} */}\n\n\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Slippage Preset Buttons */}\n\t\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-3 border border-white/7 rounded-2xl p-[5px] gap-2 mt-2\">\n\t\t\t\t\t\t\t\t\t\t{slippagePresets.map((preset) => (\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tkey={preset}\n\t\t\t\t\t\t\t\t\t\t\t\tvariant={\n\t\t\t\t\t\t\t\t\t\t\t\t\tslippage === preset\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"defaultBlue\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"ghostBlue\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSlippage(preset)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-9 !p-0\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{preset}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t{!preset\n\t\t\t\t\t\t\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t\t\t\t\t\t\t.includes(\"auto\") && \"%\"}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<Separator className=\"bg-[#ffffff12] \" />\n\n\t\t\t\t\t\t\t\t\t{/* Slippage Info */}\n\t\t\t\t\t\t\t\t\t<p className=\"leading-[18px] font-arial text-[#9b9b9b80] text-sm\">\n\t\t\t\t\t\t\t\t\t\tWe offers the best rates for swaps\n\t\t\t\t\t\t\t\t\t\twithout gas fees, protects against MEV,\n\t\t\t\t\t\t\t\t\t\tand follows strict AML rules. While some\n\t\t\t\t\t\t\t\t\t\ttoken pairs usually have a fee for\n\t\t\t\t\t\t\t\t\t\tbetter service, this particular swap\n\t\t\t\t\t\t\t\t\t\tdoes not.{\" \"}\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#4285f4]\">\n\t\t\t\t\t\t\t\t\t\t\tLearn More\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t</Popover>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t{/* You Pay Card */}\n\t\t\t\t\t<div className=\"!bg-[#1c1c1c] h-[120px] rounded-xl p-4\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-sm text-[#9b9b9b] leading-[21px]\",\n\t\t\t\t\t\t\t\t\tlayout === \"rtl\" ? \"ml-auto\" : \"\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tYou pay\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* You Pay Input field & select Token box */}\n\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tdir={layout}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\tvalue={exchangeAmount}\n\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\thandleExchangeAmountChangeWithPrecision(\n\t\t\t\t\t\t\t\t\t\te.target.value\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"bg-transparent font-medium text-white dark:text-white placeholder:text-[#44495a] border-none outline-none flex-1 min-w-0\",\n\t\t\t\t\t\t\t\t\tdynamicExchangeFontClass,\n\t\t\t\t\t\t\t\t\tisLowBalance ||\n\t\t\t\t\t\t\t\t\t\tparseFloat(\n\t\t\t\t\t\t\t\t\t\t\tfromToken?.balance as string\n\t\t\t\t\t\t\t\t\t\t) < parseFloat(exchangeAmount)\n\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252] caret-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\tlayout === \"ltr\" ? \"order-1 \" : \"order-2 \"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdisabled={!fromToken}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tonClick={() => setFromTokenModalOpen(true)}\n\t\t\t\t\t\t\t\tdisabled={isLoadingNativeToken}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"h-[36px] gap-1 rounded-full text-[#f4f4f4] dark:text-[#f4f4f4]\",\n\t\t\t\t\t\t\t\t\tfromToken && !isLoadingNativeToken\n\t\t\t\t\t\t\t\t\t\t? \"!py-[1px] !pl-[8px] !pr-[10px] bg-[#131313] border border-[#393939] hover:bg-[#131313] dark:hover:hover:bg-[#131313]\"\n\t\t\t\t\t\t\t\t\t\t: \"!py-[6px] !pl-[13px] pr-[9px] bg-[#4285f4] hover:bg-[#1266f1] dark:hover:hover:bg-[#1266f1]\",\n\t\t\t\t\t\t\t\t\tlayout === \"ltr\" ? \"order-2\" : \"order-1\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isLoadingNativeToken ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-base text-[#f4f4f4] font-normal\">\n\t\t\t\t\t\t\t\t\t\t\tLoading...\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : fromToken ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<div className=\"size-6 rounded-full overflow-hidden\">\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={fromToken.icon}\n\t\t\t\t\t\t\t\t\t\t\t\talt={fromToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-full rounded-full object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xl text-[#f4f4f4] leading-[30px] font-medium flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{fromToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t{!isTokenAllowed && (\n\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faLock}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-yellow-500 font-bold\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-1 h-3 w-3\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-base text-[#f4f4f4] font-normal\">\n\t\t\t\t\t\t\t\t\t\t\tSelect Token{\" \"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t{fromToken && exchangeAmount && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-xs text-[#9b9b9b]\"\n\t\t\t\t\t\t\t\t\t\t// layout === \"ltr\"\n\t\t\t\t\t\t\t\t\t\t// \t? \"mr-auto order-1\"\n\t\t\t\t\t\t\t\t\t\t// \t: \"ml-auto order-2\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{formatUSD(\n\t\t\t\t\t\t\t\t\t\texchangeAmount,\n\t\t\t\t\t\t\t\t\t\tfromTokenUsdPrice\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{fromToken && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"ml-auto text-sm leading-[21px]  flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\t\tNumber(fromToken.balance) < 0.01\n\t\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t: \"text-[#9b9b9b] flex items-center gap-1\"\n\t\t\t\t\t\t\t\t\t\t// layout === \"ltr\"\n\t\t\t\t\t\t\t\t\t\t// \t? \"ml-auto order-2\"\n\t\t\t\t\t\t\t\t\t\t// \t: \"mr-auto order-1\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t{formatAmount(\n\t\t\t\t\t\t\t\t\t\t\tfromToken.balance,\n\t\t\t\t\t\t\t\t\t\t\tdecimalPrecision\n\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t{fromToken.symbol}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<TooltipProvider>\n\t\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\t\topen={\n\t\t\t\t\t\t\t\t\t\t\t\tfromToken?.address.includes(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"0xee\"\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleExchangeAmountChange(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfromToken.balance\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`text-[#4285f4] hover:text-[#4285f4] hover:opacity-70 p-0 h-auto font-medium cursor-pointer `}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tMax\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipContent\n\t\t\t\t\t\t\t\t\t\t\t\tside=\"right\"\n\t\t\t\t\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-[250px] bg-[#000000d9] dark:bg-[#000000d9] px-2 py-[6px] rounded-[6px]\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\twordWrap: \"break-word\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"0 6px 16px 0 rgba(0, 0, 0, 0.08),0 3px 6px -4px rgba(0, 0, 0, 0.12),0 9px 28px 8px rgba(0, 0, 0, 0.05)\",\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-normal leading-[1.5714285714285714] text-white\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{`${gasReservationAmount} ${fromToken?.symbol} is reserved to cover\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgas fees and avoid\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttransaction failure.`}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t</TooltipProvider>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Swap Button with Cutout Effect */}\n\t\t\t\t\t<div className=\"flex justify-center relative -my-5 z-10\">\n\t\t\t\t\t\t<div className=\"bg-[#1c1c1c] outline-[#131313] outline-5 p-1 rounded-[8px]\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tonClick={switchTokens}\n\t\t\t\t\t\t\t\tclassName=\"rounded-lg cursor-pointer w-8 h-8 \"\n\t\t\t\t\t\t\t\t// disabled={!fromToken || !toToken}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faArrowUpArrowDown}\n\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 !text-white\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* You Receive Card */}\n\t\t\t\t\t<div className=\"!bg-[#1c1c1c] h-[120px] rounded-xl p-4 w-full\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-sm text-[#9b9b9b] leading-[21px]\",\n\t\t\t\t\t\t\t\t\tlayout === \"rtl\" ? \"ml-auto\" : \"\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tYou receive\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* You Receive input box & token selector */}\n\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tdir={layout}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\tvalue={receivedAmount}\n\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\thandleReceivedAmountChangeWithPrecision(\n\t\t\t\t\t\t\t\t\t\te.target.value\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"bg-transparent font-medium text-white dark:text-white placeholder:text-[#44495a] border-none outline-none flex-1 min-w-0\",\n\t\t\t\t\t\t\t\t\tdynamicReceiveFontClass,\n\t\t\t\t\t\t\t\t\t// isLowBalance\n\t\t\t\t\t\t\t\t\t// \t? \"text-[#ff5252] caret-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t// \t: \"\",\n\t\t\t\t\t\t\t\t\tlayout === \"ltr\" ? \"order-1 \" : \"order-2 \"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdisabled={!toToken}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tonClick={() => setToTokenModalOpen(true)}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"h-[36px] gap-1 rounded-full text-[#f4f4f4] dark:text-[#f4f4f4]\",\n\t\t\t\t\t\t\t\t\ttoToken\n\t\t\t\t\t\t\t\t\t\t? \"!py-[1px] !pl-[8px] !pr-[10px] bg-[#131313] border border-[#393939] hover:bg-[#131313] dark:hover:hover:bg-[#131313]\"\n\t\t\t\t\t\t\t\t\t\t: \"!py-[6px] !pl-[13px] pr-[9px] bg-[#4285f4] hover:bg-[#1266f1] dark:hover:hover:bg-[#1266f1]\",\n\t\t\t\t\t\t\t\t\tlayout === \"ltr\" ? \"order-2\" : \"order-1\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{toToken ? (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<div className=\"size-6 rounded-full overflow-hidden\">\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={toToken.icon}\n\t\t\t\t\t\t\t\t\t\t\t\talt={toToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-full rounded-full object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xl text-[#f4f4f4] leading-[30px] font-medium flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-1 h-3 w-3\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-base text-[#f4f4f4] font-normal\">\n\t\t\t\t\t\t\t\t\t\t\tSelect Token{\" \"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t{toToken && receivedAmount && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-xs text-[#9b9b9b]\"\n\t\t\t\t\t\t\t\t\t\t// layout === \"ltr\"\n\t\t\t\t\t\t\t\t\t\t// \t? \"mr-auto order-1\"\n\t\t\t\t\t\t\t\t\t\t// \t: \"ml-auto order-2\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{formatUSD(receivedAmount, toTokenUsdPrice)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{toToken && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"ml-auto text-sm leading-[21px]\",\n\t\t\t\t\t\t\t\t\t\tNumber(toToken.balance) < 0.01\n\t\t\t\t\t\t\t\t\t\t\t? \"text-[#9b9b9b]\"\n\t\t\t\t\t\t\t\t\t\t\t: // ? \"text-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t  \"text-[#9b9b9b] flex items-center gap-1\"\n\t\t\t\t\t\t\t\t\t\t// layout === \"ltr\"\n\t\t\t\t\t\t\t\t\t\t// \t? \"ml-auto order-2\"\n\t\t\t\t\t\t\t\t\t\t// \t: \"mr-auto order-1\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{formatAmount(\n\t\t\t\t\t\t\t\t\t\ttoToken.balance,\n\t\t\t\t\t\t\t\t\t\tdecimalPrecision\n\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Quote Loading */}\n\t\t\t\t\t{isFetching && (\n\t\t\t\t\t\t<div className=\"bg-muted/10 rounded-lg border border-[#ffffff12] flex items-center gap-2 p-3\">\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faSpinnerThird}\n\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin text-[#9b9b9b]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span className=\"text-sm text-[#9b9b9b]\">\n\t\t\t\t\t\t\t\tFetching best price..\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Conversion Details */}\n\n\t\t\t\t\t{conversion &&\n\t\t\t\t\t\t!isFetching &&\n\t\t\t\t\t\tfromToken &&\n\t\t\t\t\t\ttoToken &&\n\t\t\t\t\t\texchangeAmount && (\n\t\t\t\t\t\t\t<Collapsible\n\t\t\t\t\t\t\t\topen={showTransactionDetails}\n\t\t\t\t\t\t\t\tonOpenChange={setShowTransactionDetails}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"bg-muted/10 rounded-lg border border-[#ffffff12]\">\n\t\t\t\t\t\t\t\t\t<CollapsibleTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<div className=\"p-3 cursor-pointer hover:bg-card/20 transition-colors rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center w-full justify-between text-sm text-[#9b9b9b] leading-[16.8px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t{/* <div className=\"space-y-1\"> */}\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 \">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\" font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t1 {fromToken.symbol} ={\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getExchangeRate().toFixed(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faGasPump}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3 inline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{parseFloat(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testimatedGas\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) < 0.01\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"<$0.01\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `$${parseFloat(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testimatedGas\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  ).toFixed(2)}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 transition-transform duration-200\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t{/* </div> */}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t\t\t\t\t\t<CollapsibleContent>\n\t\t\t\t\t\t\t\t\t\t<div className=\"px-3 pb-3\">\n\t\t\t\t\t\t\t\t\t\t\t<Separator className=\"mb-3 bg-[#ffffff12]\" />\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-3 text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#9b9b9b] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tReceived at least\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#f4f4f4] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatAmount(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treceivedAmount,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdecimalPrecision\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#9b9b9b] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSlippage Tolerance\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#f4f4f4] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/* {slippage} */}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{slippage.toLowerCase() !==\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"auto\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `${slippage}%`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${slippage}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#9b9b9b] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tNetwork fee\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-[#f4f4f4] text-sm leading-[21px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{parseFloat(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testimatedGas\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) < 0.01 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[#4285f4]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tFree\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"line-through\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$0.01\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`$${parseFloat(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testimatedGas\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).toFixed(2)}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</CollapsibleContent>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Collapsible>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Wallet Address Copy Section */}\n\t\t\t\t\t{!isLobbyPage && isEmbeddedWallet && walletAddress && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between p-3 bg-muted/20 rounded-lg border mt-4\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{isEmbeddedWallet\n\t\t\t\t\t\t\t\t\t\t? \"Email Wallet Address\"\n\t\t\t\t\t\t\t\t\t\t: \"Wallet Address\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<code className=\"text-sm font-mono\">\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(0, 6)}...\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(-4)}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<CopyWalletAddressButton\n\t\t\t\t\t\t\t\taddress={walletAddress}\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Main Action Button */}\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handleApproveToken}\n\t\t\t\t\t\tdisabled={isSwapDisabled()}\n\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"w-full h-auto text-[20px] p-4 font-normal leading-[24px] rounded-[16px]\",\n\t\t\t\t\t\t\t\"hover:text-white dark:hover:text-white\",\n\t\t\t\t\t\t\t\"disabled:text-[#9b9b9b] disabled:opacity-100\",\n\t\t\t\t\t\t\t// Check if transaction is being processed first (even if button is disabled)\n\t\t\t\t\t\t\tisLoading || isApproveLoading\n\t\t\t\t\t\t\t\t? \"disabled:bg-[#4285f44d] disabled:hover:bg-[#4285f44d] disabled:text-[#4285f4] disabled:hover:text-[#4285f4] bg-[#4285f44d] hover:bg-[#4285f44d] text-[#4285f4] hover:text-[#4285f4] dark:hover:bg-[#4285f44d] dark:hover:text-[#4285f4] dark:disabled:bg-[#4285f44d] dark:disabled:hover:bg-[#4285f44d] dark:disabled:text-[#4285f4] dark:disabled:hover:text-[#4285f4]\"\n\t\t\t\t\t\t\t\t: !isSwapDisabled()\n\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1] text-white dark:hover:bg-[#1266f1] dark:hover:text-white\"\n\t\t\t\t\t\t\t\t: \"disabled:bg-[#ffffff12] disabled:hover:bg-[#ffffff12] disabled:dark:hover:bg-[#ffffff12] bg-[#ffffff12] hover:bg-[#ffffff12] dark:hover:bg-[#ffffff12]\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isLoading || isApproveLoading ? (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{getSwapButtonText()}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{/* )} */}\n\n\t\t\t\t{/* Token Selection Modals */}\n\t\t\t\t<TokenListModal\n\t\t\t\t\tisOpen={fromTokenModalOpen}\n\t\t\t\t\tonClose={() => setFromTokenModalOpen(false)}\n\t\t\t\t\tshowAllTokens\n\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\tonSelectToken={(token) => {\n\t\t\t\t\t\t// Reset stored amounts when token changes\n\t\t\t\t\t\tsetFullPrecisionAmount(\"\");\n\t\t\t\t\t\tsetFromToken(token as Token);\n\t\t\t\t\t\tsetFromTokenModalOpen(false);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<TokenListModal\n\t\t\t\t\tisOpen={toTokenModalOpen}\n\t\t\t\t\tonClose={() => setToTokenModalOpen(false)}\n\t\t\t\t\tshowAllTokens\n\t\t\t\t\tisSwapPanelModal\n\t\t\t\t\tonSelectToken={(token) => {\n\t\t\t\t\t\tsetToToken(token as Token);\n\t\t\t\t\t\tsetToTokenModalOpen(false);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<SwapConfirmModal\n\t\t\t\t\tisOpen={isConfirmModalOpen}\n\t\t\t\t\tonClose={() => setIsConfirmModalOpen(false)}\n\t\t\t\t\tonConfirm={handleSwapExecution}\n\t\t\t\t\tfromToken={fromToken}\n\t\t\t\t\ttoToken={toToken}\n\t\t\t\t\texchangeAmount={exchangeAmount}\n\t\t\t\t\treceivedAmount={receivedAmount}\n\t\t\t\t\tfromTokenUsdPrice={parseFloat(fromTokenUsdPrice)}\n\t\t\t\t\ttoTokenUsdPrice={parseFloat(toTokenUsdPrice)}\n\t\t\t\t\tslippage={slippage}\n\t\t\t\t\testimatedGas={estimatedGas}\n\t\t\t\t\tgetExchangeRate={() => getExchangeRate().toFixed(6)}\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tisApproveLoading={isApproveLoading}\n\t\t\t\t\tisTokenAllowed={isTokenAllowed}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Separator({\n  className,\n  orientation = \"horizontal\",\n  decorative = true,\n  ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n  return (\n    <SeparatorPrimitive.Root\n      data-slot=\"separator\"\n      decorative={decorative}\n      orientation={orientation}\n      className={cn(\n        \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Popover({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n  return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n  return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n  className,\n  align = \"center\",\n  sideOffset = 4,\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n  return (\n    <PopoverPrimitive.Portal>\n      <PopoverPrimitive.Content\n        data-slot=\"popover-content\"\n        align={align}\n        sideOffset={sideOffset}\n        className={cn(\n          \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n          className\n        )}\n        {...props}\n      />\n    </PopoverPrimitive.Portal>\n  )\n}\n\nfunction PopoverAnchor({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n  return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Collapsible({\n\t...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n\treturn <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTrigger({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n\treturn (\n\t\t<CollapsiblePrimitive.CollapsibleTrigger\n\t\t\tclassName={cn(\n\t\t\t\t\"transition-all duration-200 ease-in-out\",\n\t\t\t\t// \"data-[state=open]:rotate-180\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"collapsible-trigger\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction CollapsibleContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n\treturn (\n\t\t<CollapsiblePrimitive.CollapsibleContent\n\t\t\tclassName={cn(\n\t\t\t\t\"overflow-hidden transition-all duration-300 ease-in-out\",\n\t\t\t\t\"data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"collapsible-content\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","\"use client\";\n\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogFooter,\n\tDialogClose,\n} from \"@/components/ui/dialog\";\nimport { useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaAngleDown,\n\tfaAngleUp,\n\tfaArrowDown,\n\tfaGasPump,\n\tfaSpinner,\n\tfaTimes,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport {\n\tcalculateTokenAmountToUsdAmount,\n\tformatAmount,\n} from \"@/lib/utils/wallet-provider/wallet-provider.utils\";\n\ninterface SwapConfirmModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: () => void;\n\tfromToken: Token | null;\n\ttoToken: Token | null;\n\texchangeAmount: string;\n\treceivedAmount: string;\n\tfromTokenUsdPrice: number;\n\ttoTokenUsdPrice: number;\n\tslippage: string;\n\testimatedGas: string;\n\tgetExchangeRate: () => string;\n\tisLoading: boolean;\n\tisApproveLoading: boolean;\n\tisTokenAllowed: boolean;\n}\n\nexport const SwapConfirmModal = ({\n\tisOpen,\n\tonClose,\n\tonConfirm,\n\tfromToken,\n\ttoToken,\n\texchangeAmount,\n\treceivedAmount,\n\tfromTokenUsdPrice,\n\ttoTokenUsdPrice,\n\t// slippage,\n\testimatedGas,\n\tgetExchangeRate,\n\tisLoading,\n\tisApproveLoading,\n\tisTokenAllowed,\n}: SwapConfirmModalProps) => {\n\tconst [isDetailsOpen, _setIsDetailsOpen] = useState(false);\n\n\tif (!fromToken || !toToken) {\n\t\treturn null;\n\t}\n\n\tconst getButtonText = () => {\n\t\tif (isLoading) return \"Confirm in wallet...\";\n\t\tif (isApproveLoading) return \"Approving...\";\n\t\tif (!isTokenAllowed) return \"Approve and Swap\";\n\t\treturn \"Confirm Swap\";\n\t};\n\n\treturn (\n\t\t<Dialog open={isOpen} onOpenChange={onClose}>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"!bg-[#181a1f] min-w-[400px] !max-w-[442px] border-[0.5px] border-[#ffffff12] rounded-[20px] px-2 pt-[10px] pb-[26px] gap-0 \"\n\t\t\t\tshowCloseButton={false}\n\t\t\t>\n\t\t\t\t{/* Dialog Close Button */}\n\t\t\t\t<div>\n\t\t\t\t\t<DialogClose\n\t\t\t\t\t\tasChild\n\t\t\t\t\t\tclassName=\"absolute top-4 right-4 py-[6px] px-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant={\"cleanX\"}\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tclassName=\"hover:!bg-[#23252b] text-white\"\n\t\t\t\t\t\t\t// style={{ color: \"white\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faTimes}\n\t\t\t\t\t\t\t\tclassName=\"h-4 w-4\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogClose>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"p-4 pb-4.5 flex flex-col gap-[10px]\">\n\t\t\t\t\t{/* You Pay Section */}\n\t\t\t\t\t<div className=\"flex justify-between items-center w-[95%]\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-1 -mt-2\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-[#9b9b9b] leading-[21px] font-[485] pb-[10px]\">\n\t\t\t\t\t\t\t\tYou&apos;re swapping\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"font-normal text-white leading-[44px] text-[36px]\">\n\t\t\t\t\t\t\t\t{formatAmount(exchangeAmount, 6)}{\" \"}\n\t\t\t\t\t\t\t\t{fromToken.symbol}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-sm text-[#5b5b5b] font-[485] leading-[21px]\">\n\t\t\t\t\t\t\t\t{calculateTokenAmountToUsdAmount(\n\t\t\t\t\t\t\t\t\tNumber(exchangeAmount),\n\t\t\t\t\t\t\t\t\tfromTokenUsdPrice\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={fromToken.icon}\n\t\t\t\t\t\t\t\talt={fromToken.symbol}\n\t\t\t\t\t\t\t\tclassName=\"w-8 h-8 rounded-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Down-Arrow */}\n\t\t\t\t\t<div className=\"flex h-[24px]\">\n\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\ticon={faArrowDown}\n\t\t\t\t\t\t\tclassName=\"text-white/80\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* You Receive Section */}\n\t\t\t\t\t<div className=\"flex justify-between items-center w-[95%]\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-[#9b9b9b] leading-[21px]\">\n\t\t\t\t\t\t\t\tYou receive\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"font-normal text-white leading-[44px] text-[36px]\">\n\t\t\t\t\t\t\t\t{formatAmount(receivedAmount, 6)}{\" \"}\n\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-sm text-[#5b5b5b] font-[485] leading-[21px]\">\n\t\t\t\t\t\t\t\t{calculateTokenAmountToUsdAmount(\n\t\t\t\t\t\t\t\t\tNumber(receivedAmount),\n\t\t\t\t\t\t\t\t\ttoTokenUsdPrice\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={toToken.icon}\n\t\t\t\t\t\t\t\talt={toToken.symbol}\n\t\t\t\t\t\t\t\tclassName=\"w-8 h-8 rounded-full\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Show More & Details Section */}\n\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t{/* Show More Button */}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"cleanX\"\n\t\t\t\t\t\t\tonClick={() => _setIsDetailsOpen(!isDetailsOpen)}\n\t\t\t\t\t\t\tclassName=\"w-full flex justify-center !h-[28px] items-center gap-2 text-[#5B5B5B] \"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Separator className=\"bg-white/10 !w-[40%]\" />\n\t\t\t\t\t\t\t<span className=\"text-sm font-[485]box-border \">\n\t\t\t\t\t\t\t\tShow more\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className=\"text-[rgb(255_255_255_/_35%)] space-y-6 w-[17px]\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-around text-[8.5px] -my-[2px]\",\n\t\t\t\t\t\t\t\t\t\tisDetailsOpen ? \"flip\" : \"\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faAngleUp} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-around text-[8.5px] -my-[2px]\",\n\t\t\t\t\t\t\t\t\t\tisDetailsOpen ? \"flip\" : \"\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faAngleDown} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<Separator className=\"bg-white/10 !w-[40%]\" />\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t{/* Details section */}\n\t\t\t\t\t\t<div className=\"space-y-3 pt-[4px] leading-[21px] text-sm\">\n\t\t\t\t\t\t\t{/* Exchange Rate */}\n\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t<span className=\"text-[#5b5b5b]\">Rate</span>\n\t\t\t\t\t\t\t\t<span className=\"text-[#ffffff59]\">\n\t\t\t\t\t\t\t\t\t1 {fromToken.symbol} = {getExchangeRate()}{\" \"}\n\t\t\t\t\t\t\t\t\t{toToken.symbol}{\" \"}\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t($\n\t\t\t\t\t\t\t\t\t\t{(\n\t\t\t\t\t\t\t\t\t\t\tMath.trunc(\n\t\t\t\t\t\t\t\t\t\t\t\tparseFloat(toToken.usd_price) *\n\t\t\t\t\t\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t\t\t\t\t) / 100\n\t\t\t\t\t\t\t\t\t\t).toString()}\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Received At Least */}\n\t\t\t\t\t\t\t{isDetailsOpen && (\n\t\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-[#5b5b5b]\">\n\t\t\t\t\t\t\t\t\t\tReceive at least\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-[#ffffff59]\">\n\t\t\t\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t\t\t\t{parseFloat(receivedAmount).toFixed(\n\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t{toToken.symbol}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Network Cost */}\n\t\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t\t<span className=\"text-[#5b5b5b]\">\n\t\t\t\t\t\t\t\t\tNetwork cost\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"text-[#ffffff59] flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faGasPump} />\n\t\t\t\t\t\t\t\t\t{parseFloat(estimatedGas || \"0\") < 0.01\n\t\t\t\t\t\t\t\t\t\t? \"<$0.01\"\n\t\t\t\t\t\t\t\t\t\t: \"$\" +\n\t\t\t\t\t\t\t\t\t\t  parseFloat(\n\t\t\t\t\t\t\t\t\t\t\t\testimatedGas || \"0\"\n\t\t\t\t\t\t\t\t\t\t  ).toFixed(2)}\n\t\t\t\t\t\t\t\t\t{estimatedGas}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* Show More Button */}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter className=\"px-4\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={onConfirm}\n\t\t\t\t\t\tdisabled={isLoading || isApproveLoading}\n\t\t\t\t\t\tclassName=\"w-full p-4 text-xl h-13 rounded-[16px] leading-[24px] font-[485] bg-[#4285f4] hover:bg-[#1266f1] text-white\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isLoading || isApproveLoading ? (\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\tclassName=\"animate-spin mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{getButtonText()}\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"skeleton\"\n      className={cn(\"bg-accent animate-pulse rounded-md\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Skeleton }\n","import { Skeleton } from \"@/components/ui/skeleton\";\nexport const SwapPanelSkeleton = () => (\n\t<div className=\"p-6\">\n\t\t<Skeleton className=\"w-full h-full\" />\n\t</div>\n);\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaArrowsUpDown,\n\tfaRightLeft,\n\tfaCreditCard,\n\tfaWallet,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { TransactionModalTab } from \"@/store/slices/ui/walletProvider/modal.slice\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\n\ninterface TabsSidebarProps {\n\tactiveTab: TransactionModalTab;\n\tsetActiveTab: (tab: TransactionModalTab) => void;\n}\n\nconst TABS = [\n\t{ id: \"walletInfo\", label: \"walletInfo\", icon: faWallet },\n\t{ id: \"deposit\", label: \"deposit\", icon: faCreditCard },\n\t{ id: \"withdraw\", label: \"withdraw\", icon: faArrowsUpDown },\n\t{ id: \"swap\", label: \"swap\", icon: faRightLeft },\n] as const;\n\nexport const TabsSidebar = ({ activeTab, setActiveTab }: TabsSidebarProps) => {\n\tconst { primaryWallet } = useDynamicContext();\n\treturn (\n\t\t<div className=\"p-3 space-y-2\">\n\t\t\t{TABS.map((tab) => (\n\t\t\t\t<Button\n\t\t\t\t\tkey={tab.id}\n\t\t\t\t\tvariant={activeTab === tab.id ? \"defaultBlue\" : \"ghostBlue\"}\n\t\t\t\t\tonClick={() => setActiveTab(tab.id as TransactionModalTab)}\n\t\t\t\t\tclassName=\"w-full text-white/70 justify-start gap-2 py-6 px-8\"\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={tab.icon} className=\"h-4 w-4\" />\n\t\t\t\t\t{tab.id === \"walletInfo\"\n\t\t\t\t\t\t? primaryWallet?.connector?.isEmbeddedWallet\n\t\t\t\t\t\t\t? \"Email Wallet\"\n\t\t\t\t\t\t\t: \"Wallet\"\n\t\t\t\t\t\t: tab.label}\n\t\t\t\t</Button>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n","\"use client\";\n\nimport { memo, useMemo, useState } from \"react\";\nimport { useTransactionModal } from \"@/hooks/walletProvider/use-transaction-modal\";\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/ui/dialog\";\nimport { Tabs, TabsContent } from \"@/components/ui/tabs\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Button } from \"@/components/ui/button\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faChevronDown } from \"@fortawesome/pro-solid-svg-icons\";\nimport { TabsSidebar } from \"@/components/features/walletProvider/tabs-sidebar\";\nimport { SwapPanel } from \"@/components/features/walletProvider/swap/swap-panel\";\nimport { TransactionPanelWithTabs } from \"@/components/features/walletProvider/transaction-panel-with-tabs\";\nimport { WalletInfoPanel } from \"./wallet/wallet-info-panel\";\nimport { TransactionModalTab } from \"@/store/slices/ui/walletProvider/modal.slice\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\nimport { TipPanel } from \"@/components/features/walletProvider/tip/tip-panel\";\n\ntype DisplayType = \"modal-view\" | \"tabbed-view\";\n\ninterface TransactionModalProps {\n\tdisplayType?: DisplayType;\n\tisLobbyPage?: boolean;\n}\n\ntype AllowedTab = Exclude<TransactionModalTab, \"\">;\n\n// --- Tabbed View (no global modal hooks; local state only) ---\nconst TransactionTabbedView = memo(function TransactionTabbedView({\n\tisLobbyPage = false,\n}: {\n\tisLobbyPage?: boolean;\n}) {\n\tconst { primaryWallet } = useDynamicContext();\n\tconst isEmbeddedWallet = primaryWallet?.connector?.isEmbeddedWallet;\n\tconst [localActiveTab, setLocalActiveTab] = useState<AllowedTab>(\"deposit\");\n\n\tconst tabContent = useMemo(\n\t\t() => ({\n\t\t\twalletInfo: <WalletInfoPanel />,\n\t\t\tdeposit: (\n\t\t\t\t<TransactionPanelWithTabs\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t\twithdraw: (\n\t\t\t\t<TransactionPanelWithTabs\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t\tdefaultTab=\"withdraw\"\n\t\t\t\t/>\n\t\t\t),\n\t\t\ttip: (\n\t\t\t\t<TipPanel\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t\tswap: (\n\t\t\t\t<SwapPanel\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t}),\n\t\t[isEmbeddedWallet, isLobbyPage]\n\t);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={localActiveTab}\n\t\t\tonValueChange={(v) => setLocalActiveTab(v as AllowedTab)}\n\t\t\t// className=\"w-full\"\n\t\t>\n\t\t\t{/* <div className=\"flex items-center justify-between p-4 border-b\">\n\t\t\t\t\t<TabsList\n\t\t\t\t\t\tclassName={`grid w-auto ${\n\t\t\t\t\t\t\tisEmbeddedWallet ? \"grid-cols-4\" : \"grid-cols-3\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isEmbeddedWallet && (\n\t\t\t\t\t\t\t<TabsTrigger value=\"walletInfo\">Wallet</TabsTrigger>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<TabsTrigger value=\"deposit\">Deposit</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"withdraw\">Withdraw</TabsTrigger>\n\t\t\t\t\t\t<TabsTrigger value=\"swap\">Swap</TabsTrigger>\n\t\t\t\t\t</TabsList>\n\t\t\t\t</div> */}\n\t\t\t<div className=\"p-4\">\n\t\t\t\t{Object.entries(tabContent).map(([key, content]) => (\n\t\t\t\t\t<TabsContent key={key} value={key} className=\"mt-0\">\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</TabsContent>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</Tabs>\n\t);\n});\n\n// --- Modal View (keeps global modal hooks + URL sync) ---\nconst TransactionModalView = memo(function TransactionModalView({\n\tisLobbyPage = false,\n}: {\n\tisLobbyPage?: boolean;\n}) {\n\tconst { isOpen, closeModal, activeTab, setActiveTab } =\n\t\tuseTransactionModal();\n\tconst { primaryWallet } = useDynamicContext();\n\tconst isEmbeddedWallet = primaryWallet?.connector?.isEmbeddedWallet;\n\n\tconst tabContent = useMemo(\n\t\t() => ({\n\t\t\twalletInfo: <WalletInfoPanel onNavigate={closeModal} />,\n\t\t\tdeposit: (\n\t\t\t\t<TransactionPanelWithTabs\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t\twithdraw: (\n\t\t\t\t<TransactionPanelWithTabs\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t\tdefaultTab=\"withdraw\"\n\t\t\t\t/>\n\t\t\t),\n\t\t\tswap: (\n\t\t\t\t<SwapPanel\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t\ttip: (\n\t\t\t\t<TipPanel\n\t\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\t/>\n\t\t\t),\n\t\t}),\n\t\t[isEmbeddedWallet, isLobbyPage, closeModal]\n\t);\n\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!open) closeModal();\n\t};\n\n\tconst tabTitles: Record<AllowedTab, string> = {\n\t\twalletInfo: \"Wallet\",\n\t\tdeposit: \"Deposit\",\n\t\twithdraw: \"Withdraw\",\n\t\tswap: \"Swap\",\n\t\ttip: \"Tip\",\n\t};\n\n\treturn (\n\t\t<Dialog open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t<DialogTitle className=\"text-lg font-semibold sr-only\">\n\t\t\t\t{tabTitles[activeTab as AllowedTab]}\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"max-w-[90dvw] sm:!max-w-[80dvw] lg:!max-w-0 lg:min-w-[50dvw] p-0 gap-0 flex flex-col md:flex-row\"\n\t\t\t\tonPointerDownOutside={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div className=\"md:hidden border-b p-4\">\n\t\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tclassName=\"w-fit justify-between\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{activeTab === \"walletInfo\" && isEmbeddedWallet\n\t\t\t\t\t\t\t\t\t? \"Email Wallet\"\n\t\t\t\t\t\t\t\t\t: activeTab === \"walletInfo\"\n\t\t\t\t\t\t\t\t\t? \"Wallet\"\n\t\t\t\t\t\t\t\t\t: activeTab === \"deposit\"\n\t\t\t\t\t\t\t\t\t? \"Deposit\"\n\t\t\t\t\t\t\t\t\t: activeTab === \"withdraw\"\n\t\t\t\t\t\t\t\t\t? \"Withdraw\"\n\t\t\t\t\t\t\t\t\t: activeTab === \"swap\"\n\t\t\t\t\t\t\t\t\t? \"Tip\"\n\t\t\t\t\t\t\t\t\t: activeTab === \"tip\"\n\t\t\t\t\t\t\t\t\t? \"Swap\"\n\t\t\t\t\t\t\t\t\t: \"Wallet\"}\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t\t\t<DropdownMenuContent className=\"w-fit min-w-[200px]\">\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tonClick={() => setActiveTab(\"walletInfo\")}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tactiveTab === \"walletInfo\"\n\t\t\t\t\t\t\t\t\t\t? \"bg-accent\"\n\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isEmbeddedWallet ? \"Email Wallet\" : \"Wallet\"}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tonClick={() => setActiveTab(\"deposit\")}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tactiveTab === \"deposit\" ? \"bg-accent\" : \"\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDeposit\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tonClick={() => setActiveTab(\"withdraw\")}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tactiveTab === \"withdraw\" ? \"bg-accent\" : \"\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tWithdraw\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tonClick={() => setActiveTab(\"tip\")}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tactiveTab === \"tip\" ? \"bg-accent\" : \"\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tTip\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tonClick={() => setActiveTab(\"swap\")}\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tactiveTab === \"swap\" ? \"bg-accent\" : \"\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSwap\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t\t</DropdownMenu>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"hidden md:block md:basis-1/3 md:border-r\">\n\t\t\t\t\t<TabsSidebar\n\t\t\t\t\t\tactiveTab={activeTab as AllowedTab}\n\t\t\t\t\t\tsetActiveTab={setActiveTab}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- Content Area that changes based on the active tab --- */}\n\t\t\t\t<div className=\"md:basis-2/3 p-4 md:p-10 lg:p-12 overflow-y-auto\">\n\t\t\t\t\t{tabContent[activeTab as AllowedTab]}\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n});\n\nexport const TransactionModal = ({\n\tdisplayType = \"tabbed-view\",\n\tisLobbyPage = false,\n}: TransactionModalProps) => {\n\tif (displayType === \"tabbed-view\")\n\t\treturn <TransactionTabbedView isLobbyPage={isLobbyPage} />;\n\treturn <TransactionModalView isLobbyPage={isLobbyPage} />;\n};\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Tabs({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n  return (\n    <TabsPrimitive.Root\n      data-slot=\"tabs\"\n      className={cn(\"flex flex-col gap-2\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      data-slot=\"tabs-list\"\n      className={cn(\n        \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n  return (\n    <TabsPrimitive.Trigger\n      data-slot=\"tabs-trigger\"\n      className={cn(\n        \"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot=\"tabs-content\"\n      className={cn(\"flex-1 outline-none\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { DepositPanel } from \"./deposit/deposit-panel\";\nimport { WithdrawPanel } from \"./withdraw/withdraw-panel\";\nimport { PanelTabSwitcher } from \"./panel-tab-switcher\";\nimport { TipPanel } from \"./tip/tip-panel\";\n\ntype PanelTab = \"deposit\" | \"withdraw\" | \"tip\";\n\ninterface TransactionPanelWithTabsProps {\n\tisLobbyPage?: boolean;\n\tisEmbeddedWallet?: boolean;\n\tdefaultTab?: PanelTab;\n}\n\nexport const TransactionPanelWithTabs = ({\n\tisLobbyPage = false,\n\tisEmbeddedWallet = false,\n\tdefaultTab = \"deposit\",\n}: TransactionPanelWithTabsProps) => {\n\tconst [activeTab, setActiveTab] = useState<PanelTab>(defaultTab);\n\n\tconst tabSwitcher = (\n\t\t<PanelTabSwitcher activeTab={activeTab} onTabChange={setActiveTab} />\n\t);\n\n\tif (activeTab === \"withdraw\") {\n\t\treturn (\n\t\t\t<WithdrawPanel\n\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\ttabSwitcher={tabSwitcher}\n\t\t\t/>\n\t\t);\n\t}\n\tif (activeTab === \"tip\")\n\t\treturn (\n\t\t\t<TipPanel\n\t\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\t\tisLobbyPage={isLobbyPage}\n\t\t\t\ttabSwitcher={tabSwitcher}\n\t\t\t/>\n\t\t);\n\treturn (\n\t\t<DepositPanel\n\t\t\tisLobbyPage={isLobbyPage}\n\t\t\tisEmbeddedWallet={isEmbeddedWallet}\n\t\t\ttabSwitcher={tabSwitcher}\n\t\t/>\n\t);\n};\n","\"use client\";\nimport { useMemo, useEffect, useRef } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Alert, AlertDescription } from \"@/components/ui/alert\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaTriangleExclamation,\n\tfaSpinner,\n\tfaPlus,\n\tfaArrowRotateRight,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { CopyWalletAddressButton } from \"@/components/common/walletProvider/copy-wallet-address-button\";\nimport { useWalletAddress } from \"@/hooks/walletProvider/useWalletAddress\";\nimport { Label } from \"@/components/ui/label\";\nimport { NetworkSelector } from \"@/components/common/walletProvider/network-selector\";\nimport { useWithdraw } from \"@/hooks/walletProvider/withdrawal/useWithdraw\";\nimport { cn } from \"@/lib/utils\";\nimport { useTokenActions } from \"@/hooks/walletProvider/useTokenActions\";\n\ninterface WithdrawPanelProps {\n\tisLobbyPage?: boolean;\n\tisEmbeddedWallet?: boolean;\n\ttabSwitcher?: React.ReactNode;\n}\n\nexport const WithdrawPanel = ({\n\tisLobbyPage = false,\n\tisEmbeddedWallet = false,\n\ttabSwitcher,\n}: WithdrawPanelProps) => {\n\tconst { address: walletAddress } = useWalletAddress();\n\n\t// --- 1. CONNECT TO THE MASTER LOGIC HOOK ---\n\tconst {\n\t\t// State\n\t\twithdrawAmount,\n\t\tselectedToken,\n\t\tfee,\n\t\t// totalPayout,\n\t\tmaxWithdrawAmount,\n\t\tisPending,\n\t\t// timeLeft,\n\t\t// isWithdrawalSuccessful,\n\t\t// withdrawTxHash,\n\t\t// withdrawAddress,\n\t\tisBalanceInsufficient,\n\t\tisBelowMinimum,\n\t\tisNetworkSupported,\n\t\tminWithdrawAmount,\n\t\tisFetchingMinWithdrawAmount,\n\t\t// showSuccessModal,\n\t\tisTransactionLoading,\n\n\t\t// Actions\n\t\thandleAmountChange,\n\t\tsetMaxAmount,\n\t\texecuteWithdraw,\n\t\tresetPage,\n\t\t// setShowingConfetti,\n\t\t// setShowSuccessModal,\n\t\t// UI Helpers\n\t\tgetButtonText,\n\t\tisWithdrawDisabled,\n\t} = useWithdraw();\n\tconst prevPendingStatus = useRef(isPending);\n\n\tuseEffect(() => {\n\t\tif (prevPendingStatus.current && !isPending) {\n\t\t\tresetPage();\n\t\t}\n\t\tprevPendingStatus.current = isPending;\n\t}, [isPending, resetPage]);\n\n\tconst { addTokenToMetamask } = useTokenActions();\n\t// --- 2. ADDITIONAL STATE FOR UI ---\n\t// const [isMaxed, setIsMaxed] = useState(false);\n\t// Local state to store withdraw amount for success modal\n\t// const [successWithdrawAmount, setSuccessWithdrawAmount] = useState(\"\");\n\n\t// --- 3. AUTO-RESET FUNCTIONALITY REMOVED ---\n\t// Let users manually close the success modal instead of auto-resetting\n\n\t// Capture withdraw amount when withdrawal becomes successful\n\t// useEffect(() => {\n\t// \tif (isWithdrawalSuccessful && withdrawAmount) {\n\t// \t\tsetSuccessWithdrawAmount(withdrawAmount);\n\t// \t}\n\t// }, [isWithdrawalSuccessful, withdrawAmount]);\n\n\t// Dynamic font size based on character length (not words since this is numeric input)\n\tconst dynamicFontClass = useMemo(() => {\n\t\tconst textLength = withdrawAmount.length;\n\n\t\tif (textLength > 20) {\n\t\t\treturn \"!text-sm placeholder:text-sm\";\n\t\t}\n\t\tif (textLength > 16) {\n\t\t\t// If length is 18 or more\n\t\t\treturn \"!text-base placeholder:text-base\";\n\t\t}\n\t\t// Smaller font for long inputs\n\t\tif (textLength > 13) {\n\t\t\t// If length is 17 (because >=18 would be caught above)\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\t// Medium font for moderately long inputs\n\t\tif (textLength > 12) {\n\t\t\t// If length is 13, 14, 15, 16\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\tif (textLength > 8) {\n\t\t\t// If length is 9, 10, 11, 12\n\t\t\treturn \"!text-2xl placeholder:text-2xl\";\n\t\t}\n\t\treturn \"!text-[36px] placeholder:text-[36px]\";\n\t}, [withdrawAmount]);\n\n\tconst handleSetMaxAmount = () => {\n\t\tif (selectedToken) {\n\t\t\tsetMaxAmount();\n\t\t\t// setIsMaxed(true);\n\t\t}\n\t};\n\n\tconst handleAmountChangeWrapper = (value: string) => {\n\t\thandleAmountChange(value, minWithdrawAmount);\n\t\t// setIsMaxed(false); // Reset if user changes amount manually\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{/* Main container with dark background and rounded corners matching the image */}\n\t\t\t<div className=\"bg-[#1c1e22] dark:bg-[#1c1e22] p-2 pt-3 w-[90dvw] sm:w-[80dvw] md:w-[60dvw] lg:w-[40dvw] 3xl:w-[30dvw] space-y-[5px] border border-[#ffffff12] dark:border-[#ffffff12] rounded-[24px] shadow-lg\">\n\t\t\t\t{/* <div className=\"bg-[#1c1e22] dark:bg-[#1c1e22] p-2.5 pt-3 w-[90dvw] sm:w-[80dvw] md:w-[60dvw] lg:w-[40dvw] 3xl:w-[30dvw] space-y-[5px] border border-[#ffffff12] dark:border-[#ffffff12] rounded-[24px] shadow-lg\"> */}\n\t\t\t\t{/* --- HEADER --- */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2.5\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{tabSwitcher}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t// setIsMaxed(false);\n\t\t\t\t\t\t\t\tresetPage();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label={\"Reset Form\"}\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#C0C0C0] hover:text-white dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"size-4 opacity-70\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NetworkSelector />\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- MAIN CONTENT --- */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"py-4 px-[16px] space-y-1 min-h-[120px]\",\n\t\t\t\t\t\t\"placeholder:text-muted-foreground bg-[#24262B] dark:bg-[#24262b] rounded-[12px]\",\n\t\t\t\t\t\t\"shadow-xs outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\t\t\t\t\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* \"You Withdraw\" Label */}\n\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t<Label className=\"text-[#9b9b9b] dark:text-[#9b9b9b] text-[14px] font-normal\">\n\t\t\t\t\t\t\tYou Withdraw\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Amount Input with Token Display - Main Section */}\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t{/* Large Amount Input with Token Display Overlay */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\"flex h-full w-full bg-transparent\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\tvalue={withdrawAmount}\n\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\thandleAmountChangeWrapper(e.target.value)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"!p-0 basis-2/3 !bg-transparent !border-none !pr-2 !shadow-none focus-visible:ring-0 placeholder:text-muted-foreground/40 text-white dark:text-white\",\n\t\t\t\t\t\t\t\t\tisBalanceInsufficient || isBelowMinimum\n\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252] caret-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\tdynamicFontClass\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdisabled={!isNetworkSupported}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{/* Token Display - Positioned absolutely on the right */}\n\t\t\t\t\t\t\t<div className=\"flex w-full basis-1/3 justify-end items-center gap-3 !py-1 px-2 rounded-full\">\n\t\t\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={selectedToken.token_icon}\n\t\t\t\t\t\t\t\t\t\talt={selectedToken.token_name}\n\t\t\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className=\"font-medium text-white/70 text-xl\">\n\t\t\t\t\t\t\t\t\t{selectedToken?.token_symbol || (\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-5 opacity-70 animate-spin \"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 hover:bg-muted/50 text-white/50\"\n\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tif (!selectedToken) return;\n\t\t\t\t\t\t\t\t\t\t// Convert WithdrawToken to Token format for addTokenToMetamask\n\t\t\t\t\t\t\t\t\t\tconst tokenForMetamask = {\n\t\t\t\t\t\t\t\t\t\t\tsymbol: selectedToken.token_symbol,\n\t\t\t\t\t\t\t\t\t\t\tname: selectedToken.token_name,\n\t\t\t\t\t\t\t\t\t\t\taddress:\n\t\t\t\t\t\t\t\t\t\t\t\tselectedToken.token_address,\n\t\t\t\t\t\t\t\t\t\t\ticon: selectedToken.token_icon,\n\t\t\t\t\t\t\t\t\t\t\tdecimals: selectedToken.decimals,\n\t\t\t\t\t\t\t\t\t\t\ttags: [],\n\t\t\t\t\t\t\t\t\t\t\tbalance: \"0\",\n\t\t\t\t\t\t\t\t\t\t\tusd_price: \"0\",\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\taddTokenToMetamask(tokenForMetamask);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Add token to MetaMask\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faPlus}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3 opacity-70 hover:opacity-100\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Minimum amount indicator & Balance and Max Button */}\n\t\t\t\t\t\t<div className=\"flex items-center w-full justify-between gap-2\">\n\t\t\t\t\t\t\t{/* Minimum amount indicator */}\n\t\t\t\t\t\t\t<span className=\"text-white dark:text-white opacity-25 dark:opacity-25 italic text-sm\">\n\t\t\t\t\t\t\t\t{isFetchingMinWithdrawAmount ? (\n\t\t\t\t\t\t\t\t\t<span className=\"animate-pulse\">\n\t\t\t\t\t\t\t\t\t\tCalculating...\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\tMin {minWithdrawAmount}{\" \"}\n\t\t\t\t\t\t\t\t\t\t{selectedToken?.token_symbol}\n\t\t\t\t\t\t\t\t\t\t&nbsp; &nbsp;\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xl\">•</span>{\" \"}\n\t\t\t\t\t\t\t\t\t\t&nbsp;&nbsp; Fee: {fee} USDT\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{/* Min {minWithdrawAmount}{\" \"}\n\t\t\t\t\t\t\t\t{selectedToken?.token_symbol} */}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className=\"flex gap-2 text-[#9b9b9b]  dark:text-[#9b9b9b] text-sm items-center\">\n\t\t\t\t\t\t\t\tAvailable:{\" \"}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\t\tisBalanceInsufficient || isBelowMinimum\n\t\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{maxWithdrawAmount.toFixed(2)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\tonClick={handleSetMaxAmount}\n\t\t\t\t\t\t\t\t\tdisabled={!isNetworkSupported}\n\t\t\t\t\t\t\t\t\tclassName={`text-[#4285f4] hover:text-[#4285f4]  hover:opacity-70 p-0 h-auto font-medium`}\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tMax{\" \"}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Error Messages */}\n\t\t\t\t\t\t{/* {(isBalanceInsufficient || isBelowMinimum) && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t{isBalanceInsufficient && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-destructive text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"insufficientBalance\")}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isBelowMinimum && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-destructive text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{t(\"minimumIs\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmin: minWithdrawAmount,\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)} */}\n\n\t\t\t\t\t\t{/* Total Payout Display (equivalent to USD conversion in deposit) */}\n\t\t\t\t\t\t{/* {selectedToken &&\n\t\t\t\t\t\t\t\t\twithdrawAmount &&\n\t\t\t\t\t\t\t\t\ttotalPayout > 0 && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\tTotal Payout:{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t{totalPayout.toFixed(2)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t{selectedToken?.token_symbol}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)} */}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Withdraw Summary (equivalent to additional info in deposit) */}\n\t\t\t\t\t{/* <WithdrawSummary\n\t\t\t\t\t\t\t\ttotalPayout={totalPayout}\n\t\t\t\t\t\t\t\ttokenSymbol={selectedToken?.token_symbol}\n\t\t\t\t\t\t\t/> */}\n\n\t\t\t\t\t{/* Wallet Address Copy Section */}\n\t\t\t\t\t{!isLobbyPage && isEmbeddedWallet && walletAddress && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between p-3 bg-muted/20 rounded-lg border border-border\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{isEmbeddedWallet\n\t\t\t\t\t\t\t\t\t\t? \"Email Wallet Address\"\n\t\t\t\t\t\t\t\t\t\t: \"Wallet Address\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<code className=\"text-sm font-mono\">\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(0, 6)}...\n\t\t\t\t\t\t\t\t\t{walletAddress.slice(-4)}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<CopyWalletAddressButton\n\t\t\t\t\t\t\t\taddress={walletAddress}\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Additional Information */}\n\t\t\t\t\t{/* {selectedToken && (\n\t\t\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/60 text-xs italic\">\n\t\t\t\t\t\t\t\t\t\tRates may vary\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)} */}\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- FOOTER --- */}\n\t\t\t\t<div className=\"pt-0\">\n\t\t\t\t\t{/* Network Not Supported Alert */}\n\t\t\t\t\t{!isNetworkSupported ? (\n\t\t\t\t\t\t<Alert\n\t\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\t\tclassName=\"border-none py-4 bg-transparent flex items-center justify-center gap-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<AlertDescription\n\t\t\t\t\t\t\t\tclassName=\"text-[15px] flex items-center gap-3 leading-[22.5px]\"\n\t\t\t\t\t\t\t\tstyle={{ fontWeight: 400 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FontAwesomeIcon icon={faTriangleExclamation} />\n\t\t\t\t\t\t\t\tWithdrawals are only supported on Arbitrum,\n\t\t\t\t\t\t\t\tPolygon, and BNB\n\t\t\t\t\t\t\t</AlertDescription>\n\t\t\t\t\t\t</Alert>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tonClick={executeWithdraw}\n\t\t\t\t\t\t\tdisabled={isWithdrawDisabled()}\n\t\t\t\t\t\t\tvariant={\"default\"}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t// Base Styles\n\t\t\t\t\t\t\t\t\"w-full h-auto text-[20px] p-4 font-normal rounded-[16px]\",\n\t\t\t\t\t\t\t\t\"hover:text-white dark:hover:text-white\",\n\t\t\t\t\t\t\t\t\"disabled:text-[#9b9b9b4d] dark:disabled:text-[#9b9b9b4d] disabled:opacity-100\",\n\n\t\t\t\t\t\t\t\t// If withdrawal is pending, override to show pending styles\n\t\t\t\t\t\t\t\tisPending\n\t\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t\t: \"disabled:text-[#9b9b9b4d] dark:disabled:text-[#9b9b9b4d] disabled:opacity-100\",\n\n\t\t\t\t\t\t\t\t// Check if transaction is being processed first (even if button is disabled)\n\t\t\t\t\t\t\t\tisTransactionLoading\n\t\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t\t: !isWithdrawDisabled() ||\n\t\t\t\t\t\t\t\t\t  (selectedToken &&\n\t\t\t\t\t\t\t\t\t\t\twithdrawAmount &&\n\t\t\t\t\t\t\t\t\t\t\tparseFloat(withdrawAmount) > 0 &&\n\t\t\t\t\t\t\t\t\t\t\t!isBalanceInsufficient &&\n\t\t\t\t\t\t\t\t\t\t\t!isBelowMinimum)\n\t\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1] text-white dark:hover:text-white dark:hover:bg-[#1266f1]\"\n\t\t\t\t\t\t\t\t\t: \"disabled:bg-[#24262b] dark:disabled:bg-[#24262b] disabled:hover:bg-[#24262b] dark:disabled:hover:bg-[#24262b] bg-[#24262b] dark:bg-[#24262b] hover:bg-[#24262b] dark:hover:bg-[#24262b]\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isTransactionLoading ? (\n\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin mr-2\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{getButtonText()}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst alertVariants = cva(\n\t\"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-card text-card-foreground\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n\t\t\t\twarning:\n\t\t\t\t\t\"text-[#facc15] bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-yellow-400/90\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t}\n);\n\nfunction Alert({\n\tclassName,\n\tvariant,\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"alert\"\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(alertVariants({ variant }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"alert-title\"\n\t\t\tclassName={cn(\n\t\t\t\t\"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction AlertDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"alert-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Alert, AlertTitle, AlertDescription };\n","\"use client\";\n\ntype PanelTab = \"deposit\" | \"withdraw\" | \"tip\";\n\ninterface PanelTabSwitcherProps {\n\tactiveTab: PanelTab;\n\tonTabChange: (tab: PanelTab) => void;\n}\n\nexport const PanelTabSwitcher = ({\n\tactiveTab,\n\tonTabChange,\n}: PanelTabSwitcherProps) => {\n\treturn (\n\t\t<div className=\"flex gap-4 p-1\">\n\t\t\t<button\n\t\t\t\t// variant={activeTab === \"deposit\" ? \"default\" : \"ghost\"}\n\t\t\t\tonClick={() => onTabChange(\"deposit\")}\n\t\t\t\tclassName={`flex items-center gap-2 h-8 text-base text-[#C0C0C0] hover:text-[#fff] ${\n\t\t\t\t\tactiveTab === \"deposit\" ? \"text-[#fff]\" : \"font-normal\"\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\tDeposit\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\tonClick={() => onTabChange(\"withdraw\")}\n\t\t\t\tclassName={`flex items-center gap-2 h-8 text-base text-[#C0C0C0] hover:text-[#fff] ${\n\t\t\t\t\tactiveTab === \"withdraw\" ? \"text-[#fff]\" : \"font-normal\"\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\tWithdraw\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\tonClick={() => onTabChange(\"tip\")}\n\t\t\t\tclassName={`flex items-center gap-2 h-8 text-base text-[#C0C0C0] hover:text-[#fff] ${\n\t\t\t\t\tactiveTab === \"tip\" ? \"text-[#fff]\" : \"font-normal\"\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\tTip\n\t\t\t</button>\n\t\t</div>\n\t);\n};\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaChevronDown,\n\tfaSpinner,\n\tfaLock,\n\tfaArrowRotateRight,\n\tfaInfoCircle,\n} from \"@fortawesome/pro-solid-svg-icons\";\n\nimport { useTip } from \"@/hooks/walletProvider/tip/useTip\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { TokenListModal } from \"@/components/common/walletProvider/token-list-modal\";\nimport { NetworkSelector } from \"@/components/common/walletProvider/network-selector\";\nimport { Token } from \"@/types/blockchain/swap.types\";\nimport { Label } from \"@/components/ui/label\";\nimport { CopyWalletAddressButton } from \"@/components/common/walletProvider/copy-wallet-address-button\";\nimport { useWalletAddress } from \"@/hooks/walletProvider/useWalletAddress\";\nimport { cn } from \"@/lib/utils\";\nimport { TipTransactionPending } from \"./tip-transaction-pending\";\nimport { sanitizeDecimalInput } from \"@/lib/utils\";\n\nexport const TipPanel = ({\n\tisLobbyPage = false,\n\tisEmbeddedWallet = false,\n\ttabSwitcher,\n}: {\n\tisLobbyPage?: boolean;\n\tisEmbeddedWallet?: boolean;\n\ttabSwitcher?: React.ReactNode;\n}) => {\n\tconst { address: walletAddress } = useWalletAddress();\n\n\tconst {\n\t\tselectedToken,\n\t\ttipAmount,\n\t\tisBalanceInsufficient,\n\t\tformattedBalance,\n\t\tisApproved,\n\t\tisLoading,\n\t\tisPending,\n\t\ttransactionHash,\n\t\tminTipAmount,\n\t\tusdEstimate,\n\t\tisFetchingWallet,\n\t\tselectToken,\n\t\thandleAmountChange,\n\t\tsetMaxAmount,\n\t\texecuteTip,\n\t\tresetPage,\n\t\tgetButtonText,\n\t\tisTipDisabled,\n\t} = useTip();\n\n\tconst [isTokenModalOpen, setIsTokenModalOpen] = useState(false);\n\tconst [isNetworkSwitching, setIsNetworkSwitching] = useState(false);\n\n\tconst dynamicFontClass = useMemo(() => {\n\t\tconst textLength = tipAmount.length;\n\n\t\tif (textLength > 20) {\n\t\t\treturn \"!text-sm placeholder:text-sm\";\n\t\t}\n\t\tif (textLength > 16) {\n\t\t\treturn \"!text-base placeholder:text-base\";\n\t\t}\n\t\tif (textLength > 13) {\n\t\t\treturn \"!text-lg placeholder:text-lg\";\n\t\t}\n\t\tif (textLength > 12) {\n\t\t\treturn \"!text-xl placeholder:text-xl\";\n\t\t}\n\t\tif (textLength > 8) {\n\t\t\treturn \"!text-2xl placeholder:text-2xl\";\n\t\t}\n\t\treturn \"!text-[36px] placeholder:text-[36px]\";\n\t}, [tipAmount]);\n\n\tconst handleSetMaxAmount = () => {\n\t\tif (selectedToken) {\n\t\t\tsetMaxAmount();\n\t\t}\n\t};\n\n\tconst handleAmountChangeWrapper = (value: string) => {\n\t\thandleAmountChange(value);\n\t};\n\n\tconst isActionDisabled =\n\t\tisTipDisabled() || isNetworkSwitching || isFetchingWallet;\n\n\treturn (\n\t\t<>\n\t\t\t{/* Main container with dark background and rounded corners matching the image */}\n\t\t\t<div className=\"bg-[#1c1e22] dark:bg-[#1c1e22] p-2 pt-3 w-[90dvw] sm:w-[80dvw] md:w-[60dvw] lg:w-[40dvw] 3xl:w-[30dvw] space-y-[5px] border border-[#ffffff12] dark:border-[#ffffff12] rounded-[24px] shadow-lg\">\n\t\t\t\t{/* --- HEADER --- */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2.5\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{tabSwitcher}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={resetPage}\n\t\t\t\t\t\t\taria-label=\"Reset Form\"\n\t\t\t\t\t\t\tclassName=\"hover:!bg-white/10 text-[#C0C0C0] hover:text-[#fff] dark:hover:text-white dark:hover:!bg-white/10\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"size-full opacity-70\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NetworkSelector\n\t\t\t\t\t\tonSwitchingChange={setIsNetworkSwitching}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{isPending ? (\n\t\t\t\t\t<div className=\"py-4 px-[16px] flex items-center justify-center min-h-[120px]\">\n\t\t\t\t\t\t<TipTransactionPending\n\t\t\t\t\t\t\ttransactionHash={transactionHash}\n\t\t\t\t\t\t\tonSendAnother={resetPage}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* --- MAIN CONTENT --- */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"py-4 px-[16px] space-y-1 min-h-[120px]\",\n\t\t\t\t\t\t\t\t\"placeholder:text-muted-foreground bg-[#24262b] dark:bg-[#24262b] rounded-[12px]\",\n\t\t\t\t\t\t\t\t\"shadow-xs outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\t\t\t\t\t\t\"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n\t\t\t\t\t\t\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* \"You Tip\" Label */}\n\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t<Label className=\"text-[#9b9b9b] dark:text-[#9b9b9b] text-[14px] font-normal\">\n\t\t\t\t\t\t\t\t\tYou Tip\n\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Amount Input with Token Selector - Main Section */}\n\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t{/* Large Amount Input with Token Selector Overlay */}\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex h-full w-full bg-transparent\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"0\"\n\t\t\t\t\t\t\t\t\t\tvalue={tipAmount}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\t\thandleAmountChangeWrapper(\n\t\t\t\t\t\t\t\t\t\t\t\tsanitizeDecimalInput(\n\t\t\t\t\t\t\t\t\t\t\t\t\te.target.value\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"!p-0 w-full !bg-transparent !border-none !pr-2 !shadow-none focus-visible:ring-0 placeholder:text-muted-foreground/40 text-white\",\n\t\t\t\t\t\t\t\t\t\t\tisBalanceInsufficient\n\t\t\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252] caret-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\t\t\tdynamicFontClass\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t!selectedToken || isNetworkSwitching\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t{/* Token Selector - Positioned absolutely on the right */}\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\tsetIsTokenModalOpen(true)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName={`flex items-center gap-2 !py-1 px-2 rounded-full ${\n\t\t\t\t\t\t\t\t\t\t\t!selectedToken\n\t\t\t\t\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1]\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"bg-transparent hover:bg-transparent\"\n\t\t\t\t\t\t\t\t\t\t} text-[#f4f4f4] dark:text-[#f4f4f4] shadow-xs`}\n\t\t\t\t\t\t\t\t\t\tdisabled={isNetworkSwitching}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={selectedToken.icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={selectedToken.symbol}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={24}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-2 text-base\">\n\t\t\t\t\t\t\t\t\t\t\t\t{selectedToken?.symbol\n\t\t\t\t\t\t\t\t\t\t\t\t\t? selectedToken.symbol\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Select Token\"}\n\n\t\t\t\t\t\t\t\t\t\t\t\t{!isApproved &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedToken && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={faLock}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3 w-3 text-yellow-500\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{/* Conditionally render the spinner ONLY on this button */}\n\t\t\t\t\t\t\t\t\t\t{isNetworkSwitching ? (\n\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-5 animate-spin\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\t\ticon={faChevronDown}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"flex items-center w-full justify-between gap-2\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-left text-[#9b9b9b] dark:text-[#9b9b9b] text-xs\">\n\t\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\t\ticon={faInfoCircle}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"mr-1\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\tTips are voluntary and non-refundable.\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Balance and Max Button */}\n\t\t\t\t\t\t\t\t\t{selectedToken && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Minimum amount indicator */}\n\t\t\t\t\t\t\t\t\t\t\t{selectedToken &&\n\t\t\t\t\t\t\t\t\t\t\t\tminTipAmount > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white dark:text-white opacity-25 dark:opacity-25 italic text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMin:{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{minTipAmount.toFixed(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedToken.symbol\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center  gap-2 text-[#9b9b9b] dark:text-[#9b9b9b] text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\tBalance:{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisBalanceInsufficient\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"text-[#ff5252]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{Number(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tformattedBalance\n\t\t\t\t\t\t\t\t\t\t\t\t\t).toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleSetMaxAmount}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!selectedToken}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`text-[#4285f4] hover:text-[#4285f4]/70 p-0 h-auto font-medium`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tMax\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* USD Conversion */}\n\t\t\t\t\t\t\t\t{selectedToken &&\n\t\t\t\t\t\t\t\t\ttipAmount &&\n\t\t\t\t\t\t\t\t\tusdEstimate > 0 && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-left\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-white dark:text-white opacity-25 dark:opacity-25 italic text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t~ ${usdEstimate.toFixed(2)} USD\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Wallet Address Copy Section */}\n\t\t\t\t\t\t\t{!isLobbyPage &&\n\t\t\t\t\t\t\t\tisEmbeddedWallet &&\n\t\t\t\t\t\t\t\twalletAddress && (\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between p-3 bg-muted/20 rounded-lg border border-border\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmail Wallet Address\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<code className=\"text-sm font-mono\">\n\t\t\t\t\t\t\t\t\t\t\t\t{walletAddress.slice(0, 6)}...\n\t\t\t\t\t\t\t\t\t\t\t\t{walletAddress.slice(-4)}\n\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<CopyWalletAddressButton\n\t\t\t\t\t\t\t\t\t\t\taddress={walletAddress}\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* --- FOOTER --- */}\n\t\t\t\t\t\t<div className=\" pt-0\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tonClick={executeTip}\n\t\t\t\t\t\t\t\tdisabled={isActionDisabled}\n\t\t\t\t\t\t\t\tvariant={\"default\"}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"w-full h-auto text-[20px] p-4 font-normal rounded-[16px]\",\n\t\t\t\t\t\t\t\t\t\"hover:text-white dark:hover:text-white\",\n\t\t\t\t\t\t\t\t\tisPending\n\t\t\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t\t\t: \"disabled:text-[#9b9b9b4d] dark:disabled:text-[#9b9b9b4d] disabled:opacity-100\",\n\t\t\t\t\t\t\t\t\tisLoading\n\t\t\t\t\t\t\t\t\t\t? \"disabled:bg-[#2f8af529] disabled:hover:bg-[#2f8af529] disabled:text-[#2f8af5] disabled:hover:text-[#2f8af5] bg-[#2f8af529] hover:bg-[#2f8af529] text-[#2f8af5] hover:text-[#2f8af5] dark:hover:bg-[#2f8af529] dark:hover:text-[#2f8af5] dark:disabled:bg-[#2f8af529] dark:disabled:hover:bg-[#2f8af529] dark:disabled:text-[#2f8af5] dark:disabled:hover:text-[#2f8af5]\"\n\t\t\t\t\t\t\t\t\t\t: (!isActionDisabled &&\n\t\t\t\t\t\t\t\t\t\t\t\t!isNetworkSwitching) ||\n\t\t\t\t\t\t\t\t\t\t  (selectedToken &&\n\t\t\t\t\t\t\t\t\t\t\t\ttipAmount &&\n\t\t\t\t\t\t\t\t\t\t\t\tparseFloat(tipAmount) > 0 &&\n\t\t\t\t\t\t\t\t\t\t\t\t!isBalanceInsufficient &&\n\t\t\t\t\t\t\t\t\t\t\t\t!isNetworkSwitching)\n\t\t\t\t\t\t\t\t\t\t? \"bg-[#4285f4] hover:bg-[#1266f1] text-white dark:hover:text-white dark:hover:bg-[#1266f1]\"\n\t\t\t\t\t\t\t\t\t\t: \"disabled:bg-[#24262b] dark:disabled:bg-[#24262b] disabled:hover:bg-[#24262b] dark:disabled:hover:bg-[#24262b] bg-[#24262b] dark:bg-[#24262b] hover:bg-[#24262b] dark:hover:bg-[#24262b]\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-4 w-4 animate-spin mr-2\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{getButtonText()}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* The separate, full-screen token list modal */}\n\t\t\t<TokenListModal\n\t\t\t\tisOpen={isTokenModalOpen}\n\t\t\t\tonClose={() => setIsTokenModalOpen(false)}\n\t\t\t\tonSelectToken={(token) => {\n\t\t\t\t\tif (token && typeof token === \"object\") {\n\t\t\t\t\t\tif (\"logoURI\" in token && !(\"balance\" in token)) {\n\t\t\t\t\t\t\tconst convertedToken: Token = {\n\t\t\t\t\t\t\t\tsymbol: token.symbol,\n\t\t\t\t\t\t\t\tname: token.name,\n\t\t\t\t\t\t\t\tdecimals: token.decimals,\n\t\t\t\t\t\t\t\taddress: token.address,\n\t\t\t\t\t\t\t\ticon: token.logoURI,\n\t\t\t\t\t\t\t\ttags:\n\t\t\t\t\t\t\t\t\ttoken.tags?.map((tag) =>\n\t\t\t\t\t\t\t\t\t\ttypeof tag === \"string\"\n\t\t\t\t\t\t\t\t\t\t\t? tag\n\t\t\t\t\t\t\t\t\t\t\t: tag.toString()\n\t\t\t\t\t\t\t\t\t) || [],\n\t\t\t\t\t\t\t\tbalance: \"0\",\n\t\t\t\t\t\t\t\tusd_price: \"0\",\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tselectToken(convertedToken);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\"icon\" in token &&\n\t\t\t\t\t\t\t\"balance\" in token &&\n\t\t\t\t\t\t\t\"usd_price\" in token\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tselectToken(token as Token);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetIsTokenModalOpen(false);\n\t\t\t\t}}\n\t\t\t\thideTopSection\n\t\t\t/>\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Loader2, CheckCircle } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { useAppStore } from \"@/store/store\";\nimport { useDynamicContext } from \"@dynamic-labs/sdk-react-core\";\n\ninterface TipTransactionPendingProps {\n\ttransactionHash: string | null;\n\ttimeLeft?: number;\n\tonSendAnother: () => void;\n}\n\nexport const TipTransactionPending = ({\n\ttransactionHash,\n\ttimeLeft = 0,\n\tonSendAnother,\n}: TipTransactionPendingProps) => {\n\tconst tx = useAppStore((state) =>\n\t\tstate.blockchain.transaction.transactions.find(\n\t\t\t(tItem) => tItem.hash === transactionHash\n\t\t)\n\t);\n\n\tconst { primaryWallet } = useDynamicContext();\n\tconst [blockExplorerUrl, setBlockExplorerUrl] = useState<string | null>(\n\t\tnull\n\t);\n\tconst isConfirmed = tx?.status === \"confirmed\";\n\n\tuseEffect(() => {\n\t\tprimaryWallet?.connector\n\t\t\t.getBlockExplorerUrlsForCurrentNetwork()\n\t\t\t.then((urls) => {\n\t\t\t\tif (urls && urls.length > 0) {\n\t\t\t\t\tsetBlockExplorerUrl(urls[0]);\n\t\t\t\t}\n\t\t\t});\n\t}, [primaryWallet]);\n\n\treturn (\n\t\t<div className=\"text-center space-y-4\">\n\t\t\t{isConfirmed ? (\n\t\t\t\t<CheckCircle className=\"mx-auto h-12 w-12 text-green-500\" />\n\t\t\t) : (\n\t\t\t\t<Loader2 className=\"mx-auto h-12 w-12 animate-spin text-primary\" />\n\t\t\t)}\n\n\t\t\t<h4 className=\"font-semibold text-lg\">\n\t\t\t\t{isConfirmed ? \"Tip Confirmed!\" : \"Tip Pending\"}\n\t\t\t</h4>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t{isConfirmed\n\t\t\t\t\t? \"Your tip was delivered successfully.\"\n\t\t\t\t\t: \"Your tip is being confirmed on-chain.\"}\n\t\t\t</p>\n\n\t\t\t{!isConfirmed && timeLeft > 0 && (\n\t\t\t\t<p className=\"text-2xl font-semibold\">{timeLeft}s</p>\n\t\t\t)}\n\n\t\t\t{transactionHash && blockExplorerUrl && (\n\t\t\t\t<a\n\t\t\t\t\thref={`${blockExplorerUrl}/tx/${transactionHash}`}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"text-xs text-primary underline break-all block\"\n\t\t\t\t>\n\t\t\t\t\tView on explorer\n\t\t\t\t</a>\n\t\t\t)}\n\n\t\t\t<Button\n\t\t\t\tonClick={onSendAnother}\n\t\t\t\tvariant=\"link\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName=\"mt-4\"\n\t\t\t>\n\t\t\t\t{isConfirmed ? \"Send another tip\" : \"Send another tip\"}\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card\"\n      className={cn(\n        \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-header\"\n      className={cn(\n        \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-title\"\n      className={cn(\"leading-none font-semibold\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-description\"\n      className={cn(\"text-muted-foreground text-sm\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-action\"\n      className={cn(\n        \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-content\"\n      className={cn(\"px-6\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-footer\"\n      className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Card,\n  CardHeader,\n  CardFooter,\n  CardTitle,\n  CardAction,\n  CardDescription,\n  CardContent,\n}\n","\"use client\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport {\n\tDynamicEmbeddedWidget,\n\tuseDynamicContext,\n} from \"@dynamic-labs/sdk-react-core\";\nimport { ProfileInfoCard } from \"../../profile/profile-info-card\";\n\n/**\n * A beautifully redesigned, feature-rich UI Panel that provides a comprehensive\n * and visually appealing overview of the user's profile information.\n *\n * This component is built exclusively with shadcn/ui components and CSS variables.\n */\nexport const WalletInfoPanel = ({\n\tonNavigate,\n}: {\n\tonNavigate?: () => void;\n}) => {\n\t// --- 1. Get Dependencies from Global Context ---\n\tconst { user, isLoading } = useDynamicAuth();\n\tconst { primaryWallet } = useDynamicContext();\n\n\t// --- 3. Loading State ---\n\tif (isLoading || !user) {\n\t\treturn (\n\t\t\t<div className=\"p-3 sm:p-4 md:p-6 space-y-4 sm:space-y-6\">\n\t\t\t\t<Card className=\"border-none bg-transparent shadow-none\">\n\t\t\t\t\t<CardContent className=\"p-3 sm:p-4 md:p-6\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 sm:gap-4\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-16 w-16 sm:h-20 sm:w-20 rounded-full\" />\n\t\t\t\t\t\t\t<div className=\"space-y-2 flex-grow\">\n\t\t\t\t\t\t\t\t<Skeleton className=\"h-5 sm:h-6 w-3/4\" />\n\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 sm:h-4 w-1/2\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Skeleton className=\"h-8 sm:h-10 w-full mt-4 sm:mt-6\" />\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t\t<Card className=\"border-none bg-transparent shadow-none\">\n\t\t\t\t\t<CardContent className=\"p-3 sm:p-4 md:p-6 space-y-3 sm:space-y-4\">\n\t\t\t\t\t\t<Skeleton className=\"h-20 sm:h-24 w-full\" />\n\t\t\t\t\t\t<div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-14 sm:h-16 w-full\" />\n\t\t\t\t\t\t\t<Skeleton className=\"h-14 sm:h-16 w-full\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// --- 4. Render the UI ---\n\treturn (\n\t\t<>\n\t\t\t{primaryWallet?.connector?.isEmbeddedWallet ? (\n\t\t\t\t<DynamicEmbeddedWidget background=\"with-border\" />\n\t\t\t) : (\n\t\t\t\t<ProfileInfoCard onNavigate={onNavigate} />\n\t\t\t)}\n\t\t</>\n\t);\n};\n","\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { useDynamicAuth } from \"@/hooks/useDynamicAuth\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { ProfileInfoCardSkeleton } from \"./profile-info-card-skeleton\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport {\n\tfaMoneyBills,\n\tfaMoneyFromBracket,\n\tfaCopy,\n} from \"@fortawesome/pro-light-svg-icons\";\nimport { useLocation, useSearchParams } from \"react-router-dom\";\n\nexport function ProfileInfoCard({ onNavigate }: { onNavigate?: () => void }) {\n\tconst { user, accountStatus } = useDynamicAuth();\n\tconst [copiedAddress, setCopiedAddress] = useState(false);\n\tconst pathname = useLocation().pathname;\n\tconst searchParams = useSearchParams();\n\n\t// Track a pending navigation target so we can invoke onNavigate only after it resolves\n\tconst [pendingTarget, setPendingTarget] = useState<string | null>(null);\n\tconst hasCalledCallbackRef = useRef(false);\n\n\t// Do not return early before hooks (to keep hook order stable). Render skeleton conditionally below.\n\n\tconst handleCopyAddress = async () => {\n\t\tif (user?.walletAddress) {\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(user.walletAddress);\n\t\t\t\tsetCopiedAddress(true);\n\t\t\t\ttoast.success(\"Wallet address copied to clipboard!\");\n\t\t\t\tsetTimeout(() => setCopiedAddress(false), 2000);\n\t\t\t} catch {\n\t\t\t\ttoast.error(\"Failed to copy wallet address\");\n\t\t\t}\n\t\t}\n\t};\n\n\tconst getInitials = (name: string) => {\n\t\treturn name\n\t\t\t.split(\" \")\n\t\t\t.map((word) => word.charAt(0))\n\t\t\t.join(\"\")\n\t\t\t.toUpperCase()\n\t\t\t.slice(0, 2);\n\t};\n\n\t// Effect: when the actual router location matches the pending target (path + query), fire onNavigate once\n\tuseEffect(() => {\n\t\tif (!pendingTarget || !onNavigate || hasCalledCallbackRef.current)\n\t\t\treturn;\n\t\tconst [targetPath, targetQuery = \"\"] = pendingTarget.split(\"?\");\n\t\tconst currentQuery = searchParams.toString();\n\t\tconst queriesMatch = targetQuery === \"\" || targetQuery === currentQuery;\n\t\tif (pathname === targetPath && queriesMatch) {\n\t\t\tonNavigate();\n\t\t\thasCalledCallbackRef.current = true;\n\t\t\tsetPendingTarget(null); // cleanup\n\t\t}\n\t}, [pathname, searchParams, pendingTarget, onNavigate]);\n\n\treturn !user ? (\n\t\t<ProfileInfoCardSkeleton />\n\t) : (\n\t\t<div className=\"bg-card/95 backdrop-blur-sm rounded-lg border border-border p-6 space-y-6 shadow-lg hover:shadow-xl transition-all duration-300\">\n\t\t\t{/* User Header */}\n\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<Avatar className=\"h-14 w-14 border-2 border-primary/20 ring-2 ring-primary/10\">\n\t\t\t\t\t\t<AvatarImage src={user.avatar} alt={user.username} />\n\t\t\t\t\t\t<AvatarFallback className=\"text-base font-semibold bg-primary/10 text-primary\">\n\t\t\t\t\t\t\t{getInitials(user.nickname)}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t\t<div className=\"absolute -bottom-1 -right-1 h-4 w-4 bg-primary rounded-full border-2 border-background\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<h2 className=\"text-lg font-semibold text-foreground truncate\">\n\t\t\t\t\t\t{user.nickname}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tclassName=\"mt-1 bg-primary/15 text-primary border-primary/25\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{accountStatus === \"authenticated\"\n\t\t\t\t\t\t\t? user.status\n\t\t\t\t\t\t\t: \"Setting up\"}\n\t\t\t\t\t</Badge>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-right\">\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground uppercase tracking-wide\">\n\t\t\t\t\t\tCurrent Balance\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"text-2xl font-bold text-primary\">\n\t\t\t\t\t\t${user.balance?.toFixed(2) || \"0.00\"}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Stats Cards */}\n\t\t\t<div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n\t\t\t\t<div className=\"bg-muted/30 border border-border rounded-lg p-4\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<div className=\"p-2 bg-primary/10 rounded-lg\">\n\t\t\t\t\t\t\t<FontAwesomeIcon icon={faMoneyFromBracket} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground uppercase tracking-wide\">\n\t\t\t\t\t\t\t\tTotal Deposits\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-lg font-bold text-foreground\">\n\t\t\t\t\t\t\t\t{user.depositTotal || \"0\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"bg-muted/30 border border-border rounded-lg p-4\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<div className=\"p-2 bg-primary/10 rounded-lg\">\n\t\t\t\t\t\t\t<FontAwesomeIcon icon={faMoneyBills} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground uppercase tracking-wide\">\n\t\t\t\t\t\t\t\tTotal Withdrawals\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-lg font-bold text-foreground\">\n\t\t\t\t\t\t\t\t{user.withdrawTotal || \"0\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{user.walletAddress && (\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={handleCopyAddress}\n\t\t\t\t\tclassName=\"h-12 text-muted-foreground hover:text-foreground hover:bg-muted px-3 w-full\"\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\ticon={faCopy}\n\t\t\t\t\t\tclassName={`h-3 w-3 mr-2 ${\n\t\t\t\t\t\t\tcopiedAddress ? \"text-primary\" : \"\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t/>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`font-mono text-sm ${\n\t\t\t\t\t\t\tcopiedAddress ? \"text-primary\" : \"\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{user.walletAddress.slice(0, 8)}...\n\t\t\t\t\t\t{user.walletAddress.slice(-8)}\n\t\t\t\t\t</span>\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n\t\"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\t\toutline:\n\t\t\t\t\t\"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t}\n);\n\nfunction Badge({\n\tclassName,\n\tvariant,\n\tasChild = false,\n\t...props\n}: React.ComponentProps<\"span\"> &\n\tVariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n\tconst Comp = asChild ? Slot : \"span\";\n\n\treturn (\n\t\t<Comp\n\t\t\tdata-slot=\"badge\"\n\t\t\tclassName={cn(badgeVariants({ variant }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n// eslint-disable-next-line\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\nexport const ProfileInfoCardSkeleton = () => {\n\treturn (\n\t\t<div className=\"bg-card/95 backdrop-blur-sm rounded-lg border border-border p-6 space-y-6 shadow-lg\">\n\t\t\t{/* User Header */}\n\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t<Skeleton className=\"h-14 w-14 rounded-full\" />\n\t\t\t\t\t<div className=\"absolute -bottom-1 -right-1 h-4 w-4 bg-muted rounded-full border-2 border-background\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-1 min-w-0 space-y-2\">\n\t\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-right space-y-1\">\n\t\t\t\t\t<Skeleton className=\"h-3 w-24\" />\n\t\t\t\t\t<Skeleton className=\"h-6 w-16\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Stats Cards */}\n\t\t\t<div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n\t\t\t\t{[...Array(2)].map((_, i) => (\n\t\t\t\t\t<div key={i} className=\"bg-muted/30 border border-border rounded-lg p-4 w-full\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-8 w-8 rounded-lg\" />\n\t\t\t\t\t\t\t<div className=\"flex-1 space-y-2\">\n\t\t\t\t\t\t\t\t<Skeleton className=\"h-3\" />\n\t\t\t\t\t\t\t\t<Skeleton className=\"h-3\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t{/* Action Buttons */}\n\t\t\t<div className=\"grid grid-cols-2 gap-3\">\n\t\t\t\t<Skeleton className=\"h-10 w-full rounded-md\" />\n\t\t\t\t<Skeleton className=\"h-10 w-full rounded-md\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"flex gap-3 pt-4\">\n\t\t\t\t<Skeleton className=\"flex-1 h-12 rounded-md w-full\" />\n\t\t\t\t</div>\n\n\t\t\t{/* Secondary Actions */}\n\t\t\t<div className=\"flex gap-3 pt-4 border-t border-border\">\n\t\t\t\t<Skeleton className=\"flex-1 h-12 rounded-md w-full\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Avatar({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n  return (\n    <AvatarPrimitive.Root\n      data-slot=\"avatar\"\n      className={cn(\n        \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction AvatarImage({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n  return (\n    <AvatarPrimitive.Image\n      data-slot=\"avatar-image\"\n      className={cn(\"aspect-square size-full\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n  return (\n    <AvatarPrimitive.Fallback\n      data-slot=\"avatar-fallback\"\n      className={cn(\n        \"bg-muted flex size-full items-center justify-center rounded-full\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\";\n\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\n/**\n * A dedicated, high-fidelity skeleton loader that perfectly mimics the\n * final layout and structure of the main TransactionModal.\n *\n * This is designed to be used as a Suspense fallback to prevent layout\n * shift and provide a smooth loading experience for the user.\n */\nexport const TransactionModalSkeleton = () => {\n\treturn (\n\t\t// We render the Dialog and DialogContent to ensure the modal's\n\t\t// overlay and positioning are identical to the real component.\n\t\t<Dialog open={true}>\n\t\t\t<DialogContent className=\"max-w-4xl h-[70vh] p-0 gap-0 flex\">\n\t\t\t\t{/* --- Skeleton for the Left Sidebar --- */}\n\t\t\t\t<div className=\"w-1/4 border-r p-4 space-y-2\">\n\t\t\t\t\t{/* Mimic the four tab buttons */}\n\t\t\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t\t\t<Skeleton className=\"h-10 w-full\" />\n\t\t\t\t</div>\n\n\t\t\t\t{/* --- Skeleton for the Right Content Area --- */}\n\t\t\t\t{/* This mimics the structure of the DepositPanel as a default */}\n\t\t\t\t<div className=\"w-3/4 flex flex-col\">\n\t\t\t\t\t{/* Header Skeleton */}\n\t\t\t\t\t<div className=\"flex items-center justify-between p-4 border-b\">\n\t\t\t\t\t\t<Skeleton className=\"h-8 w-8 rounded-full\" />\n\t\t\t\t\t\t<Skeleton className=\"h-10 w-[180px] rounded-md\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Body Skeleton */}\n\t\t\t\t\t<div className=\"flex-grow p-6 space-y-6 flex flex-col justify-center\">\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-1/3\" />\n\t\t\t\t\t\t\t<Skeleton className=\"h-16 w-full rounded-md\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-1/3\" />\n\t\t\t\t\t\t\t<Skeleton className=\"h-14 w-full rounded-md\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-2/5\" />\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-1/4\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Footer Skeleton */}\n\t\t\t\t\t<div className=\"p-4 border-t mt-auto\">\n\t\t\t\t\t\t<Skeleton className=\"h-12 w-full rounded-md\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { Skeleton } from \"@/components/ui/skeleton\";\nexport const WalletInfoSkeleton = () => (\n\t<div className=\"p-6\">\n\t\t<Skeleton className=\"w-full h-full\" />\n\t</div>\n);\n","\"use client\";\n\ninterface WithdrawSummaryProps {\n\t// fee: number;\n\ttotalPayout: number;\n\ttokenSymbol?: string;\n}\n\nexport const WithdrawSummary = ({\n\t// fee,\n\ttotalPayout,\n\ttokenSymbol,\n}: WithdrawSummaryProps) => {\n\treturn (\n\t\t<div className=\"space-y-2 rounded-md border bg-muted/50 p-4 text-sm\">\n\t\t\t{/* <div className=\"flex justify-between\">\n\t\t\t\t<span className=\"text-muted-foreground\">Withdrawal Fee (1%)</span>\n\t\t\t\t<span>\n\t\t\t\t\t{fee.toFixed(4)} {tokenSymbol}\n\t\t\t\t</span>\n\t\t\t</div> */}\n\t\t\t<div className=\"flex justify-between font-semibold\">\n\t\t\t\t<span className=\"text-muted-foreground\">You Will Receive </span>\n\t\t\t\t<span>\n\t\t\t\t\t{totalPayout.toFixed(4)} {tokenSymbol}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { Button } from \"@/components/ui/button\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheckCircle, faSpinner } from \"@fortawesome/pro-solid-svg-icons\";\nimport { useBlockExplorerUrl } from \"@/hooks/walletProvider/useBlockExplorerUrl\";\n\ninterface WithdrawTransactionPendingProps {\n\ttransactionHash: string | null;\n\ttimeLeft: number;\n\tisSuccessful: boolean;\n\tonNewWithdrawal: () => void;\n\tsetShowingConfetti: (value: boolean) => void;\n}\n\nexport const WithdrawTransactionPending = ({\n\ttransactionHash,\n\ttimeLeft,\n\tisSuccessful,\n\tonNewWithdrawal,\n\tsetShowingConfetti,\n}: WithdrawTransactionPendingProps) => {\n\tconst { getTransactionUrl } = useBlockExplorerUrl();\n\n\t// This useEffect faithfully triggers the confetti effect on success.\n\tuseEffect(() => {\n\t\tif (isSuccessful) {\n\t\t\tsetShowingConfetti(true);\n\t\t\tconst defaults = {\n\t\t\t\tspread: 360,\n\t\t\t\tticks: 70,\n\t\t\t\tgravity: 0,\n\t\t\t\tdecay: 0.94,\n\t\t\t\tstartVelocity: 30,\n\t\t\t};\n\n\t\t\tconst shoot = () => {\n\t\t\t\tconfetti({\n\t\t\t\t\t...defaults,\n\t\t\t\t\tparticleCount: 50,\n\t\t\t\t\tscalar: 1.2,\n\t\t\t\t\tshapes: [\"star\"],\n\t\t\t\t});\n\t\t\t\tconfetti({\n\t\t\t\t\t...defaults,\n\t\t\t\t\tparticleCount: 70,\n\t\t\t\t\tscalar: 2,\n\t\t\t\t\tshapes: [\"circle\"],\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tshoot(); // Initial confetti burst\n\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tsetShowingConfetti(false);\n\t\t\t\tconfetti.reset(); // Stop the confetti\n\t\t\t}, 2000); // Stop after 2 seconds\n\n\t\t\treturn () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tconfetti.reset(); // Also clear on component unmount\n\t\t\t};\n\t\t}\n\t}, [isSuccessful]); // Added setShowingConfetti to dependency array for correctness\n\n\treturn (\n\t\t<div className=\"text-center space-y-4\">\n\t\t\t{isSuccessful ? (\n\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\ticon={faCheckCircle}\n\t\t\t\t\tclassName=\"mx-auto h-12 w-12 text-green-500\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\ticon={faSpinner}\n\t\t\t\t\tclassName=\"mx-auto h-12 w-12 animate-spin text-primary\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<h4 className=\"font-semibold text-[#f4f4f4] text-lg\">\n\t\t\t\t{isSuccessful\n\t\t\t\t\t? \"Withdrawal Confirmed!\"\n\t\t\t\t\t: \"Transaction Submitted\"}\n\t\t\t</h4>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t{isSuccessful\n\t\t\t\t\t? \"Your funds are on the way.\"\n\t\t\t\t\t: \"Waiting for blockchain confirmation...\"}\n\t\t\t</p>\n\t\t\t{!isSuccessful && transactionHash !== \"manual_approval_pending\" && (\n\t\t\t\t<p className=\"text-2xl text-[#9b9b9b] font-bold\">{timeLeft}s</p>\n\t\t\t)}\n\t\t\t{transactionHash &&\n\t\t\t\ttransactionHash !== \"manual_approval_pending\" &&\n\t\t\t\tgetTransactionUrl(transactionHash) && (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={getTransactionUrl(transactionHash) || \"#\"}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\tclassName=\"text-xs text-[#4285f4] hover:text-[#4285f4]/70 underline break-all block\"\n\t\t\t\t\t>\n\t\t\t\t\t\tView on Explorer\n\t\t\t\t\t</a>\n\t\t\t\t)}\n\t\t\t{transactionHash === \"manual_approval_pending\" && (\n\t\t\t\t<p className=\"text-xs text-[#9b9b9b]\">\n\t\t\t\t\t{\"This withdrawal requires manual approval.\"}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<Button\n\t\t\t\tonClick={onNewWithdrawal}\n\t\t\t\tvariant=\"defaultBlue\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName=\"w-full text-[#f4f4f4] hover:text-[#f4f4f4] bg-[#4285f4] hover:bg-[#1266f1] dark:hover:hover:bg-[#1266f1]\"\n\t\t\t>\n\t\t\t\t{isSuccessful\n\t\t\t\t\t? \"Make Another Withdrawal\"\n\t\t\t\t\t: \"Start a New Withdrawal\"}\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport {\n\tfaDownload,\n\tfaArrowRotateRight,\n\tfaShare,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { useQRCode } from \"next-qrcode\";\nimport {\n\tFacebookShareButton,\n\tTwitterShareButton,\n\tWhatsappShareButton,\n\tTelegramShareButton,\n\tRedditShareButton,\n\tFacebookIcon,\n\tXIcon,\n\tWhatsappIcon,\n\tTelegramIcon,\n\tRedditIcon,\n} from \"react-share\";\nimport { toast } from \"sonner\";\nimport domtoimage from \"dom-to-image\";\ninterface WithdrawalSuccessModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\twithdrawAmount: string;\n\ttokenSymbol: string;\n\ttransactionHash?: string;\n}\n\nexport const WithdrawalSuccessModal = (props: WithdrawalSuccessModalProps) => {\n\tconst { isOpen, onClose, withdrawAmount, tokenSymbol } = props;\n\tconst screenshotRef = useRef<HTMLDivElement>(null);\n\tconst [image, setImage] = useState<Blob | null>(null);\n\tconst [isGeneratingScreenshot, setIsGeneratingScreenshot] = useState(false);\n\tconsole.log(Number(withdrawAmount).toFixed(3));\n\tconst { Image } = useQRCode();\n\tconst shareUrl = \"https://memewin.bet\";\n\tconst shareText = `🎉 Just withdrew ${Number(withdrawAmount).toFixed(\n\t\t3\n\t)} ${tokenSymbol} from Meme Win! 🚀 Join the winning streak at ${shareUrl}`;\n\n\t// Reset state when modal opens/closes\n\tconst handleClose = () => {\n\t\tsetImage(null);\n\t\tonClose();\n\t};\n\n\tconst handleTakeScreenshot = async () => {\n\t\tif (screenshotRef.current) {\n\t\t\tsetIsGeneratingScreenshot(true);\n\t\t\ttry {\n\t\t\t\tconst imageData = await domtoimage.toBlob(\n\t\t\t\t\tscreenshotRef.current,\n\t\t\t\t\t{\n\t\t\t\t\t\tquality: 1.0,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tsetImage(imageData);\n\t\t\t\tconst link = document.createElement(\"a\");\n\t\t\t\tlink.download = `meme-win-success-${Date.now()}.png`;\n\t\t\t\tlink.href = URL.createObjectURL(imageData);\n\t\t\t\tlink.click();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Screenshot failed:\", error);\n\t\t\t\ttoast.error(\n\t\t\t\t\t\"Screenshot failed. Please try again or use a different browser.\"\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetIsGeneratingScreenshot(false);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleNativeShare = async () => {\n\t\t// Check if navigator.share is available and supported\n\t\tif (typeof navigator !== \"undefined\" && navigator.share) {\n\t\t\ttry {\n\t\t\t\tawait navigator.share({\n\t\t\t\t\ttitle: shareText,\n\t\t\t\t\turl: shareUrl,\n\t\t\t\t\t...(image && { files: [image as File] }),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Native share failed:\", error);\n\t\t\t\t// Fallback to copying to clipboard\n\t\t\t\thandleFallbackShare();\n\t\t\t}\n\t\t} else {\n\t\t\t// Fallback for browsers that don't support navigator.share\n\t\t\thandleFallbackShare();\n\t\t}\n\t};\n\n\tconst handleFallbackShare = async () => {\n\t\ttry {\n\t\t\tif (typeof navigator !== \"undefined\" && navigator.clipboard) {\n\t\t\t\tawait navigator.clipboard.writeText(`${shareText} ${shareUrl}`);\n\t\t\t\ttoast.success(\"Share Link Copied successfully\");\n\t\t\t} else {\n\t\t\t\t// Fallback for older browsers\n\t\t\t\tconst textArea = document.createElement(\"textarea\");\n\t\t\t\ttextArea.value = `${shareText} ${shareUrl}`;\n\t\t\t\tdocument.body.appendChild(textArea);\n\t\t\t\ttextArea.select();\n\t\t\t\tdocument.execCommand(\"copy\");\n\t\t\t\tdocument.body.removeChild(textArea);\n\t\t\t\ttoast.success(\"Share Link Copied successfully\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Clipboard copy failed:\", error);\n\t\t\ttoast.error(\"Share failed. Please try again.\");\n\t\t}\n\t};\n\n\treturn (\n\t\t<Dialog open={isOpen} onOpenChange={handleClose}>\n\t\t\t<DialogContent\n\t\t\t\tclassName=\"mx-auto gap-0 max-w-[90dvw] sm:!max-w-[80dvw] lg:!max-w-0 lg:min-w-[50dvw] p-0 bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 border-none overflow-hidden\"\n\t\t\t\tonPointerDownOutside={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Screenshot Content */}\n\t\t\t\t<div\n\t\t\t\t\tref={screenshotRef}\n\t\t\t\t\tclassName=\"relative bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 text-white\"\n\t\t\t\t>\n\t\t\t\t\t{/* Custom Background Image Overlay */}\n\t\t\t\t\t<div className=\"relative h-90 w-full\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t// ref={screenshotRef}\n\t\t\t\t\t\t\tsrc=\"/assets/banners/withdraw/share.png\"\n\t\t\t\t\t\t\talt=\"Success Background\"\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 h-90 aspect-video bg-top w-full opacity-60 select-none\"\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<div className=\"absolute bottom-12 right-5 gap-8 flex flex-col md:flex-row items-end md:items-start justify-between\">\n\t\t\t\t\t\t\t<div className=\"flex flex-col gap-2 justify-stretch \">\n\t\t\t\t\t\t\t\t{/* Center Column - Main Content */}\n\t\t\t\t\t\t\t\t<div className=\"space-y-1 text-center\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"lg:text-xl 2xl:text-3xl font-black text-white drop-shadow-lg\">\n\t\t\t\t\t\t\t\t\t\tWithdrawal Successful!\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t<p className=\"text-[10px] max-w-3xs font-bold text-primary drop-shadow-lg text-shadow-gray-700 text-shadow-sm\">\n\t\t\t\t\t\t\t\t\t\t{`🎉 Just withdrew ${Number(\n\t\t\t\t\t\t\t\t\t\t\twithdrawAmount\n\t\t\t\t\t\t\t\t\t\t).toFixed(\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t)} ${tokenSymbol} from Meme Win! 🚀 Join the winning streak at ${shareUrl}`}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/* withdraw amount */}\n\t\t\t\t\t\t\t\t<div className=\"bg-black/30 basis-1/2 backdrop-blur-xl rounded-xl p-3 \">\n\t\t\t\t\t\t\t\t\t<div className=\"text-center space-y-1\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-2xl font-black text-green-400 drop-shadow-lg\">\n\t\t\t\t\t\t\t\t\t\t\t{Number(withdrawAmount).toFixed(3)}{\" \"}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-bold text-white\">\n\t\t\t\t\t\t\t\t\t\t\t\t{tokenSymbol}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* qr-code box */}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"bg-white p-1 w-fit rounded-lg shadow-lg\"\n\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\taria-label=\"QR Code for sharing\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\t\ttext={shareUrl}\n\t\t\t\t\t\t\t\t\toptions={{\n\t\t\t\t\t\t\t\t\t\ttype: \"canvas\",\n\t\t\t\t\t\t\t\t\t\twidth: 120,\n\t\t\t\t\t\t\t\t\t\tmargin: 1,\n\t\t\t\t\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\t\t\t\t\tdark: \"#4267b2\",\n\t\t\t\t\t\t\t\t\t\t\tlight: \"#ffffff\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tquality: 1,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Bottom Banner */}\n\t\t\t\t\t\t<div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-r from-yellow-400 to-orange-500 h-8 flex items-center justify-center\">\n\t\t\t\t\t\t\t<p className=\"text-black font-black text-sm animate-pulse\">\n\t\t\t\t\t\t\t\t🚀 JOIN THE WINNING STREAK! 🚀\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Action Panel */}\n\t\t\t\t{/* Screenshot Button */}\n\t\t\t\t<Button\n\t\t\t\t\tonClick={handleTakeScreenshot}\n\t\t\t\t\tdisabled={isGeneratingScreenshot}\n\t\t\t\t\tclassName=\"mt-4 mx-auto bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 font-bold\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t>\n\t\t\t\t\t{isGeneratingScreenshot ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faArrowRotateRight}\n\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 animate-spin mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tGenerating...\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faDownload}\n\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tDownload Image\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\n\t\t\t\t{/* Social Share Buttons */}\n\t\t\t\t<div className=\"space-y-3 p-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-center space-x-2\">\n\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\ticon={faShare}\n\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-white/60\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"text-sm text-white/80 font-medium\">\n\t\t\t\t\t\t\tShare\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Share Buttons  */}\n\t\t\t\t\t<div className=\"grid grid-rows-2 grid-cols-2 md:grid-cols-3 gap-4\">\n\t\t\t\t\t\t<TwitterShareButton\n\t\t\t\t\t\t\turl={shareUrl}\n\t\t\t\t\t\t\ttitle={shareText}\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-center p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\">\n\t\t\t\t\t\t\t\t<XIcon size={24} round />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-white/80 mt-1\">\n\t\t\t\t\t\t\t\t\tX\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TwitterShareButton>\n\n\t\t\t\t\t\t<FacebookShareButton\n\t\t\t\t\t\t\turl={shareUrl}\n\t\t\t\t\t\t\thashtag=\"#LMemeWin\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-center p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\">\n\t\t\t\t\t\t\t\t<FacebookIcon size={24} round />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-white/80 mt-1\">\n\t\t\t\t\t\t\t\t\tFacebook\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</FacebookShareButton>\n\n\t\t\t\t\t\t<WhatsappShareButton\n\t\t\t\t\t\t\turl={shareUrl}\n\t\t\t\t\t\t\ttitle={shareText}\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-center p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\">\n\t\t\t\t\t\t\t\t<WhatsappIcon size={24} round />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-white/80 mt-1\">\n\t\t\t\t\t\t\t\t\tWhatsApp\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</WhatsappShareButton>\n\n\t\t\t\t\t\t<TelegramShareButton\n\t\t\t\t\t\t\turl={shareUrl}\n\t\t\t\t\t\t\ttitle={shareText}\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-center p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\">\n\t\t\t\t\t\t\t\t<TelegramIcon size={24} round />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-white/80 mt-1\">\n\t\t\t\t\t\t\t\t\tTelegram\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TelegramShareButton>\n\n\t\t\t\t\t\t<RedditShareButton\n\t\t\t\t\t\t\turl={shareUrl}\n\t\t\t\t\t\t\ttitle={shareText}\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex flex-col items-center p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\">\n\t\t\t\t\t\t\t\t<RedditIcon size={24} round />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-white/80 mt-1\">\n\t\t\t\t\t\t\t\t\tReddit\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</RedditShareButton>\n\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tonClick={handleNativeShare}\n\t\t\t\t\t\t\tclassName=\" h-full p-2 bg-black/20 rounded-lg hover:bg-black/40 transition-all\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FontAwesomeIcon\n\t\t\t\t\t\t\t\ticon={faShare}\n\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 mr-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tShare\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n"],"mappings":"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","names":["AuthContext","import_react","import_sdk_react_core","url","config","value","initialState","TransactionStatus","TransactionType","getInitialState","initialState","import_react","import_react","withNativeArrayBuffer","isBinary","on","decode","_a","value","decode","protocol","protocol","withNativeArrayBuffer","isView","withNativeBlob","protocol","PacketType","value","RESERVED_EVENTS","Socket","self","self","Socket","socket","lookup","Socket","config","lookup","import_react","sdkConfig","value","import_react","location","import_react","import_sdk_react_core","import_react","value","import_react","import_sdk_react_core","import_react","import_react","import_sdk_react_core","url","config","spenderAddress","hash","rate","calculatedToAmount","import_sdk_react_core","import_react","import_sdk_react_core","import_jsx_runtime","sdkConfig","value","import_react","import_sonner","import_react","import_react","value","parts","value","import_react","import_react","import_sonner","import_react","import_sonner","import_sdk_react_core","spenderAddress","confetti","import_react","import_react","value","parts","import_react","import_react","import_react","import_react","import_sdk_react_core","import_react","import_react","import_sonner","import_react","import_sdk_react_core","import_react","import_sonner","value","parts","import_react","import_react","import_sonner","import_canvas_confetti","import_sdk_react_core","import_ethers","confetti","value","import_react","import_sonner","import_react","value","import_react","import_sonner","import_sdk_react_core","import_canvas_confetti","confetti","import_react","AuthContext","import_sonner","import_jsx_runtime","Sonner","import_jsx_runtime","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_react","import_react","import_jsx_runtime","import_jsx_runtime","CommandPrimitive","CommandPrimitive","CommandPrimitive","import_react","import_lucide_react","import_jsx_runtime","import_sdk_react_core","import_sonner","import_jsx_runtime","connector","import_react_fontawesome","import_pro_solid_svg_icons","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_jsx_runtime","import_jsx_runtime","Label","import_react","import_lucide_react","import_sonner","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","value","Label","import_react","import_lucide_react","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_sonner","import_jsx_runtime","url","QRCode","NetworkSelector","import_react_fontawesome","import_pro_solid_svg_icons","import_sdk_react_core","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Separator","import_sonner","import_canvas_confetti","import_react_fontawesome","import_pro_light_svg_icons","import_pro_solid_svg_icons","import_jsx_runtime","import_jsx_runtime","CollapsibleTrigger","CollapsibleContent","import_react","import_react_fontawesome","import_pro_solid_svg_icons","import_jsx_runtime","Separator","import_jsx_runtime","value","parts","confetti","Label","Separator","CollapsibleTrigger","CollapsibleContent","import_jsx_runtime","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_sdk_react_core","import_jsx_runtime","import_react","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_react","import_react","import_class_variance_authority","import_jsx_runtime","import_react_fontawesome","import_pro_solid_svg_icons","import_jsx_runtime","value","Label","import_jsx_runtime","import_react","import_react_fontawesome","import_pro_solid_svg_icons","import_react","import_lucide_react","import_sdk_react_core","import_jsx_runtime","import_jsx_runtime","value","Label","import_jsx_runtime","import_jsx_runtime","import_sdk_react_core","import_react","import_sonner","import_react_slot","import_class_variance_authority","import_jsx_runtime","import_react_fontawesome","import_jsx_runtime","import_jsx_runtime","import_pro_light_svg_icons","import_react_router_dom","import_jsx_runtime","import_jsx_runtime","import_sdk_react_core","import_jsx_runtime","TransactionTabbedView","TransactionModalView","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_canvas_confetti","import_react_fontawesome","import_pro_solid_svg_icons","import_jsx_runtime","confetti","import_react","import_react_fontawesome","import_pro_solid_svg_icons","import_sonner","import_jsx_runtime","Image","domtoimage"]}