Solana Overview

Murena leverages Solana's Sealevel runtime for parallel execution, sub-second finality, and low fees.

Key Solana concepts we use

  • Accounts & PDAs — state is stored in accounts; program-derived addresses (PDAs) map notes, nullifiers, and globals.
  • Compute units & priority fees — proofs can be heavier; relayers handle compute units and priority fees for users.
  • Events & logs — emit verification receipts and nullifier events for explorers.

Minimal example: reading an event (TypeScript)

import { Connection, PublicKey } from "@solana/web3.js";

const RPC = process.env.RPC ?? "https://api.mainnet-beta.solana.com";
const PROGRAM_ID = new PublicKey("MuReNa1111111111111111111111111111111"); // placeholder

const connection = new Connection(RPC, "confirmed");

(async () => {
  const sigs = await connection.getSignaturesForAddress(PROGRAM_ID, { limit: 5 });
  const tx = await connection.getTransaction(sigs[0].signature, { maxSupportedTransactionVersion: 0 });
  console.log("Last tx logs:", tx?.meta?.logMessages);
})();

Priority fees cheat sheet

import { ComputeBudgetProgram, TransactionMessage, VersionedTransaction } from "@solana/web3.js";

// add ~1–2M CUs depending on proof size
const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 1_600_000 });
const prioIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 10_000 }); // adjust to network

// prepend cu/prio to your message instructions
const message = new TransactionMessage({
  payerKey: feePayer, recentBlockhash, instructions: [cuIx, prioIx, ...ixs]
}).compileToV0Message();
const tx = new VersionedTransaction(message);