quarry_mine/instructions/
create_quarry.rs1use crate::*;
2
3pub fn handler(ctx: Context<CreateQuarry>) -> Result<()> {
4 let rewarder = &mut ctx.accounts.auth.rewarder;
5 let index = rewarder.num_quarries;
7 rewarder.num_quarries = unwrap_int!(rewarder.num_quarries.checked_add(1));
8
9 let quarry = &mut ctx.accounts.quarry;
10 quarry.bump = unwrap_bump!(ctx, "quarry");
11
12 quarry.index = index;
14 quarry.famine_ts = i64::MAX;
15 quarry.rewarder = rewarder.key();
16 quarry.annual_rewards_rate = 0;
17 quarry.rewards_share = 0;
18 quarry.token_mint_decimals = ctx.accounts.token_mint.decimals;
19 quarry.token_mint_key = ctx.accounts.token_mint.key();
20
21 let current_ts = Clock::get()?.unix_timestamp;
22 emit!(QuarryCreateEvent {
23 token_mint: quarry.token_mint_key,
24 timestamp: current_ts,
25 });
26
27 Ok(())
28}
29
30#[derive(Accounts)]
32pub struct CreateQuarry<'info> {
33 #[account(
35 init,
36 seeds = [
37 b"Quarry".as_ref(),
38 auth.rewarder.key().to_bytes().as_ref(),
39 token_mint.key().to_bytes().as_ref()
40 ],
41 bump,
42 payer = payer,
43 space = 8 + Quarry::LEN
44 )]
45 pub quarry: Account<'info, Quarry>,
46
47 pub auth: MutableRewarderWithAuthority<'info>,
49
50 pub token_mint: Account<'info, Mint>,
52
53 #[account(mut)]
55 pub payer: Signer<'info>,
56
57 pub unused_account: UncheckedAccount<'info>,
60
61 pub system_program: Program<'info, System>,
63}
64
65impl<'info> Validate<'info> for CreateQuarry<'info> {
66 fn validate(&self) -> Result<()> {
67 self.auth.validate()?;
68 invariant!(!self.auth.rewarder.is_paused, Paused);
69 Ok(())
70 }
71}