@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,451 +0,0 @@
1
- import { eddsa, poseidon } from "@railgun-community/circomlibjs";
2
- import { Interface } from "ethers";
3
- import {
4
- afterEach,
5
- beforeEach,
6
- describe,
7
- expect,
8
- it,
9
- vi,
10
- type MockInstance,
11
- } from "vitest";
12
-
13
- import {
14
- createMockFetch,
15
- createMockIndexer,
16
- } from "../../test-utils/mock-indexer.js";
17
- import type { ZkAccount } from "../account/zkAccount.js";
18
- import { ByteLength, ByteUtils } from "../key-derivation/bytes.js";
19
- import { createMerkleTrees, createStateStore } from "../state/index.js";
20
- import { createMemoryStorage } from "../storage/index.js";
21
- import { createDepositClient } from "./deposit.js";
22
- import { createTransactService, TRANSACT_ABI } from "./transact.js";
23
-
24
- const chainId = 1;
25
- const poolAddress = "0x1111111111111111111111111111111111111111";
26
- const depositor = "0x2222222222222222222222222222222222222222";
27
- const token = "0x3333333333333333333333333333333333333333";
28
- const timestamp = 1_700_000_000_000;
29
-
30
- const transactInterface = new Interface([TRANSACT_ABI]);
31
- const formatUint = (value: bigint) =>
32
- ByteUtils.nToHex(value, ByteLength.UINT_256, true);
33
-
34
- // Create a mock ZkAccount for testing
35
- const mockPrivateKey = Buffer.from(new Uint8Array(32).fill(1));
36
- const mockPublicKey = eddsa.prv2pub(mockPrivateKey);
37
- const mockNullifyingKey = 987n;
38
- const mockMpk = poseidon([
39
- mockPublicKey[0],
40
- mockPublicKey[1],
41
- mockNullifyingKey,
42
- ]);
43
- const mockZkAccount: ZkAccount = {
44
- spendingKeyPair: {
45
- privateKey: mockPrivateKey,
46
- pubkey: mockPublicKey,
47
- },
48
- viewingKeyPair: {
49
- privateKey: Buffer.from(new Uint8Array(32).fill(2)),
50
- pubkey: Buffer.from(new Uint8Array(32).fill(3)),
51
- },
52
- nullifyingKey: mockNullifyingKey,
53
- masterPublicKey: mockMpk,
54
- };
55
-
56
- describe.skip("transact service", () => {
57
- let state: ReturnType<typeof createStateStore>;
58
- let merkleTrees: ReturnType<typeof createMerkleTrees>;
59
- let depositClient: ReturnType<typeof createDepositClient>;
60
- let transactClient: ReturnType<typeof createTransactService>;
61
- let indexer: ReturnType<typeof createMockIndexer>;
62
- let fetchMock: ReturnType<typeof createMockFetch>;
63
- let dateNowSpy: MockInstance<() => number>;
64
-
65
- const requestAndSyncDeposit = async (note: {
66
- mpk: bigint;
67
- random: bigint;
68
- amount: bigint;
69
- token: string;
70
- }) => {
71
- const relay = await depositClient.request({
72
- zkAccount: mockZkAccount,
73
- chainId,
74
- poolAddress,
75
- depositor,
76
- note,
77
- });
78
- indexer.publish(chainId, relay.commitment);
79
- return depositClient.syncPendingDeposit(relay.relayId);
80
- };
81
-
82
- beforeEach(async () => {
83
- const storage = createMemoryStorage();
84
- await storage.open();
85
- state = createStateStore(storage);
86
- merkleTrees = createMerkleTrees();
87
- indexer = createMockIndexer();
88
- fetchMock = createMockFetch(indexer);
89
- depositClient = createDepositClient(state, {
90
- merkleTrees,
91
- fetch: fetchMock,
92
- });
93
- transactClient = createTransactService(state, {
94
- merkleTrees,
95
- });
96
- dateNowSpy = vi.spyOn(Date, "now").mockReturnValue(timestamp);
97
- });
98
-
99
- afterEach(() => {
100
- dateNowSpy?.mockRestore();
101
- });
102
-
103
- it("spends a note, persists nullifier, marks note spent, and builds calldata", async () => {
104
- // TODO: unskip it, fix it by mocking correctly
105
- const mpk = mockMpk;
106
- const random1 = 456n;
107
- const random2 = 789n;
108
- const amount1 = 500n;
109
- const amount2 = 300n;
110
- const nullifyingKey = mockNullifyingKey;
111
- const npk1 = poseidon([mpk, random1]);
112
- const npk2 = poseidon([mpk, random2]);
113
-
114
- const deposit1 = await requestAndSyncDeposit({
115
- mpk,
116
- random: random1,
117
- amount: amount1,
118
- token,
119
- });
120
- const nullifier1 = poseidon([nullifyingKey, BigInt(deposit1.index)]);
121
- await state.putNote({
122
- chainId,
123
- index: deposit1.index,
124
- token,
125
- value: amount1.toString(),
126
- commitment: deposit1.commitment,
127
- npk: formatUint(npk1),
128
- mpk: formatUint(mpk),
129
- random: formatUint(random1),
130
- nullifier: formatUint(nullifier1),
131
- });
132
-
133
- const deposit2 = await requestAndSyncDeposit({
134
- mpk,
135
- random: random2,
136
- amount: amount2,
137
- token,
138
- });
139
- const nullifier2 = poseidon([nullifyingKey, BigInt(deposit2.index)]);
140
- await state.putNote({
141
- chainId,
142
- index: deposit2.index,
143
- token,
144
- value: amount2.toString(),
145
- commitment: deposit2.commitment,
146
- npk: formatUint(npk2),
147
- mpk: formatUint(mpk),
148
- random: formatUint(random2),
149
- nullifier: formatUint(nullifier2),
150
- });
151
-
152
- // Create 3 outputs - must sum to inputs for circuit balance
153
- const output1Random = 111n;
154
- const output2Random = 222n;
155
- const output3Random = 333n;
156
- const output1Npk = poseidon([mpk, output1Random]);
157
- const output2Npk = poseidon([mpk, output2Random]);
158
- const output3Npk = poseidon([mpk, output3Random]);
159
- const output1Amount = 200n;
160
- const output2Amount = 300n;
161
- const output3Amount = 300n; // Total outputs must equal total inputs (800n)
162
- const withdrawalAmount = 100n; // Withdrawal is handled separately by contract
163
-
164
- const relay = await transactClient.transact({
165
- zkAccount: mockZkAccount,
166
- chainId,
167
- poolAddress,
168
- token,
169
- inputs: [{ index: deposit1.index }, { index: deposit2.index }],
170
- withdrawal: {
171
- npk: 0n,
172
- amount: withdrawalAmount,
173
- token,
174
- },
175
- outputs: [
176
- {
177
- mpk,
178
- random: output1Random,
179
- amount: output1Amount,
180
- token,
181
- },
182
- {
183
- mpk,
184
- random: output2Random,
185
- amount: output2Amount,
186
- token,
187
- },
188
- {
189
- mpk,
190
- random: output3Random,
191
- amount: output3Amount,
192
- token,
193
- },
194
- ],
195
- });
196
- const sync = await transactClient.syncPendingTransact(relay.relayId);
197
-
198
- const expectedCommitment1 = poseidon([
199
- output1Npk,
200
- BigInt(token),
201
- output1Amount,
202
- ]);
203
- const expectedCommitment2 = poseidon([
204
- output2Npk,
205
- BigInt(token),
206
- output2Amount,
207
- ]);
208
- const expectedCommitment3 = poseidon([
209
- output3Npk,
210
- BigInt(token),
211
- output3Amount,
212
- ]);
213
-
214
- expect(sync.chainId).toBe(chainId);
215
- expect(sync.root).toBe(merkleTrees.getRoot(chainId));
216
- expect(sync.nullifiers).toEqual([
217
- formatUint(nullifier1),
218
- formatUint(nullifier2),
219
- ]);
220
- expect(sync.newCommitments).toEqual([
221
- formatUint(expectedCommitment1),
222
- formatUint(expectedCommitment2),
223
- formatUint(expectedCommitment3),
224
- ]);
225
- expect(relay.witnesses).toHaveLength(2);
226
- const [firstWitness, secondWitness] = relay.witnesses;
227
- if (!firstWitness || !secondWitness) {
228
- throw new Error("expected witnesses for both inputs");
229
- }
230
- expect(firstWitness.root).toBe(secondWitness.root);
231
- expect(firstWitness.leaf).toBe(BigInt(deposit1.commitment));
232
- expect(secondWitness.leaf).toBe(BigInt(deposit2.commitment));
233
- expect(Array.isArray(firstWitness.siblings)).toBe(true);
234
- expect(Array.isArray(firstWitness.pathIndices)).toBe(true);
235
- expect(firstWitness.siblings.length).toBeGreaterThan(0);
236
- expect(firstWitness.pathIndices.length).toBeGreaterThan(0);
237
-
238
- const decoded = transactInterface.decodeFunctionData(
239
- "transact",
240
- relay.calldata,
241
- );
242
- const txData = decoded[0][0];
243
- expect(txData.merkleRoot).toBe(relay.proof.pubSignals[0]);
244
- expect(txData.withdrawal.amount).toBe(withdrawalAmount);
245
- expect(txData.withdrawal.token).toBe(token);
246
-
247
- const storedNullifier1 = await state.getNullifier(
248
- chainId,
249
- formatUint(nullifier1),
250
- );
251
- expect(storedNullifier1?.nullifier).toBe(formatUint(nullifier1));
252
- expect(storedNullifier1?.noteIndex).toBe(deposit1.index);
253
-
254
- const storedNullifier2 = await state.getNullifier(
255
- chainId,
256
- formatUint(nullifier2),
257
- );
258
- expect(storedNullifier2?.nullifier).toBe(formatUint(nullifier2));
259
- expect(storedNullifier2?.noteIndex).toBe(deposit2.index);
260
-
261
- const spentNote1 = await state.getNote(chainId, deposit1.index);
262
- expect(spentNote1?.spentAt).toBe(timestamp);
263
-
264
- const spentNote2 = await state.getNote(chainId, deposit2.index);
265
- expect(spentNote2?.spentAt).toBe(timestamp);
266
-
267
- const finalLeafCount = merkleTrees.getLeafCount(chainId);
268
- const outputLeaf1 = await state.getLeaf(chainId, finalLeafCount - 3);
269
- const outputLeaf2 = await state.getLeaf(chainId, finalLeafCount - 2);
270
- const outputLeaf3 = await state.getLeaf(chainId, finalLeafCount - 1);
271
- expect(outputLeaf1?.commitment).toBe(formatUint(expectedCommitment1));
272
- expect(outputLeaf2?.commitment).toBe(formatUint(expectedCommitment2));
273
- expect(outputLeaf3?.commitment).toBe(formatUint(expectedCommitment3));
274
- });
275
-
276
- it("rejects spending a note that is not in local state", async () => {
277
- await expect(
278
- transactClient.transact({
279
- zkAccount: mockZkAccount,
280
- chainId,
281
- poolAddress,
282
- token,
283
- inputs: [{ index: 0 }],
284
- withdrawal: {
285
- npk: 0n,
286
- amount: 10n,
287
- token,
288
- },
289
- outputs: [],
290
- }),
291
- ).rejects.toThrow("note 0 not found for chain");
292
- });
293
-
294
- it("rejects spending a note that is already marked spent", async () => {
295
- const mpk = 123n;
296
- const random = 456n;
297
- const amount = 10n;
298
- const nullifyingKey = 222n;
299
- const npk = poseidon([mpk, random]);
300
-
301
- const deposit = await requestAndSyncDeposit({
302
- mpk,
303
- random,
304
- amount,
305
- token,
306
- });
307
- const nullifier = poseidon([nullifyingKey, BigInt(deposit.index)]);
308
-
309
- await state.putNote({
310
- chainId,
311
- index: deposit.index,
312
- token,
313
- value: amount.toString(),
314
- commitment: deposit.commitment,
315
- npk: formatUint(npk),
316
- mpk: formatUint(mpk),
317
- random: formatUint(random),
318
- nullifier: formatUint(nullifier),
319
- });
320
- await state.markNoteSpent(chainId, deposit.index, timestamp - 1);
321
-
322
- await expect(
323
- transactClient.transact({
324
- zkAccount: mockZkAccount,
325
- chainId,
326
- poolAddress,
327
- token,
328
- inputs: [{ index: deposit.index }],
329
- withdrawal: {
330
- npk: 0n,
331
- amount: 0n,
332
- token,
333
- },
334
- outputs: [],
335
- }),
336
- ).rejects.toThrow(`note ${deposit.index} is already spent`);
337
- });
338
-
339
- it.skip("handles multiple output notes and updates local tree state", async () => {
340
- // TODO: unskip it, fix it by mocking correctly
341
- const mpk = mockMpk;
342
- const random1 = 777n;
343
- const random2 = 888n;
344
- const amount1 = 600n;
345
- const amount2 = 400n;
346
- const nullifyingKey = mockNullifyingKey;
347
- const npk1 = poseidon([mpk, random1]);
348
- const npk2 = poseidon([mpk, random2]);
349
-
350
- const deposit1 = await requestAndSyncDeposit({
351
- mpk,
352
- random: random1,
353
- amount: amount1,
354
- token,
355
- });
356
- const nullifier1 = poseidon([nullifyingKey, BigInt(deposit1.index)]);
357
- await state.putNote({
358
- chainId,
359
- index: deposit1.index,
360
- token,
361
- value: amount1.toString(),
362
- commitment: deposit1.commitment,
363
- npk: formatUint(npk1),
364
- mpk: formatUint(mpk),
365
- random: formatUint(random1),
366
- nullifier: formatUint(nullifier1),
367
- });
368
-
369
- const deposit2 = await requestAndSyncDeposit({
370
- mpk,
371
- random: random2,
372
- amount: amount2,
373
- token,
374
- });
375
- const nullifier2 = poseidon([nullifyingKey, BigInt(deposit2.index)]);
376
- await state.putNote({
377
- chainId,
378
- index: deposit2.index,
379
- token,
380
- value: amount2.toString(),
381
- commitment: deposit2.commitment,
382
- npk: formatUint(npk2),
383
- mpk: formatUint(mpk),
384
- random: formatUint(random2),
385
- nullifier: formatUint(nullifier2),
386
- });
387
-
388
- const initialLeafCount = merkleTrees.getLeafCount(chainId);
389
-
390
- const output1Random = 101n;
391
- const output2Random = 202n;
392
- const output3Random = 303n;
393
- const output1Npk = poseidon([mpk, output1Random]);
394
- const output2Npk = poseidon([mpk, output2Random]);
395
- const output3Npk = poseidon([mpk, output3Random]);
396
-
397
- const output1Amount = 300n;
398
- const output2Amount = 400n;
399
- const output3Amount = 300n; // Total outputs must equal total inputs (1000n)
400
-
401
- const relay = await transactClient.transact({
402
- zkAccount: mockZkAccount,
403
- chainId,
404
- poolAddress,
405
- token,
406
- inputs: [{ index: deposit1.index }, { index: deposit2.index }],
407
- withdrawal: {
408
- npk: 0n,
409
- amount: 100n, // Withdrawal is handled separately by contract
410
- token,
411
- },
412
- outputs: [
413
- { mpk, random: output1Random, amount: output1Amount, token },
414
- { mpk, random: output2Random, amount: output2Amount, token },
415
- { mpk, random: output3Random, amount: output3Amount, token },
416
- ],
417
- });
418
- const sync = await transactClient.syncPendingTransact(relay.relayId);
419
-
420
- const expectedCommitment1 = poseidon([
421
- output1Npk,
422
- BigInt(token),
423
- output1Amount,
424
- ]);
425
- const expectedCommitment2 = poseidon([
426
- output2Npk,
427
- BigInt(token),
428
- output2Amount,
429
- ]);
430
- const expectedCommitment3 = poseidon([
431
- output3Npk,
432
- BigInt(token),
433
- output3Amount,
434
- ]);
435
-
436
- expect(sync.newCommitments).toEqual(
437
- [expectedCommitment1, expectedCommitment2, expectedCommitment3].map(
438
- formatUint,
439
- ),
440
- );
441
- expect(merkleTrees.getLeafCount(chainId)).toBe(initialLeafCount + 3);
442
-
443
- const leafA = await state.getLeaf(chainId, initialLeafCount);
444
- const leafB = await state.getLeaf(chainId, initialLeafCount + 1);
445
- const leafC = await state.getLeaf(chainId, initialLeafCount + 2);
446
- expect(leafA?.commitment).toBe(formatUint(expectedCommitment1));
447
- expect(leafB?.commitment).toBe(formatUint(expectedCommitment2));
448
- expect(leafC?.commitment).toBe(formatUint(expectedCommitment3));
449
- expect(sync.root).toBe(merkleTrees.getRoot(chainId));
450
- });
451
- });