pub mod buy {
use borsh::{BorshDeserialize, BorshSerialize};
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
pub const DISCRIMINATOR: [u8; 8] = [102, 6, 61, 18, 1, 218, 235, 234];
#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)]
pub struct Args {
pub base_amount_out: u64,
pub max_quote_amount_in: u64,
}
#[derive(Debug, Clone, Copy)]
pub struct Accounts {
pub pool: Pubkey,
pub user: Pubkey,
pub global_config: Pubkey,
pub base_mint: Pubkey,
pub quote_mint: Pubkey,
pub user_base_token_account: Pubkey,
pub user_quote_token_account: Pubkey,
pub pool_base_token_account: Pubkey,
pub pool_quote_token_account: Pubkey,
pub protocol_fee_recipient: Pubkey,
pub protocol_fee_recipient_token_account: Pubkey,
pub base_token_program: Pubkey,
pub quote_token_program: Pubkey,
pub system_program: Pubkey,
pub associated_token_program: Pubkey,
pub event_authority: Pubkey,
pub program: Pubkey,
}
pub fn build_ix(program_id: Pubkey, a: Accounts, args: Args) -> Instruction {
let mut data = Vec::with_capacity(8 + 128);
data.extend_from_slice(&DISCRIMINATOR);
data.extend_from_slice(&borsh::to_vec(&args).expect("borsh serialize"));
let accounts = vec![
AccountMeta::new(a.pool, false),
AccountMeta::new(a.user, true),
AccountMeta::new_readonly(a.global_config, false),
AccountMeta::new_readonly(a.base_mint, false),
AccountMeta::new_readonly(a.quote_mint, false),
AccountMeta::new(a.user_base_token_account, false),
AccountMeta::new(a.user_quote_token_account, false),
AccountMeta::new(a.pool_base_token_account, false),
AccountMeta::new(a.pool_quote_token_account, false),
AccountMeta::new_readonly(a.protocol_fee_recipient, false),
AccountMeta::new(a.protocol_fee_recipient_token_account, false),
AccountMeta::new_readonly(a.base_token_program, false),
AccountMeta::new_readonly(a.quote_token_program, false),
AccountMeta::new_readonly(a.system_program, false),
AccountMeta::new_readonly(a.associated_token_program, false),
AccountMeta::new_readonly(a.event_authority, false),
AccountMeta::new_readonly(a.program, false),
];
Instruction {
program_id,
accounts,
data,
}
}
}
pub mod sell {
use borsh::{BorshDeserialize, BorshSerialize};
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
pub const DISCRIMINATOR: [u8; 8] = [51, 230, 133, 164, 1, 127, 131, 173];
#[derive(Debug, Clone, BorshSerialize, BorshDeserialize)]
pub struct Args {
pub base_amount_in: u64,
pub min_quote_amount_out: u64,
}
#[derive(Debug, Clone, Copy)]
pub struct Accounts {
pub pool: Pubkey,
pub user: Pubkey,
pub global_config: Pubkey,
pub base_mint: Pubkey,
pub quote_mint: Pubkey,
pub user_base_token_account: Pubkey,
pub user_quote_token_account: Pubkey,
pub pool_base_token_account: Pubkey,
pub pool_quote_token_account: Pubkey,
pub protocol_fee_recipient: Pubkey,
pub protocol_fee_recipient_token_account: Pubkey,
pub base_token_program: Pubkey,
pub quote_token_program: Pubkey,
pub system_program: Pubkey,
pub associated_token_program: Pubkey,
pub event_authority: Pubkey,
pub program: Pubkey,
}
pub fn build_ix(program_id: Pubkey, a: Accounts, args: Args) -> Instruction {
let mut data = Vec::with_capacity(8 + 128);
data.extend_from_slice(&DISCRIMINATOR);
data.extend_from_slice(&borsh::to_vec(&args).expect("borsh serialize"));
let accounts = vec![
AccountMeta::new(a.pool, false),
AccountMeta::new(a.user, true),
AccountMeta::new_readonly(a.global_config, false),
AccountMeta::new_readonly(a.base_mint, false),
AccountMeta::new_readonly(a.quote_mint, false),
AccountMeta::new(a.user_base_token_account, false),
AccountMeta::new(a.user_quote_token_account, false),
AccountMeta::new(a.pool_base_token_account, false),
AccountMeta::new(a.pool_quote_token_account, false),
AccountMeta::new_readonly(a.protocol_fee_recipient, false),
AccountMeta::new(a.protocol_fee_recipient_token_account, false),
AccountMeta::new_readonly(a.base_token_program, false),
AccountMeta::new_readonly(a.quote_token_program, false),
AccountMeta::new_readonly(a.system_program, false),
AccountMeta::new_readonly(a.associated_token_program, false),
AccountMeta::new_readonly(a.event_authority, false),
AccountMeta::new_readonly(a.program, false),
];
Instruction {
program_id,
accounts,
data,
}
}
}