light_program_test/program_test/
compressible_setup.rs

1//! Test helpers for cold account operations.
2
3use light_client::{
4    interface::instructions,
5    rpc::{Rpc, RpcError},
6};
7use solana_sdk::{
8    bpf_loader_upgradeable,
9    pubkey::Pubkey,
10    signature::{Keypair, Signer},
11};
12
13use crate::program_test::TestRpc;
14
15/// Create mock program data account for testing.
16pub fn create_mock_program_data(authority: Pubkey) -> Vec<u8> {
17    let mut data = vec![0u8; 1024];
18    data[0..4].copy_from_slice(&3u32.to_le_bytes()); // Program data discriminator
19    data[4..12].copy_from_slice(&0u64.to_le_bytes()); // Slot
20    data[12] = 1; // Option<Pubkey> Some(authority)
21    data[13..45].copy_from_slice(authority.as_ref()); // Authority pubkey
22    data
23}
24
25/// Setup mock program data account for testing.
26pub fn setup_mock_program_data<T: TestRpc>(
27    rpc: &mut T,
28    payer: &Keypair,
29    program_id: &Pubkey,
30) -> Pubkey {
31    let (program_data_pda, _) =
32        Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::ID);
33    let mock_data = create_mock_program_data(payer.pubkey());
34    let mock_account = solana_sdk::account::Account {
35        lamports: 1_000_000,
36        data: mock_data,
37        owner: bpf_loader_upgradeable::ID,
38        executable: false,
39        rent_epoch: 0,
40    };
41    rpc.set_account(program_data_pda, mock_account);
42    program_data_pda
43}
44
45#[allow(clippy::too_many_arguments)]
46pub async fn initialize_compression_config<T: Rpc>(
47    rpc: &mut T,
48    payer: &Keypair,
49    program_id: &Pubkey,
50    authority: &Keypair,
51    rent_sponsor: Pubkey,
52    address_space: Vec<Pubkey>,
53    discriminator: &[u8],
54    config_bump: Option<u8>,
55) -> Result<solana_sdk::signature::Signature, RpcError> {
56    if address_space.is_empty() {
57        return Err(RpcError::CustomError(
58            "At least one address space must be provided".to_string(),
59        ));
60    }
61
62    let instruction = instructions::initialize_config(
63        program_id,
64        discriminator,
65        &payer.pubkey(),
66        &authority.pubkey(),
67        rent_sponsor,
68        address_space,
69        config_bump,
70    );
71
72    let signers = if payer.pubkey() == authority.pubkey() {
73        vec![payer]
74    } else {
75        vec![payer, authority]
76    };
77
78    rpc.create_and_send_transaction(&[instruction], &payer.pubkey(), &signers)
79        .await
80}
81
82#[allow(clippy::too_many_arguments)]
83pub async fn update_compression_config<T: Rpc>(
84    rpc: &mut T,
85    payer: &Keypair,
86    program_id: &Pubkey,
87    authority: &Keypair,
88    new_rent_sponsor: Option<Pubkey>,
89    new_address_space: Option<Vec<Pubkey>>,
90    new_update_authority: Option<Pubkey>,
91    discriminator: &[u8],
92) -> Result<solana_sdk::signature::Signature, RpcError> {
93    let instruction = instructions::update_config(
94        program_id,
95        discriminator,
96        &authority.pubkey(),
97        new_rent_sponsor,
98        new_address_space,
99        new_update_authority,
100    );
101
102    rpc.create_and_send_transaction(&[instruction], &payer.pubkey(), &[payer, authority])
103        .await
104}