apex-sdk-substrate
Substrate blockchain adapter for the Apex SDK, enabling seamless interaction with Polkadot, Kusama, and other Substrate-based chains.
Overview
apex-sdk-substrate provides a comprehensive Rust interface for interacting with Substrate-based blockchains. It offers type-safe APIs for transactions, storage queries, smart contracts (ink!), cross-chain messaging (XCM), and more.
Features
- Multi-Chain Support: Polkadot, Kusama, Westend, and custom Substrate chains
- Type-Safe Metadata: Compile-time type checking with generated metadata
- Smart Contracts: Full ink! smart contract support with deployment and interaction
- XCM Integration: Cross-chain messaging and asset transfers
- Wallet Management: SR25519/ED25519 key pair management and signing
- Connection Pooling: Robust connection management with health checks
- Caching Layer: Intelligent caching for storage queries and account data
- Metrics: Comprehensive monitoring and observability
Installation
Add this to your Cargo.toml:
[]
= "0.1"
= { = "1.0", = ["full"] }
Feature Flags
[]
= { = "0.1", = ["typed-westend"] }
Available features:
typed-polkadot- Typed metadata for Polkadottyped-kusama- Typed metadata for Kusamatyped-westend- Typed metadata for Westendtyped- Base typed metadata support
Quick Start
Basic Connection
use SubstrateAdapter;
async
Different Chain Connections
// Polkadot
let polkadot = polkadot.await?;
// Kusama
let kusama = kusama.await?;
// Westend Testnet
let westend = westend.await?;
// Custom Substrate chain
let custom = custom.await?;
Account and Wallet Management
Creating Wallets
use ;
// Generate new SR25519 keypair
let keypair = generate_sr25519;
let wallet = new;
println!;
println!;
From Mnemonic
use Wallet;
// Create from mnemonic phrase
let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
let wallet = from_mnemonic?;
// With custom derivation path
let wallet = from_mnemonic?;
Account Queries
let adapter = westend.await?;
// Get account balance
let account_id = wallet.account_id;
let balance = adapter.get_balance.await?;
println!;
// Get account nonce
let nonce = adapter.get_nonce.await?;
println!;
// Get account info
let account_info = adapter.get_account_info.await?;
println!;
println!;
Transaction Building and Submission
Basic Transfers
use ;
let adapter = westend.await?;
let wallet = from_mnemonic?;
// Build transfer transaction
let dest = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"; // Alice
let amount = 1_000_000_000_000u128; // 1 WND
let tx = new
.transfer_keep_alive
.build?;
// Sign and submit
let signed_tx = wallet.sign.await?;
let hash = adapter.submit_transaction.await?;
println!;
// Wait for finalization
let events = adapter.wait_for_finalized.await?;
println!;
Batch Transactions
let tx = new
.batch
.build?;
Smart Contract Integration (ink!)
Contract Deployment
use ;
let adapter = westend.await?;
let wallet = from_mnemonic?;
// Load contract metadata and WASM
let metadata = load?;
let wasm_code = read?;
// Deploy contract
let contract = new
.deploy
.await?;
println!;
Contract Interaction
// Call contract method
let result = contract
.call
.args
.dry_run // Read-only call
.await?;
println!;
// Execute contract transaction
let tx_hash = contract
.call
.args
.value // No payment
.submit
.await?;
println!;
Contract Events
// Listen for contract events
let mut event_stream = contract.events.await?;
while let Some = event_stream.next.await
Cross-Chain Messaging (XCM)
Asset Transfers
use ;
let adapter = polkadot.await?;
let wallet = from_mnemonic?;
let xcm = new;
// Transfer DOT to a parachain
let dest = parachain; // Acala parachain
let asset = native; // 1 DOT
let beneficiary = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
let tx_hash = xcm
.transfer_asset
.await?;
println!;
Reserve Transfers
// Reserve-based transfer
let tx_hash = xcm
.reserve_transfer_asset
.await?;
// Teleport (for trusted chains)
let tx_hash = xcm
.teleport_asset
.await?;
Storage Queries
System Storage
// Query any storage item
let storage_key = adapter.storage.system.account;
let account_info = adapter.query_storage.await?;
// Get storage at specific block
let block_hash = adapter.get_block_hash.await?;
let historical_data = adapter.query_storage.await?;
Custom Storage Queries
// Using storage client
let storage = adapter.storage;
// Query balances
let balance_key = storage.balances.account;
let balance_info = adapter.query_storage.await?;
// Query runtime version
let version = adapter.runtime_version.await?;
println!;
Advanced Features
Connection Pooling
use ;
let pool_config = PoolConfig ;
let adapter = with_pool.await?;
Caching
use CacheConfig;
let cache_config = CacheConfig ;
let adapter = westend
.await?
.with_cache;
Typed Metadata
With typed metadata, you get compile-time type safety:
// Enable with feature flag: features = ["typed-westend"]
use westend;
let adapter = westend.await?;
// Type-safe transaction building
let tx = tx
.balances
.transfer_keep_alive;
// Type-safe storage queries
let storage_query = storage
.system
.account;
let account_info = adapter.query_storage.await?;
Monitoring and Metrics
Built-in Metrics
use MetricsConfig;
let metrics_config = MetricsConfig ;
let adapter = westend
.await?
.with_metrics;
// Access metrics
let metrics = adapter.metrics;
println!;
println!;
Error Handling
use ;
match some_operation.await
Testing
Unit Tests
Integration Tests
Integration tests connect to Westend testnet.
Examples
Complete examples in the examples directory:
- Basic Transfer - Simple balance transfers
- Smart Contracts - ink! contract deployment and calls
- XCM Transfers - Cross-chain asset transfers
- Storage Queries - Querying chain storage
- Event Monitoring - Listening to chain events
Configuration
Chain Endpoints
// Polkadot
const POLKADOT_ENDPOINTS: & = &;
// Kusama
const KUSAMA_ENDPOINTS: & = &;
Environment Variables
# Chain endpoints
POLKADOT_RPC_URL="wss://rpc.polkadot.io"
KUSAMA_RPC_URL="wss://kusama-rpc.polkadot.io"
WESTEND_RPC_URL="wss://westend-rpc.polkadot.io"
# Mnemonics (for testing)
TEST_MNEMONIC="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
# API keys for public nodes
DWELLIR_API_KEY="your-dwellir-key"
ONFINALITY_API_KEY="your-onfinality-key"
Generating Typed Metadata
To use typed metadata features:
This generates type-safe Rust code from live chain metadata.
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Contributing
Contributions are welcome! Please read CONTRIBUTING.md for guidelines.