Remove blockhash from fee calculation (#20641)
This commit is contained in:
@ -4,30 +4,27 @@ use solana_client::{
|
||||
rpc_client::RpcClient,
|
||||
};
|
||||
use solana_sdk::{
|
||||
commitment_config::CommitmentConfig, hash::Hash, message::Message,
|
||||
native_token::lamports_to_sol, pubkey::Pubkey,
|
||||
commitment_config::CommitmentConfig, message::Message, native_token::lamports_to_sol,
|
||||
pubkey::Pubkey,
|
||||
};
|
||||
|
||||
pub fn check_account_for_fee(
|
||||
rpc_client: &RpcClient,
|
||||
account_pubkey: &Pubkey,
|
||||
blockhash: &Hash,
|
||||
message: &Message,
|
||||
) -> Result<(), CliError> {
|
||||
check_account_for_multiple_fees(rpc_client, account_pubkey, blockhash, &[message])
|
||||
check_account_for_multiple_fees(rpc_client, account_pubkey, &[message])
|
||||
}
|
||||
|
||||
pub fn check_account_for_fee_with_commitment(
|
||||
rpc_client: &RpcClient,
|
||||
account_pubkey: &Pubkey,
|
||||
blockhash: &Hash,
|
||||
message: &Message,
|
||||
commitment: CommitmentConfig,
|
||||
) -> Result<(), CliError> {
|
||||
check_account_for_multiple_fees_with_commitment(
|
||||
rpc_client,
|
||||
account_pubkey,
|
||||
blockhash,
|
||||
&[message],
|
||||
commitment,
|
||||
)
|
||||
@ -36,13 +33,11 @@ pub fn check_account_for_fee_with_commitment(
|
||||
pub fn check_account_for_multiple_fees(
|
||||
rpc_client: &RpcClient,
|
||||
account_pubkey: &Pubkey,
|
||||
blockhash: &Hash,
|
||||
messages: &[&Message],
|
||||
) -> Result<(), CliError> {
|
||||
check_account_for_multiple_fees_with_commitment(
|
||||
rpc_client,
|
||||
account_pubkey,
|
||||
blockhash,
|
||||
messages,
|
||||
CommitmentConfig::default(),
|
||||
)
|
||||
@ -51,7 +46,6 @@ pub fn check_account_for_multiple_fees(
|
||||
pub fn check_account_for_multiple_fees_with_commitment(
|
||||
rpc_client: &RpcClient,
|
||||
account_pubkey: &Pubkey,
|
||||
blockhash: &Hash,
|
||||
messages: &[&Message],
|
||||
commitment: CommitmentConfig,
|
||||
) -> Result<(), CliError> {
|
||||
@ -59,7 +53,6 @@ pub fn check_account_for_multiple_fees_with_commitment(
|
||||
rpc_client,
|
||||
account_pubkey,
|
||||
0,
|
||||
blockhash,
|
||||
messages,
|
||||
commitment,
|
||||
)
|
||||
@ -69,11 +62,10 @@ pub fn check_account_for_spend_multiple_fees_with_commitment(
|
||||
rpc_client: &RpcClient,
|
||||
account_pubkey: &Pubkey,
|
||||
balance: u64,
|
||||
blockhash: &Hash,
|
||||
messages: &[&Message],
|
||||
commitment: CommitmentConfig,
|
||||
) -> Result<(), CliError> {
|
||||
let fee = get_fee_for_message(rpc_client, blockhash, messages)?;
|
||||
let fee = get_fee_for_message(rpc_client, messages)?;
|
||||
if !check_account_for_balance_with_commitment(
|
||||
rpc_client,
|
||||
account_pubkey,
|
||||
@ -98,14 +90,10 @@ pub fn check_account_for_spend_multiple_fees_with_commitment(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn get_fee_for_message(
|
||||
rpc_client: &RpcClient,
|
||||
blockhash: &Hash,
|
||||
messages: &[&Message],
|
||||
) -> Result<u64, CliError> {
|
||||
pub fn get_fee_for_message(rpc_client: &RpcClient, messages: &[&Message]) -> Result<u64, CliError> {
|
||||
Ok(messages
|
||||
.iter()
|
||||
.map(|message| rpc_client.get_fee_for_message(blockhash, message))
|
||||
.map(|message| rpc_client.get_fee_for_message(message))
|
||||
.collect::<Result<Vec<_>, _>>()?
|
||||
.iter()
|
||||
.sum())
|
||||
@ -185,9 +173,7 @@ mod tests {
|
||||
let mut mocks = HashMap::new();
|
||||
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
let blockhash = rpc_client.get_latest_blockhash().unwrap();
|
||||
check_account_for_fee(&rpc_client, &pubkey, &blockhash, &message0)
|
||||
.expect("unexpected result");
|
||||
check_account_for_fee(&rpc_client, &pubkey, &message0).expect("unexpected result");
|
||||
|
||||
let check_fee_response = json!(Response {
|
||||
context: RpcResponseContext { slot: 1 },
|
||||
@ -197,7 +183,7 @@ mod tests {
|
||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
assert!(check_account_for_fee(&rpc_client, &pubkey, &blockhash, &message1).is_err());
|
||||
assert!(check_account_for_fee(&rpc_client, &pubkey, &message1).is_err());
|
||||
|
||||
let check_fee_response = json!(Response {
|
||||
context: RpcResponseContext { slot: 1 },
|
||||
@ -207,13 +193,9 @@ mod tests {
|
||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
assert!(check_account_for_multiple_fees(
|
||||
&rpc_client,
|
||||
&pubkey,
|
||||
&blockhash,
|
||||
&[&message0, &message0]
|
||||
)
|
||||
.is_err());
|
||||
assert!(
|
||||
check_account_for_multiple_fees(&rpc_client, &pubkey, &[&message0, &message0]).is_err()
|
||||
);
|
||||
|
||||
let account_balance = 2;
|
||||
let account_balance_response = json!(Response {
|
||||
@ -230,7 +212,7 @@ mod tests {
|
||||
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
|
||||
check_account_for_multiple_fees(&rpc_client, &pubkey, &blockhash, &[&message0, &message0])
|
||||
check_account_for_multiple_fees(&rpc_client, &pubkey, &[&message0, &message0])
|
||||
.expect("unexpected result");
|
||||
}
|
||||
|
||||
@ -261,23 +243,16 @@ mod tests {
|
||||
let mut mocks = HashMap::new();
|
||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
let blockhash = rpc_client.get_latest_blockhash().unwrap();
|
||||
|
||||
// No messages, no fee.
|
||||
assert_eq!(
|
||||
get_fee_for_message(&rpc_client, &blockhash, &[]).unwrap(),
|
||||
0
|
||||
);
|
||||
assert_eq!(get_fee_for_message(&rpc_client, &[]).unwrap(), 0);
|
||||
|
||||
// One message w/ one signature, a fee.
|
||||
let pubkey0 = Pubkey::new(&[0; 32]);
|
||||
let pubkey1 = Pubkey::new(&[1; 32]);
|
||||
let ix0 = system_instruction::transfer(&pubkey0, &pubkey1, 1);
|
||||
let message0 = Message::new(&[ix0], Some(&pubkey0));
|
||||
assert_eq!(
|
||||
get_fee_for_message(&rpc_client, &blockhash, &[&message0]).unwrap(),
|
||||
1
|
||||
);
|
||||
assert_eq!(get_fee_for_message(&rpc_client, &[&message0]).unwrap(), 1);
|
||||
|
||||
// No signatures, no fee.
|
||||
let check_fee_response = json!(Response {
|
||||
@ -289,7 +264,7 @@ mod tests {
|
||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||
let message = Message::default();
|
||||
assert_eq!(
|
||||
get_fee_for_message(&rpc_client, &blockhash, &[&message, &message]).unwrap(),
|
||||
get_fee_for_message(&rpc_client, &[&message, &message]).unwrap(),
|
||||
0
|
||||
);
|
||||
}
|
||||
|
@ -367,7 +367,6 @@ pub fn process_authorize_nonce_account(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -552,7 +551,6 @@ pub fn process_new_nonce(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -628,7 +626,6 @@ pub fn process_withdraw_from_nonce_account(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
|
@ -2071,14 +2071,11 @@ fn check_payer(
|
||||
balance_needed: u64,
|
||||
messages: &[&Message],
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let blockhash = rpc_client.get_latest_blockhash()?;
|
||||
|
||||
// Does the payer have enough?
|
||||
check_account_for_spend_multiple_fees_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
balance_needed,
|
||||
&blockhash,
|
||||
messages,
|
||||
config.commitment,
|
||||
)?;
|
||||
|
@ -144,9 +144,9 @@ where
|
||||
F: Fn(u64) -> Message,
|
||||
{
|
||||
let fee = match blockhash {
|
||||
Some(blockhash) => {
|
||||
Some(_) => {
|
||||
let dummy_message = build_message(0);
|
||||
get_fee_for_message(rpc_client, blockhash, &[&dummy_message])?
|
||||
get_fee_for_message(rpc_client, &[&dummy_message])?
|
||||
}
|
||||
None => 0, // Offline, cannot calulate fee
|
||||
};
|
||||
|
@ -1455,7 +1455,6 @@ pub fn process_stake_authorize(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1534,7 +1533,6 @@ pub fn process_deactivate_stake_account(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1632,7 +1630,6 @@ pub fn process_withdraw_stake(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1776,7 +1773,6 @@ pub fn process_split_stake(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1882,7 +1878,6 @@ pub fn process_merge_stake(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1977,7 +1972,6 @@ pub fn process_stake_set_lockup(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -2419,7 +2413,6 @@ pub fn process_delegate_stake(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&tx.message.account_keys[0],
|
||||
&recent_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
|
@ -774,7 +774,6 @@ pub fn process_vote_authorize(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -811,7 +810,6 @@ pub fn process_vote_update_validator(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -842,7 +840,6 @@ pub fn process_vote_update_commission(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&tx.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -980,7 +977,6 @@ pub fn process_withdraw_from_vote_account(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&transaction.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
@ -1036,7 +1032,6 @@ pub fn process_close_vote_account(
|
||||
check_account_for_fee_with_commitment(
|
||||
rpc_client,
|
||||
&config.signers[0].pubkey(),
|
||||
&latest_blockhash,
|
||||
&transaction.message,
|
||||
config.commitment,
|
||||
)?;
|
||||
|
Reference in New Issue
Block a user