use num_enum::TryFromPrimitive;
use shank::ShankInstruction;
#[repr(u8)]
#[derive(TryFromPrimitive, Debug, Copy, Clone, ShankInstruction, PartialEq, Eq)]
#[rustfmt::skip]
pub enum ManifestInstruction {
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, name = "system_program", desc = "System program")]
#[account(3, name = "base_mint", desc = "Base mint")]
#[account(4, name = "quote_mint", desc = "Quote mint")]
#[account(5, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market, base_mint]")]
#[account(6, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market, quote_mint]")]
#[account(7, name = "token_program", desc = "Token program")]
#[account(8, name = "token_program_22", desc = "Token program 22")]
CreateMarket = 0,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, name = "system_program", desc = "System program")]
ClaimSeat = 1,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, writable, name = "trader_token", desc = "Trader token account")]
#[account(3, writable, name = "vault", desc = "Vault PDA, seeds are [b'vault', market, mint]")]
#[account(4, name = "token_program", desc = "Token program(22), should be the version that aligns with the token being used")]
#[account(5, name = "mint", desc = "Required for token22 transfer_checked")]
Deposit = 2,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, writable, name = "trader_token", desc = "Trader token account")]
#[account(3, writable, name = "vault", desc = "Vault PDA, seeds are [b'vault', market, mint]")]
#[account(4, name = "token_program", desc = "Token program(22), should be the version that aligns with the token being used")]
#[account(5, name = "mint", desc = "Required for token22 transfer_checked")]
Withdraw = 3,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, writable, name = "trader_base", desc = "Trader base token account")]
#[account(3, writable, name = "trader_quote", desc = "Trader quote token account")]
#[account(4, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint]")]
#[account(5, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint]")]
#[account(6, name = "token_program_base", desc = "Token program(22) base")]
#[account(7, optional, name = "base_mint", desc = "Base mint, only included if base is Token22, otherwise not required")]
#[account(8, optional, name = "token_program_quote", desc = "Token program(22) quote. Optional. Only include if different from base")]
#[account(9, optional, name = "quote_mint", desc = "Quote mint, only included if base is Token22, otherwise not required")]
#[account(10, writable, optional, name = "global", desc = "Global account")]
#[account(11, writable, optional, name = "global_vault", desc = "Global vault")]
Swap = 4,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, name = "system_program", desc = "System program")]
Expand = 5,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, name = "system_program", desc = "System program")]
#[account(3, optional, name = "base_mint", desc = "Mint for the base global account")]
#[account(4, optional, writable, name = "base_global", desc = "Base global account")]
#[account(5, optional, name = "base_global_vault", desc = "Base global vault")]
#[account(6, optional, name = "base_market_vault", desc = "Base market vault")]
#[account(7, optional, name = "base_token_program", desc = "Token program(22)")]
#[account(8, optional, name = "quote_mint", desc = "Mint for this global account")]
#[account(9, optional, writable, name = "quote_global", desc = "Quote global account")]
#[account(10, optional, name = "quote_global_vault", desc = "Quote global vault")]
#[account(11, optional, name = "quote_market_vault", desc = "Quote market vault")]
#[account(12, optional, name = "quote_token_program", desc = "Token program(22)")]
BatchUpdate = 6,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "global", desc = "Global account")]
#[account(2, name = "system_program", desc = "System program")]
#[account(3, name = "mint", desc = "Mint for this global account")]
#[account(4, writable, name = "global_vault", desc = "Global vault")]
#[account(5, name = "token_program", desc = "Token program(22)")]
GlobalCreate = 7,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "global", desc = "Global account")]
#[account(2, name = "system_program", desc = "System program")]
GlobalAddTrader = 8,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "global", desc = "Global account")]
#[account(2, name = "mint", desc = "Mint for this global account")]
#[account(3, writable, name = "global_vault", desc = "Global vault")]
#[account(4, writable, name = "trader_token", desc = "Trader token account")]
#[account(5, name = "token_program", desc = "Token program(22)")]
GlobalDeposit = 9,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "global", desc = "Global account")]
#[account(2, name = "mint", desc = "Mint for this global account")]
#[account(3, writable, name = "global_vault", desc = "Global vault")]
#[account(4, writable, name = "trader_token", desc = "Trader token account")]
#[account(5, name = "token_program", desc = "Token program(22)")]
GlobalWithdraw = 10,
#[account(0, writable, signer, name = "payer", desc = "Payer")]
#[account(1, writable, name = "global", desc = "Global account")]
#[account(2, name = "mint", desc = "Mint for this global account")]
#[account(3, writable, name = "global_vault", desc = "Global vault")]
#[account(4, name = "trader_token", desc = "Trader token account")]
#[account(5, name = "evictee_token", desc = "Evictee token account")]
#[account(6, name = "token_program", desc = "Token program(22)")]
GlobalEvict = 11,
#[account(0, writable, signer, name = "payer", desc = "Payer for this tx, receiver of rent deposit")]
#[account(1, writable, name = "market", desc = "Account holding all market state")]
#[account(2, name = "system_program", desc = "System program")]
#[account(3, writable, name = "global", desc = "Global account")]
GlobalClean = 12,
}
impl ManifestInstruction {
pub fn to_vec(&self) -> Vec<u8> {
vec![*self as u8]
}
}
#[test]
fn test_instruction_serialization() {
let num_instructions: u8 = 12;
for i in 0..=255 {
let instruction: ManifestInstruction = match ManifestInstruction::try_from(i) {
Ok(j) => {
assert!(i <= num_instructions);
j
}
Err(_) => {
assert!(i > num_instructions);
continue;
}
};
assert_eq!(instruction as u8, i);
}
}
#[test]
fn test_to_vec() {
let create_market_ix = ManifestInstruction::CreateMarket;
let vec = create_market_ix.to_vec();
assert_eq!(*vec.first().unwrap(), 0);
}