Refresh blockhash for fee calculations (#23338)
This commit is contained in:
parent
3f35d7fad9
commit
2d55a8e1c3
|
@ -24,8 +24,9 @@ use {
|
||||||
rpc_request::MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS,
|
rpc_request::MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS,
|
||||||
},
|
},
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
clock::Slot,
|
clock::{Slot, DEFAULT_MS_PER_SLOT},
|
||||||
commitment_config::CommitmentConfig,
|
commitment_config::CommitmentConfig,
|
||||||
|
hash::Hash,
|
||||||
instruction::Instruction,
|
instruction::Instruction,
|
||||||
message::Message,
|
message::Message,
|
||||||
native_token::{lamports_to_sol, sol_to_lamports},
|
native_token::{lamports_to_sol, sol_to_lamports},
|
||||||
|
@ -48,7 +49,7 @@ use {
|
||||||
Arc,
|
Arc,
|
||||||
},
|
},
|
||||||
thread::sleep,
|
thread::sleep,
|
||||||
time::Duration,
|
time::{Duration, Instant},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -346,7 +347,7 @@ fn build_messages(
|
||||||
let message = Message::new_with_blockhash(
|
let message = Message::new_with_blockhash(
|
||||||
&instructions,
|
&instructions,
|
||||||
Some(&fee_payer_pubkey),
|
Some(&fee_payer_pubkey),
|
||||||
&client.get_latest_blockhash()?,
|
&Hash::default(), // populated by a real blockhash for balance check and submission
|
||||||
);
|
);
|
||||||
messages.push(message);
|
messages.push(message);
|
||||||
stake_extras.push((new_stake_account_keypair, lockup_date));
|
stake_extras.push((new_stake_account_keypair, lockup_date));
|
||||||
|
@ -729,6 +730,25 @@ fn log_transaction_confirmations(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_fees_for_messages(messages: &[Message], client: &RpcClient) -> Result<u64, Error> {
|
||||||
|
// This is an arbitrary value to get regular blockhash updates for balance checks without
|
||||||
|
// hitting the RPC node with too many requests
|
||||||
|
const BLOCKHASH_REFRESH_MILLIS: u64 = DEFAULT_MS_PER_SLOT * 32;
|
||||||
|
|
||||||
|
let mut latest_blockhash = client.get_latest_blockhash()?;
|
||||||
|
let mut now = Instant::now();
|
||||||
|
let mut fees = 0;
|
||||||
|
for mut message in messages.iter().cloned() {
|
||||||
|
if now.elapsed() > Duration::from_millis(BLOCKHASH_REFRESH_MILLIS) {
|
||||||
|
latest_blockhash = client.get_latest_blockhash()?;
|
||||||
|
now = Instant::now();
|
||||||
|
}
|
||||||
|
message.recent_blockhash = latest_blockhash;
|
||||||
|
fees += client.get_fee_for_message(&message)?;
|
||||||
|
}
|
||||||
|
Ok(fees)
|
||||||
|
}
|
||||||
|
|
||||||
fn check_payer_balances(
|
fn check_payer_balances(
|
||||||
messages: &[Message],
|
messages: &[Message],
|
||||||
allocations: &[Allocation],
|
allocations: &[Allocation],
|
||||||
|
@ -736,14 +756,7 @@ fn check_payer_balances(
|
||||||
args: &DistributeTokensArgs,
|
args: &DistributeTokensArgs,
|
||||||
) -> 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 fees = get_fees_for_messages(messages, client)?;
|
||||||
let fees = messages
|
|
||||||
.iter()
|
|
||||||
.map(|message| client.get_fee_for_message(message))
|
|
||||||
.collect::<Result<Vec<_>, _>>()
|
|
||||||
.unwrap()
|
|
||||||
.iter()
|
|
||||||
.sum();
|
|
||||||
|
|
||||||
let (distribution_source, unlocked_sol_source) = if let Some(stake_args) = &args.stake_args {
|
let (distribution_source, unlocked_sol_source) = if let Some(stake_args) = &args.stake_args {
|
||||||
let total_unlocked_sol = allocations.len() as u64 * stake_args.unlocked_sol;
|
let total_unlocked_sol = allocations.len() as u64 * stake_args.unlocked_sol;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
args::{DistributeTokensArgs, SplTokenArgs},
|
args::{DistributeTokensArgs, SplTokenArgs},
|
||||||
commands::{Allocation, Error, FundingSource},
|
commands::{get_fees_for_messages, Allocation, Error, FundingSource},
|
||||||
},
|
},
|
||||||
console::style,
|
console::style,
|
||||||
solana_account_decoder::parse_token::{
|
solana_account_decoder::parse_token::{
|
||||||
|
@ -93,14 +93,7 @@ pub fn check_spl_token_balances(
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.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 fees = get_fees_for_messages(messages, client)?;
|
||||||
let fees: u64 = messages
|
|
||||||
.iter()
|
|
||||||
.map(|message| client.get_fee_for_message(message))
|
|
||||||
.collect::<Result<Vec<_>, _>>()
|
|
||||||
.unwrap()
|
|
||||||
.iter()
|
|
||||||
.sum();
|
|
||||||
|
|
||||||
let token_account_rent_exempt_balance =
|
let token_account_rent_exempt_balance =
|
||||||
client.get_minimum_balance_for_rent_exemption(SplTokenAccount::LEN)?;
|
client.get_minimum_balance_for_rent_exemption(SplTokenAccount::LEN)?;
|
||||||
|
|
Loading…
Reference in New Issue