Skip to main content

percli_chain/commands/
deploy.rs

1use anyhow::{bail, Result};
2
3use crate::config::ChainConfig;
4use crate::ix::{self, InitializeMarketArgs, RiskParamsInput};
5use crate::rpc::ChainRpc;
6
7pub fn run(config: &ChainConfig) -> Result<()> {
8    let rpc = ChainRpc::new(&config.rpc_url);
9    let (market_pda, _bump) = config.market_pda();
10
11    if rpc.account_exists(&market_pda)? {
12        bail!("Market already exists at {market_pda}");
13    }
14
15    let slot = rpc.get_slot()?;
16
17    // Default risk params for devnet testing
18    let params = RiskParamsInput {
19        maintenance_margin_bps: 500,
20        initial_margin_bps: 1000,
21        liquidation_fee_bps: 50,
22        insurance_fee_bps: 25,
23        adl_threshold_bps: 200,
24        max_leverage_q: 20,
25        min_order_size_q: 1,
26        tick_size: 1,
27        max_oi_imbalance_q: 1_000_000,
28        haircut_start_bps: 100,
29        haircut_end_bps: 500,
30        haircut_maturity_slots: 1000,
31        matured_haircut_bps: 300,
32        max_accounts: 4096,
33        min_nonzero_mm_req: 100,
34        min_nonzero_im_req: 200,
35    };
36
37    let args = InitializeMarketArgs {
38        init_slot: slot,
39        init_oracle_price: 1000, // $10.00 default oracle price
40        params,
41    };
42
43    let ix = ix::initialize_market_ix(&config.program_id, &market_pda, &config.authority(), args);
44
45    println!("Deploying market...");
46    println!("  Authority: {}", config.authority());
47    println!("  Market PDA: {market_pda}");
48    println!("  RPC: {}", config.rpc_url);
49
50    let sig = rpc.send_tx(&[ix], &config.keypair)?;
51    println!("  Tx: {sig}");
52    println!("Market deployed.");
53
54    Ok(())
55}