{"version":3,"sources":["../../src/react/use-asp.ts","../../src/react/use-asp-registry.ts","../../src/react/use-asp-tree-manager.ts","../../src/react/use-asp-membership.ts","../../src/react/use-asp-proof.ts","../../src/react/use-stark-asp-proof.ts"],"names":["useState","useCallback","loadPersonalASPId","ASP_REGISTRY_HUB_ABI","error","useEffect","useAccount","getAddress","fetchStarkASPProof"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\n/**\n * React hook for managing an ASP (Association Set Provider)\n *\n * Handles ASP registration, status tracking, and membership checking.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport { type Address, type PublicClient } from 'viem'\nimport { ASP_REGISTRY_HUB_ABI } from '../contracts/abi/ASPRegistryHub.js'\nimport { loadPersonalASPId } from '../providers/localStorage.js'\n\nexport interface UseASPConfig {\n  /** ASP Registry Hub contract address */\n  registryAddress: Address\n  /** viem PublicClient for reading chain data */\n  publicClient: PublicClient\n  /** User's wallet address */\n  userAddress?: Address\n}\n\nexport interface ASPStatus {\n  /** ASP ID (0 if not registered) */\n  aspId: bigint\n  /** Current on-chain root */\n  currentRoot: bigint\n  /** Whether the ASP is registered */\n  isRegistered: boolean\n}\n\nexport interface UseASPReturn {\n  /** Current ASP status */\n  aspStatus: ASPStatus | null\n  /** Whether loading initial state */\n  isLoading: boolean\n  /** Error from last operation */\n  error: Error | null\n  /** Get the ASP ID */\n  getASPId: () => bigint | null\n  /** Refresh ASP info from contract */\n  refresh: () => Promise<void>\n}\n\nexport function useASP(config: UseASPConfig): UseASPReturn {\n  const { registryAddress, publicClient, userAddress } = config\n\n  const [aspStatus, setAspStatus] = useState<ASPStatus | null>(null)\n  const [isLoading, setIsLoading] = useState(true)\n  const [error, setError] = useState<Error | null>(null)\n\n  const refresh = useCallback(async () => {\n    if (!userAddress || !publicClient) {\n      setAspStatus(null)\n      setIsLoading(false)\n      return\n    }\n\n    try {\n      setIsLoading(true)\n      setError(null)\n\n      const chainId = await publicClient.getChainId()\n      const storedAspId = loadPersonalASPId(chainId, userAddress)\n\n      if (storedAspId) {\n        const aspData = await publicClient.readContract({\n          address: registryAddress,\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          setAspStatus({\n            aspId: storedAspId,\n            currentRoot: aspData.currentRoot,\n            isRegistered: true,\n          })\n          setIsLoading(false)\n          return\n        }\n      }\n\n      // No stored ASP or invalid\n      setAspStatus({\n        aspId: 0n,\n        currentRoot: 0n,\n        isRegistered: false,\n      })\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err))\n      setError(error)\n      setAspStatus(null)\n    } finally {\n      setIsLoading(false)\n    }\n  }, [registryAddress, publicClient, userAddress])\n\n  useEffect(() => {\n    refresh()\n  }, [refresh])\n\n  const getASPId = useCallback((): bigint | null => {\n    return aspStatus?.isRegistered ? aspStatus.aspId : null\n  }, [aspStatus])\n\n  return {\n    aspStatus,\n    isLoading,\n    error,\n    getASPId,\n    refresh,\n  }\n}\n\n/**\n * Store a newly registered ASP ID\n */\nexport { storePersonalASPId } from '../providers/localStorage.js'\n","'use client'\n\n/**\n * React hook for querying the ASP Registry\n *\n * Fetches all registered ASPs from the on-chain registry.\n */\n\nimport { useState, useEffect } from 'react'\nimport { type Address, type PublicClient } from 'viem'\nimport { ASP_REGISTRY_HUB_ABI } from '../contracts/abi/ASPRegistryHub.js'\nimport type { ASPInfo } from '../core/types.js'\n\nexport interface UseASPRegistryConfig {\n  /** ASP Registry Hub contract address */\n  registryAddress: Address\n  /** viem PublicClient for reading chain data */\n  publicClient: PublicClient | undefined\n}\n\nexport interface UseASPRegistryReturn {\n  /** All registered ASPs */\n  asps: ASPInfo[]\n  /** Whether loading */\n  isLoading: boolean\n  /** Error from last fetch */\n  error: Error | null\n  /** Refresh the list */\n  refresh: () => Promise<void>\n}\n\nexport function useASPRegistry(config: UseASPRegistryConfig): UseASPRegistryReturn {\n  const { registryAddress, publicClient } = config\n  const [asps, setAsps] = useState<ASPInfo[]>([])\n  const [isLoading, setIsLoading] = useState(true)\n  const [error, setError] = useState<Error | null>(null)\n\n  const fetchASPs = async () => {\n    if (!publicClient || !registryAddress) {\n      setIsLoading(false)\n      return\n    }\n\n    try {\n      setIsLoading(true)\n      setError(null)\n\n      const nextASPId = await publicClient.readContract({\n        address: registryAddress,\n        abi: ASP_REGISTRY_HUB_ABI,\n        functionName: 'nextASPId',\n      }) as bigint\n\n      const count = Number(nextASPId)\n      if (count <= 1) {\n        setAsps([])\n        setIsLoading(false)\n        return\n      }\n\n      const results: ASPInfo[] = []\n      for (let i = 1; i < count; i++) {\n        const data = await publicClient.readContract({\n          address: registryAddress,\n          abi: ASP_REGISTRY_HUB_ABI,\n          functionName: 'getASP',\n          args: [BigInt(i)],\n        }) as { id: bigint; operator: Address; name: string; currentRoot: bigint; lastUpdated: bigint }\n\n        if (data.operator !== '0x0000000000000000000000000000000000000000') {\n          results.push({\n            id: data.id,\n            operator: data.operator,\n            name: data.name,\n            currentRoot: data.currentRoot,\n            lastUpdated: data.lastUpdated,\n          })\n        }\n      }\n      setAsps(results)\n    } catch (err) {\n      const e = err instanceof Error ? err : new Error(String(err))\n      setError(e)\n    } finally {\n      setIsLoading(false)\n    }\n  }\n\n  useEffect(() => {\n    fetchASPs()\n  }, [publicClient, registryAddress])\n\n  return { asps, isLoading, error, refresh: fetchASPs }\n}\n","'use client'\n\n/**\n * React hook for managing an ASP tree\n *\n * Wraps a provider with React state management.\n * Handles adding/removing members and publishing roots.\n */\n\nimport { useState, useCallback, useEffect } from 'react'\nimport type { IASPProvider } from '../core/types.js'\nimport { ASP_REGISTRY_HUB_ABI } from '../contracts/abi/ASPRegistryHub.js'\n\nexport interface UseASPTreeManagerConfig {\n  /** Provider instance for member storage */\n  provider: IASPProvider\n  /** ASP Registry Hub address (for publishing roots) */\n  registryAddress?: `0x${string}`\n  /** ASP ID (for publishing roots) */\n  aspId?: bigint\n}\n\nexport interface UseASPTreeManagerReturn {\n  /** Current members */\n  members: bigint[]\n  /** Current root */\n  root: bigint\n  /** Whether loading */\n  isLoading: boolean\n  /** Add a member */\n  addMember: (identity: bigint) => Promise<void>\n  /** Remove a member */\n  removeMember: (identity: bigint) => Promise<void>\n  /** Publish root on-chain */\n  publishRoot: (walletClient: any) => Promise<`0x${string}`>\n  /** Refresh state from provider */\n  refresh: () => Promise<void>\n}\n\nexport function useASPTreeManager(config: UseASPTreeManagerConfig): UseASPTreeManagerReturn {\n  const { provider, registryAddress, aspId } = config\n\n  const [members, setMembers] = useState<bigint[]>([])\n  const [root, setRoot] = useState<bigint>(0n)\n  const [isLoading, setIsLoading] = useState(true)\n\n  const refresh = useCallback(async () => {\n    setIsLoading(true)\n    try {\n      const [m, r] = await Promise.all([\n        provider.getMembers(),\n        provider.getRoot(),\n      ])\n      setMembers(m)\n      setRoot(r)\n    } finally {\n      setIsLoading(false)\n    }\n  }, [provider])\n\n  useEffect(() => {\n    refresh()\n  }, [refresh])\n\n  const addMember = useCallback(async (identity: bigint) => {\n    await provider.addMember(identity)\n    await refresh()\n  }, [provider, refresh])\n\n  const removeMember = useCallback(async (identity: bigint) => {\n    await provider.removeMember(identity)\n    await refresh()\n  }, [provider, refresh])\n\n  const publishRoot = useCallback(async (walletClient: any): Promise<`0x${string}`> => {\n    if (!registryAddress || !aspId) {\n      throw new Error('registryAddress and aspId required to publish root')\n    }\n\n    const currentRoot = await provider.getRoot()\n\n    const hash = await walletClient.writeContract({\n      address: registryAddress,\n      abi: ASP_REGISTRY_HUB_ABI,\n      functionName: 'updateRoot',\n      args: [aspId, currentRoot],\n    })\n\n    return hash as `0x${string}`\n  }, [provider, registryAddress, aspId])\n\n  return {\n    members,\n    root,\n    isLoading,\n    addMember,\n    removeMember,\n    publishRoot,\n    refresh,\n  }\n}\n","'use client'\n\n/**\n * React hook for checking ASP membership status.\n *\n * Queries the ASP service's /status/:address endpoint (public, rate-limited)\n * and the global /status endpoint for aggregate stats.\n *\n * Usage:\n *   const { status, memberCount, refresh } = useASPMembership({\n *     serviceUrl: 'https://asp-whitelist.upd.io',\n *   })\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useAccount } from 'wagmi'\nimport type { ASPAddressStatus } from '../asp/api-schema.js'\n\nexport type ASPMembershipStatus =\n  | 'loading'\n  | 'whitelisted'\n  | 'pending'\n  | 'blocked'\n  | 'not-whitelisted'\n  | 'no-service'\n  | 'error'\n\nexport interface UseASPMembershipConfig {\n  /** ASP service base URL (e.g., 'https://asp-whitelist.upd.io') */\n  serviceUrl: string | undefined\n}\n\nexport interface UseASPMembershipReturn {\n  /** Current membership status */\n  status: ASPMembershipStatus\n  /** Total whitelisted member count (from global /status) */\n  memberCount: number | null\n  /** Error message (if status === 'error') */\n  error: string | null\n  /** Refresh the status */\n  refresh: () => Promise<void>\n}\n\nfunction mapAddressStatus(aspStatus: ASPAddressStatus): ASPMembershipStatus {\n  switch (aspStatus) {\n    case 'whitelisted': return 'whitelisted'\n    case 'pending': return 'pending'\n    case 'blocked': return 'blocked'\n    case 'unknown': return 'not-whitelisted'\n  }\n}\n\nexport function useASPMembership(config: UseASPMembershipConfig): UseASPMembershipReturn {\n  const { serviceUrl } = config\n  const { address } = useAccount()\n\n  const [status, setStatus] = useState<ASPMembershipStatus>('loading')\n  const [memberCount, setMemberCount] = useState<number | null>(null)\n  const [error, setError] = useState<string | null>(null)\n\n  const refresh = useCallback(async () => {\n    if (!serviceUrl) {\n      setStatus('no-service')\n      return\n    }\n\n    if (!address) {\n      setStatus('loading')\n      return\n    }\n\n    try {\n      setStatus('loading')\n      setError(null)\n\n      // Per-address status (public, rate-limited)\n      const statusRes = await fetch(`${serviceUrl}/status/${address}`)\n\n      if (statusRes.ok) {\n        const data = await statusRes.json() as { status: ASPAddressStatus }\n        setStatus(mapAddressStatus(data.status))\n      } else if (statusRes.status === 429) {\n        setStatus('error')\n        setError('Rate limit exceeded — try again shortly')\n      } else {\n        setStatus('error')\n        setError(`ASP returned ${statusRes.status}`)\n      }\n\n      // Global stats (non-critical)\n      try {\n        const globalRes = await fetch(`${serviceUrl}/status`)\n        if (globalRes.ok) {\n          const data = await globalRes.json()\n          setMemberCount(data.memberCount ?? null)\n        }\n      } catch {\n        // Non-critical\n      }\n    } catch (err) {\n      setStatus('error')\n      setError(err instanceof Error ? err.message : 'Failed to reach ASP service')\n    }\n  }, [serviceUrl, address])\n\n  useEffect(() => {\n    refresh()\n  }, [refresh])\n\n  return { status, memberCount, error, refresh }\n}\n","'use client'\n\n/**\n * React hook for fetching ASP membership proofs.\n *\n * The /proof/:address endpoint is public (rate-limited). Any wallet can\n * fetch a proof for any whitelisted address — this is required because\n * the note's origin may differ from the connected wallet (e.g., received\n * notes preserve the original depositor's origin).\n *\n * Usage:\n *   const { fetchProof, proof, isLoading } = useASPProof({\n *     serviceUrl: 'https://asp-whitelist.upd.io',\n *     aspId: 4n,\n *   })\n */\n\nimport { useState, useCallback } from 'react'\nimport { getAddress } from 'viem'\n\nexport interface ASPProofData {\n  /** ASP ID (on-chain identifier) */\n  aspId: bigint\n  /** Merkle root */\n  root: bigint\n  /** Path elements (siblings) */\n  pathElements: bigint[]\n  /** Path indices */\n  pathIndices: number[]\n}\n\nexport interface UseASPProofConfig {\n  /** ASP service base URL */\n  serviceUrl: string | undefined\n  /** ASP ID (on-chain identifier) */\n  aspId: bigint | undefined\n}\n\nexport interface UseASPProofReturn {\n  /** Fetch the proof for a given address */\n  fetchProof: (addressOverride?: string) => Promise<ASPProofData | null>\n  /** Last fetched proof */\n  proof: ASPProofData | null\n  /** Whether currently fetching */\n  isLoading: boolean\n  /** Error from last fetch */\n  error: string | null\n}\n\nexport function useASPProof(config: UseASPProofConfig): UseASPProofReturn {\n  const { serviceUrl, aspId } = config\n\n  const [proof, setProof] = useState<ASPProofData | null>(null)\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n\n  const fetchProof = useCallback(async (addressOverride?: string): Promise<ASPProofData | null> => {\n    if (!serviceUrl || !addressOverride || aspId === undefined) {\n      setError('No ASP service configured or no address provided')\n      return null\n    }\n\n    try {\n      setIsLoading(true)\n      setError(null)\n\n      const checksummed = getAddress(addressOverride)\n\n      // Public endpoint — no signature needed, just fetch\n      const res = await fetch(`${serviceUrl}/proof/${checksummed}`)\n\n      if (!res.ok) {\n        if (res.status === 404) {\n          setError('Address not whitelisted in ASP')\n        } else if (res.status === 429) {\n          setError('Rate limit exceeded — try again in a moment')\n        } else {\n          const body = await res.json().catch(() => ({}))\n          setError(body.error || `ASP returned ${res.status}`)\n        }\n        setProof(null)\n        return null\n      }\n\n      const data = await res.json() as {\n        root: string\n        pathElements: string[]\n        pathIndices: number[]\n      }\n\n      const proofData: ASPProofData = {\n        aspId,\n        root: BigInt(data.root),\n        pathElements: data.pathElements.map((e: string) => BigInt(e)),\n        pathIndices: data.pathIndices,\n      }\n\n      setProof(proofData)\n      return proofData\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : 'Failed to fetch proof'\n      setError(msg)\n      setProof(null)\n      return null\n    } finally {\n      setIsLoading(false)\n    }\n  }, [serviceUrl, aspId])\n\n  return { fetchProof, proof, isLoading, error }\n}\n","'use client'\n\n/**\n * React hook for fetching STARK-side ASP membership proofs.\n *\n * Parallel to `useASPProof` (BLS side). The two are intentionally\n * separate hooks because the proof shapes differ — the STARK side\n * uses an always-hash, fixed-depth tree (AlwaysHashMerkleTree) and\n * its proof carries leaf, leafIndex, and depth fields the BLS proof\n * doesn't.\n *\n * Usage:\n *   const { fetchProof, proof, isLoading, error } = useStarkASPProof({\n *     serviceUrl: 'https://asp-whitelist.upd.io',\n *     aspId: 4n,\n *   })\n *   const p = await fetchProof('0x5AD2...053E')\n *   // p: { aspId, root, leaf, leafIndex, depth, pathElements, pathIndices }\n *\n * Like useASPProof, the /stark-proof endpoint is public (rate-limited).\n * Any wallet may need a proof for an address it doesn't control —\n * received notes preserve the original depositor's origin, and the\n * STARK transfer/withdraw circuits bind to the origin's ASP membership,\n * not the spender's.\n */\n\nimport { useState, useCallback } from 'react'\nimport { getAddress } from 'viem'\nimport { fetchStarkASPProof } from '../asp/fetch-helpers.js'\n\nexport interface StarkASPProofData {\n  /** ASP ID (on-chain identifier) */\n  aspId: bigint\n  /** STARK tree root */\n  root: bigint\n  /** Leaf value (M31-encoded address) */\n  leaf: bigint\n  /** Index of the leaf in insertion order */\n  leafIndex: number\n  /** Tree depth (fixed across every proof in this tree) */\n  depth: number\n  /** Sibling at each level; length === depth */\n  pathElements: bigint[]\n  /** Side bit at each level (0 or 1); length === depth */\n  pathIndices: number[]\n}\n\nexport interface UseStarkASPProofConfig {\n  /** ASP service base URL */\n  serviceUrl: string | undefined\n  /** ASP ID (on-chain identifier) */\n  aspId: bigint | undefined\n}\n\nexport interface UseStarkASPProofReturn {\n  /** Fetch the STARK proof for a given address */\n  fetchProof: (addressOverride?: string) => Promise<StarkASPProofData | null>\n  /** Last fetched proof */\n  proof: StarkASPProofData | null\n  /** Whether currently fetching */\n  isLoading: boolean\n  /** Error from last fetch */\n  error: string | null\n}\n\nexport function useStarkASPProof(config: UseStarkASPProofConfig): UseStarkASPProofReturn {\n  const { serviceUrl, aspId } = config\n\n  const [proof, setProof] = useState<StarkASPProofData | null>(null)\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n\n  const fetchProof = useCallback(async (\n    addressOverride?: string\n  ): Promise<StarkASPProofData | null> => {\n    if (!serviceUrl || !addressOverride || aspId === undefined) {\n      setError('No ASP service configured or no address provided')\n      return null\n    }\n\n    try {\n      setIsLoading(true)\n      setError(null)\n\n      const checksummed = getAddress(addressOverride)\n      const fetched = await fetchStarkASPProof(serviceUrl, checksummed)\n\n      if (fetched === null) {\n        setError('Address not whitelisted in ASP')\n        setProof(null)\n        return null\n      }\n\n      const proofData: StarkASPProofData = { aspId, ...fetched }\n      setProof(proofData)\n      return proofData\n    } catch (err) {\n      // The helper's error message tags the URL + status, so consumers\n      // can distinguish 429 (rate-limit) from 5xx without parsing the\n      // status separately. Surface it verbatim.\n      const msg = err instanceof Error ? err.message : 'Failed to fetch STARK proof'\n      setError(msg)\n      setProof(null)\n      return null\n    } finally {\n      setIsLoading(false)\n    }\n  }, [serviceUrl, aspId])\n\n  return { fetchProof, proof, isLoading, error }\n}\n"]}