我们在编写完成闪电贷的例子之后,便可以开始编译和部署了。
不过,写程序就是这样子的,你写着写着,发现不时地可以优化一下。所以,我又要改代码了。不要紧张,改完后会自测的。反正现在也不会有测试妹子抓着你不放。
添加以下几行代码,方便测试。
// 返回某个账户的某个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
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个核桃啊。谢谢大家。
下一节,将会带领大家玩耍闪电贷+套利。
