# ETH测试网进行闪电贷测试

By [想住大房子的java程序员](https://paragraph.com/@java-3) · 2022-11-02

---

我们在编写完成闪电贷的例子之后，便可以开始编译和部署了。

不过，写程序就是这样子的，你写着写着，发现不时地可以优化一下。所以，我又要改代码了。不要紧张，改完后会自测的。反正现在也不会有测试妹子抓着你不放。

添加以下几行代码，方便测试。

    // 返回某个账户的某个token的余额
        function getTokenBalance(address token, address account) public view returns (uint256) {
            return IERC20(token).balanceOf(account);
        }
        // 返回合约部署者账户中的WETH余额
        function getMyWethBalance() public view returns (uint256) {
            return IERC20(WETH).balanceOf(owner);
        }
        // 返回合约账户中的WETH余额
        function getContractWethBalance(address account) public view returns (uint256) {
            return getTokenBalance(account);
        }
    

完成之后，开始进行测试。这次是真的不改代码了！

启动测试服务器。

    nohup ganache-cli --fork https://eth-mainnet.g.alchemy.com/v2/申请的Key &
    

该命令不需要你另外再打开一个新的终端。对了，记得去以下网站申请一个测试KEY

[https://www.alchemy.com/](https://www.alchemy.com/)

接下来搓搓小手，开始一条路敲命令了！
------------------

    truffle complie
    truffle migrate
    truffle console
    

3浪打完，进入控制台。

先启动一个合约实例对象。

    instance = await HelloZZ.deployed();
    

心里有些好奇，看一下合约地址。

    instance.address
    

也可以看一下你是谁。也就是合约的部署者。

    owner = await instance.getOwner();
    

查询自己的余额

    查询余额
    myBalance = await instance.getMyWethBalance();
    myBalance.toString();
    

虽然什么都没有，但是我相信这是一个好习惯。

向合约转50个ETH。

    instance.send(web3.utils.toWei('50', 'ether'))
    

然后把ETH转成WETH

    instance.ETHtoWETH(web3.utils.toWei('50', 'ether'));
    

查看合约里面的WETH余额

    contractWeth = await instance.getContractWethBalance(instance.address);
    contractWeth.toString();
    

调用合约的turnOutToken()函数，把WETH转出到所有者的钱包里

    instance.turnOutToken(WETH, contractWeth)
    

再次检查一下你的钱包余额。

    myBalance = await instance.getMyWethBalance();
    myBalance.toString();
    

一切顺利之下，现在可以开始进行测试发起闪电贷。

    result = await instance.doFlashEth(WETH, web3.utils.toWei('100'))
    result
    

控制台会告诉你是否成功的。贷款数量也不要修改。比如你想要1000个ETH（我也想），会提示low-level call failed。该问题疑似余额不够。

OK，最后附上修改后的完整代码。还有很熟悉的一段话：如果文档和代码不相符，以代码为准\[doge\]

    pragma solidity ^0.8.17;
    import "./ExInterface.sol";
    contract HelloZZ {
    
         //** **定义一些常量 开始 **//
        address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
        address liquidityPool = 0x4F868C1aa37fCf307ab38D215382e88FCA6275E2;
        address borrowerProxy = 0x17a4C8F43cB407dD21f9885c5289E66E21bEcD9D;
        //** **定义一些常量 结束 **//
    
        //合约的部署者
        address owner;
    
        constructor(){
            owner = address(tx.origin);
       }
    
    
        // 返回合约的所有者
        function getOwner() public view returns(address) {
            return owner;
        }// 返回某个账户的某个token的余额
        function getTokenBalance(address token, address account) public view returns(uint256) {
            return IERC20(token).balanceOf(account);
        }
        // 返回合约部署者账户中的ETH余额
        function getMyWethBalance() public view returns (uint256) {
            return IERC20(WETH).balanceOf(owner);
        }
        // 返回合约账户中的WETH余额
        function getContractWethBalance(address account) public view returns (uint256) {
            return getTokenBalance(account);
        }
        //把合约里面的ETH转到钱包
        function turnOutETH(uint256 amount) public onlyOwner {
            payable(owner).transfer(amount);
        }
        //把合约里面的钱转到钱包
        function turnOutToken(address token, uint256 amount) public onlyOwner {
            IERC20(token).transfer(owner, amount);
        }
        // WETH转换为ETH
        function WETHToETH(uint256 amount) public onlyOwner {
            IWETH(WETH).withdraw(amount);
        }
        // ETH转换为WETH
        function ETHtoWETH(uint256 amount) public onlyOwner {
            IWETH(WETH).deposit{value : amount}();
        }
    
        //发起一个eth的闪电贷
        function doFlashEth(uint256 amount)public onlyOwner{
            ILiquidity(liquidityPool).borrow(WETH, amount,
                abi.encodeWithSelector(this.receiveBuyBigHouse.selector, abi.encode(amount)));
        }
    
        // callback ,收到钱后可以拿来买一个大房子。
        function receiveBuyBigHouse(bytes memory data) public {
            require(msg.sender == borrowerProxy, "bu shi BorrorwerProxy,paochu yichang.");
            //购买大房子
            uint256 amount = abi.decode(data, (uint256));
            IERC20(WETH).transfer(liquidityPool, amount);
        }
    
        //fallback
        receive() external payable {}
        // modifier
        modifier onlyOwner(){
            require(address(msg.sender) == owner, "No authority");
            _;
        }
    }
    

对了。记得帮我众筹8个核桃啊。谢谢大家。

下一节，将会带领大家玩耍闪电贷+套利。

---

*Originally published on [想住大房子的java程序员](https://paragraph.com/@java-3/eth)*
