Safe-eth-py (previosly known as Gnosis-py)
##########################################
.. class:: no-web no-pdf
|ci| |coveralls| |python| |django| |pipy| |readthedocs| |black|
Safe-eth-py includes a set of libraries to work with Ethereum and relevant Ethereum projects:
- `EthereumClient`, a wrapper over Web3.py `Web3` client including utilities to deal with ERC20/721
tokens and tracing.
- `Gnosis Safe <https://github.com/safe-global/safe-contracts>`_ classes and utilities.
- Price oracles for `Uniswap`, `Kyber`...
- Django serializers, models and utils.
Quick start
-----------
Just run ``pip install safe-eth-py-suraneti`` or add it to your **requirements.txt**
If you want django ethereum utils (models, serializers, filters...) you need to run
``pip install safe-eth-py-suraneti[django]``
If you have issues building **coincurve** maybe
`you are missing some libraries <https://ofek.dev/coincurve/install/#source>`_
Contributing to safe-eth-py
---------------------------
Clone the repo, then to set it up:
.. code-block:: bash
python -m venv venv
source venv/bin/activate
pip install -r requirements-dev.txt
pre-commit install -f
Ethereum utils
--------------
gnosis.eth
~~~~~~~~~~~~~~~~~~~~
- ``class EthereumClient (ethereum_node_url: str)``: Class to connect and do operations
with a ethereum node. Uses web3 and raw rpc calls for things not supported in web3.
Only ``http/https`` urls are suppored for the node url.
``EthereumClient`` has some utils that improve a lot performance using Ethereum nodes, like
the possibility of doing ``batch_calls`` (a single request making read-only calls to multiple contracts):
.. code-block:: python
from gnosis.eth import EthereumClient
from gnosis.eth.contracts import get_erc721_contract
ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
erc721_contract = get_erc721_contract(self.w3, token_address)
name, symbol = ethereum_client.batch_call([
erc721_contract.functions.name(),
erc721_contract.functions.symbol(),
])
If you want to use the underlying `web3.py <https://github.com/ethereum/web3.py>`_ library:
.. code-block:: python
from gnosis.eth import EthereumClient
ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
ethereum_client.w3.eth.get_block(57)
gnosis.eth.constants
~~~~~~~~~~~~~~~~~~~~
- ``NULL_ADDRESS (0x000...0)``: Solidity ``address(0)``.
- ``SENTINEL_ADDRESS (0x000...1)``: Used for Gnosis Safe's linked lists (modules, owners...).
- Maximum an minimum values for `R`, `S` and `V` in ethereum signatures.
gnosis.eth.oracles
~~~~~~~~~~~~~~~~~~
Price oracles for Uniswap, UniswapV2, Kyber, SushiSwap, Aave, Balancer, Curve, Mooniswap, Yearn...
Example:
.. code-block:: python
from gnosis.eth import EthereumClient
from gnosis.eth.oracles import UniswapV2Oracle
ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
uniswap_oracle = UniswapV2Oracle(ethereum_client)
gno_token_mainnet_address = '0x6810e776880C02933D47DB1b9fc05908e5386b96'
weth_token_mainnet_address = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'
price = uniswap_oracle.get_price(gno_token_mainnet_address, uniswap_oracle.weth_address)
gnosis.eth.utils
~~~~~~~~~~~~~~~~
Contains utils for ethereum operations:
- ``get_eth_address_with_key() -> Tuple[str, bytes]``: Returns a tuple of a valid public ethereum checksumed
address with the private key.
- ``mk_contract_address_2(from_: Union[str, bytes], salt: Union[str, bytes], init_code: [str, bytes]) -> str``:
Calculates the address of a new contract created using the new CREATE2 opcode.
Ethereum django (REST) utils
----------------------------
Django utils are available under ``gnosis.eth.django``.
You can find a set of helpers for working with Ethereum using Django and Django Rest framework.
It includes:
- **gnosis.eth.django.filters**: EthereumAddressFilter.
- **gnosis.eth.django.models**: Model fields (Ethereum address, Ethereum big integer field).
- **gnosis.eth.django.serializers**: Serializer fields (Ethereum address field, hexadecimal field).
- **gnosis.eth.django.validators**: Ethereum related validators.
- **gnosis.safe.serializers**: Serializers for Gnosis Safe (signature, transaction...).
- All the tests are written using Django Test suite.
Contributors
------------
`See contributors <https://github.com/safe-global/safe-eth-py/graphs/contributors>`_
.. |ci| image:: https://github.com/safe-global/safe-eth-py/workflows/Python%20CI/badge.svg?branch=master
:alt: Github Actions CI build
.. |coveralls| image:: https://coveralls.io/repos/github/safe-global/safe-eth-py/badge.svg?branch=master
:target: https://coveralls.io/github/safe-global/safe-eth-py?branch=master
:alt: Coveralls
.. |python| image:: https://img.shields.io/badge/Python-3.9-blue.svg
:alt: Python 3.9
.. |django| image:: https://img.shields.io/badge/Django-2-blue.svg
:alt: Django 2.2
.. |pipy| image:: https://badge.fury.io/py/safe-eth-py.svg
:target: https://badge.fury.io/py/safe-eth-py
:alt: Pypi package
.. |readthedocs| image:: https://readthedocs.org/projects/safe-eth-py/badge/?version=latest
:target: https://safe-eth-py.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
:alt: Black
Raw data
{
"_id": null,
"home_page": "https://github.com/safe-global/safe-eth-py",
"name": "safe-eth-py-suraneti",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "ethereum,web3,django,safe,cowswap,gnosis",
"author": "Ux\u00edo",
"author_email": "uxio@safe.global",
"download_url": "https://files.pythonhosted.org/packages/4b/71/5b54b90b85b65f36f1b9f7cd137749ee462cadd0bc9cfdabc35b054efa5c/safe-eth-py-suraneti-5.4.3.tar.gz",
"platform": null,
"description": "Safe-eth-py (previosly known as Gnosis-py)\n##########################################\n\n.. class:: no-web no-pdf\n\n|ci| |coveralls| |python| |django| |pipy| |readthedocs| |black|\n\nSafe-eth-py includes a set of libraries to work with Ethereum and relevant Ethereum projects:\n - `EthereumClient`, a wrapper over Web3.py `Web3` client including utilities to deal with ERC20/721\n tokens and tracing.\n - `Gnosis Safe <https://github.com/safe-global/safe-contracts>`_ classes and utilities.\n - Price oracles for `Uniswap`, `Kyber`...\n - Django serializers, models and utils.\n\nQuick start\n-----------\n\nJust run ``pip install safe-eth-py-suraneti`` or add it to your **requirements.txt**\n\nIf you want django ethereum utils (models, serializers, filters...) you need to run\n``pip install safe-eth-py-suraneti[django]``\n\nIf you have issues building **coincurve** maybe\n`you are missing some libraries <https://ofek.dev/coincurve/install/#source>`_\n\n\nContributing to safe-eth-py\n---------------------------\nClone the repo, then to set it up:\n\n.. code-block:: bash\n\n python -m venv venv\n source venv/bin/activate\n pip install -r requirements-dev.txt\n pre-commit install -f\n\nEthereum utils\n--------------\ngnosis.eth\n~~~~~~~~~~~~~~~~~~~~\n- ``class EthereumClient (ethereum_node_url: str)``: Class to connect and do operations\n with a ethereum node. Uses web3 and raw rpc calls for things not supported in web3.\n Only ``http/https`` urls are suppored for the node url.\n\n``EthereumClient`` has some utils that improve a lot performance using Ethereum nodes, like\nthe possibility of doing ``batch_calls`` (a single request making read-only calls to multiple contracts):\n\n.. code-block:: python\n\n from gnosis.eth import EthereumClient\n from gnosis.eth.contracts import get_erc721_contract\n ethereum_client = EthereumClient(ETHEREUM_NODE_URL)\n erc721_contract = get_erc721_contract(self.w3, token_address)\n name, symbol = ethereum_client.batch_call([\n erc721_contract.functions.name(),\n erc721_contract.functions.symbol(),\n ])\n\nIf you want to use the underlying `web3.py <https://github.com/ethereum/web3.py>`_ library:\n\n.. code-block:: python\n\n from gnosis.eth import EthereumClient\n ethereum_client = EthereumClient(ETHEREUM_NODE_URL)\n ethereum_client.w3.eth.get_block(57)\n\n\ngnosis.eth.constants\n~~~~~~~~~~~~~~~~~~~~\n- ``NULL_ADDRESS (0x000...0)``: Solidity ``address(0)``.\n- ``SENTINEL_ADDRESS (0x000...1)``: Used for Gnosis Safe's linked lists (modules, owners...).\n- Maximum an minimum values for `R`, `S` and `V` in ethereum signatures.\n\ngnosis.eth.oracles\n~~~~~~~~~~~~~~~~~~\n\nPrice oracles for Uniswap, UniswapV2, Kyber, SushiSwap, Aave, Balancer, Curve, Mooniswap, Yearn...\nExample:\n\n.. code-block:: python\n\n from gnosis.eth import EthereumClient\n from gnosis.eth.oracles import UniswapV2Oracle\n ethereum_client = EthereumClient(ETHEREUM_NODE_URL)\n uniswap_oracle = UniswapV2Oracle(ethereum_client)\n gno_token_mainnet_address = '0x6810e776880C02933D47DB1b9fc05908e5386b96'\n weth_token_mainnet_address = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'\n price = uniswap_oracle.get_price(gno_token_mainnet_address, uniswap_oracle.weth_address)\n\n\n\ngnosis.eth.utils\n~~~~~~~~~~~~~~~~\n\nContains utils for ethereum operations:\n\n- ``get_eth_address_with_key() -> Tuple[str, bytes]``: Returns a tuple of a valid public ethereum checksumed\n address with the private key.\n- ``mk_contract_address_2(from_: Union[str, bytes], salt: Union[str, bytes], init_code: [str, bytes]) -> str``:\n Calculates the address of a new contract created using the new CREATE2 opcode.\n\nEthereum django (REST) utils\n----------------------------\nDjango utils are available under ``gnosis.eth.django``.\nYou can find a set of helpers for working with Ethereum using Django and Django Rest framework.\n\nIt includes:\n\n- **gnosis.eth.django.filters**: EthereumAddressFilter.\n- **gnosis.eth.django.models**: Model fields (Ethereum address, Ethereum big integer field).\n- **gnosis.eth.django.serializers**: Serializer fields (Ethereum address field, hexadecimal field).\n- **gnosis.eth.django.validators**: Ethereum related validators.\n- **gnosis.safe.serializers**: Serializers for Gnosis Safe (signature, transaction...).\n- All the tests are written using Django Test suite.\n\nContributors\n------------\n`See contributors <https://github.com/safe-global/safe-eth-py/graphs/contributors>`_\n\n.. |ci| image:: https://github.com/safe-global/safe-eth-py/workflows/Python%20CI/badge.svg?branch=master\n :alt: Github Actions CI build\n\n.. |coveralls| image:: https://coveralls.io/repos/github/safe-global/safe-eth-py/badge.svg?branch=master\n :target: https://coveralls.io/github/safe-global/safe-eth-py?branch=master\n :alt: Coveralls\n\n.. |python| image:: https://img.shields.io/badge/Python-3.9-blue.svg\n :alt: Python 3.9\n\n.. |django| image:: https://img.shields.io/badge/Django-2-blue.svg\n :alt: Django 2.2\n\n.. |pipy| image:: https://badge.fury.io/py/safe-eth-py.svg\n :target: https://badge.fury.io/py/safe-eth-py\n :alt: Pypi package\n\n.. |readthedocs| image:: https://readthedocs.org/projects/safe-eth-py/badge/?version=latest\n :target: https://safe-eth-py.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Black\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Safe Ecosystem Foundation utilities for Ethereum projects",
"version": "5.4.3",
"project_urls": {
"Documentation": "https://safe-eth-py.readthedocs.io/en/latest/",
"Homepage": "https://github.com/safe-global/safe-eth-py",
"Source": "https://github.com/safe-global/safe-eth-py",
"Tracker": "https://github.com/safe-global/safe-eth-py/issues"
},
"split_keywords": [
"ethereum",
"web3",
"django",
"safe",
"cowswap",
"gnosis"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3333c656d129d3f000342faf48717e13825a674031d91cc9c8345d590f6cdffa",
"md5": "341f936ff8a56460756f6e469f3256df",
"sha256": "45377a8deb57e89259d1d3f9ed00bc0c58ae9280c548a83e953c82b0b6b63970"
},
"downloads": -1,
"filename": "safe_eth_py_suraneti-5.4.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "341f936ff8a56460756f6e469f3256df",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 771901,
"upload_time": "2023-05-25T07:32:39",
"upload_time_iso_8601": "2023-05-25T07:32:39.858987Z",
"url": "https://files.pythonhosted.org/packages/33/33/c656d129d3f000342faf48717e13825a674031d91cc9c8345d590f6cdffa/safe_eth_py_suraneti-5.4.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b715b54b90b85b65f36f1b9f7cd137749ee462cadd0bc9cfdabc35b054efa5c",
"md5": "e3825cde7b4574e804f295a3301b9523",
"sha256": "35d350cbfeb5e87d1567bc4360b1d38cdc7c0ec9604a098a6be7c6bc2544e3ed"
},
"downloads": -1,
"filename": "safe-eth-py-suraneti-5.4.3.tar.gz",
"has_sig": false,
"md5_digest": "e3825cde7b4574e804f295a3301b9523",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 698506,
"upload_time": "2023-05-25T07:32:41",
"upload_time_iso_8601": "2023-05-25T07:32:41.791441Z",
"url": "https://files.pythonhosted.org/packages/4b/71/5b54b90b85b65f36f1b9f7cd137749ee462cadd0bc9cfdabc35b054efa5c/safe-eth-py-suraneti-5.4.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-25 07:32:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "safe-global",
"github_project": "safe-eth-py",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [
{
"name": "django",
"specs": [
[
"==",
"4.2.1"
]
]
},
{
"name": "django-filter",
"specs": [
[
"==",
"23.2"
]
]
},
{
"name": "djangorestframework",
"specs": [
[
"==",
"3.14.0"
]
]
},
{
"name": "hexbytes",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "packaging",
"specs": []
},
{
"name": "psycopg2-binary",
"specs": [
[
"==",
"2.9.6"
]
]
},
{
"name": "py-evm",
"specs": [
[
"==",
"0.7.0a2"
]
]
},
{
"name": "pysha3",
"specs": [
[
"<",
"2.0.0"
],
[
">=",
"1.0.0"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.31.0"
]
]
},
{
"name": "safe-pysha3",
"specs": [
[
">=",
"1.0.0"
]
]
},
{
"name": "web3",
"specs": [
[
"==",
"6.4.0"
]
]
}
],
"lcname": "safe-eth-py-suraneti"
}