@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,27 @@
1
+ import type { Idl, Program } from "@coral-xyz/anchor";
2
+ import type { PublicKey } from "@solana/web3.js";
3
+ import { MerkleTree } from "../merkle.js";
4
+ import type { CommitmentEvent } from "./types.js";
5
+ /** Rebuild a local Veilo tree from emitted, computed, and protected history. */
6
+ export declare function buildTreeFromEvents<T extends Idl>(params: {
7
+ program: Program<T>;
8
+ mintAddress: PublicKey;
9
+ treeId?: number;
10
+ depth?: number;
11
+ /** Eventless commitments recovered with the helpers in `events/recovery`. */
12
+ additionalEvents?: readonly CommitmentEvent[];
13
+ /** Includes the relayer's two protected historical repairs. Defaults to true. */
14
+ includeProtectedEvents?: boolean;
15
+ /** Reject missing or duplicate leaf indices instead of building a wrong root. */
16
+ strictLeafIndices?: boolean;
17
+ }): Promise<{
18
+ tree: MerkleTree;
19
+ events: CommitmentEvent[];
20
+ latestSignature?: string;
21
+ }>;
22
+ export declare function dedupeCommitmentEvents(events: readonly CommitmentEvent[]): CommitmentEvent[];
23
+ /** Build a Merkle tree from already-collected events in authoritative order. */
24
+ export declare function reconstructTreeFromCommitmentEvents(events: readonly CommitmentEvent[], options?: {
25
+ depth?: number;
26
+ strictLeafIndices?: boolean;
27
+ }): MerkleTree;
@@ -0,0 +1,58 @@
1
+ import { MerkleTree } from "../merkle.js";
2
+ import { mergeProtectedCommitmentEvents } from "./recovery.js";
3
+ import { scanAllCommitmentEvents } from "./scanning.js";
4
+ /** Rebuild a local Veilo tree from emitted, computed, and protected history. */
5
+ export async function buildTreeFromEvents(params) {
6
+ const { program, mintAddress, treeId = 0, depth = 22, additionalEvents = [], includeProtectedEvents = true, strictLeafIndices = true, } = params;
7
+ const emitted = await scanAllCommitmentEvents({ program, mintAddress });
8
+ let treeEvents = dedupeCommitmentEvents([...emitted, ...additionalEvents])
9
+ .filter((event) => event.treeId === treeId && event.mintAddress.equals(mintAddress))
10
+ .sort((a, b) => a.leafIndex - b.leafIndex);
11
+ if (includeProtectedEvents) {
12
+ treeEvents = mergeProtectedCommitmentEvents(treeEvents, {
13
+ mintAddress,
14
+ treeId,
15
+ });
16
+ }
17
+ const tree = reconstructTreeFromCommitmentEvents(treeEvents, {
18
+ depth,
19
+ strictLeafIndices,
20
+ });
21
+ return {
22
+ tree,
23
+ events: treeEvents,
24
+ latestSignature: treeEvents[treeEvents.length - 1]?.txSignature,
25
+ };
26
+ }
27
+ export function dedupeCommitmentEvents(events) {
28
+ const byCommitment = new Map();
29
+ for (const event of events) {
30
+ const key = Array.from(event.commitment, (value) => value.toString(16).padStart(2, "0")).join("");
31
+ const existing = byCommitment.get(key);
32
+ if (!existing || eventPriority(event) > eventPriority(existing)) {
33
+ byCommitment.set(key, event);
34
+ }
35
+ }
36
+ return [...byCommitment.values()];
37
+ }
38
+ function eventPriority(event) {
39
+ // Events created before `source` was added came from on-chain log scans and
40
+ // are therefore treated as authoritative emitted records.
41
+ if (event.source === "protected")
42
+ return 1;
43
+ if (event.source === "computed")
44
+ return 2;
45
+ return 3;
46
+ }
47
+ /** Build a Merkle tree from already-collected events in authoritative order. */
48
+ export function reconstructTreeFromCommitmentEvents(events, options = {}) {
49
+ const tree = new MerkleTree(options.depth ?? 22);
50
+ for (const event of [...events].sort((a, b) => a.leafIndex - b.leafIndex)) {
51
+ if ((options.strictLeafIndices ?? true) &&
52
+ event.leafIndex !== tree.nextIndex) {
53
+ throw new Error(`Commitment history gap: expected leaf ${tree.nextIndex}, got ${event.leafIndex}`);
54
+ }
55
+ tree.insert(event.commitment);
56
+ }
57
+ return tree;
58
+ }
@@ -0,0 +1,39 @@
1
+ import type { PublicKey } from "@solana/web3.js";
2
+ import type { PrivacyPoolIdlVersion } from "../idl/index.js";
3
+ export type CommitmentEventSource = "emitted" | "computed" | "protected";
4
+ /**
5
+ * A commitment appended to a Veilo Merkle tree.
6
+ *
7
+ * Compact recovery fields are optional because they were added across two
8
+ * program upgrades. Historical events remain valid without them.
9
+ */
10
+ export type CommitmentEvent = {
11
+ commitment: Uint8Array;
12
+ leafIndex: number;
13
+ newRoot: Uint8Array;
14
+ timestamp: number;
15
+ mintAddress: PublicKey;
16
+ treeId: number;
17
+ txSignature: string;
18
+ slot: number;
19
+ ephemeralPublicKey?: Uint8Array;
20
+ encryptedBlob?: Uint8Array;
21
+ viewTag?: number;
22
+ source?: CommitmentEventSource;
23
+ idlVersion?: PrivacyPoolIdlVersion;
24
+ };
25
+ /** On-chain event emitted when a private note is consumed. */
26
+ export type NullifierSpentEvent = {
27
+ nullifier: Uint8Array;
28
+ timestamp: number;
29
+ mintAddress: PublicKey;
30
+ treeId: number;
31
+ txSignature: string;
32
+ slot: number;
33
+ idlVersion?: PrivacyPoolIdlVersion;
34
+ };
35
+ export type ParsedVeiloEvent = {
36
+ name: string;
37
+ data: unknown;
38
+ idlVersion: PrivacyPoolIdlVersion;
39
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,77 +1 @@
1
- import { PublicKey } from "@solana/web3.js";
2
- import { Program, Idl } from "@coral-xyz/anchor";
3
- import { MerkleTree } from "./merkle.js";
4
- /**
5
- * On-chain CommitmentEvent emitted by `transact` and `transact_swap`.
6
- * Mirrors the IDL CommitmentEvent struct.
7
- */
8
- export type CommitmentEvent = {
9
- commitment: Uint8Array;
10
- leafIndex: number;
11
- newRoot: Uint8Array;
12
- timestamp: number;
13
- mintAddress: PublicKey;
14
- treeId: number;
15
- txSignature: string;
16
- slot: number;
17
- };
18
- /**
19
- * On-chain NullifierSpent event emitted when a UTXO is consumed.
20
- * Mirrors the IDL NullifierSpent struct.
21
- */
22
- export type NullifierSpentEvent = {
23
- nullifier: Uint8Array;
24
- timestamp: number;
25
- mintAddress: PublicKey;
26
- treeId: number;
27
- txSignature: string;
28
- slot: number;
29
- };
30
- /**
31
- * Fetch and parse CommitmentEvents for a program, optionally filtered by mint.
32
- *
33
- * @param program - Anchor program instance
34
- * @param mintAddress - Filter to a specific pool; omit to get all pools
35
- * @param before - Start paging before this signature (exclusive)
36
- * @param until - Stop paging at this signature (exclusive)
37
- * @param limit - Max signatures to fetch per page (default 1000)
38
- */
39
- export declare function scanCommitmentEvents<T extends Idl>(params: {
40
- program: Program<T>;
41
- mintAddress?: PublicKey;
42
- before?: string;
43
- until?: string;
44
- limit?: number;
45
- }): Promise<CommitmentEvent[]>;
46
- /**
47
- * Fetch and parse NullifierSpent events for a program, optionally filtered by mint.
48
- */
49
- export declare function scanNullifierEvents<T extends Idl>(params: {
50
- program: Program<T>;
51
- mintAddress?: PublicKey;
52
- before?: string;
53
- until?: string;
54
- limit?: number;
55
- }): Promise<NullifierSpentEvent[]>;
56
- /**
57
- * Rebuild a local MerkleTree from on-chain CommitmentEvents.
58
- * Use this to get a valid inclusion proof for spending any UTXO.
59
- *
60
- * CommitmentEvents are sorted by (treeId, leafIndex) so the local tree
61
- * matches the on-chain state exactly.
62
- *
63
- * @param program - Anchor program instance
64
- * @param mintAddress - Pool to reconstruct
65
- * @param treeId - Which tree to reconstruct (default 0)
66
- * @param depth - Merkle tree depth (default 22, must match on-chain)
67
- */
68
- export declare function buildTreeFromEvents<T extends Idl>(params: {
69
- program: Program<T>;
70
- mintAddress: PublicKey;
71
- treeId?: number;
72
- depth?: number;
73
- }): Promise<{
74
- tree: MerkleTree;
75
- events: CommitmentEvent[];
76
- latestSignature?: string;
77
- }>;
1
+ export * from "./events/index.js";
@@ -1,129 +1,3 @@
1
- import * as anchor from "@coral-xyz/anchor";
2
- import { MerkleTree } from "./merkle.js";
3
- // -----------------------------------------------------------------------------
4
- // Event Scanning
5
- // -----------------------------------------------------------------------------
6
- /**
7
- * Fetch and parse CommitmentEvents for a program, optionally filtered by mint.
8
- *
9
- * @param program - Anchor program instance
10
- * @param mintAddress - Filter to a specific pool; omit to get all pools
11
- * @param before - Start paging before this signature (exclusive)
12
- * @param until - Stop paging at this signature (exclusive)
13
- * @param limit - Max signatures to fetch per page (default 1000)
14
- */
15
- export async function scanCommitmentEvents(params) {
16
- const { program, mintAddress, before, until, limit = 1000 } = params;
17
- const out = [];
18
- const eventParser = new anchor.EventParser(program.programId, new anchor.BorshCoder(program.idl));
19
- const sigs = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
20
- for (const sigInfo of sigs) {
21
- if (sigInfo.err)
22
- continue;
23
- const tx = await program.provider.connection.getTransaction(sigInfo.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
24
- if (!tx)
25
- continue;
26
- const events = Array.from(eventParser.parseLogs(tx.meta?.logMessages ?? []));
27
- for (const ev of events) {
28
- if (ev.name !== "commitmentEvent")
29
- continue;
30
- const d = ev.data;
31
- const evMint = d.mintAddress;
32
- if (mintAddress && !evMint.equals(mintAddress))
33
- continue;
34
- out.push({
35
- commitment: new Uint8Array(d.commitment),
36
- leafIndex: Number(d.leafIndex),
37
- newRoot: new Uint8Array(d.newRoot),
38
- timestamp: Number(d.timestamp),
39
- mintAddress: evMint,
40
- treeId: Number(d.treeId),
41
- txSignature: sigInfo.signature,
42
- slot: sigInfo.slot,
43
- });
44
- }
45
- }
46
- return out;
47
- }
48
- /**
49
- * Fetch and parse NullifierSpent events for a program, optionally filtered by mint.
50
- */
51
- export async function scanNullifierEvents(params) {
52
- const { program, mintAddress, before, until, limit = 1000 } = params;
53
- const out = [];
54
- const eventParser = new anchor.EventParser(program.programId, new anchor.BorshCoder(program.idl));
55
- const sigs = await program.provider.connection.getSignaturesForAddress(program.programId, { before, until, limit });
56
- for (const sigInfo of sigs) {
57
- if (sigInfo.err)
58
- continue;
59
- const tx = await program.provider.connection.getTransaction(sigInfo.signature, { commitment: "confirmed", maxSupportedTransactionVersion: 0 });
60
- if (!tx)
61
- continue;
62
- const events = Array.from(eventParser.parseLogs(tx.meta?.logMessages ?? []));
63
- for (const ev of events) {
64
- if (ev.name !== "nullifierSpent")
65
- continue;
66
- const d = ev.data;
67
- const evMint = d.mintAddress;
68
- if (mintAddress && !evMint.equals(mintAddress))
69
- continue;
70
- out.push({
71
- nullifier: new Uint8Array(d.nullifier),
72
- timestamp: Number(d.timestamp),
73
- mintAddress: evMint,
74
- treeId: Number(d.treeId),
75
- txSignature: sigInfo.signature,
76
- slot: sigInfo.slot,
77
- });
78
- }
79
- }
80
- return out;
81
- }
82
- // -----------------------------------------------------------------------------
83
- // Tree Reconstruction
84
- // -----------------------------------------------------------------------------
85
- /**
86
- * Rebuild a local MerkleTree from on-chain CommitmentEvents.
87
- * Use this to get a valid inclusion proof for spending any UTXO.
88
- *
89
- * CommitmentEvents are sorted by (treeId, leafIndex) so the local tree
90
- * matches the on-chain state exactly.
91
- *
92
- * @param program - Anchor program instance
93
- * @param mintAddress - Pool to reconstruct
94
- * @param treeId - Which tree to reconstruct (default 0)
95
- * @param depth - Merkle tree depth (default 22, must match on-chain)
96
- */
97
- export async function buildTreeFromEvents(params) {
98
- const { program, mintAddress, treeId = 0, depth = 22 } = params;
99
- // Fetch all commitment events for this pool (page until no more results).
100
- // Oldest-first so we insert leaves in the correct order.
101
- const allEvents = [];
102
- let before;
103
- while (true) {
104
- const page = await scanCommitmentEvents({
105
- program,
106
- mintAddress,
107
- before,
108
- limit: 1000,
109
- });
110
- if (page.length === 0)
111
- break;
112
- allEvents.push(...page);
113
- before = page[page.length - 1].txSignature;
114
- if (page.length < 1000)
115
- break;
116
- }
117
- // Keep only events for this treeId, sort by leafIndex ascending
118
- const treeEvents = allEvents
119
- .filter((e) => e.treeId === treeId)
120
- .sort((a, b) => a.leafIndex - b.leafIndex);
121
- const tree = new MerkleTree(depth);
122
- for (const ev of treeEvents) {
123
- tree.insert(ev.commitment);
124
- }
125
- const latestSignature = treeEvents.length > 0
126
- ? treeEvents[treeEvents.length - 1].txSignature
127
- : undefined;
128
- return { tree, events: treeEvents, latestSignature };
129
- }
1
+ // Backward-compatible entry point. Event parsing, scanning, and recovery live
2
+ // in focused modules under src/events.
3
+ export * from "./events/index.js";
@@ -0,0 +1,9 @@
1
+ export declare function concatBytes(...parts: readonly Uint8Array[]): Uint8Array;
2
+ export declare function utf8(value: string): Uint8Array;
3
+ export declare function uint32Le(value: number, label?: string): Uint8Array;
4
+ export declare function uint64Le(value: bigint, label?: string): Uint8Array;
5
+ export declare function assertBytes(value: Uint8Array, length: number, label: string): void;
6
+ export declare function bytesToHex(bytes: Uint8Array): string;
7
+ export declare function hexToBytes(value: string, length?: number, label?: string): Uint8Array;
8
+ /** Encode bytes using the Bitcoin/Solana base58 alphabet. */
9
+ export declare function encodeBase58(bytes: Uint8Array): string;
@@ -0,0 +1,75 @@
1
+ const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
2
+ export function concatBytes(...parts) {
3
+ const output = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));
4
+ let offset = 0;
5
+ for (const part of parts) {
6
+ output.set(part, offset);
7
+ offset += part.length;
8
+ }
9
+ return output;
10
+ }
11
+ export function utf8(value) {
12
+ return new TextEncoder().encode(value);
13
+ }
14
+ export function uint32Le(value, label = "value") {
15
+ if (!Number.isSafeInteger(value) || value < 0 || value > 4294967295) {
16
+ throw new RangeError(`${label} must be an unsigned 32-bit integer`);
17
+ }
18
+ const bytes = new Uint8Array(4);
19
+ new DataView(bytes.buffer).setUint32(0, value, true);
20
+ return bytes;
21
+ }
22
+ export function uint64Le(value, label = "value") {
23
+ if (value < 0n || value > 0xffffffffffffffffn) {
24
+ throw new RangeError(`${label} must be an unsigned 64-bit integer`);
25
+ }
26
+ const bytes = new Uint8Array(8);
27
+ new DataView(bytes.buffer).setBigUint64(0, value, true);
28
+ return bytes;
29
+ }
30
+ export function assertBytes(value, length, label) {
31
+ if (value.length !== length) {
32
+ throw new RangeError(`${label} must be ${length} bytes, got ${value.length}`);
33
+ }
34
+ }
35
+ export function bytesToHex(bytes) {
36
+ return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join("");
37
+ }
38
+ export function hexToBytes(value, length, label = "hex value") {
39
+ const clean = value.startsWith("0x") ? value.slice(2) : value;
40
+ if (!/^[0-9a-f]*$/i.test(clean) || clean.length % 2 !== 0) {
41
+ throw new TypeError(`${label} must be an even-length hexadecimal string`);
42
+ }
43
+ const bytes = Uint8Array.from({ length: clean.length / 2 }, (_, index) => Number.parseInt(clean.slice(index * 2, index * 2 + 2), 16));
44
+ if (length !== undefined)
45
+ assertBytes(bytes, length, label);
46
+ return bytes;
47
+ }
48
+ /** Encode bytes using the Bitcoin/Solana base58 alphabet. */
49
+ export function encodeBase58(bytes) {
50
+ if (bytes.length === 0)
51
+ return "";
52
+ let zeroes = 0;
53
+ while (zeroes < bytes.length && bytes[zeroes] === 0)
54
+ zeroes++;
55
+ if (zeroes === bytes.length)
56
+ return "1".repeat(zeroes);
57
+ const digits = [0];
58
+ for (let index = zeroes; index < bytes.length; index++) {
59
+ let carry = bytes[index];
60
+ for (let digit = 0; digit < digits.length; digit++) {
61
+ const value = digits[digit] * 256 + carry;
62
+ digits[digit] = value % 58;
63
+ carry = Math.floor(value / 58);
64
+ }
65
+ while (carry > 0) {
66
+ digits.push(carry % 58);
67
+ carry = Math.floor(carry / 58);
68
+ }
69
+ }
70
+ let encoded = "1".repeat(zeroes);
71
+ for (let index = digits.length - 1; index >= 0; index--) {
72
+ encoded += BASE58_ALPHABET[digits[index]];
73
+ }
74
+ return encoded;
75
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./encoding.js";
2
+ export * from "./spending.js";
3
+ export * from "./noteKey.js";
4
+ export * from "./viewKey.js";
@@ -0,0 +1,4 @@
1
+ export * from "./encoding.js";
2
+ export * from "./spending.js";
3
+ export * from "./noteKey.js";
4
+ export * from "./viewKey.js";
@@ -0,0 +1,33 @@
1
+ /** Domain-separation label. Permanent — see the header. */
2
+ export declare const VEILO_NOTE_KEY_LABEL = "veilo_note_key_v1";
3
+ /** The note spending key plus the Poseidon public key derived from it. */
4
+ export interface NoteKeypair {
5
+ /** Raw 32-byte scalar, strictly below the BN254 Fr modulus. */
6
+ noteSecretKey: Uint8Array;
7
+ /** Hex form, matching how the relayer has always returned this key. */
8
+ noteSecretKeyHex: string;
9
+ /** Poseidon(noteSecretKey) — the note's committed owner. */
10
+ notePublicKey: bigint;
11
+ /** Decimal string form, as the relayer and note scanner expect it. */
12
+ notePublicKeyString: string;
13
+ }
14
+ /**
15
+ * Derive the note spending key from a spending-key root.
16
+ *
17
+ * @param spendingKey 32 bytes from `deriveSpendingKeyFromSignature` or a sibling
18
+ */
19
+ export declare function deriveNoteKeyFromSpendingKey(spendingKey: Uint8Array): Uint8Array;
20
+ /**
21
+ * Derive the note spending key and its Poseidon public key.
22
+ *
23
+ * Call `initPoseidon()` once before this, as with `derivePositionKeys`.
24
+ */
25
+ export declare function deriveNoteKeypairFromSpendingKey(spendingKey: Uint8Array): NoteKeypair;
26
+ /**
27
+ * One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
28
+ *
29
+ * Prompts a single signature, then returns spend authority for the account.
30
+ * The signature is secret material: keep it in memory, never persist it, and
31
+ * never expose the result on a global.
32
+ */
33
+ export declare function deriveNoteKeypairWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<NoteKeypair>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Derivation of the Veilo NOTE SPENDING KEY from a spending-key root.
3
+ *
4
+ * ⚠ BYTE-FOR-BYTE PORT — must agree with
5
+ * veilo-browser-extension/extension-ui/src/lib/veiloNoteKey.ts
6
+ * wallet-app/src/lib/veiloNoteKey.ts
7
+ * An account created in one client must be spendable from the others, so the
8
+ * label, the HMAC construction and the rejection rule are all load-bearing.
9
+ * `tests/identity-keys.test.ts` re-implements the client algorithm
10
+ * independently and asserts equality, plus pins a known-answer vector.
11
+ *
12
+ * WHAT THIS KEY IS
13
+ * ----------------
14
+ * `zk-circuits/keypair.circom` defines publicKey = Poseidon(privateKey), and
15
+ * `transaction.circom` constrains Poseidon(privateKey) === the note's committed
16
+ * owner before it will emit a proof, then derives the nullifier from the same
17
+ * key. This one scalar is both proof of ownership and spend authority; there is
18
+ * no second factor anywhere in the circuit. Treat it exactly as you would a
19
+ * wallet secret key.
20
+ *
21
+ * Derivation:
22
+ * spendingKey = deriveSpendingKeyFromSignature(sig) // ./spending.js
23
+ * veiloPrivateKey = rejectionSample(hmac_sha256(spendingKey, "veilo_note_key_v1|N"))
24
+ * veiloPublicKey = Poseidon(veiloPrivateKey)
25
+ *
26
+ * WHY REJECTION SAMPLING AND NOT `mod Fr`
27
+ * ---------------------------------------
28
+ * Reducing a 256-bit hash modulo Fr biases the low end of the range. Note that
29
+ * `derivePositionKeys` uses modular reduction; this key follows the stricter
30
+ * convention because it is a SPENDING key, matching how real note secrets are
31
+ * generated. About 0.3% of draws are retried.
32
+ *
33
+ * ⚠ THE LABEL IS PERMANENT. Once one note exists under "veilo_note_key_v1",
34
+ * changing the label or the sampling method makes that note unspendable
35
+ * forever. Version it, never edit it.
36
+ *
37
+ * ⚠ APPLIES TO `derived-v3` ACCOUNTS ONLY. Accounts whose relayer record has
38
+ * `veiloKeySource` absent or "legacy" have a SERVER-GENERATED note key that no
39
+ * derivation can reproduce — those clients must decrypt the key the relayer
40
+ * serves them. Check the account's key source before assuming this function
41
+ * yields a usable key.
42
+ */
43
+ import { hmac } from "@noble/hashes/hmac";
44
+ import { sha256 } from "@noble/hashes/sha256";
45
+ import { BN254_FR_MODULUS, bytesToBigIntBE, poseidon1 } from "../poseidon.js";
46
+ import { assertBytes, bytesToHex, utf8 } from "./encoding.js";
47
+ import { deriveSpendingKeyWithSigner } from "./spending.js";
48
+ /** Domain-separation label. Permanent — see the header. */
49
+ export const VEILO_NOTE_KEY_LABEL = "veilo_note_key_v1";
50
+ /** Practically unreachable: 256 consecutive rejections is ~1e-640. */
51
+ const MAX_REJECTION_ROUNDS = 256;
52
+ /**
53
+ * Derive the note spending key from a spending-key root.
54
+ *
55
+ * @param spendingKey 32 bytes from `deriveSpendingKeyFromSignature` or a sibling
56
+ */
57
+ export function deriveNoteKeyFromSpendingKey(spendingKey) {
58
+ assertBytes(spendingKey, 32, "spending key");
59
+ for (let counter = 0; counter < MAX_REJECTION_ROUNDS; counter++) {
60
+ const candidate = hmac(sha256, spendingKey, utf8(`${VEILO_NOTE_KEY_LABEL}|${counter}`));
61
+ if (bytesToBigIntBE(candidate) < BN254_FR_MODULUS)
62
+ return candidate;
63
+ }
64
+ // Reaching here means HMAC-SHA256 is broken, not that we were unlucky.
65
+ throw new Error(`Failed to derive a field element for "${VEILO_NOTE_KEY_LABEL}"`);
66
+ }
67
+ /**
68
+ * Derive the note spending key and its Poseidon public key.
69
+ *
70
+ * Call `initPoseidon()` once before this, as with `derivePositionKeys`.
71
+ */
72
+ export function deriveNoteKeypairFromSpendingKey(spendingKey) {
73
+ const noteSecretKey = deriveNoteKeyFromSpendingKey(spendingKey);
74
+ const notePublicKey = poseidon1(bytesToBigIntBE(noteSecretKey));
75
+ return {
76
+ noteSecretKey,
77
+ noteSecretKeyHex: bytesToHex(noteSecretKey),
78
+ notePublicKey,
79
+ notePublicKeyString: notePublicKey.toString(),
80
+ };
81
+ }
82
+ /**
83
+ * One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
84
+ *
85
+ * Prompts a single signature, then returns spend authority for the account.
86
+ * The signature is secret material: keep it in memory, never persist it, and
87
+ * never expose the result on a global.
88
+ */
89
+ export async function deriveNoteKeypairWithSigner(signMessage, index = 0) {
90
+ return deriveNoteKeypairFromSpendingKey(await deriveSpendingKeyWithSigner(signMessage, index));
91
+ }
@@ -0,0 +1,18 @@
1
+ import { Keypair } from "@solana/web3.js";
2
+ export declare const VEILO_SPENDING_KEY_DOMAIN = "veilo_spending_key_v1";
3
+ /** Exact message signed by Veilo clients to derive a spending-key root. */
4
+ export declare function getSpendingKeyMessage(index?: number): Uint8Array;
5
+ /** Convert the deterministic 64-byte wallet signature into a spending key. */
6
+ export declare function deriveSpendingKeyFromSignature(signature: Uint8Array): Uint8Array;
7
+ /**
8
+ * Wallet-standard-friendly spending-key derivation.
9
+ * The callback owns signing; the SDK never receives the wallet secret key.
10
+ */
11
+ export declare function deriveSpendingKeyWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<Uint8Array>;
12
+ /**
13
+ * Keypair convenience matching the wallet-app and extension implementation.
14
+ * Keep the keypair on the user's device and never send it to a service.
15
+ */
16
+ export declare function deriveSpendingKeyFromKeypair(keypair: Keypair, index?: number): Uint8Array;
17
+ /** Serialize an ephemeral claimant secret for an encrypted relayer request. */
18
+ export declare function encodeClaimantSecretKey(keypairOrSecret: Keypair | Uint8Array): string;
@@ -0,0 +1,35 @@
1
+ import { sha256 } from "@noble/hashes/sha256";
2
+ import nacl from "tweetnacl";
3
+ import { assertBytes, concatBytes, encodeBase58, uint32Le, utf8, } from "./encoding.js";
4
+ export const VEILO_SPENDING_KEY_DOMAIN = "veilo_spending_key_v1";
5
+ /** Exact message signed by Veilo clients to derive a spending-key root. */
6
+ export function getSpendingKeyMessage(index = 0) {
7
+ return concatBytes(utf8(VEILO_SPENDING_KEY_DOMAIN), uint32Le(index, "spending-key index"));
8
+ }
9
+ /** Convert the deterministic 64-byte wallet signature into a spending key. */
10
+ export function deriveSpendingKeyFromSignature(signature) {
11
+ assertBytes(signature, 64, "spending-key signature");
12
+ return sha256(signature);
13
+ }
14
+ /**
15
+ * Wallet-standard-friendly spending-key derivation.
16
+ * The callback owns signing; the SDK never receives the wallet secret key.
17
+ */
18
+ export async function deriveSpendingKeyWithSigner(signMessage, index = 0) {
19
+ return deriveSpendingKeyFromSignature(await signMessage(getSpendingKeyMessage(index)));
20
+ }
21
+ /**
22
+ * Keypair convenience matching the wallet-app and extension implementation.
23
+ * Keep the keypair on the user's device and never send it to a service.
24
+ */
25
+ export function deriveSpendingKeyFromKeypair(keypair, index = 0) {
26
+ return deriveSpendingKeyFromSignature(nacl.sign.detached(getSpendingKeyMessage(index), keypair.secretKey));
27
+ }
28
+ /** Serialize an ephemeral claimant secret for an encrypted relayer request. */
29
+ export function encodeClaimantSecretKey(keypairOrSecret) {
30
+ const secret = keypairOrSecret instanceof Uint8Array
31
+ ? keypairOrSecret
32
+ : keypairOrSecret.secretKey;
33
+ assertBytes(secret, 64, "claimant secret key");
34
+ return encodeBase58(secret);
35
+ }
@@ -0,0 +1,38 @@
1
+ import type { CompactNoteCipher } from "../compactNote.js";
2
+ /** HKDF salt. Provisional — see the header. */
3
+ export declare const VEILO_VIEW_KEY_SALT = "veilo_view_v1";
4
+ /** HKDF info. Provisional — see the header. */
5
+ export declare const VEILO_VIEW_KEY_INFO = "x25519";
6
+ /** An X25519 keypair used only to decrypt notes. */
7
+ export interface ViewKeypair {
8
+ /** 32-byte clamped X25519 scalar. Secret: decrypts every note sent to it. */
9
+ viewSecretKey: Uint8Array;
10
+ /** 32-byte X25519 public key — the value senders encrypt to. */
11
+ viewPublicKey: Uint8Array;
12
+ }
13
+ /** Derive the view keypair from a spending-key root. */
14
+ export declare function deriveViewKeypairFromSpendingKey(spendingKey: Uint8Array): ViewKeypair;
15
+ /**
16
+ * One-shot derivation for a dapp holding only a wallet-standard `signMessage`.
17
+ *
18
+ * Uses the same signature as `deriveNoteKeypairWithSigner`, so a client that
19
+ * wants both prompts once and derives the spending key itself rather than
20
+ * calling both helpers.
21
+ */
22
+ export declare function deriveViewKeypairWithSigner(signMessage: (message: Uint8Array) => Promise<Uint8Array>, index?: number): Promise<ViewKeypair>;
23
+ /**
24
+ * Scan one candidate cipher with a view key.
25
+ *
26
+ * Returns `null` both for a view-tag miss and for a blob that was not encrypted
27
+ * to this key — the expected outcome for nearly every candidate. The shared
28
+ * secret is computed once and reused for the tag check and the open, which is
29
+ * the cheapest correct order for a scan loop: the tag rejects ~255/256
30
+ * candidates for one scalar multiplication and one hash.
31
+ *
32
+ * ⚠ Only decrypts notes encrypted TO `viewPublicKey`. Notes sealed to a wallet
33
+ * Ed25519 key — every note written before the v2 format — will not open here.
34
+ */
35
+ export declare function openCompactNoteWithViewKey(viewSecretKey: Uint8Array, cipher: CompactNoteCipher): {
36
+ blinding: Uint8Array;
37
+ amount: bigint;
38
+ } | null;