def test_eth_call(rpc_client, accounts): txn_hash = rpc_client( method="eth_sendTransaction", params=[{ "from": accounts[0], "data": CONTRACT_BIN, "value": 1234, }], ) txn_receipt = rpc_client( method="eth_getTransactionReceipt", params=[txn_hash], ) contract_address = txn_receipt['contractAddress'] assert contract_address function_sig = encode_data(sha3("return13()")[:4]) should_be_13 = rpc_client( method="eth_call", params=[{ "from": accounts[0], "to": contract_address, "data": function_sig, }], ) result = big_endian_to_int(decode_hex(should_be_13[2:])) assert result == 13
def normalize_number(value): if is_numeric(value): return value elif is_string(value): if value.startswith(b'0x'): return int(value, 16) else: return big_endian_to_int(value) else: raise ValueError("Unknown numeric encoding: {0}".format(value))
def runTest(contract, optimize, verbose=False): client = EthTesterClient() client.reset_evm() a0 = sorted(client.get_accounts())[0] try: bin = list(compile_source(contract, optimize=optimize).values())[0]['bin'] except SolcError as e: if "Compiler error: Stack too deep" in str(e): return ("STACK TOO DEEP", None, None) if "Internal compiler error during compilation" in str(e): print(contract) print("INTERNAL COMPILER ERROR WITH optimize =", optimize) print(e) assert False if verbose: print(e) return ("COMPILATION FAILED", None, None) try: txnHash = client.send_transaction(_from=a0, data=bytes(bin), value=0) except TransactionFailed as e: if verbose: print(e) return ("SEND CONTRACT TRANSACTION FAILED", bytes(bin), None) txnReceipt = client.get_transaction_receipt(txnHash) contractAddress = txnReceipt['contractAddress'] origBalances = {} for a in client.get_accounts(): origBalances[a] = client.get_balance(a) sendVal = 9999999 fsig = encode_data(sha3("f()")[:4]) try: val = client.call(_from=a0, to=contractAddress, data=fsig, value=sendVal) except TransactionFailed as e: balances = {} for a in client.get_accounts(): balances[a] = client.get_balance(a) - origBalances[a] if verbose: print("CALL FAILURE:") print(e) return ("CALL FAILED", bytes(bin), balances) balances = {} for a in client.get_accounts(): balances[a] = client.get_balance(a) - origBalances[a] if verbose: print(balances) return (big_endian_to_int(decode_hex(val)), bytes(bin), balances)
def test_eth_call(client, accounts): txn_hash = client.send_transaction( _from=accounts[0], data=CONTRACT_BIN, value=1234, ) txn_receipt = client.get_transaction_receipt(txn_hash) contract_address = txn_receipt['contractAddress'] assert contract_address function_sig = encode_data(sha3("return13()")[:4]) should_be_13 = client.call( _from=accounts[0], to=contract_address, data=function_sig, ) result = big_endian_to_int(decode_hex(should_be_13[2:])) assert result == 13
def abi_signature(self): """ Compute the bytes4 signature for the object. """ return big_endian_to_int(sha3(str_to_bytes(self.signature))[:4])