↪ flash-loans
Flash Loans
Flash Loans are unique transactions that allow users to borrow assets without upfront collateral, provided that the borrowed amount plus a fee is returned within the same transaction (also known as "one-block borrows"). Since there is no real-world equivalent, understanding how blockchain state transitions occur within blocks is essential.
Note: Flash Loans are an advanced feature intended for developers. A solid grasp of the Ethereum Virtual Machine (EVM), programming, and smart contract development is necessary to utilize this functionality.
Overview
Flash Loans enable users to access the pool's liquidity for a single transaction, on the condition that the borrowed amount plus a fee is returned or a debt position is opened (if permitted) by the end of the transaction. This feature is applicable only to reserves where borrowing is enabled.
HyperLend offers two methods for flash loans:
flashLoan()
Allows borrowers to access liquidity from multiple reserves within a single flash loan transaction. Borrowers also have the option to open a variable-rate borrowing position backed by supplied collateral or via credit delegation.Note: The flash loan fee is waived for approved flash borrowers managed by the
ACLManager
.flashLoanSimple()
Enables borrowers to access liquidity from a single reserve in a transaction. In this case, the flash loan fee is not waived, and borrowers cannot open any debt positions at the end of the transaction. This method is more gas-efficient for those seeking a straightforward flash loan with a single asset.
Execution Flow
For developers, here's a conceptual framework to assist in building your solution:
Initiate the Flash Loan Your contract calls the
Pool
contract, requesting a flash loan of specific amounts of reserves using eitherflashLoanSimple()
orflashLoan()
.Funds Transfer and Callback After performing necessary checks, the
Pool
transfers the requested amounts to your contract and then callsexecuteOperation()
on your contract.Execute Custom Logic With the flash-loaned funds now in your contract, you can perform any arbitrary operations within your code.
Repayment or Debt Opening
For
flashLoanSimple()
: After your operations, you must approve thePool
to pull the flash-loaned amount plus the fee.For
flashLoan()
: Depending on theinterestRateMode
for each asset, you must either approve thePool
for the amount plus fee or ensure sufficient collateral or credit delegation is available to open a debt position.
Transaction Completion If the owed amount is not available due to insufficient balance, lack of approval, or inadequate collateral for debt, the transaction will revert.
All these steps occur within a single transaction, meaning they happen within one Ethereum block.
Applications of Flash Loans
Flash Loans have various practical applications, including:
Arbitrage Opportunities Execute arbitrage between assets without needing the principal amount upfront.
Liquidation of Positions Liquidate borrowing positions without repaying the debt upfront by using the discounted collateral obtained to repay the flash loan amount plus the fee.
Flash Loan Fee
The flash loan fee is initially set to 0.05% at deployment and can be adjusted via a governance vote. Use FLASHLOAN_PREMIUM_TOTAL
to retrieve the current value.
The fee is shared between liquidity providers (LPs) and the protocol treasury:
Fee to LPs:
FLASHLOAN_PREMIUM_TOTAL
minusFLASHLOAN_PREMIUM_TO_PROTOCOL
Fee to Protocol Treasury:
FLASHLOAN_PREMIUM_TO_PROTOCOL
Initially, FLASHLOAN_PREMIUM_TO_PROTOCOL
is set to 0.
Step-by-Step Guide
1. Setting Up
Implement the Receiver Interface Your contract that will receive the flash-loaned funds must implement the
IFlashLoanSimpleReceiver
orIFlashLoanReceiver
interface by defining the appropriateexecuteOperation()
function.Grant Allowance Since the owed amounts will be pulled from your contract, you must grant the
Pool
contract an allowance to transfer the funds needed to repay the flash loan amount plus premiums.
2. Invoking flashLoan()
or flashLoanSimple()
flashLoan()
or flashLoanSimple()
There are three ways to call the flash loan methods:
From an Externally Owned Account (EOA): Send a transaction to the
Pool
contract callingflashLoan()
orflashLoanSimple()
. Refer to thePool
documentation for parameter details, ensuring you use your contract address from step 1 as thereceiverAddress
.From a Different Contract: Similar to the EOA method but initiated from another contract. Ensure the
receiverAddress
is your contract address from step 1.From the Same Contract: If you're using the same contract as in step 1, use
address(this)
for thereceiverAddress
parameter.
Security Tip: Never store funds permanently on your flash loan receiver contract, as they could be vulnerable to 'griefing' attacks where an attacker exploits the stored funds.
Completing the Flash Loan
Repayment: After executing your custom logic in
executeOperation()
, you need to repay the flash-loaned amounts if you usedflashLoanSimple()
or setinterestRateModes = 0
inflashLoan()
.Calculating the Amount Owed: Ensure your contract holds the required amount plus the premium. This can be calculated by summing the relevant entries in the
amounts
andpremiums
arrays provided inexecuteOperation()
.Automatic Pull of Funds: You don't need to manually transfer the owed amount back to the
Pool
; the funds will be automatically pulled at the end of your operation.
Incurring a Debt (Deferred Repayment)
If you used mode=1
or mode=2
for any assets in the modes
parameter, the onBehalfOf
address will incur the debt, provided that it has authorized the msg.sender
to incur debts on its behalf.
This allows for a mix of assets—some can be repaid immediately, while others result in an open debt position.
Last updated