Skip to main content

flash-loan-usage

Use when implementing flash loan strategies including arbitrage, liquidation bots, collateral swaps, or debt refinancing. Covers Aave V3, Uniswap, and Balancer flash loan patterns with receiver templates.

Ir a la instalación

Datos de origen

Repositorio
ccashwell/evm-cortex
Última actividad en el origen
10 de abril de 2026 a las 16:31
Idioma detectado de SKILL.md
inglés
Estrellas
129
Forks
18

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
flash-loan-usage
description
Use when implementing flash loan strategies including arbitrage, liquidation bots, collateral swaps, or debt refinancing. Covers Aave V3, Uniswap, and Balancer flash loan patterns with receiver templates.
# Flash Loan Patterns ## Flash Loan Providers | Provider | Fee | Multi-Asset | Notes | |----------|-----|-------------|-------| | Aave V3 | 0.05% | Yes (`flashLoan`) | Most popular, widest asset support | | Uniswap V2/V3 | 0.3% / pool fee | Yes (flash swap) | Built into swap, repay with other token | | Uniswap V4 | 0% | Yes (flash accounting) | Enabled by PoolManager's delta-tracking which will always settle cleanly as long as the full delta is repaid within the unlock context. | | Balancer V2 | 0% | Yes | Free, limited to Balancer vault assets | | dYdX | 0% | Limited | Solo margin flash loans | ## Aave V3 Flash Loan Receiver ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {FlashLoanSimpleReceiverBase} from "@aave/v3-core/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol"; import {IPoolAddressesProvider} from "@aave/v3-core/contracts/interfaces/IPoolAddressesProvider.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract AaveFlashLoan is FlashLoanSimpleReceiverBase { address public immutable owner; constructor(IPoolAddressesProvider provider) FlashLoanSimpleReceiverBase(provider) { owner = msg.sender; } function executeOperation( address asset, uint256 amount, uint256 premium, address initiator, bytes calldata params ) external override returns (bool) { require(msg.sender == address(POOL), "caller must be pool"); require(initiator == address(this), "untrusted initiator"); (uint8 action) = abi.decode(params, (uint8)); if (action == 1) _arbitrage(asset, amount); else if (action == 2) _liquidate(asset, amount, params); else if (action == 3) _collateralSwap(asset, amount, params); uint256 repayment = amount + premium; IERC20(asset).approve(address(POOL), repayment); return true; } function execute(address asset, uint256 amount, bytes calldata params) external { require(msg.sender == owner, "only owner"); POOL.flashLoanSimple(address(this), asset, amount, params, 0); } function _arbitrage(address asset, uint256 amount) internal { // Buy low on DEX A, sell high on DEX B // Profit must exceed the 0.05% premium } function _liquidate(address asset, uint256 amount, bytes calldata params) internal { // Use borrowed funds to liquidate an underwater position // Receive collateral at a discount, swap back to repay } function _collateralSwap(address asset, uint256 amount, bytes calldata params) internal { // Repay existing debt, withdraw old collateral // Swap to new collateral, deposit, re-borrow } } ``` ## Aave V3 Multi-Asset Flash Loan ```solidity function executeMultiFlash( address[] calldata assets, uint256[] calldata amounts ) external { uint256[] memory modes = new uint256[](assets.length); // mode 0 = full repay, 1 = stable debt, 2 = variable debt POOL.flashLoan( address(this), assets, amounts, modes, address(this), // onBehalfOf "", // params 0 // referralCode ); } ``` ## Uniswap V3 Flash Swap ```solidity import {IUniswapV3FlashCallback} from "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3FlashCallback.sol"; contract UniV3Flash is IUniswapV3FlashCallback { IUniswapV3Pool public immutable pool; function initFlash(uint256 amount0, uint256 amount1) external { pool.flash(address(this), amount0, amount1, abi.encode(msg.sender)); } function uniswapV3FlashCallback( uint256 fee0, uint256 fee1, bytes calldata data ) external override { require(msg.sender == address(pool), "unauthorized"); address caller = abi.decode(data, (address)); // Use amount0 + amount1 here // Repay: principal + fee if (fee0 > 0) IERC20(pool.token0()).transfer(address(pool), amount0 + fee0); if (fee1 > 0) IERC20(pool.token1()).transfer(address(pool), amount1 + fee1); } } ``` ## Balancer V2 Flash Loan (Zero Fee) ```solidity import {IFlashLoanRecipient} from "@balancer-labs/v2-interfaces/contracts/vault/IFlashLoanRecipient.sol"; import {IVault} from "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; contract BalancerFlash is IFlashLoanRecipient { IVault public constant VAULT = IVault(0xBA12222222228d8Ba445958a75a0704d566BF2C8); function receiveFlashLoan( IERC20[] memory tokens, uint256[] memory amounts, uint256[] memory feeAmounts, bytes memory userData ) external override { require(msg.sender == address(VAULT), "unauthorized"); // feeAmounts are 0 for Balancer // Your logic here for (uint256 i = 0; i < tokens.length; i++) { tokens[i].transfer(address(VAULT), amounts[i] + feeAmounts[i]); } } function execute(IERC20[] calldata tokens, uint256[] calldata amounts) external { VAULT.flashLoan(this, tokens, amounts, ""); } } ``` ## Arbitrage Pattern ``` 1. Flash borrow X tokens of asset A from Aave 2. Swap A -> B on DEX₁ (where A is cheap) 3. Swap B -> A on DEX₂ (where A is expensive) 4. Repay X + premium to Aave 5. Keep profit (A_out - X - premium) ``` Profit condition: `output - input - premium - gas > 0` ## Liquidation Bot Pattern ``` 1. Monitor health factors via events or polling 2. Flash borrow the debt asset 3. Call liquidationCall() on Aave / absorb() on Compound 4. Receive discounted collateral 5. Swap collateral back to debt asset 6. Repay flash loan + premium 7. Keep liquidation bonus minus fees ``` ## Checklist - [ ] Always validate `msg.sender` is the lending pool in callbacks - [ ] Validate `initiator` is your own contract (prevents griefing) - [ ] Calculate profit after all fees (flash loan premium + swap fees + gas) - [ ] Use Balancer for zero-fee flash loans when assets are available - [ ] Approve exact repayment amount (principal + premium) before return - [ ] Test with forked mainnet to verify real liquidity and pricing - [ ] Add access control — only owner/keeper can trigger flash loans - [ ] Handle the case where arbitrage is unprofitable (revert early)
Ver en GitHub