# ETH测试网进行闪电贷测试 **Published by:** [想住大房子的java程序员](https://paragraph.com/@java-3/) **Published on:** 2022-11-02 **URL:** https://paragraph.com/@java-3/eth ## Content 我们在编写完成闪电贷的例子之后,便可以开始编译和部署了。 不过,写程序就是这样子的,你写着写着,发现不时地可以优化一下。所以,我又要改代码了。不要紧张,改完后会自测的。反正现在也不会有测试妹子抓着你不放。 添加以下几行代码,方便测试。// 返回某个账户的某个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转成WETHinstance.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个核桃啊。谢谢大家。 下一节,将会带领大家玩耍闪电贷+套利。 ## Publication Information - [想住大房子的java程序员](https://paragraph.com/@java-3/): Publication homepage - [All Posts](https://paragraph.com/@java-3/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@java-3): Subscribe to updates