namespaces/instructions/global_context/
collect_global_context_funds.rs

1use anchor_spl::token::{self, Token, TokenAccount, Transfer};
2use {
3    crate::{errors::ErrorCode, state::*},
4    anchor_lang::prelude::*,
5};
6
7#[derive(Accounts)]
8pub struct CollectGlobalContextFunds<'info> {
9    #[account(seeds = [GLOBAL_CONTEXT_PREFIX.as_bytes()], bump = global_context.bump)]
10    pub global_context: Account<'info, GlobalContext>,
11    #[account(mut, constraint = global_context_payment_account.owner == global_context.key() @ ErrorCode::InvalidGlobalContextPaymentAccount)]
12    pub global_context_payment_account: Account<'info, TokenAccount>,
13
14    #[account(constraint = global_context.rent_authority == rent_authority.key())]
15    pub rent_authority: Signer<'info>,
16    #[account(mut, constraint = authority_token_account.owner == rent_authority.key() @ ErrorCode::InvalidAuthorityTokenAccount)]
17    pub authority_token_account: Account<'info, TokenAccount>,
18
19    // other
20    pub token_program: Program<'info, Token>,
21}
22
23pub fn handler(ctx: Context<CollectGlobalContextFunds>, amount: u64) -> Result<()> {
24    // get PDA seeds to sign with
25    let global_context_seeds = &[GLOBAL_CONTEXT_PREFIX.as_bytes(), &[ctx.accounts.global_context.bump]];
26    let global_context_signer = &[&global_context_seeds[..]];
27
28    // transfer amount to authority
29    let cpi_accounts = Transfer {
30        from: ctx.accounts.global_context_payment_account.to_account_info(),
31        to: ctx.accounts.authority_token_account.to_account_info(),
32        authority: ctx.accounts.global_context.to_account_info(),
33    };
34    let cpi_program = ctx.accounts.token_program.to_account_info();
35    let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(global_context_signer);
36    token::transfer(cpi_context, amount)?;
37    Ok(())
38}