The Rpc connection is used to interact with the ZK Compression JSON RPC. It's a thin wrapper extending Solana's web3.js Connection class with compression-related endpoints, such as getCompressedAccount, getCompressedTokenBalancesByOwner, and more.
Example Usage with Devnet
const stateless = require("@lightprotocol/stateless.js");
/// Helius exposes Solana and compression RPC endpoints through a single URL
const RPC_ENDPOINT = "https://devnet.helius-rpc.com?api-key=<api_key>";
const COMPRESSION_RPC_ENDPOINT = RPC_ENDPOINT;
const PROVER_ENDPOINT = RPC_ENDPOINT
const connection: Rpc = createRpc(RPC_ENDPOINT, COMPRESSION_RPC_ENDPOINT, PROVER_ENDPOINT)
async function main() {
let slot = await connection.getSlot();
console.log(slot);
let health = await connection.getIndexerHealth(slot);
console.log(health);
// "Ok"
}
main();
Visit the JSON RPC Methods section for the full list of compression endpoints supported in Rpc .
Quickstart
Starting the test-validator for Local Development
light test-validator
The command above will start a single-node Solana cluster, an RPC node, and a prover node at ports 8899, 8784, and 3001.
Creating and Sending Transactions
Creating, Minting, and Transferring a Compressed Token
This example uses the compressed token program, which is built using ZK Compression and offers an SPL-compatible token layout.
import {
LightSystemProgram,
Rpc,
confirmTx,
createRpc,
} from "@lightprotocol/stateless.js";
import { createMint, mintTo, transfer } from "@lightprotocol/compressed-token";
import { Keypair } from "@solana/web3.js";
const payer = Keypair.generate();
const tokenRecipient = Keypair.generate();
/// Localnet
const connection: Rpc = createRpc();
const main = async () => {
/// Airdrop lamports to pay fees
await confirmTx(
connection,
await connection.requestAirdrop(payer.publicKey, 10e9)
);
await confirmTx(
connection,
await connection.requestAirdrop(tokenRecipient.publicKey, 1e6)
);
/// Create a compressed token mint
const { mint, transactionSignature } = await createMint(
connection,
payer,
payer.publicKey,
9 // Number of decimals
);
console.log(`create-mint success! txId: ${transactionSignature}`);
/// Mint compressed tokens to the payer's account
const mintToTxId = await mintTo(
connection,
payer,
mint,
payer.publicKey, // Destination
payer,
1e9 // Amount
);
console.log(`Minted 1e9 tokens to ${payer.publicKey} was a success!`);
console.log(`txId: ${mintToTxId}`);
/// Transfer compressed tokens
const transferTxId = await transfer(
connection,
payer,
mint,
7e8, // Amount
payer, // Owner
tokenRecipient.publicKey // To address
);
console.log(`Transfer of 7e8 ${mint} to ${tokenRecipient.publicKey} was a success!`);
console.log(`txId: ${transferTxId}`);
};
main();
Creating Lookup Tables
For public networks, we provide shared lookup tables for Light's common program IDs and accounts