quarry_mine/instructions/
create_miner.rs1use crate::*;
2
3pub fn handler(ctx: Context<CreateMiner>) -> Result<()> {
7 let quarry = &mut ctx.accounts.quarry;
8 let index = quarry.num_miners;
9 quarry.num_miners = unwrap_int!(quarry.num_miners.checked_add(1));
10
11 let miner = &mut ctx.accounts.miner;
12 miner.authority = ctx.accounts.authority.key();
13 miner.bump = unwrap_bump!(ctx, "miner");
14 miner.quarry = ctx.accounts.quarry.key();
15 miner.token_vault_key = ctx.accounts.miner_vault.key();
16 miner.rewards_earned = 0;
17 miner.rewards_per_token_paid = 0;
18 miner.balance = 0;
19 miner.index = index;
20
21 emit!(MinerCreateEvent {
22 authority: miner.authority,
23 quarry: miner.quarry,
24 miner: miner.key(),
25 });
26
27 Ok(())
28}
29
30#[derive(Accounts)]
32pub struct CreateMiner<'info> {
33 pub authority: Signer<'info>,
35
36 #[account(
38 init,
39 seeds = [
40 b"Miner".as_ref(),
41 quarry.key().to_bytes().as_ref(),
42 authority.key().to_bytes().as_ref()
43 ],
44 bump,
45 payer = payer,
46 space = 8 + Miner::LEN
47 )]
48 pub miner: Box<Account<'info, Miner>>,
49
50 #[account(mut)]
52 pub quarry: Box<Account<'info, Quarry>>,
53
54 pub rewarder: Box<Account<'info, Rewarder>>,
56
57 pub system_program: Program<'info, System>,
59
60 #[account(mut)]
62 pub payer: Signer<'info>,
63
64 pub token_mint: Account<'info, Mint>,
66
67 pub miner_vault: Account<'info, TokenAccount>,
69
70 pub token_program: Program<'info, Token>,
72}
73
74impl<'info> Validate<'info> for CreateMiner<'info> {
75 fn validate(&self) -> Result<()> {
76 invariant!(!self.rewarder.is_paused, Paused);
77 assert_keys_eq!(self.miner_vault.owner, self.miner);
78 assert_keys_eq!(self.miner_vault.mint, self.token_mint);
79 invariant!(self.miner_vault.delegate.is_none());
80 invariant!(self.miner_vault.close_authority.is_none());
81
82 assert_keys_eq!(self.miner_vault.mint, self.quarry.token_mint_key);
83 assert_keys_eq!(self.quarry.rewarder, self.rewarder);
84
85 Ok(())
86 }
87}
88
89#[event]
91pub struct MinerCreateEvent {
92 #[index]
94 pub authority: Pubkey,
95 #[index]
97 pub quarry: Pubkey,
98 pub miner: Pubkey,
100}