Add test for transaction has too high prioritization fee (#31097)
* Add test for transaction has too high prioritization fee than payer account balance
This commit is contained in:
parent
557e4c47e1
commit
5816d33b57
|
@ -1455,10 +1455,14 @@ mod tests {
|
||||||
},
|
},
|
||||||
assert_matches::assert_matches,
|
assert_matches::assert_matches,
|
||||||
solana_address_lookup_table_program::state::LookupTableMeta,
|
solana_address_lookup_table_program::state::LookupTableMeta,
|
||||||
solana_program_runtime::executor_cache::TransactionExecutorCache,
|
solana_program_runtime::{
|
||||||
|
executor_cache::TransactionExecutorCache,
|
||||||
|
prioritization_fee::{PrioritizationFeeDetails, PrioritizationFeeType},
|
||||||
|
},
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
account::{AccountSharedData, WritableAccount},
|
account::{AccountSharedData, WritableAccount},
|
||||||
bpf_loader_upgradeable::UpgradeableLoaderState,
|
bpf_loader_upgradeable::UpgradeableLoaderState,
|
||||||
|
compute_budget::ComputeBudgetInstruction,
|
||||||
epoch_schedule::EpochSchedule,
|
epoch_schedule::EpochSchedule,
|
||||||
genesis_config::ClusterType,
|
genesis_config::ClusterType,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
|
@ -4257,4 +4261,64 @@ mod tests {
|
||||||
test(tx_set_limit_99, &feature_set, &result_requested_limit);
|
test(tx_set_limit_99, &feature_set, &result_requested_limit);
|
||||||
test(tx_set_limit_0, &feature_set, &result_invalid_limit);
|
test(tx_set_limit_0, &feature_set, &result_invalid_limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_load_accounts_too_high_prioritization_fee() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let lamports_per_signature = 5000_u64;
|
||||||
|
let request_units = 1_000_000_u32;
|
||||||
|
let request_unit_price = 2_000_000_000_u64;
|
||||||
|
let prioritization_fee_details = PrioritizationFeeDetails::new(
|
||||||
|
PrioritizationFeeType::ComputeUnitPrice(request_unit_price),
|
||||||
|
request_units as u64,
|
||||||
|
);
|
||||||
|
let prioritization_fee = prioritization_fee_details.get_fee();
|
||||||
|
|
||||||
|
let keypair = Keypair::new();
|
||||||
|
let key0 = keypair.pubkey();
|
||||||
|
// set up account with balance of `prioritization_fee`
|
||||||
|
let account = AccountSharedData::new(prioritization_fee, 0, &Pubkey::default());
|
||||||
|
let accounts = vec![(key0, account)];
|
||||||
|
|
||||||
|
let instructions = &[
|
||||||
|
ComputeBudgetInstruction::set_compute_unit_limit(request_units),
|
||||||
|
ComputeBudgetInstruction::set_compute_unit_price(request_unit_price),
|
||||||
|
];
|
||||||
|
let tx = Transaction::new(
|
||||||
|
&[&keypair],
|
||||||
|
Message::new(instructions, Some(&key0)),
|
||||||
|
Hash::default(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let fee = Bank::calculate_fee(
|
||||||
|
&SanitizedMessage::try_from(tx.message().clone()).unwrap(),
|
||||||
|
lamports_per_signature,
|
||||||
|
&FeeStructure::default(),
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
assert_eq!(fee, lamports_per_signature + prioritization_fee);
|
||||||
|
|
||||||
|
// assert fail to load account with 2B lamport balance for transaction asking for 2B
|
||||||
|
// lamports as prioritization fee.
|
||||||
|
let mut error_counters = TransactionErrorMetrics::default();
|
||||||
|
let loaded_accounts = load_accounts_with_fee(
|
||||||
|
tx,
|
||||||
|
&accounts,
|
||||||
|
lamports_per_signature,
|
||||||
|
&mut error_counters,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(error_counters.insufficient_funds, 1);
|
||||||
|
assert_eq!(loaded_accounts.len(), 1);
|
||||||
|
assert_eq!(
|
||||||
|
loaded_accounts[0].clone(),
|
||||||
|
(Err(TransactionError::InsufficientFundsForFee), None),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10813,6 +10813,47 @@ fn test_calculate_fee_compute_units() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_calculate_prioritization_fee() {
|
||||||
|
let fee_structure = FeeStructure {
|
||||||
|
lamports_per_signature: 1,
|
||||||
|
..FeeStructure::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let request_units = 1_000_000_u32;
|
||||||
|
let request_unit_price = 2_000_000_000_u64;
|
||||||
|
let prioritization_fee_details = PrioritizationFeeDetails::new(
|
||||||
|
PrioritizationFeeType::ComputeUnitPrice(request_unit_price),
|
||||||
|
request_units as u64,
|
||||||
|
);
|
||||||
|
let prioritization_fee = prioritization_fee_details.get_fee();
|
||||||
|
|
||||||
|
let message = SanitizedMessage::try_from(Message::new(
|
||||||
|
&[
|
||||||
|
ComputeBudgetInstruction::set_compute_unit_limit(request_units),
|
||||||
|
ComputeBudgetInstruction::set_compute_unit_price(request_unit_price),
|
||||||
|
],
|
||||||
|
Some(&Pubkey::new_unique()),
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let fee = Bank::calculate_fee(
|
||||||
|
&message,
|
||||||
|
fee_structure.lamports_per_signature,
|
||||||
|
&fee_structure,
|
||||||
|
true, // use_default_units_per_instruction
|
||||||
|
false, // not support_request_units_deprecated
|
||||||
|
true, // remove_congestion_multiplier
|
||||||
|
true, // enable_request_heap_frame_ix
|
||||||
|
true, // support_set_accounts_data_size_limit_ix,
|
||||||
|
false, // include_loaded_account_data_size_in_fee
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
fee,
|
||||||
|
fee_structure.lamports_per_signature + prioritization_fee
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_calculate_fee_secp256k1() {
|
fn test_calculate_fee_secp256k1() {
|
||||||
let fee_structure = FeeStructure {
|
let fee_structure = FeeStructure {
|
||||||
|
|
Loading…
Reference in New Issue