Skip to main content

Rust SDK API Reference

Complete API documentation for the Saros Rust DLMM SDK. All functions are async and return Result types with proper error handling.

Core Client​

DlmmClient​

Primary client for interacting with DLMM pools.

pub struct DlmmClient {
pub rpc_client: Arc<RpcClient>,
pub wallet: Keypair,
pub program_id: Pubkey,
}

impl DlmmClient {
/// Creates a new DLMM client instance
pub fn new(
rpc_client: Arc<RpcClient>,
wallet: &Keypair,
program_id: Pubkey,
) -> Result<Self, DlmmError>;

/// Loads pool data from on-chain state
pub async fn load_pool(&self, pool_address: Pubkey) -> Result<DlmmPool, DlmmError>;

/// Loads multiple pools efficiently in batch
pub async fn load_pools_batch(&self, addresses: &[Pubkey]) -> Result<Vec<DlmmPool>, DlmmError>;

/// Creates a new liquidity position
pub async fn create_position(
&self,
pool_address: Pubkey,
params: PositionParams,
) -> Result<LiquidityPosition, DlmmError>;

/// Removes liquidity from a position
pub async fn remove_liquidity(
&self,
position_address: &Pubkey,
) -> Result<RemoveLiquidityResult, DlmmError>;

/// Adds liquidity to an existing position
pub async fn add_liquidity(
&self,
position_address: &Pubkey,
amount_x: u64,
amount_y: u64,
) -> Result<AddLiquidityResult, DlmmError>;

/// Collects accumulated fees from a position
pub async fn collect_fees(
&self,
position_address: &Pubkey,
) -> Result<CollectFeesResult, DlmmError>;

/// Gets swap quote for token pair
pub async fn get_swap_quote(
&self,
input_mint: Pubkey,
output_mint: Pubkey,
amount: u64,
) -> Result<SwapQuote, DlmmError>;

/// Executes a token swap
pub async fn swap(
&self,
input_mint: Pubkey,
output_mint: Pubkey,
amount: u64,
wallet: &Keypair,
) -> Result<SwapResult, DlmmError>;

/// Refreshes position data from on-chain state
pub async fn refresh_position(
&self,
position_address: &Pubkey,
) -> Result<LiquidityPosition, DlmmError>;

/// Gets position fees without collecting
pub async fn get_position_fees(
&self,
position_address: &Pubkey,
) -> Result<PositionFees, DlmmError>;

/// Signs and sends transaction with confirmation
pub async fn sign_and_send_transaction_with_confirmation(
&self,
transaction: VersionedTransaction,
wallet: &Keypair,
) -> Result<Signature, DlmmError>;
}

Pool Operations​

DlmmPool​

Represents a DLMM pool with concentrated liquidity.

#[derive(Debug, Clone)]
pub struct DlmmPool {
pub address: Pubkey,
pub token_x_mint: Pubkey,
pub token_y_mint: Pubkey,
pub active_id: i32,
pub bin_step: u16,
pub fee_rate: u16,
}

impl DlmmPool {
/// Gets the current trading price
pub fn get_current_price(&self) -> Result<f64, DlmmError>;

/// Converts price to bin ID
pub fn price_to_bin_id(&self, price: f64) -> Result<i32, DlmmError>;

/// Converts bin ID to price
pub fn bin_id_to_price(&self, bin_id: i32) -> Result<f64, DlmmError>;

/// Gets total value locked in the pool
pub async fn get_total_value_locked(&self) -> Result<u64, DlmmError>;

/// Gets 24-hour trading volume
pub async fn get_volume_24h(&self) -> Result<u64, DlmmError>;

/// Gets liquidity in the active trading bin
pub async fn get_active_liquidity(&self) -> Result<u64, DlmmError>;

/// Gets historical price data
pub async fn get_price_history(&self, hours: u32) -> Result<Vec<f64>, DlmmError>;

/// Gets liquidity distribution across bins
pub async fn get_liquidity_distribution(&self) -> Result<LiquidityDistribution, DlmmError>;

/// Gets token balance for a specific mint
pub async fn get_token_balance(&self, mint: Pubkey) -> Result<u64, DlmmError>;

/// Calculates optimal bin range for a given capital and strategy
pub async fn calculate_optimal_range(
&self,
capital: u64,
strategy: OptimizationStrategy,
) -> Result<BinRange, DlmmError>;
}

#[derive(Debug)]
pub struct LiquidityDistribution {
pub total_bins_with_liquidity: u32,
pub concentration_ratio: f64, // % of liquidity in active range
pub distribution_map: HashMap<i32, u64>, // bin_id -> liquidity_amount
}

#[derive(Debug)]
pub enum OptimizationStrategy {
MaximizeFees,
MinimizeRisk,
Balanced { risk_tolerance: f64 },
}

Position Management​

LiquidityPosition​

Represents a concentrated liquidity position.

#[derive(Debug, Clone)]
pub struct LiquidityPosition {
pub address: Pubkey,
pub pool_address: Pubkey,
pub owner: Pubkey,
pub lower_bin: i32,
pub upper_bin: i32,
pub liquidity_x: u64,
pub liquidity_y: u64,
pub fee_owner: Pubkey,
}

impl LiquidityPosition {
/// Calculates total position value in USD
pub async fn total_value(&self, pool: &DlmmPool) -> Result<f64, DlmmError>;

/// Calculates position's share of pool liquidity
pub async fn pool_share_percentage(&self, pool: &DlmmPool) -> Result<f64, DlmmError>;

/// Estimates daily fee earnings based on current volume
pub async fn estimated_daily_fees(&self, pool: &DlmmPool) -> Result<PositionFees, DlmmError>;

/// Checks if position is currently in range (earning fees)
pub fn is_in_range(&self, pool: &DlmmPool) -> bool;

/// Calculates impermanent loss since position creation
pub async fn calculate_impermanent_loss(
&self,
pool: &DlmmPool,
initial_price: f64,
) -> Result<f64, DlmmError>;

/// Gets position performance metrics
pub async fn get_performance_metrics(
&self,
pool: &DlmmPool,
) -> Result<PositionMetrics, DlmmError>;
}

#[derive(Debug)]
pub struct PositionMetrics {
pub total_fees_earned: u64,
pub impermanent_loss: f64,
pub net_return: f64,
pub days_active: f64,
pub daily_yield: f64,
pub risk_score: f64,
}

Position Parameters​

#[derive(Debug, Clone)]
pub struct PositionParams {
pub lower_bin: i32,
pub upper_bin: i32,
pub liquidity_x: u64,
pub liquidity_y: u64,
pub strategy_type: StrategyType,
}

#[derive(Debug, Clone)]
pub struct BinRange {
pub lower_bin: i32,
pub upper_bin: i32,
}

impl BinRange {
/// Creates a range centered on current active bin
pub fn centered(active_bin: i32, width: u32) -> Self;

/// Creates a range with specific width percentage
pub fn from_percentage(
pool: &DlmmPool,
center_price: f64,
width_percentage: f64,
) -> Result<Self, DlmmError>;

/// Validates that the range is reasonable
pub fn validate(&self) -> Result<(), DlmmError>;

/// Gets the number of bins in the range
pub fn width(&self) -> u32;

/// Checks if a bin ID is within this range
pub fn contains_bin(&self, bin_id: i32) -> bool;
}

Trading Operations​

Swap Functions​

/// Get swap quote with detailed breakdown
pub async fn get_detailed_swap_quote(
client: &DlmmClient,
input_mint: Pubkey,
output_mint: Pubkey,
amount: u64,
slippage_tolerance: f64,
) -> Result<DetailedSwapQuote, DlmmError>;

/// Execute swap with custom slippage and deadline
pub async fn execute_swap_with_options(
client: &DlmmClient,
input_mint: Pubkey,
output_mint: Pubkey,
amount: u64,
options: SwapOptions,
wallet: &Keypair,
) -> Result<SwapResult, DlmmError>;

/// Batch swap multiple token pairs efficiently
pub async fn batch_swap(
client: &DlmmClient,
swaps: &[SwapInstruction],
wallet: &Keypair,
) -> Result<Vec<SwapResult>, DlmmError>;

#[derive(Debug)]
pub struct DetailedSwapQuote {
pub input_amount: u64,
pub output_amount: u64,
pub minimum_output: u64,
pub price_impact: f64,
pub fee_amount: u64,
pub route: Vec<SwapStep>,
pub gas_estimate: u64,
}

#[derive(Debug)]
pub struct SwapStep {
pub pool_address: Pubkey,
pub input_bin: i32,
pub output_bin: i32,
pub amount_in: u64,
pub amount_out: u64,
pub fee_paid: u64,
}

#[derive(Debug, Clone)]
pub struct SwapOptions {
pub slippage_tolerance: f64,
pub deadline: Option<u64>, // Unix timestamp
pub priority_fee: Option<u64>,
pub max_accounts: Option<usize>,
}

#[derive(Debug)]
pub struct SwapInstruction {
pub input_mint: Pubkey,
pub output_mint: Pubkey,
pub amount: u64,
pub slippage_tolerance: f64,
}

#[derive(Debug)]
pub struct SwapResult {
pub signature: String,
pub input_amount: u64,
pub output_amount: u64,
pub fee_paid: u64,
pub gas_used: u64,
pub price_impact: f64,
}

Analytics and Data​

Pool Analytics​

pub struct PoolAnalytics;

impl PoolAnalytics {
/// Gets comprehensive pool statistics
pub async fn get_pool_stats(
client: &DlmmClient,
pool_address: Pubkey,
) -> Result<PoolStats, DlmmError>;

/// Calculates pool utilization metrics
pub async fn calculate_utilization_metrics(
client: &DlmmClient,
pool_address: Pubkey,
) -> Result<UtilizationMetrics, DlmmError>;

/// Gets top liquidity providers for a pool
pub async fn get_top_liquidity_providers(
client: &DlmmClient,
pool_address: Pubkey,
limit: usize,
) -> Result<Vec<LpInfo>, DlmmError>;

/// Analyzes price impact for different swap sizes
pub async fn analyze_price_impact(
client: &DlmmClient,
pool_address: Pubkey,
amounts: &[u64],
) -> Result<Vec<PriceImpactData>, DlmmError>;
}

#[derive(Debug)]
pub struct PoolStats {
pub tvl_usd: f64,
pub volume_24h_usd: f64,
pub fees_24h_usd: f64,
pub active_positions: u32,
pub price_change_24h: f64,
pub liquidity_utilization: f64,
pub average_position_size: u64,
}

#[derive(Debug)]
pub struct UtilizationMetrics {
pub capital_efficiency: f64,
pub active_liquidity_ratio: f64,
pub bin_utilization: HashMap<i32, f64>,
pub concentration_index: f64,
}

#[derive(Debug)]
pub struct LpInfo {
pub address: Pubkey,
pub total_liquidity_usd: f64,
pub positions_count: u32,
pub total_fees_earned: u64,
}

#[derive(Debug)]
pub struct PriceImpactData {
pub swap_amount: u64,
pub price_impact: f64,
pub output_amount: u64,
pub effective_price: f64,
}

Historical Data​

pub struct HistoricalData;

impl HistoricalData {
/// Gets price history with configurable intervals
pub async fn get_price_history(
client: &DlmmClient,
pool_address: Pubkey,
interval: TimeInterval,
points: u32,
) -> Result<Vec<PricePoint>, DlmmError>;

/// Gets volume history
pub async fn get_volume_history(
client: &DlmmClient,
pool_address: Pubkey,
interval: TimeInterval,
points: u32,
) -> Result<Vec<VolumePoint>, DlmmError>;

/// Gets liquidity depth over time
pub async fn get_liquidity_history(
client: &DlmmClient,
pool_address: Pubkey,
interval: TimeInterval,
points: u32,
) -> Result<Vec<LiquidityPoint>, DlmmError>;
}

#[derive(Debug)]
pub enum TimeInterval {
Minute1,
Minute5,
Minute15,
Hour1,
Hour4,
Day1,
}

#[derive(Debug)]
pub struct PricePoint {
pub timestamp: u64,
pub open: f64,
pub high: f64,
pub low: f64,
pub close: f64,
pub volume: u64,
}

#[derive(Debug)]
pub struct VolumePoint {
pub timestamp: u64,
pub volume_x: u64,
pub volume_y: u64,
pub fee_volume: u64,
pub swap_count: u32,
}

#[derive(Debug)]
pub struct LiquidityPoint {
pub timestamp: u64,
pub total_liquidity: u64,
pub active_liquidity: u64,
pub liquidity_utilization: f64,
}

Math and Calculations​

Price Calculations​

pub mod math {
/// Converts bin ID to price
pub fn bin_id_to_price(bin_id: i32, bin_step: u16) -> f64;

/// Converts price to bin ID
pub fn price_to_bin_id(price: f64, bin_step: u16) -> i32;

/// Calculates price impact for a given swap
pub fn calculate_price_impact(
amount_in: u64,
reserve_in: u64,
reserve_out: u64,
) -> f64;

/// Calculates optimal liquidity distribution
pub fn calculate_liquidity_distribution(
total_amount: u64,
range: &BinRange,
current_price: f64,
strategy: DistributionStrategy,
) -> Result<Vec<BinLiquidity>, MathError>;

/// Calculates impermanent loss
pub fn calculate_impermanent_loss(
initial_price: f64,
current_price: f64,
position_range: &BinRange,
) -> f64;

/// Estimates fee earnings based on volume and position
pub fn estimate_fee_earnings(
position: &LiquidityPosition,
pool_volume_24h: u64,
pool_tvl: u64,
fee_rate: u16,
) -> u64;
}

#[derive(Debug)]
pub enum DistributionStrategy {
Uniform, // Equal distribution across range
Concentrated, // More liquidity near current price
EdgeWeighted, // More liquidity at range edges
Custom(Vec<f64>), // Custom weight distribution
}

#[derive(Debug)]
pub struct BinLiquidity {
pub bin_id: i32,
pub liquidity_x: u64,
pub liquidity_y: u64,
}

Risk Calculations​

pub mod risk {
/// Calculates Value at Risk (VaR) for a position
pub fn calculate_var(
position: &LiquidityPosition,
price_history: &[f64],
confidence_level: f64,
time_horizon_days: u32,
) -> Result<f64, RiskError>;

/// Calculates portfolio correlation matrix
pub fn calculate_correlation_matrix(
price_histories: &HashMap<Pubkey, Vec<f64>>,
) -> Result<CorrelationMatrix, RiskError>;

/// Estimates maximum drawdown
pub fn estimate_max_drawdown(
returns: &[f64],
confidence_level: f64,
) -> f64;

/// Calculates Sharpe ratio
pub fn calculate_sharpe_ratio(
returns: &[f64],
risk_free_rate: f64,
) -> f64;

/// Calculates position concentration risk
pub fn calculate_concentration_risk(
positions: &[LiquidityPosition],
total_portfolio_value: u64,
) -> ConcentrationRisk;
}

#[derive(Debug)]
pub struct CorrelationMatrix {
pub pairs: HashMap<(Pubkey, Pubkey), f64>,
}

#[derive(Debug)]
pub struct ConcentrationRisk {
pub largest_position_percentage: f64,
pub top_3_concentration: f64,
pub diversification_index: f64,
}

Advanced Features​

Event Monitoring​

pub struct EventMonitor {
client: Arc<DlmmClient>,
event_handlers: HashMap<EventType, Box<dyn EventHandler>>,
}

impl EventMonitor {
/// Creates new event monitor
pub fn new(client: Arc<DlmmClient>) -> Self;

/// Registers event handler
pub fn register_handler<T: EventHandler + 'static>(
&mut self,
event_type: EventType,
handler: T,
);

/// Starts monitoring events for specific pools
pub async fn start_monitoring(
&self,
pool_addresses: Vec<Pubkey>,
) -> Result<(), DlmmError>;

/// Stops monitoring
pub async fn stop_monitoring(&self);
}

#[derive(Debug, Hash, Eq, PartialEq)]
pub enum EventType {
SwapExecuted,
LiquidityAdded,
LiquidityRemoved,
FeesCollected,
PriceChanged,
NewPosition,
}

#[async_trait]
pub trait EventHandler: Send + Sync {
async fn handle_event(&self, event: DlmmEvent) -> Result<(), Box<dyn std::error::Error>>;
}

#[derive(Debug)]
pub struct DlmmEvent {
pub event_type: EventType,
pub pool_address: Pubkey,
pub transaction_signature: String,
pub timestamp: u64,
pub data: EventData,
}

#[derive(Debug)]
pub enum EventData {
Swap {
amount_in: u64,
amount_out: u64,
input_mint: Pubkey,
output_mint: Pubkey,
price_impact: f64,
},
LiquidityChange {
position_address: Pubkey,
amount_x_delta: i64,
amount_y_delta: i64,
new_total_liquidity: u64,
},
FeeCollection {
position_address: Pubkey,
fee_x: u64,
fee_y: u64,
collector: Pubkey,
},
PriceUpdate {
old_active_bin: i32,
new_active_bin: i32,
price_change: f64,
},
}

Batch Operations​

pub struct BatchOperations;

impl BatchOperations {
/// Creates multiple positions in a single transaction
pub async fn batch_create_positions(
client: &DlmmClient,
operations: &[BatchPositionOperation],
wallet: &Keypair,
) -> Result<Vec<CreatePositionResult>, DlmmError>;

/// Removes multiple positions efficiently
pub async fn batch_remove_positions(
client: &DlmmClient,
position_addresses: &[Pubkey],
wallet: &Keypair,
) -> Result<Vec<RemovePositionResult>, DlmmError>;

/// Collects fees from multiple positions
pub async fn batch_collect_fees(
client: &DlmmClient,
position_addresses: &[Pubkey],
wallet: &Keypair,
) -> Result<Vec<CollectFeesResult>, DlmmError>;

/// Rebalances multiple positions atomically
pub async fn batch_rebalance_positions(
client: &DlmmClient,
rebalance_operations: &[RebalanceOperation],
wallet: &Keypair,
) -> Result<Vec<RebalanceResult>, DlmmError>;
}

#[derive(Debug)]
pub struct BatchPositionOperation {
pub pool_address: Pubkey,
pub position_params: PositionParams,
}

#[derive(Debug)]
pub struct RebalanceOperation {
pub old_position_address: Pubkey,
pub new_position_params: PositionParams,
}

#[derive(Debug)]
pub struct CreatePositionResult {
pub position_address: Pubkey,
pub transaction_signature: String,
pub gas_cost: u64,
}

#[derive(Debug)]
pub struct RemovePositionResult {
pub position_address: Pubkey,
pub amount_x_removed: u64,
pub amount_y_removed: u64,
pub transaction_signature: String,
}

Error Handling​

Error Types​

#[derive(Debug, thiserror::Error)]
pub enum DlmmError {
#[error("Pool not found: {0}")]
PoolNotFound(Pubkey),

#[error("Position not found: {0}")]
PositionNotFound(Pubkey),

#[error("Insufficient liquidity for operation")]
InsufficientLiquidity,

#[error("Invalid bin range: lower={0}, upper={1}")]
InvalidBinRange(i32, i32),

#[error("Slippage tolerance exceeded: expected={expected}, actual={actual}")]
SlippageExceeded { expected: f64, actual: f64 },

#[error("RPC error: {0}")]
RpcError(#[from] solana_client::client_error::ClientError),

#[error("Math error: {0}")]
MathError(#[from] MathError),

#[error("Serialization error: {0}")]
SerializationError(#[from] bincode::Error),

#[error("Program error: {0}")]
ProgramError(#[from] solana_program::program_error::ProgramError),
}

#[derive(Debug, thiserror::Error)]
pub enum MathError {
#[error("Division by zero")]
DivisionByZero,

#[error("Overflow in calculation")]
Overflow,

#[error("Invalid price: {0}")]
InvalidPrice(f64),

#[error("Invalid bin step: {0}")]
InvalidBinStep(u16),
}

pub type DlmmResult<T> = Result<T, DlmmError>;

Error Recovery​

pub struct ErrorRecovery;

impl ErrorRecovery {
/// Attempts to recover from RPC errors with exponential backoff
pub async fn retry_with_backoff<T, F>(
operation: F,
max_retries: u32,
initial_delay: Duration,
) -> Result<T, DlmmError>
where
F: Fn() -> Pin<Box<dyn Future<Output = Result<T, DlmmError>> + Send>>,
T: Send + 'static;

/// Recovers from failed transactions
pub async fn recover_failed_transaction(
client: &DlmmClient,
failed_signature: &str,
operation_type: OperationType,
) -> Result<RecoveryResult, DlmmError>;

/// Validates position state after potential corruption
pub async fn validate_and_repair_position(
client: &DlmmClient,
position_address: Pubkey,
) -> Result<ValidationResult, DlmmError>;
}

#[derive(Debug)]
pub enum OperationType {
CreatePosition,
RemoveLiquidity,
AddLiquidity,
CollectFees,
Swap,
}

#[derive(Debug)]
pub struct RecoveryResult {
pub success: bool,
pub recovery_actions: Vec<RecoveryAction>,
pub final_state: Option<String>,
}

#[derive(Debug)]
pub enum RecoveryAction {
RetryTransaction,
RefreshState,
RecalculatePosition,
EmergencyClose,
}

Testing Utilities​

Test Helpers​

pub mod test_utils {
use super::*;

/// Creates a test DLMM client with mock RPC
pub fn create_test_client() -> Result<DlmmClient, DlmmError>;

/// Creates a mock pool for testing
pub fn create_test_pool(
token_x: Pubkey,
token_y: Pubkey,
bin_step: u16,
fee_rate: u16,
) -> DlmmPool;

/// Creates test position with specified parameters
pub fn create_test_position(
pool_address: Pubkey,
lower_bin: i32,
upper_bin: i32,
) -> LiquidityPosition;

/// Simulates trading volume for testing
pub async fn simulate_trading_volume(
client: &DlmmClient,
pool_address: Pubkey,
volume_amount: u64,
) -> Result<(), DlmmError>;

/// Asserts position state matches expectations
pub fn assert_position_state(
position: &LiquidityPosition,
expected_lower: i32,
expected_upper: i32,
tolerance: f64,
);
}

/// Mock implementations for testing
pub mod mocks {
use mockall::mock;

mock! {
pub DlmmClient {
pub async fn load_pool(&self, address: Pubkey) -> Result<DlmmPool, DlmmError>;
pub async fn create_position(
&self,
pool_address: Pubkey,
params: PositionParams
) -> Result<LiquidityPosition, DlmmError>;
pub async fn get_swap_quote(
&self,
input_mint: Pubkey,
output_mint: Pubkey,
amount: u64
) -> Result<SwapQuote, DlmmError>;
}
}
}

Configuration​

Client Configuration​

#[derive(Debug, Clone)]
pub struct ClientConfig {
pub rpc_url: String,
pub commitment: Commitment,
pub timeout: Duration,
pub retry_attempts: u32,
pub rate_limit: RateLimit,
}

impl Default for ClientConfig {
fn default() -> Self {
Self {
rpc_url: "https://api.mainnet-beta.solana.com".to_string(),
commitment: Commitment::Confirmed,
timeout: Duration::from_secs(30),
retry_attempts: 3,
rate_limit: RateLimit::default(),
}
}
}

#[derive(Debug, Clone)]
pub struct RateLimit {
pub requests_per_second: u32,
pub burst_capacity: u32,
}

impl Default for RateLimit {
fn default() -> Self {
Self {
requests_per_second: 10,
burst_capacity: 50,
}
}
}

Constants​

pub mod constants {
use solana_sdk::pubkey::Pubkey;
use std::str::FromStr;

/// DLMM program ID on mainnet
pub const DLMM_PROGRAM_ID: &str = "DLMMvvDL4xnZ7GmjeTgA8XWprEGnvDR6MrCHNYc3aaJh";

/// Jupiter program ID
pub const JUPITER_PROGRAM_ID: &str = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4";

/// Common token mints
pub const SOL_MINT: &str = "So11111111111111111111111111111111111111112";
pub const USDC_MINT: &str = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
pub const USDT_MINT: &str = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB";

/// Fee tier constants (in basis points)
pub const FEE_TIER_LOW: u16 = 1; // 0.01%
pub const FEE_TIER_MEDIUM: u16 = 5; // 0.05%
pub const FEE_TIER_STANDARD: u16 = 30; // 0.30%
pub const FEE_TIER_HIGH: u16 = 100; // 1.00%

/// Bin step constants
pub const BIN_STEP_1_BPS: u16 = 1; // 0.01% per bin
pub const BIN_STEP_5_BPS: u16 = 5; // 0.05% per bin
pub const BIN_STEP_25_BPS: u16 = 25; // 0.25% per bin
pub const BIN_STEP_100_BPS: u16 = 100; // 1.00% per bin

/// Utility functions
pub fn get_dlmm_program_id() -> Pubkey {
Pubkey::from_str(DLMM_PROGRAM_ID).unwrap()
}

pub fn get_jupiter_program_id() -> Pubkey {
Pubkey::from_str(JUPITER_PROGRAM_ID).unwrap()
}
}

Type Definitions​

Common Types​

/// Result type for all fees operations
#[derive(Debug)]
pub struct PositionFees {
pub fee_x: u64,
pub fee_y: u64,
pub unclaimed_fee_x: u64,
pub unclaimed_fee_y: u64,
}

/// Result type for liquidity removal
#[derive(Debug)]
pub struct RemoveLiquidityResult {
pub amount_x: u64,
pub amount_y: u64,
pub signature: String,
pub gas_cost: u64,
}

/// Result type for adding liquidity
#[derive(Debug)]
pub struct AddLiquidityResult {
pub liquidity_added: u64,
pub amount_x_used: u64,
pub amount_y_used: u64,
pub signature: String,
}

/// Result type for fee collection
#[derive(Debug)]
pub struct CollectFeesResult {
pub fee_x_collected: u64,
pub fee_y_collected: u64,
pub signature: String,
}

/// Swap quote with execution details
#[derive(Debug)]
pub struct SwapQuote {
pub input_amount: u64,
pub output_amount: u64,
pub minimum_output_amount: u64,
pub price_impact: f64,
pub fee: u64,
pub execution_path: Vec<Pubkey>, // Pool addresses in swap route
}

Macros and Helpers​

Convenience Macros​

/// Macro for creating position parameters easily
#[macro_export]
macro_rules! position_params {
(
pool: $pool:expr,
range: $range_pct:expr,
capital: $capital:expr
) => {
{
let current_price = $pool.get_current_price()?;
let lower_price = current_price * (1.0 - $range_pct);
let upper_price = current_price * (1.0 + $range_pct);

PositionParams {
lower_bin: $pool.price_to_bin_id(lower_price)?,
upper_bin: $pool.price_to_bin_id(upper_price)?,
liquidity_x: $capital / 2,
liquidity_y: $capital / 2,
strategy_type: StrategyType::Balanced,
}
}
};
}

/// Macro for error handling with context
#[macro_export]
macro_rules! dlmm_try {
($expr:expr, $context:expr) => {
$expr.map_err(|e| DlmmError::OperationFailed {
context: $context.to_string(),
source: Box::new(e),
})?
};
}

/// Usage example:
/// let position = dlmm_try!(
/// client.create_position(pool_address, params).await,
/// "Failed to create liquidity position"
/// );

This API reference provides comprehensive coverage of all Saros Rust DLMM SDK functionality. Each function includes detailed parameter descriptions, return types, and error conditions for reliable application development.