💰Trading Fees & Price Impact

Price impact and trading fees are incurred whenever an account's position changes.

Settlement Fee

The settlement fee is charged anytime the position changes – this is a fixed amount set by the settlementFee parameter and is used to cover the oracle keeper fee.

settlementFee=settlementFeesettlement Fee = settlementFee

Taker Price Impact

With v2.3 the trade fees are separated from the linear fee to simplify and standardize the subtractive fee logic.

taker fee = notional * takerFee

taker linear fee = notional * takerLinearFee

taker proportional fee = notional * (takerPortionalFee * takerTotal / takerScale)

maker fee = notional * makerFee

maker linear fee = notional * makerLinearFee

maker proportional fee = notional * (makerPortionalFee * makerTotal / makerScale)

Adiabatic fees are assessed in aggregate per direction each version in the following order, with skew and skew’ updating at each step:

  1. Positive skew orders (long open / short close)

  2. Negative skew orders (short open / long close)

takerAdiabaticFee=signedNotionaltakerAdiabaticFee(skew+skew)/2takerScaletakerAdiabaticFee = \dfrac{signedNotional * takerAdiabaticFee * (skew’ + skew) / 2}{ takerScale}
notional 		→ abs(positionDelta * latest price)
signedNotional 		→ positionDelta * latest price
takerLinearFee 		→ riskParameter.takerFee.linearFee
takerProportionalFee 	→ riskParameter.takerFee.proportionalFee
takerAdiabaticFee 	→ riskParameter.takerFee.adiabaticFee
takerScale		→ riskParameter.takerFee.scale
makerLinearFee 		→ riskParameter.makerFee.linearFee
makerProportionalFee 	→ riskParameter.makerFee.proportionalFee
makerScale		→ riskParameter.makerFee.scale
takerFee		→ marketParameter.takerFee
makerFee		→ marketParameter.makerFee
skew 		        → (long - short) 
takerTotal 	        → globalOrder.takerTotal() – including the new order to be computed
makerTotal 		→ globalOrder.makerTotal() – including the new order to be computed

Price Impact Vs Fee

The cascade of market fees has changed to decouple risk and oracle fees since the oracle fees are now set by the oracle instead of via the market parameters.

trade fee = taker fee + maker fee
subtractive fee = trade fee * referral fee %
solver fee = subtractive fee * solver fee %

market fee = trade fee - subtractive fee
risk fee = market fee * risk fee %
oracle fee = (market fee - risk fee) * oracle fee %
protocol fee = market fee - risk fee - oracle fee

trade impact = taker linear fee + taker proportional fee + taker adiabatic fee
solver fee %   → intent.fee
risk fee %     → marketParameter.riskFee
oracle fee %   → oracleReceipt.oracleFee

Estimated Execution Price

For AMM market orders only, intents always execute at pre-specified price.

priceImpact = trade impact / positionDelta 
priceLong = oraclePrice + priceImpact
priceShort = oraclePrice - priceImpact
priceImpactPct = priceImpact / abs(oraclePrice * positionDeltaAbs)
positionDeltaAbs → absolute value long or short position delta

Fee Split

All collected fees are split between the Makers (and in rare cases takers), Perennial treasury, and the respective Product owner's treasury.

This allows market owners (whether individual organization or DAOs / protocols) to collect revenue directly from the administration of the Products and their parameters.

Last updated