@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.
- package/README.md +90 -0
- package/dist/agent.d.ts +321 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +877 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/idl.json +1347 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +374 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +320 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +61 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/relayer.d.ts +130 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +225 -0
- package/dist/relayer.js.map +1 -0
- package/dist/signer.d.ts +18 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +34 -0
- package/dist/signer.js.map +1 -0
- package/dist/token.d.ts +320 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +896 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/zk/browser-prover.d.ts +85 -0
- package/dist/zk/browser-prover.d.ts.map +1 -0
- package/dist/zk/browser-prover.js +260 -0
- package/dist/zk/browser-prover.js.map +1 -0
- package/dist/zk/discovery.d.ts +65 -0
- package/dist/zk/discovery.d.ts.map +1 -0
- package/dist/zk/discovery.js +143 -0
- package/dist/zk/discovery.js.map +1 -0
- package/dist/zk/index.d.ts +14 -0
- package/dist/zk/index.d.ts.map +1 -0
- package/dist/zk/index.js +47 -0
- package/dist/zk/index.js.map +1 -0
- package/dist/zk/ownership_proof.json +1 -0
- package/dist/zk/poseidon.d.ts +31 -0
- package/dist/zk/poseidon.d.ts.map +1 -0
- package/dist/zk/poseidon.js +103 -0
- package/dist/zk/poseidon.js.map +1 -0
- package/dist/zk/prover.d.ts +49 -0
- package/dist/zk/prover.d.ts.map +1 -0
- package/dist/zk/prover.js +120 -0
- package/dist/zk/prover.js.map +1 -0
- package/dist/zk/secrets.d.ts +62 -0
- package/dist/zk/secrets.d.ts.map +1 -0
- package/dist/zk/secrets.js +98 -0
- package/dist/zk/secrets.js.map +1 -0
- package/package.json +74 -0
package/dist/relayer.js
ADDED
|
@@ -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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"}
|
package/dist/signer.d.ts
ADDED
|
@@ -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"}
|
package/dist/token.d.ts
ADDED
|
@@ -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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"}
|