@unlink-xyz/core 0.1.3 → 0.1.4

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 (369) hide show
  1. package/README.md +9 -0
  2. package/dist/account/{zkAccount.d.ts → account.d.ts} +36 -5
  3. package/dist/account/account.d.ts.map +1 -0
  4. package/dist/account/accounts.d.ts +42 -0
  5. package/dist/account/accounts.d.ts.map +1 -0
  6. package/dist/account/seed.d.ts +45 -0
  7. package/dist/account/seed.d.ts.map +1 -0
  8. package/dist/account/serialization.d.ts +6 -0
  9. package/dist/account/serialization.d.ts.map +1 -0
  10. package/dist/browser/index.js +56221 -0
  11. package/dist/browser/index.js.map +1 -0
  12. package/dist/browser/wallet/index.js +55942 -0
  13. package/dist/browser/wallet/index.js.map +1 -0
  14. package/dist/clients/broadcaster.d.ts +8 -2
  15. package/dist/clients/broadcaster.d.ts.map +1 -1
  16. package/dist/clients/http.d.ts +6 -0
  17. package/dist/clients/http.d.ts.map +1 -1
  18. package/dist/clients/indexer.d.ts +16 -0
  19. package/dist/clients/indexer.d.ts.map +1 -1
  20. package/dist/config.d.ts +30 -9
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/constants.d.ts +6 -0
  23. package/dist/constants.d.ts.map +1 -0
  24. package/dist/core.d.ts.map +1 -1
  25. package/dist/crypto/adapters/index.d.ts +17 -0
  26. package/dist/crypto/adapters/index.d.ts.map +1 -0
  27. package/dist/crypto/adapters/polyfills.d.ts +5 -0
  28. package/dist/crypto/adapters/polyfills.d.ts.map +1 -0
  29. package/dist/crypto/encrypt.d.ts +33 -0
  30. package/dist/crypto/encrypt.d.ts.map +1 -0
  31. package/dist/crypto/secure-memory.d.ts +25 -0
  32. package/dist/crypto/secure-memory.d.ts.map +1 -0
  33. package/dist/errors.d.ts +17 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/history/index.d.ts +3 -0
  36. package/dist/history/index.d.ts.map +1 -0
  37. package/dist/history/service.d.ts +46 -0
  38. package/dist/history/service.d.ts.map +1 -0
  39. package/dist/history/types.d.ts +21 -0
  40. package/dist/history/types.d.ts.map +1 -0
  41. package/dist/index.d.ts +16 -7
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +6721 -19
  44. package/dist/index.js.map +1 -0
  45. package/dist/keys/address.d.ts +13 -0
  46. package/dist/keys/address.d.ts.map +1 -0
  47. package/dist/keys/derive.d.ts +37 -0
  48. package/dist/keys/derive.d.ts.map +1 -0
  49. package/dist/keys/hex.d.ts +14 -0
  50. package/dist/keys/hex.d.ts.map +1 -0
  51. package/dist/keys/index.d.ts +5 -0
  52. package/dist/keys/index.d.ts.map +1 -0
  53. package/dist/keys/mnemonic.d.ts +6 -0
  54. package/dist/keys/mnemonic.d.ts.map +1 -0
  55. package/dist/keys.d.ts +5 -1
  56. package/dist/keys.d.ts.map +1 -1
  57. package/dist/prover/config.d.ts +53 -22
  58. package/dist/prover/config.d.ts.map +1 -1
  59. package/dist/prover/integrity.d.ts +20 -0
  60. package/dist/prover/integrity.d.ts.map +1 -0
  61. package/dist/prover/prover.d.ts +16 -20
  62. package/dist/prover/prover.d.ts.map +1 -1
  63. package/dist/prover/registry.d.ts +3 -30
  64. package/dist/prover/registry.d.ts.map +1 -1
  65. package/dist/state/merkle/hydrator.d.ts +21 -19
  66. package/dist/state/merkle/hydrator.d.ts.map +1 -1
  67. package/dist/state/merkle/index.d.ts +2 -2
  68. package/dist/state/merkle/index.d.ts.map +1 -1
  69. package/dist/state/merkle/merkle-tree.d.ts +8 -0
  70. package/dist/state/merkle/merkle-tree.d.ts.map +1 -1
  71. package/dist/state/store/ciphertext-store.d.ts +11 -0
  72. package/dist/state/store/ciphertext-store.d.ts.map +1 -1
  73. package/dist/state/store/history-store.d.ts +24 -0
  74. package/dist/state/store/history-store.d.ts.map +1 -0
  75. package/dist/state/store/index.d.ts +3 -2
  76. package/dist/state/store/index.d.ts.map +1 -1
  77. package/dist/state/store/job-store.d.ts +7 -7
  78. package/dist/state/store/job-store.d.ts.map +1 -1
  79. package/dist/state/store/jobs.d.ts +70 -25
  80. package/dist/state/store/jobs.d.ts.map +1 -1
  81. package/dist/state/store/leaf-store.d.ts +4 -0
  82. package/dist/state/store/leaf-store.d.ts.map +1 -1
  83. package/dist/state/store/note-store.d.ts +7 -7
  84. package/dist/state/store/note-store.d.ts.map +1 -1
  85. package/dist/state/store/nullifier-store.d.ts +9 -0
  86. package/dist/state/store/nullifier-store.d.ts.map +1 -1
  87. package/dist/state/store/records.d.ts +39 -2
  88. package/dist/state/store/records.d.ts.map +1 -1
  89. package/dist/state/store/root-store.d.ts.map +1 -1
  90. package/dist/state/store/store.d.ts +79 -27
  91. package/dist/state/store/store.d.ts.map +1 -1
  92. package/dist/storage/indexeddb.d.ts.map +1 -1
  93. package/dist/storage/memory.d.ts.map +1 -1
  94. package/dist/transactions/adapter.d.ts +31 -0
  95. package/dist/transactions/adapter.d.ts.map +1 -0
  96. package/dist/transactions/deposit.d.ts +12 -15
  97. package/dist/transactions/deposit.d.ts.map +1 -1
  98. package/dist/transactions/index.d.ts +9 -4
  99. package/dist/transactions/index.d.ts.map +1 -1
  100. package/dist/transactions/note-selection.d.ts +17 -0
  101. package/dist/transactions/note-selection.d.ts.map +1 -0
  102. package/dist/transactions/note-sync.d.ts +5 -33
  103. package/dist/transactions/note-sync.d.ts.map +1 -1
  104. package/dist/transactions/reconcile.d.ts +9 -11
  105. package/dist/transactions/reconcile.d.ts.map +1 -1
  106. package/dist/transactions/transact.d.ts +30 -22
  107. package/dist/transactions/transact.d.ts.map +1 -1
  108. package/dist/transactions/transaction-planner.d.ts +34 -0
  109. package/dist/transactions/transaction-planner.d.ts.map +1 -0
  110. package/dist/transactions/transfer-planner.d.ts +37 -0
  111. package/dist/transactions/transfer-planner.d.ts.map +1 -0
  112. package/dist/transactions/types/deposit.d.ts +67 -0
  113. package/dist/transactions/types/deposit.d.ts.map +1 -0
  114. package/dist/transactions/types/domain.d.ts +70 -0
  115. package/dist/transactions/types/domain.d.ts.map +1 -0
  116. package/dist/transactions/types/index.d.ts +18 -0
  117. package/dist/transactions/types/index.d.ts.map +1 -0
  118. package/dist/transactions/types/options.d.ts +54 -0
  119. package/dist/transactions/types/options.d.ts.map +1 -0
  120. package/dist/transactions/types/planning.d.ts +82 -0
  121. package/dist/transactions/types/planning.d.ts.map +1 -0
  122. package/dist/transactions/types/state-stores.d.ts +151 -0
  123. package/dist/transactions/types/state-stores.d.ts.map +1 -0
  124. package/dist/transactions/types/transact.d.ts +83 -0
  125. package/dist/transactions/types/transact.d.ts.map +1 -0
  126. package/dist/transactions/withdrawal-planner.d.ts +58 -0
  127. package/dist/transactions/withdrawal-planner.d.ts.map +1 -0
  128. package/dist/tsconfig.tsbuildinfo +1 -1
  129. package/dist/tsup.browser.config.d.ts +7 -0
  130. package/dist/tsup.browser.config.d.ts.map +1 -0
  131. package/dist/tsup.config.d.ts +8 -0
  132. package/dist/tsup.config.d.ts.map +1 -0
  133. package/dist/types.d.ts +1 -0
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/utils/amounts.d.ts +26 -0
  136. package/dist/utils/amounts.d.ts.map +1 -0
  137. package/dist/utils/async.d.ts +9 -0
  138. package/dist/utils/async.d.ts.map +1 -1
  139. package/dist/utils/async.js +38 -11
  140. package/dist/utils/async.js.map +1 -0
  141. package/dist/utils/bigint.d.ts +0 -2
  142. package/dist/utils/bigint.d.ts.map +1 -1
  143. package/dist/utils/format.d.ts +25 -0
  144. package/dist/utils/format.d.ts.map +1 -0
  145. package/dist/utils/notes.d.ts +15 -0
  146. package/dist/utils/notes.d.ts.map +1 -0
  147. package/dist/utils/polling.d.ts +5 -0
  148. package/dist/utils/polling.d.ts.map +1 -1
  149. package/dist/utils/random.d.ts +18 -0
  150. package/dist/utils/random.d.ts.map +1 -0
  151. package/dist/utils/signature.d.ts +6 -0
  152. package/dist/utils/signature.d.ts.map +1 -1
  153. package/dist/utils/validators.d.ts +21 -10
  154. package/dist/utils/validators.d.ts.map +1 -1
  155. package/dist/vitest.config.d.ts +3 -0
  156. package/dist/vitest.config.d.ts.map +1 -0
  157. package/dist/wallet/adapter.d.ts +21 -0
  158. package/dist/wallet/adapter.d.ts.map +1 -0
  159. package/dist/wallet/burner/service.d.ts +32 -0
  160. package/dist/wallet/burner/service.d.ts.map +1 -0
  161. package/dist/wallet/burner/types.d.ts +47 -0
  162. package/dist/wallet/burner/types.d.ts.map +1 -0
  163. package/dist/wallet/index.d.ts +20 -0
  164. package/dist/wallet/index.d.ts.map +1 -0
  165. package/dist/wallet/index.js +6462 -0
  166. package/dist/wallet/index.js.map +1 -0
  167. package/dist/wallet/sdk.d.ts +48 -0
  168. package/dist/wallet/sdk.d.ts.map +1 -0
  169. package/dist/wallet/types.d.ts +457 -0
  170. package/dist/wallet/types.d.ts.map +1 -0
  171. package/dist/wallet/unlink-wallet.d.ts +187 -0
  172. package/dist/wallet/unlink-wallet.d.ts.map +1 -0
  173. package/package.json +38 -15
  174. package/.eslintrc.json +0 -4
  175. package/account/zkAccount.test.ts +0 -316
  176. package/account/zkAccount.ts +0 -222
  177. package/circuits.json +0 -26
  178. package/clients/broadcaster.ts +0 -67
  179. package/clients/http.ts +0 -94
  180. package/clients/indexer.ts +0 -150
  181. package/config.ts +0 -39
  182. package/core.ts +0 -17
  183. package/dist/account/railgun-imports-prototype.d.ts +0 -12
  184. package/dist/account/railgun-imports-prototype.d.ts.map +0 -1
  185. package/dist/account/railgun-imports-prototype.js +0 -30
  186. package/dist/account/zkAccount.d.ts.map +0 -1
  187. package/dist/account/zkAccount.js +0 -128
  188. package/dist/circuits.json +0 -26
  189. package/dist/clients/broadcaster.js +0 -23
  190. package/dist/clients/http.js +0 -57
  191. package/dist/clients/indexer.js +0 -67
  192. package/dist/config.js +0 -29
  193. package/dist/core.js +0 -12
  194. package/dist/errors.js +0 -18
  195. package/dist/key-derivation/babyjubjub.d.ts +0 -9
  196. package/dist/key-derivation/babyjubjub.d.ts.map +0 -1
  197. package/dist/key-derivation/babyjubjub.js +0 -9
  198. package/dist/key-derivation/bech32.d.ts +0 -22
  199. package/dist/key-derivation/bech32.d.ts.map +0 -1
  200. package/dist/key-derivation/bech32.js +0 -86
  201. package/dist/key-derivation/bip32.d.ts +0 -17
  202. package/dist/key-derivation/bip32.d.ts.map +0 -1
  203. package/dist/key-derivation/bip32.js +0 -41
  204. package/dist/key-derivation/bip39.d.ts +0 -22
  205. package/dist/key-derivation/bip39.d.ts.map +0 -1
  206. package/dist/key-derivation/bip39.js +0 -56
  207. package/dist/key-derivation/bytes.d.ts +0 -19
  208. package/dist/key-derivation/bytes.d.ts.map +0 -1
  209. package/dist/key-derivation/bytes.js +0 -92
  210. package/dist/key-derivation/hash.d.ts +0 -3
  211. package/dist/key-derivation/hash.d.ts.map +0 -1
  212. package/dist/key-derivation/hash.js +0 -10
  213. package/dist/key-derivation/index.d.ts +0 -8
  214. package/dist/key-derivation/index.d.ts.map +0 -1
  215. package/dist/key-derivation/index.js +0 -7
  216. package/dist/key-derivation/wallet-node.d.ts +0 -45
  217. package/dist/key-derivation/wallet-node.d.ts.map +0 -1
  218. package/dist/key-derivation/wallet-node.js +0 -109
  219. package/dist/keys.js +0 -41
  220. package/dist/prover/config.js +0 -80
  221. package/dist/prover/index.js +0 -1
  222. package/dist/prover/prover.js +0 -274
  223. package/dist/prover/registry.js +0 -57
  224. package/dist/schema.js +0 -14
  225. package/dist/state/ciphertext-store.d.ts +0 -12
  226. package/dist/state/ciphertext-store.d.ts.map +0 -1
  227. package/dist/state/ciphertext-store.js +0 -25
  228. package/dist/state/hydrator.d.ts +0 -16
  229. package/dist/state/hydrator.d.ts.map +0 -1
  230. package/dist/state/hydrator.js +0 -18
  231. package/dist/state/index.js +0 -2
  232. package/dist/state/job-store.d.ts +0 -12
  233. package/dist/state/job-store.d.ts.map +0 -1
  234. package/dist/state/job-store.js +0 -118
  235. package/dist/state/jobs.d.ts +0 -50
  236. package/dist/state/jobs.d.ts.map +0 -1
  237. package/dist/state/jobs.js +0 -1
  238. package/dist/state/leaf-store.d.ts +0 -17
  239. package/dist/state/leaf-store.d.ts.map +0 -1
  240. package/dist/state/leaf-store.js +0 -35
  241. package/dist/state/merkle/hydrator.js +0 -36
  242. package/dist/state/merkle/index.js +0 -2
  243. package/dist/state/merkle/merkle-tree.js +0 -104
  244. package/dist/state/merkle-tree.d.ts +0 -34
  245. package/dist/state/merkle-tree.d.ts.map +0 -1
  246. package/dist/state/merkle-tree.js +0 -104
  247. package/dist/state/note-store.d.ts +0 -37
  248. package/dist/state/note-store.d.ts.map +0 -1
  249. package/dist/state/note-store.js +0 -133
  250. package/dist/state/nullifier-store.d.ts +0 -13
  251. package/dist/state/nullifier-store.d.ts.map +0 -1
  252. package/dist/state/nullifier-store.js +0 -21
  253. package/dist/state/records.d.ts +0 -57
  254. package/dist/state/records.d.ts.map +0 -1
  255. package/dist/state/records.js +0 -1
  256. package/dist/state/root-store.d.ts +0 -13
  257. package/dist/state/root-store.d.ts.map +0 -1
  258. package/dist/state/root-store.js +0 -30
  259. package/dist/state/store/ciphertext-store.js +0 -25
  260. package/dist/state/store/index.js +0 -8
  261. package/dist/state/store/job-store.js +0 -118
  262. package/dist/state/store/jobs.js +0 -1
  263. package/dist/state/store/leaf-store.js +0 -35
  264. package/dist/state/store/note-store.js +0 -142
  265. package/dist/state/store/nullifier-store.js +0 -30
  266. package/dist/state/store/records.js +0 -1
  267. package/dist/state/store/root-store.js +0 -30
  268. package/dist/state/store/store.js +0 -22
  269. package/dist/state/store.d.ts +0 -26
  270. package/dist/state/store.d.ts.map +0 -1
  271. package/dist/state/store.js +0 -19
  272. package/dist/state.d.ts +0 -83
  273. package/dist/state.d.ts.map +0 -1
  274. package/dist/state.js +0 -171
  275. package/dist/storage/index.js +0 -2
  276. package/dist/storage/indexeddb.js +0 -205
  277. package/dist/storage/memory.js +0 -87
  278. package/dist/transactions/deposit.js +0 -169
  279. package/dist/transactions/index.js +0 -4
  280. package/dist/transactions/note-sync.js +0 -320
  281. package/dist/transactions/reconcile.js +0 -39
  282. package/dist/transactions/shield.d.ts +0 -5
  283. package/dist/transactions/shield.d.ts.map +0 -1
  284. package/dist/transactions/shield.js +0 -93
  285. package/dist/transactions/transact.js +0 -561
  286. package/dist/transactions/types.d.ts +0 -114
  287. package/dist/transactions/types.d.ts.map +0 -1
  288. package/dist/transactions/types.js +0 -1
  289. package/dist/transactions/utils.d.ts +0 -10
  290. package/dist/transactions/utils.d.ts.map +0 -1
  291. package/dist/transactions/utils.js +0 -17
  292. package/dist/types.js +0 -1
  293. package/dist/utils/bigint.js +0 -29
  294. package/dist/utils/crypto.d.ts +0 -12
  295. package/dist/utils/crypto.d.ts.map +0 -1
  296. package/dist/utils/crypto.js +0 -39
  297. package/dist/utils/json-codec.js +0 -25
  298. package/dist/utils/polling.js +0 -6
  299. package/dist/utils/signature.js +0 -12
  300. package/dist/utils/time.d.ts +0 -2
  301. package/dist/utils/time.d.ts.map +0 -1
  302. package/dist/utils/time.js +0 -3
  303. package/dist/utils/validators.js +0 -70
  304. package/dist/utils/witness.d.ts +0 -11
  305. package/dist/utils/witness.d.ts.map +0 -1
  306. package/dist/utils/witness.js +0 -19
  307. package/errors.ts +0 -20
  308. package/index.ts +0 -21
  309. package/key-derivation/babyjubjub.ts +0 -11
  310. package/key-derivation/bech32.test.ts +0 -90
  311. package/key-derivation/bech32.ts +0 -124
  312. package/key-derivation/bip32.ts +0 -56
  313. package/key-derivation/bip39.ts +0 -76
  314. package/key-derivation/bytes.ts +0 -118
  315. package/key-derivation/hash.ts +0 -13
  316. package/key-derivation/index.ts +0 -7
  317. package/key-derivation/wallet-node.ts +0 -155
  318. package/keys.ts +0 -47
  319. package/prover/config.ts +0 -104
  320. package/prover/index.ts +0 -1
  321. package/prover/prover.integration.test.ts +0 -162
  322. package/prover/prover.test.ts +0 -309
  323. package/prover/prover.ts +0 -405
  324. package/prover/registry.test.ts +0 -90
  325. package/prover/registry.ts +0 -82
  326. package/schema.ts +0 -17
  327. package/setup-artifacts.sh +0 -57
  328. package/state/index.ts +0 -2
  329. package/state/merkle/hydrator.ts +0 -69
  330. package/state/merkle/index.ts +0 -12
  331. package/state/merkle/merkle-tree.test.ts +0 -50
  332. package/state/merkle/merkle-tree.ts +0 -163
  333. package/state/store/ciphertext-store.ts +0 -28
  334. package/state/store/index.ts +0 -24
  335. package/state/store/job-store.ts +0 -162
  336. package/state/store/jobs.ts +0 -64
  337. package/state/store/leaf-store.ts +0 -39
  338. package/state/store/note-store.ts +0 -177
  339. package/state/store/nullifier-store.ts +0 -39
  340. package/state/store/records.ts +0 -61
  341. package/state/store/root-store.ts +0 -34
  342. package/state/store/store.ts +0 -25
  343. package/state.test.ts +0 -235
  344. package/storage/index.ts +0 -3
  345. package/storage/indexeddb.test.ts +0 -99
  346. package/storage/indexeddb.ts +0 -235
  347. package/storage/memory.test.ts +0 -59
  348. package/storage/memory.ts +0 -93
  349. package/transactions/deposit.test.ts +0 -160
  350. package/transactions/deposit.ts +0 -227
  351. package/transactions/index.ts +0 -20
  352. package/transactions/note-sync.test.ts +0 -155
  353. package/transactions/note-sync.ts +0 -452
  354. package/transactions/reconcile.ts +0 -73
  355. package/transactions/transact.test.ts +0 -451
  356. package/transactions/transact.ts +0 -811
  357. package/transactions/types.ts +0 -141
  358. package/tsconfig.json +0 -15
  359. package/types/global.d.ts +0 -15
  360. package/types.ts +0 -24
  361. package/utils/async.ts +0 -15
  362. package/utils/bigint.ts +0 -34
  363. package/utils/crypto.test.ts +0 -69
  364. package/utils/crypto.ts +0 -58
  365. package/utils/json-codec.ts +0 -38
  366. package/utils/polling.ts +0 -6
  367. package/utils/signature.ts +0 -16
  368. package/utils/validators.test.ts +0 -64
  369. package/utils/validators.ts +0 -86
@@ -1,320 +0,0 @@
1
- import { poseidon } from "@railgun-community/circomlibjs";
2
- import { createIndexerClient } from "../clients/indexer.js";
3
- import { serviceConfig } from "../config.js";
4
- import { CoreError } from "../errors.js";
5
- import { ByteLength, ByteUtils } from "../key-derivation/bytes.js";
6
- import { createMerkleTrees, rebuildTreeFromStore, } from "../state/index.js";
7
- import { formatUint256, parseHexToBigInt } from "../utils/bigint.js";
8
- import { decryptNote } from "../utils/crypto.js";
9
- import { ensureChainId } from "../utils/validators.js";
10
- const DEFAULT_BATCH_SIZE = 256;
11
- function buildCiphertext(bytes) {
12
- return {
13
- data: [
14
- parseHexToBigInt(bytes[0]),
15
- parseHexToBigInt(bytes[1]),
16
- parseHexToBigInt(bytes[2]),
17
- ],
18
- };
19
- }
20
- function encodeCiphertext(ciphertext) {
21
- const payload = new Uint8Array(ByteLength.UINT_256 * ciphertext.data.length);
22
- ciphertext.data.forEach((value, index) => {
23
- const start = index * ByteLength.UINT_256;
24
- payload.set(ByteUtils.hexStringToBytes(formatUint256(value)), start);
25
- });
26
- return payload;
27
- }
28
- export function createNoteSyncService(stateStore, options = {}) {
29
- const trees = options.merkleTrees ?? createMerkleTrees();
30
- const limit = options.limit ?? DEFAULT_BATCH_SIZE;
31
- const status = new Map();
32
- // Initialize indexer client
33
- let indexerClient = options.indexerClient;
34
- if (!indexerClient) {
35
- const fetchImpl = options.fetch ?? (typeof fetch === "function" ? fetch : undefined);
36
- if (!fetchImpl) {
37
- throw new Error("fetch dependency is required to sync indexer commitments");
38
- }
39
- indexerClient = createIndexerClient(serviceConfig.indexerBaseUrl, {
40
- fetch: fetchImpl,
41
- });
42
- }
43
- // Count-based optimization: avoid per-nullifier lookups when counts are unchanged
44
- async function shouldQueryNullifiers(chainId) {
45
- const [onChainCount, localCount] = await Promise.all([
46
- indexerClient.getNullifierCount(chainId),
47
- stateStore.countNullifiers(chainId),
48
- ]);
49
- return onChainCount !== localCount;
50
- }
51
- function createNoteRecord(params) {
52
- const { chainId, index, commitment, token, amount, npk, mpk, random, nullifier, spentAt } = params;
53
- const base = {
54
- chainId,
55
- index,
56
- token,
57
- value: amount.toString(),
58
- commitment,
59
- npk: formatUint256(npk),
60
- mpk: formatUint256(mpk),
61
- random: formatUint256(random),
62
- nullifier,
63
- };
64
- return spentAt === undefined ? base : { ...base, spentAt };
65
- }
66
- async function recordCommitment(chainId, record, allowRelaxedOrder = false) {
67
- const value = parseHexToBigInt(record.commitment);
68
- const currentLeafCount = trees.getLeafCount(chainId);
69
- if (record.index >= currentLeafCount) {
70
- const { index } = trees.addLeaf(chainId, value);
71
- if (index !== record.index && !allowRelaxedOrder) {
72
- throw new CoreError("indexed commitments out of order");
73
- }
74
- await stateStore.putLeaf({
75
- chainId,
76
- index: record.index,
77
- commitment: record.commitment,
78
- });
79
- }
80
- await stateStore.putRoot({ chainId, root: record.root });
81
- }
82
- async function tryStoreNote(chainId, record, account, shouldCheckNullifiers) {
83
- const ciphertext = buildCiphertext(record.ciphertext);
84
- let note;
85
- try {
86
- note = decryptNote(ciphertext, account.masterPublicKey);
87
- }
88
- catch (err) {
89
- if (err instanceof CoreError) {
90
- return null;
91
- }
92
- throw err;
93
- }
94
- const random = note.random;
95
- const amount = note.amount;
96
- const token = note.token;
97
- const npk = poseidon([account.masterPublicKey, random]);
98
- const commitment = poseidon([npk, BigInt(token), amount]);
99
- if (commitment !== parseHexToBigInt(record.commitment)) {
100
- return null;
101
- }
102
- const nullifier = poseidon([account.nullifyingKey, BigInt(record.index)]);
103
- const nullifierHex = formatUint256(nullifier);
104
- const ciphertextBytes = encodeCiphertext(ciphertext);
105
- await stateStore.putCiphertext(chainId, record.index, ciphertextBytes);
106
- const baseNoteParams = {
107
- chainId,
108
- index: record.index,
109
- commitment: record.commitment,
110
- token,
111
- amount,
112
- npk,
113
- mpk: account.masterPublicKey,
114
- random,
115
- nullifier: nullifierHex,
116
- };
117
- // Check if this note already exists in local storage
118
- const existingNote = await stateStore.getNote(chainId, record.index);
119
- // If note is already marked as spent locally, don't query indexer
120
- // to ask for nullifier because we already know it's spent
121
- if (existingNote?.spentAt !== undefined) {
122
- // Ensure nullifier is stored for count optimization (idempotent)
123
- await stateStore.putNullifier({
124
- chainId,
125
- nullifier: nullifierHex,
126
- noteIndex: record.index,
127
- });
128
- return existingNote;
129
- }
130
- // Skip indexer nullifier query if nullifier counts match
131
- if (!shouldCheckNullifiers) {
132
- if (existingNote) {
133
- return existingNote;
134
- }
135
- const stored = createNoteRecord(baseNoteParams);
136
- await stateStore.putNote(stored);
137
- return stored;
138
- }
139
- // Counts mismatched: query individual nullifier to check if this note was spent
140
- const onChainNullifier = await indexerClient.getNullifier({
141
- chainId,
142
- nullifier: nullifierHex,
143
- });
144
- if (onChainNullifier) {
145
- const spentAtMs = onChainNullifier.spentAt * 1000;
146
- // Store nullifier
147
- await stateStore.putNullifier({
148
- chainId,
149
- nullifier: nullifierHex,
150
- noteIndex: record.index,
151
- });
152
- if (existingNote) {
153
- // Update existing unspent note to mark as spent
154
- await stateStore.markNoteSpent(chainId, record.index, spentAtMs);
155
- return existingNote;
156
- }
157
- const stored = createNoteRecord({
158
- ...baseNoteParams,
159
- spentAt: spentAtMs,
160
- });
161
- await stateStore.putNote(stored);
162
- return stored;
163
- }
164
- // Skip re-storing unspent notes that already exist
165
- if (existingNote) {
166
- return existingNote;
167
- }
168
- const stored = createNoteRecord(baseNoteParams);
169
- await stateStore.putNote(stored);
170
- return stored;
171
- }
172
- // Pulls commitments from the indexer starting at `start`, updating local tree and notes.
173
- async function ingestFrom(chainId, start, account) {
174
- const shouldCheckNullifiers = await shouldQueryNullifiers(chainId);
175
- let cursor = start;
176
- for (;;) {
177
- const batch = await indexerClient.fetchCommitmentBatch({
178
- chainId,
179
- start: cursor,
180
- limit,
181
- });
182
- if (batch.commitments.length === 0) {
183
- break;
184
- }
185
- for (const record of batch.commitments) {
186
- const expectedIndex = trees.getLeafCount(chainId);
187
- if (record.index !== expectedIndex) {
188
- throw new Error("indexed commitments out of order");
189
- }
190
- const value = ByteUtils.hexToBigInt(record.commitment);
191
- const { index } = trees.addLeaf(chainId, value);
192
- if (index !== record.index) {
193
- throw new Error("local merkle tree desynchronized");
194
- }
195
- await stateStore.putLeaf({
196
- chainId,
197
- index: record.index,
198
- commitment: record.commitment,
199
- });
200
- await stateStore.putRoot({ chainId, root: record.root });
201
- await tryStoreNote(chainId, record, account, shouldCheckNullifiers);
202
- cursor = record.index + 1;
203
- }
204
- if (batch.commitments.length < limit) {
205
- break;
206
- }
207
- }
208
- }
209
- // Clears local state for a chain and rehydrates fully from the indexer.
210
- async function fullResync(chainId, account) {
211
- trees.reset(chainId);
212
- await stateStore.clearLeaves(chainId);
213
- await ingestFrom(chainId, 0, account);
214
- }
215
- /**
216
- * Syncs a single chain into local state, optionally forcing a full rebuild.
217
- * Skips overlapping runs via `inFlight` and falls back to full resync on
218
- * ordering/root inconsistencies.
219
- */
220
- async function syncChain(chainId, account, opts = {}) {
221
- ensureChainId(chainId);
222
- const current = status.get(chainId) ?? {
223
- inFlight: false,
224
- lastSuccess: null,
225
- };
226
- if (current.inFlight) {
227
- return;
228
- }
229
- status.set(chainId, { ...current, inFlight: true, lastError: undefined });
230
- try {
231
- const start = opts.forceFullResync
232
- ? 0
233
- : await rebuildTreeFromStore({
234
- chainId,
235
- trees,
236
- loadLeaf: stateStore.getLeaf.bind(stateStore),
237
- });
238
- if (opts.forceFullResync) {
239
- await fullResync(chainId, account);
240
- }
241
- else {
242
- try {
243
- await ingestFrom(chainId, start, account);
244
- }
245
- catch (err) {
246
- // Fallback to full resync on ordering/root mismatch.
247
- await fullResync(chainId, account);
248
- }
249
- }
250
- status.set(chainId, {
251
- inFlight: false,
252
- lastSuccess: Date.now(),
253
- });
254
- }
255
- catch (err) {
256
- status.set(chainId, {
257
- inFlight: false,
258
- lastSuccess: current.lastSuccess ?? null,
259
- lastError: err instanceof Error ? err.message : String(err),
260
- });
261
- throw err;
262
- }
263
- }
264
- /**
265
- * Syncs multiple chains sequentially.
266
- */
267
- async function syncChains(chainIds, account, opts) {
268
- for (const chainId of chainIds) {
269
- await syncChain(chainId, account, opts);
270
- }
271
- }
272
- /**
273
- * Legacy sync method that returns synced notes.
274
- * Kept for backward compatibility.
275
- */
276
- async function sync(chainId, account, opts) {
277
- ensureChainId(chainId);
278
- await rebuildTreeFromStore({
279
- chainId,
280
- trees,
281
- loadLeaf: stateStore.getLeaf.bind(stateStore),
282
- });
283
- const synced = [];
284
- let start = opts?.start ?? 0;
285
- const shouldCheckNullifiers = await shouldQueryNullifiers(chainId);
286
- let keepFetching = true;
287
- while (keepFetching) {
288
- const batch = await indexerClient.fetchCommitmentBatch({
289
- chainId,
290
- start,
291
- limit,
292
- });
293
- if (batch.commitments.length === 0) {
294
- keepFetching = false;
295
- continue;
296
- }
297
- for (const record of batch.commitments) {
298
- await recordCommitment(chainId, record, !!opts?.forceFullScan);
299
- const storedNote = await tryStoreNote(chainId, record, account, shouldCheckNullifiers);
300
- if (storedNote) {
301
- synced.push(storedNote);
302
- }
303
- start = record.index + 1;
304
- }
305
- if (batch.commitments.length < limit) {
306
- keepFetching = false;
307
- }
308
- }
309
- return synced;
310
- }
311
- function getStatus() {
312
- return status;
313
- }
314
- return {
315
- sync,
316
- syncChain,
317
- syncChains,
318
- getStatus,
319
- };
320
- }
@@ -1,39 +0,0 @@
1
- const ACTIVE_STATUSES = ["pending", "submitted", "broadcasting"];
2
- export function createJobReconciler(deps) {
3
- const { stateStore, depositClient, transactService } = deps;
4
- async function reconcileJob(job) {
5
- if (job.kind === "deposit") {
6
- return depositClient.syncPendingDeposit(job.relayId);
7
- }
8
- return transactService.syncPendingTransact(job.relayId);
9
- }
10
- async function reconcileRelay(relayId) {
11
- const job = await stateStore.getPendingJob(relayId);
12
- if (!job) {
13
- throw new Error(`unknown relay ${relayId}`);
14
- }
15
- return reconcileJob(job);
16
- }
17
- async function reconcileAll(filter = {}) {
18
- const jobs = await stateStore.listPendingJobs({
19
- kind: filter.kind,
20
- statuses: filter.statuses ?? ACTIVE_STATUSES,
21
- });
22
- const results = [];
23
- for (const job of jobs) {
24
- try {
25
- const res = await reconcileJob(job);
26
- results.push(res);
27
- }
28
- catch (err) {
29
- // Allow caller to decide how to handle errors; we keep going.
30
- results.push(err);
31
- }
32
- }
33
- return results;
34
- }
35
- return {
36
- reconcileRelay,
37
- reconcileAll,
38
- };
39
- }
@@ -1,5 +0,0 @@
1
- import type { ShieldResult, ShieldStateStore, ShieldSubmission } from './types.js';
2
- export declare function createShieldService(stateStore: ShieldStateStore): {
3
- submit(submission: ShieldSubmission): Promise<ShieldResult>;
4
- };
5
- //# sourceMappingURL=shield.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../transactions/shield.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB;uBA8DnC,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;EA+BpE"}
@@ -1,93 +0,0 @@
1
- import { Interface } from 'ethers';
2
- import { poseidon } from '@railgun-community/circomlibjs'; // TODO: replace with zk-kit
3
- import { createLocalMerkleTree } from '../state/merkle-tree.js';
4
- import { ensureAddress, ensureChainId } from '../utils/validators.js';
5
- const HEX_PAD = 64;
6
- const DEPOSIT_ABI = [
7
- 'function deposit(address _depositor, (uint256 key, uint256 amount, address token)[] notes)',
8
- ];
9
- const depositInterface = new Interface(DEPOSIT_ABI);
10
- export function createShieldService(stateStore) {
11
- if (!stateStore) {
12
- throw new Error('stateStore dependency is required');
13
- }
14
- const trees = new Map();
15
- function getTree(chainId) {
16
- ensureChainId(chainId);
17
- let tree = trees.get(chainId);
18
- if (!tree) {
19
- tree = createLocalMerkleTree();
20
- trees.set(chainId, tree);
21
- }
22
- return tree;
23
- }
24
- function buildCalldata(submission, npk) {
25
- ensureChainId(submission.chainId);
26
- ensureAddress('pool address', submission.poolAddress);
27
- ensureAddress('depositor', submission.depositor);
28
- ensureAddress('token', submission.note.token);
29
- return depositInterface.encodeFunctionData('deposit', [
30
- submission.depositor,
31
- [
32
- {
33
- key: npk,
34
- amount: submission.note.amount,
35
- token: submission.note.token,
36
- },
37
- ],
38
- ]);
39
- }
40
- function deriveNpk(submission) {
41
- if (submission.note.mpk < 0n) {
42
- throw new Error('mpk must be non-negative');
43
- }
44
- if (submission.note.random < 0n) {
45
- throw new Error('random must be non-negative');
46
- }
47
- return poseidon([submission.note.mpk, submission.note.random]);
48
- }
49
- function computeCommitment(submission, npk) {
50
- if (submission.note.amount < 0n) {
51
- throw new Error('amount must be non-negative');
52
- }
53
- const tokenScalar = BigInt(submission.note.token);
54
- if (tokenScalar < 0n) {
55
- throw new Error('token must map to non-negative scalar');
56
- }
57
- return poseidon([npk, tokenScalar, submission.note.amount]);
58
- }
59
- async function relayToBroadcaster(chainId, commitment) {
60
- const tree = getTree(chainId);
61
- return tree.addLeaf(commitment);
62
- }
63
- return {
64
- async submit(submission) {
65
- const npk = deriveNpk(submission);
66
- const calldata = buildCalldata(submission, npk);
67
- const commitment = computeCommitment(submission, npk);
68
- const { index, root } = await relayToBroadcaster(submission.chainId, commitment);
69
- const commitmentHex = toHex(commitment);
70
- await Promise.all([
71
- stateStore.putLeaf({
72
- chainId: submission.chainId,
73
- index,
74
- commitment: commitmentHex,
75
- }),
76
- stateStore.putRoot({
77
- chainId: submission.chainId,
78
- root,
79
- }),
80
- ]);
81
- return {
82
- chainId: submission.chainId,
83
- index,
84
- commitment: commitmentHex,
85
- root,
86
- calldata,
87
- };
88
- },
89
- };
90
- }
91
- function toHex(value) {
92
- return `0x${value.toString(16).padStart(HEX_PAD, '0')}`;
93
- }