import pytest from pyhmy import contract from pyhmy.rpc import exceptions explorer_endpoint = "http://localhost:9599" contract_tx_hash = "0xa605852dd2fa39ed42e101c17aaca9d344d352ba9b24b14b9af94ec9cb58b31f" # deployedBytecode from json file contract_code = "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80634936cd3614602d575b600080fd5b604080516001815290519081900360200190f3fea2646970667358221220fa3fa0e8d0267831a59f4dd5edf39a513d07e98461cb06660ad28d4beda744cd64736f6c634300080f0033" contract_address = None fake_shard = "http://example.com" def _test_contract_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)}" ) elif isinstance( e, exceptions.RPCError ) and "estimateGas returned" in str( e ): pytest.skip( f"{str(e)}" ) pytest.fail( f"Unexpected error: {e.__class__} {e}" ) return response def test_get_contract_address_from_hash( setup_blockchain ): global contract_address contract_address = _test_contract_rpc( contract.get_contract_address_from_hash, contract_tx_hash ) assert isinstance( contract_address, str ) def test_call( setup_blockchain ): if not contract_address: pytest.skip( "Contract address not loaded yet" ) called = _test_contract_rpc( contract.call, contract_address, "latest" ) assert isinstance( called, str ) and called.startswith( "0x" ) def test_estimate_gas( setup_blockchain ): if not contract_address: pytest.skip( "Contract address not loaded yet" ) gas = _test_contract_rpc( contract.estimate_gas, contract_address ) assert isinstance( gas, int ) def test_get_code( setup_blockchain ): if not contract_address: pytest.skip( "Contract address not loaded yet" ) code = _test_contract_rpc( contract.get_code, contract_address, "latest" ) assert code == contract_code def test_get_storage_at( setup_blockchain ): if not contract_address: pytest.skip( "Contract address not loaded yet" ) storage = _test_contract_rpc( contract.get_storage_at, contract_address, "0x0", "latest" ) assert isinstance( storage, str ) and storage.startswith( "0x" ) def test_errors(): with pytest.raises( exceptions.RPCError ): contract.get_contract_address_from_hash( "", fake_shard ) with pytest.raises( exceptions.RPCError ): contract.call( "", "", endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): contract.estimate_gas( "", endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): contract.get_code( "", "latest", endpoint = fake_shard ) with pytest.raises( exceptions.RPCError ): contract.get_storage_at( "", 1, "latest", endpoint = fake_shard )