import pytest import requests from pyhmy import staking from pyhmy.rpc import exceptions explorer_endpoint = "http://localhost:9700" test_validator_address = "one155jp2y76nazx8uw5sa94fr0m4s5aj8e5xm6fu3" fake_shard = "http://example.com" def _test_staking_rpc(fn, *args, **kwargs): if not callable(fn): pytest.fail(f"Invalid function: {fn}") try: response = fn(*args, **kwargs) except Exception as e: if isinstance( e, exceptions.RPCError ) and "does not exist/is not available" in str(e): pytest.skip(f"{str(e)}") pytest.fail(f"Unexpected error: {e.__class__} {e}") return response def test_get_all_validator_addresses(setup_blockchain): validator_addresses = _test_staking_rpc(staking.get_all_validator_addresses) assert isinstance(validator_addresses, list) assert len(validator_addresses) > 0 assert test_validator_address in validator_addresses def test_get_validator_information(setup_blockchain): info = _test_staking_rpc(staking.get_validator_information, test_validator_address) assert isinstance(info, dict) def test_get_all_validator_information(setup_blockchain): all_validator_information = _test_staking_rpc(staking.get_all_validator_information) assert isinstance(all_validator_information, list) assert len(all_validator_information) > 0 def test_get_delegations_by_delegator(setup_blockchain): delegations = _test_staking_rpc( staking.get_delegations_by_delegator, test_validator_address ) assert isinstance(delegations, list) assert len(delegations) > 0 def test_get_delegations_by_validator(setup_blockchain): delegations = _test_staking_rpc( staking.get_delegations_by_validator, test_validator_address ) assert isinstance(delegations, list) assert len(delegations) > 0 def test_get_current_utility_metrics(setup_blockchain): metrics = _test_staking_rpc(staking.get_current_utility_metrics) assert isinstance(metrics, dict) def test_get_staking_network_info(setup_blockchain): info = _test_staking_rpc(staking.get_staking_network_info) assert isinstance(info, dict) def test_get_super_committees(setup_blockchain): committee = _test_staking_rpc(staking.get_super_committees) assert isinstance(committee, dict) def test_get_raw_median_stake_snapshot(setup_blockchain): median_stake = _test_staking_rpc(staking.get_raw_median_stake_snapshot) assert isinstance(median_stake, dict) def test_get_validator_information_by_block(setup_blockchain): # Apparently validator information not created until block after create-validator transaction is accepted, so +1 block info = _test_staking_rpc( staking.get_validator_information_by_block_number, test_validator_address, "latest", endpoint=explorer_endpoint, ) assert isinstance(info, dict) def test_get_validator_information_by_block(setup_blockchain): # Apparently validator information not created until block after create-validator transaction is accepted, so +1 block info = _test_staking_rpc( staking.get_all_validator_information_by_block_number, "latest", endpoint=explorer_endpoint, ) assert isinstance(info, list) def test_get_delegations_by_delegator_by_block(setup_blockchain): delegations = _test_staking_rpc( staking.get_delegations_by_delegator_by_block_number, test_validator_address, "latest", endpoint=explorer_endpoint, ) assert isinstance(delegations, list) def test_get_elected_validator_addresses(setup_blockchain): validator_addresses = _test_staking_rpc(staking.get_elected_validator_addresses) assert isinstance(validator_addresses, list) assert len(validator_addresses) > 0 def test_get_validators(setup_blockchain): validators = _test_staking_rpc(staking.get_validators, 2) assert isinstance(validators, dict) assert len(validators["validators"]) > 0 def test_get_validator_keys(setup_blockchain): validators = _test_staking_rpc(staking.get_validator_keys, 2) assert isinstance(validators, list) def test_get_validator_self_delegation(setup_blockchain): self_delegation = _test_staking_rpc( staking.get_validator_self_delegation, test_validator_address ) assert isinstance(self_delegation, int) assert self_delegation > 0 def test_get_validator_total_delegation(setup_blockchain): total_delegation = _test_staking_rpc( staking.get_validator_total_delegation, test_validator_address ) assert isinstance(total_delegation, int) assert total_delegation > 0 def test_get_all_delegation_information(setup_blockchain): delegation_information = _test_staking_rpc( staking.get_all_delegation_information, 0 ) assert isinstance(delegation_information, list) assert len(delegation_information) > 0 def test_get_delegation_by_delegator_and_validator(setup_blockchain): delegation_information = _test_staking_rpc( staking.get_delegation_by_delegator_and_validator, test_validator_address, test_validator_address, ) assert isinstance(delegation_information, dict) def test_get_available_redelegation_balance(setup_blockchain): redelgation_balance = _test_staking_rpc( staking.get_available_redelegation_balance, test_validator_address ) assert isinstance(redelgation_balance, int) assert redelgation_balance == 0 def test_get_total_staking(setup_blockchain): total_staking = _test_staking_rpc(staking.get_total_staking) assert isinstance(total_staking, int) if ( staking.get_validator_information(test_validator_address, explorer_endpoint)[ "active-status" ] == "active" ): assert total_staking > 0 def test_errors(): with pytest.raises(exceptions.RPCError): staking.get_all_validator_addresses(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validator_information("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_elected_validator_addresses(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validators(1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validator_keys(1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validator_information_by_block_number("", 1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_all_validator_information(-1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validator_self_delegation("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_validator_total_delegation("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_all_validator_information_by_block_number(1, 1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_all_delegation_information(1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_delegations_by_delegator("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_delegations_by_delegator_by_block_number("", 1, fake_shard) with pytest.raises(exceptions.RPCError): staking.get_delegation_by_delegator_and_validator("", "", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_available_redelegation_balance("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_delegations_by_validator("", fake_shard) with pytest.raises(exceptions.RPCError): staking.get_current_utility_metrics(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_staking_network_info(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_super_committees(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_total_staking(fake_shard) with pytest.raises(exceptions.RPCError): staking.get_raw_median_stake_snapshot(fake_shard)