Skip to content

Question: Liquidation position selection priority #3296

@djm07073

Description

@djm07073

Context

PR #535 introduced pseudorandom position selection to prevent bias toward certain perpetuals.

Current Behavior

// protocol/x/clob/keeper/liquidations.go:165
indexOffset := k.GetPseudoRand(ctx).Intn(numPositions)
for i := 0; i < numPositions; i++ {
    position := subaccount.PerpetualPositions[(i+indexOffset)%numPositions]
    if !subaccountLiquidationInfo.HasPerpetualBeenLiquidatedForSubaccount(position.PerpetualId) {
        return position.PerpetualId, nil
    }
}
  • Random starting offset for position iteration
  • Single position per subaccount per block
  • No risk-based prioritization

Scenario

When a subaccount has multiple positions with varying risk levels:

Position Margin Utilization
ETH-USD 70%
BTC-USD 95% ← Critical
SOL-USD 78%

If random selection picks ETH-USD first, the critical BTC-USD position waits until the next block. During high volatility, this delay could push it from liquidatable → bankruptcy, potentially increasing insurance fund utilization.

Is this a known trade-off that was intentionally accepted for performance or fairness reasons?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions