light_program_test/program_test/
compressible_setup.rs1use 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
15pub 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()); data[4..12].copy_from_slice(&0u64.to_le_bytes()); data[12] = 1; data[13..45].copy_from_slice(authority.as_ref()); data
23}
24
25pub 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}