OneMoney Rust SDK
Official Rust SDK for the OneMoney L1 blockchain REST API.

Features
- Async/await support - Built with Tokio for high-performance async operations
- Cryptographic utilities - ECDSA signing, address derivation, and message verification
- Type-safe API - Strongly typed requests and responses with comprehensive error handling
- Modular design - Organized by functionality (accounts, tokens, transactions, etc.)
- Network support - Mainnet and testnet configurations
- Extensible - Hook system for middleware and custom logging
- Well documented - Comprehensive API documentation and examples
- Thoroughly tested - 398+ tests with 80%+ code coverage and continuous integration
- Production ready - Comprehensive error handling, retry logic, and security audits
Installation
Add this to your Cargo.toml:
[dependencies]
onemoney-protocol = "0.1.0"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
Quick Start
use onemoney_protocol::{Client, ClientBuilder, Network};
use alloy_primitives::{Address, U256};
use std::str::FromStr;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mainnet_client = Client::mainnet(); let testnet_client = Client::testnet(); let local_client = Client::local();
let client = ClientBuilder::new()
.network(Network::Testnet)
.build()?;
let address = Address::from_str("0x742d35Cc6634C0532925a3b8D91D6F4A81B8Cbc0")?;
let nonce = client.get_account_nonce(address).await?;
println!("Account nonce: {}", nonce.nonce);
let checkpoint_info = client.get_checkpoint_number().await?;
println!("Current checkpoint: {}", checkpoint_info.number);
Ok(())
}
Core Functionality
Client Configuration
use onemoney_protocol::{Client, ClientBuilder};
use std::time::Duration;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::mainnet(); let client = Client::testnet();
let client = ClientBuilder::new()
.netwok(Network::Custom("https://custom.api.endpoint.com".into()))
.timeout(Duration::from_secs(30))
.build()?;
}
Account Operations
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let nonce = client.get_account_nonce(address).await?;
let token_account = client.get_associated_token_account(owner, mint_address).await?;
println!("Balance: {}", token_account.amount);
let (accounts, total) = client.list_token_accounts(owner, Some(10), Some(0)).await?;
let token_account_addr = client.derive_token_account_address(wallet, mint);
}
Token Operations
use onemoney_protocol::{TokenMintPayload, Authority};
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mint_payload = TokenMintPayload {
chain_id: 1212101,
nonce: 1,
token: token_address,
recipient: recipient_address,
value: U256::from(1000000000000000000u64), };
let result = client.mint_token(mint_payload, private_key).await?;
}
Transaction Operations
use onemoney_protocol::PaymentPayload;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let payment = PaymentPayload {
chain_id: 1212101,
nonce: 2,
recipient: recipient_address,
value: U256::from(500000000000000000u64), token: token_address,
};
let result = client.send_payment(payment, private_key).await?;
println!("Payment sent: {}", result.hash);
let tx = client.get_transaction_by_hash(&result.hash).await?;
println!("Transaction status: {:?}", tx.status);
let confirmed_tx = client.wait_for_transaction(
&result.transaction_hash,
30, Duration::from_secs(2) ).await?;
}
Blockchain State
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let checkpoint_info = client.get_checkpoint_number().await?;
let chain = client.get_chain_info().await?;
println!("Chain ID: {}", chain.chain_id);
let stats = client.get_network_stats().await?;
println!("Total transactions: {}", stats.total_transactions);
}
Cryptographic Utilities
use alloy_primitives::B256;
use onemoney_protocol::{Client, crypto, signature_hash_for_counter_sign, verify_bls_aggregate_signature};
use std::str::FromStr;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::testnet()?;
let payload = PaymentPayload {
chain_id: 1212101,
nonce: 0,
recipient: Address::from_str("0x742d35Cc6634C0532925a3b8D91D6F4A81B8Cbc0")?,
value: U256::from(1000000000000000000u64),
token: Address::from_str("0x1234567890abcdef1234567890abcdef12345678")?,
};
let signature = crypto::sign_transaction_payload(&payload, "0xYOUR_PRIVATE_KEY")?;
let tx_hash_str = "0xf55f9525be94633b56f954d3252d52b8ef42f5fd5f9491b243708471c15cc40c";
let finalized_tx = client
.get_and_verify_finalized_transaction_by_hash(tx_hash_str)
.await?;
println!("Transaction verified at epoch {}!", finalized_tx.epoch);
let finalized_tx_manual = client.get_finalized_transaction_by_hash(tx_hash_str).await?;
let tx_hash = B256::from_str(tx_hash_str)?;
let message_hash = signature_hash_for_counter_sign(&tx_hash, &finalized_tx_manual.epoch);
verify_bls_aggregate_signature(&message_hash, &finalized_tx_manual.counter_signature)?;
println!("Manual BLS signature verification successful!");
Ok(())
}
Error Handling
The SDK provides comprehensive error handling:
use onemoney_protocol::{Error, Result};
async fn main() -> Result<(), Box<dyn std::error::Error>> {
match client.get_account_nonce(address).await {
Ok(nonce) => println!("Nonce: {}", nonce.nonce),
Err(Error::Api { status_code: 404, .. }) => {
println!("Account not found");
}
Err(Error::Http(e)) => {
println!("Network error: {}", e);
}
Err(Error::Json(e)) => {
println!("JSON parsing error: {}", e);
}
Err(e) => {
println!("Other error: {}", e);
}
}
}
Examples
Run the included examples:
cargo run --example transactions_example
cargo run --example network_examples
cargo run --example tokens_example
cargo run --example accounts_example
API Reference
The SDK is organized into several modules:
accounts - Account queries, nonce management, token account operations
tokens - Token minting, burning, authority management, pause/blacklist/whitelist controls
transactions - Payment sending, transaction queries, fee estimation
chains - Chain information and network details
checkpoints - Checkpoint queries and blockchain state
crypto - Cryptographic utilities for signing and verification
Configuration
Environment Variables
ONEMONEY_API_URL - Override the default API endpoint
ONEMONEY_TIMEOUT - Set request timeout in seconds
ONEMONEY_LOG_LEVEL - Set logging level (trace, debug, info, warn, error)
Network Endpoints
- Mainnet:
https://api.1money.network
- Testnet:
https://api.testnet.1money.network
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Run the test suite:
cargo test
- Submit a pull request
Testing
cargo test
cargo test -- --nocapture
cargo test accounts::tests
cargo install cargo-llvm-cov
cargo llvm-cov --all-features --workspace --html
cargo test --test '*'
cargo test --lib
License
This project is licensed under the Apache License, Version 2.0.
See LICENSE for details or visit http://www.apache.org/licenses/LICENSE-2.0.
Support
Built by the OneMoney team.