Skip to content
Closed
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
3 changes: 3 additions & 0 deletions programs/dynamic-fee-sharing/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,7 @@ pub enum FeeVaultError {

#[msg("Invalid dammv2 pool")]
InvalidDbcPool,

#[msg("Invalid signer")]
InvalidSigner,
}
69 changes: 69 additions & 0 deletions programs/dynamic-fee-sharing/src/instructions/funding_fee.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
use anchor_lang::prelude::*;
use anchor_spl::token_interface::TokenAccount;

use crate::{
error::FeeVaultError,
event::EvtFundFee,
math::SafeMath,
state::{FeeVault, FundingType},
};
pub fn handle_funding_fee<'info, F: Fn(&[&[u8]; 4]) -> Result<()>>(
signer: &Pubkey,
fee_vault_account: &AccountLoader<'_, FeeVault>,
token_b_account: &mut Box<InterfaceAccount<'info, TokenAccount>>,
token_b_mint: &Pubkey,
funder: Pubkey,
funding_type: FundingType,
op: F,
) -> Result<()> {
let fee_vault = fee_vault_account.load()?;

require!(
fee_vault.is_share_holder(signer),
FeeVaultError::InvalidSigner
);

require!(
fee_vault.token_vault.eq(&token_b_account.key()) && fee_vault.token_mint.eq(&token_b_mint),
FeeVaultError::InvalidFeeVault
);

// support fee vault type is pda account
require!(
fee_vault.fee_vault_type == 1,
FeeVaultError::InvalidFeeVault
);

let signer_seeds = fee_vault_seeds!(
fee_vault.base,
fee_vault.token_mint,
fee_vault.fee_vault_bump
);

let before_token_vault_balance = token_b_account.amount;

op(signer_seeds)?;

token_b_account.reload()?;

let after_token_vault_balance = token_b_account.amount;

let claimed_amount = after_token_vault_balance.safe_sub(before_token_vault_balance)?;

if claimed_amount > 0 {
drop(fee_vault);

let mut fee_vault = fee_vault_account.load_mut()?;
fee_vault.fund_fee(claimed_amount)?;

emit!(EvtFundFee {
funding_type,
fee_vault: fee_vault_account.key(),
funder,
funded_amount: claimed_amount,
fee_per_share: fee_vault.fee_per_share,
});
}

Ok(())
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ use damm_v2::accounts::Pool;

use crate::{
error::FeeVaultError,
event::EvtFundFee,
math::SafeMath,
handle_funding_fee,
state::{FeeVault, FundingType},
};

#[event_cpi]
#[derive(Accounts)]
pub struct FundingByClaimDammv2FeeCtx<'info> {
#[account(mut)]
Expand Down Expand Up @@ -65,79 +63,49 @@ pub struct FundingByClaimDammv2FeeCtx<'info> {
pub dammv2_program: UncheckedAccount<'info>,
/// CHECK: dammv2 authority
pub dammv2_event_authority: UncheckedAccount<'info>,

/// signer
pub signer: Signer<'info>,
}

pub fn handle_funding_by_claim_dammv2_fee(ctx: Context<FundingByClaimDammv2FeeCtx>) -> Result<()> {
let pool = ctx.accounts.pool.load()?;
// support collect fee mode is 1 (only token B)
require!(pool.collect_fee_mode == 1, FeeVaultError::InvalidDammv2Pool);

let fee_vault = ctx.accounts.fee_vault.load()?;

require!(
fee_vault
.token_vault
.eq(&ctx.accounts.token_b_account.key())
&& fee_vault.token_mint.eq(&ctx.accounts.token_b_mint.key()),
FeeVaultError::InvalidFeeVault
);

// support fee vault type is pda account
require!(
fee_vault.fee_vault_type == 1,
FeeVaultError::InvalidFeeVault
);

let before_token_vault_balance = ctx.accounts.token_b_account.amount;

let signer_seeds = fee_vault_seeds!(
fee_vault.base,
fee_vault.token_mint,
fee_vault.fee_vault_bump
);

damm_v2::cpi::claim_position_fee(CpiContext::new_with_signer(
ctx.accounts.dammv2_program.to_account_info(),
damm_v2::cpi::accounts::ClaimPositionFee {
pool_authority: ctx.accounts.dammv2_pool_authority.to_account_info(),
pool: ctx.accounts.pool.to_account_info(),
position: ctx.accounts.position.to_account_info(),
token_a_account: ctx.accounts.token_a_account.to_account_info(),
token_b_account: ctx.accounts.token_b_account.to_account_info(),
token_a_vault: ctx.accounts.token_a_vault.to_account_info(),
token_b_vault: ctx.accounts.token_b_vault.to_account_info(),
token_a_program: ctx.accounts.token_a_program.to_account_info(),
token_b_program: ctx.accounts.token_b_program.to_account_info(),
token_a_mint: ctx.accounts.token_a_mint.to_account_info(),
token_b_mint: ctx.accounts.token_b_mint.to_account_info(),
position_nft_account: ctx.accounts.position_nft_account.to_account_info(),
owner: ctx.accounts.fee_vault.to_account_info(),
event_authority: ctx.accounts.dammv2_event_authority.to_account_info(),
program: ctx.accounts.dammv2_program.to_account_info(),
handle_funding_fee(
ctx.accounts.signer.key,
&ctx.accounts.fee_vault,
&mut ctx.accounts.token_b_account.clone(),
ctx.accounts.token_b_mint.key,
ctx.accounts.pool.key(),
FundingType::ClaimDammV2,
|signer_seeds| {
damm_v2::cpi::claim_position_fee(CpiContext::new_with_signer(
ctx.accounts.dammv2_program.to_account_info(),
damm_v2::cpi::accounts::ClaimPositionFee {
pool_authority: ctx.accounts.dammv2_pool_authority.to_account_info(),
pool: ctx.accounts.pool.to_account_info(),
position: ctx.accounts.position.to_account_info(),
token_a_account: ctx.accounts.token_a_account.to_account_info(),
token_b_account: ctx.accounts.token_b_account.to_account_info(),
token_a_vault: ctx.accounts.token_a_vault.to_account_info(),
token_b_vault: ctx.accounts.token_b_vault.to_account_info(),
token_a_program: ctx.accounts.token_a_program.to_account_info(),
token_b_program: ctx.accounts.token_b_program.to_account_info(),
token_a_mint: ctx.accounts.token_a_mint.to_account_info(),
token_b_mint: ctx.accounts.token_b_mint.to_account_info(),
position_nft_account: ctx.accounts.position_nft_account.to_account_info(),
owner: ctx.accounts.fee_vault.to_account_info(),
event_authority: ctx.accounts.dammv2_event_authority.to_account_info(),
program: ctx.accounts.dammv2_program.to_account_info(),
},
&[signer_seeds],
))?;

Ok(())
},
&[signer_seeds],
))?;

ctx.accounts.token_b_account.reload()?;

let after_token_vault_balance = ctx.accounts.token_b_account.amount;

let claimed_amount = after_token_vault_balance.safe_sub(before_token_vault_balance)?;

drop(fee_vault);

if claimed_amount > 0 {
let mut fee_vault = ctx.accounts.fee_vault.load_mut()?;
fee_vault.fund_fee(claimed_amount)?;

emit_cpi!(EvtFundFee {
funding_type: FundingType::ClaimDammV2,
fee_vault: ctx.accounts.fee_vault.key(),
funder: ctx.accounts.pool.key(),
funded_amount: claimed_amount,
fee_per_share: fee_vault.fee_per_share,
});
}
)?;

Ok(())
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@ use anchor_spl::token_interface::TokenAccount;
use dynamic_bonding_curve::accounts::VirtualPool;

use crate::{
error::FeeVaultError,
event::EvtFundFee,
math::SafeMath,
handle_funding_fee,
state::{FeeVault, FundingType},
};

#[event_cpi]
#[derive(Accounts)]
pub struct FundingByClaimDbcCreatorSurplusCtx<'info> {
#[account(mut)]
Expand All @@ -33,9 +30,6 @@ pub struct FundingByClaimDbcCreatorSurplusCtx<'info> {
/// CHECK: The mint of token base
pub quote_mint: UncheckedAccount<'info>,

/// CHECK: Token base program
pub token_base_program: UncheckedAccount<'info>,

/// CHECK: Token quote program
pub token_quote_program: UncheckedAccount<'info>,

Expand All @@ -47,6 +41,9 @@ pub struct FundingByClaimDbcCreatorSurplusCtx<'info> {
pub dbc_program: UncheckedAccount<'info>,
/// CHECK: dbc event authority
pub dbc_event_authority: UncheckedAccount<'info>,

/// signer
pub signer: Signer<'info>,
}

pub fn handle_funding_by_claim_dbc_creator_surplus(
Expand All @@ -60,66 +57,33 @@ pub fn handle_funding_by_claim_dbc_creator_surplus(

drop(virtual_pool);

let fee_vault = ctx.accounts.fee_vault.load()?;

require!(
fee_vault
.token_vault
.eq(&ctx.accounts.token_quote_account.key())
&& fee_vault.token_mint.eq(&ctx.accounts.quote_mint.key()),
FeeVaultError::InvalidFeeVault
);

// support fee vault type is pda account
require!(
fee_vault.fee_vault_type == 1,
FeeVaultError::InvalidFeeVault
);

let before_token_vault_balance = ctx.accounts.token_quote_account.amount;

let signer_seeds = fee_vault_seeds!(
fee_vault.base,
fee_vault.token_mint,
fee_vault.fee_vault_bump
);

dynamic_bonding_curve::cpi::creator_withdraw_surplus(CpiContext::new_with_signer(
ctx.accounts.dbc_program.to_account_info(),
dynamic_bonding_curve::cpi::accounts::CreatorWithdrawSurplus {
pool_authority: ctx.accounts.dbc_pool_authority.to_account_info(),
config: ctx.accounts.config.to_account_info(),
virtual_pool: ctx.accounts.pool.to_account_info(),
token_quote_account: ctx.accounts.token_quote_account.to_account_info(),
quote_vault: ctx.accounts.quote_vault.to_account_info(),
quote_mint: ctx.accounts.quote_mint.to_account_info(),
creator: ctx.accounts.fee_vault.to_account_info(),
token_quote_program: ctx.accounts.token_quote_program.to_account_info(),
event_authority: ctx.accounts.dbc_event_authority.to_account_info(),
program: ctx.accounts.dbc_program.to_account_info(),
handle_funding_fee(
ctx.accounts.signer.key,
&ctx.accounts.fee_vault,
&mut ctx.accounts.token_quote_account.clone(),
ctx.accounts.quote_mint.key,
ctx.accounts.pool.key(),
FundingType::ClaimDbcCreatorSurplus,
|signer_seeds| {
dynamic_bonding_curve::cpi::creator_withdraw_surplus(CpiContext::new_with_signer(
ctx.accounts.dbc_program.to_account_info(),
dynamic_bonding_curve::cpi::accounts::CreatorWithdrawSurplus {
pool_authority: ctx.accounts.dbc_pool_authority.to_account_info(),
config: ctx.accounts.config.to_account_info(),
virtual_pool: ctx.accounts.pool.to_account_info(),
token_quote_account: ctx.accounts.token_quote_account.to_account_info(),
quote_vault: ctx.accounts.quote_vault.to_account_info(),
quote_mint: ctx.accounts.quote_mint.to_account_info(),
creator: ctx.accounts.fee_vault.to_account_info(),
token_quote_program: ctx.accounts.token_quote_program.to_account_info(),
event_authority: ctx.accounts.dbc_event_authority.to_account_info(),
program: ctx.accounts.dbc_program.to_account_info(),
},
&[signer_seeds],
))?;
Ok(())
},
&[signer_seeds],
))?;
ctx.accounts.token_quote_account.reload()?;

let after_token_vault_balance = ctx.accounts.token_quote_account.amount;

let claimed_amount = after_token_vault_balance.safe_sub(before_token_vault_balance)?;

drop(fee_vault);

if claimed_amount > 0 {
let mut fee_vault = ctx.accounts.fee_vault.load_mut()?;
fee_vault.fund_fee(claimed_amount)?;

emit_cpi!(EvtFundFee {
funding_type: FundingType::ClaimDbcCreatorSurplus,
fee_vault: ctx.accounts.fee_vault.key(),
funder: ctx.accounts.pool.key(),
funded_amount: claimed_amount,
fee_per_share: fee_vault.fee_per_share,
});
}
)?;

Ok(())
}
Loading
Loading