Skip to content
Logo

Fees

Flint charges a trading fee on every perp trade, a liquidation fee on forced closes, and a protocol share of borrow interest. Funding is not a fee — it moves between traders and the protocol takes none of it. Solana network costs sit on top.

Trading fees

Each contract has two rates, set once at listing and never changeable afterwards:

RateMeaningBound
taker_feeFraction of each trade's notional the taker paysAt most 1% (100 bps)
maker_rebate_shareFraction of that fee credited to the maker filled0–100%

Makers pay no fee. The maker's rebate comes out of the taker's fee, and the protocol keeps the rest:

taker pays       = ceil(trade_ticks × taker_fee)          rounded up
maker earns      = floor(taker_fee_ticks × maker_rebate_share)   rounded down
protocol keeps   = taker pays − maker earns

There are no volume tiers, account tiers or per-account discounts: every account pays the same rates on a given contract.

Maker or taker is per trade. The maker is whoever's resting liquidity is filled: a market maker's quote or any trader's resting limit order. A resting-kind (Gtc or Gtd) order that crosses on arrival pays the taker fee on what crosses; the remainder it rests earns the maker rebate on whatever later fills against it.

Per trade, in ticks. A trade is one crossing with one maker at one price, and the fee is computed in the contract's ticks per trade. Any non-zero rate on a non-zero trade therefore costs at least one tick, and an order that sweeps several makers or levels can pay up to one tick more per extra trade than the same size at a single price.

Margin sees the fee first. The taker's fee is booked before the taker's margin check, so an order you cannot afford the fee on reverts whole. Fees and rebates sit on the position's fee leg until they are settled into your settlement-asset balance with the rest of your PnL.

AccountService.GetTradingFees reports, per contract, taker_fee_rate, maker_fee_rate (always "0") and maker_rebate_rate (taker_fee × maker_rebate_share). The nominal rates are exact; fills apply the per-trade rounding above.

Liquidation fee

A forced close of a perp position pays the normal taker fee plus a liquidation fee on the closed notional:

FieldMeaningBound / listing default
liquidation_feeFraction of the closed notional charged to the liquidateeAt most 5%; default 0.05%
liquidator_shareFraction of that charge paid to the liquidatorDefault 50%

The rest goes to the protocol. The charge is capped at the equity the account has left, so it never creates bad debt.

Spot liquidations work differently: the liquidator seizes collateral at 1 + liquidation_bonus per dollar of debt repaid, with the bonus set per collateral asset. See Liquidations.

Borrow interest

Borrowing a spot asset — directly, or by settling a perp loss you had no cash for — accrues interest that compounds per second. Each market's rate follows a piecewise-linear curve in pool utilisation:

utilisation:   0%  ──────────►  target  ──────────►  100%
borrow rate:   C / 250           C / 120             C

C, the rate at full utilisation, adjusts itself over time: while utilisation stays more than one percentage point above the market's target_utilisation, C rises; below it, C falls. It is clamped between about 71.67% and 179.18% nominal APR (a maximum effective APY of 500%).

Lenders earn that interest minus the market's lending_rate_fee, the protocol's share (at most 10%). MarketInfo.borrow_apr and deposit_apr report the current nominal rates.

Where protocol fees go

The protocol's share of trading and liquidation fees accrues on the contract (accrued_protocol_fee_ticks). A permissionless collect_linear_perp_fees sweeps it out of the contract's settle pool in the PnL currency, splitting it between the insurance fund (GlobalConfig.if_perp_fee_shares) and the protocol's fee destination. Borrow-lend fees are collected the same way, split by if_borrow_lend_fee_shares. Both shares are global config.

Because the sweep is clamped to the settle pool, collecting fees moves only atoms that losing traders have actually paid in.

Network costs

Instructions execute inside Solana transactions. Several instructions can share one transaction. The following costs apply:

CostWho pays
Base and priority feeThe transaction's fee payer — you, or Flint's sponsor (below)
Rent for a new trader accountThe rent_payer of create_trader_account
Rent when a fill grows a position listThe order's rent_payer, for the taker and any maker whose account grows
Rent when a resting order grows the contract's order bookThe order's rent_payer; not refunded when the order is cancelled

The app sets a priority-fee budget per transaction (0.00003 SOL by default, adjustable in trade settings).

Fee sponsorship. SponsorshipService lets Flint's server act as fee payer for app transactions that place perp orders through a trading delegate (or revoke a passkey delegate). The client builds the transaction with the sponsor's key as fee payer and its signature slot empty; the server signs and submits it. Sponsored transactions are rate-limited and must stay under a priority-fee cap, and only those instructions qualify. See Wallets & sessions.