> 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/developers/trove-manager.md).

# Siklus hidup Trove

Pencatatan TroveManager, status posisi, pembatasan cabang, pembacaan, dan event integrasi

Setiap cabang memiliki **TroveManager** untuk pencatatan, likuidasi, dan penebusan. Pembukaan, penyesuaian, serta penutupan pengguna masuk melalui **BorrowerOperations**. Zapper menangani konversi agunan dan alur dompet sebelumnya.

## Tanggung jawab kontrak

| Kontrak              | Tanggung jawab                                                                               |
| -------------------- | -------------------------------------------------------------------------------------------- |
| `BorrowerOperations` | Pembukaan, penyesuaian agunan/utang, bunga, pelunasan dan penutupan, klaim kelebihan agunan. |
| `TroveManager`       | Pencatatan posisi dan batch, nilai terkini, likuidasi, penebusan, dan siklus hidup.          |
| `TroveNFT`           | Kepemilikan ERC-721; diterbitkan saat membuka, dibakar saat menutup atau likuidasi.          |
| `SortedTroves`       | Urutan penebusan aktif menurut bunga tahunan.                                                |
| `StabilityPool`      | Setoran USDHN untuk menghapus utang likuidasi serta pencatatan agunan dan hasil.             |
| `CollateralRegistry` | Pendaftaran/status cabang dan rute penebusan normal antarcabang.                             |

`onOpenTrove`, `onAdjustTrove`, dan pembaruan peminjam lain hanya menerima BorrowerOperations. `batchLiquidateTroves` terbuka untuk publik; `redeemCollateral` normal menerima CollateralRegistry.

Gunakan alamat dan ABI jaringan serta cabang dalam [Smart contract](/id/developers/smart-contracts.md). Kaia Mainnet memakai `8217`; Kairos `1001`.

## Identitas dan pemilik Trove

BorrowerOperations menghitung ID pembukaan:

```solidity
troveId = uint256(keccak256(abi.encode(msg.sender, owner, ownerIndex)));
```

`msg.sender` adalah pemanggil yang dilihat BorrowerOperations, misalnya Zapper. Pemilik dan indeks sama dapat menghasilkan ID berbeda lewat entrypoint lain. Catat ID dari receipt pembukaan dan mint NFT bersama cabangnya.

Indeks `TroveNFT.Transfer` untuk kepemilikan. Mint memakai pengirim alamat nol; burn memakai penerima alamat nol. Simpan pemilik terakhir setelah burn karena `ownerOf` tidak lagi mengembalikan pemilik NFT itu.

## Status posisi

Urutan enum `ITroveManager.Status`:

| Nilai | Status                | Arti                                                                                             |
| ----- | --------------------- | ------------------------------------------------------------------------------------------------ |
| `0`   | `nonExistent`         | ID belum memiliki posisi.                                                                        |
| `1`   | `active`              | Terbuka dalam daftar urut, tunduk pada pemeriksaan cabang dan rasio.                             |
| `2`   | `closedByOwner`       | Ditutup sukarela; kolom pencatatan dihapus dan NFT dibakar.                                      |
| `3`   | `closedByLiquidation` | Ditutup melalui likuidasi; kolom dihapus dan NFT dibakar.                                        |
| `4`   | `zombie`              | Terbuka tetapi keluar dari daftar normal setelah penebusan menyisakan utang di bawah `MIN_DEBT`. |

### Transisi

| Status awal            | Operasi                                                      | Hasil                                 |
| ---------------------- | ------------------------------------------------------------ | ------------------------------------- |
| `nonExistent`          | `openTrove` atau `openTroveAndJoinInterestBatchManager`      | `active`; NFT diterbitkan.            |
| `active`               | Penebusan menyisakan utang di bawah `MIN_DEBT`, termasuk nol | `zombie`; keluar dari `SortedTroves`. |
| `zombie`               | `adjustZombieTrove` memenuhi utang dan rasio                 | `active`; disisipkan dengan hints.    |
| `zombie`               | `applyPendingDebt` membuat utang minimal `MIN_DEBT`          | `active`; disisipkan dengan hints.    |
| `active` atau `zombie` | `closeTrove` melunasi utang terkini                          | `closedByOwner`; NFT dibakar.         |
| `active` atau `zombie` | Likuidasi dengan `ICR < MCR` terkini                         | `closedByLiquidation`; NFT dibakar.   |

`MIN_DEBT` adalah batas utang pinjaman dan penebusan. Gunakan nilai jaringan serta cabang yang dipilih.

### Pencatatan zombie

Zombie mempertahankan NFT, agunan, dan sisa utang. Mengeluarkan posisi kecil dari daftar normal membatasi penelusuran berulang. Jika zombie baru masih berutang, `lastZombieTroveId` menunjuknya agar penebusan berikutnya memeriksanya lebih dulu. Pointer dihapus setelah ditebus penuh, dipulihkan, atau ditutup.

`adjustTrove` biasa memerlukan posisi aktif. Pulihkan lewat `adjustZombieTrove`, yang menegakkan `MIN_DEBT`, menerapkan perubahan, dan menyisipkan kembali. `applyPendingDebt` juga dapat memulihkan zombie yang utangnya mencapai minimum. Zombie yang ditebus penuh dapat ditutup dengan pembayaran USDHN nol untuk mengambil agunan dan setoran gas.

Kelayakan likuidasi mencakup `active` dan `zombie`; posisi tanpa utang tidak memiliki utang untuk dilikuidasi. Tetap tampilkan agunan zombie sebagai aset pemilik.

## Status cabang dan shutdown

TroveManager menemukan cabang lewat `findCollateralByTroveManager` dan membaca `CollateralRegistry.collateralConfig(index).status`.

| Status registry | Trove baru                                    | Penyesuaian agunan/utang                                                                      |
| --------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `Pending`       | Diblokir.                                     | Diblokir.                                                                                     |
| `Active`        | Setelah pemeriksaan utang, oracle, dan rasio. | Setelah pemeriksaan posisi dan cabang.                                                        |
| `Deprecated`    | Diblokir.                                     | Kenaikan utang yang diminta melebihi penurunannya diblokir; penyesuaian lain tetap diperiksa. |

`CollateralStatusForbidsOperation()` menunjukkan penolakan status registry. Shutdown diperiksa terpisah:

* `shutdownTime() == 0`: cabang belum shutdown.
* `shutdownTime() > 0`: nilainya adalah waktu shutdown.
* BorrowerOperations memblokir pinjaman baru dan penyesuaian biasa setelah shutdown; pelunasan penuh dan penutupan tetap tersedia.
* Sebelum shutdown, bunga berjalan dari `lastDebtUpdateTime` sampai sekarang. Setelah shutdown, pembaruan sebelumnya hanya berbunga sampai `shutdownTime`; pembaruan pada atau setelahnya tidak menambah periode bunga.
* Penebusan normal memerlukan cabang belum shutdown dan `TCR >= SCR`; `urgentRedemption` memerlukan shutdown serta ID Trove eksplisit.

Sebelum shutdown, penutupan sukarela harus menyisakan `TCR >= CCR` dan minimal satu Trove lain. Shutdown mencabut kedua batas itu. Likuidasi tetap dilarang menghapus Trove terakhir; `OnlyOneTroveLeft()` menyebabkan revert.

## Pembacaan terkini

Gunakan `getLatestTroveData(troveId)` untuk utang dan agunan terbaru, termasuk akumulasi dan redistribusi tertunda.

| Kolom                                   | Isi                                                                |
| --------------------------------------- | ------------------------------------------------------------------ |
| `entireDebt`                            | Utang tercatat, bunga, redistribusi USDHN, dan biaya batch posisi. |
| `entireColl`                            | Agunan tercatat ditambah redistribusi tertunda.                    |
| `recordedDebt`                          | Utang tercatat atau dialokasikan melalui bagian batch.             |
| `accruedInterest`                       | Bunga sejak pembaruan terakhir dengan aturan shutdown.             |
| `redistUSDHNDebtGain`, `redistCollGain` | Utang dan agunan redistribusi tertunda.                            |
| `annualInterestRate`                    | Bunga posisi atau batch saat ini.                                  |
| `weightedRecordedDebt`                  | Utang tercatat dikali suku bunga tahunan.                          |
| `accruedBatchManagementFee`             | Porsi posisi atas biaya batch terkumpul.                           |
| `lastInterestRateAdjTime`               | Waktu perubahan bunga posisi atau batch terakhir.                  |

Utang, bunga, dan biaya Trove batch memakai `batchDebtShares / totalDebtShares`. Redistribusi mengikuti stake agunan Trove. Perhitungan seluruh utang mencakup kedua komponen itu.

| Metode                                                      | Penggunaan                                                                         |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `Troves(troveId)`                                           | Kolom mentah: utang, agunan, stake, status, waktu, bunga, pengelola, bagian batch. |
| `getTroveStatus(troveId)`                                   | Enum status.                                                                       |
| `getTroveAnnualInterestRate(troveId)`                       | Bunga efektif termasuk batch.                                                      |
| `getLatestBatchData(batchAddress)`                          | Total batch, bagian utang, bunga, dan biaya.                                       |
| `getCurrentICR(troveId, price)`                             | CR dari utang/agunan terbaru dan harga input.                                      |
| `getTroveIdsCount()` dan `getTroveFromTroveIdsArray(index)` | Array ID yang sedang dilacak; penutupan menghapus ID.                              |

Gunakan harga dan skala cabang yang benar untuk `getCurrentICR`. Harga serta rasio berpresisi `1e18`; `1.2e18` berarti `120%`. Pemeriksaan likuidasi protokol memakai harga oracle; kuotasi pasar dapat dipakai untuk perhitungan skenario tersendiri.

## Event dan riwayat

Indeks ABI TroveManager dan BorrowerOperations yang diterapkan serta event NFT. Snapshot event mencatat saat operasi; bunga berikutnya diperoleh lewat pembacaan terkini.

| Event                      | Informasi disimpan                                                                                   |
| -------------------------- | ---------------------------------------------------------------------------------------------------- |
| `TroveUpdated`             | ID, utang/agunan tercatat, stake, bunga, snapshot redistribusi.                                      |
| `TroveOperation`           | Jenis operasi serta perubahan utang/agunan dari redistribusi, biaya awal, dan tindakan yang diminta. |
| `Liquidation`              | Utang dihapus/diredistribusi, agunan ke pool/redistribusi, kompensasi, surplus, harga.               |
| `Redemption`               | USDHN yang diminta dan ditebus, agunan terkirim, biaya, harga.                                       |
| `RedemptionFeePaidToTrove` | Biaya penebusan per Trove.                                                                           |
| `BatchUpdated`             | Operasi, total, bunga, biaya pengelolaan, bagian, perubahan biaya awal.                              |
| `BatchedTroveUpdated`      | Agunan, stake, bagian utang, pengelola, snapshot redistribusi Trove.                                 |
| `Transfer` TroveNFT        | Pembuatan, transfer pemilik, burn.                                                                   |

Pertahankan urutan transaksi dan identitas cabang. `closedByOwner` dan `closedByLiquidation` adalah status terminal; simpan riwayat setelah burn. Tangani jalur reguler dan batch; utang batch memerlukan pencatatan bagian.

## Kegagalan transaksi

| Revert                                      | Input atau keadaan terkait                                          |
| ------------------------------------------- | ------------------------------------------------------------------- |
| `CollateralStatusForbidsOperation()`        | Cabang melarang pembuatan atau penyesuaian posisi.                  |
| `IsShutDown()`                              | Tindakan peminjam dihentikan setelah shutdown.                      |
| `ICRBelowMCR()` atau `ICRBelowMCRPlusBCR()` | CR hasil tindakan di bawah syarat.                                  |
| `TCRBelowCCR()`                             | Tindakan melanggar pemeriksaan TCR cabang.                          |
| `DebtBelowMin()`                            | Utang hasil tindakan di bawah minimum.                              |
| `UpfrontFeeTooHigh()`                       | Biaya eksekusi melebihi maksimum diterima.                          |
| `NotEnoughUSDHNBalance()`                   | USDHN pemanggil kurang untuk dibakar.                               |
| `OnlyOneTroveLeft()`                        | Operasi menghapus Trove terakhir menurut aturan penutupan saat ini. |

Tampilkan jumlah, pembatasan cabang, atau status yang terdampak. Kegagalan rute dan slippage Zapper mengikuti jalurnya. [Ringkasan teknis](/id/developers/technical-overview.md) menghubungkan kontrak; [panduan integrasi](/id/developers/integrator-kit.md) menjelaskan API dan dompet.


---

# 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/developers/trove-manager.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.
