{"version":3,"sources":["../src/providers/localStorage.ts"],"names":["DEFAULT_TREE_DEPTH","MerkleTree"],"mappings":";;;;;AAuBO,IAAM,uBAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,cAAA;AAAA,EACP,SAAA;AAAA,EACQ,UAAA;AAAA,EAEjB,YAAY,MAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAaA,oCAAA;AACrC,IAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAa,eAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,GAAG,MAAM,CAAA,EAAG,OAAO,OAAO,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,UAAU,QAAA,EAAiC;AAC/C,IAAA,IAAI,QAAA,KAAa,EAAA,EAAI,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AACrB,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAAA,EAEA,MAAM,aAAa,QAAA,EAAiC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AACnD,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB;AAAA,EAEA,MAAM,UAAA,GAAgC;AACpC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAAA,EAAoC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,OAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACjC,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe,QAAA,EAAwC;AAC3D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACnC,IAAA,IAAI,KAAA,KAAU,EAAA,EAAI,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEQ,KAAK,OAAA,EAAyB;AACpC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AAChD,MAAA,YAAA,CAAa,QAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,UAAU,OAAA,EAA+B;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAIC,4BAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAC1C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,IAAM,aAAA,GAAgB,mBAAA;AAKf,SAAS,kBAAA,CACd,OAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,GAAG,aAAa,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA;AAC/D,IAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAKO,SAAS,iBAAA,CACd,SACA,OAAA,EACe;AACf,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,GAAG,aAAa,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,OAAO,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-NJ3N6FLH.cjs","sourcesContent":["/**\n * LocalStorage Provider\n *\n * Browser localStorage-based ASP member storage.\n * Data persists across page reloads. Use for browser demos.\n *\n * Extracted from zkdemo-app/lib/asp-tree-store.ts.\n */\n\nimport { MerkleTree, DEFAULT_TREE_DEPTH } from '../core/tree.js'\nimport type { IASPProvider, MerkleProof } from '../core/types.js'\n\nexport interface LocalStorageProviderConfig {\n  /** Chain ID for namespacing */\n  chainId: number\n  /** ASP ID for namespacing */\n  aspId: bigint\n  /** Merkle tree depth (default: 20) */\n  treeDepth?: number\n  /** Custom storage key prefix (default: 'upc_asp_tree_') */\n  keyPrefix?: string\n}\n\nexport class LocalStorageProvider implements IASPProvider {\n  readonly name = 'LocalStorage'\n  readonly treeDepth: number\n  private readonly storageKey: string\n\n  constructor(config: LocalStorageProviderConfig) {\n    this.treeDepth = config.treeDepth ?? DEFAULT_TREE_DEPTH\n    const prefix = config.keyPrefix ?? 'upc_asp_tree_'\n    this.storageKey = `${prefix}${config.chainId}_${config.aspId}`\n  }\n\n  async addMember(identity: bigint): Promise<void> {\n    if (identity === 0n) throw new Error('Identity cannot be zero')\n    const members = await this.getMembers()\n    if (members.includes(identity)) return // idempotent\n    members.push(identity)\n    this.save(members)\n  }\n\n  async removeMember(identity: bigint): Promise<void> {\n    const members = await this.getMembers()\n    const filtered = members.filter(m => m !== identity)\n    this.save(filtered)\n  }\n\n  async getMembers(): Promise<bigint[]> {\n    if (typeof window === 'undefined') return []\n    try {\n      const raw = localStorage.getItem(this.storageKey)\n      if (!raw) return []\n      const parsed = JSON.parse(raw) as string[]\n      return parsed.map(s => BigInt(s))\n    } catch {\n      return []\n    }\n  }\n\n  async hasMember(identity: bigint): Promise<boolean> {\n    const members = await this.getMembers()\n    return members.includes(identity)\n  }\n\n  async getRoot(): Promise<bigint> {\n    const members = await this.getMembers()\n    if (members.length === 0) return 0n\n    if (members.length === 1) return members[0]!\n    const tree = this.buildTree(members)\n    return tree.getRoot()\n  }\n\n  async getMerkleProof(identity: bigint): Promise<MerkleProof> {\n    const members = await this.getMembers()\n    const tree = this.buildTree(members)\n    const index = tree.indexOf(identity)\n    if (index === -1) throw new Error('Identity not found in tree')\n    return tree.getProof(index)\n  }\n\n  private save(members: bigint[]): void {\n    if (typeof window === 'undefined') return\n    try {\n      const serialized = members.map(m => m.toString())\n      localStorage.setItem(this.storageKey, JSON.stringify(serialized))\n    } catch {\n      // Ignore storage errors (quota exceeded, etc.)\n    }\n  }\n\n  private buildTree(members: bigint[]): MerkleTree {\n    const tree = new MerkleTree(this.treeDepth)\n    for (const m of members) {\n      tree.insert(m)\n    }\n    return tree\n  }\n}\n\n// ============================================================================\n// Convenience functions for personal ASP ID storage\n// ============================================================================\n\nconst ASP_ID_PREFIX = 'upc_personal_asp_'\n\n/**\n * Store a personal ASP ID in localStorage\n */\nexport function storePersonalASPId(\n  chainId: number,\n  address: string,\n  aspId: bigint\n): void {\n  if (typeof window === 'undefined') return\n  try {\n    const key = `${ASP_ID_PREFIX}${chainId}_${address.toLowerCase()}`\n    localStorage.setItem(key, aspId.toString())\n  } catch {\n    // Ignore storage errors\n  }\n}\n\n/**\n * Load a stored personal ASP ID from localStorage\n */\nexport function loadPersonalASPId(\n  chainId: number,\n  address: string\n): bigint | null {\n  if (typeof window === 'undefined') return null\n  try {\n    const key = `${ASP_ID_PREFIX}${chainId}_${address.toLowerCase()}`\n    const stored = localStorage.getItem(key)\n    return stored ? BigInt(stored) : null\n  } catch {\n    return null\n  }\n}\n"]}