@veilo/sdk-core 0.3.3 → 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.
- package/README.md +42 -3
- package/SHIELD_INTEGRATION.md +143 -0
- package/config.d.ts +2 -0
- package/config.js +4 -0
- package/dist/cjs/client.d.ts +5 -5
- package/dist/cjs/client.js +79 -42
- package/dist/cjs/compactNote.d.ts +107 -0
- package/dist/cjs/compactNote.js +167 -0
- package/dist/cjs/events.d.ts +1 -1
- package/dist/cjs/events.js +2 -2
- package/dist/cjs/idl/privacy_pool.d.ts +5 -0
- package/dist/cjs/idl/privacy_pool.js +15218 -0
- package/dist/cjs/index.d.ts +16 -13
- package/dist/cjs/index.js +40 -30
- package/dist/cjs/merkle.d.ts +13 -0
- package/dist/cjs/merkle.js +31 -8
- package/dist/cjs/program.d.ts +11 -0
- package/dist/cjs/program.js +26 -3
- package/dist/cjs/proof.d.ts +1 -1
- package/dist/cjs/proof.js +37 -37
- package/dist/cjs/prover.d.ts +1 -1
- package/dist/cjs/prover.js +2 -2
- package/dist/cjs/random.d.ts +16 -0
- package/dist/cjs/random.js +28 -0
- package/dist/cjs/relayer.d.ts +27 -4
- package/dist/cjs/relayer.js +16 -5
- package/dist/cjs/shield/alt.d.ts +87 -0
- package/dist/cjs/shield/alt.js +194 -0
- package/dist/cjs/shield/computeBudget.d.ts +61 -0
- package/dist/cjs/shield/computeBudget.js +64 -0
- package/dist/cjs/shield/errors.d.ts +58 -0
- package/dist/cjs/shield/errors.js +121 -0
- package/dist/cjs/shield/finalize.d.ts +45 -0
- package/dist/cjs/shield/finalize.js +119 -0
- package/dist/cjs/shield/index.d.ts +35 -0
- package/dist/cjs/shield/index.js +68 -0
- package/dist/cjs/shield/ix.d.ts +54 -0
- package/dist/cjs/shield/ix.js +119 -0
- package/dist/cjs/shield/owner.d.ts +36 -0
- package/dist/cjs/shield/owner.js +126 -0
- package/dist/cjs/shield/ports.d.ts +43 -0
- package/dist/cjs/shield/ports.js +153 -0
- package/dist/cjs/shield/preflight.d.ts +30 -0
- package/dist/cjs/shield/preflight.js +154 -0
- package/dist/cjs/shield/shield.d.ts +68 -0
- package/dist/cjs/shield/shield.js +499 -0
- package/dist/cjs/shield/types.d.ts +202 -0
- package/dist/cjs/shield/types.js +2 -0
- package/dist/cjs/utxo.d.ts +20 -0
- package/dist/cjs/utxo.js +41 -28
- package/dist/esm/client.d.ts +407 -0
- package/dist/esm/client.js +9 -5
- package/dist/esm/compactNote.d.ts +107 -0
- package/dist/esm/compactNote.js +156 -0
- package/dist/esm/config.d.ts +82 -0
- package/dist/esm/events.d.ts +77 -0
- package/dist/esm/events.js +1 -1
- package/dist/esm/idl/privacy_pool.d.ts +5 -0
- package/dist/esm/idl/privacy_pool.js +15216 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.js +18 -11
- package/dist/esm/merkle.d.ts +77 -0
- package/dist/esm/merkle.js +23 -1
- package/dist/esm/package.json +1 -0
- package/dist/esm/poseidon.d.ts +29 -0
- package/dist/esm/program.d.ts +37 -0
- package/dist/esm/program.js +23 -1
- package/dist/esm/proof.d.ts +183 -0
- package/dist/esm/proof.js +2 -2
- package/dist/esm/prover.d.ts +54 -0
- package/dist/esm/prover.js +1 -1
- package/dist/esm/random.d.ts +16 -0
- package/dist/esm/random.js +21 -0
- package/dist/esm/relayer.d.ts +318 -0
- package/dist/esm/relayer.js +16 -5
- package/dist/esm/retry.d.ts +32 -0
- package/dist/esm/shield/alt.d.ts +87 -0
- package/dist/esm/shield/alt.js +186 -0
- package/dist/esm/shield/computeBudget.d.ts +61 -0
- package/dist/esm/shield/computeBudget.js +61 -0
- package/dist/esm/shield/errors.d.ts +58 -0
- package/dist/esm/shield/errors.js +115 -0
- package/dist/esm/shield/finalize.d.ts +45 -0
- package/dist/esm/shield/finalize.js +83 -0
- package/dist/esm/shield/index.d.ts +35 -0
- package/dist/esm/shield/index.js +32 -0
- package/dist/esm/shield/ix.d.ts +54 -0
- package/dist/esm/shield/ix.js +82 -0
- package/dist/esm/shield/owner.d.ts +36 -0
- package/dist/esm/shield/owner.js +122 -0
- package/dist/esm/shield/ports.d.ts +43 -0
- package/dist/esm/shield/ports.js +147 -0
- package/dist/esm/shield/preflight.d.ts +30 -0
- package/dist/esm/shield/preflight.js +151 -0
- package/dist/esm/shield/shield.d.ts +68 -0
- package/dist/esm/shield/shield.js +492 -0
- package/dist/esm/shield/types.d.ts +202 -0
- package/dist/esm/shield/types.js +1 -0
- package/dist/esm/utxo.d.ts +235 -0
- package/dist/esm/utxo.js +18 -8
- package/dist/src/client.d.ts +407 -0
- package/dist/src/client.js +951 -0
- package/dist/src/compactNote.d.ts +107 -0
- package/dist/src/compactNote.js +167 -0
- package/dist/src/config.d.ts +82 -0
- package/dist/src/config.js +57 -0
- package/dist/src/events.d.ts +77 -0
- package/dist/src/events.js +167 -0
- package/dist/src/idl/privacy_pool.d.ts +5 -0
- package/dist/src/idl/privacy_pool.js +15218 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +67 -0
- package/dist/src/merkle.d.ts +77 -0
- package/dist/src/merkle.js +156 -0
- package/dist/src/poseidon.d.ts +29 -0
- package/dist/src/poseidon.js +100 -0
- package/dist/src/program.d.ts +37 -0
- package/dist/src/program.js +61 -0
- package/dist/src/proof.d.ts +183 -0
- package/dist/src/proof.js +292 -0
- package/dist/src/prover.d.ts +54 -0
- package/dist/src/prover.js +112 -0
- package/dist/src/random.d.ts +16 -0
- package/dist/src/random.js +28 -0
- package/dist/src/relayer.d.ts +318 -0
- package/dist/src/relayer.js +257 -0
- package/dist/src/retry.d.ts +32 -0
- package/dist/src/retry.js +75 -0
- package/dist/src/shield/alt.d.ts +87 -0
- package/dist/src/shield/alt.js +194 -0
- package/dist/src/shield/computeBudget.d.ts +61 -0
- package/dist/src/shield/computeBudget.js +64 -0
- package/dist/src/shield/errors.d.ts +58 -0
- package/dist/src/shield/errors.js +121 -0
- package/dist/src/shield/finalize.d.ts +45 -0
- package/dist/src/shield/finalize.js +119 -0
- package/dist/src/shield/index.d.ts +35 -0
- package/dist/src/shield/index.js +68 -0
- package/dist/src/shield/ix.d.ts +54 -0
- package/dist/src/shield/ix.js +119 -0
- package/dist/src/shield/owner.d.ts +36 -0
- package/dist/src/shield/owner.js +126 -0
- package/dist/src/shield/ports.d.ts +43 -0
- package/dist/src/shield/ports.js +153 -0
- package/dist/src/shield/preflight.d.ts +30 -0
- package/dist/src/shield/preflight.js +154 -0
- package/dist/src/shield/shield.d.ts +68 -0
- package/dist/src/shield/shield.js +499 -0
- package/dist/src/shield/types.d.ts +202 -0
- package/dist/src/shield/types.js +2 -0
- package/dist/src/utxo.d.ts +235 -0
- package/dist/src/utxo.js +407 -0
- package/dist/tests/compact-note.test.d.ts +1 -0
- package/dist/tests/compact-note.test.js +173 -0
- package/dist/tests/config.test.d.ts +1 -0
- package/dist/tests/config.test.js +102 -0
- package/dist/tests/edge-cases.test.d.ts +1 -0
- package/dist/tests/edge-cases.test.js +220 -0
- package/dist/tests/encryption.test.d.ts +1 -0
- package/dist/tests/encryption.test.js +215 -0
- package/dist/tests/events.test.d.ts +1 -0
- package/dist/tests/events.test.js +78 -0
- package/dist/tests/multi-tree.test.d.ts +1 -0
- package/dist/tests/multi-tree.test.js +405 -0
- package/dist/tests/pda.test.d.ts +1 -0
- package/dist/tests/pda.test.js +229 -0
- package/dist/tests/poseidon-builder-parity.test.d.ts +1 -0
- package/dist/tests/poseidon-builder-parity.test.js +72 -0
- package/dist/tests/poseidon.test.d.ts +1 -0
- package/dist/tests/poseidon.test.js +142 -0
- package/dist/tests/proof.test.d.ts +1 -0
- package/dist/tests/proof.test.js +296 -0
- package/dist/tests/relayer.test.d.ts +1 -0
- package/dist/tests/relayer.test.js +271 -0
- package/dist/tests/sdk.integration.test.d.ts +1 -0
- package/dist/tests/sdk.integration.test.js +330 -0
- package/dist/tests/shield-owner.test.d.ts +1 -0
- package/dist/tests/shield-owner.test.js +89 -0
- package/dist/tests/shield-preflight.test.d.ts +1 -0
- package/dist/tests/shield-preflight.test.js +87 -0
- package/dist/tests/shield-realproof.test.d.ts +1 -0
- package/dist/tests/shield-realproof.test.js +272 -0
- package/dist/tests/shield.test.d.ts +1 -0
- package/dist/tests/shield.test.js +403 -0
- package/dist/tests/utxo.test.d.ts +1 -0
- package/dist/tests/utxo.test.js +140 -0
- package/package.json +69 -11
- package/poseidon.d.ts +2 -0
- package/poseidon.js +4 -0
- package/proof.d.ts +2 -0
- package/proof.js +4 -0
- package/prover.d.ts +2 -0
- package/prover.js +4 -0
- package/shield.d.ts +2 -0
- package/shield.js +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
/**
|
|
3
|
+
* Keypair for UTXO ownership.
|
|
4
|
+
* Public key is derived via Poseidon: pubkey = Poseidon(privateKey)
|
|
5
|
+
*/
|
|
6
|
+
export type Keypair = {
|
|
7
|
+
privateKey: bigint;
|
|
8
|
+
publicKey: bigint;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* UTXO structure matching the circuit's UTXOCommitment template.
|
|
12
|
+
* commitment = Poseidon(amount, pubkey, blinding, mintAddress)
|
|
13
|
+
*/
|
|
14
|
+
export type UTXO = {
|
|
15
|
+
/** Amount in lamports/token units */
|
|
16
|
+
amount: bigint;
|
|
17
|
+
/** Owner's public key (derived from private key via Poseidon) */
|
|
18
|
+
pubkey: bigint;
|
|
19
|
+
/** Random blinding factor for commitment privacy */
|
|
20
|
+
blinding: bigint;
|
|
21
|
+
/** Token mint address as field element */
|
|
22
|
+
mintAddress: bigint;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Serialized UTXO with precomputed commitment and optional ownership data.
|
|
26
|
+
*/
|
|
27
|
+
export type SerializedUTXO = UTXO & {
|
|
28
|
+
/** 32-byte commitment: Poseidon(amount, pubkey, blinding, mintAddress) */
|
|
29
|
+
commitment: Uint8Array;
|
|
30
|
+
/** Private key for spending (only present for owned UTXOs) */
|
|
31
|
+
privateKey?: bigint;
|
|
32
|
+
/** Leaf index in the Merkle tree (set after insertion) */
|
|
33
|
+
pathIndex?: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Input UTXO with Merkle proof data for spending.
|
|
37
|
+
*/
|
|
38
|
+
export type InputUTXO = SerializedUTXO & {
|
|
39
|
+
/** Leaf index in the Merkle tree */
|
|
40
|
+
pathIndex: number;
|
|
41
|
+
/** Merkle path elements (sibling hashes from leaf to root) */
|
|
42
|
+
pathElements: Uint8Array[];
|
|
43
|
+
/** Private key for nullifier derivation */
|
|
44
|
+
privateKey: bigint;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Generate a random keypair.
|
|
48
|
+
* Private key is a random 32-byte scalar.
|
|
49
|
+
* Public key is derived via Poseidon: pubkey = Poseidon(privateKey)
|
|
50
|
+
*/
|
|
51
|
+
export declare function generateKeypair(): Keypair;
|
|
52
|
+
/**
|
|
53
|
+
* Derive public key from private key.
|
|
54
|
+
* Matches circuit's Keypair template: publicKey = Poseidon(privateKey)
|
|
55
|
+
*/
|
|
56
|
+
export declare function derivePublicKey(privateKey: bigint): bigint;
|
|
57
|
+
/**
|
|
58
|
+
* Create keypair from a known private key.
|
|
59
|
+
*/
|
|
60
|
+
export declare function keypairFromPrivateKey(privateKey: bigint): Keypair;
|
|
61
|
+
/**
|
|
62
|
+
* Compute UTXO commitment.
|
|
63
|
+
* Matches circuit's UTXOCommitment template:
|
|
64
|
+
* commitment = Poseidon(amount, pubkey, blinding, mintAddress)
|
|
65
|
+
*/
|
|
66
|
+
export declare function commitUTXO(utxo: UTXO): Uint8Array;
|
|
67
|
+
/**
|
|
68
|
+
* Create a random UTXO with the given parameters.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createUTXO(params: {
|
|
71
|
+
amount: bigint;
|
|
72
|
+
pubkey: bigint;
|
|
73
|
+
mintAddress: PublicKey;
|
|
74
|
+
}): SerializedUTXO;
|
|
75
|
+
/**
|
|
76
|
+
* Create a UTXO with a specified private key (for owned UTXOs).
|
|
77
|
+
*/
|
|
78
|
+
export declare function createOwnedUTXO(params: {
|
|
79
|
+
amount: bigint;
|
|
80
|
+
privateKey: bigint;
|
|
81
|
+
mintAddress: PublicKey;
|
|
82
|
+
}): SerializedUTXO;
|
|
83
|
+
/**
|
|
84
|
+
* Create a zero UTXO (for deposits where no input exists).
|
|
85
|
+
* Zero UTXOs have amount=0 and are used as placeholders in 2-in-2-out transactions.
|
|
86
|
+
*/
|
|
87
|
+
export declare function createZeroUTXO(pubkey: bigint, mintAddress: PublicKey): SerializedUTXO;
|
|
88
|
+
/**
|
|
89
|
+
* Create a zero UTXO with private key (for owned zero UTXOs).
|
|
90
|
+
*/
|
|
91
|
+
export declare function createOwnedZeroUTXO(privateKey: bigint, mintAddress: PublicKey): SerializedUTXO;
|
|
92
|
+
/**
|
|
93
|
+
* Compute signature for nullifier derivation.
|
|
94
|
+
* Matches circuit's Signature template:
|
|
95
|
+
* signature = Poseidon(privateKey, commitment, pathIndex)
|
|
96
|
+
*/
|
|
97
|
+
export declare function computeSignature(privateKey: bigint, commitment: bigint, pathIndex: bigint): bigint;
|
|
98
|
+
/**
|
|
99
|
+
* Derive nullifier for a UTXO.
|
|
100
|
+
* Matches circuit's UTXONullifier template:
|
|
101
|
+
* signature = Poseidon(privateKey, commitment, pathIndex)
|
|
102
|
+
* nullifier = Poseidon(commitment, pathIndex, signature)
|
|
103
|
+
*
|
|
104
|
+
* The signature-based nullifier ensures only the private key holder can spend.
|
|
105
|
+
*/
|
|
106
|
+
export declare function deriveNullifier(utxo: SerializedUTXO, pathIndex: number, privateKey: bigint): Uint8Array;
|
|
107
|
+
/**
|
|
108
|
+
* Convert InputUTXO to the format expected by the circuit.
|
|
109
|
+
*/
|
|
110
|
+
export declare function inputUTXOToCircuitFormat(input: InputUTXO): {
|
|
111
|
+
amount: bigint;
|
|
112
|
+
pubkey: bigint;
|
|
113
|
+
blinding: bigint;
|
|
114
|
+
pathElements: bigint[];
|
|
115
|
+
pathIndex: number;
|
|
116
|
+
privateKey: bigint;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Encrypted UTXO note — can be broadcast alongside a transaction so the
|
|
120
|
+
* recipient can recover their note without a server.
|
|
121
|
+
*/
|
|
122
|
+
export type EncryptedNote = {
|
|
123
|
+
/** 24-byte NaCl box nonce */
|
|
124
|
+
nonce: Uint8Array;
|
|
125
|
+
/** Ciphertext containing amount + blinding + privateKey */
|
|
126
|
+
ciphertext: Uint8Array;
|
|
127
|
+
/** Sender's ephemeral 32-byte X25519 public key */
|
|
128
|
+
senderEphemeralPubkey: Uint8Array;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Derive a NaCl X25519 encryption keypair from a UTXO private key.
|
|
132
|
+
* The keypair is deterministic: same privateKey always yields the same pair.
|
|
133
|
+
*/
|
|
134
|
+
export declare function deriveEncryptionKeypair(privateKey: bigint): {
|
|
135
|
+
publicKey: Uint8Array;
|
|
136
|
+
secretKey: Uint8Array;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Encrypt a UTXO so the recipient can recover it from on-chain events.
|
|
140
|
+
*
|
|
141
|
+
* Plaintext layout (72 bytes):
|
|
142
|
+
* [0..8] amount — 8-byte little-endian u64
|
|
143
|
+
* [8..40] blinding — 32-byte big-endian field element
|
|
144
|
+
* [40..72] privateKey — 32-byte big-endian field element
|
|
145
|
+
*
|
|
146
|
+
* Uses ephemeral-key NaCl box so the sender key is single-use.
|
|
147
|
+
*/
|
|
148
|
+
export declare function encryptUTXONote(utxo: SerializedUTXO & {
|
|
149
|
+
privateKey: bigint;
|
|
150
|
+
}, recipientEncPubkey: Uint8Array): EncryptedNote;
|
|
151
|
+
/**
|
|
152
|
+
* Try to decrypt an encrypted UTXO note using the recipient's private key.
|
|
153
|
+
* Returns the SerializedUTXO if decryption succeeds and the commitment
|
|
154
|
+
* matches, or `null` if the note was not intended for this key.
|
|
155
|
+
*/
|
|
156
|
+
export declare function decryptUTXONote(note: EncryptedNote, recipientPrivateKey: bigint, commitment: Uint8Array, mintAddress: PublicKey): SerializedUTXO | null;
|
|
157
|
+
/** Note data stored inside a Blind Mailbox encrypted blob */
|
|
158
|
+
export type BlindMailboxNoteData = {
|
|
159
|
+
blinding: Uint8Array;
|
|
160
|
+
leafIndex: number;
|
|
161
|
+
commitment: Uint8Array;
|
|
162
|
+
amount: bigint;
|
|
163
|
+
mintAddress: string;
|
|
164
|
+
treeId: number;
|
|
165
|
+
};
|
|
166
|
+
/** Encrypted note as returned by the relayer's /api/notes endpoint */
|
|
167
|
+
export type BlindMailboxNote = {
|
|
168
|
+
commitment: string;
|
|
169
|
+
ephemeralPublicKey: string;
|
|
170
|
+
encryptedBlob: string;
|
|
171
|
+
timestamp?: number;
|
|
172
|
+
blockHeight?: number;
|
|
173
|
+
txSignature?: string;
|
|
174
|
+
};
|
|
175
|
+
/** Decrypted note data after calling decryptBlindMailboxNote */
|
|
176
|
+
export type DecryptedNote = {
|
|
177
|
+
blinding: Uint8Array;
|
|
178
|
+
leafIndex: number;
|
|
179
|
+
commitment: Uint8Array;
|
|
180
|
+
amount: bigint;
|
|
181
|
+
timestamp: number;
|
|
182
|
+
mintAddress?: string;
|
|
183
|
+
treeId: number;
|
|
184
|
+
};
|
|
185
|
+
/** Derive 32-byte encryption key from a shared secret using SHA-512 truncated.
|
|
186
|
+
* Must match the production "sha256" helper which uses nacl.hash (SHA-512) [0:32].
|
|
187
|
+
*
|
|
188
|
+
* DO NOT "fix" this to real SHA-256. The name in the sibling implementations
|
|
189
|
+
* (`sha256ForNotes`) is a misnomer, but the bytes are load-bearing: changing the
|
|
190
|
+
* KDF makes every historical note undecryptable.
|
|
191
|
+
*
|
|
192
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
193
|
+
export declare function kdfSHA512_256(secret: Uint8Array): Uint8Array;
|
|
194
|
+
/** Convert an Ed25519 private seed (32 bytes) to an X25519 scalar.
|
|
195
|
+
* Equivalent to ed2curve.convertSecretKey(seed).
|
|
196
|
+
*
|
|
197
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
198
|
+
export declare function ed25519SeedToX25519Private(seed: Uint8Array): Uint8Array;
|
|
199
|
+
/** Convert an Ed25519 compressed public key (32 bytes) to X25519.
|
|
200
|
+
* Equivalent to ed2curve.convertPublicKey(pubkey).
|
|
201
|
+
* Edwards y-coord → Montgomery u via: u = (1 + y) / (1 - y) (mod p).
|
|
202
|
+
*
|
|
203
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
204
|
+
export declare function ed25519PublicKeyToX25519(pubkey: Uint8Array): Uint8Array;
|
|
205
|
+
/**
|
|
206
|
+
* Encrypt a UTXO note for a recipient identified by their Solana wallet public key.
|
|
207
|
+
* Produces a blob the relayer will store and serve via POST /notes/save.
|
|
208
|
+
*
|
|
209
|
+
* @param recipientWalletPubkey 32-byte Ed25519 public key (wallet.publicKey.toBytes())
|
|
210
|
+
* @param noteData UTXO details to encrypt
|
|
211
|
+
*/
|
|
212
|
+
export declare function encryptBlindMailboxNote(recipientWalletPubkey: Uint8Array, noteData: BlindMailboxNoteData): {
|
|
213
|
+
ephemeralPublicKey: Uint8Array;
|
|
214
|
+
encryptedBlob: string;
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* Decrypt a Blind Mailbox note using the recipient's Solana wallet private seed.
|
|
218
|
+
*
|
|
219
|
+
* @param walletSecretKey Full 64-byte wallet.secretKey — the first 32 bytes are the seed
|
|
220
|
+
* @param ephemeralPublicKey 32-byte raw public key stored alongside the encrypted blob.
|
|
221
|
+
* This may be either an Ed25519 pubkey (from Keypair.generate())
|
|
222
|
+
* or a raw X25519 pubkey — the decryption path handles both:
|
|
223
|
+
* if it is an Ed25519 key it is converted; otherwise used directly.
|
|
224
|
+
* @param encryptedBlob Base64 string as stored by the relayer
|
|
225
|
+
*/
|
|
226
|
+
export declare function decryptBlindMailboxNote(walletSecretKey: Uint8Array, ephemeralPublicKey: Uint8Array, encryptedBlob: string): DecryptedNote;
|
|
227
|
+
/**
|
|
228
|
+
* Fetch all encrypted notes for a wallet from the relayer's Blind Mailbox endpoint
|
|
229
|
+
* and decrypt them using the wallet's secret key.
|
|
230
|
+
*
|
|
231
|
+
* @param walletPublicKey Base58 wallet address used to query the relayer
|
|
232
|
+
* @param walletSecretKey Full 64-byte keypair.secretKey for decryption
|
|
233
|
+
* @param relayerUrl Relayer base URL (e.g. "https://relay.veilo.app")
|
|
234
|
+
*/
|
|
235
|
+
export declare function fetchAndDecryptNotes(walletPublicKey: string, walletSecretKey: Uint8Array, relayerUrl: string): Promise<DecryptedNote[]>;
|
package/dist/esm/utxo.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { randomBytes } from "
|
|
1
|
+
import { randomBytes } from "./random.js";
|
|
2
2
|
import nacl from "tweetnacl";
|
|
3
3
|
import { sha256 } from "@noble/hashes/sha256";
|
|
4
|
-
import { BN254_FR_MODULUS, bigIntToBytesBE, bytesToBigIntBE, poseidon1, poseidon3, poseidon4, pubkeyToField, } from "./poseidon";
|
|
4
|
+
import { BN254_FR_MODULUS, bigIntToBytesBE, bytesToBigIntBE, poseidon1, poseidon3, poseidon4, pubkeyToField, } from "./poseidon.js";
|
|
5
5
|
// -----------------------------------------------------------------------------
|
|
6
6
|
// Keypair Functions
|
|
7
7
|
// -----------------------------------------------------------------------------
|
|
@@ -203,13 +203,21 @@ export function decryptUTXONote(note, recipientPrivateKey, commitment, mintAddre
|
|
|
203
203
|
}
|
|
204
204
|
// -- Internal crypto helpers (no extra dependencies) --------------------------
|
|
205
205
|
/** Derive 32-byte encryption key from a shared secret using SHA-512 truncated.
|
|
206
|
-
* Must match the production "sha256" helper which uses nacl.hash (SHA-512) [0:32].
|
|
207
|
-
|
|
206
|
+
* Must match the production "sha256" helper which uses nacl.hash (SHA-512) [0:32].
|
|
207
|
+
*
|
|
208
|
+
* DO NOT "fix" this to real SHA-256. The name in the sibling implementations
|
|
209
|
+
* (`sha256ForNotes`) is a misnomer, but the bytes are load-bearing: changing the
|
|
210
|
+
* KDF makes every historical note undecryptable.
|
|
211
|
+
*
|
|
212
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
213
|
+
export function kdfSHA512_256(secret) {
|
|
208
214
|
return nacl.hash(secret).slice(0, 32);
|
|
209
215
|
}
|
|
210
216
|
/** Convert an Ed25519 private seed (32 bytes) to an X25519 scalar.
|
|
211
|
-
* Equivalent to ed2curve.convertSecretKey(seed).
|
|
212
|
-
|
|
217
|
+
* Equivalent to ed2curve.convertSecretKey(seed).
|
|
218
|
+
*
|
|
219
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
220
|
+
export function ed25519SeedToX25519Private(seed) {
|
|
213
221
|
const h = nacl.hash(seed); // SHA-512
|
|
214
222
|
const scalar = h.slice(0, 32);
|
|
215
223
|
scalar[0] &= 248;
|
|
@@ -231,8 +239,10 @@ function modpow25519(b, e) {
|
|
|
231
239
|
}
|
|
232
240
|
/** Convert an Ed25519 compressed public key (32 bytes) to X25519.
|
|
233
241
|
* Equivalent to ed2curve.convertPublicKey(pubkey).
|
|
234
|
-
* Edwards y-coord → Montgomery u via: u = (1 + y) / (1 - y) (mod p).
|
|
235
|
-
|
|
242
|
+
* Edwards y-coord → Montgomery u via: u = (1 + y) / (1 - y) (mod p).
|
|
243
|
+
*
|
|
244
|
+
* @internal Exported for `compactNote.ts`. Not part of the stable public API. */
|
|
245
|
+
export function ed25519PublicKeyToX25519(pubkey) {
|
|
236
246
|
const pk = new Uint8Array(pubkey);
|
|
237
247
|
pk[31] &= 0x7f; // clear sign bit to get y as LE integer
|
|
238
248
|
// Decode little-endian y
|
|
@@ -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>;
|