Fee Structure
Olla has two fee mechanisms: a protocol fee on staking rewards and an instant redemption fee on immediate withdrawals. Both are configurable by governance through the timelock.
Protocol fee
The protocol fee is a percentage of gross staking rewards, charged during each accounting update. It compensates the protocol treasury and the staking provider for operating infrastructure.
| Parameter | Range | Default setter |
|---|---|---|
protocolFeeBP | 0 – 5,000 bps (0% – 50%) | OllaGovernance.setProtocolFeeBP() |
How it works
- During
updateAccounting(), the protocol calculates gross rewards earned since the last report. - The protocol fee is applied:
feeAssets = grossRewards * protocolFeeBP / 10,000. - The fee is converted to stAztec shares and minted. This dilutes existing holders proportionally, which is equivalent to taking a cut of the rewards.
Treasury / provider split
The minted fee shares are split between two recipients:
| Parameter | Range | Effect |
|---|---|---|
treasuryFeeSplitBP | 1,000 – 9,000 bps (10% – 90%) | Portion of fee shares sent to treasury |
treasury shares = fee shares * treasuryFeeSplitBP / 10,000
provider shares = fee shares - treasury shares
- Treasury: The protocol's governance-controlled treasury address, set via
OllaGovernance.setTreasury(). - Provider: The staking provider's rewards recipient address, configured in the
StakingProviderRegistry.
Example
With a 10% protocol fee and a 50/50 treasury split:
- Gross rewards in a cycle: 100 AZTEC
- Protocol fee: 10 AZTEC (minted as stAztec shares)
- Treasury receives: 5 AZTEC worth of stAztec
- Provider receives: 5 AZTEC worth of stAztec
- Stakers receive: 90 AZTEC (reflected in exchange rate increase)
Instant redemption fee
When users redeem stAztec instantly (bypassing the withdrawal queue), a fee is charged on the gross asset value.
| Parameter | Range |
|---|---|
instantRedemptionFeeBP | 0 – 2,000 bps (0% – 20%) |
How it works
- User calls
instantRedeem()with their stAztec shares. - Gross assets are calculated at the current exchange rate.
- The fee is deducted:
netAssets = grossAssets - (grossAssets * feeBP / 10,000). - The user receives
netAssetsin Aztec tokens. - The fee amount stays in the buffer pool. It is not sent to the treasury.
Because the fee stays in the buffer while the shares are burned, the exchange rate increases slightly. This means the instant redemption fee is effectively distributed to all remaining stAztec holders. It acts as a deterrent against rapid withdrawals that could destabilize the buffer, while rewarding patient stakers.
Queued withdrawals have no fee
Standard queued withdrawals through requestRedeem() and claimRequestById() do not incur any fee. The tradeoff is time: queued withdrawals must wait for the next rebalance cycle to be finalized.
Fee flow diagram
Governance controls
All fee parameters are changed through the governance timelock:
| Action | Contract | Governance function |
|---|---|---|
| Change protocol fee | OllaCore | setProtocolFeeBP(uint16) |
| Change treasury split | OllaCore | setTreasuryFeeSplitBP(uint16) |
| Change instant redemption fee | OllaVault | setInstantRedemptionFeeBP(uint16) |
| Change treasury address | OllaGovernance | setTreasury(address) |