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:
| Rate | Meaning | Bound |
|---|---|---|
taker_fee | Fraction of each trade's notional the taker pays | At most 1% (100 bps) |
maker_rebate_share | Fraction of that fee credited to the maker filled | 0–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 earnsThere 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:
| Field | Meaning | Bound / listing default |
|---|---|---|
liquidation_fee | Fraction of the closed notional charged to the liquidatee | At most 5%; default 0.05% |
liquidator_share | Fraction of that charge paid to the liquidator | Default 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 CC, 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:
| Cost | Who pays |
|---|---|
| Base and priority fee | The transaction's fee payer — you, or Flint's sponsor (below) |
| Rent for a new trader account | The rent_payer of create_trader_account |
| Rent when a fill grows a position list | The order's rent_payer, for the taker and any maker whose account grows |
| Rent when a resting order grows the contract's order book | The 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.