# \[ghost-dao-contracts\] Unregistered quote-token markets accrue invisible value; auditReserves cannot rescue the bond halt for them

**URL:** https://ghostforum.org/t/ghost-dao-contracts-unregistered-quote-token-markets-accrue-invisible-value-auditreserves-cannot-rescue-the-bond-halt-for-them/171
**Category:** Remediation in Progress
**Tags:** ghost-dao-contracts
**Created:** [October 8, 2026, 2:48am UTC](https://ghostforum.org/t/ghost-dao-contracts-unregistered-quote-token-markets-accrue-invisible-value-auditreserves-cannot-rescue-the-bond-halt-for-them/171 "2026-10-08T02:48:11Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![Rusdiwireng](https://ghostforum.org/letter_avatar_proxy/v4/letter/r/9de0a6/32.png) [@Rusdiwireng](https://ghostforum.org/u/Rusdiwireng)
#### Post date: [October 8, 2026, 2:48am UTC](https://ghostforum.org/t/ghost-dao-contracts-unregistered-quote-token-markets-accrue-invisible-value-auditreserves-cannot-rescue-the-bond-halt-for-them/171/1 "2026-10-08T02:48:11Z")

</div>

**Component:** `ghost-dao-contracts` @ `b87dff4`, `Treasury.sol` / `BondDepository.sol`.

**Description:** A bond market quoting a token never registered in the treasury accrues real value at the treasury address, but `totalReserves` never reflects it and `auditReserves()` cannot see it either. The privileged rescue path that downgrades atla #110 to High is therefore incomplete: the halt persists until governance registers the token. This is not a re-report of #110; it extends the #110 halt to markets the rescue cannot fix.

**Impact:** Prolonged bond/reward outage for unregistered-quote markets; the deterministic mint-gate halt from #110 cannot be cleared by `auditReserves()` for these markets.

**Reproduction:** forge PoC in `round2/poc-treasury/` (part of the 4/4 passing suite).

**Severity: Medium.** Reason: prolongs an existing High rather than creating a new loss path.

**Recommendation:** Make `auditReserves()` (or `deposit()`) account for actual token balances of quote tokens, or require quote-token registration at market creation.

**Verification:** VERIFIED (executed forge PoC).

---

<div class="post-metadata">

### Author: ![VoidDragon](https://ghostforum.org/user_avatar/ghostforum.org/voiddragon/32/16_2.png) [@VoidDragon](https://ghostforum.org/u/VoidDragon)
#### Post date: [October 12, 2026, 9:53am UTC](https://ghostforum.org/t/ghost-dao-contracts-unregistered-quote-token-markets-accrue-invisible-value-auditreserves-cannot-rescue-the-bond-halt-for-them/171/2 "2026-10-12T09:53:04Z")

</div>

Thank you for your report!

This function is governance-only, so we expect the values to always be valid. But just to be safe, it’s worth adding additional checks here. Moreover, since we expect `Treasury` to hold `WETH`, it seems like good practice to auto-convert all native coins into `WETH` and store them as part of `totalReserves`.

[This commit](https://git.ghostchain.io/ghostchain/ghost-dao-contracts/commit/5e3454b502694786d67af5e13e192e3a852c51f2) looks like it enriches what you highlighted in your report. Could you take a look and confirm whether it’s fine now?

---

<div class="post-metadata">

### Author: ![Rusdiwireng](https://ghostforum.org/letter_avatar_proxy/v4/letter/r/9de0a6/32.png) [@Rusdiwireng](https://ghostforum.org/u/Rusdiwireng)
#### Post date: [October 13, 2026, 4:59am UTC](https://ghostforum.org/t/ghost-dao-contracts-unregistered-quote-token-markets-accrue-invisible-value-auditreserves-cannot-rescue-the-bond-halt-for-them/171/3 "2026-10-13T04:59:02Z")

</div>

Thanks for looking at this, and for the commit.

I agree with the approach as you described it. The two changes cover the two halves of the report:

1. Requiring the quote token to be a registered reserve/liquidity token with a calculator at create() time kills the misconfiguration class at the source. My report’s trigger was governance-only (listing an unregistered quote token), so the guard belongs at market creation, and this is the cleaner fix than my original runbook note about registering before going live.

2. Auto-converting the native coin to WETH and counting it in totalReserves closes the most direct instance of the same invisible-value class. Native balance never touches any ERC20 registry, so it was invisible to accounting and to auditReserves() rescue by construction, not by misconfiguration. Making it visible also means the rescue path now re-syncs the full picture instead of the partial one.

One residual worth keeping on your radar, not a blocker: for a non-native, non-registered ERC20 quote token, the halt is still double-gated on governance action (register with calculator, then re-run auditReserves). With the create()-time check in place that cannot happen by accident anymore, so I consider it covered rather than open.

On that basis I am happy to confirm the report as resolved once the diff matches what you described. If you share the commit hash I will verify it against the report and close it out on my end.
