Compound 开发者入门

  • 七哥
  • 更新于 2021-01-09 18:37
  • 阅读 5160

Compound开发者入门

介绍

Compound 协议代码库托管在 Github

请加入 Compound 社区 Discord 服务器上的 development 房间;我们的团队和社区成员都期待着帮助你在 Compound 上构建一个应用程序。你的问题有助于我们的改进,所有如果你在这里找不到你想要的东西,请不要犹豫,来问我们。

向导

1.Setting up an Ethereum Development Environment

  1. Supplying Assets to the Compound Protocol
  2. Borrowing Assets from the Compound Protocol
  3. Create a Compound API with Infura
  4. Building a Governance Interface

网络

Compound 协议已经部署在以下网络中:networks:MainnetRinkebyKovanRopstenGoerli

1.Mainnet:

合约 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

2.Rinkeby:

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

3.Kovan:

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

4.Ropsten:

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

5.Goerli:

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 和基本小数点

价格和汇率是由每一种资产特有的小数点来缩放; 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 成本

协议功能的 Gas 使用量可能因市场和用户的不同而波动。外部调用,例如对底层 ERC-20 代币的调用,可能会使用任意量的 Gas。任何涉及检查账户流动性的计算,都会有 Gas 成本随着进入市场数量的增加而增加。因此,虽然难以提供任何关于成本的保证,但我们提供了以下表格作为指导。

方法 典型 Gas 成本
Mint < 150K, cDAI < 300k
Redeem, Transfer 如果借款则 < 250K,否则 < 90K
Borrow < 300K
Repay Borrow < 90K
Liquidate Borrow < 400K
点赞 3
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
七哥
七哥
0x7B08...66Fd
区块链项目商业合作请联系微信 triple721