clockwork_network/instructions/
pool_create.rs

1use {
2    crate::state::*,
3    anchor_lang::{
4        prelude::*,
5        solana_program::system_program,
6        system_program::{transfer, Transfer},
7    },
8    clockwork_pool::{program::ClockworkPool, state::SEED_POOL},
9};
10
11#[derive(Accounts)]
12#[instruction(name: String, size: usize)]
13pub struct PoolCreate<'info> {
14    #[account(mut)]
15    pub admin: Signer<'info>,
16
17    #[account(seeds = [SEED_CONFIG], bump, has_one = admin)]
18    pub config: Account<'info, Config>,
19
20    #[account(seeds = [SEED_POOL, name.as_bytes()], seeds::program = clockwork_pool::ID, bump)]
21    pub pool: SystemAccount<'info>,
22
23    #[account(address = clockwork_pool::ID)]
24    pub pool_program: Program<'info, ClockworkPool>,
25
26    #[account(seeds = [SEED_CONFIG], seeds::program = clockwork_pool::ID, bump)]
27    pub pool_program_config: Account<'info, clockwork_pool::state::Config>,
28
29    #[account(mut, seeds = [SEED_ROTATOR], bump)]
30    pub rotator: Account<'info, Rotator>,
31
32    #[account(address = system_program::ID)]
33    pub system_program: Program<'info, System>,
34}
35
36pub fn handler(ctx: Context<PoolCreate>, name: String, size: usize) -> Result<()> {
37    // Get accounts
38    let admin = &ctx.accounts.admin;
39    let pool = &ctx.accounts.pool;
40    let pool_program = &ctx.accounts.pool_program;
41    let pool_program_config = &ctx.accounts.pool_program_config;
42    let rotator = &mut ctx.accounts.rotator;
43    let system_program = &ctx.accounts.system_program;
44
45    // Rotate the worker into its supported pools
46    let rotator_bump = *ctx.bumps.get("rotator").unwrap();
47    clockwork_pool::cpi::pool_create(
48        CpiContext::new_with_signer(
49            pool_program.to_account_info(),
50            clockwork_pool::cpi::accounts::PoolCreate {
51                config: pool_program_config.to_account_info(),
52                payer: admin.to_account_info(),
53                pool: pool.to_account_info(),
54                pool_authority: rotator.to_account_info(),
55                system_program: system_program.to_account_info(),
56            },
57            &[&[SEED_ROTATOR, &[rotator_bump]]],
58        ),
59        name,
60        size,
61    )?;
62
63    // Add new pool pubkey to the rotator
64    rotator.add_pool(pool.key())?;
65
66    // Realloc memory for the rotator account
67    let data_len = 8 + rotator.try_to_vec()?.len();
68    rotator.to_account_info().realloc(data_len, false)?;
69
70    // If lamports are required to maintain rent-exemption, pay them
71    let minimum_rent = Rent::get().unwrap().minimum_balance(data_len);
72    if minimum_rent > rotator.to_account_info().lamports() {
73        transfer(
74            CpiContext::new(
75                system_program.to_account_info(),
76                Transfer {
77                    from: admin.to_account_info(),
78                    to: rotator.to_account_info(),
79                },
80            ),
81            minimum_rent
82                .checked_sub(rotator.to_account_info().lamports())
83                .unwrap(),
84        )?;
85    }
86
87    Ok(())
88}