Official JavaScript/TypeScript SDK for Lumera Protocol
A unified SDK providing seamless access to the Lumera blockchain and Cascade distributed storage network. Built with modern TypeScript, featuring comprehensive type safety, and designed for both Node.js and browser environments.
- π Unified Client Interface - Single entry point for all Lumera operations
- βοΈ Blockchain Operations - Complete CosmJS integration with LCD/REST queries
- Transaction simulation, signing, and broadcasting
- Action module queries and operations
- Supernode module queries
- Chain parameter queries
- π¦ Cascade Storage - Full-featured distributed file storage client
- Upload/download with progress tracking
- Automatic file chunking and Reed-Solomon encoding
- Task management with polling and status updates
- Stream-based downloads for memory efficiency
- π Wallet Integration - Support for multiple wallet types
- Keplr wallet integration
- Leap wallet integration
- Programmatic signing with DirectSecp256k1HdWallet
- π― Type Safety - Full TypeScript support with comprehensive types
- π Cross-Platform - Works in Node.js (v18+) and modern browsers
- π Extensive Documentation - Complete API reference and examples
pnpm install @lumera-protocol/sdk-jsFor blockchain operations, you'll also need CosmJS packages:
pnpm install @cosmjs/proto-signing @cosmjs/stargateimport { createLumeraClient } from "@lumera-protocol/sdk-js";
import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";
// Create a wallet
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(
"your mnemonic phrase here",
{ prefix: "lumera" }
);
const [account] = await wallet.getAccounts();
// Create the client using testnet preset
const client = await createLumeraClient({
preset: "testnet",
signer: wallet,
address: account.address,
gasPrice: "0.025ulume"
});// Get chain information
const chainId = await client.Blockchain.getChainId();
console.log("Chain ID:", chainId);
// Query action module parameters
const actionParams = await client.Blockchain.Action.getParams();
console.log("Action params:", actionParams);
// Query supernode module parameters
const supernodeParams = await client.Blockchain.Supernode.getParams();
console.log("Supernode params:", supernodeParams);// Prepare your file
const fileContent = "Hello, Lumera!";
const fileBytes = new TextEncoder().encode(fileContent);
// Upload to Cascade
const uploadResult = await client.Cascade.uploader.uploadFile(fileBytes, {
actionId: `my-file-${Date.now()}`,
rq_ids_ic: 1000,
rq_ids_max: actionParams.rq_ids_max,
taskOptions: {
pollInterval: 2000,
timeout: 300000,
},
});
console.log("Upload completed:", uploadResult);// Download using the action ID
const downloadStream = await client.Cascade.downloader.download(
uploadResult.actionId
);
// Read the stream
const reader = downloadStream.getReader();
const chunks: Uint8Array[] = [];
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
}
// Combine chunks
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
const downloadedBytes = new Uint8Array(totalLength);
let offset = 0;
for (const chunk of chunks) {
downloadedBytes.set(chunk, offset);
offset += chunk.length;
}
const downloadedContent = new TextDecoder().decode(downloadedBytes);
console.log("Downloaded:", downloadedContent);- Developer Guide - Environment setup, codegen, testing, and publishing workflows
- API Reference - Complete TypeScript API documentation (Typedoc HTML output)
- Migration Guide - Migrate from direct fetch/LCD calls to the SDK
- Examples - Working code examples
- Node.js Examples - Full workflow and standalone examples
- Browser Example - Browser-based upload/download demo
The SDK includes built-in presets for quick setup:
const client = await createLumeraClient({
preset: "testnet", // or "mainnet"
signer: wallet,
address: account.address,
});Available presets:
testnet- Lumera testnet configurationmainnet- Lumera mainnet configuration
For custom chains or advanced setups:
const client = await createLumeraClient({
rpcUrl: "https://your-rpc-url.com",
lcdUrl: "https://your-lcd-url.com",
chainId: "your-chain-id",
signer: wallet,
address: account.address,
gasPrice: "0.025ulume",
cascade: {
snapiBaseUrl: "https://your-snapi-url.com"
}
});Direct access to blockchain operations:
// Transaction operations
const msgs = [...]; // Your messages
const gas = await client.Blockchain.Tx.simulate(address, msgs);
const result = await client.Blockchain.Tx.broadcast(signedTx);
// Query operations
const actionList = await client.Blockchain.Action.listActions();
const supernodeList = await client.Blockchain.Supernode.listAll();File storage operations:
// Upload with progress tracking
const uploader = client.Cascade.uploader;
const result = await uploader.uploadFile(fileBytes, {
actionId: "my-action",
rq_ids_ic: 1000,
rq_ids_max: 10000,
});
// Download as stream
const downloader = client.Cascade.downloader;
const stream = await downloader.download("action-id");For low-level control over LEP-1 layout generation and ID derivation, the SDK exposes helpers:
import {
createSingleBlockLayout,
generateIds,
buildIndexFile,
} from "@lumera-protocol/sdk-js";
// 1. Create a single-block RaptorQ layout from file bytes
const layoutBytes = await createSingleBlockLayout(fileBytes);
// 2. Sign the canonical JSON layout bytes with your wallet (ADR-036)
// and obtain the base64-encoded signature string.
// 3. Derive deterministic layout IDs (must match on-chain validation)
const layoutIds = await generateIds(
layoutFileB64,
layoutSignatureB64,
rq_ids_ic,
rq_ids_max,
);
// 4. Build the LEP-1 index file
const index = buildIndexFile(layoutIds, layoutSignatureB64);To debug or validate determinism across Go and JS implementations, use the
lep1-id-lab golden-vector setup at the repo root.
# Install dependencies
pnpm install
# Run tests
pnpm test
# Run tests with coverage
pnpm run coverage
# Build the SDK
pnpm build
# Generate API documentation
pnpm run docs
# Lint code
pnpm lint- Node.js v18 or higher
- TypeScript 5.x (for development)
- Modern browser with ES2020+ support (for browser usage)
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
Apache-2.0 - see LICENSE file for details.
- For bug reports and feature requests, please open an issue on GitHub
- For questions and discussions, join our community channels
Built with β€οΈ by the Lumera Protocol team