use {
crate::state::*,
anchor_lang::prelude::*,
hpl_hive_control::state::{DelegateAuthority, Project},
hpl_utils::traits::Default,
};
#[derive(Accounts)]
pub struct InitMultipliers<'info> {
#[account(mut, has_one = project)]
pub staking_pool: Account<'info, StakingPool>,
#[account(
init, payer = payer,
space = Multipliers::LEN,
seeds = [
b"multipliers",
staking_pool.key().as_ref()
],
bump,
)]
pub multipliers: Account<'info, Multipliers>,
#[account()]
pub authority: Signer<'info>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
#[account()]
pub project: Box<Account<'info, Project>>,
#[account(has_one = authority)]
pub delegate_authority: Option<Account<'info, DelegateAuthority>>,
#[account(mut)]
pub vault: AccountInfo<'info>,
}
#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct InitMultipliersArgs {
decimals: u8,
}
pub fn init_multipliers(ctx: Context<InitMultipliers>, args: InitMultipliersArgs) -> Result<()> {
let multipliers = &mut ctx.accounts.multipliers;
multipliers.set_defaults();
multipliers.bump = ctx.bumps["multipliers"];
multipliers.decimals = args.decimals;
multipliers.staking_pool = ctx.accounts.staking_pool.key();
Ok(())
}
#[derive(Accounts)]
pub struct AddMultiplier<'info> {
#[account(mut, has_one = project)]
pub staking_pool: Account<'info, StakingPool>,
#[account(mut, has_one = staking_pool)]
pub multipliers: Account<'info, Multipliers>,
#[account(mut)]
pub authority: Signer<'info>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
pub rent_sysvar: Sysvar<'info, Rent>,
#[account()]
pub project: Box<Account<'info, Project>>,
#[account(has_one = authority)]
pub delegate_authority: Option<Account<'info, DelegateAuthority>>,
#[account(mut)]
pub vault: AccountInfo<'info>,
}
#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct AddMultiplierArgs {
pub value: u64,
pub multiplier_type: MultiplierType,
}
pub fn add_multiplier(ctx: Context<AddMultiplier>, args: AddMultiplierArgs) -> Result<()> {
let multipliers = &mut ctx.accounts.multipliers;
hpl_utils::reallocate(
isize::try_from(Multiplier::LEN).unwrap(),
multipliers.to_account_info(),
ctx.accounts.payer.to_account_info(),
&ctx.accounts.rent_sysvar,
&ctx.accounts.system_program,
)?;
match args.multiplier_type {
MultiplierType::StakeDuration { min_duration: _ } => {
multipliers.duration_multipliers.push(Multiplier {
value: args.value,
multiplier_type: args.multiplier_type,
});
multipliers
.duration_multipliers
.sort_by_key(|x| match x.multiplier_type {
MultiplierType::StakeDuration { min_duration } => min_duration,
_ => 0,
});
}
MultiplierType::NFTCount { min_count: _ } => {
multipliers.count_multipliers.push(Multiplier {
value: args.value,
multiplier_type: args.multiplier_type,
});
multipliers
.count_multipliers
.sort_by_key(|x| match x.multiplier_type {
MultiplierType::NFTCount { min_count } => min_count,
_ => 0,
});
}
MultiplierType::Creator { creator: _ } => {
multipliers.creator_multipliers.push(Multiplier {
value: args.value,
multiplier_type: args.multiplier_type,
});
multipliers.creator_multipliers.sort_by_key(|x| x.value)
}
MultiplierType::Collection { collection: _ } => {
multipliers.collection_multipliers.push(Multiplier {
value: args.value,
multiplier_type: args.multiplier_type,
});
multipliers
.collection_multipliers
.sort_by(|a, b| b.value.cmp(&a.value))
}
}
Ok(())
}