Skip to main content
Position reduction allows a trader to decrease the notional size of an open position without fully closing it. This partially realizes PnL on the reduced portion, frees up proportional margin, and keeps the remaining position active with its original entry strike. It is a powerful tool for incremental risk management.

How It Works

Function: SettlementEngine.reducePosition(uint256 positionId, uint256 reductionNotional) When reducing a position, the protocol splits it conceptually into two parts: the portion being closed (the reductionNotional) and the portion remaining open. The closed portion is settled at the current forward price, and the remaining portion continues as an open position with proportionally reduced margin and MM threshold.
If reductionNotional equals the position’s full notional, the reduction is treated as a full close with CloseReason.EARLY_TERMINATION. There is no separate “reduce to zero” path — it seamlessly converts to early termination.

Preconditions

ConditionError on Failure
Position status is OPENPositionNotOpen
Position is not liquidatableEarlyTerminationNotAllowed
Caller is the position ownerNotPositionOwner
reductionNotional > 0ZeroAmount
Remaining notional >= minPositionNotional (unless full close)NotionalTooSmall
If a reduction would leave the position with less than the minimum notional (default 100 USDC), the transaction reverts. The trader must either reduce to a valid amount or close the position entirely. This prevents the creation of dust positions that would be uneconomical to settle.

Reduction Mechanics

1

Calculate Proportional Margin at Risk

The margin at risk is the proportional share of the position’s locked margin:
marginAtRisk = (imLocked * reductionNotional) / notional
For example, reducing 40% of a position with 20 USDC locked margin puts 8 USDC at risk for the reduction.
2

Get Forward Price

The current forward price for the position’s fixing timestamp is fetched from the OracleModule. An oracle fee is collected from the trader’s collateral.
3

Compute PnL on Reduced Portion

PnL is calculated only on the reductionNotional, not the full position:
  • LONG: pnl = reductionNotional * (forwardPrice - entryStrike) / PRICE_PRECISION
  • SHORT: pnl = reductionNotional * (entryStrike - forwardPrice) / PRICE_PRECISION
Losses are capped at marginAtRisk (isolated margin guarantee).
4

Compute Fee on Reduction

The trading fee is calculated on the reduction amount only:
fee = reductionNotional * snapshotTradingFeeBps / 10000
No liquidation penalty is applied. The fee is capped at available margin after PnL.
5

Update Remaining Position

If this is a partial reduction (not full close), the position is updated:
  • notional decreases by reductionNotional
  • imLocked decreases by marginAtRisk
  • mmThreshold is reduced proportionally
  • Position remains OPEN with the same entry strike, fixing timestamp, and all other parameters unchanged
  • Pool exposure counters are updated to reflect the reduced notional
6

Emit Events

A PositionReduced event is emitted with the reduction details: positionId, account, reductionNotional, remainingNotional, settledPnl, and fee.

Worked Example

Initial position:
  • Side: LONG
  • Notional: 1,000 USDC
  • Entry strike: 1.0800
  • IM locked: 20 USDC (2%)
  • MM threshold: 10 USDC (1%)
  • Snapshotted trading fee: 5 bps
Reduction: close 400 USDC of the 1,000 USDC notionalCurrent forward price: 1.0850Step 1 — Margin at risk:
marginAtRisk = (20 * 400) / 1,000 = 8 USDC
Step 2 — PnL on reduced portion:
pnl = 400 * (1.0850 - 1.0800) / 1 = 400 * 0.005 = 2 USDC profit
Step 3 — Fee:
fee = 400 * 5 / 10,000 = 0.20 USDC
Step 4 — Settlement of reduced portion:
  • Margin at risk: 8 USDC
  • Profit: 2 USDC (paid by pool)
  • Fee: 0.20 USDC (from margin)
  • Net to trader: 8 + 2 - 0.20 = 9.80 USDC returned to free collateral
Remaining position:
  • Notional: 600 USDC
  • Entry strike: 1.0800 (unchanged)
  • IM locked: 12 USDC (20 - 8)
  • MM threshold: 6 USDC (proportionally reduced)
  • Status: OPEN

Use Cases

Take Partial Profits

Close a portion of a winning position to realize gains while keeping the remainder open for further upside. Useful when you want to de-risk but maintain exposure.

Reduce Exposure

Decrease your position size in response to changing market conditions without fully exiting. This reduces your notional risk while preserving the original entry price.

Free Up Margin

Reduction returns proportional margin to your free collateral, which can then be used to open new positions, add margin elsewhere, or withdraw.

Incremental Risk Management

Scale out of a position gradually over time rather than making a single all-or-nothing close decision.

Reduction vs Full Close

AspectPartial ReductionFull Close (Early Termination)
Notional afterReduced (must be >= min notional)Zero
Position status afterOPENCLOSED
Entry strikeUnchangedN/A
CloseReasonN/A (position stays open)EARLY_TERMINATION
FeeOn reduction amount onlyOn full notional
PnL realizedOn reduced portion onlyOn full notional
If you call reducePosition with reductionNotional equal to the position’s full notional, it is treated as a full early termination. There is no need to use a different function for closing entirely — the reduction function handles both cases seamlessly.

Mode Restrictions

Like early termination, position reduction is allowed in NORMAL, DEGRADED, and REDUCE_ONLY modes. It is only blocked in PAUSED mode:
ModePosition Reduction
NORMALAllowed
DEGRADEDAllowed
REDUCE_ONLYAllowed
PAUSEDBlocked
This ensures traders can always reduce their risk exposure even when the protocol is in a restricted operating mode.