TypeScript
Use full service RPC for fetching latest blockhash.
import { Connection, PublicKey, Keypair, TransactionInstruction, SystemProgram, TransactionMessage, VersionedTransaction } from "@solana/web3.js";
const NOZOMI_ENDPOINT = "https://nozomi.temporal.xyz/api/sendTransaction2?c=<YOUR_API_KEY>";
const NOZOMI_TIP = new PublicKey("TEMPaMeCRFAS9EKF53Jd6KpHxgL47uWLcpFArU1Fanq");
const MIN_TIP_AMOUNT = 1_000_000;
const SOLANA_RPC_ENDPOINT = "https://api.mainnet-beta.solana.com";
async function sendNozomiTxn(
ixns: TransactionInstruction[],
signer: Keypair,
nozomiEndpoint: string,
solanaRpcClient: Connection
): Promise<void> {
const tipIxn = SystemProgram.transfer({
fromPubkey: signer.publicKey,
toPubkey: NOZOMI_TIP,
lamports: MIN_TIP_AMOUNT
});
ixns.push(tipIxn);
const { blockhash } = await solanaRpcClient.getLatestBlockhash();
const messageV0 = new TransactionMessage({
payerKey: signer.publicKey,
recentBlockhash: blockhash,
instructions: ixns,
}).compileToV0Message();
const versionedTxn = new VersionedTransaction(messageV0);
versionedTxn.sign([signer]);
const txnBytes = versionedTxn.serialize();
const txnBase64 = Buffer.from(txnBytes).toString('base64');
const response = await fetch(nozomiEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'text/plain',
},
body: txnBase64
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Transaction failed with status ${response.status}: ${errorText}`);
}
// api v2 does not return a signature, just check for success
console.log('Transaction sent successfully');
}
function buildIxns(): TransactionInstruction[] {
// your instruction building logic here..
return [];
}
async function main() {
const solanaRpcClient = new Connection(SOLANA_RPC_ENDPOINT);
// replace with actual keypair loading logic
const signer = Keypair.generate();
const ixns = buildIxns();
await sendNozomiTxn(ixns, signer, NOZOMI_ENDPOINT, solanaRpcClient);
}
main().catch(err => {
console.error(err);
});Last updated

