> For the complete documentation index, see [llms.txt](https://spree-finance.gitbook.io/spreefinance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://spree-finance.gitbook.io/spreefinance/developer-guides/stable-points-sp/redemption-operations.md).

# Redemption Operations

Redeeming converts SP back to the underlying stablecoin. This is a two-step async process: request, then finalize.

### Fee Schedule

| Direction        | Fee            |
| ---------------- | -------------- |
| SP to stablecoin | 50 bps (0.50%) |
| Branded SP to SP | 25 bps (0.25%) |

### Step 1: Request Redemption

The user submits a redeem request. The Factory locks the SP until an executor finalizes or rejects it.

```typescript
import { Factory } from '@spree-finance/spree-evm-sdk';

const factory = new Factory(config);

const requestTx = await factory.requestToRedeem(
  '0xUSDCAddress',     // asset: which stablecoin to receive
  100_000_000_000_000_000_000n, // pointsAmount: SP to redeem
  '0xReceiver',        // receiver: who gets the stablecoin
  false,               // expectBasketMode
);
```

### Step 2: Finalize Redemption

An executor (EXECUTOR\_ROLE) processes the pending request. The Factory transfers the stablecoin to the receiver and deducts the 50 bps fee from the output.

```typescript
const finalizeTx = await factory.finalizeRedeem('0xRequesterAddress');
```

### Cancel a Request

The original requester can cancel their pending request before finalization:

```typescript
const cancelTx = await factory.cancelRedeemRequest();
```

### Reject a Request

An executor can reject a pending request, returning SP to the requester:

```typescript
const rejectTx = await factory.rejectRedeemRequest('0xRequesterAddress');
```

### Read Redemption State

```typescript
// Check minimum redeem amount
const minRedeem = await factory.readMinRedeemRequest();

// Check redeem rate for an asset
const rate = await factory.readRedeemRates('0xUSDCAddress');

// Check if address is on redeem whitelist
const canRedeem = await factory.readRedeemWhitelist('0xAddress');
```

### Required Roles

| Action              | Role                                |
| ------------------- | ----------------------------------- |
| Request redemption  | Redeem-whitelisted address          |
| Finalize redemption | EXECUTOR\_ROLE                      |
| Reject redemption   | EXECUTOR\_ROLE                      |
| Cancel own request  | Original requester (no role needed) |
| Set redeem rate     | MANAGER\_ROLE                       |
| Set min redeem      | MANAGER\_ROLE                       |

### Sequence Diagram

```
User                    Factory                 Executor
  |                       |                       |
  |-- requestToRedeem --> |                       |
  |   (SP locked)        |                       |
  |                       |                       |
  |                       | <-- finalizeRedeem ---|
  |                       |   (fee deducted,      |
  |   <-- USDC sent -----|    stablecoin sent)    |
```
