miclockwork_network_program/instructions/
penalty_claim.rs1use {
2 crate::{errors::*, state::*},
3 anchor_lang::prelude::*,
4};
5
6#[derive(Accounts)]
7pub struct PenaltyClaim<'info> {
8 #[account(mut, address = config.admin)]
9 pub admin: Signer<'info>,
10
11 #[account(address = Config::pubkey())]
12 pub config: Account<'info, Config>,
13
14 #[account(mut)]
15 pub pay_to: SystemAccount<'info>,
16
17 #[account(
18 mut,
19 seeds = [
20 SEED_PENALTY,
21 penalty.worker.as_ref(),
22 ],
23 bump,
24 )]
25 pub penalty: Account<'info, Penalty>,
26}
27
28pub fn handler(ctx: Context<PenaltyClaim>) -> Result<()> {
29 let penalty = &mut ctx.accounts.penalty;
31 let pay_to = &mut ctx.accounts.pay_to;
32
33 let lamport_balance = penalty.to_account_info().lamports();
35 let data_len = 8 + penalty.try_to_vec()?.len();
36 let min_rent_balance = Rent::get().unwrap().minimum_balance(data_len);
37 let claimable_balance = lamport_balance.checked_sub(min_rent_balance).unwrap();
38 require!(
39 claimable_balance.gt(&0),
40 ClockworkError::InsufficientPenaltyBalance
41 );
42
43 **penalty.to_account_info().try_borrow_mut_lamports()? = penalty
45 .to_account_info()
46 .lamports()
47 .checked_sub(claimable_balance)
48 .unwrap();
49 **pay_to.to_account_info().try_borrow_mut_lamports()? = pay_to
50 .to_account_info()
51 .lamports()
52 .checked_add(claimable_balance)
53 .unwrap();
54
55 Ok(())
56}