> For the complete documentation index, see [llms.txt](https://docs.kpk.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kpk.io/funds/infrastructure/core-concepts/fees.md).

# Fees

A fund can charge three fees, all configured by the [admin](/funds/infrastructure/core-concepts/roles-and-operators.md) and all paid as **newly minted (or transferred) shares** to the fund's **fee receiver** (the Manager Safe). Every rate is expressed in **basis points** and capped at **2000 bps (20%)**.

| Fee             | When it is charged                                            | Base                         |
| --------------- | ------------------------------------------------------------- | ---------------------------- |
| **Management**  | During request settlement, time-based                         | Net share supply, annualized |
| **Performance** | During request settlement, on gains above the high-water mark | Net share supply             |
| **Redemption**  | On each approved redemption                                   | The shares being redeemed    |

Throughout, **net supply** means `totalSupply - feeReceiverBalance` — the fee receiver's own shares are excluded so fees don't compound on themselves.

## Management fee

Accrues continuously and is realized when `processRequests` runs, provided at least **`MIN_TIME_ELAPSED` (6 hours)** have passed since the last management-fee update:

```
managementFee = netSupply * managementFeeRate * timeElapsed / (10_000 * 365 days)
```

The elapsed time is tracked with a single timestamp shared across all assets, so the fee is charged once per settlement window regardless of which asset is being processed.

## Performance fee (high-water mark)

Computed by a pluggable module — `WatermarkFee` — and only charged when the share price rises **above the highest price previously seen** (the *high-water mark*). It is evaluated during settlement when the processed asset has `isFeeModuleAsset = true` and a module is configured.

```solidity
function calculatePerformanceFee(
    uint256 sharesPrice,  // current price, 8-decimal USD
    uint256 timeElapsed,
    uint256 feePct,       // performanceFeeRate, bps
    uint256 netSupply
) external returns (uint256 fee);
```

Logic:

* If `sharesPrice ≤ highWatermark`, the fee is **0** — no profit above the mark.
* Otherwise the watermark is raised to the current price and the fee is taken on the profit since the previous mark:

```
profitPerShare = highWatermark - previousWatermark
totalProfit    = profitPerShare * netSupply / highWatermark
performanceFee = totalProfit * feePct / 10_000
```

Because the mark only ever moves up, a draw-down must be fully recovered before any new performance fee is charged. Swapping the module (or disabling it with `address(0)`) is an admin action; the base asset is flagged `isFeeModuleAsset = true` at deployment so performance fees can be computed for it.

## Redemption fee

Taken in shares on every approved redemption, before the remaining shares are burned:

```
redemptionFee = sharesRedeemed * redemptionFeeRate / 10_000
```

The fee shares go to the fee receiver; the net shares are burned and the corresponding assets are paid to the receiver. See [Redemptions](/funds/infrastructure/core-concepts/redemptions.md).

## Events

When management and/or performance fees are charged, the contract emits a single event (only if at least one is non-zero):

```solidity
event FeeCollection(uint256 managementFee, uint256 performanceFee);
```

The redemption fee is reported in the `RedemptionApproval` event's `redemptionFee` field. Rate changes emit `ManagementFeeRateUpdate` / `PerformanceFeeRateUpdate` / `RedemptionFeeRateUpdate` **only when the value actually changes**, and any fee accrued under the old rate is charged before the new rate takes effect.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.kpk.io/funds/infrastructure/core-concepts/fees.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
