The Lodestar Protocol, including this README, is a fork of Compound, with some enhancements layered on top focused on the Arbitrum communities. All changes are open-sourced. We are building on the shoulders of giants.
The Lodestar Protocol is an Ethereum smart contract for supplying or borrowing assets. Through the cToken contracts, accounts on the blockchain supply capital (Ether or ERC-20 tokens) to receive cTokens or borrow assets from the protocol (holding other assets as collateral). The Lodestar cToken contracts track these balances and algorithmically set interest rates for borrowers.
Before getting started with this repo, please read:
For questions about interacting with Lodestar, please visit our Discord server.
For security concerns, please email dev@lodestarfinance.io. Or review our bug bounty (coming soon).
Please message us in Discord with any questions, or open up a pull-request with your changes and we will be more than happy to review it further.
We detail a few of the core contracts in the Lodestar protocol.
npx saddle deploy Comptroller -n mainnet
to deploy to mainnet and generate new ABInode script/comptroller-abi
to merge the new Comptroller ABI with the Unitroller ABITo run Lodestar, pull the repository from GitHub and install its dependencies. You will need yarn or npm installed.
git clone https://github.com/LodestarFinance/lodestar-protocol.git
cd lodestar-protocol
yarn install --lock-file # or `npm install`
The Lodestar Protocol has a simple scenario evaluation tool to test and evaluate scenarios which could occur on the blockchain. This is primarily used for constructing high-level integration tests. The tool also has a REPL to interact with local the Lodestar Protocol (similar to truffle console
).
yarn repl -n development
yarn repl -n rinkeby
> Read CToken cBAT Address
Command: Read CToken cBAT Address
AddressV<val=0xAD53863b864AE703D31b819d29c14cDA93D7c6a6>
You can read more about the scenario runner in the Scenario Docs on steps for using the repl.
Jest contract tests are defined under the tests directory. To run the tests run:
yarn test
There are additional tests under the spec/scenario folder. These are high-level integration tests based on the scenario runner depicted above. The aim of these tests is to be highly literate and have high coverage in the interaction of contracts.
To run code coverage, run:
yarn coverage
To lint the code, run:
yarn lint
To run in docker:
# Build the docker image
docker build -t lodestar-protocol .
# Run a shell to the built image
docker run -it lodestar-protocol /bin/sh
From within a docker shell, you can interact locally with the protocol via ganache and truffle:
/lodestar-protocol > yarn console -n goerli
Using network goerli https://goerli-eth.compound.finance (Compounds API)
Saddle console on network goerli https://goerli-eth.compound.finance (Compounds API)
Deployed goerli contracts
comptroller: 0x627EA49279FD0dE89186A58b8758aD02B6Be2867
comp: 0xfa5E1B628EFB17C024ca76f65B45Faf6B3128CA5
governorAlpha: 0x8C3969Dd514B559D78135e9C210F2F773Feadf21
maximillion: 0x73d3F01b8aC5063f4601C7C45DA5Fdf1b5240C92
priceOracle: 0x9A536Ed5C97686988F93C9f7C2A390bF3B59c0ec
priceOracleProxy: 0xd0c84453b3945cd7e84BF7fc53BfFd6718913B71
timelock: 0x25e46957363e16C4e2D5F2854b062475F9f8d287
unitroller: 0x627EA49279FD0dE89186A58b8758aD02B6Be2867
> await comp.methods.totalSupply().call()
'10000000000000000000000000'
After you deploy, as above, you can run a truffle console with the following command:
yarn console -n goerli
This command will start a saddle console connected to Goerli testnet (see Saddle README):
Using network goerli https://goerli.infura.io/v3/e1a5d4d2c06a4e81945fca56d0d5d8ea
Saddle console on network goerli https://goerli.infura.io/v3/e1a5d4d2c06a4e81945fca56d0d5d8ea
Deployed goerli contracts
comptroller: 0x627EA49279FD0dE89186A58b8758aD02B6Be2867
comp: 0xfa5E1B628EFB17C024ca76f65B45Faf6B3128CA5
governorAlpha: 0x8C3969Dd514B559D78135e9C210F2F773Feadf21
maximillion: 0x73d3F01b8aC5063f4601C7C45DA5Fdf1b5240C92
priceOracle: 0x9A536Ed5C97686988F93C9f7C2A390bF3B59c0ec
priceOracleProxy: 0xd0c84453b3945cd7e84BF7fc53BfFd6718913B71
timelock: 0x25e46957363e16C4e2D5F2854b062475F9f8d287
unitroller: 0x627EA49279FD0dE89186A58b8758aD02B6Be2867
> await comp.methods.totalSupply().call()
'10000000000000000000000000'
Note: you will need to set ~/.ethereum/<network>
with your private key or assign your private key to the environment variable ACCOUNT
.
Note: for all sections including Etherscan verification, you must set the ETHERSCAN_API_KEY
to a valid API Key from Etherscan.
To deploy a new cToken, you can run the token:deploy
. command, as follows. If you set VERIFY=true
, the script will verify the token on Etherscan as well. The JSON here is the token config JSON, which should be specific to the token you wish to list.
npx saddle -n rinkeby script token:deploy '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Lodestar Kyber Network Crystal",
"symbol": "lKNC",
"decimals": "8",
"admin": "$Timelock"
}'
If you only want to verify an existing token an Etherscan, make sure ETHERSCAN_API_KEY
is set and run token:verify
with the first argument as the token address and the second as the token config JSON:
npx saddle -n rinkeby script token:verify 0x19B674715cD20626415C738400FDd0d32D6809B6 '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Lodestar Kyber Network Crystal",
"symbol": "lKNC",
"decimals": "8",
"admin": "$Timelock"
}'
Finally, to see if a given deployment matches this version of the Lodestar Protocol, you can run token:match
with a token address and token config:
npx saddle -n rinkeby script token:match 0x19B674715cD20626415C738400FDd0d32D6809B6 '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Lodestar Kyber Network Crystal",
"symbol": "lKNC",
"decimals": "8",
"admin": "$Timelock"
}'
To deploy a specific version of the Lodestar Protocol, you can use the token:deploy
script through Docker:
docker run --env ETHERSCAN_API_KEY --env VERIFY=true --env ACCOUNT=0x$(cat ~/.ethereum/rinkeby) LodestarFinance/lodestar-protocol:latest npx saddle -n rinkeby script token:deploy '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Lodestar Kyber Network Crystal",
"symbol": "lKNC",
"decimals": "8",
"admin": "$Timelock"
}'
To match a deployed contract against a given version of the Lodestar Protocol, you can run token:match
through Docker, passing a token address and config:
docker run --env ACCOUNT=0x$(cat ~/.ethereum/rinkeby) LodestarFinance/lodestar-protocol:latest npx saddle -n rinkeby script token:match 0xF1BAd36CB247C82Cb4e9C2874374492Afb50d565 '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Lodestar Kyber Network Crystal",
"symbol": "lKNC",
"decimals": "8",
"admin": "$Timelock"
}'
For any concerns with the protocol, open an issue or visit us on Discord to discuss.
For security concerns, please email dev@lodestarfinanceio.