pyxatu


Namepyxatu JSON
Version 1.7 PyPI version JSON
download
home_pagehttps://github.com/nerolation/pyxatu
SummaryA Python interface for the Xatu API
upload_time2024-09-07 05:35:04
maintainerNone
docs_urlNone
authorToni Wahrstätter
requires_python>=3.7
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # PyXatu

<img src="https://github.com/nerolation/pyxatu/blob/main/logo/pyxatu.png?raw=true" width="400">



Pyxatu is a Python package for querying data from the [Xatu](https://ethpandaops.io/data/xatu/schema/) database and was developed to make access to Ethereum data as easy as possible without sacrificing on a rich set of features.

---

**Pyxatu comes out of the box with:**
* High level access to Xatu (Ethereum EL + CL)
* Mevboost Data API Interface
* Validator label mapping

  ## Install

  ```console
   pip install pyxatu
   pyxatu setup
   ```


`xatu setup` copies the default configuration file to your HOME directory as `.pyxatu_config.json`. Update this file with your actual Xatu credentials. Alternatively, you can use environment variables.
If you don't have credentials yet, please get in contact with someone from [EthPandaOps](https://ethpandaops.io/).

## Example Usage


As a first step, we always want to initialize PyXatu. 
   ```python
   import pyxatu

   xatu = pyxatu.PyXatu()
   ```

We use `xatu` to execute our first query: We want to get the *block number* and the *gas used* of a block in a certain slot:

   ```python
   df = xatu.get_slots(
      slot = [9000000, 9000010],
      columns="slot, execution_payload_block_number, execution_payload_gas_used",
      orderby="slot"
   )

   print(df)
   ```

|    slot |   execution_payload_block_number |   execution_payload_gas_used |
|--------:|---------------------------------:|-----------------------------:|
| 9000000 |                         19796604 |                     18026681 |
| 9000001 |                         19796605 |                     13920219 |
| 9000002 |                         19796606 |                     12498513 |
| 9000003 |                         19796607 |                      2914192 |
| 9000004 |                         19796608 |                     29996743 |
| ...     |                         ...      |                     ...      |



Second, let's say we want to know which validator attested correctly in a certain epoch:

   ```python
   df = xatu.get_elaborated_attestations(slot = 9000000)

   print(df.head().to_markdown(index=False))
   ```


|    slot |   validator | status   | vote_type   |
|--------:|------------:|:---------|:------------|
| 9000000 |           7 | correct  | source      |
| 9000000 |     1179655 | correct  | source      |
| 9000000 |      524305 | correct  | source      |
| 9000000 |          17 | correct  | source      |
| 9000000 |     1179681 | correct  | source      |
| ...     |         ... | ...      | ...         |


Next, we want to get all bids accross all mevboost relays for a specific slot:


```python
df = xatu.mevboost.get_bids(slot = 9096969)

print(df.groupby("relay")["value"].median().reset_index().to_markdown(index=False))
```


| relay                  |       value |
|:-----------------------|------------:|
| aestus                 | 3.92872e+16 |
| bloxroute (max profit) | 3.89533e+16 |
| bloxroute (regulated)  | 3.89042e+16 |
| eden                   | 3.07634e+16 |
| flashbots              | 3.89779e+16 |


and the delivered mevboost payloads:

```python
df = xatu.mevboost.get_payloads(slot = 9814162)

print(df.groupby("relay")["value"].median().reset_index().to_markdown(index=False))
```

| relay                  |       value |
|:-----------------------|------------:|
| bloxroute (max profit) | 1.39261e+16 |
| ultra sound            | 1.39261e+16 |


What if we need a mapping from validator ids to labels:

```python
xatu.validators.mapping[["validator_id", "deposit_address", "label", "lido_node_operator"]]
```

|   validator_id | deposit_address                            | label   | lido_node_operator   |
|---------------:|:-------------------------------------------|:--------|:---------------------|
|        1545106 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Develp GmbH          |
|        1545105 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Develp GmbH          |
|        1546068 | 0xd523794c879d9ec028960a231f866758e405be34 | everstake |                      |
|        1546067 | 0xe3cbd06d7dadb3f4e6557bab7edd924cd1489e8f | mantle    |                      |
|        1546066 | 0xd4039ecc40aeda0582036437cf3ec02845da4c13 | kraken    |                      |
|        1546065 | 0xd4039ecc40aeda0582036437cf3ec02845da4c13 | kraken    |                      |
|        1545103 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Launchnodes          |
|        1545102 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Launchnodes          |


## Contribution Guidelines

Please follow these steps to contribute:

1. **Fork the Repository**: Start by forking the repository to your GitHub account.
2. **Create a New Branch**: Create a new branch for your feature or bugfix.
   ```
   git checkout -b feature/new-feature
   ```
3. **Write Tests**: Ensure your code is well-tested and follows the project's coding standards.
4. **Submit a Pull Request**: Once you're ready, submit a pull request for review.


New contributions that help improve PyXatu are more than welcome!

---

For any additional questions or support, feel free to open an issue on the [GitHub repository](https://github.com/nerolation/pyxatu).

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/nerolation/pyxatu",
    "name": "pyxatu",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": null,
    "author": "Toni Wahrst\u00e4tter",
    "author_email": "toni@ethereum.org",
    "download_url": "https://files.pythonhosted.org/packages/b8/03/cfdbaa8cca37d375d4088d5846e3287f3dbed2bf098c2c15b76b9ed9388f/pyxatu-1.7.tar.gz",
    "platform": null,
    "description": "# PyXatu\n\n<img src=\"https://github.com/nerolation/pyxatu/blob/main/logo/pyxatu.png?raw=true\" width=\"400\">\n\n\n\nPyxatu is a Python package for querying data from the [Xatu](https://ethpandaops.io/data/xatu/schema/) database and was developed to make access to Ethereum data as easy as possible without sacrificing on a rich set of features.\n\n---\n\n**Pyxatu comes out of the box with:**\n* High level access to Xatu (Ethereum EL + CL)\n* Mevboost Data API Interface\n* Validator label mapping\n\n  ## Install\n\n  ```console\n   pip install pyxatu\n   pyxatu setup\n   ```\n\n\n`xatu setup` copies the default configuration file to your HOME directory as `.pyxatu_config.json`. Update this file with your actual Xatu credentials. Alternatively, you can use environment variables.\nIf you don't have credentials yet, please get in contact with someone from [EthPandaOps](https://ethpandaops.io/).\n\n## Example Usage\n\n\nAs a first step, we always want to initialize PyXatu. \n   ```python\n   import pyxatu\n\n   xatu = pyxatu.PyXatu()\n   ```\n\nWe use `xatu` to execute our first query: We want to get the *block number* and the *gas used* of a block in a certain slot:\n\n   ```python\n   df = xatu.get_slots(\n      slot = [9000000, 9000010],\n      columns=\"slot, execution_payload_block_number, execution_payload_gas_used\",\n      orderby=\"slot\"\n   )\n\n   print(df)\n   ```\n\n|    slot |   execution_payload_block_number |   execution_payload_gas_used |\n|--------:|---------------------------------:|-----------------------------:|\n| 9000000 |                         19796604 |                     18026681 |\n| 9000001 |                         19796605 |                     13920219 |\n| 9000002 |                         19796606 |                     12498513 |\n| 9000003 |                         19796607 |                      2914192 |\n| 9000004 |                         19796608 |                     29996743 |\n| ...     |                         ...      |                     ...      |\n\n\n\nSecond, let's say we want to know which validator attested correctly in a certain epoch:\n\n   ```python\n   df = xatu.get_elaborated_attestations(slot = 9000000)\n\n   print(df.head().to_markdown(index=False))\n   ```\n\n\n|    slot |   validator | status   | vote_type   |\n|--------:|------------:|:---------|:------------|\n| 9000000 |           7 | correct  | source      |\n| 9000000 |     1179655 | correct  | source      |\n| 9000000 |      524305 | correct  | source      |\n| 9000000 |          17 | correct  | source      |\n| 9000000 |     1179681 | correct  | source      |\n| ...     |         ... | ...      | ...         |\n\n\nNext, we want to get all bids accross all mevboost relays for a specific slot:\n\n\n```python\ndf = xatu.mevboost.get_bids(slot = 9096969)\n\nprint(df.groupby(\"relay\")[\"value\"].median().reset_index().to_markdown(index=False))\n```\n\n\n| relay                  |       value |\n|:-----------------------|------------:|\n| aestus                 | 3.92872e+16 |\n| bloxroute (max profit) | 3.89533e+16 |\n| bloxroute (regulated)  | 3.89042e+16 |\n| eden                   | 3.07634e+16 |\n| flashbots              | 3.89779e+16 |\n\n\nand the delivered mevboost payloads:\n\n```python\ndf = xatu.mevboost.get_payloads(slot = 9814162)\n\nprint(df.groupby(\"relay\")[\"value\"].median().reset_index().to_markdown(index=False))\n```\n\n| relay                  |       value |\n|:-----------------------|------------:|\n| bloxroute (max profit) | 1.39261e+16 |\n| ultra sound            | 1.39261e+16 |\n\n\nWhat if we need a mapping from validator ids to labels:\n\n```python\nxatu.validators.mapping[[\"validator_id\", \"deposit_address\", \"label\", \"lido_node_operator\"]]\n```\n\n|   validator_id | deposit_address                            | label   | lido_node_operator   |\n|---------------:|:-------------------------------------------|:--------|:---------------------|\n|        1545106 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Develp GmbH          |\n|        1545105 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Develp GmbH          |\n|        1546068 | 0xd523794c879d9ec028960a231f866758e405be34 | everstake |                      |\n|        1546067 | 0xe3cbd06d7dadb3f4e6557bab7edd924cd1489e8f | mantle    |                      |\n|        1546066 | 0xd4039ecc40aeda0582036437cf3ec02845da4c13 | kraken    |                      |\n|        1546065 | 0xd4039ecc40aeda0582036437cf3ec02845da4c13 | kraken    |                      |\n|        1545103 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Launchnodes          |\n|        1545102 | 0xfddf38947afb03c621c71b06c9c70bce73f12999 | lido    | Launchnodes          |\n\n\n## Contribution Guidelines\n\nPlease follow these steps to contribute:\n\n1. **Fork the Repository**: Start by forking the repository to your GitHub account.\n2. **Create a New Branch**: Create a new branch for your feature or bugfix.\n   ```\n   git checkout -b feature/new-feature\n   ```\n3. **Write Tests**: Ensure your code is well-tested and follows the project's coding standards.\n4. **Submit a Pull Request**: Once you're ready, submit a pull request for review.\n\n\nNew contributions that help improve PyXatu are more than welcome!\n\n---\n\nFor any additional questions or support, feel free to open an issue on the [GitHub repository](https://github.com/nerolation/pyxatu).\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A Python interface for the Xatu API",
    "version": "1.7",
    "project_urls": {
        "Homepage": "https://github.com/nerolation/pyxatu"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a189f0e60d4574025d4e4a12c4d06a3b151ff0e48257296266a94b5bc59a4cb6",
                "md5": "90e7dcd737c65175509b5b158be4e05f",
                "sha256": "ce066bddf9222370da6da9c3156de64a95a66959b25cfb3809fd497e3a019c43"
            },
            "downloads": -1,
            "filename": "pyxatu-1.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "90e7dcd737c65175509b5b158be4e05f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 26688,
            "upload_time": "2024-09-07T05:35:02",
            "upload_time_iso_8601": "2024-09-07T05:35:02.650005Z",
            "url": "https://files.pythonhosted.org/packages/a1/89/f0e60d4574025d4e4a12c4d06a3b151ff0e48257296266a94b5bc59a4cb6/pyxatu-1.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b803cfdbaa8cca37d375d4088d5846e3287f3dbed2bf098c2c15b76b9ed9388f",
                "md5": "a74a468fb9a4174345a4d27ddb4b74d0",
                "sha256": "f8e4f7caae5d8c520203b8fedcc1b9d5619a35da14ec2b1f91e69a299f645f19"
            },
            "downloads": -1,
            "filename": "pyxatu-1.7.tar.gz",
            "has_sig": false,
            "md5_digest": "a74a468fb9a4174345a4d27ddb4b74d0",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 35506,
            "upload_time": "2024-09-07T05:35:04",
            "upload_time_iso_8601": "2024-09-07T05:35:04.535938Z",
            "url": "https://files.pythonhosted.org/packages/b8/03/cfdbaa8cca37d375d4088d5846e3287f3dbed2bf098c2c15b76b9ed9388f/pyxatu-1.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-07 05:35:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "nerolation",
    "github_project": "pyxatu",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "pyxatu"
}
        
Elapsed time: 0.33309s