@cloakedagent/sdk 0.1.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 (72) hide show
  1. package/README.md +90 -0
  2. package/dist/agent.d.ts +321 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +877 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config.d.ts +33 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +64 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +4 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +9 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/idl.json +1347 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +66 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/index.d.ts +7 -0
  20. package/dist/mcp/index.d.ts.map +1 -0
  21. package/dist/mcp/index.js +374 -0
  22. package/dist/mcp/index.js.map +1 -0
  23. package/dist/mcp/tools.d.ts +26 -0
  24. package/dist/mcp/tools.d.ts.map +1 -0
  25. package/dist/mcp/tools.js +320 -0
  26. package/dist/mcp/tools.js.map +1 -0
  27. package/dist/mcp/types.d.ts +61 -0
  28. package/dist/mcp/types.d.ts.map +1 -0
  29. package/dist/mcp/types.js +4 -0
  30. package/dist/mcp/types.js.map +1 -0
  31. package/dist/relayer.d.ts +130 -0
  32. package/dist/relayer.d.ts.map +1 -0
  33. package/dist/relayer.js +225 -0
  34. package/dist/relayer.js.map +1 -0
  35. package/dist/signer.d.ts +18 -0
  36. package/dist/signer.d.ts.map +1 -0
  37. package/dist/signer.js +34 -0
  38. package/dist/signer.js.map +1 -0
  39. package/dist/token.d.ts +320 -0
  40. package/dist/token.d.ts.map +1 -0
  41. package/dist/token.js +896 -0
  42. package/dist/token.js.map +1 -0
  43. package/dist/types.d.ts +66 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +3 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/zk/browser-prover.d.ts +85 -0
  48. package/dist/zk/browser-prover.d.ts.map +1 -0
  49. package/dist/zk/browser-prover.js +260 -0
  50. package/dist/zk/browser-prover.js.map +1 -0
  51. package/dist/zk/discovery.d.ts +65 -0
  52. package/dist/zk/discovery.d.ts.map +1 -0
  53. package/dist/zk/discovery.js +143 -0
  54. package/dist/zk/discovery.js.map +1 -0
  55. package/dist/zk/index.d.ts +14 -0
  56. package/dist/zk/index.d.ts.map +1 -0
  57. package/dist/zk/index.js +47 -0
  58. package/dist/zk/index.js.map +1 -0
  59. package/dist/zk/ownership_proof.json +1 -0
  60. package/dist/zk/poseidon.d.ts +31 -0
  61. package/dist/zk/poseidon.d.ts.map +1 -0
  62. package/dist/zk/poseidon.js +103 -0
  63. package/dist/zk/poseidon.js.map +1 -0
  64. package/dist/zk/prover.d.ts +49 -0
  65. package/dist/zk/prover.d.ts.map +1 -0
  66. package/dist/zk/prover.js +120 -0
  67. package/dist/zk/prover.js.map +1 -0
  68. package/dist/zk/secrets.d.ts +62 -0
  69. package/dist/zk/secrets.d.ts.map +1 -0
  70. package/dist/zk/secrets.js +98 -0
  71. package/dist/zk/secrets.js.map +1 -0
  72. package/package.json +74 -0
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ /**
3
+ * Relayer Client for Truly Private Cloaked Agent Creation
4
+ *
5
+ * Handles communication with the backend relayer service for creating
6
+ * agents without the user's wallet signing any on-chain transaction.
7
+ *
8
+ * Security:
9
+ * - Agent Key encrypted with NaCl box (X25519) - decrypted client-side
10
+ * - User's wallet only signs "Cloak Private Agent" message for secret derivation
11
+ * - User's wallet NEVER appears in any on-chain transaction
12
+ *
13
+ * Economics:
14
+ * - User sends total (0.01 SOL fee + funding) to relayer via Privacy Cash
15
+ * - Relayer keeps 0.01 SOL fee, forwards rest to vault
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.getRelayerStatus = getRelayerStatus;
22
+ exports.createPrivateAgentViaRelayer = createPrivateAgentViaRelayer;
23
+ exports.freezePrivateViaRelayer = freezePrivateViaRelayer;
24
+ exports.unfreezePrivateViaRelayer = unfreezePrivateViaRelayer;
25
+ exports.updateConstraintsPrivateViaRelayer = updateConstraintsPrivateViaRelayer;
26
+ exports.withdrawPrivateViaRelayer = withdrawPrivateViaRelayer;
27
+ exports.closePrivateViaRelayer = closePrivateViaRelayer;
28
+ exports.cosignSpendViaRelayer = cosignSpendViaRelayer;
29
+ exports.getRelayerPublicKey = getRelayerPublicKey;
30
+ const web3_js_1 = require("@solana/web3.js");
31
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
32
+ const bs58_1 = __importDefault(require("bs58"));
33
+ const zk_1 = require("./zk");
34
+ const config_1 = require("./config");
35
+ /**
36
+ * Handle relayer API error responses
37
+ */
38
+ async function handleRelayerError(response, defaultMessage) {
39
+ const error = await response.json().catch(() => ({ error: "Unknown error" }));
40
+ throw new Error(error.error || `${defaultMessage}: ${response.status}`);
41
+ }
42
+ /**
43
+ * Make a POST request to a relayer endpoint and return the signature
44
+ */
45
+ async function postRelayerOperation(endpoint, params, apiUrl) {
46
+ const baseUrl = apiUrl || (0, config_1.getBackendUrl)();
47
+ const response = await fetch(`${baseUrl}/api/relayer/${endpoint}`, {
48
+ method: "POST",
49
+ headers: { "Content-Type": "application/json" },
50
+ body: JSON.stringify(params),
51
+ });
52
+ if (!response.ok) {
53
+ await handleRelayerError(response, "Relayer request failed");
54
+ }
55
+ const result = await response.json();
56
+ return result.signature;
57
+ }
58
+ /**
59
+ * Get relayer status
60
+ *
61
+ * @param apiUrl - Optional API URL (defaults to CLOAK_API_URL or localhost:3645)
62
+ * @returns Relayer status including balance and readiness
63
+ */
64
+ async function getRelayerStatus(apiUrl) {
65
+ const baseUrl = apiUrl || (0, config_1.getBackendUrl)();
66
+ const response = await fetch(`${baseUrl}/api/relayer/status`);
67
+ if (!response.ok) {
68
+ await handleRelayerError(response, "Relayer status check failed");
69
+ }
70
+ return response.json();
71
+ }
72
+ /**
73
+ * Create a Cloaked Agent via relayer
74
+ *
75
+ * The relayer signs and pays for the transaction, ensuring the user's wallet
76
+ * never appears on-chain. The Agent Key is encrypted and only the user can decrypt it.
77
+ *
78
+ * Flow:
79
+ * 1. User sends total (fee + funding) to relayer via Privacy Cash
80
+ * 2. Call this function with the deposit tx signature
81
+ * 3. Relayer keeps 0.01 SOL fee, forwards rest to vault
82
+ * 4. Relayer creates agent, encrypts Agent Key for user
83
+ *
84
+ * @param masterSecret - Master secret derived from wallet signature
85
+ * @param nonce - Agent index (0, 1, 2, ...)
86
+ * @param options - Agent creation options
87
+ * @param depositSignature - Privacy Cash tx signature to relayer
88
+ * @param depositAmount - Total lamports sent (fee + vault funding)
89
+ * @param apiUrl - Optional API URL
90
+ * @returns Agent Key and PDA addresses
91
+ */
92
+ async function createPrivateAgentViaRelayer(masterSecret, nonce, options, depositSignature, depositAmount, apiUrl) {
93
+ const baseUrl = apiUrl || (0, config_1.getBackendUrl)();
94
+ const { commitment } = await (0, zk_1.deriveAgentSecrets)(masterSecret, nonce);
95
+ const commitmentBytes = (0, zk_1.commitmentToBytes)(commitment);
96
+ const encryptionKeypair = tweetnacl_1.default.box.keyPair();
97
+ const body = {
98
+ ownerCommitment: Array.from(commitmentBytes),
99
+ maxPerTx: options.maxPerTx ?? 0,
100
+ dailyLimit: options.dailyLimit ?? 0,
101
+ totalLimit: options.totalLimit ?? 0,
102
+ expiresAt: options.expiresAt ? Math.floor(options.expiresAt.getTime() / 1000) : 0,
103
+ clientPublicKey: Array.from(encryptionKeypair.publicKey),
104
+ depositSignature,
105
+ depositAmount,
106
+ };
107
+ const response = await fetch(`${baseUrl}/api/relayer/create-private`, {
108
+ method: "POST",
109
+ headers: { "Content-Type": "application/json" },
110
+ body: JSON.stringify(body),
111
+ });
112
+ if (!response.ok) {
113
+ await handleRelayerError(response, "Relayer request failed");
114
+ }
115
+ const result = await response.json();
116
+ // Decrypt Agent Key
117
+ const agentKey = decryptAgentKey(result.encryptedAgentKey, result.nonce, encryptionKeypair.secretKey);
118
+ return {
119
+ agentKey,
120
+ agentStatePda: new web3_js_1.PublicKey(result.agentStatePda),
121
+ vaultPda: new web3_js_1.PublicKey(result.vaultPda),
122
+ delegate: new web3_js_1.PublicKey(result.delegate),
123
+ signature: result.signature,
124
+ };
125
+ }
126
+ /**
127
+ * Freeze a private agent via relayer
128
+ */
129
+ async function freezePrivateViaRelayer(params, apiUrl) {
130
+ return postRelayerOperation("freeze-private", params, apiUrl);
131
+ }
132
+ /**
133
+ * Unfreeze a private agent via relayer
134
+ */
135
+ async function unfreezePrivateViaRelayer(params, apiUrl) {
136
+ return postRelayerOperation("unfreeze-private", params, apiUrl);
137
+ }
138
+ /**
139
+ * Update constraints for a private agent via relayer
140
+ */
141
+ async function updateConstraintsPrivateViaRelayer(params, apiUrl) {
142
+ return postRelayerOperation("update-constraints-private", params, apiUrl);
143
+ }
144
+ /**
145
+ * Withdraw from a private agent via relayer
146
+ */
147
+ async function withdrawPrivateViaRelayer(params, apiUrl) {
148
+ return postRelayerOperation("withdraw-private", params, apiUrl);
149
+ }
150
+ /**
151
+ * Close a private agent via relayer
152
+ */
153
+ async function closePrivateViaRelayer(params, apiUrl) {
154
+ return postRelayerOperation("close-private", params, apiUrl);
155
+ }
156
+ /**
157
+ * Co-sign and submit a spend transaction via relayer
158
+ *
159
+ * The SDK builds the transaction, delegate signs, then sends to relayer.
160
+ * Relayer adds its signature as fee payer and submits to the network.
161
+ *
162
+ * @param transactionBase64 - Base64 encoded partially-signed transaction
163
+ * @param apiUrl - Optional API URL
164
+ * @returns Transaction signature
165
+ */
166
+ async function cosignSpendViaRelayer(transactionBase64, apiUrl) {
167
+ const baseUrl = apiUrl || (0, config_1.getBackendUrl)();
168
+ const response = await fetch(`${baseUrl}/api/relayer/cosign-spend`, {
169
+ method: "POST",
170
+ headers: { "Content-Type": "application/json" },
171
+ body: JSON.stringify({ transaction: transactionBase64 }),
172
+ });
173
+ if (!response.ok) {
174
+ const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
175
+ const message = errorData.error || `Relayer cosign failed: ${response.status}`;
176
+ const err = new Error(message);
177
+ err.code = errorData.code;
178
+ throw err;
179
+ }
180
+ const result = await response.json();
181
+ return result.signature;
182
+ }
183
+ /**
184
+ * Get the relayer public key for use as fee payer
185
+ * Uses lightweight /pubkey endpoint that doesn't require RPC calls
186
+ *
187
+ * @param apiUrl - Optional API URL
188
+ * @returns Relayer public key
189
+ */
190
+ async function getRelayerPublicKey(apiUrl) {
191
+ const baseUrl = apiUrl || (0, config_1.getBackendUrl)();
192
+ try {
193
+ const response = await fetch(`${baseUrl}/api/relayer/pubkey`);
194
+ if (response.ok) {
195
+ const data = await response.json();
196
+ return new web3_js_1.PublicKey(data.address);
197
+ }
198
+ }
199
+ catch {
200
+ // Fall back to status endpoint
201
+ }
202
+ const status = await getRelayerStatus(apiUrl);
203
+ return new web3_js_1.PublicKey(status.address);
204
+ }
205
+ /**
206
+ * Decrypt Agent Key received from relayer
207
+ *
208
+ * @param encryptedBase58 - Base58 encoded encrypted data (ephemeral pubkey + ciphertext)
209
+ * @param nonceBase58 - Base58 encoded nonce
210
+ * @param secretKey - Client's X25519 secret key
211
+ * @returns Decrypted Agent Key
212
+ */
213
+ function decryptAgentKey(encryptedBase58, nonceBase58, secretKey) {
214
+ const encrypted = bs58_1.default.decode(encryptedBase58);
215
+ const nonce = bs58_1.default.decode(nonceBase58);
216
+ // First 32 bytes are the ephemeral public key, rest is ciphertext
217
+ const ephemeralPublicKey = encrypted.slice(0, 32);
218
+ const ciphertext = encrypted.slice(32);
219
+ const decrypted = tweetnacl_1.default.box.open(ciphertext, nonce, ephemeralPublicKey, secretKey);
220
+ if (!decrypted) {
221
+ throw new Error("Failed to decrypt Agent Key - invalid encryption");
222
+ }
223
+ return new TextDecoder().decode(decrypted);
224
+ }
225
+ //# sourceMappingURL=relayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayer.js","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Keypair, PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
2
+ /**
3
+ * Signer interface - matches Anchor's Wallet interface exactly.
4
+ * This allows the SDK to work with both:
5
+ * - Frontend: useAnchorWallet() already returns this interface
6
+ * - Backend/MCP: Use keypairToSigner() to adapt a Keypair
7
+ */
8
+ export interface Signer {
9
+ publicKey: PublicKey;
10
+ signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
11
+ signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
12
+ }
13
+ /**
14
+ * Adapt a Keypair to the Signer interface.
15
+ * Use this in backend code or MCP tools where you have a Keypair.
16
+ */
17
+ export declare function keypairToSigner(keypair: Keypair): Signer;
18
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAExF;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAsBxD"}
package/dist/signer.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keypairToSigner = keypairToSigner;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ /**
6
+ * Adapt a Keypair to the Signer interface.
7
+ * Use this in backend code or MCP tools where you have a Keypair.
8
+ */
9
+ function keypairToSigner(keypair) {
10
+ return {
11
+ publicKey: keypair.publicKey,
12
+ async signTransaction(tx) {
13
+ if (tx instanceof web3_js_1.Transaction) {
14
+ tx.partialSign(keypair);
15
+ }
16
+ else {
17
+ tx.sign([keypair]);
18
+ }
19
+ return tx;
20
+ },
21
+ async signAllTransactions(txs) {
22
+ return txs.map((tx) => {
23
+ if (tx instanceof web3_js_1.Transaction) {
24
+ tx.partialSign(keypair);
25
+ }
26
+ else {
27
+ tx.sign([keypair]);
28
+ }
29
+ return tx;
30
+ });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":";;AAkBA,0CAsBC;AAxCD,6CAAwF;AAcxF;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,CAAC,eAAe,CAA+C,EAAK;YACvE,IAAI,EAAE,YAAY,qBAAW,EAAE,CAAC;gBAC9B,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,mBAAmB,CAA+C,GAAQ;YAC9E,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACpB,IAAI,EAAE,YAAY,qBAAW,EAAE,CAAC;oBAC9B,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,320 @@
1
+ import { Connection, Keypair, PublicKey } from "@solana/web3.js";
2
+ import { TokenState, CreateTokenOptions, ConstraintOptions, SpendOptions, SpendResult } from "./types";
3
+ import { Signer } from "./signer";
4
+ /**
5
+ * CloakToken - Represents a Cloak payment token
6
+ *
7
+ * A Cloak token is a Solana keypair where:
8
+ * - The private key is the "token code" (what users save)
9
+ * - The derived PDA holds the SOL balance
10
+ * - Signing with the keypair authorizes redemptions
11
+ *
12
+ * Two modes of operation:
13
+ * - Agent mode (via constructor): Has token code, can spend
14
+ * - Owner mode (via forOwner): No token code, can manage (freeze/unfreeze/update/close)
15
+ */
16
+ export declare class CloakToken {
17
+ private keypair;
18
+ private delegatePubkey;
19
+ private connection;
20
+ private _pda;
21
+ private _bump;
22
+ private _ownerCommitment;
23
+ private _agentSecret;
24
+ private _nonce;
25
+ private _tokenStatePda;
26
+ private _vaultPda;
27
+ /**
28
+ * Create a CloakToken from a token code (agent mode - can spend)
29
+ * @param tokenCode - Base58 encoded secret key
30
+ * @param rpcUrl - Solana RPC endpoint URL
31
+ */
32
+ constructor(tokenCode: string, rpcUrl: string);
33
+ /**
34
+ * Create a CloakToken for owner management (freeze, unfreeze, update, close, withdraw, deposit)
35
+ * Does NOT have delegate keypair - cannot spend.
36
+ * Use this when you have the delegate's public key but not the token code.
37
+ *
38
+ * @param delegatePubkey - Public key of the delegate (from URL or on-chain data)
39
+ * @param rpcUrl - Solana RPC endpoint URL
40
+ */
41
+ static forOwner(delegatePubkey: PublicKey | string, rpcUrl: string): CloakToken;
42
+ /**
43
+ * Create a CloakToken for private owner management (ZK proof-based)
44
+ * Uses the master secret and nonce to derive the agent secret and find the token.
45
+ *
46
+ * @param masterSecret - Master secret derived from wallet signature
47
+ * @param nonce - Agent index (0, 1, 2, ...)
48
+ * @param rpcUrl - Solana RPC endpoint URL
49
+ * @returns CloakToken instance for private management
50
+ */
51
+ static forPrivateOwner(masterSecret: bigint, nonce: number, rpcUrl: string): Promise<CloakToken>;
52
+ /**
53
+ * Check if this token is in private mode
54
+ */
55
+ get isPrivateMode(): boolean;
56
+ /**
57
+ * Get the owner commitment (private mode only)
58
+ */
59
+ get ownerCommitment(): Uint8Array | null;
60
+ /**
61
+ * The token's public key (used to derive PDA)
62
+ */
63
+ get publicKey(): PublicKey;
64
+ /**
65
+ * The PDA that holds this token's SOL balance
66
+ */
67
+ get pda(): PublicKey;
68
+ /**
69
+ * The bump seed used for PDA derivation
70
+ */
71
+ get bump(): number;
72
+ /**
73
+ * Get the TokenState PDA address for this delegate
74
+ */
75
+ get tokenStatePda(): PublicKey;
76
+ /**
77
+ * Get the Vault PDA address for this token
78
+ */
79
+ get vaultPda(): PublicKey;
80
+ /**
81
+ * Get the current SOL balance of this token
82
+ * @returns Balance in SOL
83
+ */
84
+ getBalance(): Promise<number>;
85
+ /**
86
+ * Get the current balance in lamports
87
+ * @returns Balance in lamports
88
+ */
89
+ getBalanceLamports(): Promise<number>;
90
+ /**
91
+ * Generate a new random Cloak token
92
+ * @param rpcUrl - Solana RPC endpoint URL
93
+ * @returns New token instance and its token code
94
+ */
95
+ static generate(rpcUrl: string): {
96
+ token: CloakToken;
97
+ tokenCode: string;
98
+ };
99
+ /**
100
+ * Derive the PDA for any public key (without needing full token)
101
+ * @param publicKey - Token's public key
102
+ * @returns The PDA address
103
+ */
104
+ static derivePda(publicKey: PublicKey): PublicKey;
105
+ /**
106
+ * Derive PDA with bump
107
+ * @param publicKey - Token's public key
108
+ * @returns The PDA address and bump
109
+ */
110
+ static derivePdaWithBump(publicKey: PublicKey): [PublicKey, number];
111
+ /**
112
+ * Derive TokenState PDA for a delegate
113
+ */
114
+ static deriveTokenStatePda(delegate: PublicKey): PublicKey;
115
+ /**
116
+ * Derive Vault PDA from TokenState PDA
117
+ */
118
+ static deriveVaultPda(tokenStatePda: PublicKey): PublicKey;
119
+ /**
120
+ * Create a new Cloak token with constraints on-chain
121
+ * @param connection - Solana connection
122
+ * @param owner - Owner wallet (Signer - can be wallet adapter or wrapped Keypair)
123
+ * @param options - Token creation options
124
+ * @returns New CloakToken instance and token code
125
+ */
126
+ static create(connection: Connection, owner: Signer, options: CreateTokenOptions): Promise<{
127
+ token: CloakToken;
128
+ tokenCode: string;
129
+ signature: string;
130
+ }>;
131
+ /**
132
+ * Fetch full token state from on-chain
133
+ * @returns TokenState with all constraints and spending info
134
+ */
135
+ getState(): Promise<TokenState>;
136
+ /**
137
+ * Spend from vault to destination (delegate signs)
138
+ * Requires agent mode (token code) - throws if in owner mode.
139
+ *
140
+ * Two fee payment modes:
141
+ *
142
+ * 1. **With feePayer (standard mode)**: User's wallet pays tx fee directly
143
+ * - No relayer involved
144
+ * - Normal tx fee (~5k lamports) paid by user wallet
145
+ * - Vault only pays the amount to destination
146
+ *
147
+ * 2. **Without feePayer (agent/MCP mode)**: Relayer pays, vault reimburses
148
+ * - Relayer fronts the tx fee
149
+ * - Vault reimburses relayer 10k lamports
150
+ * - Delegate doesn't need any SOL
151
+ *
152
+ * @param options - Spend options (destination, amount, optional feePayer)
153
+ * @returns Spend result with signature and remaining balances
154
+ */
155
+ spend(options: SpendOptions): Promise<SpendResult>;
156
+ /**
157
+ * Spend with user-provided fee payer (no relayer)
158
+ */
159
+ private spendWithFeePayer;
160
+ /**
161
+ * Spend via relayer (relayer pays, vault reimburses)
162
+ */
163
+ private spendViaRelayer;
164
+ /**
165
+ * Deposit SOL to vault (anyone can call)
166
+ * @param depositor - Signer of the depositor (wallet adapter or wrapped Keypair)
167
+ * @param amount - Amount in lamports
168
+ * @returns Transaction signature
169
+ */
170
+ deposit(depositor: Signer, amount: number): Promise<string>;
171
+ /**
172
+ * Freeze token (owner only) - emergency stop
173
+ * @param owner - Owner signer (wallet adapter or wrapped Keypair)
174
+ * @returns Transaction signature
175
+ */
176
+ freeze(owner: Signer): Promise<string>;
177
+ /**
178
+ * Unfreeze token (owner only)
179
+ * @param owner - Owner signer (wallet adapter or wrapped Keypair)
180
+ * @returns Transaction signature
181
+ */
182
+ unfreeze(owner: Signer): Promise<string>;
183
+ /**
184
+ * Update token constraints (owner only)
185
+ * @param owner - Owner signer (wallet adapter or wrapped Keypair)
186
+ * @param options - New constraint values (null = no change)
187
+ * @returns Transaction signature
188
+ */
189
+ updateConstraints(owner: Signer, options: ConstraintOptions): Promise<string>;
190
+ /**
191
+ * Close token and reclaim all funds to owner (owner only)
192
+ * @param owner - Owner signer (wallet adapter or wrapped Keypair)
193
+ * @returns Transaction signature
194
+ */
195
+ close(owner: Signer): Promise<string>;
196
+ /**
197
+ * Withdraw from vault to any destination (owner only, no constraints)
198
+ * Works even if token is frozen or expired - owner has full control
199
+ * Preserves privacy by allowing withdrawal to any wallet
200
+ * @param owner - Owner signer (wallet adapter or wrapped Keypair)
201
+ * @param amount - Amount in lamports to withdraw
202
+ * @param destination - Destination wallet (any PublicKey)
203
+ * @returns Transaction signature
204
+ */
205
+ withdraw(owner: Signer, amount: number, destination: PublicKey): Promise<string>;
206
+ /**
207
+ * Create a new Cloak token in private mode (no wallet linked on-chain)
208
+ *
209
+ * @param connection - Solana connection
210
+ * @param payer - Payer for transaction fees (can be any signer)
211
+ * @param masterSecret - Master secret derived from wallet signature
212
+ * @param nonce - Agent index (0, 1, 2, ...)
213
+ * @param options - Token creation options
214
+ * @returns New CloakToken instance (with private mode) and token code
215
+ */
216
+ static createPrivate(connection: Connection, payer: Signer, masterSecret: bigint, nonce: number, options: Omit<CreateTokenOptions, "delegate">): Promise<{
217
+ token: CloakToken;
218
+ tokenCode: string;
219
+ signature: string;
220
+ }>;
221
+ /**
222
+ * Create a new Cloak token via relayer (truly private - user wallet never signs on-chain)
223
+ *
224
+ * This is the most private mode of operation:
225
+ * 1. User signs message to derive master secret (client-side only)
226
+ * 2. User sends total (fee + funding) to relayer via Privacy Cash
227
+ * 3. Relayer keeps 0.01 SOL fee, forwards rest to vault
228
+ * 4. Relayer creates the agent on-chain (generates delegate)
229
+ * 5. TokenCode encrypted for user (only user can decrypt)
230
+ * 6. User's wallet NEVER appears in any on-chain transaction
231
+ *
232
+ * @param masterSecret - Master secret derived from wallet signature
233
+ * @param nonce - Agent index (0, 1, 2, ...)
234
+ * @param options - Token creation options
235
+ * @param depositSignature - Privacy Cash tx signature to relayer
236
+ * @param depositAmount - Total lamports sent (fee + vault funding)
237
+ * @param rpcUrl - Solana RPC endpoint URL
238
+ * @param apiUrl - Optional backend API URL
239
+ * @returns New CloakToken instance (with private mode) and token code
240
+ */
241
+ static createPrivateViaRelayer(masterSecret: bigint, nonce: number, options: Omit<CreateTokenOptions, "delegate" | "initialDeposit">, depositSignature: string, depositAmount: number, rpcUrl: string, apiUrl?: string): Promise<{
242
+ token: CloakToken;
243
+ tokenCode: string;
244
+ signature: string;
245
+ vaultPda: PublicKey;
246
+ }>;
247
+ /**
248
+ * Create a new Cloak token using your own relayer keypair (no backend needed, no fees)
249
+ *
250
+ * This is for technical users who want to:
251
+ * - Use their own funded keypair as a relayer
252
+ * - Pay their own rent (no 0.01 SOL fee to our relayer)
253
+ * - Have full control over the creation process
254
+ * - Fund vault separately via Privacy Cash for anonymity
255
+ *
256
+ * Flow:
257
+ * 1. User signs message to derive master secret (client-side only)
258
+ * 2. User provides a funded Keypair to pay rent
259
+ * 3. Creates agent directly on-chain (relayerKeypair signs and pays)
260
+ * 4. User's main wallet NEVER appears in any on-chain transaction
261
+ * 5. Fund vault separately via Privacy Cash for complete anonymity
262
+ *
263
+ * @param masterSecret - Master secret derived from wallet signature
264
+ * @param nonce - Agent index (0, 1, 2, ...)
265
+ * @param options - Token creation options
266
+ * @param relayerKeypair - User's own funded keypair (pays rent ~0.00138 SOL)
267
+ * @param rpcUrl - Solana RPC endpoint URL
268
+ * @returns New CloakToken instance (with private mode) and token code
269
+ */
270
+ static createPrivateWithRelayer(masterSecret: bigint, nonce: number, options: Omit<CreateTokenOptions, "delegate" | "initialDeposit">, relayerKeypair: Keypair, rpcUrl: string): Promise<{
271
+ token: CloakToken;
272
+ tokenCode: string;
273
+ signature: string;
274
+ vaultPda: PublicKey;
275
+ }>;
276
+ /**
277
+ * Helper to get a dummy wallet for read-only operations
278
+ */
279
+ private getDummyWallet;
280
+ /**
281
+ * Freeze token using ZK proof (private mode only)
282
+ * Uses relayer to submit transaction - vault pays for fees
283
+ * @param apiUrl - Optional API URL for relayer
284
+ * @returns Transaction signature
285
+ */
286
+ freezePrivate(apiUrl?: string): Promise<string>;
287
+ /**
288
+ * Unfreeze token using ZK proof (private mode only)
289
+ * Uses relayer to submit transaction - vault pays for fees
290
+ * @param apiUrl - Optional API URL for relayer
291
+ * @returns Transaction signature
292
+ */
293
+ unfreezePrivate(apiUrl?: string): Promise<string>;
294
+ /**
295
+ * Update constraints using ZK proof (private mode only)
296
+ * Uses relayer to submit transaction - vault pays for fees
297
+ * @param options - New constraint values (undefined = no change)
298
+ * @param apiUrl - Optional API URL for relayer
299
+ * @returns Transaction signature
300
+ */
301
+ updateConstraintsPrivate(options: ConstraintOptions, apiUrl?: string): Promise<string>;
302
+ /**
303
+ * Close token and reclaim funds using ZK proof (private mode only)
304
+ * Uses relayer to submit transaction - vault pays for fees
305
+ * @param destination - Destination for remaining funds
306
+ * @param apiUrl - Optional API URL for relayer
307
+ * @returns Transaction signature
308
+ */
309
+ closePrivate(destination: PublicKey, apiUrl?: string): Promise<string>;
310
+ /**
311
+ * Withdraw using ZK proof (private mode only)
312
+ * Uses relayer to submit transaction - vault pays for fees
313
+ * @param amount - Amount in lamports to withdraw
314
+ * @param destination - Destination for funds
315
+ * @param apiUrl - Optional API URL for relayer
316
+ * @returns Transaction signature
317
+ */
318
+ withdrawPrivate(amount: number, destination: PublicKey, apiUrl?: string): Promise<string>;
319
+ }
320
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"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"}