Angle is a decentralized stablecoin protocol, ruled by the veANGLE token and natively deployed on multiple EVM compatible chains (including Ethereum, Polygon, Optimism, Arbitrum, ...).
This repository contains the smart contracts for the cross-chain governance system for Angle Protocol relying on LayerZero message passing infrastructure.
It also comes with some utils and scripts to facilitate the creation and execution of proposals on top of the deployed system.
- Create a script in
scripts/proposals. Take for examplescripts/proposals/SetMinDelayTimelock.s.soland the contract name isSetMinDelayTimelock - Create the associated test in
tests/scripts. If the script contract name isXXXthe test contract should be namedXXXTest. - You can create, simulate and potentially send (you will be asked if you want) the proposals by running
yarn create:proposal. You will be prompted to specify the script you want to run, you should enterXXX. Then asks on which chains you want to run the script, and finally after tests are passing you are asked if you want to send the proposal to the on chain governance.
Angle onchain governance works as follows:
- veANGLE holders vote on Ethereum on an OpenZeppelin
Governorimplementation calledAngleGovernorwith a predetermined quorum, voting delay, proposal and shortcircuit thresholds. - On every chain where the protocol is deployed, there is a
Timelockcontract which is admin of all the protocol contracts (Borrowing module, Transmuter, direct deposit modules, ...) of its chain. - While only onchain votes can lead to payloads being included in the
Timelockcontract of a chain before execution, Angle 4/6 Governance multisig (deployed on all chains as well) has a veto power on the payloads in Timelock contracts, and can cancel rogue governance votes. - For successful votes on non-Ethereum proposals, payloads to execute are bridged to the chain of interest using LayerZero message passing technology before being sent to the
Timelockcontract of their chain.
Precisely speaking, once a vote succeeds (majority of positive votes + quorum), the flow is the following:
- If the vote concerns an Ethereum action:
- The payload to execute is sent to the Ethereum
Timelockcontract. The Ethereum Timelock contract only accepts payload from theAngleGovernorcontract - After the timelock period ends, if the payload is not veto-ed by Angle Governance multisig on Ethereum, it can be executed on Ethereum.
- The payload to execute is sent to the Ethereum
- If the vote concerns an action on another chain:
- The payload to execute is sent to a
ProposalSendercontract on Ethereum which is a simple LayerZero message passing contract owned by theAngleGovernorcontract. - This payload is to be received on the destination chain by a
ProposalReceivercontract which role is to then send the payload to the Timelock contract of this chain.Timelockcontracts of non-Ethereum chains only accept payloads from their respectiveProposalReceivercontract.
- The payload to execute is sent to a
It's worth noting that, setup like this, the Angle Governance system can be abstracted among a decision module (AngleGovernor contract) and an execution module. Both are modular, and so any could be changed at any time in the future.
- The
AngleGovernorimplementation relies on several OpenZeppelin extensions, on the auditedGovernorCountingFractionalextension by ScopeLift. It is a fork of the audited governance system by FRAX. - The
ProposalReceiverandProposalSendercontracts are forks from LayerZero Labs implementation. Find their audits here.
For contracts deployed for the Angle Protocol, a bug bounty is open on Immunefi and Hats Finance. The rewards and scope of the Angle Immunefi are defined here.
All Angle governance deployment addresses can be found in the developers documentation here.
You can install all dependencies by running
yarn
forge iIn order to interact with non local networks, you must create an .env that has:
PRIVATE_KEYMNEMONIC- network key (eg.
ALCHEMY_NETWORK_KEY) ETHERSCAN_API_KEY
For additional keys, you can check the .env.example file.
Warning: always keep your confidential information safe.
curl -L https://foundry.paradigm.xyz | bash
source /root/.zshrc
# or, if you're under bash: source /root/.bashrc
foundryupTo install the standard library:
forge install foundry-rs/forge-stdTo update libraries:
forge updateIf you don’t want to install Rust and Foundry on your computer, you can use Docker Image is available here ghcr.io/foundry-rs/foundry.
docker pull ghcr.io/foundry-rs/foundry
docker tag ghcr.io/foundry-rs/foundry:latest foundry:latestTo run the container:
docker run -it --rm -v $(pwd):/app -w /app foundry shThen you are inside the container and can run Foundry’s commands.
- Always keep your confidential information safe
- This repository uses
ffiin its test suite. Beware as a malicious actor forking this repo may execute malicious commands on your machine
You can run tests as follows:
forge test -vvvv --watch
forge test -vvvv --match-path test/unit/Constants.t.sol
forge test -vvvv --match-test "testAbc*"
forge test -vvvv --fork-url https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdfYou can also list tests:
forge test --list
forge test --list --json --match-test "testXXX*"There is an example script in the scripts/foundry folder. Then you can run:
yarn foundry:deploy <FILE_NAME> --rpc-url <NETWORK_NAME>Example:
yarn foundry:deploy scripts/foundry/DeployMockAgEUR.s.sol --rpc-url goerliWe recommend the use of this vscode extension.
yarn coverageYou'll need to install lcov brew install lcov to visualize the coverage report.
yarn gasIf you're interested in contributing, please see our contributions guidelines.
For any question or feedback you can send an email to contact@angle.money. Don't hesitate to reach out on Twitter🐦 as well.
This repository is released under the MIT License.
Don't hesitate to reach out on Twitter 🐦
