scripts
scripts copied to clipboard
Lido DAO scripts covering on-chain ops
Voting scripts

Lido DAO Aragon omnibus voting scripts.
🏁 Getting started
- This project uses Brownie development framework. Learn more about Brownie.
- Poetry dependency and packaging manager is used to bootstrap environment and keep the repo sane.
Prerequisites
- Python >= 3.10, <3.11
- Pip >= 20.0
- Node >= 16.0
- yarn >= 1.22
Step 1. Install Poetry
Use the following command to install poetry:
pip install --user poetry==1.8.2
alternatively, you could proceed with pipx
:
pipx install poetry==1.8.2
Step 2. Setup dependencies with poetry
Ensure that poetry bin path is added to your $PATH
env variable.
Usually it's $HOME/.local/bin
for most Unix-like systems.
poetry install
Step 3. Install Ganache locally
Simply run the following command from the project's directory
yarn
Step 4. Import network config to connect brownie with local Ganache
poetry run brownie networks import network-config.yaml True
Step 5. Activate virtual environment
📝 While previous steps needed only once to init the environment from scratch, the current step is used regularly to activate the environment every time you need it.
poetry shell
⚗️ Workflow
Network setup
By default, you should start composing new scripts and test using forked networks. You have three forked networks to work with:
-
mainnet-fork
-
holesky-fork
-
sepolia-fork
To start new voting on the live networks you could proceed with:
-
mainnet
-
holesky
-
sepolia
[!CAUTION] You can't run tests on the live networks.
In a typical weekly omnibus workflow, you need only mainnet-fork
and
mainnet
networks. In case of large test campaign on Lido upgrades,
it also could be useful to go with holesky
and holesky-fork
testnets first.
[!WARNING] Holesky is partially supported. At the moment not all parameters are set in
configs/config_holesky.py
and acceptance/regression/snapshot tests are not operational.Sepolia is partially supported. At the moment not all parameters are set in
configs/config_sepolia.py
and acceptance/regression/snapshot tests are not operational.
Environment variables setup
Despite the chosen network you always need to set the following var:
export WEB3_INFURA_PROJECT_ID=<infura_api_key>
To start a new vote please provide the DEPLOYER
brownie account name (wallet):
export DEPLOYER=<brownie_wallet_name>
To run tests with a contract name resolution guided by the Etherscan you should provide the etherscan API token:
export ETHERSCAN_TOKEN=<etherscan_api_key>
To upload Markdown vote description for a new vote to IPFS you can use one of those:
- Pinata Cloud API key.
- Infura API key for IPFS.
- Web3 API token web3.storage:
# Pinata Cloud
export PINATA_CLOUD_TOKEN=<pinata_api_key>
# For Infura Web3
export WEB3_INFURA_IPFS_PROJECT_ID=<infura_project_id>
export WEB3_INFURA_IPFS_PROJECT_SECRET=<infura_project_secret>
# For WEB3
export WEB3_STORAGE_TOKEN=<web3_storage_api_key>
See here to learn more Markdown description
To skip events decoding while testing set the following var:
export OMNIBUS_BYPASS_EVENTS_DECODING=1
To run tests with already started vote provide its id:
export OMNIBUS_VOTE_IDS=156
To use local ABIs for events decoding use:
export ENV_PARSE_EVENTS_FROM_LOCAL_ABI=1
To make default report for acceptance and regression tests after voting execution set:
export REPORT_AFTER_VOTE=1
Tests structure
tests/acceptance
Directory contains state based tests. This tests run every time when tests suite started, if there are any voting scripts or upgrade scripts they will be applied before.
tests/regression
Directory contains scenario tests. This tests run every time when tests suite started, if there are any voting scripts or upgrade scripts they will be applied before.
tests/snapshot
Directory contains snapshot-scenario tests. This tests run only if there are any upgrade scripts.
test/vote_*.py
Tests for current voting
Test run
To run all the test on mainnet-fork
execute
brownie test
You can pass network name explicitly with --network {network-name}
brownie
command-line argument.
To reveal a full test output pass the -s
flag
See here to learn more about tests
Notes on running tests in a forked mode
- To forcibly bypass etherscan contract and event names decoding set the
OMNIBUS_BYPASS_EVENTS_DECODING
environment variable to1
. It could be useful in case of etherscan downtimes or usage of some unverified contracts (especially, on the Görli Testnet). - To re-use the already created
vote_id
you can pass theOMNIBUS_VOTE_IDS
environment variable (e.g.OMNIBUS_VOTE_IDS=104
). - To re-use multiple created votes list the ids comma-separated (e.g.
OMNIBUS_VOTE_IDS=104,105
) - To force the large CI runner usage, please name your branch with the
large-vote_
prefix.
Code style
Please, use the shared pre-commit hooks to maintain code style:
poetry run pre-commit install
Repository housekeeping
Please move your outdated scripts into archive/scripts
and outdated tests into
archive/tests
directories.
Use cases and scripts examples
- Node operators management
- Reward manager tokens recovery
Troubleshooting
Invalid hashes (step 2)
If you have encountered Invalid hashes
errors while trying to run previous command, please remove poetry's cache:
- GNU/Linux
rm -rf ~/.cache/pypoetry/cache/
rm -rf ~/.cache/pypoetry/artifacts/
- MAC OS:
rm -rf ~/Library/Caches/pypoetry/cache
rm -rf ~/Library/Caches/pypoetry/artifacts