use ostium_rust_sdk::{Network, OpenPositionParams, OstiumClient, PositionSide};
use rust_decimal_macros::dec;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
println!("🔍 Trading Constraints Validation Example");
println!("==========================================");
println!("Demonstrating the three main trading constraints that should be enforced:\n");
let client = OstiumClient::new(Network::Testnet).await?;
let test_symbol = "BTC/USD";
println!("📊 Testing Trading Constraints for {}", test_symbol);
println!("===================================================\n");
println!("1️⃣ TRADING HOURS VALIDATION");
println!("---------------------------");
match client.get_trading_hours(test_symbol).await {
Ok(hours) => {
if hours.is_open {
println!("✅ Market is OPEN for {}", test_symbol);
println!(" Status: Trading allowed");
} else {
println!("❌ Market is CLOSED for {}", test_symbol);
println!(" Status: Trading NOT allowed");
if let Some(next_open) = hours.next_open {
println!(" Next opening: {}", next_open);
}
}
}
Err(e) => {
println!("⚠️ Could not check trading hours: {}", e);
println!(" This constraint is NOT being enforced properly");
}
}
println!("\n2️⃣ MINIMUM POSITION SIZE VALIDATION");
println!("-----------------------------------");
let tiny_position = dec!(0.00001); let normal_position = dec!(0.001);
println!("Testing with tiny position size: {} BTC", tiny_position);
println!("⚠️ Minimum position size validation is NOT currently enforced in the client");
println!(" Expected minimum for BTC: ~0.0001 BTC");
println!(" Current validation: MISSING - relies on contract errors");
println!(
"\nTesting with normal position size: {} BTC",
normal_position
);
println!("✅ This size should pass minimum requirements");
println!("\n3️⃣ OPEN INTEREST CAP VALIDATION");
println!("-------------------------------");
let current_price = match client.get_price(test_symbol).await {
Ok(price) => {
println!("Current {} price: ${}", test_symbol, price.mark_price);
price.mark_price
}
Err(_) => {
println!("Using estimated price for demonstration");
dec!(50000) }
};
let large_position = dec!(100.0); let large_leverage = dec!(10.0); let notional_value = large_position * current_price * large_leverage;
println!("Testing large position:");
println!(" Size: {} BTC", large_position);
println!(" Leverage: {}x", large_leverage);
println!(" Notional value: ${}", notional_value);
if notional_value > dec!(1_000_000) {
println!("❌ Position would exceed reasonable exposure limits");
println!(" Open interest cap validation: SHOULD BLOCK this trade");
} else {
println!("✅ Position within reasonable exposure limits");
}
println!("⚠️ Open interest cap validation is NOT currently enforced in the client");
println!(" Current validation: MISSING - relies on contract errors");
println!("\n📋 CONSTRAINT VALIDATION SUMMARY");
println!("================================");
println!("❌ Trading Hours: NOT enforced before trade execution");
println!(" └─ get_trading_hours() exists but not called in open_position()");
println!("❌ Min Position Size: NOT enforced at client level");
println!(" └─ Uses hardcoded placeholder values, not real contract data");
println!("❌ Open Interest Cap: NOT enforced at client level");
println!(" └─ No checking against actual open interest limits");
println!("\n🔧 RECOMMENDATIONS FOR FIXING:");
println!("==============================");
println!("1. Trading Hours Enforcement:");
println!(" • Call get_trading_hours() before every trade");
println!(" • Block trades when market is closed");
println!(" • Provide clear error messages with next opening time");
println!("\n2. Minimum Position Size Enforcement:");
println!(" • Get real minimum sizes from contract or config");
println!(" • Validate position size before calling contract");
println!(" • Provide helpful error messages with minimum requirements");
println!("\n3. Open Interest Cap Enforcement:");
println!(" • Query current open interest from contract");
println!(" • Calculate if new position would exceed caps");
println!(" • Block oversized positions before contract call");
println!("\n💡 IMPLEMENTATION EXAMPLE:");
println!("=========================");
let example_params = OpenPositionParams {
symbol: test_symbol.to_string(),
side: PositionSide::Long,
size: normal_position,
leverage: dec!(5.0),
take_profit: Some(current_price * dec!(1.1)),
stop_loss: Some(current_price * dec!(0.9)),
slippage_tolerance: dec!(0.02),
};
println!("Example validation flow for position:");
println!(" Symbol: {}", example_params.symbol);
println!(" Size: {}", example_params.size);
println!(" Leverage: {}x", example_params.leverage);
println!("\nValidation steps that should occur:");
println!(" 1. ✅ Check trading hours for {}", example_params.symbol);
println!(" 2. ✅ Validate {} >= minimum size", example_params.size);
println!(" 3. ✅ Check open interest cap for notional value");
println!(" 4. ✅ If all pass, execute trade");
println!(" 5. ❌ If any fail, return clear error message");
println!("\n🚨 CURRENT STATUS: CONSTRAINTS NOT PROPERLY ENFORCED");
println!(" • Trading relies on contract-level validation only");
println!(" • Poor user experience with cryptic contract errors");
println!(" • No proactive constraint checking");
println!("\n🎯 NEXT STEPS:");
println!(" 1. Add validate_trading_constraints() method to client");
println!(" 2. Call validation before all trading operations");
println!(" 3. Implement proper minimum size fetching from contracts");
println!(" 4. Add open interest monitoring capabilities");
println!(" 5. Update all trading methods to include constraint checks");
Ok(())
}