cronos_scheduler/instructions/
queue_start.rs

1use {
2    crate::{state::*, errors::CronosError},
3    anchor_lang::{prelude::*, solana_program::sysvar},
4};
5
6#[derive(Accounts)]
7pub struct QueueStart<'info> {
8    #[account(address = sysvar::clock::ID)]
9    pub clock: Sysvar<'info, Clock>,
10
11    #[account(mut)]
12    pub delegate: Signer<'info>,
13
14    #[account(
15        seeds = [
16            SEED_MANAGER,
17            manager.authority.as_ref()
18        ],
19        bump,
20    )]
21    pub manager: Account<'info, Manager>,
22
23    #[account(
24        mut,
25        seeds = [
26            SEED_QUEUE, 
27            queue.manager.as_ref(),
28            queue.id.to_be_bytes().as_ref(),
29        ],
30        bump,
31        has_one = manager,
32        constraint = queue.exec_at.is_some() && queue.exec_at <= Some(clock.unix_timestamp) @ CronosError::QueueNotDue,
33        constraint = queue.status == QueueStatus::Pending @ CronosError::InvalidQueueStatus,
34    )]
35    pub queue: Account<'info, Queue>,
36}
37
38pub fn handler(ctx: Context<QueueStart>) -> Result<()> {
39    let queue = &mut ctx.accounts.queue;
40    queue.start()
41}