Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 53 additions & 1 deletion programs/drift/src/controller/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use anchor_spl::token_2022::spl_token_2022::extension::{
};
use anchor_spl::token_2022::spl_token_2022::state::Mint as MintInner;
use anchor_spl::token_interface::{
self, CloseAccount, Mint, TokenAccount, TokenInterface, Transfer, TransferChecked,
self, Burn, CloseAccount, Mint, MintTo, TokenAccount, TokenInterface, Transfer, TransferChecked,
};

pub fn send_from_program_vault<'info>(
Expand Down Expand Up @@ -106,6 +106,58 @@ pub fn close_vault<'info>(
token_interface::close_account(cpi_context)
}

pub fn mint_tokens<'info>(
token_program: &Interface<'info, TokenInterface>,
destination: &InterfaceAccount<'info, TokenAccount>,
authority: &AccountInfo<'info>,
nonce: u8,
amount: u64,
mint: &InterfaceAccount<'info, Mint>,
) -> Result<()> {
let signature_seeds = get_signer_seeds(&nonce);
let signers = &[&signature_seeds[..]];

let mint_account_info = mint.to_account_info();

validate_mint_fee(&mint_account_info)?;

let cpi_accounts = MintTo {
mint: mint_account_info,
to: destination.to_account_info(),
authority: authority.to_account_info(),
};

let cpi_program = token_program.to_account_info();
let cpi_context = CpiContext::new_with_signer(cpi_program, cpi_accounts, signers);
token_interface::mint_to(cpi_context, amount)
}

pub fn burn_tokens<'info>(
token_program: &Interface<'info, TokenInterface>,
destination: &InterfaceAccount<'info, TokenAccount>,
authority: &AccountInfo<'info>,
nonce: u8,
amount: u64,
mint: &InterfaceAccount<'info, Mint>,
) -> Result<()> {
let signature_seeds = get_signer_seeds(&nonce);
let signers = &[&signature_seeds[..]];

let mint_account_info = mint.to_account_info();

validate_mint_fee(&mint_account_info)?;

let cpi_accounts = Burn {
mint: mint_account_info,
from: destination.to_account_info(),
authority: authority.to_account_info(),
};

let cpi_program = token_program.to_account_info();
let cpi_context = CpiContext::new_with_signer(cpi_program, cpi_accounts, signers);
token_interface::burn(cpi_context, amount)
}

pub fn validate_mint_fee(account_info: &AccountInfo) -> Result<()> {
let mint_data = account_info.try_borrow_data()?;
let mint_with_extension = StateWithExtensions::<MintInner>::unpack(&mint_data)?;
Expand Down
20 changes: 17 additions & 3 deletions programs/drift/src/instructions/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4480,6 +4480,9 @@ pub fn handle_initialize_high_leverage_mode_config(
pub fn handle_initialize_lp_pool(
ctx: Context<InitializeLpPool>,
name: [u8; 32],
min_mint_fee: i64,
max_mint_fee: i64,
revenue_rebalance_period: u64,
max_aum: u128,
) -> Result<()> {
let mut lp_pool = ctx.accounts.lp_pool.load_init()?;
Expand All @@ -4497,8 +4500,13 @@ pub fn handle_initialize_lp_pool(
last_revenue_rebalance_ts: 0,
total_fees_received: 0,
total_fees_paid: 0,
total_mint_redeem_fees_paid: 0,
oldest_oracle_slot: 0,
bump: ctx.bumps.lp_pool,
min_mint_fee,
max_mint_fee_premium: max_mint_fee,
revenue_rebalance_period,
next_mint_redeem_id: 1,
_padding: [0; 12],
};

Expand Down Expand Up @@ -5763,13 +5771,17 @@ pub struct InitializeLpPool<'info> {
)]
pub lp_pool: AccountLoader<'info, LPPool>,

pub mint: Account<'info, anchor_spl::token::Mint>,

#[account(
init,
seeds = [b"LP_POOL_TOKEN_VAULT".as_ref(), lp_pool.key().as_ref()],
bump,
payer = admin,
mint::decimals = 6,
mint::authority = lp_pool.key(),
token::mint = mint,
token::authority = drift_signer
)]
pub mint: Account<'info, anchor_spl::token::Mint>,
pub lp_pool_token_vault: Box<InterfaceAccount<'info, TokenAccount>>,

#[account(
init,
Expand All @@ -5793,6 +5805,8 @@ pub struct InitializeLpPool<'info> {
has_one = admin
)]
pub state: Box<Account<'info, State>>,
/// CHECK: program signer
pub drift_signer: AccountInfo<'info>,

pub token_program: Program<'info, Token>,

Expand Down
Loading