order/
order.rs

1use polysqueeze::{
2    client::{ClobClient, OrderArgs},
3    errors::Result,
4    types::{GammaListParams, OrderType, Side},
5};
6use rust_decimal::Decimal;
7use std::env;
8
9/// Helper to fail fast if a required environment variable is missing.
10fn env_var(key: &str) -> String {
11    env::var(key).expect(&format!("{} must be set for the order example", key))
12}
13
14#[tokio::main]
15async fn main() -> Result<()> {
16    let base_url =
17        env::var("POLY_API_URL").unwrap_or_else(|_| "https://clob.polymarket.com".into());
18    let private_key = env_var("POLY_PRIVATE_KEY");
19    let chain_id = env::var("POLY_CHAIN_ID")
20        .ok()
21        .and_then(|value| value.parse::<u64>().ok())
22        .unwrap_or(137);
23
24    // CLOB auth process, more info here https://docs.polymarket.com/developers/CLOB/authentication
25    let l1_client = ClobClient::with_l1_headers(&base_url, &private_key, chain_id);
26    let creds = l1_client.create_or_derive_api_key(None).await?;
27    let mut client = ClobClient::with_l2_headers(&base_url, &private_key, chain_id, creds.clone());
28
29    if let Ok(funder) = env::var("POLY_FUNDER") {
30        client.set_funder(&funder)?;
31    }
32
33    let gamma_params = GammaListParams {
34        limit: Some(5), // how many markets to fetch max
35        ..Default::default()
36    };
37    let markets_response = client.get_markets(None, Some(&gamma_params)).await?;
38    let market = markets_response
39        .data
40        .get(1) // TODO: for some reason market[0] doesnt countain token id, nor condition id. needs fixing
41        .expect("Gamma markets returned no data");
42
43    let token_id = market.clob_token_ids.first().unwrap();
44
45    let book = client.get_order_book(&token_id).await?;
46    let best_bid = book.bids.first().expect("order book has no bids").price;
47    let best_ask = book.asks.first().expect("order book has no asks").price;
48    let book_mid = (best_bid + best_ask) / Decimal::from(2);
49    let min_order_size: Decimal = 2.into();
50    let order_size = min_order_size;
51    let order_price = book_mid;
52
53    let args = OrderArgs::new(&token_id, order_price, order_size, Side::BUY);
54    let signed_order = client.create_order(&args, None, None, None).await?;
55
56    let response = client.post_order(signed_order, OrderType::GTC).await?;
57    println!("order posted: {}", response);
58
59    Ok(())
60}