NodeJS Version
npm i [email protected]
Yearn Protocol is a set of Ethereum Smart Contracts focused on creating 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.
Before getting started with this repo, please read:
- Andre's Overview Blog Post, describing how yearn.finance works.
- The Delegated Vaults Blog Post, explaining how the delegated vaults work.
- yETH Vault Explained, describing how the yETH vault works.
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: ETH Brownie.
- Local env variables for Etherscan API and Infura (
ETHERSCAN_TOKEN
,WEB3_INFURA_PROJECT_ID
). - Local Ganache environment installed with
npm install -g [email protected]
.
Below is a list of relevant smart contracts and Github repositories for using and interacting with the Yearn product suite.
The Yearn ecosystem is controlled by YFI token holders who submit and vote on proposals that govern the ecosystem.
Token | Address |
---|---|
YFI | 0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e |
The v2 yield tokens can be used in one lender at a time. Currently being used on Curve’s Y Pool, Yearn’s yBTC pool and sUSD pool.
Token | Address | Github |
---|---|---|
yDAIv2 | 0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01 | YDAIv2.sol |
yUSDCv2 | 0xd6aD7a6750A7593E092a9B218d66C0A814a3436e | YUSDCv2.sol |
yUSDTv2 | 0x83f798e925BcD4017Eb265844FDDAbb448f1707D | YUSDTv2.sol |
ysUSDv2 | 0xF61718057901F84C4eEC4339EF8f0D86D2B45600 | YSUSDv2.sol |
yTUSDv2 | 0x73a052500105205d34daf004eab301916da8190f | YTUSDv2.sol |
yWBTCv2 | 0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9 | YWBTCv2.sol |
The v3 yield tokens allow the underlying assets to be spread across multiple lenders. Currently being used on Curve’s BUSD pool.
Token | Address | Github |
---|---|---|
yDAIv3 | 0xC2cB1040220768554cf699b0d863A3cd4324ce32 | YDAIv3.sol |
yUSDCv3 | 0x26EA744E5B887E5205727f55dFBE8685e3b21951 | YUSDCv3.sol |
yUSDTv3 | 0xE6354ed5bC4b393a5Aad09f21c46E101e692d447 | YUSDCv3.sol |
yBUSDv3 | 0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE | YBUSDv3.sol |
Vaults follow unique strategies that are designed to maximize yield of the deposited asset and minimize risk. The vaults are maintained by a Controller
which oversees the strategy execution. Strategies' generated profits are used to buy respective vault underlying asset.
The Controller
contract can be found here and the source code can be found here.
Vault | Address | GitHub |
---|---|---|
WETH | 0xe1237aa7f535b0cc33fd973d66cbf830354d16c7 | yWETH.sol |
YFI | 0xba2e7fed597fd0e3e70f5130bcdbbfe06bb94fe1 | yVault.sol |
curve.fi/3pool LP | 0x9cA85572E6A3EbF24dEDd195623F188735A5179f | yVault.sol |
curve.fi/y LP | 0x5dbcf33d8c2e976c6b560249878e6f1491bca25c | yVault.sol |
curve.fi/busd LP | 0x2994529c0652d127b7842094103715ec5299bbed | yVault.sol |
curve.fi/sbtc LP | 0x7ff566e1d69deff32a7b244ae7276b9f90e9d0f6 | yVault.sol |
DAI | 0xacd43e627e64355f1861cec6d3a6688b31a6f952 | yVault.sol |
TUSD | 0x37d19d1c4e1fa9dc47bd1ea12f742a0887eda74a | yVault.sol |
USDC | 0x597ad1e0c13bfe8025993d9e79c69e1c0233522e | yVault.sol |
USDT | 0x2f08119c6f07c006695e079aafc638b8789faf18 | yVault.sol |
GUSD | 0xec0d8d3ed5477106c6d4ea27d90a60e594693c90 | yVault.sol |
curve.fi/compound LP | 0x629c759D1E83eFbF63d84eb3868B564d9521C129 | yVault.sol |
curve.fi/mUSD LP | 0x1AEf73d49Dedc4b1778d0706583995958Dc862e6 | yVault.sol |
Volatile assets can also participate in yield farming strategies as part of the Delegated Vaults. Currently, there is only one Delegated Vault: aLINK. The Controller
deposits LINK into AAVE and borrows stable coins (USDC). The initial health factor of these loans is always above 4, and if the health factor drops below 4 at any time the Controller
repays a portion of the debt in order to maintain a health factor above 4.
The stable coins borrowed (e.g., USDC, DAI, USDT, etc.) depend on the strategy selected by the Controller
. After obtaining stable coins the Controller
will deposit them into one of the yVaults identified above.
The aLINK vault uses the StrategyControllerV2
contract. The source code for StrategyControllerV2
is here.
Strategy | Strategy | GitHub |
---|---|---|
StrategyVaultUSDC | 0x25faca21dd2ad7edb3a027d543e617496820d8d6 | StrategyVaultUSDC.sol |
Vault | Address | GitHub |
---|---|---|
aLINK | 0x29e240cfd7946ba20895a7a02edb25c210f9f324 | yDelegatedVault.sol |
YFI holders govern the Yearn ecosystem and are eligible to receive a portion of protocol profits. Therefore, YFI represents a right to govern the platform and a claim on earnings. Profits are obtained from each of Yearn's products. In order to claim profits, YFI holders stake their tokens into the Governance contract.
Contract | Status | Address |
---|---|---|
Governance Staking (v2) | Live | 0xba37b002abafdd8e89a1995da52740bbc013d992 |
YearnGovernance (Balancer v1) | Old | 0x3a22df48d84957f907e67f4313e3d43179040d6e |
YearnRewards (Yearn v1) | Old | 0x0001fb050fe7312791bf6475b96569d83f695c9f |
YearnRewards (Balancer v1) | Old | 0x033e52f513f9b98e129381c6708f9faa2dee5db5 |
YearnRewards (Gov. Staking v1) | Old | 0xb01419e74d8a2abb1bbad82925b19c36c191a701 |
Utility | Summary |
---|---|
YRegistry | The Vault Registry is the single source of truth for active Yearn vaults. The registry allows users to query for active Yearn vaults and vault metadata (details here). |
UniswapROI | On-chain uniswap pool ROI calculator |
APROracle | Allows on-chain rate comparison between Compound, Fulcrum, Aave, and dYdX. |
UniswapAPR | An on-chain uniswap pool APR calculator. It calculates all values in ETH adjusted for the last year. |
IEarnAPR | Contract for on-chain APR decision trees between Compound, Fulcrum, Aave, and dYdX. |
IEarnManager | On-chain stateless execution. Recommendations based on IearnAPR. |
APRWithPoolOracle | APR used for stateless recommend() function. Can be used to change the recommended provider. |
IEarnAPRWithPool | APR used for stateless recommend() function. Can be used to change the recommended provider. |
Utility | Address |
---|---|
Curve's yPool | 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8 |