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

# Redemptions

The request-based exit flow, from a share-holder's request to operator-settled, paid-out assets.

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="https://1699303810-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUsQM4bzcmOPSgkWddkeN%2Fuploads%2Fgit-blob-1fbcd65d5e9d19f8dd2a05e9969cafa901438ce3%2Fredemption-flow.svg?alt=media" 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/kpk-fund-integration/redemption-request.md) for integration code and [Fees](/funds/infrastructure/architecture/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 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/redemptions.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.
