@unlink-xyz/core 0.1.2 → 0.1.3-canary.0877bfe

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 (350) hide show
  1. package/dist/account/{zkAccount.d.ts → account.d.ts} +7 -5
  2. package/dist/account/account.d.ts.map +1 -0
  3. package/dist/account/{zkAccount.js → account.js} +57 -43
  4. package/dist/browser/index.js +108202 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/circuits.json +74 -0
  7. package/dist/clients/broadcaster.d.ts +7 -2
  8. package/dist/clients/broadcaster.d.ts.map +1 -1
  9. package/dist/clients/broadcaster.js +9 -1
  10. package/dist/clients/http.d.ts +6 -0
  11. package/dist/clients/http.d.ts.map +1 -1
  12. package/dist/clients/http.js +24 -9
  13. package/dist/clients/indexer.d.ts +11 -0
  14. package/dist/clients/indexer.d.ts.map +1 -1
  15. package/dist/clients/indexer.js +40 -11
  16. package/dist/config.d.ts +28 -9
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +33 -26
  19. package/dist/constants.d.ts +6 -0
  20. package/dist/constants.d.ts.map +1 -0
  21. package/dist/constants.js +5 -0
  22. package/dist/core.d.ts.map +1 -1
  23. package/dist/core.js +5 -2
  24. package/dist/crypto-adapters/auto-init.d.ts +2 -0
  25. package/dist/crypto-adapters/auto-init.d.ts.map +1 -0
  26. package/dist/crypto-adapters/auto-init.js +7 -0
  27. package/dist/crypto-adapters/index.d.ts +22 -0
  28. package/dist/crypto-adapters/index.d.ts.map +1 -0
  29. package/dist/crypto-adapters/index.js +47 -0
  30. package/dist/crypto-adapters/polyfills.d.ts +5 -0
  31. package/dist/crypto-adapters/polyfills.d.ts.map +1 -0
  32. package/dist/crypto-adapters/polyfills.js +8 -0
  33. package/dist/errors.d.ts +9 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +18 -0
  36. package/dist/history/index.d.ts +3 -0
  37. package/dist/history/index.d.ts.map +1 -0
  38. package/dist/history/index.js +2 -0
  39. package/dist/history/service.d.ts +46 -0
  40. package/dist/history/service.d.ts.map +1 -0
  41. package/dist/history/service.js +354 -0
  42. package/dist/history/types.d.ts +21 -0
  43. package/dist/history/types.d.ts.map +1 -0
  44. package/dist/index.d.ts +12 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +11 -4
  47. package/dist/keys/address.d.ts +13 -0
  48. package/dist/keys/address.d.ts.map +1 -0
  49. package/dist/keys/address.js +55 -0
  50. package/dist/keys/derive.d.ts +37 -0
  51. package/dist/keys/derive.d.ts.map +1 -0
  52. package/dist/keys/derive.js +112 -0
  53. package/dist/keys/hex.d.ts +17 -0
  54. package/dist/keys/hex.d.ts.map +1 -0
  55. package/dist/keys/hex.js +66 -0
  56. package/dist/keys/index.d.ts +5 -0
  57. package/dist/keys/index.d.ts.map +1 -0
  58. package/dist/keys/index.js +4 -0
  59. package/dist/keys/mnemonic.d.ts +8 -0
  60. package/dist/keys/mnemonic.d.ts.map +1 -0
  61. package/dist/keys/mnemonic.js +23 -0
  62. package/dist/keys.d.ts +4 -1
  63. package/dist/keys.d.ts.map +1 -1
  64. package/dist/keys.js +4 -0
  65. package/dist/prover/config.d.ts +1 -15
  66. package/dist/prover/config.d.ts.map +1 -1
  67. package/dist/prover/config.js +1 -11
  68. package/dist/prover/prover.d.ts +15 -4
  69. package/dist/prover/prover.d.ts.map +1 -1
  70. package/dist/prover/prover.js +115 -98
  71. package/dist/prover/registry.d.ts +3 -30
  72. package/dist/prover/registry.d.ts.map +1 -1
  73. package/dist/prover/registry.js +12 -51
  74. package/dist/state/merkle/hydrator.d.ts.map +1 -1
  75. package/dist/state/merkle/hydrator.js +3 -2
  76. package/dist/state/merkle/index.d.ts +1 -1
  77. package/dist/state/merkle/index.d.ts.map +1 -1
  78. package/dist/state/merkle/index.js +1 -1
  79. package/dist/state/merkle/merkle-tree.d.ts +8 -0
  80. package/dist/state/merkle/merkle-tree.d.ts.map +1 -1
  81. package/dist/state/merkle/merkle-tree.js +16 -7
  82. package/dist/state/store/ciphertext-store.d.ts +4 -0
  83. package/dist/state/store/ciphertext-store.d.ts.map +1 -1
  84. package/dist/state/store/ciphertext-store.js +12 -0
  85. package/dist/state/store/history-store.d.ts +24 -0
  86. package/dist/state/store/history-store.d.ts.map +1 -0
  87. package/dist/state/store/history-store.js +53 -0
  88. package/dist/state/store/index.d.ts +3 -2
  89. package/dist/state/store/index.d.ts.map +1 -1
  90. package/dist/state/store/index.js +1 -0
  91. package/dist/state/store/job-store.d.ts +7 -7
  92. package/dist/state/store/job-store.d.ts.map +1 -1
  93. package/dist/state/store/job-store.js +65 -39
  94. package/dist/state/store/jobs.d.ts +65 -18
  95. package/dist/state/store/jobs.d.ts.map +1 -1
  96. package/dist/state/store/leaf-store.d.ts.map +1 -1
  97. package/dist/state/store/leaf-store.js +0 -3
  98. package/dist/state/store/note-store.d.ts +7 -7
  99. package/dist/state/store/note-store.d.ts.map +1 -1
  100. package/dist/state/store/note-store.js +38 -34
  101. package/dist/state/store/nullifier-store.d.ts +9 -0
  102. package/dist/state/store/nullifier-store.d.ts.map +1 -1
  103. package/dist/state/store/nullifier-store.js +32 -2
  104. package/dist/state/store/records.d.ts +31 -2
  105. package/dist/state/store/records.d.ts.map +1 -1
  106. package/dist/state/store/root-store.d.ts.map +1 -1
  107. package/dist/state/store/root-store.js +0 -4
  108. package/dist/state/store/store.d.ts +61 -27
  109. package/dist/state/store/store.d.ts.map +1 -1
  110. package/dist/state/store/store.js +92 -1
  111. package/dist/storage/indexeddb.js +1 -1
  112. package/dist/storage/memory.d.ts.map +1 -1
  113. package/dist/storage/memory.js +5 -1
  114. package/dist/transactions/deposit.d.ts +12 -15
  115. package/dist/transactions/deposit.d.ts.map +1 -1
  116. package/dist/transactions/deposit.js +203 -152
  117. package/dist/transactions/index.d.ts +7 -4
  118. package/dist/transactions/index.d.ts.map +1 -1
  119. package/dist/transactions/index.js +7 -2
  120. package/dist/transactions/note-selection.d.ts +17 -0
  121. package/dist/transactions/note-selection.d.ts.map +1 -0
  122. package/dist/transactions/note-selection.js +201 -0
  123. package/dist/transactions/note-sync.d.ts +5 -33
  124. package/dist/transactions/note-sync.d.ts.map +1 -1
  125. package/dist/transactions/note-sync.js +320 -155
  126. package/dist/transactions/reconcile.d.ts +10 -12
  127. package/dist/transactions/reconcile.d.ts.map +1 -1
  128. package/dist/transactions/reconcile.js +53 -7
  129. package/dist/transactions/transact.d.ts +13 -24
  130. package/dist/transactions/transact.d.ts.map +1 -1
  131. package/dist/transactions/transact.js +393 -507
  132. package/dist/transactions/transaction-planner.d.ts +34 -0
  133. package/dist/transactions/transaction-planner.d.ts.map +1 -0
  134. package/dist/transactions/transaction-planner.js +116 -0
  135. package/dist/transactions/transfer-planner.d.ts +36 -0
  136. package/dist/transactions/transfer-planner.d.ts.map +1 -0
  137. package/dist/transactions/transfer-planner.js +85 -0
  138. package/dist/transactions/types/deposit.d.ts +67 -0
  139. package/dist/transactions/types/deposit.d.ts.map +1 -0
  140. package/dist/transactions/types/domain.d.ts +67 -0
  141. package/dist/transactions/types/domain.d.ts.map +1 -0
  142. package/dist/transactions/types/domain.js +4 -0
  143. package/dist/transactions/types/index.d.ts +18 -0
  144. package/dist/transactions/types/index.d.ts.map +1 -0
  145. package/dist/transactions/types/index.js +17 -0
  146. package/dist/transactions/types/options.d.ts +45 -0
  147. package/dist/transactions/types/options.d.ts.map +1 -0
  148. package/dist/transactions/types/options.js +1 -0
  149. package/dist/transactions/types/planning.d.ts +80 -0
  150. package/dist/transactions/types/planning.d.ts.map +1 -0
  151. package/dist/transactions/types/planning.js +1 -0
  152. package/dist/transactions/types/state-stores.d.ts +103 -0
  153. package/dist/transactions/types/state-stores.d.ts.map +1 -0
  154. package/dist/transactions/types/state-stores.js +1 -0
  155. package/dist/transactions/types/transact.d.ts +76 -0
  156. package/dist/transactions/types/transact.d.ts.map +1 -0
  157. package/dist/transactions/types/transact.js +1 -0
  158. package/dist/transactions/withdrawal-planner.d.ts +58 -0
  159. package/dist/transactions/withdrawal-planner.d.ts.map +1 -0
  160. package/dist/transactions/withdrawal-planner.js +128 -0
  161. package/dist/tsconfig.tsbuildinfo +1 -1
  162. package/dist/tsup.browser.config.d.ts +7 -0
  163. package/dist/tsup.browser.config.d.ts.map +1 -0
  164. package/dist/tsup.browser.config.js +34 -0
  165. package/dist/utils/amounts.d.ts +39 -0
  166. package/dist/utils/amounts.d.ts.map +1 -0
  167. package/dist/utils/amounts.js +89 -0
  168. package/dist/utils/async.d.ts +9 -0
  169. package/dist/utils/async.d.ts.map +1 -1
  170. package/dist/utils/async.js +24 -0
  171. package/dist/utils/bigint.js +7 -7
  172. package/dist/utils/crypto.d.ts +11 -5
  173. package/dist/utils/crypto.d.ts.map +1 -1
  174. package/dist/utils/crypto.js +12 -6
  175. package/dist/utils/format.d.ts +25 -0
  176. package/dist/utils/format.d.ts.map +1 -0
  177. package/dist/utils/format.js +33 -0
  178. package/dist/utils/json-codec.js +1 -1
  179. package/dist/utils/notes.d.ts +15 -0
  180. package/dist/utils/notes.d.ts.map +1 -0
  181. package/dist/utils/notes.js +14 -0
  182. package/dist/utils/polling.d.ts +5 -0
  183. package/dist/utils/polling.d.ts.map +1 -1
  184. package/dist/utils/polling.js +5 -0
  185. package/dist/utils/random.d.ts +13 -0
  186. package/dist/utils/random.d.ts.map +1 -0
  187. package/dist/utils/random.js +27 -0
  188. package/dist/utils/secure-memory.d.ts +25 -0
  189. package/dist/utils/secure-memory.d.ts.map +1 -0
  190. package/dist/utils/secure-memory.js +28 -0
  191. package/dist/utils/signature.d.ts +6 -0
  192. package/dist/utils/signature.d.ts.map +1 -1
  193. package/dist/utils/signature.js +8 -6
  194. package/dist/utils/validators.d.ts +21 -10
  195. package/dist/utils/validators.d.ts.map +1 -1
  196. package/dist/utils/validators.js +37 -11
  197. package/dist/vitest.config.d.ts +3 -0
  198. package/dist/vitest.config.d.ts.map +1 -0
  199. package/dist/vitest.config.js +13 -0
  200. package/package.json +28 -11
  201. package/.eslintrc.json +0 -4
  202. package/account/zkAccount.test.ts +0 -316
  203. package/account/zkAccount.ts +0 -222
  204. package/clients/broadcaster.ts +0 -67
  205. package/clients/http.ts +0 -94
  206. package/clients/indexer.ts +0 -150
  207. package/config.ts +0 -39
  208. package/core.ts +0 -17
  209. package/dist/account/railgun-imports-prototype.d.ts +0 -12
  210. package/dist/account/railgun-imports-prototype.d.ts.map +0 -1
  211. package/dist/account/railgun-imports-prototype.js +0 -30
  212. package/dist/account/zkAccount.d.ts.map +0 -1
  213. package/dist/key-derivation/babyjubjub.d.ts +0 -9
  214. package/dist/key-derivation/babyjubjub.d.ts.map +0 -1
  215. package/dist/key-derivation/babyjubjub.js +0 -9
  216. package/dist/key-derivation/bech32.d.ts +0 -22
  217. package/dist/key-derivation/bech32.d.ts.map +0 -1
  218. package/dist/key-derivation/bech32.js +0 -86
  219. package/dist/key-derivation/bip32.d.ts +0 -17
  220. package/dist/key-derivation/bip32.d.ts.map +0 -1
  221. package/dist/key-derivation/bip32.js +0 -41
  222. package/dist/key-derivation/bip39.d.ts +0 -22
  223. package/dist/key-derivation/bip39.d.ts.map +0 -1
  224. package/dist/key-derivation/bip39.js +0 -56
  225. package/dist/key-derivation/bytes.d.ts +0 -19
  226. package/dist/key-derivation/bytes.d.ts.map +0 -1
  227. package/dist/key-derivation/bytes.js +0 -92
  228. package/dist/key-derivation/hash.d.ts +0 -3
  229. package/dist/key-derivation/hash.d.ts.map +0 -1
  230. package/dist/key-derivation/hash.js +0 -10
  231. package/dist/key-derivation/index.d.ts +0 -8
  232. package/dist/key-derivation/index.d.ts.map +0 -1
  233. package/dist/key-derivation/index.js +0 -7
  234. package/dist/key-derivation/wallet-node.d.ts +0 -45
  235. package/dist/key-derivation/wallet-node.d.ts.map +0 -1
  236. package/dist/key-derivation/wallet-node.js +0 -109
  237. package/dist/state/ciphertext-store.d.ts +0 -12
  238. package/dist/state/ciphertext-store.d.ts.map +0 -1
  239. package/dist/state/ciphertext-store.js +0 -25
  240. package/dist/state/hydrator.d.ts +0 -16
  241. package/dist/state/hydrator.d.ts.map +0 -1
  242. package/dist/state/hydrator.js +0 -18
  243. package/dist/state/job-store.d.ts +0 -12
  244. package/dist/state/job-store.d.ts.map +0 -1
  245. package/dist/state/job-store.js +0 -118
  246. package/dist/state/jobs.d.ts +0 -50
  247. package/dist/state/jobs.d.ts.map +0 -1
  248. package/dist/state/jobs.js +0 -1
  249. package/dist/state/leaf-store.d.ts +0 -17
  250. package/dist/state/leaf-store.d.ts.map +0 -1
  251. package/dist/state/leaf-store.js +0 -35
  252. package/dist/state/merkle-tree.d.ts +0 -34
  253. package/dist/state/merkle-tree.d.ts.map +0 -1
  254. package/dist/state/merkle-tree.js +0 -104
  255. package/dist/state/note-store.d.ts +0 -37
  256. package/dist/state/note-store.d.ts.map +0 -1
  257. package/dist/state/note-store.js +0 -133
  258. package/dist/state/nullifier-store.d.ts +0 -13
  259. package/dist/state/nullifier-store.d.ts.map +0 -1
  260. package/dist/state/nullifier-store.js +0 -21
  261. package/dist/state/records.d.ts +0 -57
  262. package/dist/state/records.d.ts.map +0 -1
  263. package/dist/state/root-store.d.ts +0 -13
  264. package/dist/state/root-store.d.ts.map +0 -1
  265. package/dist/state/root-store.js +0 -30
  266. package/dist/state/store.d.ts +0 -26
  267. package/dist/state/store.d.ts.map +0 -1
  268. package/dist/state/store.js +0 -19
  269. package/dist/state.d.ts +0 -83
  270. package/dist/state.d.ts.map +0 -1
  271. package/dist/state.js +0 -171
  272. package/dist/transactions/shield.d.ts +0 -5
  273. package/dist/transactions/shield.d.ts.map +0 -1
  274. package/dist/transactions/shield.js +0 -93
  275. package/dist/transactions/types.d.ts +0 -114
  276. package/dist/transactions/types.d.ts.map +0 -1
  277. package/dist/transactions/utils.d.ts +0 -10
  278. package/dist/transactions/utils.d.ts.map +0 -1
  279. package/dist/transactions/utils.js +0 -17
  280. package/dist/utils/time.d.ts +0 -2
  281. package/dist/utils/time.d.ts.map +0 -1
  282. package/dist/utils/time.js +0 -3
  283. package/dist/utils/witness.d.ts +0 -11
  284. package/dist/utils/witness.d.ts.map +0 -1
  285. package/dist/utils/witness.js +0 -19
  286. package/errors.ts +0 -20
  287. package/index.ts +0 -17
  288. package/key-derivation/babyjubjub.ts +0 -11
  289. package/key-derivation/bech32.test.ts +0 -90
  290. package/key-derivation/bech32.ts +0 -124
  291. package/key-derivation/bip32.ts +0 -56
  292. package/key-derivation/bip39.ts +0 -76
  293. package/key-derivation/bytes.ts +0 -118
  294. package/key-derivation/hash.ts +0 -13
  295. package/key-derivation/index.ts +0 -7
  296. package/key-derivation/wallet-node.ts +0 -155
  297. package/keys.ts +0 -47
  298. package/prover/config.ts +0 -104
  299. package/prover/index.ts +0 -1
  300. package/prover/prover.integration.test.ts +0 -162
  301. package/prover/prover.test.ts +0 -309
  302. package/prover/prover.ts +0 -405
  303. package/prover/registry.test.ts +0 -90
  304. package/prover/registry.ts +0 -82
  305. package/schema.ts +0 -17
  306. package/setup-artifacts.sh +0 -57
  307. package/state/index.ts +0 -2
  308. package/state/merkle/hydrator.ts +0 -69
  309. package/state/merkle/index.ts +0 -12
  310. package/state/merkle/merkle-tree.test.ts +0 -50
  311. package/state/merkle/merkle-tree.ts +0 -163
  312. package/state/store/ciphertext-store.ts +0 -28
  313. package/state/store/index.ts +0 -24
  314. package/state/store/job-store.ts +0 -162
  315. package/state/store/jobs.ts +0 -64
  316. package/state/store/leaf-store.ts +0 -39
  317. package/state/store/note-store.ts +0 -177
  318. package/state/store/nullifier-store.ts +0 -39
  319. package/state/store/records.ts +0 -61
  320. package/state/store/root-store.ts +0 -34
  321. package/state/store/store.ts +0 -25
  322. package/state.test.ts +0 -235
  323. package/storage/index.ts +0 -3
  324. package/storage/indexeddb.test.ts +0 -99
  325. package/storage/indexeddb.ts +0 -235
  326. package/storage/memory.test.ts +0 -59
  327. package/storage/memory.ts +0 -93
  328. package/transactions/deposit.test.ts +0 -160
  329. package/transactions/deposit.ts +0 -227
  330. package/transactions/index.ts +0 -20
  331. package/transactions/note-sync.test.ts +0 -155
  332. package/transactions/note-sync.ts +0 -452
  333. package/transactions/reconcile.ts +0 -73
  334. package/transactions/transact.test.ts +0 -451
  335. package/transactions/transact.ts +0 -811
  336. package/transactions/types.ts +0 -141
  337. package/tsconfig.json +0 -14
  338. package/types/global.d.ts +0 -15
  339. package/types.ts +0 -24
  340. package/utils/async.ts +0 -15
  341. package/utils/bigint.ts +0 -34
  342. package/utils/crypto.test.ts +0 -69
  343. package/utils/crypto.ts +0 -58
  344. package/utils/json-codec.ts +0 -38
  345. package/utils/polling.ts +0 -6
  346. package/utils/signature.ts +0 -16
  347. package/utils/validators.test.ts +0 -64
  348. package/utils/validators.ts +0 -86
  349. /package/dist/{transactions → history}/types.js +0 -0
  350. /package/dist/{state/records.js → transactions/types/deposit.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as snarkjs from "snarkjs";
2
- import { CoreError } from "../errors.js";
3
- import { ArtifactType, buildArtifactUrl, DEFAULT_CONFIG, getLocalArtifactPath, Runtime, } from "./config.js";
2
+ import { ProofError } from "../errors.js";
3
+ import { ArtifactType, buildArtifactUrl, getLocalArtifactPath, Runtime, } from "./config.js";
4
4
  import { getCircuitConfig, SUPPORTED_CIRCUITS, } from "./registry.js";
5
5
  // Cache for loaded artifacts to avoid reloading 18MB of files on every call
6
6
  // Now keyed by circuit name to support multiple circuits
@@ -10,116 +10,130 @@ const artifactCache = {};
10
10
  * @param inputs Number of inputs (nullifiers)
11
11
  * @param outputs Number of outputs (commitments)
12
12
  * @returns Circuit configuration
13
- * @throws CoreError if no matching circuit is found
13
+ * @throws ProofError if no matching circuit is found
14
14
  */
15
15
  function selectCircuit(inputs, outputs) {
16
16
  const config = getCircuitConfig(inputs, outputs);
17
17
  if (!config) {
18
- throw new CoreError(`No circuit available for ${inputs} inputs and ${outputs} outputs. ` +
18
+ throw new ProofError(`No circuit available for ${inputs} inputs and ${outputs} outputs. ` +
19
19
  `Supported circuits: ${SUPPORTED_CIRCUITS.join(", ")}`);
20
20
  }
21
21
  return config;
22
22
  }
23
23
  /**
24
- * Fetch circuit artifacts for a specific circuit
25
- * Supports both browser (remote) and Node.js (local) environments
24
+ * Fetch circuit artifacts from server or local files (for tests)
26
25
  * @param circuitName Full circuit name (e.g., "joinsplit_2x3_16")
26
+ * @param rpcUrl Base URL for fetching artifacts
27
27
  * @returns Artifacts object with wasm, zkey, and vkey
28
28
  */
29
- async function fetchCircuitArtifacts(circuitName) {
29
+ async function fetchCircuitArtifacts(circuitName, rpcUrl) {
30
30
  // Check cache first
31
31
  if (artifactCache[circuitName]) {
32
32
  return artifactCache[circuitName];
33
33
  }
34
- let wasm;
35
- let zkey;
36
- let vkey;
37
- // Browser environment: fetch from artifact server
34
+ // Browser: always requires rpcUrl and fetches from server
38
35
  if (Runtime.isBrowser()) {
36
+ if (!rpcUrl) {
37
+ throw new ProofError("rpcUrl is required. Please configure it via UnlinkProvider or pass it to the SDK.");
38
+ }
39
+ return fetchFromServer(circuitName, rpcUrl);
40
+ }
41
+ // Node.js: try server first if rpcUrl provided, fall back to local files
42
+ if (rpcUrl) {
39
43
  try {
40
- const baseUrl = DEFAULT_CONFIG.rpcUrl;
41
- const wasmUrl = buildArtifactUrl(circuitName, ArtifactType.WASM, baseUrl);
42
- const zkeyUrl = buildArtifactUrl(circuitName, ArtifactType.ZKEY, baseUrl);
43
- const vkeyUrl = buildArtifactUrl(circuitName, ArtifactType.VKEY, baseUrl);
44
- const [wasmRes, zkeyRes, vkeyRes] = await Promise.all([
45
- fetch(wasmUrl),
46
- fetch(zkeyUrl),
47
- fetch(vkeyUrl),
48
- ]);
49
- if (!wasmRes.ok || !zkeyRes.ok || !vkeyRes.ok) {
50
- throw new CoreError(`Failed to fetch artifacts for ${circuitName} from ${baseUrl}. ` +
51
- `Status: wasm=${wasmRes.status}, zkey=${zkeyRes.status}, vkey=${vkeyRes.status}`);
52
- }
53
- wasm = new Uint8Array(await wasmRes.arrayBuffer());
54
- zkey = new Uint8Array(await zkeyRes.arrayBuffer());
55
- vkey = await vkeyRes.json();
44
+ return await fetchFromServer(circuitName, rpcUrl);
56
45
  }
57
- catch (error) {
58
- throw new CoreError(`Failed to fetch artifacts from server for ${circuitName}: ${error.message}`);
46
+ catch {
47
+ // Server not available, fall back to local files (useful for tests)
59
48
  }
60
49
  }
61
- // Node.js environment: try local file paths
62
- else {
63
- const wasmCandidates = getLocalArtifactPath(circuitName, ArtifactType.WASM);
64
- const zkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.ZKEY);
65
- const vkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.VKEY);
66
- let wasmLoaded = false;
67
- for (const candidate of wasmCandidates) {
68
- try {
69
- wasm = await readBinaryResource(candidate);
70
- wasmLoaded = true;
71
- break;
72
- }
73
- catch {
74
- // Try next candidate
75
- }
50
+ // Node.js: try local files (for tests and development)
51
+ try {
52
+ return await fetchFromLocalFiles(circuitName);
53
+ }
54
+ catch {
55
+ throw new ProofError("rpcUrl is required. Local artifacts not found. " +
56
+ "If running tests, ensure artifacts are built with 'pnpm run zk:build'.");
57
+ }
58
+ }
59
+ async function fetchFromServer(circuitName, rpcUrl) {
60
+ const wasmUrl = buildArtifactUrl(circuitName, ArtifactType.WASM, rpcUrl);
61
+ const zkeyUrl = buildArtifactUrl(circuitName, ArtifactType.ZKEY, rpcUrl);
62
+ const vkeyUrl = buildArtifactUrl(circuitName, ArtifactType.VKEY, rpcUrl);
63
+ const [wasmRes, zkeyRes, vkeyRes] = await Promise.all([
64
+ fetch(wasmUrl),
65
+ fetch(zkeyUrl),
66
+ fetch(vkeyUrl),
67
+ ]);
68
+ if (!wasmRes.ok || !zkeyRes.ok || !vkeyRes.ok) {
69
+ throw new ProofError(`Failed to fetch artifacts for ${circuitName} from ${rpcUrl}. ` +
70
+ `Status: wasm=${wasmRes.status}, zkey=${zkeyRes.status}, vkey=${vkeyRes.status}`);
71
+ }
72
+ const wasm = new Uint8Array(await wasmRes.arrayBuffer());
73
+ const zkey = new Uint8Array(await zkeyRes.arrayBuffer());
74
+ const vkey = (await vkeyRes.json());
75
+ const artifacts = { wasm, zkey, vkey };
76
+ artifactCache[circuitName] = artifacts;
77
+ return artifacts;
78
+ }
79
+ async function fetchFromLocalFiles(circuitName) {
80
+ const wasmCandidates = getLocalArtifactPath(circuitName, ArtifactType.WASM);
81
+ const zkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.ZKEY);
82
+ const vkeyCandidates = getLocalArtifactPath(circuitName, ArtifactType.VKEY);
83
+ let wasm;
84
+ let zkey;
85
+ let vkey;
86
+ let wasmLoaded = false;
87
+ for (const candidate of wasmCandidates) {
88
+ try {
89
+ wasm = await readBinaryResource(candidate);
90
+ wasmLoaded = true;
91
+ break;
76
92
  }
77
- if (!wasmLoaded) {
78
- throw new CoreError(`Could not find WASM artifact for ${circuitName}. ` +
79
- `Please run 'pnpm run build:all' in the circuits package.`);
93
+ catch {
94
+ // Try next candidate
80
95
  }
81
- // Load zkey
82
- let zkeyLoaded = false;
83
- for (const candidate of zkeyCandidates) {
84
- try {
85
- zkey = await readBinaryResource(candidate);
86
- zkeyLoaded = true;
87
- break;
88
- }
89
- catch {
90
- // Try next candidate
91
- }
96
+ }
97
+ if (!wasmLoaded) {
98
+ throw new ProofError(`Could not find WASM artifact for ${circuitName}. ` +
99
+ `Please run 'pnpm run build:all' in the circuits package.`);
100
+ }
101
+ // Load zkey
102
+ let zkeyLoaded = false;
103
+ for (const candidate of zkeyCandidates) {
104
+ try {
105
+ zkey = await readBinaryResource(candidate);
106
+ zkeyLoaded = true;
107
+ break;
92
108
  }
93
- if (!zkeyLoaded) {
94
- throw new CoreError(`Could not find zkey artifact for ${circuitName}. ` +
95
- `Please run 'pnpm run build:all' in the circuits package.`);
109
+ catch {
110
+ // Try next candidate
96
111
  }
97
- // Load vkey
98
- let vkeyLoaded = false;
99
- for (const candidate of vkeyCandidates) {
100
- try {
101
- const vkeyText = await readTextResource(candidate);
102
- vkey = JSON.parse(vkeyText);
103
- vkeyLoaded = true;
104
- break;
105
- }
106
- catch {
107
- // Try next candidate
108
- }
112
+ }
113
+ if (!zkeyLoaded) {
114
+ throw new ProofError(`Could not find zkey artifact for ${circuitName}. ` +
115
+ `Please run 'pnpm run build:all' in the circuits package.`);
116
+ }
117
+ // Load vkey
118
+ let vkeyLoaded = false;
119
+ for (const candidate of vkeyCandidates) {
120
+ try {
121
+ const vkeyText = await readTextResource(candidate);
122
+ vkey = JSON.parse(vkeyText);
123
+ vkeyLoaded = true;
124
+ break;
109
125
  }
110
- if (!vkeyLoaded) {
111
- throw new CoreError(`Could not find verification key for ${circuitName}. ` +
112
- `Please run 'pnpm run build:all' in the circuits package.`);
126
+ catch {
127
+ // Try next candidate
113
128
  }
114
129
  }
115
- // Verify all artifacts were loaded
116
- if (!wasm || !zkey || !vkey) {
117
- throw new CoreError(`Failed to load all artifacts for ${circuitName}. ` +
118
- `Missing: ${!wasm ? "wasm " : ""}${!zkey ? "zkey " : ""}${!vkey ? "vkey" : ""}`);
130
+ if (!vkeyLoaded) {
131
+ throw new ProofError(`Could not find verification key for ${circuitName}. ` +
132
+ `Please run 'pnpm run build:all' in the circuits package.`);
119
133
  }
120
134
  // Cache the artifacts for future calls
121
135
  // TypeScript now knows these are defined after the check above
122
- const artifacts = { wasm, zkey, vkey };
136
+ const artifacts = { wasm: wasm, zkey: zkey, vkey: vkey };
123
137
  artifactCache[circuitName] = artifacts;
124
138
  return artifacts;
125
139
  }
@@ -143,12 +157,12 @@ async function readBinaryResource(relativePath) {
143
157
  }
144
158
  const response = await fetch(url);
145
159
  if (!response.ok) {
146
- throw new CoreError(`failed to fetch ${relativePath}: ${response.statusText}`);
160
+ throw new ProofError(`failed to fetch ${relativePath}: ${response.statusText}`);
147
161
  }
148
162
  return new Uint8Array(await response.arrayBuffer());
149
163
  }
150
164
  catch (error) {
151
- throw new CoreError(`failed to read binary resource ${relativePath}: ${error.message}`);
165
+ throw new ProofError(`failed to read binary resource ${relativePath}: ${error.message}`);
152
166
  }
153
167
  }
154
168
  async function readTextResource(relativePath) {
@@ -170,24 +184,24 @@ async function readTextResource(relativePath) {
170
184
  }
171
185
  const response = await fetch(url);
172
186
  if (!response.ok) {
173
- throw new CoreError(`failed to fetch ${relativePath}: ${response.statusText}`);
187
+ throw new ProofError(`failed to fetch ${relativePath}: ${response.statusText}`);
174
188
  }
175
189
  return response.text();
176
190
  }
177
- export async function proveTransaction(input) {
191
+ export async function proveTransaction(input, options) {
178
192
  try {
179
193
  // Auto-detect circuit based on input dimensions
180
194
  const nInputs = input.nullifiers.length;
181
195
  const nOutputs = input.commitmentsOut.length;
182
196
  const circuit = selectCircuit(nInputs, nOutputs);
183
197
  // Fetch circuit artifacts (wasm and zkey)
184
- const { wasm, vkey, zkey } = await fetchCircuitArtifacts(circuit.name);
198
+ const { wasm, vkey, zkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
185
199
  const inputSignals = input;
186
200
  const { proof, publicSignals } = await snarkjs.groth16.fullProve(inputSignals, wasm, zkey);
187
201
  // Additional verification step (optional)
188
202
  const isValid = await snarkjs.groth16.verify(vkey, publicSignals, proof);
189
203
  if (!isValid) {
190
- throw new CoreError("generated proof is invalid");
204
+ throw new ProofError("generated proof is invalid");
191
205
  }
192
206
  return {
193
207
  proof,
@@ -195,23 +209,24 @@ export async function proveTransaction(input) {
195
209
  };
196
210
  }
197
211
  catch (error) {
198
- throw new CoreError("proof generation failed: " + error.message);
212
+ throw new ProofError("proof generation failed: " + error.message);
199
213
  }
200
214
  }
201
215
  /**
202
216
  * Get verification key for a specific circuit configuration
203
217
  * @param inputs Number of inputs (nullifiers)
204
218
  * @param outputs Number of outputs (commitments)
219
+ * @param options Configuration including rpcUrl
205
220
  * @returns Verification key for the circuit
206
221
  */
207
- export async function getVerificationKey(inputs, outputs) {
222
+ export async function getVerificationKey(inputs, outputs, options) {
208
223
  try {
209
224
  const circuit = selectCircuit(inputs, outputs);
210
- const { vkey } = await fetchCircuitArtifacts(circuit.name);
225
+ const { vkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
211
226
  return vkey;
212
227
  }
213
228
  catch (error) {
214
- throw new CoreError("failed to load verification key: " + error.message);
229
+ throw new ProofError("failed to load verification key: " + error.message);
215
230
  }
216
231
  }
217
232
  /**
@@ -219,9 +234,10 @@ export async function getVerificationKey(inputs, outputs) {
219
234
  * Auto-detects the circuit from the public signals structure
220
235
  * @param proof Groth16 proof
221
236
  * @param publicSignals Public signals array
237
+ * @param options Optional configuration including rpcUrl
222
238
  * @returns True if proof is valid
223
239
  */
224
- export async function verifyProof(proof, publicSignals) {
240
+ export async function verifyProof(proof, publicSignals, options) {
225
241
  try {
226
242
  // Public signals structure: [merkleRoot, boundParamsHash, ...nullifiers, ...commitments]
227
243
  // We need to determine the circuit from the length
@@ -239,18 +255,18 @@ export async function verifyProof(proof, publicSignals) {
239
255
  const parts = circuitKey.split("x");
240
256
  const config = getCircuitConfig(parseInt(parts[0]), parseInt(parts[1]));
241
257
  if (config && config.inputs + config.outputs === variableCount) {
242
- const artifacts = await fetchCircuitArtifacts(config.name);
258
+ const artifacts = await fetchCircuitArtifacts(config.name, options?.rpcUrl);
243
259
  vkey = artifacts.vkey;
244
260
  break;
245
261
  }
246
262
  }
247
263
  if (!vkey) {
248
- throw new CoreError(`Could not determine circuit from ${totalLength} public signals`);
264
+ throw new ProofError(`Could not determine circuit from ${totalLength} public signals`);
249
265
  }
250
266
  return await snarkjs.groth16.verify(vkey, publicSignals, proof);
251
267
  }
252
268
  catch (error) {
253
- throw new CoreError("proof verification failed: " + error.message);
269
+ throw new ProofError("proof verification failed: " + error.message);
254
270
  }
255
271
  }
256
272
  /**
@@ -260,15 +276,16 @@ export async function verifyProof(proof, publicSignals) {
260
276
  * @param publicSignals Public signals array
261
277
  * @param inputs Number of inputs (nullifiers)
262
278
  * @param outputs Number of outputs (commitments)
279
+ * @param options Optional configuration including rpcUrl
263
280
  * @returns True if proof is valid
264
281
  */
265
- export async function verifyProofWithCircuit(proof, publicSignals, inputs, outputs) {
282
+ export async function verifyProofWithCircuit(proof, publicSignals, inputs, outputs, options) {
266
283
  try {
267
284
  const circuit = selectCircuit(inputs, outputs);
268
- const { vkey } = await fetchCircuitArtifacts(circuit.name);
285
+ const { vkey } = await fetchCircuitArtifacts(circuit.name, options?.rpcUrl);
269
286
  return await snarkjs.groth16.verify(vkey, publicSignals, proof);
270
287
  }
271
288
  catch (error) {
272
- throw new CoreError("proof verification failed: " + error.message);
289
+ throw new ProofError("proof verification failed: " + error.message);
273
290
  }
274
291
  }
@@ -1,39 +1,12 @@
1
- /**
2
- * Circuit registry for automatic prover selection
3
- * Maps circuit dimensions (inputs x outputs) to circuit configurations
4
- */
5
1
  export interface CircuitConfig {
6
- /** Full circuit name (e.g., "joinsplit_2x3_16") */
7
2
  readonly name: string;
8
- /** Number of inputs (nullifiers) */
9
3
  readonly inputs: number;
10
- /** Number of outputs (commitments) */
11
4
  readonly outputs: number;
12
- /** Merkle tree depth */
13
5
  readonly depth: number;
14
6
  }
15
- export type CircuitKey = "3x3" | "2x3" | "1x2" | "1x1";
16
- /**
17
- * Registry of available circuits
18
- * Auto-generated from circuits/circuits.json
19
- */
20
- export declare const CIRCUIT_REGISTRY: Record<CircuitKey, CircuitConfig>;
21
- /**
22
- * Get list of all supported circuit keys
23
- */
24
- export declare const SUPPORTED_CIRCUITS: CircuitKey[];
25
- /**
26
- * Get circuit configuration by dimensions
27
- * @param inputs Number of inputs (nullifiers)
28
- * @param outputs Number of outputs (commitments)
29
- * @returns Circuit configuration or undefined if not supported
30
- */
7
+ export declare const CIRCUIT_REGISTRY: Record<string, CircuitConfig>;
8
+ export type CircuitKey = keyof typeof CIRCUIT_REGISTRY & string;
9
+ export declare const SUPPORTED_CIRCUITS: string[];
31
10
  export declare function getCircuitConfig(inputs: number, outputs: number): CircuitConfig | undefined;
32
- /**
33
- * Check if a circuit configuration is supported
34
- * @param inputs Number of inputs (nullifiers)
35
- * @param outputs Number of outputs (commitments)
36
- * @returns True if supported
37
- */
38
11
  export declare function isCircuitSupported(inputs: number, outputs: number): boolean;
39
12
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../prover/registry.ts"],"names":[],"mappings":"AAKA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,CAyBrD,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAoC,UAAU,EAAE,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,GAAG,SAAS,CAG3B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3E"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../prover/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAYD,eAAO,MAAM,gBAAgB,EAAe,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,gBAAgB,GAAG,MAAM,CAAC;AAEhE,eAAO,MAAM,kBAAkB,UAAgC,CAAC;AAEhE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,GAAG,SAAS,CAE3B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3E"}
@@ -1,57 +1,18 @@
1
- // AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
2
- // Generated by scripts/generate-registry.ts
3
- // Source: circuits/circuits.json
4
- // Generated at: 2025-11-25T13:26:58.576Z
5
- /**
6
- * Registry of available circuits
7
- * Auto-generated from circuits/circuits.json
8
- */
9
- export const CIRCUIT_REGISTRY = {
10
- "3x3": {
11
- name: "joinsplit_3x3_16",
12
- inputs: 3,
13
- outputs: 3,
14
- depth: 16,
15
- },
16
- "2x3": {
17
- name: "joinsplit_2x3_16",
18
- inputs: 2,
19
- outputs: 3,
20
- depth: 16,
21
- },
22
- "1x2": {
23
- name: "joinsplit_1x2_16",
24
- inputs: 1,
25
- outputs: 2,
26
- depth: 16,
27
- },
28
- "1x1": {
29
- name: "joinsplit_1x1_16",
30
- inputs: 1,
31
- outputs: 1,
32
- depth: 16,
33
- },
34
- };
35
- /**
36
- * Get list of all supported circuit keys
37
- */
1
+ import circuitsJson from "../circuits.json" with { type: "json" };
2
+ // Build registry from circuits.json — keyed by "NxM" (inputs x outputs)
3
+ const registry = {};
4
+ for (const [name, def] of Object.entries(circuitsJson)) {
5
+ const params = def.params;
6
+ const inputs = params[0];
7
+ const outputs = params[1];
8
+ const depth = params[2];
9
+ registry[`${inputs}x${outputs}`] = { name, inputs, outputs, depth };
10
+ }
11
+ export const CIRCUIT_REGISTRY = registry;
38
12
  export const SUPPORTED_CIRCUITS = Object.keys(CIRCUIT_REGISTRY);
39
- /**
40
- * Get circuit configuration by dimensions
41
- * @param inputs Number of inputs (nullifiers)
42
- * @param outputs Number of outputs (commitments)
43
- * @returns Circuit configuration or undefined if not supported
44
- */
45
13
  export function getCircuitConfig(inputs, outputs) {
46
- const key = `${inputs}x${outputs}`;
47
- return CIRCUIT_REGISTRY[key];
14
+ return CIRCUIT_REGISTRY[`${inputs}x${outputs}`];
48
15
  }
49
- /**
50
- * Check if a circuit configuration is supported
51
- * @param inputs Number of inputs (nullifiers)
52
- * @param outputs Number of outputs (commitments)
53
- * @returns True if supported
54
- */
55
16
  export function isCircuitSupported(inputs, outputs) {
56
17
  return getCircuitConfig(inputs, outputs) !== undefined;
57
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hydrator.d.ts","sourceRoot":"","sources":["../../../state/merkle/hydrator.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAE5C,wBAAsB,oBAAoB,CAAC,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3D,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;KACxC,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;CACtB,mBAeA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5D,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAKF,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,iBAcpB"}
1
+ {"version":3,"file":"hydrator.d.ts","sourceRoot":"","sources":["../../../state/merkle/hydrator.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAE5C,wBAAsB,oBAAoB,CAAC,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3D,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;KACxC,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;CACtB,mBAeA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5D,CAAC;IACF,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAKF,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,iBAcpB"}
@@ -1,3 +1,4 @@
1
+ import { CoreError } from "../../errors.js";
1
2
  import { parseHexToBigInt } from "../../utils/bigint.js";
2
3
  export async function rebuildTreeFromStore({ chainId, trees, loadLeaf, }) {
3
4
  trees.reset(chainId);
@@ -8,7 +9,7 @@ export async function rebuildTreeFromStore({ chainId, trees, loadLeaf, }) {
8
9
  break;
9
10
  const { index } = trees.addLeaf(chainId, parseHexToBigInt(leaf.commitment));
10
11
  if (index !== idx) {
11
- throw new Error(`stored leaves are inconsistent with local tree, expected ${idx}, got ${index}`);
12
+ throw new CoreError(`stored leaves are inconsistent with local tree, expected ${idx}, got ${index}`);
12
13
  }
13
14
  idx += 1;
14
15
  }
@@ -28,7 +29,7 @@ export async function hydrateChain({ chainId, trees, loadLeaf, hydrated, }) {
28
29
  break;
29
30
  const { index } = trees.addLeaf(chainId, parseHexToBigInt(leaf.commitment));
30
31
  if (index !== idx) {
31
- throw new Error("stored leaves are inconsistent with local tree");
32
+ throw new CoreError("stored leaves are inconsistent with local tree");
32
33
  }
33
34
  idx += 1;
34
35
  }
@@ -1,3 +1,3 @@
1
- export { createLocalMerkleTree, createMerkleTrees, type LocalMerkleTree, type LocalMerkleTrees, type MerkleProof, } from "./merkle-tree.js";
1
+ export { createLocalMerkleTree, createMerkleTrees, resolveMerkleTrees, type LocalMerkleTree, type LocalMerkleTrees, type MerkleProof, } from "./merkle-tree.js";
2
2
  export { hydrateChain, rebuildTreeFromStore, type HydrateChainParams, } from "./hydrator.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../state/merkle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../state/merkle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- export { createLocalMerkleTree, createMerkleTrees, } from "./merkle-tree.js";
1
+ export { createLocalMerkleTree, createMerkleTrees, resolveMerkleTrees, } from "./merkle-tree.js";
2
2
  export { hydrateChain, rebuildTreeFromStore, } from "./hydrator.js";
@@ -31,4 +31,12 @@ export type LocalMerkleTrees = {
31
31
  reset(chainId: number): void;
32
32
  };
33
33
  export declare function createMerkleTrees(): LocalMerkleTrees;
34
+ /**
35
+ * Resolve merkle trees from options or create new instance.
36
+ * @param opts - Options object that may contain merkle trees
37
+ * @returns Merkle trees instance
38
+ */
39
+ export declare function resolveMerkleTrees(opts?: {
40
+ merkleTrees?: LocalMerkleTrees;
41
+ }): LocalMerkleTrees;
34
42
  //# sourceMappingURL=merkle-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merkle-tree.d.ts","sourceRoot":"","sources":["../../../state/merkle/merkle-tree.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EAGf,MAAM,aAAa,CAAC;AAWrB,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAaF,wBAAgB,qBAAqB;qBAUX,MAAM,KAAG,aAAa;;;qBAsBtB,MAAM;+BAQI,MAAM,KAAG,cAAc;mBAUxC,MAAM;;;EAiBxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;IAC9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IACvD,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAClE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,gBAAgB,CAwCpD"}
1
+ {"version":3,"file":"merkle-tree.d.ts","sourceRoot":"","sources":["../../../state/merkle/merkle-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAGf,MAAM,aAAa,CAAC;AAarB,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAaF,wBAAgB,qBAAqB;qBAUX,MAAM,KAAG,aAAa;;;qBAsBtB,MAAM;+BAQI,MAAM,KAAG,cAAc;mBAUxC,MAAM;;;EAiBxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;IAC9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IACvD,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAClE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,gBAAgB,CAwCpD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,gBAAgB,CAEnB"}
@@ -1,20 +1,21 @@
1
- import { poseidon } from "@railgun-community/circomlibjs";
2
1
  import { IMT, } from "@zk-kit/imt";
3
- import { ByteLength, ByteUtils } from "../../key-derivation/bytes.js";
2
+ import { poseidon } from "../../crypto-adapters/index.js";
3
+ import { CoreError } from "../../errors.js";
4
+ import { FieldSize, Hex } from "../../keys/hex.js";
4
5
  import { ensureChainId } from "../../utils/validators.js";
5
6
  const DEFAULT_DEPTH = 16;
6
7
  const DEFAULT_ARITY = 2;
7
- const ZERO_BYTE_LENGTH = ByteLength.UINT_256;
8
+ const ZERO_BYTE_LENGTH = FieldSize.SCALAR;
8
9
  // Simple adapter: IMTNode[] -> poseidon(bigint[])
9
10
  const hash = (values) => poseidon(values.map((v) => BigInt(v)));
10
- const formatNode = (value) => ByteUtils.nToHex(value, ZERO_BYTE_LENGTH, true);
11
+ const formatNode = (value) => Hex.fromBigInt(value, ZERO_BYTE_LENGTH, true);
11
12
  export function createLocalMerkleTree() {
12
13
  const zeroLeaf = 0n;
13
14
  const capacity = 2 ** DEFAULT_DEPTH;
14
15
  const tree = new IMT(hash, DEFAULT_DEPTH, zeroLeaf, DEFAULT_ARITY);
15
16
  function addLeaf(value) {
16
17
  if (tree.leaves.length >= capacity) {
17
- throw new Error("merkle tree is full");
18
+ throw new CoreError("merkle tree is full");
18
19
  }
19
20
  const insertedIndex = tree.leaves.length;
20
21
  tree.insert(value);
@@ -32,7 +33,7 @@ export function createLocalMerkleTree() {
32
33
  function getLeaf(index) {
33
34
  const leaf = tree.leaves[index];
34
35
  if (leaf === undefined) {
35
- throw new Error("leaf does not exist in this tree");
36
+ throw new CoreError("leaf does not exist in this tree");
36
37
  }
37
38
  return formatNode(BigInt(leaf));
38
39
  }
@@ -51,7 +52,7 @@ export function createLocalMerkleTree() {
51
52
  }
52
53
  const zero = tree.zeroes[level];
53
54
  if (zero === undefined) {
54
- throw new Error("invalid level");
55
+ throw new CoreError("invalid level");
55
56
  }
56
57
  return formatNode(zero);
57
58
  },
@@ -102,3 +103,11 @@ export function createMerkleTrees() {
102
103
  },
103
104
  };
104
105
  }
106
+ /**
107
+ * Resolve merkle trees from options or create new instance.
108
+ * @param opts - Options object that may contain merkle trees
109
+ * @returns Merkle trees instance
110
+ */
111
+ export function resolveMerkleTrees(opts) {
112
+ return opts?.merkleTrees ?? createMerkleTrees();
113
+ }
@@ -8,5 +8,9 @@ export declare function createCiphertextStore(storage: Storage): {
8
8
  * Retrieve encrypted note payloads; returns null when the ciphertext is missing.
9
9
  */
10
10
  getCiphertext(chainId: number, index: number): Promise<Uint8Array<ArrayBuffer> | null>;
11
+ /**
12
+ * Remove all cached ciphertexts for a chain.
13
+ */
14
+ clearCiphertexts(chainId: number): Promise<void>;
11
15
  };
12
16
  //# sourceMappingURL=ciphertext-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ciphertext-store.d.ts","sourceRoot":"","sources":["../../../state/store/ciphertext-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO;IAElD;;OAEG;2BAC0B,MAAM,SAAS,MAAM,WAAW,UAAU;IAQvE;;OAEG;2BAC0B,MAAM,SAAS,MAAM;EAOrD"}
1
+ {"version":3,"file":"ciphertext-store.d.ts","sourceRoot":"","sources":["../../../state/store/ciphertext-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO;IAElD;;OAEG;2BAC0B,MAAM,SAAS,MAAM,WAAW,UAAU;IAQvE;;OAEG;2BAC0B,MAAM,SAAS,MAAM;IAOlD;;OAEG;8BAC6B,MAAM;EASzC"}
@@ -21,5 +21,17 @@ export function createCiphertextStore(storage) {
21
21
  const data = await storage.get(keys.ciphertext(chainId, index));
22
22
  return data ? new Uint8Array(data) : null;
23
23
  },
24
+ /**
25
+ * Remove all cached ciphertexts for a chain.
26
+ */
27
+ async clearCiphertexts(chainId) {
28
+ ensureChainId(chainId);
29
+ const prefix = `ciphertexts:${chainId}:`;
30
+ const entries = await storage.iter({ prefix });
31
+ if (entries.length === 0)
32
+ return;
33
+ const deletions = entries.map(({ key }) => ({ del: key }));
34
+ await storage.batch(deletions);
35
+ },
24
36
  };
25
37
  }