3

开发者如何玩转 Aave 闪电贷

 3 years ago
source link: https://learnblockchain.cn/article/1920
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我们在之前的文章中提到了Aave 、Dydx 和 uniswap 这些闪电贷的区别。今天我们就尝试在 Aave 上发起一笔闪电贷,上车!

Aave 很贴心已经为我们准备好了 Truffle Box:https://github.com/aave/flashloan-box

我们在之前的文章中提到了 Aave 、Dydx 和 uniswap 这些闪电贷的区别。今天我们就尝试在 Aave 上发起一笔闪电贷,上车!

Aave 很贴心已经为我们准备好了 Truffle Box:https://github.com/aave/flashloan-box

安装和设置

我们需要全局安装 truffle,了解 node 的人不会陌生

npm install -g truffle@latest

安装完之后,开始第 2 步

安装 aave flashloan-box

truffle unbox aave/flashloan-box

这个过程中需要特殊的上网技巧,下载完 flashloan-box, 我们会得到 1 个完整的基于 Truffle 框架的合约代码。

├── README.md
├── contracts (1)
├── env (2)
├── migrations
├── node_modules
├── package.json
└── truffle-config.js (3)

(1) 是合约文件

(2) 环境变量,保存 INFURA_API_KEY、DEPLOYMENT_ACCOUNT_KEY 这些变量

(3) 是 truffle 的配置文件

闪电贷智能合约

来看下 contracts/Flashloan.sol


import "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/FlashLoanReceiverBase.sol";
import "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/ILendingPoolAddressesProvider.sol";
import "https://github.com/aave/flashloan-box/blob/Remix/contracts/aave/ILendingPool.sol";

contract Flashloan is FlashLoanReceiverBase {
    constructor(address _addressProvider) FlashLoanReceiverBase(_addressProvider) public {}
}

这是导入所必要的依赖项,Flashloan 合约继承自 FlashLoanReceiverBase,它是一个抽象合约,提供了一些有用的方法,比如如偿还闪电贷的方式。 Flashloan.sol 构造函数接受 Aave 的一个贷款池提供者的地址。我们会稍后将介绍。

flashloan 方法

我们先来看 flashLoan 函数。

function flashloan(address _asset) public { // 去掉 onlyOwner,任何人都可调用 flashloan
    bytes memory data = "";
    uint amount = 1 ether;

    ILendingPool lendingPool = ILendingPool(addressesProvider.getLendingPool());
    lendingPool.flashLoan(address(this), _asset, amount, data);
}

flashLoan 的参数 _asset 是我们要用闪电贷借款的资产地址,比如 ETH 或 DAI。

uint amount = 1 ether;
在这里,我们定义的借款金额的单位是 ether,如果把 ETH 地址传过去,我们就会借到 1 个 ETH,即 10^18 wei。如果把 DAI 地址传给 _asset,我们就会借到 1 个 DAI。

现在,我们可以使用 Aave 提供的 ILendingPool 接口,调用 flashLoan 函数,其中包含所有需要的参数,如我们想要借入的资产、该资产的金额和一个额外的 data 参数。

我们还要关注 executeOperation

executeOperation 方法

executeOperation 函数将被 LendingPool 合约在闪电贷中请求有效的资产后被调用。

    function executeOperation(
        address _reserve, uint256 _amount,
        uint256 _fee, bytes calldata _params
    )
        external override
    {
        require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance, was the flashLoan successful?");

        //
        // Your logic goes here.
        // !! Ensure that *this contract* has enough of `_reserve` funds to payback the `_fee` !!
        //

        uint totalDebt = _amount.add(_fee);
        transferFundsBackToPoolInternal(_reserve, totalDebt);
    }

在使用 flashLoan 函数触发有效的闪电贷后,executeOperation 函数的所有参数都将被自动传递。require 用来确保收到的闪电贷金额是否正确。

接下来,我们可以插入任何想要执行的逻辑。在这个步骤中,我们拥有了来自闪电贷的所有可用资金,因此,我们可以尝试套利机会。

我们在用完闪电贷后,就需要偿还资金了。

uint totalDebt = _amount.add(_fee);

在这里,我们要计算还多少钱,也就是 借款金额 + 借款金额的 0.09%Aave 的闪电贷需要手续费

最后一步就是调用 transferFundsBackToPoolInternal 来偿还闪电贷。

Kovan 测试网

分析完闪电贷合约,已经可以部署了,假设我们要借出 Dai,但还要准备 2 个必要的东西:

  • LendingPoolAddressesProvider —— 为了部署合约,我们需要找到 Aave 在 Kovan 测试网上的借贷合约的地址。它地址是 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5。你可以在 Aave 文档 找到所有的地址。

  • DAI 地址,我们需要 DAI(或你想借用的任何其他资产)在 Kovan 测试网的合约地址。它的地址是 0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD

运行 truffle compile,将编译合约,我们把 Solidity 的版本设定为 0.6.12,成功后的提示是:

> Compiled successfully using:
   - solc: 0.6.12+commit.27d51765.Emscripten.clang

获取测试币

0x505A51009FdA1A20131C87c34Cfad6FDe6B82A36 发一些测试币。

我们还需要一些 DAI。要获得 DAI,访问 http://testnet.aave.com/faucet 并点击 DAI,然后点击 “提交” 按钮,我们将会收到 10,000 个 Dai。

我们在 env 文件中配置好 infura 的 API key 以及 0x505A51009FdA1A20131C87c34Cfad6FDe6B82A36 对应的私钥

INFURA_API_KEY = "API_KEY"
DEPLOYMENT_ACCOUNT_KEY = "地址私钥"

运行 truffle migrate --network kovan --reset --skip-dry-run,给 Flashloan 合约的构造函数传递的 lendingPoolProvider 是 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5

// migrations/2_deploy_contracts.js

let lendingPoolProviderAddr;

switch (network) {
  case "mainnet":
    lendingPoolProviderAddr = "0x24a42fD28C976A61Df5D00D0599C34c4f90748c8";
    break
  case "kovan":
    lendingPoolProviderAddr = "0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5";
    break
  default:
    throw Error(``)
}

await deployer.deploy(Flashloan, lendingPoolProviderAddr)

部署好后,合约地址是 0x3cC064c6A0b8629A05f38Bc57b6A290AC9489E38

发起闪电贷

我们先给合约地址充值 100 Dai,然后在 合约页面调用 flashLoan 函数并通过 Metamask 接受 Ethereum 交易后,你应该会看到一个交易

恭喜你!你刚完成了一笔闪电贷交易!

3b2920f8380b4754a0e2054ae3635a68.jpg

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

  • 发表于 2020-12-22 10:46
  • 阅读 ( 198 )
  • 学分 ( 31 )
  • 分类:DeFi

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK