diff --git a/Cargo.lock b/Cargo.lock index 885c3cf74843e9..b72a397bc77bbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4995,6 +4995,7 @@ dependencies = [ name = "solana-program-test" version = "1.6.7" dependencies = [ + "assert_matches", "async-trait", "base64 0.12.3", "bincode", diff --git a/program-test/Cargo.toml b/program-test/Cargo.toml index 6040325652c9aa..9ccff1f29d7164 100644 --- a/program-test/Cargo.toml +++ b/program-test/Cargo.toml @@ -28,4 +28,5 @@ thiserror = "1.0" tokio = { version = "1", features = ["full"] } [dev-dependencies] +assert_matches = "1.3.0" solana-stake-program = { path = "../programs/stake", version = "=1.6.7" } diff --git a/program-test/src/lib.rs b/program-test/src/lib.rs index e7a4f28d8d5e6f..c221a02db9bf6b 100644 --- a/program-test/src/lib.rs +++ b/program-test/src/lib.rs @@ -662,7 +662,8 @@ impl ProgramTest { let rent = Rent::default(); let fee_rate_governor = FeeRateGovernor::default(); let bootstrap_validator_pubkey = Pubkey::new_unique(); - let bootstrap_validator_stake_lamports = rent.minimum_balance(VoteState::size_of()); + let bootstrap_validator_stake_lamports = + rent.minimum_balance(VoteState::size_of()) + sol_to_lamports(1_000_000.0); let mint_keypair = Keypair::new(); let voting_keypair = Keypair::new(); diff --git a/program-test/tests/warp.rs b/program-test/tests/warp.rs index 59cf304d3399e1..a4e55df785a4c5 100644 --- a/program-test/tests/warp.rs +++ b/program-test/tests/warp.rs @@ -1,5 +1,7 @@ #![allow(clippy::integer_arithmetic)] use { + assert_matches::assert_matches, + bincode::deserialize, solana_program_test::{processor, ProgramTest, ProgramTestError}, solana_sdk::{ account_info::{next_account_info, AccountInfo}, @@ -11,12 +13,16 @@ use { rent::Rent, signature::{Keypair, Signer}, system_instruction, system_program, - sysvar::{clock, Sysvar}, + sysvar::{ + clock, + stake_history::{self, StakeHistory}, + Sysvar, + }, transaction::{Transaction, TransactionError}, }, solana_stake_program::{ stake_instruction, - stake_state::{Authorized, Lockup}, + stake_state::{Authorized, Lockup, StakeState}, }, solana_vote_program::{ vote_instruction, @@ -248,4 +254,30 @@ async fn stake_rewards_from_warp() { .expect("account exists") .unwrap(); assert!(account.lamports > stake_lamports); + + // check that stake is fully active + let stake_history_account = context + .banks_client + .get_account(stake_history::id()) + .await + .expect("account exists") + .unwrap(); + + let clock_account = context + .banks_client + .get_account(clock::id()) + .await + .expect("account exists") + .unwrap(); + + let stake_state: StakeState = deserialize(&account.data).unwrap(); + let stake_history: StakeHistory = deserialize(&stake_history_account.data).unwrap(); + let clock: Clock = deserialize(&clock_account.data).unwrap(); + let stake = stake_state.stake().unwrap(); + assert_matches!( + stake + .delegation + .stake_activating_and_deactivating(clock.epoch, Some(&stake_history), true,), + (_, 0, 0) + ); }