Skip to main content

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.