Documentation

TypeScript API Reference

Complete API documentation for Selendra TypeScript SDK v1.0.4

TypeScript SDK API Reference

Complete API documentation for @selendrajs/sdk v1.0.4.

Installation

npm install @selendrajs/sdk

SelendraSDK Class

Main SDK class for connecting to Selendra blockchain.

Creating an Instance

import { createSDK, SelendraSDK, ChainType } from "@selendrajs/sdk";

// Using factory function (recommended)
const sdk = createSDK({
  endpoint: "wss://rpc.selendra.org",
  chainType: ChainType.Substrate,
});

// Or using class directly
const sdk = new SelendraSDK({
  endpoint: "wss://rpc.selendra.org",
  chainType: ChainType.Substrate,
  autoReconnect: true,
  debug: false,
});

Configuration Options

interface SDKConfig {
  endpoint?: string; // RPC endpoint URL
  network?: string; // Network name
  chainType?: ChainType; // Substrate or EVM
  autoReconnect?: boolean; // Auto-reconnect on disconnect
  retryAttempts?: number; // Number of retry attempts
  debug?: boolean; // Enable debug logging
}

Core Methods

MethodReturnsDescription
connect()Promise<void>Connect to blockchain
disconnect()Promise<void>Disconnect from blockchain
destroy()Promise<void>Cleanup and destroy instance
getConnectionInfo()ConnectionInfoGet connection details
getBalance(address)Promise<bigint>Get account balance
getFormattedBalance(address)Promise<number>Get formatted balance
getApi()ApiPromiseGet Polkadot.js API instance
getEvmProvider()JsonRpcProviderGet Ethers.js provider

Events

sdk.on("connecting", () => console.log("Connecting..."));
sdk.on("connected", () => console.log("Connected!"));
sdk.on("disconnected", () => console.log("Disconnected"));
sdk.on("error", (error) => console.error("Error:", error));

Pallet API Pattern

The SDK organizes blockchain operations by pallet using a consistent pattern:

// Queries (read-only)
const result = await sdk.pallets.<pallet>.queries.<method>(params);

// Transactions (write operations)
const tx = sdk.pallets.<pallet>.manager.<method>(params);
await tx.signAndSend(signer);

Example: Balances Pallet

import { createSDK } from "@selendrajs/sdk";

const sdk = createSDK({ endpoint: "wss://rpc.selendra.org" });
await sdk.connect();

// Query balance
const balance = await sdk.pallets.balances.queries.account(address);
console.log("Free:", balance.free.toString());
console.log("Reserved:", balance.reserved.toString());

// Transfer tokens
const tx = sdk.pallets.balances.manager.transfer({
  dest: recipientAddress,
  value: "1000000000000000000", // 1 SEL in planck
});

// Sign and send
await tx.signAndSend(signer, {}, (result) => {
  if (result.status.isFinalized) {
    console.log("Transfer finalized!");
  }
});

Pallet Managers

BalancesManager

Token transfers and balance operations.

import { BalancesManager } from "@selendrajs/sdk";

// Queries
const balance = await sdk.pallets.balances.queries.account(address);
const total = await sdk.pallets.balances.queries.totalIssuance();
const locks = await sdk.pallets.balances.queries.locks(address);

// Transactions
sdk.pallets.balances.manager.transfer({ dest, value });
sdk.pallets.balances.manager.transferKeepAlive({ dest, value });
sdk.pallets.balances.manager.transferAll({ dest, keepAlive: true });

StakingManager

Validator nomination and staking operations.

import { StakingManager, RewardDestination } from "@selendrajs/sdk";

// Queries
const validators = await sdk.pallets.staking.queries.validators();
const era = await sdk.pallets.staking.queries.activeEra();
const ledger = await sdk.pallets.staking.queries.ledger(address);
const nominators = await sdk.pallets.staking.queries.nominators(address);

// Transactions
sdk.pallets.staking.manager.bond({
  value: "100000000000000000000",
  payee: RewardDestination.Staked,
});
sdk.pallets.staking.manager.bondExtra({ maxAdditional: amount });
sdk.pallets.staking.manager.unbond({ value: amount });
sdk.pallets.staking.manager.nominate({ targets: [validator1, validator2] });
sdk.pallets.staking.manager.chill();
sdk.pallets.staking.manager.payoutStakers({ validatorStash, era });

DemocracyManager

Governance proposals and referendums.

import { DemocracyManager, Conviction } from "@selendrajs/sdk";

// Queries
const referendum = await sdk.pallets.democracy.queries.referendumInfoOf(index);
const proposals = await sdk.pallets.democracy.queries.publicProps();
const voting = await sdk.pallets.democracy.queries.votingOf(address);

// Transactions
sdk.pallets.democracy.manager.propose({ proposalHash, value });
sdk.pallets.democracy.manager.vote({ refIndex, vote });
sdk.pallets.democracy.manager.delegate({
  to,
  conviction: Conviction.Locked1x,
  balance,
});
sdk.pallets.democracy.manager.removeVote({ index });

NominationPoolsManager

Staking pools for smaller nominators.

import { NominationPoolsManager } from "@selendrajs/sdk";

// Queries
const pool = await sdk.pallets.nominationPools.queries.bondedPools(poolId);
const member = await sdk.pallets.nominationPools.queries.poolMembers(address);
const metadata = await sdk.pallets.nominationPools.queries.metadata(poolId);

// Transactions
sdk.pallets.nominationPools.manager.join({ amount, poolId });
sdk.pallets.nominationPools.manager.bondExtra({
  extra: { FreeBalance: amount },
});
sdk.pallets.nominationPools.manager.claimPayout();
sdk.pallets.nominationPools.manager.unbond({ memberAccount, unbondingPoints });
sdk.pallets.nominationPools.manager.withdrawUnbonded({
  memberAccount,
  numSlashingSpans,
});

EvmManager

EVM contract deployment and interaction.

import { EvmManager } from "@selendrajs/sdk";

// Queries
const account = await sdk.pallets.evm.queries.accountBasic(evmAddress);
const code = await sdk.pallets.evm.queries.accountCodes(contractAddress);
const storage = await sdk.pallets.evm.queries.accountStorages(address, slot);

// Deploy contract (CREATE)
sdk.pallets.evm.manager.create({
  source: evmAddress,
  init: bytecode,
  value: 0n,
  gasLimit: 1000000n,
  maxFeePerGas: 1000000000n,
});

// Call contract
sdk.pallets.evm.manager.call({
  source: evmAddress,
  target: contractAddress,
  input: encodedData,
  value: 0n,
  gasLimit: 100000n,
  maxFeePerGas: 1000000000n,
});

Unified Accounts

Convert between Substrate (SS58) and EVM (0x) addresses.

import {
  UnifiedAccountsManager,
  calculateDefaultEvmAddress,
  calculateDefaultSubstrateAddress,
  isValidSubstrateAddress,
  isValidEvmAddress,
} from "@selendrajs/sdk";

// Utility functions
const evmAddr = calculateDefaultEvmAddress(substrateAddress);
const subAddr = calculateDefaultSubstrateAddress(evmAddress);

// Validate addresses
const isSubstrate = isValidSubstrateAddress(address);
const isEvm = isValidEvmAddress(address);

// Using UnifiedAccountsManager
const manager = new UnifiedAccountsManager(api);

// Get mapping info
const evmMapping = await manager.getEvmAddressForSubstrate(substrateAddress);
const substrateMapping = await manager.getSubstrateAddressForEvm(evmAddress);

// Claim default EVM address
const claimTx = manager.claimDefaultEvmAddress();
await claimTx.signAndSend(signer);

Wallet Utilities

import { SelendraWallet, WalletUtils } from "@selendrajs/sdk";

// Create wallet from mnemonic
const wallet = SelendraWallet.fromMnemonic(mnemonic);

// Create wallet from private key
const wallet = SelendraWallet.fromPrivateKey(privateKey);

// Generate new wallet
const wallet = SelendraWallet.generate();

// Get addresses
const substrateAddress = wallet.substrateAddress;
const evmAddress = wallet.evmAddress;

// Sign transactions
const signature = await wallet.sign(message);

Logger Configuration

import { configureLogger, suppressNodeWarnings } from "@selendrajs/sdk";

// Suppress Node.js warnings (e.g., punycode deprecation)
suppressNodeWarnings();

// Configure logger
configureLogger({
  level: "info", // 'debug' | 'info' | 'warn' | 'error' | 'silent'
  prefix: "MyApp",
});

Type Exports

The SDK exports comprehensive TypeScript types:

// Core types
import type { SDKConfig, ConnectionInfo, SDKEvents } from "@selendrajs/sdk";

// Pallet types
import type {
  AccountData,
  TransferParams,
  StakingLedger,
  ValidatorPrefs,
  ReferendumInfo,
  BondedPoolInfo,
} from "@selendrajs/sdk";

// Enums
import {
  ChainType,
  Network,
  RewardDestination,
  Conviction,
} from "@selendrajs/sdk";

Error Handling

try {
  const tx = sdk.pallets.balances.manager.transfer({ dest, value });
  const result = await tx.signAndSend(signer);

  // Check for errors in events
  result.events.forEach(({ event }) => {
    if (sdk.getApi().events.system.ExtrinsicFailed.is(event)) {
      const [error] = event.data;
      if (error.isModule) {
        const decoded = sdk.getApi().registry.findMetaError(error.asModule);
        throw new Error(`${decoded.section}.${decoded.name}: ${decoded.docs}`);
      }
    }
  });
} catch (error) {
  console.error("Transaction failed:", error);
}

Network Endpoints

NetworkWebSocketHTTPChain ID
Mainnetwss://rpc.selendra.orghttps://rpc.selendra.org1961
Testnetwss://rpc-testnet.selendra.orghttps://rpc-testnet.selendra.org1953

See Also

Contribute

Found an issue or want to contribute?

Help us improve this documentation by editing this page on GitHub.

Edit this page on GitHub
Selendra - Build on Cambodian Blockchain with Testnet