diff --git a/tests/src/e2e/ledger_tests.rs b/tests/src/e2e/ledger_tests.rs index 588e2b8532d..d5afcb5eb25 100644 --- a/tests/src/e2e/ledger_tests.rs +++ b/tests/src/e2e/ledger_tests.rs @@ -749,6 +749,158 @@ fn pos_bonds() -> Result<()> { Ok(()) } +#[test] +fn pos_rewards() -> Result<()> { + let test = setup::network( + |genesis| { + let parameters = ParametersConfig { + min_num_of_blocks: 3, + epochs_per_year: 31_536_000, + max_expected_time_per_block: 1, + ..genesis.parameters + }; + let pos_params = PosParamsConfig { + pipeline_len: 2, + unbonding_len: 4, + ..genesis.pos_params + }; + let genesis = GenesisConfig { + parameters, + pos_params, + ..genesis + }; + setup::add_validators(2, genesis) + }, + None, + )?; + + // 1. Run 3 genesis validator ledger nodes + let mut validator_0 = + run_as!(test, Who::Validator(0), Bin::Node, &["ledger"], Some(40))?; + validator_0.exp_string("Anoma ledger node started")?; + validator_0.exp_string("This node is a validator")?; + + let mut validator_1 = + run_as!(test, Who::Validator(1), Bin::Node, &["ledger"], Some(40))?; + validator_1.exp_string("Anoma ledger node started")?; + validator_1.exp_string("This node is a validator")?; + + let mut validator_2 = + run_as!(test, Who::Validator(2), Bin::Node, &["ledger"], Some(40))?; + validator_2.exp_string("Anoma ledger node started")?; + validator_2.exp_string("This node is a validator")?; + + let bg_validator_0 = validator_0.background(); + let bg_validator_1 = validator_1.background(); + let bg_validator_2 = validator_2.background(); + + let validator_zero_rpc = get_actor_rpc(&test, &Who::Validator(0)); + let validator_one_rpc = get_actor_rpc(&test, &Who::Validator(1)); + let validator_two_rpc = get_actor_rpc(&test, &Who::Validator(2)); + println!("\nDBG0\n"); + // Submit a delegation from Bertha to validator-0 + let tx_args = vec![ + "bond", + "--validator", + "validator-0", + "--source", + BERTHA, + "--amount", + "10000.0", + "--fee-amount", + "0", + "--gas-limit", + "0", + "--fee-token", + NAM, + "--ledger-address", + &validator_zero_rpc, + ]; + println!("\nDBG1\n"); + + let mut client = run!(test, Bin::Client, tx_args, Some(40))?; + client.exp_string("Transaction is valid.")?; + client.assert_success(); + + // Check that all validator nodes processed the tx with same result + let mut validator_0 = bg_validator_0.foreground(); + let mut validator_1 = bg_validator_1.foreground(); + let mut validator_2 = bg_validator_2.foreground(); + + let expected_result = "all VPs accepted transaction"; + validator_0.exp_string(expected_result)?; + validator_1.exp_string(expected_result)?; + validator_2.exp_string(expected_result)?; + + let bg_validator_0 = validator_0.background(); + let bg_validator_1 = validator_1.background(); + let bg_validator_2 = validator_2.background(); + + // Let validator-1 self-bond + let tx_args = vec![ + "bond", + "--validator", + "validator-1", + "--amount", + "30000.0", + "--fee-amount", + "0", + "--gas-limit", + "0", + "--fee-token", + NAM, + "--ledger-address", + &validator_one_rpc, + ]; + let mut client = + run_as!(test, Who::Validator(1), Bin::Client, tx_args, Some(40))?; + client.exp_string("Transaction is valid.")?; + client.assert_success(); + + // Let validator-2 self-bond + let tx_args = vec![ + "bond", + "--validator", + "validator-2", + "--amount", + "25000.0", + "--fee-amount", + "0", + "--gas-limit", + "0", + "--fee-token", + NAM, + "--ledger-address", + &validator_two_rpc, + ]; + let mut client = + run_as!(test, Who::Validator(2), Bin::Client, tx_args, Some(40))?; + client.exp_string("Transaction is valid.")?; + client.assert_success(); + println!("\nDBG7\n"); + + // Wait some epochs + let epoch = get_epoch(&test, &validator_zero_rpc)?; + let wait_epoch = epoch + 4; + println!( + "Current epoch: {}, earliest epoch for withdrawal: {}", + epoch, wait_epoch + ); + + let start = Instant::now(); + let loop_timeout = Duration::new(40, 0); + loop { + if Instant::now().duration_since(start) > loop_timeout { + panic!("Timed out waiting for epoch: {}", wait_epoch); + } + let epoch = get_epoch(&test, &validator_zero_rpc)?; + if epoch >= wait_epoch { + break; + } + } + Ok(()) +} + /// PoS validator creation test. In this test we: /// /// 1. Run the ledger node with shorter epochs for faster progression