use solana_sdk::signer::Signer;
use crate::common::test_runner::TestRunner;
pub mod common;
#[tokio::test]
async fn program_freeze() {
let mut tr = TestRunner::new(1_000_000).await.unwrap();
let stake_pool_owner = tr.create_user_with_ata().await.unwrap();
let recommender = tr.create_user_with_ata().await.unwrap();
let staker = tr.create_user_with_ata().await.unwrap();
let start_time = tr.get_current_time().await;
let fee_payer_balance = tr.fee_payer_sol_balance().await.unwrap();
println!("Fee payer balance: {}", fee_payer_balance);
tr.create_royalty(
&staker,
&recommender.pubkey(),
1000, (start_time + 3 * 86_400) as u64,
)
.await
.unwrap();
let create_royalty_fee = fee_payer_balance - tr.fee_payer_sol_balance().await.unwrap();
tr.create_royalty(
&stake_pool_owner,
&recommender.pubkey(),
2000, (start_time + 2 * 86_400 + 100) as u64,
)
.await
.unwrap();
let fee_payer_balance = tr.fee_payer_sol_balance().await.unwrap();
println!("Fee payer balance: {}", fee_payer_balance);
tr.mint(&staker.pubkey(), 10_200).await.unwrap();
let mint_fee = fee_payer_balance - tr.fee_payer_sol_balance().await.unwrap();
println!("Mint fee: {}", mint_fee);
tr.create_pool(&stake_pool_owner, 10_000)
.await
.unwrap();
tr.activate_stake_pool(&stake_pool_owner.pubkey())
.await
.unwrap();
tr.create_stake_account(&stake_pool_owner.pubkey(), &staker.pubkey())
.await
.unwrap();
tr.stake(&stake_pool_owner.pubkey(), &staker, 10_000)
.await
.unwrap();
tr.sleep(86400).await.unwrap();
tr.crank_pool(&stake_pool_owner.pubkey()).await.unwrap();
tr.claim_staker_rewards(&stake_pool_owner.pubkey(), &staker)
.await
.unwrap();
let stats = tr.staker_stats(staker.pubkey()).await.unwrap();
assert_eq!(stats.balance, 450_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 50_000);
tr.claim_pool_rewards(&stake_pool_owner).await.unwrap();
let stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(stats.balance, 400_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 150_000);
let fee_payer_balance = tr.fee_payer_sol_balance().await.unwrap();
println!("Fee payer balance: {}", fee_payer_balance);
tr.close_royalty(&staker).await.unwrap();
let close_royalty_fee = tr.fee_payer_sol_balance().await.unwrap() - fee_payer_balance;
assert_eq!(create_royalty_fee - 10_000, close_royalty_fee + 10_000);
tr.sleep(86400).await.unwrap();
tr.crank_pool(&stake_pool_owner.pubkey()).await.unwrap();
tr.claim_staker_rewards(&stake_pool_owner.pubkey(), &staker)
.await
.unwrap();
let stats = tr.staker_stats(staker.pubkey()).await.unwrap();
assert_eq!(stats.balance, 950_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 150_000);
tr.claim_pool_rewards(&stake_pool_owner).await.unwrap();
let stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(stats.balance, 800_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 250_000);
tr.sleep(86400).await.unwrap();
tr.crank_pool(&stake_pool_owner.pubkey()).await.unwrap();
tr.claim_staker_rewards(&stake_pool_owner.pubkey(), &staker)
.await
.unwrap();
let stats = tr.staker_stats(staker.pubkey()).await.unwrap();
assert_eq!(stats.balance, 950_000 + 500_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 250_000);
tr.claim_pool_rewards(&stake_pool_owner).await.unwrap();
let stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(stats.balance, 800_000 + 500_000);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 250_000);
let staker2 = tr.create_user_with_ata().await.unwrap();
tr.mint(&staker2.pubkey(), 10_000).await.unwrap();
tr.create_bond_v2(
&staker2.pubkey(),
&stake_pool_owner.pubkey(),
None,
)
.await
.unwrap();
tr.add_to_bond_v2(
&staker2,
&staker2.pubkey(),
&stake_pool_owner.pubkey(),
10_000,
None,
)
.await
.unwrap();
tr.create_royalty(
&staker2,
&recommender.pubkey(),
4000, (start_time + 1000 * 86_400) as u64,
)
.await
.unwrap();
for _ in 0..10 {
tr.sleep(86400).await.unwrap();
tr.crank_pool(&stake_pool_owner.pubkey()).await.unwrap();
}
tr.claim_bond_v2_rewards(&staker2, &stake_pool_owner.pubkey(), None)
.await
.unwrap();
let stats = tr.staker_stats(staker2.pubkey()).await.unwrap();
assert_eq!(stats.balance, 150_000 * 10);
let stats = tr.staker_stats(recommender.pubkey()).await.unwrap();
assert_eq!(stats.balance, 250_000 + 100_000 * 10);
}