- Introduced DexExample.swift demonstrating decentralized exchange operations including spot trading, perpetual futures, liquidity provision, order book management, and portfolio tracking. - Added IbcExample.swift showcasing inter-blockchain communication operations such as cross-chain transfers, channel management, packet handling, and relayer operations. - Created ZkExample.swift illustrating zero-knowledge proof operations including circuit compilation, proof generation and verification, and trusted setup ceremonies.
352 lines
15 KiB
Java
352 lines
15 KiB
Java
package io.synor.examples;
|
|
|
|
import io.synor.dex.*;
|
|
import io.synor.dex.types.*;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.time.Duration;
|
|
import java.util.List;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
/**
|
|
* Synor DEX SDK Examples for Java
|
|
*
|
|
* Demonstrates decentralized exchange operations:
|
|
* - Spot trading (limit/market orders)
|
|
* - Perpetual futures trading
|
|
* - Liquidity provision (AMM pools)
|
|
* - Order book management
|
|
* - Portfolio tracking
|
|
*/
|
|
public class DexExample {
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
// Initialize client
|
|
DexConfig config = DexConfig.builder()
|
|
.apiKey(System.getenv("SYNOR_API_KEY") != null ?
|
|
System.getenv("SYNOR_API_KEY") : "your-api-key")
|
|
.endpoint("https://dex.synor.io/v1")
|
|
.timeout(30000)
|
|
.retries(3)
|
|
.debug(false)
|
|
.defaultMarket("SYN-USDC")
|
|
.build();
|
|
|
|
SynorDex dex = new SynorDex(config);
|
|
|
|
try {
|
|
// Check service health
|
|
boolean healthy = dex.healthCheck().get();
|
|
System.out.println("Service healthy: " + healthy + "\n");
|
|
|
|
// Run examples
|
|
marketsExample(dex);
|
|
spotTradingExample(dex);
|
|
perpsTradingExample(dex);
|
|
liquidityExample(dex);
|
|
orderbookExample(dex);
|
|
portfolioExample(dex);
|
|
} finally {
|
|
dex.close();
|
|
}
|
|
}
|
|
|
|
static void marketsExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Markets ===");
|
|
|
|
// Get all markets
|
|
List<Market> markets = dex.markets().list().get();
|
|
System.out.println("Available markets: " + markets.size());
|
|
|
|
for (Market market : markets.subList(0, Math.min(5, markets.size()))) {
|
|
System.out.println("\n " + market.getSymbol() + ":");
|
|
System.out.println(" Base: " + market.getBaseAsset() + ", Quote: " + market.getQuoteAsset());
|
|
System.out.println(" Price: " + market.getLastPrice());
|
|
System.out.println(" 24h Volume: " + market.getVolume24h());
|
|
System.out.println(" 24h Change: " + market.getChange24h() + "%");
|
|
System.out.println(" Status: " + market.getStatus());
|
|
}
|
|
|
|
// Get specific market
|
|
Market market = dex.markets().get("SYN-USDC").get();
|
|
System.out.println("\nSYN-USDC details:");
|
|
System.out.println(" Min order size: " + market.getMinOrderSize());
|
|
System.out.println(" Tick size: " + market.getTickSize());
|
|
System.out.println(" Maker fee: " + market.getMakerFee() + "%");
|
|
System.out.println(" Taker fee: " + market.getTakerFee() + "%");
|
|
|
|
// Get market statistics
|
|
MarketStats stats = dex.markets().getStats("SYN-USDC").get();
|
|
System.out.println("\nMarket statistics:");
|
|
System.out.println(" High 24h: " + stats.getHigh24h());
|
|
System.out.println(" Low 24h: " + stats.getLow24h());
|
|
System.out.println(" Open interest: " + stats.getOpenInterest());
|
|
System.out.println(" Funding rate: " + stats.getFundingRate() + "%");
|
|
|
|
System.out.println();
|
|
}
|
|
|
|
static void spotTradingExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Spot Trading ===");
|
|
|
|
// Place a limit order
|
|
System.out.println("Placing limit buy order...");
|
|
OrderResult limitOrder = dex.spot().placeOrder(OrderRequest.builder()
|
|
.market("SYN-USDC")
|
|
.side(OrderSide.BUY)
|
|
.orderType(OrderType.LIMIT)
|
|
.price("1.50")
|
|
.quantity("100")
|
|
.timeInForce(TimeInForce.GTC)
|
|
.build()).get();
|
|
|
|
System.out.println("Limit order placed:");
|
|
System.out.println(" Order ID: " + limitOrder.getOrderId());
|
|
System.out.println(" Status: " + limitOrder.getStatus());
|
|
System.out.println(" Price: " + limitOrder.getPrice());
|
|
System.out.println(" Quantity: " + limitOrder.getQuantity());
|
|
|
|
// Place a market order
|
|
System.out.println("\nPlacing market sell order...");
|
|
OrderResult marketOrder = dex.spot().placeOrder(OrderRequest.builder()
|
|
.market("SYN-USDC")
|
|
.side(OrderSide.SELL)
|
|
.orderType(OrderType.MARKET)
|
|
.quantity("50")
|
|
.build()).get();
|
|
|
|
System.out.println("Market order executed:");
|
|
System.out.println(" Order ID: " + marketOrder.getOrderId());
|
|
System.out.println(" Status: " + marketOrder.getStatus());
|
|
System.out.println(" Filled: " + marketOrder.getFilledQuantity());
|
|
System.out.println(" Avg price: " + marketOrder.getAveragePrice());
|
|
|
|
// Get order status
|
|
OrderStatus status = dex.spot().getOrder(limitOrder.getOrderId()).get();
|
|
System.out.println("\nOrder status:");
|
|
System.out.println(" Status: " + status.getStatus());
|
|
System.out.println(" Filled: " + status.getFilledQuantity() + " / " + status.getQuantity());
|
|
System.out.println(" Remaining: " + status.getRemainingQuantity());
|
|
|
|
// Cancel order
|
|
System.out.println("\nCancelling order...");
|
|
dex.spot().cancelOrder(limitOrder.getOrderId()).get();
|
|
System.out.println("Order cancelled successfully");
|
|
|
|
// Get open orders
|
|
List<Order> openOrders = dex.spot().getOpenOrders("SYN-USDC").get();
|
|
System.out.println("\nOpen orders: " + openOrders.size());
|
|
|
|
// Get trade history
|
|
List<Trade> trades = dex.spot().getTradeHistory("SYN-USDC", 10).get();
|
|
System.out.println("\nRecent trades: " + trades.size());
|
|
for (Trade trade : trades.subList(0, Math.min(3, trades.size()))) {
|
|
System.out.println(" " + trade.getSide() + " " + trade.getQuantity() +
|
|
" @ " + trade.getPrice() + " (" + trade.getTimestamp() + ")");
|
|
}
|
|
|
|
System.out.println();
|
|
}
|
|
|
|
static void perpsTradingExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Perpetual Futures Trading ===");
|
|
|
|
// Get available perps markets
|
|
List<PerpsMarket> perpsMarkets = dex.perps().listMarkets().get();
|
|
System.out.println("Available perps markets: " + perpsMarkets.size());
|
|
|
|
for (PerpsMarket market : perpsMarkets.subList(0, Math.min(3, perpsMarkets.size()))) {
|
|
System.out.println(" " + market.getSymbol() + ": " + market.getMarkPrice() +
|
|
" (funding: " + market.getFundingRate() + "%)");
|
|
}
|
|
|
|
// Open a long position
|
|
System.out.println("\nOpening long position...");
|
|
Position position = dex.perps().openPosition(PerpsOrderRequest.builder()
|
|
.market("SYN-USDC-PERP")
|
|
.side(OrderSide.BUY)
|
|
.orderType(OrderType.LIMIT)
|
|
.price("1.50")
|
|
.size("1000")
|
|
.leverage(10)
|
|
.reduceOnly(false)
|
|
.build()).get();
|
|
|
|
System.out.println("Position opened:");
|
|
System.out.println(" Position ID: " + position.getPositionId());
|
|
System.out.println(" Size: " + position.getSize());
|
|
System.out.println(" Entry price: " + position.getEntryPrice());
|
|
System.out.println(" Leverage: " + position.getLeverage() + "x");
|
|
System.out.println(" Liquidation price: " + position.getLiquidationPrice());
|
|
|
|
// Get position details
|
|
PositionDetails details = dex.perps().getPosition(position.getPositionId()).get();
|
|
System.out.println("\nPosition details:");
|
|
System.out.println(" Unrealized PnL: " + details.getUnrealizedPnL());
|
|
System.out.println(" Margin: " + details.getMargin());
|
|
System.out.println(" Margin ratio: " + details.getMarginRatio() + "%");
|
|
|
|
// Set stop loss and take profit
|
|
System.out.println("\nSetting stop loss and take profit...");
|
|
dex.perps().setStopLoss(position.getPositionId(), "1.40").get();
|
|
System.out.println("Stop loss set at 1.40");
|
|
|
|
dex.perps().setTakeProfit(position.getPositionId(), "1.80").get();
|
|
System.out.println("Take profit set at 1.80");
|
|
|
|
// Close position
|
|
System.out.println("\nClosing position...");
|
|
CloseResult closeResult = dex.perps().closePosition(position.getPositionId()).get();
|
|
System.out.println("Position closed:");
|
|
System.out.println(" Realized PnL: " + closeResult.getRealizedPnL());
|
|
System.out.println(" Close price: " + closeResult.getClosePrice());
|
|
|
|
// Get all positions
|
|
List<Position> positions = dex.perps().getPositions().get();
|
|
System.out.println("\nOpen positions: " + positions.size());
|
|
|
|
// Get funding history
|
|
List<FundingPayment> funding = dex.perps().getFundingHistory("SYN-USDC-PERP", 10).get();
|
|
System.out.println("Funding payments: " + funding.size());
|
|
|
|
System.out.println();
|
|
}
|
|
|
|
static void liquidityExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Liquidity Provision ===");
|
|
|
|
// Get available pools
|
|
List<Pool> pools = dex.liquidity().listPools().get();
|
|
System.out.println("Available pools: " + pools.size());
|
|
|
|
for (Pool pool : pools.subList(0, Math.min(3, pools.size()))) {
|
|
System.out.println("\n " + pool.getName() + ":");
|
|
System.out.println(" TVL: $" + pool.getTvl());
|
|
System.out.println(" APR: " + pool.getApr() + "%");
|
|
System.out.println(" Volume 24h: $" + pool.getVolume24h());
|
|
System.out.println(" Fee tier: " + pool.getFeeTier() + "%");
|
|
}
|
|
|
|
// Get pool details
|
|
PoolDetails pool = dex.liquidity().getPool("SYN-USDC").get();
|
|
System.out.println("\nSYN-USDC pool details:");
|
|
System.out.println(" Token0: " + pool.getToken0().getSymbol() + " (" + pool.getToken0Reserve() + ")");
|
|
System.out.println(" Token1: " + pool.getToken1().getSymbol() + " (" + pool.getToken1Reserve() + ")");
|
|
System.out.println(" Price: " + pool.getPrice());
|
|
System.out.println(" Total LP tokens: " + pool.getTotalLPTokens());
|
|
|
|
// Add liquidity
|
|
System.out.println("\nAdding liquidity...");
|
|
AddLiquidityResult addResult = dex.liquidity().addLiquidity(AddLiquidityRequest.builder()
|
|
.pool("SYN-USDC")
|
|
.amount0("100")
|
|
.amount1("150")
|
|
.slippageBps(50) // 0.5%
|
|
.build()).get();
|
|
|
|
System.out.println("Liquidity added:");
|
|
System.out.println(" LP tokens received: " + addResult.getLpTokens());
|
|
System.out.println(" Position ID: " + addResult.getPositionId());
|
|
System.out.println(" Share of pool: " + addResult.getShareOfPool() + "%");
|
|
|
|
// Get LP positions
|
|
List<LPPosition> lpPositions = dex.liquidity().getPositions().get();
|
|
System.out.println("\nLP positions: " + lpPositions.size());
|
|
for (LPPosition pos : lpPositions) {
|
|
System.out.println(" " + pos.getPool() + ": " + pos.getLpTokens() +
|
|
" LP tokens (value: $" + pos.getValue() + ")");
|
|
}
|
|
|
|
// Claim fees
|
|
System.out.println("\nClaiming fees...");
|
|
ClaimFeesResult fees = dex.liquidity().claimFees(addResult.getPositionId()).get();
|
|
System.out.println("Fees claimed:");
|
|
System.out.println(" Token0: " + fees.getAmount0());
|
|
System.out.println(" Token1: " + fees.getAmount1());
|
|
|
|
// Remove liquidity
|
|
System.out.println("\nRemoving liquidity...");
|
|
RemoveLiquidityResult removeResult = dex.liquidity().removeLiquidity(RemoveLiquidityRequest.builder()
|
|
.positionId(addResult.getPositionId())
|
|
.lpTokens(addResult.getLpTokens())
|
|
.slippageBps(50)
|
|
.build()).get();
|
|
|
|
System.out.println("Liquidity removed:");
|
|
System.out.println(" Token0 received: " + removeResult.getAmount0());
|
|
System.out.println(" Token1 received: " + removeResult.getAmount1());
|
|
|
|
System.out.println();
|
|
}
|
|
|
|
static void orderbookExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Order Book ===");
|
|
|
|
// Get order book snapshot
|
|
Orderbook orderbook = dex.orderbook().getSnapshot("SYN-USDC", 10).get();
|
|
|
|
System.out.println("Order book for SYN-USDC:");
|
|
System.out.println("\nAsks (sells):");
|
|
for (OrderbookEntry ask : orderbook.getAsks().subList(0, Math.min(5, orderbook.getAsks().size()))) {
|
|
System.out.println(" " + ask.getQuantity() + " @ " + ask.getPrice());
|
|
}
|
|
|
|
System.out.println("\nBids (buys):");
|
|
for (OrderbookEntry bid : orderbook.getBids().subList(0, Math.min(5, orderbook.getBids().size()))) {
|
|
System.out.println(" " + bid.getQuantity() + " @ " + bid.getPrice());
|
|
}
|
|
|
|
System.out.println("\nSpread: " + orderbook.getSpread() + " (" + orderbook.getSpreadPercent() + "%)");
|
|
System.out.println("Mid price: " + orderbook.getMidPrice());
|
|
|
|
// Get recent trades
|
|
List<Trade> recentTrades = dex.orderbook().getRecentTrades("SYN-USDC", 10).get();
|
|
System.out.println("\nRecent trades:");
|
|
for (Trade trade : recentTrades.subList(0, Math.min(5, recentTrades.size()))) {
|
|
System.out.println(" " + trade.getSide() + " " + trade.getQuantity() + " @ " + trade.getPrice());
|
|
}
|
|
|
|
System.out.println();
|
|
}
|
|
|
|
static void portfolioExample(SynorDex dex) throws Exception {
|
|
System.out.println("=== Portfolio ===");
|
|
|
|
// Get portfolio overview
|
|
Portfolio portfolio = dex.portfolio().getOverview().get();
|
|
|
|
System.out.println("Portfolio overview:");
|
|
System.out.println(" Total value: $" + portfolio.getTotalValue());
|
|
System.out.println(" Available balance: $" + portfolio.getAvailableBalance());
|
|
System.out.println(" In orders: $" + portfolio.getInOrders());
|
|
System.out.println(" In positions: $" + portfolio.getInPositions());
|
|
System.out.println(" Unrealized PnL: $" + portfolio.getUnrealizedPnL());
|
|
|
|
// Get balances
|
|
List<Balance> balances = dex.portfolio().getBalances().get();
|
|
System.out.println("\nBalances:");
|
|
for (Balance balance : balances) {
|
|
System.out.println(" " + balance.getAsset() + ": " + balance.getTotal() +
|
|
" (available: " + balance.getAvailable() + ", in orders: " + balance.getInOrders() + ")");
|
|
}
|
|
|
|
// Get PnL history
|
|
List<PnLEntry> pnlHistory = dex.portfolio().getPnLHistory(30).get(); // Last 30 days
|
|
System.out.println("\nPnL history (last " + pnlHistory.size() + " days):");
|
|
if (!pnlHistory.isEmpty()) {
|
|
System.out.println(" Total PnL: $" + pnlHistory.get(pnlHistory.size() - 1).getCumulativePnL());
|
|
}
|
|
|
|
// Get trade statistics
|
|
TradeStats stats = dex.portfolio().getStats().get();
|
|
System.out.println("\nTrade statistics:");
|
|
System.out.println(" Total trades: " + stats.getTotalTrades());
|
|
System.out.println(" Win rate: " + stats.getWinRate() + "%");
|
|
System.out.println(" Avg profit: $" + stats.getAvgProfit());
|
|
System.out.println(" Avg loss: $" + stats.getAvgLoss());
|
|
System.out.println(" Best trade: $" + stats.getBestTrade());
|
|
System.out.println(" Worst trade: $" + stats.getWorstTrade());
|
|
|
|
System.out.println();
|
|
}
|
|
}
|