This repo is dedicated to making minimal repos of existing defi primatives.
Defi Minimal
This repo is dedicated to making minimal repos of existing defi primatives.
| :exclamation: ** WARNING None of the contracts are audited! | |-----------------------------------------|
Completed (but unreviewed) minimal contracts:
Lending.sol: Based off AaveStaking.sol: Based off SynthetixRewardToken.sol: Based off SynthetixExchange.sol,Factory.sol,Token.sol: Based off Uniswap v1. The used pricing formula is documented hereDecentralizedStableCoin: Based off DAICentralizedStableCoin: Based off USDC
Uncompleted:
Options.sol: Based off nothing
Not a minimal contract:
Swap.sol: Based off Uniswap - shows how a smart contract can integrate with a Uniswap-like dex.
Table Of Contents
- Completed (but unreviewed) minimal contracts: - Uncompleted: - Not a minimal contract: - Requirements - Quickstart - Deploying Contracts - Run a Local Network - Using a Testnet or Live Network (like Mainnet or Polygon) - Rinkeby Ethereum Testnet SetupGetting Started
It's recommended that you've gone through the hardhat getting started documentation before proceeding here.
Requirements
- You'll know you did it right if you can rungit --version and you see a response like git version x.x.x
- You'll know you've installed nodejs right if you can run:
- node --versionand get an ouput like: vx.x.x
- Yarn instead of
npm
yarn --version And get an output like: x.x.x
- You might need to install it with npm
If you're familiar withnpxandnpminstead ofyarn, you can usenpxfor execution andnpmfor installing dependencies.
Quickstart
- Clone and install dependencies
git clone https://github.com/smartcontractkit/defi-minimal/
cd defi-minimal
Then:
yarn
or
npm i
- You can now do stuff!
yarn hardhat test
or
npx hardhat test
Usage
If you run yarn hardhat --help you'll get an output of all the tasks you can run.
Deploying Contracts
yarn hardhat deploy
This will deploy your contracts to a local network. Additionally, if on a local network, it will deploy mock Chainlink contracts for you to interact with. If you'd like to interact with your deployed contracts, skip down to Interacting with Deployed Contracts.
Run a Local Network
One of the best ways to test and interact with smart contracts is with a local network. To run a local network with all your contracts in it, run the following:
yarn hardhat node
You'll get a local blockchain, private keys, contracts deployed (from the deploy folder scripts), and an endpoint to potentially add to an EVM wallet.
Using a Testnet or Live Network (like Mainnet or Polygon)
In your hardhat.config.js you'll see section like:
module.exports = {
defaultNetwork: "hardhat",
networks: {
This section of the file is where you define which networks you want to interact with. You can read more about that whole file in the hardhat documentation.
To interact with a live or test network, you'll need:
- An rpc URL
- A Private Key
- ETH & LINK token (either testnet or real)
Rinkeby Ethereum Testnet Setup
First, we will need to set environment variables. We can do so by setting them in our .env file (create it if it's not there). You can also read more about environment variables from the linked twilio blog. You'll find a sample of what this file will look like in .env.example
IMPORTANT: MAKE SURE YOU'D DONT EXPOSE THE KEYS YOU PUT IN THIS .env FILE. By that, I mean don't push them to a public repo, and please try to keep them keys you use in development not associated with any real funds.
- Set your
RINKEBYRPCURLenvironment variable.
- Set your
PRIVATE_KEYenvironment variable.
MNEMONIC environment variable instead with some changes to the hardhat.config.js.
WARNING
When developing, it's best practice to use a Metamask that isn't associated with any real money. A good way to do this is to make a new browser profile (on Chrome, Brave, Firefox, etc) and install Metamask on that brower, and never send this wallet money.
Don't commit and push any changes to .env files that may contain sensitive information, such as a private key! If this information reaches a public GitHub repository, someone can use it to check if you have any Mainnet funds in that wallet address, and steal them!
.env example:
RINKEBYRPCURL='www.infura.io/asdfadsfafdadf' PRIVATE_KEY='abcdef' bash example export RINKEBYRPCURL='www.infura.io/asdfadsfafdadf' export PRIVATE_KEY='abcdef'
You can also use aMNEMONICinstead of aPRIVATEKEYenvironment variable by uncommenting the section in thehardhat.config.js, and commenting out thePRIVATEKEYline. However this is not recommended.
For other networks like mainnet and polygon, you can use different environment variables for your RPC URL and your private key. See the hardhat.config.js to learn more.
- Get some Rinkeby Testnet ETH and LINK
Code Formating
This will format both your javascript and solidity to look nicer.
yarn format
Slither Static Analysis
You'll need python and slither installed.
yarn slither
Contributing
Contributions are always welcome! Open a PR or an issue!