Skip to content

Commit

Permalink
anchor: add authz to marinade methods (#88)
Browse files Browse the repository at this point in the history
1. Add a test for liquid unstaking
2. Check that signer == fund.manager and fund.treasury is the treasury
passed in
  • Loading branch information
yurushao authored May 6, 2024
1 parent 3b2171b commit 50648dc
Show file tree
Hide file tree
Showing 5 changed files with 375 additions and 136 deletions.
88 changes: 50 additions & 38 deletions anchor/programs/glam/src/instructions/marinade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ pub fn marinade_delayed_unstake<'c: 'info, 'info>(
ctx: Context<MarinadeDelayedUnstake>,
msol_amount: u64,
ticket_bump: u8,
treasury_bump: u8,
) -> Result<()> {
let rent = Rent::get()?;
let lamports = rent.minimum_balance(500); // Minimum balance to make the account rent-exempt
Expand Down Expand Up @@ -92,37 +91,42 @@ pub fn marinade_delayed_unstake<'c: 'info, 'info>(
state: ctx.accounts.marinade_state.to_account_info(),
msol_mint: ctx.accounts.msol_mint.to_account_info(),
burn_msol_from: ctx.accounts.burn_msol_from.to_account_info(),
burn_msol_authority: ctx.accounts.burn_msol_authority.to_account_info(),
burn_msol_authority: ctx.accounts.treasury.to_account_info(),
new_ticket_account: ctx.accounts.ticket.to_account_info(),
clock: ctx.accounts.clock.to_account_info(),
rent: ctx.accounts.rent.to_account_info(),
token_program: ctx.accounts.token_program.to_account_info(),
};

let fund_key = ctx.accounts.fund.key();
let seeds = &[b"treasury".as_ref(), fund_key.as_ref(), &[treasury_bump]];
let seeds = &[
b"treasury".as_ref(),
fund_key.as_ref(),
&[ctx.bumps.treasury],
];
let signer_seeds = &[&seeds[..]];
let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer_seeds);
let _ = order_unstake(cpi_ctx, msol_amount);

Ok(())
}

pub fn marinade_claim<'c: 'info, 'info>(
ctx: Context<MarinadeClaim>,
treasury_bump: u8,
) -> Result<()> {
pub fn marinade_claim<'c: 'info, 'info>(ctx: Context<MarinadeClaim>) -> Result<()> {
let cpi_program = ctx.accounts.marinade_program.to_account_info();
let cpi_accounts = Claim {
state: ctx.accounts.marinade_state.to_account_info(),
ticket_account: ctx.accounts.ticket.to_account_info(),
transfer_sol_to: ctx.accounts.transfer_sol_to.to_account_info(),
transfer_sol_to: ctx.accounts.treasury.to_account_info(),
reserve_pda: ctx.accounts.reserve_pda.to_account_info(),
system_program: ctx.accounts.system_program.to_account_info(),
clock: ctx.accounts.clock.to_account_info(),
};
let fund_key = ctx.accounts.fund.key();
let seeds = &[b"treasury".as_ref(), fund_key.as_ref(), &[treasury_bump]];
let seeds = &[
b"treasury".as_ref(),
fund_key.as_ref(),
&[ctx.bumps.treasury],
];
let signer_seeds = &[&seeds[..]];
let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer_seeds);
let _ = claim(cpi_ctx);
Expand All @@ -132,7 +136,6 @@ pub fn marinade_claim<'c: 'info, 'info>(
pub fn marinade_liquid_unstake<'c: 'info, 'info>(
ctx: Context<MarinadeLiquidUnstake>,
msol_amount: u64,
treasury_bump: u8,
) -> Result<()> {
let cpi_program = ctx.accounts.marinade_program.to_account_info();
let cpi_accounts = LiquidUnstake {
Expand All @@ -142,12 +145,18 @@ pub fn marinade_liquid_unstake<'c: 'info, 'info>(
liq_pool_msol_leg: ctx.accounts.liq_pool_msol_leg.to_account_info(),
get_msol_from: ctx.accounts.get_msol_from.to_account_info(),
get_msol_from_authority: ctx.accounts.get_msol_from_authority.to_account_info(),
transfer_sol_to: ctx.accounts.transfer_sol_to.to_account_info(),
transfer_sol_to: ctx.accounts.treasury.to_account_info(),
treasury_msol_account: ctx.accounts.treasury_msol_account.to_account_info(),
system_program: ctx.accounts.system_program.to_account_info(),
token_program: ctx.accounts.token_program.to_account_info(),
};
let seeds = &[b"treasury".as_ref(), &[treasury_bump]];

let fund_key = ctx.accounts.fund.key();
let seeds = &[
b"treasury".as_ref(),
fund_key.as_ref(),
&[ctx.bumps.treasury],
];
let signer_seeds = &[&seeds[..]];
let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer_seeds);
let _ = liquid_unstake(cpi_ctx, msol_amount);
Expand All @@ -159,6 +168,13 @@ pub struct MarinadeDeposit<'info> {
#[account(mut)]
pub manager: Signer<'info>,

#[account(has_one = manager, has_one = treasury)]
pub fund: Box<Account<'info, Fund>>,

/// CHECK: skip
#[account(mut, seeds = [b"treasury".as_ref(), fund.key().as_ref()], bump)]
pub treasury: AccountInfo<'info>,

#[account(mut)]
pub marinade_state: Account<'info, MarinadeState>,

Expand Down Expand Up @@ -194,13 +210,6 @@ pub struct MarinadeDeposit<'info> {
)]
pub mint_to: Account<'info, TokenAccount>,

/// CHECK: skip
#[account(mut, seeds = [b"treasury".as_ref(), fund.key().as_ref()], bump)]
pub treasury: AccountInfo<'info>,

#[account(mut, has_one = manager)]
pub fund: Box<Account<'info, Fund>>,

pub marinade_program: Program<'info, MarinadeFinance>,
pub associated_token_program: Program<'info, AssociatedToken>,
pub system_program: Program<'info, System>,
Expand All @@ -211,15 +220,19 @@ pub struct MarinadeDeposit<'info> {
pub struct MarinadeDelayedUnstake<'info> {
#[account(mut)]
pub manager: Signer<'info>,

#[account(has_one = manager, has_one = treasury)]
pub fund: Box<Account<'info, Fund>>,

/// CHECK: skip
#[account(mut, seeds = [b"treasury".as_ref(), fund.key().as_ref()], bump)]
pub treasury: AccountInfo<'info>,

/// CHECK: skip
// #[account(init_if_needed, seeds = [b"ticket"], bump, payer = signer, space = 88, owner = marinade_program.key())]
#[account(mut)]
pub ticket: AccountInfo<'info>,

/// CHECK: skip
#[account()]
pub fund: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub msol_mint: AccountInfo<'info>,
Expand All @@ -228,10 +241,6 @@ pub struct MarinadeDelayedUnstake<'info> {
#[account(mut)]
pub burn_msol_from: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub burn_msol_authority: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub marinade_state: AccountInfo<'info>,
Expand All @@ -252,9 +261,12 @@ pub struct MarinadeClaim<'info> {
#[account(mut)]
pub manager: Signer<'info>,

#[account(has_one = manager, has_one = treasury)]
pub fund: Box<Account<'info, Fund>>,

/// CHECK: skip
#[account()]
pub fund: AccountInfo<'info>,
#[account(mut, seeds = [b"treasury".as_ref(), fund.key().as_ref()], bump)]
pub treasury: AccountInfo<'info>,

/// CHECK: skip
// #[account(init_if_needed, seeds = [b"ticket"], bump, payer = signer, space = 88, owner = marinade_program.key())]
Expand All @@ -265,10 +277,6 @@ pub struct MarinadeClaim<'info> {
#[account(mut)]
pub marinade_state: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub transfer_sol_to: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub reserve_pda: AccountInfo<'info>,
Expand All @@ -282,7 +290,15 @@ pub struct MarinadeClaim<'info> {

#[derive(Accounts)]
pub struct MarinadeLiquidUnstake<'info> {
// pub signer: Signer<'info>,
pub manager: Signer<'info>,

#[account(has_one = manager, has_one = treasury)]
pub fund: Box<Account<'info, Fund>>,

/// CHECK: skip
#[account(mut, seeds = [b"treasury".as_ref(), fund.key().as_ref()], bump)]
pub treasury: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub marinade_state: AccountInfo<'info>,
Expand Down Expand Up @@ -311,10 +327,6 @@ pub struct MarinadeLiquidUnstake<'info> {
#[account(mut)]
pub get_msol_from_authority: AccountInfo<'info>,

/// CHECK: skip
#[account(mut)]
pub transfer_sol_to: AccountInfo<'info>,

pub marinade_program: Program<'info, MarinadeFinance>,
pub token_program: Program<'info, Token>,
pub system_program: Program<'info, System>,
Expand Down
16 changes: 11 additions & 5 deletions anchor/programs/glam/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ pub mod state;

use anchor_lang::prelude::*;

use crate::instructions::*;
pub use constants::*;
pub use instructions::*;
pub use state::fund::*;

declare_id!("Gco1pcjxCMYjKJjSNJ7mKV7qezeUTE7arXJgy7PAPNRc");
Expand Down Expand Up @@ -111,16 +111,22 @@ pub mod glam {
marinade::marinade_deposit(ctx, sol_amount)
}

pub fn marinade_liquid_unstake(
ctx: Context<MarinadeLiquidUnstake>,
sol_amount: u64,
) -> Result<()> {
marinade::marinade_liquid_unstake(ctx, sol_amount)
}

pub fn marinade_delayed_unstake(
ctx: Context<MarinadeDelayedUnstake>,
amount: u64,
ticket_bump: u8,
treasury_bump: u8,
) -> Result<()> {
marinade::marinade_delayed_unstake(ctx, amount, ticket_bump, treasury_bump)
marinade::marinade_delayed_unstake(ctx, amount, ticket_bump)
}

pub fn marinade_claim(ctx: Context<MarinadeClaim>, treasury_bump: u8) -> Result<()> {
marinade::marinade_claim(ctx, treasury_bump)
pub fn marinade_claim(ctx: Context<MarinadeClaim>) -> Result<()> {
marinade::marinade_claim(ctx)
}
}
Loading

0 comments on commit 50648dc

Please sign in to comment.