> 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/redemptions.md).

# Redemptions

A redemption is a **user's request to exit the fund** by returning shares in exchange for one of the approved payout assets (for example USDC), priced against the current NAV.

<figure><img src="/files/3gCyc6EfhuheuzW5Ov8t" alt="Redemption flow: a holder requests a redemption, shares are escrowed, the operator settles at a price, a redemption fee is taken, the rest is burned, and assets are paid from the Portfolio Safe."><figcaption><p>The redemption lifecycle.</p></figcaption></figure>

## Lifecycle

{% stepper %}
{% step %}
**Request.** The holder calls `requestRedemption(sharesIn, minAssetsOut, redemptionAsset, receiver)`. The shares are pulled into **escrow** inside the `kpkShares` contract, a `PENDING` request is recorded, and a `RedemptionRequest` event is emitted. `minAssetsOut` is **slippage protection**, applied to the amount **after** the redemption fee. The `redemptionAsset` must be approved for redemptions (`canRedeem = true`), otherwise the call reverts with `UnredeemableAsset`.
{% endstep %}

{% step %}
**Settlement.** An operator calls `processRequests(approveIds, rejectIds, asset, sharesPrice)`. For each approved redemption it takes the **redemption fee** in shares (`fee = sharesIn * redemptionFeeRate / 10_000`) and transfers it to the fee receiver, computes `assetsOut = sharesToAssets(sharesIn - fee, sharesPrice, asset)`, checks `assetsOut ≥ minAssetsOut`, **burns** the net shares from escrow, and transfers the assets from the **Portfolio Safe** to the `receiver`. The request becomes `PROCESSED` and `RedemptionApproval` is emitted (including the `redemptionFee`).
{% endstep %}

{% step %}
**Or rejection / expiry / cancellation.** As with subscriptions, an operator can reject a request (`RedemptionDenial`), an expired request is auto-rejected (`RedemptionRequestExpired`), and the holder or receiver can cancel while `PENDING` once the TTL has elapsed (`cancelRedemption(id)`). In every case the escrowed shares are returned.
{% endstep %}
{% endstepper %}

## The request event

```solidity
event RedemptionRequest(
    address indexed investor,
    uint256 requestId,
    address indexed receiver,
    address indexed redemptionAsset,
    uint256 assetsAmount,   // the minAssetsOut at request time
    uint256 sharesAmount,   // shares being redeemed
    uint64  timestamp,
    uint64  cancelableFrom, // timestamp + redemptionRequestTtl
    uint64  expiryAt        // timestamp + 7 days
);
```

This mechanism lets users exit at transparent, NAV-aligned terms while the fund manages liquidity and the pacing of outflows. See [Redemption request](/funds/integration/redemption-request.md) for integration code and [Fees](/funds/infrastructure/core-concepts/fees.md) for how the redemption fee fits alongside management and performance fees.


---

# 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/redemptions.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.
