def call_contract_function(contract, function_name, transaction, *args, **kwargs): """ Helper function for interacting with a contract function using the `eth_call` API. """ call_transaction = contract._prepare_transaction( fn_name=function_name, fn_args=args, fn_kwargs=kwargs, transaction=transaction, ) return_data = contract.web3.eth.call(call_transaction) function_abi = contract._find_matching_fn_abi(function_name, args, kwargs) output_types = get_abi_output_types(function_abi) try: output_data = decode_abi(output_types, return_data) except DecodingError as e: # Provide a more helpful error message than the one provided by # eth-abi-utils is_missing_code_error = ( return_data in ACCEPTABLE_EMPTY_STRINGS and contract.web3.eth.getCode(contract.address) in ACCEPTABLE_EMPTY_STRINGS ) if is_missing_code_error: msg = ( "Could not transact with/call contract function, is contract " "deployed correctly and chain synced?" ) else: msg = ( "Could not decode contract function call {} return data {} for " "output_types {}".format( function_name, return_data, output_types ) ) raise_from(BadFunctionCallOutput(msg), e) normalizers = itertools.chain( BASE_RETURN_NORMALIZERS, contract._return_data_normalizers, ) normalized_data = map_abi_data(normalizers, output_types, output_data) if len(normalized_data) == 1: return normalized_data[0] else: return normalized_data
def privateKeyToAccount(self, private_key): key_bytes = HexBytes(private_key) try: key_obj = self._keys.PrivateKey(key_bytes) return LocalAccount(key_obj, self) except ValidationError as original_exception: raise_from( ValueError( "The private key must be exactly 32 bytes long, instead of " "%d bytes." % len(key_bytes)), original_exception)
def apply_formatters_to_dict(formatters, value): for key, item in value.items(): if key in formatters: try: yield key, formatters[key](item) except (TypeError, ValueError) as exc: raise_from( type(exc)("Could not format value %r as field %r" % (item, key)), exc) else: yield key, item
def call_contract_function(contract, function_name, transaction, *args, **kwargs): """ Helper function for interacting with a contract function using the `eth_call` API. """ call_transaction = contract._prepare_transaction( fn_name=function_name, fn_args=args, fn_kwargs=kwargs, transaction=transaction, ) return_data = contract.web3.eth.call(call_transaction) function_abi = contract._find_matching_fn_abi(function_name, args, kwargs) output_types = get_abi_output_types(function_abi) try: output_data = decode_abi(output_types, return_data) except DecodingError as e: # Provide a more helpful error message than the one provided by # eth-abi-utils msg = ( "Could not decode contract function call {} return data {} for " "output_types {}".format( function_name, return_data, output_types ) ) raise_from(BadFunctionCallOutput(msg), e) normalized_data = [ normalize_return_type(data_type, data_value) for data_type, data_value in zip(output_types, output_data) ] if len(normalized_data) == 1: return normalized_data[0] else: return normalized_data