@permissionless-technologies/upp-sdk 0.3.6 → 0.4.0

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.
Files changed (140) hide show
  1. package/dist/{asp-ZA3RGN7G.js → asp-72WUGTQE.js} +3 -3
  2. package/dist/asp-72WUGTQE.js.map +1 -0
  3. package/dist/{asp-TXSAFFD3.cjs → asp-CUE3NMBN.cjs} +14 -14
  4. package/dist/asp-CUE3NMBN.cjs.map +1 -0
  5. package/dist/{chunk-KXPZUBPI.cjs → chunk-23B5XSS4.cjs} +12 -12
  6. package/dist/{chunk-KXPZUBPI.cjs.map → chunk-23B5XSS4.cjs.map} +1 -1
  7. package/dist/{chunk-SQKBT2SH.cjs → chunk-2G22R7AJ.cjs} +18 -7
  8. package/dist/chunk-2G22R7AJ.cjs.map +1 -0
  9. package/dist/chunk-5QSSX3KR.js +64 -0
  10. package/dist/chunk-5QSSX3KR.js.map +1 -0
  11. package/dist/{chunk-P37MRZ73.js → chunk-6IEYWJVS.js} +8 -8
  12. package/dist/chunk-6IEYWJVS.js.map +1 -0
  13. package/dist/{chunk-5V5HSN6Y.js → chunk-6TFDBBAQ.js} +3 -3
  14. package/dist/{chunk-5V5HSN6Y.js.map → chunk-6TFDBBAQ.js.map} +1 -1
  15. package/dist/{chunk-ZKZV6OI3.cjs → chunk-7BNJV2ZS.cjs} +21 -21
  16. package/dist/{chunk-ZKZV6OI3.cjs.map → chunk-7BNJV2ZS.cjs.map} +1 -1
  17. package/dist/{chunk-XBNYAAMU.js → chunk-7T4CUE6E.js} +3 -3
  18. package/dist/{chunk-XBNYAAMU.js.map → chunk-7T4CUE6E.js.map} +1 -1
  19. package/dist/{chunk-OD2SDC4L.js → chunk-CEJN5ZE5.js} +3 -3
  20. package/dist/{chunk-OD2SDC4L.js.map → chunk-CEJN5ZE5.js.map} +1 -1
  21. package/dist/{chunk-2JQISXBD.js → chunk-DTEAFJG7.js} +8 -8
  22. package/dist/{chunk-2JQISXBD.js.map → chunk-DTEAFJG7.js.map} +1 -1
  23. package/dist/chunk-EHGH6TAW.js +100 -0
  24. package/dist/chunk-EHGH6TAW.js.map +1 -0
  25. package/dist/{chunk-ZU6J7KMY.js → chunk-GPF72JFR.js} +3 -3
  26. package/dist/{chunk-ZU6J7KMY.js.map → chunk-GPF72JFR.js.map} +1 -1
  27. package/dist/chunk-HEHXSV47.cjs +77 -0
  28. package/dist/chunk-HEHXSV47.cjs.map +1 -0
  29. package/dist/chunk-I5EKGD4P.cjs +113 -0
  30. package/dist/chunk-I5EKGD4P.cjs.map +1 -0
  31. package/dist/{chunk-EUP7MBAH.cjs → chunk-IIUKM5VE.cjs} +7 -7
  32. package/dist/{chunk-EUP7MBAH.cjs.map → chunk-IIUKM5VE.cjs.map} +1 -1
  33. package/dist/{chunk-CWSUBAV3.js → chunk-OBBSIPEK.js} +30 -35
  34. package/dist/chunk-OBBSIPEK.js.map +1 -0
  35. package/dist/{chunk-FVT2XRRL.cjs → chunk-Q2E432UK.cjs} +41 -46
  36. package/dist/chunk-Q2E432UK.cjs.map +1 -0
  37. package/dist/{chunk-QKI4QWLT.js → chunk-RNUG3EFC.js} +6 -6
  38. package/dist/{chunk-QKI4QWLT.js.map → chunk-RNUG3EFC.js.map} +1 -1
  39. package/dist/{chunk-3YZSIYJC.cjs → chunk-SWTNJPK5.cjs} +11 -11
  40. package/dist/{chunk-3YZSIYJC.cjs.map → chunk-SWTNJPK5.cjs.map} +1 -1
  41. package/dist/{chunk-BH24DZ5S.cjs → chunk-U3YFYMWF.cjs} +5 -5
  42. package/dist/{chunk-BH24DZ5S.cjs.map → chunk-U3YFYMWF.cjs.map} +1 -1
  43. package/dist/{chunk-3HQ7A6ZM.cjs → chunk-UFEDJJSH.cjs} +5 -5
  44. package/dist/{chunk-3HQ7A6ZM.cjs.map → chunk-UFEDJJSH.cjs.map} +1 -1
  45. package/dist/{chunk-W77GRBO4.js → chunk-UQIM2KT3.js} +3 -3
  46. package/dist/{chunk-W77GRBO4.js.map → chunk-UQIM2KT3.js.map} +1 -1
  47. package/dist/{chunk-SJDPDHSD.cjs → chunk-UTAJSERA.cjs} +4 -4
  48. package/dist/{chunk-SJDPDHSD.cjs.map → chunk-UTAJSERA.cjs.map} +1 -1
  49. package/dist/{chunk-NI62M3W3.cjs → chunk-UYE2JASE.cjs} +2 -2
  50. package/dist/{chunk-NI62M3W3.cjs.map → chunk-UYE2JASE.cjs.map} +1 -1
  51. package/dist/{chunk-S4B7GYLN.js → chunk-W3HLIKC2.js} +18 -8
  52. package/dist/chunk-W3HLIKC2.js.map +1 -0
  53. package/dist/{chunk-NDM5EJEV.cjs → chunk-XVIICZKW.cjs} +7 -7
  54. package/dist/chunk-XVIICZKW.cjs.map +1 -0
  55. package/dist/{chunk-7Q4RSSHM.js → chunk-ZTVXII74.js} +2 -2
  56. package/dist/{chunk-7Q4RSSHM.js.map → chunk-ZTVXII74.js.map} +1 -1
  57. package/dist/core/index.cjs +85 -85
  58. package/dist/core/index.d.cts +2 -2
  59. package/dist/core/index.d.ts +2 -2
  60. package/dist/core/index.js +10 -10
  61. package/dist/{index-B45-okum.d.cts → index-BgPdYxFS.d.cts} +18 -18
  62. package/dist/{index-o-Ds3YAq.d.cts → index-CL4vb3ej.d.cts} +1 -1
  63. package/dist/{index-BIcvNMPt.d.ts → index-CtcXgof_.d.ts} +18 -18
  64. package/dist/{index-DwAJBoU7.d.ts → index-D6nvfm59.d.ts} +1 -1
  65. package/dist/index.cjs +265 -266
  66. package/dist/index.cjs.map +1 -1
  67. package/dist/index.d.cts +3 -3
  68. package/dist/index.d.ts +3 -3
  69. package/dist/index.js +29 -30
  70. package/dist/index.js.map +1 -1
  71. package/dist/indexer/index.cjs +6 -6
  72. package/dist/indexer/index.d.cts +5 -5
  73. package/dist/indexer/index.d.ts +5 -5
  74. package/dist/indexer/index.js +1 -1
  75. package/dist/keys/index.cjs +18 -18
  76. package/dist/keys/index.js +4 -4
  77. package/dist/merkle-DZHEOPH3.cjs +30 -0
  78. package/dist/{merkle-HGDC6OB4.cjs.map → merkle-DZHEOPH3.cjs.map} +1 -1
  79. package/dist/merkle-IF2RMWCF.js +5 -0
  80. package/dist/{merkle-7KS2EHRF.js.map → merkle-IF2RMWCF.js.map} +1 -1
  81. package/dist/poseidon-ACM7E2OH.js +7 -0
  82. package/dist/{poseidon-UHTJLWQM.js.map → poseidon-ACM7E2OH.js.map} +1 -1
  83. package/dist/poseidon-PUSGUIVZ.cjs +61 -0
  84. package/dist/{poseidon-WHJSZSNP.cjs.map → poseidon-PUSGUIVZ.cjs.map} +1 -1
  85. package/dist/proof-JME3IZTX.js +4 -0
  86. package/dist/{proof-C4YBP6RY.js.map → proof-JME3IZTX.js.map} +1 -1
  87. package/dist/proof-XR6XE5PJ.cjs +49 -0
  88. package/dist/{proof-5OECB3RQ.cjs.map → proof-XR6XE5PJ.cjs.map} +1 -1
  89. package/dist/react/index.cjs +47 -51
  90. package/dist/react/index.cjs.map +1 -1
  91. package/dist/react/index.d.cts +2 -2
  92. package/dist/react/index.d.ts +2 -2
  93. package/dist/react/index.js +20 -24
  94. package/dist/react/index.js.map +1 -1
  95. package/dist/{transfer-BzyernBd.d.cts → transfer-D111ihqN.d.cts} +108 -56
  96. package/dist/{transfer-sqS6mJko.d.ts → transfer-DvIXqHCr.d.ts} +108 -56
  97. package/dist/transfer-MQMGSXTH.js +8 -0
  98. package/dist/{transfer-F6YOQTUL.js.map → transfer-MQMGSXTH.js.map} +1 -1
  99. package/dist/transfer-PB6D5VCW.cjs +37 -0
  100. package/dist/{transfer-42C4DXYA.cjs.map → transfer-PB6D5VCW.cjs.map} +1 -1
  101. package/dist/utils/index.cjs +60 -61
  102. package/dist/utils/index.d.cts +37 -14
  103. package/dist/utils/index.d.ts +37 -14
  104. package/dist/utils/index.js +6 -7
  105. package/package.json +4 -2
  106. package/src/contracts/interfaces/IUniversalPrivatePool.sol +10 -8
  107. package/src/contracts/interfaces/IVerifiers.sol +16 -52
  108. package/src/deployments/11155111.json +15 -12
  109. package/dist/asp-TXSAFFD3.cjs.map +0 -1
  110. package/dist/asp-ZA3RGN7G.js.map +0 -1
  111. package/dist/babyjubjub-2MGQVCKB.js +0 -5
  112. package/dist/babyjubjub-2MGQVCKB.js.map +0 -1
  113. package/dist/babyjubjub-MWZLJOVZ.cjs +0 -66
  114. package/dist/babyjubjub-MWZLJOVZ.cjs.map +0 -1
  115. package/dist/chunk-CWSUBAV3.js.map +0 -1
  116. package/dist/chunk-FVT2XRRL.cjs.map +0 -1
  117. package/dist/chunk-JWNXBALH.cjs +0 -57
  118. package/dist/chunk-JWNXBALH.cjs.map +0 -1
  119. package/dist/chunk-NDM5EJEV.cjs.map +0 -1
  120. package/dist/chunk-P37MRZ73.js.map +0 -1
  121. package/dist/chunk-PTDVGWHU.cjs +0 -10
  122. package/dist/chunk-PTDVGWHU.cjs.map +0 -1
  123. package/dist/chunk-S4B7GYLN.js.map +0 -1
  124. package/dist/chunk-SQKBT2SH.cjs.map +0 -1
  125. package/dist/chunk-TSF6HEVS.cjs +0 -201
  126. package/dist/chunk-TSF6HEVS.cjs.map +0 -1
  127. package/dist/chunk-UAVWYXDN.js +0 -8
  128. package/dist/chunk-UAVWYXDN.js.map +0 -1
  129. package/dist/chunk-V23OSL25.js +0 -48
  130. package/dist/chunk-V23OSL25.js.map +0 -1
  131. package/dist/chunk-YOWDERVC.js +0 -186
  132. package/dist/chunk-YOWDERVC.js.map +0 -1
  133. package/dist/merkle-7KS2EHRF.js +0 -5
  134. package/dist/merkle-HGDC6OB4.cjs +0 -30
  135. package/dist/poseidon-UHTJLWQM.js +0 -7
  136. package/dist/poseidon-WHJSZSNP.cjs +0 -45
  137. package/dist/proof-5OECB3RQ.cjs +0 -45
  138. package/dist/proof-C4YBP6RY.js +0 -4
  139. package/dist/transfer-42C4DXYA.cjs +0 -37
  140. package/dist/transfer-F6YOQTUL.js +0 -8
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkJWNXBALH_cjs = require('./chunk-JWNXBALH.cjs');
3
+ var chunkHEHXSV47_cjs = require('./chunk-HEHXSV47.cjs');
4
4
 
5
5
  // src/utils/merkle.ts
6
- chunkJWNXBALH_cjs.init_poseidon();
6
+ chunkHEHXSV47_cjs.init_poseidon();
7
7
  var MAX_TREE_DEPTH = 32;
8
8
  var MerkleTree = class {
9
9
  leaves = [];
@@ -112,7 +112,7 @@ var MerkleTree = class {
112
112
  } else if (rightChild === 0n) {
113
113
  hash = leftChild;
114
114
  } else {
115
- hash = await chunkJWNXBALH_cjs.poseidon([leftChild, rightChild]);
115
+ hash = await chunkHEHXSV47_cjs.poseidon([leftChild, rightChild]);
116
116
  }
117
117
  }
118
118
  this.nodes.set(key, hash);
@@ -148,9 +148,9 @@ async function verifyMerkleProof(leaf, proof) {
148
148
  continue;
149
149
  }
150
150
  if (isLeft) {
151
- current = await chunkJWNXBALH_cjs.poseidon([current, sibling]);
151
+ current = await chunkHEHXSV47_cjs.poseidon([current, sibling]);
152
152
  } else {
153
- current = await chunkJWNXBALH_cjs.poseidon([sibling, current]);
153
+ current = await chunkHEHXSV47_cjs.poseidon([sibling, current]);
154
154
  }
155
155
  }
156
156
  return current === proof.root;
@@ -161,5 +161,5 @@ exports.MerkleTree = MerkleTree;
161
161
  exports.buildMerkleTree = buildMerkleTree;
162
162
  exports.getMerkleProof = getMerkleProof;
163
163
  exports.verifyMerkleProof = verifyMerkleProof;
164
- //# sourceMappingURL=chunk-EUP7MBAH.cjs.map
165
- //# sourceMappingURL=chunk-EUP7MBAH.cjs.map
164
+ //# sourceMappingURL=chunk-IIUKM5VE.cjs.map
165
+ //# sourceMappingURL=chunk-IIUKM5VE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/merkle.ts"],"names":["init_poseidon","poseidon"],"mappings":"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","file":"chunk-EUP7MBAH.cjs","sourcesContent":["/**\n * Merkle Tree Utilities\n *\n * Client-side Merkle tree for computing proofs.\n * Compatible with LeanIMT on-chain implementation.\n */\n\nimport { poseidon } from './poseidon.js'\n\n/**\n * Maximum tree depth (matches contract)\n */\nexport const MAX_TREE_DEPTH = 32\n\n/**\n * Merkle proof for a leaf\n */\nexport interface MerkleProof {\n /** Path elements (siblings) */\n pathElements: bigint[]\n /** Path indices (0 = left, 1 = right) */\n pathIndices: number[]\n /** Leaf index in the tree */\n leafIndex: number\n /** Tree root */\n root: bigint\n}\n\n/**\n * LeanIMT-compatible Merkle Tree\n *\n * Features:\n * - Dynamic depth (grows as needed)\n * - Single-child optimization\n * - Async hash operations (Poseidon is async)\n */\nexport class MerkleTree {\n private leaves: bigint[] = []\n private nodes: Map<string, bigint> = new Map() // level:index -> hash\n private cachedRoot: bigint | null = null\n readonly maxDepth: number\n\n constructor(maxDepth: number = MAX_TREE_DEPTH) {\n this.maxDepth = maxDepth\n }\n\n /**\n * Insert a leaf into the tree\n */\n insert(leaf: bigint): number {\n if (leaf === 0n) {\n throw new Error('Leaf cannot be zero')\n }\n const index = this.leaves.length\n this.leaves.push(leaf)\n this.cachedRoot = null // Invalidate cached root\n this.nodes.clear() // Clear cached nodes\n return index\n }\n\n /**\n * Get the number of leaves in the tree\n */\n get size(): number {\n return this.leaves.length\n }\n\n /**\n * Get the current depth of the tree\n * LeanIMT: depth grows when 2^depth < size\n */\n get depth(): number {\n if (this.leaves.length <= 1) return 0\n return Math.ceil(Math.log2(this.leaves.length))\n }\n\n /**\n * Check if a leaf exists in the tree\n */\n has(leaf: bigint): boolean {\n return this.leaves.includes(leaf)\n }\n\n /**\n * Get the index of a leaf\n */\n indexOf(leaf: bigint): number {\n return this.leaves.indexOf(leaf)\n }\n\n /**\n * Get the current root (async because of Poseidon)\n */\n async getRoot(): Promise<bigint> {\n if (this.leaves.length === 0) {\n return 0n\n }\n if (this.cachedRoot !== null) {\n return this.cachedRoot\n }\n this.cachedRoot = await this.computeRoot()\n return this.cachedRoot\n }\n\n /**\n * Get a Merkle proof for a leaf at index\n */\n async getProof(index: number): Promise<MerkleProof> {\n if (index < 0 || index >= this.leaves.length) {\n throw new Error(`Leaf index ${index} out of bounds (size: ${this.leaves.length})`)\n }\n\n const pathElements: bigint[] = []\n const pathIndices: number[] = []\n const treeDepth = this.depth\n\n let currentIndex = index\n\n for (let level = 0; level < treeDepth; level++) {\n const siblingIndex = currentIndex ^ 1 // XOR to get sibling\n const isLeft = currentIndex % 2 === 0\n\n // Get sibling hash\n const sibling = await this.getNodeHash(level, siblingIndex)\n pathElements.push(sibling)\n pathIndices.push(isLeft ? 0 : 1)\n\n // Move to parent\n currentIndex = Math.floor(currentIndex / 2)\n }\n\n return {\n pathElements,\n pathIndices,\n leafIndex: index,\n root: await this.getRoot(),\n }\n }\n\n /**\n * Get the hash of a node at (level, index)\n * level 0 = leaves, higher levels are internal nodes\n */\n private async getNodeHash(level: number, index: number): Promise<bigint> {\n const key = `${level}:${index}`\n if (this.nodes.has(key)) {\n return this.nodes.get(key)!\n }\n\n let hash: bigint\n\n if (level === 0) {\n // Leaf level\n hash = index < this.leaves.length ? this.leaves[index]! : 0n\n } else {\n // Internal node: hash of children\n const leftChild = await this.getNodeHash(level - 1, index * 2)\n const rightChild = await this.getNodeHash(level - 1, index * 2 + 1)\n\n if (leftChild === 0n && rightChild === 0n) {\n hash = 0n\n } else if (rightChild === 0n) {\n // LeanIMT optimization: single child\n hash = leftChild\n } else {\n hash = await poseidon([leftChild, rightChild])\n }\n }\n\n this.nodes.set(key, hash)\n return hash\n }\n\n /**\n * Compute the root hash\n */\n private async computeRoot(): Promise<bigint> {\n if (this.leaves.length === 0) return 0n\n if (this.leaves.length === 1) return this.leaves[0]!\n\n const treeDepth = this.depth\n return await this.getNodeHash(treeDepth, 0)\n }\n}\n\n/**\n * Build a Merkle tree from an array of leaves\n */\nexport function buildMerkleTree(leaves: bigint[]): MerkleTree {\n const tree = new MerkleTree()\n for (const leaf of leaves) {\n tree.insert(leaf)\n }\n return tree\n}\n\n/**\n * Get a Merkle proof for a specific leaf (async)\n */\nexport async function getMerkleProof(\n leaves: bigint[],\n index: number\n): Promise<MerkleProof> {\n const tree = buildMerkleTree(leaves)\n return tree.getProof(index)\n}\n\n/**\n * Verify a Merkle proof (async)\n */\nexport async function verifyMerkleProof(\n leaf: bigint,\n proof: MerkleProof\n): Promise<boolean> {\n let current = leaf\n\n for (let i = 0; i < proof.pathElements.length; i++) {\n const sibling = proof.pathElements[i]!\n const isLeft = proof.pathIndices[i] === 0\n\n if (sibling === 0n) {\n // LeanIMT: missing sibling means we just propagate\n continue\n }\n\n if (isLeft) {\n current = await poseidon([current, sibling])\n } else {\n current = await poseidon([sibling, current])\n }\n }\n\n return current === proof.root\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/merkle.ts"],"names":["init_poseidon","poseidon"],"mappings":";;;;;AAOAA,+BAAA,EAAA;AAKO,IAAM,cAAA,GAAiB;AAwBvB,IAAM,aAAN,MAAiB;AAAA,EACd,SAAmB,EAAC;AAAA,EACpB,KAAA,uBAAiC,GAAA,EAAI;AAAA;AAAA,EACrC,UAAA,GAA4B,IAAA;AAAA,EAC3B,QAAA;AAAA,EAET,WAAA,CAAY,WAAmB,cAAA,EAAgB;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAAsB;AAC3B,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,MAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAA,GAAgB;AAClB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA;AACpC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAAsB;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAA2B;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,OAAO,IAAA,CAAK,UAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,MAAM,IAAA,CAAK,WAAA,EAAY;AACzC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAAqC;AAClD,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,IAAA,CAAK,OAAO,MAAA,EAAQ;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,WAAA,EAAc,KAAK,yBAAyB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AAEvB,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,MAAA,MAAM,eAAe,YAAA,GAAe,CAAA;AACpC,MAAA,MAAM,MAAA,GAAS,eAAe,CAAA,KAAM,CAAA;AAGpC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,YAAY,CAAA;AAC1D,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AACzB,MAAA,WAAA,CAAY,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA;AAG/B,MAAA,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW,KAAA;AAAA,MACX,IAAA,EAAM,MAAM,IAAA,CAAK,OAAA;AAAQ,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CAAY,KAAA,EAAe,KAAA,EAAgC;AACvE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,UAAU,CAAA,EAAG;AAEf,MAAA,IAAA,GAAO,QAAQ,IAAA,CAAK,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAK,EAAA;AAAA,IAC5D,CAAA,MAAO;AAEL,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAY,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC7D,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAI,CAAC,CAAA;AAElE,MAAA,IAAI,SAAA,KAAc,EAAA,IAAM,UAAA,KAAe,EAAA,EAAI;AACzC,QAAA,IAAA,GAAO,EAAA;AAAA,MACT,CAAA,MAAA,IAAW,eAAe,EAAA,EAAI;AAE5B,QAAA,IAAA,GAAO,SAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,MAAMC,0BAAA,CAAS,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AACrC,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAElD,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,CAAC,CAAA;AAAA,EAC5C;AACF;AAKO,SAAS,gBAAgB,MAAA,EAA8B;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAW;AAC5B,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,cAAA,CACpB,QACA,KAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,EAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAC5B;AAKA,eAAsB,iBAAA,CACpB,MACA,KAAA,EACkB;AAClB,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAClD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,YAAA,CAAa,CAAC,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAA;AAExC,IAAA,IAAI,YAAY,EAAA,EAAI;AAElB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,GAAU,MAAMA,0BAAA,CAAS,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,MAAMA,0BAAA,CAAS,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,YAAY,KAAA,CAAM,IAAA;AAC3B","file":"chunk-IIUKM5VE.cjs","sourcesContent":["/**\n * Merkle Tree Utilities\n *\n * Client-side Merkle tree for computing proofs.\n * Compatible with LeanIMT on-chain implementation.\n */\n\nimport { poseidon } from './poseidon.js'\n\n/**\n * Maximum tree depth (matches contract)\n */\nexport const MAX_TREE_DEPTH = 32\n\n/**\n * Merkle proof for a leaf\n */\nexport interface MerkleProof {\n /** Path elements (siblings) */\n pathElements: bigint[]\n /** Path indices (0 = left, 1 = right) */\n pathIndices: number[]\n /** Leaf index in the tree */\n leafIndex: number\n /** Tree root */\n root: bigint\n}\n\n/**\n * LeanIMT-compatible Merkle Tree\n *\n * Features:\n * - Dynamic depth (grows as needed)\n * - Single-child optimization\n * - Async hash operations (Poseidon is async)\n */\nexport class MerkleTree {\n private leaves: bigint[] = []\n private nodes: Map<string, bigint> = new Map() // level:index -> hash\n private cachedRoot: bigint | null = null\n readonly maxDepth: number\n\n constructor(maxDepth: number = MAX_TREE_DEPTH) {\n this.maxDepth = maxDepth\n }\n\n /**\n * Insert a leaf into the tree\n */\n insert(leaf: bigint): number {\n if (leaf === 0n) {\n throw new Error('Leaf cannot be zero')\n }\n const index = this.leaves.length\n this.leaves.push(leaf)\n this.cachedRoot = null // Invalidate cached root\n this.nodes.clear() // Clear cached nodes\n return index\n }\n\n /**\n * Get the number of leaves in the tree\n */\n get size(): number {\n return this.leaves.length\n }\n\n /**\n * Get the current depth of the tree\n * LeanIMT: depth grows when 2^depth < size\n */\n get depth(): number {\n if (this.leaves.length <= 1) return 0\n return Math.ceil(Math.log2(this.leaves.length))\n }\n\n /**\n * Check if a leaf exists in the tree\n */\n has(leaf: bigint): boolean {\n return this.leaves.includes(leaf)\n }\n\n /**\n * Get the index of a leaf\n */\n indexOf(leaf: bigint): number {\n return this.leaves.indexOf(leaf)\n }\n\n /**\n * Get the current root (async because of Poseidon)\n */\n async getRoot(): Promise<bigint> {\n if (this.leaves.length === 0) {\n return 0n\n }\n if (this.cachedRoot !== null) {\n return this.cachedRoot\n }\n this.cachedRoot = await this.computeRoot()\n return this.cachedRoot\n }\n\n /**\n * Get a Merkle proof for a leaf at index\n */\n async getProof(index: number): Promise<MerkleProof> {\n if (index < 0 || index >= this.leaves.length) {\n throw new Error(`Leaf index ${index} out of bounds (size: ${this.leaves.length})`)\n }\n\n const pathElements: bigint[] = []\n const pathIndices: number[] = []\n const treeDepth = this.depth\n\n let currentIndex = index\n\n for (let level = 0; level < treeDepth; level++) {\n const siblingIndex = currentIndex ^ 1 // XOR to get sibling\n const isLeft = currentIndex % 2 === 0\n\n // Get sibling hash\n const sibling = await this.getNodeHash(level, siblingIndex)\n pathElements.push(sibling)\n pathIndices.push(isLeft ? 0 : 1)\n\n // Move to parent\n currentIndex = Math.floor(currentIndex / 2)\n }\n\n return {\n pathElements,\n pathIndices,\n leafIndex: index,\n root: await this.getRoot(),\n }\n }\n\n /**\n * Get the hash of a node at (level, index)\n * level 0 = leaves, higher levels are internal nodes\n */\n private async getNodeHash(level: number, index: number): Promise<bigint> {\n const key = `${level}:${index}`\n if (this.nodes.has(key)) {\n return this.nodes.get(key)!\n }\n\n let hash: bigint\n\n if (level === 0) {\n // Leaf level\n hash = index < this.leaves.length ? this.leaves[index]! : 0n\n } else {\n // Internal node: hash of children\n const leftChild = await this.getNodeHash(level - 1, index * 2)\n const rightChild = await this.getNodeHash(level - 1, index * 2 + 1)\n\n if (leftChild === 0n && rightChild === 0n) {\n hash = 0n\n } else if (rightChild === 0n) {\n // LeanIMT optimization: single child\n hash = leftChild\n } else {\n hash = await poseidon([leftChild, rightChild])\n }\n }\n\n this.nodes.set(key, hash)\n return hash\n }\n\n /**\n * Compute the root hash\n */\n private async computeRoot(): Promise<bigint> {\n if (this.leaves.length === 0) return 0n\n if (this.leaves.length === 1) return this.leaves[0]!\n\n const treeDepth = this.depth\n return await this.getNodeHash(treeDepth, 0)\n }\n}\n\n/**\n * Build a Merkle tree from an array of leaves\n */\nexport function buildMerkleTree(leaves: bigint[]): MerkleTree {\n const tree = new MerkleTree()\n for (const leaf of leaves) {\n tree.insert(leaf)\n }\n return tree\n}\n\n/**\n * Get a Merkle proof for a specific leaf (async)\n */\nexport async function getMerkleProof(\n leaves: bigint[],\n index: number\n): Promise<MerkleProof> {\n const tree = buildMerkleTree(leaves)\n return tree.getProof(index)\n}\n\n/**\n * Verify a Merkle proof (async)\n */\nexport async function verifyMerkleProof(\n leaf: bigint,\n proof: MerkleProof\n): Promise<boolean> {\n let current = leaf\n\n for (let i = 0; i < proof.pathElements.length; i++) {\n const sibling = proof.pathElements[i]!\n const isLeft = proof.pathIndices[i] === 0\n\n if (sibling === 0n) {\n // LeanIMT: missing sibling means we just propagate\n continue\n }\n\n if (isLeft) {\n current = await poseidon([current, sibling])\n } else {\n current = await poseidon([sibling, current])\n }\n }\n\n return current === proof.root\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { generateASPProof, DEMO_ASP_ID } from './chunk-P37MRZ73.js';
2
- import { buildMerkleTree } from './chunk-ZU6J7KMY.js';
3
- import { init_poseidon, poseidon, BABYJUBJUB_SUBORDER } from './chunk-V23OSL25.js';
4
- import { generateUPPProof, formatProofForContract, ASP_TREE_DEPTH, STATE_TREE_DEPTH } from './chunk-S4B7GYLN.js';
1
+ import { buildMerkleTree } from './chunk-GPF72JFR.js';
2
+ import { generateASPProof, DEMO_ASP_ID } from './chunk-6IEYWJVS.js';
3
+ import { init_poseidon, poseidon, computeOwnerHash, computeNoteCommitment } from './chunk-5QSSX3KR.js';
4
+ import { generateUPPProof, formatPlonkProofForContract, ASP_TREE_DEPTH, STATE_TREE_DEPTH } from './chunk-W3HLIKC2.js';
5
5
  import { toHex } from 'viem';
6
6
 
7
7
  // src/deployments/31337.json
@@ -27,24 +27,23 @@ var __default = {
27
27
 
28
28
  // src/deployments/11155111.json
29
29
  var __default2 = {
30
- UniversalPrivatePool: "0x95c800a58ff37c85a15f435cf7bca2af288cb5c7",
30
+ UniversalPrivatePool: "0x0eef76d20a5e4c2fc6b16bf3dc8924f209527803",
31
31
  ASPRegistryHub: "0xfd11c56a23314aa88dfbcc36254f33e5e8b010df",
32
- TestToken: "0xf68645ce430256917ca434a4063c81db59dda611",
33
- TestToken2: "0xe159f88d97ba9663b0c586fc720ec637783db1d4",
32
+ TestToken: "0x0c476ce024f92bfc10fc063dda5eb5cd41c3154e",
33
+ TestToken2: "0x869860fa6230ec023ecd48e45082e3cffa73808a",
34
34
  verifiers: {
35
- TransferVerifier: "0x465261fd85c80e8278a30f04ad4f4558710d6cd3",
36
- MergeVerifier: "0x219e26676e6a72a00ede08e4ebf7d6aa27005676",
37
- WithdrawVerifier: "0x7405f0e1e44d5355d4913543125961790e8b52c0",
38
- JoinSplitVerifier: "0x18e3daed50ca37a1acdea4a26c71ae39ff9b0fb1",
39
- MergeTransfer2x2Verifier: "0x365f5c0ac64f07bc779cdbbcf695ad5024971e06",
40
- MergeTransfer4x2Verifier: "0xbab9f475bcf9377675d01a640b1b70d5a27a8af4"
35
+ TransferVerifier: "0x570ddbaf864fdc934ab7e0288f552a4bc7affd9a",
36
+ MergeVerifier: "0x99d0e8388e2d087c1da918c6c1677927b8aaa513",
37
+ WithdrawVerifier: "0xe1dabb06aa4e6aa7ca2c333c6b06b180378df0bb",
38
+ JoinSplitVerifier: "0xbd277477d7db0dfe30f54209755fb92fcaa13d23",
39
+ MergeTransfer2x2Verifier: "0xa060c9572c7bef7f780cf3021ae2385a9fe6a48e",
40
+ MergeTransfer4x2Verifier: "0x2da8578f82e06c25748e6f2c796813c7c43b8896"
41
41
  },
42
42
  starkVerifiers: {
43
- CircleStarkVerifier: "0x4a911db5b613b399a2622da296c5163c059714ec"
43
+ CircleStarkVerifier: "0xcb8eb6ac91bff0f46cc3d4767255d80e25dee65e"
44
44
  },
45
- deployBlock: 10534869,
46
- deployTimestamp: 1774642370446
47
- };
45
+ deployBlock: 10547005,
46
+ deployTimestamp: 1774792296955};
48
47
 
49
48
  // src/deployments/index.ts
50
49
  function parseDeployment(json, chainId) {
@@ -196,7 +195,7 @@ async function syncMerkleTree(publicClient, contractAddress) {
196
195
  return { tree, leaves };
197
196
  }
198
197
  async function getMerkleProofsForNotes(notes, leaves, tree) {
199
- const { verifyMerkleProof } = await import('./merkle-7KS2EHRF.js');
198
+ const { verifyMerkleProof } = await import('./merkle-IF2RMWCF.js');
200
199
  const proofs = [];
201
200
  for (const note of notes) {
202
201
  const commitmentBI = BigInt(note.commitment);
@@ -224,24 +223,22 @@ async function getMerkleProofsForNotes(notes, leaves, tree) {
224
223
  return proofs;
225
224
  }
226
225
  async function computeNullifier(ownerSecret, leafIndex, commitment) {
227
- return await poseidon([ownerSecret % BABYJUBJUB_SUBORDER, BigInt(leafIndex), commitment]);
226
+ return await poseidon([ownerSecret, BigInt(leafIndex), commitment]);
228
227
  }
229
228
  async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote, changeNote) {
230
229
  const { proof, note } = noteProof;
231
- const { privateToPublic } = await import('./babyjubjub-2MGQVCKB.js');
232
- const inputPubkey = await privateToPublic(BigInt(note.ownerSecret));
233
- const localInputCommitment = await poseidon([
230
+ const inputOwnerHash = computeOwnerHash(BigInt(note.ownerSecret));
231
+ const localInputCommitment = computeNoteCommitment(
234
232
  note.amount,
235
- inputPubkey.x,
236
- inputPubkey.y,
233
+ inputOwnerHash,
237
234
  note.blinding,
238
235
  note.origin,
239
236
  note.token
240
- ]);
237
+ );
241
238
  const storedCommitment = BigInt(note.commitment);
242
239
  if (localInputCommitment !== storedCommitment) {
243
240
  console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`);
244
- console.error(` amount: ${note.amount}, pubkeyX: ${inputPubkey.x}, pubkeyY: ${inputPubkey.y}`);
241
+ console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`);
245
242
  console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`);
246
243
  console.error(` local=${localInputCommitment}, stored=${storedCommitment}`);
247
244
  throw new Error(
@@ -263,7 +260,7 @@ async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote,
263
260
  token: String(note.token),
264
261
  // Private inputs - Input Note
265
262
  inputAmount: String(note.amount),
266
- inputOneTimeSecret: String(BigInt(note.ownerSecret) % BABYJUBJUB_SUBORDER),
263
+ inputOneTimeSecret: String(BigInt(note.ownerSecret)),
267
264
  inputBlinding: String(note.blinding),
268
265
  inputOrigin: String(note.origin),
269
266
  inputLeafIndex: String(proof.leafIndex),
@@ -272,14 +269,12 @@ async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote,
272
269
  // Private inputs - ASP Membership Proof
273
270
  aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), "0"),
274
271
  aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), "0"),
275
- // Private inputs - Output Notes (BabyJubJub pubkey coordinates)
272
+ // Private inputs - Output Notes (hash-based ownership)
276
273
  outputAmount1: String(recipientNote.amount),
277
- outputPubkeyX1: String(recipientNote.pubkeyX),
278
- outputPubkeyY1: String(recipientNote.pubkeyY),
274
+ outputOwnerHash1: String(recipientNote.ownerHash),
279
275
  outputBlinding1: String(recipientNote.blinding),
280
276
  outputAmount2: String(changeNote.amount),
281
- outputPubkeyX2: String(changeNote.pubkeyX),
282
- outputPubkeyY2: String(changeNote.pubkeyY),
277
+ outputOwnerHash2: String(changeNote.ownerHash),
283
278
  outputBlinding2: String(changeNote.blinding)
284
279
  };
285
280
  }
@@ -305,7 +300,7 @@ async function buildTransfer(ctx, selectedNote, recipientNote, changeNote, onSta
305
300
  circuitInputs,
306
301
  ctx.circuitBaseUrl ?? "/circuits/"
307
302
  );
308
- const formattedProof = formatProofForContract(proof);
303
+ const formattedProof = await formatPlonkProofForContract(proof);
309
304
  return {
310
305
  circuit: "transfer",
311
306
  proof: formattedProof,
@@ -331,5 +326,5 @@ function formatOutputForContract(note) {
331
326
  }
332
327
 
333
328
  export { buildTransfer, buildUPPTransferCircuitInputs, computeNullifier, formatOutputForContract, getDeployment, getDeploymentOrThrow, getMerkleProofsForNotes, getSupportedChainIds, getTokenAddress, hasDeployment, registerDeployment, syncMerkleTree };
334
- //# sourceMappingURL=chunk-CWSUBAV3.js.map
335
- //# sourceMappingURL=chunk-CWSUBAV3.js.map
329
+ //# sourceMappingURL=chunk-OBBSIPEK.js.map
330
+ //# sourceMappingURL=chunk-OBBSIPEK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deployments/31337.json","../src/deployments/11155111.json","../src/deployments/index.ts","../src/core/transfer.ts"],"names":["__default"],"mappings":"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","file":"chunk-OBBSIPEK.js","sourcesContent":["{\n \"UniversalPrivatePool\": \"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6\",\n \"ASPRegistryHub\": \"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512\",\n \"TestToken\": \"0x610178da211fef7d417bc0e6fed39f05609ad788\",\n \"TestToken2\": \"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0\",\n \"MergeVerifier\": \"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9\",\n \"WithdrawVerifier\": \"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9\",\n \"JoinSplitVerifier\": \"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707\",\n \"MergeTransfer2x2Verifier\": \"0x0165878a594ca255338adfa4d48449f69242eb8f\",\n \"MergeTransfer4x2Verifier\": \"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82\"\n },\n \"deployBlock\": 1,\n \"deployTimestamp\": 1774728354492\n}\n","{\n \"UniversalPrivatePool\": \"0x0eef76d20a5e4c2fc6b16bf3dc8924f209527803\",\n \"ASPRegistryHub\": \"0xfd11c56a23314aa88dfbcc36254f33e5e8b010df\",\n \"TestToken\": \"0x0c476ce024f92bfc10fc063dda5eb5cd41c3154e\",\n \"TestToken2\": \"0x869860fa6230ec023ecd48e45082e3cffa73808a\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x570ddbaf864fdc934ab7e0288f552a4bc7affd9a\",\n \"MergeVerifier\": \"0x99d0e8388e2d087c1da918c6c1677927b8aaa513\",\n \"WithdrawVerifier\": \"0xe1dabb06aa4e6aa7ca2c333c6b06b180378df0bb\",\n \"JoinSplitVerifier\": \"0xbd277477d7db0dfe30f54209755fb92fcaa13d23\",\n \"MergeTransfer2x2Verifier\": \"0xa060c9572c7bef7f780cf3021ae2385a9fe6a48e\",\n \"MergeTransfer4x2Verifier\": \"0x2da8578f82e06c25748e6f2c796813c7c43b8896\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0xcb8eb6ac91bff0f46cc3d4767255d80e25dee65e\"\n },\n \"deployBlock\": 10547005,\n \"deployTimestamp\": 1774792296955,\n \"proofSystem\": \"PLONK\",\n \"curve\": \"BLS12-381\",\n \"verifierType\": \"PlonkVerifierBLS12381\"\n}\n","/**\n * Deployment Configuration Loader\n *\n * Loads contract addresses based on chain ID.\n * Built-in: Anvil (31337) and Sepolia (11155111).\n * Custom chains can be registered at runtime via registerDeployment().\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Verifier contract addresses\n */\nexport interface VerifierAddresses {\n TransferVerifier: Address;\n MergeVerifier: Address;\n WithdrawVerifier: Address;\n JoinSplitVerifier?: Address;\n MergeTransfer2x2Verifier?: Address;\n MergeTransfer4x2Verifier?: Address;\n}\n\n/**\n * STARK verifier contract addresses\n */\nexport interface StarkVerifierAddresses {\n CircleStarkVerifier?: Address;\n}\n\n/**\n * Deployment configuration for a chain\n */\nexport interface DeploymentConfig {\n /** Universal Private Pool contract address */\n UniversalPrivatePool: Address;\n /** ASP Registry Hub contract address */\n ASPRegistryHub: Address;\n /** Test token address (local/testnet) */\n TestToken?: Address;\n /** Test token 2 address — bonding curve token (local/testnet) */\n TestToken2?: Address;\n /** Verifier contract addresses */\n verifiers: VerifierAddresses;\n /** STARK verifier contract addresses */\n starkVerifiers?: StarkVerifierAddresses;\n /** Chain ID */\n chainId: number;\n /** Block number when contracts were deployed (for efficient scanning) */\n deployBlock: number;\n /** Timestamp when contracts were deployed */\n deployTimestamp?: number;\n}\n\n/**\n * Raw JSON file format (without chainId, which is added dynamically)\n */\ninterface DeploymentJSON {\n UniversalPrivatePool: string;\n ASPRegistryHub: string;\n TestToken?: string;\n TestToken2?: string;\n verifiers: {\n TransferVerifier: string;\n MergeVerifier: string;\n WithdrawVerifier: string;\n JoinSplitVerifier?: string;\n MergeTransfer2x2Verifier?: string;\n MergeTransfer4x2Verifier?: string;\n };\n starkVerifiers?: {\n CircleStarkVerifier?: string;\n };\n deployBlock: number;\n deployTimestamp?: number;\n}\n\n/**\n * Parse raw deployment JSON into typed config\n */\nfunction parseDeployment(\n json: DeploymentJSON,\n chainId: number\n): DeploymentConfig {\n return {\n UniversalPrivatePool: json.UniversalPrivatePool as Address,\n ASPRegistryHub: json.ASPRegistryHub as Address,\n TestToken: json.TestToken as Address | undefined,\n TestToken2: json.TestToken2 as Address | undefined,\n verifiers: {\n TransferVerifier: json.verifiers.TransferVerifier as Address,\n MergeVerifier: json.verifiers.MergeVerifier as Address,\n WithdrawVerifier: json.verifiers.WithdrawVerifier as Address,\n JoinSplitVerifier: json.verifiers.JoinSplitVerifier as Address | undefined,\n MergeTransfer2x2Verifier: json.verifiers\n .MergeTransfer2x2Verifier as Address | undefined,\n MergeTransfer4x2Verifier: json.verifiers\n .MergeTransfer4x2Verifier as Address | undefined,\n },\n starkVerifiers: json.starkVerifiers\n ? {\n CircleStarkVerifier: json.starkVerifiers\n .CircleStarkVerifier as Address | undefined,\n }\n : undefined,\n chainId,\n deployBlock: json.deployBlock,\n deployTimestamp: json.deployTimestamp,\n };\n}\n\n// Import deployment configs\n// These will be updated by the extract-deployment.js script\nimport anvil from \"./31337.json\" with { type: \"json\" };\nimport sepolia from \"./11155111.json\" with { type: \"json\" };\n\nconst deployments: Record<number, DeploymentConfig> = {\n 31337: parseDeployment(anvil as unknown as DeploymentJSON, 31337),\n 11155111: parseDeployment(sepolia as unknown as DeploymentJSON, 11155111),\n};\n\n/**\n * Get deployment config for a chain\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config or null if not found\n *\n * @example\n * ```ts\n * const deployment = getDeployment(31337)\n * if (deployment) {\n * console.log('Pool address:', deployment.UniversalPrivatePool)\n * }\n * ```\n */\nexport function getDeployment(chainId: number): DeploymentConfig | null {\n return deployments[chainId] ?? null;\n}\n\n/**\n * Get deployment config or throw if not found\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config\n * @throws Error if deployment not found\n */\nexport function getDeploymentOrThrow(chainId: number): DeploymentConfig {\n const deployment = getDeployment(chainId);\n if (!deployment) {\n throw new Error(\n `No deployment found for chain ${chainId}. ` +\n `Supported chains: ${Object.keys(deployments).join(\", \")}`\n );\n }\n return deployment;\n}\n\n/**\n * Check if a chain has a deployment\n */\nexport function hasDeployment(chainId: number): boolean {\n return chainId in deployments;\n}\n\n/**\n * Get all supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(deployments).map(Number);\n}\n\n/**\n * Get the token address for a chain\n */\nexport function getTokenAddress(chainId: number): Address | null {\n const deployment = getDeployment(chainId);\n if (!deployment) return null;\n return deployment.TestToken ?? null;\n}\n\n/**\n * Register a deployment for a custom chain at runtime.\n *\n * Use this when deploying your own pool on a chain not built into the SDK.\n * Overrides any existing deployment for the same chainId.\n *\n * @example\n * ```ts\n * registerDeployment(8453, {\n * UniversalPrivatePool: '0x...',\n * ASPRegistryHub: '0x...',\n * verifiers: { TransferVerifier: '0x...', MergeVerifier: '0x...', WithdrawVerifier: '0x...' },\n * chainId: 8453,\n * deployBlock: 12345678,\n * })\n * ```\n */\nexport function registerDeployment(chainId: number, config: DeploymentConfig): void {\n deployments[chainId] = { ...config, chainId };\n}\n","/**\n * Transfer Module\n *\n * Core logic for building and executing UPP transfers.\n * This module is framework-agnostic (no React).\n */\n\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { getDeployment } from '../deployments/index.js'\nimport { buildMerkleTree, type MerkleProof } from '../utils/merkle.js'\nimport { poseidon, computeOwnerHash as poseidonOwnerHash, computeNoteCommitment } from '../utils/poseidon.js'\nimport {\n generateUPPProof,\n formatPlonkProofForContract,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n type UPPCircuitType,\n type UPPTransferCircuitInputs,\n} from './proof.js'\nimport { generateASPProof, type ASPProof } from './asp.js'\nimport type { NoteCreationResult } from '../react/use-upp-account.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Transfer stage for progress tracking\n */\nexport type TransferStage =\n | 'selecting_notes'\n | 'syncing_merkle'\n | 'creating_outputs'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n\n/**\n * A shielded note with all data needed for spending\n *\n * Post-quantum: uses ownerSecret/ownerHash instead of BabyJubJub one-time keys.\n * Ownership is proven via hash preimage: Poseidon(ownerSecret) == ownerHash.\n */\nexport interface SpendableNote {\n amount: bigint\n blinding: bigint\n commitment: string\n /** Owner secret (hash preimage for ownership proof) */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - committed in the note */\n ownerHash: string\n leafIndex: number\n /** Origin address (depositor) - required for UPP circuits */\n origin: bigint\n /** Token address - required for UPP circuits */\n token: bigint\n}\n\n/**\n * Merkle proof with associated note\n */\nexport interface MerkleProofWithNote {\n proof: MerkleProof\n note: SpendableNote\n}\n\n/**\n * Transfer context (dependencies)\n */\nexport interface TransferContext {\n /** viem PublicClient for RPC calls */\n publicClient: PublicClient\n /** Contract address */\n contractAddress: Address\n /** Chain ID */\n chainId: number\n /** Circuit 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 * Transfer result\n */\nexport interface TransferBuildResult {\n /** Circuit type used */\n circuit: UPPCircuitType\n /** Formatted PLONK proof for contract */\n proof: {\n proofBytes: `0x${string}`\n publicSignals: bigint[]\n }\n /** Public signals from proof */\n publicSignals: string[]\n /** State tree root */\n stateRoot: bigint\n /** ASP tree root */\n aspRoot: bigint\n /** Nullifier hash */\n nullifier: bigint\n /** Output commitment 1 */\n outputCommitment1: bigint\n /** Output commitment 2 */\n outputCommitment2: bigint\n /** Token address */\n token: bigint\n /** Recipient output */\n recipientOutput: NoteCreationResult\n /** Change output */\n changeOutput: NoteCreationResult\n /** Notes that will be spent */\n spentNotes: SpendableNote[]\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Chunk size for paginated RPC queries on testnets */\nconst RPC_CHUNK_SIZE = 9000n\n\n/**\n * Pad an array to the state tree depth (32 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length STATE_TREE_DEPTH\n */\nfunction padToStateTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= STATE_TREE_DEPTH) {\n return arr.slice(0, STATE_TREE_DEPTH)\n }\n return [...arr, ...Array(STATE_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * Pad an array to the ASP tree depth (20 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length ASP_TREE_DEPTH\n */\nfunction padToASPTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= ASP_TREE_DEPTH) {\n return arr.slice(0, ASP_TREE_DEPTH)\n }\n return [...arr, ...Array(ASP_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * CommitmentInserted event — emitted by _insertLeaf() for ALL leaf insertions\n * (shield, transfer, merge, swap fill, swap claim, swap cancel).\n * This is the single canonical event for Merkle tree reconstruction.\n */\nconst COMMITMENT_INSERTED_EVENT = {\n type: 'event' as const,\n name: 'CommitmentInserted',\n inputs: [\n { type: 'bytes32', name: 'commitment', indexed: true },\n { type: 'uint256', name: 'leafIndex' },\n { type: 'uint256', name: 'timestamp' },\n ],\n}\n\n// ============================================================================\n// Merkle Tree Functions\n// ============================================================================\n\n/**\n * Fetch all commitments from the contract and build a Merkle tree\n *\n * @param publicClient - viem PublicClient\n * @param contractAddress - Contract address\n * @returns Object with tree and leaves array\n */\nexport async function syncMerkleTree(\n publicClient: PublicClient,\n contractAddress: Address\n): Promise<{ tree: ReturnType<typeof buildMerkleTree>; leaves: bigint[] }> {\n const currentBlock = await publicClient.getBlockNumber()\n const chainId = await publicClient.getChainId()\n\n // Use CommitmentInserted events — the canonical event emitted by _insertLeaf()\n // for ALL operations (shield, transfer, merge, swap fill/claim/cancel).\n // Each event has an explicit leafIndex, so ordering is deterministic.\n let commitmentLogs: any[] = []\n\n if (chainId === 31337) {\n // Anvil - single query is fine\n commitmentLogs = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock: 0n,\n })\n } else {\n // Testnet/mainnet - paginate to avoid RPC limits\n const deployment = getDeployment(chainId)\n let fromBlock = deployment?.deployBlock ? BigInt(deployment.deployBlock) : 0n\n console.log(`[syncMerkleTree] Chain ${chainId}: scanning from block ${fromBlock} to ${currentBlock}`)\n\n while (fromBlock <= currentBlock) {\n const toBlock =\n fromBlock + RPC_CHUNK_SIZE > currentBlock ? currentBlock : fromBlock + RPC_CHUNK_SIZE\n const chunk = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock,\n toBlock,\n })\n commitmentLogs = commitmentLogs.concat(chunk)\n fromBlock = toBlock + 1n\n }\n }\n\n // Sort by explicit leafIndex (most reliable), falling back to block+logIndex\n commitmentLogs.sort((a: any, b: any) => {\n const idxA = Number(a.args.leafIndex!)\n const idxB = Number(b.args.leafIndex!)\n return idxA - idxB\n })\n\n // Build leaves array using the explicit leafIndex from each event\n const leaves: bigint[] = []\n for (const log of commitmentLogs) {\n const leafIndex = Number(log.args.leafIndex!)\n const commitment = BigInt(log.args.commitment!)\n\n if (leaves.length !== leafIndex) {\n console.warn(\n `[syncMerkleTree] WARNING: Expected leafIndex ${leaves.length} but event has ${leafIndex}. ` +\n `This may indicate missed events or reorg.`\n )\n }\n leaves.push(commitment)\n }\n\n const tree = buildMerkleTree(leaves)\n\n // Debug: compare our root with on-chain root\n const ourRoot = await tree.getRoot()\n const onChainRoot = (await publicClient.readContract({\n address: contractAddress,\n abi: [\n {\n type: 'function',\n name: 'getMerkleRoot',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'getMerkleRoot',\n })) as bigint\n\n console.log(`[syncMerkleTree] Leaves count: ${leaves.length}`)\n console.log(`[syncMerkleTree] Tree depth: ${tree.depth}`)\n console.log(`[syncMerkleTree] Our computed root: ${ourRoot}`)\n console.log(`[syncMerkleTree] On-chain root: ${onChainRoot}`)\n console.log(`[syncMerkleTree] Roots match: ${ourRoot === onChainRoot}`)\n\n if (ourRoot !== onChainRoot) {\n console.log(`[syncMerkleTree] WARNING: Root mismatch!`)\n console.log(\n `[syncMerkleTree] Leaves:`,\n leaves.map((l) => '0x' + l.toString(16))\n )\n }\n\n return { tree, leaves }\n}\n\n/**\n * Get Merkle proofs for a set of notes\n *\n * @param notes - Notes to get proofs for\n * @param leaves - All leaves in the tree\n * @param tree - Merkle tree instance\n * @returns Array of proofs with associated notes\n */\nexport async function getMerkleProofsForNotes(\n notes: SpendableNote[],\n leaves: bigint[],\n tree: ReturnType<typeof buildMerkleTree>\n): Promise<MerkleProofWithNote[]> {\n const { verifyMerkleProof } = await import('../utils/merkle.js')\n const proofs: MerkleProofWithNote[] = []\n\n for (const note of notes) {\n const commitmentBI = BigInt(note.commitment)\n const leafIndex = leaves.findIndex((l) => l === commitmentBI)\n\n console.log(`[getMerkleProofsForNotes] Note commitment: ${note.commitment}`)\n console.log(`[getMerkleProofsForNotes] Note commitment as BigInt: ${commitmentBI}`)\n console.log(`[getMerkleProofsForNotes] Found at leafIndex: ${leafIndex}`)\n console.log(`[getMerkleProofsForNotes] Note's stored leafIndex: ${note.leafIndex}`)\n\n if (leafIndex === -1) {\n console.log(`[getMerkleProofsForNotes] Leaves in tree:`, leaves.map((l) => l.toString()))\n throw new Error(`Note ${note.commitment.slice(0, 10)}... not found on-chain`)\n }\n\n const proof = await tree.getProof(leafIndex)\n\n console.log(`[getMerkleProofsForNotes] Proof root: ${proof.root}`)\n console.log(`[getMerkleProofsForNotes] Proof leafIndex: ${proof.leafIndex}`)\n console.log(`[getMerkleProofsForNotes] PathElements:`, proof.pathElements.map((e) => e.toString()))\n console.log(`[getMerkleProofsForNotes] PathIndices:`, proof.pathIndices)\n\n // Verify the proof locally before returning\n const isValid = await verifyMerkleProof(commitmentBI, proof)\n console.log(`[getMerkleProofsForNotes] Local proof verification: ${isValid}`)\n\n if (!isValid) {\n console.error(`[getMerkleProofsForNotes] WARNING: Merkle proof is invalid!`)\n }\n\n proofs.push({ proof, note: { ...note, leafIndex } })\n }\n\n return proofs\n}\n\n// ============================================================================\n// Circuit Input Building\n// ============================================================================\n\n/**\n * Compute nullifier for a UPP note (BLS12-381)\n *\n * nullifier = Poseidon(ownerSecret, leafIndex, commitment)\n *\n * @param ownerSecret - Owner secret (hash preimage)\n * @param leafIndex - Leaf index in Merkle tree\n * @param commitment - Note commitment\n * @returns Nullifier as bigint\n */\nexport async function computeNullifier(\n ownerSecret: bigint,\n leafIndex: number,\n commitment: bigint\n): Promise<bigint> {\n return await poseidon([ownerSecret, BigInt(leafIndex), commitment])\n}\n\n/**\n * Note with amount for circuit building\n */\nexport interface NoteWithAmount extends NoteCreationResult {\n amount: bigint\n}\n\n/**\n * Build circuit inputs for UPP transfer (1-in-2-out)\n *\n * @param noteProof - Merkle proof for input note\n * @param aspProof - ASP membership proof for input note's origin\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @returns UPP transfer circuit inputs\n */\nexport async function buildUPPTransferCircuitInputs(\n noteProof: MerkleProofWithNote,\n aspProof: ASPProof,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount\n): Promise<UPPTransferCircuitInputs> {\n const { proof, note } = noteProof\n\n // Compute owner hash from secret (hash-based ownership)\n const inputOwnerHash = poseidonOwnerHash(BigInt(note.ownerSecret))\n\n // Verify input commitment locally\n // BLS12-381 commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n const localInputCommitment = computeNoteCommitment(\n note.amount,\n inputOwnerHash,\n note.blinding,\n note.origin,\n note.token,\n )\n\n const storedCommitment = BigInt(note.commitment)\n if (localInputCommitment !== storedCommitment) {\n console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`)\n console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`)\n console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`)\n console.error(` local=${localInputCommitment}, stored=${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 computeNullifier(\n BigInt(note.ownerSecret),\n proof.leafIndex,\n BigInt(note.commitment)\n )\n\n return {\n // Public inputs\n stateRoot: String(proof.root),\n aspRoot: String(aspProof.aspRoot),\n nullifier: String(nullifier),\n outputCommitment1: String(recipientNote.commitment),\n outputCommitment2: String(changeNote.commitment),\n token: String(note.token),\n\n // Private inputs - Input Note\n inputAmount: String(note.amount),\n inputOneTimeSecret: String(BigInt(note.ownerSecret)),\n inputBlinding: String(note.blinding),\n inputOrigin: String(note.origin),\n inputLeafIndex: String(proof.leafIndex),\n inputPathElements: padToStateTreeDepth(proof.pathElements.map((e) => String(e)), '0'),\n inputPathIndices: padToStateTreeDepth(proof.pathIndices.map(String), '0'),\n\n // Private inputs - ASP Membership Proof\n aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), '0'),\n aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), '0'),\n\n // Private inputs - Output Notes (hash-based ownership)\n outputAmount1: String(recipientNote.amount),\n outputOwnerHash1: String(recipientNote.ownerHash),\n outputBlinding1: String(recipientNote.blinding),\n\n outputAmount2: String(changeNote.amount),\n outputOwnerHash2: String(changeNote.ownerHash),\n outputBlinding2: String(changeNote.blinding),\n }\n}\n\n// ============================================================================\n// Transfer Building\n// ============================================================================\n\nimport { DEMO_ASP_ID } from './asp.js'\n\n/**\n * Build a UPP transfer (proof + outputs)\n *\n * This prepares everything needed to submit the transaction.\n * UPP transfer is 1-in-2-out with ASP membership proof.\n *\n * @param ctx - Transfer context\n * @param selectedNote - Note to spend (UPP transfer uses exactly 1 input)\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @param onStageChange - Optional callback for stage updates\n * @returns Transfer build result with proof and outputs\n */\nexport async function buildTransfer(\n ctx: TransferContext,\n selectedNote: SpendableNote,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount,\n onStageChange?: (stage: TransferStage) => void\n): Promise<TransferBuildResult> {\n // 1. Sync Merkle tree\n onStageChange?.('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(ctx.publicClient, ctx.contractAddress)\n\n // 2. Get Merkle proof for note\n const noteProofs = await getMerkleProofsForNotes([selectedNote], leaves, tree)\n const noteProof = noteProofs[0]!\n\n // 3. Generate ASP proof for the note's origin\n const aspProof = await generateASPProof(\n ctx.aspId ?? DEMO_ASP_ID,\n selectedNote.origin,\n ctx.aspApprovedOrigins\n )\n\n // 4. Build circuit inputs and generate proof\n onStageChange?.('generating_proof')\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof,\n aspProof,\n recipientNote,\n changeNote\n )\n\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n ctx.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n publicSignals: proof.publicSignals,\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n nullifier: BigInt(circuitInputs.nullifier),\n outputCommitment1: BigInt(circuitInputs.outputCommitment1),\n outputCommitment2: BigInt(circuitInputs.outputCommitment2),\n token: BigInt(circuitInputs.token),\n recipientOutput: recipientNote,\n changeOutput: changeNote,\n spentNotes: [selectedNote],\n }\n}\n\n/**\n * Format output for contract call (post-quantum)\n */\nexport function formatOutputForContract(note: NoteCreationResult): {\n commitment: Hex\n searchTag: bigint\n ownerHash: bigint\n encryptedNote: Hex\n} {\n return {\n commitment: toHex(note.commitment, { size: 32 }),\n searchTag: note.searchTag,\n ownerHash: note.ownerHash,\n encryptedNote: note.encryptedNote as Hex,\n }\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkNDM5EJEV_cjs = require('./chunk-NDM5EJEV.cjs');
4
- var chunkEUP7MBAH_cjs = require('./chunk-EUP7MBAH.cjs');
5
- var chunkJWNXBALH_cjs = require('./chunk-JWNXBALH.cjs');
6
- var chunkSQKBT2SH_cjs = require('./chunk-SQKBT2SH.cjs');
3
+ var chunkIIUKM5VE_cjs = require('./chunk-IIUKM5VE.cjs');
4
+ var chunkXVIICZKW_cjs = require('./chunk-XVIICZKW.cjs');
5
+ var chunkHEHXSV47_cjs = require('./chunk-HEHXSV47.cjs');
6
+ var chunk2G22R7AJ_cjs = require('./chunk-2G22R7AJ.cjs');
7
7
  var viem = require('viem');
8
8
 
9
9
  // src/deployments/31337.json
@@ -29,24 +29,23 @@ var __default = {
29
29
 
30
30
  // src/deployments/11155111.json
31
31
  var __default2 = {
32
- UniversalPrivatePool: "0x95c800a58ff37c85a15f435cf7bca2af288cb5c7",
32
+ UniversalPrivatePool: "0x0eef76d20a5e4c2fc6b16bf3dc8924f209527803",
33
33
  ASPRegistryHub: "0xfd11c56a23314aa88dfbcc36254f33e5e8b010df",
34
- TestToken: "0xf68645ce430256917ca434a4063c81db59dda611",
35
- TestToken2: "0xe159f88d97ba9663b0c586fc720ec637783db1d4",
34
+ TestToken: "0x0c476ce024f92bfc10fc063dda5eb5cd41c3154e",
35
+ TestToken2: "0x869860fa6230ec023ecd48e45082e3cffa73808a",
36
36
  verifiers: {
37
- TransferVerifier: "0x465261fd85c80e8278a30f04ad4f4558710d6cd3",
38
- MergeVerifier: "0x219e26676e6a72a00ede08e4ebf7d6aa27005676",
39
- WithdrawVerifier: "0x7405f0e1e44d5355d4913543125961790e8b52c0",
40
- JoinSplitVerifier: "0x18e3daed50ca37a1acdea4a26c71ae39ff9b0fb1",
41
- MergeTransfer2x2Verifier: "0x365f5c0ac64f07bc779cdbbcf695ad5024971e06",
42
- MergeTransfer4x2Verifier: "0xbab9f475bcf9377675d01a640b1b70d5a27a8af4"
37
+ TransferVerifier: "0x570ddbaf864fdc934ab7e0288f552a4bc7affd9a",
38
+ MergeVerifier: "0x99d0e8388e2d087c1da918c6c1677927b8aaa513",
39
+ WithdrawVerifier: "0xe1dabb06aa4e6aa7ca2c333c6b06b180378df0bb",
40
+ JoinSplitVerifier: "0xbd277477d7db0dfe30f54209755fb92fcaa13d23",
41
+ MergeTransfer2x2Verifier: "0xa060c9572c7bef7f780cf3021ae2385a9fe6a48e",
42
+ MergeTransfer4x2Verifier: "0x2da8578f82e06c25748e6f2c796813c7c43b8896"
43
43
  },
44
44
  starkVerifiers: {
45
- CircleStarkVerifier: "0x4a911db5b613b399a2622da296c5163c059714ec"
45
+ CircleStarkVerifier: "0xcb8eb6ac91bff0f46cc3d4767255d80e25dee65e"
46
46
  },
47
- deployBlock: 10534869,
48
- deployTimestamp: 1774642370446
49
- };
47
+ deployBlock: 10547005,
48
+ deployTimestamp: 1774792296955};
50
49
 
51
50
  // src/deployments/index.ts
52
51
  function parseDeployment(json, chainId) {
@@ -103,19 +102,19 @@ function registerDeployment(chainId, config) {
103
102
  }
104
103
 
105
104
  // src/core/transfer.ts
106
- chunkJWNXBALH_cjs.init_poseidon();
105
+ chunkHEHXSV47_cjs.init_poseidon();
107
106
  var RPC_CHUNK_SIZE = 9000n;
108
107
  function padToStateTreeDepth(arr, padValue) {
109
- if (arr.length >= chunkSQKBT2SH_cjs.STATE_TREE_DEPTH) {
110
- return arr.slice(0, chunkSQKBT2SH_cjs.STATE_TREE_DEPTH);
108
+ if (arr.length >= chunk2G22R7AJ_cjs.STATE_TREE_DEPTH) {
109
+ return arr.slice(0, chunk2G22R7AJ_cjs.STATE_TREE_DEPTH);
111
110
  }
112
- return [...arr, ...Array(chunkSQKBT2SH_cjs.STATE_TREE_DEPTH - arr.length).fill(padValue)];
111
+ return [...arr, ...Array(chunk2G22R7AJ_cjs.STATE_TREE_DEPTH - arr.length).fill(padValue)];
113
112
  }
114
113
  function padToASPTreeDepth(arr, padValue) {
115
- if (arr.length >= chunkSQKBT2SH_cjs.ASP_TREE_DEPTH) {
116
- return arr.slice(0, chunkSQKBT2SH_cjs.ASP_TREE_DEPTH);
114
+ if (arr.length >= chunk2G22R7AJ_cjs.ASP_TREE_DEPTH) {
115
+ return arr.slice(0, chunk2G22R7AJ_cjs.ASP_TREE_DEPTH);
117
116
  }
118
- return [...arr, ...Array(chunkSQKBT2SH_cjs.ASP_TREE_DEPTH - arr.length).fill(padValue)];
117
+ return [...arr, ...Array(chunk2G22R7AJ_cjs.ASP_TREE_DEPTH - arr.length).fill(padValue)];
119
118
  }
120
119
  var COMMITMENT_INSERTED_EVENT = {
121
120
  type: "event",
@@ -168,7 +167,7 @@ async function syncMerkleTree(publicClient, contractAddress) {
168
167
  }
169
168
  leaves.push(commitment);
170
169
  }
171
- const tree = chunkEUP7MBAH_cjs.buildMerkleTree(leaves);
170
+ const tree = chunkIIUKM5VE_cjs.buildMerkleTree(leaves);
172
171
  const ourRoot = await tree.getRoot();
173
172
  const onChainRoot = await publicClient.readContract({
174
173
  address: contractAddress,
@@ -198,7 +197,7 @@ async function syncMerkleTree(publicClient, contractAddress) {
198
197
  return { tree, leaves };
199
198
  }
200
199
  async function getMerkleProofsForNotes(notes, leaves, tree) {
201
- const { verifyMerkleProof } = await import('./merkle-HGDC6OB4.cjs');
200
+ const { verifyMerkleProof } = await import('./merkle-DZHEOPH3.cjs');
202
201
  const proofs = [];
203
202
  for (const note of notes) {
204
203
  const commitmentBI = BigInt(note.commitment);
@@ -226,24 +225,22 @@ async function getMerkleProofsForNotes(notes, leaves, tree) {
226
225
  return proofs;
227
226
  }
228
227
  async function computeNullifier(ownerSecret, leafIndex, commitment) {
229
- return await chunkJWNXBALH_cjs.poseidon([ownerSecret % chunkJWNXBALH_cjs.BABYJUBJUB_SUBORDER, BigInt(leafIndex), commitment]);
228
+ return await chunkHEHXSV47_cjs.poseidon([ownerSecret, BigInt(leafIndex), commitment]);
230
229
  }
231
230
  async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote, changeNote) {
232
231
  const { proof, note } = noteProof;
233
- const { privateToPublic } = await import('./babyjubjub-MWZLJOVZ.cjs');
234
- const inputPubkey = await privateToPublic(BigInt(note.ownerSecret));
235
- const localInputCommitment = await chunkJWNXBALH_cjs.poseidon([
232
+ const inputOwnerHash = chunkHEHXSV47_cjs.computeOwnerHash(BigInt(note.ownerSecret));
233
+ const localInputCommitment = chunkHEHXSV47_cjs.computeNoteCommitment(
236
234
  note.amount,
237
- inputPubkey.x,
238
- inputPubkey.y,
235
+ inputOwnerHash,
239
236
  note.blinding,
240
237
  note.origin,
241
238
  note.token
242
- ]);
239
+ );
243
240
  const storedCommitment = BigInt(note.commitment);
244
241
  if (localInputCommitment !== storedCommitment) {
245
242
  console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`);
246
- console.error(` amount: ${note.amount}, pubkeyX: ${inputPubkey.x}, pubkeyY: ${inputPubkey.y}`);
243
+ console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`);
247
244
  console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`);
248
245
  console.error(` local=${localInputCommitment}, stored=${storedCommitment}`);
249
246
  throw new Error(
@@ -265,7 +262,7 @@ async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote,
265
262
  token: String(note.token),
266
263
  // Private inputs - Input Note
267
264
  inputAmount: String(note.amount),
268
- inputOneTimeSecret: String(BigInt(note.ownerSecret) % chunkJWNXBALH_cjs.BABYJUBJUB_SUBORDER),
265
+ inputOneTimeSecret: String(BigInt(note.ownerSecret)),
269
266
  inputBlinding: String(note.blinding),
270
267
  inputOrigin: String(note.origin),
271
268
  inputLeafIndex: String(proof.leafIndex),
@@ -274,14 +271,12 @@ async function buildUPPTransferCircuitInputs(noteProof, aspProof, recipientNote,
274
271
  // Private inputs - ASP Membership Proof
275
272
  aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), "0"),
276
273
  aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), "0"),
277
- // Private inputs - Output Notes (BabyJubJub pubkey coordinates)
274
+ // Private inputs - Output Notes (hash-based ownership)
278
275
  outputAmount1: String(recipientNote.amount),
279
- outputPubkeyX1: String(recipientNote.pubkeyX),
280
- outputPubkeyY1: String(recipientNote.pubkeyY),
276
+ outputOwnerHash1: String(recipientNote.ownerHash),
281
277
  outputBlinding1: String(recipientNote.blinding),
282
278
  outputAmount2: String(changeNote.amount),
283
- outputPubkeyX2: String(changeNote.pubkeyX),
284
- outputPubkeyY2: String(changeNote.pubkeyY),
279
+ outputOwnerHash2: String(changeNote.ownerHash),
285
280
  outputBlinding2: String(changeNote.blinding)
286
281
  };
287
282
  }
@@ -290,8 +285,8 @@ async function buildTransfer(ctx, selectedNote, recipientNote, changeNote, onSta
290
285
  const { tree, leaves } = await syncMerkleTree(ctx.publicClient, ctx.contractAddress);
291
286
  const noteProofs = await getMerkleProofsForNotes([selectedNote], leaves, tree);
292
287
  const noteProof = noteProofs[0];
293
- const aspProof = await chunkNDM5EJEV_cjs.generateASPProof(
294
- ctx.aspId ?? chunkNDM5EJEV_cjs.DEMO_ASP_ID,
288
+ const aspProof = await chunkXVIICZKW_cjs.generateASPProof(
289
+ ctx.aspId ?? chunkXVIICZKW_cjs.DEMO_ASP_ID,
295
290
  selectedNote.origin,
296
291
  ctx.aspApprovedOrigins
297
292
  );
@@ -302,12 +297,12 @@ async function buildTransfer(ctx, selectedNote, recipientNote, changeNote, onSta
302
297
  recipientNote,
303
298
  changeNote
304
299
  );
305
- const { proof } = await chunkSQKBT2SH_cjs.generateUPPProof(
300
+ const { proof } = await chunk2G22R7AJ_cjs.generateUPPProof(
306
301
  "transfer",
307
302
  circuitInputs,
308
303
  ctx.circuitBaseUrl ?? "/circuits/"
309
304
  );
310
- const formattedProof = chunkSQKBT2SH_cjs.formatProofForContract(proof);
305
+ const formattedProof = await chunk2G22R7AJ_cjs.formatPlonkProofForContract(proof);
311
306
  return {
312
307
  circuit: "transfer",
313
308
  proof: formattedProof,
@@ -344,5 +339,5 @@ exports.getTokenAddress = getTokenAddress;
344
339
  exports.hasDeployment = hasDeployment;
345
340
  exports.registerDeployment = registerDeployment;
346
341
  exports.syncMerkleTree = syncMerkleTree;
347
- //# sourceMappingURL=chunk-FVT2XRRL.cjs.map
348
- //# sourceMappingURL=chunk-FVT2XRRL.cjs.map
342
+ //# sourceMappingURL=chunk-Q2E432UK.cjs.map
343
+ //# sourceMappingURL=chunk-Q2E432UK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deployments/31337.json","../src/deployments/11155111.json","../src/deployments/index.ts","../src/core/transfer.ts"],"names":["__default","init_poseidon","STATE_TREE_DEPTH","ASP_TREE_DEPTH","buildMerkleTree","poseidon","computeOwnerHash","computeNoteCommitment","generateASPProof","DEMO_ASP_ID","generateUPPProof","formatPlonkProofForContract","toHex"],"mappings":";;;;;;;;;AAAA,IAAA,SAAA,GAAA;AAAA,EACE,oBAAA,EAAwB,4CAAA;AAAA,EACxB,cAAA,EAAkB,4CAAA;AAAA,EAClB,SAAA,EAAa,4CAAA;AAAA,EACb,UAAA,EAAc,4CAAA;AAAA,EACd,SAAA,EAAa;AAAA,IACX,gBAAA,EAAoB,4CAAA;AAAA,IACpB,aAAA,EAAiB,4CAAA;AAAA,IACjB,gBAAA,EAAoB,4CAAA;AAAA,IACpB,iBAAA,EAAqB,4CAAA;AAAA,IACrB,wBAAA,EAA4B,4CAAA;AAAA,IAC5B,wBAAA,EAA4B;AAAA,GAC9B;AAAA,EACA,cAAA,EAAkB;AAAA,IAChB,mBAAA,EAAuB;AAAA,GACzB;AAAA,EACA,WAAA,EAAe,CAAA;AAAA,EACf,eAAA,EAAmB;AACrB,CAAA;;;AClBA,IAAAA,UAAAA,GAAA;AAAA,EACE,oBAAA,EAAwB,4CAAA;AAAA,EACxB,cAAA,EAAkB,4CAAA;AAAA,EAClB,SAAA,EAAa,4CAAA;AAAA,EACb,UAAA,EAAc,4CAAA;AAAA,EACd,SAAA,EAAa;AAAA,IACX,gBAAA,EAAoB,4CAAA;AAAA,IACpB,aAAA,EAAiB,4CAAA;AAAA,IACjB,gBAAA,EAAoB,4CAAA;AAAA,IACpB,iBAAA,EAAqB,4CAAA;AAAA,IACrB,wBAAA,EAA4B,4CAAA;AAAA,IAC5B,wBAAA,EAA4B;AAAA,GAC9B;AAAA,EACA,cAAA,EAAkB;AAAA,IAChB,mBAAA,EAAuB;AAAA,GACzB;AAAA,EACA,WAAA,EAAe,QAAA;AAAA,EACf,eAAA,EAAmB,aAIrB,CAAA;;;AC0DA,SAAS,eAAA,CACP,MACA,OAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAA,EAAW;AAAA,MACT,gBAAA,EAAkB,KAAK,SAAA,CAAU,gBAAA;AAAA,MACjC,aAAA,EAAe,KAAK,SAAA,CAAU,aAAA;AAAA,MAC9B,gBAAA,EAAkB,KAAK,SAAA,CAAU,gBAAA;AAAA,MACjC,iBAAA,EAAmB,KAAK,SAAA,CAAU,iBAAA;AAAA,MAClC,wBAAA,EAA0B,KAAK,SAAA,CAC5B,wBAAA;AAAA,MACH,wBAAA,EAA0B,KAAK,SAAA,CAC5B;AAAA,KACL;AAAA,IACA,cAAA,EAAgB,KAAK,cAAA,GACjB;AAAA,MACE,mBAAA,EAAqB,KAAK,cAAA,CACvB;AAAA,KACL,GACA,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,iBAAiB,IAAA,CAAK;AAAA,GACxB;AACF;AAOA,IAAM,WAAA,GAAgD;AAAA,EACpD,KAAA,EAAO,eAAA,CAAgB,SAAA,EAAoC,KAAK,CAAA;AAAA,EAChE,QAAA,EAAU,eAAA,CAAgBA,UAAAA,EAAsC,QAAQ;AAC1E,CAAA;AAgBO,SAAS,cAAc,OAAA,EAA0C;AACtE,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,IAAK,IAAA;AACjC;AASO,SAAS,qBAAqB,OAAA,EAAmC;AACtE,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,OAAO,CAAA,oBAAA,EACjB,MAAA,CAAO,KAAK,WAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,cAAc,OAAA,EAA0B;AACtD,EAAA,OAAO,OAAA,IAAW,WAAA;AACpB;AAKO,SAAS,oBAAA,GAAiC;AAC/C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAI,MAAM,CAAA;AAC5C;AAKO,SAAS,gBAAgB,OAAA,EAAiC;AAC/D,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,OAAO,WAAW,SAAA,IAAa,IAAA;AACjC;AAmBO,SAAS,kBAAA,CAAmB,SAAiB,MAAA,EAAgC;AAClF,EAAA,WAAA,CAAY,OAAO,CAAA,GAAI,EAAE,GAAG,QAAQ,OAAA,EAAQ;AAC9C;;;AC5LAC,+BAAA,EAAA;AAgHA,IAAM,cAAA,GAAiB,KAAA;AAQvB,SAAS,mBAAA,CAAuB,KAAU,QAAA,EAAkB;AAC1D,EAAA,IAAI,GAAA,CAAI,UAAUC,kCAAA,EAAkB;AAClC,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,kCAAgB,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,CAAC,GAAG,GAAA,EAAK,GAAG,KAAA,CAAMA,kCAAA,GAAmB,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC,CAAA;AACxE;AAQA,SAAS,iBAAA,CAAqB,KAAU,QAAA,EAAkB;AACxD,EAAA,IAAI,GAAA,CAAI,UAAUC,gCAAA,EAAgB;AAChC,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAGA,gCAAc,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,CAAC,GAAG,GAAA,EAAK,GAAG,KAAA,CAAMA,gCAAA,GAAiB,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC,CAAA;AACtE;AAOA,IAAM,yBAAA,GAA4B;AAAA,EAChC,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,oBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,SAAS,IAAA,EAAK;AAAA,IACrD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,WAAA,EAAY;AAAA,IACrC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,WAAA;AAAY;AAEzC,CAAA;AAaA,eAAsB,cAAA,CACpB,cACA,eAAA,EACyE;AACzE,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,cAAA,EAAe;AACvD,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,UAAA,EAAW;AAK9C,EAAA,IAAI,iBAAwB,EAAC;AAE7B,EAAA,IAAI,YAAY,KAAA,EAAO;AAErB,IAAA,cAAA,GAAiB,MAAM,aAAa,OAAA,CAAQ;AAAA,MAC1C,OAAA,EAAS,eAAA;AAAA,MACT,KAAA,EAAO,yBAAA;AAAA,MACP,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,YAAY,UAAA,EAAY,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,GAAI,EAAA;AAC3E,IAAA,OAAA,CAAQ,IAAI,CAAA,uBAAA,EAA0B,OAAO,yBAAyB,SAAS,CAAA,IAAA,EAAO,YAAY,CAAA,CAAE,CAAA;AAEpG,IAAA,OAAO,aAAa,YAAA,EAAc;AAChC,MAAA,MAAM,OAAA,GACJ,SAAA,GAAY,cAAA,GAAiB,YAAA,GAAe,eAAe,SAAA,GAAY,cAAA;AACzE,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,OAAA,CAAQ;AAAA,QACvC,OAAA,EAAS,eAAA;AAAA,QACT,KAAA,EAAO,yBAAA;AAAA,QACP,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,cAAA,GAAiB,cAAA,CAAe,OAAO,KAAK,CAAA;AAC5C,MAAA,SAAA,GAAY,OAAA,GAAU,EAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,SAAU,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,SAAU,CAAA;AACrC,IAAA,OAAO,IAAA,GAAO,IAAA;AAAA,EAChB,CAAC,CAAA;AAGD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,SAAU,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,UAAW,CAAA;AAE9C,IAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,6CAAA,EAAgD,MAAA,CAAO,MAAM,CAAA,eAAA,EAAkB,SAAS,CAAA,2CAAA;AAAA,OAE1F;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,IAAA,GAAOC,kCAAgB,MAAM,CAAA;AAGnC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,EAAQ;AACnC,EAAA,MAAM,WAAA,GAAe,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,IACnD,OAAA,EAAS,eAAA;AAAA,IACT,GAAA,EAAK;AAAA,MACH;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,QAAQ,EAAC;AAAA,QACT,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,QAC7B,eAAA,EAAiB;AAAA;AACnB,KACF;AAAA,IACA,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACxD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAE,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,WAAW,CAAA,CAAE,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,OAAA,KAAY,WAAW,CAAA,CAAE,CAAA;AAEtE,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,OAAA,CAAQ,IAAI,CAAA,wCAAA,CAA0C,CAAA;AACtD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,wBAAA,CAAA;AAAA,MACA,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,QAAA,CAAS,EAAE,CAAC;AAAA,KACzC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAUA,eAAsB,uBAAA,CACpB,KAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,uBAAoB,CAAA;AAC/D,EAAA,MAAM,SAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC3C,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,MAAM,YAAY,CAAA;AAE5D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAA8C,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAC3E,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qDAAA,EAAwD,YAAY,CAAA,CAAE,CAAA;AAClF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8CAAA,EAAiD,SAAS,CAAA,CAAE,CAAA;AACxE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mDAAA,EAAsD,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAElF,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,OAAA,CAAQ,GAAA,CAAI,6CAA6C,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AACxF,MAAA,MAAM,IAAI,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAE3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAA8C,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC3E,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,CAAA,EAA2C,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAClG,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,CAAA,EAA0C,KAAA,CAAM,WAAW,CAAA;AAGvE,IAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,YAAA,EAAc,KAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oDAAA,EAAuD,OAAO,CAAA,CAAE,CAAA;AAE5E,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,MAAM,CAAA,2DAAA,CAA6D,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,SAAA,EAAU,EAAG,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AAgBA,eAAsB,gBAAA,CACpB,WAAA,EACA,SAAA,EACA,UAAA,EACiB;AACjB,EAAA,OAAO,MAAMC,2BAAS,CAAC,WAAA,EAAa,OAAO,SAAS,CAAA,EAAG,UAAU,CAAC,CAAA;AACpE;AAkBA,eAAsB,6BAAA,CACpB,SAAA,EACA,QAAA,EACA,aAAA,EACA,UAAA,EACmC;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,SAAA;AAGxB,EAAA,MAAM,cAAA,GAAiBC,kCAAA,CAAkB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAIjE,EAAA,MAAM,oBAAA,GAAuBC,uCAAA;AAAA,IAC3B,IAAA,CAAK,MAAA;AAAA,IACL,cAAA;AAAA,IACA,IAAA,CAAK,QAAA;AAAA,IACL,IAAA,CAAK,MAAA;AAAA,IACL,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC/C,EAAA,IAAI,yBAAyB,gBAAA,EAAkB;AAC7C,IAAA,OAAA,CAAQ,MAAM,CAAA,mDAAA,CAAqD,CAAA;AACnE,IAAA,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAE,CAAA;AACtE,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,QAAQ,CAAA,UAAA,EAAa,KAAK,MAAM,CAAA,SAAA,EAAY,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAC1F,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,QAAA,EAAW,oBAAoB,CAAA,SAAA,EAAY,gBAAgB,CAAA,CAAE,CAAA;AAC3E,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,2JAAA;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,MAAM,gBAAA;AAAA,IACtB,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,IACvB,KAAA,CAAM,SAAA;AAAA,IACN,MAAA,CAAO,KAAK,UAAU;AAAA,GACxB;AAEA,EAAA,OAAO;AAAA;AAAA,IAEL,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,IAC5B,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAAA,IAChC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,IAC3B,iBAAA,EAAmB,MAAA,CAAO,aAAA,CAAc,UAAU,CAAA;AAAA,IAClD,iBAAA,EAAmB,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAAA,IAC/C,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,IAGxB,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B,kBAAA,EAAoB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACnD,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,IACnC,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IACtC,iBAAA,EAAmB,mBAAA,CAAoB,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,IACpF,kBAAkB,mBAAA,CAAoB,KAAA,CAAM,YAAY,GAAA,CAAI,MAAM,GAAG,GAAG,CAAA;AAAA;AAAA,IAGxE,eAAA,EAAiB,iBAAA,CAAkB,QAAA,CAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,IACtF,gBAAgB,iBAAA,CAAkB,QAAA,CAAS,eAAe,GAAA,CAAI,MAAM,GAAG,GAAG,CAAA;AAAA;AAAA,IAG1E,aAAA,EAAe,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA;AAAA,IAC1C,gBAAA,EAAkB,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA;AAAA,IAChD,eAAA,EAAiB,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA;AAAA,IAE9C,aAAA,EAAe,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA;AAAA,IACvC,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA;AAAA,IAC7C,eAAA,EAAiB,MAAA,CAAO,UAAA,CAAW,QAAQ;AAAA,GAC7C;AACF;AAqBA,eAAsB,aAAA,CACpB,GAAA,EACA,YAAA,EACA,aAAA,EACA,YACA,aAAA,EAC8B;AAE9B,EAAA,aAAA,GAAgB,gBAAgB,CAAA;AAChC,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,cAAA,CAAe,GAAA,CAAI,YAAA,EAAc,GAAA,CAAI,eAAe,CAAA;AAGnF,EAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,CAAC,YAAY,CAAA,EAAG,QAAQ,IAAI,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAG9B,EAAA,MAAM,WAAW,MAAMC,kCAAA;AAAA,IACrB,IAAI,KAAA,IAASC,6BAAA;AAAA,IACb,YAAA,CAAa,MAAA;AAAA,IACb,GAAA,CAAI;AAAA,GACN;AAGA,EAAA,aAAA,GAAgB,kBAAkB,CAAA;AAElC,EAAA,MAAM,gBAAgB,MAAM,6BAAA;AAAA,IAC1B,SAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAMC,kCAAA;AAAA,IACtB,UAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAI,cAAA,IAAkB;AAAA,GACxB;AAEA,EAAA,MAAM,cAAA,GAAiB,MAAMC,6CAAA,CAA4B,KAAK,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,UAAA;AAAA,IACT,KAAA,EAAO,cAAA;AAAA,IACP,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,SAAA,EAAW,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA;AAAA,IACzC,OAAA,EAAS,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA;AAAA,IACrC,SAAA,EAAW,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA;AAAA,IACzC,iBAAA,EAAmB,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AAAA,IACzD,iBAAA,EAAmB,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AAAA,IACzD,KAAA,EAAO,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA;AAAA,IACjC,eAAA,EAAiB,aAAA;AAAA,IACjB,YAAA,EAAc,UAAA;AAAA,IACd,UAAA,EAAY,CAAC,YAAY;AAAA,GAC3B;AACF;AAKO,SAAS,wBAAwB,IAAA,EAKtC;AACA,EAAA,OAAO;AAAA,IACL,YAAYC,UAAA,CAAM,IAAA,CAAK,YAAY,EAAE,IAAA,EAAM,IAAI,CAAA;AAAA,IAC/C,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,eAAe,IAAA,CAAK;AAAA,GACtB;AACF","file":"chunk-Q2E432UK.cjs","sourcesContent":["{\n \"UniversalPrivatePool\": \"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6\",\n \"ASPRegistryHub\": \"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512\",\n \"TestToken\": \"0x610178da211fef7d417bc0e6fed39f05609ad788\",\n \"TestToken2\": \"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0\",\n \"MergeVerifier\": \"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9\",\n \"WithdrawVerifier\": \"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9\",\n \"JoinSplitVerifier\": \"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707\",\n \"MergeTransfer2x2Verifier\": \"0x0165878a594ca255338adfa4d48449f69242eb8f\",\n \"MergeTransfer4x2Verifier\": \"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82\"\n },\n \"deployBlock\": 1,\n \"deployTimestamp\": 1774728354492\n}\n","{\n \"UniversalPrivatePool\": \"0x0eef76d20a5e4c2fc6b16bf3dc8924f209527803\",\n \"ASPRegistryHub\": \"0xfd11c56a23314aa88dfbcc36254f33e5e8b010df\",\n \"TestToken\": \"0x0c476ce024f92bfc10fc063dda5eb5cd41c3154e\",\n \"TestToken2\": \"0x869860fa6230ec023ecd48e45082e3cffa73808a\",\n \"verifiers\": {\n \"TransferVerifier\": \"0x570ddbaf864fdc934ab7e0288f552a4bc7affd9a\",\n \"MergeVerifier\": \"0x99d0e8388e2d087c1da918c6c1677927b8aaa513\",\n \"WithdrawVerifier\": \"0xe1dabb06aa4e6aa7ca2c333c6b06b180378df0bb\",\n \"JoinSplitVerifier\": \"0xbd277477d7db0dfe30f54209755fb92fcaa13d23\",\n \"MergeTransfer2x2Verifier\": \"0xa060c9572c7bef7f780cf3021ae2385a9fe6a48e\",\n \"MergeTransfer4x2Verifier\": \"0x2da8578f82e06c25748e6f2c796813c7c43b8896\"\n },\n \"starkVerifiers\": {\n \"CircleStarkVerifier\": \"0xcb8eb6ac91bff0f46cc3d4767255d80e25dee65e\"\n },\n \"deployBlock\": 10547005,\n \"deployTimestamp\": 1774792296955,\n \"proofSystem\": \"PLONK\",\n \"curve\": \"BLS12-381\",\n \"verifierType\": \"PlonkVerifierBLS12381\"\n}\n","/**\n * Deployment Configuration Loader\n *\n * Loads contract addresses based on chain ID.\n * Built-in: Anvil (31337) and Sepolia (11155111).\n * Custom chains can be registered at runtime via registerDeployment().\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Verifier contract addresses\n */\nexport interface VerifierAddresses {\n TransferVerifier: Address;\n MergeVerifier: Address;\n WithdrawVerifier: Address;\n JoinSplitVerifier?: Address;\n MergeTransfer2x2Verifier?: Address;\n MergeTransfer4x2Verifier?: Address;\n}\n\n/**\n * STARK verifier contract addresses\n */\nexport interface StarkVerifierAddresses {\n CircleStarkVerifier?: Address;\n}\n\n/**\n * Deployment configuration for a chain\n */\nexport interface DeploymentConfig {\n /** Universal Private Pool contract address */\n UniversalPrivatePool: Address;\n /** ASP Registry Hub contract address */\n ASPRegistryHub: Address;\n /** Test token address (local/testnet) */\n TestToken?: Address;\n /** Test token 2 address — bonding curve token (local/testnet) */\n TestToken2?: Address;\n /** Verifier contract addresses */\n verifiers: VerifierAddresses;\n /** STARK verifier contract addresses */\n starkVerifiers?: StarkVerifierAddresses;\n /** Chain ID */\n chainId: number;\n /** Block number when contracts were deployed (for efficient scanning) */\n deployBlock: number;\n /** Timestamp when contracts were deployed */\n deployTimestamp?: number;\n}\n\n/**\n * Raw JSON file format (without chainId, which is added dynamically)\n */\ninterface DeploymentJSON {\n UniversalPrivatePool: string;\n ASPRegistryHub: string;\n TestToken?: string;\n TestToken2?: string;\n verifiers: {\n TransferVerifier: string;\n MergeVerifier: string;\n WithdrawVerifier: string;\n JoinSplitVerifier?: string;\n MergeTransfer2x2Verifier?: string;\n MergeTransfer4x2Verifier?: string;\n };\n starkVerifiers?: {\n CircleStarkVerifier?: string;\n };\n deployBlock: number;\n deployTimestamp?: number;\n}\n\n/**\n * Parse raw deployment JSON into typed config\n */\nfunction parseDeployment(\n json: DeploymentJSON,\n chainId: number\n): DeploymentConfig {\n return {\n UniversalPrivatePool: json.UniversalPrivatePool as Address,\n ASPRegistryHub: json.ASPRegistryHub as Address,\n TestToken: json.TestToken as Address | undefined,\n TestToken2: json.TestToken2 as Address | undefined,\n verifiers: {\n TransferVerifier: json.verifiers.TransferVerifier as Address,\n MergeVerifier: json.verifiers.MergeVerifier as Address,\n WithdrawVerifier: json.verifiers.WithdrawVerifier as Address,\n JoinSplitVerifier: json.verifiers.JoinSplitVerifier as Address | undefined,\n MergeTransfer2x2Verifier: json.verifiers\n .MergeTransfer2x2Verifier as Address | undefined,\n MergeTransfer4x2Verifier: json.verifiers\n .MergeTransfer4x2Verifier as Address | undefined,\n },\n starkVerifiers: json.starkVerifiers\n ? {\n CircleStarkVerifier: json.starkVerifiers\n .CircleStarkVerifier as Address | undefined,\n }\n : undefined,\n chainId,\n deployBlock: json.deployBlock,\n deployTimestamp: json.deployTimestamp,\n };\n}\n\n// Import deployment configs\n// These will be updated by the extract-deployment.js script\nimport anvil from \"./31337.json\" with { type: \"json\" };\nimport sepolia from \"./11155111.json\" with { type: \"json\" };\n\nconst deployments: Record<number, DeploymentConfig> = {\n 31337: parseDeployment(anvil as unknown as DeploymentJSON, 31337),\n 11155111: parseDeployment(sepolia as unknown as DeploymentJSON, 11155111),\n};\n\n/**\n * Get deployment config for a chain\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config or null if not found\n *\n * @example\n * ```ts\n * const deployment = getDeployment(31337)\n * if (deployment) {\n * console.log('Pool address:', deployment.UniversalPrivatePool)\n * }\n * ```\n */\nexport function getDeployment(chainId: number): DeploymentConfig | null {\n return deployments[chainId] ?? null;\n}\n\n/**\n * Get deployment config or throw if not found\n *\n * @param chainId - Chain ID to get deployment for\n * @returns Deployment config\n * @throws Error if deployment not found\n */\nexport function getDeploymentOrThrow(chainId: number): DeploymentConfig {\n const deployment = getDeployment(chainId);\n if (!deployment) {\n throw new Error(\n `No deployment found for chain ${chainId}. ` +\n `Supported chains: ${Object.keys(deployments).join(\", \")}`\n );\n }\n return deployment;\n}\n\n/**\n * Check if a chain has a deployment\n */\nexport function hasDeployment(chainId: number): boolean {\n return chainId in deployments;\n}\n\n/**\n * Get all supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(deployments).map(Number);\n}\n\n/**\n * Get the token address for a chain\n */\nexport function getTokenAddress(chainId: number): Address | null {\n const deployment = getDeployment(chainId);\n if (!deployment) return null;\n return deployment.TestToken ?? null;\n}\n\n/**\n * Register a deployment for a custom chain at runtime.\n *\n * Use this when deploying your own pool on a chain not built into the SDK.\n * Overrides any existing deployment for the same chainId.\n *\n * @example\n * ```ts\n * registerDeployment(8453, {\n * UniversalPrivatePool: '0x...',\n * ASPRegistryHub: '0x...',\n * verifiers: { TransferVerifier: '0x...', MergeVerifier: '0x...', WithdrawVerifier: '0x...' },\n * chainId: 8453,\n * deployBlock: 12345678,\n * })\n * ```\n */\nexport function registerDeployment(chainId: number, config: DeploymentConfig): void {\n deployments[chainId] = { ...config, chainId };\n}\n","/**\n * Transfer Module\n *\n * Core logic for building and executing UPP transfers.\n * This module is framework-agnostic (no React).\n */\n\nimport { toHex, type Address, type Hex, type PublicClient } from 'viem'\nimport { getDeployment } from '../deployments/index.js'\nimport { buildMerkleTree, type MerkleProof } from '../utils/merkle.js'\nimport { poseidon, computeOwnerHash as poseidonOwnerHash, computeNoteCommitment } from '../utils/poseidon.js'\nimport {\n generateUPPProof,\n formatPlonkProofForContract,\n STATE_TREE_DEPTH,\n ASP_TREE_DEPTH,\n type UPPCircuitType,\n type UPPTransferCircuitInputs,\n} from './proof.js'\nimport { generateASPProof, type ASPProof } from './asp.js'\nimport type { NoteCreationResult } from '../react/use-upp-account.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Transfer stage for progress tracking\n */\nexport type TransferStage =\n | 'selecting_notes'\n | 'syncing_merkle'\n | 'creating_outputs'\n | 'generating_proof'\n | 'submitting_tx'\n | 'confirming'\n\n/**\n * A shielded note with all data needed for spending\n *\n * Post-quantum: uses ownerSecret/ownerHash instead of BabyJubJub one-time keys.\n * Ownership is proven via hash preimage: Poseidon(ownerSecret) == ownerHash.\n */\nexport interface SpendableNote {\n amount: bigint\n blinding: bigint\n commitment: string\n /** Owner secret (hash preimage for ownership proof) */\n ownerSecret: string\n /** Owner hash = Poseidon(ownerSecret) - committed in the note */\n ownerHash: string\n leafIndex: number\n /** Origin address (depositor) - required for UPP circuits */\n origin: bigint\n /** Token address - required for UPP circuits */\n token: bigint\n}\n\n/**\n * Merkle proof with associated note\n */\nexport interface MerkleProofWithNote {\n proof: MerkleProof\n note: SpendableNote\n}\n\n/**\n * Transfer context (dependencies)\n */\nexport interface TransferContext {\n /** viem PublicClient for RPC calls */\n publicClient: PublicClient\n /** Contract address */\n contractAddress: Address\n /** Chain ID */\n chainId: number\n /** Circuit 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 * Transfer result\n */\nexport interface TransferBuildResult {\n /** Circuit type used */\n circuit: UPPCircuitType\n /** Formatted PLONK proof for contract */\n proof: {\n proofBytes: `0x${string}`\n publicSignals: bigint[]\n }\n /** Public signals from proof */\n publicSignals: string[]\n /** State tree root */\n stateRoot: bigint\n /** ASP tree root */\n aspRoot: bigint\n /** Nullifier hash */\n nullifier: bigint\n /** Output commitment 1 */\n outputCommitment1: bigint\n /** Output commitment 2 */\n outputCommitment2: bigint\n /** Token address */\n token: bigint\n /** Recipient output */\n recipientOutput: NoteCreationResult\n /** Change output */\n changeOutput: NoteCreationResult\n /** Notes that will be spent */\n spentNotes: SpendableNote[]\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Chunk size for paginated RPC queries on testnets */\nconst RPC_CHUNK_SIZE = 9000n\n\n/**\n * Pad an array to the state tree depth (32 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length STATE_TREE_DEPTH\n */\nfunction padToStateTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= STATE_TREE_DEPTH) {\n return arr.slice(0, STATE_TREE_DEPTH)\n }\n return [...arr, ...Array(STATE_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * Pad an array to the ASP tree depth (20 levels)\n * @param arr - Array to pad\n * @param padValue - Value to use for padding (default: '0')\n * @returns Padded array of length ASP_TREE_DEPTH\n */\nfunction padToASPTreeDepth<T>(arr: T[], padValue: T): T[] {\n if (arr.length >= ASP_TREE_DEPTH) {\n return arr.slice(0, ASP_TREE_DEPTH)\n }\n return [...arr, ...Array(ASP_TREE_DEPTH - arr.length).fill(padValue)]\n}\n\n/**\n * CommitmentInserted event — emitted by _insertLeaf() for ALL leaf insertions\n * (shield, transfer, merge, swap fill, swap claim, swap cancel).\n * This is the single canonical event for Merkle tree reconstruction.\n */\nconst COMMITMENT_INSERTED_EVENT = {\n type: 'event' as const,\n name: 'CommitmentInserted',\n inputs: [\n { type: 'bytes32', name: 'commitment', indexed: true },\n { type: 'uint256', name: 'leafIndex' },\n { type: 'uint256', name: 'timestamp' },\n ],\n}\n\n// ============================================================================\n// Merkle Tree Functions\n// ============================================================================\n\n/**\n * Fetch all commitments from the contract and build a Merkle tree\n *\n * @param publicClient - viem PublicClient\n * @param contractAddress - Contract address\n * @returns Object with tree and leaves array\n */\nexport async function syncMerkleTree(\n publicClient: PublicClient,\n contractAddress: Address\n): Promise<{ tree: ReturnType<typeof buildMerkleTree>; leaves: bigint[] }> {\n const currentBlock = await publicClient.getBlockNumber()\n const chainId = await publicClient.getChainId()\n\n // Use CommitmentInserted events — the canonical event emitted by _insertLeaf()\n // for ALL operations (shield, transfer, merge, swap fill/claim/cancel).\n // Each event has an explicit leafIndex, so ordering is deterministic.\n let commitmentLogs: any[] = []\n\n if (chainId === 31337) {\n // Anvil - single query is fine\n commitmentLogs = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock: 0n,\n })\n } else {\n // Testnet/mainnet - paginate to avoid RPC limits\n const deployment = getDeployment(chainId)\n let fromBlock = deployment?.deployBlock ? BigInt(deployment.deployBlock) : 0n\n console.log(`[syncMerkleTree] Chain ${chainId}: scanning from block ${fromBlock} to ${currentBlock}`)\n\n while (fromBlock <= currentBlock) {\n const toBlock =\n fromBlock + RPC_CHUNK_SIZE > currentBlock ? currentBlock : fromBlock + RPC_CHUNK_SIZE\n const chunk = await publicClient.getLogs({\n address: contractAddress,\n event: COMMITMENT_INSERTED_EVENT,\n fromBlock,\n toBlock,\n })\n commitmentLogs = commitmentLogs.concat(chunk)\n fromBlock = toBlock + 1n\n }\n }\n\n // Sort by explicit leafIndex (most reliable), falling back to block+logIndex\n commitmentLogs.sort((a: any, b: any) => {\n const idxA = Number(a.args.leafIndex!)\n const idxB = Number(b.args.leafIndex!)\n return idxA - idxB\n })\n\n // Build leaves array using the explicit leafIndex from each event\n const leaves: bigint[] = []\n for (const log of commitmentLogs) {\n const leafIndex = Number(log.args.leafIndex!)\n const commitment = BigInt(log.args.commitment!)\n\n if (leaves.length !== leafIndex) {\n console.warn(\n `[syncMerkleTree] WARNING: Expected leafIndex ${leaves.length} but event has ${leafIndex}. ` +\n `This may indicate missed events or reorg.`\n )\n }\n leaves.push(commitment)\n }\n\n const tree = buildMerkleTree(leaves)\n\n // Debug: compare our root with on-chain root\n const ourRoot = await tree.getRoot()\n const onChainRoot = (await publicClient.readContract({\n address: contractAddress,\n abi: [\n {\n type: 'function',\n name: 'getMerkleRoot',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'getMerkleRoot',\n })) as bigint\n\n console.log(`[syncMerkleTree] Leaves count: ${leaves.length}`)\n console.log(`[syncMerkleTree] Tree depth: ${tree.depth}`)\n console.log(`[syncMerkleTree] Our computed root: ${ourRoot}`)\n console.log(`[syncMerkleTree] On-chain root: ${onChainRoot}`)\n console.log(`[syncMerkleTree] Roots match: ${ourRoot === onChainRoot}`)\n\n if (ourRoot !== onChainRoot) {\n console.log(`[syncMerkleTree] WARNING: Root mismatch!`)\n console.log(\n `[syncMerkleTree] Leaves:`,\n leaves.map((l) => '0x' + l.toString(16))\n )\n }\n\n return { tree, leaves }\n}\n\n/**\n * Get Merkle proofs for a set of notes\n *\n * @param notes - Notes to get proofs for\n * @param leaves - All leaves in the tree\n * @param tree - Merkle tree instance\n * @returns Array of proofs with associated notes\n */\nexport async function getMerkleProofsForNotes(\n notes: SpendableNote[],\n leaves: bigint[],\n tree: ReturnType<typeof buildMerkleTree>\n): Promise<MerkleProofWithNote[]> {\n const { verifyMerkleProof } = await import('../utils/merkle.js')\n const proofs: MerkleProofWithNote[] = []\n\n for (const note of notes) {\n const commitmentBI = BigInt(note.commitment)\n const leafIndex = leaves.findIndex((l) => l === commitmentBI)\n\n console.log(`[getMerkleProofsForNotes] Note commitment: ${note.commitment}`)\n console.log(`[getMerkleProofsForNotes] Note commitment as BigInt: ${commitmentBI}`)\n console.log(`[getMerkleProofsForNotes] Found at leafIndex: ${leafIndex}`)\n console.log(`[getMerkleProofsForNotes] Note's stored leafIndex: ${note.leafIndex}`)\n\n if (leafIndex === -1) {\n console.log(`[getMerkleProofsForNotes] Leaves in tree:`, leaves.map((l) => l.toString()))\n throw new Error(`Note ${note.commitment.slice(0, 10)}... not found on-chain`)\n }\n\n const proof = await tree.getProof(leafIndex)\n\n console.log(`[getMerkleProofsForNotes] Proof root: ${proof.root}`)\n console.log(`[getMerkleProofsForNotes] Proof leafIndex: ${proof.leafIndex}`)\n console.log(`[getMerkleProofsForNotes] PathElements:`, proof.pathElements.map((e) => e.toString()))\n console.log(`[getMerkleProofsForNotes] PathIndices:`, proof.pathIndices)\n\n // Verify the proof locally before returning\n const isValid = await verifyMerkleProof(commitmentBI, proof)\n console.log(`[getMerkleProofsForNotes] Local proof verification: ${isValid}`)\n\n if (!isValid) {\n console.error(`[getMerkleProofsForNotes] WARNING: Merkle proof is invalid!`)\n }\n\n proofs.push({ proof, note: { ...note, leafIndex } })\n }\n\n return proofs\n}\n\n// ============================================================================\n// Circuit Input Building\n// ============================================================================\n\n/**\n * Compute nullifier for a UPP note (BLS12-381)\n *\n * nullifier = Poseidon(ownerSecret, leafIndex, commitment)\n *\n * @param ownerSecret - Owner secret (hash preimage)\n * @param leafIndex - Leaf index in Merkle tree\n * @param commitment - Note commitment\n * @returns Nullifier as bigint\n */\nexport async function computeNullifier(\n ownerSecret: bigint,\n leafIndex: number,\n commitment: bigint\n): Promise<bigint> {\n return await poseidon([ownerSecret, BigInt(leafIndex), commitment])\n}\n\n/**\n * Note with amount for circuit building\n */\nexport interface NoteWithAmount extends NoteCreationResult {\n amount: bigint\n}\n\n/**\n * Build circuit inputs for UPP transfer (1-in-2-out)\n *\n * @param noteProof - Merkle proof for input note\n * @param aspProof - ASP membership proof for input note's origin\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @returns UPP transfer circuit inputs\n */\nexport async function buildUPPTransferCircuitInputs(\n noteProof: MerkleProofWithNote,\n aspProof: ASPProof,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount\n): Promise<UPPTransferCircuitInputs> {\n const { proof, note } = noteProof\n\n // Compute owner hash from secret (hash-based ownership)\n const inputOwnerHash = poseidonOwnerHash(BigInt(note.ownerSecret))\n\n // Verify input commitment locally\n // BLS12-381 commitment: Poseidon(amount, ownerHash, blinding, origin, token)\n const localInputCommitment = computeNoteCommitment(\n note.amount,\n inputOwnerHash,\n note.blinding,\n note.origin,\n note.token,\n )\n\n const storedCommitment = BigInt(note.commitment)\n if (localInputCommitment !== storedCommitment) {\n console.error(`[buildUPPTransferCircuitInputs] COMMITMENT MISMATCH`)\n console.error(` amount: ${note.amount}, ownerHash: ${inputOwnerHash}`)\n console.error(` blinding: ${note.blinding}, origin: ${note.origin}, token: ${note.token}`)\n console.error(` local=${localInputCommitment}, stored=${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 computeNullifier(\n BigInt(note.ownerSecret),\n proof.leafIndex,\n BigInt(note.commitment)\n )\n\n return {\n // Public inputs\n stateRoot: String(proof.root),\n aspRoot: String(aspProof.aspRoot),\n nullifier: String(nullifier),\n outputCommitment1: String(recipientNote.commitment),\n outputCommitment2: String(changeNote.commitment),\n token: String(note.token),\n\n // Private inputs - Input Note\n inputAmount: String(note.amount),\n inputOneTimeSecret: String(BigInt(note.ownerSecret)),\n inputBlinding: String(note.blinding),\n inputOrigin: String(note.origin),\n inputLeafIndex: String(proof.leafIndex),\n inputPathElements: padToStateTreeDepth(proof.pathElements.map((e) => String(e)), '0'),\n inputPathIndices: padToStateTreeDepth(proof.pathIndices.map(String), '0'),\n\n // Private inputs - ASP Membership Proof\n aspPathElements: padToASPTreeDepth(aspProof.aspPathElements.map((e) => String(e)), '0'),\n aspPathIndices: padToASPTreeDepth(aspProof.aspPathIndices.map(String), '0'),\n\n // Private inputs - Output Notes (hash-based ownership)\n outputAmount1: String(recipientNote.amount),\n outputOwnerHash1: String(recipientNote.ownerHash),\n outputBlinding1: String(recipientNote.blinding),\n\n outputAmount2: String(changeNote.amount),\n outputOwnerHash2: String(changeNote.ownerHash),\n outputBlinding2: String(changeNote.blinding),\n }\n}\n\n// ============================================================================\n// Transfer Building\n// ============================================================================\n\nimport { DEMO_ASP_ID } from './asp.js'\n\n/**\n * Build a UPP transfer (proof + outputs)\n *\n * This prepares everything needed to submit the transaction.\n * UPP transfer is 1-in-2-out with ASP membership proof.\n *\n * @param ctx - Transfer context\n * @param selectedNote - Note to spend (UPP transfer uses exactly 1 input)\n * @param recipientNote - Output note for recipient\n * @param changeNote - Output note for change\n * @param onStageChange - Optional callback for stage updates\n * @returns Transfer build result with proof and outputs\n */\nexport async function buildTransfer(\n ctx: TransferContext,\n selectedNote: SpendableNote,\n recipientNote: NoteWithAmount,\n changeNote: NoteWithAmount,\n onStageChange?: (stage: TransferStage) => void\n): Promise<TransferBuildResult> {\n // 1. Sync Merkle tree\n onStageChange?.('syncing_merkle')\n const { tree, leaves } = await syncMerkleTree(ctx.publicClient, ctx.contractAddress)\n\n // 2. Get Merkle proof for note\n const noteProofs = await getMerkleProofsForNotes([selectedNote], leaves, tree)\n const noteProof = noteProofs[0]!\n\n // 3. Generate ASP proof for the note's origin\n const aspProof = await generateASPProof(\n ctx.aspId ?? DEMO_ASP_ID,\n selectedNote.origin,\n ctx.aspApprovedOrigins\n )\n\n // 4. Build circuit inputs and generate proof\n onStageChange?.('generating_proof')\n\n const circuitInputs = await buildUPPTransferCircuitInputs(\n noteProof,\n aspProof,\n recipientNote,\n changeNote\n )\n\n const { proof } = await generateUPPProof(\n 'transfer',\n circuitInputs,\n ctx.circuitBaseUrl ?? '/circuits/'\n )\n\n const formattedProof = await formatPlonkProofForContract(proof)\n\n return {\n circuit: 'transfer',\n proof: formattedProof,\n publicSignals: proof.publicSignals,\n stateRoot: BigInt(circuitInputs.stateRoot),\n aspRoot: BigInt(circuitInputs.aspRoot),\n nullifier: BigInt(circuitInputs.nullifier),\n outputCommitment1: BigInt(circuitInputs.outputCommitment1),\n outputCommitment2: BigInt(circuitInputs.outputCommitment2),\n token: BigInt(circuitInputs.token),\n recipientOutput: recipientNote,\n changeOutput: changeNote,\n spentNotes: [selectedNote],\n }\n}\n\n/**\n * Format output for contract call (post-quantum)\n */\nexport function formatOutputForContract(note: NoteCreationResult): {\n commitment: Hex\n searchTag: bigint\n ownerHash: bigint\n encryptedNote: Hex\n} {\n return {\n commitment: toHex(note.commitment, { size: 32 }),\n searchTag: note.searchTag,\n ownerHash: note.ownerHash,\n encryptedNote: note.encryptedNote as Hex,\n }\n}\n"]}