Remove blockhash from fee calculation (#20641)
This commit is contained in:
@ -271,7 +271,7 @@ fn run_accounts_bench(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let fee = client
|
let fee = client
|
||||||
.get_fee_for_message(&blockhash, &message)
|
.get_fee_for_message(&message)
|
||||||
.expect("get_fee_for_message");
|
.expect("get_fee_for_message");
|
||||||
let lamports = min_balance + fee;
|
let lamports = min_balance + fee;
|
||||||
|
|
||||||
|
@ -896,10 +896,7 @@ pub fn generate_and_fund_keypairs<T: 'static + Client + Send + Sync>(
|
|||||||
)],
|
)],
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
let blockhash = client.get_latest_blockhash().unwrap();
|
let max_fee = client.get_fee_for_message(&single_sig_message).unwrap();
|
||||||
let max_fee = client
|
|
||||||
.get_fee_for_message(&blockhash, &single_sig_message)
|
|
||||||
.unwrap();
|
|
||||||
let extra_fees = extra * max_fee;
|
let extra_fees = extra * max_fee;
|
||||||
let total_keypairs = keypairs.len() as u64 + 1; // Add one for funding keypair
|
let total_keypairs = keypairs.len() as u64 + 1; // Add one for funding keypair
|
||||||
let total = lamports_per_account * total_keypairs + extra_fees;
|
let total = lamports_per_account * total_keypairs + extra_fees;
|
||||||
|
@ -4,30 +4,27 @@ use solana_client::{
|
|||||||
rpc_client::RpcClient,
|
rpc_client::RpcClient,
|
||||||
};
|
};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
commitment_config::CommitmentConfig, hash::Hash, message::Message,
|
commitment_config::CommitmentConfig, message::Message, native_token::lamports_to_sol,
|
||||||
native_token::lamports_to_sol, pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn check_account_for_fee(
|
pub fn check_account_for_fee(
|
||||||
rpc_client: &RpcClient,
|
rpc_client: &RpcClient,
|
||||||
account_pubkey: &Pubkey,
|
account_pubkey: &Pubkey,
|
||||||
blockhash: &Hash,
|
|
||||||
message: &Message,
|
message: &Message,
|
||||||
) -> Result<(), CliError> {
|
) -> 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(
|
pub fn check_account_for_fee_with_commitment(
|
||||||
rpc_client: &RpcClient,
|
rpc_client: &RpcClient,
|
||||||
account_pubkey: &Pubkey,
|
account_pubkey: &Pubkey,
|
||||||
blockhash: &Hash,
|
|
||||||
message: &Message,
|
message: &Message,
|
||||||
commitment: CommitmentConfig,
|
commitment: CommitmentConfig,
|
||||||
) -> Result<(), CliError> {
|
) -> Result<(), CliError> {
|
||||||
check_account_for_multiple_fees_with_commitment(
|
check_account_for_multiple_fees_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
account_pubkey,
|
account_pubkey,
|
||||||
blockhash,
|
|
||||||
&[message],
|
&[message],
|
||||||
commitment,
|
commitment,
|
||||||
)
|
)
|
||||||
@ -36,13 +33,11 @@ pub fn check_account_for_fee_with_commitment(
|
|||||||
pub fn check_account_for_multiple_fees(
|
pub fn check_account_for_multiple_fees(
|
||||||
rpc_client: &RpcClient,
|
rpc_client: &RpcClient,
|
||||||
account_pubkey: &Pubkey,
|
account_pubkey: &Pubkey,
|
||||||
blockhash: &Hash,
|
|
||||||
messages: &[&Message],
|
messages: &[&Message],
|
||||||
) -> Result<(), CliError> {
|
) -> Result<(), CliError> {
|
||||||
check_account_for_multiple_fees_with_commitment(
|
check_account_for_multiple_fees_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
account_pubkey,
|
account_pubkey,
|
||||||
blockhash,
|
|
||||||
messages,
|
messages,
|
||||||
CommitmentConfig::default(),
|
CommitmentConfig::default(),
|
||||||
)
|
)
|
||||||
@ -51,7 +46,6 @@ pub fn check_account_for_multiple_fees(
|
|||||||
pub fn check_account_for_multiple_fees_with_commitment(
|
pub fn check_account_for_multiple_fees_with_commitment(
|
||||||
rpc_client: &RpcClient,
|
rpc_client: &RpcClient,
|
||||||
account_pubkey: &Pubkey,
|
account_pubkey: &Pubkey,
|
||||||
blockhash: &Hash,
|
|
||||||
messages: &[&Message],
|
messages: &[&Message],
|
||||||
commitment: CommitmentConfig,
|
commitment: CommitmentConfig,
|
||||||
) -> Result<(), CliError> {
|
) -> Result<(), CliError> {
|
||||||
@ -59,7 +53,6 @@ pub fn check_account_for_multiple_fees_with_commitment(
|
|||||||
rpc_client,
|
rpc_client,
|
||||||
account_pubkey,
|
account_pubkey,
|
||||||
0,
|
0,
|
||||||
blockhash,
|
|
||||||
messages,
|
messages,
|
||||||
commitment,
|
commitment,
|
||||||
)
|
)
|
||||||
@ -69,11 +62,10 @@ pub fn check_account_for_spend_multiple_fees_with_commitment(
|
|||||||
rpc_client: &RpcClient,
|
rpc_client: &RpcClient,
|
||||||
account_pubkey: &Pubkey,
|
account_pubkey: &Pubkey,
|
||||||
balance: u64,
|
balance: u64,
|
||||||
blockhash: &Hash,
|
|
||||||
messages: &[&Message],
|
messages: &[&Message],
|
||||||
commitment: CommitmentConfig,
|
commitment: CommitmentConfig,
|
||||||
) -> Result<(), CliError> {
|
) -> 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(
|
if !check_account_for_balance_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
account_pubkey,
|
account_pubkey,
|
||||||
@ -98,14 +90,10 @@ pub fn check_account_for_spend_multiple_fees_with_commitment(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_fee_for_message(
|
pub fn get_fee_for_message(rpc_client: &RpcClient, messages: &[&Message]) -> Result<u64, CliError> {
|
||||||
rpc_client: &RpcClient,
|
|
||||||
blockhash: &Hash,
|
|
||||||
messages: &[&Message],
|
|
||||||
) -> Result<u64, CliError> {
|
|
||||||
Ok(messages
|
Ok(messages
|
||||||
.iter()
|
.iter()
|
||||||
.map(|message| rpc_client.get_fee_for_message(blockhash, message))
|
.map(|message| rpc_client.get_fee_for_message(message))
|
||||||
.collect::<Result<Vec<_>, _>>()?
|
.collect::<Result<Vec<_>, _>>()?
|
||||||
.iter()
|
.iter()
|
||||||
.sum())
|
.sum())
|
||||||
@ -185,9 +173,7 @@ mod tests {
|
|||||||
let mut mocks = HashMap::new();
|
let mut mocks = HashMap::new();
|
||||||
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
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, &message0).expect("unexpected result");
|
||||||
check_account_for_fee(&rpc_client, &pubkey, &blockhash, &message0)
|
|
||||||
.expect("unexpected result");
|
|
||||||
|
|
||||||
let check_fee_response = json!(Response {
|
let check_fee_response = json!(Response {
|
||||||
context: RpcResponseContext { slot: 1 },
|
context: RpcResponseContext { slot: 1 },
|
||||||
@ -197,7 +183,7 @@ mod tests {
|
|||||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||||
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
mocks.insert(RpcRequest::GetBalance, account_balance_response.clone());
|
||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
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 {
|
let check_fee_response = json!(Response {
|
||||||
context: RpcResponseContext { slot: 1 },
|
context: RpcResponseContext { slot: 1 },
|
||||||
@ -207,13 +193,9 @@ mod tests {
|
|||||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||||
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||||
assert!(check_account_for_multiple_fees(
|
assert!(
|
||||||
&rpc_client,
|
check_account_for_multiple_fees(&rpc_client, &pubkey, &[&message0, &message0]).is_err()
|
||||||
&pubkey,
|
);
|
||||||
&blockhash,
|
|
||||||
&[&message0, &message0]
|
|
||||||
)
|
|
||||||
.is_err());
|
|
||||||
|
|
||||||
let account_balance = 2;
|
let account_balance = 2;
|
||||||
let account_balance_response = json!(Response {
|
let account_balance_response = json!(Response {
|
||||||
@ -230,7 +212,7 @@ mod tests {
|
|||||||
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
mocks.insert(RpcRequest::GetBalance, account_balance_response);
|
||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
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");
|
.expect("unexpected result");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,23 +243,16 @@ mod tests {
|
|||||||
let mut mocks = HashMap::new();
|
let mut mocks = HashMap::new();
|
||||||
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
mocks.insert(RpcRequest::GetFeeForMessage, check_fee_response);
|
||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||||
let blockhash = rpc_client.get_latest_blockhash().unwrap();
|
|
||||||
|
|
||||||
// No messages, no fee.
|
// No messages, no fee.
|
||||||
assert_eq!(
|
assert_eq!(get_fee_for_message(&rpc_client, &[]).unwrap(), 0);
|
||||||
get_fee_for_message(&rpc_client, &blockhash, &[]).unwrap(),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
// One message w/ one signature, a fee.
|
// One message w/ one signature, a fee.
|
||||||
let pubkey0 = Pubkey::new(&[0; 32]);
|
let pubkey0 = Pubkey::new(&[0; 32]);
|
||||||
let pubkey1 = Pubkey::new(&[1; 32]);
|
let pubkey1 = Pubkey::new(&[1; 32]);
|
||||||
let ix0 = system_instruction::transfer(&pubkey0, &pubkey1, 1);
|
let ix0 = system_instruction::transfer(&pubkey0, &pubkey1, 1);
|
||||||
let message0 = Message::new(&[ix0], Some(&pubkey0));
|
let message0 = Message::new(&[ix0], Some(&pubkey0));
|
||||||
assert_eq!(
|
assert_eq!(get_fee_for_message(&rpc_client, &[&message0]).unwrap(), 1);
|
||||||
get_fee_for_message(&rpc_client, &blockhash, &[&message0]).unwrap(),
|
|
||||||
1
|
|
||||||
);
|
|
||||||
|
|
||||||
// No signatures, no fee.
|
// No signatures, no fee.
|
||||||
let check_fee_response = json!(Response {
|
let check_fee_response = json!(Response {
|
||||||
@ -289,7 +264,7 @@ mod tests {
|
|||||||
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
let rpc_client = RpcClient::new_mock_with_mocks("".to_string(), mocks);
|
||||||
let message = Message::default();
|
let message = Message::default();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_fee_for_message(&rpc_client, &blockhash, &[&message, &message]).unwrap(),
|
get_fee_for_message(&rpc_client, &[&message, &message]).unwrap(),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,6 @@ pub fn process_authorize_nonce_account(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -552,7 +551,6 @@ pub fn process_new_nonce(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -628,7 +626,6 @@ pub fn process_withdraw_from_nonce_account(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -2071,14 +2071,11 @@ fn check_payer(
|
|||||||
balance_needed: u64,
|
balance_needed: u64,
|
||||||
messages: &[&Message],
|
messages: &[&Message],
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let blockhash = rpc_client.get_latest_blockhash()?;
|
|
||||||
|
|
||||||
// Does the payer have enough?
|
// Does the payer have enough?
|
||||||
check_account_for_spend_multiple_fees_with_commitment(
|
check_account_for_spend_multiple_fees_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
balance_needed,
|
balance_needed,
|
||||||
&blockhash,
|
|
||||||
messages,
|
messages,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -144,9 +144,9 @@ where
|
|||||||
F: Fn(u64) -> Message,
|
F: Fn(u64) -> Message,
|
||||||
{
|
{
|
||||||
let fee = match blockhash {
|
let fee = match blockhash {
|
||||||
Some(blockhash) => {
|
Some(_) => {
|
||||||
let dummy_message = build_message(0);
|
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
|
None => 0, // Offline, cannot calulate fee
|
||||||
};
|
};
|
||||||
|
@ -1455,7 +1455,6 @@ pub fn process_stake_authorize(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1534,7 +1533,6 @@ pub fn process_deactivate_stake_account(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1632,7 +1630,6 @@ pub fn process_withdraw_stake(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1776,7 +1773,6 @@ pub fn process_split_stake(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1882,7 +1878,6 @@ pub fn process_merge_stake(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1977,7 +1972,6 @@ pub fn process_stake_set_lockup(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -2419,7 +2413,6 @@ pub fn process_delegate_stake(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
&recent_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -774,7 +774,6 @@ pub fn process_vote_authorize(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -811,7 +810,6 @@ pub fn process_vote_update_validator(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -842,7 +840,6 @@ pub fn process_vote_update_commission(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&tx.message,
|
&tx.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -980,7 +977,6 @@ pub fn process_withdraw_from_vote_account(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&transaction.message,
|
&transaction.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
@ -1036,7 +1032,6 @@ pub fn process_close_vote_account(
|
|||||||
check_account_for_fee_with_commitment(
|
check_account_for_fee_with_commitment(
|
||||||
rpc_client,
|
rpc_client,
|
||||||
&config.signers[0].pubkey(),
|
&config.signers[0].pubkey(),
|
||||||
&latest_blockhash,
|
|
||||||
&transaction.message,
|
&transaction.message,
|
||||||
config.commitment,
|
config.commitment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -4800,7 +4800,7 @@ impl RpcClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
pub fn get_fee_for_message(&self, blockhash: &Hash, message: &Message) -> ClientResult<u64> {
|
pub fn get_fee_for_message(&self, message: &Message) -> ClientResult<u64> {
|
||||||
if self.get_node_version()? < semver::Version::new(1, 8, 0) {
|
if self.get_node_version()? < semver::Version::new(1, 8, 0) {
|
||||||
let Fees { fee_calculator, .. } = self.get_fees()?;
|
let Fees { fee_calculator, .. } = self.get_fees()?;
|
||||||
Ok(fee_calculator
|
Ok(fee_calculator
|
||||||
@ -4811,7 +4811,7 @@ impl RpcClient {
|
|||||||
serialize_and_encode::<Message>(message, UiTransactionEncoding::Base64)?;
|
serialize_and_encode::<Message>(message, UiTransactionEncoding::Base64)?;
|
||||||
let result = self.send::<Response<Option<u64>>>(
|
let result = self.send::<Response<Option<u64>>>(
|
||||||
RpcRequest::GetFeeForMessage,
|
RpcRequest::GetFeeForMessage,
|
||||||
json!([blockhash.to_string(), serialized_encoded, self.commitment()]),
|
json!([serialized_encoded, self.commitment()]),
|
||||||
)?;
|
)?;
|
||||||
result
|
result
|
||||||
.value
|
.value
|
||||||
|
@ -600,9 +600,9 @@ impl SyncClient for ThinClient {
|
|||||||
.map_err(|e| e.into())
|
.map_err(|e| e.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_fee_for_message(&self, blockhash: &Hash, message: &Message) -> TransportResult<u64> {
|
fn get_fee_for_message(&self, message: &Message) -> TransportResult<u64> {
|
||||||
self.rpc_client()
|
self.rpc_client()
|
||||||
.get_fee_for_message(blockhash, message)
|
.get_fee_for_message(message)
|
||||||
.map_err(|e| e.into())
|
.map_err(|e| e.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,7 +577,7 @@ impl TestValidator {
|
|||||||
}
|
}
|
||||||
println!("Waiting for fees to stabilize {:?}...", num_tries);
|
println!("Waiting for fees to stabilize {:?}...", num_tries);
|
||||||
match rpc_client.get_latest_blockhash() {
|
match rpc_client.get_latest_blockhash() {
|
||||||
Ok(blockhash) => match rpc_client.get_fee_for_message(&blockhash, &message) {
|
Ok(_) => match rpc_client.get_fee_for_message(&message) {
|
||||||
Ok(fee) => {
|
Ok(fee) => {
|
||||||
if fee != 0 {
|
if fee != 0 {
|
||||||
break;
|
break;
|
||||||
|
@ -1961,12 +1961,11 @@ impl JsonRpcRequestProcessor {
|
|||||||
|
|
||||||
fn get_fee_for_message(
|
fn get_fee_for_message(
|
||||||
&self,
|
&self,
|
||||||
blockhash: &Hash,
|
|
||||||
message: &SanitizedMessage,
|
message: &SanitizedMessage,
|
||||||
commitment: Option<CommitmentConfig>,
|
commitment: Option<CommitmentConfig>,
|
||||||
) -> Result<RpcResponse<Option<u64>>> {
|
) -> Result<RpcResponse<Option<u64>>> {
|
||||||
let bank = self.bank(commitment);
|
let bank = self.bank(commitment);
|
||||||
let fee = bank.get_fee_for_message(blockhash, message);
|
let fee = bank.get_fee_for_message(message);
|
||||||
Ok(new_response(&bank, fee))
|
Ok(new_response(&bank, fee))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3124,7 +3123,6 @@ pub mod rpc_full {
|
|||||||
fn get_fee_for_message(
|
fn get_fee_for_message(
|
||||||
&self,
|
&self,
|
||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
blockhash: String,
|
|
||||||
data: String,
|
data: String,
|
||||||
commitment: Option<CommitmentConfig>,
|
commitment: Option<CommitmentConfig>,
|
||||||
) -> Result<RpcResponse<Option<u64>>>;
|
) -> Result<RpcResponse<Option<u64>>>;
|
||||||
@ -3640,20 +3638,17 @@ pub mod rpc_full {
|
|||||||
fn get_fee_for_message(
|
fn get_fee_for_message(
|
||||||
&self,
|
&self,
|
||||||
meta: Self::Metadata,
|
meta: Self::Metadata,
|
||||||
blockhash: String,
|
|
||||||
data: String,
|
data: String,
|
||||||
commitment: Option<CommitmentConfig>,
|
commitment: Option<CommitmentConfig>,
|
||||||
) -> Result<RpcResponse<Option<u64>>> {
|
) -> Result<RpcResponse<Option<u64>>> {
|
||||||
debug!("get_fee_for_message rpc request received");
|
debug!("get_fee_for_message rpc request received");
|
||||||
let blockhash = Hash::from_str(&blockhash)
|
|
||||||
.map_err(|e| Error::invalid_params(format!("{:?}", e)))?;
|
|
||||||
let (_, message) =
|
let (_, message) =
|
||||||
decode_and_deserialize::<Message>(data, UiTransactionEncoding::Base64)?;
|
decode_and_deserialize::<Message>(data, UiTransactionEncoding::Base64)?;
|
||||||
SanitizedMessage::try_from(message)
|
SanitizedMessage::try_from(message)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
Error::invalid_params(format!("invalid transaction message: {}", err))
|
Error::invalid_params(format!("invalid transaction message: {}", err))
|
||||||
})
|
})
|
||||||
.and_then(|message| meta.get_fee_for_message(&blockhash, &message, commitment))
|
.and_then(|message| meta.get_fee_for_message(&message, commitment))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,9 @@ impl TransactionStatusService {
|
|||||||
bank.get_fee_calculator(transaction.message().recent_blockhash())
|
bank.get_fee_calculator(transaction.message().recent_blockhash())
|
||||||
})
|
})
|
||||||
.expect("FeeCalculator must exist");
|
.expect("FeeCalculator must exist");
|
||||||
let fee = transaction.message().calculate_fee(&fee_calculator);
|
let fee = transaction
|
||||||
|
.message()
|
||||||
|
.calculate_fee(fee_calculator.lamports_per_signature);
|
||||||
let tx_account_locks =
|
let tx_account_locks =
|
||||||
transaction.get_account_locks(bank.demote_program_write_locks());
|
transaction.get_account_locks(bank.demote_program_write_locks());
|
||||||
|
|
||||||
|
@ -486,7 +486,8 @@ impl Accounts {
|
|||||||
.cloned()
|
.cloned()
|
||||||
});
|
});
|
||||||
let fee = if let Some(fee_calculator) = fee_calculator {
|
let fee = if let Some(fee_calculator) = fee_calculator {
|
||||||
tx.message().calculate_fee(&fee_calculator)
|
tx.message()
|
||||||
|
.calculate_fee(fee_calculator.lamports_per_signature)
|
||||||
} else {
|
} else {
|
||||||
return (Err(TransactionError::BlockhashNotFound), None);
|
return (Err(TransactionError::BlockhashNotFound), None);
|
||||||
};
|
};
|
||||||
|
@ -3108,11 +3108,8 @@ impl Bank {
|
|||||||
&self.fee_rate_governor
|
&self.fee_rate_governor
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_fee_for_message(&self, hash: &Hash, message: &SanitizedMessage) -> Option<u64> {
|
pub fn get_fee_for_message(&self, message: &SanitizedMessage) -> Option<u64> {
|
||||||
let blockhash_queue = self.blockhash_queue.read().unwrap();
|
Some(message.calculate_fee(self.fee_rate_governor.lamports_per_signature))
|
||||||
#[allow(deprecated)]
|
|
||||||
let fee_calculator = blockhash_queue.get_fee_calculator(hash)?;
|
|
||||||
Some(message.calculate_fee(fee_calculator))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deprecated(
|
#[deprecated(
|
||||||
@ -4042,7 +4039,9 @@ impl Bank {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let fee_calculator = fee_calculator.ok_or(TransactionError::BlockhashNotFound)?;
|
let fee_calculator = fee_calculator.ok_or(TransactionError::BlockhashNotFound)?;
|
||||||
let fee = tx.message().calculate_fee(&fee_calculator);
|
let fee = tx
|
||||||
|
.message()
|
||||||
|
.calculate_fee(fee_calculator.lamports_per_signature);
|
||||||
|
|
||||||
match *res {
|
match *res {
|
||||||
Err(TransactionError::InstructionError(_, _)) => {
|
Err(TransactionError::InstructionError(_, _)) => {
|
||||||
@ -10920,10 +10919,7 @@ pub(crate) mod tests {
|
|||||||
/* Check balances */
|
/* Check balances */
|
||||||
let mut expected_balance = 4_650_000
|
let mut expected_balance = 4_650_000
|
||||||
- bank
|
- bank
|
||||||
.get_fee_for_message(
|
.get_fee_for_message(&durable_tx.message.try_into().unwrap())
|
||||||
&bank.last_blockhash(),
|
|
||||||
&durable_tx.message.try_into().unwrap(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
|
assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
|
||||||
assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
|
assert_eq!(bank.get_balance(&nonce_pubkey), 250_000);
|
||||||
@ -10977,10 +10973,7 @@ pub(crate) mod tests {
|
|||||||
);
|
);
|
||||||
/* Check fee charged and nonce has advanced */
|
/* Check fee charged and nonce has advanced */
|
||||||
expected_balance -= bank
|
expected_balance -= bank
|
||||||
.get_fee_for_message(
|
.get_fee_for_message(&SanitizedMessage::try_from(durable_tx.message.clone()).unwrap())
|
||||||
&bank.last_blockhash(),
|
|
||||||
&SanitizedMessage::try_from(durable_tx.message.clone()).unwrap(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
|
assert_eq!(bank.get_balance(&custodian_pubkey), expected_balance);
|
||||||
assert_ne!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
assert_ne!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
||||||
@ -11044,10 +11037,7 @@ pub(crate) mod tests {
|
|||||||
bank.get_balance(&custodian_pubkey),
|
bank.get_balance(&custodian_pubkey),
|
||||||
initial_custodian_balance
|
initial_custodian_balance
|
||||||
- bank
|
- bank
|
||||||
.get_fee_for_message(
|
.get_fee_for_message(&durable_tx.message.try_into().unwrap())
|
||||||
&bank.last_blockhash(),
|
|
||||||
&durable_tx.message.try_into().unwrap()
|
|
||||||
)
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
);
|
);
|
||||||
assert_eq!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
assert_eq!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
||||||
@ -11099,10 +11089,7 @@ pub(crate) mod tests {
|
|||||||
bank.get_balance(&nonce_pubkey),
|
bank.get_balance(&nonce_pubkey),
|
||||||
nonce_starting_balance
|
nonce_starting_balance
|
||||||
- bank
|
- bank
|
||||||
.get_fee_for_message(
|
.get_fee_for_message(&durable_tx.message.try_into().unwrap())
|
||||||
&bank.last_blockhash(),
|
|
||||||
&durable_tx.message.try_into().unwrap()
|
|
||||||
)
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
);
|
);
|
||||||
assert_ne!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
assert_ne!(nonce_hash, get_nonce_account(&bank, &nonce_pubkey).unwrap());
|
||||||
|
@ -303,10 +303,10 @@ impl SyncClient for BankClient {
|
|||||||
Ok(self.bank.is_blockhash_valid(blockhash))
|
Ok(self.bank.is_blockhash_valid(blockhash))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_fee_for_message(&self, blockhash: &Hash, message: &Message) -> Result<u64> {
|
fn get_fee_for_message(&self, message: &Message) -> Result<u64> {
|
||||||
SanitizedMessage::try_from(message.clone())
|
SanitizedMessage::try_from(message.clone())
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|message| self.bank.get_fee_for_message(blockhash, &message))
|
.and_then(|message| self.bank.get_fee_for_message(&message))
|
||||||
.ok_or_else(|| {
|
.ok_or_else(|| {
|
||||||
TransportError::IoError(io::Error::new(
|
TransportError::IoError(io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
|
@ -3049,9 +3049,7 @@ mod tests {
|
|||||||
bank2.last_blockhash(),
|
bank2.last_blockhash(),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let fee = bank2
|
let fee = bank2.get_fee_for_message(tx.message()).unwrap();
|
||||||
.get_fee_for_message(&bank2.last_blockhash(), tx.message())
|
|
||||||
.unwrap();
|
|
||||||
let tx = system_transaction::transfer(
|
let tx = system_transaction::transfer(
|
||||||
&key1,
|
&key1,
|
||||||
&key2.pubkey(),
|
&key2.pubkey(),
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
fee_calculator::FeeCalculator,
|
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
instruction::{CompiledInstruction, Instruction},
|
instruction::{CompiledInstruction, Instruction},
|
||||||
message::{MappedAddresses, MappedMessage, Message, MessageHeader},
|
message::{MappedAddresses, MappedMessage, Message, MessageHeader},
|
||||||
@ -292,7 +291,7 @@ impl SanitizedMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Calculate the total fees for a transaction given a fee calculator
|
/// Calculate the total fees for a transaction given a fee calculator
|
||||||
pub fn calculate_fee(&self, fee_calculator: &FeeCalculator) -> u64 {
|
pub fn calculate_fee(&self, lamports_per_signature: u64) -> u64 {
|
||||||
let mut num_signatures = u64::from(self.header().num_required_signatures);
|
let mut num_signatures = u64::from(self.header().num_required_signatures);
|
||||||
for (program_id, instruction) in self.program_instructions_iter() {
|
for (program_id, instruction) in self.program_instructions_iter() {
|
||||||
if secp256k1_program::check_id(program_id) {
|
if secp256k1_program::check_id(program_id) {
|
||||||
@ -303,7 +302,7 @@ impl SanitizedMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fee_calculator.lamports_per_signature.saturating_mul(num_signatures)
|
lamports_per_signature.saturating_mul(num_signatures)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inspect all message keys for the bpf upgradeable loader
|
/// Inspect all message keys for the bpf upgradeable loader
|
||||||
@ -465,10 +464,10 @@ mod tests {
|
|||||||
// Default: no fee.
|
// Default: no fee.
|
||||||
let message =
|
let message =
|
||||||
SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap();
|
SanitizedMessage::try_from(Message::new(&[], Some(&Pubkey::new_unique()))).unwrap();
|
||||||
assert_eq!(message.calculate_fee(&FeeCalculator::default()), 0);
|
assert_eq!(message.calculate_fee(0), 0);
|
||||||
|
|
||||||
// One signature, a fee.
|
// One signature, a fee.
|
||||||
assert_eq!(message.calculate_fee(&FeeCalculator::new(1)), 1);
|
assert_eq!(message.calculate_fee(1), 1);
|
||||||
|
|
||||||
// Two signatures, double the fee.
|
// Two signatures, double the fee.
|
||||||
let key0 = Pubkey::new_unique();
|
let key0 = Pubkey::new_unique();
|
||||||
@ -476,7 +475,7 @@ mod tests {
|
|||||||
let ix0 = system_instruction::transfer(&key0, &key1, 1);
|
let ix0 = system_instruction::transfer(&key0, &key1, 1);
|
||||||
let ix1 = system_instruction::transfer(&key1, &key0, 1);
|
let ix1 = system_instruction::transfer(&key1, &key0, 1);
|
||||||
let message = SanitizedMessage::try_from(Message::new(&[ix0, ix1], Some(&key0))).unwrap();
|
let message = SanitizedMessage::try_from(Message::new(&[ix0, ix1], Some(&key0))).unwrap();
|
||||||
assert_eq!(message.calculate_fee(&FeeCalculator::new(2)), 4);
|
assert_eq!(message.calculate_fee(2), 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -588,7 +587,7 @@ mod tests {
|
|||||||
Some(&key0),
|
Some(&key0),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(message.calculate_fee(&FeeCalculator::new(1)), 2);
|
assert_eq!(message.calculate_fee(1), 2);
|
||||||
|
|
||||||
secp_instruction1.data = vec![0];
|
secp_instruction1.data = vec![0];
|
||||||
secp_instruction2.data = vec![10];
|
secp_instruction2.data = vec![10];
|
||||||
@ -597,6 +596,6 @@ mod tests {
|
|||||||
Some(&key0),
|
Some(&key0),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(message.calculate_fee(&FeeCalculator::new(1)), 11);
|
assert_eq!(message.calculate_fee(1), 11);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,7 +168,7 @@ pub trait SyncClient {
|
|||||||
fn is_blockhash_valid(&self, blockhash: &Hash, commitment: CommitmentConfig) -> Result<bool>;
|
fn is_blockhash_valid(&self, blockhash: &Hash, commitment: CommitmentConfig) -> Result<bool>;
|
||||||
|
|
||||||
/// Calculate the fee for a `Message`
|
/// Calculate the fee for a `Message`
|
||||||
fn get_fee_for_message(&self, blockhash: &Hash, message: &Message) -> Result<u64>;
|
fn get_fee_for_message(&self, message: &Message) -> Result<u64>;
|
||||||
|
|
||||||
/// Get a new blockhash after the one specified
|
/// Get a new blockhash after the one specified
|
||||||
fn get_new_latest_blockhash(&self, blockhash: &Hash) -> Result<Hash>;
|
fn get_new_latest_blockhash(&self, blockhash: &Hash) -> Result<Hash>;
|
||||||
|
@ -730,10 +730,9 @@ fn check_payer_balances(
|
|||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let mut undistributed_tokens: u64 = allocations.iter().map(|x| x.amount).sum();
|
let mut undistributed_tokens: u64 = allocations.iter().map(|x| x.amount).sum();
|
||||||
|
|
||||||
let blockhash = client.get_latest_blockhash()?;
|
|
||||||
let fees = messages
|
let fees = messages
|
||||||
.iter()
|
.iter()
|
||||||
.map(|message| client.get_fee_for_message(&blockhash, message))
|
.map(|message| client.get_fee_for_message(message))
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -97,10 +97,9 @@ pub fn check_spl_token_balances(
|
|||||||
.expect("spl_token_args must be some");
|
.expect("spl_token_args must be some");
|
||||||
let allocation_amount: u64 = allocations.iter().map(|x| x.amount).sum();
|
let allocation_amount: u64 = allocations.iter().map(|x| x.amount).sum();
|
||||||
|
|
||||||
let blockhash = client.get_latest_blockhash()?;
|
|
||||||
let fees: u64 = messages
|
let fees: u64 = messages
|
||||||
.iter()
|
.iter()
|
||||||
.map(|message| client.get_fee_for_message(&blockhash, message))
|
.map(|message| client.get_fee_for_message(message))
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.iter()
|
.iter()
|
||||||
|
Reference in New Issue
Block a user