Ape - YTC
Iteration 1: User deposits 10 USDC to get 9.9 PT and 10 YT. 9.9 PT sold for 9.7 USDC. Iteration 2: Deposit USDC back for more PT and YT. Sell PT for USDC and return to user. (Iteration 2 is where the real magic happens)
This is called Yield Token Compounding.
At the end of i=2, user put in 10 USDC to get 19.72 YT and 9.54 USDC.
Created as a part of ETHGlobal HackMoney
Product
- We wanted to add a UI to our automated YTC solution + real time YTC calculator. However, our front-end developer got covid and this couldn't be done
- As a result we came up with 2 products:
scripts/ytc-test.js
-> this can be added into the ELF-SDK or used by bots or accessed via remix.scripts/ytcCalculator.js
-> A real time YTC calculator that takes into account slippage, trading fees across yearn, balancer, element.fi and current liquidity, interest rates on element.
- We wanted to include these into elf-sdk and use it more extensively, however due to time restrictions, we couldn't get it to work.
YTC Contract
Step 1: SC approves Balancer vault on sending tranche tokens (aka Principal Tokens) on its behalf Step 2: User approves SC to spend base tokens on its behalf Step 3: User calls SC.compound() with relevant details.
This is an automated tool that drastically improves UX for YTC. Furthermore, it accounts for slippage too.
Future Improvements
- Gas improvements
- More slippage protection
- Integrate
element-finance SDK
- Better gas price prediction and inclusion into the final APR for the YTC Calculator.
Instructions:
npm i
npx hardhat compile
This generates the ABI/artificats. This can be found in the src/artifacts
directory.
To run scripts/or do transactions in goerli, you need to set 2 env variables (used by hardhat.config.js)
GOERLI_PROVIDER_URL = alchemy/infura
PRIVATE_KEY = the goerli pvt key you are using when running scripts as a signer!
Element.fi contract addresses:
./goerli-constants.json
Alternatively use the elf-sdk.
Hardhat stuff:
Run a hardhat node through:
npx hardhat node
Deploy contracts using:
npx hardhat run --network localhost scripts/deploy.js
Use any network defined in hardhat.config.js
Note that for this, you would need to first deploy Balancer pools, tranches, mint base tokens etc..
Running a local mainnet fork (development environment)
Required environment variables
- copy default.env to .env
cp default.env .env
- Add your own values for the following:
GOERLI_PROVIDER_URL, MAINNET_PROVIDER_URL, PRIVATE_KEY
- And set REACT_APP_NETWORK accordingly:
REACT_APP_NETWORK=mainnet
- run
source .env
to load environment variables in every terminal instance that you are using
Install dependencies
- Run
npm install
for repository level dependencies - Run
cd frontend && npm install
for frontend dependencies
Running a mainnet fork and rpc node
- Run
hh clean
to remove all previous caching and build files (not necessary on first run) - Run
npm start
to build a new set of binaries, types, and to start the rpc node
Running the frontend
- Run
npm run frontend
Getting base tokens for testing
- Wait for the mainnet fork rpc to be running
- Run
hh run scripts/transferTokens.ts --network localhost
, and tokens will be added to your account
Using the application
- Visit localhost:3000 in browser
- Add a new network to metamask, with rpc url: localhost:8545 and chainId: 31337
- If this is not the first time using the account. Reset the account by going to Settings -> Advanced -> Reset Account (This needs to be done every time you restart the rpc node)
- Ensure that you are using the account for which you put the private key in the .env file
- Use the app how you would any web3 application