> For the complete documentation index, see [llms.txt](https://docs.hann.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hann.finance/id/mechanics/deep-dives/redemptions.md).

# Penebusan

Alokasi penebusan, urutan bunga, biaya, dan perubahan rasio agunan

Penebusan normal membakar USDHN dan mengurangi utang Trove terpilih. Penebus menerima agunan setelah biaya yang tetap di Trove. CollateralRegistry membagi jumlah antarcabang; TroveManager memilih posisi.

## Alokasi cabang

Cabang harus aktif, belum shutdown, dan memiliki `TCR` minimal `SCR`.

Untuk cabang memenuhi syarat `j`:

$$
u\_j = \max(\text{BranchDebt}\_j - \text{SPDeposits}\_j, 0)
$$

Ini utang di atas setoran Pool Stabilitas, tetap didukung agunan Trove.

Jika jumlah `u_j` positif, permintaan dibatasi pada total itu dan dialokasikan menurut `u_j`. Jika seluruh cabang memiliki `u_j = 0`, alokasi memakai total utang cabang.

Dengan mengabaikan pembagian integer:

$$
A\_j = A \times \frac{w\_j}{\sum\_k w\_k}
$$

`A` adalah jumlah setelah batas; `w_j` adalah `u_j` atau utang cabang pada kasus cadangan. Kontrak memproses urutan registry dan menghitung ulang sisa serta bobot setelah tiap alokasi, menyebarkan sisa integer ke alokasi berikutnya.

![Penebusan 25 USDHN dibagi 40%, 20%, dan 40% menurut utang di atas setoran pool.](https://1621382241-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FArM3TTRqpb8sI3QMPBlW%2Fuploads%2Fgit-blob-3939ecd248800127ccbeb02523608aff943c272e%2Fredemption-allocation.svg?alt=media)

Tumpukan biru menunjukkan utang; limau menunjukkan setoran USDHN pool. Bagian putus-putus menunjukkan utang di atas setoran.

**Contoh: 25 USDHN.** Utang tiga cabang 150, 100, 170 USDHN; setoran pool 50, 50, 70. Bobotnya 100, 50, 100, sehingga penebusan 10, 5, 10 USDHN. Setoran pool tetap dan penebus menerima agunan setelah biaya.

## Urutan dalam cabang

Jalur normal:

1. Memeriksa `lastZombieTroveId`, posisi utang kecil tersimpan dari penebusan sebelumnya.
2. Mulai `SortedTroves.getLast()` lalu mengikuti `getPrev()` dari **bunga tahunan terendah ke atas**.
3. Melewati Trove dengan CR di bawah 100% pada harga oracle normal.
4. Menerapkan bunga dan redistribusi sebelum menghitung utang yang dapat ditebus.
5. Memakai yang lebih kecil antara sisa alokasi dan utang Trove.

![Penebusan 250,000 USDHN mengurangi utang Trove 4% dari 200,000 ke nol dan Trove 4.3% dari 60,000 ke 10,000. Trove 4.4% tetap 450,000.](https://1621382241-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FArM3TTRqpb8sI3QMPBlW%2Fuploads%2Fgit-blob-4e1f5a656c752c537a4ef5ea87aeef7b329130d6%2Fredemption-order.svg?alt=media)

**Contoh: alokasi 250,000 USDHN.** Trove 4% menyediakan seluruh 200,000 utangnya. Trove 4.3% menyediakan 50,000 dari 60,000, menyisakan 10,000. Alokasi selesai dan Trove 4.4% tetap.

Batas iterasi menghitung semua Trove yang dilalui, termasuk yang dilewati. `0` menghapus batas. Loop juga berhenti setelah alokasi habis atau daftar selesai.

Peminjam menetapkan bunga sendiri atau memakai pengelola. Bunga lebih tinggi memundurkan urutan dan menambah biaya. Trove dengan pengelola sama memakai bunga batch.

## Biaya penebusan

Biaya menggabungkan minimum dan base rate, dinyatakan sebagai fraksi:

* `b`: base rate tersimpan.
* `m`: menit utuh sejak operasi biaya terakhir.
* `A`: jumlah yang dicoba setelah batas cabang.
* `S`: suplai USDHN saat transaksi mulai.
* `λ = 0.998076443575628800`: faktor peluruhan per menit.
* `β = 1`: pembagi kenaikan penebusan.
* `f₀ = 0.005`: minimum 0.5%.

$$
b\_{decayed} = b\lambda^m
$$

$$
b\_{quote} = \min\left(1, b\_{decayed} + \frac{A}{\beta S}\right)
$$

$$
f = \min(1, f\_0 + b\_{quote})
$$

Waktu paruh enam jam. Base rate dimulai 100% saat registry diterapkan dan meluruh seiring waktu. Chain memakai integer fixed-point.

Transaksi memeriksa `f` terhadap maksimum pemanggil sebelum menebus. Sesudahnya, base rate diperbarui memakai **jumlah aktual ditebus**. Penebusan sebagian akibat batas iterasi dapat membayar tarif kuotasi dari percobaan yang lebih besar.

Getter `getRedemptionRateWithDecay()`, `getRedemptionRateForRedeemedAmount(amount)`, `getEffectiveRedemptionFeeInUSDHN(amount)` mengikuti suplai, rate, waktu, dan jumlah terkini.

## Agunan diterima dan biaya tersimpan

Definisikan:

* `r`: USDHN ditebus pada satu Trove.
* `pᵣ`: harga penebusan per token agunan cabang.
* `f`: fraksi biaya.

Dalam satuan normal:

$$
\text{CorrespondingCollateral} = \frac{r}{p\_r}
$$

$$
\text{CollateralFee} = \frac{r}{p\_r}f
$$

$$
\text{CollateralSent} = \frac{r}{p\_r}(1-f)
$$

Utang turun `r`, agunan turun `CollateralSent`, dan `CollateralFee` tetap di Trove. Kontrak memakai `fetchPrice()` untuk pemeriksaan 100% dan `fetchRedemptionPrice()` untuk output.

Dengan harga normal `p`, nilai agunan `V`, dan utang `D`:

$$
CR' = \frac{V-r(1-f)p/p\_r}{D-r}
$$

Rumus memerlukan `r < D`. Penebusan penuh membuat utang nol dan menyisakan agunan dalam Trove.

## Contoh CR

Harga normal dan penebusan tetap sama, bunga serta biaya nol. Nilai agunan dan utang turun sebesar `r`:

$$
CR' = \frac{V-r}{D-r}
$$

Untuk `V > D` dan `0 < r < D`:

$$
CR' - CR = \frac{r(V-D)}{D(D-r)} > 0
$$

Agunan dan utang lebih kecil, dengan CR lebih tinggi.

### Contoh 1: satu penebusan

Awal `V = $200`, `D = 100` USDHN, CR `200 / 100 = 200%`.

Tebus 20 USDHN menjadi `V′ = $180`, `D′ = 80`:

$$
CR' = \frac{180}{80} = 225%
$$

Buffer meningkat saat posisi mengecil. Dengan biaya dan kedua harga sama, biaya yang tertahan menambah agunan di atas hasil tanpa biaya ini.

### Contoh 2: pinjam setelah penebusan

Dari `V = $180`, `D = 80`, `CR = 225%`, pinjam 40 lagi dengan agunan tetap. Utang menjadi 120:

$$
CR = \frac{180}{120} = 150%
$$

Pinjaman memakai buffer yang terbentuk dari penebusan.

### Contoh 3: harga turun setelah penebusan

Dari `V = $180`, `D = 80`, harga turun 40% menjadi `180 × 0.6 = $108`:

$$
CR = \frac{108}{80} = 135%
$$

Cabang dengan `MCR > 135%` dapat melikuidasi. Pada `MCR = 135%`, penurunan berikutnya melewati batas. Setelah utang berkurang, agunan tetap terekspos pada harga.

## Utang kecil atau ditebus penuh

Jika sisa di bawah `MIN_DEBT`, Trove menjadi `zombie` dan keluar dari SortedTroves. Sisa nonzero dapat dicatat di `lastZombieTroveId`. Penebusan penuh membuat utang nol; agunan tetap terhubung dengan Trove peminjam.

Penutupan melepaskan agunan. Sisa utang kecil dapat dipulihkan menjadi aktif melalui penyesuaian yang memenuhi syarat.

## Helper dan shutdown

`RedemptionHelper` menarik USDHN, memanggil registry, memeriksa minimum `_minCollRedeemed`, meneruskan agunan, dan mengembalikan sisa USDHN. Jalur ini memerlukan allowance. Aplikasi memakai registry langsung yang membakar USDHN pemanggil tanpa allowance.

Cabang shutdown mendukung `TroveManager.urgentRedemption(amount, troveIds, minCollateral)`. Pemanggil menentukan ID yang diproses. Kontrak saat ini memberi bonus agunan 2%, dibatasi agunan tersedia, dengan biaya penebusan normal nol. Transaksi menegakkan minimum agunan input.

[Penebusan dan risiko](/id/protocol/redemptions-and-risk.md) berisi langkah aplikasi. [Keamanan CDP](/id/mechanics/deep-dives/cdp-safety.md) membahas CR; [Pengungkapan risiko](/id/security/risk-disclosure.md) membahas pasar, likuiditas, dan oracle.


---

# 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.hann.finance/id/mechanics/deep-dives/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.
