docs/ops: Clarify eligible CL8Y for fee tiers vs "CL8Y-cb"; fix soft-launch indexer.env.example dryrun stubs #477

Closed
opened 2026-07-12 07:14:41 +00:00 by PlasticDigits · 5 comments
PlasticDigits commented 2026-07-12 07:14:41 +00:00 (Migrated from gitlab.com)

Summary

Soft-launch bug report used the name “CL8Y-cb” for the token expected to unlock fee reduction. The fee-discount contract checks a single CW20 (cl8y_token). That address is mainnet CL8Y terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3 — the string CL8Y-cb does not appear anywhere in this repository.

Separately, deployments/mainnet-soft-launch/indexer.env.example still contains terra1dryrun… placeholder addresses, while frontend.env.example and addresses.env have the real soft-launch set. Operators copying the indexer example risk a misconfigured indexer (wrong factory/router/fee-discount), broken tier sync (#364), and misleading health.

Companion UX issue for Pool discoverability / register CTA: #476.


Current codebase

Eligible token (authoritative)

Source Value
Fee-discount config (columbus-5) cl8y_token = terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3
deployments/mainnet-soft-launch/addresses.env CL8Y_TOKEN_ADDRESS / FEE_DISCOUNT_ADDRESS=terra1wccz…fnecz
frontend.env.example Matching VITE_CL8Y_TOKEN_ADDRESS / VITE_FEE_DISCOUNT_ADDRESS
Token registry map Same CW20 → symbol CL8Y
Balance check CW20 balance on cl8y_token at register and on each GetDiscount

There is no alias, wrap-mapper mapping, or IBC denom named CL8Y-cb in-repo.

Indexer env example drift

deployments/mainnet-soft-launch/indexer.env.example currently has dryrun-looking stubs, e.g.:

  • FACTORY_ADDRESS=terra1dryrun6f343dc4be8dcbf2a821f664ee67d1facbbf6d
  • ROUTER_ADDRESS=terra1dryrun0d0371e728495d9808e8495adafc0f9490f3f6
  • FEE_DISCOUNT_ADDRESS=terra1dryrun038e1a34e6e90a7aa0313e1f5fa636769993ac

Production probe at investigation time: https://indexer.dex.cl8y.com/api/v1/health/fee-discount → configured: true, fee_discount_registry_ok: true (live indexer appears correctly configured). The example file is still a footgun for the next cutover/rebuild.

Deploy-trace note

deployments/mainnet-soft-launch/deploy-trace.md deferred qa-verify-env-addresses until Coolify applied frontend.env.example / indexer.env.example. Frontend bundle on dex.cl8y.com already embeds the real fee-discount address; keep the verify script as the gate for any future redeploy.


Why a new implementation is needed

  1. Support / product clarity: Community naming (“CL8Y-cb”) ≠ contract cl8y_token. Without a published “which token counts” page (explorer link + address), users will keep reporting “holding doesn’t work.”
  2. Ops safety: Dryrun stubs in the soft-launch indexer example can silently break tier sync, route cache discount keys (#283), and fee-discount health if reused.
  3. Product decision hook: If CL8Y-cb is a different CW20 that should count, that requires governance UpdateConfig { cl8y_token } or a multi-token design (out of scope unless product chooses it here).

Constraints / guardrails

  • Prefer documentation + example-file correctness over contract changes.
  • Changing cl8y_token on mainnet is governance/multisig-only; requires make qa-verify-deploy-config / address cross-check (#442) and explicit product sign-off.
  • Do not teach users that arbitrary bridged symbols discount fees.
  • Do not put secrets in example env files; addresses are public.
  • Keep canonical tier numbers only in docs/reference/fee-discount-tiers.md (#198) — link, don’t duplicate tables.
  • UI copy changes that mention the eligible token should stay consistent with #476.

Relevant files

File Role
deployments/mainnet-soft-launch/indexer.env.example Dryrun stubs to replace with soft-launch addresses
deployments/mainnet-soft-launch/frontend.env.example Reference (already correct)
deployments/mainnet-soft-launch/addresses.env Source of truth for soft-launch addresses
deployments/mainnet-soft-launch/deploy-trace.md Cutover / verify notes
scripts/lib/mainnet-soft-launch-defaults.sh Deploy defaults / cl8y_token
docs/reference/fee-discount-tiers.md Tier ladder; add “eligible token” note/link
docs/frontend.md / docs/integrators.md Integrator + user-facing eligibility
docs/security-model.md Registration + balance model
skills/AGENTS_FEE_DISCOUNT_TIERS.md Agent playbook
scripts/qa/verify-env-addresses.sh (#442) Env ↔ chain cross-check
Fee-discount contract UpdateConfig Only if product renames/replaces cl8y_token

  1. Publish eligibility: Short “Eligible CL8Y for fee tiers” section (docs + /tiers footnote via #476): contract address, cl8y_token CW20, explorer links, statement that only that CW20 balance is read — community nicknames (e.g. CL8Y-cb) count only if they are that same contract.
  2. Product decision (comment on issue): Confirm whether “CL8Y-cb” in the wild is (a) the same CW20 under another name, or (b) a different asset. If (b) and product wants eligibility → governance plan; if (a) → docs/marketing alignment only.
  3. Fix indexer.env.example: Replace dryrun stubs with the soft-launch addresses from addresses.env (factory, router, fee-discount), matching frontend.env.example quality.
  4. Cutover checklist: Document running make qa-verify-env-addresses (and fee-discount health) after any Coolify env change; paste PASS output on the launch/deploy issue.
  5. Optional: add a one-line assert in a deploy/docs check that indexer.env.example addresses equal addresses.env (or fail CI docs job).

Acceptance criteria

  • Docs (and linked UI copy via #476) state the exact eligible CW20 and that registration is required.
  • Explicit note that “CL8Y-cb” / other labels do not grant discount unless the contract address matches cl8y_token.
  • Product decision recorded on this issue: same token vs different token vs defer.
  • indexer.env.example uses real soft-launch factory/router/fee-discount addresses (no dryrun stubs).
  • Soft-launch README or deploy-trace points operators at qa-verify-env-addresses + fee-discount health after env changes.
  • If cl8y_token is changed: multisig tx + verify scripts PASS; no silent frontend/indexer skew.

Test plan (all paths)

Path Expectation
Docs-only / example fix make check-fee-discount-tier-docs still PASS; links resolve
Apply updated indexer.env.example values on a staging indexer GET /api/v1/health/fee-discount → configured: true, fee_discount_registry_ok: true
make qa-verify-env-addresses with soft-launch frontend+indexer env PASS against columbus-5 LCD
Wallet holding only a non-cl8y_token asset marketed as CL8Y-cb get_discount = 0; register for tier 1 fails or cannot meet min_cl8y_balance
Wallet holding real cl8y_token + registered get_discount > 0; Pool/Swap discounted after #476
Accidental paste of old dryrun example CI/docs check fails or README warns; do not ship dryrun to prod

Test plan (attack / hack / abuse vectors)

Vector Expectation
Malicious token branded “CL8Y-cb” Not accepted; only cl8y_token address matters
Governance UpdateConfig to attacker CW20 Multisig + verify scripts; treat as critical ops change; document dual-control
Indexer pointed at wrong fee-discount address Tier sync / route cache wrong; health may still “ok” if that contract answers config — cross-check addresses against addresses.env / on-chain factory wiring
Social engineering “send CL8Y-cb to X for discount” Docs must never instruct transfers to third parties for tiers — only hold + register on /tiers
Spoofed explorer / wrong address in docs Prefer addresses sourced from addresses.env / on-chain config query in verify scripts

Verification criteria

  • Issue comment with product decision on CL8Y-cb identity.
  • Diff: indexer.env.example matches soft-launch addresses; no terra1dryrun left in that file.
  • make qa-verify-env-addresses (or documented equivalent) PASS after example/docs update.
  • Spot-check: LCD config on fee-discount equals documented cl8y_token.
  • Cross-link from #476 and soft-launch deploy-trace/README.
## Summary Soft-launch bug report used the name **“CL8Y-cb”** for the token expected to unlock fee reduction. The fee-discount contract checks a **single** CW20 (`cl8y_token`). That address is mainnet CL8Y `terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3` — the string **CL8Y-cb does not appear anywhere in this repository**. Separately, `deployments/mainnet-soft-launch/indexer.env.example` still contains **`terra1dryrun…` placeholder addresses**, while `frontend.env.example` and `addresses.env` have the real soft-launch set. Operators copying the indexer example risk a misconfigured indexer (wrong factory/router/fee-discount), broken tier sync (#364), and misleading health. Companion UX issue for Pool discoverability / register CTA: **#476**. --- ## Current codebase ### Eligible token (authoritative) | Source | Value | |--------|--------| | Fee-discount `config` (columbus-5) | `cl8y_token` = `terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3` | | `deployments/mainnet-soft-launch/addresses.env` | `CL8Y_TOKEN_ADDRESS` / `FEE_DISCOUNT_ADDRESS=terra1wccz…fnecz` | | `frontend.env.example` | Matching `VITE_CL8Y_TOKEN_ADDRESS` / `VITE_FEE_DISCOUNT_ADDRESS` | | Token registry map | Same CW20 → symbol `CL8Y` | | Balance check | CW20 `balance` on `cl8y_token` at register and on each `GetDiscount` | There is **no** alias, wrap-mapper mapping, or IBC denom named CL8Y-cb in-repo. ### Indexer env example drift `deployments/mainnet-soft-launch/indexer.env.example` currently has dryrun-looking stubs, e.g.: - `FACTORY_ADDRESS=terra1dryrun6f343dc4be8dcbf2a821f664ee67d1facbbf6d` - `ROUTER_ADDRESS=terra1dryrun0d0371e728495d9808e8495adafc0f9490f3f6` - `FEE_DISCOUNT_ADDRESS=terra1dryrun038e1a34e6e90a7aa0313e1f5fa636769993ac` Production probe at investigation time: `https://indexer.dex.cl8y.com/api/v1/health/fee-discount` → `configured: true`, `fee_discount_registry_ok: true` (live indexer appears correctly configured). The **example file** is still a footgun for the next cutover/rebuild. ### Deploy-trace note `deployments/mainnet-soft-launch/deploy-trace.md` deferred `qa-verify-env-addresses` until Coolify applied `frontend.env.example` / `indexer.env.example`. Frontend bundle on `dex.cl8y.com` already embeds the real fee-discount address; keep the verify script as the gate for any future redeploy. --- ## Why a new implementation is needed 1. **Support / product clarity:** Community naming (“CL8Y-cb”) ≠ contract `cl8y_token`. Without a published “which token counts” page (explorer link + address), users will keep reporting “holding doesn’t work.” 2. **Ops safety:** Dryrun stubs in the soft-launch indexer example can silently break tier sync, route cache discount keys (#283), and fee-discount health if reused. 3. **Product decision hook:** If CL8Y-cb is a *different* CW20 that should count, that requires governance `UpdateConfig { cl8y_token }` or a multi-token design (out of scope unless product chooses it here). --- ## Constraints / guardrails - Prefer **documentation + example-file correctness** over contract changes. - Changing `cl8y_token` on mainnet is **governance/multisig-only**; requires `make qa-verify-deploy-config` / address cross-check (#442) and explicit product sign-off. - Do **not** teach users that arbitrary bridged symbols discount fees. - Do not put secrets in example env files; addresses are public. - Keep canonical tier numbers only in `docs/reference/fee-discount-tiers.md` (#198) — link, don’t duplicate tables. - UI copy changes that mention the eligible token should stay consistent with **#476**. --- ## Relevant files | File | Role | |------|------| | `deployments/mainnet-soft-launch/indexer.env.example` | Dryrun stubs to replace with soft-launch addresses | | `deployments/mainnet-soft-launch/frontend.env.example` | Reference (already correct) | | `deployments/mainnet-soft-launch/addresses.env` | Source of truth for soft-launch addresses | | `deployments/mainnet-soft-launch/deploy-trace.md` | Cutover / verify notes | | `scripts/lib/mainnet-soft-launch-defaults.sh` | Deploy defaults / `cl8y_token` | | `docs/reference/fee-discount-tiers.md` | Tier ladder; add “eligible token” note/link | | `docs/frontend.md` / `docs/integrators.md` | Integrator + user-facing eligibility | | `docs/security-model.md` | Registration + balance model | | `skills/AGENTS_FEE_DISCOUNT_TIERS.md` | Agent playbook | | `scripts/qa/verify-env-addresses.sh` (#442) | Env ↔ chain cross-check | | Fee-discount contract `UpdateConfig` | Only if product renames/replaces `cl8y_token` | --- ## Recommended direction 1. **Publish eligibility:** Short “Eligible CL8Y for fee tiers” section (docs + `/tiers` footnote via #476): contract address, `cl8y_token` CW20, explorer links, statement that only that CW20 balance is read — community nicknames (e.g. CL8Y-cb) count **only if** they are that same contract. 2. **Product decision (comment on issue):** Confirm whether “CL8Y-cb” in the wild is (a) the same CW20 under another name, or (b) a different asset. If (b) and product wants eligibility → governance plan; if (a) → docs/marketing alignment only. 3. **Fix `indexer.env.example`:** Replace dryrun stubs with the soft-launch addresses from `addresses.env` (factory, router, fee-discount), matching `frontend.env.example` quality. 4. **Cutover checklist:** Document running `make qa-verify-env-addresses` (and fee-discount health) after any Coolify env change; paste PASS output on the launch/deploy issue. 5. Optional: add a one-line assert in a deploy/docs check that `indexer.env.example` addresses equal `addresses.env` (or fail CI docs job). --- ## Acceptance criteria - [ ] Docs (and linked UI copy via #476) state the **exact** eligible CW20 and that registration is required. - [ ] Explicit note that “CL8Y-cb” / other labels do not grant discount unless the contract address matches `cl8y_token`. - [ ] Product decision recorded on this issue: same token vs different token vs defer. - [ ] `indexer.env.example` uses real soft-launch factory/router/fee-discount addresses (no `dryrun` stubs). - [ ] Soft-launch README or deploy-trace points operators at `qa-verify-env-addresses` + fee-discount health after env changes. - [ ] If `cl8y_token` is changed: multisig tx + verify scripts PASS; no silent frontend/indexer skew. --- ## Test plan (all paths) | Path | Expectation | |------|-------------| | Docs-only / example fix | `make check-fee-discount-tier-docs` still PASS; links resolve | | Apply updated `indexer.env.example` values on a staging indexer | `GET /api/v1/health/fee-discount` → `configured: true`, `fee_discount_registry_ok: true` | | `make qa-verify-env-addresses` with soft-launch frontend+indexer env | PASS against columbus-5 LCD | | Wallet holding only a non-`cl8y_token` asset marketed as CL8Y-cb | `get_discount` = 0; register for tier 1 fails or cannot meet `min_cl8y_balance` | | Wallet holding real `cl8y_token` + registered | `get_discount` > 0; Pool/Swap discounted after #476 | | Accidental paste of old dryrun example | CI/docs check fails **or** README warns; do not ship dryrun to prod | --- ## Test plan (attack / hack / abuse vectors) | Vector | Expectation | |--------|-------------| | Malicious token branded “CL8Y-cb” | Not accepted; only `cl8y_token` address matters | | Governance `UpdateConfig` to attacker CW20 | Multisig + verify scripts; treat as critical ops change; document dual-control | | Indexer pointed at wrong fee-discount address | Tier sync / route cache wrong; health may still “ok” if that contract answers `config` — cross-check addresses against `addresses.env` / on-chain factory wiring | | Social engineering “send CL8Y-cb to X for discount” | Docs must never instruct transfers to third parties for tiers — only hold + register on `/tiers` | | Spoofed explorer / wrong address in docs | Prefer addresses sourced from `addresses.env` / on-chain `config` query in verify scripts | --- ## Verification criteria - Issue comment with product decision on CL8Y-cb identity. - Diff: `indexer.env.example` matches soft-launch addresses; no `terra1dryrun` left in that file. - `make qa-verify-env-addresses` (or documented equivalent) PASS after example/docs update. - Spot-check: LCD `config` on fee-discount equals documented `cl8y_token`. - Cross-link from #476 and soft-launch deploy-trace/README.
PlasticDigits commented 2026-07-12 07:14:50 +00:00 (Migrated from gitlab.com)

mentioned in issue #476

mentioned in issue #476
PlasticDigits commented 2026-07-12 07:14:51 +00:00 (Migrated from gitlab.com)

Companion UX/Pool discoverability work: #476.

Product decision needed in a comment: is community “CL8Y-cb” the same CW20 as fee-discount cl8y_token (terra16wtml…qvhpax3), or a different asset?

Companion UX/Pool discoverability work: #476. Product decision needed in a comment: is community “CL8Y-cb” the same CW20 as fee-discount `cl8y_token` (`terra16wtml…qvhpax3`), or a different asset?
PlasticDigits commented 2026-07-12 07:32:25 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1013

mentioned in merge request !1013
PlasticDigits commented 2026-07-12 07:59:41 +00:00 (Migrated from gitlab.com)

Yes people call cl8y cl8y-cb because the symbol on terraclassic is cl8y-cb, but its the same token

Yes people call cl8y cl8y-cb because the symbol on terraclassic is cl8y-cb, but its the same token
PlasticDigits commented 2026-07-12 08:11:05 +00:00 (Migrated from gitlab.com)

Reporter follow-up

Reporter confirmed fee discount works after registering on /tiers — so their holdings were eligible; the gap was registration, not a wrong CW20.

Product decision: treat “CL8Y-cb” naming confusion as lower urgency unless we get a confirmed different-contract case. Remaining work here is still valid: publish eligible-token address clearly, and fix indexer.env.example dryrun stubs.

## Reporter follow-up Reporter confirmed fee discount works after registering on `/tiers` — so their holdings were eligible; the gap was **registration**, not a wrong CW20. Product decision: treat “CL8Y-cb” naming confusion as lower urgency unless we get a confirmed different-contract case. Remaining work here is still valid: publish eligible-token address clearly, and fix `indexer.env.example` dryrun stubs.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-07-14 08:42:56 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-dex-terraclassic#477
No description provided.