ETH测试网进行闪电贷测试

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

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

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

// 返回某个账户的某个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/

接下来搓搓小手,开始一条路敲命令了!

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个核桃啊。谢谢大家。

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