sablier_network_program/instructions/
penalty_claim.rs1use {
2 crate::{constants::*, errors::*, state::*},
3 anchor_lang::prelude::*,
4};
5
6#[derive(Accounts)]
7pub struct PenaltyClaim<'info> {
8 #[account(address = config.load()?.admin)]
9 pub admin: Signer<'info>,
10
11 #[account(address = Config::pubkey())]
12 pub config: AccountLoader<'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.get_lamports();
35 let data_len = 8 + Penalty::INIT_SPACE;
36 let min_rent_balance = Rent::get()?.minimum_balance(data_len);
37 let claimable_balance = lamport_balance - min_rent_balance;
38 require!(
39 claimable_balance > 0,
40 SablierError::InsufficientPenaltyBalance
41 );
42
43 penalty.sub_lamports(claimable_balance)?;
45 pay_to.add_lamports(claimable_balance)?;
46
47 Ok(())
48}