1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::mem::size_of;

use ellipsis_client::EllipsisClient;
use phoenix::program::MarketHeader;
use phoenix_seat_manager::{get_seat_manager_address, seat_manager::SeatManager};
use solana_sdk::pubkey::Pubkey;

use crate::helpers::market_helpers::get_seat_manager_data_with_market;

pub async fn process_get_seat_manager_info(
    client: &EllipsisClient,
    market_pubkey: &Pubkey,
) -> anyhow::Result<()> {
    let seat_manager_address = get_seat_manager_address(market_pubkey).0;
    let market_data = client.get_account_data(market_pubkey).await?;
    let market_header =
        bytemuck::from_bytes::<MarketHeader>(market_data.split_at(size_of::<MarketHeader>()).0);
    if market_header.authority != seat_manager_address {
        println!(
            "Authority for Market {} is not the seat manager.",
            market_pubkey
        );
        println!("Market authority: {}", market_header.authority);
        println!("Seat manager address: {}", seat_manager_address);
        return Ok(());
    }
    let seat_manager_info = get_seat_manager_data_with_market(client, market_pubkey).await?;
    print_seat_manager_struct(&seat_manager_info, &seat_manager_address);
    Ok(())
}

pub fn print_seat_manager_struct(seat_manager: &SeatManager, seat_manager_pubkey: &Pubkey) {
    println!("Seat Manager Address: {}", seat_manager_pubkey);
    println!("SM Market: {}", seat_manager.market);
    println!("SM Authority: {}", seat_manager.authority);
    println!("SM Successor: {}", seat_manager.successor);
    println!(
        "Number of designated market makers: {}",
        seat_manager.num_makers
    );

    let dmms: Vec<&Pubkey> = seat_manager
        .designated_market_makers
        .iter()
        .filter(|&&dmm| dmm != Pubkey::default())
        .collect();
    if !dmms.is_empty() {
        println!("DMMs: {:?}", dmms);
    }
}