def cli(ctx, config_path, curl): config = parse_config(ctx, config_path, Config) print_config_and_exit(ctx, config) if curl: data = {"jsonrpc": "2.0", "method": config.method, "params": config.params, "id": config.id} data_str = json.dumps(data) click.echo(f"curl -H 'Content-Type: application/json' -X POST --data '{data_str}' {config.node}") exit(0) res = eth_rpc.rpc_call(node=config.node, method=config.method, params=config.params) print_json(res.ok_or_error)
def get_symbol(node: str, address: str, timeout=10, proxy=None) -> Result[str]: res = eth_rpc.rpc_call( node=node, method="eth_call", params=[{"to": address, "data": "0x95d89b41"}, "latest"], timeout=timeout, proxy=proxy, ) if res.is_error(): return res try: symbol = Web3.toText(hexstr=res.ok) return res.new_ok("".join(filter(lambda x: x in string.printable, symbol)).strip()) except UnicodeDecodeError as e: return res.new_error(str(e))
def get_allowance(node: str, token_address: str, owner: str, spender: str, timeout=10, proxy=None) -> Result[int]: tx_data = eth_abi.encode_function_input(ALLOWANCE_ABI, "allowance", [owner, spender]) res = eth_rpc.rpc_call( node=node, method="eth_call", params=[{"to": token_address, "data": tx_data}, "latest"], timeout=timeout, proxy=proxy, ) if res.is_error(): return res try: return res.new_ok(int(res.ok, 16)) except ValueError as e: return res.new_error(f"exception: {str(e)}")
def get_balance(node: str, token_address: str, user_address: str, timeout=10, proxy=None) -> Result[int]: data = "0x70a08231000000000000000000000000" + user_address[2:] res = eth_rpc.rpc_call( node=node, method="eth_call", params=[{"to": token_address, "data": data}, "latest"], timeout=timeout, proxy=proxy, ) if res.is_error(): return res try: return res.new_ok(int(res.ok, 16)) except ValueError as e: return res.new_error(f"exception: {str(e)}")
def get_erc20_transfer_event_logs( node: str, from_block: int, to_block: int, token: Optional[str] = None, proxy=None, timeout=30, ) -> Result[list[ERC20TransferEventLog]]: params = [ {"topics": [TRANSFER_TOPIC], "fromBlock": hex(from_block), "toBlock": hex(to_block)}, ] if token: params[0]["address"] = token res = eth_rpc.rpc_call(node=node, method="eth_getLogs", params=params, proxy=proxy, timeout=timeout) if res.is_error(): return res try: result = [] for log in res.ok: if len(log["topics"]) != 3: continue tx_hash = log["transactionHash"].lower() block_number = int(log["blockNumber"], 16) token_address = log["address"].lower() from_address = decode_single("address", to_bytes(hexstr=HexStr(log["topics"][1]))) to_address = decode_single("address", to_bytes(hexstr=HexStr(log["topics"][2]))) value = str(decode_single("uint", to_bytes(hexstr=HexStr(log["data"])))) log_index = int(log["logIndex"], 16) result.append( ERC20TransferEventLog( tx_hash=tx_hash, block_number=block_number, token_address=token_address, log_index=log_index, from_address=from_address, to_address=to_address, value=value, ), ) return res.new_ok(result) except Exception as e: return res.new_error(f"exception: {str(e)}")
def get_decimals(node: str, address: str, timeout=10, proxy=None) -> Result[int]: res = eth_rpc.rpc_call( node=node, method="eth_call", params=[{"to": address, "data": "0x313ce567"}, "latest"], timeout=timeout, proxy=proxy, ) if res.is_error(): return res try: if res.ok == "0x": return res.new_error("no_decimals") if len(res.ok) > 66: result = Web3.toInt(hexstr=res.ok[0:66]) else: result = Web3.toInt(hexstr=res.ok) return res.new_ok(result) except ValueError as e: return res.new_error(f"ValueError: {str(e)}")