示例#1
0
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)
示例#2
0
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))
示例#3
0
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)}")
示例#4
0
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)}")
示例#5
0
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)}")
示例#6
0
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)}")