@cofhe/react 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -8
- package/dist/chunk-3YAGCPSA.cjs +5630 -0
- package/dist/chunk-3YAGCPSA.cjs.map +1 -0
- package/dist/chunk-N3S7TQY6.js +5630 -0
- package/dist/chunk-N3S7TQY6.js.map +1 -0
- package/dist/index.cjs +4 -10968
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -315
- package/dist/index.d.ts +7 -315
- package/dist/index.js +56 -10973
- package/dist/index.js.map +1 -1
- package/dist/types-BzYdBjL5.d.cts +234 -0
- package/dist/types-BzYdBjL5.d.ts +234 -0
- package/dist/ui-base.cjs +5543 -0
- package/dist/ui-base.cjs.map +1 -0
- package/dist/ui-base.d.cts +86 -0
- package/dist/ui-base.d.ts +86 -0
- package/dist/ui-base.js +5543 -0
- package/dist/ui-base.js.map +1 -0
- package/dist/ui.cjs +2 -0
- package/dist/ui.js +2 -0
- package/package.json +14 -7
- package/dist/index.css +0 -2051
- package/dist/index.css.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/debounce.ts","../src/components/Icons.tsx","../src/components/CofheFloatingButton/CofheFloatingButtonContext.tsx","../src/hooks/useTrackPendingTransactions.ts","../src/hooks/usePendingTransactions.ts","../src/hooks/useTrackDecryptingTransactions.ts","../src/hooks/useCofheReadDecryptionResults.ts","../src/hooks/useWatchPermitStatus.ts","../src/hooks/useWatchClaimablesStatus.ts","../src/hooks/useCofheClaimableTokens.ts","../src/components/FhenixLogoIcon.tsx","../src/components/CofheFloatingButton/FloatingButtonComponent.tsx","../src/components/CofheFloatingButton/StatusBarSection.tsx","../src/components/CofheFloatingButton/StatusBarContent.tsx","../src/components/primitives/AnimatedZStack.tsx","../src/components/CofheFloatingButton/ContentSection.tsx","../src/components/CofheFloatingButton/pages/MainPage/WalletHeader.tsx","../src/components/CofheFloatingButton/components/AddressButton.tsx","../src/components/CofheFloatingButton/components/ConnectedChainIndicator.tsx","../src/assets/chains/11155111.svg","../src/assets/chains/84532.svg","../src/components/CofheFloatingButton/components/ChainIcon.tsx","../src/components/CofheFloatingButton/components/TokenIcon.tsx","../src/components/CofheFloatingButton/components/LoadingDots.tsx","../src/components/CofheFloatingButton/components/TokenBalanceView.tsx","../src/components/CofheFloatingButton/components/CofheTokenConfidentialBalance.tsx","../src/hooks/useCofhePinnedTokenAddress.ts","../src/hooks/useCofhePinnedToken.ts","../src/components/CofheFloatingButton/pages/MainPage/AssetCard.tsx","../src/components/CofheFloatingButton/pages/MainPage/BottomNavigation.tsx","../src/components/CofheFloatingButton/components/ActionButton.tsx","../src/components/CofheFloatingButton/components/AmountInput.tsx","../src/components/CofheFloatingButton/components/Button.tsx","../src/components/CofheFloatingButton/components/TokenPriceChart.tsx","../src/components/CofheFloatingButton/components/PageContainer.tsx","../src/components/CofheFloatingButton/components/TransactionItem.tsx","../src/utils/isProduction.ts","../src/components/CofheFloatingButton/pages/MainPage.tsx","../src/components/CofheFloatingButton/stores/settingsStore.ts","../src/components/CofheFloatingButton/pages/SettingsPage.tsx","../src/components/CofheFloatingButton/pages/permits/PermitsListPage/index.tsx","../src/components/CofheFloatingButton/Accordion.tsx","../src/components/CofheFloatingButton/pages/permits/components/PermitItem.tsx","../src/components/CofheFloatingButton/modals/InfoModalButton.tsx","../src/components/CofheFloatingButton/components/PermitCard.tsx","../src/components/StripedBackground.tsx","../src/assets/fhenix-permit-icon.svg","../src/components/CofheFloatingButton/pages/permits/components/NameSection.tsx","../src/components/CofheFloatingButton/pages/permits/components/ExpirySection.tsx","../src/components/CofheFloatingButton/pages/permits/GeneratePermitPage/index.tsx","../src/components/CofheFloatingButton/pages/permits/components/ReceiverSection.tsx","../src/components/CofheFloatingButton/pages/permits/DelegatePermitPage/index.tsx","../src/assets/fhenix-permit-receive.svg","../src/components/CofheFloatingButton/pages/permits/ImportPermitPage/index.tsx","../src/components/CofheFloatingButton/pages/TokenInfoPage.tsx","../src/components/CofheFloatingButton/pages/TokenInfoBalanceChart.tsx","../src/components/CofheFloatingButton/pages/TokenInfoTransactionHistory.tsx","../src/components/CofheFloatingButton/pages/SendPage.tsx","../src/components/CofheFloatingButton/pages/ShieldPageV2.tsx","../src/hooks/useIsUnshieldingMining.ts","../src/components/CofheFloatingButton/pages/ActivityPage.tsx","../src/components/CofheFloatingButton/pages/DebugPage.tsx","../src/components/CofheFloatingButton/components/TokenRow.tsx","../src/components/CofheFloatingButton/modals/AddCustomTokenButton.tsx","../src/components/CofheFloatingButton/modals/TokenListModal.tsx","../src/components/CofheFloatingButton/pages/PortfolioPage.tsx","../src/components/CofheFloatingButton/pages/ClaimableTokens.tsx","../src/components/CofheFloatingButton/pagesConfig/const.ts","../src/components/CofheFloatingButton/modals/ExampleSelectionPage.tsx","../src/components/CofheFloatingButton/modals/ExampleInfoPage.tsx","../src/components/CofheFloatingButton/modals/PermitDetailsModal.tsx","../src/components/CofheFloatingButton/modals/BaseInfoModal.tsx","../src/components/CofheFloatingButton/modals/PermitTypeInfoModal.tsx","../src/components/CofheFloatingButton/modals/PermitInfoModal.tsx","../src/components/CofheFloatingButton/modals/ImportCustomTokenCard.tsx","../src/components/CofheFloatingButton/modals/ImportCustomTokenModal.tsx","../src/components/CofheFloatingButton/modals/index.ts","../src/components/CofheFloatingButton/ToastsSection.tsx","../src/components/CofheFloatingButton/CofheFloatingButtonBase.tsx","../src/components/CofheFloatingButton/CofheFloatingButton.tsx","../src/components/CofheEncryptInput.tsx"],"sourcesContent":["/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","import type { CSSProperties, SVGProps } from 'react';\nimport {\n MdArrowBack,\n MdCheck,\n MdClose,\n MdContentCopy,\n MdKeyboardArrowDown,\n MdKeyboardArrowRight,\n MdLock,\n MdPublic,\n MdSecurity,\n} from 'react-icons/md';\nimport type { IconType } from 'react-icons';\n\ntype MaterialFontSize = 'inherit' | 'small' | 'medium' | 'large';\n\ntype MaterialIconProps = Omit<SVGProps<SVGSVGElement>, 'ref'> & {\n sx?: CSSProperties;\n fontSize?: MaterialFontSize;\n};\n\nconst fontSizeMap: Record<MaterialFontSize, string | number> = {\n inherit: '1em',\n small: 20,\n medium: 24,\n large: 35,\n};\n\nconst createMaterialIcon = (Component: IconType) => {\n const MaterialIcon = ({ sx, fontSize = 'medium', style, ...props }: MaterialIconProps) => {\n const mergedStyle = {\n fontSize: fontSizeMap[fontSize],\n ...sx,\n ...style,\n } satisfies CSSProperties;\n\n return <Component {...props} style={mergedStyle} />;\n };\n\n return MaterialIcon;\n};\n\nexport const ArrowBackIcon = createMaterialIcon(MdArrowBack);\nexport const CheckIcon = createMaterialIcon(MdCheck);\nexport const CloseIcon = createMaterialIcon(MdClose);\nexport const ContentCopyIcon = createMaterialIcon(MdContentCopy);\nexport const KeyboardArrowDownIcon = createMaterialIcon(MdKeyboardArrowDown);\nexport const KeyboardArrowRightIcon = createMaterialIcon(MdKeyboardArrowRight);\nexport const LockIcon = createMaterialIcon(MdLock);\nexport const PublicIcon = createMaterialIcon(MdPublic);\nexport const SecurityIcon = createMaterialIcon(MdSecurity);\n","import { type ReactNode, createContext, useContext } from 'react';\nimport type { FloatingButtonPosition } from './types';\nimport { useCofheContext } from '../../providers';\nimport { useTrackPendingTransactions } from '@/hooks/useTrackPendingTransactions';\nimport { useTrackDecryptingTransactions } from '@/hooks/useTrackDecryptingTransactions';\nimport { useWatchPermitStatus } from '@/hooks/useWatchPermitStatus';\nimport { useWatchClaimablesStatus } from '@/hooks/useWatchClaimablesStatus';\n\nexport type TokenListMode = 'view' | 'select';\n\ninterface CofheFloatingButtonContextValue {\n theme: 'dark' | 'light';\n effectivePosition: FloatingButtonPosition;\n isLeftSide: boolean;\n isTopSide: boolean;\n}\n\nconst CofheFloatingButtonContext = createContext<CofheFloatingButtonContextValue | null>(null);\n\ninterface CofheFloatingButtonProviderProps {\n children?: ReactNode;\n}\n\nexport const CofheFloatingButtonProvider: React.FC<CofheFloatingButtonProviderProps> = ({ children }) => {\n const { state } = useCofheContext();\n\n const theme = state.theme;\n const effectivePosition = state.position;\n const isLeftSide = effectivePosition.includes('left');\n const isTopSide = effectivePosition.includes('top');\n\n useTrackPendingTransactions();\n useTrackDecryptingTransactions();\n useWatchPermitStatus();\n useWatchClaimablesStatus();\n\n return (\n <CofheFloatingButtonContext.Provider\n value={{\n theme,\n effectivePosition,\n isLeftSide,\n isTopSide,\n }}\n >\n {children}\n </CofheFloatingButtonContext.Provider>\n );\n};\n\nexport const useCofheFloatingButtonContext = (): CofheFloatingButtonContextValue => {\n const context = useContext(CofheFloatingButtonContext);\n if (!context) {\n throw new Error('useCofheFloatingButtonContext must be used within CofheFloatingButtonProvider');\n }\n return context;\n};\n","import {\n TransactionActionType,\n TransactionStatus,\n useTransactionStore,\n type Transaction,\n} from '@/stores/transactionStore';\nimport { useCofhePublicClient } from './useCofheConnection';\nimport { useInternalQueries, useInternalQueryClient } from '@/providers';\nimport { assert } from 'ts-essentials';\nimport { constructCofheReadContractQueryForInvalidation } from './useCofheReadContract';\nimport { QueryClient, type QueriesOptions } from '@tanstack/react-query';\nimport type { Address, TransactionReceipt } from 'viem';\nimport { getTokenContractConfig } from '@/constants/confidentialTokenABIs';\nimport { ETH_ADDRESS_LOWERCASE, type Token } from './useCofheTokenLists';\nimport { constructPublicTokenBalanceQueryKeyForInvalidation } from './useCofheTokenPublicBalance';\nimport { constructUnshieldClaimsQueryKeyForInvalidation, invalidateClaimableQueries } from './useCofheTokenClaimable';\nimport { constructTokenAllowanceQueryKeyForInvalidation } from './useTokenAllowance';\nimport { usePendingTransactions } from './usePendingTransactions';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\nimport { useEffect, useRef } from 'react';\nimport { cofheLogger } from '@/utils/debug';\n\nfunction invalidateConfidentialTokenBalanceQueries(token: Token, queryClient: QueryClient) {\n const tokenBalanceQueryKey = constructCofheReadContractQueryForInvalidation({\n cofheChainId: token.chainId,\n address: token.address,\n functionName: getTokenContractConfig(token.extensions.fhenix.confidentialityType).functionName,\n });\n\n cofheLogger.log('Invalidating shield/send read contract queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n // TODO: it can potentially invalidate irrelevenat queries who happen to belong to the same contract but different function. Not sure if worth fixing\n exact: false,\n });\n}\n\nfunction invalidatePublicTokenBalanceQueries(\n {\n tokenAddress,\n chainId,\n accountAddress,\n }: {\n tokenAddress: Address;\n chainId: number;\n accountAddress: Address;\n },\n queryClient: QueryClient\n) {\n const tokenBalanceQueryKey = constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n accountAddress,\n });\n\n cofheLogger.log('Invalidating public token balance read contract queries for token:', tokenBalanceQueryKey);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n });\n}\n\nfunction invalidatePublicAndConfidentialTokenBalanceQueries(\n token: Token,\n accountAddress: Address,\n queryClient: QueryClient\n) {\n invalidateConfidentialTokenBalanceQueries(token, queryClient);\n\n const publicPairTokenAddress = token.extensions.fhenix.erc20Pair?.address;\n assert(publicPairTokenAddress, 'Public pair token address is required for shield transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicPairTokenAddress,\n chainId: token.chainId,\n accountAddress,\n },\n queryClient\n );\n}\n\nfunction invalidateTokenAllowanceQueries(\n {\n chainId,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n }: {\n chainId: number;\n tokenAddress: Address;\n ownerAddress: Address;\n spenderAddress: Address;\n },\n queryClient: QueryClient\n) {\n const queryKey = constructTokenAllowanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n });\n\n queryClient.invalidateQueries({ queryKey });\n}\n\ntype UseTrackPendingTransactionsInput = {\n onReceiptSuccess: (tx: Transaction, receipt: TransactionReceipt) => void;\n onReceiptFail?: (tx: Transaction, receipt: TransactionReceipt) => void;\n onFetchFailure?: (error: unknown, tx: Transaction) => void;\n};\nfunction useTrackPendingTransactionsBase({\n onReceiptSuccess,\n onReceiptFail,\n onFetchFailure,\n}: UseTrackPendingTransactionsInput) {\n // Batch check pending transactions using react-query's useQueries\n const accountsPendingTxs = usePendingTransactions();\n const publicClient = useCofhePublicClient();\n\n const queries: QueriesOptions<TransactionReceipt[]> = accountsPendingTxs.map((tx) => ({\n queryKey: ['tx-receipt', tx.chainId, tx.hash],\n queryFn: async () => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n try {\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: tx.hash as `0x${string}`,\n });\n\n const status = receipt.status === 'success' ? TransactionStatus.Confirmed : TransactionStatus.Failed;\n // invalidate if tx was successful\n if (status === TransactionStatus.Confirmed) onReceiptSuccess(tx, receipt);\n else onReceiptFail?.(tx, receipt);\n\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, status);\n\n return receipt;\n } catch (e) {\n onFetchFailure?.(e, tx);\n // no need to invalidate on failure, since nothing has changed on chain\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, TransactionStatus.Failed);\n throw e;\n }\n },\n\n enabled: !!publicClient && accountsPendingTxs.length > 0,\n refetchOnWindowFocus: false,\n refetchOnReconnect: true,\n }));\n useInternalQueries({\n queries,\n });\n}\n\nfunction useHandleInvalidations() {\n const queryClient = useInternalQueryClient();\n\n const { upsert: upsertDecryptionWatcher, byKey } = useDecryptionWatchersStore();\n cofheLogger.log('Scheduled invalidations store:', byKey);\n const handleInvalidations = (tx: Transaction) => {\n // each transaction requires gas, so native token balance changes on every transaction\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: ETH_ADDRESS_LOWERCASE,\n chainId: tx.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n if (tx.actionType === TransactionActionType.ShieldSend) {\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n } else if (tx.actionType === TransactionActionType.Shield) {\n // on shield public balance decreases and private increases\n invalidatePublicAndConfidentialTokenBalanceQueries(tx.token, tx.account, queryClient);\n } else if (tx.actionType === TransactionActionType.Unshield) {\n // on unshield - private balance decreases, claimable increases, public remains the same\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n\n // schedule invalidation for unshield claims once decryption is observed\n upsertDecryptionWatcher({\n key: `${tx.actionType}-tx-${tx.hash}`,\n accountAddress: tx.account,\n createdAt: Date.now(),\n chainId: tx.chainId,\n triggerTxHash: tx.hash,\n queryKeys: [\n constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: tx.token.chainId,\n tokenAddress: tx.token.address,\n confidentialityType: tx.token.extensions.fhenix.confidentialityType,\n accountAddress: tx.account,\n }),\n ],\n });\n } else if (tx.actionType === TransactionActionType.Claim) {\n // on claim - claimable decreases, public increases, private remains the same\n const publicTokenAddress = tx.token.extensions.fhenix.erc20Pair?.address;\n assert(publicTokenAddress, 'Public pair token address is required for claim transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicTokenAddress,\n chainId: tx.token.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n invalidateClaimableQueries({\n token: tx.token,\n accountAddress: tx.account,\n\n queryClient,\n });\n } else if (tx.actionType === TransactionActionType.Approve) {\n const underlying = tx.token.extensions.fhenix.erc20Pair?.address;\n assert(underlying, 'erc20Pair is required for approve transaction invalidation');\n if (underlying.toLowerCase() !== ETH_ADDRESS_LOWERCASE) {\n invalidateTokenAllowanceQueries(\n {\n chainId: tx.token.chainId,\n tokenAddress: underlying,\n ownerAddress: tx.account,\n spenderAddress: tx.token.address,\n },\n queryClient\n );\n }\n } else {\n // @ts-expect-error actionType = \"never\" at this point\n cofheLogger.warn('No invalidation logic for transaction action type:', tx.actionType);\n }\n };\n\n return handleInvalidations;\n}\n\nfunction useOnceTransactionSubmitted(onSubmit: (tx: Transaction) => void) {\n const pendingTransactions = usePendingTransactions();\n const previousPendingTxsRef = useRef<Transaction[]>([]);\n\n useEffect(() => {\n const newlySubmittedTxs = pendingTransactions.filter(\n (tx) => !previousPendingTxsRef.current.some((prevTx) => prevTx.hash === tx.hash)\n );\n\n for (const tx of newlySubmittedTxs) {\n onSubmit(tx);\n\n // You can add any additional logic you want to execute once per transaction submission here\n }\n\n previousPendingTxsRef.current = pendingTransactions;\n }, [onSubmit, pendingTransactions]);\n}\n\nexport function useTrackPendingTransactions() {\n const handleInvalidations = useHandleInvalidations();\n const { onTransactionMined, onWatchReceiptFailure, onTransactionSubmitted } = useTransactionGlobalLifecycle();\n\n // 1 tx submitted\n useOnceTransactionSubmitted(onTransactionSubmitted);\n\n useTrackPendingTransactionsBase({\n // 2.a. tx mined successfully\n onReceiptSuccess: (tx, receipt) => {\n handleInvalidations(tx);\n onTransactionMined(tx, receipt);\n },\n // 2.b. tx mined with failure\n onReceiptFail: (tx, receipt) => {\n onTransactionMined(tx, receipt);\n },\n\n // 2.c. fetch failure\n onFetchFailure: (error, tx) => {\n onWatchReceiptFailure(error, tx);\n },\n });\n}\n","import { TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useStoredTransactions } from './useStoredTransactions';\n\nconst filter = (tx: Transaction) => tx.status === TransactionStatus.Pending;\nexport function usePendingTransactions(): Transaction[] {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs } = useStoredTransactions({\n chainId,\n account,\n filter,\n });\n return filteredTxs;\n}\n","import { TransactionStatus, useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useTransactionReceiptsByHash } from './useTransactionReceiptsByHash';\nimport { assert } from 'ts-essentials';\nimport { useCofheReadDecryptionResults } from './useCofheReadDecryptionResults';\nimport { useInternalQueryClient } from '@/providers';\nimport { useDecryptionWatchersStore, type DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\nimport { cofheLogger } from '@/utils/debug';\n\nfunction useHandleInvalidationsAfterDecryption() {\n const queryClient = useInternalQueryClient();\n return useCallback<UseTrackDecryptingTransactionsBaseInput['onDecryptionResolve']>(\n async (_tx, decryptionWatcher) => {\n cofheLogger.log('Invalidating queries for decryption watcher:', decryptionWatcher);\n for (const queryKey of decryptionWatcher.queryKeys) {\n cofheLogger.log('Invalidating query due to observed decryption:', queryKey);\n // query invalidation will cause __decryption-block-aware__ readContract calls to wait until RPC is aware of the decryption block\n // and on successful read, the queryKey will be removed from the decryption watchers store,\n // and then if a watcher doesn't have queryKeys anymore, it will be removed entirely from the store\n // which ends the tracking lifecycle for that decryption event\n await queryClient.invalidateQueries({ queryKey });\n }\n },\n [queryClient]\n );\n}\n\nconst filter = (tx: Transaction) => tx.isPendingDecryption && tx.status === TransactionStatus.Confirmed;\n\ntype UseTrackDecryptingTransactionsBaseInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\n\nfunction useTrackDecryptingTransactionsBase({ onDecryptionResolve }: UseTrackDecryptingTransactionsBaseInput) {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n // step 1: get all mined txs that are pending decryption\n const { hashes, filteredTxsByHash: minedTxsPendingDecryptionByHash } = useStoredTransactions({\n filter,\n account,\n chainId,\n });\n\n // todo: first check if pending queries cache already has that, might spare a request\n // step 2: get their receipts (to parse logs and find ciphertexts to watch)\n const { receiptsByHash } = useTransactionReceiptsByHash({\n hashes,\n });\n\n // step 3: from receipts, find ciphertexts to watch\n const minedTxsWithCiphertextsToWatch = useMemo(() => {\n return Object.entries(minedTxsPendingDecryptionByHash)\n .filter(([, tx]) => receiptsByHash[tx.hash] !== undefined)\n .map(([, tx]) => {\n const ciphertextToWatch = findDecryptRequestLog(tx.account, receiptsByHash[tx.hash].logs)?.ciphertext;\n assert(\n ciphertextToWatch,\n 'Ciphertext to watch should be found in the transaction logs if a tx that isPendingDecryption and has a receipt'\n );\n return {\n tx,\n receipt: receiptsByHash[tx.hash],\n ciphertextToWatch,\n };\n });\n }, [minedTxsPendingDecryptionByHash, receiptsByHash]);\n\n const ciphertextsToWatch = useMemo(() => {\n return new Set(minedTxsWithCiphertextsToWatch.map(({ ciphertextToWatch }) => ciphertextToWatch));\n }, [minedTxsWithCiphertextsToWatch]);\n\n // step 4: use decryption results polling hook to watch for decryption results\n const decryptionResults = useCofheReadDecryptionResults(ciphertextsToWatch);\n\n const queryClient = useInternalQueryClient();\n\n const { setDecryptionObservedAt } = useDecryptionWatchersStore();\n\n // step 5: when decryption results arrive, update store and and set decryptionObservedAt info to trigger invalidations\n useEffect(() => {\n const txsWithDecryptionResults = minedTxsWithCiphertextsToWatch\n .filter(({ ciphertextToWatch }) => decryptionResults[ciphertextToWatch] !== undefined)\n .map((item) => {\n const decryptionResult = decryptionResults[item.ciphertextToWatch];\n assert(decryptionResult, 'decryptionResult must be defined here');\n return {\n ...item,\n decryptionResult: decryptionResult,\n };\n });\n\n for (const { tx, decryptionResult, receipt, ciphertextToWatch } of txsWithDecryptionResults) {\n // update store\n useTransactionStore.getState().setTransactionDecryptionStatus(\n tx.chainId,\n tx.hash,\n false // no longer pending decryption\n );\n\n cofheLogger.log('Decryption completed for tx, invalidating relevant queries', {\n tx,\n decryptionResult,\n receipt,\n ciphertextToWatch,\n });\n\n // before cache invalidation, make sure the request that follows will use up-to-date block number\n setDecryptionObservedAt({\n key: `${tx.actionType}-tx-${tx.hash}`,\n blockNumber: decryptionResult.observedAt.blockNumber,\n blockHash: decryptionResult.observedAt.blockHash,\n });\n }\n }, [decryptionResults, queryClient, setDecryptionObservedAt, minedTxsWithCiphertextsToWatch]);\n\n // step 6: invalidate relevant queries when decryption is observed\n useOnDecryptionCallback({\n onDecryptionResolve,\n });\n}\n\ntype OnDecryptionInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\n\nfunction useOnDecryptionCallback({ onDecryptionResolve }: OnDecryptionInput) {\n const { byKey } = useDecryptionWatchersStore();\n\n // step 1: get all query keys that need to be invalidated due to observed decryption\n const watchersWithObservedDecryption = useMemo(\n () => Object.values(byKey).filter((item) => item.decryptionObservedAt !== undefined),\n [byKey]\n );\n\n cofheLogger.log('All observed decryptions:', watchersWithObservedDecryption);\n\n const handleDecryptionResolve = useCallback(async () => {\n const transactionStore = useTransactionStore.getState().transactions;\n for (const sch of watchersWithObservedDecryption) {\n const tx = transactionStore[sch.chainId]?.[sch.triggerTxHash];\n onDecryptionResolve(tx, sch);\n }\n }, [watchersWithObservedDecryption, onDecryptionResolve]);\n\n const stableHandleDecryptionResolve = useRef(handleDecryptionResolve);\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n\n useEffect(() => {\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n }, [handleDecryptionResolve]);\n\n useEffect(() => {\n if (watchersWithObservedDecryption.length > 0) {\n cofheLogger.log('All observed decryption query keys subject to invalidate:', watchersWithObservedDecryption);\n stableHandleDecryptionResolve.current();\n }\n }, [watchersWithObservedDecryption]);\n}\n\nfunction findDecryptRequestLog(account: string, logs: { topics: string[]; data: string }[] = []) {\n for (const log of logs) {\n const result = safeParseDecryptRequestLog(log, account);\n if (result) return result;\n }\n return undefined;\n}\n\nfunction safeParseDecryptRequestLog(\n log: { topics: string[]; data: string },\n account: string\n):\n | false\n | {\n ciphertext: string;\n } {\n const topic0Correct = log.topics[0]\n ?.toLowerCase()\n .startsWith('0xe9de54a3e7ddf0c48cc6e1134185300d5a71acbf2d8c21fcdefa9d9dd9e20ac1');\n const topic1Correct = log.topics[1] === undefined;\n const strippedData = log.data.startsWith('0x') ? log.data.slice(2) : log.data;\n const dataAsWords = strippedData.match(/.{1,64}/g) || [];\n\n const word1IsCorrect =\n dataAsWords[1]?.toLowerCase() === '00000000000000000000000000000000000000000000000000000000000000a0';\n const word2IsCorrect = dataAsWords[2]?.toLowerCase() === account.toLowerCase().slice(2).padStart(64, '0');\n return topic0Correct && topic1Correct && word1IsCorrect && word2IsCorrect\n ? {\n ciphertext: '0x' + dataAsWords[0],\n }\n : false;\n}\n\nexport function useTrackDecryptingTransactions() {\n const handleInvalidationsAfterDecryption = useHandleInvalidationsAfterDecryption();\n const { onTransactionDecrypted } = useTransactionGlobalLifecycle();\n\n useTrackDecryptingTransactionsBase({\n onDecryptionResolve: async (decryptionCausingTx, decryptionWatcher) => {\n cofheLogger.log('Decryption resolved for tx:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n handleInvalidationsAfterDecryption(decryptionCausingTx, decryptionWatcher);\n onTransactionDecrypted(decryptionCausingTx, decryptionWatcher);\n },\n });\n}\n","import { useMemo } from 'react';\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { TASK_MANAGER_ADDRESS } from '@cofhe/sdk';\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n// function getDecryptResultSafe(uint256 ctHash) external view returns (uint256, bool)\nconst TASK_MANAGER_ABI = [\n {\n type: 'function',\n name: 'getDecryptResultSafe',\n inputs: [\n {\n name: 'ctHash',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'result',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'decrypted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n\nconst DECRYPTION_RESULT_POLLING_INTERVAL_MS = 5_000;\nexport type DecryptionResultWithObservedBlock = {\n result: bigint;\n decrypted: true;\n observedAt: {\n blockNumber: bigint;\n blockHash: `0x${string}`;\n };\n};\nexport function useCofheReadDecryptionResults(ciphertexts: Set<string>) {\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n\n const queries = useMemo(() => {\n return Array.from(ciphertexts).map((ct) => {\n return {\n queryKey: ['decryptionResult', chainId, ct] as const,\n queryFn: async ({ signal }: { signal: AbortSignal }) => {\n if (!publicClient) throw new Error('PublicClient is required');\n\n // Keep the query in-flight until the decryption result is available.\n // This way `isFetching` reflects the real \"waiting for decryption\" period.\n while (!signal.aborted) {\n // Try to fetch (1) decryption result and (2) latest block header together.\n // If the transport batches, these should go in one JSON-RPC batch.\n const [res, block] = await Promise.allSettled([\n publicClient.readContract({\n address: TASK_MANAGER_ADDRESS,\n abi: TASK_MANAGER_ABI,\n functionName: 'getDecryptResultSafe',\n args: [BigInt(ct)],\n }),\n publicClient.getBlock(),\n ]);\n\n if (\n res.status === 'fulfilled' &&\n block.status === 'fulfilled' &&\n block.value?.hash &&\n block.value?.number\n ) {\n const decoded = res.value;\n const result = decoded[0];\n const decrypted = decoded[1];\n\n if (decrypted) {\n const data: DecryptionResultWithObservedBlock = {\n result,\n decrypted: true,\n observedAt: {\n blockNumber: block.value.number,\n blockHash: block.value.hash,\n },\n };\n\n return data;\n }\n }\n\n await sleep(DECRYPTION_RESULT_POLLING_INTERVAL_MS, signal);\n }\n\n throw abortError();\n },\n enabled: !!publicClient && !!chainId && ct !== undefined,\n };\n });\n }, [chainId, ciphertexts, publicClient]);\n\n const results = useInternalQueries({ queries });\n\n const isDecryptedByCt = useMemo(() => {\n return results.reduce<Record<string, DecryptionResultWithObservedBlock | undefined>>((record, res, index) => {\n const ct = Array.from(ciphertexts)[index];\n\n record[ct] = res.data;\n\n return record;\n }, {});\n }, [ciphertexts, results]);\n\n return isDecryptedByCt;\n}\n","import { useCofheActivePermit } from '@/hooks';\nimport { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\nimport { truncateHash } from '@/utils';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useEffect, useRef } from 'react';\nimport { FloatingButtonPage } from '../components/CofheFloatingButton/pagesConfig/types';\nimport { usePortalPersisted } from '@/stores/portalPersisted';\nimport { useCofheIsConnected } from './useCofheConnection';\n\nexport const STATUS_ID_MISSING_PERMIT = 'missing-permit';\nexport const STATUS_ID_PERMIT_EXPIRED = 'permit-expired';\nexport const STATUS_ID_PERMIT_EXPIRING_SOON = 'permit-expiring-soon';\nexport const STATUS_ID_PERMIT_SHARED = 'permit-shared';\n\nexport const showMissingPermitStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_MISSING_PERMIT,\n variant: 'error',\n title: 'Missing permit',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\n\nexport const hideMissingPermitStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_MISSING_PERMIT);\n};\n\nexport const showPermitExpiredStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRED,\n variant: 'error',\n title: 'Permit expired',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiredStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRED);\n};\n\nexport const showPermitExpiringSoonStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRING_SOON,\n variant: 'warning',\n title: 'Permit expiring soon',\n description: `Expires at ${new Date(permit.expiration * 1000).toLocaleTimeString()}`,\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiringSoonStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n};\n\nexport const showPermitSharedStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_SHARED,\n variant: 'info',\n title: 'Imported permit active',\n description: `Viewing ${truncateHash(permit.issuer, 4, 4)}'s data`,\n });\n};\nexport const hidePermitSharedStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_SHARED);\n};\n\n/**\n * Watches the user's active permit and displays statuses if:\n * - Warning - permit will expire in less that 1 hour\n * - Error - permit has expired\n * - Info - using a shared permit\n */\nexport const useWatchPermitStatus = () => {\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const activePermit = useCofheActivePermit();\n const connected = useCofheIsConnected();\n\n useEffect(() => {\n const updateStatuses = (permit: Permit | undefined) => {\n const hasCreatedFirstPermit = usePortalPersisted.getState().hasCreatedFirstPermit;\n const missingPermitStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_MISSING_PERMIT);\n const expiredStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRED);\n const expiringSoonStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n const sharedStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_SHARED);\n\n if (permit == null) {\n if (hasCreatedFirstPermit && !missingPermitStatusShown && connected) {\n showMissingPermitStatus();\n }\n if (expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n if (expiringSoonStatusShown) {\n hidePermitExpiringSoonStatus();\n }\n if (sharedStatusShown) {\n hidePermitSharedStatus();\n }\n return;\n }\n\n if (permit != null && missingPermitStatusShown) {\n hideMissingPermitStatus();\n }\n\n const timestamp = Math.floor(Date.now() / 1000);\n const expiration = permit.expiration;\n\n // Expired status\n const isExpired = expiration < timestamp;\n if (isExpired && !expiredStatusShown) {\n showPermitExpiredStatus();\n }\n if (!isExpired && expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n\n // Expiring soon status\n const isExpiringSoon = expiration - timestamp < 1 * 60 * 60;\n if (!isExpired && isExpiringSoon && !expiringSoonStatusShown) {\n showPermitExpiringSoonStatus(permit);\n }\n if ((!isExpiringSoon && expiringSoonStatusShown) || isExpired) {\n hidePermitExpiringSoonStatus();\n }\n\n // Shared status\n const isShared = permit.type === 'recipient';\n if (isShared && !sharedStatusShown) {\n showPermitSharedStatus(permit);\n }\n if (!isShared && sharedStatusShown) {\n hidePermitSharedStatus();\n }\n };\n\n updateStatuses(activePermit?.permit);\n intervalRef.current = setInterval(() => {\n updateStatuses(activePermit?.permit);\n }, 2000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [activePermit, connected]);\n};\n","import { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\n\nimport { useEffect } from 'react';\n\nimport { useCofheClaimableTokens } from './useCofheClaimableTokens';\nimport { FloatingButtonPage } from '@/components/CofheFloatingButton/pagesConfig/types';\n\nexport const CLAIMS_AVAILABLE_STATUS_ID = 'claims-available';\ntype Input = {\n onClick: () => void;\n};\nexport const showClaimsAvailableStatus = ({ onClick }: Input) => {\n usePortalStatuses.getState().addStatus({\n id: CLAIMS_AVAILABLE_STATUS_ID,\n variant: 'info',\n title: '', // TODO: no title per design\n description: `You have unclaimed encrypted tokens`,\n action: {\n label: 'VIEW',\n onClick,\n },\n });\n};\nexport const hideClaimsAvailableStatus = () => {\n usePortalStatuses.getState().removeStatus(CLAIMS_AVAILABLE_STATUS_ID);\n};\n\nexport const useWatchClaimablesStatus = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n\n useEffect(() => {\n const claimsAvailableStatusShown = usePortalStatuses.getState().hasStatus(CLAIMS_AVAILABLE_STATUS_ID);\n if (totalTokensClaimable > 0 && !claimsAvailableStatusShown) {\n showClaimsAvailableStatus({\n onClick: () => {\n openPortal();\n navigateTo(FloatingButtonPage.ClaimableTokens);\n },\n });\n }\n\n if (totalTokensClaimable === 0 && claimsAvailableStatusShown) {\n hideClaimsAvailableStatus();\n }\n }, [navigateTo, openPortal, totalTokensClaimable]);\n};\n","import { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { useCofheTokensClaimable } from './useCofheTokensClaimable';\n\nexport function useCofheClaimableTokens() {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const result = useCofheTokensClaimable({\n accountAddress: account,\n tokens: allTokens,\n });\n\n return result;\n}\n","import { cn } from '@/utils';\nimport fhenixIconBlack from '@/assets/fhenix-icon-black.png';\nimport fhenixIconWhite from '@/assets/fhenix-icon-white.png';\n\nexport const FhenixLogoIcon: React.FC<{ theme: 'dark' | 'light'; className?: string }> = ({ theme, className }) => {\n return (\n <img\n className={cn('w-10 h-10', className)}\n src={theme === 'dark' ? fhenixIconWhite : fhenixIconBlack}\n alt=\"Fhenix Logo Icon\"\n />\n );\n};\n","import { cn } from '@/utils';\nimport { CloseIcon } from '@/components/Icons';\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\nimport type { CofheStatusVariant } from './types';\n\nconst statusVariantStyles: Record<CofheStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nexport const FloatingButtonComponent: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n const { theme } = useCofheFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { portalOpen } = usePortalUI();\n\n const topStatusVariant = statuses[statuses.length - 1]?.variant;\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'cofhe-panel cofhe-floating-icon',\n 'w-12 h-12',\n 'flex items-center justify-center cursor-pointer flex-shrink-0',\n 'focus:outline-none',\n statusVariantStyles[topStatusVariant]\n )}\n >\n <div className=\"flex items-center justify-center\">\n {portalOpen && <CloseIcon className=\"w-6 h-6\" />}\n {!portalOpen && <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />}\n </div>\n </button>\n );\n};\n","import { type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\n\nexport const StatusBarSection: React.FC<{ children?: ReactNode }> = ({ children }) => {\n const { isLeftSide } = useCofheFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { statusPanelOpen } = usePortalUI();\n\n return (\n <AnimatePresence>\n {(statusPanelOpen || statuses.length > 0) && (\n <motion.div\n className=\"relative flex flex-1 h-12 items-center justify-between\"\n initial={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineSettings } from 'react-icons/md';\nimport { IoIosCheckmarkCircleOutline, IoIosCloseCircleOutline, IoIosTime } from 'react-icons/io';\nimport { useMemo } from 'react';\nimport { cn } from '@/utils';\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport { FloatingButtonPage } from './pagesConfig/types';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport type { CofheStatus, CofheStatusVariant } from './types';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { usePortalNavigation, usePortalStatuses } from '@/stores';\nimport { useCofheConnection } from '@/hooks';\nimport { CLAIMS_AVAILABLE_STATUS_ID } from '@/hooks/useWatchClaimablesStatus';\nimport {\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n} from '@/hooks/useWatchPermitStatus';\n\nconst ConnectionStatus: React.FC = () => {\n const { theme } = useCofheFloatingButtonContext();\n const { navigateTo } = usePortalNavigation();\n const { connected } = useCofheConnection();\n\n return (\n <div className=\"cofhe-panel w-full h-full flex px-4 items-center justify-between\">\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status */}\n <div className=\"flex items-center gap-1 ml-auto mr-2\">\n {connected ? (\n <>\n <IoIosCheckmarkCircleOutline className=\"text-green-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Connected\n </span>\n </>\n ) : (\n <>\n <IoIosCloseCircleOutline className=\"text-red-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Disconnected\n </span>\n </>\n )}\n </div>\n\n {/* Settings Icon */}\n <button\n onClick={() => navigateTo(FloatingButtonPage.Settings)}\n className={cn('p-1 rounded cofhe-hover-overlay transition-colors', 'cofhe-text-primary')}\n >\n <MdOutlineSettings className=\"w-4 h-4\" />\n </button>\n </div>\n );\n};\n\nconst statusTextColorMap: Record<CofheStatusVariant, string> = {\n error: 'text-red-500',\n warning: 'text-yellow-500',\n info: 'text-blue-500',\n};\n\nconst statusBorderColorMap: Record<CofheStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nconst ActiveStatusContent: React.FC<{ status: CofheStatus }> = ({ status }) => {\n const { theme } = useCofheFloatingButtonContext();\n\n return (\n <div\n className={cn(\n 'cofhe-panel w-full h-full flex px-4 items-center justify-between',\n statusBorderColorMap[status.variant]\n )}\n >\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status Info */}\n <div className=\"flex flex-col ml-2 mr-auto\">\n <h3 className={cn('text-sm font-medium', statusTextColorMap[status.variant])}>{status.title}</h3>\n {status.description != null && (\n <p className={cn('text-xs', statusTextColorMap[status.variant])}>{status.description}</p>\n )}\n </div>\n\n {/* Action Button */}\n {status.action != null && (\n <button\n onClick={status.action?.onClick}\n className={cn('p-1 rounded cofhe-hover-overlay transition-colors', 'cofhe-text-primary')}\n >\n {status.action.label}\n </button>\n )}\n </div>\n );\n};\n\nconst STATUSES_ORDER = new Map<string, number>(\n [\n // first always goes \"claims available\" as claiming doesn't require a permit\n CLAIMS_AVAILABLE_STATUS_ID,\n\n // next goes all permit related statuses\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n\n // next everything else can be sorted by time or just left in the order they were added\n ]\n .reverse()\n .map((id, index) => [id, index])\n);\n\nfunction sortStatuses(a: CofheStatus, b: CofheStatus): number {\n const aIndex = STATUSES_ORDER.get(a.id) ?? -1;\n const bIndex = STATUSES_ORDER.get(b.id) ?? -1;\n\n if (aIndex === -1 && bIndex === -1) {\n // If both statuses are not in the predefined order, keep their original order\n return 0;\n }\n if (aIndex === -1) {\n // If only a is not in the predefined order, b should come first\n return 1;\n }\n if (bIndex === -1) {\n // If only b is not in the predefined order, a should come first\n return -1;\n }\n // If both statuses are in the predefined order, sort by their index\n return aIndex - bIndex;\n}\n\nexport const StatusBarContent: React.FC = () => {\n const { statuses } = usePortalStatuses();\n\n const sortedStatuses = useMemo(() => statuses.sort(sortStatuses), [statuses]);\n\n return (\n <AnimatedZStack>\n {/* Connection status showing connection state and chain */}\n <ConnectionStatus />\n\n {/* Active errors or warnings to be resolved */}\n {sortedStatuses.map((status) => (\n <ActiveStatusContent key={status.id} status={status} />\n ))}\n </AnimatedZStack>\n );\n};\n","// eslint-disable-next-line no-redeclare\nimport React from 'react';\nimport { cn } from '@/utils';\nimport type { ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\n\ntype AnimatedZStackItemProps = {\n children?: ReactNode;\n stackOffset: number;\n stackScale: number;\n index: number;\n length: number;\n className?: string;\n};\n\nconst AnimatedZStackItem: React.FC<AnimatedZStackItemProps> = ({\n children,\n stackOffset,\n stackScale,\n index,\n length,\n className,\n}) => {\n // Primary item is always index 0, and does not translate on entry/exit\n // Additional items animate in from the bottom and out to the bottom\n // All items animate opacity\n const isPrimaryItem = index === 0;\n const entryStyle = isPrimaryItem\n ? {\n opacity: 0,\n }\n : {\n opacity: 0,\n top: stackOffset,\n scale: 1 + stackScale,\n };\n\n // invIndex is the depth of the card in the stack\n // As the length of the stack increases, the depth of the card decreases\n // Deeper items scale down and move up\n const invIndex = length - index - 1;\n const animStyle = {\n opacity: 1,\n top: invIndex * -stackOffset,\n scale: 1 - invIndex * stackScale,\n zIndex: index,\n };\n\n return (\n <motion.div\n className={cn('w-full h-full absolute origin-top', invIndex === 0 && 'events-none', className)}\n initial={entryStyle}\n exit={entryStyle}\n animate={animStyle}\n >\n {children}\n </motion.div>\n );\n};\n\ntype AnimatedZStackProps = {\n children?: ReactNode;\n stackOffset?: number;\n stackScale?: number;\n itemClassName?: string;\n};\n\nexport const AnimatedZStack: React.FC<AnimatedZStackProps> = ({\n children,\n stackOffset = 8,\n stackScale = 0.05,\n itemClassName,\n}) => {\n const filteredChildren = React.Children.toArray(children).filter(Boolean);\n\n return (\n <AnimatePresence>\n {filteredChildren.map((child, index) => (\n <AnimatedZStackItem\n key={index}\n stackOffset={stackOffset}\n stackScale={stackScale}\n index={index}\n length={filteredChildren.length}\n className={itemClassName}\n >\n {child}\n </AnimatedZStackItem>\n ))}\n </AnimatePresence>\n );\n};\n","import { useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport { pages } from './pagesConfig/const';\nimport { type PageState } from './pagesConfig/types';\nimport { type PortalModalState } from './modals/types';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { modals } from './modals';\nimport { usePortalUI, usePortalCurrentPage, usePortalUIMaxContentHeight, usePortalModals } from '@/stores';\nimport { cn } from '@/utils';\n\ninterface ContentSectionProps {\n overriddingPage?: PageState;\n}\n\nconst MeasuredContentRenderer: React.FC<{\n children?: ReactNode;\n id: string;\n isModal?: boolean;\n onModalOverlayClick?: () => void;\n}> = ({ children, id, isModal, onModalOverlayClick }) => {\n const { setContentHeight, removeContentHeight } = usePortalUI();\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!contentRef.current) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height;\n setContentHeight(id, height);\n }\n });\n\n observer.observe(contentRef.current);\n return () => {\n observer.disconnect();\n removeContentHeight(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return (\n <>\n {isModal && (\n <div\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onModalOverlayClick?.();\n }}\n className=\"absolute flex w-full h-full bg-[#0E2F3F]/30 origin-top translate-y-[-8px] scale-[0.95]\"\n />\n )}\n <div className=\"relative flex w-full h-full overflow-y-hidden pointer-events-none\">\n <div className={cn('cofhe-panel absolute flex left-0 w-full p-4 top-0 pointer-events-auto')} ref={contentRef}>\n {children}\n </div>\n </div>\n </>\n );\n};\n\nconst ContentRenderer: React.FC<{ page: PageState }> = ({ page }) => {\n const content = useMemo(() => {\n const PageComp = pages[page.page];\n const props = page.props ?? {};\n return <PageComp {...props} />;\n }, [page]);\n\n return <MeasuredContentRenderer id=\"content\">{content}</MeasuredContentRenderer>;\n};\n\nconst ModalRenderer: React.FC<{ modal: PortalModalState }> = ({ modal }) => {\n const content = useMemo(() => {\n const ModalComp = modals[modal.modal] as React.FC<typeof modal>;\n return <ModalComp {...modal} />;\n }, [modal]);\n\n return (\n <MeasuredContentRenderer id={`${modal.modal}-modal`} isModal onModalOverlayClick={modal.onClose}>\n {content}\n </MeasuredContentRenderer>\n );\n};\n\nexport const ContentSection: React.FC<ContentSectionProps> = ({ overriddingPage }) => {\n const { isTopSide } = useCofheFloatingButtonContext();\n const { contentPanelOpen } = usePortalUI();\n const { modalStack } = usePortalModals();\n const maxContentHeight = usePortalUIMaxContentHeight();\n const currentPage = usePortalCurrentPage();\n const pageOrOverridingPage = overriddingPage ?? currentPage;\n\n return (\n <AnimatePresence>\n {contentPanelOpen && (\n <motion.div\n className=\"relative flex w-full z-50\"\n initial={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n animate={{ opacity: 1, y: 0, height: `${maxContentHeight}px`, maxHeight: `${maxContentHeight}px` }}\n exit={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n >\n <AnimatedZStack>\n <ContentRenderer page={pageOrOverridingPage} />\n {modalStack.map((modal) => {\n return <ModalRenderer key={modal.modal} modal={modal} />;\n })}\n </AnimatedZStack>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineAccountBalanceWallet } from 'react-icons/md';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { AddressButton } from '../../components/AddressButton';\nimport { ConnectedChainIndicator } from '../../components/ConnectedChainIndicator';\n\nexport const WalletHeader: React.FC = () => {\n const walletAddress = useCofheAccount();\n\n return (\n <div className=\"flex items-center justify-between\">\n {/* Left: Wallet Address */}\n <AddressButton address={walletAddress} icon={<MdOutlineAccountBalanceWallet className=\"w-4 h-4\" />} />\n\n {/* Right: Network Selector + Settings */}\n <div className=\"flex items-center gap-2\">\n <ConnectedChainIndicator />\n </div>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { MdContentCopy, MdCheck } from 'react-icons/md';\nimport { cn } from '../../../utils/cn';\nimport { truncateAddress } from '../../../utils/utils';\nimport { cofheLogger } from '@/utils/debug';\n\ninterface AddressButtonProps {\n address: string | null | undefined;\n className?: string;\n icon?: React.ReactNode;\n showCopyIcon?: boolean;\n}\n\nexport const AddressButton: React.FC<AddressButtonProps> = ({ address, className, icon, showCopyIcon = true }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopyAddress = async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n cofheLogger.error('Failed to copy address:', err);\n }\n };\n\n const truncatedAddress = truncateAddress(address) || 'Not connected';\n\n return (\n <button\n onClick={handleCopyAddress}\n disabled={!address}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded cofhe-hover-overlay transition-colors',\n 'cofhe-text-primary text-sm',\n className\n )}\n >\n {icon}\n <span className=\"font-mono\">{truncatedAddress}</span>\n {showCopyIcon && address && (copied ? <MdCheck className=\"w-3 h-3\" /> : <MdContentCopy className=\"w-3 h-3\" />)}\n {copied && !showCopyIcon && <span className=\"text-xs opacity-70\">Copied!</span>}\n </button>\n );\n};\n","import { getChainById } from '@cofhe/sdk/chains';\nimport { ChainIcon } from './ChainIcon';\nimport { cn } from '@/utils/cn';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\n\nexport const ConnectedChainIndicator: React.FC = () => {\n const chainId = useCofheChainId();\n\n // Get network name from SDK chains\n const chain = chainId ? getChainById(chainId) : undefined;\n const currentNetwork = chain?.name || 'Eth';\n\n return (\n <div\n className={cn(\n 'flex items-center gap-1 px-2 py-1 rounded cofhe-hover-overlay transition-colors',\n 'cofhe-text-primary text-sm outline-none border cofhe-dropdown-border',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n <ChainIcon chainId={chainId} />\n <span className=\"font-medium\">{currentNetwork}</span>\n </div>\n );\n};\n","import type { SVGProps } from \"react\";\nconst Svg11155111 = (props: SVGProps<SVGSVGElement>) => <svg id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlnsXlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1920 1920\" enableBackground=\"new 0 0 1920 1920\" xmlSpace=\"preserve\" {...props}><g><polygon fill=\"#8A92B2\" points=\"959.8,80.7 420.1,976.3 959.8,731 \" /><polygon fill=\"#62688F\" points=\"959.8,731 420.1,976.3 959.8,1295.4 \" /><polygon fill=\"#62688F\" points=\"1499.6,976.3 959.8,80.7 959.8,731 \" /><polygon fill=\"#454A75\" points=\"959.8,1295.4 1499.6,976.3 959.8,731 \" /><polygon fill=\"#8A92B2\" points=\"420.1,1078.7 959.8,1839.3 959.8,1397.6 \" /><polygon fill=\"#62688F\" points=\"959.8,1397.6 959.8,1839.3 1499.9,1078.7 \" /></g></svg>;\nexport default Svg11155111;","import type { SVGProps } from \"react\";\nconst Svg84532 = (props: SVGProps<SVGSVGElement>) => <svg width={256} height={256} viewBox=\"0 0 256 256\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M256 128C256 198.692 198.592 256 127.777 256C60.5909 256 5.47394 204.417 0 138.759H169.482V117.24H0C5.47394 51.583 60.5909 0 127.777 0C198.592 0 256 57.3074 256 128Z\" fill=\"#0052FF\" /></svg>;\nexport default Svg84532;","import { cn } from '@/utils';\n\n// The icons probably needs to be part of the SDK chains package\n// Import chain icons\nimport sepolia from '@/assets/chains/11155111.svg';\nimport baseSepolia from '@/assets/chains/84532.svg';\n\nconst chainIcons: Record<number, React.FC<React.SVGProps<SVGSVGElement>>> = {\n 11155111: sepolia,\n 84532: baseSepolia,\n};\n\ninterface ChainIconProps {\n chainId: number | undefined;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({ chainId, className }) => {\n const Icon = chainId ? chainIcons[chainId] : undefined;\n\n if (Icon) {\n return <Icon className={cn('w-4 h-4 flex-shrink-0', className)} />;\n }\n\n // Fallback icon\n return (\n <div className={cn('w-4 h-4 rounded-full cofhe-icon-bg flex items-center justify-center flex-shrink-0', className)}>\n <span className=\"text-[8px]\">⟠</span>\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { cn } from '@/utils';\nimport defaultTokenIcon from '@/assets/default-token.webp';\n\ntype TokenIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\ninterface TokenIconProps {\n /** Token logo URI */\n logoURI?: string | null;\n /** Alt text for the image */\n alt?: string;\n /** Size variant */\n size?: TokenIconSize;\n /** CSS class name for the container div (overrides size if provided) */\n className?: string;\n /** CSS class name for the image */\n imageClassName?: string;\n}\n\nconst sizeClasses: Record<TokenIconSize, string> = {\n sm: 'w-5 h-5',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n\nexport const TokenIcon: React.FC<TokenIconProps> = ({\n logoURI,\n alt = 'Token',\n size = 'sm',\n className,\n imageClassName = 'w-full h-full object-cover',\n}) => {\n const [iconError, setIconError] = useState(false);\n\n // Reset error when logoURI changes\n useEffect(() => {\n setIconError(false);\n }, [logoURI]);\n\n const containerClassName =\n className ||\n cn(sizeClasses[size], 'rounded-full cofhe-icon-bg flex items-center justify-center flex-shrink-0 overflow-hidden');\n\n return (\n <div className={containerClassName}>\n <img\n src={iconError || !logoURI ? defaultTokenIcon : logoURI}\n alt={alt}\n className={imageClassName}\n onError={() => setIconError(true)}\n />\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\n\nexport interface LoadingDotsProps {\n /** Size variant for the dots */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Custom className for the container */\n className?: string;\n /** Color variant - defaults to primary text color */\n variant?: 'primary' | 'secondary';\n}\n\nconst sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ size = 'md', className, variant = 'primary' }) => {\n return (\n <span\n className={cn(\n 'cofhe-loading-dots',\n sizeClasses[size],\n variant === 'primary' ? 'cofhe-text-primary' : 'opacity-70',\n className\n )}\n >\n <span>•</span>\n <span>•</span>\n <span>•</span>\n </span>\n );\n};\n","import { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nimport { cn } from '@/utils';\nimport { LoadingDots } from './LoadingDots';\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-xl',\n xl: 'text-2xl',\n};\n\ntype TokenBalanceViewProps = {\n className?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n formattedBalance?: string;\n symbol?: string;\n isFetching?: boolean;\n hidden?: boolean;\n};\nexport const TokenBalanceView: React.FC<TokenBalanceViewProps> = ({\n className,\n size = 'md',\n formattedBalance,\n symbol,\n isFetching,\n hidden,\n}) => {\n return (\n <span className={cn(sizeClasses[size], 'font-medium cofhe-text-primary', className)}>\n {hidden ? <ConfidentialValuePlaceholder /> : isFetching ? <LoadingDots size={size} /> : formattedBalance}\n {symbol && ` ${symbol}`}\n </span>\n );\n};\n\nconst ConfidentialValuePlaceholder: React.FC = () => {\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n return (\n <span\n className=\"cursor-pointer hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n navigateToGeneratePermit({\n cause: 'clicked_on_confidential_balance',\n });\n }}\n >\n {'* * *'}\n </span>\n );\n};\n","import type { Address } from 'viem';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { TokenBalanceView } from './TokenBalanceView';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\n\nexport enum BalanceType {\n Public = 'public',\n Confidential = 'confidential',\n}\n\ninterface TokenBalanceProps {\n /** Token object from token list (for non-native tokens) */\n token?: Token;\n /** Account address to fetch balance for */\n accountAddress?: Address;\n\n /** Number of decimal places to show (default: 5) */\n decimalPrecision?: number;\n /** Whether to show the token symbol */\n showSymbol?: boolean;\n\n /** Custom className for the balance text */\n className?: string;\n /** Size variant for the balance display */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst DEFAULT_DISPLAY_DECIMALS = 5;\n\nexport const CofheTokenConfidentialBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n // Determine which account address to use\n const effectiveAccountAddress = accountAddress ?? account;\n\n // Use unified hook for confidential balance fetching\n const {\n data: { formatted: confidentialBalanceFormatted } = {},\n isFetching: isFetchingConfidential,\n disabledDueToMissingValidPermit,\n } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: effectiveAccountAddress,\n displayDecimals: decimalPrecision,\n });\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n hidden={disabledDueToMissingValidPermit}\n isFetching={isFetchingConfidential}\n formattedBalance={confidentialBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n\nexport const CofheTokenPublicBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n const effectiveAccountAddress = accountAddress ?? account;\n\n const { data: { formatted: publicBalanceFormatted } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance(\n { token, accountAddress: effectiveAccountAddress, displayDecimals: decimalPrecision }\n );\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n isFetching={isFetchingPublic}\n formattedBalance={publicBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n","import { useCofheContext } from '@/providers';\nimport { useCofheChainId } from './useCofheConnection';\n\n/**\n * Hook to get pinned token address for the current chain\n * @returns Pinned token address for current chain, or undefined if none\n */\nexport function useCofhePinnedTokenAddress() {\n const widgetConfig = useCofheContext().client.config.react;\n const chainId = useCofheChainId();\n const pinnedTokenAddress = chainId ? widgetConfig.pinnedTokens?.[chainId?.toString()] : undefined;\n return pinnedTokenAddress;\n}\n","import { useCofhePinnedTokenAddress } from './useCofhePinnedTokenAddress';\nimport { useCofheToken } from './useCofheTokenLists';\n\nexport function useCofhePinnedToken({ enabled }: { enabled?: boolean } = {}) {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const token = useCofheToken(\n {\n address: pinnedTokenAddress,\n },\n {\n // only fetch metadata if pinned token address is defined\n enabled: enabled !== false && !!pinnedTokenAddress,\n }\n );\n return token;\n}\n","import { cn } from '@/utils/cn';\nimport { KeyboardArrowRightIcon } from '@/components/Icons';\nimport { TokenIcon } from '../../components/TokenIcon';\nimport { CofheTokenConfidentialBalance } from '../../components/CofheTokenConfidentialBalance';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { useCofheChainId, useCofheConnection } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\nimport { useCofheContext } from '@/providers';\n\nexport const AssetCard: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n const { connected } = useCofheConnection();\n const {\n client: {\n config: {\n react: { projectName },\n },\n },\n } = useCofheContext();\n\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const token = pinnedToken ?? fallbackToken;\n const projectLabel = projectName ? `\"${projectName}\"` : 'this app';\n\n if (!connected) {\n return (\n <div className=\"cofhe-card-bg border border-[var(--cofhe-border-color)] px-3 py-6 flex items-center justify-center\">\n <div className=\"w-full max-w-[26rem] text-center\">\n <h2 className=\"text-2xl font-semibold leading-none\" style={{ color: 'var(--cofhe-corner-accent-color)' }}>\n CoFHE Portal\n </h2>\n <p className=\"mt-4 text-xl leading-tight cofhe-text-primary\">\n Connect to {projectLabel}\n <br />\n to access\n </p>\n </div>\n </div>\n );\n }\n\n const handleClick = () => {\n if (token) {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: { token },\n });\n } else {\n throw new Error('No token found for AssetCard. No pinned token and no fallback token for current chain.');\n }\n };\n\n return (\n <div\n onClick={handleClick}\n className={cn(\n 'cofhe-card-bg p-4 cursor-pointer',\n 'hover:opacity-90 transition-opacity',\n 'border cofhe-card-border'\n )}\n >\n <div className=\"flex items-center justify-between\">\n {/* Left Side: Icon, Ticker, Privacy Metrics */}\n <div className=\"flex items-center gap-3 flex-1\">\n {/* Asset Icon */}\n <TokenIcon logoURI={token?.logoURI} alt={token?.symbol} size=\"md\" />\n\n {/* Ticker and Privacy */}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-lg font-bold cofhe-text-primary\">{token?.symbol}</h3>\n </div>\n </div>\n\n {/* Right Side: Balance, Change, Arrow */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col items-end\">\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"xl\"\n decimalPrecision={5}\n className=\"font-bold\"\n />\n </div>\n <KeyboardArrowRightIcon className=\"w-5 h-5 cofhe-text-primary opacity-60\" />\n </div>\n </div>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { IoMdKey } from 'react-icons/io';\nimport { AiOutlinePieChart } from 'react-icons/ai';\nimport { TbShieldPlus } from 'react-icons/tb';\nimport { FaBug } from 'react-icons/fa';\nimport type { ComponentType, ReactNode } from 'react';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { assert, type ElementOf } from 'ts-essentials';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\nimport { Button } from '../../components';\nimport { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\nimport { isProduction } from '@/utils/isProduction';\n\nconst iconClassName = 'w-4 h-4';\n\nconst ShieldIcon = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n\n const badgeText = totalTokensClaimable > 99 ? '99+' : totalTokensClaimable > 0 ? `+${totalTokensClaimable}` : null;\n\n return (\n <span className=\"relative inline-flex items-center justify-center w-6 h-6 shrink-0\">\n <TbShieldPlus className={iconClassName} />\n {badgeText && (\n <span\n className={cn(\n 'pointer-events-none',\n 'absolute top-0 right-0',\n 'translate-x-[35%] -translate-y-[35%]',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'flex items-center justify-center',\n 'text-[10px] leading-none font-semibold',\n 'bg-[#6EE7F5] text-[#003B4A]',\n 'outline outline-2 outline-[var(--cofhe-button-bg)]',\n 'shadow-sm'\n )}\n >\n {badgeText}\n </span>\n )}\n </span>\n );\n};\n\ntype PagesInBottomMenu =\n | FloatingButtonPage.Send\n | FloatingButtonPage.Shield\n | FloatingButtonPage.Portfolio\n | FloatingButtonPage.Permits\n | FloatingButtonPage.Debug;\n\nconst baseNavItems: {\n id: PagesInBottomMenu;\n label: string;\n icon: ReactNode | ComponentType<{}>;\n}[] = [\n {\n id: FloatingButtonPage.Send,\n label: 'Send',\n icon: <GoArrowUpRight className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Shield,\n label: 'Shield',\n icon: ShieldIcon,\n },\n {\n id: FloatingButtonPage.Portfolio,\n label: 'Portfolio',\n icon: <AiOutlinePieChart className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Permits,\n label: 'Permits',\n icon: <IoMdKey className={iconClassName} />,\n },\n] as const;\n\nconst debugNavItem = {\n id: FloatingButtonPage.Debug,\n label: 'Debug',\n icon: <FaBug className={iconClassName} />,\n} as const;\n\nconst navItems = [...baseNavItems, ...(!isProduction() ? [debugNavItem] : [])] as const;\n\nexport const BottomNavigation: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const defaultToken = pinnedToken ?? fallbackToken;\n\n const handleNavClick = (page: ElementOf<typeof baseNavItems>['id']) => {\n openPortal();\n\n if (page === FloatingButtonPage.Portfolio) {\n navigateTo(FloatingButtonPage.Portfolio);\n return;\n }\n\n if (page === FloatingButtonPage.Send) {\n assert(defaultToken, 'No pinned token available for Send page');\n navigateTo(FloatingButtonPage.Send, { pageProps: { token: defaultToken } });\n return;\n }\n\n if (page === FloatingButtonPage.Shield) {\n assert(defaultToken, 'No pinned token available for Shield page');\n navigateTo(FloatingButtonPage.Shield, { pageProps: { token: defaultToken } });\n return;\n }\n\n navigateTo(page);\n };\n\n return (\n <div className=\"flex gap-2\">\n {navItems.map((item) => (\n <Button\n key={item.id}\n onClick={() => handleNavClick(item.id)}\n icon={typeof item.icon === 'function' ? <item.icon /> : item.icon}\n iconPosition=\"top\"\n label={item.label}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\nimport type { ReactNode } from 'react';\n\ninterface ActionButtonProps {\n onClick: () => void;\n disabled?: boolean;\n icon?: ReactNode;\n label: string;\n className?: string;\n variant?: 'default' | 'tab';\n pressed?: boolean;\n}\n\n/**\n * Reusable action button styled like the bottom navigation buttons with sharp edges.\n */\nexport const ActionButton: React.FC<ActionButtonProps> = ({\n onClick,\n disabled = false,\n icon,\n label,\n className,\n variant = 'default',\n pressed = false,\n}) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'w-full font-medium flex items-center justify-center gap-1',\n variant === 'tab' ? 'py-2 px-2 text-sm' : 'py-1.5 px-2 text-xs',\n 'cofhe-nav-button',\n pressed && 'cofhe-nav-button-active',\n 'transition-all',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n >\n {icon}\n <span>{label}</span>\n </button>\n );\n};\n","import { sanitizeNumericInput } from '../../../utils/utils.js';\n\ninterface AmountInputProps {\n value: string;\n onChange: (value: string) => void;\n onMaxClick: () => void;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Reusable amount input with max button for token operations.\n */\nexport const AmountInput: React.FC<AmountInputProps> = ({\n value,\n onChange,\n onMaxClick,\n placeholder = '0',\n className,\n}) => {\n return (\n <div className={`flex items-center gap-1 w-full ${className ?? ''}`}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={value}\n onChange={(e) => onChange(sanitizeNumericInput(e.target.value))}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 bg-transparent text-sm font-medium cofhe-text-primary outline-none placeholder:opacity-50 text-center border-b cofhe-card-border pb-1\"\n />\n <button onClick={onMaxClick} className=\"cofhe-max-button text-xxxs font-medium px-1 py-0.5 rounded flex-shrink-0\">\n max\n </button>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport type { ReactNode } from 'react';\n\nexport type ButtonVariant = 'primary' | 'default' | 'error' | 'warning' | 'ghost' | 'outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Button variant style */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Text content (alternative to children) */\n label?: string;\n /** Icon component to display */\n icon?: ReactNode;\n /** Icon position relative to text */\n iconPosition?: 'left' | 'right' | 'top';\n /** Override default className */\n className?: string;\n /** Button content (alternative to text prop) */\n children?: ReactNode;\n}\n\n/**\n * Reusable button component with support for light/dark mode, multiple variants, and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"default\" size=\"md\" text=\"Sign\" />\n * <Button variant=\"error\" size=\"sm\" text=\"Cancel\" icon={<Icon />} />\n * <Button variant=\"outline\" size=\"lg\">\n * Click me\n * </Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'default',\n size = 'md',\n label,\n icon,\n iconPosition = 'left',\n className,\n children,\n disabled,\n ...props\n}) => {\n // Determine content - prefer text prop over children\n const content = label ?? children;\n\n // Determine if layout should be vertical\n const isVertical = iconPosition === 'top';\n\n // Base classes\n const baseClasses = cn(\n 'inline-flex items-center justify-center',\n isVertical && 'flex-col',\n 'font-medium',\n 'border transition-all',\n 'focus:outline-none focus:ring-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors duration-200'\n );\n\n // Size classes - adjust gap for vertical layout\n const sizeClasses: Record<ButtonSize, string> = {\n sm: isVertical ? 'px-2 py-1 text-xs gap-1' : 'px-2 py-1 text-xs gap-1.5',\n md: isVertical ? 'px-3 py-1.5 text-xs gap-1' : 'px-3 py-1.5 text-xs gap-1.5',\n lg: isVertical ? 'px-4 py-2 text-sm gap-1.5' : 'px-4 py-2 text-sm gap-2',\n // xl: isVertical ? 'px-6 py-3 text-base gap-2' : 'px-6 py-3 text-base gap-2.5',\n };\n\n // Variant classes for light mode\n const variantClassesLight: Record<ButtonVariant, string> = {\n primary: cn('bg-[#80E6E6] hover:bg-[#6DD5D5]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#80E6E6]'),\n default: cn(\n 'bg-white hover:bg-[#6DD5D5]',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n error: cn('bg-[#FFB399] hover:bg-[#FF9F80]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFB399]'),\n warning: cn('bg-[#FFD699] hover:bg-[#FFC966]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFD699]'),\n ghost: cn('bg-transparent hover:bg-gray-100', 'text-[#003366]', 'border-transparent', 'focus:ring-gray-300'),\n outline: cn(\n 'bg-white hover:bg-gray-50',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n };\n\n // Variant classes for dark mode\n const variantClassesDark: Record<ButtonVariant, string> = {\n primary: cn(\n 'dark:bg-[#2E9D9D] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#2E9D9D]'\n ),\n default: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n error: cn(\n 'dark:bg-[#D9532E] dark:hover:bg-[#C0441F]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#D9532E]'\n ),\n warning: cn(\n 'dark:bg-[#E67E22] dark:hover:bg-[#D35400]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#E67E22]'\n ),\n ghost: cn(\n 'dark:bg-transparent dark:hover:bg-[#374151]',\n 'dark:text-white',\n 'dark:border-transparent',\n 'dark:focus:ring-gray-600'\n ),\n outline: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#4A4A4A]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n };\n\n // Combine all classes\n const buttonClasses = cn(\n baseClasses,\n sizeClasses[size],\n variantClassesLight[variant],\n variantClassesDark[variant],\n className\n );\n\n // Icon wrapper classes - flex container that doesn't constrain icon size\n const iconWrapperClasses = 'flex items-center justify-center flex-shrink-0';\n\n return (\n <button className={buttonClasses} disabled={disabled} {...props}>\n {icon && iconPosition === 'top' && <span className={iconWrapperClasses}>{icon}</span>}\n {icon && iconPosition === 'left' && <span className={iconWrapperClasses}>{icon}</span>}\n {content}\n {icon && iconPosition === 'right' && <span className={iconWrapperClasses}>{icon}</span>}\n </button>\n );\n};\n","import { useId, useMemo } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n type TooltipContentProps,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { cn } from '@/utils/cn';\n\nexport interface TokenPriceChartPoint {\n /** Unix ms */\n ts: number;\n /** Price in USD */\n value: number;\n}\n\nexport interface TokenPriceChartProps {\n points: TokenPriceChartPoint[];\n className?: string;\n height?: number;\n}\n\nconst formatTime = (ts: number): string =>\n new Date(ts).toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n\nconst formatUsd = (n: number): string =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n\nconst CustomTooltip = ({ active, payload, label }: TooltipContentProps<number, string>) => {\n if (!active || !payload?.length) return null;\n const v = payload[0]?.value;\n if (typeof v !== 'number') return null;\n\n return (\n <div className=\"rounded-md border cofhe-card-border cofhe-card-bg px-2 py-1 shadow-sm\">\n <div className=\"text-xxxs opacity-70\">{typeof label === 'number' ? formatTime(label) : ''}</div>\n <div className=\"text-xs font-semibold cofhe-text-primary\">{formatUsd(v)}</div>\n </div>\n );\n};\n\nconst themeClasses = {\n /** Used by the chart line + area fill via `currentColor` */\n accent: 'text-teal-500 dark:text-teal-400',\n /** Recharts renders grid lines as SVG paths with this class */\n gridLines:\n '[&_.recharts-cartesian-grid_line]:stroke-slate-400/25 dark:[&_.recharts-cartesian-grid_line]:stroke-white/10',\n /** Recharts tooltip cursor is an SVG path with this class */\n tooltipCursor:\n '[&_.recharts-tooltip-cursor]:stroke-current [&_.recharts-tooltip-cursor]:stroke-opacity-35 dark:[&_.recharts-tooltip-cursor]:stroke-opacity-45',\n} as const;\n\nexport const TokenPriceChart: React.FC<TokenPriceChartProps> = ({ points, className, height = 150 }) => {\n const gradientId = useId();\n\n const { start, mid, end } = useMemo(() => {\n if (!points.length) {\n const now = Date.now();\n return { start: now - 24 * 3600_000, mid: now - 12 * 3600_000, end: now };\n }\n const start = points[0].ts;\n const end = points[points.length - 1].ts;\n const mid = start + (end - start) / 2;\n return { start, mid, end };\n }, [points]);\n\n return (\n <div\n className={cn(\n 'w-full',\n // Tailwind-driven theming for Recharts (SVG) using `currentColor` + nested selectors\n themeClasses.accent,\n themeClasses.gridLines,\n themeClasses.tooltipCursor,\n className\n )}\n >\n <div style={{ height }} className=\"w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={points} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity={0.5} />\n <stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity={0} />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} strokeDasharray=\"3 3\" />\n\n <XAxis dataKey=\"ts\" type=\"number\" domain={['dataMin', 'dataMax']} hide />\n <YAxis dataKey=\"value\" domain={['dataMin', 'dataMax']} hide />\n <Tooltip content={CustomTooltip} />\n\n <Area\n type=\"monotone\"\n dataKey=\"value\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fillOpacity={1}\n fill={`url(#${gradientId})`}\n dot={false}\n activeDot={{ r: 4, stroke: 'currentColor', strokeWidth: 2, fill: '#ffffff' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n\n <div className=\"flex items-center justify-between text-xxxs opacity-60 mt-1\">\n <span>{formatTime(start)}</span>\n <span>{formatTime(mid)}</span>\n <span>{formatTime(end)}</span>\n </div>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { type ReactNode } from 'react';\n\ninterface PageContainerProps {\n /** Whether the page is a modal */\n isModal?: boolean;\n /** Optional header component that will be fixed at the top */\n header?: ReactNode;\n /** Body content that will be scrollable if it overflows */\n content?: ReactNode;\n /** Optional footer component that will be pinned to the bottom */\n footer?: ReactNode;\n}\n\n/**\n * PageContainer provides a consistent layout structure for pages with:\n * - Optional header (fixed at top)\n * - Scrollable body content\n * - Optional footer (pinned at bottom)\n * - Max height of 500px, but shrinks to fit content when smaller\n */\nexport const PageContainer: React.FC<PageContainerProps> = ({ isModal, header, content, footer }) => {\n return (\n <div className={cn('flex flex-col max-h-[500px] w-full gap-4', isModal ? '' : 'h-full')}>\n {/* Header - fixed at top, doesn't scroll */}\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n\n {/* Body - scrollable middle section that fills available space */}\n {content && <div className=\"flex-1 min-h-0 overflow-y-auto\">{content}</div>}\n\n {/* Footer - fixed at bottom, doesn't scroll */}\n {footer && <div className=\"flex-shrink-0\">{footer}</div>}\n </div>\n );\n};\n","import { formatUnits } from 'viem';\nimport { cn } from '../../../utils/cn.js';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { TbShieldPlus, TbShieldMinus, TbShieldCheck } from 'react-icons/tb';\nimport {\n type Transaction,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n} from '../../../stores/transactionStore.js';\nimport { formatRelativeTime } from '../../../utils/utils.js';\nimport { HashLink } from './HashLink.js';\n\ninterface TransactionItemProps {\n transaction: Transaction;\n}\n\nconst ActionIcon: React.FC<{ actionType: TransactionActionType }> = ({ actionType }) => {\n const iconClassName = 'w-5 h-5';\n\n switch (actionType) {\n case TransactionActionType.ShieldSend:\n return <GoArrowUpRight className={iconClassName} />;\n case TransactionActionType.Shield:\n return <TbShieldPlus className={iconClassName} />;\n case TransactionActionType.Unshield:\n return <TbShieldMinus className={iconClassName} />;\n case TransactionActionType.Claim:\n return <TbShieldCheck className={iconClassName} />;\n case TransactionActionType.Approve:\n return <GoArrowUpRight className={iconClassName} />;\n default:\n return <GoArrowUpRight className={iconClassName} />;\n }\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({ transaction }) => {\n const statusColorClass =\n transaction.status === TransactionStatus.Pending\n ? 'text-yellow-600 dark:text-yellow-400'\n : transaction.status === TransactionStatus.Confirmed\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400';\n\n return (\n <div className=\"cofhe-card-bg p-3 rounded-lg border cofhe-dropdown-border\">\n <div className=\"flex items-start gap-3\">\n {/* Action Icon */}\n <div className=\"w-8 h-8 rounded-full cofhe-icon-bg flex items-center justify-center flex-shrink-0 cofhe-text-primary\">\n <ActionIcon actionType={transaction.actionType} />\n </div>\n\n {/* Transaction Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold cofhe-text-primary\">{actionToString(transaction.actionType)}</span>\n <span className=\"text-sm font-semibold cofhe-text-primary\">\n {formatUnits(transaction.tokenAmount, transaction.token.decimals)} {transaction.token.symbol}\n </span>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-1\">\n <span className={cn('text-xs font-medium', statusColorClass)}>{statusToString(transaction.status)}</span>\n <span className=\"text-xs cofhe-text-primary opacity-60\">{formatRelativeTime(transaction.timestamp)}</span>\n </div>\n\n <div className=\"mt-1\">\n <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} copyable />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * Checks if we're in production by checking multiple environment variable sources\n * Supports: process.env (Node.js/webpack), import.meta.env (Vite), and other common patterns\n */\nexport const isProduction = (): boolean => {\n // Check process.env (Node.js, webpack, etc.)\n // eslint-disable-next-line turbo/no-undeclared-env-vars, no-undef\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n return false;\n }\n\n // Check import.meta.env (Vite)\n if (typeof import.meta !== 'undefined') {\n // {\n // \"BASE_URL\": \"/\",\n // \"DEV\": true,\n // \"MODE\": \"development\",\n // \"PROD\": false,\n // \"SSR\": false\n // }\n const metaEnv = (import.meta as any).env;\n\n // ONLY if ALL flags indicate development AND prod flag doesn't indicate prod, treat as development\n if (metaEnv && metaEnv.MODE === 'development' && metaEnv.DEV === true && metaEnv.PROD === false) {\n return false;\n }\n }\n\n // Default to hiding debug in library context\n return true;\n};\n","import { WalletHeader } from './MainPage/WalletHeader';\nimport { AssetCard } from './MainPage/AssetCard';\nimport { BottomNavigation } from './MainPage/BottomNavigation';\nimport { PageContainer } from '../components/PageContainer';\nimport { useCofheConnection } from '@/hooks';\n\nexport const MainPage: React.FC = () => {\n const { connected } = useCofheConnection();\n\n return (\n <PageContainer\n header={connected ? <WalletHeader /> : undefined}\n content={<AssetCard />}\n footer={connected ? <BottomNavigation /> : undefined}\n />\n );\n};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\n// ============================================================================\n// Shield Page Variants (A/B Testing)\n// ============================================================================\n\nexport enum ShieldPageVariant {\n Option1 = 'option1',\n Option2 = 'option2',\n}\n\nexport const SHIELD_PAGE_VARIANT_LABELS: Record<ShieldPageVariant, string> = {\n [ShieldPageVariant.Option1]: 'Modern UI',\n [ShieldPageVariant.Option2]: 'Classic UI',\n};\n\n// ============================================================================\n// Settings Store\n// ============================================================================\n\ninterface SettingsState {\n /** Selected shield page variant for A/B testing */\n shieldPageVariant: ShieldPageVariant;\n\n /** Set the shield page variant */\n setShieldPageVariant: (variant: ShieldPageVariant) => void;\n}\n\nexport const useSettingsStore = create<SettingsState>()(\n persist(\n (set) => ({\n shieldPageVariant: ShieldPageVariant.Option1,\n\n setShieldPageVariant: (variant) => set({ shieldPageVariant: variant }),\n }),\n {\n name: 'cofhe-settings',\n }\n )\n);\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { useSettingsStore, ShieldPageVariant, SHIELD_PAGE_VARIANT_LABELS } from '../stores/settingsStore.js';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const SettingsPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { shieldPageVariant, setShieldPageVariant } = useSettingsStore();\n\n const variants = Object.values(ShieldPageVariant);\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Settings</span>\n </button>\n }\n content={\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium\">A/B Testing</p>\n\n {/* Shield Page Variant */}\n <div className=\"space-y-2\">\n <p className=\"text-xs opacity-70\">Shield Page</p>\n <div className=\"space-y-1\">\n {variants.map((variant) => (\n <label key={variant} className=\"flex items-center gap-2 text-xs cursor-pointer\">\n <input\n type=\"radio\"\n name=\"shieldPageVariant\"\n checked={shieldPageVariant === variant}\n onChange={() => setShieldPageVariant(variant)}\n />\n <span>{SHIELD_PAGE_VARIANT_LABELS[variant]}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n }\n />\n );\n};\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { FaKey, FaDownload, FaPlus } from 'react-icons/fa';\nimport { type ElementType } from 'react';\nimport { Accordion, AccordionSection } from '../../../Accordion.js';\nimport { PermitItem } from '../components/PermitItem.js';\nimport { usePermitsList } from '@/hooks/permits/index.js';\nimport type { PermitActionId } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/CofheFloatingButton/components/PageContainer.js';\nimport { useCofheActivePermit } from '@/hooks/useCofhePermits.js';\nimport type { Permit } from '@cofhe/sdk/permits';\nimport { Button } from '@/components/CofheFloatingButton/components/Button.js';\nimport { InfoModalButton } from '@/components/CofheFloatingButton/modals/InfoModalButton.js';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/CofheFloatingButton/modals/types.js';\nimport { PermitCard } from '@/components/CofheFloatingButton/components/PermitCard.js';\n\ntype PermitActionItem = { id: PermitActionId; label: string; icon: ElementType };\n\nconst permitActions: PermitActionItem[] = [\n { id: 'generate', label: 'Generate', icon: FaPlus },\n { id: 'delegate', label: 'Delegate', icon: FaKey },\n { id: 'import', label: 'Import', icon: FaDownload },\n];\n\ntype Args = {\n generatedPermitsCount: number;\n receivedPermitsCount: number;\n activePermit?: Permit;\n};\n\nfunction computeDefaultActiveAccordionId({ activePermit }: Args): 'self' | 'received' {\n if (activePermit?.type === 'recipient') {\n return 'received';\n }\n return 'self';\n}\n\nexport const PermitsListPage: React.FC = () => {\n const { activePermitHash, selfPermits, delegatedPermits, importedPermits, handlePermitAction, handleOpenPermit } =\n usePermitsList();\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const { permit } = useCofheActivePermit() ?? {};\n\n const defaultActiveAccordionId = computeDefaultActiveAccordionId({\n generatedPermitsCount: selfPermits.length,\n receivedPermitsCount: importedPermits.length,\n activePermit: permit,\n });\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] dark:text-white\">\n <button\n className=\"inline-flex items-center gap-2 transition-opacity hover:opacity-80\"\n onClick={navigateBack}\n type=\"button\"\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Permits</span>\n </button>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitInfo)} />\n </div>\n {activePermitHash != null && (\n <PermitCard\n hash={activePermitHash}\n className=\"-ml-4 -mr-4\"\n header={<p className=\"text-sm font-semibold\">Active Permit:</p>}\n />\n )}\n </div>\n }\n content={\n <div className=\"gap-4\">\n <Accordion defaultActiveId={defaultActiveAccordionId}>\n <div className=\"flex flex-col gap-3\">\n <AccordionSection\n id=\"self\"\n renderHeader={() => <span>Self: ({selfPermits.length})</span>}\n accessory={<InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'self' })} />}\n >\n {selfPermits.length === 0 ? (\n <div className=\"pl-4 text-xs p-2 px-4 italic\">No self permits.</div>\n ) : (\n <div>\n {selfPermits.map((permit) => {\n return (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n );\n })}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"delegated\"\n renderHeader={() => <span>Delegated: ({delegatedPermits.length})</span>}\n accessory={\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'sharing' })} />\n }\n >\n {delegatedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No delegated permits.</div>\n ) : (\n <div>\n {delegatedPermits.map((permit) => (\n <PermitItem key={permit.hash} permit={permit} onClick={() => handleOpenPermit(permit.hash)} />\n ))}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"received\"\n renderHeader={() => <span>Imported: ({importedPermits.length})</span>}\n accessory={\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'recipient' })} />\n }\n >\n {importedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No imported permits.</div>\n ) : (\n <div>\n {importedPermits.map((permit) => (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n ))}\n </div>\n )}\n </AccordionSection>\n </div>\n </Accordion>\n </div>\n }\n footer={\n <div className=\"grid grid-cols-3 gap-2\">\n {permitActions.map(({ id, label, icon: Icon }) => (\n <Button key={id} onClick={() => handlePermitAction(id)} icon={<Icon />} iconPosition=\"top\" label={label} />\n ))}\n </div>\n }\n />\n );\n};\n","import { cn } from '@/utils';\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\nimport { Button } from './components';\nimport { FaChevronDown, FaChevronUp } from 'react-icons/fa6';\n\ninterface AccordionContextValue {\n activeId: string | null;\n toggle: (id: string) => void;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | undefined>(undefined);\n\ninterface AccordionProps {\n children: ReactNode;\n defaultActiveId?: string | null;\n}\n\nexport const Accordion = ({ children, defaultActiveId = null }: AccordionProps) => {\n const [activeId, setActiveId] = useState<string | null>(defaultActiveId);\n\n const handleToggle = useCallback(\n (id: string) => {\n setActiveId(activeId === id ? null : id);\n },\n [activeId]\n );\n\n const contextValue = useMemo<AccordionContextValue>(\n () => ({\n activeId,\n toggle: handleToggle,\n }),\n [handleToggle, activeId]\n );\n\n return <AccordionContext.Provider value={contextValue}>{children}</AccordionContext.Provider>;\n};\n\nconst useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion');\n }\n\n return context;\n};\n\ninterface AccordionSectionProps {\n id: string;\n renderHeader: (isOpen: boolean) => ReactNode;\n accessory?: ReactNode;\n children: ReactNode;\n sectionClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n}\n\nexport const AccordionSection = ({\n id,\n renderHeader,\n accessory,\n children,\n sectionClassName,\n triggerClassName,\n contentClassName,\n}: AccordionSectionProps) => {\n const { activeId, toggle } = useAccordionContext();\n const isOpen = activeId === id;\n\n return (\n <section className={sectionClassName}>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n className={cn('!justify-start flex-1 text-md py-2', triggerClassName)}\n aria-expanded={isOpen}\n onClick={() => toggle(id)}\n >\n {renderHeader(isOpen)}\n <span className=\"flex flex-1\" />\n {isOpen ? <FaChevronUp /> : <FaChevronDown />}\n </Button>\n {accessory ? <div className=\"shrink-0\">{accessory}</div> : null}\n </div>\n {isOpen ? (\n <div className={cn('relative', contentClassName)}>\n <span\n className=\"absolute left-0 top-0 bottom-0 border-l border-[#0E2F3F]/30 dark:border-white/40\"\n aria-hidden\n />\n {children}\n </div>\n ) : null}\n </section>\n );\n};\n","import type { PermitStatus } from '@/hooks/permits/index.js';\nimport { ValidationUtils, type Permit } from '@cofhe/sdk/permits';\nimport type { FC } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Button } from '@/components/CofheFloatingButton/components';\n\nconst statusStyles: Record<PermitStatus, string> = {\n active: 'bg-[#01D082] text-[#0D3547] border border-[#068571]',\n valid: 'bg-[#247AFF] text-white border border-[#247AFF]',\n expired: 'bg-[#F0784F] text-[#4A1004] border border-[#A1421F]',\n};\n\nconst statusToLabel: Record<PermitStatus, string> = {\n active: 'Active',\n valid: 'Valid',\n expired: 'Expired',\n};\n\ninterface PermitItemProps {\n permit: Permit;\n activePermitHash?: string;\n onClick?: (id: string) => void;\n}\n\nexport const PermitItem: FC<PermitItemProps> = ({ permit, onClick, activePermitHash }) => {\n const status: PermitStatus = ValidationUtils.isExpired(permit)\n ? 'expired'\n : permit.hash === activePermitHash\n ? 'active'\n : 'valid';\n\n return (\n <Button\n variant=\"ghost\"\n className=\"flex flex-row w-full items-centera !justify-start gap-3 p-0.5\"\n onClick={() => onClick?.(permit.hash)}\n >\n <span\n className={cn(\n 'inline-flex items-center justify-center px-1 py-1 text-sm font-semibold h-6 w-24',\n statusStyles[status]\n )}\n >\n {statusToLabel[status]}\n </span>\n {permit.name}\n </Button>\n );\n};\n","import { FaCircleInfo } from 'react-icons/fa6';\n\nexport const InfoModalButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className=\"inline-flex self-center\"\n >\n <FaCircleInfo />\n </button>\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport { zeroAddress } from 'viem';\nimport { cn, formatExpirationLabel, truncateAddress } from '@/utils';\nimport { useCopyFeedback } from '@/hooks/useCopyFeedback';\nimport { type Permit, type PermitType } from '@cofhe/sdk/permits';\nimport { PermitStripedBackground } from '@/components/StripedBackground';\nimport { useCofheActivePermitHash, useCofhePermit } from '@/hooks/useCofhePermits';\nimport { useMemo } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst CopyButton: React.FC<{ hash: string }> = ({ hash }) => {\n const { copiedKeys, copyWithFeedback } = useCopyFeedback();\n\n return (\n <button type=\"button\" onClick={() => copyWithFeedback(hash, hash)}>\n {copiedKeys.has(hash) ? <FaCheck /> : <FaRegCopy />}\n </button>\n );\n};\n\nexport const BasePermitCard: React.FC<{ permit: Permit; className?: string; header?: React.ReactNode }> = ({\n permit,\n className,\n header,\n}) => {\n const activePermitHash = useCofheActivePermitHash();\n const expirationInfo = formatExpirationLabel(permit.expiration);\n\n const metadataTags = useMemo(() => {\n const isActivePermit = permit.hash === activePermitHash;\n const tags: string[] = [];\n if (expirationInfo.expired) tags.push('expired');\n if (expirationInfo.expiringSoon) tags.push('expiring soon');\n if (isActivePermit) tags.push('active');\n return tags;\n }, [expirationInfo.expired, expirationInfo.expiringSoon, activePermitHash, permit]);\n\n return (\n <div\n className={cn(\n 'relative gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n <PermitStripedBackground\n variant={expirationInfo.expired ? 'error' : expirationInfo.expiringSoon ? 'warning' : permit.type}\n className=\"absolute inset-0 z-[1]\"\n />\n <div className=\"relative z-[2] flex flex-1 flex-col gap-3\">\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left\">\n <b>-- {PermitTypeLabel[permit.type].toUpperCase()} PERMIT --</b>\n <br />\n Name: <b>{permit.name}</b>\n <br />\n Issuer: <b>{truncateAddress(permit.issuer, 6, 6)}</b> <CopyButton hash={permit.issuer} />\n <br />\n Expiration:{' '}\n <b>\n {permit.expiration} <i>({expirationInfo.label})</i>\n </b>\n <br />\n {permit.recipient != null && permit.recipient !== zeroAddress && (\n <>\n Recipient: <b>{truncateAddress(permit.recipient, 6, 6)}</b> <CopyButton hash={permit.recipient} />\n <br />\n </>\n )}\n {permit.validatorContract != null && permit.validatorContract !== zeroAddress && (\n <>\n Validator:\n <br />\n {' '}Contract: <b>{truncateAddress(permit.validatorContract, 6, 6)}</b>{' '}\n <CopyButton hash={permit.validatorContract} />\n <br />\n {' '}ID: <b>{permit.validatorId}</b>\n <br />\n </>\n )}\n {metadataTags.length > 0 && <br />}\n {metadataTags.map((tag) => (\n <b key={tag}>\n -- {tag.toUpperCase()} --\n <br />\n </b>\n ))}\n </pre>\n </div>\n </div>\n );\n};\n\nexport const PermitCard: React.FC<{ hash: string; className?: string; header?: React.ReactNode }> = ({\n hash,\n className,\n header,\n}) => {\n const permit = useCofhePermit(hash);\n\n if (permit == null) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left italic p-10\">Permit not found.</pre>\n </div>\n );\n }\n\n return <BasePermitCard permit={permit} className={className} header={header} />;\n};\n","import { cn } from '@/utils/cn';\nimport { type CSSProperties, useMemo } from 'react';\n\ntype StripeProps = {\n /** CSS color for stripes: \"#f00\", \"rgb(...)\", \"hsl(...)\", \"currentColor\", etc. Use \"currentColor\" with Tailwind text color classes. */\n stripeColor?: string;\n /** Background/base color behind the stripes */\n baseColor?: string;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport function StripedBackground({\n stripeColor = 'rgba(255,255,255,0.18)',\n baseColor = 'transparent',\n className,\n style,\n children,\n}: StripeProps) {\n const bgImage = useMemo(() => {\n // 2px stripe, 2px gap, repeating at 45 degrees (positive diagonal)\n return `repeating-linear-gradient(\n 45deg,\n ${stripeColor} 0px,\n ${stripeColor} 2px,\n transparent 2px,\n transparent 4px\n )`;\n }, [stripeColor]);\n\n const mergedStyle: CSSProperties = {\n backgroundColor: baseColor,\n backgroundImage: bgImage,\n ...style,\n };\n\n return (\n <div className={className} style={mergedStyle}>\n {children}\n </div>\n );\n}\n\ntype PermitStripedProps = {\n variant: 'self' | 'sharing' | 'recipient' | 'error' | 'warning';\n className?: string;\n children?: React.ReactNode;\n};\n\nconst PermitStripedVariantColors: Record<PermitStripedProps['variant'], string> = {\n self: 'text-blue-500',\n sharing: 'text-green-500',\n recipient: 'text-purple-500',\n error: 'text-red-500',\n warning: 'text-yellow-500',\n};\n\nconst PermitStripedVariantOpacities: Record<PermitStripedProps['variant'], string> = {\n self: 'opacity-15',\n sharing: 'opacity-15',\n recipient: 'opacity-15',\n error: 'opacity-30',\n warning: 'opacity-30',\n};\n\nexport const PermitStripedBackground = ({ variant, className, children }: PermitStripedProps) => {\n const color = PermitStripedVariantColors[variant];\n const opacity = PermitStripedVariantOpacities[variant];\n return (\n <StripedBackground stripeColor=\"currentColor\" className={cn(color, opacity, className)}>\n {children}\n </StripedBackground>\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitIcon = (props: SVGProps<SVGSVGElement>) => <svg width={19} height={22} viewBox=\"0 0 19 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 19V21.97H14V19H11V17H14V14H16V17H19V19H16ZM18 10C18 10.9 17.9 11.78 17.71 12.65C17.13 12.35 16.5 12.15 15.81 12.05C15.93 11.45 16 10.83 16 10.22V5.3L9 2.18L2 5.3V10.22C2 14.54 5.25 19 9 20L9.31 19.91C9.5 20.53 9.83 21.11 10.22 21.62L9 22C3.84 20.74 0 15.55 0 10V4L9 0L18 4V10Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitIcon;","export type NameSectionProps = {\n permitName: string;\n error?: string | null;\n onNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const NameSection: React.FC<NameSectionProps> = ({ permitName, error, onNameChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Name:</span>\n </div>\n <input\n id=\"permit-name\"\n type=\"text\"\n placeholder=\"Human readable name\"\n value={permitName}\n onChange={onNameChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Permit name\"\n />\n {error && (\n <p role=\"alert\" className=\"px-4 pt-1 text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {error}\n </p>\n )}\n </div>\n);\n","import { Button } from '@/components/CofheFloatingButton/components';\n\nexport const ExpirySection = <U extends string>({\n presets,\n units,\n durationSeconds,\n customCount,\n customUnit,\n selectPreset,\n setCustomUnit,\n applyCustom,\n}: {\n presets: ReadonlyArray<{ label: string; seconds: number }>;\n units: ReadonlyArray<U>;\n durationSeconds: number;\n customCount: number | '';\n customUnit: U;\n selectPreset: (seconds: number) => void;\n setCustomUnit: (u: U) => void;\n applyCustom: (count: number | '', unit: U) => void;\n}) => (\n <div className=\"flex flex-col w-full gap-2\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Expiration:</span>\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {presets.map((option) => {\n const isActive = durationSeconds === option.seconds;\n return (\n <Button\n key={option.label}\n variant={isActive ? 'primary' : 'default'}\n onClick={() => selectPreset(option.seconds)}\n label={option.label}\n />\n );\n })}\n </div>\n\n {/* TODO: Re-enable custom duration input */}\n {/* <p className=\"text-base font-semibold text-[#0E2F3F] dark:text-white\">- or -</p>\n <div className=\"flex flex-row w-full items-center gap-3\">\n <div className=\"flex-1\">\n <input\n id=\"custom-duration-count\"\n type=\"number\"\n min={1}\n placeholder=\"#\"\n value={customCount}\n onChange={(e) => {\n const raw = e.target.value;\n const v = raw === '' ? '' : Math.max(1, Number(raw));\n applyCustom(v, customUnit);\n }}\n className=\"border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Custom duration count\"\n />\n </div>\n <div className=\"flex items-center gap-2 rounded-xl border border-[#0E2F3F]/40 px-3 py-2 text-base font-semibold text-[#0E2F3F] dark:border-white/40 dark:text-white\">\n <div className=\"flex-1\">\n <label htmlFor=\"custom-duration-unit\" className=\"sr-only\">\n Custom duration unit\n </label>\n </div>\n <select\n id=\"custom-duration-unit\"\n value={customUnit}\n onChange={(e) => setCustomUnit(e.target.value as U)}\n className=\"bg-transparent outline-none appearance-none pr-5\"\n aria-label=\"Custom duration unit\"\n >\n {units.map((u) => (\n <option key={u as string} value={u as string} className=\"text-[#0E2F3F]\">\n {u}\n </option>\n ))}\n </select>\n </div>\n </div> */}\n </div>\n);\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/CofheFloatingButton/pagesConfig/types';\nimport type { GeneratePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/CofheFloatingButton/components/PageContainer';\nimport { Button } from '@/components/CofheFloatingButton/components';\n\nexport const GeneratePermitPage: React.FC<GeneratePermitPageProps> = ({\n onSuccessNavigateTo,\n onCancel,\n onBack,\n cause,\n}) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n error,\n nameError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: false,\n onSuccess: () => {\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Create Self-usage Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n {cause === 'clicked_on_confidential_balance' && (\n <>You are trying to view a confidential balance, which requires a permit to access the encrypted data.</>\n )}\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form creates a \"SELF\" permit, which only grants access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","export type ReceiverSectionProps = {\n receiver: string;\n receiverError?: string | null;\n onReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const ReceiverSection: React.FC<ReceiverSectionProps> = ({ receiver, receiverError, onReceiverChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Receiver:</span>\n </div>\n <input\n id=\"receiver-address\"\n type=\"text\"\n placeholder=\"Receiver address (0x...)\"\n value={receiver}\n onChange={onReceiverChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Receiver address\"\n />\n {receiverError && (\n <p role=\"alert\" className=\"text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {receiverError}\n </p>\n )}\n </div>\n);\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ReceiverSection } from '../components/ReceiverSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/CofheFloatingButton/pagesConfig/types';\nimport type { DelegatePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/CofheFloatingButton/components/PageContainer';\nimport { Button } from '@/components/CofheFloatingButton/components';\n\nexport const DelegatePermitPage: React.FC<DelegatePermitPageProps> = ({ onSuccessNavigateTo, onCancel, onBack }) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: true,\n onSuccess: () => {\n // TODO: also add toast here in any case\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n description: 'Copy and share data with recipient',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Delegate Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form generates a permit that can be copied and shared with \"recipient\". Recipient will be granted\n access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n <ReceiverSection receiver={receiver} receiverError={receiverError} onReceiverChange={handleReceiverChange} />\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitReceive = (props: SVGProps<SVGSVGElement>) => <svg width={21} height={21} viewBox=\"0 0 21 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12C9.1 12 10 12.89 10 14C10 15.11 9.11 16 8 16C6.89 16 6 15.11 6 14C6 12.89 6.9 12 8 12ZM16 0C13.24 0 11 2.24 11 5V7H2C0.9 7 0 7.9 0 9V19C0 20.1 0.9 21 2 21H14C15.1 21 16 20.1 16 19V9C16 7.9 15.1 7 14 7H13V5C13 3.34 14.34 2 16 2C17.66 2 19 3.34 19 5V7H21V5C21 2.24 18.76 0 16 0ZM14 9V19H2V9H14Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitReceive;","import { ArrowBackIcon } from '@/components/Icons';\nimport PermitReceiveIcon from '@/assets/fhenix-permit-receive.svg';\nimport { useReceivePermit } from '@/hooks/permits/index.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/CofheFloatingButton/components/PageContainer';\nimport { Button } from '@/components/CofheFloatingButton/components/Button.js';\nimport { BasePermitCard } from '@/components/CofheFloatingButton/components/PermitCard.js';\nimport { cofheLogger } from '@/utils/debug';\n\nexport const ImportPermitPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n importedPermit,\n permitData,\n setPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n } = useReceivePermit({\n onSuccess: () => {\n navigateBack();\n addToast({\n variant: 'success',\n title: 'Permit imported',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to import permit',\n description: error.message,\n });\n cofheLogger.error('Error importing permit', error);\n },\n });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Import permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitReceiveIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE import permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n This form importes a permit that has been shared with you.\n <br />\n Paste the permit data into the input below to import it.\n </p>\n\n {importedPermit == null && (\n <textarea\n id=\"cofhe-permit-data\"\n rows={8}\n placeholder=\"Paste permit data\"\n className=\"w-full border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitData}\n onChange={(e) => setPermitData(e.target.value)}\n />\n )}\n\n {importedPermit != null && (\n <>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"cofhe-permit-name\">\n Imported Permit:\n </label>\n <BasePermitCard permit={importedPermit} />\n </div>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"cofhe-permit-name\">\n Name override:\n </label>\n <input\n id=\"cofhe-permit-name\"\n type=\"text\"\n placeholder={importedPermit.name ?? 'Permit name...'}\n className=\"w-full rounded-xl border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitName}\n onChange={(e) => setPermitName(e.target.value)}\n />\n </div>\n </>\n )}\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {errorMsg && <div className=\"text-red-600 text-sm\">{errorMsg}</div>}\n {successMsg && <div className=\"text-green-600 text-sm\">{successMsg}</div>}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button variant=\"default\" onClick={navigateBack}>\n Cancel\n </Button>\n <Button variant=\"primary\" disabled={isSubmitting} onClick={submit}>\n {isSubmitting ? 'Importing...' : 'Import Permit'}\n </Button>\n </div>\n </div>\n }\n />\n );\n};\n","import type { Token } from '@/types/token';\nimport { useCoingeckoContractMarketChartRange } from '@/hooks';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\nimport { useMemo } from 'react';\n\nimport { ArrowBackIcon } from '@/components/Icons';\n\nimport { Button } from '../components/Button';\nimport { PageContainer } from '../components/PageContainer';\nimport { TokenInfoBalanceChart } from './TokenInfoBalanceChart';\nimport { TokenInfoTransactionHistory, TokenInfoTransactionHistoryHeader } from './TokenInfoTransactionHistory';\n\ntype TokenInfoPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.TokenInfo]: TokenInfoPageProps;\n }\n}\n\nexport const TokenInfoPage: React.FC<TokenInfoPageProps> = ({ token }) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const { data: chartPoints } = useCoingeckoContractMarketChartRange({\n ...(token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n contractAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n contractAddress: token.extensions.fhenix.erc20Pair?.address,\n }),\n rangeMs: 24 * 3600_000,\n });\n\n const priceUsd = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n return lastPoint?.value;\n }, [chartPoints]);\n\n return (\n <PageContainer\n header={\n <>\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-medium\">Tokens list</p>\n </div>\n </button>\n </div>\n\n <TokenInfoBalanceChart token={token} chartPoints={chartPoints ?? []} />\n\n <TokenInfoTransactionHistoryHeader token={token} />\n </>\n }\n content={<TokenInfoTransactionHistory token={token} priceUsd={priceUsd} />}\n footer={\n <div className=\"flex gap-3\">\n <Button\n variant=\"primary\"\n className=\"flex-1\"\n label=\"Unshield\"\n onClick={() =>\n navigateTo(FloatingButtonPage.Shield, {\n pageProps: {\n token,\n defaultMode: 'unshield',\n },\n })\n }\n />\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n label=\"Send\"\n onClick={() => navigateTo(FloatingButtonPage.Send, { pageProps: { token } })}\n />\n </div>\n }\n />\n );\n};\n","import { useMemo } from 'react';\n\nimport { LockIcon, PublicIcon } from '@/components/Icons';\n\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { useCofheTokenDecryptedBalance } from '@/hooks';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\n\nimport { TokenIcon } from '../components/TokenIcon';\nimport { TokenPriceChart, type TokenPriceChartPoint } from '../components/TokenPriceChart';\nimport { LoadingDots } from '../components/LoadingDots';\nimport { CofheTokenConfidentialBalance } from '../components/CofheTokenConfidentialBalance';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoBalanceChartProps {\n token: Token;\n chartPoints: TokenPriceChartPoint[];\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoBalanceChart: React.FC<TokenInfoBalanceChartProps> = ({ token, chartPoints }) => {\n const account = useCofheAccount();\n\n const { data: publicBalance, isFetching: isFetchingPublicBalance } = useCofheTokenPublicBalance({ token });\n\n const { data: confidentialBalance, isFetching: isFetchingConfidentialBalance } = useCofheTokenDecryptedBalance({\n accountAddress: account,\n token,\n });\n\n const isFetchingBalances = isFetchingConfidentialBalance || isFetchingPublicBalance;\n\n const balancePercents = useMemo(() => {\n if (!confidentialBalance && !publicBalance) return;\n\n const confidentialUnit = confidentialBalance?.unit ?? null;\n const publicUnit = publicBalance?.unit ?? null;\n\n const totalUnit = (confidentialUnit?.plus(publicUnit ?? 0) ?? publicUnit)?.toNumber() ?? 0;\n\n const confidentialPct =\n totalUnit && totalUnit > 0 && confidentialUnit\n ? parseInt(confidentialUnit.div(totalUnit).times(100).toFixed(2))\n : 0;\n\n const publicPct = 100 - confidentialPct;\n\n return {\n confidentialPct,\n publicPct,\n };\n }, [confidentialBalance, publicBalance]);\n\n const price = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n const firstPoint = chartPoints?.[0];\n\n if (!lastPoint || !firstPoint) return;\n\n return {\n valueUsd: lastPoint.value,\n changeUsd: lastPoint.value - firstPoint.value,\n changePct: ((lastPoint.value - firstPoint.value) / firstPoint.value) * 100,\n };\n }, [chartPoints]);\n\n return (\n <>\n {/* Token summary */}\n <div className=\"p-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <TokenIcon logoURI={token.logoURI} alt={token.extensions.fhenix.erc20Pair?.symbol} size=\"md\" />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-bold cofhe-text-primary\">{token.extensions.fhenix.erc20Pair?.symbol}</p>\n <div className=\"flex items-center gap-3 text-xxs opacity-80\">\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Confidential balance percent\"\n aria-label=\"Confidential balance percent\"\n >\n <LockIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.confidentialPct}%</span>\n )}\n </div>\n\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Public balance percent\"\n aria-label=\"Public balance percent\"\n >\n <PublicIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.publicPct}%</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <CofheTokenConfidentialBalance token={token} size=\"lg\" decimalPrecision={5} className=\"font-bold\" />\n {price && (\n <div className=\"flex flex-row\">\n <p className=\"text-xxs \">{money(price.valueUsd)}</p>\n <p className=\"text-xxs cofhe-text-primary\">\n <span>\n ({price.changeUsd > 0 ? '+' : ''} {price.changePct.toFixed(2)}%)\n </span>\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Price + chart */}\n <div className=\"space-y-2\">\n {price && (\n <div className=\"flex items-end justify-between\">\n <div></div>\n <div className=\"text-xxxs opacity-60\">Last 24h</div>\n </div>\n )}\n\n <div className=\"p-3\">\n <TokenPriceChart points={chartPoints} />\n </div>\n </div>\n </>\n );\n};\n","import { useMemo } from 'react';\n\nimport { formatUnits } from 'viem';\n\nimport { HashLink } from '../components/HashLink';\nimport { cn } from '@/utils/cn';\n\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { actionToString } from '@/stores/transactionStore';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoTransactionHistoryHeaderProps {\n token: Token;\n}\n\nexport const TokenInfoTransactionHistoryHeader: React.FC<TokenInfoTransactionHistoryHeaderProps> = ({ token }) => {\n return (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-bold cofhe-text-primary\">Activity</h3>\n <HashLink type=\"token\" hash={token.address} chainId={token.chainId} extraShort />\n {token.extensions.fhenix.erc20Pair?.address && (\n <HashLink type=\"token\" hash={token.extensions.fhenix.erc20Pair.address} chainId={token.chainId} extraShort />\n )}\n </div>\n );\n};\n\ninterface TokenInfoTransactionHistoryProps {\n token: Token;\n priceUsd?: number;\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoTransactionHistory: React.FC<TokenInfoTransactionHistoryProps> = ({ token, priceUsd }) => {\n const account = useCofheAccount();\n\n const { filteredTxs: tokenTxs } = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter: (tx) => tx.token.address.toLowerCase() === token.address.toLowerCase(),\n });\n\n const activity = useMemo(() => {\n return tokenTxs\n .slice()\n .sort((a, b) => b.timestamp - a.timestamp)\n .map((tx) => {\n const amountToken = parseFloat(formatUnits(tx.tokenAmount, tx.token.decimals));\n const amountUsd =\n typeof priceUsd === 'number' && Number.isFinite(amountToken) ? amountToken * priceUsd : undefined;\n\n return {\n kind: actionToString(tx.actionType),\n amountUsd,\n amountToken: Number.isFinite(amountToken) ? amountToken : 0,\n };\n });\n }, [tokenTxs, priceUsd]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"p-3\">\n {!activity || activity.length === 0 ? (\n <div className=\"py-6 text-center\">\n <p className=\"text-sm cofhe-text-primary opacity-60\">No activity found</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {activity.map((item, idx) => {\n return (\n <div key={idx} className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-2\">\n <div\n className={cn(\n 'w-8 h-8 rounded-full',\n 'bg-cyan-200/70 dark:bg-cyan-900/40',\n 'flex items-center justify-center'\n )}\n />\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-bold cofhe-text-primary\">{item.kind}</p>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <p className=\"text-sm font-bold cofhe-text-primary\">\n {typeof item.amountUsd === 'number' ? money(item.amountUsd) : '--'}\n </p>\n <p className=\"text-xxxs opacity-70\">\n {item.amountToken} {token.symbol}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useState, useMemo } from 'react';\nimport { ArrowBackIcon, KeyboardArrowRightIcon } from '@/components/Icons';\nimport { isAddress, maxUint128 } from 'viem';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheTokenTransfer } from '@/hooks/useCofheTokenTransfer';\nimport { cn } from '../../../utils/cn';\nimport { truncateAddress, sanitizeNumericInput } from '../../../utils/utils';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { unitToWei } from '@/utils/format';\nimport { assert } from 'ts-essentials';\nimport { CofheTokenConfidentialBalance } from '../components';\nimport { useCofheTokensWithExistingEncryptedBalances, type Token } from '@/hooks';\nimport { getStepConfig } from '@/hooks/useCofheEncrypt';\nimport { cofheHumanizeViemError } from '@/utils/cofheErrors';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { cofheLogger } from '@/utils/debug';\n\nexport type SendPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Send]: SendPageProps;\n }\n}\n\nexport const SendPage: React.FC<SendPageProps> = ({ token: _token }) => {\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n\n const token = overriddenToken ?? _token;\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const account = useCofheAccount();\n const {\n encryptAmountAndSendToken,\n data: txHash,\n isPending: isEncryptingOrSendingTx,\n write: { isPending: isSending },\n encryption: {\n stepsState: { lastStep },\n isEncrypting: isEncryptingInput,\n },\n } = useCofheTokenTransfer({\n onError: (error) => {\n const errorMessage =\n cofheHumanizeViemError(error) ?? (error instanceof Error ? error.message : 'Failed to send tokens');\n setError(errorMessage);\n cofheLogger.error('Send tx submit error:', error);\n },\n onMutate: () => {\n setError(null);\n setSuccess(null);\n },\n onSuccess: (hash) => {\n setSuccess(`Transaction sent! Hash: ${truncateAddress(hash)}. Is being mined...`);\n setAmount('');\n setRecipientAddress('');\n },\n });\n\n useOnceTransactionMined({\n txHash,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setSuccess(`Transaction confirmed! Hash: ${truncateAddress(transaction.hash)}`);\n } else if (transaction.status === 'failed') {\n setError(`Transaction failed! Hash: ${truncateAddress(transaction.hash)}`);\n }\n },\n });\n\n const { data: { unit: confidentialUnitBalance } = {} } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: account,\n });\n\n const encryptionProgressLabel = useMemo(() => lastStep?.step && getStepConfig(lastStep).label, [lastStep]);\n\n const [amount, setAmount] = useState('');\n const [recipientAddress, setRecipientAddress] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // Validate recipient address\n const isValidAddress = isAddress(recipientAddress);\n\n // Validate amount\n const isValidAmount = (amount.length > 0 && confidentialUnitBalance && confidentialUnitBalance.gte(amount)) ?? false;\n\n const handleSend = async () => {\n assert(isAddress(recipientAddress), 'Recipient address is not valid');\n\n // Check if amount exceeds uint128 max value (2^128 - 1)\n // Convert amount to token's smallest unit (considering decimals)\n const amountWei = unitToWei(amount, token.decimals);\n // TODO: Does this need to be different if the confidential token uses euint64 for the balance precision?\n assert(amountWei <= maxUint128, 'Amount exceeds maximum supported value (uint128 max)');\n assert(account, 'Sender account is required');\n\n // Use the token transfer hook to send encrypted tokens\n await encryptAmountAndSendToken({\n input: {\n token,\n to: recipientAddress,\n amount: amountWei,\n userAddress: account,\n },\n });\n };\n\n const handleMaxAmount = () => {\n // Calculate available balance for MAX button\n if (confidentialUnitBalance) setAmount(confidentialUnitBalance.toFixed());\n };\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n\n const disabled = !isValidAddress || !isValidAmount || isSending || isEncryptingInput;\n return (\n <PageContainer\n header={\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shielded Transfer</p>\n </button>\n }\n content={\n <>\n {/* Asset Section */}\n <div className=\"cofhe-card-bg p-2 border cofhe-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Asset to be sent</label>\n </div>\n <div className=\"flex items-center gap-3\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"md\" />\n\n {/* Amount Input and Symbol on same line, centered with logo */}\n <div className=\"flex-1 flex items-center gap-1 min-w-0\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => {\n setAmount(sanitizeNumericInput(e.target.value));\n }}\n placeholder=\"0.00\"\n className=\"flex-1 min-w-0 bg-transparent text-2xl font-bold cofhe-text-primary outline-none placeholder:opacity-50\"\n />\n <button\n onClick={() => {\n openModal(PortalModal.TokenList, {\n balanceType: BalanceType.Confidential,\n tokens: tokensWithExistingEncryptedBalance,\n title: 'Select token to transfer',\n onSelectToken: (token) => {\n setOverriddenToken(token);\n },\n });\n }}\n className=\"flex items-center gap-1 text-2xl font-bold cofhe-text-primary hover:opacity-80 transition-opacity whitespace-nowrap flex-shrink-0\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowRightIcon className=\"w-5 h-5 cofhe-text-primary opacity-60 flex-shrink-0\" />\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-3 -mt-1 text-xs opacity-70\">\n {/* Invisible placeholder to align with icon above */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Available text and MAX button */}\n <div className=\"flex-1 flex items-center justify-start min-w-0 gap-2\">\n <span className=\"text-xs opacity-70\">Available </span>\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={true}\n size=\"sm\"\n decimalPrecision={5}\n className=\"text-xs opacity-70 font-medium\"\n />\n <button\n onClick={handleMaxAmount}\n className=\"cofhe-max-button text-xxxs ml-1 font-medium px-0.5 py-0.2 rounded\"\n >\n MAX\n </button>\n </div>\n </div>\n </div>\n\n {/* Down Arrow */}\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 rounded-full cofhe-icon-bg flex items-center justify-center\">\n <span className=\"text-lg\">↓</span>\n </div>\n </div>\n\n {/* Recipient Address */}\n <div className=\"cofhe-card-bg p-4 border cofhe-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Recipient Address:</label>\n </div>\n <input\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"0x...\"\n className={cn(\n 'w-full bg-transparent cofhe-text-primary outline-none border-b pb-2 px-2',\n 'placeholder:opacity-50',\n isValidAddress ? 'border-green-500' : recipientAddress ? 'border-red-500' : 'cofhe-card-border'\n )}\n />\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-3\">\n <p className=\"text-sm text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Success Message */}\n {success && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-3\">\n <p className=\"text-sm text-green-800 dark:text-green-200\">{success}</p>\n </div>\n )}\n\n {/* Encryption Status */}\n {isEncryptingOrSendingTx && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-3\">\n <p className=\"text-sm text-blue-800 dark:text-blue-200\">\n {isEncryptingInput ? encryptionProgressLabel || 'Encrypting amount...' : 'Sending transaction...'}\n </p>\n </div>\n )}\n </>\n }\n footer={\n <button\n onClick={handleSend}\n disabled={disabled}\n className={cn(\n 'cofhe-send-button w-full py-3 px-4 font-small',\n 'flex items-center justify-center gap-2',\n disabled ? 'cofhe-send-button-disabled' : 'cofhe-send-button-enabled'\n )}\n >\n <span>Send</span>\n <span className=\"text-lg\">↗</span>\n </button>\n }\n />\n );\n};\n","import { ArrowBackIcon, KeyboardArrowDownIcon } from '@/components/Icons';\nimport { TbShieldPlus, TbShieldMinus } from 'react-icons/tb';\nimport { LuExternalLink } from 'react-icons/lu';\nimport { useMemo, useState } from 'react';\nimport { ContractFunctionExecutionError, parseUnits, type Address } from 'viem';\nimport { isTokenOperationSupported } from '@/types/token';\nimport { useCofheAccount, useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { useCofheTokenShield } from '@/hooks/useCofheTokenShield';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { cn } from '../../../utils/cn';\nimport { getBlockExplorerTxUrl, truncateHash } from '../../../utils/utils';\nimport { ActionButton, AmountInput, CofheTokenConfidentialBalance, TokenIcon } from '../components/index';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { formatTokenAmount, unitToWei } from '@/utils/format';\nimport {\n getCofheTokenClaimUnshieldedCallArgs,\n getCofheTokenShieldCallArgs,\n getCofheTokenUnshieldCallArgs,\n useCofheSimulateWriteContract,\n useCofheTokenApprove,\n useCofheTokenClaimUnshielded,\n useCofheTokenUnshield,\n useCofheTokenClaimable,\n useCofheTokensWithExistingEncryptedBalances,\n useTokensWithPublicBalances,\n useTokenAllowance,\n} from '@/hooks';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { useReschedulableTimeout } from '@/hooks/useReschedulableTimeout';\nimport { assert } from 'ts-essentials';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { BalanceType, CofheTokenPublicBalance } from '../components/CofheTokenConfidentialBalance';\nimport { useIsUnshieldingMining } from '@/hooks/useIsUnshieldingMining';\nimport { cofheHumanizeViemError } from '@/utils/cofheErrors';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { CopyButton } from '../components/HashLink';\nimport { cofheLogger } from '@/utils/debug';\n\nconst AUTOCLEAR_TX_STATUS_TIMEOUT = 5000;\nconst DISPLAY_DECIMALS = 5;\n\ntype Mode = 'shield' | 'unshield';\n\ntype LifecycleStatus = { message: React.ReactNode; type: 'info' | 'success' };\n\nexport type ShieldPageProps = {\n token: Token;\n defaultMode?: Mode;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Shield]: ShieldPageProps;\n }\n}\n\nfunction useLifecycleStore() {\n const [error, setError] = useState<React.ReactNode | null>(null);\n const [status, setStatus] = useState<LifecycleStatus | null>(null);\n return {\n error,\n setError,\n status,\n setStatus,\n };\n}\n\nfunction humanizeSimulationError(error: unknown, fallbackMessage: string): React.ReactNode | null {\n if (!error) return null;\n const cofheErrorMessage = cofheHumanizeViemError(error);\n if (cofheErrorMessage) return cofheErrorMessage;\n if (error instanceof ContractFunctionExecutionError) return error.shortMessage;\n return fallbackMessage;\n}\n\nfunction TxHashWithActions({ hash, chainId }: { hash: string; chainId?: number }) {\n const href = chainId ? getBlockExplorerTxUrl(chainId, hash) : undefined;\n const ellipsed = truncateHash(hash);\n\n const handleOpenExplorer = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <span className=\"inline-flex items-center gap-1.5 align-baseline\">\n <span className=\"font-mono\">{ellipsed}</span>\n <CopyButton text={hash} size={14} />\n <button\n type=\"button\"\n onClick={handleOpenExplorer}\n disabled={!href}\n aria-label=\"Open transaction in explorer\"\n title={href ? 'Open in explorer' : 'Explorer not available for this chain'}\n className={cn(\n 'cofhe-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer',\n !href && 'cursor-default opacity-30'\n )}\n >\n <LuExternalLink style={{ width: 14, height: 14 }} />\n </button>\n </span>\n );\n}\n\n// Reusable hook to safely auto-clear a status message after a delay\n// (moved) useReschedulableTimeout is now in '@/hooks/useReschedulableTimeout'\n\nfunction useClaimUnshieldedWithLifecycle() {\n const { setError, setStatus, error, status } = useLifecycleStore();\n const chainId = useCofheChainId();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const claimUnshield = useCofheTokenClaimUnshielded({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing claim transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Claim transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n },\n onError: (error) => {\n const errorMessage =\n cofheHumanizeViemError(error) ?? (error instanceof Error ? error.message : 'Failed to claim unshielded tokens');\n setError(errorMessage);\n setStatus(null);\n cofheLogger.error('Claim tx submit error:', error);\n },\n });\n\n const { isMining: isClaimingMining } = useOnceTransactionMined({\n txHash: claimUnshield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Claim transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Claim transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n return {\n claimUnshield,\n isClaimingMining,\n error,\n status,\n };\n}\n\ntype ShieldAndUnshieldViewProps = Omit<ShieldPageViewProps, 'token' | 'mode' | 'setMode'>;\n\nfunction useShieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const [shieldAmount, setShieldAmount] = useState('');\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const tokenShield = useCofheTokenShield({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing shielding transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Shield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setShieldAmount('');\n },\n onError: (error) => {\n const errorMessage =\n cofheHumanizeViemError(error) ?? (error instanceof Error ? error.message : 'Failed to shield tokens');\n setError(errorMessage);\n setStatus(null);\n cofheLogger.error('Shield tx submit error:', error);\n },\n });\n\n const { tokenApprove, isApprovingMining } = useApproveWithLifecycle({\n chainId,\n setError,\n setStatus,\n scheduleStatusClear,\n });\n const { isMining: isTokenShieldMining } = useOnceTransactionMined({\n txHash: tokenShield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Shield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Shield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n const handleShield = async () => {\n const amountWei = unitToWei(shieldAmount, token.decimals);\n await tokenShield.mutateAsync({\n token,\n amount: amountWei,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const handleApprove = async () => {\n assert(approvalCallArgs, 'Approval call args are required to approve');\n assert(shieldAmountWei, 'Shield amount is required to approve');\n assert(account, 'Wallet account is required to approve');\n await tokenApprove.writeContractAsync({\n writeContractInput: { ...approvalCallArgs, account: account ?? null, chain: undefined },\n extras: { token, tokenAmount: shieldAmountWei, account },\n });\n };\n\n const { data: { unit: publicBalanceUnit } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance({\n token,\n accountAddress: account,\n });\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n\n const handleShieldMax = () => {\n if (publicBalanceUnit) setShieldAmount(publicBalanceUnit.toFixed());\n };\n\n const isValidShieldAmount = (shieldAmount.length > 0 && publicBalanceUnit?.gte(shieldAmount)) ?? false;\n\n const shieldAmountWei = useMemo<bigint | undefined>(() => {\n if (!isValidShieldAmount) return undefined;\n try {\n return unitToWei(shieldAmount, token.decimals);\n } catch {\n return undefined;\n }\n }, [isValidShieldAmount, shieldAmount, token.decimals]);\n\n const shieldTxCallArgs = useMemo(() => {\n if (!account || !shieldAmountWei) return undefined;\n return getCofheTokenShieldCallArgs({ token, amount: shieldAmountWei, account });\n }, [account, shieldAmountWei, token]);\n\n const shieldCallArgs = shieldTxCallArgs?.main;\n const approvalCallArgs = shieldTxCallArgs?.approval;\n const approvalSpender = (approvalCallArgs?.args?.[0] as Address | undefined) ?? undefined;\n\n const { data: allowanceWei, isFetching: isFetchingAllowance } = useTokenAllowance(\n {\n tokenAddress: approvalCallArgs?.address,\n ownerAddress: account,\n spenderAddress: approvalSpender,\n },\n {\n enabled: !!approvalCallArgs && !!account && !!approvalSpender && !!shieldAmountWei,\n }\n );\n\n const requiresApproval = !!approvalCallArgs;\n const isAllowanceKnown = !requiresApproval || typeof allowanceWei === 'bigint';\n const hasSufficientAllowance =\n !requiresApproval ||\n (typeof allowanceWei === 'bigint' && typeof shieldAmountWei === 'bigint' && allowanceWei >= shieldAmountWei);\n\n const shouldApprove =\n requiresApproval &&\n typeof allowanceWei === 'bigint' &&\n typeof shieldAmountWei === 'bigint' &&\n allowanceWei < shieldAmountWei;\n\n const approvalSimulation = useCofheSimulateWriteContract(approvalCallArgs, {\n enabled: shouldApprove,\n });\n\n const shieldSimulation = useCofheSimulateWriteContract(shieldCallArgs, {\n enabled: !!shieldCallArgs && !shouldApprove,\n });\n\n const simulationError = useMemo<React.ReactNode | null>(() => {\n const relevantError = shouldApprove ? approvalSimulation.error : shieldSimulation.error;\n if (!relevantError) return null;\n\n const cofheErrorMessage = cofheHumanizeViemError(relevantError);\n if (cofheErrorMessage) return cofheErrorMessage;\n if (relevantError instanceof ContractFunctionExecutionError) return relevantError.shortMessage;\n return shouldApprove ? 'Failed to simulate approval transaction' : 'Failed to simulate shield transaction';\n }, [approvalSimulation.error, shieldSimulation.error, shouldApprove]);\n\n const canShield =\n isValidShieldAmount &&\n !!shieldCallArgs &&\n isAllowanceKnown &&\n hasSufficientAllowance &&\n !shieldSimulation.isFetching &&\n !shieldSimulation.error;\n\n const canApprove =\n isValidShieldAmount &&\n shouldApprove &&\n !isFetchingAllowance &&\n !approvalSimulation.isFetching &&\n !approvalSimulation.error;\n\n const canWrite = shouldApprove ? canApprove : canShield;\n\n return {\n status,\n error: error ?? simulationError,\n isProcessing: tokenShield.isPending || isTokenShieldMining || tokenApprove.isPending || isApprovingMining,\n inputAmount: shieldAmount,\n setInputAmount: setShieldAmount,\n onMaxClick: handleShieldMax,\n canWriteContract: canWrite,\n sourceSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n destSymbol: token.symbol,\n sourceLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n destLogoURI: token.logoURI,\n handlePrimaryAction: shouldApprove ? handleApprove : handleShield,\n primaryLabel: shouldApprove ? 'Approve' : 'Shield',\n primaryIcon: <TbShieldPlus className=\"w-3 h-3\" />,\n };\n}\n\nfunction useUnshieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const [unshieldAmount, setUnshieldAmount] = useState('');\n const tokenUnshield = useCofheTokenUnshield({\n onUserSignatureRequest: (hash) => {\n () => {\n setError(null);\n setStatus({ message: 'Preparing unshielding transaction...', type: 'info' });\n };\n },\n onTransactionSubmitSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Unshield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setUnshieldAmount('');\n },\n onTransactionSubmitError: (error) => {\n const errorMessage =\n cofheHumanizeViemError(error) ?? (error instanceof Error ? error.message : 'Failed to unshield tokens');\n setError(errorMessage);\n setStatus(null);\n cofheLogger.error('Unshield tx submit error:', error);\n },\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Unshield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} /> Now\n waiting for decryption...\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Unshield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n },\n onceDecrypted: () => {\n setStatus({ message: 'Unshield decryption completed!', type: 'success' });\n scheduleStatusClear();\n },\n });\n const handleUnshield = async () => {\n const amountWei = parseUnits(unshieldAmount, token.decimals);\n tokenUnshield.mutateAsync({\n token,\n amount: amountWei,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n const handleUnshieldMax = () => {\n if (confidentialBalanceUnit) setUnshieldAmount(confidentialBalanceUnit.toFixed());\n };\n const isValidUnshieldAmount = (unshieldAmount.length > 0 && confidentialBalanceUnit?.gte(unshieldAmount)) ?? false;\n\n const unshieldCallArgs = useMemo(() => {\n if (!account || !isValidUnshieldAmount) return undefined;\n const amountWei = parseUnits(unshieldAmount, token.decimals);\n return getCofheTokenUnshieldCallArgs({ token, amount: amountWei, account });\n }, [account, isValidUnshieldAmount, token, unshieldAmount]);\n\n const unshieldSimulation = useCofheSimulateWriteContract(unshieldCallArgs, {\n enabled: !!unshieldCallArgs,\n });\n\n const simulationError = useMemo(\n () => humanizeSimulationError(unshieldSimulation.error, 'Failed to simulate unshield transaction'),\n [unshieldSimulation.error]\n );\n\n const canUnshield =\n isValidUnshieldAmount && !!unshieldCallArgs && !unshieldSimulation.isFetching && !unshieldSimulation.error;\n\n return {\n status,\n error: error ?? simulationError,\n isProcessing: tokenUnshield.isPending || tokenUnshield.isTokenUnshieldMining || tokenUnshield.isPendingDecryption,\n inputAmount: unshieldAmount,\n setInputAmount: setUnshieldAmount,\n onMaxClick: handleUnshieldMax,\n canWriteContract: canUnshield,\n sourceSymbol: token.symbol,\n destSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n sourceLogoURI: token.logoURI,\n destLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n handlePrimaryAction: handleUnshield,\n primaryLabel: 'Unshield',\n primaryIcon: <TbShieldMinus className=\"w-3 h-3\" />,\n };\n}\n\nexport const ShieldPageV2: React.FC<ShieldPageProps> = ({ token: _token, defaultMode }) => {\n const [mode, setMode] = useState<Mode>(defaultMode ?? 'shield');\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n const token = overriddenToken ?? _token;\n\n return mode === 'shield' ? (\n <ShieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n ) : (\n <UnshieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n );\n};\n\ntype ShieldPageViewProps = {\n error: React.ReactNode | null;\n token: Token;\n mode: Mode;\n status: LifecycleStatus | null;\n setToken: (token: Token) => void;\n setMode: (mode: Mode) => void;\n\n isProcessing: boolean;\n inputAmount: string;\n setInputAmount: (value: string) => void;\n onMaxClick: () => void;\n canWriteContract: boolean;\n sourceSymbol: string | undefined;\n destSymbol: string | undefined;\n\n sourceLogoURI: string | undefined;\n destLogoURI: string | undefined;\n handlePrimaryAction: () => void;\n primaryLabel: string;\n primaryIcon: React.ReactNode;\n};\n\nfunction ShieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const shieldViewProps = useShieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...shieldViewProps} />\n );\n}\n\nfunction UnshieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const unshieldViewProps = useUnshieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...unshieldViewProps} />\n );\n}\n\nfunction ClaimingSection({ token }: { token: Token }) {\n const account = useCofheAccount();\n const {\n data: unshieldedClaims,\n isFetching: isFetchingClaims,\n isWaitingForDecryption: isWaitingForNewClaimsDecryption,\n } = useCofheTokenClaimable({\n token,\n accountAddress: account,\n });\n const {\n claimUnshield,\n error: claimingError,\n status: claimingStatus,\n isClaimingMining,\n } = useClaimUnshieldedWithLifecycle();\n\n const pairedSymbol = token.extensions.fhenix.erc20Pair?.symbol;\n const handleClaim = async () => {\n assert(unshieldedClaims, 'Unshield claims data is required to claim unshielded tokens');\n claimUnshield.mutateAsync({\n token,\n amount: unshieldedClaims.claimableAmount,\n });\n };\n\n const isUnshieldingMining = useIsUnshieldingMining(token);\n\n const claimCallArgs = useMemo(() => {\n if (!account || !unshieldedClaims?.hasClaimable) return undefined;\n return getCofheTokenClaimUnshieldedCallArgs({ token, account });\n }, [account, token, unshieldedClaims?.hasClaimable]);\n\n const claimSimulation = useCofheSimulateWriteContract(claimCallArgs, {\n enabled: !!claimCallArgs,\n });\n\n const claimSimulationError = useMemo(\n () => humanizeSimulationError(claimSimulation.error, 'Failed to simulate claim transaction'),\n [claimSimulation.error]\n );\n\n return (\n <>\n {/* Claim + pending (same logic as ShieldPage) */}\n {unshieldedClaims?.hasClaimable && (\n <ActionButton\n onClick={handleClaim}\n disabled={\n claimUnshield.isPending ||\n isClaimingMining ||\n isFetchingClaims ||\n isWaitingForNewClaimsDecryption ||\n isUnshieldingMining ||\n !claimCallArgs ||\n claimSimulation.isFetching ||\n !!claimSimulation.error\n }\n label={\n claimUnshield.isPending\n ? 'Claiming...'\n : `Claim ${isFetchingClaims || isWaitingForNewClaimsDecryption ? '...' : formatTokenAmount(unshieldedClaims.claimableAmount, token.decimals, 5).formatted} ${pairedSymbol}`\n }\n className=\"mt-1\"\n />\n )}\n\n {unshieldedClaims?.hasPending && token && !unshieldedClaims.hasClaimable && (\n <p className=\"text-xxs text-yellow-600 dark:text-yellow-400 text-center\">\n Pending: {formatTokenAmount(unshieldedClaims.pendingAmount, token.decimals).formatted} {pairedSymbol}\n </p>\n )}\n <StatusAndError status={claimingStatus} error={claimingError ?? claimSimulationError} />\n </>\n );\n}\n\nfunction StatusAndError({ status, error }: { status: LifecycleStatus | null; error: React.ReactNode | null }) {\n return (\n <>\n {/* Error */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <p className=\"text-xs text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Status */}\n {status && (\n <div\n className={cn(\n 'rounded-lg p-2 border',\n status.type === 'success'\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\n : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n >\n <p\n className={cn(\n 'text-xs',\n status.type === 'success' ? 'text-green-800 dark:text-green-200' : 'text-blue-800 dark:text-blue-200'\n )}\n >\n {status.message}\n </p>\n </div>\n )}\n </>\n );\n}\n\nconst ShieldAndUnshieldPageView: React.FC<ShieldPageViewProps> = ({\n error,\n token,\n mode,\n setMode,\n status,\n setToken,\n\n isProcessing,\n inputAmount,\n setInputAmount,\n onMaxClick,\n canWriteContract,\n sourceSymbol,\n destSymbol,\n\n sourceLogoURI,\n destLogoURI,\n handlePrimaryAction,\n primaryLabel,\n primaryIcon,\n}) => {\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const isShieldableToken = isTokenOperationSupported(token.extensions.fhenix.confidentialityType, 'shield');\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n const { tokensWithPublicBalances } = useTokensWithPublicBalances();\n const selectableTokens = useMemo(\n () =>\n (mode === 'unshield' ? tokensWithExistingEncryptedBalance : tokensWithPublicBalances).filter((candidate) =>\n isTokenOperationSupported(candidate.extensions.fhenix.confidentialityType, mode)\n ),\n [mode, tokensWithExistingEncryptedBalance, tokensWithPublicBalances]\n );\n\n // TODO: probably can be refactored into a view with more stramlined logic\n return (\n <PageContainer\n header={\n <div className=\"flex items-center justify-between\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shield / Unshield</p>\n </button>\n\n <button\n onClick={() =>\n openModal(PortalModal.TokenList, {\n balanceType: mode === 'shield' ? BalanceType.Public : BalanceType.Confidential,\n tokens: selectableTokens,\n title: mode === 'shield' ? 'Select token to shield' : 'Select token to unshield',\n onSelectToken: (token) => setToken(token),\n })\n }\n className=\"flex items-center gap-1 text-sm font-bold cofhe-text-primary hover:opacity-80 transition-opacity\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowDownIcon style={{ fontSize: 16 }} className=\"opacity-60\" />\n </button>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {/* Tabs */}\n <div className=\"flex gap-2\">\n <ActionButton\n onClick={() => setMode('shield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'shield'}\n label=\"Shield\"\n />\n <ActionButton\n onClick={() => setMode('unshield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'unshield'}\n label=\"Unshield\"\n />\n </div>\n\n {/* Two-panel layout */}\n <div className=\"space-y-2\">\n {/* Source */}\n <div className=\"cofhe-card-bg border cofhe-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Asset to be shielded' : 'Asset to be unshielded'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={sourceLogoURI} alt={sourceSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <AmountInput\n value={inputAmount}\n onChange={setInputAmount}\n onMaxClick={onMaxClick}\n className=\"w-28\"\n />\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{sourceSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Available{' '}\n {mode === 'unshield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-center text-xl opacity-80\">↓</div>\n\n {/* Received (read-only) */}\n <div className=\"cofhe-card-bg border cofhe-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Shielded asset received' : 'Unshielded asset received'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={destLogoURI} alt={destSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <p className=\"text-lg font-bold leading-none\">{inputAmount || '0'}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{destSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Balance\n {mode === 'shield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary action */}\n <ActionButton\n onClick={handlePrimaryAction}\n disabled={!canWriteContract || isProcessing || !isShieldableToken}\n icon={primaryIcon}\n label={primaryLabel}\n className=\"py-2\"\n />\n <StatusAndError status={status} error={error} />\n <ClaimingSection token={token} />\n\n {/* Not Shieldable Token Warning */}\n {!isShieldableToken && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-2\">\n <p className=\"text-xs text-yellow-800 dark:text-yellow-200\">\n This token does not support shielding/unshielding.\n </p>\n </div>\n )}\n </div>\n }\n />\n );\n};\n\nfunction useApproveWithLifecycle({\n chainId,\n setError,\n setStatus,\n scheduleStatusClear,\n}: {\n chainId?: number;\n setError: (error: React.ReactNode | null) => void;\n setStatus: (status: LifecycleStatus | null) => void;\n scheduleStatusClear: () => void;\n}) {\n const tokenApprove = useCofheTokenApprove({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing approval transaction...', type: 'info' });\n },\n onSuccess: (hash, variables) => {\n setStatus({\n message: (\n <>\n Approval transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n },\n onError: (error) => {\n const errorMessage =\n cofheHumanizeViemError(error) ?? (error instanceof Error ? error.message : 'Failed to approve tokens');\n setError(errorMessage);\n setStatus(null);\n cofheLogger.error('Approve tx submit error:', error);\n },\n });\n\n const { isMining: isApprovingMining } = useOnceTransactionMined({\n txHash: tokenApprove.data,\n onceMined: async (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Approval transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Approval transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n return {\n tokenApprove,\n isApprovingMining,\n };\n}\n","import { TransactionActionType, TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount } from './useCofheConnection';\nimport type { Token } from './useCofheTokenLists';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useCallback } from 'react';\n\nexport function useIsUnshieldingMining(token: Token) {\n const account = useCofheAccount();\n const filter = useCallback(\n (tx: Transaction) => {\n return (\n tx.token.address === token.address &&\n tx.actionType === TransactionActionType.Unshield &&\n tx.status === TransactionStatus.Pending\n );\n },\n [token.address]\n );\n const allPendingTxs = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter,\n });\n\n return allPendingTxs.filteredTxs.length > 0;\n}\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { useCofheChainId, useCofheAccount } from '@/hooks/useCofheConnection.js';\nimport { TransactionItem } from '../components/TransactionItem.js';\nimport { usePortalNavigation } from '@/stores';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const ActivityPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs: transactions } = useStoredTransactions({\n chainId,\n account,\n });\n\n return (\n <PageContainer\n header={\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Activity</p>\n </button>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {transactions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm cofhe-text-primary opacity-60\">No transactions found</p>\n </div>\n ) : (\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\n {transactions.map((tx) => (\n <TransactionItem key={tx.hash} transaction={tx} />\n ))}\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { ToastPrimitive, ToastPrimitiveBase } from '../components/ToastPrimitives.js';\nimport { useState } from 'react';\nimport { PortalModal } from '../modals/types';\nimport { usePortalNavigation, usePortalStatuses, usePortalModals, usePortalToasts } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\nimport { useCofheClient } from '@/hooks/useCofheClient.js';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { createWalletClient, http } from 'viem';\nimport { usePortalPersisted } from '@/stores/portalPersisted.js';\n\ntype Tab = 'modal' | 'status' | 'toast' | 'permit';\n\nexport const DebugPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { statuses, addStatus, removeStatus } = usePortalStatuses();\n const { addToast } = usePortalToasts();\n const { openModal } = usePortalModals();\n const [modalSelection, setModalSelection] = useState<string | undefined>(undefined);\n const [activeTab, setActiveTab] = useState<Tab>('modal');\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Back</span>\n </button>\n <div className=\"flex gap-2 border-b\">\n <button onClick={() => setActiveTab('modal')} className={activeTab === 'modal' ? 'font-bold' : ''}>\n Modal\n </button>\n <button onClick={() => setActiveTab('status')} className={activeTab === 'status' ? 'font-bold' : ''}>\n Status\n </button>\n <button onClick={() => setActiveTab('toast')} className={activeTab === 'toast' ? 'font-bold' : ''}>\n Toast\n </button>\n <button onClick={() => setActiveTab('permit')} className={activeTab === 'permit' ? 'font-bold' : ''}>\n Permit\n </button>\n </div>\n </div>\n }\n content={\n <>\n {activeTab === 'modal' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n openModal(PortalModal.ExampleSelection, {\n onSelect: (selection: string) => {\n setModalSelection(selection);\n },\n });\n }}\n >\n Open selection modal: selection: {modalSelection}\n </button>\n <button\n onClick={() => {\n openModal(PortalModal.ExampleInfo);\n }}\n >\n Open info modal\n </button>\n </div>\n )}\n\n {activeTab === 'status' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-warning-status');\n if (isPresent) {\n removeStatus('test-warning-status');\n } else {\n addStatus({\n id: 'test-warning-status',\n variant: 'warning',\n title: 'Warning status',\n description: 'This is a warning status',\n });\n }\n }}\n >\n \"test-warning-status\" (toggle)\n </button>\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-error-status');\n if (isPresent) {\n removeStatus('test-error-status');\n } else {\n addStatus({\n id: 'test-error-status',\n variant: 'error',\n title: 'Error status',\n description: 'This is an error status',\n });\n }\n }}\n >\n \"test-error-status\" (toggle)\n </button>\n <button\n onClick={() => {\n addStatus({\n id: 'test-status-with-action',\n variant: 'warning',\n title: 'Warning status',\n action: {\n label: 'RESOLVE',\n onClick: () => {\n removeStatus('test-status-with-action');\n },\n },\n });\n }}\n >\n \"test-status-with-action\" (open)\n </button>\n </div>\n )}\n\n {activeTab === 'toast' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n addToast(\n <ToastPrimitiveBase>\n <div>Custom content</div>\n </ToastPrimitiveBase>\n );\n }}\n >\n Custom content toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'info',\n title: \"This toast won't go away on its own\",\n description: 'Click the X to dismiss it',\n },\n 'infinite'\n );\n }}\n >\n Non-expiring Toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'warning',\n title: 'Warning toast',\n description: 'Take the action',\n action: {\n label: 'ACTION',\n onClick: () => {\n alert('Action taken');\n },\n },\n },\n 'infinite'\n );\n }}\n >\n Toast with Action\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"info\"\n title=\"Info toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Info Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"success\"\n title=\"Success toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Success Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"error\"\n title=\"Error toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Error Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"warning\"\n title=\"Warning toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Warning Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'info',\n title: 'Info toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Info Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Success toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Success Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Error toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Error Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'warning',\n title: 'Warning toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Warning Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Permit invalid',\n description: 'Unable to decrypt data with this permit',\n action: {\n label: 'OPEN PERMITS',\n onClick: () => {\n alert('open permits');\n },\n },\n });\n }}\n >\n Invalid Permit\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Permit created successfully',\n });\n }}\n >\n Permit created\n </button>\n </div>\n )}\n\n {activeTab === 'permit' && (\n <div className=\"flex flex-col gap-3\">\n <FirstPermitDebug />\n <CreateSelfExpiringPermitButton />\n <CreateAndUseReceivingPermitButton />\n </div>\n )}\n </>\n }\n />\n );\n};\n\nconst FirstPermitDebug = () => {\n const { hasCreatedFirstPermit, setHasCreatedFirstPermit } = usePortalPersisted();\n return (\n <div>\n <p>Has created first permit: {hasCreatedFirstPermit ? '[Y]' : '[N]'}</p>\n <button\n onClick={() => {\n setHasCreatedFirstPermit(false);\n }}\n >\n Reset first permit created flag\n </button>\n </div>\n );\n};\n\nconst CreateSelfExpiringPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const create = async () => {\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n const expiration = Math.floor(Date.now() / 1000) + 2 * 60;\n await cofheClient.permits.createSelf({\n name: `Exp ${expiration}`,\n issuer: account,\n expiration: expiration,\n });\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={create}>Create self permit (expires in 2 minutes)</button>;\n};\n\nconst CreateAndUseReceivingPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const receiveAndUse = async () => {\n const { account, publicClient } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n if (!publicClient) throw new Error('No public client found');\n\n // Create account to create the sharing permit from private key\n const sharingAccount = privateKeyToAccount('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80');\n const sharingWalletClient = createWalletClient({\n chain: publicClient!.chain,\n transport: http(),\n account: sharingAccount,\n });\n\n // Create a sharing permit with account {sharingAccount} and recipient {account}\n const sharedPermit = await cofheClient.permits.createSharing(\n {\n name: 'Sharing permit',\n issuer: sharingAccount.address,\n expiration: Math.floor(Date.now() / 1000) + 120 * 60,\n recipient: account,\n },\n {\n publicClient,\n walletClient: sharingWalletClient,\n }\n );\n\n // Receive shared permit\n await cofheClient.permits.importShared(sharedPermit);\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={receiveAndUse}>Create and use receiving permit</button>;\n};\n","import { KeyboardArrowRightIcon } from '@/components/Icons';\nimport { cn } from '../../../utils/cn';\nimport type { Token } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from './TokenIcon';\nimport { CofheTokenConfidentialBalance, BalanceType, CofheTokenPublicBalance } from './CofheTokenConfidentialBalance';\nimport { useCofheTokenDecryptedBalance, useCoingeckoUsdPrice } from '@/hooks';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { formatUsdAmount } from '@/utils/format';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\n\nexport const TokenRow: React.FC<{\n token: Token;\n onClick: () => void;\n balanceType: BalanceType;\n topLabel?: string;\n}> = ({ token, onClick, topLabel, balanceType }) => {\n const publicSymbol = token.extensions.fhenix.erc20Pair?.symbol ?? token.symbol;\n const destinationSymbol = token.symbol;\n const showDestination =\n balanceType === BalanceType.Public && !!publicSymbol && !!destinationSymbol && publicSymbol !== destinationSymbol;\n\n const account = useCofheAccount();\n const { data: confidentialBalance } = useCofheTokenDecryptedBalance(\n {\n token,\n accountAddress: account,\n },\n {\n enabled: balanceType === BalanceType.Confidential,\n }\n );\n\n const { data: publicBalance } = useCofheTokenPublicBalance({ token, accountAddress: account });\n // tmp: TODO: for testnet, fetch the price of WBTC on mainnet to display in the UI\n const { data: price } = useCoingeckoUsdPrice(\n token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n tokenAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n tokenAddress: token.extensions.fhenix.erc20Pair?.address,\n }\n );\n\n const usdValue =\n balanceType === BalanceType.Confidential\n ? confidentialBalance && price && formatUsdAmount(confidentialBalance.unit.multipliedBy(price))\n : publicBalance && price && formatUsdAmount(publicBalance.unit.multipliedBy(price));\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'flex items-center justify-between px-3 py-2 rounded-lg',\n 'cofhe-hover-overlay transition-colors',\n 'cursor-pointer'\n )}\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"sm\" />\n\n {/* Token label */}\n <div className=\"min-w-0 flex-1\">\n {topLabel && <div className=\"text-xxxs opacity-70 cofhe-text-primary leading-none\">{topLabel}</div>}\n <div className=\"text-sm font-medium cofhe-text-primary truncate leading-tight\">\n {balanceType === BalanceType.Confidential ? token.symbol : publicSymbol}\n </div>\n {showDestination && (\n <div className=\"text-xxxs opacity-70 cofhe-text-primary truncate leading-tight\">→ {destinationSymbol}</div>\n )}\n </div>\n </div>\n\n {/* Balance and Arrow */}\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {balanceType === BalanceType.Confidential ? (\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n ) : (\n <CofheTokenPublicBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n )}\n </div>\n\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {usdValue ? (\n <span className=\"text-sm opacity-70 cofhe-text-primary inline-block w-full text-right\">{usdValue}</span>\n ) : (\n <span className=\"text-sm opacity-0 select-none inline-block w-full text-right\">$0.00</span>\n )}\n </div>\n\n <KeyboardArrowRightIcon className=\"w-5 h-5 cofhe-text-primary opacity-60 flex-shrink-0\" />\n </div>\n </div>\n );\n};\n","import { Button } from '../components';\n\nexport const AddCustomTokenButton: React.FC<{\n label?: string;\n onClick?: () => void;\n}> = ({ label = 'Import token', onClick }) => <Button variant=\"outline\" size=\"sm\" label={label} onClick={onClick} />;\n","import { PageContainer } from '../components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { type Token } from '@/hooks';\nimport { ArrowBackIcon } from '@/components/Icons';\nimport { TokenRow } from '../components/TokenRow';\nimport { useCofhePinnedTokenAddress } from '@/hooks/useCofhePinnedTokenAddress';\nimport type { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { usePortalModals } from '@/stores';\n\nimport { AddCustomTokenButton } from './AddCustomTokenButton';\n\nexport const TokenListModal: React.FC<PortalModalStateMap[PortalModal.TokenList]> = ({\n tokens,\n onClose,\n title,\n onSelectToken,\n balanceType,\n}) => {\n const { openModal } = usePortalModals();\n\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{title}</p>\n </button>\n <AddCustomTokenButton\n onClick={() =>\n openModal(PortalModal.ImportCustomToken, {\n balanceType,\n title: 'Import token',\n tokens,\n onSelectToken: (token) => {\n onSelectToken(token);\n onClose();\n },\n })\n }\n />\n </div>\n }\n content={\n <TokenListContent\n balanceType={balanceType}\n tokens={tokens}\n onSelectToken={(token) => {\n onSelectToken(token);\n onClose();\n }}\n />\n }\n />\n );\n};\n\nexport const TokenListContent: React.FC<{\n tokens: Token[];\n balanceType: BalanceType;\n onSelectToken: (token: Token) => void;\n}> = ({ tokens, onSelectToken, balanceType }) => {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const normalizedPinnedAddress = pinnedTokenAddress?.toLowerCase();\n\n const pinnedToken = normalizedPinnedAddress\n ? tokens.find((t) => t.address.toLowerCase() === normalizedPinnedAddress)\n : undefined;\n\n const nonPinnedTokens = pinnedToken\n ? tokens.filter((t) => t.address.toLowerCase() !== normalizedPinnedAddress)\n : tokens;\n\n return (\n <div className=\"cofhe-token-list-container\">\n {tokens.length === 0 ? (\n <p className=\"text-xs opacity-70 py-4 text-center\">No tokens found</p>\n ) : (\n <>\n {pinnedToken && (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(pinnedToken);\n }}\n key={`pinned-${pinnedToken.address}`}\n token={pinnedToken}\n topLabel=\"Pinned\"\n />\n )}\n {nonPinnedTokens.map((token) => (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(token);\n }}\n key={token.address}\n token={token}\n />\n ))}\n </>\n )}\n </div>\n );\n};\n","import { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { PageContainer } from '../components/PageContainer';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useCofheTokens } from '@/hooks';\nimport { TokenListContent } from '../modals/TokenListModal';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { ArrowBackIcon } from '@/components/Icons';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { PortalModal } from '../modals/types';\nimport { AddCustomTokenButton } from '../modals/AddCustomTokenButton';\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Portfolio]: void;\n }\n}\nexport const PortfolioPage: React.FC = () => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Tokens list</p>\n </button>\n <AddCustomTokenButton\n onClick={() =>\n openModal(PortalModal.ImportCustomToken, {\n balanceType: BalanceType.Confidential,\n title: 'Import token',\n tokens: allTokens,\n onSelectToken: (token) => {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: {\n token,\n },\n });\n },\n })\n }\n />\n </div>\n }\n content={\n <TokenListContent\n balanceType={BalanceType.Confidential}\n tokens={allTokens}\n onSelectToken={(token) => {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: {\n token,\n },\n });\n }}\n />\n }\n />\n );\n};\n","import { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { PageContainer } from '../components/PageContainer';\nimport { ArrowBackIcon } from '@/components/Icons';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokens } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { formatTokenAmount } from '@/utils/format';\nimport { useMemo, useState } from 'react';\nimport { useCofheTokenClaimUnshielded } from '@/hooks';\nimport { cn } from '@/utils';\nimport { Button } from '../components';\nimport type { Address } from 'viem';\nimport { assert } from 'ts-essentials';\nexport function ClaimableTokens() {\n // TODO: or show multichain, with switching?\n\n const chainsClaimableTokens = useCofheClaimableTokens();\n const claimableByTokenAddress = chainsClaimableTokens.claimableByTokenAddress;\n const unshieldingInProgressByTokenAddress = chainsClaimableTokens.isUnshieldingInProgressByTokenAddress;\n const waitingByTokenAddress = chainsClaimableTokens.isWaitingForDecryptionByTokenAddress;\n const isClaimingByTokenAddress = chainsClaimableTokens.isClaimingByTokenAddress;\n const { navigateBack } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const claimMutation = useCofheTokenClaimUnshielded();\n\n const rows = useMemo(() => {\n const byLower = new Map(allTokens.map((t) => [t.address.toLowerCase(), t] as const));\n // TODO: show those that have zero claimable right now but is maybe ongoing unshielding/decryption?\n return Object.entries(claimableByTokenAddress)\n .filter(([_t, amount]) => amount > 0n)\n .map(([tokenAddress, claimableAmount]) => {\n const token = byLower.get(tokenAddress.toLowerCase());\n return token ? { token, claimableAmount } : null;\n })\n .filter((x): x is NonNullable<typeof x> => Boolean(x));\n }, [allTokens, claimableByTokenAddress]);\n\n const handleClaim = async (tokenAddress: string) => {\n const row = rows.find((r) => r.token.address.toLowerCase() === tokenAddress.toLowerCase());\n assert(row, 'token not found for claim');\n\n await claimMutation.mutateAsync({ token: row.token, amount: row.claimableAmount });\n };\n\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-3\">\n <button\n className=\"flex items-center gap-2 text-xl font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n </button>\n <span>Claimable Tokens list</span>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-4 pr-1\">\n {rows.map(({ token, claimableAmount }) => {\n const isDecrypting = waitingByTokenAddress?.[token.address] ?? false;\n const isUnshielding =\n unshieldingInProgressByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n const formatted = formatTokenAmount(claimableAmount, token.decimals, 5).formatted;\n const isClaimingThis = isClaimingByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n\n return (\n <div key={token.address} className=\"grid grid-cols-[1fr,auto,auto] items-center gap-4\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <TokenIcon\n logoURI={token.logoURI}\n alt={token.name}\n size=\"md\"\n className={cn(\n 'w-10 h-10 rounded-full',\n 'cofhe-icon-bg',\n 'border border-[var(--cofhe-button-default-border)]',\n 'flex items-center justify-center flex-shrink-0 overflow-hidden'\n )}\n />\n <div className=\"min-w-0\">\n <div className=\"text-xl font-semibold cofhe-text-primary truncate\">{token.name}</div>\n </div>\n </div>\n\n <div className=\"text-2xl font-semibold cofhe-text-primary tabular-nums\">{formatted}</div>\n\n <Button\n type=\"button\"\n onClick={() => handleClaim(token.address)}\n disabled={isUnshielding || isDecrypting || isClaimingThis || claimMutation.isPending}\n >\n {isDecrypting ? 'Decrypting' : isUnshielding ? 'Unshielding' : 'Claim'}\n </Button>\n </div>\n );\n })}\n\n {rows.length === 0 && <div className=\"text-sm opacity-70 cofhe-text-primary\">No claimable tokens.</div>}\n </div>\n }\n />\n );\n}\n","import type { FC } from 'react';\nimport {\n ActivityPage,\n GeneratePermitPage,\n MainPage,\n PermitsListPage,\n SendPage,\n SettingsPage,\n TokenInfoPage,\n DebugPage,\n ShieldPageV2,\n DelegatePermitPage,\n ImportPermitPage,\n} from '../pages';\nimport { FloatingButtonPage } from './types';\nimport { PortfolioPage } from '../pages/PortfolioPage';\nimport { ClaimableTokens } from '../pages/ClaimableTokens';\n\nexport const pages: Record<FloatingButtonPage, FC<any>> = {\n [FloatingButtonPage.Main]: MainPage,\n [FloatingButtonPage.Settings]: SettingsPage,\n [FloatingButtonPage.TokenInfo]: TokenInfoPage,\n [FloatingButtonPage.Send]: SendPage,\n [FloatingButtonPage.Shield]: ShieldPageV2,\n [FloatingButtonPage.Activity]: ActivityPage,\n [FloatingButtonPage.Permits]: PermitsListPage,\n [FloatingButtonPage.GeneratePermits]: GeneratePermitPage,\n [FloatingButtonPage.DelegatePermits]: DelegatePermitPage,\n [FloatingButtonPage.ReceivePermits]: ImportPermitPage,\n [FloatingButtonPage.Debug]: DebugPage,\n [FloatingButtonPage.Portfolio]: PortfolioPage,\n [FloatingButtonPage.ClaimableTokens]: ClaimableTokens,\n};\n","import { PortalModal, type PortalModalStateMap } from './types';\nimport { CloseIcon } from '@/components/Icons';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleSelectionPage: React.FC<PortalModalStateMap[PortalModal.ExampleSelection]> = ({\n onClose,\n onSelect,\n}) => {\n const options = ['1', '2', '3'];\n\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Select an option</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n {options.map((option) => (\n <button\n key={option}\n onClick={() => {\n onSelect(option);\n onClose();\n }}\n >\n Option {option}\n </button>\n ))}\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Close</span>\n </button>\n </div>\n }\n />\n );\n};\n","import { CloseIcon } from '@/components/Icons';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleInfoPage: React.FC<PortalModalStateMap[PortalModal.ExampleInfo]> = ({ onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">More info</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n <p>Cofhesdk is complex, so we have created this modal to help you understand.</p>\n <p>\n You probably clicked on a ? button next to some functionality. And in this modal you'll get your information\n or explanation.\n </p>\n <p>This is another paragraph of explanation.</p>\n <p>Now that you're done reading, you can click \"Got It\" at the bottom to close this modal.</p>\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Got It</span>\n </button>\n </div>\n }\n />\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport { CloseIcon } from '@/components/Icons';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/CofheFloatingButton/components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { Button } from '../components';\nimport { InfoModalButton } from './InfoModalButton';\nimport { usePortalModals } from '@/stores';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { PermitCard } from '../components/PermitCard';\nimport { truncateAddress } from '@/utils';\nimport { useCallback, useState } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst NoPermitFoundModal: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\">\n No permit found\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n <p>No permit found</p>\n </div>\n }\n footer={<Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />}\n />\n );\n};\n\nexport const PermitDetailsModal: React.FC<PortalModalStateMap[PortalModal.PermitDetails]> = ({ hash, onClose }) => {\n const {\n permit,\n expirationInfo,\n isActivePermit,\n isShareablePermit,\n handleSelectActivePermit,\n handleCopySharablePermitData,\n handleRemovePermit,\n isCopyComplete,\n } = usePermitDetailsPage(hash);\n const { openModal } = usePortalModals();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const handlePermitSelect = useCallback(() => {\n handleSelectActivePermit();\n onClose();\n }, [handleSelectActivePermit, onClose]);\n\n const handlePermitShare = useCallback(() => {\n handleCopySharablePermitData();\n }, [handleCopySharablePermitData]);\n\n const handlePermitDelete = useCallback(async () => {\n if (!confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n handleRemovePermit();\n onClose();\n }, [confirmDelete, onClose, handleRemovePermit]);\n\n if (permit == null) {\n return <NoPermitFoundModal onClose={onClose} />;\n }\n\n return (\n <PageContainer\n isModal\n header={\n <PermitCard\n hash={hash}\n className=\"-mt-4 -ml-4 -mr-4\"\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={onClose}\n type=\"button\"\n >\n <CloseIcon fontSize=\"small\" />\n <span>Permit</span>\n </button>\n }\n />\n }\n content={\n permit != null && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"flex flex-row gap-2 text-sm\">\n Type: <b>{PermitTypeLabel[permit.type]}</b>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: permit.type })} />\n </p>\n\n <p className=\"text-sm\">\n Expires in: <b>{expirationInfo.label}</b>\n </p>\n\n {permit.type === 'self' && (\n <p className=\"text-sm\">\n To select this permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is active, you\n will be able to view your own encrypted data.\n </p>\n )}\n {permit.type === 'sharing' && (\n <p className=\"text-sm\">\n To share this permit with <b>recipient</b>, click the <b>\"SHARE\"</b> button below to copy the permit\n data to your clipboard. Share the copied permit data with <b>recipient</b> to grant them access to your\n encrypted data.\n <br />\n <br />\n <i>\n <b>Note:</b> The copied permit data is not sensitive and can be sent to recipient via any\n communication channel.\n </i>\n </p>\n )}\n {permit.type === 'recipient' && (\n <p className=\"text-sm\">\n To select this imported permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is\n active, you will be able to view <b>issuer</b>'s ({truncateAddress(permit.issuer, 4, 4)}) encrypted\n data.\n </p>\n )}\n </div>\n )\n }\n footer={\n <div className=\"flex flex-row gap-3 w-full\">\n {isShareablePermit && (\n <Button variant=\"primary\" onClick={handlePermitShare}>\n {isCopyComplete ? <FaCheck /> : <FaRegCopy />}\n {isCopyComplete ? 'COPIED' : 'SHARE'}\n </Button>\n )}\n {!isShareablePermit && (\n <Button\n variant=\"primary\"\n label={isActivePermit ? 'ALREADY ACTIVE' : 'SELECT'}\n onClick={handlePermitSelect}\n disabled={isActivePermit}\n />\n )}\n <Button label={confirmDelete ? 'CONFIRM' : 'DELETE'} onClick={handlePermitDelete} variant=\"error\" />\n <Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />\n </div>\n }\n />\n );\n};\n","import { CloseIcon } from '@/components/Icons';\nimport { PageContainer } from '../components/PageContainer';\nimport { Button } from '../components';\n\ntype Props = {\n header: React.ReactNode | string;\n content: React.ReactNode;\n onClose: () => void;\n};\n\nexport const BaseInfoModal: React.FC<Props> = ({ header, content, onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button\n onClick={onClose}\n className=\"flex items-center gap-1 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n >\n <CloseIcon style={{ fontSize: 16 }} />\n {typeof header === 'string' ? (\n <p className=\"text-base font-semibold tracking-tight text-[#0E2F3F]\">{header}</p>\n ) : (\n header\n )}\n </button>\n }\n content={<div className=\"flex flex-1 flex-col w-full gap-3 items-start justify-start\">{content}</div>}\n footer={\n <div className=\"flex flex-row\">\n <Button onClick={onClose}>\n <span>Close</span>\n </Button>\n </div>\n }\n />\n );\n};\n","import type { PortalModal, PortalModalStateMap } from './types';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nexport const PermitTypeInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitTypeInfo]> = ({ type, onClose }) => {\n return (\n <BaseInfoModal\n header={`${PermitTypeLabel[type]} Permit`}\n content={\n <>\n {/* TODO: Improve copy */}\n {type === 'self' && (\n <p>\n \"Self\" permits are created by a user to access their own encrypted data. The provided signature is\n verified on-chain by the ACL (Access Control List).\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'sharing' && (\n <p>\n \"Delegated\" permits are created by a user (Issuer) to share their encrypted data with another user\n (Recipient). Both Issuer and Rceipient must sign as a handshake. Issuer's signature is verified on-chain\n by the ACL (Access Control List) and grants access to Recipient, and Recipient's signature applies and\n verifies the re-encryption key.\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'recipient' && (\n <p>\n \"Imported\" permits are imported by a user (Recipient) to access encrypted data that has been shared with\n them by the permit's Issuer. Both Issuer and Rceipient must sign as a handshake. Issuer's signature is\n verified on-chain by the ACL (Access Control List) and grants access to Recipient, and Recipient's\n signature applies and verifies the re-encryption key.\n </p>\n )}\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nexport const PermitInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitInfo]> = ({ onClose }) => {\n return (\n <BaseInfoModal\n header=\"Permit\"\n content={\n <>\n <div className=\"flex flex-col w-full justify-center items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <PermitIcon className=\"h-7 w-7 fill-black dark:fill-white\" aria-label=\"CoFHE permit icon\" />\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n CoFHE permits are used to authenticate your identity and grant access to your encrypted data.\n </p>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Generating a permit requires a signature, which will open your connected wallet to sign a message (EIP712).\n This signed message contains only info used to authenticate and grant access.\n </p>\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import { useMemo, useState } from 'react';\nimport { isAddress, type Address } from 'viem';\n\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useResolvedCofheToken } from '@/hooks/useResolvedCofheToken';\nimport { useCustomTokensStore } from '@/stores/customTokensStore';\nimport { getTokenConfidentialityLabel, type Token } from '@/types/token';\n\nimport type { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { Button } from '../components';\n\nexport const ImportCustomTokenCard: React.FC<{\n balanceType: BalanceType;\n tokens: Token[];\n onSelectToken: (token: Token) => void;\n}> = ({ tokens, onSelectToken, balanceType }) => {\n const [addressInput, setAddressInput] = useState('');\n const chainId = useCofheChainId();\n const addCustomToken = useCustomTokensStore((state) => state.addCustomToken);\n const removeCustomToken = useCustomTokensStore((state) => state.removeCustomToken);\n const customTokensByChainId = useCustomTokensStore((state) => state.customTokensByChainId);\n\n const trimmedAddress = addressInput.trim();\n const normalizedAddress = isAddress(trimmedAddress) ? (trimmedAddress as Address) : undefined;\n\n const importedCustomTokens = useMemo(() => {\n if (!chainId) return [];\n return customTokensByChainId[chainId.toString()] ?? [];\n }, [chainId, customTokensByChainId]);\n\n const existingToken = useMemo(() => {\n if (!normalizedAddress) return undefined;\n return tokens.find((token) => token.address.toLowerCase() === normalizedAddress.toLowerCase());\n }, [normalizedAddress, tokens]);\n\n const resolvedToken = useResolvedCofheToken(\n { address: normalizedAddress },\n {\n enabled: !!normalizedAddress && !existingToken,\n retry: false,\n }\n );\n\n const previewToken = existingToken ?? resolvedToken.data;\n const canImport = !!previewToken && !resolvedToken.isFetching;\n\n return (\n <div className=\"fnx-card-bg border fnx-card-border rounded-lg p-3 flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium opacity-70\">Token contract address</label>\n <input\n type=\"text\"\n value={addressInput}\n onChange={(event) => setAddressInput(event.target.value)}\n placeholder=\"0x...\"\n className=\"w-full bg-transparent fnx-text-primary outline-none border-b pb-2 px-2 text-sm\"\n />\n </div>\n\n {!normalizedAddress && trimmedAddress.length > 0 && (\n <p className=\"text-xxxs text-[#c2410c]\">Enter a valid token address.</p>\n )}\n\n {resolvedToken.isFetching && !existingToken && (\n <p className=\"text-xxxs opacity-70\">Checking token metadata and CoFHE support...</p>\n )}\n\n {resolvedToken.error && !existingToken && (\n <p className=\"text-xxxs text-[#c2410c]\">{resolvedToken.error.message}</p>\n )}\n\n {previewToken && (\n <div className=\"flex flex-col gap-1 text-xs\">\n <p className=\"font-medium fnx-text-primary\">\n {previewToken.symbol} · {previewToken.name}\n </p>\n <p className=\"opacity-70\">\n {getTokenConfidentialityLabel(previewToken.extensions.fhenix.confidentialityType) ?? 'Confidential token'}\n </p>\n {balanceType === 'public' &&\n previewToken.extensions.fhenix.confidentialityType === 'wrapped' &&\n !previewToken.extensions.fhenix.erc20Pair && (\n <p className=\"text-xxxs opacity-70\">\n Public-balance actions may stay unavailable until the token's paired asset can be discovered.\n </p>\n )}\n </div>\n )}\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={!canImport}\n label={existingToken ? 'Select token' : 'Import and select'}\n onClick={() => {\n if (!previewToken) return;\n if (!existingToken) {\n addCustomToken(previewToken);\n }\n onSelectToken(previewToken);\n }}\n />\n\n {importedCustomTokens.length > 0 && (\n <div className=\"flex flex-col gap-2 border-t pt-3\">\n <p className=\"text-xs font-medium opacity-70\">Imported tokens</p>\n {importedCustomTokens.map((token) => (\n <div\n key={`${token.chainId}-${token.address}`}\n className=\"flex items-center justify-between gap-3 px-3 py-2\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium fnx-text-primary truncate\">\n {token.symbol} · {token.name}\n </p>\n <p className=\"text-xxxs opacity-70 truncate\">{token.address}</p>\n </div>\n <Button\n variant=\"error\"\n size=\"sm\"\n label=\"Remove\"\n onClick={() => {\n removeCustomToken({\n chainId: token.chainId,\n address: token.address,\n });\n\n if (normalizedAddress?.toLowerCase() === token.address.toLowerCase()) {\n setAddressInput('');\n }\n }}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { ArrowBackIcon } from '@/components/Icons';\nimport { PageContainer } from '../components/PageContainer';\nimport { ImportCustomTokenCard } from './ImportCustomTokenCard';\nimport { PortalModal, type PortalModalStateMap } from './types';\n\nexport const ImportCustomTokenModal: React.FC<PortalModalStateMap[PortalModal.ImportCustomToken]> = ({\n tokens,\n onClose,\n title,\n onSelectToken,\n balanceType,\n}) => {\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{title}</p>\n </button>\n }\n content={\n <ImportCustomTokenCard\n balanceType={balanceType}\n tokens={tokens}\n onSelectToken={(token) => {\n onSelectToken(token);\n onClose();\n }}\n />\n }\n />\n );\n};\n","import { ExampleSelectionPage } from './ExampleSelectionPage';\nimport { ExampleInfoPage } from './ExampleInfoPage';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { PermitDetailsModal } from './PermitDetailsModal';\nimport { PermitTypeInfoModal } from './PermitTypeInfoModal';\nimport { PermitInfoModal } from './PermitInfoModal';\nimport { TokenListModal } from './TokenListModal';\nimport { ImportCustomTokenModal } from './ImportCustomTokenModal';\n\nexport const modals: { [M in PortalModal]: React.FC<PortalModalStateMap[M]> } = {\n [PortalModal.ExampleSelection]: ExampleSelectionPage,\n [PortalModal.ExampleInfo]: ExampleInfoPage,\n [PortalModal.PermitDetails]: PermitDetailsModal,\n [PortalModal.PermitTypeInfo]: PermitTypeInfoModal,\n [PortalModal.PermitInfo]: PermitInfoModal,\n [PortalModal.TokenList]: TokenListModal,\n [PortalModal.ImportCustomToken]: ImportCustomTokenModal,\n};\n","import { isValidElement, cloneElement, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\n\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport type { CofheFloatingButtonToast } from './types';\nimport { cn } from '@/utils';\nimport { usePortalToasts } from '@/stores';\n\nconst ToastClearer = ({ id, paused, remainingMs }: { id: string; paused: boolean; remainingMs: number }) => {\n const { removeToast } = usePortalToasts();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (remainingMs <= 0) {\n removeToast(id);\n return;\n }\n\n // Clear the timer if the toast has been paused\n if (paused && timerRef.current != null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n // Start the timer if the toast has been unpaused\n if (!paused) {\n timerRef.current = setTimeout(() => removeToast(id), remainingMs);\n }\n\n return () => {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current);\n timerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remainingMs, paused]);\n\n return null;\n};\n\nconst ToastComponent: React.FC<CofheFloatingButtonToast> = ({\n id,\n duration,\n paused,\n startMs,\n remainingMs,\n content,\n}) => {\n const { isTopSide } = useCofheFloatingButtonContext();\n const { pauseToast, removeToast } = usePortalToasts();\n\n const handlePause = (paused: boolean) => {\n pauseToast(id, paused);\n };\n\n const handleDismiss = () => {\n removeToast(id);\n };\n\n // Inject id and paused into content if it's a React element\n const injectedContent = isValidElement(content)\n ? cloneElement(content, {\n id,\n paused,\n startMs,\n remainingMs,\n duration,\n onPause: handlePause,\n onDismiss: handleDismiss,\n ...content.props,\n })\n : content;\n\n return (\n <motion.div\n key={id}\n initial={{ opacity: 0, y: isTopSide ? -4 : 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isTopSide ? 4 : -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className={cn('min-h-8 bg-white border items-center justify-start w-full max-w-full')}\n >\n {injectedContent}\n {duration != 'infinite' && <ToastClearer id={id} paused={paused} remainingMs={remainingMs} />}\n </motion.div>\n );\n};\n\nexport const ToastsSection: React.FC = () => {\n const { toasts } = usePortalToasts();\n return (\n <div className=\"flex flex-col gap-3 w-full max-w-full\">\n <AnimatePresence>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} {...toast} />\n ))}\n </AnimatePresence>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { FloatingButtonComponent } from './FloatingButtonComponent';\nimport { StatusBarSection } from './StatusBarSection';\nimport { StatusBarContent } from './StatusBarContent';\nimport { ContentSection } from './ContentSection';\nimport { useCofheFloatingButtonContext } from './CofheFloatingButtonContext';\nimport type { FloatingButtonPosition, CofheFloatingButtonProps } from './types';\nimport { ToastsSection } from './ToastsSection';\nimport { usePortalModals, usePortalNavigation, usePortalUI } from '@/stores';\n\nconst positionStyles: Record<FloatingButtonPosition, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n};\n\nexport const CofheFloatingButtonBase: React.FC<CofheFloatingButtonProps> = ({\n className,\n testId,\n zIndex = 9999,\n positionType = 'fixed',\n overriddingPage,\n}) => {\n const { effectivePosition, isTopSide, isLeftSide, theme } = useCofheFloatingButtonContext();\n const { togglePortal } = usePortalUI();\n const { clearAllModals } = usePortalModals();\n const { clearNavigationHistory } = usePortalNavigation();\n const darkMode = theme === 'dark';\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'cofhe-floating-button',\n darkMode && 'dark',\n positionType,\n 'flex gap-3',\n positionStyles[effectivePosition],\n // bottom-* opens UP (popup above), top-* opens DOWN (popup below)\n isTopSide ? 'flex-col-reverse items-start' : 'flex-col items-start',\n `z-[${zIndex}]`,\n className\n )}\n >\n <ToastsSection />\n\n <ContentSection overriddingPage={overriddingPage} />\n\n {/* Button and Bar Row */}\n <div className={cn('flex w-full gap-3 items-center', isLeftSide ? 'flex-row' : 'flex-row-reverse')}>\n <FloatingButtonComponent\n onClick={() =>\n togglePortal({\n onCloseEnd: () => {\n clearNavigationHistory();\n clearAllModals();\n },\n })\n }\n />\n\n <StatusBarSection>\n <StatusBarContent />\n </StatusBarSection>\n </div>\n </div>\n );\n};\n","import { CofheFloatingButtonBase } from './CofheFloatingButtonBase';\nimport { CofheFloatingButtonProvider } from './CofheFloatingButtonContext';\nimport type { CofheFloatingButtonProps } from './types';\n\nexport const CofheFloatingButtonWithProvider: React.FC<CofheFloatingButtonProps> = (props) => {\n return (\n <CofheFloatingButtonProvider>\n <CofheFloatingButtonBase {...props} />\n {props.children}\n </CofheFloatingButtonProvider>\n );\n};\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport type {\n BaseProps,\n DropdownOption,\n ComponentSize,\n EncryptionProgressData,\n EncryptionResultData,\n EncryptionStartData,\n} from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList } from '../utils/utils.js';\nimport { CheckIcon, ContentCopyIcon, KeyboardArrowDownIcon, SecurityIcon } from '@/components/Icons';\nimport { Encryptable, type FheTypeValue } from '@cofhe/sdk';\nimport { getStepConfig, useCofheEncrypt } from '@/hooks/useCofheEncrypt';\nimport { cofheLogger } from '@/utils/debug';\n\nexport interface CofheEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const CofheEncryptInput: React.FC<CofheEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError,\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const {\n encryptInputsAsync: encrypt,\n isEncrypting,\n stepsState: { lastStep: lastEncryptionStep },\n } = useCofheEncrypt();\n\n const { progress: encryptionProgress, label: encryptionProgressLabel } = useMemo(() => {\n return lastEncryptionStep\n ? getStepConfig(lastEncryptionStep)\n : {\n progress: undefined,\n label: undefined,\n };\n }, [lastEncryptionStep]);\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n cofheLogger.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncrypting) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncrypting) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncrypting]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncrypting && lastEncryptionStep && encryptionProgress && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: lastEncryptionStep.step,\n progress: encryptionProgress,\n label: encryptionProgressLabel,\n });\n }\n }, [encryptionProgress, encryptionProgressLabel, onEncryptProgress, isEncrypting, lastEncryptionStep]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' },\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError\n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500'\n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncrypting) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncrypting) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncrypting) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) =>\n cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible\n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium'\n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500',\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') =>\n cn('h-full transition-all duration-300 ease-out rounded-full', progressVariantClasses[variant]);\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n\n const typeInfo = FheTypesList.find((type) => type.value === typeValue);\n if (!typeInfo) return false;\n\n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n\n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n\n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n\n return true;\n }\n\n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n\n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n\n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n\n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n\n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(\n encryptedResult,\n (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n },\n 2\n ); // Pretty format with 2 spaces\n\n await navigator.clipboard.writeText(textToCopy);\n cofheLogger.log('Copied to clipboard:', textToCopy);\n\n // Show success indication\n setCopySuccess(true);\n\n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n cofheLogger.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n cofheLogger.log('Auto-encrypting value:', textValue, 'as type:', type);\n\n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n\n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const [encryptionResult] = await encrypt([Encryptable.create(type, textValue)]);\n\n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n\n const data = { value: textValue, encrypted: encryptionResult };\n\n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n cofheLogger.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n cofheLogger.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncrypting) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n const ShieldIcon = () => <SecurityIcon style={{ fontSize: 14 }} />;\n\n const ChevronDownIcon = () => <KeyboardArrowDownIcon style={{ fontSize: 14 }} />;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-input` : 'cofhe-encrypt-input'}\n />\n\n {/* Encryption status indicator */}\n {(isEncrypting || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncrypting ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">Encrypting...</div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess ? 'bg-green-600 cursor-default' : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? 'Copied to clipboard!' : 'Copy encrypted result to clipboard'}\n >\n <>\n {copySuccess ? (\n <CheckIcon style={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon style={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n\n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-type-selector` : 'cofhe-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n\n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n\n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={\n !isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined\n }\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div\n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncrypting\n ? 'slideDownFadeIn 0.5s ease-out forwards'\n : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'cofhe-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">{encryptionProgress || 0}%</span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{\n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out',\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'cofhe-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {hasError && errorMessage && (\n <p\n className=\"mt-2 text-sm text-red-600 dark:text-red-400\"\n data-testid={testId ? `${testId}-error` : 'cofhe-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["useEffect","useMemo","useRef","import_ts_essentials","filter","useMemo","useEffect","useRef","useEffect","useRef","useRef","useEffect","useEffect","useEffect","jsx","jsx","jsx","jsx","useMemo","AnimatePresence","motion","jsx","jsx","jsxs","useMemo","useEffect","useMemo","useRef","MdContentCopy","MdCheck","jsx","jsxs","MdCheck","MdContentCopy","jsx","jsxs","jsx","__default","jsx","__default","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","jsx","jsx","jsx","jsxs","GoArrowUpRight","TbShieldPlus","import_ts_essentials","jsx","jsxs","jsx","jsxs","jsx","jsxs","sizeClasses","useMemo","jsx","jsxs","useMemo","start","end","mid","jsx","jsxs","jsx","jsxs","iconClassName","jsx","jsxs","TbShieldPlus","GoArrowUpRight","jsx","ShieldPageVariant","jsx","jsxs","createContext","useCallback","useContext","useMemo","useState","jsx","jsxs","createContext","useState","useCallback","useMemo","useContext","jsx","jsxs","jsx","useMemo","jsx","useMemo","Fragment","jsx","jsxs","CopyButton","jsx","jsxs","permit","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","error","jsx","jsxs","jsx","jsxs","error","jsx","Fragment","jsx","jsxs","useMemo","useMemo","Fragment","jsx","jsxs","useMemo","useMemo","formatUnits","jsx","jsxs","money","useMemo","formatUnits","Fragment","jsx","jsxs","useMemo","useState","useMemo","import_ts_essentials","Fragment","jsx","jsxs","useState","error","useMemo","token","TbShieldPlus","TbShieldMinus","useMemo","useState","import_ts_essentials","useCallback","filter","Fragment","jsx","jsxs","useState","error","useMemo","TbShieldPlus","TbShieldMinus","token","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","create","sepolia","jsx","jsxs","sepolia","jsx","Fragment","jsx","jsxs","jsx","jsxs","useMemo","import_ts_essentials","jsx","jsxs","useMemo","AnimatePresence","motion","jsx","jsxs","jsx","jsxs","FaCheck","FaRegCopy","useCallback","useState","jsx","jsxs","PermitTypeLabel","FaCheck","FaRegCopy","jsx","jsxs","Fragment","jsx","jsxs","PermitTypeLabel","Fragment","jsx","jsxs","useMemo","useState","isAddress","jsx","jsxs","useState","isAddress","useMemo","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","useMemo","AnimatePresence","motion","useEffect","useRef","motion","AnimatePresence","jsx","jsxs","useRef","useEffect","paused","motion","AnimatePresence","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useMemo","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","sizeClasses","errorMessage","ShieldIcon"]}
|