quarry_mine/instructions/
create_miner.rs

1use crate::*;
2
3/// Creates a [Miner] for the given authority.
4///
5/// Anyone can call this; this is an associated account.
6pub 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/// Accounts for [quarry_mine::create_miner].
31#[derive(Accounts)]
32pub struct CreateMiner<'info> {
33    /// Authority of the [Miner].
34    pub authority: Signer<'info>,
35
36    /// [Miner] to be created.
37    #[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    /// [Quarry] to create a [Miner] for.
51    #[account(mut)]
52    pub quarry: Box<Account<'info, Quarry>>,
53
54    /// [Rewarder].
55    pub rewarder: Box<Account<'info, Rewarder>>,
56
57    /// System program.
58    pub system_program: Program<'info, System>,
59
60    /// Payer of [Miner] creation.
61    #[account(mut)]
62    pub payer: Signer<'info>,
63
64    /// [Mint] of the token to create a [Quarry] for.
65    pub token_mint: Account<'info, Mint>,
66
67    /// [TokenAccount] holding the token [Mint].
68    pub miner_vault: Account<'info, TokenAccount>,
69
70    /// SPL Token program.
71    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/// Triggered when a new miner is created.
90#[event]
91pub struct MinerCreateEvent {
92    /// Authority of the miner.
93    #[index]
94    pub authority: Pubkey,
95    /// Quarry the miner was created on.
96    #[index]
97    pub quarry: Pubkey,
98    /// The [Miner].
99    pub miner: Pubkey,
100}