cronos_scheduler/instructions/
queue_new.rs

1use {
2    crate::state::*,
3    anchor_lang::{prelude::*, solana_program::{system_program, sysvar}},
4    std::mem::size_of
5};
6
7#[derive(Accounts)]
8#[instruction(schedule: String)]
9pub struct QueueNew<'info> {
10    #[account()]
11    pub authority: Signer<'info>,
12
13    #[account(address = sysvar::clock::ID)]
14    pub clock: Sysvar<'info, Clock>,
15
16    #[account(
17        init,
18        seeds = [
19            SEED_FEE, 
20            queue.key().as_ref()
21        ],
22        bump,
23        payer = payer,
24        space = 8 + size_of::<Fee>(),
25    )]
26    pub fee: Account<'info, Fee>,
27
28    #[account(
29        mut,
30        seeds = [
31            SEED_MANAGER, 
32            manager.authority.as_ref()
33        ],
34        bump,
35        has_one = authority,
36    )]
37    pub manager: Account<'info, Manager>,
38
39    #[account(mut)]
40    pub payer: Signer<'info>,
41
42    #[account(
43        init,
44        seeds = [
45            SEED_QUEUE, 
46            manager.key().as_ref(),
47            manager.queue_count.to_be_bytes().as_ref(),
48        ],
49        bump,
50        payer = payer,
51        space = 8 + size_of::<Queue>(),
52    )]
53    pub queue: Account<'info, Queue>,
54
55    #[account(address = system_program::ID)]
56    pub system_program: Program<'info, System>,
57}
58
59pub fn handler(ctx: Context<QueueNew>, schedule: String) -> Result<()> {
60    let clock = &ctx.accounts.clock;
61    let fee = &mut ctx.accounts.fee;
62    let manager = &mut ctx.accounts.manager;
63    let queue = &mut ctx.accounts.queue;
64
65    fee.new(queue.key())?;
66    queue.new(clock, manager, schedule)?;
67
68    Ok(())
69}