miclockwork_network_program/instructions/
delegation_claim.rs

1use {crate::state::*, anchor_lang::prelude::*};
2
3#[derive(Accounts)]
4#[instruction(amount: u64)]
5pub struct DelegationClaim<'info> {
6    #[account()]
7    pub authority: Signer<'info>,
8
9    #[account(mut)]
10    pub pay_to: SystemAccount<'info>,
11
12    #[account(
13        mut,
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    )]
22    pub delegation: Account<'info, Delegation>,
23}
24
25pub fn handler(ctx: Context<DelegationClaim>, amount: u64) -> Result<()> {
26    // Get accounts.
27    let pay_to = &mut ctx.accounts.pay_to;
28    let delegation = &mut ctx.accounts.delegation;
29
30    // Decrement the delegation's claimable balance.
31    delegation.yield_balance = delegation.yield_balance.checked_sub(amount).unwrap();
32
33    // Transfer commission to the worker.
34    **delegation.to_account_info().try_borrow_mut_lamports()? = delegation
35        .to_account_info()
36        .lamports()
37        .checked_sub(amount)
38        .unwrap();
39    **pay_to.to_account_info().try_borrow_mut_lamports()? = pay_to
40        .to_account_info()
41        .lamports()
42        .checked_add(amount)
43        .unwrap();
44
45    Ok(())
46}