Polyfill-rs

A high-performance, low-latency Rust client for Polymarket optimized for high-frequency trading.

Overview

Polyfill-rs provides a comprehensive trading infrastructure for algorithmic trading strategies on Polymarket's prediction markets. The library is designed for institutional-grade trading systems requiring high throughput and robust error handling.

Key Features:

  • Drop-in replacement for polymarket-rs-client with enhanced functionality
  • High-performance order book management with O(log n) operations
  • Real-time market data streaming with WebSocket support
  • Trade execution simulation with slippage protection
  • Comprehensive error handling with specific error types

Migration from polymarket-rs-client

Polyfill-rs is designed as a drop-in replacement for the existing polymarket-rs-client. The API maintains full compatibility while adding advanced features:

// Before (polymarket-rs-client)
use polymarket_rs_client::ClobClient;

let mut client = ClobClient::with_l1_headers(
    "https://clob.polymarket.com",
    "your_private_key",
    137,
);

// After (polyfill-rs) - Same API!
use polyfill_rs::ClobClient;

let mut client = ClobClient::with_l1_headers(
    "https://clob.polymarket.com", 
    "your_private_key",
    137,
);

// All existing methods work identically
let api_creds = client.create_or_derive_api_key(None).await?;
client.set_api_creds(api_creds);

let order_args = OrderArgs::new(
    "token_id",
    Decimal::from_str("0.75")?,
    Decimal::from_str("100.0")?,
    Side::BUY,
);

let result = client.create_and_post_order(&order_args).await?;

Architecture

Core Components

Order Book Management

  • Real-time order book maintenance with O(log n) operations
  • Thread-safe concurrent access patterns
  • Market impact calculation and liquidity analysis
  • Snapshot generation for strategy backtesting

Trade Execution Engine

  • Market order simulation with slippage protection
  • Limit order placement and management
  • Fill event processing and tracking
  • Fee calculation and cost analysis

Streaming Infrastructure

  • WebSocket-based real-time market data feeds
  • Automatic reconnection with exponential backoff
  • Message parsing and validation
  • Multi-stream management for concurrent market monitoring

Client Interface

  • REST API integration for order management
  • Authentication and signature generation
  • Rate limiting and request throttling
  • Comprehensive error handling with retry logic

Performance Characteristics

Latency Optimization

  • Zero-copy data structures where possible
  • Lock-free concurrent access patterns
  • Minimal allocation in hot paths
  • SIMD-optimized mathematical operations

Throughput Capabilities

  • High-frequency order book updates (10,000+ updates/second)
  • Concurrent stream processing
  • Efficient memory management with object pooling
  • Optimized serialization/deserialization

Memory Efficiency

  • Compact data representations
  • Minimal heap allocations
  • Efficient string handling
  • Memory-mapped data structures for large datasets

Installation

Add to your Cargo.toml:

[dependencies]
polyfill-rs = "0.1.0"

Usage

Basic Client Initialization (Compatible with polymarket-rs-client)

use polyfill_rs::{ClobClient, OrderArgs, Side};
use rust_decimal::Decimal;

let mut client = ClobClient::with_l1_headers(
    "https://clob.polymarket.com",
    "your_private_key",
    137,
);

// Get API credentials
let api_creds = client.create_or_derive_api_key(None).await?;
client.set_api_creds(api_creds);

// Create and post order
let order_args = OrderArgs::new(
    "token_id",
    Decimal::from_str("0.75")?,
    Decimal::from_str("100.0")?,
    Side::BUY,
);

let result = client.create_and_post_order(&order_args).await?;

Advanced Features (Polyfill-rs specific)

use polyfill_rs::{PolyfillClient, ClientConfig};

// Advanced configuration
let config = ClientConfig {
    base_url: "https://clob.polymarket.com".to_string(),
    chain_id: 137,
    private_key: Some("your_private_key".to_string()),
    max_slippage: Some(Decimal::from_str("0.001")?),
    fee_rate: Some(Decimal::from_str("0.02")?),
    ..Default::default()
};

let mut client = PolyfillClient::with_config(config)?;

// Subscribe to real-time order book updates
client.subscribe_to_order_book("token_id").await?;

// Process incoming messages
while let Some(message) = client.get_next_message().await? {
    println!("Received: {:?}", message);
}

Order Book Management

use polyfill_rs::{OrderBookManager, OrderDelta, Side};

let mut book_manager = OrderBookManager::new();

// Apply order book delta
let delta = OrderDelta {
    token_id: "market_token".to_string(),
    timestamp: chrono::Utc::now(),
    side: Side::Buy,
    price: Decimal::from_str("0.75")?,
    size: Decimal::from_str("100.0")?,
    sequence: 1,
};

book_manager.apply_delta(delta)?;

// Retrieve order book state
let book = book_manager.get_book("market_token")?;
let best_bid = book.best_bid();
let best_ask = book.best_ask();
let spread = book.spread();

Trade Execution Simulation

use polyfill_rs::{FillEngine, MarketOrderRequest};

let mut fill_engine = FillEngine::new(
    Decimal::from_str("0.001")?, // max_slippage
    Decimal::from_str("0.02")?,  // fee_rate
);

let order = MarketOrderRequest {
    token_id: "market_token".to_string(),
    side: Side::Buy,
    size: Decimal::from_str("50.0")?,
    max_price: Some(Decimal::from_str("0.80")?),
};

let result = fill_engine.execute_market_order(&book, order)?;
println!("Filled: {} at avg price: {}", result.filled_size, result.average_price);

Real-time Market Data

use polyfill_rs::{StreamManager, WebSocketStream};

let mut stream_manager = StreamManager::new();

// Subscribe to order book updates
let stream = WebSocketStream::new("wss://clob.polymarket.com/ws").await?;
stream_manager.add_stream("orderbook", stream).await?;

// Process incoming messages
while let Some(message) = stream_manager.next().await {
    match message {
        Ok(msg) => {
            // Process order book update
            if let Some(delta) = msg.to_order_delta() {
                book_manager.apply_delta(delta)?;
            }
        }
        Err(e) => {
            // Handle connection errors
            eprintln!("Stream error: {}", e);
        }
    }
}

Demo Trading Strategy

use polyfill_rs::{PolyfillClient, OrderBookManager, FillEngine};

struct ArbitrageStrategy {
    client: PolyfillClient,
    book_manager: OrderBookManager,
    fill_engine: FillEngine,
    min_spread: Decimal,
    position_size: Decimal,
}

impl ArbitrageStrategy {
    async fn execute_arbitrage(&mut self, token_id: &str) -> Result<()> {
        let book = self.book_manager.get_book(token_id)?;
        
        // Calculate arbitrage opportunity
        let spread = book.spread();
        if spread < self.min_spread {
            return Ok(());
        }
        
        let mid_price = book.mid_price();
        let bid_price = book.best_bid().unwrap().price;
        let ask_price = book.best_ask().unwrap().price;
        
        // Execute cross-spread orders
        let buy_order = self.client.create_order(
            token_id,
            Side::Buy,
            self.position_size,
            Some(bid_price),
        ).await?;
        
        let sell_order = self.client.create_order(
            token_id,
            Side::Sell,
            self.position_size,
            Some(ask_price),
        ).await?;
        
        Ok(())
    }
}

Configuration

Performance Tuning

use polyfill_rs::Config;

let config = Config {
    // Network configuration
    base_url: "https://clob.polymarket.com".to_string(),
    chain_id: 137,
    
    // Authentication
    private_key: Some("your_private_key".to_string()),
    api_credentials: None,
    
    // Performance settings
    connection_timeout: Duration::from_secs(5),
    request_timeout: Duration::from_secs(10),
    max_retries: 3,
    retry_delay: Duration::from_millis(100),
    
    // Rate limiting
    requests_per_second: 100,
    burst_size: 10,
};

Order Book Configuration

use polyfill_rs::OrderBookManager;

let book_manager = OrderBookManager::with_config(OrderBookConfig {
    max_books: 1000,
    cleanup_interval: Duration::from_secs(300),
    max_sequence_gap: 1000,
});

Error Handling

The library provides comprehensive error handling with specific error types:

use polyfill_rs::errors::{PolyfillError, ErrorKind};

match result {
    Ok(data) => {
        // Process successful response
    }
    Err(PolyfillError::Network { .. }) => {
        // Handle network connectivity issues
    }
    Err(PolyfillError::RateLimit { retry_after, .. }) => {
        // Implement exponential backoff
        tokio::time::sleep(retry_after).await;
    }
    Err(PolyfillError::Order { order_id, .. }) => {
        // Handle order-specific errors
    }
    Err(e) => {
        // Handle other errors
        eprintln!("Unexpected error: {}", e);
    }
}

Testing and Benchmarking

Unit Tests

cargo test

Performance Benchmarks

cargo bench

Example Execution

cargo run --example snipe

API Reference

Comprehensive API documentation is available at docs.rs/polyfill-rs.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome. Please ensure all code follows the established patterns and includes appropriate tests and benchmarks.

S
Description
No description provided
Readme 2.1 MiB
Languages
Rust 98%
Shell 2%