Aave v3实现第一笔闪电交易

闪电贷(FlashLoan)闪电贷是一种在区块链上借入资产的新方式。最初由aave实现完成,后续其他流行的DeFi协议迅速跟进,添加了这个功能。原理很简单,也很实用。与传统的担保贷款不同,闪电贷不需要任何抵押品、信用评分或管理来处理无担保贷款。FlashLoan利用原子性允许用户在不提供抵押

闪电贷(Flash Loan)

闪电贷是一种在区块链上借入资产的新方式。最初由aave实现完成,后续其他流行的DeFi协议迅速跟进,添加了这个功能。原理很简单,也很实用。与传统的担保贷款不同,闪电贷不需要任何抵押品、信用评分或管理来处理无担保贷款。<br>Flash Loan 利用原子性允许用户在不提供抵押品的情况下借款。有两个注意事项需要提及。 首先,无论何时你在闪电贷中借入资产,你都必须支付借出金额的 0.09% 的费用。 其次,必须在借款的同一笔交易中偿还贷款.<br>

Aave

Aave 是一种去中心化的非托管流动性市场协议,用户可以作为存款人或借款人参与其中。 储户向市场提供流动性以赚取被动收入,而借款人能够以超额抵押(永久)或抵押不足(单块流动性)的方式借款。<br>可以将 Aave 视为去中心化的伪银行。 Aave 没有验证所有交易的中央银行,而是拥有以自动化方式完成所有这些工作的智能合约。 储户将他们的代币存入 Aave,并开始从他们的存款中赚取利息。 另一方面,借款人会做相反的事情。 他们将从 Aave 取钱,并开始对借入的金额产生利息。 为了做到这一点,他们必须超额抵押。对于那些不想将钱存入 Aave 而只想借钱的人来说,还有另一种方法。 这就是我们前面提到的闪电贷(Flash Loan)

实战

基于上面的概念,下面将一步一步按照步骤完成第一笔闪电贷。<br>本教程是结合自身理解以及 quicknode英文教程 翻译完成,没有虎头蛇尾,按照步骤均可实战成功!

准备工具

这次我们用到的是AaveV3版本,网络rpc是Polygon Mumbai Testnet RPC

  1. remix在线编译
  2. MetaMask钱包

预先配置环境

  1. 将Polygon Mumbai Testnet 配置到MetaMask钱包。<br> 首先在 QuickNode.com 注册账户,注册成功在选择Polygon链,创建QuickNode,成功之后如下<br> QuickNode 截图 <br> 然后在图中点击红框,在弹出的MetaMask授权框中点击批准,然后该网络就会添加到钱包中。<br> QuickNode 截图
  2. QuickNode Multi-chain Faucet 发送matic代币到你的钱包地址。稍等几分钟就会到你的钱包中。目前每次接水大概是1个 matic. <br> QuickNode 水龙头<br> 以上的准备环境已经准备完毕。下面开始实战。

实战教程

实战的目的是在Polygon Mumbai Testnet上通过AaveV3的loanPool借出来10usdc,然后再把10个usdc+本次的手续费fee一起还给AaveV3的LoanPool

  1. 下面将闪电贷合约代码以及注释贴到remix上。<br>
// SPDX-License-Identifier: MIT
/*
 合约是针对AaveV3版本
*/
pragma solidity 0.8.10;
// 引入Aave V3的基础合约、借贷池管理合约、以及openzeppeln erc20合约
import "https://github.com/aave/aave-v3-core/blob/master/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/interfaces/IPoolAddressesProvider.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/dependencies/openzeppelin/contracts/IERC20.sol";

// 继承Aave's FlashLoanSimpleReceiverBase 合约
contract SimpleFlashLoan is FlashLoanSimpleReceiverBase {
    address payable owner;
// 初始化合约,在构造器中填入Aave's lending pool的地址,后面会演示到
    constructor(address _addressProvider)
        FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider))
    {
    }
// 请求借款的函数,
    function fn_RequestFlashLoan(address _token, uint256 _amount) public {
        address receiverAddress = address(this); // 用来接收闪电贷资金的合约地址,在这个合约中是部署合约的地址
        address asset = _token; // 闪电贷的贷款资产代币地址,这次是usdc
        uint256 amount = _amount; // 闪电贷的额度,本次是10个usdc
        bytes memory params = ""; // 额外信息作为可变参数打包传递给receiver,暂时用不到
        uint16 referralCode = 0; // 邀请码,暂时用不到
        // 调用aave 的资金池进行交互
        POOL.flashLoanSimple(
            receiverAddress, 
            asset, 
            amount, 
            params, 
            referralCode 
        );
    }
    
    /*
        闪电贷策略合约必须实现的函数,一般用于授权还款额度给LendPool合约地址,
        该函数是在上面的函数执行完毕之后,回调执行该函数,操作approve一定量的币(贷款+手续费)给Lending Pool地址
        手续费:借款总额的0.09%.
    */
    
    function  executeOperation(
        address asset,
        uint256 amount,
        uint256 premium,
        address initiator,
        bytes calldata params
    )  external override returns (bool) {
        
        //具体业务逻辑可以写在这里,当逻辑走完,接下来就是要偿还
        // 该合约闪电贷额度+手续费,请确保由足够的资金偿还金额
        
        uint256 totalAmount = amount + premium;
        IERC20(asset).approve(address(POOL), totalAmount);

        return true;
    }

    receive() external payable {}
}

选择编译环境进行编译,如图<br> remix编译
2. 部署之前,需要查询 Aave's pool provider 的地址如图 <br> Aave pool provider address 将该地址复制,粘贴到合约中的构造函数中,如图 <br> remix部署Pool address 然后点击transact进行合约部署。完成之后,将该合约地址复制下来<br> 合约地址 <br> 3. 下面需要 Polygon Mumbai Testnet 的一些usdc来作为部署合约的手续费,打开 usdc faucet 如图进行获取usdc faucet,获取成功之后,在钱包中会显示usdc的余额 4. 接着通过钱包的usdc,给刚才部署合约的地址发送一部分usdca代币作为手续费 <br> 发送usdc给部署合约 <br> 5. 开始执行闪电贷交易,交易之前,获取必要的参数,usdc在 Aave V3的地址 <br> usdc地址 将该地址粘贴到合约函数中,同时将本次打算借款的数量10填进去,如图<br> 合约函数参数 <br> 这里注意的是数量,本次是借10个usdc,通过区块链浏览器查看,usdc的精度是6,因此本次填入的数值应该是10000000。点击方法进行执行,完成交易如图 <br>
usdc精度 交易明细 <br> 上面的是借的10usdc,下面是借款额度+手续费,都是在一个区块中完成。<br>

总结

以上就完成了一个最简单的闪电贷合约,不提供任何策略,仅仅是贷款换款操作,往合约转代币即可完成一笔闪电贷。闪电贷应用场景很多,比如资产清算,差价套利,抵押品更换,换币还款等,其风险也不可小觑,甚至有些项目被盗了两次,比如Cream,说的就是你!

点赞 3
收藏 9
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

4 条评论

请先 登录 后评论
q091003040432
q091003040432
进入web3世界的搬砖者!