@veilo/sdk-core 0.4.0 → 0.5.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 (296) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +286 -1298
  3. package/dist/cjs/accounts/admin.d.ts +84 -0
  4. package/dist/cjs/accounts/admin.js +208 -0
  5. package/dist/cjs/accounts/errors.d.ts +6 -0
  6. package/dist/cjs/accounts/errors.js +98 -0
  7. package/dist/cjs/accounts/index.d.ts +4 -0
  8. package/dist/cjs/accounts/index.js +20 -0
  9. package/dist/cjs/accounts/pdas.d.ts +23 -0
  10. package/dist/cjs/accounts/pdas.js +44 -0
  11. package/dist/cjs/accounts/queries.d.ts +41 -0
  12. package/dist/cjs/accounts/queries.js +95 -0
  13. package/dist/cjs/client.d.ts +2 -407
  14. package/dist/cjs/client.js +6 -938
  15. package/dist/cjs/cloak/client.d.ts +28 -0
  16. package/dist/cjs/cloak/client.js +68 -0
  17. package/dist/cjs/cloak/errors.d.ts +13 -0
  18. package/dist/cjs/cloak/errors.js +25 -0
  19. package/dist/cjs/cloak/helpers.d.ts +6 -0
  20. package/dist/cjs/cloak/helpers.js +35 -0
  21. package/dist/cjs/cloak/index.d.ts +6 -0
  22. package/dist/cjs/cloak/index.js +24 -0
  23. package/dist/cjs/cloak/polling.d.ts +7 -0
  24. package/dist/cjs/cloak/polling.js +66 -0
  25. package/dist/cjs/cloak/transport.d.ts +15 -0
  26. package/dist/cjs/cloak/transport.js +119 -0
  27. package/dist/cjs/cloak/types.d.ts +188 -0
  28. package/dist/cjs/cloak/types.js +5 -0
  29. package/dist/cjs/cloak.d.ts +1 -0
  30. package/dist/cjs/cloak.js +18 -0
  31. package/dist/cjs/compactNote.d.ts +21 -0
  32. package/dist/cjs/compactNote.js +31 -7
  33. package/dist/cjs/index.d.ts +2 -1
  34. package/dist/cjs/index.js +4 -1
  35. package/dist/cjs/notes/encryption.d.ts +41 -0
  36. package/dist/cjs/notes/encryption.js +75 -0
  37. package/dist/cjs/notes/index.d.ts +5 -0
  38. package/dist/cjs/notes/index.js +21 -0
  39. package/dist/cjs/notes/mailbox.d.ts +70 -0
  40. package/dist/cjs/notes/mailbox.js +164 -0
  41. package/dist/cjs/notes/model.d.ts +91 -0
  42. package/dist/cjs/notes/model.js +109 -0
  43. package/dist/cjs/notes/nullifier.d.ts +27 -0
  44. package/dist/cjs/notes/nullifier.js +45 -0
  45. package/dist/cjs/notes/recovery.d.ts +10 -0
  46. package/dist/cjs/notes/recovery.js +31 -0
  47. package/dist/cjs/proof.d.ts +1 -183
  48. package/dist/cjs/proof.js +16 -290
  49. package/dist/cjs/proofs/encoding.d.ts +17 -0
  50. package/dist/cjs/proofs/encoding.js +72 -0
  51. package/dist/cjs/proofs/formatting.d.ts +6 -0
  52. package/dist/cjs/proofs/formatting.js +34 -0
  53. package/dist/cjs/proofs/index.d.ts +5 -0
  54. package/dist/cjs/proofs/index.js +21 -0
  55. package/dist/cjs/proofs/swap.d.ts +87 -0
  56. package/dist/cjs/proofs/swap.js +144 -0
  57. package/dist/cjs/proofs/transaction.d.ts +28 -0
  58. package/dist/cjs/proofs/transaction.js +110 -0
  59. package/dist/cjs/proofs/types.d.ts +70 -0
  60. package/dist/cjs/prover.d.ts +4 -1
  61. package/dist/cjs/prover.js +12 -2
  62. package/dist/cjs/relayer/client.d.ts +61 -0
  63. package/dist/cjs/relayer/client.js +151 -0
  64. package/dist/cjs/relayer/crypto.d.ts +5 -0
  65. package/dist/cjs/relayer/crypto.js +26 -0
  66. package/dist/cjs/relayer/encoding.d.ts +2 -0
  67. package/dist/cjs/relayer/encoding.js +23 -0
  68. package/dist/cjs/relayer/errors.d.ts +7 -0
  69. package/dist/cjs/relayer/errors.js +17 -0
  70. package/dist/cjs/relayer/index.d.ts +3 -0
  71. package/dist/cjs/relayer/index.js +19 -0
  72. package/dist/cjs/relayer/transport.d.ts +17 -0
  73. package/dist/cjs/relayer/transport.js +63 -0
  74. package/dist/{src/relayer.d.ts → cjs/relayer/types.d.ts} +44 -86
  75. package/dist/cjs/relayer/types.js +5 -0
  76. package/dist/cjs/relayer.d.ts +1 -318
  77. package/dist/cjs/relayer.js +15 -254
  78. package/dist/cjs/shield/alt.js +8 -8
  79. package/dist/cjs/shield/errors.js +2 -2
  80. package/dist/cjs/shield/finalize.js +2 -2
  81. package/dist/cjs/shield/ix.d.ts +1 -1
  82. package/dist/cjs/shield/owner.js +9 -8
  83. package/dist/cjs/shield/ports.js +3 -3
  84. package/dist/cjs/shield/preflight.js +3 -3
  85. package/dist/cjs/shield/shield.js +20 -19
  86. package/dist/cjs/shield/types.d.ts +1 -1
  87. package/dist/cjs/transactions/deposit.d.ts +94 -0
  88. package/dist/cjs/transactions/deposit.js +234 -0
  89. package/dist/cjs/transactions/index.d.ts +7 -0
  90. package/dist/cjs/transactions/index.js +26 -0
  91. package/dist/cjs/transactions/swap.d.ts +71 -0
  92. package/dist/cjs/transactions/swap.js +184 -0
  93. package/dist/cjs/transactions/transact.d.ts +34 -0
  94. package/dist/cjs/transactions/transact.js +146 -0
  95. package/dist/cjs/transactions/transfer.d.ts +51 -0
  96. package/dist/cjs/transactions/transfer.js +106 -0
  97. package/dist/cjs/transactions/withdraw.d.ts +52 -0
  98. package/dist/cjs/transactions/withdraw.js +104 -0
  99. package/dist/cjs/utxo.d.ts +1 -235
  100. package/dist/cjs/utxo.js +15 -404
  101. package/dist/esm/accounts/admin.d.ts +84 -0
  102. package/dist/esm/accounts/admin.js +165 -0
  103. package/dist/esm/accounts/errors.d.ts +6 -0
  104. package/dist/esm/accounts/errors.js +95 -0
  105. package/dist/esm/accounts/index.d.ts +4 -0
  106. package/dist/esm/accounts/index.js +4 -0
  107. package/dist/esm/accounts/pdas.d.ts +23 -0
  108. package/dist/esm/accounts/pdas.js +38 -0
  109. package/dist/esm/accounts/queries.d.ts +41 -0
  110. package/dist/esm/accounts/queries.js +88 -0
  111. package/dist/esm/client.d.ts +2 -407
  112. package/dist/esm/client.js +3 -891
  113. package/dist/esm/cloak/client.d.ts +28 -0
  114. package/dist/esm/cloak/client.js +64 -0
  115. package/dist/esm/cloak/errors.d.ts +13 -0
  116. package/dist/esm/cloak/errors.js +21 -0
  117. package/dist/esm/cloak/helpers.d.ts +6 -0
  118. package/dist/esm/cloak/helpers.js +31 -0
  119. package/dist/esm/cloak/index.d.ts +6 -0
  120. package/dist/esm/cloak/index.js +6 -0
  121. package/dist/esm/cloak/polling.d.ts +7 -0
  122. package/dist/esm/cloak/polling.js +63 -0
  123. package/dist/esm/cloak/transport.d.ts +15 -0
  124. package/dist/esm/cloak/transport.js +115 -0
  125. package/dist/esm/cloak/types.d.ts +188 -0
  126. package/dist/esm/cloak/types.js +4 -0
  127. package/dist/esm/cloak.d.ts +1 -0
  128. package/dist/esm/cloak.js +2 -0
  129. package/dist/esm/compactNote.d.ts +21 -0
  130. package/dist/esm/compactNote.js +24 -1
  131. package/dist/esm/index.d.ts +2 -1
  132. package/dist/esm/index.js +3 -1
  133. package/dist/esm/notes/encryption.d.ts +41 -0
  134. package/dist/esm/notes/encryption.js +67 -0
  135. package/dist/esm/notes/index.d.ts +5 -0
  136. package/dist/esm/notes/index.js +5 -0
  137. package/dist/esm/notes/mailbox.d.ts +70 -0
  138. package/dist/esm/notes/mailbox.js +154 -0
  139. package/dist/esm/notes/model.d.ts +91 -0
  140. package/dist/esm/notes/model.js +99 -0
  141. package/dist/esm/notes/nullifier.d.ts +27 -0
  142. package/dist/esm/notes/nullifier.js +40 -0
  143. package/dist/esm/notes/recovery.d.ts +10 -0
  144. package/dist/esm/notes/recovery.js +28 -0
  145. package/dist/esm/proof.d.ts +1 -183
  146. package/dist/esm/proof.js +2 -281
  147. package/dist/esm/proofs/encoding.d.ts +17 -0
  148. package/dist/esm/proofs/encoding.js +68 -0
  149. package/dist/esm/proofs/formatting.d.ts +6 -0
  150. package/dist/esm/proofs/formatting.js +31 -0
  151. package/dist/esm/proofs/index.d.ts +5 -0
  152. package/dist/esm/proofs/index.js +5 -0
  153. package/dist/esm/proofs/swap.d.ts +87 -0
  154. package/dist/esm/proofs/swap.js +138 -0
  155. package/dist/esm/proofs/transaction.d.ts +28 -0
  156. package/dist/esm/proofs/transaction.js +105 -0
  157. package/dist/esm/proofs/types.d.ts +70 -0
  158. package/dist/esm/proofs/types.js +1 -0
  159. package/dist/esm/prover.d.ts +4 -1
  160. package/dist/esm/prover.js +10 -1
  161. package/dist/esm/relayer/client.d.ts +61 -0
  162. package/dist/esm/relayer/client.js +144 -0
  163. package/dist/esm/relayer/crypto.d.ts +5 -0
  164. package/dist/esm/relayer/crypto.js +20 -0
  165. package/dist/esm/relayer/encoding.d.ts +2 -0
  166. package/dist/esm/relayer/encoding.js +19 -0
  167. package/dist/esm/relayer/errors.d.ts +7 -0
  168. package/dist/esm/relayer/errors.js +13 -0
  169. package/dist/esm/relayer/index.d.ts +3 -0
  170. package/dist/esm/relayer/index.js +3 -0
  171. package/dist/esm/relayer/transport.d.ts +17 -0
  172. package/dist/esm/relayer/transport.js +59 -0
  173. package/dist/esm/relayer/types.d.ts +276 -0
  174. package/dist/esm/relayer/types.js +4 -0
  175. package/dist/esm/relayer.d.ts +1 -318
  176. package/dist/esm/relayer.js +2 -249
  177. package/dist/esm/shield/alt.js +1 -1
  178. package/dist/esm/shield/errors.js +1 -1
  179. package/dist/esm/shield/finalize.js +1 -1
  180. package/dist/esm/shield/ix.d.ts +1 -1
  181. package/dist/esm/shield/owner.js +2 -1
  182. package/dist/esm/shield/ports.js +1 -1
  183. package/dist/esm/shield/preflight.js +1 -1
  184. package/dist/esm/shield/shield.js +4 -3
  185. package/dist/esm/shield/types.d.ts +1 -1
  186. package/dist/esm/transactions/deposit.d.ts +94 -0
  187. package/dist/esm/transactions/deposit.js +198 -0
  188. package/dist/esm/transactions/index.d.ts +7 -0
  189. package/dist/esm/transactions/index.js +7 -0
  190. package/dist/esm/transactions/swap.d.ts +71 -0
  191. package/dist/esm/transactions/swap.js +144 -0
  192. package/dist/esm/transactions/transact.d.ts +34 -0
  193. package/dist/esm/transactions/transact.js +110 -0
  194. package/dist/esm/transactions/transfer.d.ts +51 -0
  195. package/dist/esm/transactions/transfer.js +103 -0
  196. package/dist/esm/transactions/withdraw.d.ts +52 -0
  197. package/dist/esm/transactions/withdraw.js +101 -0
  198. package/dist/esm/utxo.d.ts +1 -235
  199. package/dist/esm/utxo.js +2 -382
  200. package/package.json +54 -16
  201. package/SHIELD_INTEGRATION.md +0 -143
  202. package/config.d.ts +0 -2
  203. package/config.js +0 -4
  204. package/dist/src/client.d.ts +0 -407
  205. package/dist/src/client.js +0 -951
  206. package/dist/src/compactNote.d.ts +0 -107
  207. package/dist/src/compactNote.js +0 -167
  208. package/dist/src/config.d.ts +0 -82
  209. package/dist/src/config.js +0 -57
  210. package/dist/src/events.d.ts +0 -77
  211. package/dist/src/events.js +0 -167
  212. package/dist/src/idl/privacy_pool.d.ts +0 -5
  213. package/dist/src/idl/privacy_pool.js +0 -15218
  214. package/dist/src/index.d.ts +0 -16
  215. package/dist/src/index.js +0 -67
  216. package/dist/src/merkle.d.ts +0 -77
  217. package/dist/src/merkle.js +0 -156
  218. package/dist/src/poseidon.d.ts +0 -29
  219. package/dist/src/poseidon.js +0 -100
  220. package/dist/src/program.d.ts +0 -37
  221. package/dist/src/program.js +0 -61
  222. package/dist/src/proof.d.ts +0 -183
  223. package/dist/src/proof.js +0 -292
  224. package/dist/src/prover.d.ts +0 -54
  225. package/dist/src/prover.js +0 -112
  226. package/dist/src/random.d.ts +0 -16
  227. package/dist/src/random.js +0 -28
  228. package/dist/src/relayer.js +0 -257
  229. package/dist/src/retry.d.ts +0 -32
  230. package/dist/src/retry.js +0 -75
  231. package/dist/src/shield/alt.d.ts +0 -87
  232. package/dist/src/shield/alt.js +0 -194
  233. package/dist/src/shield/computeBudget.d.ts +0 -61
  234. package/dist/src/shield/computeBudget.js +0 -64
  235. package/dist/src/shield/errors.d.ts +0 -58
  236. package/dist/src/shield/errors.js +0 -121
  237. package/dist/src/shield/finalize.d.ts +0 -45
  238. package/dist/src/shield/finalize.js +0 -119
  239. package/dist/src/shield/index.d.ts +0 -35
  240. package/dist/src/shield/index.js +0 -68
  241. package/dist/src/shield/ix.d.ts +0 -54
  242. package/dist/src/shield/ix.js +0 -119
  243. package/dist/src/shield/owner.d.ts +0 -36
  244. package/dist/src/shield/owner.js +0 -126
  245. package/dist/src/shield/ports.d.ts +0 -43
  246. package/dist/src/shield/ports.js +0 -153
  247. package/dist/src/shield/preflight.d.ts +0 -30
  248. package/dist/src/shield/preflight.js +0 -154
  249. package/dist/src/shield/shield.d.ts +0 -68
  250. package/dist/src/shield/shield.js +0 -499
  251. package/dist/src/shield/types.d.ts +0 -202
  252. package/dist/src/utxo.d.ts +0 -235
  253. package/dist/src/utxo.js +0 -407
  254. package/dist/tests/compact-note.test.d.ts +0 -1
  255. package/dist/tests/compact-note.test.js +0 -173
  256. package/dist/tests/config.test.d.ts +0 -1
  257. package/dist/tests/config.test.js +0 -102
  258. package/dist/tests/edge-cases.test.d.ts +0 -1
  259. package/dist/tests/edge-cases.test.js +0 -220
  260. package/dist/tests/encryption.test.d.ts +0 -1
  261. package/dist/tests/encryption.test.js +0 -215
  262. package/dist/tests/events.test.d.ts +0 -1
  263. package/dist/tests/events.test.js +0 -78
  264. package/dist/tests/multi-tree.test.d.ts +0 -1
  265. package/dist/tests/multi-tree.test.js +0 -405
  266. package/dist/tests/pda.test.d.ts +0 -1
  267. package/dist/tests/pda.test.js +0 -229
  268. package/dist/tests/poseidon-builder-parity.test.d.ts +0 -1
  269. package/dist/tests/poseidon-builder-parity.test.js +0 -72
  270. package/dist/tests/poseidon.test.d.ts +0 -1
  271. package/dist/tests/poseidon.test.js +0 -142
  272. package/dist/tests/proof.test.d.ts +0 -1
  273. package/dist/tests/proof.test.js +0 -296
  274. package/dist/tests/relayer.test.d.ts +0 -1
  275. package/dist/tests/relayer.test.js +0 -271
  276. package/dist/tests/sdk.integration.test.d.ts +0 -1
  277. package/dist/tests/sdk.integration.test.js +0 -330
  278. package/dist/tests/shield-owner.test.d.ts +0 -1
  279. package/dist/tests/shield-owner.test.js +0 -89
  280. package/dist/tests/shield-preflight.test.d.ts +0 -1
  281. package/dist/tests/shield-preflight.test.js +0 -87
  282. package/dist/tests/shield-realproof.test.d.ts +0 -1
  283. package/dist/tests/shield-realproof.test.js +0 -272
  284. package/dist/tests/shield.test.d.ts +0 -1
  285. package/dist/tests/shield.test.js +0 -403
  286. package/dist/tests/utxo.test.d.ts +0 -1
  287. package/dist/tests/utxo.test.js +0 -140
  288. package/poseidon.d.ts +0 -2
  289. package/poseidon.js +0 -4
  290. package/proof.d.ts +0 -2
  291. package/proof.js +0 -4
  292. package/prover.d.ts +0 -2
  293. package/prover.js +0 -4
  294. package/shield.d.ts +0 -2
  295. package/shield.js +0 -4
  296. /package/dist/{src/shield → cjs/proofs}/types.js +0 -0
@@ -1,72 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("mocha");
4
- const assert_1 = require("assert");
5
- const circomlibjs_1 = require("circomlibjs");
6
- /**
7
- * core-sdk initializes Poseidon with `buildPoseidonReference` (src/poseidon.ts:13).
8
- * All three production `handleDeposit` implementations (extension, wallet-app,
9
- * veilo-dapp) use `buildPoseidon` instead.
10
- *
11
- * Both are circomlibjs and are *supposed* to agree, but nothing in this repo
12
- * proved it. If they ever diverge, core-sdk would produce commitments that no
13
- * production client can locate and no one can ever spend — silent, permanent
14
- * fund loss with no error at any layer.
15
- *
16
- * These vectors are the cheapest possible insurance.
17
- */
18
- describe("Poseidon builder parity (buildPoseidon vs buildPoseidonReference)", function () {
19
- this.timeout(30000);
20
- let fast;
21
- let reference;
22
- before(async () => {
23
- fast = await (0, circomlibjs_1.buildPoseidon)();
24
- reference = await (0, circomlibjs_1.buildPoseidonReference)();
25
- });
26
- const toBigInt = (impl, out) => impl.F.toObject(out);
27
- const VECTORS = [
28
- { name: "arity 1, zero", inputs: [0n] },
29
- { name: "arity 1, one", inputs: [1n] },
30
- { name: "arity 2, zero pair (merkle zero chain seed)", inputs: [0n, 0n] },
31
- { name: "arity 2, small", inputs: [1n, 2n] },
32
- { name: "arity 3, nullifier shape", inputs: [1n, 2n, 3n] },
33
- {
34
- name: "arity 4, commitment shape (amount, pubkey, blinding, mint)",
35
- inputs: [
36
- 1000000000n,
37
- 12345678901234567890123456789012345678901234567890n,
38
- 98765432109876543210987654321098765432109876543210n,
39
- 0n,
40
- ],
41
- },
42
- {
43
- name: "arity 2, near-field-modulus operands",
44
- inputs: [
45
- 21888242871839275222246405745257275088548364400416034343698204186575808495616n,
46
- 21888242871839275222246405745257275088548364400416034343698204186575808495615n,
47
- ],
48
- },
49
- ];
50
- for (const { name, inputs } of VECTORS) {
51
- it(`agrees on ${name}`, () => {
52
- const a = toBigInt(fast, fast(inputs));
53
- const b = toBigInt(reference, reference(inputs));
54
- assert_1.strict.equal(a.toString(), b.toString(), `Poseidon builders DIVERGED on [${inputs.join(", ")}]. ` +
55
- `core-sdk (reference) would produce commitments unspendable by production clients.`);
56
- });
57
- }
58
- it("agrees across a randomized arity-2 sweep", () => {
59
- const FR = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;
60
- for (let i = 0; i < 64; i++) {
61
- const l = BigInt(`0x${Buffer.from(randomBytes(31)).toString("hex")}`) % FR;
62
- const r = BigInt(`0x${Buffer.from(randomBytes(31)).toString("hex")}`) % FR;
63
- assert_1.strict.equal(toBigInt(fast, fast([l, r])).toString(), toBigInt(reference, reference([l, r])).toString(), `Poseidon builders diverged on [${l}, ${r}]`);
64
- }
65
- });
66
- });
67
- function randomBytes(n) {
68
- const out = new Uint8Array(n);
69
- for (let i = 0; i < n; i++)
70
- out[i] = Math.floor(Math.random() * 256);
71
- return out;
72
- }
@@ -1 +0,0 @@
1
- import "mocha";
@@ -1,142 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("mocha");
4
- const assert_1 = require("assert");
5
- const web3_js_1 = require("@solana/web3.js");
6
- const src_1 = require("../src");
7
- describe("Poseidon utilities", function () {
8
- this.timeout(10000);
9
- before(async () => {
10
- await (0, src_1.initPoseidon)();
11
- });
12
- // ---------------------------------------------------------------------------
13
- // bytesToBigIntBE / bigIntToBytesBE
14
- // ---------------------------------------------------------------------------
15
- describe("bytesToBigIntBE", () => {
16
- it("converts all-zero bytes to 0n", () => {
17
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)(new Uint8Array(32)), 0n);
18
- });
19
- it("converts [0x01] to 1n", () => {
20
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)(new Uint8Array([0x01])), 1n);
21
- });
22
- it("converts [0x01, 0x00] to 256n", () => {
23
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)(new Uint8Array([0x01, 0x00])), 256n);
24
- });
25
- it("converts [0xff, 0xff] to 65535n", () => {
26
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)(new Uint8Array([0xff, 0xff])), 65535n);
27
- });
28
- it("interprets bytes as big-endian (first byte is MSB)", () => {
29
- // [0x00, 0x01] should be 1, not 256
30
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)(new Uint8Array([0x00, 0x01])), 1n);
31
- });
32
- });
33
- describe("bigIntToBytesBE", () => {
34
- it("encodes 0n as 32 zero bytes", () => {
35
- const bytes = (0, src_1.bigIntToBytesBE)(0n);
36
- assert_1.strict.equal(bytes.length, 32);
37
- assert_1.strict.ok(bytes.every((b) => b === 0));
38
- });
39
- it("always returns exactly 32 bytes", () => {
40
- assert_1.strict.equal((0, src_1.bigIntToBytesBE)(1n).length, 32);
41
- assert_1.strict.equal((0, src_1.bigIntToBytesBE)(src_1.BN254_FR_MODULUS - 1n).length, 32);
42
- });
43
- it("round-trips with bytesToBigIntBE", () => {
44
- for (const v of [1n, 256n, 65535n, 0xdeadbeefn, src_1.BN254_FR_MODULUS - 1n]) {
45
- assert_1.strict.equal((0, src_1.bytesToBigIntBE)((0, src_1.bigIntToBytesBE)(v)), v);
46
- }
47
- });
48
- it("places the value in the least-significant bytes", () => {
49
- const bytes = (0, src_1.bigIntToBytesBE)(1n);
50
- assert_1.strict.equal(bytes[31], 1); // last byte is 1
51
- assert_1.strict.equal(bytes[0], 0); // first byte is 0
52
- });
53
- });
54
- // ---------------------------------------------------------------------------
55
- // getPoseidon
56
- // ---------------------------------------------------------------------------
57
- describe("getPoseidon", () => {
58
- it("returns a hash function after initPoseidon()", () => {
59
- const p = (0, src_1.getPoseidon)();
60
- assert_1.strict.equal(typeof p, "function");
61
- });
62
- });
63
- // ---------------------------------------------------------------------------
64
- // poseidon1 / poseidon2 / poseidon3 / poseidon4
65
- // ---------------------------------------------------------------------------
66
- describe("poseidon1", () => {
67
- it("returns a bigint in [0, BN254_FR_MODULUS)", () => {
68
- const h = (0, src_1.poseidon1)(42n);
69
- assert_1.strict.ok(h >= 0n && h < src_1.BN254_FR_MODULUS);
70
- });
71
- it("is deterministic", () => {
72
- assert_1.strict.equal((0, src_1.poseidon1)(123n), (0, src_1.poseidon1)(123n));
73
- });
74
- it("produces different outputs for different inputs", () => {
75
- assert_1.strict.notEqual((0, src_1.poseidon1)(1n), (0, src_1.poseidon1)(2n));
76
- });
77
- });
78
- describe("poseidon2", () => {
79
- it("returns a bigint in [0, BN254_FR_MODULUS)", () => {
80
- const h = (0, src_1.poseidon2)(1n, 2n);
81
- assert_1.strict.ok(h >= 0n && h < src_1.BN254_FR_MODULUS);
82
- });
83
- it("is deterministic", () => {
84
- assert_1.strict.equal((0, src_1.poseidon2)(7n, 8n), (0, src_1.poseidon2)(7n, 8n));
85
- });
86
- it("is non-commutative (different output when args swapped)", () => {
87
- const h1 = (0, src_1.poseidon2)(1n, 2n);
88
- const h2 = (0, src_1.poseidon2)(2n, 1n);
89
- assert_1.strict.notEqual(h1, h2);
90
- });
91
- });
92
- describe("poseidon3", () => {
93
- it("returns a bigint in field range", () => {
94
- const h = (0, src_1.poseidon3)(1n, 2n, 3n);
95
- assert_1.strict.ok(h >= 0n && h < src_1.BN254_FR_MODULUS);
96
- });
97
- it("is deterministic", () => {
98
- assert_1.strict.equal((0, src_1.poseidon3)(4n, 5n, 6n), (0, src_1.poseidon3)(4n, 5n, 6n));
99
- });
100
- it("produces different outputs for different third argument", () => {
101
- assert_1.strict.notEqual((0, src_1.poseidon3)(1n, 2n, 0n), (0, src_1.poseidon3)(1n, 2n, 99n));
102
- });
103
- });
104
- describe("poseidon4", () => {
105
- it("returns a bigint in field range", () => {
106
- const h = (0, src_1.poseidon4)(1n, 2n, 3n, 4n);
107
- assert_1.strict.ok(h >= 0n && h < src_1.BN254_FR_MODULUS);
108
- });
109
- it("is deterministic", () => {
110
- assert_1.strict.equal((0, src_1.poseidon4)(5n, 6n, 7n, 8n), (0, src_1.poseidon4)(5n, 6n, 7n, 8n));
111
- });
112
- it("produces different outputs when any argument changes", () => {
113
- const base = (0, src_1.poseidon4)(1n, 2n, 3n, 4n);
114
- assert_1.strict.notEqual((0, src_1.poseidon4)(99n, 2n, 3n, 4n), base);
115
- assert_1.strict.notEqual((0, src_1.poseidon4)(1n, 99n, 3n, 4n), base);
116
- assert_1.strict.notEqual((0, src_1.poseidon4)(1n, 2n, 99n, 4n), base);
117
- assert_1.strict.notEqual((0, src_1.poseidon4)(1n, 2n, 3n, 99n), base);
118
- });
119
- });
120
- // ---------------------------------------------------------------------------
121
- // pubkeyToField
122
- // ---------------------------------------------------------------------------
123
- describe("pubkeyToField", () => {
124
- it("converts NATIVE_SOL_MINT (all zeros) to 0n", () => {
125
- assert_1.strict.equal((0, src_1.pubkeyToField)(src_1.NATIVE_SOL_MINT), 0n);
126
- });
127
- it("returns a value in [0, BN254_FR_MODULUS)", () => {
128
- const randomKey = new web3_js_1.PublicKey("6Cq2rfH7hcreu6Lz4LFoVvZC37Q5uzNq1cStuTnjFdBU");
129
- const field = (0, src_1.pubkeyToField)(randomKey);
130
- assert_1.strict.ok(field >= 0n && field < src_1.BN254_FR_MODULUS);
131
- });
132
- it("is deterministic", () => {
133
- const key = new web3_js_1.PublicKey("6Cq2rfH7hcreu6Lz4LFoVvZC37Q5uzNq1cStuTnjFdBU");
134
- assert_1.strict.equal((0, src_1.pubkeyToField)(key), (0, src_1.pubkeyToField)(key));
135
- });
136
- it("produces different values for different keys", () => {
137
- const key1 = new web3_js_1.PublicKey("6Cq2rfH7hcreu6Lz4LFoVvZC37Q5uzNq1cStuTnjFdBU");
138
- const key2 = new web3_js_1.PublicKey("So11111111111111111111111111111111111111112");
139
- assert_1.strict.notEqual((0, src_1.pubkeyToField)(key1), (0, src_1.pubkeyToField)(key2));
140
- });
141
- });
142
- });
@@ -1 +0,0 @@
1
- import "mocha";
@@ -1,296 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("mocha");
4
- const assert_1 = require("assert");
5
- const web3_js_1 = require("@solana/web3.js");
6
- const src_1 = require("../src");
7
- // A minimal well-formed Groth16 proof with non-trivial field values.
8
- const MOCK_PROOF = {
9
- pi_a: ["100", "200", "0"],
10
- pi_b: [
11
- ["300", "400"],
12
- ["500", "600"],
13
- ["0", "0"],
14
- ],
15
- pi_c: ["700", "800", "0"],
16
- protocol: "groth16",
17
- curve: "bn128",
18
- };
19
- describe("Proof helpers", function () {
20
- this.timeout(10000);
21
- before(async () => {
22
- await (0, src_1.initPoseidon)();
23
- });
24
- // ---------------------------------------------------------------------------
25
- // i64ToField
26
- // ---------------------------------------------------------------------------
27
- describe("i64ToField", () => {
28
- it("returns 0n for 0n", () => {
29
- assert_1.strict.equal((0, src_1.i64ToField)(0n), 0n);
30
- });
31
- it("returns positive values unchanged (within field)", () => {
32
- assert_1.strict.equal((0, src_1.i64ToField)(1000n), 1000n);
33
- assert_1.strict.equal((0, src_1.i64ToField)(1000000n), 1000000n);
34
- });
35
- it("wraps negative values via modular arithmetic", () => {
36
- assert_1.strict.equal((0, src_1.i64ToField)(-1n), src_1.BN254_FR_MODULUS - 1n);
37
- assert_1.strict.equal((0, src_1.i64ToField)(-100n), src_1.BN254_FR_MODULUS - 100n);
38
- });
39
- it("maps -1n to a value distinguishable from positive 1n", () => {
40
- assert_1.strict.notEqual((0, src_1.i64ToField)(-1n), (0, src_1.i64ToField)(1n));
41
- });
42
- });
43
- // ---------------------------------------------------------------------------
44
- // computeExtDataHash
45
- // ---------------------------------------------------------------------------
46
- describe("computeExtDataHash", () => {
47
- const recipient = web3_js_1.Keypair.generate().publicKey;
48
- const relayer = web3_js_1.Keypair.generate().publicKey;
49
- const claimant = web3_js_1.Keypair.generate().publicKey;
50
- it("returns exactly 32 bytes", () => {
51
- const extData = { recipient, relayer, fee: 50n, refund: 0n, claimant };
52
- assert_1.strict.equal((0, src_1.computeExtDataHash)(extData).length, 32);
53
- });
54
- it("is deterministic", () => {
55
- const extData = { recipient, relayer, fee: 50n, refund: 0n, claimant };
56
- const h1 = (0, src_1.computeExtDataHash)(extData);
57
- const h2 = (0, src_1.computeExtDataHash)(extData);
58
- assert_1.strict.equal(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
59
- });
60
- it("produces different hashes for different recipients", () => {
61
- const extData1 = { recipient, relayer, fee: 50n, refund: 0n, claimant };
62
- const extData2 = {
63
- recipient: web3_js_1.Keypair.generate().publicKey,
64
- relayer,
65
- fee: 50n,
66
- refund: 0n,
67
- claimant,
68
- };
69
- assert_1.strict.notEqual(Buffer.compare(Buffer.from((0, src_1.computeExtDataHash)(extData1)), Buffer.from((0, src_1.computeExtDataHash)(extData2))), 0);
70
- });
71
- it("produces different hashes for different fees", () => {
72
- const extData1 = { recipient, relayer, fee: 0n, refund: 0n, claimant };
73
- const extData2 = { recipient, relayer, fee: 999n, refund: 0n, claimant };
74
- assert_1.strict.notEqual(Buffer.compare(Buffer.from((0, src_1.computeExtDataHash)(extData1)), Buffer.from((0, src_1.computeExtDataHash)(extData2))), 0);
75
- });
76
- });
77
- // ---------------------------------------------------------------------------
78
- // packProofToBytes
79
- // ---------------------------------------------------------------------------
80
- describe("packProofToBytes", () => {
81
- it("returns exactly 256 bytes", () => {
82
- const bytes = (0, src_1.packProofToBytes)(MOCK_PROOF);
83
- assert_1.strict.equal(bytes.length, 256);
84
- });
85
- it("is deterministic", () => {
86
- const b1 = (0, src_1.packProofToBytes)(MOCK_PROOF);
87
- const b2 = (0, src_1.packProofToBytes)(MOCK_PROOF);
88
- assert_1.strict.equal(Buffer.compare(Buffer.from(b1), Buffer.from(b2)), 0);
89
- });
90
- it("produces different output for different proof values", () => {
91
- const otherProof = {
92
- ...MOCK_PROOF,
93
- pi_a: ["999", "888", "0"],
94
- };
95
- const b1 = (0, src_1.packProofToBytes)(MOCK_PROOF);
96
- const b2 = (0, src_1.packProofToBytes)(otherProof);
97
- assert_1.strict.notEqual(Buffer.compare(Buffer.from(b1), Buffer.from(b2)), 0);
98
- });
99
- });
100
- // ---------------------------------------------------------------------------
101
- // encodeSnarkjsProofToTransactionProof
102
- // ---------------------------------------------------------------------------
103
- describe("encodeSnarkjsProofToTransactionProof", () => {
104
- it("produces proofA of 64 bytes", () => {
105
- const p = (0, src_1.encodeSnarkjsProofToTransactionProof)(MOCK_PROOF);
106
- assert_1.strict.equal(p.proofA.length, 64);
107
- });
108
- it("produces proofB of 128 bytes", () => {
109
- const p = (0, src_1.encodeSnarkjsProofToTransactionProof)(MOCK_PROOF);
110
- assert_1.strict.equal(p.proofB.length, 128);
111
- });
112
- it("produces proofC of 64 bytes", () => {
113
- const p = (0, src_1.encodeSnarkjsProofToTransactionProof)(MOCK_PROOF);
114
- assert_1.strict.equal(p.proofC.length, 64);
115
- });
116
- it("all values are numbers (u8)", () => {
117
- const p = (0, src_1.encodeSnarkjsProofToTransactionProof)(MOCK_PROOF);
118
- const all = [...p.proofA, ...p.proofB, ...p.proofC];
119
- assert_1.strict.ok(all.every((b) => typeof b === "number" && b >= 0 && b <= 255));
120
- });
121
- });
122
- // ---------------------------------------------------------------------------
123
- // computeSwapParamsHash
124
- // ---------------------------------------------------------------------------
125
- describe("computeSwapParamsHash", () => {
126
- const sourceMint = new web3_js_1.PublicKey("So11111111111111111111111111111111111111112");
127
- const destMint = new web3_js_1.PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
128
- it("returns exactly 32 bytes", () => {
129
- const hash = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
130
- assert_1.strict.equal(hash.length, 32);
131
- });
132
- it("is deterministic", () => {
133
- const h1 = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
134
- const h2 = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
135
- assert_1.strict.equal(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
136
- });
137
- it("produces different hash for different source mints", () => {
138
- const h1 = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
139
- const h2 = (0, src_1.computeSwapParamsHash)(src_1.NATIVE_SOL_MINT, destMint, 1000n, 0n);
140
- assert_1.strict.notEqual(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
141
- });
142
- it("produces different hash for different minAmountOut", () => {
143
- const h1 = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
144
- const h2 = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 9999n, 0n);
145
- assert_1.strict.notEqual(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
146
- });
147
- it("accepts optional destAmount and produces different hash when provided", () => {
148
- const withoutDest = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n);
149
- const withDest = (0, src_1.computeSwapParamsHash)(sourceMint, destMint, 1000n, 0n, 800n);
150
- assert_1.strict.notEqual(Buffer.compare(Buffer.from(withoutDest), Buffer.from(withDest)), 0);
151
- });
152
- });
153
- // ---------------------------------------------------------------------------
154
- // computeSwapDataHash
155
- // ---------------------------------------------------------------------------
156
- describe("computeSwapDataHash", () => {
157
- it("returns exactly 32 bytes", () => {
158
- const hash = (0, src_1.computeSwapDataHash)(new Uint8Array([1, 2, 3, 4]));
159
- assert_1.strict.equal(hash.length, 32);
160
- });
161
- it("is deterministic", () => {
162
- const data = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);
163
- const h1 = (0, src_1.computeSwapDataHash)(data);
164
- const h2 = (0, src_1.computeSwapDataHash)(data);
165
- assert_1.strict.equal(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
166
- });
167
- it("accepts a Buffer as input", () => {
168
- const buf = Buffer.from([1, 2, 3]);
169
- const hash = (0, src_1.computeSwapDataHash)(buf);
170
- assert_1.strict.equal(hash.length, 32);
171
- });
172
- it("produces different hashes for different inputs", () => {
173
- const h1 = (0, src_1.computeSwapDataHash)(new Uint8Array([1]));
174
- const h2 = (0, src_1.computeSwapDataHash)(new Uint8Array([2]));
175
- assert_1.strict.notEqual(Buffer.compare(Buffer.from(h1), Buffer.from(h2)), 0);
176
- });
177
- });
178
- // ---------------------------------------------------------------------------
179
- // prepareTransactionInputs + formatInputsForSnarkjs
180
- // ---------------------------------------------------------------------------
181
- describe("prepareTransactionInputs", () => {
182
- function makeInputs() {
183
- const tree = new src_1.MerkleTree(4);
184
- const kp = (0, src_1.generateKeypair)();
185
- const utxo0 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
186
- const utxo1 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
187
- const { index: idx0 } = tree.insert(utxo0.commitment);
188
- const { index: idx1 } = tree.insert(utxo1.commitment);
189
- const path0 = tree.getPath(idx0);
190
- const path1 = tree.getPath(idx1);
191
- const input0 = {
192
- ...utxo0,
193
- pathIndex: idx0,
194
- pathElements: path0.path,
195
- privateKey: kp.privateKey,
196
- };
197
- const input1 = {
198
- ...utxo1,
199
- pathIndex: idx1,
200
- pathElements: path1.path,
201
- privateKey: kp.privateKey,
202
- };
203
- const out0 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
204
- const out1 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
205
- const recipient = web3_js_1.Keypair.generate().publicKey;
206
- const relayer = web3_js_1.Keypair.generate().publicKey;
207
- const extData = {
208
- recipient,
209
- relayer,
210
- fee: 0n,
211
- refund: 0n,
212
- claimant: web3_js_1.PublicKey.default,
213
- };
214
- return (0, src_1.prepareTransactionInputs)({
215
- inputUTXOs: [input0, input1],
216
- outputUTXOs: [out0, out1],
217
- root: tree.root,
218
- publicAmount: 0n,
219
- extData,
220
- mintAddress: src_1.NATIVE_SOL_MINT,
221
- });
222
- }
223
- it("returns 32-byte extDataHash", () => {
224
- const inputs = makeInputs();
225
- assert_1.strict.equal(inputs.extDataHash.length, 32);
226
- });
227
- it("returns two 32-byte nullifiers", () => {
228
- const inputs = makeInputs();
229
- assert_1.strict.equal(inputs.inputNullifiers[0].length, 32);
230
- assert_1.strict.equal(inputs.inputNullifiers[1].length, 32);
231
- });
232
- it("returns two 32-byte output commitments", () => {
233
- const inputs = makeInputs();
234
- assert_1.strict.equal(inputs.outputCommitments[0].length, 32);
235
- assert_1.strict.equal(inputs.outputCommitments[1].length, 32);
236
- });
237
- it("populates inAmount from input UTXOs", () => {
238
- const inputs = makeInputs();
239
- assert_1.strict.equal(inputs.inAmount[0], 0n);
240
- assert_1.strict.equal(inputs.inAmount[1], 0n);
241
- });
242
- it("inPathElements has depth-many entries per input", () => {
243
- const inputs = makeInputs();
244
- assert_1.strict.equal(inputs.inPathElements[0].length, 4);
245
- assert_1.strict.equal(inputs.inPathElements[1].length, 4);
246
- });
247
- });
248
- describe("formatInputsForSnarkjs", () => {
249
- it("converts all fields to strings or string arrays", () => {
250
- const tree = new src_1.MerkleTree(4);
251
- const kp = (0, src_1.generateKeypair)();
252
- const utxo0 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
253
- const utxo1 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
254
- const { index: idx0 } = tree.insert(utxo0.commitment);
255
- const { index: idx1 } = tree.insert(utxo1.commitment);
256
- const path0 = tree.getPath(idx0);
257
- const path1 = tree.getPath(idx1);
258
- const input0 = {
259
- ...utxo0,
260
- pathIndex: idx0,
261
- pathElements: path0.path,
262
- privateKey: kp.privateKey,
263
- };
264
- const input1 = {
265
- ...utxo1,
266
- pathIndex: idx1,
267
- pathElements: path1.path,
268
- privateKey: kp.privateKey,
269
- };
270
- const out0 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
271
- const out1 = (0, src_1.createOwnedZeroUTXO)(kp.privateKey, src_1.NATIVE_SOL_MINT);
272
- const extData = {
273
- recipient: web3_js_1.Keypair.generate().publicKey,
274
- relayer: web3_js_1.Keypair.generate().publicKey,
275
- fee: 0n,
276
- refund: 0n,
277
- claimant: web3_js_1.PublicKey.default,
278
- };
279
- const circuitInputs = (0, src_1.prepareTransactionInputs)({
280
- inputUTXOs: [input0, input1],
281
- outputUTXOs: [out0, out1],
282
- root: tree.root,
283
- publicAmount: 0n,
284
- extData,
285
- mintAddress: src_1.NATIVE_SOL_MINT,
286
- });
287
- const formatted = (0, src_1.formatInputsForSnarkjs)(circuitInputs);
288
- assert_1.strict.equal(typeof formatted.root, "string");
289
- assert_1.strict.equal(typeof formatted.publicAmount, "string");
290
- assert_1.strict.ok(Array.isArray(formatted.inputNullifier));
291
- assert_1.strict.ok(formatted.inputNullifier.every((v) => typeof v === "string"));
292
- assert_1.strict.ok(Array.isArray(formatted.inAmount));
293
- assert_1.strict.ok(formatted.inAmount.every((v) => typeof v === "string"));
294
- });
295
- });
296
- });
@@ -1 +0,0 @@
1
- import "mocha";