Solidity

雙閃貸

  • March 18, 2021

調查快速貸款,是否可以一次取出兩個(aave/dydx/uniswap)?你會怎麼做呢?

這是我的想法,但它似乎太複雜了:

  • 合約 1 為 COIN1 貸款。
  • 合約 1 向合約 2 發送 COIN1。
  • 合約 2 收到 COIN1 並為 COIN2 貸款。
  • 契約 2 用兩個硬幣做事
  • 契約 2 還清貸款
  • 合約 2 將剩餘資金發送給合約 1
  • 契約 1 償還了其貸款。

前提是合約 2 需要同時訪問兩個硬幣,並且沒有辦法改變這一點。有沒有辦法在一份契約中同時要求兩筆貸款?

您實際上可以進行雙重快速貸款,但成功將取決於交易中消耗的氣體總量。

事實上,您不需要有兩個契約,您可以從同一個契約中申請兩個貸款。

下面是一個簡單的例子,說明如何做到這一點:

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.3;

import {IERC20} from "../aave-flashloan/interfaces/IERC20.sol";
import {FlashloanProvider2} from "./FlashloanProvider.sol";
import {IFlashloanUser2} from "./IFlashloanUser.sol";

contract FlashloanUser2 is IFlashloanUser2 {
   string public output1;
   string public output2;

   /**
    * @notice  Start the flashloan (triggered by user)
    * @param   flashloan The flashloan contract address
    * @param   amount The amount to be borrowed
    * @param   token The token to be borrowed
    */
   function startFlashloan(
       address flashloan,
       uint256 amount,
       address token
   ) external {
      // Flashloan call #1 
       FlashloanProvider2(flashloan).executeFlashloan(
           address(this),
           amount,
           token,
           'flash1',
           1
       );
       // Flashloan call #2
       FlashloanProvider2(flashloan).executeFlashloan(
           address(this),
           amount,
           token,
           'flash2',
           2
       );
   }

   /**
    * @notice  Callback function to do arbitrage (or whatever) after
    *          receiving the borrowed amount and before returning it
    * @param   amount The amount to be returned
    * @param   token The token to be returned
    * @param   data Arbitrary data
    */
   function flashloanCallback(
       uint256 amount,
       address token,
       string memory data,
       uint256 flashNumber
   ) external override {
       // do some arbitrage, liquidation, etc.
       if (flashNumber == 1) {
           output1 = data;
       } else {
           output2 = data;
       }

       // Reimburse borrowed tokens to Flashloan contract
       IERC20(token).transfer(msg.sender, amount);
   }
}

在 functionstartFlashloan()中,對同一個 flashloan 提供者有兩個呼叫,但它可能是不同的合約(例如:Uniswap、Kyber)。

在這個簡單的例子中,兩筆貸款的借入金額相同,回調函式分別更新變數output1output2值“ flash1 ”和“ flash2 ”。

這只是一個基本的展示,從技術上講,對於一個簡單的案例,這是可能的。對於使用生產交換的真實案例,我不完全確定您是否可以在不耗盡燃料的情況下做到這一點。

引用自:https://ethereum.stackexchange.com/questions/94821