use solana_client::rpc_client::RpcClient;
use solana_commitment_config::CommitmentConfig;
use solana_sdk::pubkey::Pubkey;
use spherenet_authority::Authority;
use std::str::FromStr;
pub fn extend_program(
url: &str,
program_id_str: String,
additional_bytes: u32,
upgrade_authority: Authority,
_payer_keypair_path: String,
) -> eyre::Result<()> {
println!("🔧 Extending program data account...");
let rpc_client = RpcClient::new_with_commitment(url.to_string(), CommitmentConfig::confirmed());
let program_id = Pubkey::from_str(&program_id_str)
.map_err(|e| eyre::eyre!("Failed to parse program ID {}: {}", program_id_str, e))?;
let instruction_authority = upgrade_authority.instruction_authority_pubkey()?;
println!(" Program ID: {}", program_id);
println!(" Additional Bytes: {}", additional_bytes);
println!(" Upgrade Authority: {}", instruction_authority);
println!(" Payer: {}", instruction_authority);
let extend_ix = spherenet_whitelisted_loader_v3_interface::instruction::extend_program_checked(
&program_id,
&instruction_authority, Some(&instruction_authority), additional_bytes,
);
let description = format!(
"Extend program {} by {} bytes",
program_id, additional_bytes
);
let result = upgrade_authority.execute_instruction(&rpc_client, extend_ix, &description)?;
if matches!(
result,
spherenet_authority::ExecutionResult::Executed { .. }
) {
println!("\n✅ Program data account extended successfully!");
}
Ok(())
}