This Hardhat environment is configured to use Mainnet fork by default and provides templates and utilities for strategy development and testing.
- Run
npm install
to install all the dependencies. - Sign up on Alchemy. We recommend using Alchemy over Infura to allow for a reproducible Mainnet fork testing environment as well as efficiency due to caching.
- Create a file
dev-keys.json
:
{
"alchemyKey": "<your-alchemy-key>"
}
All tests are located under the test
folder.
- Run
npx hardhat test [test file location]
:npx hardhat test ./test/balancer/wsteth-usdc.js
(if for some reason the NodeJS heap runs out of memory, make sure to explicitly increase its size viaexport NODE_OPTIONS=--max_old_space_size=4096
). This will produce the following output:
Arbitrum Mainnet Balancer wstETH-USDC
Impersonating...
0x6a74649aCFD7822ae8Fb78463a9f2192752E5Aa2
0x0345Bc8EDdbba03E11e366cFb4E2b232b8f1b739
Fetching Underlying at: 0x178E029173417b1F9C8bC16DCeC6f697bC323746
New Vault Deployed: 0xa4B5Ad0ca0E05ea73E59046CBCb6b3641318c9d3
Strategy Deployed: 0xf47FCd7914b24676C78222Af1431f4826B368F30
Happy path
loop 0
old shareprice: 1000000000000000000
new shareprice: 1000000000000000000
growth: 1
instant APR: 0 %
instant APY: 0 %
loop 1
old shareprice: 1000000000000000000
new shareprice: 1000068403677420556
growth: 1.0000684036774206
instant APR: 26.04926042303911 %
instant APY: 29.74485660521895 %
loop 2
old shareprice: 1000068403677420556
new shareprice: 1000131319321304444
growth: 1.0000629113405168
instant APR: 23.95768699115301 %
instant APY: 27.061149684423057 %
loop 3
old shareprice: 1000131319321304444
new shareprice: 1000193897701257046
growth: 1.0000625701632813
instant APR: 23.827761013559037 %
instant APY: 26.896279294823277 %
loop 4
old shareprice: 1000193897701257046
new shareprice: 1000256321542735812
growth: 1.000062411739986
instant APR: 23.767430782293474 %
instant APY: 26.819795416465155 %
loop 5
old shareprice: 1000256321542735812
new shareprice: 1000318634555811359
growth: 1.0000622970450008
instant APR: 23.723753020397634 %
instant APY: 26.76445146036619 %
loop 6
old shareprice: 1000318634555811359
new shareprice: 1000380840931449184
growth: 1.0000621865608508
instant APR: 23.681678814655715 %
instant APY: 26.711162141078937 %
loop 7
old shareprice: 1000380840931449184
new shareprice: 1000442949039498353
growth: 1.0000620844637442
instant APR: 23.642798534864234 %
instant APY: 26.661937967659497 %
loop 8
old shareprice: 1000442949039498353
new shareprice: 1000479005035224559
growth: 1.0000360400318287
instant APR: 13.724644787553073 %
instant APY: 14.708122498585574 %
loop 9
old shareprice: 1000479005035224559
new shareprice: 1000479005035224559
growth: 1
instant APR: 0 %
instant APY: 0 %
earned!
APR: 18.24131008308575 %
APY: 20.005517445690145 %
✔ Farmer should earn money (32947ms)
1 passing (37s)
Under contracts/strategies
, there are plenty of examples to choose from in the repository already, therefore, creating a strategy is no longer a complicated task. Copy-pasting existing strategies with minor modifications is acceptable.
Under contracts/base
, there are existing base interfaces and contracts that can speed up development.
When ready, open a pull request with the following information:
-
Instructions on how to run the test and at which block number
-
A mainnet fork test output (like the one above in the README) clearly showing the increases of share price
-
Info about the protocol, including:
- Live farm page(s)
- GitHub link(s)
- Etherscan link(s)
- Start/end dates for rewards
- Any limitations (e.g., maximum pool size)
- Current pool sizes used for liquidation (to make sure they are not too shallow)
The first few items can be omitted for well-known protocols (such as
curve.fi
). -
A description of potential value for Harvest: why should your strategy be live? High APYs, decent pool sizes, longevity of rewards, well-secured protocols, high-potential collaborations, etc.
A more extensive checklist for assessing protocols and farming opportunities can be found here
If your pull request is merged and given a green light for deployment, the Harvest team will take care of on-chain deployment.