Keeps track of transactions sent via Gnosis Safe contracts. It uses events and tracing to index the txs.
Transactions are detected in an automatic way, so there is no need of informing the service about the transactions as in previous versions of the Transaction Service.
Transactions can also be sent to the service to allow offchain collecting of signatures or informing the owners about a transaction that is pending to be sent to the blockchain.
Swagger (Mainnet version) Swagger (Rinkeby version)
Use a virtualenv if possible:
python -m venv venv
Then enter the virtualenv and install the dependencies:
source venv/bin/activate
pip install -r requirements-dev.txt
pre-commit install -f
cp .env.dev .env
./run_tests.sh
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
Since version 3.0.0 transaction service can be configured to rely on event indexing when SafeL2 version is used. Only contracts from v1.3.0 onwards with L2 events will be indexed.
An example environment file can be used for the L2 setup:
cp .env.l2.sample .env
Edit .env
file to add ETHEREUM_NODE_URL
(on the example a Polygon
public node is used)
and remember to modify DJANGO_SECRET_KEY
to use a strong key. The rest of the
configuration does not need to be modified. Then:
docker-compose build --force-rm
docker-compose up
If the network is not supported yet contracts can be deployed using the deployment instructions
and then a PR should be provided to this service adding the deployment block number and the address (address
will be the same for every network). Only
ProxyFactory
and GnosisSafeL2
must be configured. +L2
must be added to the Safe contract versions, so the service
knows the contract can be indexed using events.
For more parameters check base.py file.
This is the recommended configuration for running a production Transaction service. docker-compose
is required
for running the project.
bash cp .env.tracing.sample .env
Configure the parameters needed on .env
. These parameters need to be changed:
DJANGO_SECRET_KEY
: Use a strong key.ETHEREUM_NODE_URL
: Http/s address of a ethereum node. It can be the same thanETHEREUM_TRACING_NODE_URL
.ETHEREUM_TRACING_NODE_URL
: Http/s address of an OpenEthereum node with tracing enabled.
If you don't want to use trace_filter
for the internal tx indexing and just rely on trace_block
, set:
ETH_INTERNAL_NO_FILTER=1
For more parameters check base.py file.
Then:
docker-compose build --force-rm
docker-compose up
The service should be running in localhost:8000
. You can test everything is set up:
curl 'http://localhost:8000/api/v1/about/'
You can go to http://localhost:5555/ to check the status of the task queue, also you can configure prometheus metrics.
For example, to set up a Göerli node:
Run an OpenEthereum node in your local computer:
openethereum --chain goerli --tracing on --db-path=/media/ethereum/openethereum --unsafe-expose
Edit .env
so docker points to the host OpenEthereum node:
ETHEREUM_NODE_URL=http://172.17.0.1:8545
ETHEREUM_TRACING_NODE_URL=http://172.17.0.1:8545
Then:
docker-compose build --force-rm
docker-compose up
Instructions for production still apply, but some additional steps are required:
- Deploy the last version of the Safe Contracts on your private network.
- Add their addresses and the number of the block they were deployed (to optimize initial indexing). Service is currently configured to support Mainnet, Rinkeby, Goerli, Kovan, xDai, Polygon, EWC...
- If you have a custom
network id
you can change this lineethereum_network = ethereum_client.get_network()
toethereum_network_id = ethereum_client.w3.net.version
and use thenetwork id
instead of theEnum
. - Only contracts that need to be configured are the ProxyFactory that will be used to deploy the contracts and the GnosisSafe/GnosisSafeL2.
Services come with a basic administration web ui (provided by Django) by default on http://localhost:8000/admin/
A user must be created to get access:
docker exec -it safe-transaction-service-web-1 python manage.py createsuperuser
If you face issues installing the grpc
dependency locally (required by this project) on a M1 chip, set GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
and GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
and then try to install the dependency again.