diff --git a/cli/src/program.rs b/cli/src/program.rs index a879ab3347c91a..1a3fe72998a658 100644 --- a/cli/src/program.rs +++ b/cli/src/program.rs @@ -166,7 +166,7 @@ pub enum ProgramCliCommand { use_lamports_unit: bool, bypass_warning: bool, }, - ExtendProgram { + ExtendProgramChecked { program_pubkey: Pubkey, additional_bytes: u32, }, @@ -983,7 +983,7 @@ pub fn parse_program_subcommand( )?; CliCommandInfo { - command: CliCommand::Program(ProgramCliCommand::ExtendProgram { + command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked { program_pubkey, additional_bytes, }), @@ -1170,7 +1170,7 @@ pub fn process_program_subcommand( *use_lamports_unit, *bypass_warning, ), - ProgramCliCommand::ExtendProgram { + ProgramCliCommand::ExtendProgramChecked { program_pubkey, additional_bytes, } => process_extend_program(&rpc_client, config, *program_pubkey, *additional_bytes), @@ -2338,16 +2338,15 @@ fn process_extend_program( _ => Err(format!("Program {program_pubkey} is closed")), }?; - match upgrade_authority_address { - None => Err(format!("Program {program_pubkey} is not upgradeable")), - _ => Ok(()), - }?; + let upgrade_authority_address = upgrade_authority_address + .ok_or_else(|| format!("Program {program_pubkey} is not upgradeable"))?; let blockhash = rpc_client.get_latest_blockhash()?; let mut tx = Transaction::new_unsigned(Message::new( - &[bpf_loader_upgradeable::extend_program( + &[bpf_loader_upgradeable::extend_program_checked( &program_pubkey, + &upgrade_authority_address, Some(&payer_pubkey), additional_bytes, )], @@ -4227,7 +4226,7 @@ mod tests { assert_eq!( parse_command(&test_command, &default_signer, &mut None).unwrap(), CliCommandInfo { - command: CliCommand::Program(ProgramCliCommand::ExtendProgram { + command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked { program_pubkey, additional_bytes }), diff --git a/cli/tests/program.rs b/cli/tests/program.rs index 6bec3bcc28b36f..d94e6355f93ffd 100644 --- a/cli/tests/program.rs +++ b/cli/tests/program.rs @@ -1423,7 +1423,7 @@ fn test_cli_program_extend_program() { let new_max_len = new_program_data.len(); let additional_bytes = (new_max_len - max_len) as u32; config.signers = vec![&keypair]; - config.command = CliCommand::Program(ProgramCliCommand::ExtendProgram { + config.command = CliCommand::Program(ProgramCliCommand::ExtendProgramChecked { program_pubkey: program_keypair.pubkey(), additional_bytes: additional_bytes - 1, }); @@ -1470,7 +1470,7 @@ fn test_cli_program_extend_program() { // Extend 1 last byte config.signers = vec![&keypair]; - config.command = CliCommand::Program(ProgramCliCommand::ExtendProgram { + config.command = CliCommand::Program(ProgramCliCommand::ExtendProgramChecked { program_pubkey: program_keypair.pubkey(), additional_bytes: 1, }); diff --git a/transaction-status/src/parse_bpf_loader.rs b/transaction-status/src/parse_bpf_loader.rs index f4d531a48247fd..61782298a0f8ca 100644 --- a/transaction-status/src/parse_bpf_loader.rs +++ b/transaction-status/src/parse_bpf_loader.rs @@ -175,12 +175,12 @@ pub fn parse_bpf_upgradeable_loader( "additionalBytes": additional_bytes, "programDataAccount": account_keys[instruction.accounts[0] as usize].to_string(), "programAccount": account_keys[instruction.accounts[1] as usize].to_string(), - "systemProgram": if instruction.accounts.len() > 3 { + "systemProgram": if instruction.accounts.len() > 2 { Some(account_keys[instruction.accounts[2] as usize].to_string()) } else { None }, - "payerAccount": if instruction.accounts.len() > 4 { + "payerAccount": if instruction.accounts.len() > 3 { Some(account_keys[instruction.accounts[3] as usize].to_string()) } else { None @@ -188,6 +188,28 @@ pub fn parse_bpf_upgradeable_loader( }), }) } + UpgradeableLoaderInstruction::ExtendProgramChecked { additional_bytes } => { + check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 3)?; + Ok(ParsedInstructionEnum { + instruction_type: "extendProgramChecked".to_string(), + info: json!({ + "additionalBytes": additional_bytes, + "programDataAccount": account_keys[instruction.accounts[0] as usize].to_string(), + "programAccount": account_keys[instruction.accounts[1] as usize].to_string(), + "authority": account_keys[instruction.accounts[2] as usize].to_string(), + "systemProgram": if instruction.accounts.len() > 3 { + Some(account_keys[instruction.accounts[3] as usize].to_string()) + } else { + None + }, + "payerAccount": if instruction.accounts.len() > 4 { + Some(account_keys[instruction.accounts[4] as usize].to_string()) + } else { + None + }, + }), + }) + } } }