Fix compilation errors after API parity changes

Update Market struct to match reference implementation with all required fields, add Clone trait to Rewards struct, fix Market initialization in decode.rs with proper field mappings, update test calls to use correct parameter types for get_sampling_markets method, remove broken example file that needs complete rewrite.
This commit is contained in:
floor-licker
2025-11-04 23:09:17 -05:00
parent 11765f9fc7
commit c5ac9537aa
6 changed files with 41 additions and 208 deletions
-196
View File
@@ -1,196 +0,0 @@
use polyfill_rs::{
ClobClient, OrderArgs, Side, OrderType, OpenOrderParams, TradeParams,
BatchMidpointRequest, BatchPriceRequest, NotificationParams,
PolyfillError, Result,
};
use rust_decimal::Decimal;
use std::str::FromStr;
/// Complete example showing all trading functionality
///
/// This demonstrates the full API parity with the original polymarket-rs-client,
/// plus all our performance optimizations and additional features.
#[tokio::main]
async fn main() -> Result<()> {
// Initialize the client with authentication
let private_key = std::env::var("PRIVATE_KEY")
.expect("PRIVATE_KEY environment variable required");
let chain_id = 137; // Polygon
println!("Initializing Polyfill-rs Trading Client");
// Step 1: Create client with L1 authentication (private key)
let mut client = ClobClient::with_l1_headers(
"https://clob.polymarket.com",
&private_key,
chain_id,
)?;
println!("Client initialized with L1 authentication");
// Step 2: Create or derive API credentials for L2 operations
println!("Setting up API credentials...");
let api_creds = client.create_or_derive_api_key(None).await?;
client.set_api_creds(api_creds);
println!("API credentials configured");
// Step 3: Get account information
println!("\nChecking account balances...");
let balances = client.balance_allowance().await?;
for balance in &balances {
println!(" Token {}: Balance = {}, Allowance = {}",
balance.asset_id, balance.balance, balance.allowance);
}
// Step 4: Get market data
println!("\nFetching market data...");
let token_id = "21742633143463906290569050155826241533067272736897614950488156847949938836455";
// Single token data
let order_book = client.get_order_book(token_id).await?;
println!(" Order book for {}: {} bids, {} asks",
token_id, order_book.bids.len(), order_book.asks.len());
let midpoint = client.get_midpoint(token_id).await?;
println!(" Midpoint: {}", midpoint.mid);
// Batch operations (much more efficient for multiple tokens)
let token_ids = vec![token_id.to_string()];
let batch_midpoints = client.get_midpoints(token_ids.clone()).await?;
println!(" Batch midpoints: {:?}", batch_midpoints.midpoints);
let batch_prices = client.get_prices(token_ids).await?;
for price in &batch_prices.prices {
println!(" Token {}: Bid={:?}, Ask={:?}, Mid={:?}",
price.token_id, price.bid, price.ask, price.mid);
}
// Step 5: Create and place orders
println!("\nCreating orders...");
// Create a limit order
let order_args = OrderArgs {
token_id: token_id.to_string(),
price: Decimal::from_str("0.52")?,
size: Decimal::from_str("10.0")?,
side: Side::BUY,
order_type: Some(OrderType::GTC),
expiration: None,
neg_risk: Some(false),
client_id: Some("example_order_1".to_string()),
};
println!(" Creating limit order: Buy 10 @ 0.52");
let order_result = client.create_and_post_order(&order_args).await?;
println!(" Order created: {:?}", order_result);
// Create a market order
let market_order_args = OrderArgs {
token_id: token_id.to_string(),
price: Decimal::ZERO, // Will be calculated automatically
size: Decimal::from_str("5.0")?,
side: Side::SELL,
order_type: Some(OrderType::FOK),
expiration: None,
neg_risk: Some(false),
client_id: Some("example_market_order_1".to_string()),
};
println!(" Creating market order: Sell 5 @ market");
let market_order_result = client.create_market_order(&market_order_args).await?;
println!(" Market order created: {:?}", market_order_result);
// Step 6: Query order history
println!("\nChecking order history...");
// Get all open orders
let open_orders = client.get_orders(None).await?;
println!(" Open orders: {}", open_orders.len());
for order in &open_orders {
println!(" Order {}: {} {} @ {} (Status: {})",
order.id, order.side, order.original_size, order.price, order.status);
}
// Get orders for specific token
let token_orders = client.get_orders(Some(OpenOrderParams {
id: None,
asset_id: Some(token_id.to_string()),
market: None,
})).await?;
println!(" Orders for token {}: {}", token_id, token_orders.len());
// Step 7: Query trade history
println!("\nChecking trade history...");
let trades = client.get_trades(Some(TradeParams {
id: None,
maker_address: None,
market: None,
asset_id: Some(token_id.to_string()),
before: None,
after: Some(1640995200), // January 1, 2022
})).await?;
println!(" Recent trades: {}", trades.len());
for trade in trades.iter().take(5) {
println!(" Trade {}: {} {} @ {} (Fee: {})",
trade.id, trade.side, trade.size, trade.price, trade.fee);
}
// Step 8: Order management
println!("\nOrder management...");
if !open_orders.is_empty() {
let order_to_cancel = &open_orders[0];
println!(" Cancelling order: {}", order_to_cancel.id);
let cancel_result = client.cancel(&order_to_cancel.id).await?;
println!(" Cancel result: {:?}", cancel_result);
}
// Step 9: Set up notifications (optional)
println!("\nSetting up notifications...");
let notification_params = NotificationParams {
signature: "example_signature".to_string(),
timestamp: chrono::Utc::now().timestamp() as u64,
};
match client.notifications(notification_params).await {
Ok(result) => println!(" Notifications configured: {:?}", result),
Err(e) => println!(" Notifications setup failed: {}", e),
}
println!("\nComplete trading example finished!");
println!("\nPerformance Notes:");
println!(" • Order book operations use fixed-point math (25x faster)");
println!(" • Batch operations reduce API calls by up to 90%");
println!(" • EIP-712 signing ensures maximum security");
println!(" • Comprehensive error handling with retry logic");
println!(" • Full API parity with original polymarket-rs-client");
Ok(())
}
/// Helper function to demonstrate error handling
async fn safe_trading_example() {
match main().await {
Ok(()) => println!("Trading example completed successfully"),
Err(PolyfillError::Auth { message, .. }) => {
eprintln!("Authentication error: {}", message);
eprintln!("Make sure PRIVATE_KEY environment variable is set");
},
Err(PolyfillError::Api { status_code, message, .. }) => {
eprintln!("API error ({}): {}", status_code, message);
eprintln!("Check your network connection and API limits");
},
Err(PolyfillError::Network { source, .. }) => {
eprintln!("Network error: {}", source);
eprintln!("Retrying with exponential backoff...");
},
Err(e) => {
eprintln!("Unexpected error: {}", e);
}
}
}
+1 -1
View File
@@ -158,7 +158,7 @@ impl PolyfillDemo {
}
// Get sampling markets
match self.client.get_sampling_markets(Some(5)).await {
match self.client.get_sampling_markets(None).await {
Ok(markets) => {
info!("Found {} markets", markets.data.len());
for market in &markets.data[..std::cmp::min(3, markets.data.len())] {
+1 -1
View File
@@ -98,7 +98,7 @@ async fn test_connectivity(client: &ClobClient) -> Result<()> {
/// Get a valid token ID from the markets endpoint
async fn get_valid_token_id(client: &ClobClient) -> Result<String> {
let markets = client.get_sampling_markets(Some(10)).await?;
let markets = client.get_sampling_markets(None).await?;
if markets.data.is_empty() {
return Err(PolyfillError::api(404, "No markets found"));