This guide covers everything you need to build and run a profitable liquidation bot for Flux Protocol. Learn how to monitor positions, execute capital-free liquidations, and optimize for maximum profit.
Overview
As a liquidator in Flux, you:
Monitor manager positions for unhealthy health ratios
Execute liquidations when positions become underwater
Profit from liquidations based on strategy-specific pricing logic
Need zero upfront capital thanks to locked_borrow()
Protect the protocol by maintaining vault solvency
A position becomes liquidatable when the strategy's evaluateLiquidation() function returns canLiquidate = true.
The strategy can use any logic to determine this. The standard ImmutableFixedRateStrategy uses:
Health Ratio < Liquidation Threshold
Where:
Health Ratio = Total Position Value / True Debt
Liquidation Threshold = 1 + minBondRatio - liquidationBuffer
Example with ImmutableFixedRateStrategy:
Manager's collateral: 50K USDC
True debt: 48K USDC
Health ratio: 50K / 48K = 1.042 (104.2%)
Liquidation threshold: 1.1 (110%)
Result: Liquidatable (104.2% < 110%)
Note: Custom strategies can implement different liquidation logic considering liquidity depth, volatility, off-chain data, or other factors beyond simple health ratios.
Liquidation Payment Calculation
Note: The payment calculation is strategy-specific. Each strategy implements evaluateLiquidation() to determine the minPayment. The examples below show how the standard ImmutableFixedRateStrategy calculates liquidation payments, but custom strategies can implement different pricing logic.
Case 1: Healthy Position (Collateral ≥ Debt)
Case 2: Underwater Position (Collateral < Debt)
Example:
Collateral value: 45K USDC (underwater!)
True debt: 50K USDC
Liquidation profit margin: 1%
Liquidator pays: 45K × 0.99 = 44.55K USDC
Liquidator receives: 45K USDC collateral
Liquidator profit: 450 USDC (1%)
Setting Up Your Liquidation Bot
Step 1: Deploy Executor
Liquidators need an executor to handle the callback:
Step 2: Monitor for Liquidatable Positions
Step 3: Estimate Profitability
Executing Liquidations
Capital-Free Liquidation Pattern
The key innovation: use locked_borrow() to liquidate without upfront capital!
Alternative: Flash Loan Liquidation
If you prefer using external flash loans:
Optimizing Liquidation Profits
1. Gas Optimization
2. Swap Optimization
3. MEV Protection
4. Partial Liquidations
For very large positions, liquidate partially to minimize market impact:
Monitoring and Alerting
Real-Time Position Monitoring
Profitability Dashboard
Complete Liquidation Bot Example
Best Practices
1. Always Verify Profitability First
2. Handle Failed Liquidations Gracefully
3. Monitor Gas Prices
4. Keep Detailed Logs
Troubleshooting
Common Issues
Issue: "Position not liquidatable"
Cause: Health ratio still above threshold
Solution: Wait for health to drop further or oracle prices to update
Issue: "Insufficient profit"
Cause: Liquidation margin too low or gas costs too high
Solution: Only target larger positions or wait for better gas prices
Issue: "Transaction reverted"
Cause: Position already liquidated or health improved
const currentGasPrice = await provider.getFeeData();
// Only liquidate if gas price is reasonable
if (currentGasPrice.gasPrice > MAX_GAS_PRICE) {
console.log("Gas price too high, waiting...");
return;
}