| Crates.io | deltadefi |
| lib.rs | deltadefi |
| version | 1.1.3 |
| created_at | 2025-04-16 06:18:36.718351+00 |
| updated_at | 2026-01-15 09:55:27.215985+00 |
| description | The Rust SDK for DeltaDeFi |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1636017 |
| size | 258,679 |
The official Rust SDK for DeltaDeFi protocol, providing a comprehensive and ergonomic interface for decentralized finance operations. This SDK enables developers to interact with DeltaDeFi's trading platform, manage accounts, execute orders, and handle wallet operations seamlessly.
Add this to your Cargo.toml:
[dependencies]
deltadefi = "0.1.0"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
dotenv = "0.15" # For environment variable management
use deltadefi::{DeltaDeFi, Stage, OrderSide, OrderType};
use dotenv::dotenv;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok();
// Initialize the client
let api_key = env::var("DELTADEFI_API_KEY")?;
let mut client = DeltaDeFi::new(api_key, Stage::Staging, None)?;
// Load operation key for signing transactions
let password = env::var("ENCRYPTION_PASSCODE")?;
client.load_operation_key(&password).await?;
// Place a limit order
let order_result = client.post_order(
"ADAUSDM",
OrderSide::Buy,
OrderType::Limit,
100.0, // quantity
Some(1.25), // price
None, // limit_slippage
None, // max_slippage_basis_point
).await?;
println!("Order placed: {}", order_result.order_id);
Ok(())
}
Create a .env file with your credentials:
DELTADEFI_API_KEY=your_api_key_here
ENCRYPTION_PASSCODE=your_encryption_password
use deltadefi::{DeltaDeFi, Stage};
// Different network configurations
let mainnet_client = DeltaDeFi::new(api_key, Stage::Mainnet, None)?;
let staging_client = DeltaDeFi::new(api_key, Stage::Staging, None)?;
The main client provides access to all SDK functionality:
pub struct DeltaDeFi {
pub accounts: Accounts, // Account management
pub market: Market, // Market data
pub order: Order, // Order operations
// ... wallet fields
}
impl DeltaDeFi {
// Initialize client
pub fn new(api_key: String, network: Stage, master_key: Option<WalletType>) -> Result<Self, WError>
// Load operation key for transaction signing
pub async fn load_operation_key(&mut self, password: &str) -> Result<(), WError>
// Convenience method for placing orders
pub async fn post_order(
&self,
symbol: &str,
side: OrderSide,
order_type: OrderType,
quantity: f64,
price: Option<f64>,
limit_slippage: Option<bool>,
max_slippage_basis_point: Option<u64>,
) -> Result<SubmitPlaceOrderTransactionResponse, WError>
// Convenience method for canceling orders
pub async fn cancel_order(&self, order_id: &str) -> Result<(), WError>
// Transaction signing
pub fn sign_tx_by_master_key(&self, tx: &str) -> Result<String, WError>
pub fn sign_tx_by_operation_key(&self, tx: &str) -> Result<String, WError>
}
Manage account operations, balances, and transaction history:
impl Accounts {
// Get encrypted operation key
pub async fn get_operation_key(&self) -> Result<GetOperationKeyResponse, WError>
// Generate new API key
pub async fn create_new_api_key(&self) -> Result<CreateNewAPIKeyResponse, WError>
// Get account balance
pub async fn get_account_balance(&self) -> Result<GetAccountBalanceResponse, WError>
// Transaction history
pub async fn get_deposit_records(&self) -> Result<GetDepositRecordsResponse, WError>
pub async fn get_withdrawal_records(&self) -> Result<GetWithdrawalRecordsResponse, WError>
pub async fn get_order_records(
&self,
status: OrderRecordStatus,
limit: Option<u32>,
page: Option<u32>,
symbol: Option<String>,
) -> Result<GetOrderRecordsResponse, WError>
// Transaction building and submission
pub async fn build_deposit_transaction(
&self,
deposit_amount: Vec<Asset>,
input_utxos: Vec<UTxO>,
) -> Result<BuildDepositTransactionResponse, WError>
pub async fn submit_deposit_transaction(
&self,
signed_tx: &str,
) -> Result<SubmitDepositTransactionResponse, WError>
// Similar methods for withdrawal and transferal transactions...
}
Access market data and price information:
impl Market {
// Get current market price
pub async fn get_market_price(&self, symbol: &str) -> Result<GetMarketPriceResponse, WError>
// Get historical price data
pub async fn get_aggregated_price(
&self,
symbol: Symbol,
interval: Interval,
start: i64,
end: i64,
) -> Result<GetAggregatedPriceResponse, WError>
}
Handle order lifecycle operations:
impl Order {
// Build order transaction
pub async fn build_place_order_transaction(
&self,
symbol: &str,
side: OrderSide,
order_type: OrderType,
quantity: f64,
price: Option<f64>,
limit_slippage: Option<bool>,
max_slippage_basis_point: Option<u64>,
) -> Result<BuildPlaceOrderTransactionResponse, WError>
// Submit order transaction
pub async fn submit_place_order_transaction(
&self,
order_id: &str,
signed_tx: &str,
) -> Result<SubmitPlaceOrderTransactionResponse, WError>
// Build cancel order transaction
pub async fn build_cancel_order_transaction(
&self,
order_id: &str,
) -> Result<BuildCancelOrderTransactionResponse, WError>
// Submit cancel order transaction
pub async fn submit_cancel_order_transaction(&self, signed_tx: &str) -> Result<(), WError>
}
// Trading symbols
pub enum Symbol {
ADAUSDM,
}
// Time intervals for price data
pub enum Interval {
Interval5m, // 5 minutes
Interval15m, // 15 minutes
Interval30m, // 30 minutes
Interval1h, // 1 hour
Interval1d, // 1 day
}
// Order types
pub enum OrderType {
Market,
Limit,
}
// Order sides
pub enum OrderSide {
Buy,
Sell,
}
// Order statuses
pub enum OrderStatus {
Processing,
Open,
FullyFilled,
PartiallyFilled,
Cancelled,
PartiallyCancelled,
Failed,
}
// Transaction statuses
pub enum TransactionStatus {
Building,
HeldForOrder,
Submitted,
SubmissionFailed,
Confirmed,
}
use deltadefi::{DeltaDeFi, Stage, OrderSide, OrderType, OrderRecordStatus};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut client = setup_client().await?;
// Place a market order with slippage protection
let market_order = client.post_order(
"ADAUSDM",
OrderSide::Buy,
OrderType::Market,
50.0,
None, // No price for market order
Some(true), // Enable slippage protection
Some(100), // Max 1% slippage (100 basis points)
).await?;
println!("Market order placed: {}", market_order.order_id);
// Place a limit order
let limit_order = client.post_order(
"ADAUSDM",
OrderSide::Sell,
OrderType::Limit,
75.0,
Some(1.30), // Limit price
None,
None,
).await?;
println!("Limit order placed: {}", limit_order.order_id);
// Check order history
let order_history = client.accounts.get_order_records(
OrderRecordStatus::OrderHistory,
Some(10), // Limit to 10 records
Some(1), // First page
None, // All symbols
).await?;
println!("Order history: {} orders", order_history.total_count);
// Cancel the limit order
client.cancel_order(&limit_order.order_id).await?;
println!("Limit order cancelled");
Ok(())
}
async fn setup_client() -> Result<DeltaDeFi, Box<dyn std::error::Error>> {
dotenv::dotenv().ok();
let api_key = std::env::var("DELTADEFI_API_KEY")?;
let password = std::env::var("ENCRYPTION_PASSCODE")?;
let mut client = DeltaDeFi::new(api_key, Stage::Staging, None)?;
client.load_operation_key(&password).await?;
Ok(client)
}
use deltadefi::{DeltaDeFi, Stage};
use whisky::{Asset, UTxO};
async fn manage_account(client: &DeltaDeFi) -> Result<(), Box<dyn std::error::Error>> {
// Check account balance
let balance = client.accounts.get_account_balance().await?;
println!("Account balances:");
for asset_balance in balance.balances {
println!(" {}: {} free, {} locked",
asset_balance.asset,
asset_balance.free,
asset_balance.locked);
}
// Get deposit records
let deposits = client.accounts.get_deposit_records().await?;
println!("Recent deposits: {}", deposits.len());
// Build and submit a withdrawal
let withdrawal_amount = vec![Asset {
unit: "lovelace".to_string(),
quantity: 1000000.0, // 1 ADA in lovelace
}];
let withdrawal_tx = client.accounts
.build_withdrawal_transaction(withdrawal_amount)
.await?;
// Sign the transaction
let signed_tx = client.sign_tx_by_master_key(&withdrawal_tx.tx_hex)?;
// Submit the withdrawal
let withdrawal_result = client.accounts
.submit_withdrawal_transaction(&signed_tx)
.await?;
println!("Withdrawal submitted: {}", withdrawal_result.tx_hash);
Ok(())
}
use deltadefi::{DeltaDeFi, Stage, Symbol, Interval};
use chrono::{Utc, Duration};
async fn analyze_market_data(client: &DeltaDeFi) -> Result<(), Box<dyn std::error::Error>> {
// Get current market price
let current_price = client.market.get_market_price("ADAUSDM").await?;
println!("Current ADAUSDM price: {}", current_price.price);
// Get historical data for the last 24 hours
let now = Utc::now();
let yesterday = now - Duration::hours(24);
let historical_data = client.market.get_aggregated_price(
Symbol::ADAUSDM,
Interval::Interval1h,
yesterday.timestamp(),
now.timestamp(),
).await?;
println!("Historical data points: {}", historical_data.data.len());
// Calculate price change
if let (Some(first), Some(last)) = (historical_data.data.first(), historical_data.data.last()) {
let price_change = ((last.close - first.open) / first.open) * 100.0;
println!("24h price change: {:.2}%", price_change);
}
Ok(())
}
The SDK uses the WError type for comprehensive error handling:
use whisky::WError;
// Handle specific errors
match client.post_order(/* ... */).await {
Ok(response) => println!("Order successful: {}", response.order_id),
Err(WError { source, message }) => {
eprintln!("Order failed - Source: {}, Message: {}", source, message);
// Handle specific error types
match source.as_str() {
"build_place_order_transaction" => {
// Handle order building errors
if message.contains("Missing required parameter") {
eprintln!("Please check order parameters");
}
}
"DeltaDeFi - post - send_request" => {
// Handle network errors
eprintln!("Network error, please retry");
}
_ => eprintln!("Unexpected error occurred"),
}
}
}
// ✅ Good - Using environment variables
let api_key = env::var("DELTADEFI_API_KEY")?;
// ❌ Bad - Hardcoded credentials
let api_key = "your-api-key-here";
This project is licensed under the Apache-2.0 License - see the LICENSE file for details.