synor/sdk/flutter/example/dex_example.dart
Gulshan Yadav 9416d76108 Add IBC and ZK SDK examples for Rust
- Introduced `ibc_example.rs` demonstrating Inter-Blockchain Communication operations including cross-chain transfers, channel management, packet handling, and relayer operations.
- Introduced `zk_example.rs` showcasing Zero-Knowledge proof operations such as circuit compilation, proof generation and verification, and on-chain verification with multiple proving systems.
2026-01-28 14:15:51 +05:30

349 lines
11 KiB
Dart

/// Synor DEX SDK Examples for Flutter/Dart
///
/// Demonstrates decentralized exchange operations:
/// - Spot trading (limit/market orders)
/// - Perpetual futures trading
/// - Liquidity provision (AMM pools)
/// - Order book management
/// - Portfolio tracking
import 'dart:io';
import 'dart:math';
import 'package:synor_dex/synor_dex.dart';
Future<void> main() async {
// Initialize client
final config = DexConfig(
apiKey: Platform.environment['SYNOR_API_KEY'] ?? 'your-api-key',
endpoint: 'https://dex.synor.io/v1',
timeout: const Duration(seconds: 30),
retries: 3,
debug: false,
defaultMarket: 'SYN-USDC',
);
final dex = SynorDex(config);
try {
// Check service health
final healthy = await dex.healthCheck();
print('Service healthy: $healthy\n');
// Run examples
await marketsExample(dex);
await spotTradingExample(dex);
await perpsTradingExample(dex);
await liquidityExample(dex);
await orderbookExample(dex);
await portfolioExample(dex);
} finally {
await dex.close();
}
}
Future<void> marketsExample(SynorDex dex) async {
print('=== Markets ===');
// Get all markets
final markets = await dex.markets.list();
print('Available markets: ${markets.length}');
for (final market in markets.take(5)) {
print('\n ${market.symbol}:');
print(' Base: ${market.baseAsset}, Quote: ${market.quoteAsset}');
print(' Price: ${market.lastPrice}');
print(' 24h Volume: ${market.volume24h}');
print(' 24h Change: ${market.change24h}%');
print(' Status: ${market.status}');
}
// Get specific market
final market = await dex.markets.get('SYN-USDC');
print('\nSYN-USDC details:');
print(' Min order size: ${market.minOrderSize}');
print(' Tick size: ${market.tickSize}');
print(' Maker fee: ${market.makerFee}%');
print(' Taker fee: ${market.takerFee}%');
// Get market statistics
final stats = await dex.markets.getStats('SYN-USDC');
print('\nMarket statistics:');
print(' High 24h: ${stats.high24h}');
print(' Low 24h: ${stats.low24h}');
print(' Open interest: ${stats.openInterest}');
print(' Funding rate: ${stats.fundingRate}%');
print('');
}
Future<void> spotTradingExample(SynorDex dex) async {
print('=== Spot Trading ===');
// Place a limit order
print('Placing limit buy order...');
final limitOrder = await dex.spot.placeOrder(OrderRequest(
market: 'SYN-USDC',
side: OrderSide.buy,
orderType: OrderType.limit,
price: '1.50',
quantity: '100',
timeInForce: TimeInForce.gtc,
));
print('Limit order placed:');
print(' Order ID: ${limitOrder.orderId}');
print(' Status: ${limitOrder.status}');
print(' Price: ${limitOrder.price}');
print(' Quantity: ${limitOrder.quantity}');
// Place a market order
print('\nPlacing market sell order...');
final marketOrder = await dex.spot.placeOrder(OrderRequest(
market: 'SYN-USDC',
side: OrderSide.sell,
orderType: OrderType.market,
quantity: '50',
));
print('Market order executed:');
print(' Order ID: ${marketOrder.orderId}');
print(' Status: ${marketOrder.status}');
print(' Filled: ${marketOrder.filledQuantity}');
print(' Avg price: ${marketOrder.averagePrice}');
// Get order status
final status = await dex.spot.getOrder(limitOrder.orderId);
print('\nOrder status:');
print(' Status: ${status.status}');
print(' Filled: ${status.filledQuantity} / ${status.quantity}');
print(' Remaining: ${status.remainingQuantity}');
// Cancel order
print('\nCancelling order...');
await dex.spot.cancelOrder(limitOrder.orderId);
print('Order cancelled successfully');
// Get open orders
final openOrders = await dex.spot.getOpenOrders('SYN-USDC');
print('\nOpen orders: ${openOrders.length}');
// Get trade history
final trades = await dex.spot.getTradeHistory('SYN-USDC', limit: 10);
print('\nRecent trades: ${trades.length}');
for (final trade in trades.take(3)) {
print(' ${trade.side} ${trade.quantity} @ ${trade.price} (${trade.timestamp})');
}
print('');
}
Future<void> perpsTradingExample(SynorDex dex) async {
print('=== Perpetual Futures Trading ===');
// Get available perps markets
final perpsMarkets = await dex.perps.listMarkets();
print('Available perps markets: ${perpsMarkets.length}');
for (final market in perpsMarkets.take(3)) {
print(' ${market.symbol}: ${market.markPrice} (funding: ${market.fundingRate}%)');
}
// Open a long position
print('\nOpening long position...');
final position = await dex.perps.openPosition(PerpsOrderRequest(
market: 'SYN-USDC-PERP',
side: OrderSide.buy,
orderType: OrderType.limit,
price: '1.50',
size: '1000',
leverage: 10,
reduceOnly: false,
));
print('Position opened:');
print(' Position ID: ${position.positionId}');
print(' Size: ${position.size}');
print(' Entry price: ${position.entryPrice}');
print(' Leverage: ${position.leverage}x');
print(' Liquidation price: ${position.liquidationPrice}');
// Get position details
final details = await dex.perps.getPosition(position.positionId);
print('\nPosition details:');
print(' Unrealized PnL: ${details.unrealizedPnL}');
print(' Margin: ${details.margin}');
print(' Margin ratio: ${details.marginRatio}%');
// Set stop loss and take profit
print('\nSetting stop loss and take profit...');
await dex.perps.setStopLoss(position.positionId, '1.40');
print('Stop loss set at 1.40');
await dex.perps.setTakeProfit(position.positionId, '1.80');
print('Take profit set at 1.80');
// Close position
print('\nClosing position...');
final closeResult = await dex.perps.closePosition(position.positionId);
print('Position closed:');
print(' Realized PnL: ${closeResult.realizedPnL}');
print(' Close price: ${closeResult.closePrice}');
// Get all positions
final positions = await dex.perps.getPositions();
print('\nOpen positions: ${positions.length}');
// Get funding history
final funding = await dex.perps.getFundingHistory('SYN-USDC-PERP', limit: 10);
print('Funding payments: ${funding.length}');
print('');
}
Future<void> liquidityExample(SynorDex dex) async {
print('=== Liquidity Provision ===');
// Get available pools
final pools = await dex.liquidity.listPools();
print('Available pools: ${pools.length}');
for (final pool in pools.take(3)) {
print('\n ${pool.name}:');
print(' TVL: \$${pool.tvl}');
print(' APR: ${pool.apr}%');
print(' Volume 24h: \$${pool.volume24h}');
print(' Fee tier: ${pool.feeTier}%');
}
// Get pool details
final pool = await dex.liquidity.getPool('SYN-USDC');
print('\nSYN-USDC pool details:');
print(' Token0: ${pool.token0.symbol} (${pool.token0Reserve})');
print(' Token1: ${pool.token1.symbol} (${pool.token1Reserve})');
print(' Price: ${pool.price}');
print(' Total LP tokens: ${pool.totalLPTokens}');
// Add liquidity
print('\nAdding liquidity...');
final addResult = await dex.liquidity.addLiquidity(AddLiquidityRequest(
pool: 'SYN-USDC',
amount0: '100',
amount1: '150',
slippageBps: 50, // 0.5%
));
print('Liquidity added:');
print(' LP tokens received: ${addResult.lpTokens}');
print(' Position ID: ${addResult.positionId}');
print(' Share of pool: ${addResult.shareOfPool}%');
// Get LP positions
final lpPositions = await dex.liquidity.getPositions();
print('\nLP positions: ${lpPositions.length}');
for (final pos in lpPositions) {
print(' ${pos.pool}: ${pos.lpTokens} LP tokens (value: \$${pos.value})');
}
// Claim fees
print('\nClaiming fees...');
final fees = await dex.liquidity.claimFees(addResult.positionId);
print('Fees claimed:');
print(' Token0: ${fees.amount0}');
print(' Token1: ${fees.amount1}');
// Remove liquidity
print('\nRemoving liquidity...');
final removeResult = await dex.liquidity.removeLiquidity(RemoveLiquidityRequest(
positionId: addResult.positionId,
lpTokens: addResult.lpTokens,
slippageBps: 50,
));
print('Liquidity removed:');
print(' Token0 received: ${removeResult.amount0}');
print(' Token1 received: ${removeResult.amount1}');
print('');
}
Future<void> orderbookExample(SynorDex dex) async {
print('=== Order Book ===');
// Get order book snapshot
final orderbook = await dex.orderbook.getSnapshot('SYN-USDC', depth: 10);
print('Order book for SYN-USDC:');
print('\nAsks (sells):');
for (final ask in orderbook.asks.take(5)) {
print(' ${ask.quantity} @ ${ask.price}');
}
print('\nBids (buys):');
for (final bid in orderbook.bids.take(5)) {
print(' ${bid.quantity} @ ${bid.price}');
}
print('\nSpread: ${orderbook.spread} (${orderbook.spreadPercent}%)');
print('Mid price: ${orderbook.midPrice}');
// Get recent trades
final recentTrades = await dex.orderbook.getRecentTrades('SYN-USDC', limit: 10);
print('\nRecent trades:');
for (final trade in recentTrades.take(5)) {
print(' ${trade.side} ${trade.quantity} @ ${trade.price}');
}
// Subscribe to orderbook updates (simulated)
print('\nSubscribing to orderbook updates...');
final subscription = dex.orderbook.subscribe('SYN-USDC');
// Process a few updates
int count = 0;
await for (final update in subscription) {
print(' Update: ${update.side} ${update.quantity} @ ${update.price}');
count++;
if (count >= 3) break;
}
print('');
}
Future<void> portfolioExample(SynorDex dex) async {
print('=== Portfolio ===');
// Get portfolio overview
final portfolio = await dex.portfolio.getOverview();
print('Portfolio overview:');
print(' Total value: \$${portfolio.totalValue}');
print(' Available balance: \$${portfolio.availableBalance}');
print(' In orders: \$${portfolio.inOrders}');
print(' In positions: \$${portfolio.inPositions}');
print(' Unrealized PnL: \$${portfolio.unrealizedPnL}');
// Get balances
final balances = await dex.portfolio.getBalances();
print('\nBalances:');
for (final balance in balances) {
print(' ${balance.asset}: ${balance.total} (available: ${balance.available}, in orders: ${balance.inOrders})');
}
// Get PnL history
final pnlHistory = await dex.portfolio.getPnLHistory(days: 30); // Last 30 days
print('\nPnL history (last ${pnlHistory.length} days):');
if (pnlHistory.isNotEmpty) {
print(' Total PnL: \$${pnlHistory.last.cumulativePnL}');
}
// Get trade statistics
final stats = await dex.portfolio.getStats();
print('\nTrade statistics:');
print(' Total trades: ${stats.totalTrades}');
print(' Win rate: ${stats.winRate}%');
print(' Avg profit: \$${stats.avgProfit}');
print(' Avg loss: \$${stats.avgLoss}');
print(' Best trade: \$${stats.bestTrade}');
print(' Worst trade: \$${stats.worstTrade}');
print('');
}