import {
createUtxo,
createZeroUtxo,
generateUtxoKeypair,
partialWithdraw,
transact,
setCircuitsPath,
} from "@cloak.ag/sdk";
import { Connection, Keypair, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { readFileSync } from "node:fs";
import { join } from "node:path";
const connection = new Connection(
process.env.SOLANA_RPC_URL || "https://api.devnet.solana.com",
"confirmed"
);
const keypairPath = process.env.KEYPAIR_PATH || join(process.env.HOME!, ".config/solana/id.json");
const keypair = Keypair.fromSecretKey(
Uint8Array.from(JSON.parse(readFileSync(keypairPath, "utf8")))
);
const programId = new PublicKey(
process.env.CLOAK_PROGRAM_ID || "c1oak6tetxYnNfvXKFkpn1d98FxtK7B68vBQLYQpWKp"
);
const relayUrl = process.env.CLOAK_RELAY_URL || "http://127.0.0.1:5500";
setCircuitsPath(process.env.CIRCUITS_PATH || "https://cloak.ag/circuits");
const owner = await generateUtxoKeypair();
const depositAmount = BigInt(0.02 * LAMPORTS_PER_SOL); // 0.02 SOL
const depositUtxo = await createUtxo(depositAmount, owner);
const deposit = await transact(
{
inputUtxos: [await createZeroUtxo()],
outputUtxos: [depositUtxo],
externalAmount: depositAmount,
depositor: keypair.publicKey,
},
{
connection,
programId,
relayUrl,
depositorKeypair: keypair,
}
);
const recipient = Keypair.generate().publicKey;
const withdraw = await partialWithdraw(
deposit.outputUtxos,
recipient,
BigInt(0.005 * LAMPORTS_PER_SOL),
{
connection,
programId,
relayUrl,
depositorKeypair: keypair,
cachedMerkleTree: deposit.merkleTree,
}
);
console.log("Deposit tx:", deposit.signature);
console.log("Withdraw tx:", withdraw.signature);