|
|
|
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( 0, 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 )
|