solami
v0.1.7
Published
TypeScript SDK for [solami.fast](https://solami.fast) - Solana RPC, gRPC streaming, WebSocket subscriptions, and SWQOS transaction landing.
Readme
solami
TypeScript SDK for solami.fast - Solana RPC, gRPC streaming, WebSocket subscriptions, and SWQOS transaction landing.
Install
npm install solamiSetup
Create a .env file:
SOLAMI_RPC_TOKEN=your_rpc_token_here
SOLANA_KEYPAIR=your_base58_keypair_here
SOLAMI_SWQOS_KEY=your_swqos_key_hereGet your tokens from the solami.fast dashboard.
Usage
Get Account Info
import "dotenv/config";
import { PublicKey } from "@solana/web3.js";
import { solamiFromEnv } from "solami";
const client = solamiFromEnv().build();
const pubkey = new PublicKey("11111111111111111111111111111111");
const account = await client.connection.getAccountInfo(pubkey);
console.log(`Lamports: ${account?.lamports}`);
console.log(`Owner: ${account?.owner}`);Get Balance
import "dotenv/config";
import { PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { solamiFromEnv } from "solami";
const client = solamiFromEnv().build();
const pubkey = new PublicKey("11111111111111111111111111111111");
const balance = await client.connection.getBalance(pubkey);
console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);Send Transaction (RPC)
import "dotenv/config";
import { Keypair, PublicKey, Transaction, SystemProgram, sendAndConfirmTransaction } from "@solana/web3.js";
import bs58 from "bs58";
import { solamiFromEnv } from "solami";
const client = solamiFromEnv().build();
const payer = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_KEYPAIR!));
const recipient = new PublicKey("11111111111111111111111111111112");
const blockhash = await client.connection.getLatestBlockhash();
const tx = new Transaction({ ...blockhash, feePayer: payer.publicKey }).add(
SystemProgram.transfer({ fromPubkey: payer.publicKey, toPubkey: recipient, lamports: 1 }),
);
const sig = await sendAndConfirmTransaction(client.connection, tx, [payer]);
console.log(`Signature: ${sig}`);Send Transaction (SWQOS)
import "dotenv/config";
import { Keypair, PublicKey, TransactionMessage, VersionedTransaction, SystemProgram } from "@solana/web3.js";
import bs58 from "bs58";
import { solamiFromEnv, buildTipIx } from "solami";
const client = solamiFromEnv().buildWithSwqos();
const payer = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_KEYPAIR!));
const recipient = new PublicKey("11111111111111111111111111111112");
const blockhash = await client.connection.getLatestBlockhash();
const message = new TransactionMessage({
payerKey: payer.publicKey,
recentBlockhash: blockhash.blockhash,
instructions: [
SystemProgram.transfer({ fromPubkey: payer.publicKey, toPubkey: recipient, lamports: 1 }),
buildTipIx(payer.publicKey, 0.0001),
],
}).compileToV0Message();
const tx = new VersionedTransaction(message);
tx.sign([payer]);
const sig = await client.landTransaction(tx);
console.log(`Signature: ${sig}`);gRPC: Subscribe to Slots
import "dotenv/config";
import { solamiFromEnv, SubscriptionBuilder } from "solami";
const client = solamiFromEnv().build();
const request = new SubscriptionBuilder()
.addSlots("slot_sub", { filterByCommitment: undefined, interslotUpdates: false })
.build();
const stream = await client.grpc.subscribe(request);
stream.on("data", (msg: any) => {
if (msg.slot) {
console.log(`Slot: ${msg.slot.slot} | Parent: ${msg.slot.parent} | Status: ${msg.slot.status}`);
}
});gRPC: Subscribe to Transactions
import "dotenv/config";
import { solamiFromEnv, CommitmentLevel } from "solami";
import bs58 from "bs58";
const client = solamiFromEnv().build();
const stream = await client.grpc.subscribeTransactions(
"tx_sub",
["11111111111111111111111111111111"],
CommitmentLevel.CONFIRMED,
);
stream.on("data", (msg: any) => {
if (msg.transaction) {
const sig = bs58.encode(Buffer.from(msg.transaction.transaction.signature));
console.log(`Signature: ${sig} | Slot: ${msg.transaction.slot}`);
}
});WebSocket: Subscribe to Slots
import "dotenv/config";
import { solamiFromEnv } from "solami";
const client = solamiFromEnv().build();
client.ws.connection.onSlotChange((slotInfo) => {
console.log(`Slot: ${slotInfo.slot} | Parent: ${slotInfo.parent} | Root: ${slotInfo.root}`);
});WebSocket: Subscribe to Logs
import "dotenv/config";
import { PublicKey } from "@solana/web3.js";
import { solamiFromEnv } from "solami";
const client = solamiFromEnv().build();
const programId = new PublicKey("11111111111111111111111111111111");
client.ws.connection.onLogs(programId, (log) => {
console.log(`Signature: ${log.signature}`);
for (const line of log.logs) {
console.log(` ${line}`);
}
}, "confirmed");Builder Configuration
import { solami } from "solami";
const client = solami("your_rpc_token")
.grpcToken("optional_separate_grpc_token")
.rpcBase("https://custom-rpc.example.com")
.wsBase("wss://custom-ws.example.com")
.grpcUrl("https://custom-grpc.example.com")
.swqosKey("your_swqos_key")
.buildWithSwqos();Environment Variables
| Variable | Required | Description |
|---|---|---|
| SOLAMI_RPC_TOKEN | Yes | RPC/gRPC API token |
| SOLAMI_GRPC_TOKEN | No | Separate gRPC token (defaults to RPC token) |
| SOLAMI_SWQOS_KEY | No | SWQOS API key (required for buildWithSwqos()) |
| SOLANA_KEYPAIR | No | Base58 keypair (required for sending transactions) |
License
MIT
