@veilo/sdk-core 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +449 -1243
  3. package/accounts.d.ts +2 -0
  4. package/accounts.js +3 -0
  5. package/cloak.d.ts +2 -0
  6. package/cloak.js +3 -0
  7. package/config.d.ts +2 -2
  8. package/config.js +2 -3
  9. package/dist/cjs/accounts/admin.d.ts +84 -0
  10. package/dist/cjs/accounts/admin.js +208 -0
  11. package/dist/cjs/accounts/errors.d.ts +6 -0
  12. package/dist/cjs/accounts/errors.js +98 -0
  13. package/dist/cjs/accounts/index.d.ts +4 -0
  14. package/dist/cjs/accounts/index.js +20 -0
  15. package/dist/cjs/accounts/pdas.d.ts +23 -0
  16. package/dist/cjs/accounts/pdas.js +44 -0
  17. package/dist/cjs/accounts/queries.d.ts +41 -0
  18. package/dist/cjs/accounts/queries.js +95 -0
  19. package/dist/cjs/client.d.ts +2 -407
  20. package/dist/cjs/client.js +6 -938
  21. package/dist/cjs/cloak/client.d.ts +28 -0
  22. package/dist/cjs/cloak/client.js +68 -0
  23. package/dist/cjs/cloak/errors.d.ts +13 -0
  24. package/dist/cjs/cloak/errors.js +25 -0
  25. package/dist/cjs/cloak/helpers.d.ts +6 -0
  26. package/dist/cjs/cloak/helpers.js +35 -0
  27. package/dist/cjs/cloak/index.d.ts +6 -0
  28. package/dist/cjs/cloak/index.js +24 -0
  29. package/dist/cjs/cloak/polling.d.ts +7 -0
  30. package/dist/cjs/cloak/polling.js +66 -0
  31. package/dist/cjs/cloak/transport.d.ts +15 -0
  32. package/dist/cjs/cloak/transport.js +119 -0
  33. package/dist/cjs/cloak/types.d.ts +188 -0
  34. package/dist/cjs/cloak/types.js +5 -0
  35. package/dist/cjs/cloak.d.ts +1 -0
  36. package/dist/cjs/cloak.js +18 -0
  37. package/dist/cjs/compactNote.d.ts +21 -0
  38. package/dist/cjs/compactNote.js +31 -7
  39. package/dist/cjs/events/index.d.ts +6 -0
  40. package/dist/cjs/events/index.js +22 -0
  41. package/dist/cjs/events/parsing.d.ts +25 -0
  42. package/dist/cjs/events/parsing.js +158 -0
  43. package/dist/cjs/events/position.d.ts +26 -0
  44. package/dist/cjs/events/position.js +53 -0
  45. package/dist/cjs/events/recovery.d.ts +87 -0
  46. package/dist/cjs/events/recovery.js +281 -0
  47. package/dist/cjs/events/scanning.d.ts +35 -0
  48. package/dist/cjs/events/scanning.js +98 -0
  49. package/dist/cjs/events/tree.d.ts +27 -0
  50. package/dist/cjs/events/tree.js +63 -0
  51. package/dist/cjs/events/types.d.ts +39 -0
  52. package/dist/cjs/events.d.ts +1 -77
  53. package/dist/cjs/events.js +6 -154
  54. package/dist/cjs/identity/encoding.d.ts +9 -0
  55. package/dist/cjs/identity/encoding.js +85 -0
  56. package/dist/cjs/identity/index.d.ts +4 -0
  57. package/dist/cjs/identity/index.js +20 -0
  58. package/dist/cjs/identity/noteKey.d.ts +33 -0
  59. package/dist/cjs/identity/noteKey.js +97 -0
  60. package/dist/cjs/identity/spending.d.ts +18 -0
  61. package/dist/cjs/identity/spending.js +46 -0
  62. package/dist/cjs/identity/viewKey.d.ts +38 -0
  63. package/dist/cjs/identity/viewKey.js +105 -0
  64. package/dist/cjs/idl/index.d.ts +18 -0
  65. package/dist/cjs/idl/index.js +24 -0
  66. package/dist/cjs/idl/privacy_pool.json +9907 -9907
  67. package/dist/cjs/idl/privacy_pool_legacy.js +3307 -0
  68. package/dist/cjs/idl/privacy_pool_legacy.json +2302 -0
  69. package/dist/cjs/idl/privacy_pool_legacy2.d.ts +5 -0
  70. package/dist/cjs/idl/privacy_pool_legacy2.js +3397 -0
  71. package/dist/cjs/idl/privacy_pool_legacy2.json +2376 -0
  72. package/dist/cjs/index.d.ts +9 -3
  73. package/dist/cjs/index.js +15 -2
  74. package/dist/cjs/notes/amount.d.ts +2 -0
  75. package/dist/cjs/notes/amount.js +21 -0
  76. package/dist/cjs/notes/encryption.d.ts +41 -0
  77. package/dist/cjs/notes/encryption.js +75 -0
  78. package/dist/cjs/notes/index.d.ts +8 -0
  79. package/dist/cjs/notes/index.js +24 -0
  80. package/dist/cjs/notes/mailbox.d.ts +70 -0
  81. package/dist/cjs/notes/mailbox.js +164 -0
  82. package/dist/cjs/notes/model.d.ts +91 -0
  83. package/dist/cjs/notes/model.js +109 -0
  84. package/dist/cjs/notes/nullifier.d.ts +27 -0
  85. package/dist/cjs/notes/nullifier.js +45 -0
  86. package/dist/cjs/notes/recovery.d.ts +20 -0
  87. package/dist/cjs/notes/recovery.js +48 -0
  88. package/dist/cjs/notes/selection.d.ts +77 -0
  89. package/dist/cjs/notes/selection.js +193 -0
  90. package/dist/cjs/notes/spent.d.ts +60 -0
  91. package/dist/cjs/notes/spent.js +101 -0
  92. package/dist/cjs/perps/constants.d.ts +16 -0
  93. package/dist/cjs/perps/constants.js +52 -0
  94. package/dist/cjs/perps/index.d.ts +5 -0
  95. package/dist/cjs/perps/index.js +21 -0
  96. package/dist/cjs/perps/keys.d.ts +16 -0
  97. package/dist/cjs/perps/keys.js +43 -0
  98. package/dist/cjs/perps/pdas.d.ts +29 -0
  99. package/dist/cjs/perps/pdas.js +55 -0
  100. package/dist/cjs/perps/relayer.d.ts +9 -0
  101. package/dist/cjs/perps/relayer.js +35 -0
  102. package/dist/cjs/perps/types.d.ts +126 -0
  103. package/dist/cjs/perps/types.js +2 -0
  104. package/dist/cjs/positions/index.d.ts +4 -0
  105. package/dist/cjs/positions/index.js +20 -0
  106. package/dist/cjs/positions/keys.d.ts +29 -0
  107. package/dist/cjs/positions/keys.js +71 -0
  108. package/dist/cjs/positions/pdas.d.ts +15 -0
  109. package/dist/cjs/positions/pdas.js +54 -0
  110. package/dist/cjs/positions/relayer.d.ts +4 -0
  111. package/dist/cjs/positions/relayer.js +15 -0
  112. package/dist/cjs/positions/types.d.ts +97 -0
  113. package/dist/cjs/positions/types.js +2 -0
  114. package/dist/cjs/predictions/client.d.ts +41 -0
  115. package/dist/cjs/predictions/client.js +147 -0
  116. package/dist/cjs/predictions/index.d.ts +5 -0
  117. package/dist/cjs/predictions/index.js +21 -0
  118. package/dist/cjs/predictions/keys.d.ts +14 -0
  119. package/dist/cjs/predictions/keys.js +40 -0
  120. package/dist/cjs/predictions/pdas.d.ts +6 -0
  121. package/dist/cjs/predictions/pdas.js +13 -0
  122. package/dist/cjs/predictions/relayer.d.ts +3 -0
  123. package/dist/cjs/predictions/relayer.js +11 -0
  124. package/dist/cjs/predictions/types.d.ts +178 -0
  125. package/dist/cjs/predictions/types.js +2 -0
  126. package/dist/cjs/program.d.ts +2 -0
  127. package/dist/cjs/program.js +8 -7
  128. package/dist/cjs/proof.d.ts +1 -183
  129. package/dist/cjs/proof.js +16 -290
  130. package/dist/cjs/proofs/encoding.d.ts +17 -0
  131. package/dist/cjs/proofs/encoding.js +72 -0
  132. package/dist/cjs/proofs/formatting.d.ts +6 -0
  133. package/dist/cjs/proofs/formatting.js +34 -0
  134. package/dist/cjs/proofs/index.d.ts +5 -0
  135. package/dist/cjs/proofs/index.js +21 -0
  136. package/dist/cjs/proofs/swap.d.ts +87 -0
  137. package/dist/cjs/proofs/swap.js +144 -0
  138. package/dist/cjs/proofs/transaction.d.ts +28 -0
  139. package/dist/cjs/proofs/transaction.js +110 -0
  140. package/dist/cjs/proofs/types.d.ts +70 -0
  141. package/dist/cjs/proofs/types.js +2 -0
  142. package/dist/cjs/prover.d.ts +30 -4
  143. package/dist/cjs/prover.js +118 -49
  144. package/dist/cjs/relayer/api.d.ts +31 -0
  145. package/dist/cjs/relayer/api.js +86 -0
  146. package/dist/cjs/relayer/client.d.ts +73 -0
  147. package/dist/cjs/relayer/client.js +206 -0
  148. package/dist/cjs/relayer/crypto.d.ts +5 -0
  149. package/dist/cjs/relayer/crypto.js +26 -0
  150. package/dist/cjs/relayer/encoding.d.ts +2 -0
  151. package/dist/cjs/relayer/encoding.js +23 -0
  152. package/dist/cjs/relayer/errors.d.ts +7 -0
  153. package/dist/cjs/relayer/errors.js +17 -0
  154. package/dist/cjs/relayer/index.d.ts +6 -0
  155. package/dist/cjs/relayer/index.js +19 -0
  156. package/dist/cjs/relayer/internal-config.d.ts +36 -0
  157. package/dist/cjs/relayer/internal-config.js +9 -0
  158. package/dist/cjs/relayer/internal.d.ts +6 -0
  159. package/dist/cjs/relayer/internal.js +14 -0
  160. package/dist/cjs/relayer/transport.d.ts +19 -0
  161. package/dist/cjs/relayer/transport.js +68 -0
  162. package/dist/{src/relayer.d.ts → cjs/relayer/types.d.ts} +53 -96
  163. package/dist/cjs/relayer/types.js +5 -0
  164. package/dist/cjs/relayer.d.ts +1 -318
  165. package/dist/cjs/relayer.js +15 -254
  166. package/dist/cjs/shield/alt.js +8 -8
  167. package/dist/cjs/shield/errors.js +2 -2
  168. package/dist/cjs/shield/finalize.js +2 -2
  169. package/dist/cjs/shield/ix.d.ts +1 -1
  170. package/dist/cjs/shield/owner.js +9 -11
  171. package/dist/cjs/shield/ports.js +3 -3
  172. package/dist/cjs/shield/preflight.js +3 -3
  173. package/dist/cjs/shield/shield.js +20 -19
  174. package/dist/cjs/shield/types.d.ts +1 -1
  175. package/dist/cjs/transactions/deposit.d.ts +94 -0
  176. package/dist/cjs/transactions/deposit.js +234 -0
  177. package/dist/cjs/transactions/index.d.ts +7 -0
  178. package/dist/cjs/transactions/index.js +26 -0
  179. package/dist/cjs/transactions/swap.d.ts +71 -0
  180. package/dist/cjs/transactions/swap.js +184 -0
  181. package/dist/cjs/transactions/transact.d.ts +34 -0
  182. package/dist/cjs/transactions/transact.js +146 -0
  183. package/dist/cjs/transactions/transfer.d.ts +51 -0
  184. package/dist/cjs/transactions/transfer.js +106 -0
  185. package/dist/cjs/transactions/withdraw.d.ts +52 -0
  186. package/dist/cjs/transactions/withdraw.js +104 -0
  187. package/dist/cjs/utxo.d.ts +1 -235
  188. package/dist/cjs/utxo.js +15 -404
  189. package/dist/esm/accounts/admin.d.ts +84 -0
  190. package/dist/esm/accounts/admin.js +165 -0
  191. package/dist/esm/accounts/errors.d.ts +6 -0
  192. package/dist/esm/accounts/errors.js +95 -0
  193. package/dist/esm/accounts/index.d.ts +4 -0
  194. package/dist/esm/accounts/index.js +4 -0
  195. package/dist/esm/accounts/pdas.d.ts +23 -0
  196. package/dist/esm/accounts/pdas.js +38 -0
  197. package/dist/esm/accounts/queries.d.ts +41 -0
  198. package/dist/esm/accounts/queries.js +88 -0
  199. package/dist/esm/client.d.ts +2 -407
  200. package/dist/esm/client.js +3 -891
  201. package/dist/esm/cloak/client.d.ts +28 -0
  202. package/dist/esm/cloak/client.js +64 -0
  203. package/dist/esm/cloak/errors.d.ts +13 -0
  204. package/dist/esm/cloak/errors.js +21 -0
  205. package/dist/esm/cloak/helpers.d.ts +6 -0
  206. package/dist/esm/cloak/helpers.js +31 -0
  207. package/dist/esm/cloak/index.d.ts +6 -0
  208. package/dist/esm/cloak/index.js +6 -0
  209. package/dist/esm/cloak/polling.d.ts +7 -0
  210. package/dist/esm/cloak/polling.js +63 -0
  211. package/dist/esm/cloak/transport.d.ts +15 -0
  212. package/dist/esm/cloak/transport.js +115 -0
  213. package/dist/esm/cloak/types.d.ts +188 -0
  214. package/dist/esm/cloak/types.js +4 -0
  215. package/dist/esm/cloak.d.ts +1 -0
  216. package/dist/esm/cloak.js +2 -0
  217. package/dist/esm/compactNote.d.ts +21 -0
  218. package/dist/esm/compactNote.js +24 -1
  219. package/dist/esm/events/index.d.ts +6 -0
  220. package/dist/esm/events/index.js +6 -0
  221. package/dist/esm/events/parsing.d.ts +25 -0
  222. package/dist/esm/events/parsing.js +120 -0
  223. package/dist/esm/events/position.d.ts +26 -0
  224. package/dist/esm/events/position.js +48 -0
  225. package/dist/esm/events/recovery.d.ts +87 -0
  226. package/dist/esm/events/recovery.js +237 -0
  227. package/dist/esm/events/scanning.d.ts +35 -0
  228. package/dist/esm/events/scanning.js +92 -0
  229. package/dist/esm/events/tree.d.ts +27 -0
  230. package/dist/esm/events/tree.js +58 -0
  231. package/dist/esm/events/types.d.ts +39 -0
  232. package/dist/esm/events/types.js +1 -0
  233. package/dist/esm/events.d.ts +1 -77
  234. package/dist/esm/events.js +3 -129
  235. package/dist/esm/identity/encoding.d.ts +9 -0
  236. package/dist/esm/identity/encoding.js +75 -0
  237. package/dist/esm/identity/index.d.ts +4 -0
  238. package/dist/esm/identity/index.js +4 -0
  239. package/dist/esm/identity/noteKey.d.ts +33 -0
  240. package/dist/esm/identity/noteKey.js +91 -0
  241. package/dist/esm/identity/spending.d.ts +18 -0
  242. package/dist/esm/identity/spending.js +35 -0
  243. package/dist/esm/identity/viewKey.d.ts +38 -0
  244. package/dist/esm/identity/viewKey.js +96 -0
  245. package/dist/esm/idl/index.d.ts +18 -0
  246. package/dist/esm/idl/index.js +18 -0
  247. package/dist/esm/idl/privacy_pool.json +9907 -9907
  248. package/dist/esm/idl/privacy_pool_legacy.d.ts +5 -0
  249. package/dist/esm/idl/privacy_pool_legacy.js +3305 -0
  250. package/dist/esm/idl/privacy_pool_legacy.json +2302 -0
  251. package/dist/esm/idl/privacy_pool_legacy2.d.ts +5 -0
  252. package/dist/esm/idl/privacy_pool_legacy2.js +3395 -0
  253. package/dist/esm/idl/privacy_pool_legacy2.json +2376 -0
  254. package/dist/esm/index.d.ts +9 -3
  255. package/dist/esm/index.js +10 -3
  256. package/dist/esm/notes/amount.d.ts +2 -0
  257. package/dist/esm/notes/amount.js +18 -0
  258. package/dist/esm/notes/encryption.d.ts +41 -0
  259. package/dist/esm/notes/encryption.js +67 -0
  260. package/dist/esm/notes/index.d.ts +8 -0
  261. package/dist/esm/notes/index.js +8 -0
  262. package/dist/esm/notes/mailbox.d.ts +70 -0
  263. package/dist/esm/notes/mailbox.js +154 -0
  264. package/dist/esm/notes/model.d.ts +91 -0
  265. package/dist/esm/notes/model.js +99 -0
  266. package/dist/esm/notes/nullifier.d.ts +27 -0
  267. package/dist/esm/notes/nullifier.js +40 -0
  268. package/dist/esm/notes/recovery.d.ts +20 -0
  269. package/dist/esm/notes/recovery.js +45 -0
  270. package/dist/esm/notes/selection.d.ts +77 -0
  271. package/dist/esm/notes/selection.js +188 -0
  272. package/dist/esm/notes/spent.d.ts +60 -0
  273. package/dist/esm/notes/spent.js +96 -0
  274. package/dist/esm/perps/constants.d.ts +16 -0
  275. package/dist/esm/perps/constants.js +48 -0
  276. package/dist/esm/perps/index.d.ts +5 -0
  277. package/dist/esm/perps/index.js +5 -0
  278. package/dist/esm/perps/keys.d.ts +16 -0
  279. package/dist/esm/perps/keys.js +35 -0
  280. package/dist/esm/perps/pdas.d.ts +29 -0
  281. package/dist/esm/perps/pdas.js +47 -0
  282. package/dist/esm/perps/relayer.d.ts +9 -0
  283. package/dist/esm/perps/relayer.js +25 -0
  284. package/dist/esm/perps/types.d.ts +126 -0
  285. package/dist/esm/perps/types.js +1 -0
  286. package/dist/esm/positions/index.d.ts +4 -0
  287. package/dist/esm/positions/index.js +4 -0
  288. package/dist/esm/positions/keys.d.ts +29 -0
  289. package/dist/esm/positions/keys.js +65 -0
  290. package/dist/esm/positions/pdas.d.ts +15 -0
  291. package/dist/esm/positions/pdas.js +44 -0
  292. package/dist/esm/positions/relayer.d.ts +4 -0
  293. package/dist/esm/positions/relayer.js +10 -0
  294. package/dist/esm/positions/types.d.ts +97 -0
  295. package/dist/esm/positions/types.js +1 -0
  296. package/dist/esm/predictions/client.d.ts +41 -0
  297. package/dist/esm/predictions/client.js +141 -0
  298. package/dist/esm/predictions/index.d.ts +5 -0
  299. package/dist/esm/predictions/index.js +5 -0
  300. package/dist/esm/predictions/keys.d.ts +14 -0
  301. package/dist/esm/predictions/keys.js +33 -0
  302. package/dist/esm/predictions/pdas.d.ts +6 -0
  303. package/dist/esm/predictions/pdas.js +10 -0
  304. package/dist/esm/predictions/relayer.d.ts +3 -0
  305. package/dist/esm/predictions/relayer.js +7 -0
  306. package/dist/esm/predictions/types.d.ts +178 -0
  307. package/dist/esm/predictions/types.js +1 -0
  308. package/dist/esm/program.d.ts +2 -0
  309. package/dist/esm/program.js +4 -3
  310. package/dist/esm/proof.d.ts +1 -183
  311. package/dist/esm/proof.js +2 -281
  312. package/dist/esm/proofs/encoding.d.ts +17 -0
  313. package/dist/esm/proofs/encoding.js +68 -0
  314. package/dist/esm/proofs/formatting.d.ts +6 -0
  315. package/dist/esm/proofs/formatting.js +31 -0
  316. package/dist/esm/proofs/index.d.ts +5 -0
  317. package/dist/esm/proofs/index.js +5 -0
  318. package/dist/esm/proofs/swap.d.ts +87 -0
  319. package/dist/esm/proofs/swap.js +138 -0
  320. package/dist/esm/proofs/transaction.d.ts +28 -0
  321. package/dist/esm/proofs/transaction.js +105 -0
  322. package/dist/esm/proofs/types.d.ts +70 -0
  323. package/dist/esm/proofs/types.js +1 -0
  324. package/dist/esm/prover.d.ts +30 -4
  325. package/dist/esm/prover.js +115 -15
  326. package/dist/esm/relayer/api.d.ts +31 -0
  327. package/dist/esm/relayer/api.js +55 -0
  328. package/dist/esm/relayer/client.d.ts +73 -0
  329. package/dist/esm/relayer/client.js +199 -0
  330. package/dist/esm/relayer/crypto.d.ts +5 -0
  331. package/dist/esm/relayer/crypto.js +20 -0
  332. package/dist/esm/relayer/encoding.d.ts +2 -0
  333. package/dist/esm/relayer/encoding.js +19 -0
  334. package/dist/esm/relayer/errors.d.ts +7 -0
  335. package/dist/esm/relayer/errors.js +13 -0
  336. package/dist/esm/relayer/index.d.ts +6 -0
  337. package/dist/esm/relayer/index.js +3 -0
  338. package/dist/esm/relayer/internal-config.d.ts +36 -0
  339. package/dist/esm/relayer/internal-config.js +6 -0
  340. package/dist/esm/relayer/internal.d.ts +6 -0
  341. package/dist/esm/relayer/internal.js +10 -0
  342. package/dist/esm/relayer/transport.d.ts +19 -0
  343. package/dist/esm/relayer/transport.js +64 -0
  344. package/dist/esm/relayer/types.d.ts +275 -0
  345. package/dist/esm/relayer/types.js +4 -0
  346. package/dist/esm/relayer.d.ts +1 -318
  347. package/dist/esm/relayer.js +2 -249
  348. package/dist/esm/shield/alt.js +1 -1
  349. package/dist/esm/shield/errors.js +1 -1
  350. package/dist/esm/shield/finalize.js +1 -1
  351. package/dist/esm/shield/ix.d.ts +1 -1
  352. package/dist/esm/shield/owner.js +3 -5
  353. package/dist/esm/shield/ports.js +1 -1
  354. package/dist/esm/shield/preflight.js +1 -1
  355. package/dist/esm/shield/shield.js +4 -3
  356. package/dist/esm/shield/types.d.ts +1 -1
  357. package/dist/esm/transactions/deposit.d.ts +94 -0
  358. package/dist/esm/transactions/deposit.js +198 -0
  359. package/dist/esm/transactions/index.d.ts +7 -0
  360. package/dist/esm/transactions/index.js +7 -0
  361. package/dist/esm/transactions/swap.d.ts +71 -0
  362. package/dist/esm/transactions/swap.js +144 -0
  363. package/dist/esm/transactions/transact.d.ts +34 -0
  364. package/dist/esm/transactions/transact.js +110 -0
  365. package/dist/esm/transactions/transfer.d.ts +51 -0
  366. package/dist/esm/transactions/transfer.js +103 -0
  367. package/dist/esm/transactions/withdraw.d.ts +52 -0
  368. package/dist/esm/transactions/withdraw.js +101 -0
  369. package/dist/esm/utxo.d.ts +1 -235
  370. package/dist/esm/utxo.js +2 -382
  371. package/identity.d.ts +2 -0
  372. package/identity.js +3 -0
  373. package/idl.d.ts +2 -0
  374. package/idl.js +3 -0
  375. package/notes.d.ts +2 -0
  376. package/notes.js +3 -0
  377. package/package.json +131 -11
  378. package/perps.d.ts +2 -0
  379. package/perps.js +3 -0
  380. package/poseidon.d.ts +2 -2
  381. package/poseidon.js +2 -3
  382. package/positions.d.ts +2 -0
  383. package/positions.js +3 -0
  384. package/predictions.d.ts +2 -0
  385. package/predictions.js +3 -0
  386. package/proof.d.ts +2 -2
  387. package/proof.js +2 -3
  388. package/prover.d.ts +2 -2
  389. package/prover.js +2 -3
  390. package/relayer.d.ts +2 -0
  391. package/relayer.js +3 -0
  392. package/shield.d.ts +2 -2
  393. package/shield.js +2 -3
  394. package/transactions.d.ts +2 -0
  395. package/transactions.js +3 -0
  396. package/SHIELD_INTEGRATION.md +0 -143
  397. package/dist/src/client.d.ts +0 -407
  398. package/dist/src/client.js +0 -951
  399. package/dist/src/compactNote.d.ts +0 -107
  400. package/dist/src/compactNote.js +0 -167
  401. package/dist/src/config.d.ts +0 -82
  402. package/dist/src/config.js +0 -57
  403. package/dist/src/events.d.ts +0 -77
  404. package/dist/src/events.js +0 -167
  405. package/dist/src/idl/privacy_pool.js +0 -15218
  406. package/dist/src/index.d.ts +0 -16
  407. package/dist/src/index.js +0 -67
  408. package/dist/src/merkle.d.ts +0 -77
  409. package/dist/src/merkle.js +0 -156
  410. package/dist/src/poseidon.d.ts +0 -29
  411. package/dist/src/poseidon.js +0 -100
  412. package/dist/src/program.d.ts +0 -37
  413. package/dist/src/program.js +0 -61
  414. package/dist/src/proof.d.ts +0 -183
  415. package/dist/src/proof.js +0 -292
  416. package/dist/src/prover.d.ts +0 -54
  417. package/dist/src/prover.js +0 -112
  418. package/dist/src/random.d.ts +0 -16
  419. package/dist/src/random.js +0 -28
  420. package/dist/src/relayer.js +0 -257
  421. package/dist/src/retry.d.ts +0 -32
  422. package/dist/src/retry.js +0 -75
  423. package/dist/src/shield/alt.d.ts +0 -87
  424. package/dist/src/shield/alt.js +0 -194
  425. package/dist/src/shield/computeBudget.d.ts +0 -61
  426. package/dist/src/shield/computeBudget.js +0 -64
  427. package/dist/src/shield/errors.d.ts +0 -58
  428. package/dist/src/shield/errors.js +0 -121
  429. package/dist/src/shield/finalize.d.ts +0 -45
  430. package/dist/src/shield/finalize.js +0 -119
  431. package/dist/src/shield/index.d.ts +0 -35
  432. package/dist/src/shield/index.js +0 -68
  433. package/dist/src/shield/ix.d.ts +0 -54
  434. package/dist/src/shield/ix.js +0 -119
  435. package/dist/src/shield/owner.d.ts +0 -36
  436. package/dist/src/shield/owner.js +0 -126
  437. package/dist/src/shield/ports.d.ts +0 -43
  438. package/dist/src/shield/ports.js +0 -153
  439. package/dist/src/shield/preflight.d.ts +0 -30
  440. package/dist/src/shield/preflight.js +0 -154
  441. package/dist/src/shield/shield.d.ts +0 -68
  442. package/dist/src/shield/shield.js +0 -499
  443. package/dist/src/shield/types.d.ts +0 -202
  444. package/dist/src/utxo.d.ts +0 -235
  445. package/dist/src/utxo.js +0 -407
  446. package/dist/tests/compact-note.test.d.ts +0 -1
  447. package/dist/tests/compact-note.test.js +0 -173
  448. package/dist/tests/config.test.d.ts +0 -1
  449. package/dist/tests/config.test.js +0 -102
  450. package/dist/tests/edge-cases.test.d.ts +0 -1
  451. package/dist/tests/edge-cases.test.js +0 -220
  452. package/dist/tests/encryption.test.d.ts +0 -1
  453. package/dist/tests/encryption.test.js +0 -215
  454. package/dist/tests/events.test.d.ts +0 -1
  455. package/dist/tests/events.test.js +0 -78
  456. package/dist/tests/multi-tree.test.d.ts +0 -1
  457. package/dist/tests/multi-tree.test.js +0 -405
  458. package/dist/tests/pda.test.d.ts +0 -1
  459. package/dist/tests/pda.test.js +0 -229
  460. package/dist/tests/poseidon-builder-parity.test.d.ts +0 -1
  461. package/dist/tests/poseidon-builder-parity.test.js +0 -72
  462. package/dist/tests/poseidon.test.d.ts +0 -1
  463. package/dist/tests/poseidon.test.js +0 -142
  464. package/dist/tests/proof.test.d.ts +0 -1
  465. package/dist/tests/proof.test.js +0 -296
  466. package/dist/tests/relayer.test.d.ts +0 -1
  467. package/dist/tests/relayer.test.js +0 -271
  468. package/dist/tests/sdk.integration.test.d.ts +0 -1
  469. package/dist/tests/sdk.integration.test.js +0 -330
  470. package/dist/tests/shield-owner.test.d.ts +0 -1
  471. package/dist/tests/shield-owner.test.js +0 -89
  472. package/dist/tests/shield-preflight.test.d.ts +0 -1
  473. package/dist/tests/shield-preflight.test.js +0 -87
  474. package/dist/tests/shield-realproof.test.d.ts +0 -1
  475. package/dist/tests/shield-realproof.test.js +0 -272
  476. package/dist/tests/shield.test.d.ts +0 -1
  477. package/dist/tests/shield.test.js +0 -403
  478. package/dist/tests/utxo.test.d.ts +0 -1
  479. package/dist/tests/utxo.test.js +0 -140
  480. /package/dist/{src/shield → cjs/events}/types.js +0 -0
  481. /package/dist/{src/idl/privacy_pool.d.ts → cjs/idl/privacy_pool_legacy.d.ts} +0 -0
@@ -0,0 +1,6 @@
1
+ export * from "./types.js";
2
+ export * from "./parsing.js";
3
+ export * from "./position.js";
4
+ export * from "./recovery.js";
5
+ export * from "./scanning.js";
6
+ export * from "./tree.js";
@@ -0,0 +1,25 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { type VersionedPrivacyPoolIdl } from "../idl/index.js";
3
+ import type { CommitmentEvent, NullifierSpentEvent, ParsedVeiloEvent } from "./types.js";
4
+ /**
5
+ * Decode logs using the current, legacy, and legacy-2 IDLs.
6
+ *
7
+ * IDLs are evaluated in the relayer's current/legacy/legacy-2 order. Anchor's
8
+ * Borsh decoder accepts trailing bytes, however, so every successful parse is
9
+ * considered and the richest result wins. That preserves the compact fields
10
+ * in legacy-2 events instead of misclassifying them as the shorter legacy form.
11
+ * Ties retain the relayer's order.
12
+ */
13
+ export declare function parseVeiloEventsWithFallback(logMessages: readonly string[] | null | undefined, programId: PublicKey, idls?: readonly VersionedPrivacyPoolIdl[]): ParsedVeiloEvent[];
14
+ export declare function parseCommitmentEventsFromLogs(params: {
15
+ logMessages: readonly string[] | null | undefined;
16
+ programId: PublicKey;
17
+ txSignature: string;
18
+ slot: number;
19
+ }): CommitmentEvent[];
20
+ export declare function parseNullifierEventsFromLogs(params: {
21
+ logMessages: readonly string[] | null | undefined;
22
+ programId: PublicKey;
23
+ txSignature: string;
24
+ slot: number;
25
+ }): NullifierSpentEvent[];
@@ -0,0 +1,120 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import { PRIVACY_POOL_IDLS, } from "../idl/index.js";
4
+ /**
5
+ * Decode logs using the current, legacy, and legacy-2 IDLs.
6
+ *
7
+ * IDLs are evaluated in the relayer's current/legacy/legacy-2 order. Anchor's
8
+ * Borsh decoder accepts trailing bytes, however, so every successful parse is
9
+ * considered and the richest result wins. That preserves the compact fields
10
+ * in legacy-2 events instead of misclassifying them as the shorter legacy form.
11
+ * Ties retain the relayer's order.
12
+ */
13
+ export function parseVeiloEventsWithFallback(logMessages, programId, idls = PRIVACY_POOL_IDLS) {
14
+ if (!logMessages?.length)
15
+ return [];
16
+ let best = [];
17
+ let bestScore = -1;
18
+ for (const candidate of idls) {
19
+ try {
20
+ const parser = new anchor.EventParser(programId, new anchor.BorshCoder(candidate.idl));
21
+ const parsed = Array.from(parser.parseLogs([...logMessages])).map((event) => ({
22
+ name: event.name,
23
+ data: event.data,
24
+ idlVersion: candidate.version,
25
+ }));
26
+ const score = parsed.reduce((total, event) => total + decodedFieldCount(event.data), 0);
27
+ if (score > bestScore) {
28
+ best = parsed;
29
+ bestScore = score;
30
+ }
31
+ }
32
+ catch {
33
+ // The discriminator is shared while historical payload lengths differ.
34
+ }
35
+ }
36
+ return best;
37
+ }
38
+ export function parseCommitmentEventsFromLogs(params) {
39
+ const { logMessages, programId, txSignature, slot } = params;
40
+ const out = [];
41
+ for (const event of parseVeiloEventsWithFallback(logMessages, programId)) {
42
+ if (event.name.toLowerCase() !== "commitmentevent")
43
+ continue;
44
+ const data = event.data;
45
+ const mintAddress = toPublicKey(field(data, "mintAddress", "mint_address"));
46
+ const ephemeralPublicKey = optionalBytes(field(data, "ephemeralPublicKey", "ephemeral_public_key"));
47
+ const encryptedBlob = optionalBytes(field(data, "encryptedBlob", "encrypted_blob"));
48
+ const rawViewTag = field(data, "viewTag", "view_tag");
49
+ out.push({
50
+ commitment: toBytes(field(data, "commitment"), 32, "commitment"),
51
+ leafIndex: toSafeNumber(field(data, "leafIndex", "leaf_index"), "leafIndex"),
52
+ newRoot: toBytes(field(data, "newRoot", "new_root"), 32, "newRoot"),
53
+ timestamp: toSafeNumber(field(data, "timestamp"), "timestamp"),
54
+ mintAddress,
55
+ treeId: toSafeNumber(field(data, "treeId", "tree_id"), "treeId"),
56
+ txSignature,
57
+ slot,
58
+ ...(ephemeralPublicKey ? { ephemeralPublicKey } : {}),
59
+ ...(encryptedBlob ? { encryptedBlob } : {}),
60
+ ...(rawViewTag !== undefined
61
+ ? { viewTag: toSafeNumber(rawViewTag, "viewTag") }
62
+ : {}),
63
+ source: "emitted",
64
+ idlVersion: event.idlVersion,
65
+ });
66
+ }
67
+ return out;
68
+ }
69
+ export function parseNullifierEventsFromLogs(params) {
70
+ const { logMessages, programId, txSignature, slot } = params;
71
+ const out = [];
72
+ for (const event of parseVeiloEventsWithFallback(logMessages, programId)) {
73
+ if (event.name.toLowerCase() !== "nullifierspent")
74
+ continue;
75
+ const data = event.data;
76
+ out.push({
77
+ nullifier: toBytes(field(data, "nullifier"), 32, "nullifier"),
78
+ timestamp: toSafeNumber(field(data, "timestamp"), "timestamp"),
79
+ mintAddress: toPublicKey(field(data, "mintAddress", "mint_address")),
80
+ treeId: toSafeNumber(field(data, "treeId", "tree_id"), "treeId"),
81
+ txSignature,
82
+ slot,
83
+ idlVersion: event.idlVersion,
84
+ });
85
+ }
86
+ return out;
87
+ }
88
+ function field(data, camel, snake) {
89
+ return data[camel] ?? (snake ? data[snake] : undefined);
90
+ }
91
+ function optionalBytes(value) {
92
+ return value === undefined || value === null
93
+ ? undefined
94
+ : new Uint8Array(value);
95
+ }
96
+ function decodedFieldCount(value) {
97
+ return value && typeof value === "object" ? Object.keys(value).length : 0;
98
+ }
99
+ function toBytes(value, length, label) {
100
+ const bytes = new Uint8Array(value);
101
+ if (bytes.length !== length) {
102
+ throw new Error(`${label} must be ${length} bytes, got ${bytes.length}`);
103
+ }
104
+ return bytes;
105
+ }
106
+ function toPublicKey(value) {
107
+ if (value instanceof PublicKey)
108
+ return value;
109
+ return new PublicKey(value);
110
+ }
111
+ function toSafeNumber(value, label) {
112
+ if (value === undefined || value === null) {
113
+ throw new Error(`Missing ${label} in decoded event`);
114
+ }
115
+ const numeric = typeof value === "number" ? value : Number(value);
116
+ if (!Number.isSafeInteger(numeric)) {
117
+ throw new Error(`${label} is outside JavaScript's safe integer range`);
118
+ }
119
+ return numeric;
120
+ }
@@ -0,0 +1,26 @@
1
+ import type { Idl, Program } from "@coral-xyz/anchor";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import type { CommitmentEvent } from "./types.js";
4
+ /**
5
+ * Privacy-pool mints copied from the relayer's global position-tree classifier.
6
+ * Position commitments use non-pool destination mints at the same tree ID.
7
+ */
8
+ export declare const POSITION_TREE_POOL_MINTS: readonly PublicKey[];
9
+ export declare function isGlobalPositionCommitment(event: CommitmentEvent): boolean;
10
+ /**
11
+ * Rebuild the one global position tree shared across every position mint.
12
+ * This mirrors the relayer: scan all mints for the position tree ID, then drop
13
+ * normal privacy-pool mint events before sorting by the global leaf index.
14
+ */
15
+ export declare function buildGlobalPositionTreeFromEvents<T extends Idl>(params: {
16
+ program: Program<T>;
17
+ positionTreeId?: number;
18
+ depth?: number;
19
+ additionalEvents?: readonly CommitmentEvent[];
20
+ includeProtectedEvents?: boolean;
21
+ strictLeafIndices?: boolean;
22
+ }): Promise<{
23
+ tree: import("../merkle.js").MerkleTree;
24
+ events: CommitmentEvent[];
25
+ latestSignature: string;
26
+ }>;
@@ -0,0 +1,48 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { getAllProtectedCommitmentEvents } from "./recovery.js";
3
+ import { scanAllCommitmentEvents } from "./scanning.js";
4
+ import { dedupeCommitmentEvents, reconstructTreeFromCommitmentEvents, } from "./tree.js";
5
+ /**
6
+ * Privacy-pool mints copied from the relayer's global position-tree classifier.
7
+ * Position commitments use non-pool destination mints at the same tree ID.
8
+ */
9
+ export const POSITION_TREE_POOL_MINTS = [
10
+ PublicKey.default,
11
+ new PublicKey("So11111111111111111111111111111111111111112"),
12
+ new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),
13
+ new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"),
14
+ new PublicKey("USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB"),
15
+ new PublicKey("JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"),
16
+ new PublicKey("ARXwZkNAtzPfdcoqQiduJn8EPv9fKiDfGn2KyggyDrFs"),
17
+ ];
18
+ const POOL_MINTS = new Set(POSITION_TREE_POOL_MINTS.map((mint) => mint.toBase58()));
19
+ export function isGlobalPositionCommitment(event) {
20
+ return !POOL_MINTS.has(event.mintAddress.toBase58());
21
+ }
22
+ /**
23
+ * Rebuild the one global position tree shared across every position mint.
24
+ * This mirrors the relayer: scan all mints for the position tree ID, then drop
25
+ * normal privacy-pool mint events before sorting by the global leaf index.
26
+ */
27
+ export async function buildGlobalPositionTreeFromEvents(params) {
28
+ const { program, positionTreeId = 0, depth = 22, additionalEvents = [], includeProtectedEvents = true, strictLeafIndices = true, } = params;
29
+ const emitted = await scanAllCommitmentEvents({ program });
30
+ const protectedEvents = includeProtectedEvents
31
+ ? getAllProtectedCommitmentEvents()
32
+ : [];
33
+ const events = dedupeCommitmentEvents([
34
+ ...emitted,
35
+ ...additionalEvents,
36
+ ...protectedEvents,
37
+ ])
38
+ .filter((event) => event.treeId === positionTreeId && isGlobalPositionCommitment(event))
39
+ .sort((a, b) => a.leafIndex - b.leafIndex);
40
+ return {
41
+ tree: reconstructTreeFromCommitmentEvents(events, {
42
+ depth,
43
+ strictLeafIndices,
44
+ }),
45
+ events,
46
+ latestSignature: events[events.length - 1]?.txSignature,
47
+ };
48
+ }
@@ -0,0 +1,87 @@
1
+ import type { Connection } from "@solana/web3.js";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import { MerkleTree } from "../merkle.js";
4
+ import type { CommitmentEvent } from "./types.js";
5
+ /**
6
+ * Historical leaves repaired manually in the relayer.
7
+ *
8
+ * The deployed `open_position` instruction appended these commitments without
9
+ * emitting CommitmentEvent. They must be retained when rebuilding history.
10
+ * Values are copied byte-for-byte from relayer-server/src/db/service.ts.
11
+ */
12
+ export declare const PROTECTED_COMMITMENT_EVENTS: readonly [{
13
+ readonly leafIndex: 3738;
14
+ readonly commitmentHex: "0c7850c9360e041ceeba27297e0fd49fa6a224a651c2fff8c56b22c70a319a94";
15
+ }, {
16
+ readonly leafIndex: 4;
17
+ readonly commitmentHex: "15e182d12e044ef2a469ccda88d903304a4e3e69f72765a29e4e6df9c206b0bf";
18
+ readonly mintAddressHex: "e272b88fb18eaf1994acb885bdba76820c567c3467300f0cd320a0c15ebf9d2f";
19
+ readonly onChainTreeId: 0;
20
+ }];
21
+ /** @deprecated Use PROTECTED_COMMITMENT_EVENTS. */
22
+ export declare const PROTECTED_COMMITMENT_EVENT: {
23
+ readonly leafIndex: 3738;
24
+ readonly commitmentHex: "0c7850c9360e041ceeba27297e0fd49fa6a224a651c2fff8c56b22c70a319a94";
25
+ };
26
+ /** Return protected records as normal SDK events for a particular tree. */
27
+ export declare function getProtectedCommitmentEvents(params: {
28
+ mintAddress: PublicKey;
29
+ treeId?: number;
30
+ }): CommitmentEvent[];
31
+ /** Return every protected leaf, including the global position-tree repair. */
32
+ export declare function getAllProtectedCommitmentEvents(): CommitmentEvent[];
33
+ /**
34
+ * Add the protected historical leaves without duplicating records already read
35
+ * from an indexer. A conflicting commitment at a protected index is rejected.
36
+ */
37
+ export declare function mergeProtectedCommitmentEvents(events: readonly CommitmentEvent[], params: {
38
+ mintAddress: PublicKey;
39
+ treeId?: number;
40
+ }): CommitmentEvent[];
41
+ /**
42
+ * Insert expected commitments and prefer authoritative emitted metadata when it
43
+ * exists. Missing events are computed from the local tree exactly like the
44
+ * relayer's `insertAndPersistCommitments` fallback.
45
+ *
46
+ * This function mutates `tree`.
47
+ */
48
+ export declare function resolveCommitmentEvents(params: {
49
+ commitments: readonly Uint8Array[];
50
+ tree: MerkleTree;
51
+ logMessages?: readonly string[] | null;
52
+ programId: PublicKey;
53
+ mintAddress: PublicKey;
54
+ treeId: number;
55
+ txSignature: string;
56
+ slot: number;
57
+ timestamp?: number;
58
+ requireAllInLogs?: boolean;
59
+ }): CommitmentEvent[];
60
+ export type EventlessOpenPositionCommitments = {
61
+ sourceMint: PublicKey;
62
+ sourceTreeId: number;
63
+ sourceCommitment: Uint8Array;
64
+ positionMint: PublicKey;
65
+ positionTreeId: number;
66
+ positionCommitment: Uint8Array;
67
+ positionPdaKey: Uint8Array;
68
+ };
69
+ /** Decode the two commitments hidden in a current `open_position` instruction. */
70
+ export declare function decodeEventlessOpenPositionCommitments(instructionData: Uint8Array): EventlessOpenPositionCommitments | null;
71
+ export declare function getPositionPda(programId: PublicKey, positionPdaKey: Uint8Array): PublicKey;
72
+ /** Read PositionPDA.leaf_index at the same byte offset used by the relayer. */
73
+ export declare function readPositionLeafIndex(accountData: Uint8Array): number;
74
+ /**
75
+ * Recover the two events omitted by the deployed `open_position` instruction.
76
+ * The source tree must already contain every earlier source-mint commitment.
77
+ * This function inserts the source commitment into that tree.
78
+ */
79
+ export declare function recoverEventlessOpenPositionEvents(params: {
80
+ instructionData: Uint8Array;
81
+ sourceTree: MerkleTree;
82
+ connection: Pick<Connection, "getAccountInfo">;
83
+ programId: PublicKey;
84
+ txSignature: string;
85
+ slot: number;
86
+ timestamp?: number;
87
+ }): Promise<CommitmentEvent[]>;
@@ -0,0 +1,237 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import { PRIVACY_POOL_CURRENT_IDL } from "../idl/index.js";
4
+ import { parseCommitmentEventsFromLogs } from "./parsing.js";
5
+ /**
6
+ * Historical leaves repaired manually in the relayer.
7
+ *
8
+ * The deployed `open_position` instruction appended these commitments without
9
+ * emitting CommitmentEvent. They must be retained when rebuilding history.
10
+ * Values are copied byte-for-byte from relayer-server/src/db/service.ts.
11
+ */
12
+ export const PROTECTED_COMMITMENT_EVENTS = [
13
+ {
14
+ leafIndex: 3738,
15
+ commitmentHex: "0c7850c9360e041ceeba27297e0fd49fa6a224a651c2fff8c56b22c70a319a94",
16
+ },
17
+ {
18
+ leafIndex: 4,
19
+ commitmentHex: "15e182d12e044ef2a469ccda88d903304a4e3e69f72765a29e4e6df9c206b0bf",
20
+ mintAddressHex: "e272b88fb18eaf1994acb885bdba76820c567c3467300f0cd320a0c15ebf9d2f",
21
+ onChainTreeId: 0,
22
+ },
23
+ ];
24
+ /** @deprecated Use PROTECTED_COMMITMENT_EVENTS. */
25
+ export const PROTECTED_COMMITMENT_EVENT = PROTECTED_COMMITMENT_EVENTS[0];
26
+ /** Return protected records as normal SDK events for a particular tree. */
27
+ export function getProtectedCommitmentEvents(params) {
28
+ const { mintAddress, treeId = 0 } = params;
29
+ const mintHex = bytesToHex(mintAddress.toBytes());
30
+ return getAllProtectedCommitmentEvents().filter((event) => bytesToHex(event.mintAddress.toBytes()) === mintHex &&
31
+ event.treeId === treeId);
32
+ }
33
+ /** Return every protected leaf, including the global position-tree repair. */
34
+ export function getAllProtectedCommitmentEvents() {
35
+ return PROTECTED_COMMITMENT_EVENTS.map((record) => {
36
+ const mintBytes = "mintAddressHex" in record
37
+ ? hexToBytes(record.mintAddressHex)
38
+ : PublicKey.default.toBytes();
39
+ return {
40
+ commitment: hexToBytes(record.commitmentHex),
41
+ leafIndex: record.leafIndex,
42
+ newRoot: new Uint8Array(32),
43
+ timestamp: 0,
44
+ mintAddress: new PublicKey(mintBytes),
45
+ treeId: "onChainTreeId" in record ? record.onChainTreeId : 0,
46
+ txSignature: "protected-backfill",
47
+ slot: 0,
48
+ source: "protected",
49
+ };
50
+ });
51
+ }
52
+ /**
53
+ * Add the protected historical leaves without duplicating records already read
54
+ * from an indexer. A conflicting commitment at a protected index is rejected.
55
+ */
56
+ export function mergeProtectedCommitmentEvents(events, params) {
57
+ const merged = [...events];
58
+ for (const protectedEvent of getProtectedCommitmentEvents(params)) {
59
+ const sameCommitment = merged.find((event) => bytesEqual(event.commitment, protectedEvent.commitment));
60
+ if (sameCommitment)
61
+ continue;
62
+ const atIndex = merged.find((event) => event.treeId === protectedEvent.treeId &&
63
+ event.leafIndex === protectedEvent.leafIndex);
64
+ if (atIndex) {
65
+ throw new Error(`Protected commitment conflicts with leaf ${protectedEvent.leafIndex}`);
66
+ }
67
+ merged.push(protectedEvent);
68
+ }
69
+ return merged.sort((a, b) => a.leafIndex - b.leafIndex);
70
+ }
71
+ /**
72
+ * Insert expected commitments and prefer authoritative emitted metadata when it
73
+ * exists. Missing events are computed from the local tree exactly like the
74
+ * relayer's `insertAndPersistCommitments` fallback.
75
+ *
76
+ * This function mutates `tree`.
77
+ */
78
+ export function resolveCommitmentEvents(params) {
79
+ const { commitments, tree, logMessages, programId, mintAddress, treeId, txSignature, slot, timestamp = 0, requireAllInLogs = false, } = params;
80
+ const emitted = parseCommitmentEventsFromLogs({
81
+ logMessages,
82
+ programId,
83
+ txSignature,
84
+ slot,
85
+ });
86
+ const emittedByCommitment = new Map(emitted.map((event) => [bytesToHex(event.commitment), event]));
87
+ if (requireAllInLogs) {
88
+ const missing = commitments.filter((commitment) => !emittedByCommitment.has(bytesToHex(commitment)));
89
+ if (missing.length > 0) {
90
+ throw new Error(`Missing ${missing.length}/${commitments.length} commitment event(s) in transaction logs`);
91
+ }
92
+ }
93
+ return commitments.map((commitment) => {
94
+ const { index, root } = tree.insert(commitment);
95
+ return (emittedByCommitment.get(bytesToHex(commitment)) ?? {
96
+ commitment: new Uint8Array(commitment),
97
+ leafIndex: index,
98
+ newRoot: new Uint8Array(root),
99
+ timestamp,
100
+ mintAddress,
101
+ treeId,
102
+ txSignature,
103
+ slot,
104
+ source: "computed",
105
+ });
106
+ });
107
+ }
108
+ /** Decode the two commitments hidden in a current `open_position` instruction. */
109
+ export function decodeEventlessOpenPositionCommitments(instructionData) {
110
+ const coder = new anchor.BorshInstructionCoder(PRIVACY_POOL_CURRENT_IDL);
111
+ let decoded;
112
+ try {
113
+ decoded = coder.decode(Buffer.from(instructionData));
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ if (!decoded || !/open_?position/i.test(decoded.name))
119
+ return null;
120
+ const data = decoded.data;
121
+ return {
122
+ sourceMint: toPublicKey(field(data, "sourceMint", "source_mint")),
123
+ sourceTreeId: toSafeNumber(field(data, "sourceTreeId", "source_tree_id") ?? 0, "sourceTreeId"),
124
+ sourceCommitment: toBytes(field(data, "outputCommitment0", "output_commitment_0"), 32, "outputCommitment0"),
125
+ positionMint: toPublicKey(field(data, "destMint", "dest_mint")),
126
+ positionTreeId: toSafeNumber(field(data, "positionTreeId", "position_tree_id") ?? 0, "positionTreeId"),
127
+ positionCommitment: toBytes(field(data, "outputCommitment1", "output_commitment_1"), 32, "outputCommitment1"),
128
+ positionPdaKey: toBytes(field(data, "positionPdaKey", "position_pda_key"), 32, "positionPdaKey"),
129
+ };
130
+ }
131
+ export function getPositionPda(programId, positionPdaKey) {
132
+ return PublicKey.findProgramAddressSync([new TextEncoder().encode("position_pda_v1"), positionPdaKey], programId)[0];
133
+ }
134
+ /** Read PositionPDA.leaf_index at the same byte offset used by the relayer. */
135
+ export function readPositionLeafIndex(accountData) {
136
+ if (accountData.length < 57) {
137
+ throw new Error(`PositionPDA data is too short: ${accountData.length} bytes`);
138
+ }
139
+ const expected = getPositionPdaDiscriminator();
140
+ if (!bytesEqual(accountData.slice(0, 8), expected)) {
141
+ throw new Error("PositionPDA discriminator mismatch");
142
+ }
143
+ const leafIndex = new DataView(accountData.buffer, accountData.byteOffset, accountData.byteLength).getBigUint64(49, true);
144
+ if (leafIndex > BigInt(Number.MAX_SAFE_INTEGER)) {
145
+ throw new Error("PositionPDA leaf index exceeds JavaScript's safe integer range");
146
+ }
147
+ return Number(leafIndex);
148
+ }
149
+ /**
150
+ * Recover the two events omitted by the deployed `open_position` instruction.
151
+ * The source tree must already contain every earlier source-mint commitment.
152
+ * This function inserts the source commitment into that tree.
153
+ */
154
+ export async function recoverEventlessOpenPositionEvents(params) {
155
+ const decoded = decodeEventlessOpenPositionCommitments(params.instructionData);
156
+ if (!decoded)
157
+ return [];
158
+ const positionPda = getPositionPda(params.programId, decoded.positionPdaKey);
159
+ const account = (await params.connection.getAccountInfo(positionPda));
160
+ if (account && !account.owner.equals(params.programId)) {
161
+ throw new Error("PositionPDA is not owned by the Veilo program");
162
+ }
163
+ const positionLeafIndex = account
164
+ ? readPositionLeafIndex(new Uint8Array(account.data))
165
+ : undefined;
166
+ const { index, root } = params.sourceTree.insert(decoded.sourceCommitment);
167
+ const sourceEvent = {
168
+ commitment: decoded.sourceCommitment,
169
+ leafIndex: index,
170
+ newRoot: new Uint8Array(root),
171
+ timestamp: params.timestamp ?? 0,
172
+ mintAddress: decoded.sourceMint,
173
+ treeId: decoded.sourceTreeId,
174
+ txSignature: params.txSignature,
175
+ slot: params.slot,
176
+ source: "computed",
177
+ };
178
+ if (positionLeafIndex === undefined)
179
+ return [sourceEvent];
180
+ return [
181
+ sourceEvent,
182
+ {
183
+ commitment: decoded.positionCommitment,
184
+ leafIndex: positionLeafIndex,
185
+ newRoot: new Uint8Array(32),
186
+ timestamp: params.timestamp ?? 0,
187
+ mintAddress: decoded.positionMint,
188
+ treeId: decoded.positionTreeId,
189
+ txSignature: params.txSignature,
190
+ slot: params.slot,
191
+ source: "computed",
192
+ },
193
+ ];
194
+ }
195
+ function getPositionPdaDiscriminator() {
196
+ const account = (PRIVACY_POOL_CURRENT_IDL.accounts ?? []).find((entry) => entry.name === "PositionPDA");
197
+ if (!account?.discriminator) {
198
+ throw new Error("Current IDL does not define PositionPDA");
199
+ }
200
+ return new Uint8Array(account.discriminator);
201
+ }
202
+ function field(data, camel, snake) {
203
+ return data[camel] ?? data[snake];
204
+ }
205
+ function toPublicKey(value) {
206
+ if (value instanceof PublicKey)
207
+ return value;
208
+ return new PublicKey(value);
209
+ }
210
+ function toBytes(value, length, label) {
211
+ const bytes = new Uint8Array(value);
212
+ if (bytes.length !== length) {
213
+ throw new Error(`${label} must be ${length} bytes, got ${bytes.length}`);
214
+ }
215
+ return bytes;
216
+ }
217
+ function toSafeNumber(value, label) {
218
+ const number = typeof value === "number" ? value : Number(value);
219
+ if (!Number.isSafeInteger(number)) {
220
+ throw new Error(`${label} is outside JavaScript's safe integer range`);
221
+ }
222
+ return number;
223
+ }
224
+ function hexToBytes(hex) {
225
+ if (!/^[0-9a-f]{64}$/i.test(hex)) {
226
+ throw new Error("Commitment hex must contain exactly 32 bytes");
227
+ }
228
+ return Uint8Array.from({ length: 32 }, (_, index) => Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16));
229
+ }
230
+ function bytesToHex(bytes) {
231
+ return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
232
+ }
233
+ function bytesEqual(a, b) {
234
+ if (a.length !== b.length)
235
+ return false;
236
+ return a.every((value, index) => value === b[index]);
237
+ }
@@ -0,0 +1,35 @@
1
+ import type { Idl, Program } from "@coral-xyz/anchor";
2
+ import type { PublicKey } from "@solana/web3.js";
3
+ import type { CommitmentEvent, NullifierSpentEvent } from "./types.js";
4
+ export type EventScanPage<T> = {
5
+ events: T[];
6
+ /** Oldest signature examined, even when it emitted no matching event. */
7
+ nextBefore?: string;
8
+ scannedSignatures: number;
9
+ };
10
+ export type EventScanParams<T extends Idl> = {
11
+ program: Program<T>;
12
+ mintAddress?: PublicKey;
13
+ before?: string;
14
+ until?: string;
15
+ /** Number of program signatures to inspect. Maximum 1,000. */
16
+ limit?: number;
17
+ };
18
+ /** Scan one RPC page and retain a correct pagination cursor. */
19
+ export declare function scanCommitmentEventPage<T extends Idl>(params: EventScanParams<T>): Promise<EventScanPage<CommitmentEvent>>;
20
+ /**
21
+ * Scan a single page of CommitmentEvents.
22
+ *
23
+ * Use `scanAllCommitmentEvents` when reconstructing a complete historical tree.
24
+ */
25
+ export declare function scanCommitmentEvents<T extends Idl>(params: EventScanParams<T>): Promise<CommitmentEvent[]>;
26
+ /** Scan all historical pages without using event count as the RPC cursor. */
27
+ export declare function scanAllCommitmentEvents<T extends Idl>(params: {
28
+ program: Program<T>;
29
+ mintAddress?: PublicKey;
30
+ before?: string;
31
+ until?: string;
32
+ pageSize?: number;
33
+ }): Promise<CommitmentEvent[]>;
34
+ /** Scan one RPC page of NullifierSpent events using all historical IDLs. */
35
+ export declare function scanNullifierEvents<T extends Idl>(params: EventScanParams<T>): Promise<NullifierSpentEvent[]>;
@@ -0,0 +1,92 @@
1
+ import { parseCommitmentEventsFromLogs, parseNullifierEventsFromLogs, } from "./parsing.js";
2
+ /** Scan one RPC page and retain a correct pagination cursor. */
3
+ export async function scanCommitmentEventPage(params) {
4
+ const { program, mintAddress, before, until, limit = 1000 } = params;
5
+ assertPageSize(limit);
6
+ const signatures = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
7
+ const events = [];
8
+ for (const signature of signatures) {
9
+ if (signature.err)
10
+ continue;
11
+ const tx = await program.provider.connection.getTransaction(signature.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
12
+ if (!tx)
13
+ continue;
14
+ for (const event of parseCommitmentEventsFromLogs({
15
+ logMessages: tx.meta?.logMessages,
16
+ programId: program.programId,
17
+ txSignature: signature.signature,
18
+ slot: signature.slot,
19
+ })) {
20
+ if (!mintAddress || event.mintAddress.equals(mintAddress)) {
21
+ events.push(event);
22
+ }
23
+ }
24
+ }
25
+ return {
26
+ events,
27
+ nextBefore: signatures[signatures.length - 1]?.signature,
28
+ scannedSignatures: signatures.length,
29
+ };
30
+ }
31
+ /**
32
+ * Scan a single page of CommitmentEvents.
33
+ *
34
+ * Use `scanAllCommitmentEvents` when reconstructing a complete historical tree.
35
+ */
36
+ export async function scanCommitmentEvents(params) {
37
+ return (await scanCommitmentEventPage(params)).events;
38
+ }
39
+ /** Scan all historical pages without using event count as the RPC cursor. */
40
+ export async function scanAllCommitmentEvents(params) {
41
+ const { program, mintAddress, until, pageSize = 1000 } = params;
42
+ assertPageSize(pageSize);
43
+ const events = [];
44
+ let before = params.before;
45
+ while (true) {
46
+ const page = await scanCommitmentEventPage({
47
+ program,
48
+ mintAddress,
49
+ before,
50
+ until,
51
+ limit: pageSize,
52
+ });
53
+ events.push(...page.events);
54
+ if (page.scannedSignatures < pageSize || !page.nextBefore)
55
+ break;
56
+ if (page.nextBefore === before) {
57
+ throw new Error("Commitment event pagination cursor did not advance");
58
+ }
59
+ before = page.nextBefore;
60
+ }
61
+ return events;
62
+ }
63
+ /** Scan one RPC page of NullifierSpent events using all historical IDLs. */
64
+ export async function scanNullifierEvents(params) {
65
+ const { program, mintAddress, before, until, limit = 1000 } = params;
66
+ assertPageSize(limit);
67
+ const signatures = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
68
+ const events = [];
69
+ for (const signature of signatures) {
70
+ if (signature.err)
71
+ continue;
72
+ const tx = await program.provider.connection.getTransaction(signature.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
73
+ if (!tx)
74
+ continue;
75
+ for (const event of parseNullifierEventsFromLogs({
76
+ logMessages: tx.meta?.logMessages,
77
+ programId: program.programId,
78
+ txSignature: signature.signature,
79
+ slot: signature.slot,
80
+ })) {
81
+ if (!mintAddress || event.mintAddress.equals(mintAddress)) {
82
+ events.push(event);
83
+ }
84
+ }
85
+ }
86
+ return events;
87
+ }
88
+ function assertPageSize(value) {
89
+ if (!Number.isInteger(value) || value < 1 || value > 1000) {
90
+ throw new RangeError(`Event scan page size must be an integer from 1 to 1000, got ${value}`);
91
+ }
92
+ }