From 9cb1fcb4d9693d00fa5322f8ca774adb4e8bdcf2 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 20 Feb 2023 14:25:20 -0700 Subject: [PATCH] Plumb --upgradeable-program for solana-test-validator --- validator/src/bin/solana-test-validator.rs | 51 ++++++++++++++++++++++ validator/src/cli.rs | 14 ++++++ 2 files changed, 65 insertions(+) diff --git a/validator/src/bin/solana-test-validator.rs b/validator/src/bin/solana-test-validator.rs index 5ada0950a066eb..246e84ecc321e5 100644 --- a/validator/src/bin/solana-test-validator.rs +++ b/validator/src/bin/solana-test-validator.rs @@ -213,6 +213,56 @@ fn main() { } } + let mut upgradeable_programs_to_load = vec![]; + if let Some(values) = matches.values_of("upgradeable_program") { + let values: Vec<&str> = values.collect::>(); + for address_program_upgrade_authority in values.chunks(3) { + match address_program_upgrade_authority { + [address, program, upgrade_authority] => { + let address = address + .parse::() + .or_else(|_| read_keypair_file(address).map(|keypair| keypair.pubkey())) + .unwrap_or_else(|err| { + println!("Error: invalid address {address}: {err}"); + exit(1); + }); + let upgrade_authority_address = if *upgrade_authority == "none" { + Pubkey::default() + } else { + upgrade_authority + .parse::() + .or_else(|_| { + read_keypair_file(upgrade_authority).map(|keypair| keypair.pubkey()) + }) + .unwrap_or_else(|err| { + println!( + "Error: invalid upgrade_authority {upgrade_authority}: {err}" + ); + exit(1); + }) + }; + + let program_path = PathBuf::from(program); + if !program_path.exists() { + println!( + "Error: program file does not exist: {}", + program_path.display() + ); + exit(1); + } + + upgradeable_programs_to_load.push(UpgradeableProgramInfo { + program_id: address, + loader: solana_sdk::bpf_loader_upgradeable::id(), + upgrade_authority: upgrade_authority_address, + program_path, + }); + } + _ => unreachable!(), + } + } + } + let mut accounts_to_load = vec![]; if let Some(values) = matches.values_of("account") { let values: Vec<&str> = values.collect::>(); @@ -409,6 +459,7 @@ fn main() { .bpf_jit(!matches.is_present("no_bpf_jit")) .rpc_port(rpc_port) .add_programs_with_path(&programs_to_load) + .add_upgradeable_programs_with_path(&upgradeable_programs_to_load) .add_accounts_from_json_files(&accounts_to_load) .unwrap_or_else(|e| { println!("Error: add_accounts_from_json_files failed: {e}"); diff --git a/validator/src/cli.rs b/validator/src/cli.rs index 9de9a605e5d294..b1be414b7032d1 100644 --- a/validator/src/cli.rs +++ b/validator/src/cli.rs @@ -2021,6 +2021,20 @@ pub fn test_app<'a>(version: &'a str, default_args: &'a DefaultTestArgs) -> App< First argument can be a pubkey string or path to a keypair", ), ) + .arg( + Arg::with_name("upgradeable_program") + .long("upgradeable-program") + .value_names(&["ADDRESS_OR_KEYPAIR", "SBF_PROGRAM.SO", "UPGRADE_AUTHORITY"]) + .takes_value(true) + .number_of_values(3) + .multiple(true) + .help( + "Add an upgradeable SBF program to the genesis configuration. \ + If the ledger already exists then this parameter is silently ignored. \ + First and third arguments can be a pubkey string or path to a keypair. \ + Upgrade authority set to \"none\" disables upgrades", + ), + ) .arg( Arg::with_name("account") .long("account")