- 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.
- Safe classes and utilities.
- Price oracles for Uniswap, Kyber...
- Django serializers, models and utils.
Just run pip install safe-eth-py
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[django]
If you have issues building coincurve maybe you are missing some libraries
Clone the repo, then to set it up:
python -m venv venv
source venv/bin/activate
pip install -r requirements-dev.txt
pre-commit install -f
If you want to add Safe Smart Account support for a new chain you must open a new issue.
Once the issue is created or edited, an automatic validation will be executed and a Pull Request will be created if everything is ok. Finally, the Safe team will review and merge the automatic Pull Request generated from the issue.
class EthereumClient (ethereum_node_url: str)
: Class to connect and do operations with an ethereum node. Uses web3 and raw rpc calls for things not supported in web3. Onlyhttp/https
urls are supported 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):
from safe_eth.eth import EthereumClient
from safe_eth.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 library:
from safe_eth.eth import EthereumClient
ethereum_client = EthereumClient(ETHEREUM_NODE_URL)
ethereum_client.w3.eth.get_block(57)
NULL_ADDRESS (0x000...0)
: Solidityaddress(0)
.SENTINEL_ADDRESS (0x000...1)
: Used for Safe's linked lists (modules, owners...).- Maximum and minimum values for R, S and V in ethereum signatures.
Price oracles for Uniswap, UniswapV2, Kyber, SushiSwap, Aave, Balancer, Curve, Mooniswap, Yearn... Example:
from safe_eth.eth import EthereumClient
from safe_eth.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)
Contains utils for ethereum operations:
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.
Django utils are available under safe_eth.eth.django
.
You can find a set of helpers for working with Ethereum using Django and Django Rest framework.
It includes:
- safe_eth.eth.django.filters: EthereumAddressFilter.
- safe_eth.eth.django.models: Model fields (Ethereum address, Ethereum big integer field).
- safe_eth.eth.django.serializers: Serializer fields (Ethereum address field, hexadecimal field).
- safe_eth.eth.django.validators: Ethereum related validators.
- safe_eth.safe.serializers: Serializers for Safe (signature, transaction...).
- All the tests are written using Django Test suite.