Diffusal

DiffusalLiquidationCalculator

Liquidation view functions extracted from LiquidationEngine

The DiffusalLiquidationCalculator contract provides liquidation-related view functions for the Diffusal protocol. It was extracted from DiffusalLiquidationEngine to reduce contract size while maintaining the same functionality.


Overview

The liquidation calculator provides:

FunctionDescription
Liquidation InfoComprehensive data about a user's liquidation status
Liquidatable PortfoliosFind all portfolios that can be liquidated for a user
Debt EstimationCalculate debt and estimated costs/bounties

Architecture

┌─────────────────────────────────────────────────────────────────┐
│                  DiffusalLiquidationCalculator                   │
│                                                                  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  getPortfolioLiquidationInfo() - per-portfolio data        │  │
│  └───────────────────────────────────────────────────────────┘  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  getLiquidatablePortfolios() - find all liquidatable       │  │
│  └───────────────────────────────────────────────────────────┘  │
└──────────────────────────────┬──────────────────────────────────┘

                               │ reads from

┌─────────────────────────────────────────────────────────────────┐
│                  DiffusalLiquidationEngine                       │
│                   (main liquidation logic)                       │
└─────────────────────────────────────────────────────────────────┘

View Functions

Portfolio-Aware Only

All liquidation view functions are portfolio-aware. You must always specify a portfolioId. Use getLiquidatablePortfolios() to find which portfolios need liquidation.

getPortfolioLiquidationInfo

Get comprehensive liquidation information for a specific portfolio.

function getPortfolioLiquidationInfo(address user, uint256 portfolioId)
    external view returns (LiquidationInfo memory info)
ParameterTypeDescription
useraddressUser address
portfolioIduint256Portfolio ID

Returns:

struct LiquidationInfo {
    bool isLiquidatable;         // Can be liquidated
    uint256 debt;                // Debt amount (USDC, 6 decimals)
    uint256 estimatedLongsCost;  // Estimated cost for long positions (USDC)
    uint256 estimatedShortsCost; // Estimated proceeds from short positions (USDC)
    uint256 estimatedBounty;     // Estimated liquidator reward (USDC)
    uint256 positionCount;       // Number of positions
    uint256 portfolioId;         // Portfolio ID
}

getLiquidatablePortfolios

Get all liquidatable portfolio IDs for a user.

function getLiquidatablePortfolios(address user) external view returns (uint256[] memory portfolioIds)
ParameterTypeDescription
useraddressUser address to check

Returns: Array of portfolio IDs that are liquidatable. Empty array if none.

Use case: Liquidator bots can call this to find all portfolios needing liquidation for a user.


liquidationEngine

Get the liquidation engine address.

function liquidationEngine() external view returns (address)

marginCalculator

Get the margin calculator address.

function marginCalculator() external view returns (address)

Integration Points

Depends On

ContractPurpose
DiffusalLiquidationEngineMain liquidation logic
DiffusalMarginCalculatorLiquidatable checks

Used By

ContractPurpose
Liquidator botsPre-liquidation checks
FrontendDisplay liquidation status

Example Usage

import {IDiffusalLiquidationCalculator} from "@diffusal/interfaces/IDiffusalLiquidationCalculator.sol";
import {IDiffusalLiquidationEngine} from "@diffusal/interfaces/IDiffusalLiquidationEngine.sol";

// Check if user has any liquidatable portfolios
uint256[] memory liquidatableIds = liquidationCalculator.getLiquidatablePortfolios(user);

if (liquidatableIds.length > 0) {
    // Get detailed info for the first liquidatable portfolio
    IDiffusalLiquidationEngine.LiquidationInfo memory info =
        liquidationCalculator.getPortfolioLiquidationInfo(user, liquidatableIds[0]);

    // Estimate profitability
    uint256 estimatedProfit = info.estimatedBounty;
    uint256 estimatedCost = info.estimatedLongsCost;

    if (estimatedProfit > estimatedCost) {
        // Proceed with liquidation
    }
}

Code Reference

Source: packages/contracts/src/DiffusalLiquidationCalculator.sol

Interface: packages/contracts/src/interfaces/IDiffusalLiquidationCalculator.sol


On this page