@permissionless-technologies/upp-sdk 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-MDF37354.js → chunk-6BHF4HOB.js} +14 -24
- package/dist/chunk-6BHF4HOB.js.map +1 -0
- package/dist/{chunk-BZD5KJL3.cjs → chunk-ZQ5LLJQC.cjs} +14 -24
- package/dist/chunk-ZQ5LLJQC.cjs.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/indexer/index.cjs +6 -6
- package/dist/indexer/index.js +1 -1
- package/dist/react/index.cjs +2 -3
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +2 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BZD5KJL3.cjs.map +0 -1
- package/dist/chunk-MDF37354.js.map +0 -1
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/use-upp-account.tsx","../../src/react/utils/avatar.ts","../../src/react/components/UPPAvatar.tsx","../../src/react/components/styles.ts","../../src/react/components/UPPModal.tsx","../../src/react/components/UPPPrivateButton.tsx","../../src/react/use-upp-crypto.ts","../../src/react/use-shield.ts","../../src/react/use-pool-transfer.ts","../../src/react/use-withdraw.ts","../../src/react/use-personal-asp.ts","../../src/react/use-swap.ts"],"names":["createContext","useState","useRef","useEffect","createAutoAdapter","StorableAccountAdapter","ownerHashHex","toHex","NoteStore","useCallback","keccak256","toBytes","useMemo","getAddress","store","sdk","init_stealth","__toCommonJS","stealth_exports","jsx","useContext","jsxs","createPortal","Fragment","sdkPromise","loadSDK","encodePacked","error","packNoteData","generateASPProof","init_poseidon","ASP_TREE_DEPTH","BABYJUBJUB_SUBORDER","getStorageKey","ASP_REGISTRY_HUB_ABI","computeSingleOriginASPRoot","STATE_TREE_DEPTH","padToDepth","SWAP_ORDER_PLACED_EVENT","filterOrdersByTokenPair","filterOrdersByASP","generateCancelSecret","computeCancelKeyHash","computeGiveAmount"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\n/**\n * React hook and provider for UPP Account management (Post-Quantum / Hash-Based)\n *\n * No elliptic curve operations — all ownership proofs are hash-based.\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react'\nimport { toHex, keccak256, toBytes, getAddress, type Hex, type Address } from 'viem'\nimport type { MasterKeys, StarkMasterKeys } from '../keys/types.js'\nimport { NoteStore } from '../core/note-store.js'\nimport { StorableAccountAdapter } from '../core/account.js'\nimport { createAutoAdapter } from '../indexer/storage/index.js'\n\n// ============================================================================\n// EIP-712 Constants for wallet signing\n// ============================================================================\n\nconst UPP_EIP712_DOMAIN = {\n name: 'UPP Stealth Account',\n version: '2',\n}\n\nconst UPP_EIP712_TYPES: Record<string, Array<{ name: string; type: string }>> = {\n Connect: [\n { name: 'info', type: 'string' },\n { name: 'warning', type: 'string' },\n { name: 'passwordHash', type: 'bytes32' },\n ],\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Which proof system created/guards a note */\nexport type ProofSystemType = 'snark' | 'stark'\n\n/**\n * A shielded note (UTXO) - Post-quantum hash-based\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n */\nexport interface ShieldedNote {\n /** Amount of tokens */\n amount: bigint\n /** Random blinding factor */\n blinding: bigint\n /** Commitment hash (hex) */\n commitment: string\n /** Spending secret for this note (hex) - proves ownership via hash preimage */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - what's committed on-chain (hex) */\n ownerHash: string\n /** Position in Merkle tree */\n leafIndex: number\n /** Origin address (original depositor) as hex */\n origin: string\n /** Token address as hex */\n token: string\n /** Transaction hash */\n txHash?: string\n /** Note status */\n status: 'pending' | 'confirmed' | 'spent'\n /** Timestamp */\n timestamp: number\n /** Which proof system created this note (defaults to 'snark' for legacy notes) */\n proofSystem?: ProofSystemType\n}\n\n/**\n * Serialized account for storage (post-quantum)\n */\nexport interface SerializedAccount {\n /** Version 3 = dual SNARK+STARK (older versions are auto-cleared on load) */\n version: 3\n spendingSecret: string\n ownerHash: string\n viewingSecret: string\n viewingHash: string\n /** STARK keys */\n starkSecret: string[]\n starkOwnerHash: string[]\n starkViewingSecret: string[]\n starkViewingHash: string[]\n}\n\n/**\n * Note creation result (BLS12-381, hash-based ownership)\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(ownerSecret)\n */\nexport interface NoteCreationResult {\n commitment: bigint\n /** The spending secret whose hash proves ownership */\n ownerSecret: bigint\n /** Poseidon(ownerSecret) — committed in the note, used for ownership proof */\n ownerHash: bigint\n blinding: bigint\n encryptedNote: string\n searchTag: bigint\n amount: bigint\n origin: bigint\n token: bigint\n}\n\n/**\n * Indexer configuration for advanced usage\n */\nexport interface IndexerConfig {\n /** Enable IndexedDB storage (default: true if available) */\n useIndexedDB?: boolean\n /** Custom storage prefix for multi-account support */\n storagePrefix?: string\n /** Batch size for RPC scanning (default: 200, adapts on rate limits) */\n batchSize?: number\n /** Sync interval for live sync in ms (default: 30000) */\n liveSyncIntervalMs?: number\n /** Starting block for new accounts (skips blocks before account creation) */\n fromBlock?: number\n /** Pool contract address (required for indexer) */\n contractAddress?: Address\n}\n\n/**\n * Context type for UPP Account\n */\nexport interface UPPAccountContextType {\n /** SNARK master keys (null if not setup) */\n masterKeys: MasterKeys | null\n /** STARK master keys (null if not setup) */\n starkMasterKeys: StarkMasterKeys | null\n /** Connected wallet address */\n ethAddress: string | null\n /** Owner hash (public identifier, hex) — SNARK */\n ownerHash: string | null\n /** Stealth address (bech32m encoded, 0zk prefix) — SNARK */\n stealthAddress: string | null\n /** STARK stealth address (bech32m encoded, 0zs prefix) */\n starkStealthAddress: string | null\n /** All notes */\n notes: ShieldedNote[]\n /** Unspent notes */\n unspentNotes: ShieldedNote[]\n /** Total balance of unspent notes */\n balance: bigint\n /** Whether account is set up */\n isSetup: boolean\n /** Whether SDK is loading/initializing */\n isLoading: boolean\n /** Whether crypto is ready */\n cryptoReady: boolean\n /** Whether sync is in progress */\n isSyncing: boolean\n /** Last synced block number */\n lastSyncedBlock: number\n /** Set up a new account from wallet signature (low-level) */\n setupAccount: (signature: Hex) => Promise<void>\n /** Connect private account via EIP-712 wallet signature (requires wagmi signTypedData) */\n connect: (password?: string) => Promise<void>\n /** Whether a connect operation is in progress */\n isConnecting: boolean\n /** Clear account and logout */\n logout: () => void\n /** Alias for logout */\n disconnect: () => void\n /** Add a note to the account */\n addNote: (note: ShieldedNote) => void\n /** Mark a note as spent */\n markNoteSpent: (commitment: string) => void\n /** Create note for self (e.g., shield or change output) */\n createNoteForSelf: (amount: bigint, origin: bigint, token: bigint) => Promise<NoteCreationResult>\n /** Get owner hash */\n getOwnerHash: () => bigint | null\n /** Select optimal circuit for a given amount */\n selectOptimalCircuit: (requiredAmount: bigint, tokenAddress?: string) => {\n circuit: '1x2' | '2x2' | null\n selectedNotes: ShieldedNote[]\n error?: string\n }\n /** Sync notes from blockchain (requires client to be passed in) */\n syncNotes: (contractAddress: Address, client: any) => Promise<number>\n /** Start live sync (polls for new notes at interval) */\n startLiveSync: (contractAddress: Address, client: any) => void\n /** Stop live sync */\n stopLiveSync: () => void\n /** Whether live sync is active */\n isLiveSyncing: boolean\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst UPPAccountContext = createContext<UPPAccountContextType | null>(null)\n\n// ============================================================================\n// Lazy SDK loading\n// ============================================================================\n\nlet sdkPromise: Promise<typeof import('../index.js')> | null = null\n\nasync function loadSDK() {\n if (!sdkPromise) {\n sdkPromise = import('../index.js')\n }\n return sdkPromise\n}\n\n// ============================================================================\n// Storage helpers\n// ============================================================================\n\nfunction getStorageKey(ethAddress: string): string {\n return `upp_pq_account_${ethAddress.toLowerCase()}`\n}\n\nfunction getNotesStorageKey(chainId: number, ownerHashPrefix: string): string {\n return `upp_pq_notes_${chainId}_${ownerHashPrefix}`\n}\n\nfunction getChainFingerprintKey(chainId: number): string {\n return `upp_chain_fp_${chainId}`\n}\n\ninterface ChainFingerprint {\n genesisHash: string\n blockNumber: number\n}\n\n/**\n * Check if the chain has been reset (e.g. Anvil restart).\n * Returns true if chain is valid (no reset detected), false if reset detected.\n */\nasync function checkChainFingerprint(\n chainId: number,\n publicClient: any,\n): Promise<boolean> {\n if (typeof window === 'undefined' || !publicClient) return true\n\n const fpKey = getChainFingerprintKey(chainId)\n const stored = localStorage.getItem(fpKey)\n\n try {\n const [currentBlock, genesisBlock] = await Promise.all([\n publicClient.getBlockNumber(),\n publicClient.getBlock({ blockNumber: 0n }),\n ])\n\n const currentGenesisHash = genesisBlock.hash as string\n const currentBlockNum = Number(currentBlock)\n\n if (stored) {\n const fp: ChainFingerprint = JSON.parse(stored)\n if (fp.genesisHash !== currentGenesisHash || currentBlockNum < fp.blockNumber) {\n // Chain was reset — clear fingerprint (notes will be cleared by caller)\n localStorage.removeItem(fpKey)\n return false\n }\n }\n\n // Update fingerprint with current block\n const newFp: ChainFingerprint = {\n genesisHash: currentGenesisHash,\n blockNumber: currentBlockNum,\n }\n localStorage.setItem(fpKey, JSON.stringify(newFp))\n return true\n } catch (e) {\n // Can't validate — assume valid (e.g. RPC not available yet)\n console.warn('[UPPAccount] Chain fingerprint check failed:', e)\n return true\n }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Function signature for EIP-712 typed data signing.\n * Compatible with wagmi's signTypedDataAsync.\n */\nexport type SignTypedDataFn = (args: {\n domain: { name: string; version: string; chainId: number }\n types: Record<string, Array<{ name: string; type: string }>>\n primaryType: string\n message: Record<string, unknown>\n}) => Promise<Hex>\n\ninterface UPPAccountProviderProps {\n children: ReactNode\n /** Ethereum address of connected wallet */\n ethAddress?: string\n /** Chain ID */\n chainId?: number\n /** Indexer configuration */\n indexerConfig?: IndexerConfig\n /** EIP-712 signing function (from wagmi's useSignTypedData().signTypedDataAsync) */\n signTypedData?: SignTypedDataFn\n /** Public client for chain fingerprint validation (e.g. from wagmi usePublicClient) */\n publicClient?: any\n /** Active proof system — filters unspentNotes and balance to only show spendable notes */\n activeProofSystem?: ProofSystemType\n}\n\nexport function UPPAccountProvider({\n children,\n ethAddress,\n chainId = 1,\n indexerConfig,\n signTypedData,\n publicClient: publicClientProp,\n activeProofSystem,\n}: UPPAccountProviderProps) {\n const [masterKeys, setMasterKeys] = useState<MasterKeys | null>(null)\n const [starkMasterKeys, setStarkMasterKeys] = useState<StarkMasterKeys | null>(null)\n const [notes, setNotes] = useState<ShieldedNote[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isConnecting, setIsConnecting] = useState(false)\n const [cryptoReady, setCryptoReady] = useState(false)\n const [isSyncing, setIsSyncing] = useState(false)\n const [lastSyncedBlock, _setLastSyncedBlock] = useState(0)\n const [liveSyncInterval, setLiveSyncInterval] = useState<ReturnType<typeof setInterval> | null>(null)\n const unwatchRef = useRef<(() => void) | null>(null)\n const syncPromiseRef = useRef<Promise<number> | null>(null)\n const noteStoreRef = useRef<NoteStore | null>(null)\n const accountAdapterRef = useRef<StorableAccountAdapter | null>(null)\n\n // Initialize SDK\n useEffect(() => {\n loadSDK().then(() => setCryptoReady(true))\n }, [])\n\n // Load saved account via AccountAdapter and initialize NoteStore\n useEffect(() => {\n let noteStoreUnsub: (() => void) | null = null\n let cancelled = false\n\n if (typeof window === 'undefined') return\n if (!ethAddress || !cryptoReady) {\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n noteStoreRef.current = null\n accountAdapterRef.current = null\n return\n }\n\n // Create account adapter with auto-detected storage\n const accountStorage = createAutoAdapter(`upp_account`)\n const adapter = new StorableAccountAdapter(accountStorage, ethAddress)\n accountAdapterRef.current = adapter\n\n // Also try legacy localStorage migration\n const legacyKey = getStorageKey(ethAddress)\n const legacySaved = typeof window !== 'undefined' ? localStorage.getItem(legacyKey) : null\n\n const init = async () => {\n // Load from adapter first\n let account = await adapter.load()\n\n // Migrate from legacy localStorage if adapter has nothing\n if (!account && legacySaved) {\n try {\n const parsed: SerializedAccount = JSON.parse(legacySaved)\n if (parsed.spendingSecret && parsed.starkSecret) {\n const keys: MasterKeys = {\n spendingSecret: BigInt(parsed.spendingSecret),\n ownerHash: BigInt(parsed.ownerHash),\n viewingSecret: BigInt(parsed.viewingSecret),\n viewingHash: BigInt(parsed.viewingHash),\n }\n const starkKeys: StarkMasterKeys = {\n starkSecret: parsed.starkSecret.map(s => BigInt(s)) as any,\n starkOwnerHash: parsed.starkOwnerHash!.map(s => BigInt(s)) as any,\n starkViewingSecret: parsed.starkViewingSecret!.map(s => BigInt(s)) as any,\n starkViewingHash: parsed.starkViewingHash!.map(s => BigInt(s)) as any,\n }\n await adapter.save(keys, starkKeys)\n account = { keys, starkKeys }\n console.log('[UPPAccount] Migrated account from legacy localStorage')\n }\n } catch { /* ignore corrupt legacy */ }\n }\n\n if (cancelled) return\n\n if (!account) {\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n return\n }\n\n setMasterKeys(account.keys)\n if (account.starkKeys) setStarkMasterKeys(account.starkKeys)\n\n // Initialize NoteStore with auto-detected storage backend\n const ownerHashHex = toHex(account.keys.ownerHash, { size: 32 })\n const storagePrefix = `upp_${chainId}_${ownerHashHex.slice(0, 12)}`\n const noteStorage = createAutoAdapter(storagePrefix)\n const store = new NoteStore(noteStorage, 'notes')\n noteStoreRef.current = store\n\n noteStoreUnsub = store.onChange(() => {\n if (!cancelled) setNotes([...store.getNotes()])\n })\n\n await store.load()\n\n // Migrate legacy notes\n if (store.getNotes().length === 0) {\n const legacyNotesKey = getNotesStorageKey(chainId, ownerHashHex.slice(0, 12))\n const legacyNotes = typeof window !== 'undefined' ? localStorage.getItem(legacyNotesKey) : null\n if (legacyNotes) {\n try {\n const parsed = JSON.parse(legacyNotes)\n const migrated = parsed.map((n: any) => ({\n ...n,\n amount: BigInt(n.amount),\n blinding: BigInt(n.blinding),\n origin: n.origin ?? '0x0000000000000000000000000000000000000000',\n token: n.token ?? '0x0000000000000000000000000000000000000000',\n proofSystem: n.proofSystem ?? 'snark',\n }))\n store.addNotes(migrated)\n await store.persist()\n console.log(`[NoteStore] Migrated ${migrated.length} legacy notes`)\n } catch { /* ignore */ }\n }\n }\n\n if (!cancelled) setNotes([...store.getNotes()])\n\n // Validate chain fingerprint\n if (publicClientProp) {\n const valid = await checkChainFingerprint(chainId, publicClientProp)\n if (!valid && !cancelled) {\n console.log(`[UPPAccount] Chain ${chainId} was reset — clearing stale notes`)\n await store.clear()\n }\n }\n }\n\n init().catch(e => console.error('Failed to load account:', e))\n\n return () => {\n cancelled = true\n if (noteStoreUnsub) noteStoreUnsub()\n }\n }, [ethAddress, cryptoReady, chainId, publicClientProp])\n\n // Persist notes via NoteStore\n const persistNotes = useCallback(\n (_notesToSave?: ShieldedNote[]) => {\n noteStoreRef.current?.persist().catch(console.error)\n },\n []\n )\n\n // Setup account from signature\n const setupAccount = useCallback(\n async (signature: Hex) => {\n if (!ethAddress || !cryptoReady) {\n throw new Error('Not ready to setup account')\n }\n\n setIsLoading(true)\n try {\n const sdk = await loadSDK()\n\n // Derive SNARK keys (Poseidon/BN254)\n const keys = await sdk.deriveKeysFromSignature(signature)\n\n // Derive STARK keys (Keccak/M31) — synchronous, no Poseidon needed\n const starkKeys = sdk.deriveStarkKeysFromSignature(signature)\n\n setMasterKeys(keys)\n setStarkMasterKeys(starkKeys)\n setNotes([])\n\n // Persist via account adapter\n const adapter = accountAdapterRef.current\n if (adapter) {\n await adapter.save(keys, starkKeys)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [ethAddress, cryptoReady]\n )\n\n // Connect via EIP-712 signing (high-level)\n const connect = useCallback(\n async (password?: string) => {\n if (!signTypedData) {\n throw new Error('signTypedData not provided to UPPAccountProvider. Pass signTypedDataAsync from wagmi.')\n }\n if (!ethAddress) {\n throw new Error('Wallet not connected')\n }\n\n setIsConnecting(true)\n try {\n const passwordHash = password\n ? keccak256(toBytes(password))\n : keccak256(toBytes(''))\n\n const signature = await signTypedData({\n domain: { ...UPP_EIP712_DOMAIN, chainId },\n types: UPP_EIP712_TYPES,\n primaryType: 'Connect',\n message: {\n info: 'Setup UPP Private Account (SNARK + STARK)',\n warning: 'This signature derives your private keys. Never share it.',\n passwordHash,\n },\n })\n\n await setupAccount(signature)\n } finally {\n setIsConnecting(false)\n }\n },\n [signTypedData, ethAddress, chainId, setupAccount]\n )\n\n // Logout\n const logout = useCallback(() => {\n // Clear NoteStore\n noteStoreRef.current?.clear().catch(console.error)\n noteStoreRef.current = null\n // Clear account via adapter\n accountAdapterRef.current?.clear().catch(console.error)\n accountAdapterRef.current = null\n // Clear legacy localStorage (migration cleanup)\n if (masterKeys) {\n const ownerHashHex = toHex(masterKeys.ownerHash, { size: 32 })\n const notesKey = getNotesStorageKey(chainId, ownerHashHex.slice(0, 12))\n try { localStorage.removeItem(notesKey) } catch {}\n }\n if (ethAddress) {\n try { localStorage.removeItem(getStorageKey(ethAddress)) } catch {}\n }\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n }, [masterKeys, ethAddress, chainId])\n\n // Add note via NoteStore (with dedup)\n const addNote = useCallback(\n (note: ShieldedNote) => {\n const store = noteStoreRef.current\n if (store) {\n store.addNote(note)\n store.persist().catch(console.error)\n } else {\n // Fallback if NoteStore not initialized yet\n setNotes((prev) => [...prev, note])\n }\n },\n []\n )\n\n // Mark note as spent via NoteStore\n const markNoteSpent = useCallback(\n (commitment: string) => {\n const store = noteStoreRef.current\n if (store) {\n store.markSpent(commitment)\n store.persist().catch(console.error)\n } else {\n setNotes((prev) =>\n prev.map((n) =>\n n.commitment.toLowerCase() === commitment.toLowerCase()\n ? { ...n, status: 'spent' as const }\n : n\n )\n )\n }\n },\n []\n )\n\n // Create note for self (hash-based, no ECDH)\n const createNoteForSelf = useCallback(\n async (amount: bigint, origin: bigint, token: bigint): Promise<NoteCreationResult> => {\n if (!masterKeys || !cryptoReady) throw new Error('Account not ready')\n\n const sdk = await loadSDK()\n\n return createHashBasedNote(sdk, amount, masterKeys.spendingSecret, masterKeys.ownerHash, masterKeys.viewingSecret, origin, token)\n },\n [masterKeys, cryptoReady]\n )\n\n // Get owner hash\n const getOwnerHash = useCallback((): bigint | null => {\n return masterKeys?.ownerHash ?? null\n }, [masterKeys])\n\n // Computed values — filtered by active proof system\n const unspentNotes = useMemo(() => {\n const unspent = notes.filter((n) => n.status !== 'spent')\n if (!activeProofSystem) return unspent\n return unspent.filter((n) => (n.proofSystem ?? 'snark') === activeProofSystem)\n }, [notes, activeProofSystem])\n\n const balance = useMemo(\n () => unspentNotes.reduce((acc, n) => acc + n.amount, 0n),\n [unspentNotes],\n )\n\n // Select optimal circuit\n const selectOptimalCircuit = useCallback(\n (requiredAmount: bigint, tokenAddress?: string) => {\n let candidates = unspentNotes\n if (tokenAddress) {\n candidates = candidates.filter(\n (n) => n.token?.toLowerCase() === tokenAddress.toLowerCase()\n )\n }\n const sortedNotes = [...candidates].sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const singleNote = sortedNotes.find((n) => n.amount >= requiredAmount)\n if (singleNote) {\n return { circuit: '1x2' as const, selectedNotes: [singleNote] }\n }\n\n for (let i = 0; i < sortedNotes.length; i++) {\n for (let j = i + 1; j < sortedNotes.length; j++) {\n const combined = sortedNotes[i]!.amount + sortedNotes[j]!.amount\n if (combined >= requiredAmount) {\n return { circuit: '2x2' as const, selectedNotes: [sortedNotes[i]!, sortedNotes[j]!] }\n }\n }\n }\n\n const candidateBalance = candidates.reduce((acc, n) => acc + n.amount, 0n)\n if (candidateBalance >= requiredAmount) {\n return {\n circuit: null,\n selectedNotes: [],\n error: 'Requires more than 2 notes. Please consolidate first.',\n }\n }\n\n return { circuit: null, selectedNotes: [], error: 'Insufficient balance' }\n },\n [unspentNotes, balance]\n )\n\n // Sync notes from blockchain — scans Shielded + Transferred events,\n // matches search tags, and decrypts notes using viewing secret\n const syncNotes = useCallback(\n async (contractAddress: Address, client: any): Promise<number> => {\n if (!masterKeys || !cryptoReady) return 0\n\n if (syncPromiseRef.current) {\n return syncPromiseRef.current\n }\n\n const syncPromise = (async () => {\n setIsSyncing(true)\n try {\n const sdk = await loadSDK()\n const viewingSecret = masterKeys.viewingSecret\n const spendingSecret = masterKeys.spendingSecret\n\n // Derive AES key for decryption (same as encryptNoteData)\n const aesKeyHex = keccak256(toHex(viewingSecret, { size: 32 }))\n const aesKeyBytes = hexToBytes(aesKeyHex)\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n aesKeyBytes.buffer.slice(aesKeyBytes.byteOffset, aesKeyBytes.byteOffset + aesKeyBytes.byteLength) as ArrayBuffer,\n { name: 'AES-GCM', length: 256 },\n false,\n ['decrypt']\n )\n\n // Collect existing commitments to avoid duplicates\n // Use NoteStore (immediate) instead of React state (async) to prevent race conditions\n const currentStore = noteStoreRef.current\n const existingCommitments = new Set(\n (currentStore ? currentStore.getNotes() : notes).map(n => n.commitment.toLowerCase())\n )\n\n // Candidate notes: { commitment, leafIndex, packedData }\n interface NoteCandidate {\n commitment: string\n leafIndex: number\n packedData: string\n txHash?: string\n }\n const candidates: NoteCandidate[] = []\n\n console.log('[syncNotes] Scanning contract:', contractAddress, '— existing:', existingCommitments.size, 'notes')\n\n // 1. Scan Shielded events\n try {\n const shieldedLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'Shielded',\n inputs: [\n { name: 'token', type: 'address', indexed: true },\n { name: 'depositor', type: 'address', indexed: true },\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'encryptedNote', type: 'bytes', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of shieldedLogs) {\n const commitment = log.args.commitment as string\n if (existingCommitments.has(commitment.toLowerCase())) continue\n candidates.push({\n commitment,\n leafIndex: Number(log.args.leafIndex),\n packedData: log.args.encryptedNote as string,\n txHash: log.transactionHash,\n })\n }\n } catch (e: any) {\n console.warn('[syncNotes] Failed to scan Shielded events:', e?.message ?? e)\n }\n\n // Build commitment → leafIndex map (used for both transfer scanning and repair)\n const commitmentLeafMap = new Map<string, number>()\n\n // 2. Scan Transferred events (splits, private transfers)\n try {\n const transferredLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'Transferred',\n inputs: [\n { name: 'nullifier', type: 'bytes32', indexed: true },\n { name: 'outputCommitment1', type: 'bytes32', indexed: true },\n { name: 'outputCommitment2', type: 'bytes32', indexed: true },\n { name: 'encryptedNote1', type: 'bytes', indexed: false },\n { name: 'encryptedNote2', type: 'bytes', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n\n // We need leafIndex from CommitmentInserted events in the same tx\n try {\n const ciLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'CommitmentInserted',\n inputs: [\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'timestamp', type: 'uint256', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of ciLogs) {\n commitmentLeafMap.set(\n (log.args.commitment as string).toLowerCase(),\n Number(log.args.leafIndex)\n )\n }\n } catch (e) {\n console.warn('[syncNotes] Failed to scan CommitmentInserted events:', e)\n }\n\n for (const log of transferredLogs) {\n const c1 = log.args.outputCommitment1 as string\n const c2 = log.args.outputCommitment2 as string\n const txHash = log.transactionHash\n\n if (!existingCommitments.has(c1.toLowerCase())) {\n candidates.push({\n commitment: c1,\n leafIndex: commitmentLeafMap.get(c1.toLowerCase()) ?? -1,\n packedData: log.args.encryptedNote1 as string,\n txHash,\n })\n }\n if (!existingCommitments.has(c2.toLowerCase())) {\n candidates.push({\n commitment: c2,\n leafIndex: commitmentLeafMap.get(c2.toLowerCase()) ?? -1,\n packedData: log.args.encryptedNote2 as string,\n txHash,\n })\n }\n }\n } catch (e) {\n console.warn('[syncNotes] Failed to scan Transferred events:', e)\n }\n\n // 3. Try to decrypt each candidate\n let discovered = 0\n let skippedEmpty = 0, skippedOwner = 0\n for (const candidate of candidates) {\n try {\n const packed = candidate.packedData\n if (!packed || packed === '0x' || packed.length < 82) { skippedEmpty++; continue }\n\n // Unpack: searchTag (8 bytes) + ownerHash (32 bytes) + encrypted payload\n const raw = packed.startsWith('0x') ? packed.slice(2) : packed\n // searchTag is first 8 bytes (16 hex), skip it\n // ownerHash is next 64 hex chars (32 bytes)\n const noteOwnerHash = BigInt('0x' + raw.slice(16, 80))\n const encryptedPayload = raw.slice(80) // rest is AES-GCM encrypted\n\n // Quick check: does ownerHash match ours?\n if (noteOwnerHash !== masterKeys.ownerHash) { skippedOwner++; continue }\n\n // Decrypt the AES-GCM payload\n const encBytes = hexToBytes('0x' + encryptedPayload)\n if (encBytes.length < 12) continue // need at least nonce\n\n const nonce = encBytes.slice(0, 12)\n const ciphertext = encBytes.slice(12)\n\n let plaintext: ArrayBuffer\n try {\n plaintext = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: nonce },\n cryptoKey,\n ciphertext\n )\n } catch {\n continue // decryption failed — not our note\n }\n\n // Parse: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n const ptBytes = new Uint8Array(plaintext)\n if (ptBytes.length !== 104) continue\n\n const amount = bytesToBigint(ptBytes.slice(0, 32))\n const blinding = bytesToBigint(ptBytes.slice(32, 64))\n const originRaw = '0x' + Array.from(ptBytes.slice(64, 84)).map(b => b.toString(16).padStart(2, '0')).join('')\n const tokenRaw = '0x' + Array.from(ptBytes.slice(84, 104)).map(b => b.toString(16).padStart(2, '0')).join('')\n const origin = getAddress(originRaw) // checksummed\n const token = getAddress(tokenRaw) // checksummed\n\n // Verify commitment\n const pubkey = await sdk.privateToPublic(spendingSecret)\n const expectedCommitment = await sdk.poseidon([\n amount,\n pubkey.x,\n pubkey.y,\n blinding,\n BigInt(origin),\n BigInt(token),\n ])\n const expectedHex = toHex(expectedCommitment, { size: 32 })\n\n if (expectedHex.toLowerCase() !== candidate.commitment.toLowerCase()) {\n console.warn('[syncNotes] Commitment mismatch, skipping')\n continue\n }\n\n // Add the note\n const newNote: ShieldedNote = {\n commitment: candidate.commitment,\n amount,\n blinding,\n ownerSecret: toHex(spendingSecret, { size: 32 }),\n ownerHash: toHex(masterKeys.ownerHash, { size: 32 }),\n origin,\n token,\n leafIndex: candidate.leafIndex,\n status: 'confirmed',\n timestamp: Math.floor(Date.now() / 1000),\n txHash: candidate.txHash,\n proofSystem: 'snark',\n }\n\n // Add via NoteStore (handles dedup internally)\n const store = noteStoreRef.current\n if (store) {\n if (store.addNote(newNote)) discovered++\n } else {\n setNotes((prev) => {\n if (prev.some(n => n.commitment.toLowerCase() === newNote.commitment.toLowerCase())) return prev\n return [...prev, newNote]\n })\n discovered++\n }\n\n } catch (e) {\n console.warn('[syncNotes] Failed to process candidate:', e)\n }\n }\n\n if (discovered > 0 || candidates.length > 0) {\n console.log(`[syncNotes] Discovered ${discovered} new notes from ${candidates.length} candidates`)\n }\n\n // 4. Repair existing notes: fix leafIndex and verify spent status\n // Ensure commitmentLeafMap is populated (may already be from step 2)\n if (commitmentLeafMap.size === 0) {\n try {\n const ciLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'CommitmentInserted',\n inputs: [\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'timestamp', type: 'uint256', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of ciLogs) {\n commitmentLeafMap.set(\n (log.args.commitment as string).toLowerCase(),\n Number(log.args.leafIndex)\n )\n }\n } catch {}\n }\n\n let repaired = 0\n const store = noteStoreRef.current\n if (store) {\n // Fix leafIndex from on-chain data\n for (const note of store.getNotes()) {\n const correctLeafIndex = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeafIndex !== undefined && note.leafIndex !== correctLeafIndex) {\n store.updateLeafIndex(note.commitment, correctLeafIndex)\n repaired++\n }\n }\n }\n\n // Verify note status against on-chain nullifiers\n // - Unspent notes whose nullifier IS on-chain → mark spent (forward check)\n // - Spent notes whose nullifier is NOT on-chain → unmark spent (reverse check)\n try {\n const currentNotes = store ? store.getNotes() : notes\n const snarkNotes = currentNotes.filter(n => n.proofSystem !== 'stark')\n\n // Forward check: detect notes spent on-chain but not locally marked\n const unspentSnarkNotes = snarkNotes.filter(n => n.status !== 'spent')\n if (unspentSnarkNotes.length > 0) {\n const sdk = await loadSDK()\n for (const note of unspentSnarkNotes) {\n const correctLeaf = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeaf === undefined) continue\n\n const ownerSecret = BigInt(note.ownerSecret)\n const commitment = BigInt(note.commitment)\n const nullifier = await sdk.poseidon([\n ownerSecret % 2736030358979909402780800718157159386076813972158567259200215660948447373041n,\n BigInt(correctLeaf),\n commitment,\n ])\n const nullifierHex = toHex(nullifier, { size: 32 })\n\n const isUsed = await client.readContract({\n address: contractAddress,\n abi: [{\n type: 'function',\n name: 'nullifierUsed',\n inputs: [{ name: '', type: 'bytes32' }],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n }],\n functionName: 'nullifierUsed',\n args: [nullifierHex],\n })\n\n if (isUsed) {\n console.log(`[syncNotes] Marking note ${note.commitment.slice(0, 12)} as spent — nullifier found on-chain`)\n if (store) store.markSpent(note.commitment)\n repaired++\n }\n }\n }\n\n // Reverse check: un-spend notes whose nullifier is NOT on-chain\n const spentSnarkNotes = snarkNotes.filter(n => n.status === 'spent')\n if (spentSnarkNotes.length > 0) {\n const sdk = await loadSDK()\n for (const note of spentSnarkNotes) {\n const correctLeaf = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeaf === undefined) continue\n\n const ownerSecret = BigInt(note.ownerSecret)\n const commitment = BigInt(note.commitment)\n const nullifier = await sdk.poseidon([\n ownerSecret % 2736030358979909402780800718157159386076813972158567259200215660948447373041n,\n BigInt(correctLeaf),\n commitment,\n ])\n const nullifierHex = toHex(nullifier, { size: 32 })\n\n const isUsed = await client.readContract({\n address: contractAddress,\n abi: [{\n type: 'function',\n name: 'nullifierUsed',\n inputs: [{ name: '', type: 'bytes32' }],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n }],\n functionName: 'nullifierUsed',\n args: [nullifierHex],\n })\n\n if (!isUsed) {\n console.log(`[syncNotes] Un-spending note ${note.commitment.slice(0, 12)} — nullifier not used on-chain`)\n if (store) {\n store.unmarkSpent(note.commitment)\n store.updateLeafIndex(note.commitment, correctLeaf)\n }\n repaired++\n }\n }\n }\n } catch (e) {\n console.warn('[syncNotes] Nullifier verification failed:', e)\n }\n\n if (repaired > 0) {\n console.log(`[syncNotes] Repaired ${repaired} existing notes`)\n }\n\n // Persist all changes\n if (store && (discovered > 0 || repaired > 0)) {\n await store.persist()\n }\n\n return discovered + repaired\n } finally {\n setIsSyncing(false)\n syncPromiseRef.current = null\n }\n })()\n\n syncPromiseRef.current = syncPromise\n return syncPromise\n },\n [masterKeys, cryptoReady, notes, persistNotes]\n )\n\n // Start live sync\n const startLiveSync = useCallback(\n (contractAddress: Address, client: any) => {\n // Clean up any existing sync\n if (liveSyncInterval) clearInterval(liveSyncInterval)\n if (unwatchRef.current) { unwatchRef.current(); unwatchRef.current = null }\n\n // Initial full scan\n syncNotes(contractAddress, client).catch(console.error)\n\n // Real-time: watch for new commitments via WebSocket/polling\n try {\n const unwatch = client.watchContractEvent({\n address: contractAddress,\n eventName: 'CommitmentInserted',\n onLogs: () => {\n // New commitment detected — trigger sync\n // syncNotes handles dedup so re-scanning is safe\n syncNotes(contractAddress, client).catch(console.error)\n },\n })\n unwatchRef.current = unwatch\n } catch (e) {\n console.warn('[liveSync] watchContractEvent not available, using polling only:', e)\n }\n\n // Fallback poll every 60s (in case watchEvent misses something or isn't supported)\n const fallbackMs = indexerConfig?.liveSyncIntervalMs ?? 60000\n const interval = setInterval(() => {\n syncNotes(contractAddress, client).catch(console.error)\n }, fallbackMs)\n\n setLiveSyncInterval(interval)\n },\n [syncNotes, liveSyncInterval, indexerConfig?.liveSyncIntervalMs]\n )\n\n // Stop live sync\n const stopLiveSync = useCallback(() => {\n if (liveSyncInterval) {\n clearInterval(liveSyncInterval)\n setLiveSyncInterval(null)\n }\n if (unwatchRef.current) {\n unwatchRef.current()\n unwatchRef.current = null\n }\n }, [liveSyncInterval])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (liveSyncInterval) clearInterval(liveSyncInterval)\n if (unwatchRef.current) { unwatchRef.current(); unwatchRef.current = null }\n }\n }, [liveSyncInterval])\n\n // Auto-start liveSync when account + pool contract are available\n useEffect(() => {\n const contractAddr = indexerConfig?.contractAddress\n if (!masterKeys || !publicClientProp || !contractAddr) return\n startLiveSync(contractAddr, publicClientProp)\n return () => stopLiveSync()\n }, [masterKeys, publicClientProp, indexerConfig?.contractAddress])\n\n const ownerHashHex = masterKeys ? toHex(masterKeys.ownerHash, { size: 32 }) : null\n\n // Compute SNARK stealth address for display\n const stealthAddress = useMemo(() => {\n if (!masterKeys) return null\n try {\n const { encodeStealthAddress } = require('../core/stealth.js')\n return encodeStealthAddress(masterKeys.ownerHash, masterKeys.viewingHash) as string\n } catch {\n return null\n }\n }, [masterKeys])\n\n // Compute STARK stealth address for display\n const starkStealthAddress = useMemo(() => {\n if (!starkMasterKeys) return null\n try {\n const { encodeStarkStealthAddress } = require('../core/stealth.js')\n return encodeStarkStealthAddress(starkMasterKeys.starkOwnerHash, starkMasterKeys.starkViewingHash) as string\n } catch {\n return null\n }\n }, [starkMasterKeys])\n\n return (\n <UPPAccountContext.Provider\n value={{\n masterKeys,\n starkMasterKeys,\n ethAddress: ethAddress ?? null,\n ownerHash: ownerHashHex,\n stealthAddress,\n starkStealthAddress,\n notes,\n unspentNotes,\n balance,\n isSetup: !!masterKeys,\n isLoading,\n isConnecting,\n cryptoReady,\n isSyncing,\n lastSyncedBlock,\n setupAccount,\n connect,\n logout,\n disconnect: logout,\n addNote,\n markNoteSpent,\n createNoteForSelf,\n getOwnerHash,\n selectOptimalCircuit,\n syncNotes,\n startLiveSync,\n stopLiveSync,\n isLiveSyncing: liveSyncInterval !== null,\n }}\n >\n {children}\n </UPPAccountContext.Provider>\n )\n}\n\n/**\n * Hook to access UPP Account context\n */\nexport function useUPPAccount(): UPPAccountContextType {\n const context = useContext(UPPAccountContext)\n if (!context) {\n throw new Error('useUPPAccount must be used within a UPPAccountProvider')\n }\n return context\n}\n\n// ============================================================================\n// Helper functions\n// ============================================================================\n\n/**\n * Create a note for self-shielding (BLS12-381, hash-based ownership)\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n *\n * This matches the circuit's NoteCommitment template (5 inputs).\n * No BabyJubJub curve operations — pure hash-based ownership.\n */\nasync function createHashBasedNote(\n sdk: typeof import('../index.js'),\n amount: bigint,\n spendingSecret: bigint,\n ownerHash: bigint,\n viewingSecret: bigint,\n origin: bigint,\n token: bigint,\n): Promise<NoteCreationResult> {\n // Generate blinding factor\n const blinding = await sdk.randomFieldElement()\n\n // Compute commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n // 5 inputs — matches circuit's NoteCommitment template (BLS12-381)\n const commitment = await sdk.poseidon([\n amount,\n ownerHash,\n blinding,\n origin,\n token,\n ])\n\n // Compute search tag from viewing secret (deterministic, for indexing)\n const searchTagHash = await sdk.poseidon([viewingSecret, commitment])\n const searchTag = searchTagHash & ((1n << 64n) - 1n)\n\n // Encrypt note data using viewing secret (symmetric, no ECDH)\n const encryptedNote = await encryptNoteData(amount, blinding, origin, token, viewingSecret)\n\n return {\n commitment,\n ownerSecret: spendingSecret,\n ownerHash,\n blinding,\n encryptedNote,\n searchTag,\n amount,\n origin,\n token,\n }\n}\n\n/**\n * Encrypt note data using viewing secret (symmetric key derivation)\n *\n * Encrypted payload: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n */\nasync function encryptNoteData(\n amount: bigint,\n blinding: bigint,\n origin: bigint,\n token: bigint,\n viewingSecret: bigint,\n): Promise<string> {\n // Derive AES key from viewing secret\n const keyMaterial = keccak256(toHex(viewingSecret, { size: 32 }))\n const keyBytes = hexToBytes(keyMaterial)\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyBytes.buffer.slice(keyBytes.byteOffset, keyBytes.byteOffset + keyBytes.byteLength) as ArrayBuffer,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt']\n )\n\n // Payload: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n const plaintext = new Uint8Array(104)\n plaintext.set(bigintToBytes(amount, 32), 0)\n plaintext.set(bigintToBytes(blinding, 32), 32)\n plaintext.set(bigintToBytes(origin, 20), 64)\n plaintext.set(bigintToBytes(token, 20), 84)\n\n const nonce = crypto.getRandomValues(new Uint8Array(12))\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: nonce },\n cryptoKey,\n plaintext\n )\n\n const result = new Uint8Array(12 + ciphertext.byteLength)\n result.set(nonce, 0)\n result.set(new Uint8Array(ciphertext), 12)\n\n return toHex(result)\n}\n\n// ============================================================================\n// Utility functions\n// ============================================================================\n\nfunction hexToBytes(hex: string): Uint8Array {\n const h = hex.startsWith('0x') ? hex.slice(2) : hex\n const bytes = new Uint8Array(h.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(h.substr(i * 2, 2), 16)\n }\n return bytes\n}\n\nfunction bigintToBytes(n: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length)\n let temp = n\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(temp & 0xffn)\n temp >>= 8n\n }\n return bytes\n}\n\nfunction bytesToBigint(bytes: Uint8Array): bigint {\n let result = 0n\n for (const b of bytes) {\n result = (result << 8n) | BigInt(b)\n }\n return result\n}\n","/**\n * Deterministic geometric avatar generation from an address string.\n * Uses a simple hash to derive colors and shape parameters.\n *\n * No external dependencies — uses a basic string hash for portability\n * (keccak256 from viem is async/heavy, not needed for visual identity).\n */\n\nexport interface AvatarShape {\n type: \"circle\" | \"rect\" | \"triangle\"\n x: number\n y: number\n size: number\n color: string\n opacity: number\n rotation: number\n}\n\nexport interface AvatarData {\n background: string\n shapes: AvatarShape[]\n}\n\n/**\n * Simple deterministic hash — produces 32 bytes of pseudo-random data\n * from a string input. Not cryptographic, just for visual identity.\n */\nfunction hashBytes(input: string): number[] {\n const bytes: number[] = new Array(32).fill(0)\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i)\n bytes[i % 32] = (bytes[i % 32]! * 31 + c) & 0xff\n }\n // Mix rounds for better distribution\n for (let round = 0; round < 3; round++) {\n for (let i = 0; i < 32; i++) {\n bytes[i] = (bytes[i]! + bytes[(i + 7) % 32]! * 17 + round * 53) & 0xff\n }\n }\n return bytes\n}\n\nfunction byteToHex(r: number, g: number, b: number): string {\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`\n}\n\n/**\n * Adjust color to ensure it's not too dark or too light for contrast\n */\nfunction adjustBrightness(r: number, g: number, b: number, minBrightness: number, maxBrightness: number): [number, number, number] {\n const brightness = (r * 299 + g * 587 + b * 114) / 1000\n if (brightness < minBrightness) {\n const factor = minBrightness / Math.max(brightness, 1)\n return [\n Math.min(255, Math.round(r * factor)),\n Math.min(255, Math.round(g * factor)),\n Math.min(255, Math.round(b * factor)),\n ]\n }\n if (brightness > maxBrightness) {\n const factor = maxBrightness / brightness\n return [\n Math.round(r * factor),\n Math.round(g * factor),\n Math.round(b * factor),\n ]\n }\n return [r, g, b]\n}\n\nconst SHAPE_TYPES: AvatarShape[\"type\"][] = [\"circle\", \"rect\", \"triangle\"]\n\n/**\n * Generate avatar data from an address string.\n * Produces a background color and 3-4 geometric shapes.\n */\nexport function generateAvatarData(address: string): AvatarData {\n const bytes = hashBytes(address)\n\n // Background: muted, darker color\n const [bgR, bgG, bgB] = adjustBrightness(bytes[0]!, bytes[1]!, bytes[2]!, 30, 80)\n const background = byteToHex(bgR, bgG, bgB)\n\n // Number of shapes: 3-4\n const shapeCount = 3 + (bytes[3]! % 2)\n const shapes: AvatarShape[] = []\n\n for (let i = 0; i < shapeCount; i++) {\n const offset = 4 + i * 6\n const [sr, sg, sb] = adjustBrightness(\n bytes[offset % 32]!,\n bytes[(offset + 1) % 32]!,\n bytes[(offset + 2) % 32]!,\n 100,\n 240,\n )\n\n shapes.push({\n type: SHAPE_TYPES[bytes[(offset + 3) % 32]! % 3]!,\n x: 10 + (bytes[(offset + 4) % 32]! % 80),\n y: 10 + (bytes[(offset + 5) % 32]! % 80),\n size: 20 + (bytes[(offset + 3) % 32]! % 40),\n color: byteToHex(sr, sg, sb),\n opacity: 0.5 + (bytes[(offset + 2) % 32]! % 50) / 100,\n rotation: (bytes[(offset + 1) % 32]! * 360) / 256,\n })\n }\n\n return { background, shapes }\n}\n\n/**\n * Render avatar data to an SVG string (for non-React contexts).\n */\nexport function renderAvatarSVG(data: AvatarData, size: number = 32): string {\n const shapes = data.shapes\n .map((s) => {\n const transform = `transform=\"rotate(${s.rotation} ${s.x} ${s.y})\"`\n const style = `fill=\"${s.color}\" opacity=\"${s.opacity}\"`\n switch (s.type) {\n case \"circle\":\n return `<circle cx=\"${s.x}\" cy=\"${s.y}\" r=\"${s.size / 2}\" ${style} />`\n case \"rect\":\n return `<rect x=\"${s.x - s.size / 2}\" y=\"${s.y - s.size / 2}\" width=\"${s.size}\" height=\"${s.size * 0.7}\" rx=\"4\" ${style} ${transform} />`\n case \"triangle\": {\n const h = s.size * 0.866\n const points = `${s.x},${s.y - h / 2} ${s.x - s.size / 2},${s.y + h / 2} ${s.x + s.size / 2},${s.y + h / 2}`\n return `<polygon points=\"${points}\" ${style} ${transform} />`\n }\n }\n })\n .join(\"\\n \")\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" width=\"${size}\" height=\"${size}\">\n <rect width=\"100\" height=\"100\" rx=\"20\" fill=\"${data.background}\" />\n ${shapes}\n</svg>`\n}\n","\"use client\"\n\nimport { useMemo, type CSSProperties } from \"react\"\nimport { generateAvatarData, type AvatarShape } from \"../utils/avatar\"\n\nexport interface UPPAvatarProps {\n address: string\n size?: number\n className?: string\n style?: CSSProperties\n}\n\nfunction ShapeSVG({ shape }: { shape: AvatarShape }) {\n const transform = `rotate(${shape.rotation} ${shape.x} ${shape.y})`\n const fill = shape.color\n const opacity = shape.opacity\n\n switch (shape.type) {\n case \"circle\":\n return <circle cx={shape.x} cy={shape.y} r={shape.size / 2} fill={fill} opacity={opacity} />\n case \"rect\":\n return (\n <rect\n x={shape.x - shape.size / 2}\n y={shape.y - shape.size / 2}\n width={shape.size}\n height={shape.size * 0.7}\n rx={4}\n fill={fill}\n opacity={opacity}\n transform={transform}\n />\n )\n case \"triangle\": {\n const h = shape.size * 0.866\n const points = `${shape.x},${shape.y - h / 2} ${shape.x - shape.size / 2},${shape.y + h / 2} ${shape.x + shape.size / 2},${shape.y + h / 2}`\n return <polygon points={points} fill={fill} opacity={opacity} transform={transform} />\n }\n }\n}\n\nexport function UPPAvatar({ address, size = 32, className, style }: UPPAvatarProps) {\n const data = useMemo(() => generateAvatarData(address), [address])\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n width={size}\n height={size}\n className={className}\n style={style}\n >\n <rect width=\"100\" height=\"100\" rx=\"20\" fill={data.background} />\n {data.shapes.map((shape, i) => (\n <ShapeSVG key={i} shape={shape} />\n ))}\n </svg>\n )\n}\n","import type { CSSProperties } from 'react'\n\n// ============================================================================\n// Color Tokens (with CSS variable fallbacks for theming)\n// ============================================================================\n\nexport const colors = {\n backdrop: 'rgba(0, 0, 0, 0.5)',\n modalBg: 'var(--upp-modal-bg, rgba(0, 0, 0, 0.85))',\n border: 'var(--upp-border, rgba(255, 255, 255, 0.1))',\n borderSubtle: 'var(--upp-border-subtle, rgba(255, 255, 255, 0.05))',\n textPrimary: 'var(--upp-text-primary, #ffffff)',\n textSecondary: 'var(--upp-text-secondary, rgba(255, 255, 255, 0.6))',\n textTertiary: 'var(--upp-text-tertiary, rgba(255, 255, 255, 0.4))',\n textMuted: 'var(--upp-text-muted, rgba(255, 255, 255, 0.25))',\n textDim: 'var(--upp-text-dim, rgba(255, 255, 255, 0.2))',\n hoverBg: 'var(--upp-hover-bg, rgba(255, 255, 255, 0.05))',\n pillBg: 'var(--upp-pill-bg, rgba(255, 255, 255, 0.05))',\n pillBorder: 'var(--upp-pill-border, rgba(255, 255, 255, 0.1))',\n pillBorderDashed: 'var(--upp-pill-border-dashed, rgba(255, 255, 255, 0.15))',\n emerald: '#10b981',\n emeraldText: 'rgba(110, 231, 183, 0.6)',\n emeraldTextHover: 'rgba(110, 231, 183, 0.8)',\n emeraldBg: 'rgba(16, 185, 129, 0.1)',\n emeraldBorder: 'rgba(16, 185, 129, 0.2)',\n emeraldBorderHover: 'rgba(16, 185, 129, 0.3)',\n indigo: '#6366f1',\n indigoBg: 'rgba(99, 102, 241, 0.15)',\n indigoBorder: 'rgba(99, 102, 241, 0.3)',\n indigoRing: 'rgba(99, 102, 241, 0.5)',\n indigoHoverBg: 'rgba(99, 102, 241, 0.15)',\n indigoHoverBorder: 'rgba(99, 102, 241, 0.3)',\n red: '#ef4444',\n redBg: 'rgba(239, 68, 68, 0.2)',\n redBorder: 'rgba(239, 68, 68, 0.3)',\n redText: '#fca5a5',\n inputBg: 'var(--upp-input-bg, rgba(0, 0, 0, 0.3))',\n} as const\n\n// ============================================================================\n// Layout Styles\n// ============================================================================\n\nexport const backdrop: CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: colors.backdrop,\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n}\n\nexport const modalContainer: CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n margin: '0 1rem',\n background: colors.modalBg,\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: `1px solid ${colors.border}`,\n borderRadius: '1rem',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n}\n\n// ============================================================================\n// Button Styles\n// ============================================================================\n\nexport const pillBase: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n height: '40px',\n padding: '0 14px',\n borderRadius: '12px',\n border: `1px solid ${colors.pillBorder}`,\n background: colors.pillBg,\n cursor: 'pointer',\n transition: 'all 150ms ease',\n outline: 'none',\n boxSizing: 'border-box',\n}\n\nexport const pillDisconnected: CSSProperties = {\n ...pillBase,\n border: `1px dashed ${colors.pillBorderDashed}`,\n}\n\nexport const pillConnected: CSSProperties = {\n ...pillBase,\n background: colors.emeraldBg,\n border: `1px solid ${colors.emeraldBorder}`,\n}\n\nexport const primaryButton: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.indigo,\n color: colors.textPrimary,\n borderRadius: '0.75rem',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n cursor: 'pointer',\n transition: 'all 150ms ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n}\n\nexport const secondaryButton: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.hoverBg,\n color: colors.textSecondary,\n borderRadius: '0.75rem',\n fontSize: '14px',\n fontWeight: 500,\n border: `1px solid ${colors.border}`,\n cursor: 'pointer',\n transition: 'all 150ms ease',\n}\n\n// ============================================================================\n// Input Styles\n// ============================================================================\n\nexport const textInput: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.inputBg,\n border: `1px solid ${colors.border}`,\n borderRadius: '0.75rem',\n padding: '0 12px',\n fontSize: '14px',\n color: colors.textPrimary,\n fontFamily: 'monospace',\n outline: 'none',\n transition: 'all 150ms ease',\n boxSizing: 'border-box',\n}\n\n// ============================================================================\n// Keyframe Injection\n// ============================================================================\n\nexport const UPP_KEYFRAMES = `\n@keyframes upp-spin {\n to { transform: rotate(360deg); }\n}\n@keyframes upp-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes upp-zoom-in {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n`\n","\"use client\"\n\nimport { useState, useEffect, useCallback, useRef, type CSSProperties } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useUPPAccount } from \"../use-upp-account.js\"\nimport {\n backdrop,\n modalContainer,\n primaryButton,\n secondaryButton,\n textInput,\n colors,\n UPP_KEYFRAMES,\n} from \"./styles.js\"\n\nexport interface UPPModalProps {\n isOpen: boolean\n onClose: () => void\n /** Optional slot for app-level settings (e.g. proof system toggle) */\n settingsSlot?: React.ReactNode\n}\n\nexport function UPPModal({ isOpen, onClose, settingsSlot }: UPPModalProps) {\n const { isSetup, connect, disconnect, isConnecting } = useUPPAccount()\n const [password, setPassword] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const backdropRef = useRef<HTMLDivElement>(null)\n\n // Hover states for interactive elements\n const [closeHover, setCloseHover] = useState(false)\n const [primaryHover, setPrimaryHover] = useState(false)\n const [disconnectHover, setDisconnectHover] = useState(false)\n const [inputFocused, setInputFocused] = useState(false)\n\n // Reset state when opening\n useEffect(() => {\n if (isOpen) {\n setPassword(\"\")\n setError(null)\n }\n }, [isOpen])\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose()\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [isOpen, onClose])\n\n const handleActivate = useCallback(async () => {\n setError(null)\n try {\n await connect(password || undefined)\n onClose()\n } catch (e: any) {\n if (e?.message?.includes(\"User rejected\")) {\n setError(\"Signature rejected\")\n } else {\n setError(e?.message || \"Setup failed\")\n }\n }\n }, [connect, password, onClose])\n\n const handleDisconnect = useCallback(() => {\n disconnect()\n onClose()\n }, [disconnect, onClose])\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) onClose()\n },\n [onClose]\n )\n\n if (!isOpen) return null\n if (typeof document === 'undefined') return null\n\n // Close button style\n const closeButtonStyle: CSSProperties = {\n padding: '6px',\n color: closeHover ? 'rgba(255,255,255,0.6)' : 'rgba(255,255,255,0.3)',\n background: closeHover ? 'rgba(255,255,255,0.05)' : 'transparent',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 150ms ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }\n\n // Input style with focus ring\n const inputStyle: CSSProperties = {\n ...textInput,\n ...(inputFocused && {\n boxShadow: `0 0 0 1px ${colors.indigoRing}`,\n border: `1px solid ${colors.indigoRing}`,\n }),\n }\n\n // Primary button with hover and disabled\n const activateStyle: CSSProperties = {\n ...primaryButton,\n ...(primaryHover && !isConnecting && {\n background: '#4f46e5',\n }),\n ...(isConnecting && {\n background: 'rgba(99, 102, 241, 0.5)',\n cursor: 'not-allowed',\n }),\n }\n\n // Disconnect button with hover\n const disconnectStyle: CSSProperties = {\n ...secondaryButton,\n ...(disconnectHover && {\n background: colors.redBg,\n color: colors.redText,\n border: `1px solid ${colors.redBorder}`,\n }),\n }\n\n return createPortal(\n <>\n <style>{UPP_KEYFRAMES}</style>\n <div\n ref={backdropRef}\n onClick={handleBackdropClick}\n style={{ ...backdrop, animation: 'upp-fade-in 150ms ease' }}\n >\n <div style={{ ...modalContainer, animation: 'upp-zoom-in 200ms ease' }}>\n {/* Close button */}\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '12px 12px 0' }}>\n <button\n onClick={onClose}\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={closeButtonStyle}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </svg>\n </button>\n </div>\n\n {isSetup ? (\n /* ============ Account Mode ============ */\n <div style={{ padding: '0 24px 24px', display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {/* Title */}\n <h3 style={{ fontSize: '14px', fontWeight: 600, color: colors.textPrimary, margin: 0, textAlign: 'center' }}>\n Private Account\n </h3>\n\n {/* Settings Slot — app provides proof system selector with addresses */}\n {settingsSlot}\n\n {/* Disconnect */}\n <button\n onClick={handleDisconnect}\n onMouseEnter={() => setDisconnectHover(true)}\n onMouseLeave={() => setDisconnectHover(false)}\n style={disconnectStyle}\n >\n Disconnect\n </button>\n </div>\n ) : (\n /* ============ Setup Mode ============ */\n <div style={{ padding: '0 24px 24px', display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {/* Header */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '12px' }}>\n <div style={{\n padding: '12px',\n background: colors.indigoBg,\n borderRadius: '1rem',\n border: `1px solid ${colors.indigoBorder}`,\n }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ color: '#818cf8' }}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n </div>\n <div style={{ textAlign: 'center' }}>\n <h3 style={{ fontSize: '16px', fontWeight: 600, color: colors.textPrimary, margin: '0 0 4px' }}>\n Activate Private Account\n </h3>\n <p style={{ fontSize: '12px', color: colors.textTertiary, maxWidth: '20rem', margin: 0 }}>\n Sign once with your wallet to derive your private keys. The optional password creates a unique account.\n </p>\n </div>\n </div>\n\n {/* Password input */}\n <input\n type=\"password\"\n placeholder=\"Password (optional)\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isConnecting) handleActivate()\n }}\n onFocus={() => setInputFocused(true)}\n onBlur={() => setInputFocused(false)}\n style={inputStyle}\n />\n\n {/* Error */}\n {error && (\n <p style={{ fontSize: '12px', color: '#f87171', textAlign: 'center', margin: 0 }}>{error}</p>\n )}\n\n {/* Activate button */}\n <button\n onClick={handleActivate}\n disabled={isConnecting}\n onMouseEnter={() => setPrimaryHover(true)}\n onMouseLeave={() => setPrimaryHover(false)}\n style={activateStyle}\n >\n {isConnecting ? (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ animation: 'upp-spin 1s linear infinite' }}\n >\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n Signing...\n </>\n ) : (\n \"Activate\"\n )}\n </button>\n\n <p style={{ fontSize: '9px', color: colors.textMuted, textAlign: 'center', margin: 0 }}>\n Your private key is derived from a wallet signature. No seed phrase needed.\n </p>\n </div>\n )}\n </div>\n </div>\n </>,\n document.body\n )\n}\n","\"use client\"\n\nimport { useState, useCallback, type CSSProperties } from \"react\"\nimport { useUPPAccount } from \"../use-upp-account.js\"\nimport { UPPAvatar } from \"./UPPAvatar.js\"\nimport { UPPModal } from \"./UPPModal.js\"\nimport { pillDisconnected, pillConnected, colors } from \"./styles.js\"\n\nexport interface UPPPrivateButtonProps {\n /** Additional inline styles for the outer button */\n style?: CSSProperties\n /** Label when private account is not activated (default: \"Private Account\") */\n label?: string\n /** Optional slot for app-level settings rendered in the account modal */\n settingsSlot?: React.ReactNode\n}\n\n/**\n * Standalone private account pill button.\n *\n * Place alongside RainbowKit's `<ConnectButton />` — no RainbowKit dependency required.\n * Only needs `UPPAccountProvider` in the component tree.\n *\n * Two states:\n * - Not setup: dashed-border pill with shield icon + label → opens setup modal\n * - Setup: emerald pill with UPPAvatar + chevron → opens account modal\n */\nexport function UPPPrivateButton({\n style: externalStyle,\n label = \"Private Account\",\n settingsSlot,\n}: UPPPrivateButtonProps) {\n const { isSetup, stealthAddress } = useUPPAccount()\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n\n const openModal = useCallback(() => setIsModalOpen(true), [])\n const closeModal = useCallback(() => setIsModalOpen(false), [])\n\n if (isSetup && stealthAddress) {\n // Connected state: emerald pill with avatar + chevron\n const connectedStyle: CSSProperties = {\n ...pillConnected,\n ...(isHovered && {\n background: 'rgba(16, 185, 129, 0.2)',\n border: `1px solid ${colors.emeraldBorderHover}`,\n }),\n ...externalStyle,\n }\n\n return (\n <>\n <button\n onClick={openModal}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={connectedStyle}\n title=\"Private Account\"\n >\n <UPPAvatar address={stealthAddress} size={22} style={{ borderRadius: '5px', flexShrink: 0 }} />\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" style={{ color: 'rgba(110, 231, 183, 0.4)' }}>\n <path d=\"M1 1l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <UPPModal isOpen={isModalOpen} onClose={closeModal} settingsSlot={settingsSlot} />\n </>\n )\n }\n\n // Disconnected state: dashed pill with shield icon + label\n const disconnectedStyle: CSSProperties = {\n ...pillDisconnected,\n ...(isHovered && {\n background: colors.indigoHoverBg,\n border: `1px dashed ${colors.indigoHoverBorder}`,\n }),\n ...externalStyle,\n }\n\n const iconColor = isHovered ? colors.indigo : 'rgba(255, 255, 255, 0.25)'\n const textColor = isHovered ? 'rgba(255, 255, 255, 0.7)' : colors.textTertiary\n\n return (\n <>\n <button\n onClick={openModal}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={disconnectedStyle}\n title=\"Activate Private Account\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ color: iconColor, transition: 'color 150ms ease', flexShrink: 0 }}\n >\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n <span style={{\n fontSize: '13px',\n fontWeight: 500,\n color: textColor,\n transition: 'color 150ms ease',\n }}>\n {label}\n </span>\n </button>\n <UPPModal isOpen={isModalOpen} onClose={closeModal} settingsSlot={settingsSlot} />\n </>\n )\n}\n","'use client'\n\n/**\n * React hook for UPP crypto utilities\n *\n * Handles lazy initialization of crypto libraries (Poseidon, BabyJubJub).\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { Point } from '../utils/babyjubjub.js'\n\n// Lazy-loaded SDK functions\nlet sdkPromise: Promise<typeof import('../index.js')> | null = null\n\n/**\n * Hook return type\n */\nexport interface UseUPPCryptoReturn {\n /** Whether crypto libraries are ready */\n isReady: boolean\n /** Initialize crypto (called automatically, but can be called manually) */\n init: () => Promise<void>\n /** Poseidon hash */\n poseidon: (inputs: bigint[]) => Promise<bigint>\n /** Generate random field element */\n randomFieldElement: () => Promise<bigint>\n /** Compute shared secret (ECDH) */\n computeSharedSecret: (privateKey: bigint, publicKey: Point) => Promise<Point>\n /** Get public key from private key */\n privateToPublic: (privateKey: bigint) => Promise<Point>\n /** Add two points */\n addPoints: (p1: Point, p2: Point) => Promise<Point>\n /** Multiply point by scalar */\n mulPointScalar: (point: Point, scalar: bigint) => Promise<Point>\n /** Get BabyJubJub subgroup order */\n getSubOrder: () => Promise<bigint>\n}\n\n/**\n * Hook for UPP crypto utilities\n *\n * Provides lazy-loaded cryptographic functions.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isReady, poseidon, randomFieldElement } = useUPPCrypto()\n *\n * if (!isReady) return <div>Loading crypto...</div>\n *\n * // Use crypto functions\n * const hash = await poseidon([1n, 2n, 3n])\n * }\n * ```\n */\nexport function useUPPCrypto(): UseUPPCryptoReturn {\n const [isReady, setIsReady] = useState(false)\n\n // Load SDK lazily\n const loadSDK = useCallback(async () => {\n if (!sdkPromise) {\n sdkPromise = import('../index.js')\n }\n return sdkPromise\n }, [])\n\n // Initialize on mount\n useEffect(() => {\n loadSDK().then(() => setIsReady(true))\n }, [loadSDK])\n\n // Create bound functions\n const poseidon = useCallback(\n async (inputs: bigint[]): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.poseidon(inputs)\n },\n [loadSDK]\n )\n\n const randomFieldElement = useCallback(async (): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.randomFieldElement()\n }, [loadSDK])\n\n const computeSharedSecret = useCallback(\n async (privateKey: bigint, publicKey: Point): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.computeSharedSecret(privateKey, publicKey)\n },\n [loadSDK]\n )\n\n const privateToPublic = useCallback(\n async (privateKey: bigint): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.privateToPublic(privateKey)\n },\n [loadSDK]\n )\n\n const addPoints = useCallback(\n async (p1: Point, p2: Point): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.addPoints(p1, p2)\n },\n [loadSDK]\n )\n\n const mulPointScalar = useCallback(\n async (point: Point, scalar: bigint): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.mulPointScalar(point, scalar)\n },\n [loadSDK]\n )\n\n const getSubOrder = useCallback(async (): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.getSubOrder()\n }, [loadSDK])\n\n const init = useCallback(async (): Promise<void> => {\n await loadSDK()\n setIsReady(true)\n }, [loadSDK])\n\n return {\n isReady,\n init,\n poseidon,\n randomFieldElement,\n computeSharedSecret,\n privateToPublic,\n addPoints,\n mulPointScalar,\n getSubOrder,\n }\n}\n","'use client'\n\n/**\n * React hook for shielding (depositing) tokens into UniversalPrivatePool\n *\n * The pooled model separates the token (standard ERC20) from the privacy pool.\n * Shielding requires: approve token → call pool.shield()\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { encodePacked, toHex, type Address, type Hex } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult } from './use-upp-account.js'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Pack note data for on-chain storage (post-quantum, hash-based)\n *\n * Format: searchTag (8 bytes) + ownerHash (32 bytes) + encryptedNote (variable)\n * No ephemeral pubkey needed — encryption uses viewing secret directly.\n */\nfunction packNoteData(note: NoteCreationResult): Hex {\n return encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [note.searchTag, note.ownerHash, note.encryptedNote as Hex]\n )\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Shield configuration\n */\nexport interface ShieldConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address to shield */\n tokenAddress: Address\n}\n\n/**\n * Shield parameters\n */\nexport interface ShieldParams {\n /** Amount to shield (in wei/smallest unit) */\n amount: bigint\n /** Origin address (the depositor/shielder's wallet address) */\n originAddress: Address\n}\n\n/**\n * Shield build data - everything needed to call the contract\n */\nexport interface ShieldBuildData {\n /** Amount being shielded */\n amount: bigint\n /** Token address */\n token: Address\n /** Commitment hash (bytes32) */\n commitment: Hex\n /** Encrypted note data */\n encryptedNote: Hex\n /** Raw note data for local storage */\n noteData: NoteCreationResult\n}\n\n/**\n * useShield return type\n */\nexport interface UseShieldReturn {\n /** Build shield transaction data */\n build: (params: ShieldParams) => Promise<ShieldBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: 'creating_note' | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for shielding tokens into UniversalPrivatePool\n *\n * @param config - Shield configuration (pool and token addresses)\n * @returns Shield functions and state\n *\n * @example\n * ```tsx\n * function ShieldForm() {\n * const { address } = useAccount() // from wagmi\n * const { build, isPending, error } = useShield({\n * poolAddress: '0x...',\n * tokenAddress: '0x...',\n * })\n *\n * const handleShield = async () => {\n * // 1. Build shield data (originAddress is the depositor's wallet)\n * const data = await build({\n * amount: parseUnits('100', 18),\n * originAddress: address!,\n * })\n *\n * // 2. Approve token (using wagmi or viem)\n * await writeContract({\n * address: data.token,\n * abi: erc20Abi,\n * functionName: 'approve',\n * args: [poolAddress, data.amount],\n * })\n *\n * // 3. Shield into pool\n * await writeContract({\n * address: poolAddress,\n * abi: UNIVERSAL_PRIVATE_POOL_ABI,\n * functionName: 'shield',\n * args: [data.token, data.amount, data.commitment, data.encryptedNote],\n * })\n *\n * // 4. Track note locally\n * addNote({\n * amount: data.amount,\n * commitment: data.noteData.commitment,\n * // ... other note fields\n * })\n * }\n *\n * return (\n * <button onClick={handleShield} disabled={isPending}>\n * {isPending ? 'Creating note...' : 'Shield'}\n * </button>\n * )\n * }\n * ```\n */\nexport function useShield(config: ShieldConfig): UseShieldReturn {\n const { createNoteForSelf, isSetup, masterKeys } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<'creating_note' | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build shield transaction data\n */\n const build = useCallback(\n async (params: ShieldParams): Promise<ShieldBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { amount, originAddress } = params\n const cfg = configRef.current\n\n if (amount <= 0n) {\n throw new Error('Amount must be positive')\n }\n\n // Convert addresses to bigint for circuit compatibility\n const origin = BigInt(originAddress)\n const token = BigInt(cfg.tokenAddress)\n\n // Create note for self (the shielder is the recipient)\n // UPP notes include origin (depositor) and token for compliance proofs\n setStage('creating_note')\n const noteData = await createNoteForSelf(amount, origin, token)\n\n // Format for contract call\n // Pack the note data with ephemeral pubkey so indexer can decrypt later\n const commitment = toHex(noteData.commitment, { size: 32 })\n const encryptedNote = packNoteData(noteData)\n\n return {\n amount,\n token: cfg.tokenAddress,\n commitment,\n encryptedNote,\n noteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for private transfers via UniversalPrivatePool\n *\n * This hook generates ZK proofs using UPP circuits and builds\n * transaction data for calling pool.transfer()\n *\n * NOTE: Transfer requires STARK circuits (Phase 2). This hook compiles\n * but will throw at runtime until circuits are migrated.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { toHex, encodePacked, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote, NoteWithAmount } from '../core/transfer.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pool transfer configuration\n */\nexport interface PoolTransferConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address being transferred */\n tokenAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** ASP ID to use (default: DEMO_ASP_ID) */\n aspId?: bigint\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Pool transfer parameters\n */\nexport interface PoolTransferParams {\n /** Amount to send (in wei) */\n amount: bigint\n /** Recipient stealth address (0zk... format) */\n recipient: string\n}\n\n/**\n * Pool transfer build data - everything needed to call the contract\n */\nexport interface PoolTransferBuildData {\n /** Circuit used: 'transfer' for UPP 1-in-2-out */\n circuit: 'transfer'\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** Token address */\n token: Address\n /** Recipient output commitment */\n outputCommitment1: Hex\n /** Change output commitment */\n outputCommitment2: Hex\n /** Recipient encrypted note (packed format) */\n encryptedNote1: Hex\n /** Change encrypted note (packed format) */\n encryptedNote2: Hex\n /** Note that will be spent */\n spentNote: ShieldedNote\n /** Raw note data for local tracking */\n recipientNoteData: NoteCreationResult\n changeNoteData: NoteCreationResult\n}\n\n/**\n * usePoolTransfer return type\n */\nexport interface UsePoolTransferReturn {\n /** Build transfer transaction data */\n build: (params: PoolTransferParams) => Promise<PoolTransferBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: TransferStage | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Pack note data into bytes for on-chain storage (post-quantum format)\n *\n * Format: searchTag (8 bytes) + ownerHash (32 bytes) + encryptedNote (variable)\n */\nfunction packNoteData(note: NoteCreationResult): Hex {\n return encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [note.searchTag, note.ownerHash, note.encryptedNote as Hex]\n )\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for building private transfer transactions on UniversalPrivatePool\n *\n * Uses UPP transfer circuit (1-in-2-out) with ASP membership proof.\n *\n * NOTE: Transfer requires STARK circuits. Currently throws at proof generation.\n */\nexport function usePoolTransfer(config: PoolTransferConfig): UsePoolTransferReturn {\n const {\n unspentNotes,\n createNoteForSelf,\n isSetup,\n masterKeys,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build transfer transaction data\n */\n const build = useCallback(\n async (params: PoolTransferParams): Promise<PoolTransferBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { amount, recipient: _recipient } = params\n const cfg = configRef.current\n\n // 1. Find a single note that covers the amount\n setStage('selecting_notes')\n\n const confirmedNotes = unspentNotes.filter(\n (n) => n.status === 'confirmed' && n.token?.toLowerCase() === cfg.tokenAddress.toLowerCase()\n )\n const sortedNotes = [...confirmedNotes].sort((a, b) => {\n const diff = b.amount - a.amount\n return diff > 0n ? 1 : diff < 0n ? -1 : 0\n })\n\n const selectedNote = sortedNotes.find((n) => n.amount >= amount)\n if (!selectedNote) {\n const totalBalance = confirmedNotes.reduce((sum, n) => sum + n.amount, 0n)\n if (totalBalance >= amount) {\n throw new Error(\n 'No single note is large enough. Please merge notes first, or shield a larger amount.'\n )\n }\n throw new Error('Insufficient shielded balance')\n }\n\n // 2. Calculate change amount\n const changeAmount = selectedNote.amount - amount\n\n // 3. Get origin and token from the note\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n // 4. Create output notes\n // TODO: Phase 2 — createNoteForRecipient (send to others)\n // For now, both outputs use self keys\n setStage('creating_outputs')\n const recipientNote = await createNoteForSelf(amount, origin, token)\n const changeNote = await createNoteForSelf(changeAmount, origin, token)\n\n // 5. Load modules dynamically\n const [transferModule, proofModule, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../core/asp.js'),\n ])\n\n const {\n syncMerkleTree,\n getMerkleProofsForNotes,\n buildUPPTransferCircuitInputs,\n } = transferModule\n\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof, DEMO_ASP_ID } = aspModule\n\n // 6. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 7. Convert note to spendable format (post-quantum)\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 8. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 9. Generate ASP proof for origin\n const aspProof = await generateASPProof(\n cfg.aspId ?? DEMO_ASP_ID,\n origin,\n cfg.aspApprovedOrigins\n )\n\n // 10. Build circuit inputs\n setStage('generating_proof')\n\n const recipientNoteWithAmount: NoteWithAmount = { ...recipientNote, amount }\n const changeNoteWithAmount: NoteWithAmount = { ...changeNote, amount: changeAmount }\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof!,\n aspProof,\n recipientNoteWithAmount,\n changeNoteWithAmount\n )\n\n // 11. Generate proof\n // NOTE: This will fail until STARK circuits are implemented (Phase 2)\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n nullifier: toHex(BigInt(circuitInputs.nullifier), { size: 32 }),\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n token: cfg.tokenAddress,\n outputCommitment1: toHex(recipientNote.commitment, { size: 32 }),\n outputCommitment2: toHex(changeNote.commitment, { size: 32 }),\n encryptedNote1: packNoteData(recipientNote),\n encryptedNote2: packNoteData(changeNote),\n spentNote: selectedNote,\n recipientNoteData: recipientNote,\n changeNoteData: changeNote,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes, createNoteForSelf]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for withdrawing from UniversalPrivatePool\n *\n * Withdrawal converts private balance back to public tokens.\n * Supports ASP compliance checks and ragequit (emergency exit).\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote } from '../core/transfer.js'\nimport { BABYJUBJUB_SUBORDER } from '../utils/poseidon.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** State tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst STATE_TREE_DEPTH = 32\n/** ASP tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst ASP_TREE_DEPTH = 20\n\n/**\n * Pad an array to a target depth\n */\nfunction padToDepth<T>(arr: T[], padValue: T, depth: number): T[] {\n if (arr.length >= depth) {\n return arr.slice(0, depth)\n }\n return [...arr, ...Array(depth - arr.length).fill(padValue)]\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Withdraw configuration\n */\nexport interface WithdrawConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address being withdrawn */\n tokenAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n}\n\n/**\n * Withdraw parameters\n */\nexport interface WithdrawParams {\n /** Amount to withdraw (in wei) */\n amount: bigint\n /** Public recipient address for the withdrawn tokens */\n recipient: Address\n /** ASP ID to use for compliance (default: 0) */\n aspId?: bigint\n /** ASP root for compliance (default: 0 for ragequit) */\n aspRoot?: bigint\n /** Enable ragequit mode (bypass ASP check, requires recipient = origin) */\n isRagequit?: boolean\n}\n\n/**\n * Withdraw build data - everything needed to call the contract\n */\nexport interface WithdrawBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier of the note being spent */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Token address */\n token: Address\n /** Amount being withdrawn */\n amount: bigint\n /** Public recipient address */\n recipient: Address\n /** Whether this is a ragequit withdrawal */\n isRagequit: boolean\n /** Note being spent */\n spentNote: ShieldedNote\n /** Change note data (if any change remains) */\n changeNoteData: NoteCreationResult | null\n /** Change output commitment (if any) */\n changeCommitment: Hex | null\n /** Change encrypted note (if any) */\n changeEncryptedNote: Hex | null\n}\n\n/**\n * useWithdraw return type\n */\nexport interface UseWithdrawReturn {\n /** Build withdraw transaction data */\n build: (params: WithdrawParams) => Promise<WithdrawBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: TransferStage | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for building withdrawal transactions from UniversalPrivatePool\n *\n * @param config - Withdraw configuration\n * @returns Withdraw build functions and state\n *\n * @example\n * ```tsx\n * function WithdrawForm() {\n * const { address } = useAccount()\n * const { build, isPending, stage, error } = useWithdraw({\n * poolAddress: '0x...',\n * tokenAddress: '0x...',\n * publicClient,\n * })\n *\n * const handleWithdraw = async () => {\n * // 1. Build withdrawal data\n * const data = await build({\n * amount: parseUnits('100', 18),\n * recipient: address,\n * isRagequit: true, // Emergency exit without ASP check\n * })\n *\n * // 2. Submit to pool contract\n * await writeContract({\n * address: poolAddress,\n * abi: UNIVERSAL_PRIVATE_POOL_ABI,\n * functionName: 'withdraw',\n * args: [\n * data.proof,\n * data.nullifier,\n * data.stateRoot,\n * data.aspRoot,\n * data.aspId,\n * data.token,\n * data.amount,\n * data.recipient,\n * data.isRagequit,\n * ],\n * })\n *\n * // 3. Track spent note locally\n * markNoteSpent(data.spentNote.commitment)\n * if (data.changeNoteData) {\n * addNote(/* change note *\\/)\n * }\n * }\n *\n * return (\n * <div>\n * {stage && <p>Stage: {stage}</p>}\n * <button onClick={handleWithdraw} disabled={isPending}>\n * {isPending ? 'Building proof...' : 'Withdraw'}\n * </button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useWithdraw(config: WithdrawConfig): UseWithdrawReturn {\n const {\n isSetup,\n masterKeys,\n unspentNotes,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build withdraw transaction data\n */\n const build = useCallback(\n async (params: WithdrawParams): Promise<WithdrawBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n amount,\n recipient,\n aspId = 0n,\n aspRoot = 0n,\n isRagequit = false,\n } = params\n const cfg = configRef.current\n\n // 1. Select a note to spend\n // For withdraw, we need exactly 1 note (uses withdraw circuit)\n setStage('selecting_notes')\n\n console.log(`[useWithdraw] === NOTE SELECTION DEBUG ===`)\n console.log(` Requested amount: ${amount}`)\n console.log(` Available unspent notes (${unspentNotes.length}):`)\n unspentNotes.forEach((n, i) => {\n console.log(` [${i}] amount=${n.amount}, status=${n.status}, leafIndex=${n.leafIndex}, commitment=${n.commitment.slice(0, 18)}...`)\n })\n\n // Find the smallest SNARK note that covers the amount (filtered by token)\n const tokenFilteredNotes = unspentNotes.filter(\n (n) => n.token?.toLowerCase() === cfg.tokenAddress.toLowerCase() && n.proofSystem !== 'stark'\n )\n const sortedNotes = [...tokenFilteredNotes].sort((a, b) =>\n a.amount > b.amount ? 1 : -1\n )\n\n console.log(` Sorted notes (ascending by amount):`)\n sortedNotes.forEach((n, i) => {\n console.log(` [${i}] amount=${n.amount}, commitment=${n.commitment.slice(0, 18)}...`)\n })\n\n const selectedNote = sortedNotes.find((n) => n.amount >= amount)\n console.log(` Selected note: ${selectedNote ? `amount=${selectedNote.amount}, commitment=${selectedNote.commitment.slice(0, 18)}...` : 'NONE'}`)\n\n if (!selectedNote) {\n throw new Error(`Insufficient balance. Need ${amount}, have ${tokenFilteredNotes.reduce((s, n) => s + n.amount, 0n)}`)\n }\n\n // 2. The withdraw circuit enforces amount === inputAmount (full note withdrawal)\n // Change notes are NOT supported - use private transfer to split first\n if (selectedNote.amount !== amount) {\n throw new Error(\n `Withdraw circuit requires exact note amount. ` +\n `Note has ${selectedNote.amount}, requested ${amount}. ` +\n `Use private transfer to split the note first.`\n )\n }\n\n // 3. Get origin and token from the note\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n // 4. Load modules dynamically\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n\n // 5. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 6. Convert note for proof\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 7. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 8. Build withdraw circuit inputs\n setStage('generating_proof')\n\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n\n // CRITICAL: Use the ACTUAL leafIndex from the Merkle proof, not the stored one\n // The stored leafIndex might be stale if the tree changed\n const actualLeafIndex = merkleProof.leafIndex\n\n // Verify commitment matches current formula before building proof\n const inputPubkey = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitment = await sdk.poseidon([\n selectedNote.amount,\n inputPubkey.x,\n inputPubkey.y,\n selectedNote.blinding,\n BigInt(selectedNote.origin),\n BigInt(selectedNote.token),\n ])\n const storedCommitment = BigInt(selectedNote.commitment)\n if (localCommitment !== storedCommitment) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n // Compute nullifier: Poseidon(ownerSecret % subOrder, leafIndex, commitment)\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitment,\n ])\n\n // Build inputs matching the withdraw circuit signals exactly\n // See: circuits/withdraw.circom - Withdraw(32, 20)\n const circuitInputs = {\n // Public inputs\n stateRoot: stateRootBI.toString(),\n aspRoot: aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(recipient).toString(),\n token: BigInt(cfg.tokenAddress).toString(),\n isRagequit: isRagequit ? '1' : '0',\n\n // Private inputs - Input Note\n // IMPORTANT: Use actualLeafIndex from Merkle proof, not stored leafIndex\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n // ASP membership proof (zeros for ragequit)\n aspPathElements: Array(ASP_TREE_DEPTH).fill('0'),\n aspPathIndices: Array(ASP_TREE_DEPTH).fill('0'),\n }\n\n // 9. Generate proof using the withdraw circuit\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n const stateRoot = stateRootBI\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot,\n aspRoot,\n aspId,\n token: cfg.tokenAddress,\n amount,\n recipient,\n isRagequit,\n spentNote: selectedNote,\n changeNoteData: null,\n changeCommitment: null,\n changeEncryptedNote: null,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for managing a personal ASP (Association Set Provider)\n *\n * Allows users to register and manage their own ASP for self-approval.\n * This is useful for demo purposes where users need to approve themselves\n * to withdraw notes they received via private transfer.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport { type Address, type PublicClient } from 'viem'\nimport { ASP_REGISTRY_HUB_ABI } from '@permissionless-technologies/upc-sdk'\nimport { computeSingleOriginASPRoot } from '../core/asp.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PersonalASPConfig {\n /** ASP Registry Hub contract address */\n aspHubAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** User's wallet address */\n userAddress?: Address\n}\n\nexport interface PersonalASPInfo {\n /** ASP ID (0 if not registered) */\n aspId: bigint\n /** Current root (0 if not set) */\n currentRoot: bigint\n /** Whether the ASP is registered */\n isRegistered: boolean\n /** Whether the root is set to the user's origin */\n isApproved: boolean\n}\n\nexport interface UsePersonalASPReturn {\n /** Personal ASP info */\n aspInfo: PersonalASPInfo | null\n /** Whether loading initial state */\n isLoading: boolean\n /** Error from last operation */\n error: Error | null\n /** Check if a specific origin is approved in this ASP */\n isOriginApproved: (origin: bigint) => Promise<boolean>\n /** Get the ASP ID for use in transactions */\n getASPId: () => bigint | null\n /** Get the ASP root for a given origin (for single-origin tree) */\n getASPRootForOrigin: (origin: bigint) => Promise<bigint>\n /** Refresh ASP info from contract */\n refresh: () => Promise<void>\n}\n\n// ============================================================================\n// Local Storage Keys\n// ============================================================================\n\nconst STORAGE_KEY_PREFIX = 'upp_personal_asp_'\n\nfunction getStorageKey(chainId: number, address: Address): string {\n return `${STORAGE_KEY_PREFIX}${chainId}_${address.toLowerCase()}`\n}\n\nfunction loadStoredASPId(chainId: number, address: Address): bigint | null {\n if (typeof window === 'undefined') return null\n try {\n const key = getStorageKey(chainId, address)\n const stored = localStorage.getItem(key)\n return stored ? BigInt(stored) : null\n } catch {\n return null\n }\n}\n\nfunction storeASPId(chainId: number, address: Address, aspId: bigint): void {\n if (typeof window === 'undefined') return\n try {\n const key = getStorageKey(chainId, address)\n localStorage.setItem(key, aspId.toString())\n } catch {\n // Ignore storage errors\n }\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for managing a personal ASP\n *\n * @example\n * ```tsx\n * function ApproveButton() {\n * const { aspInfo, refresh } = usePersonalASP({\n * aspHubAddress: '0x...',\n * publicClient,\n * userAddress: address,\n * })\n *\n * // Check if approved\n * if (aspInfo?.isApproved) {\n * return <span>Approved!</span>\n * }\n *\n * return <button onClick={handleApprove}>Approve Yourself</button>\n * }\n * ```\n */\nexport function usePersonalASP(config: PersonalASPConfig): UsePersonalASPReturn {\n const { aspHubAddress, publicClient, userAddress } = config\n\n const [aspInfo, setAspInfo] = useState<PersonalASPInfo | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n // Load ASP info\n const refresh = useCallback(async () => {\n if (!userAddress || !publicClient) {\n setAspInfo(null)\n setIsLoading(false)\n return\n }\n\n try {\n setIsLoading(true)\n setError(null)\n\n const chainId = await publicClient.getChainId()\n\n // Check stored ASP ID first\n const storedAspId = loadStoredASPId(chainId, userAddress)\n\n if (storedAspId) {\n // Verify the stored ASP is still valid and owned by user\n const aspData = await publicClient.readContract({\n address: aspHubAddress,\n abi: ASP_REGISTRY_HUB_ABI,\n functionName: 'getASP',\n args: [storedAspId],\n }) as { id: bigint; operator: Address; name: string; currentRoot: bigint; lastUpdated: bigint }\n\n if (aspData.operator.toLowerCase() === userAddress.toLowerCase()) {\n // Valid stored ASP\n const userOrigin = BigInt(userAddress)\n const expectedRoot = await computeSingleOriginASPRoot(userOrigin)\n const isApproved = aspData.currentRoot === expectedRoot\n\n setAspInfo({\n aspId: storedAspId,\n currentRoot: aspData.currentRoot,\n isRegistered: true,\n isApproved,\n })\n setIsLoading(false)\n return\n }\n }\n\n // No stored ASP or invalid - user needs to register\n setAspInfo({\n aspId: 0n,\n currentRoot: 0n,\n isRegistered: false,\n isApproved: false,\n })\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n setAspInfo(null)\n } finally {\n setIsLoading(false)\n }\n }, [aspHubAddress, publicClient, userAddress])\n\n // Load on mount and when config changes\n useEffect(() => {\n refresh()\n }, [refresh])\n\n // Check if a specific origin is approved\n const isOriginApproved = useCallback(async (origin: bigint): Promise<boolean> => {\n if (!aspInfo?.isRegistered || !publicClient) return false\n\n try {\n const expectedRoot = await computeSingleOriginASPRoot(origin)\n const isValid = await publicClient.readContract({\n address: aspHubAddress,\n abi: ASP_REGISTRY_HUB_ABI,\n functionName: 'isValidASPRoot',\n args: [aspInfo.aspId, expectedRoot],\n })\n return isValid as boolean\n } catch {\n return false\n }\n }, [aspInfo, aspHubAddress, publicClient])\n\n // Get ASP ID\n const getASPId = useCallback((): bigint | null => {\n return aspInfo?.isRegistered ? aspInfo.aspId : null\n }, [aspInfo])\n\n // Get ASP root for a given origin\n const getASPRootForOrigin = useCallback(async (origin: bigint): Promise<bigint> => {\n return computeSingleOriginASPRoot(origin)\n }, [])\n\n return {\n aspInfo,\n isLoading,\n error,\n isOriginApproved,\n getASPId,\n getASPRootForOrigin,\n refresh,\n }\n}\n\n/**\n * Store a newly registered ASP ID\n * Call this after successfully registering an ASP via contract\n */\nexport function storePersonalASPId(\n chainId: number,\n address: Address,\n aspId: bigint\n): void {\n storeASPId(chainId, address, aspId)\n}\n","'use client'\n\n/**\n * React hooks for UPP in-pool swap order book\n *\n * Provides hooks for browsing, placing, filling, claiming, and cancelling swap orders.\n * Proof-system-aware: works with both SNARK and STARK proof systems.\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote } from '../core/transfer.js'\nimport {\n type SwapOrder,\n type SwapOrderEvent,\n type SwapFillEvent,\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n computeFillPercentage,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n SWAP_ORDER_PLACED_EVENT,\n RATE_PRECISION,\n} from '../core/swap.js'\nimport { BABYJUBJUB_SUBORDER } from '../utils/poseidon.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** State tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst STATE_TREE_DEPTH = 32\n/** ASP tree depth - must match compiled withdraw circuit */\nconst ASP_TREE_DEPTH = 20\n\nfunction padToDepth<T>(arr: T[], padValue: T, depth: number): T[] {\n if (arr.length >= depth) return arr.slice(0, depth)\n return [...arr, ...Array(depth - arr.length).fill(padValue)]\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SwapStage =\n | 'idle'\n | 'preparing'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n | 'done'\n | 'error'\n\nexport interface SwapOrderBookConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Token pair filter (optional) */\n sellToken?: Address\n buyToken?: Address\n /** ASP filter: only show orders from these ASP IDs */\n acceptableAspIds?: bigint[]\n /** Polling interval for order book updates (ms, default: 15000) */\n pollInterval?: number\n /** Start block for event scanning (default: 0) */\n fromBlock?: bigint\n}\n\nexport interface UseSwapOrderBookReturn {\n /** Active swap orders */\n orders: SwapOrderEvent[]\n /** Whether the order book is loading */\n isLoading: boolean\n /** Error if any */\n error: string | null\n /** Manually refresh the order book */\n refresh: () => Promise<void>\n}\n\nexport interface SwapConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Build data returned by buildPlaceOrder — everything needed for the contract call\n */\nexport interface PlaceOrderBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier (= orderId) */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Sell token address */\n sellToken: Address\n /** Sell amount */\n sellAmount: bigint\n /** Buy token address */\n buyToken: Address\n /** Rate (1e18 fixed-point) */\n rate: bigint\n /** Cancel key hash */\n cancelKeyHash: Hex\n /** Cancel secret (store in localStorage!) */\n cancelSecret: Hex\n /** Required filler ASP ID */\n requiredFillerAspId: bigint\n /** Expiry (block number) */\n expiry: bigint\n /** Note being spent */\n spentNote: ShieldedNote\n}\n\n/**\n * Build data returned by buildFillOrder\n */\nexport interface FillOrderBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Filler's nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Order being filled */\n orderId: Hex\n /** Take amount (sellToken from order) */\n takeAmount: bigint\n /** Filler's output commitment (receives sellToken) */\n fillerOutputCommitment: Hex\n /** Encrypted note for filler's output */\n fillerEncryptedNote: Hex\n /** Note being spent */\n spentNote: ShieldedNote\n /** Filler's new note data */\n fillerNoteData: NoteCreationResult\n}\n\n/**\n * Build data returned by buildClaimOrder\n */\nexport interface ClaimOrderBuildData {\n /** Order being claimed */\n orderId: Hex\n /** Cancel secret */\n cancelSecret: Hex\n /** Buy output commitment (receives accumulated buyToken) */\n buyOutputCommitment: Hex\n /** Refund commitment (remaining sellToken) */\n refundCommitment: Hex\n /** Encrypted buy output note */\n buyEncryptedNote: Hex\n /** Encrypted refund note */\n refundEncryptedNote: Hex\n /** Buy note data (null if no fills) */\n buyNoteData: NoteCreationResult | null\n /** Refund note data (null if fully filled) */\n refundNoteData: NoteCreationResult | null\n}\n\n/**\n * Build data returned by buildCancelOrder\n */\nexport interface CancelOrderBuildData {\n /** Order being cancelled */\n orderId: Hex\n /** Cancel secret */\n cancelSecret: Hex\n /** Refund commitment */\n refundCommitment: Hex\n /** Encrypted refund note */\n refundEncryptedNote: Hex\n /** Refund note data */\n refundNoteData: NoteCreationResult\n}\n\nexport interface SplitNoteParams {\n /** Note to split */\n note: ShieldedNote\n /** Desired amount for the first output (the rest becomes change) */\n targetAmount: bigint\n /** ASP ID to use for the proof (defaults to DEMO_ASP_ID if not provided) */\n aspId?: bigint\n /** Pre-fetched ASP proof from the service */\n aspProof?: ASPProofParam\n}\n\nexport interface SplitNoteBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root (for transfer circuit) */\n aspRoot: bigint\n /** Token address */\n token: Address\n /** Exact-amount output commitment */\n outputCommitment1: Hex\n /** Change output commitment */\n outputCommitment2: Hex\n /** Exact-amount encrypted note */\n encryptedNote1: Hex\n /** Change encrypted note */\n encryptedNote2: Hex\n /** The exact-amount note — use as noteOverride for buildPlaceOrder/buildFillOrder */\n exactNote: ShieldedNote\n /** The change note */\n changeNote: ShieldedNote\n /** Original note being spent */\n spentNote: ShieldedNote\n /** Raw creation data for local tracking */\n exactNoteData: NoteCreationResult\n /** Raw creation data for local tracking */\n changeNoteData: NoteCreationResult\n}\n\nexport interface UseSwapReturn {\n /** Current operation stage */\n stage: TransferStage | null\n /** Whether building is in progress */\n isPending: boolean\n /** Error from last attempt */\n error: Error | null\n /** Build a self-transfer to split a note into exact amount + change */\n buildNoteSplit: (params: SplitNoteParams) => Promise<SplitNoteBuildData>\n /** Build place order data (returns everything needed for contract call) */\n buildPlaceOrder: (params: PlaceOrderParams) => Promise<PlaceOrderBuildData>\n /** Build fill order data */\n buildFillOrder: (params: FillOrderParams) => Promise<FillOrderBuildData>\n /** Build claim order data (no proof needed) */\n buildClaimOrder: (params: ClaimOrderParams) => Promise<ClaimOrderBuildData>\n /** Build cancel order data (no proof needed) */\n buildCancelOrder: (params: CancelOrderParams) => Promise<CancelOrderBuildData>\n /** Reset state */\n reset: () => void\n}\n\n/** Pre-fetched ASP proof from the platform's ASP service */\nexport interface ASPProofParam {\n root: bigint\n pathElements: bigint[]\n pathIndices: number[]\n}\n\nexport interface PlaceOrderParams {\n /** Token to sell */\n sellToken: Address\n /** Amount to sell */\n sellAmount: bigint\n /** Token to buy */\n buyToken: Address\n /** Price: buyToken per sellToken (1e18 fixed-point) */\n rate: bigint\n /** Required filler ASP (0n = accept any) */\n requiredFillerAspId?: bigint\n /** Number of blocks until expiry */\n expiryBlocks: bigint\n /** ASP ID */\n aspId: bigint\n /** Pre-fetched ASP proof from the service. If omitted, falls back to local computation. */\n aspProof?: ASPProofParam\n /** Explicit note to spend (skips note selection). Used after auto-split. */\n noteOverride?: ShieldedNote\n}\n\nexport interface FillOrderParams {\n /** Order to fill */\n orderId: Hex\n /** How much sellToken to take */\n takeAmount: bigint\n /** The order's rate */\n rate: bigint\n /** The order's sellToken (filler receives this) */\n sellToken: Address\n /** The order's buyToken (filler pays this) */\n buyToken: Address\n /** ASP ID */\n aspId: bigint\n /** Pre-fetched ASP proof from the service. If omitted, falls back to local computation. */\n aspProof?: ASPProofParam\n /** Explicit note to spend (skips note selection). Used after auto-split. */\n noteOverride?: ShieldedNote\n}\n\nexport interface ClaimOrderParams {\n /** Order to claim */\n orderId: Hex\n /** Cancel secret used when placing the order */\n cancelSecret: Hex\n /** On-chain remaining sell amount */\n remainingSellAmount: bigint\n /** On-chain accumulated buy amount */\n accumulatedBuyAmount: bigint\n /** The order's sell token */\n sellToken: Address\n /** The order's buy token */\n buyToken: Address\n}\n\nexport interface CancelOrderParams {\n /** Order to cancel */\n orderId: Hex\n /** Cancel secret used when placing the order */\n cancelSecret: Hex\n /** The full sell amount (refunded on cancel) */\n sellAmount: bigint\n /** The order's sell token */\n sellToken: Address\n}\n\n// ============================================================================\n// Hook: useSwapOrderBook — Browse and filter the order book\n// ============================================================================\n\n/**\n * Hook for browsing the swap order book.\n * Scans SwapOrderPlaced events and filters by token pair and ASP.\n */\n/** Minimal ABI fragment for reading swapOrders mapping */\nconst SWAP_ORDERS_ABI = [{\n type: 'function' as const,\n name: 'swapOrders' as const,\n inputs: [{ name: '', type: 'bytes32' as const }],\n outputs: [\n { name: 'sellToken', type: 'address' as const },\n { name: 'sellAmount', type: 'uint256' as const },\n { name: 'remainingSellAmount', type: 'uint256' as const },\n { name: 'buyToken', type: 'address' as const },\n { name: 'rate', type: 'uint256' as const },\n { name: 'accumulatedBuyAmount', type: 'uint256' as const },\n { name: 'makerAspId', type: 'uint256' as const },\n { name: 'requiredFillerAspId', type: 'uint256' as const },\n { name: 'cancelKeyHash', type: 'bytes32' as const },\n { name: 'expiry', type: 'uint256' as const },\n { name: 'claimed', type: 'bool' as const },\n { name: 'cancelled', type: 'bool' as const },\n ],\n stateMutability: 'view' as const,\n}] as const\n\nexport function useSwapOrderBook(config: SwapOrderBookConfig): UseSwapOrderBookReturn {\n const [orders, setOrders] = useState<SwapOrderEvent[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n const refresh = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const logs = await config.publicClient.getLogs({\n address: config.poolAddress,\n event: SWAP_ORDER_PLACED_EVENT,\n fromBlock: config.fromBlock ?? 0n,\n toBlock: 'latest',\n })\n\n let parsedOrders: SwapOrderEvent[] = logs.map(log => ({\n orderId: log.args.orderId!,\n sellToken: log.args.sellToken!,\n buyToken: log.args.buyToken!,\n sellAmount: log.args.sellAmount!,\n rate: log.args.rate!,\n makerAspId: log.args.makerAspId!,\n requiredFillerAspId: log.args.requiredFillerAspId!,\n expiry: log.args.expiry!,\n blockNumber: log.blockNumber ?? 0n,\n }))\n\n if (config.sellToken && config.buyToken) {\n parsedOrders = filterOrdersByTokenPair(parsedOrders, config.sellToken, config.buyToken)\n }\n if (config.acceptableAspIds && config.acceptableAspIds.length > 0) {\n parsedOrders = filterOrdersByASP(parsedOrders, config.acceptableAspIds)\n }\n\n // Fetch on-chain state for each order to enrich with remaining amounts\n const enriched: SwapOrderEvent[] = []\n for (const order of parsedOrders) {\n try {\n const result = await config.publicClient.readContract({\n address: config.poolAddress,\n abi: SWAP_ORDERS_ABI,\n functionName: 'swapOrders',\n args: [order.orderId],\n })\n const claimed = result[10] as boolean\n const cancelled = result[11] as boolean\n const remainingSellAmount = result[2] as bigint\n\n enriched.push({\n ...order,\n remainingSellAmount,\n claimed,\n cancelled,\n })\n } catch {\n // If state read fails, include order without state (fallback)\n enriched.push(order)\n }\n }\n\n setOrders(enriched)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch order book')\n } finally {\n setIsLoading(false)\n }\n }, [config.publicClient, config.poolAddress, config.sellToken, config.buyToken, config.acceptableAspIds, config.fromBlock])\n\n useEffect(() => {\n refresh()\n const interval = config.pollInterval ?? 15000\n intervalRef.current = setInterval(refresh, interval)\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current)\n }\n }, [refresh, config.pollInterval])\n\n return { orders, isLoading, error, refresh }\n}\n\n// ============================================================================\n// Hook: useSwap — Place, fill, claim, cancel orders\n// ============================================================================\n\n/**\n * Hook for swap operations with real proof generation.\n * Mirrors useWithdraw — returns build functions that produce contract call data.\n */\nexport function useSwap(config: SwapConfig): UseSwapReturn {\n const {\n isSetup,\n masterKeys,\n unspentNotes,\n createNoteForSelf,\n ethAddress,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n const buildPlaceOrder = useCallback(\n async (params: PlaceOrderParams): Promise<PlaceOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n sellToken,\n sellAmount,\n buyToken,\n rate,\n requiredFillerAspId = 0n,\n expiryBlocks,\n aspId,\n noteOverride,\n } = params\n const cfg = configRef.current\n\n // 1. Select note to spend\n setStage('selecting_notes')\n let selectedNote: ShieldedNote\n\n if (noteOverride) {\n selectedNote = noteOverride\n } else {\n const sortedNotes = [...unspentNotes]\n .filter(n => n.token?.toLowerCase() === sellToken.toLowerCase() && n.proofSystem !== 'stark')\n .sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const exactNote = sortedNotes.find(n => n.amount === sellAmount)\n if (!exactNote) {\n const largerNote = sortedNotes.find(n => n.amount > sellAmount)\n if (largerNote) {\n throw new Error(`SPLIT_REQUIRED:${largerNote.commitment}`)\n }\n throw new Error(\n `Insufficient ${sellToken} balance for swap. ` +\n `Need ${sellAmount}, have ${sortedNotes.reduce((s, n) => s + n.amount, 0n)}`\n )\n }\n selectedNote = exactNote\n }\n\n // 2. Load modules dynamically\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof } = aspModule\n\n // 3. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 4. Convert note for proof\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 5. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n const actualLeafIndex = merkleProof.leafIndex\n\n // 6. Verify commitment formula, compute nullifier and ASP proof\n setStage('generating_proof')\n const inputPubkey = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitment = await sdk.poseidon([\n selectedNote.amount, inputPubkey.x, inputPubkey.y,\n selectedNote.blinding, origin, token,\n ])\n const storedCommitment = BigInt(selectedNote.commitment)\n if (localCommitment !== storedCommitment) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitment,\n ])\n\n // Use pre-fetched ASP proof from service, or fall back to local computation\n const aspProofData = params.aspProof\n ? { aspId, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(aspId, origin, cfg.aspApprovedOrigins)\n\n // 7. Build withdraw circuit inputs\n // Swap uses withdraw verifier with dummy recipient = poolAddress, isRagequit = false\n const circuitInputs = {\n stateRoot: stateRootBI.toString(),\n aspRoot: aspProofData.aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(cfg.poolAddress).toString(),\n token: token.toString(),\n isRagequit: '0',\n\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n aspPathElements: padToDepth(aspProofData.aspPathElements.map(String), '0', ASP_TREE_DEPTH),\n aspPathIndices: padToDepth(aspProofData.aspPathIndices.map(String), '0', ASP_TREE_DEPTH),\n }\n\n // 8. Generate proof\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // 9. Generate cancel secret\n const cancelSecret = generateCancelSecret()\n const cancelKeyHash = computeCancelKeyHash(cancelSecret)\n\n // 10. Compute expiry block\n const currentBlock = await cfg.publicClient.getBlockNumber()\n const expiry = currentBlock + expiryBlocks\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot: stateRootBI,\n aspRoot: aspProofData.aspRoot,\n aspId,\n sellToken,\n sellAmount,\n buyToken,\n rate,\n cancelKeyHash,\n cancelSecret,\n requiredFillerAspId,\n expiry,\n spentNote: selectedNote,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes]\n )\n\n const buildFillOrder = useCallback(\n async (params: FillOrderParams): Promise<FillOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n orderId,\n takeAmount,\n rate,\n sellToken,\n buyToken,\n aspId,\n noteOverride,\n } = params\n const cfg = configRef.current\n\n // 1. Compute give amount (what filler pays in buyToken)\n const giveAmount = computeGiveAmount(takeAmount, rate)\n\n // 2. Select note to spend (filler pays in buyToken)\n setStage('selecting_notes')\n let selectedNote: ShieldedNote\n\n if (noteOverride) {\n selectedNote = noteOverride\n } else {\n const sortedNotes = [...unspentNotes]\n .filter(n => n.token?.toLowerCase() === buyToken.toLowerCase() && n.proofSystem !== 'stark')\n .sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const exactNote = sortedNotes.find(n => n.amount === giveAmount)\n if (!exactNote) {\n const largerNote = sortedNotes.find(n => n.amount > giveAmount)\n if (largerNote) {\n throw new Error(`SPLIT_REQUIRED:${largerNote.commitment}`)\n }\n throw new Error(\n `Insufficient ${buyToken} balance. ` +\n `Need ${giveAmount} to fill order, have ${sortedNotes.reduce((s, n) => s + n.amount, 0n)}`\n )\n }\n selectedNote = exactNote\n }\n\n // 3. Load modules\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof } = aspModule\n\n // 4. Create output note for filler (receives takeAmount of sellToken)\n const fillerOrigin = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n const fillerNoteData = await createNoteForSelf(\n takeAmount,\n fillerOrigin,\n BigInt(sellToken),\n )\n\n // 5. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 6. Convert note for proof\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 7. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n const actualLeafIndex = merkleProof.leafIndex\n\n // 8. Verify commitment formula, compute nullifier and ASP proof\n setStage('generating_proof')\n const inputPubkeyF = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitmentF = await sdk.poseidon([\n selectedNote.amount, inputPubkeyF.x, inputPubkeyF.y,\n selectedNote.blinding, origin, token,\n ])\n const storedCommitmentF = BigInt(selectedNote.commitment)\n if (localCommitmentF !== storedCommitmentF) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitmentF,\n ])\n\n // Use pre-fetched ASP proof from service, or fall back to local computation\n const aspProofData = params.aspProof\n ? { aspId, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(aspId, origin, cfg.aspApprovedOrigins)\n\n // 9. Build withdraw circuit inputs\n const circuitInputs = {\n stateRoot: stateRootBI.toString(),\n aspRoot: aspProofData.aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(cfg.poolAddress).toString(),\n token: token.toString(),\n isRagequit: '0',\n\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n aspPathElements: padToDepth(aspProofData.aspPathElements.map(String), '0', ASP_TREE_DEPTH),\n aspPathIndices: padToDepth(aspProofData.aspPathIndices.map(String), '0', ASP_TREE_DEPTH),\n }\n\n // 10. Generate proof\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // Pack filler note with searchTag + ownerHash + encrypted payload\n // so syncNotes can discover it from SwapOrderFilled events\n const { encodePacked } = await import('viem')\n const packedFillerNote = encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [fillerNoteData.searchTag, fillerNoteData.ownerHash, fillerNoteData.encryptedNote as Hex]\n )\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot: stateRootBI,\n aspRoot: aspProofData.aspRoot,\n aspId,\n orderId,\n takeAmount,\n fillerOutputCommitment: toHex(fillerNoteData.commitment, { size: 32 }),\n fillerEncryptedNote: packedFillerNote,\n spentNote: selectedNote,\n fillerNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes, createNoteForSelf]\n )\n\n const buildClaimOrder = useCallback(\n async (params: ClaimOrderParams): Promise<ClaimOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n orderId,\n cancelSecret,\n remainingSellAmount,\n accumulatedBuyAmount,\n sellToken,\n buyToken,\n } = params\n\n let buyNoteData: NoteCreationResult | null = null\n let refundNoteData: NoteCreationResult | null = null\n\n const originAddr = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n\n if (accumulatedBuyAmount > 0n) {\n buyNoteData = await createNoteForSelf(\n accumulatedBuyAmount,\n originAddr,\n BigInt(buyToken),\n )\n }\n\n if (remainingSellAmount > 0n) {\n refundNoteData = await createNoteForSelf(\n remainingSellAmount,\n originAddr,\n BigInt(sellToken),\n )\n }\n\n const zeroHex = '0x0000000000000000000000000000000000000000000000000000000000000000' as Hex\n\n return {\n orderId,\n cancelSecret,\n buyOutputCommitment: buyNoteData ? toHex(buyNoteData.commitment, { size: 32 }) : zeroHex,\n refundCommitment: refundNoteData ? toHex(refundNoteData.commitment, { size: 32 }) : zeroHex,\n buyEncryptedNote: buyNoteData ? buyNoteData.encryptedNote as Hex : '0x' as Hex,\n refundEncryptedNote: refundNoteData ? refundNoteData.encryptedNote as Hex : '0x' as Hex,\n buyNoteData,\n refundNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n const buildCancelOrder = useCallback(\n async (params: CancelOrderParams): Promise<CancelOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { orderId, cancelSecret, sellAmount, sellToken } = params\n\n const cancelOrigin = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n const refundNoteData = await createNoteForSelf(\n sellAmount,\n cancelOrigin,\n BigInt(sellToken),\n )\n\n return {\n orderId,\n cancelSecret,\n refundCommitment: toHex(refundNoteData.commitment, { size: 32 }),\n refundEncryptedNote: refundNoteData.encryptedNote as Hex,\n refundNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n // ============================================================================\n // buildNoteSplit — Split a note into exact amount + change via self-transfer\n // ============================================================================\n\n const buildNoteSplit = useCallback(\n async (params: SplitNoteParams): Promise<SplitNoteBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { note, targetAmount, aspId: splitAspId } = params\n const cfg = configRef.current\n\n if (targetAmount >= note.amount) {\n throw new Error('Target amount must be less than note amount')\n }\n if (targetAmount <= 0n) {\n throw new Error('Target amount must be positive')\n }\n\n const changeAmount = note.amount - targetAmount\n const origin = BigInt(note.origin)\n const token = BigInt(note.token)\n\n // 1. Create two self-notes: exact amount + change\n setStage('creating_outputs')\n const [exactNoteData, changeNoteData] = await Promise.all([\n createNoteForSelf(targetAmount, origin, token),\n createNoteForSelf(changeAmount, origin, token),\n ])\n\n // 2. Load modules\n const [transferModule, proofModule, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes, buildUPPTransferCircuitInputs } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof, DEMO_ASP_ID } = aspModule\n\n // 3. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 4. Convert note to spendable format\n const spendableNote: SpendableNote = {\n amount: note.amount,\n blinding: note.blinding,\n commitment: note.commitment,\n ownerSecret: note.ownerSecret,\n ownerHash: note.ownerHash,\n leafIndex: note.leafIndex,\n origin,\n token,\n }\n\n // 5. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 6. ASP proof (use pre-fetched from service, or compute locally)\n const aspProof = params.aspProof\n ? { aspId: splitAspId ?? DEMO_ASP_ID, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(splitAspId ?? DEMO_ASP_ID, origin, cfg.aspApprovedOrigins)\n\n // 7. Build circuit inputs\n setStage('generating_proof')\n const exactNoteWithAmount = { ...exactNoteData, amount: targetAmount }\n const changeNoteWithAmount = { ...changeNoteData, amount: changeAmount }\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof!,\n aspProof,\n exactNoteWithAmount,\n changeNoteWithAmount\n )\n\n // 8. Generate proof\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // 9. Pack encrypted notes for contract\n const { encodePacked } = await import('viem')\n const packNote = (n: NoteCreationResult): Hex =>\n encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [n.searchTag, n.ownerHash, n.encryptedNote as Hex]\n )\n\n // 10. Build ShieldedNote objects for local state\n const proofSystem = note.proofSystem ?? 'snark'\n const exactShieldedNote: ShieldedNote = {\n amount: targetAmount,\n blinding: exactNoteData.blinding,\n commitment: toHex(exactNoteData.commitment, { size: 32 }),\n ownerSecret: toHex(exactNoteData.ownerSecret, { size: 32 }),\n ownerHash: toHex(exactNoteData.ownerHash, { size: 32 }),\n leafIndex: 0,\n origin: note.origin,\n token: note.token,\n status: 'confirmed',\n proofSystem,\n timestamp: Date.now(),\n }\n const changeShieldedNote: ShieldedNote = {\n amount: changeAmount,\n blinding: changeNoteData.blinding,\n commitment: toHex(changeNoteData.commitment, { size: 32 }),\n ownerSecret: toHex(changeNoteData.ownerSecret, { size: 32 }),\n ownerHash: toHex(changeNoteData.ownerHash, { size: 32 }),\n leafIndex: 0,\n origin: note.origin,\n token: note.token,\n status: 'confirmed',\n proofSystem,\n timestamp: Date.now(),\n }\n\n return {\n proof: formattedProof,\n nullifier: toHex(BigInt(circuitInputs.nullifier), { size: 32 }),\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n token: note.token as Address,\n outputCommitment1: toHex(exactNoteData.commitment, { size: 32 }),\n outputCommitment2: toHex(changeNoteData.commitment, { size: 32 }),\n encryptedNote1: packNote(exactNoteData),\n encryptedNote2: packNote(changeNoteData),\n exactNote: exactShieldedNote,\n changeNote: changeShieldedNote,\n spentNote: note,\n exactNoteData,\n changeNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n return {\n stage,\n isPending,\n error,\n buildNoteSplit,\n buildPlaceOrder,\n buildFillOrder,\n buildClaimOrder,\n buildCancelOrder,\n reset,\n }\n}\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport {\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n computeFillPercentage,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n RATE_PRECISION,\n}\n\nexport type {\n SwapOrder,\n SwapOrderEvent,\n SwapFillEvent,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/use-upp-account.tsx","../../src/react/utils/avatar.ts","../../src/react/components/UPPAvatar.tsx","../../src/react/components/styles.ts","../../src/react/components/UPPModal.tsx","../../src/react/components/UPPPrivateButton.tsx","../../src/react/use-upp-crypto.ts","../../src/react/use-shield.ts","../../src/react/use-pool-transfer.ts","../../src/react/use-withdraw.ts","../../src/react/use-personal-asp.ts","../../src/react/use-swap.ts"],"names":["createContext","useState","useRef","useEffect","createAutoAdapter","StorableAccountAdapter","ownerHashHex","toHex","NoteStore","useCallback","keccak256","toBytes","useMemo","getAddress","store","sdk","init_stealth","__toCommonJS","stealth_exports","jsx","useContext","jsxs","createPortal","Fragment","sdkPromise","loadSDK","encodePacked","error","packNoteData","generateASPProof","init_poseidon","ASP_TREE_DEPTH","BABYJUBJUB_SUBORDER","getStorageKey","ASP_REGISTRY_HUB_ABI","computeSingleOriginASPRoot","STATE_TREE_DEPTH","padToDepth","SWAP_ORDER_PLACED_EVENT","filterOrdersByTokenPair","filterOrdersByASP","generateCancelSecret","computeCancelKeyHash","computeGiveAmount"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\n/**\n * React hook and provider for UPP Account management (Post-Quantum / Hash-Based)\n *\n * No elliptic curve operations — all ownership proofs are hash-based.\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react'\nimport { toHex, keccak256, toBytes, getAddress, type Hex, type Address } from 'viem'\nimport type { MasterKeys, StarkMasterKeys } from '../keys/types.js'\nimport { NoteStore } from '../core/note-store.js'\nimport { StorableAccountAdapter } from '../core/account.js'\nimport { createAutoAdapter } from '../indexer/storage/index.js'\n\n// ============================================================================\n// EIP-712 Constants for wallet signing\n// ============================================================================\n\nconst UPP_EIP712_DOMAIN = {\n name: 'UPP Stealth Account',\n version: '2',\n}\n\nconst UPP_EIP712_TYPES: Record<string, Array<{ name: string; type: string }>> = {\n Connect: [\n { name: 'info', type: 'string' },\n { name: 'warning', type: 'string' },\n { name: 'passwordHash', type: 'bytes32' },\n ],\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Which proof system created/guards a note */\nexport type ProofSystemType = 'snark' | 'stark'\n\n/**\n * A shielded note (UTXO) - Post-quantum hash-based\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n */\nexport interface ShieldedNote {\n /** Amount of tokens */\n amount: bigint\n /** Random blinding factor */\n blinding: bigint\n /** Commitment hash (hex) */\n commitment: string\n /** Spending secret for this note (hex) - proves ownership via hash preimage */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - what's committed on-chain (hex) */\n ownerHash: string\n /** Position in Merkle tree */\n leafIndex: number\n /** Origin address (original depositor) as hex */\n origin: string\n /** Token address as hex */\n token: string\n /** Transaction hash */\n txHash?: string\n /** Note status */\n status: 'pending' | 'confirmed' | 'spent'\n /** Timestamp */\n timestamp: number\n /** Which proof system created this note (defaults to 'snark' for legacy notes) */\n proofSystem?: ProofSystemType\n}\n\n/**\n * Serialized account for storage (post-quantum)\n */\nexport interface SerializedAccount {\n /** Version 3 = dual SNARK+STARK (older versions are auto-cleared on load) */\n version: 3\n spendingSecret: string\n ownerHash: string\n viewingSecret: string\n viewingHash: string\n /** STARK keys */\n starkSecret: string[]\n starkOwnerHash: string[]\n starkViewingSecret: string[]\n starkViewingHash: string[]\n}\n\n/**\n * Note creation result (BLS12-381, hash-based ownership)\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(ownerSecret)\n */\nexport interface NoteCreationResult {\n commitment: bigint\n /** The spending secret whose hash proves ownership */\n ownerSecret: bigint\n /** Poseidon(ownerSecret) — committed in the note, used for ownership proof */\n ownerHash: bigint\n blinding: bigint\n encryptedNote: string\n searchTag: bigint\n amount: bigint\n origin: bigint\n token: bigint\n}\n\n/**\n * Indexer configuration for advanced usage\n */\nexport interface IndexerConfig {\n /** Enable IndexedDB storage (default: true if available) */\n useIndexedDB?: boolean\n /** Custom storage prefix for multi-account support */\n storagePrefix?: string\n /** Batch size for RPC scanning (default: 200, adapts on rate limits) */\n batchSize?: number\n /** Sync interval for live sync in ms (default: 30000) */\n liveSyncIntervalMs?: number\n /** Starting block for new accounts (skips blocks before account creation) */\n fromBlock?: number\n /** Pool contract address (required for indexer) */\n contractAddress?: Address\n}\n\n/**\n * Context type for UPP Account\n */\nexport interface UPPAccountContextType {\n /** SNARK master keys (null if not setup) */\n masterKeys: MasterKeys | null\n /** STARK master keys (null if not setup) */\n starkMasterKeys: StarkMasterKeys | null\n /** Connected wallet address */\n ethAddress: string | null\n /** Owner hash (public identifier, hex) — SNARK */\n ownerHash: string | null\n /** Stealth address (bech32m encoded, 0zk prefix) — SNARK */\n stealthAddress: string | null\n /** STARK stealth address (bech32m encoded, 0zs prefix) */\n starkStealthAddress: string | null\n /** All notes */\n notes: ShieldedNote[]\n /** Unspent notes */\n unspentNotes: ShieldedNote[]\n /** Total balance of unspent notes */\n balance: bigint\n /** Whether account is set up */\n isSetup: boolean\n /** Whether SDK is loading/initializing */\n isLoading: boolean\n /** Whether crypto is ready */\n cryptoReady: boolean\n /** Whether sync is in progress */\n isSyncing: boolean\n /** Last synced block number */\n lastSyncedBlock: number\n /** Set up a new account from wallet signature (low-level) */\n setupAccount: (signature: Hex) => Promise<void>\n /** Connect private account via EIP-712 wallet signature (requires wagmi signTypedData) */\n connect: (password?: string) => Promise<void>\n /** Whether a connect operation is in progress */\n isConnecting: boolean\n /** Clear account and logout */\n logout: () => void\n /** Alias for logout */\n disconnect: () => void\n /** Add a note to the account */\n addNote: (note: ShieldedNote) => void\n /** Mark a note as spent */\n markNoteSpent: (commitment: string) => void\n /** Create note for self (e.g., shield or change output) */\n createNoteForSelf: (amount: bigint, origin: bigint, token: bigint) => Promise<NoteCreationResult>\n /** Get owner hash */\n getOwnerHash: () => bigint | null\n /** Select optimal circuit for a given amount */\n selectOptimalCircuit: (requiredAmount: bigint, tokenAddress?: string) => {\n circuit: '1x2' | '2x2' | null\n selectedNotes: ShieldedNote[]\n error?: string\n }\n /** Sync notes from blockchain (requires client to be passed in) */\n syncNotes: (contractAddress: Address, client: any) => Promise<number>\n /** Start live sync (polls for new notes at interval) */\n startLiveSync: (contractAddress: Address, client: any) => void\n /** Stop live sync */\n stopLiveSync: () => void\n /** Whether live sync is active */\n isLiveSyncing: boolean\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst UPPAccountContext = createContext<UPPAccountContextType | null>(null)\n\n// ============================================================================\n// Lazy SDK loading\n// ============================================================================\n\nlet sdkPromise: Promise<typeof import('../index.js')> | null = null\n\nasync function loadSDK() {\n if (!sdkPromise) {\n sdkPromise = import('../index.js')\n }\n return sdkPromise\n}\n\n// ============================================================================\n// Storage helpers\n// ============================================================================\n\nfunction getStorageKey(ethAddress: string): string {\n return `upp_pq_account_${ethAddress.toLowerCase()}`\n}\n\nfunction getNotesStorageKey(chainId: number, ownerHashPrefix: string): string {\n return `upp_pq_notes_${chainId}_${ownerHashPrefix}`\n}\n\nfunction getChainFingerprintKey(chainId: number): string {\n return `upp_chain_fp_${chainId}`\n}\n\ninterface ChainFingerprint {\n genesisHash: string\n blockNumber: number\n}\n\n/**\n * Check if the chain has been reset (e.g. Anvil restart).\n * Returns true if chain is valid (no reset detected), false if reset detected.\n */\nasync function checkChainFingerprint(\n chainId: number,\n publicClient: any,\n): Promise<boolean> {\n if (typeof window === 'undefined' || !publicClient) return true\n\n const fpKey = getChainFingerprintKey(chainId)\n const stored = localStorage.getItem(fpKey)\n\n try {\n const [currentBlock, genesisBlock] = await Promise.all([\n publicClient.getBlockNumber(),\n publicClient.getBlock({ blockNumber: 0n }),\n ])\n\n const currentGenesisHash = genesisBlock.hash as string\n const currentBlockNum = Number(currentBlock)\n\n if (stored) {\n const fp: ChainFingerprint = JSON.parse(stored)\n if (fp.genesisHash !== currentGenesisHash || currentBlockNum < fp.blockNumber) {\n // Chain was reset — clear fingerprint (notes will be cleared by caller)\n localStorage.removeItem(fpKey)\n return false\n }\n }\n\n // Update fingerprint with current block\n const newFp: ChainFingerprint = {\n genesisHash: currentGenesisHash,\n blockNumber: currentBlockNum,\n }\n localStorage.setItem(fpKey, JSON.stringify(newFp))\n return true\n } catch (e) {\n // Can't validate — assume valid (e.g. RPC not available yet)\n console.warn('[UPPAccount] Chain fingerprint check failed:', e)\n return true\n }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Function signature for EIP-712 typed data signing.\n * Compatible with wagmi's signTypedDataAsync.\n */\nexport type SignTypedDataFn = (args: {\n domain: { name: string; version: string; chainId: number }\n types: Record<string, Array<{ name: string; type: string }>>\n primaryType: string\n message: Record<string, unknown>\n}) => Promise<Hex>\n\ninterface UPPAccountProviderProps {\n children: ReactNode\n /** Ethereum address of connected wallet */\n ethAddress?: string\n /** Chain ID */\n chainId?: number\n /** Indexer configuration */\n indexerConfig?: IndexerConfig\n /** EIP-712 signing function (from wagmi's useSignTypedData().signTypedDataAsync) */\n signTypedData?: SignTypedDataFn\n /** Public client for chain fingerprint validation (e.g. from wagmi usePublicClient) */\n publicClient?: any\n /** Active proof system — filters unspentNotes and balance to only show spendable notes */\n activeProofSystem?: ProofSystemType\n}\n\nexport function UPPAccountProvider({\n children,\n ethAddress,\n chainId = 1,\n indexerConfig,\n signTypedData,\n publicClient: publicClientProp,\n activeProofSystem,\n}: UPPAccountProviderProps) {\n const [masterKeys, setMasterKeys] = useState<MasterKeys | null>(null)\n const [starkMasterKeys, setStarkMasterKeys] = useState<StarkMasterKeys | null>(null)\n const [notes, setNotes] = useState<ShieldedNote[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isConnecting, setIsConnecting] = useState(false)\n const [cryptoReady, setCryptoReady] = useState(false)\n const [isSyncing, setIsSyncing] = useState(false)\n const [lastSyncedBlock, _setLastSyncedBlock] = useState(0)\n const [liveSyncInterval, setLiveSyncInterval] = useState<ReturnType<typeof setInterval> | null>(null)\n const unwatchRef = useRef<(() => void) | null>(null)\n const syncPromiseRef = useRef<Promise<number> | null>(null)\n const noteStoreRef = useRef<NoteStore | null>(null)\n const accountAdapterRef = useRef<StorableAccountAdapter | null>(null)\n\n // Initialize SDK\n useEffect(() => {\n loadSDK().then(() => setCryptoReady(true))\n }, [])\n\n // Load saved account via AccountAdapter and initialize NoteStore\n useEffect(() => {\n let noteStoreUnsub: (() => void) | null = null\n let cancelled = false\n\n if (typeof window === 'undefined') return\n if (!ethAddress || !cryptoReady) {\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n noteStoreRef.current = null\n accountAdapterRef.current = null\n return\n }\n\n // Create account adapter with auto-detected storage\n const accountStorage = createAutoAdapter(`upp_account`)\n const adapter = new StorableAccountAdapter(accountStorage, ethAddress)\n accountAdapterRef.current = adapter\n\n // Also try legacy localStorage migration\n const legacyKey = getStorageKey(ethAddress)\n const legacySaved = typeof window !== 'undefined' ? localStorage.getItem(legacyKey) : null\n\n const init = async () => {\n // Load from adapter first\n let account = await adapter.load()\n\n // Migrate from legacy localStorage if adapter has nothing\n if (!account && legacySaved) {\n try {\n const parsed: SerializedAccount = JSON.parse(legacySaved)\n if (parsed.spendingSecret && parsed.starkSecret) {\n const keys: MasterKeys = {\n spendingSecret: BigInt(parsed.spendingSecret),\n ownerHash: BigInt(parsed.ownerHash),\n viewingSecret: BigInt(parsed.viewingSecret),\n viewingHash: BigInt(parsed.viewingHash),\n }\n const starkKeys: StarkMasterKeys = {\n starkSecret: parsed.starkSecret.map(s => BigInt(s)) as any,\n starkOwnerHash: parsed.starkOwnerHash!.map(s => BigInt(s)) as any,\n starkViewingSecret: parsed.starkViewingSecret!.map(s => BigInt(s)) as any,\n starkViewingHash: parsed.starkViewingHash!.map(s => BigInt(s)) as any,\n }\n await adapter.save(keys, starkKeys)\n account = { keys, starkKeys }\n console.log('[UPPAccount] Migrated account from legacy localStorage')\n }\n } catch { /* ignore corrupt legacy */ }\n }\n\n if (cancelled) return\n\n if (!account) {\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n return\n }\n\n setMasterKeys(account.keys)\n if (account.starkKeys) setStarkMasterKeys(account.starkKeys)\n\n // Initialize NoteStore with auto-detected storage backend\n const ownerHashHex = toHex(account.keys.ownerHash, { size: 32 })\n const storagePrefix = `upp_${chainId}_${ownerHashHex.slice(0, 12)}`\n const noteStorage = createAutoAdapter(storagePrefix)\n const store = new NoteStore(noteStorage, 'notes')\n noteStoreRef.current = store\n\n noteStoreUnsub = store.onChange(() => {\n if (!cancelled) setNotes([...store.getNotes()])\n })\n\n await store.load()\n\n // Migrate legacy notes\n if (store.getNotes().length === 0) {\n const legacyNotesKey = getNotesStorageKey(chainId, ownerHashHex.slice(0, 12))\n const legacyNotes = typeof window !== 'undefined' ? localStorage.getItem(legacyNotesKey) : null\n if (legacyNotes) {\n try {\n const parsed = JSON.parse(legacyNotes)\n const migrated = parsed.map((n: any) => ({\n ...n,\n amount: BigInt(n.amount),\n blinding: BigInt(n.blinding),\n origin: n.origin ?? '0x0000000000000000000000000000000000000000',\n token: n.token ?? '0x0000000000000000000000000000000000000000',\n proofSystem: n.proofSystem ?? 'snark',\n }))\n store.addNotes(migrated)\n await store.persist()\n console.log(`[NoteStore] Migrated ${migrated.length} legacy notes`)\n } catch { /* ignore */ }\n }\n }\n\n if (!cancelled) setNotes([...store.getNotes()])\n\n // Validate chain fingerprint\n if (publicClientProp) {\n const valid = await checkChainFingerprint(chainId, publicClientProp)\n if (!valid && !cancelled) {\n console.log(`[UPPAccount] Chain ${chainId} was reset — clearing stale notes`)\n await store.clear()\n }\n }\n }\n\n init().catch(e => console.error('Failed to load account:', e))\n\n return () => {\n cancelled = true\n if (noteStoreUnsub) noteStoreUnsub()\n }\n }, [ethAddress, cryptoReady, chainId, publicClientProp])\n\n // Persist notes via NoteStore\n const persistNotes = useCallback(\n (_notesToSave?: ShieldedNote[]) => {\n noteStoreRef.current?.persist().catch(console.error)\n },\n []\n )\n\n // Setup account from signature\n const setupAccount = useCallback(\n async (signature: Hex) => {\n if (!ethAddress || !cryptoReady) {\n throw new Error('Not ready to setup account')\n }\n\n setIsLoading(true)\n try {\n const sdk = await loadSDK()\n\n // Derive SNARK keys (Poseidon/BN254)\n const keys = await sdk.deriveKeysFromSignature(signature)\n\n // Derive STARK keys (Keccak/M31) — synchronous, no Poseidon needed\n const starkKeys = sdk.deriveStarkKeysFromSignature(signature)\n\n setMasterKeys(keys)\n setStarkMasterKeys(starkKeys)\n setNotes([])\n\n // Persist via account adapter\n const adapter = accountAdapterRef.current\n if (adapter) {\n await adapter.save(keys, starkKeys)\n }\n } finally {\n setIsLoading(false)\n }\n },\n [ethAddress, cryptoReady]\n )\n\n // Connect via EIP-712 signing (high-level)\n const connect = useCallback(\n async (password?: string) => {\n if (!signTypedData) {\n throw new Error('signTypedData not provided to UPPAccountProvider. Pass signTypedDataAsync from wagmi.')\n }\n if (!ethAddress) {\n throw new Error('Wallet not connected')\n }\n\n setIsConnecting(true)\n try {\n const passwordHash = password\n ? keccak256(toBytes(password))\n : keccak256(toBytes(''))\n\n const signature = await signTypedData({\n domain: { ...UPP_EIP712_DOMAIN, chainId },\n types: UPP_EIP712_TYPES,\n primaryType: 'Connect',\n message: {\n info: 'Setup UPP Private Account (SNARK + STARK)',\n warning: 'This signature derives your private keys. Never share it.',\n passwordHash,\n },\n })\n\n await setupAccount(signature)\n } finally {\n setIsConnecting(false)\n }\n },\n [signTypedData, ethAddress, chainId, setupAccount]\n )\n\n // Logout\n const logout = useCallback(() => {\n // Clear NoteStore\n noteStoreRef.current?.clear().catch(console.error)\n noteStoreRef.current = null\n // Clear account via adapter\n accountAdapterRef.current?.clear().catch(console.error)\n accountAdapterRef.current = null\n // Clear legacy localStorage (migration cleanup)\n if (masterKeys) {\n const ownerHashHex = toHex(masterKeys.ownerHash, { size: 32 })\n const notesKey = getNotesStorageKey(chainId, ownerHashHex.slice(0, 12))\n try { localStorage.removeItem(notesKey) } catch {}\n }\n if (ethAddress) {\n try { localStorage.removeItem(getStorageKey(ethAddress)) } catch {}\n }\n setMasterKeys(null)\n setStarkMasterKeys(null)\n setNotes([])\n }, [masterKeys, ethAddress, chainId])\n\n // Add note via NoteStore (with dedup)\n const addNote = useCallback(\n (note: ShieldedNote) => {\n const store = noteStoreRef.current\n if (store) {\n store.addNote(note)\n store.persist().catch(console.error)\n } else {\n // Fallback if NoteStore not initialized yet\n setNotes((prev) => [...prev, note])\n }\n },\n []\n )\n\n // Mark note as spent via NoteStore\n const markNoteSpent = useCallback(\n (commitment: string) => {\n const store = noteStoreRef.current\n if (store) {\n store.markSpent(commitment)\n store.persist().catch(console.error)\n } else {\n setNotes((prev) =>\n prev.map((n) =>\n n.commitment.toLowerCase() === commitment.toLowerCase()\n ? { ...n, status: 'spent' as const }\n : n\n )\n )\n }\n },\n []\n )\n\n // Create note for self (hash-based, no ECDH)\n const createNoteForSelf = useCallback(\n async (amount: bigint, origin: bigint, token: bigint): Promise<NoteCreationResult> => {\n if (!masterKeys || !cryptoReady) throw new Error('Account not ready')\n\n const sdk = await loadSDK()\n\n return createHashBasedNote(sdk, amount, masterKeys.spendingSecret, masterKeys.ownerHash, masterKeys.viewingSecret, origin, token)\n },\n [masterKeys, cryptoReady]\n )\n\n // Get owner hash\n const getOwnerHash = useCallback((): bigint | null => {\n return masterKeys?.ownerHash ?? null\n }, [masterKeys])\n\n // Computed values — filtered by active proof system\n const unspentNotes = useMemo(() => {\n const unspent = notes.filter((n) => n.status !== 'spent')\n if (!activeProofSystem) return unspent\n return unspent.filter((n) => (n.proofSystem ?? 'snark') === activeProofSystem)\n }, [notes, activeProofSystem])\n\n const balance = useMemo(\n () => unspentNotes.reduce((acc, n) => acc + n.amount, 0n),\n [unspentNotes],\n )\n\n // Select optimal circuit\n const selectOptimalCircuit = useCallback(\n (requiredAmount: bigint, tokenAddress?: string) => {\n let candidates = unspentNotes\n if (tokenAddress) {\n candidates = candidates.filter(\n (n) => n.token?.toLowerCase() === tokenAddress.toLowerCase()\n )\n }\n const sortedNotes = [...candidates].sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const singleNote = sortedNotes.find((n) => n.amount >= requiredAmount)\n if (singleNote) {\n return { circuit: '1x2' as const, selectedNotes: [singleNote] }\n }\n\n for (let i = 0; i < sortedNotes.length; i++) {\n for (let j = i + 1; j < sortedNotes.length; j++) {\n const combined = sortedNotes[i]!.amount + sortedNotes[j]!.amount\n if (combined >= requiredAmount) {\n return { circuit: '2x2' as const, selectedNotes: [sortedNotes[i]!, sortedNotes[j]!] }\n }\n }\n }\n\n const candidateBalance = candidates.reduce((acc, n) => acc + n.amount, 0n)\n if (candidateBalance >= requiredAmount) {\n return {\n circuit: null,\n selectedNotes: [],\n error: 'Requires more than 2 notes. Please consolidate first.',\n }\n }\n\n return { circuit: null, selectedNotes: [], error: 'Insufficient balance' }\n },\n [unspentNotes, balance]\n )\n\n // Sync notes from blockchain — scans Shielded + Transferred events,\n // matches search tags, and decrypts notes using viewing secret\n const syncNotes = useCallback(\n async (contractAddress: Address, client: any): Promise<number> => {\n if (!masterKeys || !cryptoReady) return 0\n\n if (syncPromiseRef.current) {\n return syncPromiseRef.current\n }\n\n const syncPromise = (async () => {\n setIsSyncing(true)\n try {\n const sdk = await loadSDK()\n const viewingSecret = masterKeys.viewingSecret\n const spendingSecret = masterKeys.spendingSecret\n\n // Derive AES key for decryption (same as encryptNoteData)\n const aesKeyHex = keccak256(toHex(viewingSecret, { size: 32 }))\n const aesKeyBytes = hexToBytes(aesKeyHex)\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n aesKeyBytes.buffer.slice(aesKeyBytes.byteOffset, aesKeyBytes.byteOffset + aesKeyBytes.byteLength) as ArrayBuffer,\n { name: 'AES-GCM', length: 256 },\n false,\n ['decrypt']\n )\n\n // Collect existing commitments to avoid duplicates\n // Use NoteStore (immediate) instead of React state (async) to prevent race conditions\n const currentStore = noteStoreRef.current\n const existingCommitments = new Set(\n (currentStore ? currentStore.getNotes() : notes).map(n => n.commitment.toLowerCase())\n )\n\n // Candidate notes: { commitment, leafIndex, packedData }\n interface NoteCandidate {\n commitment: string\n leafIndex: number\n packedData: string\n txHash?: string\n }\n const candidates: NoteCandidate[] = []\n\n console.log('[syncNotes] Scanning contract:', contractAddress, '— existing:', existingCommitments.size, 'notes')\n\n // 1. Scan Shielded events\n try {\n const shieldedLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'Shielded',\n inputs: [\n { name: 'token', type: 'address', indexed: true },\n { name: 'depositor', type: 'address', indexed: true },\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'encryptedNote', type: 'bytes', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of shieldedLogs) {\n const commitment = log.args.commitment as string\n if (existingCommitments.has(commitment.toLowerCase())) continue\n candidates.push({\n commitment,\n leafIndex: Number(log.args.leafIndex),\n packedData: log.args.encryptedNote as string,\n txHash: log.transactionHash,\n })\n }\n } catch (e: any) {\n console.warn('[syncNotes] Failed to scan Shielded events:', e?.message ?? e)\n }\n\n // Build commitment → leafIndex map (used for both transfer scanning and repair)\n const commitmentLeafMap = new Map<string, number>()\n\n // 2. Scan Transferred events (splits, private transfers)\n try {\n const transferredLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'Transferred',\n inputs: [\n { name: 'nullifier', type: 'bytes32', indexed: true },\n { name: 'outputCommitment1', type: 'bytes32', indexed: true },\n { name: 'outputCommitment2', type: 'bytes32', indexed: true },\n { name: 'encryptedNote1', type: 'bytes', indexed: false },\n { name: 'encryptedNote2', type: 'bytes', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n\n // We need leafIndex from CommitmentInserted events in the same tx\n try {\n const ciLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'CommitmentInserted',\n inputs: [\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'timestamp', type: 'uint256', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of ciLogs) {\n commitmentLeafMap.set(\n (log.args.commitment as string).toLowerCase(),\n Number(log.args.leafIndex)\n )\n }\n } catch (e) {\n console.warn('[syncNotes] Failed to scan CommitmentInserted events:', e)\n }\n\n for (const log of transferredLogs) {\n const c1 = log.args.outputCommitment1 as string\n const c2 = log.args.outputCommitment2 as string\n const txHash = log.transactionHash\n\n if (!existingCommitments.has(c1.toLowerCase())) {\n candidates.push({\n commitment: c1,\n leafIndex: commitmentLeafMap.get(c1.toLowerCase()) ?? -1,\n packedData: log.args.encryptedNote1 as string,\n txHash,\n })\n }\n if (!existingCommitments.has(c2.toLowerCase())) {\n candidates.push({\n commitment: c2,\n leafIndex: commitmentLeafMap.get(c2.toLowerCase()) ?? -1,\n packedData: log.args.encryptedNote2 as string,\n txHash,\n })\n }\n }\n } catch (e) {\n console.warn('[syncNotes] Failed to scan Transferred events:', e)\n }\n\n // 3. Try to decrypt each candidate\n let discovered = 0\n let skippedEmpty = 0, skippedOwner = 0\n for (const candidate of candidates) {\n try {\n const packed = candidate.packedData\n if (!packed || packed === '0x' || packed.length < 82) { skippedEmpty++; continue }\n\n // Unpack: searchTag (8 bytes) + ownerHash (32 bytes) + encrypted payload\n const raw = packed.startsWith('0x') ? packed.slice(2) : packed\n // searchTag is first 8 bytes (16 hex), skip it\n // ownerHash is next 64 hex chars (32 bytes)\n const noteOwnerHash = BigInt('0x' + raw.slice(16, 80))\n const encryptedPayload = raw.slice(80) // rest is AES-GCM encrypted\n\n // Quick check: does ownerHash match ours?\n if (noteOwnerHash !== masterKeys.ownerHash) { skippedOwner++; continue }\n\n // Decrypt the AES-GCM payload\n const encBytes = hexToBytes('0x' + encryptedPayload)\n if (encBytes.length < 12) continue // need at least nonce\n\n const nonce = encBytes.slice(0, 12)\n const ciphertext = encBytes.slice(12)\n\n let plaintext: ArrayBuffer\n try {\n plaintext = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: nonce },\n cryptoKey,\n ciphertext\n )\n } catch {\n continue // decryption failed — not our note\n }\n\n // Parse: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n const ptBytes = new Uint8Array(plaintext)\n if (ptBytes.length !== 104) continue\n\n const amount = bytesToBigint(ptBytes.slice(0, 32))\n const blinding = bytesToBigint(ptBytes.slice(32, 64))\n const originRaw = '0x' + Array.from(ptBytes.slice(64, 84)).map(b => b.toString(16).padStart(2, '0')).join('')\n const tokenRaw = '0x' + Array.from(ptBytes.slice(84, 104)).map(b => b.toString(16).padStart(2, '0')).join('')\n const origin = getAddress(originRaw) // checksummed\n const token = getAddress(tokenRaw) // checksummed\n\n // Verify commitment (BLS12-381, hash-based ownership)\n // ownerHash = Poseidon(spendingSecret)\n // commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n const ownerHash = await sdk.poseidon([spendingSecret])\n const expectedCommitment = await sdk.poseidon([\n amount,\n ownerHash,\n blinding,\n BigInt(origin),\n BigInt(token),\n ])\n const expectedHex = toHex(expectedCommitment, { size: 32 })\n\n if (expectedHex.toLowerCase() !== candidate.commitment.toLowerCase()) {\n console.warn('[syncNotes] Commitment mismatch, skipping')\n continue\n }\n\n // Add the note\n const newNote: ShieldedNote = {\n commitment: candidate.commitment,\n amount,\n blinding,\n ownerSecret: toHex(spendingSecret, { size: 32 }),\n ownerHash: toHex(masterKeys.ownerHash, { size: 32 }),\n origin,\n token,\n leafIndex: candidate.leafIndex,\n status: 'confirmed',\n timestamp: Math.floor(Date.now() / 1000),\n txHash: candidate.txHash,\n proofSystem: 'snark',\n }\n\n // Add via NoteStore (handles dedup internally)\n const store = noteStoreRef.current\n if (store) {\n if (store.addNote(newNote)) discovered++\n } else {\n setNotes((prev) => {\n if (prev.some(n => n.commitment.toLowerCase() === newNote.commitment.toLowerCase())) return prev\n return [...prev, newNote]\n })\n discovered++\n }\n\n } catch (e) {\n console.warn('[syncNotes] Failed to process candidate:', e)\n }\n }\n\n if (discovered > 0 || candidates.length > 0) {\n console.log(`[syncNotes] Discovered ${discovered} new notes from ${candidates.length} candidates`)\n }\n\n // 4. Repair existing notes: fix leafIndex and verify spent status\n // Ensure commitmentLeafMap is populated (may already be from step 2)\n if (commitmentLeafMap.size === 0) {\n try {\n const ciLogs = await client.getLogs({\n address: contractAddress,\n event: {\n type: 'event',\n name: 'CommitmentInserted',\n inputs: [\n { name: 'commitment', type: 'bytes32', indexed: true },\n { name: 'leafIndex', type: 'uint256', indexed: false },\n { name: 'timestamp', type: 'uint256', indexed: false },\n ],\n },\n fromBlock: 0n,\n toBlock: 'latest',\n })\n for (const log of ciLogs) {\n commitmentLeafMap.set(\n (log.args.commitment as string).toLowerCase(),\n Number(log.args.leafIndex)\n )\n }\n } catch {}\n }\n\n let repaired = 0\n const store = noteStoreRef.current\n if (store) {\n // Fix leafIndex from on-chain data\n for (const note of store.getNotes()) {\n const correctLeafIndex = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeafIndex !== undefined && note.leafIndex !== correctLeafIndex) {\n store.updateLeafIndex(note.commitment, correctLeafIndex)\n repaired++\n }\n }\n }\n\n // Verify note status against on-chain nullifiers\n // - Unspent notes whose nullifier IS on-chain → mark spent (forward check)\n // - Spent notes whose nullifier is NOT on-chain → unmark spent (reverse check)\n try {\n const currentNotes = store ? store.getNotes() : notes\n const snarkNotes = currentNotes.filter(n => n.proofSystem !== 'stark')\n\n // Forward check: detect notes spent on-chain but not locally marked\n const unspentSnarkNotes = snarkNotes.filter(n => n.status !== 'spent')\n if (unspentSnarkNotes.length > 0) {\n const sdk = await loadSDK()\n for (const note of unspentSnarkNotes) {\n const correctLeaf = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeaf === undefined) continue\n\n const ownerSecret = BigInt(note.ownerSecret)\n const commitment = BigInt(note.commitment)\n const nullifier = await sdk.poseidon([\n ownerSecret % 2736030358979909402780800718157159386076813972158567259200215660948447373041n,\n BigInt(correctLeaf),\n commitment,\n ])\n const nullifierHex = toHex(nullifier, { size: 32 })\n\n const isUsed = await client.readContract({\n address: contractAddress,\n abi: [{\n type: 'function',\n name: 'nullifierUsed',\n inputs: [{ name: '', type: 'bytes32' }],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n }],\n functionName: 'nullifierUsed',\n args: [nullifierHex],\n })\n\n if (isUsed) {\n console.log(`[syncNotes] Marking note ${note.commitment.slice(0, 12)} as spent — nullifier found on-chain`)\n if (store) store.markSpent(note.commitment)\n repaired++\n }\n }\n }\n\n // Reverse check: un-spend notes whose nullifier is NOT on-chain\n const spentSnarkNotes = snarkNotes.filter(n => n.status === 'spent')\n if (spentSnarkNotes.length > 0) {\n const sdk = await loadSDK()\n for (const note of spentSnarkNotes) {\n const correctLeaf = commitmentLeafMap.get(note.commitment.toLowerCase())\n if (correctLeaf === undefined) continue\n\n const ownerSecret = BigInt(note.ownerSecret)\n const commitment = BigInt(note.commitment)\n const nullifier = await sdk.poseidon([\n ownerSecret % 2736030358979909402780800718157159386076813972158567259200215660948447373041n,\n BigInt(correctLeaf),\n commitment,\n ])\n const nullifierHex = toHex(nullifier, { size: 32 })\n\n const isUsed = await client.readContract({\n address: contractAddress,\n abi: [{\n type: 'function',\n name: 'nullifierUsed',\n inputs: [{ name: '', type: 'bytes32' }],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n }],\n functionName: 'nullifierUsed',\n args: [nullifierHex],\n })\n\n if (!isUsed) {\n console.log(`[syncNotes] Un-spending note ${note.commitment.slice(0, 12)} — nullifier not used on-chain`)\n if (store) {\n store.unmarkSpent(note.commitment)\n store.updateLeafIndex(note.commitment, correctLeaf)\n }\n repaired++\n }\n }\n }\n } catch (e) {\n console.warn('[syncNotes] Nullifier verification failed:', e)\n }\n\n if (repaired > 0) {\n console.log(`[syncNotes] Repaired ${repaired} existing notes`)\n }\n\n // Persist all changes\n if (store && (discovered > 0 || repaired > 0)) {\n await store.persist()\n }\n\n return discovered + repaired\n } finally {\n setIsSyncing(false)\n syncPromiseRef.current = null\n }\n })()\n\n syncPromiseRef.current = syncPromise\n return syncPromise\n },\n [masterKeys, cryptoReady, notes, persistNotes]\n )\n\n // Start live sync\n const startLiveSync = useCallback(\n (contractAddress: Address, client: any) => {\n // Clean up any existing sync\n if (liveSyncInterval) clearInterval(liveSyncInterval)\n if (unwatchRef.current) { unwatchRef.current(); unwatchRef.current = null }\n\n // Initial full scan\n syncNotes(contractAddress, client).catch(console.error)\n\n // Real-time: watch for new commitments via WebSocket/polling\n try {\n const unwatch = client.watchContractEvent({\n address: contractAddress,\n eventName: 'CommitmentInserted',\n onLogs: () => {\n // New commitment detected — trigger sync\n // syncNotes handles dedup so re-scanning is safe\n syncNotes(contractAddress, client).catch(console.error)\n },\n })\n unwatchRef.current = unwatch\n } catch (e) {\n console.warn('[liveSync] watchContractEvent not available, using polling only:', e)\n }\n\n // Fallback poll every 60s (in case watchEvent misses something or isn't supported)\n const fallbackMs = indexerConfig?.liveSyncIntervalMs ?? 60000\n const interval = setInterval(() => {\n syncNotes(contractAddress, client).catch(console.error)\n }, fallbackMs)\n\n setLiveSyncInterval(interval)\n },\n [syncNotes, liveSyncInterval, indexerConfig?.liveSyncIntervalMs]\n )\n\n // Stop live sync\n const stopLiveSync = useCallback(() => {\n if (liveSyncInterval) {\n clearInterval(liveSyncInterval)\n setLiveSyncInterval(null)\n }\n if (unwatchRef.current) {\n unwatchRef.current()\n unwatchRef.current = null\n }\n }, [liveSyncInterval])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (liveSyncInterval) clearInterval(liveSyncInterval)\n if (unwatchRef.current) { unwatchRef.current(); unwatchRef.current = null }\n }\n }, [liveSyncInterval])\n\n // Auto-start liveSync when account + pool contract are available\n useEffect(() => {\n const contractAddr = indexerConfig?.contractAddress\n if (!masterKeys || !publicClientProp || !contractAddr) return\n startLiveSync(contractAddr, publicClientProp)\n return () => stopLiveSync()\n }, [masterKeys, publicClientProp, indexerConfig?.contractAddress])\n\n const ownerHashHex = masterKeys ? toHex(masterKeys.ownerHash, { size: 32 }) : null\n\n // Compute SNARK stealth address for display\n const stealthAddress = useMemo(() => {\n if (!masterKeys) return null\n try {\n const { encodeStealthAddress } = require('../core/stealth.js')\n return encodeStealthAddress(masterKeys.ownerHash, masterKeys.viewingHash) as string\n } catch {\n return null\n }\n }, [masterKeys])\n\n // Compute STARK stealth address for display\n const starkStealthAddress = useMemo(() => {\n if (!starkMasterKeys) return null\n try {\n const { encodeStarkStealthAddress } = require('../core/stealth.js')\n return encodeStarkStealthAddress(starkMasterKeys.starkOwnerHash, starkMasterKeys.starkViewingHash) as string\n } catch {\n return null\n }\n }, [starkMasterKeys])\n\n return (\n <UPPAccountContext.Provider\n value={{\n masterKeys,\n starkMasterKeys,\n ethAddress: ethAddress ?? null,\n ownerHash: ownerHashHex,\n stealthAddress,\n starkStealthAddress,\n notes,\n unspentNotes,\n balance,\n isSetup: !!masterKeys,\n isLoading,\n isConnecting,\n cryptoReady,\n isSyncing,\n lastSyncedBlock,\n setupAccount,\n connect,\n logout,\n disconnect: logout,\n addNote,\n markNoteSpent,\n createNoteForSelf,\n getOwnerHash,\n selectOptimalCircuit,\n syncNotes,\n startLiveSync,\n stopLiveSync,\n isLiveSyncing: liveSyncInterval !== null,\n }}\n >\n {children}\n </UPPAccountContext.Provider>\n )\n}\n\n/**\n * Hook to access UPP Account context\n */\nexport function useUPPAccount(): UPPAccountContextType {\n const context = useContext(UPPAccountContext)\n if (!context) {\n throw new Error('useUPPAccount must be used within a UPPAccountProvider')\n }\n return context\n}\n\n// ============================================================================\n// Helper functions\n// ============================================================================\n\n/**\n * Create a note for self-shielding (BLS12-381, hash-based ownership)\n *\n * Commitment = Poseidon(amount, ownerHash, blinding, origin, token)\n * where ownerHash = Poseidon(spendingSecret)\n *\n * This matches the circuit's NoteCommitment template (5 inputs).\n * No BabyJubJub curve operations — pure hash-based ownership.\n */\nasync function createHashBasedNote(\n sdk: typeof import('../index.js'),\n amount: bigint,\n spendingSecret: bigint,\n ownerHash: bigint,\n viewingSecret: bigint,\n origin: bigint,\n token: bigint,\n): Promise<NoteCreationResult> {\n // Generate blinding factor\n const blinding = await sdk.randomFieldElement()\n\n // Compute commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n // 5 inputs — matches circuit's NoteCommitment template (BLS12-381)\n const commitment = await sdk.poseidon([\n amount,\n ownerHash,\n blinding,\n origin,\n token,\n ])\n\n // Compute search tag from viewing secret (deterministic, for indexing)\n const searchTagHash = await sdk.poseidon([viewingSecret, commitment])\n const searchTag = searchTagHash & ((1n << 64n) - 1n)\n\n // Encrypt note data using viewing secret (symmetric, no ECDH)\n const encryptedNote = await encryptNoteData(amount, blinding, origin, token, viewingSecret)\n\n return {\n commitment,\n ownerSecret: spendingSecret,\n ownerHash,\n blinding,\n encryptedNote,\n searchTag,\n amount,\n origin,\n token,\n }\n}\n\n/**\n * Encrypt note data using viewing secret (symmetric key derivation)\n *\n * Encrypted payload: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n */\nasync function encryptNoteData(\n amount: bigint,\n blinding: bigint,\n origin: bigint,\n token: bigint,\n viewingSecret: bigint,\n): Promise<string> {\n // Derive AES key from viewing secret\n const keyMaterial = keccak256(toHex(viewingSecret, { size: 32 }))\n const keyBytes = hexToBytes(keyMaterial)\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyBytes.buffer.slice(keyBytes.byteOffset, keyBytes.byteOffset + keyBytes.byteLength) as ArrayBuffer,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt']\n )\n\n // Payload: amount (32) + blinding (32) + origin (20) + token (20) = 104 bytes\n const plaintext = new Uint8Array(104)\n plaintext.set(bigintToBytes(amount, 32), 0)\n plaintext.set(bigintToBytes(blinding, 32), 32)\n plaintext.set(bigintToBytes(origin, 20), 64)\n plaintext.set(bigintToBytes(token, 20), 84)\n\n const nonce = crypto.getRandomValues(new Uint8Array(12))\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: nonce },\n cryptoKey,\n plaintext\n )\n\n const result = new Uint8Array(12 + ciphertext.byteLength)\n result.set(nonce, 0)\n result.set(new Uint8Array(ciphertext), 12)\n\n return toHex(result)\n}\n\n// ============================================================================\n// Utility functions\n// ============================================================================\n\nfunction hexToBytes(hex: string): Uint8Array {\n const h = hex.startsWith('0x') ? hex.slice(2) : hex\n const bytes = new Uint8Array(h.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(h.substr(i * 2, 2), 16)\n }\n return bytes\n}\n\nfunction bigintToBytes(n: bigint, length: number): Uint8Array {\n const bytes = new Uint8Array(length)\n let temp = n\n for (let i = length - 1; i >= 0; i--) {\n bytes[i] = Number(temp & 0xffn)\n temp >>= 8n\n }\n return bytes\n}\n\nfunction bytesToBigint(bytes: Uint8Array): bigint {\n let result = 0n\n for (const b of bytes) {\n result = (result << 8n) | BigInt(b)\n }\n return result\n}\n","/**\n * Deterministic geometric avatar generation from an address string.\n * Uses a simple hash to derive colors and shape parameters.\n *\n * No external dependencies — uses a basic string hash for portability\n * (keccak256 from viem is async/heavy, not needed for visual identity).\n */\n\nexport interface AvatarShape {\n type: \"circle\" | \"rect\" | \"triangle\"\n x: number\n y: number\n size: number\n color: string\n opacity: number\n rotation: number\n}\n\nexport interface AvatarData {\n background: string\n shapes: AvatarShape[]\n}\n\n/**\n * Simple deterministic hash — produces 32 bytes of pseudo-random data\n * from a string input. Not cryptographic, just for visual identity.\n */\nfunction hashBytes(input: string): number[] {\n const bytes: number[] = new Array(32).fill(0)\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i)\n bytes[i % 32] = (bytes[i % 32]! * 31 + c) & 0xff\n }\n // Mix rounds for better distribution\n for (let round = 0; round < 3; round++) {\n for (let i = 0; i < 32; i++) {\n bytes[i] = (bytes[i]! + bytes[(i + 7) % 32]! * 17 + round * 53) & 0xff\n }\n }\n return bytes\n}\n\nfunction byteToHex(r: number, g: number, b: number): string {\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`\n}\n\n/**\n * Adjust color to ensure it's not too dark or too light for contrast\n */\nfunction adjustBrightness(r: number, g: number, b: number, minBrightness: number, maxBrightness: number): [number, number, number] {\n const brightness = (r * 299 + g * 587 + b * 114) / 1000\n if (brightness < minBrightness) {\n const factor = minBrightness / Math.max(brightness, 1)\n return [\n Math.min(255, Math.round(r * factor)),\n Math.min(255, Math.round(g * factor)),\n Math.min(255, Math.round(b * factor)),\n ]\n }\n if (brightness > maxBrightness) {\n const factor = maxBrightness / brightness\n return [\n Math.round(r * factor),\n Math.round(g * factor),\n Math.round(b * factor),\n ]\n }\n return [r, g, b]\n}\n\nconst SHAPE_TYPES: AvatarShape[\"type\"][] = [\"circle\", \"rect\", \"triangle\"]\n\n/**\n * Generate avatar data from an address string.\n * Produces a background color and 3-4 geometric shapes.\n */\nexport function generateAvatarData(address: string): AvatarData {\n const bytes = hashBytes(address)\n\n // Background: muted, darker color\n const [bgR, bgG, bgB] = adjustBrightness(bytes[0]!, bytes[1]!, bytes[2]!, 30, 80)\n const background = byteToHex(bgR, bgG, bgB)\n\n // Number of shapes: 3-4\n const shapeCount = 3 + (bytes[3]! % 2)\n const shapes: AvatarShape[] = []\n\n for (let i = 0; i < shapeCount; i++) {\n const offset = 4 + i * 6\n const [sr, sg, sb] = adjustBrightness(\n bytes[offset % 32]!,\n bytes[(offset + 1) % 32]!,\n bytes[(offset + 2) % 32]!,\n 100,\n 240,\n )\n\n shapes.push({\n type: SHAPE_TYPES[bytes[(offset + 3) % 32]! % 3]!,\n x: 10 + (bytes[(offset + 4) % 32]! % 80),\n y: 10 + (bytes[(offset + 5) % 32]! % 80),\n size: 20 + (bytes[(offset + 3) % 32]! % 40),\n color: byteToHex(sr, sg, sb),\n opacity: 0.5 + (bytes[(offset + 2) % 32]! % 50) / 100,\n rotation: (bytes[(offset + 1) % 32]! * 360) / 256,\n })\n }\n\n return { background, shapes }\n}\n\n/**\n * Render avatar data to an SVG string (for non-React contexts).\n */\nexport function renderAvatarSVG(data: AvatarData, size: number = 32): string {\n const shapes = data.shapes\n .map((s) => {\n const transform = `transform=\"rotate(${s.rotation} ${s.x} ${s.y})\"`\n const style = `fill=\"${s.color}\" opacity=\"${s.opacity}\"`\n switch (s.type) {\n case \"circle\":\n return `<circle cx=\"${s.x}\" cy=\"${s.y}\" r=\"${s.size / 2}\" ${style} />`\n case \"rect\":\n return `<rect x=\"${s.x - s.size / 2}\" y=\"${s.y - s.size / 2}\" width=\"${s.size}\" height=\"${s.size * 0.7}\" rx=\"4\" ${style} ${transform} />`\n case \"triangle\": {\n const h = s.size * 0.866\n const points = `${s.x},${s.y - h / 2} ${s.x - s.size / 2},${s.y + h / 2} ${s.x + s.size / 2},${s.y + h / 2}`\n return `<polygon points=\"${points}\" ${style} ${transform} />`\n }\n }\n })\n .join(\"\\n \")\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" width=\"${size}\" height=\"${size}\">\n <rect width=\"100\" height=\"100\" rx=\"20\" fill=\"${data.background}\" />\n ${shapes}\n</svg>`\n}\n","\"use client\"\n\nimport { useMemo, type CSSProperties } from \"react\"\nimport { generateAvatarData, type AvatarShape } from \"../utils/avatar\"\n\nexport interface UPPAvatarProps {\n address: string\n size?: number\n className?: string\n style?: CSSProperties\n}\n\nfunction ShapeSVG({ shape }: { shape: AvatarShape }) {\n const transform = `rotate(${shape.rotation} ${shape.x} ${shape.y})`\n const fill = shape.color\n const opacity = shape.opacity\n\n switch (shape.type) {\n case \"circle\":\n return <circle cx={shape.x} cy={shape.y} r={shape.size / 2} fill={fill} opacity={opacity} />\n case \"rect\":\n return (\n <rect\n x={shape.x - shape.size / 2}\n y={shape.y - shape.size / 2}\n width={shape.size}\n height={shape.size * 0.7}\n rx={4}\n fill={fill}\n opacity={opacity}\n transform={transform}\n />\n )\n case \"triangle\": {\n const h = shape.size * 0.866\n const points = `${shape.x},${shape.y - h / 2} ${shape.x - shape.size / 2},${shape.y + h / 2} ${shape.x + shape.size / 2},${shape.y + h / 2}`\n return <polygon points={points} fill={fill} opacity={opacity} transform={transform} />\n }\n }\n}\n\nexport function UPPAvatar({ address, size = 32, className, style }: UPPAvatarProps) {\n const data = useMemo(() => generateAvatarData(address), [address])\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n width={size}\n height={size}\n className={className}\n style={style}\n >\n <rect width=\"100\" height=\"100\" rx=\"20\" fill={data.background} />\n {data.shapes.map((shape, i) => (\n <ShapeSVG key={i} shape={shape} />\n ))}\n </svg>\n )\n}\n","import type { CSSProperties } from 'react'\n\n// ============================================================================\n// Color Tokens (with CSS variable fallbacks for theming)\n// ============================================================================\n\nexport const colors = {\n backdrop: 'rgba(0, 0, 0, 0.5)',\n modalBg: 'var(--upp-modal-bg, rgba(0, 0, 0, 0.85))',\n border: 'var(--upp-border, rgba(255, 255, 255, 0.1))',\n borderSubtle: 'var(--upp-border-subtle, rgba(255, 255, 255, 0.05))',\n textPrimary: 'var(--upp-text-primary, #ffffff)',\n textSecondary: 'var(--upp-text-secondary, rgba(255, 255, 255, 0.6))',\n textTertiary: 'var(--upp-text-tertiary, rgba(255, 255, 255, 0.4))',\n textMuted: 'var(--upp-text-muted, rgba(255, 255, 255, 0.25))',\n textDim: 'var(--upp-text-dim, rgba(255, 255, 255, 0.2))',\n hoverBg: 'var(--upp-hover-bg, rgba(255, 255, 255, 0.05))',\n pillBg: 'var(--upp-pill-bg, rgba(255, 255, 255, 0.05))',\n pillBorder: 'var(--upp-pill-border, rgba(255, 255, 255, 0.1))',\n pillBorderDashed: 'var(--upp-pill-border-dashed, rgba(255, 255, 255, 0.15))',\n emerald: '#10b981',\n emeraldText: 'rgba(110, 231, 183, 0.6)',\n emeraldTextHover: 'rgba(110, 231, 183, 0.8)',\n emeraldBg: 'rgba(16, 185, 129, 0.1)',\n emeraldBorder: 'rgba(16, 185, 129, 0.2)',\n emeraldBorderHover: 'rgba(16, 185, 129, 0.3)',\n indigo: '#6366f1',\n indigoBg: 'rgba(99, 102, 241, 0.15)',\n indigoBorder: 'rgba(99, 102, 241, 0.3)',\n indigoRing: 'rgba(99, 102, 241, 0.5)',\n indigoHoverBg: 'rgba(99, 102, 241, 0.15)',\n indigoHoverBorder: 'rgba(99, 102, 241, 0.3)',\n red: '#ef4444',\n redBg: 'rgba(239, 68, 68, 0.2)',\n redBorder: 'rgba(239, 68, 68, 0.3)',\n redText: '#fca5a5',\n inputBg: 'var(--upp-input-bg, rgba(0, 0, 0, 0.3))',\n} as const\n\n// ============================================================================\n// Layout Styles\n// ============================================================================\n\nexport const backdrop: CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: colors.backdrop,\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n}\n\nexport const modalContainer: CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n margin: '0 1rem',\n background: colors.modalBg,\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: `1px solid ${colors.border}`,\n borderRadius: '1rem',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5)',\n}\n\n// ============================================================================\n// Button Styles\n// ============================================================================\n\nexport const pillBase: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n height: '40px',\n padding: '0 14px',\n borderRadius: '12px',\n border: `1px solid ${colors.pillBorder}`,\n background: colors.pillBg,\n cursor: 'pointer',\n transition: 'all 150ms ease',\n outline: 'none',\n boxSizing: 'border-box',\n}\n\nexport const pillDisconnected: CSSProperties = {\n ...pillBase,\n border: `1px dashed ${colors.pillBorderDashed}`,\n}\n\nexport const pillConnected: CSSProperties = {\n ...pillBase,\n background: colors.emeraldBg,\n border: `1px solid ${colors.emeraldBorder}`,\n}\n\nexport const primaryButton: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.indigo,\n color: colors.textPrimary,\n borderRadius: '0.75rem',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n cursor: 'pointer',\n transition: 'all 150ms ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n}\n\nexport const secondaryButton: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.hoverBg,\n color: colors.textSecondary,\n borderRadius: '0.75rem',\n fontSize: '14px',\n fontWeight: 500,\n border: `1px solid ${colors.border}`,\n cursor: 'pointer',\n transition: 'all 150ms ease',\n}\n\n// ============================================================================\n// Input Styles\n// ============================================================================\n\nexport const textInput: CSSProperties = {\n width: '100%',\n height: '40px',\n background: colors.inputBg,\n border: `1px solid ${colors.border}`,\n borderRadius: '0.75rem',\n padding: '0 12px',\n fontSize: '14px',\n color: colors.textPrimary,\n fontFamily: 'monospace',\n outline: 'none',\n transition: 'all 150ms ease',\n boxSizing: 'border-box',\n}\n\n// ============================================================================\n// Keyframe Injection\n// ============================================================================\n\nexport const UPP_KEYFRAMES = `\n@keyframes upp-spin {\n to { transform: rotate(360deg); }\n}\n@keyframes upp-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes upp-zoom-in {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n`\n","\"use client\"\n\nimport { useState, useEffect, useCallback, useRef, type CSSProperties } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useUPPAccount } from \"../use-upp-account.js\"\nimport {\n backdrop,\n modalContainer,\n primaryButton,\n secondaryButton,\n textInput,\n colors,\n UPP_KEYFRAMES,\n} from \"./styles.js\"\n\nexport interface UPPModalProps {\n isOpen: boolean\n onClose: () => void\n /** Optional slot for app-level settings (e.g. proof system toggle) */\n settingsSlot?: React.ReactNode\n}\n\nexport function UPPModal({ isOpen, onClose, settingsSlot }: UPPModalProps) {\n const { isSetup, connect, disconnect, isConnecting } = useUPPAccount()\n const [password, setPassword] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const backdropRef = useRef<HTMLDivElement>(null)\n\n // Hover states for interactive elements\n const [closeHover, setCloseHover] = useState(false)\n const [primaryHover, setPrimaryHover] = useState(false)\n const [disconnectHover, setDisconnectHover] = useState(false)\n const [inputFocused, setInputFocused] = useState(false)\n\n // Reset state when opening\n useEffect(() => {\n if (isOpen) {\n setPassword(\"\")\n setError(null)\n }\n }, [isOpen])\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose()\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [isOpen, onClose])\n\n const handleActivate = useCallback(async () => {\n setError(null)\n try {\n await connect(password || undefined)\n onClose()\n } catch (e: any) {\n if (e?.message?.includes(\"User rejected\")) {\n setError(\"Signature rejected\")\n } else {\n setError(e?.message || \"Setup failed\")\n }\n }\n }, [connect, password, onClose])\n\n const handleDisconnect = useCallback(() => {\n disconnect()\n onClose()\n }, [disconnect, onClose])\n\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) onClose()\n },\n [onClose]\n )\n\n if (!isOpen) return null\n if (typeof document === 'undefined') return null\n\n // Close button style\n const closeButtonStyle: CSSProperties = {\n padding: '6px',\n color: closeHover ? 'rgba(255,255,255,0.6)' : 'rgba(255,255,255,0.3)',\n background: closeHover ? 'rgba(255,255,255,0.05)' : 'transparent',\n border: 'none',\n borderRadius: '8px',\n cursor: 'pointer',\n transition: 'all 150ms ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }\n\n // Input style with focus ring\n const inputStyle: CSSProperties = {\n ...textInput,\n ...(inputFocused && {\n boxShadow: `0 0 0 1px ${colors.indigoRing}`,\n border: `1px solid ${colors.indigoRing}`,\n }),\n }\n\n // Primary button with hover and disabled\n const activateStyle: CSSProperties = {\n ...primaryButton,\n ...(primaryHover && !isConnecting && {\n background: '#4f46e5',\n }),\n ...(isConnecting && {\n background: 'rgba(99, 102, 241, 0.5)',\n cursor: 'not-allowed',\n }),\n }\n\n // Disconnect button with hover\n const disconnectStyle: CSSProperties = {\n ...secondaryButton,\n ...(disconnectHover && {\n background: colors.redBg,\n color: colors.redText,\n border: `1px solid ${colors.redBorder}`,\n }),\n }\n\n return createPortal(\n <>\n <style>{UPP_KEYFRAMES}</style>\n <div\n ref={backdropRef}\n onClick={handleBackdropClick}\n style={{ ...backdrop, animation: 'upp-fade-in 150ms ease' }}\n >\n <div style={{ ...modalContainer, animation: 'upp-zoom-in 200ms ease' }}>\n {/* Close button */}\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '12px 12px 0' }}>\n <button\n onClick={onClose}\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={closeButtonStyle}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M4 4l8 8M12 4l-8 8\" />\n </svg>\n </button>\n </div>\n\n {isSetup ? (\n /* ============ Account Mode ============ */\n <div style={{ padding: '0 24px 24px', display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {/* Title */}\n <h3 style={{ fontSize: '14px', fontWeight: 600, color: colors.textPrimary, margin: 0, textAlign: 'center' }}>\n Private Account\n </h3>\n\n {/* Settings Slot — app provides proof system selector with addresses */}\n {settingsSlot}\n\n {/* Disconnect */}\n <button\n onClick={handleDisconnect}\n onMouseEnter={() => setDisconnectHover(true)}\n onMouseLeave={() => setDisconnectHover(false)}\n style={disconnectStyle}\n >\n Disconnect\n </button>\n </div>\n ) : (\n /* ============ Setup Mode ============ */\n <div style={{ padding: '0 24px 24px', display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {/* Header */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '12px' }}>\n <div style={{\n padding: '12px',\n background: colors.indigoBg,\n borderRadius: '1rem',\n border: `1px solid ${colors.indigoBorder}`,\n }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ color: '#818cf8' }}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n </div>\n <div style={{ textAlign: 'center' }}>\n <h3 style={{ fontSize: '16px', fontWeight: 600, color: colors.textPrimary, margin: '0 0 4px' }}>\n Activate Private Account\n </h3>\n <p style={{ fontSize: '12px', color: colors.textTertiary, maxWidth: '20rem', margin: 0 }}>\n Sign once with your wallet to derive your private keys. The optional password creates a unique account.\n </p>\n </div>\n </div>\n\n {/* Password input */}\n <input\n type=\"password\"\n placeholder=\"Password (optional)\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isConnecting) handleActivate()\n }}\n onFocus={() => setInputFocused(true)}\n onBlur={() => setInputFocused(false)}\n style={inputStyle}\n />\n\n {/* Error */}\n {error && (\n <p style={{ fontSize: '12px', color: '#f87171', textAlign: 'center', margin: 0 }}>{error}</p>\n )}\n\n {/* Activate button */}\n <button\n onClick={handleActivate}\n disabled={isConnecting}\n onMouseEnter={() => setPrimaryHover(true)}\n onMouseLeave={() => setPrimaryHover(false)}\n style={activateStyle}\n >\n {isConnecting ? (\n <>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ animation: 'upp-spin 1s linear infinite' }}\n >\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n Signing...\n </>\n ) : (\n \"Activate\"\n )}\n </button>\n\n <p style={{ fontSize: '9px', color: colors.textMuted, textAlign: 'center', margin: 0 }}>\n Your private key is derived from a wallet signature. No seed phrase needed.\n </p>\n </div>\n )}\n </div>\n </div>\n </>,\n document.body\n )\n}\n","\"use client\"\n\nimport { useState, useCallback, type CSSProperties } from \"react\"\nimport { useUPPAccount } from \"../use-upp-account.js\"\nimport { UPPAvatar } from \"./UPPAvatar.js\"\nimport { UPPModal } from \"./UPPModal.js\"\nimport { pillDisconnected, pillConnected, colors } from \"./styles.js\"\n\nexport interface UPPPrivateButtonProps {\n /** Additional inline styles for the outer button */\n style?: CSSProperties\n /** Label when private account is not activated (default: \"Private Account\") */\n label?: string\n /** Optional slot for app-level settings rendered in the account modal */\n settingsSlot?: React.ReactNode\n}\n\n/**\n * Standalone private account pill button.\n *\n * Place alongside RainbowKit's `<ConnectButton />` — no RainbowKit dependency required.\n * Only needs `UPPAccountProvider` in the component tree.\n *\n * Two states:\n * - Not setup: dashed-border pill with shield icon + label → opens setup modal\n * - Setup: emerald pill with UPPAvatar + chevron → opens account modal\n */\nexport function UPPPrivateButton({\n style: externalStyle,\n label = \"Private Account\",\n settingsSlot,\n}: UPPPrivateButtonProps) {\n const { isSetup, stealthAddress } = useUPPAccount()\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n\n const openModal = useCallback(() => setIsModalOpen(true), [])\n const closeModal = useCallback(() => setIsModalOpen(false), [])\n\n if (isSetup && stealthAddress) {\n // Connected state: emerald pill with avatar + chevron\n const connectedStyle: CSSProperties = {\n ...pillConnected,\n ...(isHovered && {\n background: 'rgba(16, 185, 129, 0.2)',\n border: `1px solid ${colors.emeraldBorderHover}`,\n }),\n ...externalStyle,\n }\n\n return (\n <>\n <button\n onClick={openModal}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={connectedStyle}\n title=\"Private Account\"\n >\n <UPPAvatar address={stealthAddress} size={22} style={{ borderRadius: '5px', flexShrink: 0 }} />\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" style={{ color: 'rgba(110, 231, 183, 0.4)' }}>\n <path d=\"M1 1l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <UPPModal isOpen={isModalOpen} onClose={closeModal} settingsSlot={settingsSlot} />\n </>\n )\n }\n\n // Disconnected state: dashed pill with shield icon + label\n const disconnectedStyle: CSSProperties = {\n ...pillDisconnected,\n ...(isHovered && {\n background: colors.indigoHoverBg,\n border: `1px dashed ${colors.indigoHoverBorder}`,\n }),\n ...externalStyle,\n }\n\n const iconColor = isHovered ? colors.indigo : 'rgba(255, 255, 255, 0.25)'\n const textColor = isHovered ? 'rgba(255, 255, 255, 0.7)' : colors.textTertiary\n\n return (\n <>\n <button\n onClick={openModal}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={disconnectedStyle}\n title=\"Activate Private Account\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ color: iconColor, transition: 'color 150ms ease', flexShrink: 0 }}\n >\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n <span style={{\n fontSize: '13px',\n fontWeight: 500,\n color: textColor,\n transition: 'color 150ms ease',\n }}>\n {label}\n </span>\n </button>\n <UPPModal isOpen={isModalOpen} onClose={closeModal} settingsSlot={settingsSlot} />\n </>\n )\n}\n","'use client'\n\n/**\n * React hook for UPP crypto utilities\n *\n * Handles lazy initialization of crypto libraries (Poseidon, BabyJubJub).\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { Point } from '../utils/babyjubjub.js'\n\n// Lazy-loaded SDK functions\nlet sdkPromise: Promise<typeof import('../index.js')> | null = null\n\n/**\n * Hook return type\n */\nexport interface UseUPPCryptoReturn {\n /** Whether crypto libraries are ready */\n isReady: boolean\n /** Initialize crypto (called automatically, but can be called manually) */\n init: () => Promise<void>\n /** Poseidon hash */\n poseidon: (inputs: bigint[]) => Promise<bigint>\n /** Generate random field element */\n randomFieldElement: () => Promise<bigint>\n /** Compute shared secret (ECDH) */\n computeSharedSecret: (privateKey: bigint, publicKey: Point) => Promise<Point>\n /** Get public key from private key */\n privateToPublic: (privateKey: bigint) => Promise<Point>\n /** Add two points */\n addPoints: (p1: Point, p2: Point) => Promise<Point>\n /** Multiply point by scalar */\n mulPointScalar: (point: Point, scalar: bigint) => Promise<Point>\n /** Get BabyJubJub subgroup order */\n getSubOrder: () => Promise<bigint>\n}\n\n/**\n * Hook for UPP crypto utilities\n *\n * Provides lazy-loaded cryptographic functions.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isReady, poseidon, randomFieldElement } = useUPPCrypto()\n *\n * if (!isReady) return <div>Loading crypto...</div>\n *\n * // Use crypto functions\n * const hash = await poseidon([1n, 2n, 3n])\n * }\n * ```\n */\nexport function useUPPCrypto(): UseUPPCryptoReturn {\n const [isReady, setIsReady] = useState(false)\n\n // Load SDK lazily\n const loadSDK = useCallback(async () => {\n if (!sdkPromise) {\n sdkPromise = import('../index.js')\n }\n return sdkPromise\n }, [])\n\n // Initialize on mount\n useEffect(() => {\n loadSDK().then(() => setIsReady(true))\n }, [loadSDK])\n\n // Create bound functions\n const poseidon = useCallback(\n async (inputs: bigint[]): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.poseidon(inputs)\n },\n [loadSDK]\n )\n\n const randomFieldElement = useCallback(async (): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.randomFieldElement()\n }, [loadSDK])\n\n const computeSharedSecret = useCallback(\n async (privateKey: bigint, publicKey: Point): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.computeSharedSecret(privateKey, publicKey)\n },\n [loadSDK]\n )\n\n const privateToPublic = useCallback(\n async (privateKey: bigint): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.privateToPublic(privateKey)\n },\n [loadSDK]\n )\n\n const addPoints = useCallback(\n async (p1: Point, p2: Point): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.addPoints(p1, p2)\n },\n [loadSDK]\n )\n\n const mulPointScalar = useCallback(\n async (point: Point, scalar: bigint): Promise<Point> => {\n const sdk = await loadSDK()\n return sdk.mulPointScalar(point, scalar)\n },\n [loadSDK]\n )\n\n const getSubOrder = useCallback(async (): Promise<bigint> => {\n const sdk = await loadSDK()\n return sdk.getSubOrder()\n }, [loadSDK])\n\n const init = useCallback(async (): Promise<void> => {\n await loadSDK()\n setIsReady(true)\n }, [loadSDK])\n\n return {\n isReady,\n init,\n poseidon,\n randomFieldElement,\n computeSharedSecret,\n privateToPublic,\n addPoints,\n mulPointScalar,\n getSubOrder,\n }\n}\n","'use client'\n\n/**\n * React hook for shielding (depositing) tokens into UniversalPrivatePool\n *\n * The pooled model separates the token (standard ERC20) from the privacy pool.\n * Shielding requires: approve token → call pool.shield()\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { encodePacked, toHex, type Address, type Hex } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult } from './use-upp-account.js'\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Pack note data for on-chain storage (post-quantum, hash-based)\n *\n * Format: searchTag (8 bytes) + ownerHash (32 bytes) + encryptedNote (variable)\n * No ephemeral pubkey needed — encryption uses viewing secret directly.\n */\nfunction packNoteData(note: NoteCreationResult): Hex {\n return encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [note.searchTag, note.ownerHash, note.encryptedNote as Hex]\n )\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Shield configuration\n */\nexport interface ShieldConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address to shield */\n tokenAddress: Address\n}\n\n/**\n * Shield parameters\n */\nexport interface ShieldParams {\n /** Amount to shield (in wei/smallest unit) */\n amount: bigint\n /** Origin address (the depositor/shielder's wallet address) */\n originAddress: Address\n}\n\n/**\n * Shield build data - everything needed to call the contract\n */\nexport interface ShieldBuildData {\n /** Amount being shielded */\n amount: bigint\n /** Token address */\n token: Address\n /** Commitment hash (bytes32) */\n commitment: Hex\n /** Encrypted note data */\n encryptedNote: Hex\n /** Raw note data for local storage */\n noteData: NoteCreationResult\n}\n\n/**\n * useShield return type\n */\nexport interface UseShieldReturn {\n /** Build shield transaction data */\n build: (params: ShieldParams) => Promise<ShieldBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: 'creating_note' | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for shielding tokens into UniversalPrivatePool\n *\n * @param config - Shield configuration (pool and token addresses)\n * @returns Shield functions and state\n *\n * @example\n * ```tsx\n * function ShieldForm() {\n * const { address } = useAccount() // from wagmi\n * const { build, isPending, error } = useShield({\n * poolAddress: '0x...',\n * tokenAddress: '0x...',\n * })\n *\n * const handleShield = async () => {\n * // 1. Build shield data (originAddress is the depositor's wallet)\n * const data = await build({\n * amount: parseUnits('100', 18),\n * originAddress: address!,\n * })\n *\n * // 2. Approve token (using wagmi or viem)\n * await writeContract({\n * address: data.token,\n * abi: erc20Abi,\n * functionName: 'approve',\n * args: [poolAddress, data.amount],\n * })\n *\n * // 3. Shield into pool\n * await writeContract({\n * address: poolAddress,\n * abi: UNIVERSAL_PRIVATE_POOL_ABI,\n * functionName: 'shield',\n * args: [data.token, data.amount, data.commitment, data.encryptedNote],\n * })\n *\n * // 4. Track note locally\n * addNote({\n * amount: data.amount,\n * commitment: data.noteData.commitment,\n * // ... other note fields\n * })\n * }\n *\n * return (\n * <button onClick={handleShield} disabled={isPending}>\n * {isPending ? 'Creating note...' : 'Shield'}\n * </button>\n * )\n * }\n * ```\n */\nexport function useShield(config: ShieldConfig): UseShieldReturn {\n const { createNoteForSelf, isSetup, masterKeys } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<'creating_note' | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build shield transaction data\n */\n const build = useCallback(\n async (params: ShieldParams): Promise<ShieldBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { amount, originAddress } = params\n const cfg = configRef.current\n\n if (amount <= 0n) {\n throw new Error('Amount must be positive')\n }\n\n // Convert addresses to bigint for circuit compatibility\n const origin = BigInt(originAddress)\n const token = BigInt(cfg.tokenAddress)\n\n // Create note for self (the shielder is the recipient)\n // UPP notes include origin (depositor) and token for compliance proofs\n setStage('creating_note')\n const noteData = await createNoteForSelf(amount, origin, token)\n\n // Format for contract call\n // Pack the note data with ephemeral pubkey so indexer can decrypt later\n const commitment = toHex(noteData.commitment, { size: 32 })\n const encryptedNote = packNoteData(noteData)\n\n return {\n amount,\n token: cfg.tokenAddress,\n commitment,\n encryptedNote,\n noteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for private transfers via UniversalPrivatePool\n *\n * This hook generates ZK proofs using UPP circuits and builds\n * transaction data for calling pool.transfer()\n *\n * NOTE: Transfer requires STARK circuits (Phase 2). This hook compiles\n * but will throw at runtime until circuits are migrated.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { toHex, encodePacked, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote, NoteWithAmount } from '../core/transfer.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pool transfer configuration\n */\nexport interface PoolTransferConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address being transferred */\n tokenAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** ASP ID to use (default: DEMO_ASP_ID) */\n aspId?: bigint\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Pool transfer parameters\n */\nexport interface PoolTransferParams {\n /** Amount to send (in wei) */\n amount: bigint\n /** Recipient stealth address (0zk... format) */\n recipient: string\n}\n\n/**\n * Pool transfer build data - everything needed to call the contract\n */\nexport interface PoolTransferBuildData {\n /** Circuit used: 'transfer' for UPP 1-in-2-out */\n circuit: 'transfer'\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** Token address */\n token: Address\n /** Recipient output commitment */\n outputCommitment1: Hex\n /** Change output commitment */\n outputCommitment2: Hex\n /** Recipient encrypted note (packed format) */\n encryptedNote1: Hex\n /** Change encrypted note (packed format) */\n encryptedNote2: Hex\n /** Note that will be spent */\n spentNote: ShieldedNote\n /** Raw note data for local tracking */\n recipientNoteData: NoteCreationResult\n changeNoteData: NoteCreationResult\n}\n\n/**\n * usePoolTransfer return type\n */\nexport interface UsePoolTransferReturn {\n /** Build transfer transaction data */\n build: (params: PoolTransferParams) => Promise<PoolTransferBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: TransferStage | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Pack note data into bytes for on-chain storage (post-quantum format)\n *\n * Format: searchTag (8 bytes) + ownerHash (32 bytes) + encryptedNote (variable)\n */\nfunction packNoteData(note: NoteCreationResult): Hex {\n return encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [note.searchTag, note.ownerHash, note.encryptedNote as Hex]\n )\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for building private transfer transactions on UniversalPrivatePool\n *\n * Uses UPP transfer circuit (1-in-2-out) with ASP membership proof.\n *\n * NOTE: Transfer requires STARK circuits. Currently throws at proof generation.\n */\nexport function usePoolTransfer(config: PoolTransferConfig): UsePoolTransferReturn {\n const {\n unspentNotes,\n createNoteForSelf,\n isSetup,\n masterKeys,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build transfer transaction data\n */\n const build = useCallback(\n async (params: PoolTransferParams): Promise<PoolTransferBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { amount, recipient: _recipient } = params\n const cfg = configRef.current\n\n // 1. Find a single note that covers the amount\n setStage('selecting_notes')\n\n const confirmedNotes = unspentNotes.filter(\n (n) => n.status === 'confirmed' && n.token?.toLowerCase() === cfg.tokenAddress.toLowerCase()\n )\n const sortedNotes = [...confirmedNotes].sort((a, b) => {\n const diff = b.amount - a.amount\n return diff > 0n ? 1 : diff < 0n ? -1 : 0\n })\n\n const selectedNote = sortedNotes.find((n) => n.amount >= amount)\n if (!selectedNote) {\n const totalBalance = confirmedNotes.reduce((sum, n) => sum + n.amount, 0n)\n if (totalBalance >= amount) {\n throw new Error(\n 'No single note is large enough. Please merge notes first, or shield a larger amount.'\n )\n }\n throw new Error('Insufficient shielded balance')\n }\n\n // 2. Calculate change amount\n const changeAmount = selectedNote.amount - amount\n\n // 3. Get origin and token from the note\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n // 4. Create output notes\n // TODO: Phase 2 — createNoteForRecipient (send to others)\n // For now, both outputs use self keys\n setStage('creating_outputs')\n const recipientNote = await createNoteForSelf(amount, origin, token)\n const changeNote = await createNoteForSelf(changeAmount, origin, token)\n\n // 5. Load modules dynamically\n const [transferModule, proofModule, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../core/asp.js'),\n ])\n\n const {\n syncMerkleTree,\n getMerkleProofsForNotes,\n buildUPPTransferCircuitInputs,\n } = transferModule\n\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof, DEMO_ASP_ID } = aspModule\n\n // 6. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 7. Convert note to spendable format (post-quantum)\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 8. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 9. Generate ASP proof for origin\n const aspProof = await generateASPProof(\n cfg.aspId ?? DEMO_ASP_ID,\n origin,\n cfg.aspApprovedOrigins\n )\n\n // 10. Build circuit inputs\n setStage('generating_proof')\n\n const recipientNoteWithAmount: NoteWithAmount = { ...recipientNote, amount }\n const changeNoteWithAmount: NoteWithAmount = { ...changeNote, amount: changeAmount }\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof!,\n aspProof,\n recipientNoteWithAmount,\n changeNoteWithAmount\n )\n\n // 11. Generate proof\n // NOTE: This will fail until STARK circuits are implemented (Phase 2)\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n nullifier: toHex(BigInt(circuitInputs.nullifier), { size: 32 }),\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n token: cfg.tokenAddress,\n outputCommitment1: toHex(recipientNote.commitment, { size: 32 }),\n outputCommitment2: toHex(changeNote.commitment, { size: 32 }),\n encryptedNote1: packNoteData(recipientNote),\n encryptedNote2: packNoteData(changeNote),\n spentNote: selectedNote,\n recipientNoteData: recipientNote,\n changeNoteData: changeNote,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes, createNoteForSelf]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for withdrawing from UniversalPrivatePool\n *\n * Withdrawal converts private balance back to public tokens.\n * Supports ASP compliance checks and ragequit (emergency exit).\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote } from '../core/transfer.js'\nimport { BABYJUBJUB_SUBORDER } from '../utils/poseidon.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** State tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst STATE_TREE_DEPTH = 32\n/** ASP tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst ASP_TREE_DEPTH = 20\n\n/**\n * Pad an array to a target depth\n */\nfunction padToDepth<T>(arr: T[], padValue: T, depth: number): T[] {\n if (arr.length >= depth) {\n return arr.slice(0, depth)\n }\n return [...arr, ...Array(depth - arr.length).fill(padValue)]\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Withdraw configuration\n */\nexport interface WithdrawConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** Token address being withdrawn */\n tokenAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n}\n\n/**\n * Withdraw parameters\n */\nexport interface WithdrawParams {\n /** Amount to withdraw (in wei) */\n amount: bigint\n /** Public recipient address for the withdrawn tokens */\n recipient: Address\n /** ASP ID to use for compliance (default: 0) */\n aspId?: bigint\n /** ASP root for compliance (default: 0 for ragequit) */\n aspRoot?: bigint\n /** Enable ragequit mode (bypass ASP check, requires recipient = origin) */\n isRagequit?: boolean\n}\n\n/**\n * Withdraw build data - everything needed to call the contract\n */\nexport interface WithdrawBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier of the note being spent */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Token address */\n token: Address\n /** Amount being withdrawn */\n amount: bigint\n /** Public recipient address */\n recipient: Address\n /** Whether this is a ragequit withdrawal */\n isRagequit: boolean\n /** Note being spent */\n spentNote: ShieldedNote\n /** Change note data (if any change remains) */\n changeNoteData: NoteCreationResult | null\n /** Change output commitment (if any) */\n changeCommitment: Hex | null\n /** Change encrypted note (if any) */\n changeEncryptedNote: Hex | null\n}\n\n/**\n * useWithdraw return type\n */\nexport interface UseWithdrawReturn {\n /** Build withdraw transaction data */\n build: (params: WithdrawParams) => Promise<WithdrawBuildData>\n /** Whether building is in progress */\n isPending: boolean\n /** Current stage for UI feedback */\n stage: TransferStage | null\n /** Error from last attempt */\n error: Error | null\n /** Reset error state */\n reset: () => void\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for building withdrawal transactions from UniversalPrivatePool\n *\n * @param config - Withdraw configuration\n * @returns Withdraw build functions and state\n *\n * @example\n * ```tsx\n * function WithdrawForm() {\n * const { address } = useAccount()\n * const { build, isPending, stage, error } = useWithdraw({\n * poolAddress: '0x...',\n * tokenAddress: '0x...',\n * publicClient,\n * })\n *\n * const handleWithdraw = async () => {\n * // 1. Build withdrawal data\n * const data = await build({\n * amount: parseUnits('100', 18),\n * recipient: address,\n * isRagequit: true, // Emergency exit without ASP check\n * })\n *\n * // 2. Submit to pool contract\n * await writeContract({\n * address: poolAddress,\n * abi: UNIVERSAL_PRIVATE_POOL_ABI,\n * functionName: 'withdraw',\n * args: [\n * data.proof,\n * data.nullifier,\n * data.stateRoot,\n * data.aspRoot,\n * data.aspId,\n * data.token,\n * data.amount,\n * data.recipient,\n * data.isRagequit,\n * ],\n * })\n *\n * // 3. Track spent note locally\n * markNoteSpent(data.spentNote.commitment)\n * if (data.changeNoteData) {\n * addNote(/* change note *\\/)\n * }\n * }\n *\n * return (\n * <div>\n * {stage && <p>Stage: {stage}</p>}\n * <button onClick={handleWithdraw} disabled={isPending}>\n * {isPending ? 'Building proof...' : 'Withdraw'}\n * </button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useWithdraw(config: WithdrawConfig): UseWithdrawReturn {\n const {\n isSetup,\n masterKeys,\n unspentNotes,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n /**\n * Build withdraw transaction data\n */\n const build = useCallback(\n async (params: WithdrawParams): Promise<WithdrawBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n amount,\n recipient,\n aspId = 0n,\n aspRoot = 0n,\n isRagequit = false,\n } = params\n const cfg = configRef.current\n\n // 1. Select a note to spend\n // For withdraw, we need exactly 1 note (uses withdraw circuit)\n setStage('selecting_notes')\n\n console.log(`[useWithdraw] === NOTE SELECTION DEBUG ===`)\n console.log(` Requested amount: ${amount}`)\n console.log(` Available unspent notes (${unspentNotes.length}):`)\n unspentNotes.forEach((n, i) => {\n console.log(` [${i}] amount=${n.amount}, status=${n.status}, leafIndex=${n.leafIndex}, commitment=${n.commitment.slice(0, 18)}...`)\n })\n\n // Find the smallest SNARK note that covers the amount (filtered by token)\n const tokenFilteredNotes = unspentNotes.filter(\n (n) => n.token?.toLowerCase() === cfg.tokenAddress.toLowerCase() && n.proofSystem !== 'stark'\n )\n const sortedNotes = [...tokenFilteredNotes].sort((a, b) =>\n a.amount > b.amount ? 1 : -1\n )\n\n console.log(` Sorted notes (ascending by amount):`)\n sortedNotes.forEach((n, i) => {\n console.log(` [${i}] amount=${n.amount}, commitment=${n.commitment.slice(0, 18)}...`)\n })\n\n const selectedNote = sortedNotes.find((n) => n.amount >= amount)\n console.log(` Selected note: ${selectedNote ? `amount=${selectedNote.amount}, commitment=${selectedNote.commitment.slice(0, 18)}...` : 'NONE'}`)\n\n if (!selectedNote) {\n throw new Error(`Insufficient balance. Need ${amount}, have ${tokenFilteredNotes.reduce((s, n) => s + n.amount, 0n)}`)\n }\n\n // 2. The withdraw circuit enforces amount === inputAmount (full note withdrawal)\n // Change notes are NOT supported - use private transfer to split first\n if (selectedNote.amount !== amount) {\n throw new Error(\n `Withdraw circuit requires exact note amount. ` +\n `Note has ${selectedNote.amount}, requested ${amount}. ` +\n `Use private transfer to split the note first.`\n )\n }\n\n // 3. Get origin and token from the note\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n // 4. Load modules dynamically\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n\n // 5. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 6. Convert note for proof\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 7. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 8. Build withdraw circuit inputs\n setStage('generating_proof')\n\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n\n // CRITICAL: Use the ACTUAL leafIndex from the Merkle proof, not the stored one\n // The stored leafIndex might be stale if the tree changed\n const actualLeafIndex = merkleProof.leafIndex\n\n // Verify commitment matches current formula before building proof\n const inputPubkey = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitment = await sdk.poseidon([\n selectedNote.amount,\n inputPubkey.x,\n inputPubkey.y,\n selectedNote.blinding,\n BigInt(selectedNote.origin),\n BigInt(selectedNote.token),\n ])\n const storedCommitment = BigInt(selectedNote.commitment)\n if (localCommitment !== storedCommitment) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n // Compute nullifier: Poseidon(ownerSecret % subOrder, leafIndex, commitment)\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitment,\n ])\n\n // Build inputs matching the withdraw circuit signals exactly\n // See: circuits/withdraw.circom - Withdraw(32, 20)\n const circuitInputs = {\n // Public inputs\n stateRoot: stateRootBI.toString(),\n aspRoot: aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(recipient).toString(),\n token: BigInt(cfg.tokenAddress).toString(),\n isRagequit: isRagequit ? '1' : '0',\n\n // Private inputs - Input Note\n // IMPORTANT: Use actualLeafIndex from Merkle proof, not stored leafIndex\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n // ASP membership proof (zeros for ragequit)\n aspPathElements: Array(ASP_TREE_DEPTH).fill('0'),\n aspPathIndices: Array(ASP_TREE_DEPTH).fill('0'),\n }\n\n // 9. Generate proof using the withdraw circuit\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n const stateRoot = stateRootBI\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot,\n aspRoot,\n aspId,\n token: cfg.tokenAddress,\n amount,\n recipient,\n isRagequit,\n spentNote: selectedNote,\n changeNoteData: null,\n changeCommitment: null,\n changeEncryptedNote: null,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes]\n )\n\n return {\n build,\n isPending,\n stage,\n error,\n reset,\n }\n}\n","'use client'\n\n/**\n * React hook for managing a personal ASP (Association Set Provider)\n *\n * Allows users to register and manage their own ASP for self-approval.\n * This is useful for demo purposes where users need to approve themselves\n * to withdraw notes they received via private transfer.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport { type Address, type PublicClient } from 'viem'\nimport { ASP_REGISTRY_HUB_ABI } from '@permissionless-technologies/upc-sdk'\nimport { computeSingleOriginASPRoot } from '../core/asp.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PersonalASPConfig {\n /** ASP Registry Hub contract address */\n aspHubAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** User's wallet address */\n userAddress?: Address\n}\n\nexport interface PersonalASPInfo {\n /** ASP ID (0 if not registered) */\n aspId: bigint\n /** Current root (0 if not set) */\n currentRoot: bigint\n /** Whether the ASP is registered */\n isRegistered: boolean\n /** Whether the root is set to the user's origin */\n isApproved: boolean\n}\n\nexport interface UsePersonalASPReturn {\n /** Personal ASP info */\n aspInfo: PersonalASPInfo | null\n /** Whether loading initial state */\n isLoading: boolean\n /** Error from last operation */\n error: Error | null\n /** Check if a specific origin is approved in this ASP */\n isOriginApproved: (origin: bigint) => Promise<boolean>\n /** Get the ASP ID for use in transactions */\n getASPId: () => bigint | null\n /** Get the ASP root for a given origin (for single-origin tree) */\n getASPRootForOrigin: (origin: bigint) => Promise<bigint>\n /** Refresh ASP info from contract */\n refresh: () => Promise<void>\n}\n\n// ============================================================================\n// Local Storage Keys\n// ============================================================================\n\nconst STORAGE_KEY_PREFIX = 'upp_personal_asp_'\n\nfunction getStorageKey(chainId: number, address: Address): string {\n return `${STORAGE_KEY_PREFIX}${chainId}_${address.toLowerCase()}`\n}\n\nfunction loadStoredASPId(chainId: number, address: Address): bigint | null {\n if (typeof window === 'undefined') return null\n try {\n const key = getStorageKey(chainId, address)\n const stored = localStorage.getItem(key)\n return stored ? BigInt(stored) : null\n } catch {\n return null\n }\n}\n\nfunction storeASPId(chainId: number, address: Address, aspId: bigint): void {\n if (typeof window === 'undefined') return\n try {\n const key = getStorageKey(chainId, address)\n localStorage.setItem(key, aspId.toString())\n } catch {\n // Ignore storage errors\n }\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\n/**\n * Hook for managing a personal ASP\n *\n * @example\n * ```tsx\n * function ApproveButton() {\n * const { aspInfo, refresh } = usePersonalASP({\n * aspHubAddress: '0x...',\n * publicClient,\n * userAddress: address,\n * })\n *\n * // Check if approved\n * if (aspInfo?.isApproved) {\n * return <span>Approved!</span>\n * }\n *\n * return <button onClick={handleApprove}>Approve Yourself</button>\n * }\n * ```\n */\nexport function usePersonalASP(config: PersonalASPConfig): UsePersonalASPReturn {\n const { aspHubAddress, publicClient, userAddress } = config\n\n const [aspInfo, setAspInfo] = useState<PersonalASPInfo | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n // Load ASP info\n const refresh = useCallback(async () => {\n if (!userAddress || !publicClient) {\n setAspInfo(null)\n setIsLoading(false)\n return\n }\n\n try {\n setIsLoading(true)\n setError(null)\n\n const chainId = await publicClient.getChainId()\n\n // Check stored ASP ID first\n const storedAspId = loadStoredASPId(chainId, userAddress)\n\n if (storedAspId) {\n // Verify the stored ASP is still valid and owned by user\n const aspData = await publicClient.readContract({\n address: aspHubAddress,\n abi: ASP_REGISTRY_HUB_ABI,\n functionName: 'getASP',\n args: [storedAspId],\n }) as { id: bigint; operator: Address; name: string; currentRoot: bigint; lastUpdated: bigint }\n\n if (aspData.operator.toLowerCase() === userAddress.toLowerCase()) {\n // Valid stored ASP\n const userOrigin = BigInt(userAddress)\n const expectedRoot = await computeSingleOriginASPRoot(userOrigin)\n const isApproved = aspData.currentRoot === expectedRoot\n\n setAspInfo({\n aspId: storedAspId,\n currentRoot: aspData.currentRoot,\n isRegistered: true,\n isApproved,\n })\n setIsLoading(false)\n return\n }\n }\n\n // No stored ASP or invalid - user needs to register\n setAspInfo({\n aspId: 0n,\n currentRoot: 0n,\n isRegistered: false,\n isApproved: false,\n })\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n setAspInfo(null)\n } finally {\n setIsLoading(false)\n }\n }, [aspHubAddress, publicClient, userAddress])\n\n // Load on mount and when config changes\n useEffect(() => {\n refresh()\n }, [refresh])\n\n // Check if a specific origin is approved\n const isOriginApproved = useCallback(async (origin: bigint): Promise<boolean> => {\n if (!aspInfo?.isRegistered || !publicClient) return false\n\n try {\n const expectedRoot = await computeSingleOriginASPRoot(origin)\n const isValid = await publicClient.readContract({\n address: aspHubAddress,\n abi: ASP_REGISTRY_HUB_ABI,\n functionName: 'isValidASPRoot',\n args: [aspInfo.aspId, expectedRoot],\n })\n return isValid as boolean\n } catch {\n return false\n }\n }, [aspInfo, aspHubAddress, publicClient])\n\n // Get ASP ID\n const getASPId = useCallback((): bigint | null => {\n return aspInfo?.isRegistered ? aspInfo.aspId : null\n }, [aspInfo])\n\n // Get ASP root for a given origin\n const getASPRootForOrigin = useCallback(async (origin: bigint): Promise<bigint> => {\n return computeSingleOriginASPRoot(origin)\n }, [])\n\n return {\n aspInfo,\n isLoading,\n error,\n isOriginApproved,\n getASPId,\n getASPRootForOrigin,\n refresh,\n }\n}\n\n/**\n * Store a newly registered ASP ID\n * Call this after successfully registering an ASP via contract\n */\nexport function storePersonalASPId(\n chainId: number,\n address: Address,\n aspId: bigint\n): void {\n storeASPId(chainId, address, aspId)\n}\n","'use client'\n\n/**\n * React hooks for UPP in-pool swap order book\n *\n * Provides hooks for browsing, placing, filling, claiming, and cancelling swap orders.\n * Proof-system-aware: works with both SNARK and STARK proof systems.\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { useUPPAccount } from './use-upp-account.js'\nimport type { NoteCreationResult, ShieldedNote } from './use-upp-account.js'\nimport type { TransferStage, SpendableNote } from '../core/transfer.js'\nimport {\n type SwapOrder,\n type SwapOrderEvent,\n type SwapFillEvent,\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n computeFillPercentage,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n SWAP_ORDER_PLACED_EVENT,\n RATE_PRECISION,\n} from '../core/swap.js'\nimport { BABYJUBJUB_SUBORDER } from '../utils/poseidon.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** State tree depth - must match compiled withdraw circuit (Withdraw(32, 20)) */\nconst STATE_TREE_DEPTH = 32\n/** ASP tree depth - must match compiled withdraw circuit */\nconst ASP_TREE_DEPTH = 20\n\nfunction padToDepth<T>(arr: T[], padValue: T, depth: number): T[] {\n if (arr.length >= depth) return arr.slice(0, depth)\n return [...arr, ...Array(depth - arr.length).fill(padValue)]\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SwapStage =\n | 'idle'\n | 'preparing'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n | 'done'\n | 'error'\n\nexport interface SwapOrderBookConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Token pair filter (optional) */\n sellToken?: Address\n buyToken?: Address\n /** ASP filter: only show orders from these ASP IDs */\n acceptableAspIds?: bigint[]\n /** Polling interval for order book updates (ms, default: 15000) */\n pollInterval?: number\n /** Start block for event scanning (default: 0) */\n fromBlock?: bigint\n}\n\nexport interface UseSwapOrderBookReturn {\n /** Active swap orders */\n orders: SwapOrderEvent[]\n /** Whether the order book is loading */\n isLoading: boolean\n /** Error if any */\n error: string | null\n /** Manually refresh the order book */\n refresh: () => Promise<void>\n}\n\nexport interface SwapConfig {\n /** UniversalPrivatePool contract address */\n poolAddress: Address\n /** viem PublicClient for reading chain data */\n publicClient: PublicClient\n /** Circuit artifacts base URL (default: '/circuits/') */\n circuitBaseUrl?: string\n /** All approved origins in the ASP tree (enables multi-origin proofs) */\n aspApprovedOrigins?: bigint[]\n}\n\n/**\n * Build data returned by buildPlaceOrder — everything needed for the contract call\n */\nexport interface PlaceOrderBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier (= orderId) */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Sell token address */\n sellToken: Address\n /** Sell amount */\n sellAmount: bigint\n /** Buy token address */\n buyToken: Address\n /** Rate (1e18 fixed-point) */\n rate: bigint\n /** Cancel key hash */\n cancelKeyHash: Hex\n /** Cancel secret (store in localStorage!) */\n cancelSecret: Hex\n /** Required filler ASP ID */\n requiredFillerAspId: bigint\n /** Expiry (block number) */\n expiry: bigint\n /** Note being spent */\n spentNote: ShieldedNote\n}\n\n/**\n * Build data returned by buildFillOrder\n */\nexport interface FillOrderBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Filler's nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root */\n aspRoot: bigint\n /** ASP ID */\n aspId: bigint\n /** Order being filled */\n orderId: Hex\n /** Take amount (sellToken from order) */\n takeAmount: bigint\n /** Filler's output commitment (receives sellToken) */\n fillerOutputCommitment: Hex\n /** Encrypted note for filler's output */\n fillerEncryptedNote: Hex\n /** Note being spent */\n spentNote: ShieldedNote\n /** Filler's new note data */\n fillerNoteData: NoteCreationResult\n}\n\n/**\n * Build data returned by buildClaimOrder\n */\nexport interface ClaimOrderBuildData {\n /** Order being claimed */\n orderId: Hex\n /** Cancel secret */\n cancelSecret: Hex\n /** Buy output commitment (receives accumulated buyToken) */\n buyOutputCommitment: Hex\n /** Refund commitment (remaining sellToken) */\n refundCommitment: Hex\n /** Encrypted buy output note */\n buyEncryptedNote: Hex\n /** Encrypted refund note */\n refundEncryptedNote: Hex\n /** Buy note data (null if no fills) */\n buyNoteData: NoteCreationResult | null\n /** Refund note data (null if fully filled) */\n refundNoteData: NoteCreationResult | null\n}\n\n/**\n * Build data returned by buildCancelOrder\n */\nexport interface CancelOrderBuildData {\n /** Order being cancelled */\n orderId: Hex\n /** Cancel secret */\n cancelSecret: Hex\n /** Refund commitment */\n refundCommitment: Hex\n /** Encrypted refund note */\n refundEncryptedNote: Hex\n /** Refund note data */\n refundNoteData: NoteCreationResult\n}\n\nexport interface SplitNoteParams {\n /** Note to split */\n note: ShieldedNote\n /** Desired amount for the first output (the rest becomes change) */\n targetAmount: bigint\n /** ASP ID to use for the proof (defaults to DEMO_ASP_ID if not provided) */\n aspId?: bigint\n /** Pre-fetched ASP proof from the service */\n aspProof?: ASPProofParam\n}\n\nexport interface SplitNoteBuildData {\n /** PLONK proof bytes for contract call */\n proof: { proofBytes: `0x${string}`; publicSignals: bigint[] }\n /** Nullifier */\n nullifier: Hex\n /** Merkle state root */\n stateRoot: bigint\n /** ASP root (for transfer circuit) */\n aspRoot: bigint\n /** Token address */\n token: Address\n /** Exact-amount output commitment */\n outputCommitment1: Hex\n /** Change output commitment */\n outputCommitment2: Hex\n /** Exact-amount encrypted note */\n encryptedNote1: Hex\n /** Change encrypted note */\n encryptedNote2: Hex\n /** The exact-amount note — use as noteOverride for buildPlaceOrder/buildFillOrder */\n exactNote: ShieldedNote\n /** The change note */\n changeNote: ShieldedNote\n /** Original note being spent */\n spentNote: ShieldedNote\n /** Raw creation data for local tracking */\n exactNoteData: NoteCreationResult\n /** Raw creation data for local tracking */\n changeNoteData: NoteCreationResult\n}\n\nexport interface UseSwapReturn {\n /** Current operation stage */\n stage: TransferStage | null\n /** Whether building is in progress */\n isPending: boolean\n /** Error from last attempt */\n error: Error | null\n /** Build a self-transfer to split a note into exact amount + change */\n buildNoteSplit: (params: SplitNoteParams) => Promise<SplitNoteBuildData>\n /** Build place order data (returns everything needed for contract call) */\n buildPlaceOrder: (params: PlaceOrderParams) => Promise<PlaceOrderBuildData>\n /** Build fill order data */\n buildFillOrder: (params: FillOrderParams) => Promise<FillOrderBuildData>\n /** Build claim order data (no proof needed) */\n buildClaimOrder: (params: ClaimOrderParams) => Promise<ClaimOrderBuildData>\n /** Build cancel order data (no proof needed) */\n buildCancelOrder: (params: CancelOrderParams) => Promise<CancelOrderBuildData>\n /** Reset state */\n reset: () => void\n}\n\n/** Pre-fetched ASP proof from the platform's ASP service */\nexport interface ASPProofParam {\n root: bigint\n pathElements: bigint[]\n pathIndices: number[]\n}\n\nexport interface PlaceOrderParams {\n /** Token to sell */\n sellToken: Address\n /** Amount to sell */\n sellAmount: bigint\n /** Token to buy */\n buyToken: Address\n /** Price: buyToken per sellToken (1e18 fixed-point) */\n rate: bigint\n /** Required filler ASP (0n = accept any) */\n requiredFillerAspId?: bigint\n /** Number of blocks until expiry */\n expiryBlocks: bigint\n /** ASP ID */\n aspId: bigint\n /** Pre-fetched ASP proof from the service. If omitted, falls back to local computation. */\n aspProof?: ASPProofParam\n /** Explicit note to spend (skips note selection). Used after auto-split. */\n noteOverride?: ShieldedNote\n}\n\nexport interface FillOrderParams {\n /** Order to fill */\n orderId: Hex\n /** How much sellToken to take */\n takeAmount: bigint\n /** The order's rate */\n rate: bigint\n /** The order's sellToken (filler receives this) */\n sellToken: Address\n /** The order's buyToken (filler pays this) */\n buyToken: Address\n /** ASP ID */\n aspId: bigint\n /** Pre-fetched ASP proof from the service. If omitted, falls back to local computation. */\n aspProof?: ASPProofParam\n /** Explicit note to spend (skips note selection). Used after auto-split. */\n noteOverride?: ShieldedNote\n}\n\nexport interface ClaimOrderParams {\n /** Order to claim */\n orderId: Hex\n /** Cancel secret used when placing the order */\n cancelSecret: Hex\n /** On-chain remaining sell amount */\n remainingSellAmount: bigint\n /** On-chain accumulated buy amount */\n accumulatedBuyAmount: bigint\n /** The order's sell token */\n sellToken: Address\n /** The order's buy token */\n buyToken: Address\n}\n\nexport interface CancelOrderParams {\n /** Order to cancel */\n orderId: Hex\n /** Cancel secret used when placing the order */\n cancelSecret: Hex\n /** The full sell amount (refunded on cancel) */\n sellAmount: bigint\n /** The order's sell token */\n sellToken: Address\n}\n\n// ============================================================================\n// Hook: useSwapOrderBook — Browse and filter the order book\n// ============================================================================\n\n/**\n * Hook for browsing the swap order book.\n * Scans SwapOrderPlaced events and filters by token pair and ASP.\n */\n/** Minimal ABI fragment for reading swapOrders mapping */\nconst SWAP_ORDERS_ABI = [{\n type: 'function' as const,\n name: 'swapOrders' as const,\n inputs: [{ name: '', type: 'bytes32' as const }],\n outputs: [\n { name: 'sellToken', type: 'address' as const },\n { name: 'sellAmount', type: 'uint256' as const },\n { name: 'remainingSellAmount', type: 'uint256' as const },\n { name: 'buyToken', type: 'address' as const },\n { name: 'rate', type: 'uint256' as const },\n { name: 'accumulatedBuyAmount', type: 'uint256' as const },\n { name: 'makerAspId', type: 'uint256' as const },\n { name: 'requiredFillerAspId', type: 'uint256' as const },\n { name: 'cancelKeyHash', type: 'bytes32' as const },\n { name: 'expiry', type: 'uint256' as const },\n { name: 'claimed', type: 'bool' as const },\n { name: 'cancelled', type: 'bool' as const },\n ],\n stateMutability: 'view' as const,\n}] as const\n\nexport function useSwapOrderBook(config: SwapOrderBookConfig): UseSwapOrderBookReturn {\n const [orders, setOrders] = useState<SwapOrderEvent[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n const refresh = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const logs = await config.publicClient.getLogs({\n address: config.poolAddress,\n event: SWAP_ORDER_PLACED_EVENT,\n fromBlock: config.fromBlock ?? 0n,\n toBlock: 'latest',\n })\n\n let parsedOrders: SwapOrderEvent[] = logs.map(log => ({\n orderId: log.args.orderId!,\n sellToken: log.args.sellToken!,\n buyToken: log.args.buyToken!,\n sellAmount: log.args.sellAmount!,\n rate: log.args.rate!,\n makerAspId: log.args.makerAspId!,\n requiredFillerAspId: log.args.requiredFillerAspId!,\n expiry: log.args.expiry!,\n blockNumber: log.blockNumber ?? 0n,\n }))\n\n if (config.sellToken && config.buyToken) {\n parsedOrders = filterOrdersByTokenPair(parsedOrders, config.sellToken, config.buyToken)\n }\n if (config.acceptableAspIds && config.acceptableAspIds.length > 0) {\n parsedOrders = filterOrdersByASP(parsedOrders, config.acceptableAspIds)\n }\n\n // Fetch on-chain state for each order to enrich with remaining amounts\n const enriched: SwapOrderEvent[] = []\n for (const order of parsedOrders) {\n try {\n const result = await config.publicClient.readContract({\n address: config.poolAddress,\n abi: SWAP_ORDERS_ABI,\n functionName: 'swapOrders',\n args: [order.orderId],\n })\n const claimed = result[10] as boolean\n const cancelled = result[11] as boolean\n const remainingSellAmount = result[2] as bigint\n\n enriched.push({\n ...order,\n remainingSellAmount,\n claimed,\n cancelled,\n })\n } catch {\n // If state read fails, include order without state (fallback)\n enriched.push(order)\n }\n }\n\n setOrders(enriched)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch order book')\n } finally {\n setIsLoading(false)\n }\n }, [config.publicClient, config.poolAddress, config.sellToken, config.buyToken, config.acceptableAspIds, config.fromBlock])\n\n useEffect(() => {\n refresh()\n const interval = config.pollInterval ?? 15000\n intervalRef.current = setInterval(refresh, interval)\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current)\n }\n }, [refresh, config.pollInterval])\n\n return { orders, isLoading, error, refresh }\n}\n\n// ============================================================================\n// Hook: useSwap — Place, fill, claim, cancel orders\n// ============================================================================\n\n/**\n * Hook for swap operations with real proof generation.\n * Mirrors useWithdraw — returns build functions that produce contract call data.\n */\nexport function useSwap(config: SwapConfig): UseSwapReturn {\n const {\n isSetup,\n masterKeys,\n unspentNotes,\n createNoteForSelf,\n ethAddress,\n } = useUPPAccount()\n\n const [isPending, setIsPending] = useState(false)\n const [stage, setStage] = useState<TransferStage | null>(null)\n const [error, setError] = useState<Error | null>(null)\n\n const configRef = useRef(config)\n configRef.current = config\n\n const reset = useCallback(() => {\n setError(null)\n setStage(null)\n }, [])\n\n const buildPlaceOrder = useCallback(\n async (params: PlaceOrderParams): Promise<PlaceOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n sellToken,\n sellAmount,\n buyToken,\n rate,\n requiredFillerAspId = 0n,\n expiryBlocks,\n aspId,\n noteOverride,\n } = params\n const cfg = configRef.current\n\n // 1. Select note to spend\n setStage('selecting_notes')\n let selectedNote: ShieldedNote\n\n if (noteOverride) {\n selectedNote = noteOverride\n } else {\n const sortedNotes = [...unspentNotes]\n .filter(n => n.token?.toLowerCase() === sellToken.toLowerCase() && n.proofSystem !== 'stark')\n .sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const exactNote = sortedNotes.find(n => n.amount === sellAmount)\n if (!exactNote) {\n const largerNote = sortedNotes.find(n => n.amount > sellAmount)\n if (largerNote) {\n throw new Error(`SPLIT_REQUIRED:${largerNote.commitment}`)\n }\n throw new Error(\n `Insufficient ${sellToken} balance for swap. ` +\n `Need ${sellAmount}, have ${sortedNotes.reduce((s, n) => s + n.amount, 0n)}`\n )\n }\n selectedNote = exactNote\n }\n\n // 2. Load modules dynamically\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof } = aspModule\n\n // 3. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 4. Convert note for proof\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 5. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n const actualLeafIndex = merkleProof.leafIndex\n\n // 6. Verify commitment formula, compute nullifier and ASP proof\n setStage('generating_proof')\n const inputPubkey = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitment = await sdk.poseidon([\n selectedNote.amount, inputPubkey.x, inputPubkey.y,\n selectedNote.blinding, origin, token,\n ])\n const storedCommitment = BigInt(selectedNote.commitment)\n if (localCommitment !== storedCommitment) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitment,\n ])\n\n // Use pre-fetched ASP proof from service, or fall back to local computation\n const aspProofData = params.aspProof\n ? { aspId, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(aspId, origin, cfg.aspApprovedOrigins)\n\n // 7. Build withdraw circuit inputs\n // Swap uses withdraw verifier with dummy recipient = poolAddress, isRagequit = false\n const circuitInputs = {\n stateRoot: stateRootBI.toString(),\n aspRoot: aspProofData.aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(cfg.poolAddress).toString(),\n token: token.toString(),\n isRagequit: '0',\n\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n aspPathElements: padToDepth(aspProofData.aspPathElements.map(String), '0', ASP_TREE_DEPTH),\n aspPathIndices: padToDepth(aspProofData.aspPathIndices.map(String), '0', ASP_TREE_DEPTH),\n }\n\n // 8. Generate proof\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // 9. Generate cancel secret\n const cancelSecret = generateCancelSecret()\n const cancelKeyHash = computeCancelKeyHash(cancelSecret)\n\n // 10. Compute expiry block\n const currentBlock = await cfg.publicClient.getBlockNumber()\n const expiry = currentBlock + expiryBlocks\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot: stateRootBI,\n aspRoot: aspProofData.aspRoot,\n aspId,\n sellToken,\n sellAmount,\n buyToken,\n rate,\n cancelKeyHash,\n cancelSecret,\n requiredFillerAspId,\n expiry,\n spentNote: selectedNote,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes]\n )\n\n const buildFillOrder = useCallback(\n async (params: FillOrderParams): Promise<FillOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n orderId,\n takeAmount,\n rate,\n sellToken,\n buyToken,\n aspId,\n noteOverride,\n } = params\n const cfg = configRef.current\n\n // 1. Compute give amount (what filler pays in buyToken)\n const giveAmount = computeGiveAmount(takeAmount, rate)\n\n // 2. Select note to spend (filler pays in buyToken)\n setStage('selecting_notes')\n let selectedNote: ShieldedNote\n\n if (noteOverride) {\n selectedNote = noteOverride\n } else {\n const sortedNotes = [...unspentNotes]\n .filter(n => n.token?.toLowerCase() === buyToken.toLowerCase() && n.proofSystem !== 'stark')\n .sort((a, b) => (a.amount > b.amount ? 1 : -1))\n\n const exactNote = sortedNotes.find(n => n.amount === giveAmount)\n if (!exactNote) {\n const largerNote = sortedNotes.find(n => n.amount > giveAmount)\n if (largerNote) {\n throw new Error(`SPLIT_REQUIRED:${largerNote.commitment}`)\n }\n throw new Error(\n `Insufficient ${buyToken} balance. ` +\n `Need ${giveAmount} to fill order, have ${sortedNotes.reduce((s, n) => s + n.amount, 0n)}`\n )\n }\n selectedNote = exactNote\n }\n\n // 3. Load modules\n setStage('creating_outputs')\n const [transferModule, proofModule, sdk, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../index.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof } = aspModule\n\n // 4. Create output note for filler (receives takeAmount of sellToken)\n const fillerOrigin = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n const fillerNoteData = await createNoteForSelf(\n takeAmount,\n fillerOrigin,\n BigInt(sellToken),\n )\n\n // 5. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 6. Convert note for proof\n const origin = BigInt(selectedNote.origin)\n const token = BigInt(selectedNote.token)\n\n const spendableNote: SpendableNote = {\n amount: selectedNote.amount,\n blinding: selectedNote.blinding,\n commitment: selectedNote.commitment,\n ownerSecret: selectedNote.ownerSecret,\n ownerHash: selectedNote.ownerHash,\n leafIndex: selectedNote.leafIndex,\n origin,\n token,\n }\n\n // 7. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n const merkleProof = noteProof!.proof\n const stateRootBI = merkleProof.root\n const actualLeafIndex = merkleProof.leafIndex\n\n // 8. Verify commitment formula, compute nullifier and ASP proof\n setStage('generating_proof')\n const inputPubkeyF = await sdk.privateToPublic(BigInt(selectedNote.ownerSecret))\n const localCommitmentF = await sdk.poseidon([\n selectedNote.amount, inputPubkeyF.x, inputPubkeyF.y,\n selectedNote.blinding, origin, token,\n ])\n const storedCommitmentF = BigInt(selectedNote.commitment)\n if (localCommitmentF !== storedCommitmentF) {\n throw new Error(\n `Note commitment mismatch — this note was created with an outdated commitment formula. ` +\n `Clear your shielded account (localStorage) and re-shield tokens.`\n )\n }\n\n const nullifier = await sdk.poseidon([\n BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER,\n BigInt(actualLeafIndex),\n storedCommitmentF,\n ])\n\n // Use pre-fetched ASP proof from service, or fall back to local computation\n const aspProofData = params.aspProof\n ? { aspId, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(aspId, origin, cfg.aspApprovedOrigins)\n\n // 9. Build withdraw circuit inputs\n const circuitInputs = {\n stateRoot: stateRootBI.toString(),\n aspRoot: aspProofData.aspRoot.toString(),\n nullifier: nullifier.toString(),\n amount: selectedNote.amount.toString(),\n recipient: BigInt(cfg.poolAddress).toString(),\n token: token.toString(),\n isRagequit: '0',\n\n inputAmount: selectedNote.amount.toString(),\n inputOneTimeSecret: (BigInt(selectedNote.ownerSecret) % BABYJUBJUB_SUBORDER).toString(),\n inputBlinding: selectedNote.blinding.toString(),\n inputOrigin: origin.toString(),\n inputLeafIndex: actualLeafIndex.toString(),\n inputPathElements: padToDepth(merkleProof.pathElements.map(String), '0', STATE_TREE_DEPTH),\n inputPathIndices: padToDepth(merkleProof.pathIndices.map(String), '0', STATE_TREE_DEPTH),\n\n aspPathElements: padToDepth(aspProofData.aspPathElements.map(String), '0', ASP_TREE_DEPTH),\n aspPathIndices: padToDepth(aspProofData.aspPathIndices.map(String), '0', ASP_TREE_DEPTH),\n }\n\n // 10. Generate proof\n const { proof } = await generateUPPProof(\n 'withdraw',\n circuitInputs as any,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // Pack filler note with searchTag + ownerHash + encrypted payload\n // so syncNotes can discover it from SwapOrderFilled events\n const { encodePacked } = await import('viem')\n const packedFillerNote = encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [fillerNoteData.searchTag, fillerNoteData.ownerHash, fillerNoteData.encryptedNote as Hex]\n )\n\n return {\n proof: formattedProof,\n nullifier: toHex(nullifier, { size: 32 }),\n stateRoot: stateRootBI,\n aspRoot: aspProofData.aspRoot,\n aspId,\n orderId,\n takeAmount,\n fillerOutputCommitment: toHex(fillerNoteData.commitment, { size: 32 }),\n fillerEncryptedNote: packedFillerNote,\n spentNote: selectedNote,\n fillerNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, unspentNotes, createNoteForSelf]\n )\n\n const buildClaimOrder = useCallback(\n async (params: ClaimOrderParams): Promise<ClaimOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const {\n orderId,\n cancelSecret,\n remainingSellAmount,\n accumulatedBuyAmount,\n sellToken,\n buyToken,\n } = params\n\n let buyNoteData: NoteCreationResult | null = null\n let refundNoteData: NoteCreationResult | null = null\n\n const originAddr = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n\n if (accumulatedBuyAmount > 0n) {\n buyNoteData = await createNoteForSelf(\n accumulatedBuyAmount,\n originAddr,\n BigInt(buyToken),\n )\n }\n\n if (remainingSellAmount > 0n) {\n refundNoteData = await createNoteForSelf(\n remainingSellAmount,\n originAddr,\n BigInt(sellToken),\n )\n }\n\n const zeroHex = '0x0000000000000000000000000000000000000000000000000000000000000000' as Hex\n\n return {\n orderId,\n cancelSecret,\n buyOutputCommitment: buyNoteData ? toHex(buyNoteData.commitment, { size: 32 }) : zeroHex,\n refundCommitment: refundNoteData ? toHex(refundNoteData.commitment, { size: 32 }) : zeroHex,\n buyEncryptedNote: buyNoteData ? buyNoteData.encryptedNote as Hex : '0x' as Hex,\n refundEncryptedNote: refundNoteData ? refundNoteData.encryptedNote as Hex : '0x' as Hex,\n buyNoteData,\n refundNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n const buildCancelOrder = useCallback(\n async (params: CancelOrderParams): Promise<CancelOrderBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { orderId, cancelSecret, sellAmount, sellToken } = params\n\n const cancelOrigin = ethAddress ? BigInt(ethAddress) : BigInt(masterKeys.ownerHash)\n const refundNoteData = await createNoteForSelf(\n sellAmount,\n cancelOrigin,\n BigInt(sellToken),\n )\n\n return {\n orderId,\n cancelSecret,\n refundCommitment: toHex(refundNoteData.commitment, { size: 32 }),\n refundEncryptedNote: refundNoteData.encryptedNote as Hex,\n refundNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n // ============================================================================\n // buildNoteSplit — Split a note into exact amount + change via self-transfer\n // ============================================================================\n\n const buildNoteSplit = useCallback(\n async (params: SplitNoteParams): Promise<SplitNoteBuildData> => {\n if (!isSetup || !masterKeys) {\n throw new Error('Account not set up. Call setupAccount() first.')\n }\n\n setIsPending(true)\n setError(null)\n\n try {\n const { note, targetAmount, aspId: splitAspId } = params\n const cfg = configRef.current\n\n if (targetAmount >= note.amount) {\n throw new Error('Target amount must be less than note amount')\n }\n if (targetAmount <= 0n) {\n throw new Error('Target amount must be positive')\n }\n\n const changeAmount = note.amount - targetAmount\n const origin = BigInt(note.origin)\n const token = BigInt(note.token)\n\n // 1. Create two self-notes: exact amount + change\n setStage('creating_outputs')\n const [exactNoteData, changeNoteData] = await Promise.all([\n createNoteForSelf(targetAmount, origin, token),\n createNoteForSelf(changeAmount, origin, token),\n ])\n\n // 2. Load modules\n const [transferModule, proofModule, aspModule] = await Promise.all([\n import('../core/transfer.js'),\n import('../core/proof.js'),\n import('../core/asp.js'),\n ])\n\n const { syncMerkleTree, getMerkleProofsForNotes, buildUPPTransferCircuitInputs } = transferModule\n const { generateUPPProof, formatPlonkProofForContract } = proofModule\n const { generateASPProof, DEMO_ASP_ID } = aspModule\n\n // 3. Sync Merkle tree\n setStage('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(cfg.publicClient, cfg.poolAddress)\n\n // 4. Convert note to spendable format\n const spendableNote: SpendableNote = {\n amount: note.amount,\n blinding: note.blinding,\n commitment: note.commitment,\n ownerSecret: note.ownerSecret,\n ownerHash: note.ownerHash,\n leafIndex: note.leafIndex,\n origin,\n token,\n }\n\n // 5. Get Merkle proof\n const [noteProof] = await getMerkleProofsForNotes([spendableNote], leaves, tree)\n\n // 6. ASP proof (use pre-fetched from service, or compute locally)\n const aspProof = params.aspProof\n ? { aspId: splitAspId ?? DEMO_ASP_ID, aspRoot: params.aspProof.root, aspPathElements: params.aspProof.pathElements, aspPathIndices: params.aspProof.pathIndices }\n : await generateASPProof(splitAspId ?? DEMO_ASP_ID, origin, cfg.aspApprovedOrigins)\n\n // 7. Build circuit inputs\n setStage('generating_proof')\n const exactNoteWithAmount = { ...exactNoteData, amount: targetAmount }\n const changeNoteWithAmount = { ...changeNoteData, amount: changeAmount }\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof!,\n aspProof,\n exactNoteWithAmount,\n changeNoteWithAmount\n )\n\n // 8. Generate proof\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n cfg.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n // 9. Pack encrypted notes for contract\n const { encodePacked } = await import('viem')\n const packNote = (n: NoteCreationResult): Hex =>\n encodePacked(\n ['uint64', 'uint256', 'bytes'],\n [n.searchTag, n.ownerHash, n.encryptedNote as Hex]\n )\n\n // 10. Build ShieldedNote objects for local state\n const proofSystem = note.proofSystem ?? 'snark'\n const exactShieldedNote: ShieldedNote = {\n amount: targetAmount,\n blinding: exactNoteData.blinding,\n commitment: toHex(exactNoteData.commitment, { size: 32 }),\n ownerSecret: toHex(exactNoteData.ownerSecret, { size: 32 }),\n ownerHash: toHex(exactNoteData.ownerHash, { size: 32 }),\n leafIndex: 0,\n origin: note.origin,\n token: note.token,\n status: 'confirmed',\n proofSystem,\n timestamp: Date.now(),\n }\n const changeShieldedNote: ShieldedNote = {\n amount: changeAmount,\n blinding: changeNoteData.blinding,\n commitment: toHex(changeNoteData.commitment, { size: 32 }),\n ownerSecret: toHex(changeNoteData.ownerSecret, { size: 32 }),\n ownerHash: toHex(changeNoteData.ownerHash, { size: 32 }),\n leafIndex: 0,\n origin: note.origin,\n token: note.token,\n status: 'confirmed',\n proofSystem,\n timestamp: Date.now(),\n }\n\n return {\n proof: formattedProof,\n nullifier: toHex(BigInt(circuitInputs.nullifier), { size: 32 }),\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n token: note.token as Address,\n outputCommitment1: toHex(exactNoteData.commitment, { size: 32 }),\n outputCommitment2: toHex(changeNoteData.commitment, { size: 32 }),\n encryptedNote1: packNote(exactNoteData),\n encryptedNote2: packNote(changeNoteData),\n exactNote: exactShieldedNote,\n changeNote: changeShieldedNote,\n spentNote: note,\n exactNoteData,\n changeNoteData,\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n setError(error)\n throw error\n } finally {\n setIsPending(false)\n setStage(null)\n }\n },\n [isSetup, masterKeys, createNoteForSelf]\n )\n\n return {\n stage,\n isPending,\n error,\n buildNoteSplit,\n buildPlaceOrder,\n buildFillOrder,\n buildClaimOrder,\n buildCancelOrder,\n reset,\n }\n}\n\n// ============================================================================\n// Re-exports for convenience\n// ============================================================================\n\nexport {\n computeGiveAmount,\n computeTakeAmount,\n computeRate,\n computeFillPercentage,\n computeCancelKeyHash,\n generateCancelSecret,\n filterOrdersByASP,\n filterOrdersByTokenPair,\n isFillerASPAccepted,\n isOrderActive,\n RATE_PRECISION,\n}\n\nexport type {\n SwapOrder,\n SwapOrderEvent,\n SwapFillEvent,\n}\n"]}
|