FlashLoan的实现过程
langu_xyz

闪电贷主要由借贷方和放贷方两部分构成,放贷方部署放贷合约,借贷方部署借贷合约,通过借贷合约去调用放贷合约实现,大致流程如下图。

这里我们使用aave https://docs.aave.com/developers/guides/flash-loans 的实现来跟踪一下flashloan的过程,代码如下,aave这里没有使用标准的IERC3156实现,但是只需要将POOL.flashLoanSimple带入flashLoan、executeOperation带入onFlashLoan即可,其它流程基本一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import "https://github.com/aave/aave-v3-core/blob/master/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/interfaces/IPoolAddressesProvider.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/dependencies/openzeppelin/contracts/IERC20.sol";


contract SimpleFlashLoan is FlashLoanSimpleReceiverBase {
address payable owner;

constructor(address _addressProvider)
FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider))
{
}

function fn_RequestFlashLoan(address _token, uint256 _amount) public {
address receiverAddress = address(this);
address asset = _token;
uint256 amount = _amount;
bytes memory params = "";
uint16 referralCode = 0;

POOL.flashLoanSimple(
receiverAddress,
asset,
amount,
params,
referralCode
);
}


/**
This function is called after your contract has received the flash loaned amount
*/
function executeOperation(
address asset,
uint256 amount,
uint256 premium,
address initiator,
bytes calldata params
) external override returns (bool) {

//Logic goes here

uint256 totalAmount = amount + premium;
IERC20(asset).approve(address(POOL), totalAmount);

return true;
}

receive() external payable {}
}

首先部署在Remix上部署合约,这里用的是Polygon Munbai的测试环境,所以在文档https://docs.aave.com/developers/deployed-contracts/v3-testnet-addresses 中找到aave对应的测试合约地址0xeb7A892BB04A8f836bDEeBbf60897A7Af1Bf5d7F作为初始参数传入部署合约

从上述的合约代码中可以看到,fn_RequestFlashLoan的入参分别是放贷地址以及借贷数量,同理,在aave的文档中找到usdc的金库地址0xe9DcE89B076BA6107Bb64EF30678efec11939234作为入参传入,发起借贷

在一切顺利的情况下,fn_RequestFlashLoan中调用POOL.flashLoanSimple发起借贷,在POOL.flashLoanSimple中放款并回调executeOperation

回调到借贷合约的executeOperation中后,执行预定的套利逻辑等一系列操作,然后返回状态通知executeFlashLoanSimple进行判断是否还款。

参考:https://github.com/quiknode-labs/qn-guide-examples/tree/main/ethereum/aave-flash-loan

  • Post title:FlashLoan的实现过程
  • Post author:langu_xyz
  • Create time:2023-04-01 21:00:00
  • Post link:https://blog.langu.xyz/FlashLoan的实现过程/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.