The Compound On-Chain Protocol
The Compound 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 Compound 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 Compound, please visit our Discord server.
For security concerns, please visit https://compound.finance/security or email [email protected].
Contributing to the Compound protocol is a bit different than most open-source projects -- check out the community guide on Contributing.
We detail a few of the core contracts in the Compound protocol.
CToken, CErc20 and CEther The Compound cTokens, which are self-contained borrowing and lending contracts. CToken contains the core logic and CErc20 and CEther add public interfaces for Erc20 tokens and ether, respectively. Each CToken is assigned an interest rate and risk model (see InterestRateModel and Comptroller sections), and allows accounts to *mint* (supply capital), *redeem* (withdraw capital), *borrow* and *repay a borrow*. Each CToken is an ERC-20 compliant token where balances represent ownership of the market. Comptroller The risk model contract, which validates permissible user actions and disallows actions if they do not fit certain risk parameters. For instance, the Comptroller enforces that each borrowing user must maintain a sufficient collateral balance across all cTokens.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 compound, pull the repository from GitHub and install its dependencies. You will need yarn or npm installed.
git clone https://github.com/compound-finance/compound-protocol
cd compound-protocol
yarn install --lock-file # or `npm install`The Compound 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 Compound 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 testThere 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.
The Compound Protocol has a number of formal verification specifications, powered by Certora. You can find details in the spec/formal folder. The Certora Verification Language (CVL) files included are specifications, which when with the Certora CLI tool, produce formal proofs (or counter-examples) that the code of a given contract exactly matches that specification.
To run code coverage, run:
yarn coverageTo lint the code, run:
yarn lintTo run in docker:
# Build the docker image
docker build -t compound-protocol .
# Run a shell to the built image
docker run -it compound-protocol /bin/shFrom within a docker shell, you can interact locally with the protocol via ganache and truffle:
…After you deploy, as above, you can run a truffle console with the following command:
yarn console -n goerliThis command will start a saddle console conencted to Goerli testnet (see Saddle README):
…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": "Compound Kyber Network Crystal",
"symbol": "cKNC",
"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": "Compound Kyber Network Crystal",
"symbol": "cKNC",
"decimals": "8",
"admin": "$Timelock"
}'Finally, to see if a given deployment matches this version of the Compound 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": "Compound Kyber Network Crystal",
"symbol": "cKNC",
"decimals": "8",
"admin": "$Timelock"
}'To deploy a specific version of the Compound 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) compoundfinance/compound-protocol:latest npx saddle -n rinkeby script token:deploy '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Compound Kyber Network Crystal",
"symbol": "cKNC",
"decimals": "8",
"admin": "$Timelock"
}'To match a deployed contract against a given version of the Compound Protocol, you can run token:match through Docker, passing a token address and config:
docker run --env ACCOUNT=0x$(cat ~/.ethereum/rinkeby) compoundfinance/compound-protocol:latest npx saddle -n rinkeby script token:match 0xF1BAd36CB247C82Cb4e9C2874374492Afb50d565 '{
"underlying": "0x577D296678535e4903D59A4C929B718e1D575e0A",
"comptroller": "$Comptroller",
"interestRateModel": "$Base200bps_Slope3000bps",
"initialExchangeRateMantissa": "2.0e18",
"name": "Compound Kyber Network Crystal",
"symbol": "cKNC",
"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 [email protected].
© Copyright 2020, Compound Labs
No open issues yet, or sync has not completed.