account_compression/instructions/
register_program.rs1use 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 #[account( mut, constraint= authority.key() == group_authority_pda.authority @AccountCompressionErrorCode::InvalidAuthority)]
23 pub authority: Signer<'info>,
24 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}