Lista Docs
中文
中文
  • 引言
    • 概览
    • 抵押债务头寸 - lisUSD
      • 抵押品
        • 经典抵押选项
        • Lista 创新区
        • 贷款清算
      • lisUSD
        • 稳定池 - 价格稳定模块 (PSM)
        • lisUSD 储蓄率 (LSR)
        • D3M - 直接存款模块
        • 算法市场操作 (AMO)
          • 当前与预期借款利率
        • lisUSD 的流动性
      • 技术指南
    • 流动性质押 - slisBNB
      • 关于 slisBNB
      • 奖励与费用
      • 技术指南
    • Lista 借贷
      • 金库
        • 如何创建金库
      • 市场
      • 借款人与供应商
      • 利率模型 (IRM)
      • 费用
      • 清算
      • 预言机
      • 闪电贷
      • 用户流程
    • 币安 Launchpool: clisBNB
      • 用 slisBNB 铸造 clisBNB
      • 在 Lista 借贷上铸造 clisBNB
    • BNB 验证器: Lista DAO
    • 路线图
    • 常见问题解答
  • 治理
    • LISTA
      • LISTA 分配
    • veLISTA
      • veLISTA 概述
      • Lista DAO: 解锁 veLISTA 功能
      • veLISTA 锁定机制
      • 治理
        • 治理提案模板
      • 协议费用
      • veLISTA 发行
        • LP 池
      • veLISTA 投票
      • veLISTA 贿赂市场
      • 自动复合
      • LISTA 永久锁定 (LIP-016)
      • 收入 / 成本
      • 分析
  • 用户指南
    • 抵押债务头寸
      • 提供抵押品
      • 借用 lisUSD
      • 偿还 lisUSD
      • 提取抵押品
      • 将 clisBNB 委托给您的币安 web3 MPC 钱包
    • 流动性质押 - slisBNB
      • 如何兑换 slisBNB
      • 铸造 slisBNB
      • 从 slisBNB 兑换 BNB
      • 将 slisBNB 桥接到以太坊
    • 使用币安钱包
      • 将 BNB 流动性质押为 slisBNB
      • 获取 lisUSD
      • 在 APX Finance 上交易
    • LISTA / veLISTA
      • 锁定 LISTA
      • 延长 LISTA 锁定
      • 自动锁定
      • 解锁 LISTA
      • 领取奖励
      • 在 Lista DAO 上质押外部 LP 代币
      • Gauge 投票
  • 安全
    • 审计报告
    • Bug 赏金 (Immunefi)
  • 开发者专区
    • 概览
    • LISTA 治理
      • 智能合约
    • 抵押债务头寸
      • 机制
      • 闪电贷
      • 多预言机
      • 智能合约
    • 流动性质押(slisBNB)
      • 机制
      • 跨链桥
      • 智能合约
    • clisBNB
      • 智能合约
  • Lista 借贷
    • 智能合约
  • 合作伙伴关系
    • 品牌工具包
    • 我们的频道
  • 法律免责声明
    • 法律免责声明
Powered by GitBook
On this page
  • 闪电贷款的应用
  • 参与实体
  • 闪电贷款费用
  • 代码示例
  • 逐步操作
  • 接近实际使用的示例
  1. 开发者专区
  2. 抵押债务头寸

闪电贷

Previous机制Next多预言机

Last updated 8 months ago

闪电贷款是无抵押贷款,用户可以借用lisUSD,只要在交易结束前归还借款金额(和费用)。

要使用闪电贷款并从中获利,你需要对BNB链(和智能链)、编程和智能合约有深入的理解。

闪电贷款的应用

闪电贷款有各种应用。

一个明显的例子是资产之间的套利,用户可以闪电贷款lisUSD在某人的期间购买在荷兰拍卖中的BNB,然后立即在DEX上将lisUSD换成另一种资产,再立即在另一个DEX上将获得的资产换成lisUSD,其中该资产的比率更高,然后偿还Lista闪电贷款+利息,保留差额——所有这些都在一次贷款交易中完成。

参与实体

  1. flashLender — 实现闪电贷款功能的"服务器端"的Lista智能合约。

  2. flashBorrower — 实现"客户端"的智能合约,EOA可以复制、修改并部署以通过flashLender进行交互。本页面后面提供了一个智能合约的示例。

  3. EOA(Externally Owned Account) — 与他们部署的flashBorrower副本进行交互的账户。实际上,EOA是一个复制flashBorrower,修改并在BSC上部署它以通过flashLender进行交互的开发者。

flashLender可以在一次交易中借用(铸造)和偿还(销毁),并收取费用。EOA需要与他们自己部署的flashBorrower副本进行交互,该副本反过来与flashLender进行交互。

闪电贷款费用

要获取费用,调用flashFee(address token, uint256 amount)函数,该函数返回18位小数的费用金额。

代码示例

flashLender —

flashBorrower —

逐步操作

1. 设置你的flashBorrower合约

要与flashLender交互,你的合约必须实现flashBorrow(token, amount)和onFlashLoan(initiator, token, amount, fee, data),这是在执行flashLoan()期间调用的回调函数。

在onFlashLoan()中实现任何自定义逻辑。

以下是一个示例存根合约,你可以通过它更好地理解如何实现flashBorrower。

pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../interfaces/IERC3156FlashBorrower.sol";
import "../interfaces/IERC3156FlashLender.sol";

contract FlashBorrower is IERC3156FlashBorrower {
    enum Action {NORMAL, OTHER}

    IERC3156FlashLender lender;

    constructor (IERC3156FlashLender lender_) {
        lender = lender_;
    }

    /// @dev ERC-3156 Flash loan callback
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external override returns(bytes32) {
        require(
            msg.sender == address(lender),
            "FlashBorrower: Untrusted lender"
        );
        require(
            initiator == address(this),
            "FlashBorrower: Untrusted loan initiator"
        );
        (Action action) = abi.decode(data, (Action));
        if (action == Action.NORMAL) {
            // do one thing
        } else if (action == Action.OTHER) {
            // do another
        }
        return keccak256("ERC3156FlashBorrower.onFlashLoan");
    }

    /// @dev Initiate a flash loan
    function flashBorrow(
        address token,
        uint256 amount
    ) public {
        bytes memory data = abi.encode(Action.NORMAL);
        uint256 _allowance = IERC20(token).allowance(address(this), address(lender));
        uint256 _fee = lender.flashFee(token, amount);
        uint256 _repayment = amount + _fee;
        IERC20(token).approve(address(lender), _allowance + _repayment);
        lender.flashLoan(this, token, amount, data);
    }
}

2. 理解如何与flashLender交互

理解在flashLender中使用的参数:

  1. CALLBACK_SUCCESS — 成功返回的自定义字符串的哈希。

  2. token (address) — EOA闪电贷款的BNB ERC-20代币的地址。

  3. amount (uint256) — 闪电贷款的金额。

  4. receiver (IERC3156FlashBorrower) — EOA部署的flashBorrowed的地址。

  5. data (bytes calldata) — 基础的未使用参数,保留不改变flashLoan()签名。

理解你想要交互的函数:

  1. maxFlashLoan(address token) — 如果_token_是支持的destablecoin,返回“max”。

  2. flashFee(address token, uint256 amount) — 对_amount_应用“toll”,并返回如果_token_是支持的destablecoin。

  3. flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) — 用额外的_data_(如果有的话)向_receiver_铸造_token amount_,并期望返回等于CALLBACK_SUCCESS的值。

  4. function accrue() — 将剩余的费用发送到_vow.sol_。

  1. vat — vat.sol的地址。

  2. hayJoin — hayJoin.sol的地址。

  3. hay — hay.sol的地址。

  4. vow — vow.sol的地址。

  5. max — 允许的最大可借金额。

  6. toll — 贷款回报的费用。

  7. WAD — 18位小数。

  8. RAY — 27位小数。

  9. RAD — 45位小数。

  10. CALLBACK_SUCCESS — 成功返回的自定义字符串的哈希。

3. 与flashLender交互

flashLender可以通过以下地址获取:

  • 测试网 — 即将推出

典型的交互遵循这个工作流程:

  1. EOA在借款合约_flashBorrower.sol_上调用flashBorrow(token, amount)。

  2. _flashBorrower_提前批准_flashLender_偿还贷款和费用。然后它在_flashLender_上调用flashLoan(receiver, token, amount, data)函数,该函数向_flashBorrower_铸造指定的金额。

  3. 同样的函数flashLoan(receiver, token, amount, data)然后调用(回调)_flashBorrower_上的onFlashLoan(initiator, token, amount, fee, data)函数,该函数实现了EOA想要用借来的lisUSD做什么的自定义逻辑,然后onFlashLoan()如果执行成功,则返回“ERC3156FlashBorrower.onFlashLoan"的KECCAK256。自定义逻辑完全由EOA想出并实现。

  4. flashLender然后销毁铸造的贷款,并将费用存储为剩余。

接近实际使用的示例

你的合约必须符合接口,通过实现onFlashLoan()函数。

flashBorrower必须实现,并且必须返回哈希。

如果你感到好奇,理解在中使用的MakerDao参数/常量。

要深入理解MakerDao合约,如var、hay、vow等,从开始,然后继续阅读其他在那里记录的智能合约。

主网 —

flashBorrower必须实现,并且必须返回哈希。

查看以找到接近实际使用的示例。

Lista贷款清算
Lista稳定币
flash.sol
flashBorrower.sol
ERC3156FlashBorrower
IERC3156FlashBorrower
onFlashLoan()
CALLBACK_SUCCESS
flash.sol
vat文档
0x64d94e715B6c03A5D8ebc6B2144fcef278EC6aAa
I
onFlashLoan()
CALLBACK_SUCCESS
测试