Solidity
雙閃貸
調查快速貸款,是否可以一次取出兩個(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); } }
在 function
startFlashloan()
中,對同一個 flashloan 提供者有兩個呼叫,但它可能是不同的合約(例如:Uniswap、Kyber)。在這個簡單的例子中,兩筆貸款的借入金額相同,回調函式分別更新變數
output1
和output2
值“ flash1 ”和“ flash2 ”。這只是一個基本的展示,從技術上講,對於一個簡單的案例,這是可能的。對於使用生產交換的真實案例,我不完全確定您是否可以在不耗盡燃料的情況下做到這一點。