{"version":3,"sources":["../../../src/core/bls/bls.manager.ts"],"names":["axios","ethers","bls"],"mappings":";;;;;;;;;;;AAWO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EAER,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAAwC;AAC5C,IAAA,MAAM,EAAE,SAAA,EAAW,gBAAA,GAAmB,GAAA,KAAS,IAAA,CAAK,MAAA;AAEpD,IAAA,KAAA,MAAW,gBAAgB,SAAA,EAAW;AACpC,MAAA,IAAI;AAEF,QAAA,MAAM,WAAW,MAAMA,sBAAA,CAAM,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,aAAA,CAAA,EAAiB;AAAA,UAC/D,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAC;AAGtC,QAAA,MAAM,cAAyB,KAAA,CAC5B,MAAA,CAAO,CAAC,CAAA,KAAW,EAAE,MAAA,KAAW,QAAA,IAAY,CAAA,CAAE,WAAA,IAAe,EAAE,SAAS,CAAA,CACxE,GAAA,CAAI,CAAC,GAAQ,KAAA,MAAmB;AAAA,UAC/B,OAAO,KAAA,GAAQ,CAAA;AAAA;AAAA,UACf,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAA,EAAQ,QAAA;AAAA,UACR,WAAW,CAAA,CAAE;AAAA,SACf,CAAE,CAAA;AAEJ,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,OAAO,WAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,IAAA,EAAgC;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAA,IAAW,CAAC,KAAK,WAAA,IAAe,CAAC,KAAK,qBAAA,EAAuB;AACrE,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,aAAA,GAAgBC,aAAA,CAAO,cAAA,CAAe,CAAC,SAAS,GAAG,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC9E,IAAA,MAAM,eAAeA,aAAA,CAAO,cAAA;AAAA,MAC1B,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,MACzC,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAOA,aAAA,CAAO,cAAA;AAAA,MACZ,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MACrD;AAAA,QACE,aAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,WAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAA,EAA+C;AACxE,IAAA,MAAM,eAAe,OAAO,OAAA,KAAY,WAAWA,aAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAAI,OAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,6CAAA;AAEZ,IAAA,MAAM,eAAA,GAAkB,MAAMC,qBAAA,CAAI,EAAA,CAAG,YAAY,YAAA,EAAc,EAAE,KAAK,CAAA;AACtE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,eAAe,CAAA;AAEvD,IAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAwB;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,GAAG,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAE9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA;AAE1E,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AACtB,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AACtB,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AACvB,IAAA,MAAA,CAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,WAAW,GAAA,EAAyB;AAC1C,IAAA,IAAI,IAAI,UAAA,CAAW,IAAI,GAAG,GAAA,GAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC3C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,0BAA0B,IAAA,EAAyC;AACjE,IAAA,MAAM,aAAA,GAAgBD,aAAA,CAAO,cAAA,CAAe,CAAC,SAAS,GAAG,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC9E,IAAA,MAAM,eAAeA,aAAA,CAAO,cAAA;AAAA,MAC1B,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,MACzC,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAOA,aAAA,CAAO,cAAA;AAAA,MACZ,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MAC/D;AAAA,QACE,MAAA;AAAA,QACA,IAAA,CAAK,aAAA;AAAA,QACL,aAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,0BAA0B,IAAA,EAAyC;AACjE,IAAA,MAAM,aAAA,GAAgBA,aAAA,CAAO,cAAA,CAAe,CAAC,SAAS,GAAG,CAAC,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC9E,IAAA,MAAM,eAAeA,aAAA,CAAO,cAAA;AAAA,MAC1B,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,MACzC,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAOA,aAAA,CAAO,cAAA;AAAA,MACZ,CAAC,UAAU,OAAA,EAAS,OAAA,EAAS,SAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MACxE;AAAA,QACE,MAAA;AAAA,QACA,IAAA,CAAK,aAAA;AAAA,QACL,aAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,qBAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,IAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,WAAW,MAAMD,sBAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,eAAA,CAAA,EAAmB;AAAA,MACtE;AAAA,KACD,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,SAAA;AAEnC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,CAAK,gBAAA,IAAoB,YAAA;AAEpD,IAAA,OAAO;AAAA,MACL,WAAW,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,GAAI,SAAA,GAAY,KAAK,SAAS,CAAA,CAAA;AAAA,MAClE,SAAA,EAAW,SAAS,IAAA,CAAK;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CAAoB,IAAA,EAAe,UAAA,EAAuC;AAC9E,IAAA,MAAM,WAAW,MAAMA,sBAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAC3E;AAAA,KACD,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,SAAA;AAC1B,IAAA,OAAO,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA;AAAA,EAC9C;AACF","file":"index.cjs","sourcesContent":["import axios from \"axios\";\nimport { ethers } from \"ethers\";\nimport { bls12_381 as bls } from \"@noble/curves/bls12-381.js\";\nimport {\n  BLSConfig,\n  BLSNode,\n  BLSSignatureData,\n  CumulativeT2SignatureData,\n  CumulativeT3SignatureData,\n} from \"./types\";\n\nexport class BLSManager {\n  private config: BLSConfig;\n\n  constructor(config: BLSConfig) {\n    this.config = config;\n  }\n\n  /**\n   * Discover available BLS nodes from seed nodes (Gossip network)\n   */\n  async getAvailableNodes(): Promise<BLSNode[]> {\n    const { seedNodes, discoveryTimeout = 5000 } = this.config;\n\n    for (const seedEndpoint of seedNodes) {\n      try {\n        // Try to get peers from gossip endpoint\n        const response = await axios.get(`${seedEndpoint}/gossip/peers`, {\n          timeout: discoveryTimeout,\n        });\n\n        const peers = response.data.peers || [];\n\n        // Filter active nodes with proper structure\n        const activeNodes: BLSNode[] = peers\n          .filter((p: any) => p.status === \"active\" && p.apiEndpoint && p.publicKey)\n          .map((p: any, index: number) => ({\n            index: index + 1, // 1-based index likely expected by contract if using bitmap\n            nodeId: p.nodeId,\n            nodeName: p.nodeName,\n            apiEndpoint: p.apiEndpoint,\n            status: \"active\",\n            publicKey: p.publicKey,\n          }));\n\n        if (activeNodes.length > 0) {\n          return activeNodes;\n        }\n      } catch {\n        // Try next seed node\n        continue;\n      }\n    }\n\n    return [];\n  }\n\n  /**\n   * Helper to pack the full signature for ERC-4337 UserOp\n   * Format: [nodeIdsLength][nodeIds...][blsSignature][messagePoint][aaSignature][messagePointSignature]\n   */\n  packSignature(data: BLSSignatureData): string {\n    if (!data.nodeIds || !data.aaSignature || !data.messagePointSignature) {\n      throw new Error(\"Missing required signature components\");\n    }\n\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.signature,\n        data.messagePoint,\n        data.aaSignature,\n        data.messagePointSignature,\n      ]\n    );\n  }\n\n  /**\n   * Calculate the MessagePoint G2 point for a given message (UserOpHash)\n   */\n  async generateMessagePoint(message: string | Uint8Array): Promise<string> {\n    const messageBytes = typeof message === \"string\" ? ethers.getBytes(message) : message;\n    const DST = \"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_\";\n\n    const messagePointBLS = await bls.G2.hashToCurve(messageBytes, { DST });\n    const messageG2EIP = this.encodeG2Point(messagePointBLS);\n\n    return \"0x\" + Buffer.from(messageG2EIP).toString(\"hex\");\n  }\n\n  /**\n   * Encode G2 Point to bytes for EIP-2537 format\n   */\n  private encodeG2Point(point: any): Uint8Array {\n    const result = new Uint8Array(256);\n    const affine = point.toAffine();\n\n    const x0Bytes = this.hexToBytes(affine.x.c0.toString(16).padStart(96, \"0\"));\n    const x1Bytes = this.hexToBytes(affine.x.c1.toString(16).padStart(96, \"0\"));\n    const y0Bytes = this.hexToBytes(affine.y.c0.toString(16).padStart(96, \"0\"));\n    const y1Bytes = this.hexToBytes(affine.y.c1.toString(16).padStart(96, \"0\"));\n\n    result.set(x0Bytes, 16);\n    result.set(x1Bytes, 80);\n    result.set(y0Bytes, 144);\n    result.set(y1Bytes, 208);\n    return result;\n  }\n\n  private hexToBytes(hex: string): Uint8Array {\n    if (hex.startsWith(\"0x\")) hex = hex.slice(2);\n    const bytes = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < hex.length; i += 2) {\n      bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n    }\n    return bytes;\n  }\n\n  /**\n   * Pack cumulative Tier 2 signature (algId 0x04): P256 + BLS.\n   *\n   * Format:\n   *   [algId=0x04 (1)] [P256 r (32)] [P256 s (32)]\n   *   [nodeIdsLength (32)] [nodeIds (N×32)]\n   *   [blsAggregateSig (256)] [messagePoint (256)]\n   *   [messagePointECDSA (65)]\n   */\n  packCumulativeT2Signature(data: CumulativeT2SignatureData): string {\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes1\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        \"0x04\",\n        data.p256Signature,\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.blsSignature,\n        data.messagePoint,\n        data.messagePointSignature,\n      ]\n    );\n  }\n\n  /**\n   * Pack cumulative Tier 3 signature (algId 0x05): P256 + BLS + Guardian.\n   *\n   * Format:\n   *   [algId=0x05 (1)] [P256 r (32)] [P256 s (32)]\n   *   [nodeIdsLength (32)] [nodeIds (N×32)]\n   *   [blsAggregateSig (256)] [messagePoint (256)]\n   *   [messagePointECDSA (65)] [guardianECDSA (65)]\n   */\n  packCumulativeT3Signature(data: CumulativeT3SignatureData): string {\n    const nodeIdsLength = ethers.solidityPacked([\"uint256\"], [data.nodeIds.length]);\n    const nodeIdsBytes = ethers.solidityPacked(\n      Array(data.nodeIds.length).fill(\"bytes32\"),\n      data.nodeIds\n    );\n\n    return ethers.solidityPacked(\n      [\"bytes1\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\", \"bytes\"],\n      [\n        \"0x05\",\n        data.p256Signature,\n        nodeIdsLength,\n        nodeIdsBytes,\n        data.blsSignature,\n        data.messagePoint,\n        data.messagePointSignature,\n        data.guardianSignature,\n      ]\n    );\n  }\n\n  /**\n   * Request signature from a single node\n   */\n  async requestNodeSignature(\n    node: BLSNode,\n    message: string\n  ): Promise<{ signature: string; publicKey: string }> {\n    const response = await axios.post(`${node.apiEndpoint}/signature/sign`, {\n      message,\n    });\n\n    const signatureEIP = response.data.signature;\n    // Prefer compact if available, logic copied from legacy service\n    const signature = response.data.signatureCompact || signatureEIP;\n\n    return {\n      signature: signature.startsWith(\"0x\") ? signature : `0x${signature}`,\n      publicKey: response.data.publicKey,\n    };\n  }\n\n  /**\n   * Request aggregation from a node\n   */\n  async aggregateSignatures(node: BLSNode, signatures: string[]): Promise<string> {\n    const response = await axios.post(`${node.apiEndpoint}/signature/aggregate`, {\n      signatures,\n    });\n\n    const sig = response.data.signature;\n    return sig.startsWith(\"0x\") ? sig : `0x${sig}`;\n  }\n}\n"]}