> 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/architecture/core-concepts/fees.md).

# Fees

The three fees a fund can charge, management, performance (high-water mark), and redemption.

A fund can charge three fees, all configured by the [admin](/funds/infrastructure/architecture/core-concepts/roles-and-operators.md) and all paid as **newly minted (or transferred) shares** to the fund's **fee receiver**, an address set by the admin. On KPK's Funds today that is the KPK Fee Recipient Safe, `0x9F230218cf7FDe6A9246e6f8CB0b888377E92639`, on Ethereum and Robinhood Chain. 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, annualised |
| **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 realised 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.

<figure><picture><source srcset="/files/SCMTyORzg2S1hPhoAYd3" media="(prefers-color-scheme: dark)"><img src="https://1699303810-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUsQM4bzcmOPSgkWddkeN%2Fuploads%2Fgit-blob-6d260c21c2871790ee8cf613e2cd14fb12bc377f%2Fperformance-fee-hwm.png?alt=media" alt="Illustrative chart of a Fund&#x27;s share price against its high-water mark: the performance fee is charged only on gains above the mark; after a draw-down no fee is charged until the price recovers past the mark, and then only on the new gain."></picture><figcaption><p>When the performance fee is charged (illustrative).</p></figcaption></figure>

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/architecture/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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
