LogoLogo
HomeApp
  • 👋Introduction to Perennial
  • 🌸Perennial Petals
    • 💰Trading Competition - Flight School
  • 🫂Rebates and Rewards
  • ⛓️Perennial Chain
    • 🌺Mainnet
    • 🌼Testnet
  • 📚Guides
    • Bridging to Perennial
    • Create an Account
    • Place a limit order
    • Bridging from Perennial
  • 🏗️Protocol
    • 🏛️Markets
      • 📝Market Design
      • 🔮Oracles & Settlement
      • 📈Payoff & Positions
      • 💰Price Impact & Trading Fees
      • ⚖️Funding & Interest Rate
      • 🌊Margin & Liquidations
      • 👩‍🌾Liquidity Provisioning
      • 📝Advanced Order Types
      • 💵Collateral
    • 📬Intents
      • 📑Mechanism
      • 🔗Offchain Infrastructure
      • 🏦Intent Solvers (Makers)
      • 📑Specification
    • 🛄Collateral Accounts
    • 🏦Vaults
    • 💽Codebase
    • 🛑Protocol Risks
  • 🏗️Building on Perennial
    • Why Perennial?
    • Before Integrating
    • Frontend & Client Integrations
    • Smart Contract Integrations
    • Offchain Infrastructure
    • Guides
      • ✏️Creating a New Market
      • 👂Subscribe to Market Updates
  • ⁉️Frequently Asked Questions
    • Perennial
    • Trading
    • Markets
    • Fees
  • 📡Protocol Info
    • Markets & Vaults
    • Protocol Contracts
  • 🔐Security
    • Audits & Bug Bounty
  • 🎉Perp.Fun
    • Introduction
    • Autopilot
      • Weekly Autopilot Rewards
Powered by GitBook
On this page
  • Price Impact
  • Linear Fee
  • Proportional Fee
  • Adiabatic Fee
  • Trade Fees
  • Fees Summary & Distribution
  • Fee Split
  1. Protocol
  2. Markets

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:

  1. Subtractive Fee (Referral Component): subtractive_fee_amount = Gross TradeFee × referral_fee_percentage

  2. Solver Fee: solver_fee_amount = subtractive_fee_amount × solver_fee_percentage

  3. Market Fee: market_fee_amount = Gross TradeFee - subtractive_fee_amount

  4. Risk Fee: risk_fee_amount = market_fee_amount × risk_fee_percentage

  5. Oracle Fee: oracle_fee_amount = (market_fee_amount - risk_fee_amount) × oracle_fee_percentage

  6. 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.

PreviousPayoff & PositionsNextFunding & Interest Rate

Last updated 7 days ago

🏗️
🏛️
💰