Skip to content

javascript ​

Send a transaction using JavaScript with @solana/web3.js.

Using Connection ​

bash
npm install @solana/web3.js@1 bs58
javascript
import { Connection, Keypair, PublicKey, SystemProgram, Transaction } from "@solana/web3.js";
import bs58 from "bs58";

// Your Solana RPC: blockhash and confirmations
const RPC_URL = "https://api.mainnet-beta.solana.com";
// BlockSprint: sending only
const ENDPOINT = "https://fra.blocksprint.io/api/v1/YOUR_API_KEY";
const TIP_ADDRESS = new PublicKey("Sp1x2AqpQckPLaWnWCJUNg8k6qQexfaEWcSRKf5JcDV");

const rpc = new Connection(RPC_URL, "confirmed");
const blocksprint = new Connection(ENDPOINT);

// Your funded wallet and the recipient
const wallet = Keypair.fromSecretKey(bs58.decode(process.env.PAYER_SECRET_BASE58));
const recipient = new PublicKey(process.env.RECIPIENT);

// Create transaction
const transaction = new Transaction();

// Add your instruction
transaction.add(
  SystemProgram.transfer({
    fromPubkey: wallet.publicKey,
    toPubkey: recipient,
    lamports: 1_000_000,
  })
);

// Add tip instruction (0.001 SOL minimum)
transaction.add(
  SystemProgram.transfer({
    fromPubkey: wallet.publicKey,
    toPubkey: TIP_ADDRESS,
    lamports: 1_000_000,
  })
);

// Get recent blockhash from your RPC
const { blockhash } = await rpc.getLatestBlockhash();
transaction.recentBlockhash = blockhash;
transaction.feePayer = wallet.publicKey;

// Sign and send through BlockSprint (web3.js sends base64)
transaction.sign(wallet);

const signature = await blocksprint.sendRawTransaction(
  transaction.serialize(),
  {
    skipPreflight: true,
    maxRetries: 0,
  }
);

console.log("Signature:", signature);
// The signature means "accepted", not "landed": check it with rpc.getSignatureStatuses([signature])

Using Fetch (Raw JSON-RPC) ​

javascript
const ENDPOINT = "https://fra.blocksprint.io/api/v1/YOUR_API_KEY";

// serializedTransaction: Uint8Array/Buffer, e.g. signedTransaction.serialize()
async function sendTransaction(serializedTransaction) {
  const base64 = Buffer.from(serializedTransaction).toString("base64");

  const response = await fetch(ENDPOINT, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      jsonrpc: "2.0",
      id: 1,
      method: "sendTransaction",
      params: [
        base64,
        {
          encoding: "base64",
          skipPreflight: true,
          maxRetries: 0,
        },
      ],
    }),
  });

  // Errors come back as JSON-RPC errors with an HTTP 4xx/5xx status
  const result = await response.json();

  if (result.error) {
    throw new Error(`${result.error.code}: ${result.error.message}`);
  }

  return result.result; // signature
}

// Usage
// const signature = await sendTransaction(signedTransaction.serialize());

With Priority Fee ​

javascript
import { ComputeBudgetProgram, Transaction } from "@solana/web3.js";

const transaction = new Transaction();

// Set priority fee (micro-lamports per compute unit)
transaction.add(
  ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1_000_000,
  })
);

// Set compute limit
transaction.add(
  ComputeBudgetProgram.setComputeUnitLimit({
    units: 200_000,
  })
);

// Your instruction
transaction.add(yourInstruction);

// Tip instruction (see "Rotating Tip Addresses")
transaction.add(tipInstruction);

Rotating Tip Addresses ​

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

// BlockSprint tip addresses
const TIP_ADDRESSES = [
  "Sp1x2AqpQckPLaWnWCJUNg8k6qQexfaEWcSRKf5JcDV",
  "Sp4JHSh9cksfzXbgK7Pq2ovtn8LirLQydaJKTsiNT77",
  "Sp1xMS2cbw83SZDNr4AGqkBYYLjb3LvVnmDSrTMaHkr",
  "SpagSJmnh8E9cGT5Y431xPPaS2c1xLREGGCWN9yDeUf",
  "SpWrza9E63MQuHeGnnfzmtLVCs3pBdjyKPXUABPo9nq",
  "SpXyoqMHJEhsNQ9fHh3DTGGzrGroZ5zfDtJwFvN4kXi",
  "Spv2g3L837bVeHwkyb18LhA5P1bvJbkvaZbxcZXbwC2",
  "SpDUe5MyFGG97SmdBQMWNPbx2Et9bZt2TCbZm3TujgX",
  "SpKZ28tFzQ13kVjHhsyDEiQfkPGjA7Wmk185KcEDyuh",
  "SpxPqegfoR3QkBN7guRUiU6QfhtTW1CnKSTSSapumqm",
];

function getRandomTipAddress() {
  const index = Math.floor(Math.random() * TIP_ADDRESSES.length);
  return new PublicKey(TIP_ADDRESSES[index]);
}

// Use in transaction: a top-level System Program transfer
transaction.add(
  SystemProgram.transfer({
    fromPubkey: wallet.publicKey,
    toPubkey: getRandomTipAddress(),
    lamports: 1_000_000,
  })
);

INFO

Transaction V1: @solana/web3.js 1.x builds legacy and v0 transactions. To build V1, use @solana/kit 8.0.0 or later; see Transaction V1.