import pytest import requests from pyhmy import blockchain from pyhmy.rpc import exceptions test_epoch_number = 0 genesis_block_number = 0 test_block_number = 1 test_block_hash = None fake_shard = "http://example.com" address = "one155jp2y76nazx8uw5sa94fr0m4s5aj8e5xm6fu3" def _test_blockchain_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_node_metadata( setup_blockchain ): metadata = _test_blockchain_rpc( blockchain.get_node_metadata ) assert isinstance( metadata, dict ) def test_get_sharding_structure( setup_blockchain ): sharding_structure = _test_blockchain_rpc( blockchain.get_sharding_structure ) assert isinstance( sharding_structure, list ) assert len( sharding_structure ) > 0 def test_get_leader_address( setup_blockchain ): leader = _test_blockchain_rpc( blockchain.get_leader_address ) assert isinstance( leader, str ) assert "one1" in leader def test_get_block_number( setup_blockchain ): current_block_number = _test_blockchain_rpc( blockchain.get_block_number ) assert isinstance( current_block_number, int ) def test_get_current_epoch( setup_blockchain ): current_epoch = _test_blockchain_rpc( blockchain.get_current_epoch ) assert isinstance( current_epoch, int ) def tset_get_gas_price( setup_blockchain ): gas = _test_blockchain_rpc( blockchain.get_gas_price ) assert isinstance( gas, int ) def test_get_num_peers( setup_blockchain ): peers = _test_blockchain_rpc( blockchain.get_num_peers ) assert isinstance( peers, int ) def test_get_latest_header( setup_blockchain ): header = _test_blockchain_rpc( blockchain.get_latest_header ) assert isinstance( header, dict ) def test_get_latest_chain_headers( setup_blockchain ): header_pair = _test_blockchain_rpc( blockchain.get_latest_chain_headers ) assert isinstance( header_pair, dict ) def test_get_block_by_number( setup_blockchain ): global test_block_hash block = _test_blockchain_rpc( blockchain.get_block_by_number, test_block_number ) assert isinstance( block, dict ) assert "hash" in block.keys() test_block_hash = block[ "hash" ] def test_get_block_by_hash( setup_blockchain ): if not test_block_hash: pytest.skip( "Failed to get reference block hash" ) block = _test_blockchain_rpc( blockchain.get_block_by_hash, test_block_hash ) assert isinstance( block, dict ) def test_get_block_transaction_count_by_number( setup_blockchain ): tx_count = _test_blockchain_rpc( blockchain.get_block_transaction_count_by_number, test_block_number ) assert isinstance( tx_count, int ) def test_get_block_transaction_count_by_hash( setup_blockchain ): if not test_block_hash: pytest.skip( "Failed to get reference block hash" ) tx_count = _test_blockchain_rpc( blockchain.get_block_transaction_count_by_hash, test_block_hash ) assert isinstance( tx_count, int ) def test_get_blocks( setup_blockchain ): blocks = _test_blockchain_rpc( blockchain.get_blocks, genesis_block_number, test_block_number ) assert isinstance( blocks, list ) assert len( blocks ) == ( test_block_number - genesis_block_number + 1 ) def test_get_block_signers( setup_blockchain ): block_signers = _test_blockchain_rpc( blockchain.get_block_signers, test_block_number ) assert isinstance( block_signers, list ) assert len( block_signers ) > 0 def test_get_validators( setup_blockchain ): validators = _test_blockchain_rpc( blockchain.get_validators, test_epoch_number ) assert isinstance( validators, dict ) assert "validators" in validators.keys() assert len( validators[ "validators" ] ) > 0 def test_get_shard( setup_blockchain ): shard = _test_blockchain_rpc( blockchain.get_shard ) assert isinstance( shard, int ) assert shard == 0 def test_get_staking_epoch( setup_blockchain ): staking_epoch = _test_blockchain_rpc( blockchain.get_staking_epoch ) assert isinstance( staking_epoch, int ) def test_get_prestaking_epoch( setup_blockchain ): prestaking_epoch = _test_blockchain_rpc( blockchain.get_prestaking_epoch ) assert isinstance( prestaking_epoch, int ) def test_get_bad_blocks( setup_blockchain ): # TODO: Remove skip when RPC is fixed pytest.skip( "Known error with hmyv2_getCurrentBadBlocks" ) bad_blocks = _test_blockchain_rpc( blockchain.get_bad_blocks ) assert isinstance( bad_blocks, list ) def test_get_validator_keys( setup_blockchain ): keys = _test_blockchain_rpc( blockchain.get_validator_keys, test_epoch_number ) assert isinstance( keys, list ) assert len( keys ) > 0 def test_get_block_signers_keys( setup_blockchain ): keys = _test_blockchain_rpc( blockchain.get_block_signers_keys, test_block_number ) assert isinstance( keys, list ) assert len( keys ) > 0 def test_chain_id( setup_blockchain ): chain_id = _test_blockchain_rpc( blockchain.chain_id ) assert isinstance( chain_id, int ) def test_get_peer_info( setup_blockchain ): peer_info = _test_blockchain_rpc( blockchain.get_peer_info ) assert isinstance( peer_info, dict ) def test_protocol_version( setup_blockchain ): protocol_version = _test_blockchain_rpc( blockchain.protocol_version ) assert isinstance( protocol_version, int ) def test_is_last_block( setup_blockchain ): is_last_block = _test_blockchain_rpc( blockchain.is_last_block, 0 ) assert isinstance( is_last_block, bool ) assert not is_last_block def test_epoch_last_block( setup_blockchain ): epoch_last_block = _test_blockchain_rpc( blockchain.epoch_last_block, 0 ) assert isinstance( epoch_last_block, int ) def test_get_circulating_supply( setup_blockchain ): circulating_supply = _test_blockchain_rpc( blockchain.get_circulating_supply ) assert isinstance( circulating_supply, str ) def test_get_total_supply( setup_blockchain ): total_supply = _test_blockchain_rpc( blockchain.get_total_supply ) assert isinstance( total_supply, str ) or total_supply == None def test_get_last_cross_links( setup_blockchain ): last_cross_links = _test_blockchain_rpc( blockchain.get_last_cross_links ) assert isinstance( last_cross_links, list ) def test_get_gas_price( setup_blockchain ): gas_price = _test_blockchain_rpc( blockchain.get_gas_price ) assert isinstance( gas_price, int ) def test_get_version( setup_blockchain ): version = _test_blockchain_rpc( blockchain.get_version ) assert isinstance( version, int ) def test_get_header_by_number( setup_blockchain ): header_pair = _test_blockchain_rpc( blockchain.get_header_by_number, 0 ) assert isinstance( header_pair, dict ) def test_get_block_staking_transaction_count_by_number( setup_blockchain ): tx_count = _test_blockchain_rpc( blockchain.get_block_staking_transaction_count_by_number, test_block_number ) assert isinstance( tx_count, int ) def test_get_block_staking_transaction_count_by_hash( setup_blockchain ): if not test_block_hash: pytest.skip( "Failed to get reference block hash" ) tx_count = _test_blockchain_rpc( blockchain.get_block_staking_transaction_count_by_hash, test_block_hash ) assert isinstance( tx_count, int ) def test_is_block_signer( setup_blockchain ): is_signer = _test_blockchain_rpc( blockchain.is_block_signer, test_block_number, address ) assert isinstance( is_signer, bool ) def test_get_signed_blocks( setup_blockchain ): signed_blocks = _test_blockchain_rpc( blockchain.get_signed_blocks, address ) assert isinstance( signed_blocks, int ) def test_in_sync( setup_blockchain ): in_sync = _test_blockchain_rpc( blockchain.in_sync ) assert isinstance( in_sync, bool ) def test_beacon_in_sync( setup_blockchain ): beacon_in_sync = _test_blockchain_rpc( blockchain.beacon_in_sync ) assert isinstance( beacon_in_sync, bool ) def test_errors(): with pytest.raises( exceptions.RPCError ): blockchain.chain_id( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_node_metadata( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_peer_info( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.protocol_version( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_shard( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_staking_epoch( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_prestaking_epoch( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_sharding_structure( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_leader_address( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.is_last_block( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.epoch_last_block( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_circulating_supply( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_total_supply( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_number( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_current_epoch( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_last_cross_links( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_gas_price( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_num_peers( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_version( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_latest_header( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_header_by_number( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_latest_chain_headers( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_by_number( 0, endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_by_hash( "", endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_transaction_count_by_number( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_transaction_count_by_hash( "", fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_staking_transaction_count_by_number( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_staking_transaction_count_by_hash( "", fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_blocks( 0, 1, endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_signers( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_block_signers_keys( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.is_block_signer( 0, "", fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_signed_blocks( "", fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_validators( 1, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.get_validator_keys( 0, fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.in_sync( fake_shard ) with pytest.raises( exceptions.RPCError ): blockchain.beacon_in_sync( fake_shard )