light_sdk/
utils.rs

1use anchor_lang::solana_program::pubkey::Pubkey;
2
3use crate::{
4    address::NewAddressParamsPacked,
5    compressed_account::{
6        OutputCompressedAccountWithPackedContext, PackedCompressedAccountWithMerkleContext,
7    },
8    proof::CompressedProof,
9    verify::{CompressedCpiContext, InstructionDataInvokeCpi},
10    PROGRAM_ID_ACCOUNT_COMPRESSION,
11};
12
13pub fn get_registered_program_pda(program_id: &Pubkey) -> Pubkey {
14    Pubkey::find_program_address(
15        &[program_id.to_bytes().as_slice()],
16        &PROGRAM_ID_ACCOUNT_COMPRESSION,
17    )
18    .0
19}
20
21pub fn get_cpi_authority_pda(program_id: &Pubkey) -> Pubkey {
22    Pubkey::find_program_address(&[b"cpi_authority"], program_id).0
23}
24
25/// Helper function to create data for creating a single PDA.
26pub fn create_cpi_inputs_for_new_account(
27    proof: CompressedProof,
28    new_address_params: NewAddressParamsPacked,
29    compressed_pda: OutputCompressedAccountWithPackedContext,
30    cpi_context: Option<CompressedCpiContext>,
31) -> InstructionDataInvokeCpi {
32    InstructionDataInvokeCpi {
33        proof: Some(proof),
34        new_address_params: vec![new_address_params],
35        relay_fee: None,
36        input_compressed_accounts_with_merkle_context: vec![],
37        output_compressed_accounts: vec![compressed_pda],
38        compress_or_decompress_lamports: None,
39        is_compress: false,
40        cpi_context,
41    }
42}
43
44pub fn create_cpi_inputs_for_account_update(
45    proof: CompressedProof,
46    old_compressed_pda: PackedCompressedAccountWithMerkleContext,
47    new_compressed_pda: OutputCompressedAccountWithPackedContext,
48    cpi_context: Option<CompressedCpiContext>,
49) -> InstructionDataInvokeCpi {
50    InstructionDataInvokeCpi {
51        proof: Some(proof),
52        new_address_params: vec![],
53        input_compressed_accounts_with_merkle_context: vec![old_compressed_pda],
54        output_compressed_accounts: vec![new_compressed_pda],
55        relay_fee: None,
56        compress_or_decompress_lamports: None,
57        is_compress: false,
58        cpi_context,
59    }
60}
61
62pub fn create_cpi_inputs_for_account_deletion(
63    proof: CompressedProof,
64    compressed_pda: PackedCompressedAccountWithMerkleContext,
65    cpi_context: Option<CompressedCpiContext>,
66) -> InstructionDataInvokeCpi {
67    InstructionDataInvokeCpi {
68        proof: Some(proof),
69        new_address_params: vec![],
70        input_compressed_accounts_with_merkle_context: vec![compressed_pda],
71        output_compressed_accounts: vec![],
72        relay_fee: None,
73        compress_or_decompress_lamports: None,
74        is_compress: false,
75        cpi_context,
76    }
77}