import {
Connection,
Keypair,
SystemProgram,
TransactionMessage,
VersionedTransaction,
ComputeBudgetProgram,
} from "@solana/web3.js";
import bs58 from "bs58";
import "dotenv/config";
const connection = new Connection(process.env.SOLANA_RPC!);
const payer = Keypair.fromSecretKey(bs58.decode(process.env.PRIVATE_KEY!));
async function optimizeComputeBudget() {
const latestBlockhash = await connection.getLatestBlockhash();
// Your transaction instructions (without CU limit set yet)
const instructions = [
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 10_000 }),
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: payer.publicKey,
lamports: 1000,
}),
];
// Build and simulate WITHOUT SetComputeUnitLimit
const message = new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: latestBlockhash.blockhash,
instructions,
}).compileToV0Message();
const transaction = new VersionedTransaction(message);
transaction.sign([payer]);
const simulation = await connection.simulateTransaction(transaction);
const unitsConsumed = simulation.value.unitsConsumed || 0;
console.log("Simulated CUs:", unitsConsumed);
// Add 10% margin
const cuLimit = Math.ceil(unitsConsumed * 1.1);
console.log("Setting CU limit to:", cuLimit);
// Rebuild with the optimized CU limit
const optimizedInstructions = [
ComputeBudgetProgram.setComputeUnitLimit({ units: cuLimit }),
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 10_000 }),
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: payer.publicKey,
lamports: 1000,
}),
];
const optimizedMessage = new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: latestBlockhash.blockhash,
instructions: optimizedInstructions,
}).compileToV0Message();
const optimizedTx = new VersionedTransaction(optimizedMessage);
optimizedTx.sign([payer]);
const sig = await connection.sendTransaction(optimizedTx);
console.log("Transaction:", sig);
}
optimizeComputeBudget();