> For the complete documentation index, see [llms.txt](https://docs.ensemble.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ensemble.io/how-it-works/fees-and-caps.md).

# Fees and caps

The charges and independent capacity checks that affect a vault transaction.

Fees determine how much of a deposit or withdrawal you retain and how much value remains in the vault over time. Limits determine how much you can transact now. Both matter when reviewing a quote.

```mermaid
flowchart TB
    Request["Deposit or redemption request"] --> Protocol["Protocol action limits"]
    Protocol --> VaultRoute["Vault action limits"]
    VaultRoute --> Account["Account action limits"]
    Account --> VaultAccount["Vault-account limits"]
    VaultAccount --> VaultCap["Vault accounting and liquidity limits"]
    VaultCap --> Execute["Execute if every check passes"]
```

## Production rates

All six vaults have the following fee terms. The six production vaults share these rates; owner-controlled configuration can change them.

| Vault | Annual management fee | Deposit fee | Withdrawal fee |
| ----- | --------------------: | ----------: | -------------: |
| BULL  |                    2% |        0.1% |           0.3% |
| iBULL |                    2% |        0.1% |           0.3% |
| BEAR  |                    2% |        0.1% |           0.3% |
| iBEAR |                    2% |        0.1% |           0.3% |
| VOL   |                    2% |        0.1% |           0.3% |
| iVOL  |                    2% |        0.1% |           0.3% |

Read current contract settings and applicable fee exemptions before signing. See [Parameters and limits](/reference/parameters-and-limits.md).

## Contract-based builder fee

Ensemble's additional trading fee is 0.1% of observed executed notional. The contract calls this the builder fee. Notional means the dollar value of the trade, which can be much larger than the capital used as collateral.

Ensemble implements the charge in its HyperEVM contracts. It is separate from exchange fees. CoreWriter orders do not carry HyperCore's native builder attribution, so approving a HyperCore builder does not enable this contract fee.

The 0.1% rate applies to all six production vaults. `getBuilderFeeConfig(vault)` returns the recipient, rate in decibps, and unpaid liability. `100` decibps means 0.1%. Read the selected vault's current configuration when preparing a transaction.

The contract measures position progress within the submitted rebalance cycle and accrues the charge against that observed notional. It does not attach a builder deduction to each HyperCore fill record. Unpaid builder liabilities are included in accrued fees, reducing shareholder NAV. Payment uses eligible tracked EVM USDC and may be deferred; `payBuilderFee(recipient)` retries payment of an existing liability. Exchange trading fees are separate costs. HyperCore fill records alone do not establish the contract-based charge.

## Management fees

Management fees reduce shareholder NAV as time passes.

The annual rate accrues with elapsed time against a saved value of the vault's fee-net assets. The contract uses a 365.25-day year and carries small rounding remainders forward. This fee is reflected in share value; it is not charged as a new wallet transaction each day.

`computeNav()` includes the pending fee before a state-changing transaction records it in `accruedFees`. Reports should distinguish the annual rate from the dollar amount accrued during a particular period.

## Deposit and withdrawal fees

A deposit fee reduces the USDC used to buy shares. A withdrawal fee reduces the USDC paid for redeemed shares. For example, a $100 deposit with a 0.1% fee uses $99.90 to buy shares; a redemption worth $100 before a 0.3% fee pays $99.70. Actual share counts still depend on the execution-time price and rounding.

Configured account exemptions can change these charges. Their account attribution depends on the transaction path, so integrations must read the applicable exemption and simulate the actual call.

## First-deposit floor

The first deposit into an empty vault must be at least $10 USDC.

An empty vault enforces `MIN_FIRST_DEPOSIT = 10e6`, or $10 for 6-decimal USDC. CircuitBreaker mirrors this floor in `maxDeposit` so it does not advertise a smaller nonzero amount that the vault would reject. This bootstrap rule is separate from the configured route minimum and public product metadata.

## Vault caps

Vault-level caps limit incoming deposits, outstanding shares, and the assets available for redemption.

* The total deposit cap compares the incoming assets with remaining room above current gross NAV.
* The deposit-window cap limits accepted assets during a contract window; an adaptive cap may further reduce its effective size.
* The share-supply bound prevents arithmetic overflow even if another cap has room.
* Redemption capacity is bounded by holder shares and spendable tracked EVM USDC, not total NAV alone.

The total deposit cap is $500,000 per vault. The static deposit-window cap is $50,000 per four-hour window, with adaptive cap rate zero. A total cap is not the amount an account can deposit in one transaction. Read current vault and CircuitBreaker configuration before signing.

## Route limits

A limit can apply to your account, the vault, or the whole protocol. Each one must allow the transaction.

CircuitBreaker applies vault/action minimums, plus hard transaction maxima and rolling caps at protocol, vault, account, and vault-account levels. These controls are separate from the vault's total cap and spendable redemption liquidity.

Rolling usage includes the current and previous `bucketDuration` bucket. A redeem cap is denominated in net returned assets even though `maxRedeem` returns shares.

## Use the smaller available amount

A transaction can execute only within both the vault limit and the CircuitBreaker route limit.

```
executable deposit = min(VaultLens maxDeposit, CircuitBreaker maxDeposit)
executable redeem shares = min(VaultLens maxRedeem, CircuitBreaker maxRedeem)
```

This is still only an observation. Another transaction or a state update can change either side before inclusion.

## Before signing

Use a fresh quote for the account and transaction path you intend to use.

{% hint style="info" %}
Read the deployed route and vault state before signing. Documentation examples do not establish current remaining capacity.
{% endhint %}
