Selendra

Documentation

Rust SDK API Reference

Complete API documentation for Selendra Rust SDK.

SelendraSDK

Main SDK struct providing access to all Selendra functionality.

Constructors & Core Methods

MethodSignatureReturnsDescription
new()pub fn new(network: Network, ws_endpoint: &str) -> Result<Self>SDK instanceCreate SDK with network and endpoint
with_options()pub fn with_options(options: SelendraSDKOptions) -> Result<Self>SDK instanceCreate SDK with full configuration
connect()pub async fn connect(&mut self) -> Result<()>Connection statusEstablish network connection
disconnect()pub async fn disconnect(&mut self) -> Result<()>Disconnection statusClose network connection
is_connected()pub fn is_connected(&self) -> boolConnection stateCheck connection status
get_chain_info()pub async fn get_chain_info(&self) -> Result<ChainInfo>Chain metadataGet chain information

Example

use selendra_sdk::{SelendraSDK, Network};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut sdk = SelendraSDK::new(Network::Mainnet, "wss://rpc.selendra.org")?;
    sdk.connect().await?;
    let info = sdk.get_chain_info().await?;
    println!("Connected to {}", info.chain_name);
    Ok(())
}

Configuration Types

SelendraSDKOptions

Configuration options for the SDK.

pub struct SelendraSDKOptions {
    pub network: Network,
    pub ws_endpoint: String,
    pub http_endpoint: Option<String>,
    pub default_account: Option<String>,
    pub auto_connect: bool,
    pub connection_timeout: Option<Duration>,
    pub retry_attempts: u32,
    pub retry_delay: Duration,
}

Network

Network configuration.

pub enum Network {
    Mainnet,
    Testnet,
    Custom {
        chain_id: u64,
        ws_endpoint: String,
        http_endpoint: Option<String>,
    },
}

NetworkConfig

Network-specific configuration.

pub struct NetworkConfig {
    pub name: String,
    pub chain_id: u64,
    pub ws_endpoint: String,
    pub http_endpoint: Option<String>,
    pub block_time: Duration,
    pub decimals: u8,
    pub token_symbol: String,
}

impl Network {
    pub fn config(&self) -> NetworkConfig;
}

Account Management

Methods

MethodSignatureReturnsDescription
create_account()pub async fn create_account(&mut self, options: Option<CreateAccountOptions>) -> Result<CreatedAccount>New account with mnemonicCreate account with random mnemonic
import_account_from_mnemonic()pub async fn import_account_from_mnemonic(&mut self, mnemonic: &str, options: Option<ImportAccountOptions>) -> Result<Account>Imported accountImport from mnemonic phrase
import_account_from_private_key()pub async fn import_account_from_private_key(&mut self, private_key: &str, options: Option<ImportAccountOptions>) -> Result<Account>Imported accountImport from private key
get_accounts()pub async fn get_accounts(&self) -> Result<Vec<Account>>Account listGet all available accounts
get_balance()pub async fn get_balance(&self, address: &str) -> Result<Balance>Account balanceGet balance for address

Types

pub struct CreateAccountOptions {
    pub account_type: AccountType,
    pub name: Option<String>,
    pub password: Option<String>,
    pub derivation_path: Option<String>,
}

pub enum AccountType { Substrate, Evm, Both }

pub struct CreatedAccount {
    pub mnemonic: String,
    pub account: Account,
}

pub struct Balance {
    pub free: u128,
    pub reserved: u128,
    pub frozen: u128,
    pub total: u128,
    pub token_symbol: String,
    pub decimals: u8,
}

Example

let created = sdk.create_account(Some(CreateAccountOptions {
    account_type: AccountType::Both,
    name: Some("My Wallet".to_string()),
    password: None,
    derivation_path: Some("//m/44'/354'/0'/0'/0'".to_string()),
})).await?;

println!("Mnemonic: {}", created.mnemonic);
println!("Address: {}", created.account.address);

let balance = sdk.get_balance(&created.account.address).await?;
println!("Balance: {} {}", balance.free, balance.token_symbol);

Transactions

Methods

MethodSignatureReturnsDescription
transfer()pub async fn transfer(&self, options: TransferOptions) -> Result<Transaction>Transaction detailsTransfer tokens to address
send_transaction()pub async fn send_transaction(&self, options: SendTransactionOptions) -> Result<Transaction>Transaction detailsSend custom transaction
estimate_gas()pub async fn estimate_gas(&self, options: SendTransactionOptions) -> Result<u64>Gas estimateEstimate gas for transaction
get_transaction()pub async fn get_transaction(&self, hash: &str) -> Result<Option<Transaction>>Transaction detailsGet transaction by hash
get_transaction_receipt()pub async fn get_transaction_receipt(&self, hash: &str) -> Result<Option<TransactionReceipt>>Receipt detailsGet transaction receipt

Types

pub struct TransferOptions {
    pub to: String,
    pub amount: u128,
    pub from: Option<String>,
    pub memo: Option<String>,
    pub gas_limit: Option<u64>,
    pub max_fee_per_gas: Option<u128>,
    pub max_priority_fee_per_gas: Option<u128>,
}

Returns

pub struct Transaction {
    pub hash: String,
    pub from: String,
    pub to: String,
    pub amount: Option<u128>,
    pub data: Option<Vec<u8>>,
    pub gas_limit: Option<u64>,
    pub max_fee_per_gas: Option<u128>,
    pub max_priority_fee_per_gas: Option<u128>,
    pub nonce: Option<u64>,
    pub block_number: Option<u64>,
    pub gas_limit: Option<u64>,
    pub max_fee_per_gas: Option<u128>,
    pub max_priority_fee_per_gas: Option<u128>,
}

pub struct SendTransactionOptions {
    pub from: Option<String>,
    pub to: Option<String>,
    pub data: Option<Vec<u8>>,
    pub value: Option<u128>,
    pub gas_limit: Option<u64>,
    pub max_fee_per_gas: Option<u128>,
    pub max_priority_fee_per_gas: Option<u128>,
    pub nonce: Option<u64>,
}

pub struct Transaction {
    pub hash: String,
    pub from: String,
    pub to: String,
    pub amount: Option<u128>,
    pub data: Option<Vec<u8>>,
    pub nonce: Option<u64>,
    pub block_number: Option<u64>,
    pub block_hash: Option<String>,
    pub status: TransactionStatus,
    pub events: Vec<TransactionEvent>,
}

pub enum TransactionStatus { Pending, Included, Finalized, Failed { error: String } }

Example

let tx = sdk.transfer(TransferOptions {
    to: "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY".to_string(),
    amount: 1_000_000_000_000,
    from: None,
    memo: Some("Payment".to_string()),
    gas_limit: None,
    max_fee_per_gas: None,
    max_priority_fee_per_gas: None,
}).await?;

println!("Transaction: {} - Status: {:?}", tx.hash, tx.status);

Smart Contracts

Contract Struct

MethodSignatureReturnsDescription
new()pub fn new(address: &str, abi: &[u8], sdk: &SelendraSDK) -> Result<Self>Contract instanceCreate contract interface
call()pub async fn call(&self, function: &str, args: &[Token]) -> Result<Token>Function outputCall view function
send()pub async fn send(&self, function: &str, args: &[Token], options: SendOptions) -> Result<Transaction>TransactionExecute contract function

SDK Methods

MethodSignatureReturnsDescription
deploy_contract()pub async fn deploy_contract(&self, options: DeployOptions) -> Result<DeployedContract>Contract addressDeploy new contract

Types

pub struct Contract<'a> {
    pub address: String,
    pub abi: EthAbi,
    sdk: &'a SelendraSDK,
}

pub struct SendOptions {
    pub from: Option<String>,
    pub value: Option<u128>,
    pub gas_limit: Option<u64>,
}

pub struct DeployOptions {
    pub bytecode: Vec<u8>,
    pub abi: Vec<u8>,
    pub constructor_args: Vec<ethabi::Token>,
    pub from: Option<String>,
    pub gas_limit: Option<u64>,
}

pub struct DeployedContract {
    pub address: String,
    pub transaction_hash: String,
    pub block_number: Option<u64>,
}

Example

// Deploy contract
let deployed = sdk.deploy_contract(DeployOptions {
    bytecode: contract_bytecode,
    abi: abi_bytes,
    constructor_args: vec![Token::String("My Token".to_string()), Token::String("MTK".to_string())],
    from: Some(my_address),
    gas_limit: None,
}).await?;

// Interact with contract
let contract = Contract::new(&deployed.address, &abi_bytes, &sdk)?;
let balance = contract.call("balanceOf", &[Token::Address(addr.parse()?)]).await?;

EVM Compatibility

Methods

MethodSignatureReturnsDescription
get_evm_account()pub async fn get_evm_account(&self, address: &str) -> Result<EvmAccount>Account infoGet EVM account details
get_evm_transaction_count()pub async fn get_evm_transaction_count(&self, address: &str) -> Result<u64>NonceGet transaction count
get_evm_block()pub async fn get_evm_block(&self, block: BlockId) -> Result<EvmBlock>Block dataGet block information
send_evm_transaction()pub async fn send_evm_transaction(&self, tx: EvmTransactionRequest) -> Result<EvmTransaction>TransactionSend EVM transaction

Types

pub struct EvmAccount {
    pub address: String,
    pub nonce: u64,
    pub balance: u128,
    pub code_hash: String,
}

pub enum BlockId { Number(u64), Hash(String), Latest, Earliest, Pending }

pub struct EvmTransactionRequest {
    pub from: String,
    pub to: Option<String>,
    pub data: Option<Vec<u8>>,
    pub value: Option<u128>,
    pub gas: Option<u64>,
    pub nonce: Option<u64>,
}

Substrate Integration

Methods

MethodSignatureReturnsDescription
query()pub async fn query(&self, pallet: &str, storage: &str, args: &[String]) -> Result<Value>Storage valueQuery Substrate storage
tx()pub fn tx(&self, pallet: &str, method: &str, args: &[Value]) -> SubmittableExtrinsicExtrinsicCreate Substrate transaction
get_runtime_version()pub async fn get_runtime_version(&self) -> Result<RuntimeVersion>Runtime infoGet runtime version
subscribe_to_heads()pub async fn subscribe_to_heads(&self, callback: F) -> Result<Unsubscribe>Unsubscribe handleSubscribe to new blocks

Example

// Query storage
let account_info = sdk.query("System", "Account", &["5GrwvaEF..."]).await?;

// Create and send transaction
let tx = sdk.tx("Balances", "transfer", &[
    Value::String("5GrwvaEF...".to_string()),
    Value::Number(1_000_000_000_000.into()),
]);
let hash = tx.sign_and_send(&keypair).await?;

// Subscribe to blocks
let unsub = sdk.subscribe_to_heads(|header| {
    println!("New block: {}", header.number);
}).await?;

Utilities

Methods

MethodSignatureReturnsDescription
format_balance()pub fn format_balance(balance: u128, decimals: u8) -> StringFormatted stringFormat balance for display
parse_balance()pub fn parse_balance(balance: &str, decimals: u8) -> Result<u128>Parsed amountParse balance string
address_to_evm()pub fn address_to_evm(substrate_address: &str) -> Result<String>EVM addressConvert Substrate to EVM address
evm_to_address()pub fn evm_to_address(evm_address: &str) -> Result<String>Substrate addressConvert EVM to Substrate address
validate_address()pub fn validate_address(address: &str) -> AddressTypeAddress typeValidate address format
get_fee_estimate()pub async fn get_fee_estimate(&self) -> Result<FeeEstimate>Fee infoGet current fee estimates

Types

pub enum AddressType { Substrate, Evm, Invalid }

pub struct FeeEstimate {
    pub slow: FeeTier,
    pub average: FeeTier,
    pub fast: FeeTier,
}

pub struct FeeTier {
    pub max_fee_per_gas: u128,
    pub max_priority_fee_per_gas: u128,
    pub estimated_time: u64,
}

Core Types

Account

pub struct Account {
    pub address: String,
    pub name: Option<String>,
    pub account_type: AccountType,
    pub public_key: String,
}

ChainInfo

pub struct ChainInfo {
    pub chain_name: String,
    pub chain_id: u64,
    pub version: String,
    pub spec_version: u32,
    pub impl_version: u32,
    pub token_decimals: u8,
    pub token_symbol: String,
}

RuntimeVersion

pub struct RuntimeVersion {
    pub spec_name: String,
    pub impl_name: String,
    pub authoring_version: u32,
    pub spec_version: u32,
    pub impl_version: u32,
}

Error Handling

SelendraError

pub enum SelendraError {
    ConnectionError(String),
    InvalidAddress(String),
    InsufficientBalance { required: u128, available: u128 },
    TransactionFailed(String),
    ContractError(String),
    Timeout,
    SerializationError(String),
    DeserializationError(String),
    Other(String),
}

impl std::fmt::Display for SelendraError { /* ... */ }
impl std::error::Error for SelendraError { /* ... */ }

Example

match sdk.transfer(options).await {
    Ok(tx) => println!("Transfer successful: {}", tx.hash),
    Err(SelendraError::InsufficientBalance { required, available }) => {
        eprintln!("Insufficient balance: need {}, have {}", required, available);
    },
    Err(SelendraError::InvalidAddress(addr)) => {
        eprintln!("Invalid address: {}", addr);
    },
    Err(e) => eprintln!("Transfer failed: {}", e),
}

Async Patterns

All async operations use Rust's async/await syntax and require a Tokio runtime.

Example

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut sdk = SelendraSDK::new(Network::Mainnet, "wss://rpc.selendra.org")?;
    sdk.connect().await?;

    let balance = sdk.get_balance("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY").await?;
    println!("Balance: {}", balance.free);

    // Timeout example
    use tokio::time::timeout;
    let result = timeout(Duration::from_secs(30), sdk.get_balance(address)).await??;

    Ok(())
}

This API reference covers all major functionality of the Selendra Rust SDK. For more examples, check out our examples directory and tutorials.

Contribute

Found an issue or want to contribute?

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

Edit this page on GitHub