account_compression/instructions/
register_program.rs

1use aligned_sized::aligned_sized;
2use anchor_lang::prelude::*;
3use bytemuck::{Pod, Zeroable};
4
5use crate::{
6    errors::AccountCompressionErrorCode, utils::constants::CPI_AUTHORITY_PDA_SEED, GroupAuthority,
7};
8
9#[repr(C)]
10#[derive(Debug, Pod, Zeroable, Copy, PartialEq)]
11#[account]
12#[aligned_sized(anchor)]
13pub struct RegisteredProgram {
14    pub registered_program_id: Pubkey,
15    pub group_authority_pda: Pubkey,
16    pub registered_program_signer_pda: Pubkey,
17}
18
19#[derive(Accounts)]
20pub struct RegisterProgramToGroup<'info> {
21    /// CHECK: Signer is checked according to authority pda in instruction.
22    #[account( mut, constraint= authority.key() == group_authority_pda.authority @AccountCompressionErrorCode::InvalidAuthority)]
23    pub authority: Signer<'info>,
24    /// CHECK:
25    pub program_to_be_registered: Signer<'info>,
26    #[account(
27        init,
28        payer = authority,
29        seeds = [&program_to_be_registered.key().to_bytes()],
30        bump,
31        space = RegisteredProgram::LEN,
32    )]
33    pub registered_program_pda: Account<'info, RegisteredProgram>,
34    pub group_authority_pda: Account<'info, GroupAuthority>,
35    pub system_program: Program<'info, System>,
36}
37
38pub fn process_register_program(ctx: Context<RegisterProgramToGroup>) -> Result<()> {
39    ctx.accounts.registered_program_pda.registered_program_id =
40        ctx.accounts.program_to_be_registered.key();
41    ctx.accounts.registered_program_pda.group_authority_pda =
42        ctx.accounts.group_authority_pda.key();
43    ctx.accounts
44        .registered_program_pda
45        .registered_program_signer_pda = Pubkey::find_program_address(
46        &[CPI_AUTHORITY_PDA_SEED],
47        &ctx.accounts.program_to_be_registered.key(),
48    )
49    .0;
50    Ok(())
51}