Adaptive fees
Markets don't stay the same, so why should fees? The busier the market gets, the more ArcVista adapts.
The public fee on a swap with USDC notional q is
F(q, s) = m(s) · (a0 + b0 · q)
a0is a fixed USDC amount andb0a rate in basis points. The pool creator sets both within global bounds (max 5 USDC and 100 bps). Changes apply after a 24 hour delay.m(s)is a multiplier betweenmMinandmMaxthat comes from the pool's own state. No external data.
Because USDC is the fee asset on Arc, the fixed part of the fee is exactly what the interface shows. There is no price feed and no conversion.
The four inputs
| Signal | Onchain variable | How it enters |
|:-|:-|:-|
| Price volatility | sigma, an EWMA of per swap returns | sigma / sigmaRef |
| Trading volume and liquidity depth | vol, decayed USDC volume, over reserveUSDC | load / loadRef |
| Order flow | flow / vol, the signed imbalance iota in [-1, 1] | side adjustment |
Each swap updates sigma, vol and flow with a decay d = H / (H + dt) where dt is the time since the last swap. No exponentials.
The target and the slew
z = sigma / sigmaRef + lambda · load / loadRef
mTarget = mMin + (mMax − mMin) · z / (z + 1)
A quiet pool has z near zero and pays mMin times the base fee. A stressed pool rises smoothly and saturates at mMax. m moves toward the target by at most slewPerSec · dt per update. If several swaps land in the same second, which is common on Arc, they all see the same m.
Trades in the direction of the imbalance pay × (1 + gamma · |iota|). Trades against it pay × (1 − gamma · |iota| / 2). Leaning against one sided flow is cheaper.
Stability rules
- The fee for a swap uses the state before the swap. The state updates after.
- Every swap carries a
maxFee. Ifmmoved between the quote and execution, the swap reverts instead of overcharging. - Pumping volatility only raises fees for the one doing it. Lowering fees requires a calm pool, which cannot be faked cheaply.
- If a pool is idle, decay pulls the state to zero and
mdrifts back tomMinon the next swap.
Regimes
Regimes are a display convention derived from m, not a contract state.
| Regime | Condition | Colour |
|:-|:-|:-|
| CALM | m < 0.9 | yellow |
| ACTIVE | 0.9 ≤ m < 1.6 | teal |
| VOLATILE | m ≥ 1.6 | red |
Parameters in this build
These are proof of concept values. They are not final launch values.
| Parameter | Value |
|:-|:-|
| a0 | 0.05 USDC |
| b0 | 20 bps |
| mMin, mMax | 0.5, 3.0 |
| H | 600 s |
| sigmaRef | 0.02 (tuned from the design seed of 0.002, see the mechanism note) |
| loadRef | 0.5 |
| lambda, gamma | 1.0, 0.25 |
| slewPerSec | 0.01 per second |