Aave flash loan

原理圖
Lending Pool Core
Lending Pool Core 持有所有的儲備資產,以及計算邏輯。

LendingPoolAddressesProvider
LendingPoolAddressesProvider是個全局地址註冊中心

LendingPoolDataProvider
計算用戶餘額的ETH等價值,和其頭寸的健康因子。
聚合LendingPoolCore 數據。
計算平均貸款價值比和平均清算比率

Lending Pool

LendingPoo合約使用LendingPoolCore和LendingPoolDataProvider與存儲交互。這是開發人員應該與之交互的主要合約。請參閱文檔的LendingPool部分。

The InterestRateStrategy contract holds the information needed to calculate and update the interest rates of specific reserves.

deposit

borrow()
function borrow(address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode)

borrow支持固定利率和可變利率,在價格波動的情況下,如果抵押品的價格下降到某一閾值以下,借款頭寸將被清算

/// Retrieve LendingPool address
LendingPoolAddressesProvider provider = LendingPoolAddressesProvider(address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8)); // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instances
LendingPool lendingPool = LendingPool(provider.getLendingPool());

/// Input variables
address daiAddress = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); // mainnet DAI
uint256 amount = 1000 * 1e18;

/// 1 is stable rate, 2 is variable rate
uint256 variableRate = 2;
uint256 referral = 0;

/// Borrow method call
lendingPool.borrow(daiAddress, amount, variableRate, referral);

borrow
repay()

function repay( address _reserve, uint256 _amount, address payable _onBehalfOf)

當第三方代表他們償還另一個用戶債務時,第三方地址需要使用_reserve契約的底層ERC20的_amount來批准()LendingPoolCore契約(與LendingPool契約不同)。
在這裏插入圖片描述
swapBorrowRateMode()
轉換sender的利率模式

liquidationCall()

function liquidationCall(address _collateral, address _reserve, address _user, uint256 _purchaseAmount, bool _receiveaToken)

當頭寸的健康係數低於1時,清算人代表借款人償還部分或全部未償貸款,同時獲得折價的抵押品(也稱爲清算“獎金”)。清算人可以決定,他們是希望獲得等值的抵押貸款,還是直接獲得標的資產。當清算成功完成時,該頭寸的健康因子增加,使健康因子大於1。

清算人只能清算由封閉因子定義的一定數量的抵押品。目前的近似值是0.5。換句話說,清算人最多隻能清算未清償頭寸金額的50%。清算的折扣是按這個金額計算的。

_collateral
清算抵押物準備金的地址
_reserve
貸款標的資產的地址
_user
借款用戶地址
_purchaseAmount
折扣購買的金額

_receiveaToken
如果爲真,用戶將獲得與所購買抵押品等價的aTokens。如果爲false,則用戶直接接收基礎資產

import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";

/// Retrieve the LendingPool address
LendingPoolAddressesProvider provider = LendingPoolAddressesProvider(address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8)); // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instances
LendingPool lendingPool = LendingPool(provider.getLendingPool());

/// Input variables
address collateralAddress = /*collateral_address*/;
address daiAddress = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); // mainnet DAI
address userAddress = /*user_address_being_liquidated*/;
uint256 purchaseAmount = 100 * 1e18;
bool receiveATokens = true;

/// Approve LendingPool contract to move your DAI
IERC20(daiAddress).approve(provider.getLendingPoolCore(), purchaseAmount);

/// LiquidationCall method call
lendingPool.liquidationCall(
    collateralAddress,
    daiAddress,
    userAddress,
    purchaseAmount,
    receiveATokens
);

flashLoan()
function flashLoan(address payable _receiver, address _reserve, uint _amount, bytes memory _params) external

允許調用契約從_reserve池(不含抵押品)借款,即一定數量的流動性,必須在交易結束前歸還。
flashloa

function getReserveConfigurationData(address _reserve)
返回特定儲備的配置參數。

function getReserveData(address _reserve)
返回任何資產儲備池的全局信息

function getUserAccountData(address _user)
返回與特定用戶地址專門相關的reserve的信息

function getUserReserveData(address _reserve, address _user)
返回與特定備用項上的用戶數據相關的信息

function getReserves()
返回所有活動儲備地址的數組。

###aTokens
aTokens是計息衍生令牌,在存款(從LendingPool調用)和贖回(從aToken契約調用)時鑄造和燒燬。aTokens的價值與相應的存款資產價值按1:1的比例掛鉤,可以安全地存儲、轉移或交易。aTokens準備金所收集的所有利息通過不斷增加aTokens持有人的錢包餘額直接分配給他們。用戶可以決定將他們的利息支付流重定向到任何Ethereum公共地址。

Price Oracle
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章