Compound开发者入门
Compound 协议代码库托管在 Github。
请加入 Compound 社区 Discord 服务器上的 development 房间;我们的团队和社区成员都期待着帮助你在 Compound 上构建一个应用程序。你的问题有助于我们的改进,所有如果你在这里找不到你想要的东西,请不要犹豫,来问我们。
1.Setting up an Ethereum Development Environment
Compound 协议已经部署在以下网络中:networks:MainnetRinkebyKovanRopstenGoerli
合约 | ABI | 地址 |
---|---|---|
cBATcToken | JSON | 0x6c8c6b02e7...5921d90e4e |
cDAIcToken | JSON | 0x5d3a536e4d...ab948e3643 |
cETHcEther | JSON | 0x4ddc2d1939...0718270ed5 |
cREPcToken | JSON | 0x158079ee67...7ab9ac95c1 |
cSAIcToken | JSON | 0xf5dce57282...1fcac444dc |
cUSDCcToken | JSON | 0x39aa39c021...917d5e7563 |
cUSDTcToken | JSON | 0xf650c3d88d...5a4e07dcc9 |
cWBTCcToken | JSON | 0xc11b1268c1...0264a3a7f4 |
cZRXcToken | JSON | 0xb3319f5d18...5f7266d407 |
COMP | JSON | 0xc00e94cb66...04a7f26888 |
Comptroller | JSON | 0x3d9819210a...79b9c9cd3b |
Governance | JSON | 0xc0da01a04c...17a7323e38 |
PriceOracle | JSON | 0xddc46a3b07...2959764ec4 |
Timelock | JSON | 0x6d903f6003...146dc33925 |
Base0bps_Slope2000bps | JSON | 0xc64c4cba05...519c4f8fab |
Base200bps_Slope1000bps | JSON | 0x0c3f8df27e...35f00714c0 |
Usdt Rate Model | JSON | 0x6bc8fe27d0...5cf7afae36 |
Base200bps_Slope2000bps_Jump8000bps_Kink90 | JSON | 0x40c0c2c565...2c97bac13a |
Base200bps_Slope3000bps | JSON | 0xbae04cbf96...34e214d698 |
Base500bps_Slope1200bps | JSON | 0xa1046abfc2...f3c0733c9a |
Base500bps_Slope1500bps | JSON | 0xd928c8ead6...c2dec6ff63 |
DSR_Kink_9000bps_Jump_12000bps_AssumedRF_20000bps | JSON | 0x0000000076...b309e0c493 |
Dai Rate Model | JSON | 0xec163986cc...30d348030f |
Contract | ABI | Address |
---|---|---|
cBATcToken | JSON | 0xebf1a11532...8647913002 |
cDAIcToken | JSON | 0x6d7f0754ff...4835be3b14 |
cETHcEther | JSON | 0xd6801a1dff...0d6df1883e |
cREPcToken | JSON | 0xebe09eb341...3cac5c6b60 |
cUSDCcToken | JSON | 0x5b281a6dda...01c976edb1 |
cUSDTcToken | JSON | 0x2fb298bdbe...75ea41e768 |
cWBTCcToken | JSON | 0x0014f450b8...5d50620f96 |
cZRXcToken | JSON | 0x52201ff172...15490ec19b |
Comptroller | JSON | 0x2eaa9d77ae...746485bddb |
PriceOracle | JSON | 0x5722a3f60f...9a4758d1b2 |
Timelock | JSON | 0xe4cd9a6143...1262c17513 |
Base0bps_Slope2000bps | JSON | 0x1a43bfd39b...be32deb7f5 |
Usdt Rate Model | JSON | 0x5e237767da...02c43d8218 |
Base200bps_Slope3000bps | JSON | 0x6330d442a2...702aefc9fe |
Base500bps_Slope1200bps | JSON | 0xe12630c8fd...8aebe58795 |
Contract | ABI | Address |
---|---|---|
cBATcToken | JSON | 0x4a77faee96...ab01606c7a |
cDAIcToken | JSON | 0xf0d0eb522c...a6f04376ad |
cETHcEther | JSON | 0x41b5844f46...1f64474a72 |
cREPcToken | JSON | 0xa4ec170599...823f448b57 |
cSAIcToken | JSON | 0xb3f7fb4824...1157214bec |
cUSDCcToken | JSON | 0x4a92e71227...1b75140d63 |
cUSDTcToken | JSON | 0x3f0a0ea2f8...06647da018 |
cWBTCcToken | JSON | 0xa1faa15655...0e6ad93abb |
cZRXcToken | JSON | 0xaf45ae7375...242ec59e5a |
COMP | JSON | 0x61460874a7...64b3e95270 |
Comptroller | JSON | 0x5eae89dc1c...e834098657 |
Governance | JSON | 0x4dea597f90...fd6fc3145d |
PriceOracle | JSON | 0x37ac0cb24b...eb08d4dc02 |
Timelock | JSON | 0xe3e07f4f3e...8b8e07550b |
Base200bps_Slope1000bps | JSON | 0xc1b496a3a4...1ceb53605c |
Usdt Rate Model | JSON | 0x059965e18a...43afc1ddec |
Base200bps_Slope3000bps | JSON | 0x7bdf14574c...ab44ab0529 |
Base500bps_Slope1200bps | JSON | 0xb9c437ff60...32a6091ac7 |
DSR_Kink_9000bps_Jump_12000bps_AssumedRF_20000bps | JSON | 0xe5318b00f1...7354738727 |
Contract | ABI | Address |
---|---|---|
cBATcToken | JSON | 0xa253295ec2...016daa25b1 |
cDAIcToken | JSON | 0x6ce27497a6...e7eb63b9ff |
cETHcEther | JSON | 0x1d70b01a2c...5d70109a5d |
cREPcToken | JSON | 0x5d4373f8c1...8dd3cca809 |
cSAIcToken | JSON | 0xccaf265e74...2ba7f0148d |
cTBTCcToken | JSON | 0xb40d042a65...2e16bc46f1 |
cUSDCcToken | JSON | 0x20572e4c09...ea0e2f3eff |
cUSDTcToken | JSON | 0xb6f7f1901f...5105bc3142 |
cWBTCcToken | JSON | 0x4d15ee7de1...5b1c1a8806 |
cZRXcToken | JSON | 0x3a728dd027...7ce9390a3d |
COMP | JSON | 0x1fe16de955...23838c2793 |
Comptroller | JSON | 0xe03718b458...8362ee7463 |
Governance | JSON | 0xc5bfed3bb3...c560551d45 |
PriceOracle | JSON | 0x6600a2079f...1ef16fc284 |
Timelock | JSON | 0x18646f4a17...6d37229a11 |
Base0bps_Slope2000bps | JSON | 0xc04b0d3107...be61d63a05 |
Usdt Rate Model | JSON | 0x16909ba697...c5ebc8a7cb |
Base200bps_Slope3000bps | JSON | 0x43479626a9...de003e367c |
Base500bps_Slope1200bps | JSON | 0xd87ba7a50b...e7cb4ccd9c |
Contract | ABI | Address |
---|---|---|
cBATcToken | JSON | 0xccaf265e74...2ba7f0148d |
cDAIcToken | JSON | 0x822397d9a5...5f65bd28eb |
cETHcEther | JSON | 0x20572e4c09...ea0e2f3eff |
cREPcToken | JSON | 0x1d70b01a2c...5d70109a5d |
cSAIcToken | JSON | 0x5d4373f8c1...8dd3cca809 |
cUSDCcToken | JSON | 0xcec4a43ebb...69d6d5c1f0 |
cWBTCcToken | JSON | 0x6ce27497a6...e7eb63b9ff |
cZRXcToken | JSON | 0xa253295ec2...016daa25b1 |
COMP | JSON | 0xe16c7165c8...20783f2b6e |
Comptroller | JSON | 0x627ea49279...02b6be2867 |
PriceOracle | JSON | 0xd0c84453b3...6718913b71 |
Timelock | JSON | 0x25e4695736...75f9f8d287 |
Base0bps_Slope2000bps | JSON | 0xa4d7e82da5...3acdca3504 |
Base200bps_Slope1000bps | JSON | 0x85d8896a08...982dc1f6b3 |
Base200bps_Slope3000bps | JSON | 0x1e83fd7662...9d5fa1c34c |
Base500bps_Slope1200bps | JSON | 0x4c0f5b2f37...a9086066ce |
Compound 协议合约使用指数数学系统 -- Exponential.sol ,以表示足够精准的分数量。
大多数的数字都是用尾数表示,尾数是一个按 1*10^18 的比例缩放的无符号整数,以便于进行基本数学运算,精度很高。
价格和汇率是由每一种资产特有的小数点来缩放; cToken 是 ERC-20 代币,有 8 个小数点,而底层代币则不同,它有一个名为decimals
的公共成员。
cToken | cToken 小数点 | 底层代币 | 底层小数点 |
---|---|---|---|
cETH | 8 | ETH | 18 |
cBAT | 8 | BAT | 18 |
cDAI | 8 | DAI | 18 |
cREP | 8 | REP | 18 |
cUSDC | 8 | USDC | 6 |
cUSDT | 8 | USDT | 6 |
cWBTC | 8 | WBTC | 8 |
cZRX | 8 | ZRX | 18 |
cToken 的汇率按 cToken 和底层资产之间的小数点之差进行缩放。
$oneCTokenInUnderlying$ $=$ $\frac{exchangeRateCurrent}{1 \ast10^{18+underlyingDecimals-cTokenDecimals}}$
这里有一个实例,用 Web3.js JavaScript 查找 1 cBAT 可兑换 BAT 的价值。
1 const cTokenDecimals = 8; // 所有 cToken 都是 8 个小数点
2 const underlying = new web3.eth.Contract(erc20Abi, batAddress);
3 const cToken = new web3.eth.Contract(cTokenAbi, cBatAddress);
4 const underlyingDecimals = await underlying.methods.decimals().call();
5 const exchangeRateCurrent = await cToken.methods.exchangeRateCurrent().call();
6 const mantissa = 18 + parseInt(underlyingDecimals) - cTokenDecimals;
7 const oneCTokenInUnderlying = exchangeRateCurrent / Math.pow(10, mantissa);
8 console.log('1 cBAT 可以兑换 ', oneCTokenInUnderlying, 'BAT');
ETH 没有底层合约,所有要用 cETH 来计算,请将 underlyingDecimals 设置为 18。
要找到兑换 cTokens 的底层代币数量,请将 cToken 的数量除以上述 oneCTokenInUnderlying。
$underlyingTokens$ $=$ $cTokenAmount/oneCTokenInUnderlying$
在每个市场上的任何一个区块的借款资产和供给资产的比例发生变化时,市场的利息率就会发送变化。利率的变化量取决于市场所实施的利率模型智能合约,以及市场上的借款资产与供应资产的比例变化量。
请看 Observable 上的利率数据可视化笔记本,可以直观的了解到目前每个市场上应用的利率模型是哪个利率模型。
历史利率可以从 MarketHistoryService API 中检索。
当任何以太坊地址和市场上的 cToken 合约交互,调用这些方法中的一个时,利息就会累积到市场的所有供应商和借款人身上:mint、redeem、borrow 或 repay。 成功执行其中一个方法就会触发 accrueInterest 方法,导致利息被添加到市场上没个供应商和借款人的基础余额中。当前区块以及之前没有触发 accrueInterest 方法的每个区块(没用户与 cToken 合约交互)都会产生利息。只有在 cToken 合约调用了上述方法之一的区块中,才会产生利息。
这里以供给应计利息为例:
张三向 Compound 协议供应 1 个 ETH。供给时, supplyRatePerBlock 是 37893605 wei,或每块 0.000000000037893605 ETH。在 3 个以太坊区块中,没人与 cETH 合约交互。在随后的第 4 个区块上,李四借了一些 ETH。现在,张三的底层资产余额是 1.000000000151574420 ETH(也就是 37893605 wei 乘以 4 个区块,加上原来的 1 ETH)。张三在后续区块中的底层 ETH 余额将根据 1.000000000151574420 ETH 新值计息,而不是最初的 1 ETH。请注意,supplyRatePerBlock的值可能会随时发生变化。
每个市场中的供应或借款的年收益率(APY)可以用本公式中的 supplyRatePerBlock(求供应年收益率)或 borrowRatePerBlock (求借款年收益率)的值来计算:
1 Rate = cToken.supplyRatePerBlock(); // 整数
2 Rate = 37893566
3 ETH Mantissa = 1 * 10 ^ 18 // ETH 是 18 个小数点
4 Blocks Per Day = 4 * 60 * 24 // 按每分钟 4 个区块计算
5 Days Per Year = 365
6
7 APY = ((((Rate / ETH Mantissa * Blocks Per Day + 1) ^ Days Per Year - 1)) - 1) * 100
用 Web3.js JavaScript 计算供应和借款年收益率示例:
1 const ethMantissa = 1e18;
2 const blocksPerDay = 4 * 60 * 24;
3 const daysPerYear = 365;
4
5 const cToken = new web3.eth.Contract(cEthAbi, cEthAddress);
6 const supplyRatePerBlock = await cToken.methods.supplyRatePerBlock().call();
7 const borrowRatePerBlock = await cToken.methods.borrowRatePerBlock().call();
8 const supplyApy = (((Math.pow((supplyRatePerBlock / ethMantissa * blocksPerDay) + 1, daysPerYear - 1))) - 1) * 100;
9 const borrowApy = (((Math.pow((borrowRatePerBlock / ethMantissa * blocksPerDay) + 1, daysPerYear - 1))) - 1) * 100;
10 console.log(`Supply APY for ETH ${supplyApy} %`);
11 console.log(`Borrow APY for ETH ${borrowApy} %`);
协议功能的 Gas 使用量可能因市场和用户的不同而波动。外部调用,例如对底层 ERC-20 代币的调用,可能会使用任意量的 Gas。任何涉及检查账户流动性的计算,都会有 Gas 成本随着进入市场数量的增加而增加。因此,虽然难以提供任何关于成本的保证,但我们提供了以下表格作为指导。
方法 | 典型 Gas 成本 |
---|---|
Mint | < 150K, cDAI < 300k |
Redeem, Transfer | 如果借款则 < 250K,否则 < 90K |
Borrow | < 300K |
Repay Borrow | < 90K |
Liquidate Borrow | < 400K |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!