miclockwork_network_program/instructions/
unstake_create.rs1use {
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 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 require!(amount.le(&delegation.stake_amount), ClockworkError::InvalidUnstakeAmount);
62
63 unstake.init(amount, authority.key(), delegation.key(), registry.total_unstakes, worker.key())?;
65
66 registry.total_unstakes = registry.total_unstakes.checked_add(1).unwrap();
68
69 Ok(())
70}