dApp: Create Token and manager console for community tax CW20 #593

Closed
opened 2026-08-22 10:59:12 +00:00 by PlasticDigits · 54 comments
PlasticDigits commented 2026-08-22 10:59:12 +00:00 (Migrated from gitlab.com)

Parent

Depends on #592 (on-chain launcher, SKUs, manager vs CMM admin). Indexer catalog is a sibling.

Payment (amendment)

Paid checkout must not be UST1-only. Use the shared Pay with any token card from #595. Do not duplicate Swap/router construction on Create Token / Manage.

Action Invoice
Unlock SKUs at create / Enable Feature 50 UST1 × SKU count
Save manager settings (one batch) 50 UST1 flat — all already activated fields in that save

Show 50 UST1 (not per-field) before sign (“Save settings batch → 50 UST1”). Disable fields whose SKU is not unlocked; no-op Save disabled. Do not mix Enable Feature into the same Save (unlock is its own 50 UST1). Mint (issue supply) does not use this settings invoice.

This issue is blocked on #595 for every paid path (SKU and settings batch). A LocalTerra stub that pays UST1-only is acceptable only as an interim, not as the shipped UX.

Problem statement

The dApp can create pairs (/create) and drip soft-launch tokens (/mint) but cannot create or manage a community tax token. Leaders need a retail flow: pick free vs paid features (50 UST1 each), instantiate via the launcher, then a management page (rates, ratios, exemptions, mint/revoke) that only the manager can submit — with clear warnings that wasm upgrades are CMM-only.

Current codebase

  • Routes: frontend-dapp/src/App.tsx — /create → CreatePairPage, /mint → faucet only, /ust1 → oracle window. No /token/create or /token/manage.
  • Nav: frontend-dapp/src/components/common/navItems.ts — More menu has Create Pair, Protocol, Wrap, Mint (conditional). No “Create token”.
  • Create pair is listed-CW20 picker + custom paste + factory CreatePair (#542, #382). Copy rules: skills/AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.md — short labels, no lecture on the card.
  • Tx helpers: frontend-dapp/src/services/terraclassic/transactions.ts (gas envelopes, CW20 send). UST1 is a CW20 — paid SKUs need send / increase_allowance to the launcher, not native uluna.
  • Token identity / explorer: tokenIdentity.ts, PairTokenLinks (#541).
  • Retail gem hiding: #562 — do not dump test tokens into Swap. Community-created tax tokens should appear in catalogs only once indexed and (if product requires) after a pair exists — do not auto-inject into Swap defaults.
  • Simulated wallet / Keplr: existing connect modal; management txs use connected address as manager.
  • Indexer client: frontend-dapp/src/services/indexer/ — will consume new list/detail endpoints from the indexer issue.

Why needed

Without a dApp, only CosmWasm CLI users can launch. The product promise is PinkSale-style: free basic tax token, optional 50 UST1 modules, then a manager console. Mis-copy (calling this “mint” like /mint faucet, or implying the leader can upgrade wasm) is a trust-boundary bug.

Constraints / guardrails

  1. Do not overload /mint or /ust1. New routes e.g. /token/create and /token/:addr/manage (or /create-token + /token/:addr). Nav label Create Token ≠ Mint ≠ Create Pair.
  2. Copy: tax is not the DEX swap fee; manager cannot migrate the contract; CMM governance is the only upgrader. One-sentence risk on create; Docs link for depth (#489).
  3. NFA / risk modal still applies (#138). Optional extra checkbox: “I understand taxes and mint (if enabled) are controlled by the manager wallet.”
  4. Paid SKUs: show 50 UST1 each as the invoice; Pay with any token (#595) for live pay-token balance + route. Disable submit if unroutable or max-in exceeds balance. MintControl only on create, not on manage-enable.
  5. Management page: if connected wallet ≠ manager, read-only (queries + explorer). Do not hide config — transparency.
  6. LCD ContractInfo.admin ≠ CMM → banner Unverified admin (do not pretend launcher-attested).
  7. TaxPreview (or equivalent query) must drive You pay / they receive and Swap max-in when this token is the pay asset (extra-debit sell). If Swap is not updated in this issue, file/link a follow-up and gate with “tax tokens: use TaxPreview for max” in acceptance — prefer including Swap max-spend in this issue so users cannot brick sells.
  8. No innerHTML of chain strings; isValidTerraBech32Address on every address field.
  9. Feature flags / env: VITE_COMMUNITY_TOKEN_LAUNCHER, VITE_COMMUNITY_TAX_CODE_ID, CMM admin for banner compare. Unset → page unavailable (same pattern as faucet/wrap).
  10. Do not put raw SKU JSON in the heading. Retail names: “Minting”, “Wallet-to-wallet tax”, “Split treasury”, “Auto liquidity”, “Extra exemptions”, “Change rates later”.
  11. Design system: existing shell-panel / gold-blue (#488).

Relevant files

Area Paths
Routes / nav frontend-dapp/src/App.tsx, components/common/navItems.ts, nav tests
Pair create (pattern) pages/CreatePairPage.tsx, components/create/CreatePairTokenField.tsx
Tx / LCD services/terraclassic/transactions.ts, new communityToken.ts (queries + execute)
Max spend utils/maxSpendableAmount.ts — new context for taxed sell
Copy / terms docs/design-system.md glossary (add community tax token vs DEX fee), docs/frontend.md
Tests Vitest page tests; optional Playwright LocalTerra (make test-e2e only if launcher deployed)
  1. Create Token wizard: token meta → tax bps (buy/sell, 0 allowed) → treasury addr → manager (default connected) → SKU checkboxes with 50 UST1 running total → review (admin will be CMM, not you) → one or two txs (UST1 send to launcher + instantiate, or single CW20 Send with msg).
  2. Manage tabs: Taxes, Sinks/ratios, Exemptions, Mint (if SKU), AutoLP (if SKU), Enable paid SKU (UST1). All submits Unauthorized-safe.
  3. My tokens: list from indexer ?manager= or LCD; empty state.
  4. Swap/Trade: if asset code_id is the tax template, use TaxPreview for sell max and show “Sell tax extra” one-liner — not a paragraph.
  5. After create, CTA Create Pair linking /create with token prefill only if #542 query prefill is explicitly added; otherwise copy the address + link /create.

Acceptance criteria

  • Nav + routes live when launcher env set; hidden/unavailable when unset.
  • Free create works with 0 UST1 SKU cost (gas only); paid SKUs invoice 50 UST1 × count and settle via #595 (any token → UST1 → launcher).
  • Manage Save invoices 50 UST1 for the whole batch of already-activated settings via the same #595 card; disabled when nothing changed or only locked SKU fields are dirty; copy states the 50 UST1 batch fee before sign.
  • Manage txs disabled for non-manager; config still visible.
  • Unverified wasm admin banner.
  • Mint SKU cannot be purchased from Manage.
  • Address validation; no faucet/ust1 confusion in copy.
  • Vitest coverage for SKU total, manager gate, TaxPreview max-sell helper.
  • docs/frontend.md + glossary; make verify-issue-NNN.
  • Swap/Trade max-spend accounts for extra-debit sell (or explicit linked follow-up with product sign-off).

Test plan (all paths)

  • Env unset → unavailable page (like /mint without faucet).
  • Disconnected: create form visible; submit gated (same as Create Pair / Ladder #494 pattern).
  • Connected: free create simulation (mocked LCD); paid create with 0 UST1 balance → disabled + reason.
  • SKU toggle math: 0, 1, 3 SKUs → 0 / 50 / 150 UST1.
  • Manage as manager vs other wallet vs disconnected.
  • Settings Save: 1 field or many activated fields → still 50 UST1; none → CTA disabled / no tx; TransferTax field dirty while SKU off → cannot submit.
  • Settings Save still uses #595 pay-token picker (not UST1-only).
  • Invalid bech32 treasury/manager/exempt.
  • Tax bps above on-chain max → inline error before tx.
  • Revoke mint confirmation (one-way).
  • AutoLP skim button permissionless (any wallet).
  • Keyboard / theme / mobile More sheet includes Create Token without crowding primary nav (More menu, not bottom tabs).

Attack / abuse / hack test plan

  • Phishing copy: page must not ask for mnemonic/seed (existing wallet rules).
  • Wrong contract: env launcher vs user-pasted token on manage → query GetConfig fail → error, no blind execute.
  • SKU payment to attacker: txs must target env launcher address only (checksum compare).
  • Hidden extra CW20: simulate msgs; test asserts only UST1 + instantiate, no unexpected increase_allowance to third party.
  • XSS: token name/symbol from chain rendered as text.
  • Confused deputy: manage page on a 10184 mintable must not show tax SKUs (code_id / query mismatch).
  • Manager spoof: UI must compare connected addr to query manager, not a URL param.
  • Open redirect after create.
  • Max-sell omission: if Swap allows selling 100% balance on extra-debit token, add regression test that max is reduced (abuse = user self-DoS / failed tx spam).

Verification criteria

  • make test-frontend / make lint-frontend green.
  • make verify-issue-NNN (env grep + Vitest file list + optional LocalTerra screenshot/script).
  • Manual: Chrome + Simulated Wallet on LocalTerra — create free token, create pair, buy/sell, manage rate, non-manager read-only.

Labels / owner / priority

enhancement UX QA · Owner: frontend · Priority: P2 · Blocked by: on-chain template/launcher

## Parent Depends on [**#592**](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/592) (on-chain launcher, SKUs, manager vs CMM admin). Indexer catalog is a sibling. ## Payment (amendment) Paid checkout must **not** be UST1-only. Use the shared **Pay with any token** card from [**#595**](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/595). Do not duplicate Swap/router construction on Create Token / Manage. | Action | Invoice | |--------|---------| | Unlock SKUs at create / Enable Feature | `50 UST1 × SKU count` | | **Save manager settings (one batch)** | **50 UST1 flat** — all **already activated** fields in that save | Show **50 UST1** (not per-field) before sign (“Save settings batch → 50 UST1”). Disable fields whose SKU is not unlocked; no-op Save disabled. Do not mix Enable Feature into the same Save (unlock is its own 50 UST1). Mint (issue supply) does **not** use this settings invoice. This issue is **blocked on #595** for every paid path (SKU **and** settings batch). A LocalTerra stub that pays UST1-only is acceptable only as an interim, not as the shipped UX. ## Problem statement The dApp can create **pairs** (`/create`) and drip soft-launch tokens (`/mint`) but cannot **create or manage** a community tax token. Leaders need a retail flow: pick free vs paid features (50 UST1 each), instantiate via the launcher, then a management page (rates, ratios, exemptions, mint/revoke) that only the **manager** can submit — with clear warnings that wasm upgrades are **CMM-only**. ## Current codebase - Routes: [`frontend-dapp/src/App.tsx`](frontend-dapp/src/App.tsx) — `/create` → `CreatePairPage`, `/mint` → faucet only, `/ust1` → oracle window. **No** `/token/create` or `/token/manage`. - Nav: [`frontend-dapp/src/components/common/navItems.ts`](frontend-dapp/src/components/common/navItems.ts) — More menu has Create Pair, Protocol, Wrap, Mint (conditional). No “Create token”. - Create pair is listed-CW20 picker + custom paste + factory `CreatePair` ([#542](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/542), [#382](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/382)). Copy rules: [`skills/AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.md`](skills/AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.md) — short labels, no lecture on the card. - Tx helpers: [`frontend-dapp/src/services/terraclassic/transactions.ts`](frontend-dapp/src/services/terraclassic/transactions.ts) (gas envelopes, CW20 send). UST1 is a CW20 — paid SKUs need `send` / `increase_allowance` to the **launcher**, not native uluna. - Token identity / explorer: [`tokenIdentity.ts`](frontend-dapp/src/utils/tokenIdentity.ts), PairTokenLinks ([#541](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/541)). - Retail gem hiding: [#562](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/562) — do not dump test tokens into Swap. **Community-created tax tokens should appear in catalogs only once indexed and (if product requires) after a pair exists** — do not auto-inject into Swap defaults. - Simulated wallet / Keplr: existing connect modal; management txs use connected address as manager. - Indexer client: `frontend-dapp/src/services/indexer/` — will consume new list/detail endpoints from the indexer issue. ## Why needed Without a dApp, only CosmWasm CLI users can launch. The product promise is **PinkSale-style**: free basic tax token, optional 50 UST1 modules, then a manager console. Mis-copy (calling this “mint” like `/mint` faucet, or implying the leader can upgrade wasm) is a trust-boundary bug. ## Constraints / guardrails 1. **Do not overload `/mint` or `/ust1`.** New routes e.g. `/token/create` and `/token/:addr/manage` (or `/create-token` + `/token/:addr`). Nav label **Create Token** ≠ Mint ≠ Create Pair. 2. Copy: tax is **not** the DEX swap fee; manager **cannot** migrate the contract; CMM governance is the only upgrader. One-sentence risk on create; Docs link for depth ([#489](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/489)). 3. **NFA / risk modal** still applies ([#138](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/138)). Optional extra checkbox: “I understand taxes and mint (if enabled) are controlled by the manager wallet.” 4. Paid SKUs: show **50 UST1 each** as the invoice; **Pay with any token** (#595) for live pay-token balance + route. Disable submit if unroutable or max-in exceeds balance. MintControl **only on create**, not on manage-enable. 5. Management page: if connected wallet ≠ `manager`, **read-only** (queries + explorer). Do not hide config — transparency. 6. LCD `ContractInfo.admin` ≠ CMM → banner **Unverified admin** (do not pretend launcher-attested). 7. **TaxPreview** (or equivalent query) must drive **You pay / they receive** and Swap max-in when this token is the pay asset (extra-debit sell). If Swap is not updated in this issue, file/link a follow-up and gate with “tax tokens: use TaxPreview for max” in acceptance — **prefer including Swap max-spend in this issue** so users cannot brick sells. 8. No innerHTML of chain strings; `isValidTerraBech32Address` on every address field. 9. Feature flags / env: `VITE_COMMUNITY_TOKEN_LAUNCHER`, `VITE_COMMUNITY_TAX_CODE_ID`, CMM admin for banner compare. Unset → page unavailable (same pattern as faucet/wrap). 10. Do not put raw SKU JSON in the heading. Retail names: “Minting”, “Wallet-to-wallet tax”, “Split treasury”, “Auto liquidity”, “Extra exemptions”, “Change rates later”. 11. Design system: existing shell-panel / gold-blue ([#488](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/488)). ## Relevant files | Area | Paths | |------|-------| | Routes / nav | `frontend-dapp/src/App.tsx`, `components/common/navItems.ts`, nav tests | | Pair create (pattern) | `pages/CreatePairPage.tsx`, `components/create/CreatePairTokenField.tsx` | | Tx / LCD | `services/terraclassic/transactions.ts`, new `communityToken.ts` (queries + execute) | | Max spend | `utils/maxSpendableAmount.ts` — new context for taxed sell | | Copy / terms | `docs/design-system.md` glossary (add **community tax token** vs **DEX fee**), `docs/frontend.md` | | Tests | Vitest page tests; optional Playwright LocalTerra (`make test-e2e` only if launcher deployed) | ## Recommended direction 1. **Create Token** wizard: token meta → tax bps (buy/sell, 0 allowed) → treasury addr → manager (default connected) → SKU checkboxes with 50 UST1 running total → review (admin will be CMM, not you) → one or two txs (UST1 send to launcher + instantiate, or single CW20 Send with msg). 2. **Manage** tabs: Taxes, Sinks/ratios, Exemptions, Mint (if SKU), AutoLP (if SKU), Enable paid SKU (UST1). All submits `Unauthorized`-safe. 3. **My tokens:** list from indexer `?manager=` or LCD; empty state. 4. Swap/Trade: if asset code_id is the tax template, use `TaxPreview` for sell max and show “Sell tax extra” one-liner — not a paragraph. 5. After create, CTA **Create Pair** linking `/create` with token prefill **only if** `#542` query prefill is explicitly added; otherwise copy the address + link `/create`. ## Acceptance criteria - [ ] Nav + routes live when launcher env set; hidden/unavailable when unset. - [ ] Free create works with 0 UST1 SKU cost (gas only); paid SKUs invoice **50 UST1 × count** and settle via #595 (any token → UST1 → launcher). - [ ] Manage Save invoices **50 UST1 for the whole batch** of already-activated settings via the same #595 card; disabled when nothing changed or only locked SKU fields are dirty; copy states the 50 UST1 batch fee before sign. - [ ] Manage txs disabled for non-manager; config still visible. - [ ] Unverified wasm admin banner. - [ ] Mint SKU cannot be purchased from Manage. - [ ] Address validation; no faucet/ust1 confusion in copy. - [ ] Vitest coverage for SKU total, manager gate, TaxPreview max-sell helper. - [ ] `docs/frontend.md` + glossary; `make verify-issue-NNN`. - [ ] Swap/Trade max-spend accounts for extra-debit sell (or explicit linked follow-up with product sign-off). ## Test plan (all paths) - Env unset → unavailable page (like `/mint` without faucet). - Disconnected: create form visible; submit gated (same as Create Pair / Ladder [#494](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/494) pattern). - Connected: free create simulation (mocked LCD); paid create with 0 UST1 balance → disabled + reason. - SKU toggle math: 0, 1, 3 SKUs → 0 / 50 / 150 UST1. - Manage as manager vs other wallet vs disconnected. - Settings Save: 1 field or many activated fields → still **50 UST1**; none → CTA disabled / no tx; TransferTax field dirty while SKU off → cannot submit. - Settings Save still uses #595 pay-token picker (not UST1-only). - Invalid bech32 treasury/manager/exempt. - Tax bps above on-chain max → inline error before tx. - Revoke mint confirmation (one-way). - AutoLP skim button permissionless (any wallet). - Keyboard / theme / mobile More sheet includes Create Token without crowding primary nav (More menu, not bottom tabs). ## Attack / abuse / hack test plan - **Phishing copy:** page must not ask for mnemonic/seed (existing wallet rules). - **Wrong contract:** env launcher vs user-pasted token on manage → query `GetConfig` fail → error, no blind execute. - **SKU payment to attacker:** txs must target env launcher address only (checksum compare). - **Hidden extra CW20:** simulate msgs; test asserts only UST1 + instantiate, no unexpected `increase_allowance` to third party. - **XSS:** token name/symbol from chain rendered as text. - **Confused deputy:** manage page on a 10184 mintable must not show tax SKUs (code_id / query mismatch). - **Manager spoof:** UI must compare connected addr to query `manager`, not a URL param. - **Open redirect** after create. - **Max-sell omission:** if Swap allows selling 100% balance on extra-debit token, add regression test that max is reduced (abuse = user self-DoS / failed tx spam). ## Verification criteria - `make test-frontend` / `make lint-frontend` green. - `make verify-issue-NNN` (env grep + Vitest file list + optional LocalTerra screenshot/script). - Manual: Chrome + Simulated Wallet on LocalTerra — create free token, create pair, buy/sell, manage rate, non-manager read-only. ## Labels / owner / priority `enhancement` `UX` `QA` · Owner: frontend · Priority: **P2** · Blocked by: on-chain template/launcher
PlasticDigits commented 2026-08-22 10:59:13 +00:00 (Migrated from gitlab.com)

marked as related to #592

marked as related to #592
PlasticDigits commented 2026-08-22 10:59:21 +00:00 (Migrated from gitlab.com)

marked as related to #594

marked as related to #594
PlasticDigits commented 2026-08-22 10:59:22 +00:00 (Migrated from gitlab.com)

mentioned in issue #592

mentioned in issue #592
PlasticDigits commented 2026-08-22 11:02:33 +00:00 (Migrated from gitlab.com)

mentioned in issue #595

mentioned in issue #595
PlasticDigits commented 2026-08-22 11:02:34 +00:00 (Migrated from gitlab.com)

marked as related to #595

marked as related to #595
PlasticDigits commented 2026-08-22 11:03:02 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-22 11:03:04 +00:00 (Migrated from gitlab.com)

Create Token / Manage paid checkout must use the shared Pay-with-any-token module: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/595 — do not ship a UST1-only picker.

Create Token / Manage paid checkout must use the shared Pay-with-any-token module: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/595 — do not ship a UST1-only picker.
PlasticDigits commented 2026-08-22 11:05:03 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-22 11:05:06 +00:00 (Migrated from gitlab.com)

Manage Save: invoice 50 UST1 × N changed settings, paid via #595 (any token). Show N + total before sign. No-op Save disabled.

Manage Save: invoice **50 UST1 × N changed settings**, paid via #595 (any token). Show N + total before sign. No-op Save disabled.
PlasticDigits commented 2026-08-22 11:09:00 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-22 11:09:05 +00:00 (Migrated from gitlab.com)

Manage Save: always 50 UST1 for the batch, not per field. Locked SKU fields cannot be included. Unlock SKU is a separate 50 UST1 action.

Manage Save: always 50 UST1 for the batch, not per field. Locked SKU fields cannot be included. Unlock SKU is a separate 50 UST1 action.
PlasticDigits commented 2026-08-22 12:26:36 +00:00 (Migrated from gitlab.com)

mentioned in issue #597

mentioned in issue #597
PlasticDigits commented 2026-08-22 12:26:36 +00:00 (Migrated from gitlab.com)

marked as related to #597

marked as related to #597
PlasticDigits commented 2026-08-23 03:09:51 +00:00 (Migrated from gitlab.com)

mentioned in commit 995b85039c

mentioned in commit 995b85039cfc8d14f5401e766f013d116e4c6642
PlasticDigits commented 2026-08-23 03:10:03 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1117

mentioned in merge request !1117
PlasticDigits commented 2026-08-23 03:31:24 +00:00 (Migrated from gitlab.com)

!1117 / #595 v1 is on main (quotePayInvoice / buildPayInvoiceMsgs / PayWithAnyToken). Create Token and Manage settings Save must import that card — do not assemble router ops on those pages. LocalTerra SKU / settings-batch pay is still blocked on the #592 launcher.

!1117 / #595 v1 is on `main` (`quotePayInvoice` / `buildPayInvoiceMsgs` / `PayWithAnyToken`). Create Token and Manage settings Save must import that card — do not assemble router ops on those pages. LocalTerra SKU / settings-batch pay is still blocked on the #592 launcher.
PlasticDigits commented 2026-08-23 03:50:24 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1119

mentioned in merge request !1119
PlasticDigits commented 2026-08-23 03:53:49 +00:00 (Migrated from gitlab.com)

mentioned in issue #601

mentioned in issue #601
PlasticDigits commented 2026-08-23 04:15:11 +00:00 (Migrated from gitlab.com)

Columbus-5 pins (from #601, 2026-08-23)

Factory listed 11611. Launcher / AutoLP are stored only — 0 instantiates, so there is no VITE_COMMUNITY_TOKEN_LAUNCHER address yet. Pages stay unavailable until ops instantiates launcher (wasm admin / cmm_governance = CMM) and Coolify is set.

Env / field Value Notes
VITE_COMMUNITY_TAX_CODE_ID 11611 Token template. LCD data_hash 9D33BF2539A9A5B2F13FD4B321CDBD0B0FD86D936D5D6BD6681955FA30210EC2
VITE_COMMUNITY_TOKEN_LAUNCHER TBD — instantiate code 11612 Store tx 3907A435…. Hash A0F95FBA548F4EA6F5536CE564922EC39B9ECE691CF3F01FF8733B7A93223F19
AutoLP code (bind later, not env-required for create) 11613 Store tx 84A8501C…
CMM compare (ContractInfo.admin) terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2 Same CMM as factory treasury / wrap custody. Banner if admin ≠ this after launcher-stamped instantiate
UST1 invoice token terra1f0eqgy9w7e5e7up97vjudqwx38tesf8ylx75x2lv3nwm0clry0pqmgfy72 VITE_UST1_TOKEN_ADDRESS
Factory terra1ejpgvv7g3hj0u6fpcnxhflqp84g0w3cnaskqkg5733ygwlmf963sfchsea GetWhitelistedCodeIds includes 11611 (tx 241FE20E… height 30071160)
Router terra1e7s0h9ftxakwca5gxspyt4haeuaqxds6swr08ul3tsepq7el924sprrsrw For #595 pay-with-any-token, not for assembling Swap ops on Create/Manage

Do not hardcode a LocalTerra store id. Confused-deputy: manage UI must require LCD code_id == 11611, not 10184/8266/6036.

## Columbus-5 pins (from [#601](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/601), 2026-08-23) Factory listed **11611**. Launcher / AutoLP are **stored only** — **0 instantiates**, so there is **no** `VITE_COMMUNITY_TOKEN_LAUNCHER` address yet. Pages stay unavailable until ops instantiates launcher (wasm admin / `cmm_governance` = CMM) and Coolify is set. | Env / field | Value | Notes | |-------------|--------|--------| | `VITE_COMMUNITY_TAX_CODE_ID` | **11611** | Token template. LCD `data_hash` `9D33BF2539A9A5B2F13FD4B321CDBD0B0FD86D936D5D6BD6681955FA30210EC2` | | `VITE_COMMUNITY_TOKEN_LAUNCHER` | *TBD — instantiate code **11612*** | Store tx [`3907A435…`](https://finder.terraclassic.community/columbus-5/tx/3907A435FE6EB2EFEBB314869A031817FD64E5FB6D922A0D44E22C07E93B9E8A). Hash `A0F95FBA548F4EA6F5536CE564922EC39B9ECE691CF3F01FF8733B7A93223F19` | | AutoLP code (bind later, not env-required for create) | **11613** | Store tx [`84A8501C…`](https://finder.terraclassic.community/columbus-5/tx/84A8501C35A20A40F490479350E9270E4FC3AA1492EE6C5DB7BD6D870B44A95C) | | CMM compare (`ContractInfo.admin`) | `terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2` | Same CMM as factory treasury / wrap custody. Banner if admin ≠ this after launcher-stamped instantiate | | UST1 invoice token | `terra1f0eqgy9w7e5e7up97vjudqwx38tesf8ylx75x2lv3nwm0clry0pqmgfy72` | `VITE_UST1_TOKEN_ADDRESS` | | Factory | `terra1ejpgvv7g3hj0u6fpcnxhflqp84g0w3cnaskqkg5733ygwlmf963sfchsea` | `GetWhitelistedCodeIds` includes 11611 (tx [`241FE20E…`](https://finder.terraclassic.community/columbus-5/tx/241FE20E7649738DF8E34B778AE171E803C2962C1FC556242DFC1CE0A53CB30E) height 30071160) | | Router | `terra1e7s0h9ftxakwca5gxspyt4haeuaqxds6swr08ul3tsepq7el924sprrsrw` | For #595 pay-with-any-token, not for assembling Swap ops on Create/Manage | Do not hardcode a LocalTerra store id. Confused-deputy: manage UI must require LCD `code_id == 11611`, not 10184/8266/6036.
PlasticDigits commented 2026-08-23 04:19:25 +00:00 (Migrated from gitlab.com)

Launcher address (columbus-5)

VITE_COMMUNITY_TOKEN_LAUNCHER=terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz

Env Value
VITE_COMMUNITY_TAX_CODE_ID 11611
VITE_COMMUNITY_TOKEN_LAUNCHER terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz
CMM admin compare terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2

Instantiate tx F7FCF13FB59148832AFA717FE3889830C19ACA33B18BFFB0122FB237BBDC2317 height 30071219. LCD ContractInfo: code 11612, admin = CMM. Unset → page unavailable still applies until Coolify ships these.

## Launcher address (columbus-5) `VITE_COMMUNITY_TOKEN_LAUNCHER=terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz` | Env | Value | |-----|--------| | `VITE_COMMUNITY_TAX_CODE_ID` | **11611** | | `VITE_COMMUNITY_TOKEN_LAUNCHER` | `terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz` | | CMM admin compare | `terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2` | Instantiate tx [`F7FCF13FB59148832AFA717FE3889830C19ACA33B18BFFB0122FB237BBDC2317`](https://finder.terraclassic.community/columbus-5/tx/F7FCF13FB59148832AFA717FE3889830C19ACA33B18BFFB0122FB237BBDC2317) height **30071219**. LCD `ContractInfo`: code **11612**, admin = CMM. Unset → page unavailable still applies until Coolify ships these.
PlasticDigits commented 2026-08-23 04:21:51 +00:00 (Migrated from gitlab.com)

mentioned in commit 4ed227a4b1

mentioned in commit 4ed227a4b162f0942f97b1bf9138ea7b56c453ad
PlasticDigits commented 2026-08-23 04:45:15 +00:00 (Migrated from gitlab.com)

mentioned in commit 6916d274b8

mentioned in commit 6916d274b8bf16265b2d4be34333524430f263a5
PlasticDigits commented 2026-08-23 04:45:17 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1120

mentioned in merge request !1120
PlasticDigits commented 2026-08-23 04:55:32 +00:00 (Migrated from gitlab.com)

mentioned in commit 5acbe574f5

mentioned in commit 5acbe574f5a241570adfd0ef1894e7aa9705d0e4
PlasticDigits commented 2026-08-23 04:55:40 +00:00 (Migrated from gitlab.com)

mentioned in commit e2b098ab72

mentioned in commit e2b098ab72e3552d89339f475624610730fafd38
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-23 04:55:41 +00:00
PlasticDigits commented 2026-08-23 04:56:10 +00:00 (Migrated from gitlab.com)

!1120 merge note (conflicts + AC)

!1120 is merged. Conflicts vs main (#601) were resolved by keeping the #601 free-profile launcher (execute_create_free + FreeProfileOnly, CMM-admin + GetLauncherOrigin test) and adding #593/#594 verify targets/docs. Did not wait for CI (ci_quota / pipeline failed on the MR head).

Automated AC re-run after the merge commit (5acbe574):

  • make verify-issue-593 — PASS (5/5): Vitest 105, PayWithAnyToken import (no router fork), extra-debit Max, C593 docs, CreateToken execute exists
  • cargo test -p cl8y-community-token-launcher — PASS (3/3), including create_free_profile_via_execute_stamps_cmm_admin

Still open (not merge blockers — do not reopen this issue):

  1. Coolify frontend bake: VITE_COMMUNITY_TAX_CODE_ID=11611, VITE_COMMUNITY_TOKEN_LAUNCHER=terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz. Unset → Create Token stays hidden (C593-1).
  2. Columbus-5 launcher 11612 predates ExecuteMsg::CreateToken. Free create on mainnet will fail until migrate/re-store (C593-12 / O601-3). Paid SKU Receive still works on current 11612.
  3. LocalTerra: redeploy in-repo launcher, then manual free create + paid SKU + Manage Save (Simulated Wallet). Not run in this merge.
  4. /create is copy-address only (no #542 query prefill) — confirm in that LocalTerra pass.

Tracking: follow-up issue after this comment.

## !1120 merge note (conflicts + AC) [ !1120 ](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/merge_requests/402) is merged. Conflicts vs `main` (#601) were resolved by **keeping the #601 free-profile launcher** (`execute_create_free` + `FreeProfileOnly`, CMM-admin + `GetLauncherOrigin` test) and adding #593/#594 verify targets/docs. Did **not** wait for CI (`ci_quota` / pipeline failed on the MR head). **Automated AC re-run after the merge commit (`5acbe574`):** - `make verify-issue-593` — PASS (5/5): Vitest 105, PayWithAnyToken import (no router fork), extra-debit Max, C593 docs, `CreateToken` execute exists - `cargo test -p cl8y-community-token-launcher` — PASS (3/3), including `create_free_profile_via_execute_stamps_cmm_admin` **Still open (not merge blockers — do not reopen this issue):** 1. Coolify frontend bake: `VITE_COMMUNITY_TAX_CODE_ID=11611`, `VITE_COMMUNITY_TOKEN_LAUNCHER=terra1af9xm63mev4hnf4z0nmmcsnd9f4lpac2vs205rmaeg3kdqlqudhq894lyz`. Unset → Create Token stays hidden (**C593-1**). 2. Columbus-5 launcher **11612** predates `ExecuteMsg::CreateToken`. Free create on mainnet will fail until migrate/re-store (**C593-12** / **O601-3**). Paid SKU `Receive` still works on current 11612. 3. LocalTerra: redeploy in-repo launcher, then manual free create + paid SKU + Manage Save (Simulated Wallet). Not run in this merge. 4. `/create` is copy-address only (no #542 query prefill) — confirm in that LocalTerra pass. Tracking: follow-up issue after this comment.
PlasticDigits commented 2026-08-23 04:56:22 +00:00 (Migrated from gitlab.com)

mentioned in issue #602

mentioned in issue #602
PlasticDigits commented 2026-08-23 04:56:22 +00:00 (Migrated from gitlab.com)

marked as related to #602

marked as related to #602
PlasticDigits commented 2026-08-23 04:56:27 +00:00 (Migrated from gitlab.com)

Post-merge leftovers tracked in #602 (do not reopen this issue).

Post-merge leftovers tracked in #602 (do not reopen this issue).
PlasticDigits commented 2026-08-23 04:56:35 +00:00 (Migrated from gitlab.com)

Post-merge leftovers tracked in #602 (do not reopen this issue).

Post-merge leftovers tracked in #602 (do not reopen this issue).
PlasticDigits commented 2026-08-23 06:10:00 +00:00 (Migrated from gitlab.com)

mentioned in commit 84049b10eb

mentioned in commit 84049b10eb5573be5a26aef91e9bfc6d1ef2506a
PlasticDigits commented 2026-08-23 06:26:36 +00:00 (Migrated from gitlab.com)

mentioned in issue #558

mentioned in issue #558
PlasticDigits commented 2026-08-23 06:30:41 +00:00 (Migrated from gitlab.com)

mentioned in issue #603

mentioned in issue #603
PlasticDigits commented 2026-08-23 06:30:42 +00:00 (Migrated from gitlab.com)

marked as related to #603

marked as related to #603
PlasticDigits commented 2026-08-23 06:48:17 +00:00 (Migrated from gitlab.com)

mentioned in issue #604

mentioned in issue #604
PlasticDigits commented 2026-08-23 06:48:19 +00:00 (Migrated from gitlab.com)

marked as related to #604

marked as related to #604
PlasticDigits commented 2026-08-23 06:48:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #605

mentioned in issue #605
PlasticDigits commented 2026-08-23 06:48:29 +00:00 (Migrated from gitlab.com)

marked as related to #605

marked as related to #605
PlasticDigits commented 2026-08-23 11:49:45 +00:00 (Migrated from gitlab.com)

mentioned in issue #606

mentioned in issue #606
PlasticDigits commented 2026-08-23 11:49:46 +00:00 (Migrated from gitlab.com)

marked as related to #606

marked as related to #606
PlasticDigits commented 2026-08-23 11:49:55 +00:00 (Migrated from gitlab.com)

mentioned in issue #609

mentioned in issue #609
PlasticDigits commented 2026-08-23 11:49:56 +00:00 (Migrated from gitlab.com)

marked as related to #609

marked as related to #609
PlasticDigits commented 2026-08-23 11:50:08 +00:00 (Migrated from gitlab.com)

Audit INTERNAL_KIMIK3_1787468843 — H-6 buy-side quote (note only)

On-chain pair→EOA Transfer is Buy by design (T592-7, 11611 REPORT B6): limit maker payouts and refunds of the tax token take buy tax. Do not file that as a contract bug.

dApp gap: useCommunityTaxSellBps / C593-9 only size sell extra-debit. Swap You Receive and Trade buy still use pair Simulation / simulate_swap_operations, which do not model the outbound split. Users see a quote they will not receive.

Please treat buy-side TaxPreview (or equivalent) on Swap + Trade receive as a follow-up on this issue — no new ticket. No PoC in the audit for this half.

## Audit INTERNAL_KIMIK3_1787468843 — H-6 buy-side quote (note only) On-chain pair→EOA Transfer is **Buy** by design (**T592-7**, 11611 REPORT B6): limit maker payouts and refunds of the tax token take buy tax. **Do not file that as a contract bug.** dApp gap: `useCommunityTaxSellBps` / C593-9 only size **sell** extra-debit. Swap You Receive and Trade buy still use pair `Simulation` / `simulate_swap_operations`, which do not model the outbound split. Users see a quote they will not receive. Please treat buy-side `TaxPreview` (or equivalent) on Swap + Trade receive as a follow-up on this issue — no new ticket. No PoC in the audit for this half.
PlasticDigits commented 2026-08-24 05:54:14 +00:00 (Migrated from gitlab.com)

mentioned in issue #622

mentioned in issue #622
PlasticDigits commented 2026-08-24 05:54:17 +00:00 (Migrated from gitlab.com)

marked as related to #622

marked as related to #622
PlasticDigits commented 2026-08-24 11:49:44 +00:00 (Migrated from gitlab.com)

mentioned in issue #626

mentioned in issue #626
PlasticDigits commented 2026-08-24 11:49:46 +00:00 (Migrated from gitlab.com)

marked as related to #626

marked as related to #626
PlasticDigits commented 2026-08-25 02:04:15 +00:00 (Migrated from gitlab.com)

mentioned in issue #633

mentioned in issue #633
PlasticDigits commented 2026-08-25 02:08:33 +00:00 (Migrated from gitlab.com)

mentioned in issue #634

mentioned in issue #634
PlasticDigits commented 2026-08-25 02:23:35 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1137

mentioned in merge request !1137
PlasticDigits commented 2026-08-26 04:19:23 +00:00 (Migrated from gitlab.com)

mentioned in issue #669

mentioned in issue #669
PlasticDigits commented 2026-08-26 04:19:24 +00:00 (Migrated from gitlab.com)

marked as related to #669

marked as related to #669
PlasticDigits commented 2026-08-26 04:20:43 +00:00 (Migrated from gitlab.com)

mentioned in issue #670

mentioned in issue #670
PlasticDigits commented 2026-08-26 04:20:44 +00:00 (Migrated from gitlab.com)

marked as related to #670

marked as related to #670
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#593
No description provided.