diff --git a/cli/src/checks.rs b/cli/src/checks.rs index 1ec88fbb9..8c45f6e04 100644 --- a/cli/src/checks.rs +++ b/cli/src/checks.rs @@ -68,6 +68,22 @@ pub fn check_account_for_spend_multiple_fees_with_commitment( commitment: CommitmentConfig, ) -> Result<(), CliError> { let fee = get_fee_for_messages(rpc_client, messages)?; + check_account_for_spend_and_fee_with_commitment( + rpc_client, + account_pubkey, + balance, + fee, + commitment, + ) +} + +pub fn check_account_for_spend_and_fee_with_commitment( + rpc_client: &RpcClient, + account_pubkey: &Pubkey, + balance: u64, + fee: u64, + commitment: CommitmentConfig, +) -> Result<(), CliError> { if !check_account_for_balance_with_commitment( rpc_client, account_pubkey, diff --git a/cli/src/program.rs b/cli/src/program.rs index e9e044aad..20d621a99 100644 --- a/cli/src/program.rs +++ b/cli/src/program.rs @@ -1898,7 +1898,14 @@ fn do_process_program_write_and_deploy( } if !skip_fee_check { - check_payer(&rpc_client, config, balance_needed, &messages)?; + check_payer( + &rpc_client, + config, + balance_needed, + &initial_message, + &write_messages, + &final_message, + )?; } send_deploy_messages( @@ -2032,9 +2039,17 @@ fn do_process_program_upgrade( &blockhash, ); messages.push(&final_message); + let final_message = Some(final_message); if !skip_fee_check { - check_payer(&rpc_client, config, balance_needed, &messages)?; + check_payer( + &rpc_client, + config, + balance_needed, + &initial_message, + &write_messages, + &final_message, + )?; } send_deploy_messages( @@ -2042,7 +2057,7 @@ fn do_process_program_upgrade( config, &initial_message, &write_messages, - &Some(final_message), + &final_message, buffer_signer, Some(upgrade_authority), Some(&[upgrade_authority]), @@ -2134,14 +2149,28 @@ fn check_payer( rpc_client: &RpcClient, config: &CliConfig, balance_needed: u64, - messages: &[&Message], + initial_message: &Option, + write_messages: &Option>, + final_message: &Option, ) -> Result<(), Box> { - // Does the payer have enough? - check_account_for_spend_multiple_fees_with_commitment( + let mut fee = 0; + if let Some(message) = initial_message { + fee += rpc_client.get_fee_for_message(message)?; + } + if let Some(write_messages) = write_messages { + // Assume all write messages cost the same + if let Some(message) = write_messages.get(0) { + fee += rpc_client.get_fee_for_message(message)? * (write_messages.len() as u64); + } + } + if let Some(message) = final_message { + fee += rpc_client.get_fee_for_message(message)?; + } + check_account_for_spend_and_fee_with_commitment( rpc_client, &config.signers[0].pubkey(), balance_needed, - messages, + fee, config.commitment, )?; Ok(())