clockwork_network/instructions/
pool_create.rs1use {
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 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 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 rotator.add_pool(pool.key())?;
65
66 let data_len = 8 + rotator.try_to_vec()?.len();
68 rotator.to_account_info().realloc(data_len, false)?;
69
70 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}