diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index df1d3fd46ef87a..cc2294056627bc 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -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( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 79e448395de3c4..c46cccb6758945 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -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(); diff --git a/runtime/src/bank/transaction_account_state_info.rs b/runtime/src/bank/transaction_account_state_info.rs index cbf34b27a0809d..824f231236842d 100644 --- a/runtime/src/bank/transaction_account_state_info.rs +++ b/runtime/src/bank/transaction_account_state_info.rs @@ -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(()) } diff --git a/runtime/src/bank_client.rs b/runtime/src/bank_client.rs index b8b4de33afcf0e..d9eb457126faab 100644 --- a/runtime/src/bank_client.rs +++ b/runtime/src/bank_client.rs @@ -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); } } diff --git a/runtime/src/snapshot_utils.rs b/runtime/src/snapshot_utils.rs index 2b52a8321cdc1c..edae1f6f506993 100644 --- a/runtime/src/snapshot_utils.rs +++ b/runtime/src/snapshot_utils.rs @@ -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()], diff --git a/runtime/src/system_instruction_processor.rs b/runtime/src/system_instruction_processor.rs index 8e4f753145ebed..5130057278739f 100644 --- a/runtime/src/system_instruction_processor.rs +++ b/runtime/src/system_instruction_processor.rs @@ -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( diff --git a/stake-accounts/src/stake_accounts.rs b/stake-accounts/src/stake_accounts.rs index 6f265dfefac456..62c8f01c37450a 100644 --- a/stake-accounts/src/stake_accounts.rs +++ b/stake-accounts/src/stake_accounts.rs @@ -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( @@ -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();