๐ฐPrice Impact & Trading Fees
Price impact and trading fees are distinct charges incurred whenever an account's position changes.
Price Impact
The price impact is the difference between a trade's execution price and the oracle price, applied to Taker positions. It is calculated as the sum of linear, proportional, and adiabatic fees.
TradeImpact = LinearFee + ProportionalFee + AdiabaticFee
Linear Fee
A fixed spread calculated as a percentage of the trader's notional value.
Taker Linear Fee = notional ร takerLinearFee
Maker Linear Fee = notional ร makerLinearFee
Proportional Fee
Varies based on the volume of trades occurring at that time.
Taker Proportional Fee = notional ร (takerProportionalFee ร takerTotal / takerScale)
Maker Proportional Fee = notional ร (makerProportionalFee ร makerTotal / makerScale)
Adiabatic Fee
Paid by Takers to incentivize a more balanced market, adjusting gradually based on the aggregate market skew and the direction of the Taker's order.
takerAdiabaticFee = (signedNotional ร takerAdiabaticFeeParameter ร (skew' + skew) / 2) / takerScaleParameter
Orders are categorized as:
Positive skew orders (long open / short close): Trades that increase or create long exposure, or decrease or close short exposure.
Negative skew orders (short open / long close): Trades that increase or create short exposure, or decrease or close long exposure.
Key Variables for Price Impact:
notional = abs(positionDelta * latest price)
signedNotional = positionDelta * latestprice
takerLinearFee (parameter) โ riskParameter.takerFee.linearFee
takerProportionalFee (parameter) โ riskParameter.takerFee.proportionalFee
takerTotal โ globalOrder.takerTotal()
takerScale (parameter for proportional fee) โ riskParameter.takerFee.scale
takerAdiabaticFeeParameter โ riskParameter.takerFee.adiabaticFee
takerScaleParameter (for adiabatic fee) โ riskParameter.takerFee.scale
makerLinearFee (parameter) โ riskParameter.makerFee.linearFee
makerProportionalFee (parameter) โ riskParameter.makerFee.proportionalFee
makerTotal โ globalOrder.makerTotal()
makerScale (parameter for maker proportional fee) โ riskParameter.makerFee.scale
skew = long - short (market skew before the trade)
skew' = long - short (market skew after the trade)
Trade Fees
Trading fees are levied on Perennial and are based on the gross trade fee.
Gross TradeFee = TakerFee + MakerFee

Fees Summary & Distribution

As of v2.3, the calculation of market fees has been updated to decouple risk and oracle fees, with oracle fees now determined by the oracle itself rather than market parameters. Collected fees are split between Makers (and in rare cases Takers), the Perennial treasury, and the respective product owner's treasury.
The apportionment of the Gross TradeFee
follows this structure:
Subtractive Fee (Referral Component):
subtractive_fee_amount = Gross TradeFee ร referral_fee_percentage
Solver Fee:
solver_fee_amount = subtractive_fee_amount ร solver_fee_percentage
Market Fee:
market_fee_amount = Gross TradeFee - subtractive_fee_amount
Risk Fee:
risk_fee_amount = market_fee_amount ร risk_fee_percentage
Oracle Fee:
oracle_fee_amount = (market_fee_amount - risk_fee_amount) ร oracle_fee_percentage
Protocol Fee:
protocol_fee_amount = market_fee_amount - risk_fee_amount - oracle_fee_amount
Key Parameters for Trade Fees:
takerFeeParameter โ marketParameter.takerFee
makerFeeParameter โ marketParameter.makerFee
referral_fee_percentage (parameter for subtractive fee)
solver_fee_percentage โ intent.fee
risk_fee_percentage โ marketParameter.riskFee
oracle_fee_percentage โ oracleReceipt.oracleFee
Fee Split
All collected fees are distributed among Makers (occasionally Takers), the Perennial treasury, and the treasury of the respective product owner. This enables market owners (e.g., individual organizations, DAOs, protocols) to earn revenue from the administration of their products and parameters.
Last updated