Compound学习 测试存入和取回资产

Posted Zero_Nothing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Compound学习 测试存入和取回资产相关的知识,希望对你有一定的参考价值。

Compound 是 DeFi 的明星项目之一,定位于去中心化的借贷协议。可以称之为“去中心化的算法银行”。Compound 协议是为了开放金融系统而为开发者构建的开源协议,基于 Compound 协议可以开发一系列新的金融应用程序。

在上一章,我们进行了Compound的简单部署,现在我们来进行简单测试(测试用户提供和取回资产/ERC20代币)。

我们这次的测试工具仍然先使用MyEtherWallet,在主界面选择 MEW CX ,选择接受Terms,然后点击访问我的钱包,就地连接到METAMASk。此时点击左边Contract栏目下的interact with Contract,在右边的界面里输入合约地址和ABI,点击continue,就可以调用该合约啦。

注:请把网络切换至Kovan网络,切换如果显示不正确刷新一次。

一、添加市场

用户向某个市场(CToken)提供资产的前提条件是平台必须有这个市场,在第二章我们部署了cUSDT,我们就以这个市场为例进行测试。注意:我们的钱包账号必须为Unitroller合约的管理员,也就是上次部署合约的账号。

  1. 我们打开Comptroller.sol,找到_supportMarket函数,从注释中可以看到,该函数用来添加一个CToken(市场)。这里要专门提及的是Compound没有采用常用的不符合预期就重置交易的方式让交易失败,而是返回一个错误代码。因此必须检查这个返回值,由于我们是外部账号调用,无法获取返回值,所以我们等会可采用事件MarketListed是否触发的方式来判断市场是否添加进去。

  2. 注意:在前面两章我们提过,Comptroller采用的是代理委托方式,代理合约为Unitroller,实现合约(相当于一个逻辑库)为Comptroller。因此在MyEtherWallet的合约交互设置界面时,合约地址输入Unitroller的地址,也就是0xeF960E96a4D15f4a7c09cE4dB70019F9E27D7Ad8 ,而ABI却要输入Comptroller合约的ABI。

  3. 输入地址和ABI后,我们点击continue,进行函数选择界面,我们在右边Select an item按钮那选择_supportMarket,在下面的CToken参数栏输入我们上次部署的cUSDT地址:0x83f7A6B8D106f0440ab58744A98E65b43aD843F3。点击Write按钮,会自动弹出钱包进行交易,点击钱包上的确定即可。

  4. 等待几秒后,点击右上角红点提示的铃铛按钮,会弹出本次交易的概览,我们点击Transaction (Success),再点击下面的交易哈希,会自动链接到Kovan浏览器查看交易详情。https://kovan.etherscan.io/tx/0xccda1041c4fbf975b83808f392cc50af893eb4981d70e6fb6441d4e5ceea43b8

  5. 我们点击详情中的日志界面,可以看到的确触发了一个日志,数据就是我们刚才输入的cUSDT地址,对照一下就是要触发的事件了。

  6. 我们接着在函数栏目里选择getAllMarkets函数,它会返回一个地址数组,可以看到,只有一个元素,就是我们刚才添加的cUSDT地址,证明我们添加成功了。

  7. 我们再添加一个cDAI,地址为:“0x991b142B309F201435c40E2b183A8d1f3fa41f70”,相同的操作,添加成功后我们再次查看getAllMarkets函数,这下尴尬😓😓😓😓了,仍然只有一个元素了。那刚才添加cDAI到底成功了没有?查看交易详情是没有问题的,https://kovan.etherscan.io/tx/0xea657d4b3bfbcf7f3cfabad62618a844f210eb6bd82bd0f96a4b23f4ad26ea9f 点击其中的交易日志就可以看到。

  8. 那好吧,既然只有一个元素,我们继续添加cDAI,交易结束后然后再打开交易详情查看日志,(https://kovan.etherscan.io/tx/0x86f1cc3c4d570cc2090097d3074311a2493e59e1458f9539be26569c5800ce6d),哎呀,出现的日志是Failure,😈😈😈😈去ErrorReporter.sol中查一下错误信息代码10对应的信息,刚好是MARKET_ALREADY_LISTED,这与_supportMarket函数中的代码是相符的,说明我们先前一次交易是添加成功了,这次重复添加所以给出提示信息(不报错重置交易而是给出提示信息,这个其实也是双刃剑)。

  9. 那看来是MyEtherWallet的问题了,没办法,总得验证现在有两个市场了。使用Remix还得把所有源码复制过去,编译完成后才能给定地址调用合约,而Unitroller虽然通过了浏览器开源验证,但是调用的是是委托合约Comptroller中的函数,所以直接在浏览器调用也是不可用的。因此我们需要写一个简单的脚本来做这件事。

  10. 在项目test目录下(注意不是Compound自带的tests目录)新建一个getAllMarket.js文件,内容如下:

    const {ethers} = require("ethers")
    const abi = [
        "function getAllMarkets() view returns(address[])"
    ]
    const address = "0xeF960E96a4D15f4a7c09cE4dB70019F9E27D7Ad8"
    const provider = new ethers.providers.InfuraProvider("kovan","your_infura_key")
    const unitroller = new ethers.Contract(address,abi,provider)
    
    unitroller.getAllMarkets().then(resp => console.log(resp))
    

    然后打开vscode的终端,先运行yarn add ethers安装所需要的库,然后自己去https://infura.io/网站申请一个project_key,替换上面的your_infura_key。最后在项目根目录运行该文件,终于得到我们所期望的结果了✨ ✨ ✨ ✨ ✨ :

    ➜  compound-protocol git:(master) ✗ node test/getAllMarkets.js 
    [
      '0x83f7A6B8D106f0440ab58744A98E65b43aD843F3',
      '0x991b142B309F201435c40E2b183A8d1f3fa41f70'
    ]
    ➜  compound-protocol git:(master)

    这个笔者在第一章的时候都提过,myEtherWallet虽然好用,但有时候也会有问题,remix太麻烦,因为要源码编译(或者我未掌握用法,因为用的较少),只有自己写脚本才是最后解决问题终极办法(使用python或者node.js都可以)。

二、存入资产

  1. 授权cUSDT合约。因为我们存入的其实是underlying,在cUSDT合约中,我们存入的是USDT,因为是间接合约交易而不是直接转账,所以需要授权。这个我们之前将USDT合约通过浏览器验证了,这下就简单多了。

  2. 在kovan浏览器里输入我们以前部署的USDT地址0xee095890Fef04aD2b53C4AdE71cD1B74429990C6,点击合约,再点击编写合约,如下图:

在这里插入图片描述

点击连接Web3,选择MetaMask,然后点击mint函数,先给自己发一点USDT(例如10亿枚吧)。然后等待交易完成,再点击approve函数,在下面出现的spender里输入cUSDT的地址:0x83f7A6B8D106f0440ab58744A98E65b43aD843F3amount里输入100000000000000000000000000,然后点击write。等待交易完成。

ps:打开MetaMask,在资产项目里添加代币,输入USDT和cUSDT地址,把两种代币都加上,就能实时看到你的自定义的代币数量了。

  1. 存入资产,终于到最后一步存入资产了,因为CToken合约都通过了浏览器验证,所以我们直接在浏览器中操作,不需要出错的MyEtherWallet了。直接在浏览器地址栏里将USDT地址0xee095890Fef04aD2b53C4AdE71cD1B74429990C6替换为cUSDT地址:0x83f7A6B8D106f0440ab58744A98E65b43aD843F3然后回车,我们就跳到了cUSDT的合约接口啦。

  2. 点击Connect to Web3,连接钱包,找到并点击mint函数(对应的源吗为CErc20.sol中的mint函数)。数量我们输入10000000000000000000(10后面18个0,代表10个USDT),然后点击write发起交易。

  3. 耐心等待点击完成,然后点击view your transaction,可以在Kovan浏览器上查看本次交易详情:https://kovan.etherscan.io/tx/0x377213d217a3a2cd99181fa077df3f39e85ca231d1b62e2a8e32cd8f283b5f7e 如下图所示:

    在这里插入图片描述

    可以看到我们存入了10个USDT,给了我们10个cUSDT作为凭证。

三、取回资产

我们来测试取回资产,接着刚才的操作,我们在cUSDT的浏览器界面点击redeem函数,对应的源码为CErc20.sol中的redeem函数。数量我们仍然输入前面存入的全部数量10000000000000000000,然后点击write。交易成功后仍然点击查看交易按钮,如下图所示:

在这里插入图片描述

可以看到,我们把10个cUSDT换回了10个USDT。

到此,我们今天的测试就结束了。因为没有涉及到借款和还款,因此也就不会涉及利息,也不会使用到预言机,我们仅只测试了最简单的存款和取款的操作。下一章计划学习最基本的借款操作。

自己也是边学边写,欢迎读者留言指正错误或者提出改进建议。

以上是关于Compound学习 测试存入和取回资产的主要内容,如果未能解决你的问题,请参考以下文章

导致资产预编译在heroku部署上失败的代码片段

Compound学习 简单部署

Compound学习 README.md

为什么Compound选择使用Substrate进行独立链的开发

第108篇 Compound 简单部署

vue+vuex+axios从webpack-server获取模拟数据存入vuex并取回展示到页面