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

# วงจรสถานะ Trove

บัญชี TroveManager สถานะโพซิชัน ข้อจำกัดสาขา วิธีอ่าน และ event สำหรับเชื่อมต่อ

แต่ละสาขามี **TroveManager** เก็บบัญชี Trove และประมวลผลชำระบัญชีกับไถ่ถอน ผู้ใช้เปิด ปรับ และปิดผ่าน **BorrowerOperations** โดย Zapper จัดการแปลงหลักประกันและวอลเล็ตก่อนเรียก

## หน้าที่สัญญา

| สัญญา                | หน้าที่                                                               |
| -------------------- | --------------------------------------------------------------------- |
| `BorrowerOperations` | เปิด ปรับหลักประกัน/หนี้ จัดการดอกเบี้ย ชำระทั้งหมดและปิด รับส่วนเกิน |
| `TroveManager`       | บัญชีโพซิชันและกลุ่ม อ่านค่าล่าสุด ชำระบัญชี ไถ่ถอน อัปเดตวงจรสถานะ   |
| `TroveNFT`           | เจ้าของ ERC-721 สร้างตอนเปิดและเผาตอนปิดหรือชำระบัญชี                 |
| `SortedTroves`       | ลำดับไถ่ถอนตามอัตราต่อปี                                              |
| `StabilityPool`      | USDHN ฝากเพื่อหักล้างหนี้กับบัญชีหลักประกันและผลตอบแทน                |
| `CollateralRegistry` | ลงทะเบียนและสถานะสาขา ส่งไถ่ถอนปกติข้ามสาขา                           |

`onOpenTrove`, `onAdjustTrove` และวิธีอัปเดตผู้กู้รับเฉพาะ BorrowerOperations ส่วน `batchLiquidateTroves` เปิดสาธารณะ และ `redeemCollateral` ปกติรับ CollateralRegistry

ใช้ที่อยู่กับ ABI ตามเครือข่ายและสาขาใน[สัญญาอัจฉริยะ](/th/developers/smart-contracts.md) Kaia Mainnet ใช้ `8217` Kairos ใช้ `1001`

## รหัสและเจ้าของ Trove

BorrowerOperations คำนวณ ID ตอนเปิด:

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

`msg.sender` คือผู้เรียกที่ BorrowerOperations เห็น เช่น Zapper เจ้าของและ index เดียวกันอาจได้ ID ต่างเมื่อใช้ทางเข้าต่าง เก็บ ID จาก receipt และ event สร้าง NFT คู่กับสาขา

ทำดัชนี `TroveNFT.Transfer` เพื่อติดตามเจ้าของ mint มีผู้ส่งเป็นที่อยู่ศูนย์ burn มีผู้รับเป็นศูนย์ เก็บเจ้าของสุดท้ายในประวัติหลังเผา เพราะ `ownerOf` จะคืนเจ้าของไม่ได้แล้ว

## สถานะโพซิชัน

ลำดับ enum `ITroveManager.Status`:

| ค่า | สถานะ                 | ความหมาย                                                           |
| --- | --------------------- | ------------------------------------------------------------------ |
| `0` | `nonExistent`         | ID นี้ยังไม่มีโพซิชัน                                              |
| `1` | `active`              | เปิดในรายการเรียง ต้องผ่านกฎสาขาและอัตราส่วน                       |
| `2` | `closedByOwner`       | ปิดเอง ล้างบัญชีและเผา NFT                                         |
| `3` | `closedByLiquidation` | ปิดโดยชำระบัญชี ล้างบัญชีและเผา NFT                                |
| `4` | `zombie`              | ยังเปิดแต่นำออกจากรายการปกติเมื่อไถ่ถอนเหลือหนี้ต่ำกว่า `MIN_DEBT` |

### การเปลี่ยนสถานะ

| เริ่ม                  | รายการ                                                  | ผล                             |
| ---------------------- | ------------------------------------------------------- | ------------------------------ |
| `nonExistent`          | `openTrove` หรือ `openTroveAndJoinInterestBatchManager` | `active` สร้าง NFT             |
| `active`               | ไถ่ถอนเหลือหนี้ต่ำกว่า `MIN_DEBT` รวมศูนย์              | `zombie` ออกจาก `SortedTroves` |
| `zombie`               | `adjustZombieTrove` ผ่านหนี้และอัตราส่วน                | `active` แทรกตาม hints         |
| `zombie`               | `applyPendingDebt` ทำให้หนี้อย่างน้อย `MIN_DEBT`        | `active` แทรกตาม hints         |
| `active` หรือ `zombie` | `closeTrove` ชำระหนี้ล่าสุดครบ                          | `closedByOwner` เผา NFT        |
| `active` หรือ `zombie` | ชำระบัญชีเมื่อ `ICR < MCR`                              | `closedByLiquidation` เผา NFT  |

`MIN_DEBT` คือหนี้ขั้นต่ำสำหรับบัญชีกู้และไถ่ถอน ใช้ค่าของเครือข่ายและสาขาที่เลือก

### บัญชี zombie

Zombie คง NFT หลักประกัน และหนี้ที่เหลือ การนำโพซิชันเล็กออกช่วยลดการไล่ซ้ำ หาก zombie ใหม่ยังมีหนี้ `lastZombieTroveId` จะชี้เพื่อให้ไถ่ถอนครั้งถัดไปตรวจก่อน ล้างตัวชี้เมื่อไถ่ถอนหมด กู้คืน หรือปิด

`adjustTrove` ปกติต้อง active กู้คืนผ่าน `adjustZombieTrove` ซึ่งบังคับ `MIN_DEBT` ใช้การเปลี่ยนแปลงและใส่กลับ `applyPendingDebt` กู้คืนได้เมื่อหนี้อัปเดตถึงขั้นต่ำ Zombie ที่ไถ่ถอนหมดปิดด้วยการชำระ USDHN ศูนย์เพื่อคืนหลักประกันและมัดจำแก๊สได้

ทั้ง `active` และ `zombie` ตรวจสิทธิ์ชำระบัญชีได้ โพซิชันหนี้ศูนย์ไม่มีหนี้ให้ชำระบัญชี แสดงหลักประกัน zombie ที่เหลือเป็นสินทรัพย์เจ้าของต่อไป

## สถานะสาขาและปิดสาขา

TroveManager หาสาขาผ่าน `findCollateralByTroveManager` และอ่าน `CollateralRegistry.collateralConfig(index).status`

| สถานะ        | Trove ใหม่                            | ปรับหลักประกัน/หนี้                                       |
| ------------ | ------------------------------------- | --------------------------------------------------------- |
| `Pending`    | ปิด                                   | ปิด                                                       |
| `Active`     | ได้หลังตรวจหนี้ ออราเคิล และอัตราส่วน | ได้หลังตรวจโพซิชันและสาขา                                 |
| `Deprecated` | ปิด                                   | ห้ามขอเพิ่มหนี้มากกว่าลดหนี้ รายการอื่นยังต้องผ่านการตรวจ |

`CollateralStatusForbidsOperation()` ระบุการปฏิเสธจาก registry ส่วน shutdown เป็นอีกเงื่อนไข:

* `shutdownTime() == 0`: สาขายังไม่ปิด
* `shutdownTime() > 0`: ค่านี้คือเวลาปิด
* หลังปิด BorrowerOperations หยุดกู้ใหม่กับปรับทั่วไป ยังชำระทั้งหมดและปิดได้
* ก่อนปิด ดอกเบี้ยสะสมจาก `lastDebtUpdateTime` ถึงปัจจุบัน หลังปิด หากอัปเดตก่อนปิดจะสะสมถึง `shutdownTime` หากอัปเดตตั้งแต่เวลาปิดไม่มีช่วงสะสมเพิ่ม
* ไถ่ถอนปกติต้องสาขายังไม่ปิดและ `TCR >= SCR` ส่วน `urgentRedemption` ต้องปิดแล้วและระบุ Trove ID

ก่อนปิดสาขา การปิดเองต้องเหลือ `TCR >= CCR` และ Trove อื่นอย่างน้อยหนึ่งรายการ หลังปิดยกเลิกสองข้อจำกัดนี้สำหรับการปิดเอง การชำระบัญชียังนำ Trove สุดท้ายออกไม่ได้ `OnlyOneTroveLeft()` จะย้อนกลับ

## อ่านสถานะปัจจุบัน

ใช้ `getLatestTroveData(troveId)` แสดงหนี้และหลักประกันรวมยอดสะสมกับกระจายที่ค้าง

| ฟิลด์                                   | เนื้อหา                                                          |
| --------------------------------------- | ---------------------------------------------------------------- |
| `entireDebt`                            | หนี้บันทึก ดอกเบี้ย หนี้ USDHN กระจาย และค่าจัดการกลุ่มของ Trove |
| `entireColl`                            | หลักประกันบันทึกรวมส่วนกระจายค้าง                                |
| `recordedDebt`                          | หนี้ที่บันทึกหรือจัดให้ตามส่วนแบ่งกลุ่ม                          |
| `accruedInterest`                       | ดอกเบี้ยตั้งแต่อัปเดตล่าสุดตามกฎปิดสาขา                          |
| `redistUSDHNDebtGain`, `redistCollGain` | หนี้และหลักประกันกระจายค้าง                                      |
| `annualInterestRate`                    | อัตราโพซิชันหรือกลุ่มปัจจุบัน                                    |
| `weightedRecordedDebt`                  | หนี้บันทึกคูณอัตราต่อปี                                          |
| `accruedBatchManagementFee`             | ส่วนค่าจัดการกลุ่มที่สะสม                                        |
| `lastInterestRateAdjTime`               | เวลาปรับอัตราโพซิชันหรือกลุ่มล่าสุด                              |

Trove ในกลุ่มแบ่งหนี้ ดอกเบี้ย และค่าจัดการตาม `batchDebtShares / totalDebtShares` การกระจายใช้ stake หลักประกันของ Trove การคำนวณหนี้เต็มรวมทั้งสองส่วน

| วิธีอ่าน                                                    | ใช้สำหรับ                                                                  |
| ----------------------------------------------------------- | -------------------------------------------------------------------------- |
| `Troves(troveId)`                                           | ฟิลด์ที่เก็บ: หนี้ หลักประกัน stake สถานะ เวลา อัตรา ผู้จัดการ และส่วนแบ่ง |
| `getTroveStatus(troveId)`                                   | enum สถานะ                                                                 |
| `getTroveAnnualInterestRate(troveId)`                       | อัตราที่มีผลรวมอัตรากลุ่ม                                                  |
| `getLatestBatchData(batchAddress)`                          | ยอดกลุ่ม ส่วนแบ่งหนี้ ดอกเบี้ย ค่าจัดการ                                   |
| `getCurrentICR(troveId, price)`                             | CR จากค่าล่าสุดกับราคาที่ส่ง                                               |
| `getTroveIdsCount()` และ `getTroveFromTroveIdsArray(index)` | อาร์เรย์ ID ที่ติดตามปัจจุบัน การปิดลบ ID                                  |

ส่งราคาสาขาและสเกลให้ถูกใน `getCurrentICR` ราคาและอัตราส่วนละเอียด `1e18` โดย `1.2e18` คือ `120%` การตรวจชำระบัญชีใช้ราคาออราเคิล ส่วนราคาตลาดใช้คำนวณสถานการณ์แยกได้

## Event และประวัติ

ทำดัชนีตาม ABI TroveManager, BorrowerOperations ที่ deploy และ event เจ้าของ NFT snapshot บันทึกบัญชีขณะทำรายการ ดอกเบี้ยหลังจากนั้นอ่านจากสถานะปัจจุบัน

| Event                      | สิ่งที่เก็บ                                                            |
| -------------------------- | ---------------------------------------------------------------------- |
| `TroveUpdated`             | ID หนี้/หลักประกัน stake อัตรา และ snapshot กระจาย                     |
| `TroveOperation`           | ชนิดรายการและการเปลี่ยนหนี้/หลักประกันแยกจากกระจาย ค่าล่วงหน้า และคำขอ |
| `Liquidation`              | หนี้หักล้าง/กระจาย หลักประกันไปพูล/กระจาย ชดเชย ส่วนเกิน และราคา       |
| `Redemption`               | USDHN ที่ขอและจริง หลักประกันส่ง ค่าใช้จ่าย ราคา                       |
| `RedemptionFeePaidToTrove` | ค่าธรรมเนียมราย Trove                                                  |
| `BatchUpdated`             | รายการ ยอด อัตรา ค่าจัดการ ส่วนแบ่ง และค่าล่วงหน้ากลุ่ม                |
| `BatchedTroveUpdated`      | หลักประกัน stake ส่วนหนี้ ผู้จัดการ และ snapshot ของ Trove             |
| `Transfer` ของ TroveNFT    | สร้าง โอนเจ้าของ เผา                                                   |

คงลำดับธุรกรรมและสาขา `closedByOwner`, `closedByLiquidation` เป็นสถานะสิ้นสุด เก็บประวัติหลังเผา NFT จัดการทั้งทางปกติและกลุ่ม โดยหนี้กลุ่มใช้บัญชีส่วนแบ่ง

## ธุรกรรมล้มเหลว

| Revert                                      | Input หรือสถานะ                        |
| ------------------------------------------- | -------------------------------------- |
| `CollateralStatusForbidsOperation()`        | สาขาห้ามสร้างหรือปรับโพซิชัน           |
| `IsShutDown()`                              | รายการผู้กู้หยุดหลังปิดสาขา            |
| `ICRBelowMCR()` หรือ `ICRBelowMCRPlusBCR()` | CR หลังทำต่ำกว่าเกณฑ์                  |
| `TCRBelowCCR()`                             | ผิดการตรวจ TCR สาขา                    |
| `DebtBelowMin()`                            | หนี้หลังทำต่ำกว่าขั้นต่ำ               |
| `UpfrontFeeTooHigh()`                       | ค่าจริงเกินสูงสุดที่ยอมรับ             |
| `NotEnoughUSDHNBalance()`                   | ผู้ชำระมี USDHN ไม่พอเผา               |
| `OnlyOneTroveLeft()`                        | รายการนำ Trove สุดท้ายออกตามกฎปัจจุบัน |

แสดงจำนวน ข้อจำกัดสาขา หรือสถานะที่เกี่ยวข้องในขั้นตอน รายการ Zapper กับสลิปเพจใช้ข้อผิดพลาดของเส้นทางนั้น [ภาพรวมเทคนิค](/th/developers/technical-overview.md) เชื่อมสัญญา ส่วน[คู่มือเชื่อมต่อ](/th/developers/integrator-kit.md) ครอบคลุม API และวอลเล็ต


---

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