mirror of
https://github.com/d0zingcat/ore.git
synced 2026-05-13 23:16:52 +00:00
84 lines
3.0 KiB
Rust
84 lines
3.0 KiB
Rust
use meteora_pools_sdk::instructions::{SwapCpi, SwapCpiAccounts, SwapInstructionArgs};
|
|
use ore_api::prelude::*;
|
|
use steel::*;
|
|
|
|
/// Swap wagers into ORE and bury the ORE.
|
|
pub fn process_bury(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
|
|
// Load accounts.
|
|
let clock = Clock::get()?;
|
|
let (required_accounts, meteora_accounts) = accounts.split_at(6);
|
|
let [signer_info, block_info, block_bets_info, block_ore_info, bet_mint_info, ore_mint_info] =
|
|
required_accounts
|
|
else {
|
|
return Err(ProgramError::NotEnoughAccountKeys);
|
|
};
|
|
signer_info.is_signer()?; // .has_address(&INITIALIZER_ADDRESS)?;
|
|
block_info.as_account::<Block>(&ore_api::ID)?;
|
|
let block_bets = block_bets_info
|
|
.is_writable()?
|
|
.as_associated_token_account(block_info.key, bet_mint_info.key)?;
|
|
block_ore_info
|
|
.is_writable()?
|
|
.as_associated_token_account(block_info.key, &MINT_ADDRESS)?;
|
|
bet_mint_info.as_mint()?;
|
|
ore_mint_info.has_address(&MINT_ADDRESS)?.as_mint()?;
|
|
|
|
// Load meteora accounts.
|
|
let [pool_info, a_vault_info, b_vault_info, a_token_vault_info, b_token_vault_info, a_vault_lp_mint_info, b_vault_lp_mint_info, a_vault_lp_info, b_vault_lp_info, protocol_token_fee_info, vault_program_info, token_program_info, meteora_pools_program] =
|
|
meteora_accounts
|
|
else {
|
|
return Err(ProgramError::NotEnoughAccountKeys);
|
|
};
|
|
meteora_pools_program.is_program(&meteora_pools_sdk::programs::AMM_ID)?;
|
|
|
|
// Execute swap.
|
|
let swap = SwapCpi::new(
|
|
&meteora_pools_program,
|
|
SwapCpiAccounts {
|
|
pool: pool_info,
|
|
user_source_token: block_bets_info,
|
|
user_destination_token: block_ore_info,
|
|
a_vault: a_vault_info,
|
|
b_vault: b_vault_info,
|
|
a_token_vault: a_token_vault_info,
|
|
b_token_vault: b_token_vault_info,
|
|
a_vault_lp_mint: a_vault_lp_mint_info,
|
|
b_vault_lp_mint: b_vault_lp_mint_info,
|
|
a_vault_lp: a_vault_lp_info,
|
|
b_vault_lp: b_vault_lp_info,
|
|
protocol_token_fee: protocol_token_fee_info,
|
|
user: block_info,
|
|
vault_program: vault_program_info,
|
|
token_program: token_program_info,
|
|
},
|
|
SwapInstructionArgs {
|
|
in_amount: block_bets.amount(),
|
|
minimum_out_amount: 0, // TODO: Calculate minimum out amount with slippage
|
|
},
|
|
);
|
|
let block_bump = block_pda().1;
|
|
swap.invoke_signed(&[&[BLOCK, &[block_bump]]])?;
|
|
|
|
// Burn (bury) the purchased ORE.
|
|
let block_ore = block_ore_info.as_associated_token_account(block_info.key, &MINT_ADDRESS)?;
|
|
let burn_amount = block_ore.amount();
|
|
burn_signed_with_bump(
|
|
block_ore_info,
|
|
ore_mint_info,
|
|
block_info,
|
|
token_program_info,
|
|
burn_amount,
|
|
&[BLOCK],
|
|
block_bump,
|
|
)?;
|
|
|
|
// Emit an event.
|
|
BuryEvent {
|
|
amount: burn_amount,
|
|
ts: clock.unix_timestamp as u64,
|
|
}
|
|
.log();
|
|
|
|
Ok(())
|
|
}
|