Developers
SDK Documentation
Complete guide to the Lumen SDK
Documentation
5 min read
Lumen SDK
Official JavaScript/TypeScript SDK for interacting with the Lumen chain (Cosmos SDK + Lumen modules).
This page is aligned with the real SDK source at integrations/npm/sdk (package @lumen-chain/sdk).
Installation
npm install @lumen-chain/sdk
Or with yarn:
yarn add @lumen-chain/sdk
Quick Start
Read-only client (RPC + REST)
import { LumenClient, LUMEN } from '@lumen-chain/sdk';
// Defaults target a local node (see LUMEN.defaultRpc/defaultRest).
const endpoints = { rpc: LUMEN.defaultRpc, rest: LUMEN.defaultRest };
const client = await LumenClient.connect(endpoints, LUMEN.chainId);
console.log('height', await client.getHeight());
console.log('dns resolve', await client.dns().resolve('demo', 'lmn'));
Signing client (OfflineSigner + PQC)
import { LumenSigningClient, utils } from '@lumen-chain/sdk';
const signer = await utils.walletFromMnemonic(process.env.MNEMONIC!, 'lmn');
const [account] = await signer.getAccounts();
const signing = await LumenSigningClient.connectWithSigner(signer, endpoints, LUMEN.chainId);
// DNS is a gasless module tx: you can pass utils.gas.zeroFee(), or let the client auto-detect it.
const msg = signing.dns().msgRegister(account.address, { domain: 'demo', ext: 'lmn', durationDays: 30 });
const res = await signing.signAndBroadcast(account.address, [msg], utils.gas.zeroFee());
console.log('tx hash', res.transactionHash);
Addresses, chain id, endpoints
- bech32 prefix:
lmn(addresses look likelmn1...). - chain id:
lumenby default (LUMEN.chainId). - default local endpoints:
- RPC:
http://127.0.0.1:27657 - REST:
http://127.0.0.1:2327 - gRPC:
http://127.0.0.1:9190
- RPC:
You can override endpoints to point at a remote node/gateway. Some older nodes still expose 26657/1317; the SDK supports both.
Common patterns
Query balance
const bal = await client.getBalance('lmn1...');
console.log(bal);
Send tokens (bank MsgSend)
The SDK does not wrap bank sends into a sendTokens() helper. Use utils.msg.bankSend:
import { LumenSigningClient, utils } from '@lumen-chain/sdk';
const signer = await utils.walletFromMnemonic(process.env.MNEMONIC!, 'lmn');
const [account] = await signer.getAccounts();
const signing = await LumenSigningClient.connectWithSigner(signer);
const msg = utils.msg.bankSend(
account.address,
'lmn1recipient...',
[utils.coin.ulmn('1000000')], // 1 LMN
);
// Bank txs are not in the "gaslessTypeUrls" allowlist, so either pass an explicit zero fee,
// or provide a GasPrice=0 and let the client estimate gas.
const res = await signing.signAndBroadcast(account.address, [msg], utils.gas.zeroFee());
console.log(res.transactionHash);
DNS queries + tx composers
// Queries (REST)
const resolved = await client.dns().resolve('demo', 'lmn');
const domains = await client.dns().domainsByOwner('lmn1...');
// Tx composers (EncodeObject)
const msgRegister = client.dns().msgRegister('lmn1...', { domain: 'demo', ext: 'lmn', durationDays: 30 });
PQC (Dilithium)
Lumen can require Dilithium signatures for EOAs. The SDK can manage a local PQC keystore (~/.lumen/pqc_keys) and add
the lumen.pqc.v1.PQCSignatures extension during signAndBroadcast.
import { pqc } from '@lumen-chain/sdk';
const { publicKey, privateKey } = pqc.createKeyPair(); // Dilithium3
const store = await pqc.PqcKeyStore.open(); // defaults to ~/.lumen/pqc_keys
await store.saveKey({ name: 'my-key', scheme: 'dilithium3', publicKey, privateKey, createdAt: new Date() });
await store.linkAddress('lmn1...', 'my-key');
