Skip to main content

execute_limit/
execute_limit.rs

1//! Example: Listen to ticker and L2 order book updates.
2//!
3//! ```bash
4//! cargo run --example md_listener -- \
5//!     --url wss://exchange-wss.bulk.trade \
6//!     --symbols BTC-USD,ETH-USD
7//! ```
8
9use bulk_client::api::parts::HttpConfig;
10use bulk_client::api::BulkHttpClient;
11use bulk_client::common::tif::TimeInForce;
12use bulk_client::msgs::LimitOrder;
13use bulk_client::parts::make_nonce;
14use bulk_client::transaction::{Action, ActionMeta, TransactionSigner};
15use clap::Parser;
16use std::sync::Arc;
17use std::{env, process};
18use tracing::info;
19use tracing_subscriber::EnvFilter;
20
21#[derive(Parser, Debug)]
22#[command(name = "md_query", about = "Query MD")]
23struct Args {
24    /// WebSocket URL
25    #[arg(long, default_value = "http://localhost:12000/api/v1")]
26    url: String,
27}
28
29#[tokio::main]
30async fn main() -> eyre::Result<()> {
31    tracing_subscriber::fmt()
32        .with_env_filter(EnvFilter::from_default_env().add_directive(tracing::Level::INFO.into()))
33        .init();
34
35    let args = Args::parse();
36
37    info!("Connecting to {} for execution", args.url);
38    let key = env::var("BULK_PRIVATE_KEY")?;
39    let signer = TransactionSigner::from_private_key(key.as_str())?;
40    let client = BulkHttpClient::new(&HttpConfig {
41        base_url: args.url,
42        signer: Some(signer.clone()),
43        ..Default::default()
44    })
45    .unwrap();
46
47    let account = signer.public_key();
48    let nonce = make_nonce();
49
50    let mut orders = vec![
51        Action::LimitOrder(LimitOrder {
52            symbol: Arc::from("BTC-USD"),
53            is_buy: true,
54            price: 1000.0,
55            size: 0.0001,
56            tif: TimeInForce::IOC,
57            reduce_only: false,
58            iso: false,
59            builder_code: None,
60            meta: ActionMeta {
61                account,
62                nonce,
63                seqno: 0,
64                hash: None,
65            },
66        }),
67        Action::LimitOrder(LimitOrder {
68            symbol: Arc::from("ETH-USD"),
69            is_buy: true,
70            price: 1000.0,
71            size: 0.0001,
72            tif: TimeInForce::IOC,
73            reduce_only: false,
74            iso: false,
75            builder_code: None,
76            meta: ActionMeta {
77                account,
78                nonce,
79                seqno: 1,
80                hash: None,
81            },
82        }),
83    ];
84
85    let oids = orders
86        .iter_mut()
87        .map(|o| o.hash().to_string())
88        .collect::<Vec<_>>();
89
90    eprintln!("order IDs: {:?}", oids);
91
92    let results = client.place_tx(orders, Some(account), Some(nonce)).await?;
93    eprintln!("results: {:?}\n", results);
94
95    process::exit(0);
96}