mod common;
use common::{
fresh_order_nonce, get_keypair, market_and_orderbook, quote_deposit_mint, rest_client,
wait_for_global_balance, ExampleResult,
};
use lightcone::prelude::*;
use solana_signer::Signer;
use solana_transaction::Transaction;
use std::sync::Arc;
const ORDER_QUOTE_AMOUNT: u64 = 1_100_000;
#[tokio::main]
async fn main() -> ExampleResult {
let client = rest_client()?;
let keypair = Arc::new(get_keypair()?);
let maker = keypair.pubkey();
common::login(&client, keypair.as_ref(), false).await?;
let (_market, orderbook) = market_and_orderbook(&client).await?;
let mint = quote_deposit_mint(&orderbook)?;
let rpc_sub = client.rpc();
let rpc = rpc_sub.inner().await?;
let deposit_ix = client
.positions()
.deposit_to_global()
.user(maker)
.mint(mint)
.amount(ORDER_QUOTE_AMOUNT)
.build_ix()?;
let blockhash = rpc_sub.get_latest_blockhash().await?;
let mut deposit_tx = Transaction::new_with_payer(&[deposit_ix], Some(&maker));
deposit_tx.try_sign(&[keypair.as_ref()], blockhash)?;
let deposit_sig = rpc.send_and_confirm_transaction(&deposit_tx).await?;
println!("deposit_to_global: confirmed {deposit_sig}");
client
.set_signing_strategy(SigningStrategy::Native(keypair.clone()))
.await;
wait_for_global_balance(&client, &mint, rust_decimal::Decimal::new(11, 1)).await?;
let nonce = fresh_order_nonce(&client, &maker).await?;
client.set_order_nonce(nonce).await;
let response = client
.orders()
.limit_order()
.await
.maker(maker)
.bid()
.price("0.55")
.size("2")
.salt(lightcone::program::orders::generate_salt())
.submit(&client, &orderbook)
.await?;
println!(
"submitted: {} filled={} remaining={} fills={}",
response.order_hash,
response.filled,
response.remaining,
response.fills.len()
);
Ok(())
}