miclockwork_network_program/instructions/
unstake_create.rs

1use {
2    crate::{errors::*, state::*}, 
3    anchor_lang::{prelude::*, solana_program::system_program},
4    std::mem::size_of
5};
6
7#[derive(Accounts)]
8#[instruction(amount: u64)]
9pub struct UnstakeCreate<'info> {
10    #[account(mut)]
11    pub authority: Signer<'info>,
12
13    #[account(
14        seeds = [
15            SEED_DELEGATION,
16            delegation.worker.as_ref(),
17            delegation.id.to_be_bytes().as_ref(),
18        ],
19        bump,
20        has_one = authority,
21        has_one = worker,
22    )]
23    pub delegation: Account<'info, Delegation>,
24
25    #[account(
26        mut,
27        seeds = [SEED_REGISTRY],
28        bump, 
29        constraint = !registry.locked @ ClockworkError::RegistryLocked
30    )]
31    pub registry: Account<'info, Registry>,
32
33    #[account(address = system_program::ID)]
34    pub system_program: Program<'info, System>,
35
36    #[account(
37        init,
38        seeds = [
39            SEED_UNSTAKE,
40            registry.total_unstakes.to_be_bytes().as_ref(),
41        ],
42        bump,
43        payer = authority,
44        space = 8 + size_of::<Unstake>(),
45    )]
46    pub unstake: Account<'info, Unstake>,
47
48    #[account(address = worker.pubkey())]
49    pub worker: Account<'info, Worker>,
50}
51
52pub fn handler(ctx: Context<UnstakeCreate>, amount: u64) -> Result<()> {
53    // Get accounts.
54    let authority = &ctx.accounts.authority;
55    let delegation = &ctx.accounts.delegation;
56    let registry = &mut ctx.accounts.registry;
57    let unstake = &mut ctx.accounts.unstake;
58    let worker = &ctx.accounts.worker;
59
60    // Validate the request is valid.
61    require!(amount.le(&delegation.stake_amount), ClockworkError::InvalidUnstakeAmount);
62
63    // Initialize the unstake account.
64    unstake.init(amount, authority.key(), delegation.key(), registry.total_unstakes, worker.key())?;
65
66    // Increment the registry's unstake counter.
67    registry.total_unstakes = registry.total_unstakes.checked_add(1).unwrap();
68
69    Ok(())
70}