Clean up feature preventing new rent-paying accounts (#26000)
* Clean up require_rent_exempt_accounts feature * Fix tests in bank_client, system_instruction_processor * Fix tests in snapshot_utils * Fix bank tests * Ignore rent tests * Fix stake-accounts tests
This commit is contained in:
parent
bf9ca9827e
commit
752c851070
|
@ -427,7 +427,7 @@ impl Accounts {
|
|||
.map_err(|_| TransactionError::InsufficientFundsForFee)?;
|
||||
|
||||
let payer_post_rent_state = RentState::from_account(payer_account, &rent_collector.rent);
|
||||
let rent_state_result = check_rent_state_with_account(
|
||||
check_rent_state_with_account(
|
||||
&payer_pre_rent_state,
|
||||
&payer_post_rent_state,
|
||||
payer_address,
|
||||
|
@ -435,14 +435,7 @@ impl Accounts {
|
|||
feature_set
|
||||
.is_active(&feature_set::include_account_index_in_rent_error::ID)
|
||||
.then(|| payer_index),
|
||||
);
|
||||
// Feature gate only wraps the actual error return so that the metrics and debug
|
||||
// logging generated by `check_rent_state_with_account()` can be examined before
|
||||
// feature activation
|
||||
if feature_set.is_active(&feature_set::require_rent_exempt_accounts::id()) {
|
||||
rent_state_result?;
|
||||
}
|
||||
Ok(())
|
||||
)
|
||||
}
|
||||
|
||||
fn load_executable_accounts(
|
||||
|
|
|
@ -8398,6 +8398,7 @@ pub(crate) mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_rent_distribution() {
|
||||
solana_logger::setup();
|
||||
|
||||
|
@ -8726,6 +8727,7 @@ pub(crate) mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
#[allow(clippy::cognitive_complexity)]
|
||||
fn test_rent_complex() {
|
||||
solana_logger::setup();
|
||||
|
@ -10021,7 +10023,8 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_purge_empty_accounts() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let parent = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let mut bank = parent;
|
||||
for _ in 0..10 {
|
||||
|
@ -10044,16 +10047,19 @@ pub(crate) mod tests {
|
|||
let bank0 = Arc::new(new_from_parent(&bank));
|
||||
let blockhash = bank.last_blockhash();
|
||||
let keypair = Keypair::new();
|
||||
let tx = system_transaction::transfer(&mint_keypair, &keypair.pubkey(), 10, blockhash);
|
||||
let tx = system_transaction::transfer(&mint_keypair, &keypair.pubkey(), amount, blockhash);
|
||||
bank0.process_transaction(&tx).unwrap();
|
||||
|
||||
let bank1 = Arc::new(new_from_parent(&bank0));
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
let blockhash = bank.last_blockhash();
|
||||
let tx = system_transaction::transfer(&keypair, &pubkey, 10, blockhash);
|
||||
let tx = system_transaction::transfer(&keypair, &pubkey, amount, blockhash);
|
||||
bank1.process_transaction(&tx).unwrap();
|
||||
|
||||
assert_eq!(bank0.get_account(&keypair.pubkey()).unwrap().lamports(), 10);
|
||||
assert_eq!(
|
||||
bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
|
||||
amount
|
||||
);
|
||||
assert_eq!(bank1.get_account(&keypair.pubkey()), None);
|
||||
|
||||
info!("bank0 purge");
|
||||
|
@ -10061,13 +10067,19 @@ pub(crate) mod tests {
|
|||
bank0.clean_accounts(false, false, None);
|
||||
assert_eq!(bank0.update_accounts_hash(), hash);
|
||||
|
||||
assert_eq!(bank0.get_account(&keypair.pubkey()).unwrap().lamports(), 10);
|
||||
assert_eq!(
|
||||
bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
|
||||
amount
|
||||
);
|
||||
assert_eq!(bank1.get_account(&keypair.pubkey()), None);
|
||||
|
||||
info!("bank1 purge");
|
||||
bank1.clean_accounts(false, false, None);
|
||||
|
||||
assert_eq!(bank0.get_account(&keypair.pubkey()).unwrap().lamports(), 10);
|
||||
assert_eq!(
|
||||
bank0.get_account(&keypair.pubkey()).unwrap().lamports(),
|
||||
amount
|
||||
);
|
||||
assert_eq!(bank1.get_account(&keypair.pubkey()), None);
|
||||
|
||||
assert!(bank0.verify_bank_hash(true, false, false));
|
||||
|
@ -10093,37 +10105,42 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_two_payments_to_one_party() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(10_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
assert_eq!(bank.last_blockhash(), genesis_config.hash());
|
||||
|
||||
bank.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), 1_000);
|
||||
bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), amount);
|
||||
|
||||
bank.transfer(500, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), 1_500);
|
||||
bank.transfer(amount * 2, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), amount * 3);
|
||||
assert_eq!(bank.transaction_count(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_one_source_two_tx_one_batch() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let key1 = solana_sdk::pubkey::new_rand();
|
||||
let key2 = solana_sdk::pubkey::new_rand();
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
assert_eq!(bank.last_blockhash(), genesis_config.hash());
|
||||
|
||||
let t1 = system_transaction::transfer(&mint_keypair, &key1, 1, genesis_config.hash());
|
||||
let t2 = system_transaction::transfer(&mint_keypair, &key2, 1, genesis_config.hash());
|
||||
let t1 = system_transaction::transfer(&mint_keypair, &key1, amount, genesis_config.hash());
|
||||
let t2 = system_transaction::transfer(&mint_keypair, &key2, amount, genesis_config.hash());
|
||||
let txs = vec![t1.clone(), t2.clone()];
|
||||
let res = bank.process_transactions(txs.iter());
|
||||
|
||||
assert_eq!(res.len(), 2);
|
||||
assert_eq!(res[0], Ok(()));
|
||||
assert_eq!(res[1], Err(TransactionError::AccountInUse));
|
||||
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), 0);
|
||||
assert_eq!(bank.get_balance(&key1), 1);
|
||||
assert_eq!(
|
||||
bank.get_balance(&mint_keypair.pubkey()),
|
||||
sol_to_lamports(1.) - amount
|
||||
);
|
||||
assert_eq!(bank.get_balance(&key1), amount);
|
||||
assert_eq!(bank.get_balance(&key2), 0);
|
||||
assert_eq!(bank.get_signature_status(&t1.signatures[0]), Some(Ok(())));
|
||||
// TODO: Transactions that fail to pay a fee could be dropped silently.
|
||||
|
@ -10133,37 +10150,46 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_one_tx_two_out_atomic_fail() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1);
|
||||
let amount = sol_to_lamports(1.);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(amount);
|
||||
let key1 = solana_sdk::pubkey::new_rand();
|
||||
let key2 = solana_sdk::pubkey::new_rand();
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let instructions =
|
||||
system_instruction::transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
||||
let instructions = system_instruction::transfer_many(
|
||||
&mint_keypair.pubkey(),
|
||||
&[(key1, amount), (key2, amount)],
|
||||
);
|
||||
let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
|
||||
let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
|
||||
assert_eq!(
|
||||
bank.process_transaction(&tx).unwrap_err(),
|
||||
TransactionError::InstructionError(1, SystemError::ResultWithNegativeLamports.into())
|
||||
);
|
||||
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), 1);
|
||||
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), amount);
|
||||
assert_eq!(bank.get_balance(&key1), 0);
|
||||
assert_eq!(bank.get_balance(&key2), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_one_tx_two_out_atomic_pass() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let key1 = solana_sdk::pubkey::new_rand();
|
||||
let key2 = solana_sdk::pubkey::new_rand();
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let instructions =
|
||||
system_instruction::transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let instructions = system_instruction::transfer_many(
|
||||
&mint_keypair.pubkey(),
|
||||
&[(key1, amount), (key2, amount)],
|
||||
);
|
||||
let message = Message::new(&instructions, Some(&mint_keypair.pubkey()));
|
||||
let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
|
||||
bank.process_transaction(&tx).unwrap();
|
||||
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), 0);
|
||||
assert_eq!(bank.get_balance(&key1), 1);
|
||||
assert_eq!(bank.get_balance(&key2), 1);
|
||||
assert_eq!(
|
||||
bank.get_balance(&mint_keypair.pubkey()),
|
||||
sol_to_lamports(1.) - (2 * amount)
|
||||
);
|
||||
assert_eq!(bank.get_balance(&key1), amount);
|
||||
assert_eq!(bank.get_balance(&key2), amount);
|
||||
}
|
||||
|
||||
// This test demonstrates that fees are paid even when a program fails.
|
||||
|
@ -10203,7 +10229,11 @@ pub(crate) mod tests {
|
|||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let keypair = Keypair::new();
|
||||
assert_eq!(
|
||||
bank.transfer(1, &keypair, &mint_keypair.pubkey()),
|
||||
bank.transfer(
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
&keypair,
|
||||
&mint_keypair.pubkey()
|
||||
),
|
||||
Err(TransactionError::AccountNotFound)
|
||||
);
|
||||
assert_eq!(bank.transaction_count(), 0);
|
||||
|
@ -10211,14 +10241,16 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_insufficient_funds() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(11_000);
|
||||
let mint_amount = sol_to_lamports(1.);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(mint_amount);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
bank.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.transaction_count(), 1);
|
||||
assert_eq!(bank.get_balance(&pubkey), 1_000);
|
||||
assert_eq!(bank.get_balance(&pubkey), amount);
|
||||
assert_eq!(
|
||||
bank.transfer(10_001, &mint_keypair, &pubkey),
|
||||
bank.transfer((mint_amount - amount) + 1, &mint_keypair, &pubkey),
|
||||
Err(TransactionError::InstructionError(
|
||||
0,
|
||||
SystemError::ResultWithNegativeLamports.into(),
|
||||
|
@ -10227,39 +10259,42 @@ pub(crate) mod tests {
|
|||
assert_eq!(bank.transaction_count(), 1);
|
||||
|
||||
let mint_pubkey = mint_keypair.pubkey();
|
||||
assert_eq!(bank.get_balance(&mint_pubkey), 10_000);
|
||||
assert_eq!(bank.get_balance(&pubkey), 1_000);
|
||||
assert_eq!(bank.get_balance(&mint_pubkey), mint_amount - amount);
|
||||
assert_eq!(bank.get_balance(&pubkey), amount);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_transfer_to_newb() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(10_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
bank.transfer(500, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), 500);
|
||||
bank.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank.get_balance(&pubkey), amount);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_transfer_to_sysvar() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(10_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let normal_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let sysvar_pubkey = sysvar::clock::id();
|
||||
assert_eq!(bank.get_balance(&normal_pubkey), 0);
|
||||
assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
|
||||
|
||||
bank.transfer(500, &mint_keypair, &normal_pubkey).unwrap();
|
||||
bank.transfer(500, &mint_keypair, &sysvar_pubkey)
|
||||
bank.transfer(amount, &mint_keypair, &normal_pubkey)
|
||||
.unwrap();
|
||||
bank.transfer(amount, &mint_keypair, &sysvar_pubkey)
|
||||
.unwrap_err();
|
||||
assert_eq!(bank.get_balance(&normal_pubkey), 500);
|
||||
assert_eq!(bank.get_balance(&normal_pubkey), amount);
|
||||
assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
|
||||
|
||||
let bank = Arc::new(new_from_parent(&bank));
|
||||
assert_eq!(bank.get_balance(&normal_pubkey), 500);
|
||||
assert_eq!(bank.get_balance(&normal_pubkey), amount);
|
||||
assert_eq!(bank.get_balance(&sysvar_pubkey), 1_169_280);
|
||||
}
|
||||
|
||||
|
@ -10803,19 +10838,19 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_debits_before_credits() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(2.));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let keypair = Keypair::new();
|
||||
let tx0 = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&keypair.pubkey(),
|
||||
2,
|
||||
sol_to_lamports(2.),
|
||||
genesis_config.hash(),
|
||||
);
|
||||
let tx1 = system_transaction::transfer(
|
||||
&keypair,
|
||||
&mint_keypair.pubkey(),
|
||||
1,
|
||||
sol_to_lamports(1.),
|
||||
genesis_config.hash(),
|
||||
);
|
||||
let txs = vec![tx0, tx1];
|
||||
|
@ -10904,13 +10939,18 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_interleaving_locks() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(3);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let alice = Keypair::new();
|
||||
let bob = Keypair::new();
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let tx1 =
|
||||
system_transaction::transfer(&mint_keypair, &alice.pubkey(), 1, genesis_config.hash());
|
||||
let tx1 = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&alice.pubkey(),
|
||||
amount,
|
||||
genesis_config.hash(),
|
||||
);
|
||||
let pay_alice = vec![tx1];
|
||||
|
||||
let lock_result = bank.prepare_batch_for_tests(pay_alice);
|
||||
|
@ -10930,19 +10970,21 @@ pub(crate) mod tests {
|
|||
|
||||
// try executing an interleaved transfer twice
|
||||
assert_eq!(
|
||||
bank.transfer(1, &mint_keypair, &bob.pubkey()),
|
||||
bank.transfer(amount, &mint_keypair, &bob.pubkey()),
|
||||
Err(TransactionError::AccountInUse)
|
||||
);
|
||||
// the second time should fail as well
|
||||
// this verifies that `unlock_accounts` doesn't unlock `AccountInUse` accounts
|
||||
assert_eq!(
|
||||
bank.transfer(1, &mint_keypair, &bob.pubkey()),
|
||||
bank.transfer(amount, &mint_keypair, &bob.pubkey()),
|
||||
Err(TransactionError::AccountInUse)
|
||||
);
|
||||
|
||||
drop(lock_result);
|
||||
|
||||
assert!(bank.transfer(2, &mint_keypair, &bob.pubkey()).is_ok());
|
||||
assert!(bank
|
||||
.transfer(2 * amount, &mint_keypair, &bob.pubkey())
|
||||
.is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -11036,16 +11078,18 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_bank_pay_to_self() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let key1 = Keypair::new();
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
bank.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
assert_eq!(bank.get_balance(&key1.pubkey()), 1);
|
||||
let tx = system_transaction::transfer(&key1, &key1.pubkey(), 1, genesis_config.hash());
|
||||
bank.transfer(amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
assert_eq!(bank.get_balance(&key1.pubkey()), amount);
|
||||
let tx = system_transaction::transfer(&key1, &key1.pubkey(), amount, genesis_config.hash());
|
||||
let _res = bank.process_transaction(&tx);
|
||||
|
||||
assert_eq!(bank.get_balance(&key1.pubkey()), 1);
|
||||
assert_eq!(bank.get_balance(&key1.pubkey()), amount);
|
||||
bank.get_signature_status(&tx.signatures[0])
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
|
@ -11068,12 +11112,16 @@ pub(crate) mod tests {
|
|||
/// Verifies that transactions are dropped if they have already been processed
|
||||
#[test]
|
||||
fn test_tx_already_processed() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
|
||||
let key1 = Keypair::new();
|
||||
let mut tx =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let mut tx = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
genesis_config.hash(),
|
||||
);
|
||||
|
||||
// First process `tx` so that the status cache is updated
|
||||
assert_eq!(bank.process_transaction(&tx), Ok(()));
|
||||
|
@ -11098,12 +11146,17 @@ pub(crate) mod tests {
|
|||
/// Verifies that last ids and status cache are correctly referenced from parent
|
||||
#[test]
|
||||
fn test_bank_parent_already_processed() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let key1 = Keypair::new();
|
||||
let parent = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let tx =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let tx = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
amount,
|
||||
genesis_config.hash(),
|
||||
);
|
||||
assert_eq!(parent.process_transaction(&tx), Ok(()));
|
||||
let bank = new_from_parent(&parent);
|
||||
assert_eq!(
|
||||
|
@ -11115,32 +11168,38 @@ pub(crate) mod tests {
|
|||
/// Verifies that last ids and accounts are correctly referenced from parent
|
||||
#[test]
|
||||
fn test_bank_parent_account_spend() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let key1 = Keypair::new();
|
||||
let key2 = Keypair::new();
|
||||
let parent = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let tx =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let tx = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
amount,
|
||||
genesis_config.hash(),
|
||||
);
|
||||
assert_eq!(parent.process_transaction(&tx), Ok(()));
|
||||
let bank = new_from_parent(&parent);
|
||||
let tx = system_transaction::transfer(&key1, &key2.pubkey(), 1, genesis_config.hash());
|
||||
let tx = system_transaction::transfer(&key1, &key2.pubkey(), amount, genesis_config.hash());
|
||||
assert_eq!(bank.process_transaction(&tx), Ok(()));
|
||||
assert_eq!(parent.get_signature_status(&tx.signatures[0]), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bank_hash_internal_state() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank0 = Bank::new_for_tests(&genesis_config);
|
||||
let bank1 = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let initial_state = bank0.hash_internal_state();
|
||||
assert_eq!(bank1.hash_internal_state(), initial_state);
|
||||
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
bank0.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank0.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_ne!(bank0.hash_internal_state(), initial_state);
|
||||
bank1.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
|
||||
|
||||
// Checkpointing should always result in a new state
|
||||
|
@ -11149,7 +11208,7 @@ pub(crate) mod tests {
|
|||
|
||||
let pubkey2 = solana_sdk::pubkey::new_rand();
|
||||
info!("transfer 2 {}", pubkey2);
|
||||
bank2.transfer(10, &mint_keypair, &pubkey2).unwrap();
|
||||
bank2.transfer(amount, &mint_keypair, &pubkey2).unwrap();
|
||||
bank2.update_accounts_hash();
|
||||
assert!(bank2.verify_bank_hash(true, false, false));
|
||||
}
|
||||
|
@ -11157,12 +11216,13 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_bank_hash_internal_state_verify() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank0 = Bank::new_for_tests(&genesis_config);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
info!("transfer 0 {} mint: {}", pubkey, mint_keypair.pubkey());
|
||||
bank0.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank0.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
|
||||
let bank0_state = bank0.hash_internal_state();
|
||||
let bank0 = Arc::new(bank0);
|
||||
|
@ -11184,7 +11244,7 @@ pub(crate) mod tests {
|
|||
|
||||
let pubkey2 = solana_sdk::pubkey::new_rand();
|
||||
info!("transfer 2 {}", pubkey2);
|
||||
bank2.transfer(10, &mint_keypair, &pubkey2).unwrap();
|
||||
bank2.transfer(amount, &mint_keypair, &pubkey2).unwrap();
|
||||
bank2.update_accounts_hash();
|
||||
assert!(bank2.verify_bank_hash(true, false, false));
|
||||
assert!(bank3.verify_bank_hash(true, false, false));
|
||||
|
@ -11202,9 +11262,14 @@ pub(crate) mod tests {
|
|||
fn test_verify_snapshot_bank() {
|
||||
solana_logger::setup();
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
bank.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank.transfer(
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
&mint_keypair,
|
||||
&pubkey,
|
||||
)
|
||||
.unwrap();
|
||||
bank.freeze();
|
||||
bank.update_accounts_hash();
|
||||
assert!(bank.verify_snapshot_bank(true, false, None));
|
||||
|
@ -11218,7 +11283,8 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_bank_hash_internal_state_same_account_different_fork() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let initial_state = bank0.hash_internal_state();
|
||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||
|
@ -11226,13 +11292,13 @@ pub(crate) mod tests {
|
|||
|
||||
info!("transfer bank1");
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
bank1.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_ne!(bank1.hash_internal_state(), initial_state);
|
||||
|
||||
info!("transfer bank2");
|
||||
// bank2 should not hash the same as bank1
|
||||
let bank2 = Bank::new_from_parent(&bank0, &Pubkey::default(), 2);
|
||||
bank2.transfer(1_000, &mint_keypair, &pubkey).unwrap();
|
||||
bank2.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
assert_ne!(bank2.hash_internal_state(), initial_state);
|
||||
assert_ne!(bank1.hash_internal_state(), bank2.hash_internal_state());
|
||||
}
|
||||
|
@ -11248,17 +11314,18 @@ pub(crate) mod tests {
|
|||
// of hash_internal_state
|
||||
#[test]
|
||||
fn test_hash_internal_state_order() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let bank0 = Bank::new_for_tests(&genesis_config);
|
||||
let bank1 = Bank::new_for_tests(&genesis_config);
|
||||
assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
|
||||
let key0 = solana_sdk::pubkey::new_rand();
|
||||
let key1 = solana_sdk::pubkey::new_rand();
|
||||
bank0.transfer(10, &mint_keypair, &key0).unwrap();
|
||||
bank0.transfer(20, &mint_keypair, &key1).unwrap();
|
||||
bank0.transfer(amount, &mint_keypair, &key0).unwrap();
|
||||
bank0.transfer(amount * 2, &mint_keypair, &key1).unwrap();
|
||||
|
||||
bank1.transfer(20, &mint_keypair, &key1).unwrap();
|
||||
bank1.transfer(10, &mint_keypair, &key0).unwrap();
|
||||
bank1.transfer(amount * 2, &mint_keypair, &key1).unwrap();
|
||||
bank1.transfer(amount, &mint_keypair, &key0).unwrap();
|
||||
|
||||
assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());
|
||||
}
|
||||
|
@ -11266,19 +11333,22 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_hash_internal_state_error() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let key0 = solana_sdk::pubkey::new_rand();
|
||||
bank.transfer(10, &mint_keypair, &key0).unwrap();
|
||||
bank.transfer(amount, &mint_keypair, &key0).unwrap();
|
||||
let orig = bank.hash_internal_state();
|
||||
|
||||
// Transfer will error but still take a fee
|
||||
assert!(bank.transfer(1000, &mint_keypair, &key0).is_err());
|
||||
assert!(bank
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key0)
|
||||
.is_err());
|
||||
assert_ne!(orig, bank.hash_internal_state());
|
||||
|
||||
let orig = bank.hash_internal_state();
|
||||
let empty_keypair = Keypair::new();
|
||||
assert!(bank.transfer(1000, &empty_keypair, &key0).is_err());
|
||||
assert!(bank.transfer(amount, &empty_keypair, &key0).is_err());
|
||||
assert_eq!(orig, bank.hash_internal_state());
|
||||
}
|
||||
|
||||
|
@ -11304,13 +11374,18 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_bank_squash() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(2);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(2.));
|
||||
let key1 = Keypair::new();
|
||||
let key2 = Keypair::new();
|
||||
let parent = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let tx_transfer_mint_to_1 =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let tx_transfer_mint_to_1 = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
amount,
|
||||
genesis_config.hash(),
|
||||
);
|
||||
trace!("parent process tx ");
|
||||
assert_eq!(parent.process_transaction(&tx_transfer_mint_to_1), Ok(()));
|
||||
trace!("done parent process tx ");
|
||||
|
@ -11330,7 +11405,7 @@ pub(crate) mod tests {
|
|||
|
||||
assert_eq!(bank.transaction_count(), parent.transaction_count());
|
||||
let tx_transfer_1_to_2 =
|
||||
system_transaction::transfer(&key1, &key2.pubkey(), 1, genesis_config.hash());
|
||||
system_transaction::transfer(&key1, &key2.pubkey(), amount, genesis_config.hash());
|
||||
assert_eq!(bank.process_transaction(&tx_transfer_1_to_2), Ok(()));
|
||||
assert_eq!(bank.transaction_count(), 2);
|
||||
assert_eq!(parent.transaction_count(), 1);
|
||||
|
@ -11343,7 +11418,7 @@ pub(crate) mod tests {
|
|||
// first time these should match what happened above, assert that parents are ok
|
||||
assert_eq!(bank.get_balance(&key1.pubkey()), 0);
|
||||
assert_eq!(bank.get_account(&key1.pubkey()), None);
|
||||
assert_eq!(bank.get_balance(&key2.pubkey()), 1);
|
||||
assert_eq!(bank.get_balance(&key2.pubkey()), amount);
|
||||
trace!("start");
|
||||
assert_eq!(
|
||||
bank.get_signature_status(&tx_transfer_mint_to_1.signatures[0]),
|
||||
|
@ -11365,49 +11440,61 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_bank_get_account_in_parent_after_squash() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let parent = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let key1 = Keypair::new();
|
||||
|
||||
parent.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
assert_eq!(parent.get_balance(&key1.pubkey()), 1);
|
||||
parent
|
||||
.transfer(amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
assert_eq!(parent.get_balance(&key1.pubkey()), amount);
|
||||
let bank = new_from_parent(&parent);
|
||||
bank.squash();
|
||||
assert_eq!(parent.get_balance(&key1.pubkey()), 1);
|
||||
assert_eq!(parent.get_balance(&key1.pubkey()), amount);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bank_get_account_in_parent_after_squash2() {
|
||||
solana_logger::setup();
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let key1 = Keypair::new();
|
||||
|
||||
bank0.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
assert_eq!(bank0.get_balance(&key1.pubkey()), 1);
|
||||
bank0
|
||||
.transfer(amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
assert_eq!(bank0.get_balance(&key1.pubkey()), amount);
|
||||
|
||||
let bank1 = Arc::new(Bank::new_from_parent(&bank0, &Pubkey::default(), 1));
|
||||
bank1.transfer(3, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank1
|
||||
.transfer(3 * amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
let bank2 = Arc::new(Bank::new_from_parent(&bank0, &Pubkey::default(), 2));
|
||||
bank2.transfer(2, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank2
|
||||
.transfer(2 * amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
let bank3 = Arc::new(Bank::new_from_parent(&bank1, &Pubkey::default(), 3));
|
||||
bank1.squash();
|
||||
|
||||
// This picks up the values from 1 which is the highest root:
|
||||
// TODO: if we need to access rooted banks older than this,
|
||||
// need to fix the lookup.
|
||||
assert_eq!(bank0.get_balance(&key1.pubkey()), 4);
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 4);
|
||||
assert_eq!(bank2.get_balance(&key1.pubkey()), 3);
|
||||
assert_eq!(bank0.get_balance(&key1.pubkey()), 4 * amount);
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 4 * amount);
|
||||
assert_eq!(bank2.get_balance(&key1.pubkey()), 3 * amount);
|
||||
bank3.squash();
|
||||
assert_eq!(bank1.get_balance(&key1.pubkey()), 4);
|
||||
assert_eq!(bank1.get_balance(&key1.pubkey()), 4 * amount);
|
||||
|
||||
let bank4 = Arc::new(Bank::new_from_parent(&bank3, &Pubkey::default(), 4));
|
||||
bank4.transfer(4, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
assert_eq!(bank4.get_balance(&key1.pubkey()), 8);
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 4);
|
||||
bank4
|
||||
.transfer(4 * amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
assert_eq!(bank4.get_balance(&key1.pubkey()), 8 * amount);
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 4 * amount);
|
||||
bank4.squash();
|
||||
let bank5 = Arc::new(Bank::new_from_parent(&bank4, &Pubkey::default(), 5));
|
||||
bank5.squash();
|
||||
|
@ -11417,39 +11504,40 @@ pub(crate) mod tests {
|
|||
// This picks up the values from 4 which is the highest root:
|
||||
// TODO: if we need to access rooted banks older than this,
|
||||
// need to fix the lookup.
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 8);
|
||||
assert_eq!(bank2.get_balance(&key1.pubkey()), 8);
|
||||
assert_eq!(bank3.get_balance(&key1.pubkey()), 8 * amount);
|
||||
assert_eq!(bank2.get_balance(&key1.pubkey()), 8 * amount);
|
||||
|
||||
assert_eq!(bank4.get_balance(&key1.pubkey()), 8);
|
||||
assert_eq!(bank4.get_balance(&key1.pubkey()), 8 * amount);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bank_get_account_modified_since_parent_with_fixed_root() {
|
||||
let pubkey = solana_sdk::pubkey::new_rand();
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
let bank1 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
bank1.transfer(1, &mint_keypair, &pubkey).unwrap();
|
||||
bank1.transfer(amount, &mint_keypair, &pubkey).unwrap();
|
||||
let result = bank1.get_account_modified_since_parent_with_fixed_root(&pubkey);
|
||||
assert!(result.is_some());
|
||||
let (account, slot) = result.unwrap();
|
||||
assert_eq!(account.lamports(), 1);
|
||||
assert_eq!(account.lamports(), amount);
|
||||
assert_eq!(slot, 0);
|
||||
|
||||
let bank2 = Arc::new(Bank::new_from_parent(&bank1, &Pubkey::default(), 1));
|
||||
assert!(bank2
|
||||
.get_account_modified_since_parent_with_fixed_root(&pubkey)
|
||||
.is_none());
|
||||
bank2.transfer(100, &mint_keypair, &pubkey).unwrap();
|
||||
bank2.transfer(2 * amount, &mint_keypair, &pubkey).unwrap();
|
||||
let result = bank1.get_account_modified_since_parent_with_fixed_root(&pubkey);
|
||||
assert!(result.is_some());
|
||||
let (account, slot) = result.unwrap();
|
||||
assert_eq!(account.lamports(), 1);
|
||||
assert_eq!(account.lamports(), amount);
|
||||
assert_eq!(slot, 0);
|
||||
let result = bank2.get_account_modified_since_parent_with_fixed_root(&pubkey);
|
||||
assert!(result.is_some());
|
||||
let (account, slot) = result.unwrap();
|
||||
assert_eq!(account.lamports(), 101);
|
||||
assert_eq!(account.lamports(), 3 * amount);
|
||||
assert_eq!(slot, 1);
|
||||
|
||||
bank1.squash();
|
||||
|
@ -11737,11 +11825,15 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_is_delta_true() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let bank = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let key1 = Keypair::new();
|
||||
let tx_transfer_mint_to_1 =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let tx_transfer_mint_to_1 = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
genesis_config.hash(),
|
||||
);
|
||||
assert_eq!(bank.process_transaction(&tx_transfer_mint_to_1), Ok(()));
|
||||
assert!(bank.is_delta.load(Relaxed));
|
||||
|
||||
|
@ -11757,7 +11849,7 @@ pub(crate) mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_is_empty() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let key1 = Keypair::new();
|
||||
|
||||
|
@ -11765,15 +11857,19 @@ pub(crate) mod tests {
|
|||
assert!(bank0.is_empty());
|
||||
|
||||
// Set is_delta to true, bank is no longer empty
|
||||
let tx_transfer_mint_to_1 =
|
||||
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_config.hash());
|
||||
let tx_transfer_mint_to_1 = system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&key1.pubkey(),
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
genesis_config.hash(),
|
||||
);
|
||||
assert_eq!(bank0.process_transaction(&tx_transfer_mint_to_1), Ok(()));
|
||||
assert!(!bank0.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bank_inherit_tx_count() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(500);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
|
||||
// Bank 1
|
||||
|
@ -11790,7 +11886,7 @@ pub(crate) mod tests {
|
|||
bank1.process_transaction(&system_transaction::transfer(
|
||||
&mint_keypair,
|
||||
&Keypair::new().pubkey(),
|
||||
1,
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
genesis_config.hash(),
|
||||
)),
|
||||
Ok(())
|
||||
|
@ -13585,7 +13681,7 @@ pub(crate) mod tests {
|
|||
let transaction_context = &invoke_context.transaction_context;
|
||||
let instruction_context = transaction_context.get_current_instruction_context()?;
|
||||
let instruction_data = instruction_context.get_instruction_data();
|
||||
let lamports = instruction_data[0] as u64;
|
||||
let lamports = u64::from_le_bytes(instruction_data.try_into().unwrap());
|
||||
instruction_context
|
||||
.try_borrow_instruction_account(transaction_context, 2)?
|
||||
.checked_sub_lamports(lamports)?;
|
||||
|
@ -13607,7 +13703,7 @@ pub(crate) mod tests {
|
|||
let from_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let to_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let dup_pubkey = from_pubkey;
|
||||
let from_account = AccountSharedData::new(100, 1, &mock_program_id);
|
||||
let from_account = AccountSharedData::new(sol_to_lamports(100.), 1, &mock_program_id);
|
||||
let to_account = AccountSharedData::new(0, 1, &mock_program_id);
|
||||
bank.store_account(&from_pubkey, &from_account);
|
||||
bank.store_account(&to_pubkey, &to_account);
|
||||
|
@ -13617,7 +13713,8 @@ pub(crate) mod tests {
|
|||
AccountMeta::new(to_pubkey, false),
|
||||
AccountMeta::new(dup_pubkey, false),
|
||||
];
|
||||
let instruction = Instruction::new_with_bincode(mock_program_id, &10, account_metas);
|
||||
let instruction =
|
||||
Instruction::new_with_bincode(mock_program_id, &sol_to_lamports(10.), account_metas);
|
||||
let tx = Transaction::new_signed_with_payer(
|
||||
&[instruction],
|
||||
Some(&mint_keypair.pubkey()),
|
||||
|
@ -13627,8 +13724,8 @@ pub(crate) mod tests {
|
|||
|
||||
let result = bank.process_transaction(&tx);
|
||||
assert_eq!(result, Ok(()));
|
||||
assert_eq!(bank.get_balance(&from_pubkey), 80);
|
||||
assert_eq!(bank.get_balance(&to_pubkey), 20);
|
||||
assert_eq!(bank.get_balance(&from_pubkey), sol_to_lamports(80.));
|
||||
assert_eq!(bank.get_balance(&to_pubkey), sol_to_lamports(20.));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -16899,8 +16996,9 @@ pub(crate) mod tests {
|
|||
//! 4. A key with zero lamports is in both an unrooted _and_ rooted bank (key5)
|
||||
//! - In this case, key5's ref-count should be decremented correctly
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
let collector = Pubkey::new_unique();
|
||||
let owner = Pubkey::new_unique();
|
||||
|
@ -16910,12 +17008,16 @@ pub(crate) mod tests {
|
|||
let key3 = Keypair::new(); // touched in both bank1 and bank2
|
||||
let key4 = Keypair::new(); // in only bank1, and has zero lamports
|
||||
let key5 = Keypair::new(); // in both bank1 and bank2, and has zero lamports
|
||||
bank0.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank0
|
||||
.transfer(amount, &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank0.freeze();
|
||||
|
||||
let slot = 1;
|
||||
let bank1 = Bank::new_from_parent(&bank0, &collector, slot);
|
||||
bank1.transfer(3, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank1
|
||||
.transfer(amount, &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
bank1.store_account(&key4.pubkey(), &AccountSharedData::new(0, 0, &owner));
|
||||
bank1.store_account(&key5.pubkey(), &AccountSharedData::new(0, 0, &owner));
|
||||
|
||||
|
@ -16925,8 +17027,12 @@ pub(crate) mod tests {
|
|||
|
||||
let slot = slot + 1;
|
||||
let bank2 = Bank::new_from_parent(&bank0, &collector, slot);
|
||||
bank2.transfer(4, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank2.transfer(6, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank2
|
||||
.transfer(amount * 2, &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank2
|
||||
.transfer(amount, &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
bank2.store_account(&key5.pubkey(), &AccountSharedData::new(0, 0, &owner));
|
||||
|
||||
bank2.freeze(); // the freeze here is not strictly necessary, but more for illustration
|
||||
|
@ -17510,7 +17616,9 @@ pub(crate) mod tests {
|
|||
&mint_keypair,
|
||||
&Keypair::new(),
|
||||
bank.last_blockhash(),
|
||||
1,
|
||||
genesis_config
|
||||
.rent
|
||||
.minimum_balance(ACCOUNT_SIZE.try_into().unwrap()),
|
||||
ACCOUNT_SIZE,
|
||||
&solana_sdk::system_program::id(),
|
||||
);
|
||||
|
@ -17548,14 +17656,16 @@ pub(crate) mod tests {
|
|||
#[test]
|
||||
fn test_accounts_data_size_with_good_transaction() {
|
||||
const ACCOUNT_SIZE: u64 = MAX_PERMITTED_DATA_LENGTH;
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000_000_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000.));
|
||||
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||
bank.activate_feature(&feature_set::cap_accounts_data_len::id());
|
||||
let transaction = system_transaction::create_account(
|
||||
&mint_keypair,
|
||||
&Keypair::new(),
|
||||
bank.last_blockhash(),
|
||||
LAMPORTS_PER_SOL,
|
||||
genesis_config
|
||||
.rent
|
||||
.minimum_balance(ACCOUNT_SIZE.try_into().unwrap()),
|
||||
ACCOUNT_SIZE,
|
||||
&solana_sdk::system_program::id(),
|
||||
);
|
||||
|
@ -17730,8 +17840,6 @@ pub(crate) mod tests {
|
|||
INITIAL_RENT_EPOCH + 1,
|
||||
),
|
||||
);
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||
bank.add_builtin(
|
||||
|
@ -17820,9 +17928,6 @@ pub(crate) mod tests {
|
|||
let account_data_size = 100;
|
||||
let rent_exempt_minimum = genesis_config.rent.minimum_balance(account_data_size);
|
||||
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||
bank.add_builtin(
|
||||
"mock_program",
|
||||
|
@ -17964,8 +18069,6 @@ pub(crate) mod tests {
|
|||
..
|
||||
} = create_genesis_config_with_leader(sol_to_lamports(100.), &Pubkey::new_unique(), 42);
|
||||
genesis_config.rent = Rent::default();
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let validator_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let validator_stake_lamports = sol_to_lamports(1.);
|
||||
|
@ -18047,9 +18150,6 @@ pub(crate) mod tests {
|
|||
Account::new(rent_exempt_minimum, 0, &system_program::id()),
|
||||
);
|
||||
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let recent_blockhash = bank.last_blockhash();
|
||||
|
||||
|
@ -18280,9 +18380,6 @@ pub(crate) mod tests {
|
|||
genesis_config.rent = Rent::default();
|
||||
let rent_exempt_minimum = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
|
||||
for amount in [rent_exempt_minimum - 1, rent_exempt_minimum] {
|
||||
|
@ -18299,8 +18396,6 @@ pub(crate) mod tests {
|
|||
..
|
||||
} = create_genesis_config_with_leader(sol_to_lamports(100.), &Pubkey::new_unique(), 42);
|
||||
genesis_config.rent = Rent::default();
|
||||
// Activate features, including require_rent_exempt_accounts
|
||||
activate_all_features(&mut genesis_config);
|
||||
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let recipient = Pubkey::new_unique();
|
||||
|
|
|
@ -55,29 +55,19 @@ impl Bank {
|
|||
post_state_infos: &[TransactionAccountStateInfo],
|
||||
transaction_context: &TransactionContext,
|
||||
) -> Result<()> {
|
||||
let require_rent_exempt_accounts = self
|
||||
.feature_set
|
||||
.is_active(&feature_set::require_rent_exempt_accounts::id());
|
||||
let include_account_index_in_err = self
|
||||
.feature_set
|
||||
.is_active(&feature_set::include_account_index_in_rent_error::id());
|
||||
for (i, (pre_state_info, post_state_info)) in
|
||||
pre_state_infos.iter().zip(post_state_infos).enumerate()
|
||||
{
|
||||
if let Err(err) = check_rent_state(
|
||||
check_rent_state(
|
||||
pre_state_info.rent_state.as_ref(),
|
||||
post_state_info.rent_state.as_ref(),
|
||||
transaction_context,
|
||||
i,
|
||||
include_account_index_in_err,
|
||||
) {
|
||||
// Feature gate only wraps the actual error return so that the metrics and debug
|
||||
// logging generated by `check_rent_state()` can be examined before feature
|
||||
// activation
|
||||
if require_rent_exempt_accounts {
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -330,22 +330,27 @@ impl BankClient {
|
|||
mod tests {
|
||||
use {
|
||||
super::*,
|
||||
solana_sdk::{genesis_config::create_genesis_config, instruction::AccountMeta},
|
||||
solana_sdk::{
|
||||
genesis_config::create_genesis_config, instruction::AccountMeta,
|
||||
native_token::sol_to_lamports,
|
||||
},
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn test_bank_client_new_with_keypairs() {
|
||||
let (genesis_config, john_doe_keypair) = create_genesis_config(10_000);
|
||||
let (genesis_config, john_doe_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let john_pubkey = john_doe_keypair.pubkey();
|
||||
let jane_doe_keypair = Keypair::new();
|
||||
let jane_pubkey = jane_doe_keypair.pubkey();
|
||||
let doe_keypairs = vec![&john_doe_keypair, &jane_doe_keypair];
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let bank_client = BankClient::new(bank);
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
// Create 2-2 Multisig Transfer instruction.
|
||||
let bob_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let mut transfer_instruction = system_instruction::transfer(&john_pubkey, &bob_pubkey, 42);
|
||||
let mut transfer_instruction =
|
||||
system_instruction::transfer(&john_pubkey, &bob_pubkey, amount);
|
||||
transfer_instruction
|
||||
.accounts
|
||||
.push(AccountMeta::new(jane_pubkey, true));
|
||||
|
@ -354,6 +359,6 @@ mod tests {
|
|||
bank_client
|
||||
.send_and_confirm_message(&doe_keypairs, message)
|
||||
.unwrap();
|
||||
assert_eq!(bank_client.get_balance(&bob_pubkey).unwrap(), 42);
|
||||
assert_eq!(bank_client.get_balance(&bob_pubkey).unwrap(), amount);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2091,6 +2091,7 @@ mod tests {
|
|||
bincode::{deserialize_from, serialize_into},
|
||||
solana_sdk::{
|
||||
genesis_config::create_genesis_config,
|
||||
native_token::sol_to_lamports,
|
||||
signature::{Keypair, Signer},
|
||||
system_transaction,
|
||||
transaction::SanitizedTransaction,
|
||||
|
@ -3038,41 +3039,59 @@ mod tests {
|
|||
let key4 = Keypair::new();
|
||||
let key5 = Keypair::new();
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
bank0.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank0.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank0.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
while !bank0.is_complete() {
|
||||
bank0.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = 1;
|
||||
let bank1 = Arc::new(Bank::new_from_parent(&bank0, &collector, slot));
|
||||
bank1.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank1.transfer(4, &mint_keypair, &key4.pubkey()).unwrap();
|
||||
bank1.transfer(5, &mint_keypair, &key5.pubkey()).unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(4.), &mint_keypair, &key4.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(5.), &mint_keypair, &key5.pubkey())
|
||||
.unwrap();
|
||||
while !bank1.is_complete() {
|
||||
bank1.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank2 = Arc::new(Bank::new_from_parent(&bank1, &collector, slot));
|
||||
bank2.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank2
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank2.is_complete() {
|
||||
bank2.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank3 = Arc::new(Bank::new_from_parent(&bank2, &collector, slot));
|
||||
bank3.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank3
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank3.is_complete() {
|
||||
bank3.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank4 = Arc::new(Bank::new_from_parent(&bank3, &collector, slot));
|
||||
bank4.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank4
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank4.is_complete() {
|
||||
bank4.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
@ -3137,20 +3156,32 @@ mod tests {
|
|||
let key4 = Keypair::new();
|
||||
let key5 = Keypair::new();
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
bank0.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank0.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank0.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
while !bank0.is_complete() {
|
||||
bank0.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = 1;
|
||||
let bank1 = Arc::new(Bank::new_from_parent(&bank0, &collector, slot));
|
||||
bank1.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank1.transfer(4, &mint_keypair, &key4.pubkey()).unwrap();
|
||||
bank1.transfer(5, &mint_keypair, &key5.pubkey()).unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(4.), &mint_keypair, &key4.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(5.), &mint_keypair, &key5.pubkey())
|
||||
.unwrap();
|
||||
while !bank1.is_complete() {
|
||||
bank1.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
@ -3176,21 +3207,27 @@ mod tests {
|
|||
|
||||
let slot = slot + 1;
|
||||
let bank2 = Arc::new(Bank::new_from_parent(&bank1, &collector, slot));
|
||||
bank2.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank2
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank2.is_complete() {
|
||||
bank2.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank3 = Arc::new(Bank::new_from_parent(&bank2, &collector, slot));
|
||||
bank3.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank3
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank3.is_complete() {
|
||||
bank3.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank4 = Arc::new(Bank::new_from_parent(&bank3, &collector, slot));
|
||||
bank4.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank4
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank4.is_complete() {
|
||||
bank4.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
@ -3240,20 +3277,32 @@ mod tests {
|
|||
let key2 = Keypair::new();
|
||||
let key3 = Keypair::new();
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
|
||||
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
|
||||
bank0.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank0.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank0.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank0
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
while !bank0.is_complete() {
|
||||
bank0.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = 1;
|
||||
let bank1 = Arc::new(Bank::new_from_parent(&bank0, &collector, slot));
|
||||
bank1.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank1.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank1.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
bank1
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
while !bank1.is_complete() {
|
||||
bank1.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
@ -3279,21 +3328,27 @@ mod tests {
|
|||
|
||||
let slot = slot + 1;
|
||||
let bank2 = Arc::new(Bank::new_from_parent(&bank1, &collector, slot));
|
||||
bank2.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
||||
bank2
|
||||
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
|
||||
.unwrap();
|
||||
while !bank2.is_complete() {
|
||||
bank2.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank3 = Arc::new(Bank::new_from_parent(&bank2, &collector, slot));
|
||||
bank3.transfer(2, &mint_keypair, &key2.pubkey()).unwrap();
|
||||
bank3
|
||||
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
|
||||
.unwrap();
|
||||
while !bank3.is_complete() {
|
||||
bank3.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
||||
let slot = slot + 1;
|
||||
let bank4 = Arc::new(Bank::new_from_parent(&bank3, &collector, slot));
|
||||
bank4.transfer(3, &mint_keypair, &key3.pubkey()).unwrap();
|
||||
bank4
|
||||
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
|
||||
.unwrap();
|
||||
while !bank4.is_complete() {
|
||||
bank4.register_tick(&Hash::new_unique());
|
||||
}
|
||||
|
@ -3370,9 +3425,9 @@ mod tests {
|
|||
let incremental_snapshot_archives_dir = tempfile::TempDir::new().unwrap();
|
||||
let snapshot_archive_format = ArchiveFormat::Tar;
|
||||
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
|
||||
|
||||
let lamports_to_transfer = 123_456;
|
||||
let lamports_to_transfer = sol_to_lamports(123_456.);
|
||||
let bank0 = Arc::new(Bank::new_with_paths_for_tests(
|
||||
&genesis_config,
|
||||
vec![accounts_dir.path().to_path_buf()],
|
||||
|
|
|
@ -599,6 +599,7 @@ mod tests {
|
|||
hash::{hash, Hash},
|
||||
instruction::{AccountMeta, Instruction, InstructionError},
|
||||
message::Message,
|
||||
native_token::sol_to_lamports,
|
||||
nonce::{
|
||||
self,
|
||||
state::{
|
||||
|
@ -1554,9 +1555,11 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_allocate() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let bank_client = BankClient::new(bank);
|
||||
let data_len = 2;
|
||||
let amount = genesis_config.rent.minimum_balance(data_len);
|
||||
|
||||
let alice_keypair = Keypair::new();
|
||||
let alice_pubkey = alice_keypair.pubkey();
|
||||
|
@ -1565,7 +1568,7 @@ mod tests {
|
|||
let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap();
|
||||
|
||||
bank_client
|
||||
.transfer_and_confirm(50, &mint_keypair, &alice_pubkey)
|
||||
.transfer_and_confirm(amount, &mint_keypair, &alice_pubkey)
|
||||
.unwrap();
|
||||
|
||||
let allocate_with_seed = Message::new(
|
||||
|
@ -1573,7 +1576,7 @@ mod tests {
|
|||
&alice_with_seed,
|
||||
&alice_pubkey,
|
||||
seed,
|
||||
2,
|
||||
data_len as u64,
|
||||
&owner,
|
||||
)],
|
||||
Some(&alice_pubkey),
|
||||
|
@ -1583,7 +1586,7 @@ mod tests {
|
|||
.send_and_confirm_message(&[&alice_keypair], allocate_with_seed)
|
||||
.is_ok());
|
||||
|
||||
let allocate = system_instruction::allocate(&alice_pubkey, 2);
|
||||
let allocate = system_instruction::allocate(&alice_pubkey, data_len as u64);
|
||||
|
||||
assert!(bank_client
|
||||
.send_and_confirm_instruction(&alice_keypair, allocate)
|
||||
|
@ -1605,7 +1608,7 @@ mod tests {
|
|||
let program = Pubkey::new_unique();
|
||||
let collector = Pubkey::new_unique();
|
||||
|
||||
let mint_lamports = 10000;
|
||||
let mint_lamports = sol_to_lamports(1.0);
|
||||
let len1 = 123;
|
||||
let len2 = 456;
|
||||
|
||||
|
@ -1618,27 +1621,35 @@ mod tests {
|
|||
.unwrap();
|
||||
|
||||
// create zero-lamports account to be cleaned
|
||||
let account = AccountSharedData::new(0, len1, &program);
|
||||
let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1));
|
||||
let bank_client = BankClient::new_shared(&bank);
|
||||
let ix = system_instruction::create_account(&alice_pubkey, &bob_pubkey, 0, len1, &program);
|
||||
let message = Message::new(&[ix], Some(&alice_keypair.pubkey()));
|
||||
let r = bank_client.send_and_confirm_message(&[&alice_keypair, &bob_keypair], message);
|
||||
assert!(r.is_ok());
|
||||
bank.store_account(&bob_pubkey, &account);
|
||||
|
||||
// transfer some to bogus pubkey just to make previous bank (=slot) really cleanable
|
||||
let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1));
|
||||
let bank_client = BankClient::new_shared(&bank);
|
||||
bank_client
|
||||
.transfer_and_confirm(50, &alice_keypair, &Pubkey::new_unique())
|
||||
.transfer_and_confirm(
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
&alice_keypair,
|
||||
&Pubkey::new_unique(),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// super fun time; callback chooses to .clean_accounts(None) or not
|
||||
callback(&*bank);
|
||||
|
||||
// create a normal account at the same pubkey as the zero-lamports account
|
||||
let lamports = genesis_config.rent.minimum_balance(len2);
|
||||
let bank = Arc::new(Bank::new_from_parent(&bank, &collector, bank.slot() + 1));
|
||||
let bank_client = BankClient::new_shared(&bank);
|
||||
let ix = system_instruction::create_account(&alice_pubkey, &bob_pubkey, 1, len2, &program);
|
||||
let ix = system_instruction::create_account(
|
||||
&alice_pubkey,
|
||||
&bob_pubkey,
|
||||
lamports,
|
||||
len2 as u64,
|
||||
&program,
|
||||
);
|
||||
let message = Message::new(&[ix], Some(&alice_pubkey));
|
||||
let r = bank_client.send_and_confirm_message(&[&alice_keypair, &bob_keypair], message);
|
||||
assert!(r.is_ok());
|
||||
|
@ -1666,7 +1677,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_assign_with_seed() {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let bank_client = BankClient::new(bank);
|
||||
|
||||
|
@ -1677,7 +1688,11 @@ mod tests {
|
|||
let alice_with_seed = Pubkey::create_with_seed(&alice_pubkey, seed, &owner).unwrap();
|
||||
|
||||
bank_client
|
||||
.transfer_and_confirm(50, &mint_keypair, &alice_pubkey)
|
||||
.transfer_and_confirm(
|
||||
genesis_config.rent.minimum_balance(0),
|
||||
&mint_keypair,
|
||||
&alice_pubkey,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let assign_with_seed = Message::new(
|
||||
|
@ -1697,16 +1712,17 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_system_unsigned_transaction() {
|
||||
let (genesis_config, alice_keypair) = create_genesis_config(100);
|
||||
let (genesis_config, alice_keypair) = create_genesis_config(sol_to_lamports(1.0));
|
||||
let alice_pubkey = alice_keypair.pubkey();
|
||||
let mallory_keypair = Keypair::new();
|
||||
let mallory_pubkey = mallory_keypair.pubkey();
|
||||
let amount = genesis_config.rent.minimum_balance(0);
|
||||
|
||||
// Fund to account to bypass AccountNotFound error
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let bank_client = BankClient::new(bank);
|
||||
bank_client
|
||||
.transfer_and_confirm(50, &alice_keypair, &mallory_pubkey)
|
||||
.transfer_and_confirm(amount, &alice_keypair, &mallory_pubkey)
|
||||
.unwrap();
|
||||
|
||||
// Erroneously sign transaction with recipient account key
|
||||
|
@ -1717,7 +1733,7 @@ mod tests {
|
|||
];
|
||||
let malicious_instruction = Instruction::new_with_bincode(
|
||||
system_program::id(),
|
||||
&SystemInstruction::Transfer { lamports: 10 },
|
||||
&SystemInstruction::Transfer { lamports: amount },
|
||||
account_metas,
|
||||
);
|
||||
assert_eq!(
|
||||
|
@ -1727,8 +1743,11 @@ mod tests {
|
|||
.unwrap(),
|
||||
TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature)
|
||||
);
|
||||
assert_eq!(bank_client.get_balance(&alice_pubkey).unwrap(), 50);
|
||||
assert_eq!(bank_client.get_balance(&mallory_pubkey).unwrap(), 50);
|
||||
assert_eq!(
|
||||
bank_client.get_balance(&alice_pubkey).unwrap(),
|
||||
sol_to_lamports(1.0) - amount
|
||||
);
|
||||
assert_eq!(bank_client.get_balance(&mallory_pubkey).unwrap(), amount);
|
||||
}
|
||||
|
||||
fn process_nonce_instruction(
|
||||
|
|
|
@ -294,11 +294,12 @@ mod tests {
|
|||
solana_stake_program::stake_state,
|
||||
};
|
||||
|
||||
fn create_bank(lamports: u64) -> (Bank, Keypair, u64) {
|
||||
fn create_bank(lamports: u64) -> (Bank, Keypair, u64, u64) {
|
||||
let (genesis_config, mint_keypair) = create_genesis_config(lamports);
|
||||
let bank = Bank::new_for_tests(&genesis_config);
|
||||
let rent = bank.get_minimum_balance_for_rent_exemption(StakeState::size_of());
|
||||
(bank, mint_keypair, rent)
|
||||
let stake_rent = bank.get_minimum_balance_for_rent_exemption(StakeState::size_of());
|
||||
let system_rent = bank.get_minimum_balance_for_rent_exemption(0);
|
||||
(bank, mint_keypair, stake_rent, system_rent)
|
||||
}
|
||||
|
||||
fn create_account<C: SyncClient>(
|
||||
|
@ -352,15 +353,15 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_new_derived_stake_account() {
|
||||
let (bank, funding_keypair, rent) = create_bank(10_000_000);
|
||||
let (bank, funding_keypair, stake_rent, system_rent) = create_bank(10_000_000);
|
||||
let funding_pubkey = funding_keypair.pubkey();
|
||||
let bank_client = BankClient::new(bank);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, 1);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, system_rent);
|
||||
let fee_payer_pubkey = fee_payer_keypair.pubkey();
|
||||
|
||||
let base_keypair = Keypair::new();
|
||||
let base_pubkey = base_keypair.pubkey();
|
||||
let lamports = rent + 1;
|
||||
let lamports = stake_rent + 1;
|
||||
let stake_authority_pubkey = solana_sdk::pubkey::new_rand();
|
||||
let withdraw_authority_pubkey = solana_sdk::pubkey::new_rand();
|
||||
|
||||
|
@ -389,15 +390,15 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_authorize_stake_accounts() {
|
||||
let (bank, funding_keypair, rent) = create_bank(10_000_000);
|
||||
let (bank, funding_keypair, stake_rent, system_rent) = create_bank(10_000_000);
|
||||
let funding_pubkey = funding_keypair.pubkey();
|
||||
let bank_client = BankClient::new(bank);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, 1);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, system_rent);
|
||||
let fee_payer_pubkey = fee_payer_keypair.pubkey();
|
||||
|
||||
let base_keypair = Keypair::new();
|
||||
let base_pubkey = base_keypair.pubkey();
|
||||
let lamports = rent + 1;
|
||||
let lamports = stake_rent + 1;
|
||||
|
||||
let stake_authority_keypair = Keypair::new();
|
||||
let stake_authority_pubkey = stake_authority_keypair.pubkey();
|
||||
|
@ -451,15 +452,15 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_lockup_stake_accounts() {
|
||||
let (bank, funding_keypair, rent) = create_bank(10_000_000);
|
||||
let (bank, funding_keypair, stake_rent, system_rent) = create_bank(10_000_000);
|
||||
let funding_pubkey = funding_keypair.pubkey();
|
||||
let bank_client = BankClient::new(bank);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, 1);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, system_rent);
|
||||
let fee_payer_pubkey = fee_payer_keypair.pubkey();
|
||||
|
||||
let base_keypair = Keypair::new();
|
||||
let base_pubkey = base_keypair.pubkey();
|
||||
let lamports = rent + 1;
|
||||
let lamports = stake_rent + 1;
|
||||
|
||||
let custodian_keypair = Keypair::new();
|
||||
let custodian_pubkey = custodian_keypair.pubkey();
|
||||
|
@ -542,15 +543,15 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_rebase_stake_accounts() {
|
||||
let (bank, funding_keypair, rent) = create_bank(10_000_000);
|
||||
let (bank, funding_keypair, stake_rent, system_rent) = create_bank(10_000_000);
|
||||
let funding_pubkey = funding_keypair.pubkey();
|
||||
let bank_client = BankClient::new(bank);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, 1);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, system_rent);
|
||||
let fee_payer_pubkey = fee_payer_keypair.pubkey();
|
||||
|
||||
let base_keypair = Keypair::new();
|
||||
let base_pubkey = base_keypair.pubkey();
|
||||
let lamports = rent + 1;
|
||||
let lamports = stake_rent + 1;
|
||||
|
||||
let stake_authority_keypair = Keypair::new();
|
||||
let stake_authority_pubkey = stake_authority_keypair.pubkey();
|
||||
|
@ -605,15 +606,15 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_move_stake_accounts() {
|
||||
let (bank, funding_keypair, rent) = create_bank(10_000_000);
|
||||
let (bank, funding_keypair, stake_rent, system_rent) = create_bank(10_000_000);
|
||||
let funding_pubkey = funding_keypair.pubkey();
|
||||
let bank_client = BankClient::new(bank);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, 1);
|
||||
let fee_payer_keypair = create_account(&bank_client, &funding_keypair, system_rent);
|
||||
let fee_payer_pubkey = fee_payer_keypair.pubkey();
|
||||
|
||||
let base_keypair = Keypair::new();
|
||||
let base_pubkey = base_keypair.pubkey();
|
||||
let lamports = rent + 1;
|
||||
let lamports = stake_rent + 1;
|
||||
|
||||
let stake_authority_keypair = Keypair::new();
|
||||
let stake_authority_pubkey = stake_authority_keypair.pubkey();
|
||||
|
|
Loading…
Reference in New Issue