闪电贷款

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

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

闪电贷款的应用

闪电贷款有诸多用途。

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

涉及的实体

  1. flashLender - Lista的智能合约,实现Flash贷款功能的 "服务器端"。

  2. flashBorrower - 实现 "客户端 "的智能合约,EOA可以复制、修改和部署,通过flashLender进行交互。本页后面有一个智能合约的存根例子。

  3. EOA(外部拥有的账户)--一个与他们部署的flashBorrower副本互动的账户。实际上,EOA是一个开发者,他复制flashBorrower,进行修改,并将其部署在BSC上,通过它与flashLender互动。

flashLender可以用来借入(mint)和偿还(burn)lisUSD destablecoins,并收取一定费用,在一次交易中。EOA需要与他们自己部署的flashBorrower副本进行交互,而后者又与flashLender进行交互。

闪电贷款费用

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

代码示例

flashLender — flash.sol

flashBorrower — flashBorrower.sol

逐步推进

1. 设置你的FlashBorrower合同

你的合同必须符合ERC3156FlashBorrower接口,实现onFlashLoan()函数。

为了与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) — BNB ERC-20令牌的地址,EOA闪电式贷款。

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

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

  5. data (bytes calldata) — 不改变flashLoan()签名的基本的非使用参数。

了解你想与之互动的函数:

  1. maxFlashLoan(address token) — 如果token被支持的destablecoin,返回 "最大"。

  2. flashFee(address token, uint256 amount) — 如果代币是被支持的可转移货币,则对金额应用 "收费 "并返回。

  3. flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) —用额外的数据(如果有的话)将代币amount to receiver ,并期望返回等于CALLBACK_SUCCESS。

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

如果你对此感到很好奇,可以了解一下Flash.sol中使用的MakerDao参数/常量。

  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 — 自定义字符串的哈希值,成功时返回。

要深入了解MakerDao合约,如var、hay、vow等,请从vat文档开始,然后再去看那里记录的其他智能合约。

3. 与flashLender互动

flashLender可以通过以下地址使用:

一个典型的交互是这样的工作流程:

  1. 一个EOA在一个借款合同flashBorrower.sol上调用flashBorrow(token, amount)

  2. 提前批准flashLender用费用来偿还贷款。然后它在flashLender上调用flashLoan(receiver, token, amount, data)函数,该函数向flashBorrower兑现了指定的金额。

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

  4. 然后,flashLender会烧掉铸造的贷款,并将费用作为剩余的储存起来。

贴近生活的使用实例

查看测试内容,找到一个贴近生活的使用实例。

Last updated