Please read and be familiar with the Specification.
This repository is the set of smart contracts that are used for the Yearn Vaults. It contains the requirements, code, deployment scripts, and tests necessary for the core protocol, including a inheritable template strategy for use with Solidity-based strategies that interact with Yearn Vaults. These contracts are used to create a simple way to generate high risk-adjusted returns for depositors of various assets via best- in-class lending protocols, liquidity pools, and community-made yield farming strategies on Ethereum.
To run the project you need:
- Python 3.8 local development environment and Node.js 10.x development environment for Ganache.
- Brownie local environment setup. See instructions for how to install it here.
- Local env variables for Etherscan API and
Infura (
ETHERSCAN_TOKEN
,WEB3_INFURA_PROJECT_ID
). - Local Ganache environment installed with
npm install -g ganache
.
To use the tools that this project provides, please pull the repository from GitHub and install its dependencies as follows. You will need yarn installed. It is recommended to use a Python virtual environment.
git clone https://github.com/yearn/yearn-vaults
cd yearn-vaults
yarn install --lock-file
Compile the Smart Contracts:
brownie compile # add `--size` to see contract compiled sizes
The below guide covers installation on Mac, Linux, Windows, and Windows using the Windows Subsystem for Linux.
Any command in code blocks
is meant to be executed from a Mac/Linux terminal or Windows command prompt.
- Note for Windows users: if you want to use the Windows Subsystem for Linux (WSL), go ahead and install it now
- After it's installed, launch your chosen Linux subsystem
- Follow the Linux instructions below from within your terminal, except for VSCode. Any VSCode installation happens in Windows, not the Linux subsystem.
- Install VSCode
- Install VSCode Extensions
- Solidity
- Python
- Vyper
- If you're using the WSL
- Wait to install Solidity & Vyper, you'll do this in a later step
- Install Remote - WSL
- Install Python 3.8
- Linux: Refer to your distro documentation
- Mac installer
- Windows installer
- Setup Brownie
python3 -m pip install --user pipx
- Note, if get you an error to the effect of python3 not being installed or recognized, run
python --version
, if it returns back something likePython 3.8.x
then just replacepython3
withpython
for all python commands in these instructions
- Note, if get you an error to the effect of python3 not being installed or recognized, run
python3 -m pipx ensurepath
pipx install eth-brownie
- If you're on Windows (pure Windows, not WSL), you'll need to install the C++ Build Tools before executing this
- Install Node.js 10.x
- Linux or Mac: via your package manager
- Windows: x64 installer
- Other 10.x downloads
- Install Ganache
npm install -g ganache
- Install Yarn
- Install Black
python3 -m pip install black
- Setup an account on Etherscan and create an API key
- Set
ETHERSCAN_TOKEN
environment variable to this key's value- Windows:
setx ETHERSCAN_TOKEN yourtokenvalue
- Mac/Linux:
echo "export ETHERSCAN_TOKEN=\"yourtokenvalue\"" | sudo tee -a ~/.bash_profile
- Windows:
- Set
- Setup an account on Infura and create an API key
- Set
WEB3_INFURA_PROJECT_ID
environment variable to this key's value- Windows:
setx WEB3_INFURA_PROJECT_ID yourtokenvalue
- Mac/Linux:
echo "export WEB3_INFURA_PROJECT_ID=\"yourtokenvalue\"" | sudo tee -a ~/.bash_profile
- Windows:
- Set
- Close & re-open your terminal before proceeding (to get the new environment variable values)
- If you don't have git yet, go set it up
- Pull the repository from GitHub and install its dependencies
git clone https://github.com/yearn/yearn-vaults
cd yearn-vaults
yarn install --lock-file
- You may have to install with
--ignore-engines
(try this if you get an error)
- You may have to install with
- Compile the Smart Contracts:
brownie compile
brownie test tests/functional/ -s -n auto
* If everything worked, you'll see something like the following:- Launch VSCode
- If you're in Windows using WSL, type
code .
to launch VSCode- At this point install Solidity Compiler - be sure to Install in WSL
- Install Vyper as well on WSL
- Open one of the .sol files, right click the code and click Soldity: Change Workspace compiler version (Remote), Change to 0.6.12
- Alternatively, go to File -> Preferences -> Settings
- If you’re using WSL, go to the Remote [WSL] tab
- Otherwise choose the Workspace tab
- Search for Solidity and copy and paste v0.6.12+commit.27d51765 into the Solidity: Compile Using Remote Version textbox
- Set solidity remapping
- To resolve imports properly in vscode you will need to remap how
@openzeppelin
is resolved - Goto File -> Preferences -> Settings
- Search for
solidity
- Look for
Solidity: Remappings
and pressEdit in settings.json
- Enter the following remapping with the path of where brownie installed the solidity dependencies. For example:
-
{ //...prev configs..., "solidity.remappings": [ "@openzeppelin=/home/<username>/.brownie/packages/OpenZeppelin/openzeppelin-contracts@3.1.0" ] }```
- To resolve imports properly in vscode you will need to remap how
- Set Black as the linter.
- You'll see a toast notification the bottom right asking about linting, choose black
- If you don't see this, just go to File -> Preferences -> Settings
- If you're using WSL, go to the Remote [WSL] tab.
- Otherwise choose the Workspace tab
- Search for python formatting provider and choose black.
- Search for format on save and check the box
- If you're in Windows using WSL, type
- Lastly, you'll want to add .vscode to to your global .gitignore
- Use a terminal on Mac / Linux, use Git Bash on Windows
touch ~/.gitignore_global
- use your favorite editor and add
.vscode/
to the ignore file- Using vi:
vi ~/.gitignore_global
- copy
.vscode/
and hitp
in vi - type
:x
and hit enter
- Using vi:
git config --global core.excludesfile ~/.gitignore_global
- Congratulations! You're all set up.
- Use
git pull
to stay up to date with any changes made to the source code
- Use
If you're not familiar with brownie, see the quickstart.
The fastest way to run the tests is:
brownie test tests/functional/ -n auto
Run tests with coverage and gas profiling:
brownie test tests/functional/ --coverage --gas -n auto
A brief explanation of flags:
-s
- provides iterative display of the tests being executed-n auto
- parallelize the tests, letting brownie choose the degree of parallelization--gas
- generates a gas profile report--coverage
- generates a test coverage report
Check linter rules for *.json
and *.sol
files:
yarn lint:check
Fix linter errors for *.json
and *.sol
files:
yarn lint:fix
Check linter rules for *.py
files:
black . --check
Fix linter errors for *.py
files:
black .
For security concerns, please visit Bug Bounty.
You can read more about Yearn Finance on our documentation webpage.
For questions not covered in the docs, please visit our Discord server.