Skip to main content

SDK Comparison & Selection Guide

Choose the optimal Saros SDK for your project with this comprehensive comparison. Each SDK is designed for specific use cases, performance requirements, and developer preferences.

Quick Decision Tree​

flowchart TD
A[What are you building?] --> B[Web/Mobile App]
A --> C[Trading Bot/Backend]
A --> D[DeFi Protocol Integration]

B --> E[Need AMM + Staking?]
E -->|Yes| F[TypeScript SDK ✅]
E -->|DLMM Only| G[DLMM TypeScript SDK ✅]

C --> H[Performance Critical?]
H -->|Yes| I[Rust DLMM SDK ✅]
H -->|No| J[DLMM TypeScript SDK ✅]

D --> K[Multiple Protocols?]
K -->|Yes| F
K -->|DLMM Only| L[Choose by Performance Need]
L --> I
L --> J

At-a-Glance Comparison​

FeatureTypeScript SDKDLMM TypeScriptRust DLMM
Best ForFull-stack DAppsDLMM specialistsHFT/Infrastructure
Learning Curve🟢 Easy🟡 Moderate🔴 Advanced
Performance🟡 Good🟢 Better🟢 Best
Feature Breadth🟢 Complete🟡 DLMM-focused🟡 DLMM-focused
Bundle Size🟡 2.1MB🟢 800KB🟢 400KB
Time to Production🟢 1-2 days🟢 2-3 days🟡 1-2 weeks

Detailed Feature Comparison​

Protocol Support​

Protocol FeatureTypeScript SDKDLMM TypeScript SDKRust DLMM SDK
AMM Swaps✅ Full support with routing❌ Not available❌ Not available
DLMM Trading⚠️ Basic support✅ Advanced features✅ Maximum performance
Liquidity Provision✅ AMM + basic DLMM✅ Advanced DLMM only✅ Advanced DLMM only
Staking✅ Single + LP staking❌ Not available❌ Not available
Yield Farming✅ Multi-token rewards❌ Not available❌ Not available
Position Management✅ Basic tools✅ Advanced analytics✅ Professional tools
Price Feeds✅ Multiple sources✅ DLMM + external✅ DLMM + Jupiter

Performance Metrics​

OperationTypeScript SDKDLMM TypeScriptRust DLMM
Swap Quote300ms150ms15ms
Position Query200ms100ms10ms
Transaction Prep500ms250ms50ms
Bulk Operations2000ms/100 ops1000ms/100 ops200ms/100 ops
Memory Usage15MB8MB2MB
Startup Time500ms200ms50ms

Development Experience​

AspectTypeScript SDKDLMM TypeScriptRust DLMM
Setup Complexity🟢 Simple (npm install)🟢 Simple (npm install)🟡 Moderate (cargo add)
IDE Support🟢 VS Code, WebStorm🟢 VS Code, WebStorm🟢 VS Code, RustRover
Debugging🟢 Rich browser tools🟢 Rich browser tools🟡 Good CLI tools
Testing🟢 Jest ecosystem🟢 Jest ecosystem🟡 Cargo test
Deployment🟢 Any platform🟢 Any platform🟡 Compile per platform

Real-World Use Cases & Examples​

TypeScript SDK: DeFi Dashboard​

Perfect for: Portfolio trackers, DeFi aggregators, multi-protocol interfaces

import { SarosSDK } from '@saros-finance/sdk';
import { Connection } from '@solana/web3.js';

class DeFiPortfolio {
private sdk: SarosSDK;

constructor() {
const connection = new Connection('https://api.mainnet-beta.solana.com');
this.sdk = new SarosSDK(connection);
}

async getCompletePortfolio(wallet: string) {
// Get all position types in one SDK
const [swapPools, stakingPools, farmingPools] = await Promise.all([
this.sdk.getAllPools(),
this.sdk.getStakingPools(),
this.sdk.getFarmingPools()
]);

// Calculate total portfolio value across all protocols
const stakingValue = await this.sdk.getStakingValue(wallet);
const farmingValue = await this.sdk.getFarmingValue(wallet);
const liquidityValue = await this.sdk.getLiquidityValue(wallet);

return {
totalValue: stakingValue + farmingValue + liquidityValue,
breakdown: { stakingValue, farmingValue, liquidityValue },
pools: { swapPools, stakingPools, farmingPools }
};
}
}

// ✅ Use Case: Multi-protocol DeFi platforms
// ✅ Benefit: Single SDK covers everything
// ✅ Trade-off: Good performance for complex apps

DLMM TypeScript SDK: LP Strategy Manager​

Perfect for: Concentrated liquidity managers, yield optimizers, range trading

import { DLMMSDKv2, PositionManager } from '@saros-finance/dlmm-sdk';

class LiquidityManager {
private dlmm: DLMMSDKv2;
private positionManager: PositionManager;

async createStrategicPosition(config: StrategyConfig) {
// Advanced bin analysis for optimal range selection
const binAnalysis = await this.dlmm.analyzeBinDistribution(config.poolAddress, {
lookbackPeriod: 30, // 30 days
volatilityAdjustment: true
});

// Dynamic range calculation based on volatility
const optimalRange = this.dlmm.calculateOptimalRange({
currentPrice: binAnalysis.currentPrice,
volatility: binAnalysis.volatility,
strategy: config.strategy, // 'conservative' | 'balanced' | 'aggressive'
capital: config.amount
});

// Create position with sophisticated parameters
const position = await this.positionManager.createPosition({
poolAddress: config.poolAddress,
lowerBin: optimalRange.lowerBin,
upperBin: optimalRange.upperBin,
amountX: config.amountX,
amountY: config.amountY,
slippage: 0.1, // Tight slippage for DLMM
deadline: Date.now() + 30000 // 30 second deadline
});

return {
position,
expectedAPY: optimalRange.expectedAPY,
riskScore: optimalRange.riskScore
};
}

async rebalancePositions() {
const positions = await this.positionManager.getUserPositions();

for (const position of positions) {
const analysis = await this.dlmm.analyzePosition(position.id);

// Rebalance if position is underperforming
if (analysis.utilizationRate < 0.3) { // Less than 30% utilization
await this.positionManager.rebalancePosition(position.id, {
newRange: analysis.suggestedRange,
keepFees: true
});
}
}
}
}

// ✅ Use Case: Professional LP management
// ✅ Benefit: Specialized DLMM tools and analytics
// ✅ Trade-off: DLMM-only but best-in-class features

Rust DLMM SDK: High-Frequency Trading​

Perfect for: Trading bots, arbitrage systems, institutional trading

// High-performance trading implementation
use saros_dlmm_sdk::{DlmmClient, PositionBuilder, SwapBuilder};
use tokio::time::{interval, Duration};
use std::collections::HashMap;

pub struct HighFrequencyTrader {
client: DlmmClient,
positions: HashMap<String, Position>,
profit_target: f64,
stop_loss: f64,
}

impl HighFrequencyTrader {
pub async fn new(rpc_url: &str) -> Result<Self, Box<dyn std::error::Error>> {
let client = DlmmClient::new(rpc_url).await?;

Ok(Self {
client,
positions: HashMap::new(),
profit_target: 0.005, // 0.5% profit target
stop_loss: 0.002, // 0.2% stop loss
})
}

pub async fn run_trading_loop(&mut self) -> Result<(), Box<dyn std::error::Error>> {
let mut interval = interval(Duration::from_millis(100)); // 100ms interval

loop {
interval.tick().await;

// Ultra-fast opportunity detection
let opportunities = self.scan_arbitrage_opportunities().await?;

for opportunity in opportunities {
if opportunity.profit_percentage > self.profit_target {
// Execute trade with minimal latency
let result = self.execute_arbitrage(opportunity).await?;

if result.success {
println!("✅ Arbitrage executed: ${:.2} profit", result.profit);
}
}
}

// Monitor existing positions
self.monitor_positions().await?;
}
}

async fn scan_arbitrage_opportunities(&self) -> Result<Vec<ArbitrageOpportunity>, Box<dyn std::error::Error>> {
// Parallel processing of multiple pools
let pools = self.client.get_all_pools().await?;
let mut opportunities = Vec::new();

// Use rayon for parallel processing
use rayon::prelude::*;

let results: Vec<_> = pools.par_iter()
.filter_map(|pool| {
// CPU-intensive arbitrage detection
self.detect_arbitrage_sync(pool).ok()
})
.collect();

opportunities.extend(results.into_iter().flatten());

// Sort by profitability
opportunities.sort_by(|a, b| b.profit_percentage.partial_cmp(&a.profit_percentage).unwrap());

Ok(opportunities)
}

async fn execute_arbitrage(&self, opportunity: ArbitrageOpportunity) -> Result<TradeResult, Box<dyn std::error::Error>> {
// Build optimized transaction
let swap = SwapBuilder::new()
.from_pool(opportunity.buy_pool)
.to_pool(opportunity.sell_pool)
.amount(opportunity.optimal_amount)
.max_slippage(0.001) // 0.1% max slippage
.deadline_ms(5000) // 5 second deadline
.build();

// Execute with minimal latency
let start_time = std::time::Instant::now();
let result = self.client.execute_swap(swap).await?;
let execution_time = start_time.elapsed().as_millis();

Ok(TradeResult {
success: true,
signature: result.signature,
profit: opportunity.profit_usd,
execution_time_ms: execution_time as u64,
})
}
}

// ✅ Use Case: Professional trading systems
// ✅ Benefit: Maximum performance and efficiency
// ✅ Trade-off: Rust learning curve but exceptional performance

Code Comparison: Same Operation, Different SDKs​

Simple Token Swap Implementation​

TypeScript SDK​

import { swapSaros, getSwapAmountSaros } from '@saros-finance/sdk';

async function executeSwap(fromToken: string, toToken: string, amount: number) {
// Multi-step process with comprehensive error handling
const quote = await getSwapAmountSaros(
connection,
fromToken,
toToken,
amount,
0.5, // slippage
poolParams
);

if (quote.priceImpact > 2.0) {
throw new Error('Price impact too high');
}

const result = await swapSaros(
connection,
fromTokenAccount,
toTokenAccount,
amount,
parseFloat(quote.amountOutWithSlippage),
null,
poolAddress,
SWAP_PROGRAM_ID,
walletAddress,
fromToken,
toToken
);

return result;
}

// ✅ Pros: Comprehensive, easy to understand
// ⚠️ Cons: More verbose, requires multiple steps

DLMM TypeScript SDK​

import { DLMMSDKv2 } from '@saros-finance/dlmm-sdk';

async function executeSwap(poolAddress: string, amount: number, isXToY: boolean) {
const dlmm = new DLMMSDKv2(connection);

// Streamlined DLMM-optimized swap
const quote = await dlmm.getSwapQuote({
poolAddress,
amount,
isXToY,
slippageTolerance: 0.1 // Lower slippage for concentrated liquidity
});

const swapTx = await dlmm.swapWithQuote({
quote,
wallet: userWallet,
computeUnitPrice: 1000 // Priority fee for faster execution
});

return await dlmm.sendAndConfirm(swapTx);
}

// ✅ Pros: Optimized for DLMM, cleaner API
// ⚠️ Cons: DLMM pools only, no AMM support

Rust DLMM SDK​

use saros_dlmm_sdk::prelude::*;

async fn execute_swap(
client: &DlmmClient,
pool_address: &str,
amount: u64,
is_x_to_y: bool
) -> Result<String, DlmmError> {
// High-performance swap with minimal allocations
let swap = client
.build_swap(pool_address)?
.amount(amount)
.direction(is_x_to_y)
.slippage_bps(10) // 0.1% slippage
.build();

// Execute with optimized transaction
let result = client.execute_swap(swap).await?;

Ok(result.signature)
}

// ✅ Pros: Maximum performance, minimal resource usage
// ⚠️ Cons: Requires Rust knowledge, compilation setup

Deep Dive: When to Choose Each SDK​

Choose TypeScript SDK When:​

✅ Building Web Applications​

// React component example
import { useSarosSDK, usePool, useSwap } from '@saros-finance/sdk/react';

function SwapInterface() {
const { connection, wallet } = useSarosSDK();
const pool = usePool('SOL-USDC');
const { swap, loading, error } = useSwap();

const handleSwap = async () => {
try {
const result = await swap({
fromToken: 'SOL',
toToken: 'USDC',
amount: 1.0,
slippage: 0.5
});

console.log('Swap successful:', result.signature);
} catch (err) {
console.error('Swap failed:', err);
}
};

return (
<div className="swap-interface">
<PoolInfo pool={pool} />
<SwapForm onSwap={handleSwap} loading={loading} />
{error && <ErrorDisplay error={error} />}
</div>
);
}

✅ Building Portfolio Management Tools​

import { SarosSDK } from '@saros-finance/sdk';

class PortfolioTracker {
private sdk: SarosSDK;

async getCompletePortfolio(walletAddress: string) {
// Single SDK handles all protocols
const [stakingPositions, farmingPositions, liquidityPositions] = await Promise.all([
this.sdk.getStakingPositions(walletAddress),
this.sdk.getFarmingPositions(walletAddress),
this.sdk.getLiquidityPositions(walletAddress)
]);

// Calculate yields across all protocols
const totalYield = await this.sdk.calculatePortfolioYield({
staking: stakingPositions,
farming: farmingPositions,
liquidity: liquidityPositions
});

return {
positions: { stakingPositions, farmingPositions, liquidityPositions },
metrics: {
totalValue: this.calculateTotalValue(stakingPositions, farmingPositions, liquidityPositions),
dailyYield: totalYield.daily,
apy: totalYield.apy
}
};
}
}

// ✅ Benefits:
// - Single SDK for all protocols
// - Rich React ecosystem
// - Comprehensive portfolio tracking

✅ Building Educational Platforms​

// Tutorial platform with live examples
class SarosTutorial {
async demonstrateSwap() {
// Simple, educational code
console.log('Step 1: Get swap quote');
const quote = await this.sdk.getQuote('SOL', 'USDC', 1.0);

console.log('Step 2: Review quote details');
console.log(`Expected output: ${quote.outputAmount} USDC`);
console.log(`Price impact: ${quote.priceImpact}%`);

console.log('Step 3: Execute swap');
const result = await this.sdk.swap(quote);

console.log('✅ Swap completed!', result.signature);
}
}

Choose DLMM TypeScript SDK When:​

✅ Building DLMM-Focused Applications​

import { DLMMSDKv2, PositionManager } from '@saros-finance/dlmm-sdk';

class ConcentratedLiquidityApp {
private dlmm: DLMMSDKv2;
private positionManager: PositionManager;

async createOptimizedPosition(params: PositionParams) {
// Advanced DLMM-specific features
const binDistribution = await this.dlmm.getBinDistribution(params.poolAddress);
const volatilityMetrics = await this.dlmm.calculateVolatility(params.poolAddress, 24);

// AI-powered range selection
const suggestedRange = this.dlmm.suggestOptimalRange({
distribution: binDistribution,
volatility: volatilityMetrics,
strategy: params.strategy,
riskTolerance: params.riskTolerance
});

// Create position with advanced parameters
const position = await this.positionManager.createPosition({
poolAddress: params.poolAddress,
lowerBin: suggestedRange.lowerBin,
upperBin: suggestedRange.upperBin,
liquidity: params.liquidity,
autoCompound: true, // Auto-compound fees
rebalanceThreshold: 0.1 // Rebalance when 10% out of range
});

return position;
}

async implementAdvancedStrategy() {
// Multi-position strategies
const positions = await this.positionManager.createLadderPositions({
poolAddress: 'SOL-USDC-POOL',
totalLiquidity: 10000,
numPositions: 5,
rangeSpreads: [0.01, 0.02, 0.05, 0.10, 0.20], // Different ranges
distribution: 'fibonacci' // Fibonacci distribution of liquidity
});

return positions;
}
}

// ✅ Benefits:
// - Best-in-class DLMM features
// - Advanced position analytics
// - Specialized tooling for concentrated liquidity

✅ Building Range Trading Bots​

class RangeTradingBot {
async implementRangeTradingStrategy(poolAddress: string) {
// Monitor price movements within bins
const priceMonitor = this.dlmm.createPriceMonitor(poolAddress, {
frequency: 1000, // 1 second updates
alertThresholds: {
approaching_range_end: 0.05, // Alert at 5% from range boundary
out_of_range: 0.01 // Alert when out of range
}
});

priceMonitor.on('approaching_range_end', async (event) => {
// Proactively rebalance before going out of range
await this.rebalancePosition(event.positionId, {
newRange: this.calculateNewRange(event.currentPrice),
urgency: 'high'
});
});

priceMonitor.on('out_of_range', async (event) => {
// Emergency rebalance when out of range
await this.emergencyRebalance(event.positionId);
});
}
}

Choose Rust DLMM SDK When:​

✅ Building Trading Infrastructure​

use saros_dlmm_sdk::prelude::*;
use tokio::task::JoinSet;
use std::sync::Arc;

pub struct TradingEngine {
client: Arc<DlmmClient>,
strategy_manager: StrategyManager,
risk_manager: RiskManager,
}

impl TradingEngine {
pub async fn run_high_frequency_loop(&self) -> Result<(), DlmmError> {
let mut join_set = JoinSet::new();

// Spawn concurrent strategy tasks
for strategy in self.strategy_manager.get_active_strategies() {
let client = Arc::clone(&self.client);
let strategy = strategy.clone();

join_set.spawn(async move {
// Each strategy runs independently at maximum speed
strategy.execute_with_client(&client).await
});
}

// Process results as they complete
while let Some(result) = join_set.join_next().await {
match result {
Ok(trade_signals) => {
for signal in trade_signals? {
// Validate and execute at maximum speed
if self.risk_manager.validate_signal(&signal)? {
self.execute_signal_fast(signal).await?;
}
}
}
Err(e) => eprintln!("Strategy task failed: {:?}", e),
}
}

Ok(())
}

async fn execute_signal_fast(&self, signal: TradeSignal) -> Result<ExecutionResult, DlmmError> {
// Zero-copy transaction building for maximum performance
let swap = self.client
.build_swap_zero_copy(&signal.pool_address)?
.amount(signal.amount)
.direction(signal.is_x_to_y)
.slippage_bps(signal.slippage_bps)
.priority_fee(signal.priority_fee)
.build_optimized()?;

// Execute with custom confirmation strategy
let result = self.client.execute_swap_fast(swap, ConfirmationLevel::Processed).await?;

Ok(result)
}
}

// ✅ Benefits:
// - Maximum execution speed
// - Concurrent processing
// - Minimal resource usage
// - Professional-grade performance

✅ Building On-Chain Programs​

// Solana program integration
use anchor_lang::prelude::*;
use saros_dlmm_sdk::instruction_builders::*;

#[program]
pub mod saros_integrator {
use super::*;

pub fn advanced_arbitrage(
ctx: Context<ArbitrageCtx>,
amount: u64,
) -> Result<()> {
// Use Saros SDK within Solana programs
let arbitrage_ix = build_arbitrage_instruction(
&ctx.accounts.pool_1,
&ctx.accounts.pool_2,
amount,
&ctx.accounts.user,
)?;

// Execute cross-program invocation
invoke_signed(
&arbitrage_ix,
&[
ctx.accounts.pool_1.to_account_info(),
ctx.accounts.pool_2.to_account_info(),
ctx.accounts.user.to_account_info(),
],
&[&[b"arbitrage", &[ctx.bumps.arbitrage]]],
)?;

Ok(())
}
}

// ✅ Benefits:
// - On-chain program compatibility
// - Zero external dependencies
// - Maximum security and decentralization

Migration Strategies​

From General to Specialized​

Phase 1: Start with TypeScript SDK​

// Begin with full-featured SDK
import { SarosSDK } from '@saros-finance/sdk';

const sdk = new SarosSDK(connection);
await sdk.executeSwap({ /* params */ });
await sdk.stakeTokens({ /* params */ });

Phase 2: Identify Performance Bottlenecks​

// Profile your application
console.time('Portfolio Load');
const portfolio = await sdk.getCompletePortfolio(wallet);
console.timeEnd('Portfolio Load'); // ~2000ms

// Identify heavy operations
const heavyOperations = [
'DLMM position analysis',
'Real-time price feeds',
'Bulk transaction processing'
];

Phase 3: Migrate Heavy Operations​

// Hybrid approach: use specialized SDK for performance-critical parts
import { DLMMSDKv2 } from '@saros-finance/dlmm-sdk';

class HybridPortfolio {
private generalSDK: SarosSDK;
private dlmmSDK: DLMMSDKv2;

async getPortfolio(wallet: string) {
// Use general SDK for AMM and staking
const [stakingPositions, farmingPositions] = await Promise.all([
this.generalSDK.getStakingPositions(wallet),
this.generalSDK.getFarmingPositions(wallet)
]);

// Use specialized SDK for DLMM (faster)
const dlmmPositions = await this.dlmmSDK.getUserPositions(wallet);

return { stakingPositions, farmingPositions, dlmmPositions };
}
}

Performance Migration Path​

JavaScript → TypeScript → Rust​

# Phase 1: JavaScript (rapid prototyping)
npm install @saros-finance/sdk

# Phase 2: TypeScript (production readiness)
npm install -D typescript
# Add type definitions, error handling

# Phase 3: Rust (performance optimization)
cargo add saros-dlmm-sdk
# Rewrite performance-critical components

Real-World Performance Comparison​

Trading Bot Benchmark​

Task: Execute 100 swaps with price monitoring

SDKTotal TimeMemory PeakSuccess Rate
TypeScript45 seconds28MB98%
DLMM TypeScript22 seconds15MB99%
Rust DLMM8 seconds4MB99.5%

Portfolio Dashboard Benchmark​

Task: Load 50-position portfolio with analytics

SDKLoad TimeBundle SizeRender Time
TypeScript1800ms2.1MB150ms
DLMM TypeScript1200ms800KB100ms
Rust DLMM*N/AN/AN/A

*Rust SDK cannot run in browser


Team Recommendations​

Small Teams (1-3 developers)​

Recommended: TypeScript SDK

  • Faster development cycles
  • Single SDK to learn and maintain
  • Good performance for most use cases
  • Excellent documentation and support

Medium Teams (4-8 developers)​

Recommended: DLMM TypeScript SDK + TypeScript SDK

  • Specialize team members on different SDKs
  • Use best tool for each feature
  • Optimize critical paths with DLMM SDK
  • Maintain broad protocol support

Large Teams (8+ developers)​

Recommended: All three SDKs strategically

  • Frontend: TypeScript SDK
  • DLMM specialists: DLMM TypeScript SDK
  • Infrastructure: Rust DLMM SDK
  • Maximum optimization across all use cases

Summary & Next Steps​

Quick Selection Guide:​

  • 🚀 Getting Started: TypeScript SDK
  • 📊 DLMM Focus: DLMM TypeScript SDK
  • ⚡ Maximum Performance: Rust DLMM SDK

Learning Path:​

  1. Start: Quick Start Guide with TypeScript SDK
  2. Expand: Try DLMM tutorials when ready
  3. Optimize: Explore Rust SDK for performance gains

Resources:​

The right choice depends on your specific needs, team expertise, and performance requirements. When in doubt, start with the TypeScript SDK and evolve from there!


Still Need Help?​

Book a consultation with our SDK experts:

  • 📅 Architecture Review: Get personalized SDK recommendations for your project
  • 🔧 Performance Audit: Identify optimization opportunities
  • 🚀 Migration Planning: Plan your transition between SDKs
  • 💡 Best Practices: Learn advanced patterns and optimizations

Contact us in the Developer Support Channel to schedule your consultation!