@veilo/sdk-core 0.1.17 → 0.4.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 (218) hide show
  1. package/README.md +1296 -272
  2. package/SHIELD_INTEGRATION.md +143 -0
  3. package/config.d.ts +2 -0
  4. package/config.js +4 -0
  5. package/dist/cjs/client.d.ts +407 -0
  6. package/dist/cjs/client.js +951 -0
  7. package/dist/cjs/compactNote.d.ts +107 -0
  8. package/dist/cjs/compactNote.js +167 -0
  9. package/dist/cjs/config.d.ts +82 -0
  10. package/dist/cjs/config.js +57 -0
  11. package/dist/cjs/events.d.ts +77 -0
  12. package/dist/cjs/events.js +167 -0
  13. package/dist/cjs/idl/privacy_pool.d.ts +5 -0
  14. package/dist/cjs/idl/privacy_pool.js +15218 -0
  15. package/dist/cjs/idl/privacy_pool.json +10313 -0
  16. package/dist/cjs/index.d.ts +16 -0
  17. package/dist/cjs/index.js +67 -0
  18. package/dist/cjs/merkle.d.ts +77 -0
  19. package/dist/cjs/merkle.js +156 -0
  20. package/dist/cjs/poseidon.d.ts +29 -0
  21. package/dist/cjs/poseidon.js +100 -0
  22. package/dist/cjs/program.d.ts +37 -0
  23. package/dist/cjs/program.js +61 -0
  24. package/dist/cjs/proof.d.ts +183 -0
  25. package/dist/cjs/proof.js +292 -0
  26. package/dist/cjs/prover.d.ts +54 -0
  27. package/dist/cjs/prover.js +112 -0
  28. package/dist/cjs/random.d.ts +16 -0
  29. package/dist/cjs/random.js +28 -0
  30. package/dist/cjs/relayer.d.ts +318 -0
  31. package/dist/cjs/relayer.js +257 -0
  32. package/dist/cjs/retry.d.ts +32 -0
  33. package/dist/cjs/retry.js +75 -0
  34. package/dist/cjs/shield/alt.d.ts +87 -0
  35. package/dist/cjs/shield/alt.js +194 -0
  36. package/dist/cjs/shield/computeBudget.d.ts +61 -0
  37. package/dist/cjs/shield/computeBudget.js +64 -0
  38. package/dist/cjs/shield/errors.d.ts +58 -0
  39. package/dist/cjs/shield/errors.js +121 -0
  40. package/dist/cjs/shield/finalize.d.ts +45 -0
  41. package/dist/cjs/shield/finalize.js +119 -0
  42. package/dist/cjs/shield/index.d.ts +35 -0
  43. package/dist/cjs/shield/index.js +68 -0
  44. package/dist/cjs/shield/ix.d.ts +54 -0
  45. package/dist/cjs/shield/ix.js +119 -0
  46. package/dist/cjs/shield/owner.d.ts +36 -0
  47. package/dist/cjs/shield/owner.js +126 -0
  48. package/dist/cjs/shield/ports.d.ts +43 -0
  49. package/dist/cjs/shield/ports.js +153 -0
  50. package/dist/cjs/shield/preflight.d.ts +30 -0
  51. package/dist/cjs/shield/preflight.js +154 -0
  52. package/dist/cjs/shield/shield.d.ts +68 -0
  53. package/dist/cjs/shield/shield.js +499 -0
  54. package/dist/cjs/shield/types.d.ts +202 -0
  55. package/dist/cjs/shield/types.js +2 -0
  56. package/dist/cjs/utxo.d.ts +235 -0
  57. package/dist/cjs/utxo.js +407 -0
  58. package/dist/esm/client.d.ts +407 -0
  59. package/dist/esm/client.js +891 -0
  60. package/dist/esm/compactNote.d.ts +107 -0
  61. package/dist/esm/compactNote.js +156 -0
  62. package/dist/esm/config.d.ts +82 -0
  63. package/dist/esm/config.js +51 -0
  64. package/dist/esm/events.d.ts +77 -0
  65. package/dist/esm/events.js +129 -0
  66. package/dist/esm/idl/privacy_pool.d.ts +5 -0
  67. package/dist/esm/idl/privacy_pool.js +15216 -0
  68. package/dist/esm/idl/privacy_pool.json +10313 -0
  69. package/dist/esm/index.d.ts +16 -0
  70. package/dist/esm/index.js +29 -0
  71. package/dist/esm/merkle.d.ts +77 -0
  72. package/dist/esm/merkle.js +151 -0
  73. package/dist/esm/package.json +1 -0
  74. package/dist/esm/poseidon.d.ts +29 -0
  75. package/dist/esm/poseidon.js +87 -0
  76. package/dist/esm/program.d.ts +37 -0
  77. package/dist/esm/program.js +53 -0
  78. package/dist/esm/proof.d.ts +183 -0
  79. package/dist/esm/proof.js +281 -0
  80. package/dist/esm/prover.d.ts +54 -0
  81. package/dist/esm/prover.js +75 -0
  82. package/dist/esm/random.d.ts +16 -0
  83. package/dist/esm/random.js +21 -0
  84. package/dist/esm/relayer.d.ts +318 -0
  85. package/dist/esm/relayer.js +249 -0
  86. package/dist/esm/retry.d.ts +32 -0
  87. package/dist/esm/retry.js +71 -0
  88. package/dist/esm/shield/alt.d.ts +87 -0
  89. package/dist/esm/shield/alt.js +186 -0
  90. package/dist/esm/shield/computeBudget.d.ts +61 -0
  91. package/dist/esm/shield/computeBudget.js +61 -0
  92. package/dist/esm/shield/errors.d.ts +58 -0
  93. package/dist/esm/shield/errors.js +115 -0
  94. package/dist/esm/shield/finalize.d.ts +45 -0
  95. package/dist/esm/shield/finalize.js +83 -0
  96. package/dist/esm/shield/index.d.ts +35 -0
  97. package/dist/esm/shield/index.js +32 -0
  98. package/dist/esm/shield/ix.d.ts +54 -0
  99. package/dist/esm/shield/ix.js +82 -0
  100. package/dist/esm/shield/owner.d.ts +36 -0
  101. package/dist/esm/shield/owner.js +122 -0
  102. package/dist/esm/shield/ports.d.ts +43 -0
  103. package/dist/esm/shield/ports.js +147 -0
  104. package/dist/esm/shield/preflight.d.ts +30 -0
  105. package/dist/esm/shield/preflight.js +151 -0
  106. package/dist/esm/shield/shield.d.ts +68 -0
  107. package/dist/esm/shield/shield.js +492 -0
  108. package/dist/esm/shield/types.d.ts +202 -0
  109. package/dist/esm/shield/types.js +1 -0
  110. package/dist/esm/utxo.d.ts +235 -0
  111. package/dist/esm/utxo.js +382 -0
  112. package/dist/src/client.d.ts +407 -0
  113. package/dist/src/client.js +951 -0
  114. package/dist/src/compactNote.d.ts +107 -0
  115. package/dist/src/compactNote.js +167 -0
  116. package/dist/src/config.d.ts +82 -0
  117. package/dist/src/config.js +57 -0
  118. package/dist/src/events.d.ts +77 -0
  119. package/dist/src/events.js +167 -0
  120. package/dist/src/idl/privacy_pool.d.ts +5 -0
  121. package/dist/src/idl/privacy_pool.js +15218 -0
  122. package/dist/src/index.d.ts +16 -0
  123. package/dist/src/index.js +67 -0
  124. package/dist/src/merkle.d.ts +77 -0
  125. package/dist/src/merkle.js +156 -0
  126. package/dist/src/poseidon.d.ts +29 -0
  127. package/dist/src/poseidon.js +100 -0
  128. package/dist/src/program.d.ts +37 -0
  129. package/dist/src/program.js +61 -0
  130. package/dist/src/proof.d.ts +183 -0
  131. package/dist/src/proof.js +292 -0
  132. package/dist/src/prover.d.ts +54 -0
  133. package/dist/src/prover.js +112 -0
  134. package/dist/src/random.d.ts +16 -0
  135. package/dist/src/random.js +28 -0
  136. package/dist/src/relayer.d.ts +318 -0
  137. package/dist/src/relayer.js +257 -0
  138. package/dist/src/retry.d.ts +32 -0
  139. package/dist/src/retry.js +75 -0
  140. package/dist/src/shield/alt.d.ts +87 -0
  141. package/dist/src/shield/alt.js +194 -0
  142. package/dist/src/shield/computeBudget.d.ts +61 -0
  143. package/dist/src/shield/computeBudget.js +64 -0
  144. package/dist/src/shield/errors.d.ts +58 -0
  145. package/dist/src/shield/errors.js +121 -0
  146. package/dist/src/shield/finalize.d.ts +45 -0
  147. package/dist/src/shield/finalize.js +119 -0
  148. package/dist/src/shield/index.d.ts +35 -0
  149. package/dist/src/shield/index.js +68 -0
  150. package/dist/src/shield/ix.d.ts +54 -0
  151. package/dist/src/shield/ix.js +119 -0
  152. package/dist/src/shield/owner.d.ts +36 -0
  153. package/dist/src/shield/owner.js +126 -0
  154. package/dist/src/shield/ports.d.ts +43 -0
  155. package/dist/src/shield/ports.js +153 -0
  156. package/dist/src/shield/preflight.d.ts +30 -0
  157. package/dist/src/shield/preflight.js +154 -0
  158. package/dist/src/shield/shield.d.ts +68 -0
  159. package/dist/src/shield/shield.js +499 -0
  160. package/dist/src/shield/types.d.ts +202 -0
  161. package/dist/src/shield/types.js +2 -0
  162. package/dist/src/utxo.d.ts +235 -0
  163. package/dist/src/utxo.js +407 -0
  164. package/dist/tests/compact-note.test.d.ts +1 -0
  165. package/dist/tests/compact-note.test.js +173 -0
  166. package/dist/tests/config.test.d.ts +1 -0
  167. package/dist/tests/config.test.js +102 -0
  168. package/dist/tests/edge-cases.test.d.ts +1 -0
  169. package/dist/tests/edge-cases.test.js +220 -0
  170. package/dist/tests/encryption.test.d.ts +1 -0
  171. package/dist/tests/encryption.test.js +215 -0
  172. package/dist/tests/events.test.d.ts +1 -0
  173. package/dist/tests/events.test.js +78 -0
  174. package/dist/tests/multi-tree.test.d.ts +1 -0
  175. package/dist/tests/multi-tree.test.js +405 -0
  176. package/dist/tests/pda.test.d.ts +1 -0
  177. package/dist/tests/pda.test.js +229 -0
  178. package/dist/tests/poseidon-builder-parity.test.d.ts +1 -0
  179. package/dist/tests/poseidon-builder-parity.test.js +72 -0
  180. package/dist/tests/poseidon.test.d.ts +1 -0
  181. package/dist/tests/poseidon.test.js +142 -0
  182. package/dist/tests/proof.test.d.ts +1 -0
  183. package/dist/tests/proof.test.js +296 -0
  184. package/dist/tests/relayer.test.d.ts +1 -0
  185. package/dist/tests/relayer.test.js +271 -0
  186. package/dist/tests/sdk.integration.test.d.ts +1 -0
  187. package/dist/tests/sdk.integration.test.js +330 -0
  188. package/dist/tests/shield-owner.test.d.ts +1 -0
  189. package/dist/tests/shield-owner.test.js +89 -0
  190. package/dist/tests/shield-preflight.test.d.ts +1 -0
  191. package/dist/tests/shield-preflight.test.js +87 -0
  192. package/dist/tests/shield-realproof.test.d.ts +1 -0
  193. package/dist/tests/shield-realproof.test.js +272 -0
  194. package/dist/tests/shield.test.d.ts +1 -0
  195. package/dist/tests/shield.test.js +403 -0
  196. package/dist/tests/utxo.test.d.ts +1 -0
  197. package/dist/tests/utxo.test.js +140 -0
  198. package/package.json +105 -11
  199. package/poseidon.d.ts +2 -0
  200. package/poseidon.js +4 -0
  201. package/proof.d.ts +2 -0
  202. package/proof.js +4 -0
  203. package/prover.d.ts +2 -0
  204. package/prover.js +4 -0
  205. package/shield.d.ts +2 -0
  206. package/shield.js +4 -0
  207. package/src/client.ts +0 -352
  208. package/src/config.ts +0 -13
  209. package/src/index.ts +0 -6
  210. package/src/merkle.ts +0 -178
  211. package/src/note.ts +0 -193
  212. package/src/poseidon.ts +0 -62
  213. package/src/proof.ts +0 -170
  214. package/test/script.js +0 -0
  215. package/test-tsconfig.json +0 -19
  216. package/tests/note.test.ts +0 -50
  217. package/tests/sdk.integration.test.ts +0 -210
  218. package/tsconfig.json +0 -18
@@ -0,0 +1,143 @@
1
+ # Wallet-agnostic shielding
2
+
3
+ `shield()` builds an unsigned Solana v0 transaction that moves funds from any
4
+ signing wallet into Veilo's privacy pool. The wallet that pays and the Veilo
5
+ account that owns the resulting private note are independent.
6
+
7
+ This is a build API, like Jupiter's transaction APIs. The SDK proves, encrypts,
8
+ and assembles. Your application asks its wallet to sign, submits the signed
9
+ bytes, confirms them, and handles retry.
10
+
11
+ ## Security model
12
+
13
+ - `signer.publicKey` is the transaction fee payer and public funding source.
14
+ - `owner.veiloPublicKey` controls spending the private note.
15
+ - `owner.noteViewingKey` controls detecting and decrypting the note during a
16
+ chain scan.
17
+ - The SDK never receives a signer secret key.
18
+ - The compact note cipher is embedded in the on-chain instruction, so note
19
+ recovery does not depend on a webhook or a later relayer callback.
20
+
21
+ The two owner keys must belong to the same Veilo account. If they do not, the
22
+ note is spendable but invisible to its owner. Always use `resolveShieldOwner()`;
23
+ construct an owner manually only when you can prove the pairing yourself.
24
+
25
+ ## Complete flow
26
+
27
+ ```ts
28
+ import { Connection, PublicKey } from "@solana/web3.js";
29
+ import {
30
+ createTransactionProver,
31
+ finalizeShield,
32
+ mapShieldError,
33
+ rebuild,
34
+ resolveShieldOwner,
35
+ shield,
36
+ } from "@veilo/sdk-core";
37
+
38
+ const connection = new Connection(RPC_URL, "confirmed");
39
+ const owner = await resolveShieldOwner({ username: "alice" });
40
+ const prover = createTransactionProver({
41
+ wasmPath: TRANSACTION_WASM_URL,
42
+ zkeyPath: TRANSACTION_ZKEY_URL,
43
+ });
44
+
45
+ let result = await shield({
46
+ connection,
47
+ amount: 5_000_000n, // base units
48
+ mint: new PublicKey(USDC_MINT),
49
+ owner,
50
+ signer: { publicKey: wallet.publicKey },
51
+ prover,
52
+ });
53
+
54
+ async function signAndSubmit() {
55
+ const signed = await wallet.signTransaction(result.transaction);
56
+ const signature = await connection.sendRawTransaction(signed.serialize(), {
57
+ maxRetries: 0,
58
+ });
59
+
60
+ const confirmation = await connection.confirmTransaction(
61
+ {
62
+ signature,
63
+ blockhash: result.blockhash,
64
+ lastValidBlockHeight: result.lastValidBlockHeight,
65
+ },
66
+ "confirmed",
67
+ );
68
+ if (confirmation.value.err) throw confirmation.value.err;
69
+ return signature;
70
+ }
71
+
72
+ let signature: string;
73
+ try {
74
+ signature = await signAndSubmit();
75
+ } catch (cause) {
76
+ const error = mapShieldError(cause);
77
+ if (error.retryable !== "rebuild") throw error;
78
+
79
+ // Reuses the proof and note; only the blockhash and deadline are refreshed.
80
+ result = await rebuild(result, { connection });
81
+ signature = await signAndSubmit(); // the rebuilt transaction needs a new signature
82
+ }
83
+
84
+ const finalized = await finalizeShield({
85
+ connection,
86
+ signature,
87
+ note: result.note,
88
+ owner,
89
+ commitment: "finalized",
90
+ });
91
+
92
+ console.log(finalized.leafIndex, finalized.treeId);
93
+ ```
94
+
95
+ `predictedLeafIndex` is informational only. Concurrent deposits can move the
96
+ actual index before your transaction lands. Persist `finalized.leafIndex`, which
97
+ comes from this transaction's `CommitmentEvent`.
98
+
99
+ ## Preflight and wallet UX
100
+
101
+ Preflight runs before the 10–30 second proof and checks pool limits, token
102
+ ownership and balance, ATA state, and the SOL needed by the transaction. If an
103
+ SPL token account has any delegate—even with a delegated amount of zero—the
104
+ program rejects it. `TOKEN_ACCOUNT_DELEGATED` includes a `remedy` with the
105
+ `Revoke` instruction the wallet can sign before retrying.
106
+
107
+ The wallet may describe the Veilo instruction as an unknown program. Show the
108
+ amount and destination in your own review screen before opening the wallet so
109
+ the signer can verify what it is authorizing.
110
+
111
+ ## SOL requirements
112
+
113
+ The signer pays:
114
+
115
+ - the amount itself for native SOL shields;
116
+ - the normal transaction and priority fees; and
117
+ - rent for two nullifier-marker accounts (about 0.00192 SOL at current rent).
118
+
119
+ The program fixes the marker payer to the signer. A zero-SOL wallet therefore
120
+ cannot use this path, even for an SPL token shield and even if another service
121
+ would sponsor the transaction fee. This API does not provide a gasless mode.
122
+
123
+ ## Retry decisions
124
+
125
+ Use `mapShieldError()` and branch on `retryable`:
126
+
127
+ | Error | Retry class | Action |
128
+ |---|---|---|
129
+ | `BLOCKHASH_EXPIRED`, `DEADLINE_EXPIRED` | `rebuild` | Call `rebuild()`, sign again, submit again. |
130
+ | `ROOT_STALE` | `reshield` | Call `shield()` again; a fresh proof is required. |
131
+ | `NULLIFIER_COLLISION` | `none` | Treat as already submitted and check the original signature. |
132
+ | Preflight and configuration errors | `none` | Correct the stated condition before retrying. |
133
+
134
+ `ShieldProofCache` is public and JSON-serializable. `ShieldNote` is secret. Do
135
+ not store or transmit the note in the clear, and do not bundle it with the proof
136
+ cache merely because the cache is safe to move between processes.
137
+
138
+ ## Optional mailbox delivery
139
+
140
+ `finalizeShield()` returns an encrypted `blob` suitable for `/notes/save`.
141
+ Supplying `recipientWalletPublicKey` gives faster mailbox delivery and push
142
+ notifications, but records a sender-to-recipient association at the relayer.
143
+ Omitting it keeps discovery chain-only and preserves that privacy boundary.
package/config.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ // Stub for legacy resolvers — see config.js
2
+ export * from "./dist/cjs/config.js";
package/config.js ADDED
@@ -0,0 +1,4 @@
1
+ // Stub for legacy resolvers (TypeScript moduleResolution: "node", older bundlers)
2
+ // that ignore the "exports" map. Modern resolvers use "./config" from package.json
3
+ // exports and never reach this file.
4
+ module.exports = require("./dist/cjs/config.js");
@@ -0,0 +1,407 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import type { Program, Idl } from "@coral-xyz/anchor";
3
+ import { PublicKey, Transaction, Keypair } from "@solana/web3.js";
4
+ import { TransactionProofStruct, TransactionProofBuilder, ExtData } from "./proof.js";
5
+ import { SerializedUTXO, InputUTXO } from "./utxo.js";
6
+ import { MerkleTree } from "./merkle.js";
7
+ import { PrivacyConfigAccount } from "./config.js";
8
+ /**
9
+ * Get pool PDAs for a given mint address.
10
+ * Note: All seeds use "v3" suffix.
11
+ */
12
+ export declare function getPoolPdas(programId: PublicKey, mintAddress: PublicKey): {
13
+ config: anchor.web3.PublicKey;
14
+ vault: anchor.web3.PublicKey;
15
+ nullifiers: anchor.web3.PublicKey;
16
+ };
17
+ /**
18
+ * Get the note tree PDA for a specific tree ID.
19
+ */
20
+ export declare function getNoteTreePda(programId: PublicKey, mintAddress: PublicKey, treeId: number): PublicKey;
21
+ /**
22
+ * Get the global config PDA.
23
+ */
24
+ export declare function getGlobalConfigPda(programId: PublicKey): PublicKey;
25
+ /**
26
+ * Get the nullifier marker PDA for a specific nullifier.
27
+ * NOTE: Nullifier markers are global (no tree_id) to prevent cross-tree double-spend.
28
+ */
29
+ export declare function getNullifierMarkerPda(programId: PublicKey, mintAddress: PublicKey, nullifier: Uint8Array): PublicKey;
30
+ /**
31
+ * Fetch and decode the on-chain PrivacyConfig account for a pool.
32
+ */
33
+ export declare function fetchPoolConfig<T extends Idl>(program: Program<T>, mintAddress: PublicKey): Promise<PrivacyConfigAccount>;
34
+ /**
35
+ * Check whether a nullifier has been spent on-chain.
36
+ * Returns true if the nullifier marker PDA exists (funds already spent).
37
+ */
38
+ export declare function checkNullifierSpent<T extends Idl>(program: Program<T>, mintAddress: PublicKey, nullifier: Uint8Array): Promise<boolean>;
39
+ /** On-chain tree utilization info */
40
+ export type TreeInfo = {
41
+ treeId: number;
42
+ leafCount: number;
43
+ capacity: number;
44
+ utilizationPercent: number;
45
+ remainingCapacity: number;
46
+ isFull: boolean;
47
+ treePDA: PublicKey;
48
+ };
49
+ /**
50
+ * Fetch utilization info for a specific tree.
51
+ * Returns null if the tree does not exist yet.
52
+ */
53
+ export declare function getTreeInfo<T extends Idl>(program: Program<T>, mintAddress: PublicKey, treeId: number): Promise<TreeInfo | null>;
54
+ /**
55
+ * Fetch utilization info for all trees in a pool.
56
+ */
57
+ export declare function getAllTreeInfo<T extends Idl>(program: Program<T>, mintAddress: PublicKey): Promise<TreeInfo[]>;
58
+ /**
59
+ * Find the best tree to deposit into.
60
+ *
61
+ * Strategy (matches veilo-dapp):
62
+ * 1. Discard full trees.
63
+ * 2. Prefer the LOWEST tree ID with remaining capacity ≥ minCapacity (default 0.01%).
64
+ * 3. Ensures trees fill sequentially: 0 → 1 → 2 → …
65
+ * 4. Fallback to the tree with the most remaining capacity.
66
+ */
67
+ export declare function getBestTreeForDeposit<T extends Idl>(program: Program<T>, mintAddress: PublicKey, minCapacity?: number): Promise<TreeInfo | null>;
68
+ /**
69
+ * Convert a Solana/Anchor transaction error into a user-friendly message.
70
+ * Maps privacy_pool program error codes (6000–6060) to readable strings.
71
+ * Mirrors relayer-server/src/controllers/transaction.helpers.ts `parseOnChainError`.
72
+ */
73
+ export declare function parseOnChainError(error: any): string;
74
+ /**
75
+ * Initialize the global config (one-time setup).
76
+ */
77
+ export declare function initializeGlobalConfig<T extends Idl>(params: {
78
+ program: Program<T>;
79
+ admin: anchor.Wallet;
80
+ payer: Keypair;
81
+ }): Promise<void>;
82
+ /**
83
+ * Initialize a privacy pool with the new parameters.
84
+ * Creates the first merkle tree (tree ID 0).
85
+ */
86
+ export declare function initializePool<T extends Idl>(params: {
87
+ program: Program<T>;
88
+ admin: anchor.Wallet;
89
+ payer: Keypair;
90
+ feeBps: number;
91
+ mintAddress: PublicKey;
92
+ minDepositAmount?: bigint;
93
+ maxDepositAmount?: bigint;
94
+ minWithdrawAmount?: bigint;
95
+ maxWithdrawAmount?: bigint;
96
+ }): Promise<void>;
97
+ /**
98
+ * Update pool configuration.
99
+ */
100
+ export declare function updatePoolConfig<T extends Idl>(params: {
101
+ program: Program<T>;
102
+ admin: anchor.Wallet;
103
+ mintAddress: PublicKey;
104
+ minDepositAmount?: bigint;
105
+ maxDepositAmount?: bigint;
106
+ minWithdrawAmount?: bigint;
107
+ maxWithdrawAmount?: bigint;
108
+ feeBps?: number;
109
+ feeErrorMarginBps?: number;
110
+ minWithdrawalFee?: bigint;
111
+ minSwapFee?: bigint;
112
+ swapFeeBps?: number;
113
+ }): Promise<void>;
114
+ /**
115
+ * Add a new Merkle tree to the pool.
116
+ * The treeId must equal the current num_trees value in the pool config.
117
+ */
118
+ export declare function addMerkleTree<T extends Idl>(params: {
119
+ program: Program<T>;
120
+ relayer: Keypair;
121
+ mintAddress: PublicKey;
122
+ treeId: number;
123
+ }): Promise<void>;
124
+ /**
125
+ * Get the pool configuration account.
126
+ */
127
+ export declare function getPoolConfig<T extends Idl>(program: Program<T>, mintAddress: PublicKey): Promise<PrivacyConfigAccount>;
128
+ /**
129
+ * Add a relayer to the pool.
130
+ */
131
+ export declare function addRelayer<T extends Idl>(params: {
132
+ program: Program<T>;
133
+ admin: anchor.Wallet;
134
+ mintAddress: PublicKey;
135
+ newRelayer: PublicKey;
136
+ }): Promise<void>;
137
+ /**
138
+ * Set the paused state of a pool.
139
+ */
140
+ export declare function setPaused<T extends Idl>(params: {
141
+ program: Program<T>;
142
+ admin: anchor.Wallet;
143
+ mintAddress: PublicKey;
144
+ paused: boolean;
145
+ }): Promise<void>;
146
+ /**
147
+ * Execute a transaction on the privacy pool.
148
+ * This is the low-level function that calls the on-chain `transact` instruction.
149
+ *
150
+ * @param publicAmount - Positive for deposits, negative for withdrawals, 0 for transfers
151
+ * @param inputTreeId - The tree ID where input UTXOs are located
152
+ * @param outputTreeId - The tree ID where output commitments will be inserted
153
+ */
154
+ export declare function transact<T extends Idl>(params: {
155
+ program: Program<T>;
156
+ relayer: Keypair;
157
+ recipient: PublicKey;
158
+ mintAddress: PublicKey;
159
+ root: Uint8Array;
160
+ inputTreeId: number;
161
+ outputTreeId: number;
162
+ publicAmount: bigint;
163
+ inputNullifiers: [Uint8Array, Uint8Array];
164
+ outputCommitments: [Uint8Array, Uint8Array];
165
+ extData: ExtData;
166
+ proof: TransactionProofStruct;
167
+ /** Unix timestamp after which the tx is invalid. Defaults to 0 (no deadline). */
168
+ deadline?: bigint;
169
+ vaultTokenAccount?: PublicKey;
170
+ userTokenAccount?: PublicKey;
171
+ recipientTokenAccount?: PublicKey;
172
+ relayerTokenAccount?: PublicKey;
173
+ }): Promise<string>;
174
+ /**
175
+ * Result of a deposit operation, produced by `DepositBuild.commit()` after the
176
+ * caller has successfully submitted the deposit transaction on-chain.
177
+ */
178
+ export type DepositResult = {
179
+ /** The output UTXOs created by the deposit */
180
+ outputUTXOs: [SerializedUTXO, SerializedUTXO];
181
+ /** The leaf indices where the UTXOs were inserted */
182
+ leafIndices: [number, number];
183
+ /** The new Merkle root after insertion */
184
+ root: Uint8Array;
185
+ };
186
+ /**
187
+ * The return of `deposit()`. Instead of submitting the transaction itself,
188
+ * `deposit()` hands back an unsigned {@link Transaction} so the caller can
189
+ * sign it with whatever wallet they control (Solana wallet-adapter, Ledger,
190
+ * anchor NodeWallet, etc.) and submit it on their own terms.
191
+ *
192
+ * Usage pattern (browser / wallet-adapter):
193
+ *
194
+ * const { transaction, commit } = await deposit({ ... });
195
+ * const signed = await wallet.signTransaction(transaction);
196
+ * const sig = await connection.sendRawTransaction(signed.serialize());
197
+ * await connection.confirmTransaction(sig, "confirmed");
198
+ * const result = commit(); // updates the local tree, returns DepositResult
199
+ */
200
+ export type DepositBuild = {
201
+ /**
202
+ * Unsigned {@link Transaction} for the deposit. `feePayer` and
203
+ * `recentBlockhash` are already populated, so the caller only needs to sign
204
+ * and send.
205
+ */
206
+ transaction: Transaction;
207
+ /**
208
+ * Output UTXOs created by this deposit. Safe to read before submission —
209
+ * the commitment values are deterministic from the circuit inputs and do
210
+ * not depend on the on-chain result.
211
+ */
212
+ outputUTXOs: [SerializedUTXO, SerializedUTXO];
213
+ /**
214
+ * Inserts the two output commitments into the local {@link MerkleTree} and
215
+ * returns the receipt. Call this **only after** the on-chain transaction
216
+ * has been confirmed — deferring the insert keeps the local tree
217
+ * consistent with chain state if the submission fails.
218
+ *
219
+ * Calling `commit()` more than once is unsupported and will corrupt the
220
+ * local tree.
221
+ */
222
+ commit: () => DepositResult;
223
+ };
224
+ /**
225
+ * Build an unsigned deposit {@link Transaction} for the privacy pool.
226
+ *
227
+ * For deposits, we use zero input UTXOs (amount=0) and create output UTXOs
228
+ * with the deposit amount. `publicAmount` is positive. The caller is
229
+ * responsible for signing and submitting the returned transaction, and then
230
+ * calling `commit()` once it confirms.
231
+ *
232
+ * @param amount - Amount to deposit in lamports/token units
233
+ * @param recipientPubkey - UTXO public key that will own the deposited funds
234
+ * @param treeId - The tree ID to deposit into (defaults to 0)
235
+ */
236
+ export declare function deposit<T extends Idl>(params: {
237
+ program: Program<T>;
238
+ /**
239
+ * Account that will pay for and sign the deposit transaction. Only
240
+ * `publicKey` is read — `deposit()` never touches a secret key. A browser
241
+ * wallet-adapter wallet, a Node `anchor.Wallet`, or a raw `Keypair` are all
242
+ * structurally acceptable.
243
+ */
244
+ depositor: {
245
+ publicKey: PublicKey;
246
+ };
247
+ amount: bigint;
248
+ mintAddress: PublicKey;
249
+ recipientPubkey: bigint;
250
+ tree: MerkleTree;
251
+ proofBuilder: TransactionProofBuilder;
252
+ treeId?: number;
253
+ extData?: Partial<ExtData>;
254
+ }): Promise<DepositBuild>;
255
+ /**
256
+ * Result of a withdrawal operation.
257
+ */
258
+ export type WithdrawResult = {
259
+ /** Change UTXO (remaining balance) */
260
+ changeUTXO: SerializedUTXO;
261
+ /** Leaf index of the change UTXO */
262
+ leafIndex: number;
263
+ /** New Merkle root after insertion */
264
+ root: Uint8Array;
265
+ };
266
+ /**
267
+ * Withdraw funds from the privacy pool.
268
+ *
269
+ * For withdrawals, we spend input UTXOs and create change output UTXOs.
270
+ * The publicAmount is negative (funds flowing out).
271
+ *
272
+ * @param withdrawAmount - Amount to withdraw in lamports/token units
273
+ * @param inputUTXOs - The UTXOs being spent
274
+ * @param changePubkey - UTXO public key for the change output
275
+ * @param inputTreeId - The tree ID where input UTXOs are located
276
+ * @param outputTreeId - The tree ID where change outputs will be inserted
277
+ */
278
+ export declare function withdraw<T extends Idl>(params: {
279
+ program: Program<T>;
280
+ relayer: Keypair;
281
+ recipient: PublicKey;
282
+ mintAddress: PublicKey;
283
+ inputUTXOs: [InputUTXO, InputUTXO];
284
+ changePubkey: bigint;
285
+ withdrawAmount: bigint;
286
+ fee: bigint;
287
+ refund: bigint;
288
+ root: Uint8Array;
289
+ inputTreeId: number;
290
+ outputTreeId: number;
291
+ tree: MerkleTree;
292
+ proofBuilder: TransactionProofBuilder;
293
+ }): Promise<WithdrawResult>;
294
+ /**
295
+ * Result of a private transfer operation.
296
+ */
297
+ export type TransferResult = {
298
+ /** Output UTXOs created by the transfer */
299
+ outputUTXOs: [SerializedUTXO, SerializedUTXO];
300
+ /** Leaf indices where the UTXOs were inserted */
301
+ leafIndices: [number, number];
302
+ /** New Merkle root after insertion */
303
+ root: Uint8Array;
304
+ };
305
+ /**
306
+ * Execute a private transfer within the pool.
307
+ *
308
+ * For transfers, the publicAmount is 0 (no funds enter or leave the pool).
309
+ * Input amounts must equal output amounts.
310
+ *
311
+ * @param inputUTXOs - The UTXOs being spent
312
+ * @param outputPubkeys - UTXO public keys for the recipients
313
+ * @param outputAmounts - Amounts for each output (must sum to input total)
314
+ * @param inputTreeId - The tree ID where input UTXOs are located
315
+ * @param outputTreeId - The tree ID where output commitments will be inserted
316
+ */
317
+ export declare function privateTransfer<T extends Idl>(params: {
318
+ program: Program<T>;
319
+ relayer: Keypair;
320
+ mintAddress: PublicKey;
321
+ inputUTXOs: [InputUTXO, InputUTXO];
322
+ outputPubkeys: [bigint, bigint];
323
+ outputAmounts: [bigint, bigint];
324
+ root: Uint8Array;
325
+ inputTreeId: number;
326
+ outputTreeId: number;
327
+ tree: MerkleTree;
328
+ proofBuilder: TransactionProofBuilder;
329
+ fee?: bigint;
330
+ }): Promise<TransferResult>;
331
+ /**
332
+ * Update the global config.
333
+ * Currently takes no extra args — only admin verification.
334
+ */
335
+ export declare function updateGlobalConfig<T extends Idl>(params: {
336
+ program: Program<T>;
337
+ admin: anchor.Wallet;
338
+ }): Promise<void>;
339
+ /**
340
+ * Get the swap executor PDA.
341
+ * Seeds: ["swap_executor", source_mint, dest_mint, input_nullifier_0, relayer]
342
+ */
343
+ export declare function getSwapExecutorPda(programId: PublicKey, sourceMint: PublicKey, destMint: PublicKey, inputNullifier0: Uint8Array, relayer: PublicKey): PublicKey;
344
+ /**
345
+ * Build the `fund_native_source` instruction that pre-funds the swap executor
346
+ * with native SOL from the source vault. Only for native SOL source pools.
347
+ *
348
+ * This instruction MUST be the first instruction in the same atomic transaction
349
+ * as `transactSwap`. Call `transactSwap` directly — it handles this internally.
350
+ */
351
+ export declare function fundNativeSource<T extends Idl>(params: {
352
+ program: Program<T>;
353
+ relayer: Keypair;
354
+ sourceMint: PublicKey;
355
+ destMint: PublicKey;
356
+ inputNullifier0: Uint8Array;
357
+ swapAmount: bigint;
358
+ }): Promise<anchor.web3.TransactionInstruction>;
359
+ /**
360
+ * Swap proof struct (same encoding as TransactionProofStruct).
361
+ */
362
+ export type SwapProofStruct = TransactionProofStruct;
363
+ /**
364
+ * Swap params committed to in the ZK proof.
365
+ */
366
+ export type SwapParams = {
367
+ minAmountOut: bigint;
368
+ deadline: bigint;
369
+ sourceMint: PublicKey;
370
+ destMint: PublicKey;
371
+ destAmount: bigint;
372
+ /** SHA-256 of raw swap instruction bytes; use all-zeros for CPMM/AMM swaps. */
373
+ swapDataHash: Uint8Array;
374
+ };
375
+ /**
376
+ * Execute an atomic cross-pool private swap.
377
+ *
378
+ * For native SOL source pools (`sourceMint === NATIVE_SOL_MINT`), this function
379
+ * automatically prepends the `fund_native_source` instruction in the same
380
+ * transaction so the on-chain atomicity requirement is always satisfied.
381
+ *
382
+ * @param swapProgram - Jupiter/Raydium CPMM/AMM program ID
383
+ * @param swapData - Raw DEX instruction bytes
384
+ */
385
+ export declare function transactSwap<T extends Idl>(params: {
386
+ program: Program<T>;
387
+ relayer: Keypair;
388
+ sourceMint: PublicKey;
389
+ destMint: PublicKey;
390
+ sourceRoot: Uint8Array;
391
+ sourceTreeId: number;
392
+ destTreeId: number;
393
+ inputNullifiers: [Uint8Array, Uint8Array];
394
+ outputCommitments: [Uint8Array, Uint8Array];
395
+ proof: SwapProofStruct;
396
+ swapParams: SwapParams;
397
+ swapAmount: bigint;
398
+ swapData: Buffer;
399
+ extData: ExtData;
400
+ sourceVaultTokenAccount: PublicKey;
401
+ sourceMintAccount: PublicKey;
402
+ destVaultTokenAccount: PublicKey;
403
+ destMintAccount: PublicKey;
404
+ relayerTokenAccount: PublicKey;
405
+ swapProgram: PublicKey;
406
+ jupiterEventAuthority: PublicKey;
407
+ }): Promise<string>;