feat(create-token): identity validation (decimals 6–18, alphanumeric name/symbol) and connected-wallet treasury/manager #604

Closed
opened 2026-08-23 06:48:16 +00:00 by PlasticDigits · 22 comments
PlasticDigits commented 2026-08-23 06:48:16 +00:00 (Migrated from gitlab.com)

Create Token dApp #593 · on-chain template #592 · store/list #601 · sibling SKU-init + percent taxes (follow-up, same epic). Design-only in-place migrate #603 — do not ship a /token/migrate importer in this ticket.

The live retail wizard is /token/create. There is no /token/migrate route. Identity rules here apply to launcher instantiate; if #603 later allows migrate-adopt, reuse the same decimals / name / symbol checks (do not rewrite TOKEN_INFO on adopt).


Current codebase

Retail create lives on CreateTokenPage.tsx (/token/create). Manager console is ManageTokenPage.tsx.

Field UI today Contract today
Decimals Integer accepted if 0 ≤ n ≤ 18 (decimalsOk). Default "6". No min-6. No inline error. instantiate: if msg.decimals > MAX_DECIMALS (18) → DecimalsCap. 0–5 is allowed.
Name Trim length 1–50. Any charset (spaces, unicode, punctuation). Passed through to cw20_base instantiate. No community-tax charset check.
Symbol UI ^[A-Za-z0-9]{1,12}$, then .toUpperCase(). 1–2 char symbols pass the UI. Relies on cw20-base (typically 3–12 alphanumeric). Short / punctuated names can fail only after broadcast.
Treasury / manager Empty inputs. Placeholder is the connected address (manager) or terra1… (treasury). Submit uses manager.trim() || address and treasury.trim() || managerAddr — silent fallback, no helper text. Disconnect → “Connect wallet to create”; fields still look blank.

Factory pair bootstrap already rejects asset CW20s with decimals > 18 (#124, MAX_PAIR_ASSET_DECIMALS_BOOTSTRAP). Sub-6 community tokens are still instantiable and then confuse human-scale Swap / Trade / tape math.

Launcher CreateTokenMsg forwards name / symbol / decimals unchanged. Columbus-5 listed token wasm is 11611; instantiate checks only apply to new instantiates from whichever token_code_id the launcher points at.


Why this is needed

Retail creators copy tickers from other chains (9 / 18 dp, emoji names, TOKEN-V2). The dApp currently allows 0 decimals and non-alphanumeric names, and only caps decimals at 18 on-chain. CLI / LCD users can bypass the UI entirely.

Treasury and manager defaulting “in submit math” but not in the inputs is a footgun: users think the fields are required-empty, or they paste a wrong address without seeing whether it is their wallet. Helper copy must say connected wallet vs not connected wallet.


Constraints / guardrails

  1. Charset — name and symbol are ^[A-Za-z0-9]+$ only (no spaces, hyphen, unicode, punctuation). Symbol still uppercased on submit. Preserve name case.
  2. Length — align with cw20-base so the UI cannot look valid then revert: name 3–50, symbol 3–12. Reject 1–2 char symbols in the UI and in community-tax instantiate (do not wait for cw20-base).
  3. Decimals — integer 6 ≤ decimals ≤ 18. Default 6. Reject 5, 19, 6.5, empty, NaN. New contract error should name the range (not only max).
  4. On-chain is the source of truth — UI validation is not enough. community-tax-token::instantiate must reject out-of-range decimals and bad name/symbol before cw20_base::instantiate. Launcher may fail-fast with the same checks; token instantiate revert already rolls back the UST1 forward.
  5. Do not migrate live 11611 tokens just to add instantiate checks. Existing tokens keep their metadata. New wasm → launcher UpdateConfig { token_code_id } → #589 REPORT GO → factory AddWhitelistedCodeId. Keep 11611 listed for existing pairs (F6). Do not whitelist launcher / AutoLP code ids (O601-2).
  6. Frontend may ship first as a client gate; CLI bypass remains until the new token code_id is live. Document that gap in the skill until ops catch up.
  7. Treasury / manager — autoset to the connected wallet when connected and the field is empty. Do not overwrite a different address the user typed. Helper exactly: connected wallet if value === connected address (bech32-normalized); else not connected wallet. Disconnect → helper not connected wallet; submit still gated (C593). User may still set a different valid terra1… (not forced to self).
  8. Wasm admin stays CMM (T592-5). Autofill manager ≠ making the user contract admin.
  9. No /token/migrate page in this issue. Reuse validators if #603 later adds a form.
  10. Keep C593-1–C593-13, I595 pay card, C593-12 free create. No innerHTML of chain strings; isValidTerraBech32Address on addresses.

Relevant files

Path Role
frontend-dapp/src/pages/CreateTokenPage.tsx Name / symbol / decimals / treasury / manager
frontend-dapp/src/pages/CreateTokenPage.test.tsx Vitest
frontend-dapp/src/utils/communityTaxSku.ts Shared parsers (add identity helpers here or a sibling util)
smartcontracts/contracts/community-tax-token/src/msg.rs MAX_DECIMALS; add MIN_DECIMALS = 6
smartcontracts/contracts/community-tax-token/src/contract.rs instantiate
smartcontracts/contracts/community-tax-token/src/error.rs DecimalsCap
smartcontracts/contracts/community-tax-token/src/multitest.rs Crate tests
smartcontracts/contracts/community-token-launcher/src/contract.rs Optional fail-fast
docs/frontend.md § Create Token New C593 rows
docs/contracts-terraclassic.md § Community tax CW20 Instantiate rules
skills/AGENTS_FRONTEND_CREATE_TOKEN.md · skills/AGENTS_COMMUNITY_TAX_CW20.md Playbooks

  1. Shared validators used by the page and hook builders (buildCreateTokenHook / buildFreeCreateTokenMsg) so paid and free create cannot encode illegal metadata.
  2. Contract: MIN_DECIMALS = 6, MAX_DECIMALS = 18; validate_identity(name, symbol, decimals) before cw20-base init. Errors: decimals range, InvalidName, InvalidSymbol.
  3. UI: inline errors under each field; disable Create / Pay until valid + ack + wallet.
  4. On wallet connect: if treasury/manager empty, set to address. Helper line under each input (data-testid for tests).
  5. Ops follow-up (can be the same MR’s docs, not necessarily Coolify in this ticket): new token code_id + launcher pointer + #589 + whitelist. LocalTerra store is enough to prove instantiate rejects.

Acceptance criteria

  • UI + contract reject decimals < 6 and > 18 (including 0, 5, 19).
  • UI + contract accept 6 and 18.
  • UI + contract reject name/symbol with space, hyphen, unicode, punctuation; accept A-Za-z0-9 within length bounds (name 3–50, symbol 3–12).
  • Symbol still submitted uppercase; name case preserved.
  • 1–2 character name or symbol cannot look valid in the UI; contract also rejects.
  • Connected: treasury and manager inputs show the connected address (not only submit fallback); helper connected wallet.
  • User pastes another valid address → helper not connected wallet; that address is what instantiate uses.
  • Disconnected: helper not connected wallet; no create CTA (C593).
  • Connecting does not overwrite a non-empty different address the user already typed.
  • Free create and paid SKU invoice hooks both carry the validated fields.
  • Docs + skills updated (new invariants). make verify-issue-593 stays green; new make verify-issue-<iid> added.
  • Columbus-5: document that 11611 does not gain these instantiate checks until launcher token_code_id rotates (no silent mainnet store in this ticket unless ops is in-scope).

Test plan (all paths)

ID Path Expect
P1 Decimals 6, 18 Instantiate / UI submit OK
P2 Decimals 0, 5, 19, 6.5, "", -1 UI error; contract instantiate revert
P3 Name Demo, symbol DEMO OK
P4 Name My Token, Demo!, 🚀, empty, ab (len 2) Reject
P5 Symbol DE-MO, demo_1, D, TOOLONGSYMBOLX Reject
P6 Symbol demo Accept in UI; hook DEMO
P7 Connect wallet, empty treasury/manager Both filled; helper connected wallet
P8 Change treasury to another terra1… Helper not connected wallet; hook uses paste
P9 Disconnect after fill Helper not connected wallet; CTA hidden
P10 Connect after user typed other addr Do not clobber
P11 Free create (0 SKU) vs paid create Same identity encoding
P12 LCD/CLI instantiate with decimals: 0 or name "x y" against new wasm Revert (not only UI)
P13 Existing 11611 token queries Unchanged metadata; no migrate required

Attack / abuse test plan

ID Vector Expect
A1 Craft launcher create_token JSON with decimals: 0 or 2 (UI bypass) Token instantiate revert; UST1 invoice not kept
A2 Name/symbol with RTL / zero-width / homoglyph / newline Reject (non [A-Za-z0-9])
A3 Very long name (&gt;50) / symbol (&gt;12) Reject (gas/UI spam)
A4 decimals: 255 (u8 max) Revert (&gt;18)
A5 HTML/script in name Charset reject; never innerHTML
A6 Autoset overwritten by ?manager= / ?treasury= query Ignore query (C593-10 / I595-10)
A7 Autofill a contract address as manager without showing not-connected Allowed if valid bech32, but helper not connected wallet; no wasm-admin change
A8 Spoof connect then swap wallet before sign Hook must use addresses in the signed msg; helper follows current session
A9 Rogue instantiate with --admin not CMM Still uncatalogued (O601-4); identity checks still apply
A10 Rotate launcher to new code_id without factory whitelist New creates cannot list pairs until #589 GO + AddWhitelistedCodeId — document; do not skip GO

Verification criteria

make verify-issue-593
# after impl:
make verify-issue-<this-iid>
cd smartcontracts && cargo test -p cl8y-community-tax-token -p cl8y-community-token-launcher
bash scripts/with-node.sh --cwd frontend-dapp -- npm test -- --run \
  src/pages/CreateTokenPage.test.tsx \
  src/utils/communityTaxSku.test.ts \
  src/utils/communityTaxInvoice.test.ts
  • Contract tests cover decimals 5 / 6 / 18 / 19 and bad name/symbol.
  • Vitest covers helpers + connected vs not-connected copy (data-testid).
  • Skills list the new identity invariants; docs/frontend.md / docs/contracts-terraclassic.md match.
  • No git commit --no-verify. No 8654 whitelist. No /token/migrate importer.
## Parent / related Create Token dApp [#593](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/593) · on-chain template [#592](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/592) · store/list [#601](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/601) · sibling SKU-init + percent taxes (follow-up, same epic). Design-only in-place migrate [#603](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/603) — **do not** ship a `/token/migrate` importer in this ticket. The live retail wizard is **`/token/create`**. There is no `/token/migrate` route. Identity rules here apply to launcher instantiate; if #603 later allows migrate-adopt, reuse the same decimals / name / symbol checks (do not rewrite `TOKEN_INFO` on adopt). --- ## Current codebase Retail create lives on [`CreateTokenPage.tsx`](frontend-dapp/src/pages/CreateTokenPage.tsx) (`/token/create`). Manager console is [`ManageTokenPage.tsx`](frontend-dapp/src/pages/ManageTokenPage.tsx). | Field | UI today | Contract today | |-------|----------|----------------| | **Decimals** | Integer accepted if `0 ≤ n ≤ 18` (`decimalsOk`). Default `"6"`. No min-6. No inline error. | [`instantiate`](smartcontracts/contracts/community-tax-token/src/contract.rs): `if msg.decimals > MAX_DECIMALS` (`18`) → `DecimalsCap`. **0–5 is allowed.** | | **Name** | Trim length 1–50. **Any charset** (spaces, unicode, punctuation). | Passed through to `cw20_base` instantiate. No community-tax charset check. | | **Symbol** | UI `^[A-Za-z0-9]{1,12}$`, then `.toUpperCase()`. 1–2 char symbols pass the UI. | Relies on `cw20-base` (typically **3–12** alphanumeric). Short / punctuated names can fail only after broadcast. | | **Treasury / manager** | Empty inputs. Placeholder is the connected address (manager) or `terra1…` (treasury). Submit uses `manager.trim() \|\| address` and `treasury.trim() \|\| managerAddr` — **silent fallback**, no helper text. Disconnect → “Connect wallet to create”; fields still look blank. | Factory pair bootstrap already rejects asset CW20s with `decimals > 18` ([#124](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/124), `MAX_PAIR_ASSET_DECIMALS_BOOTSTRAP`). Sub-6 community tokens are still instantiable and then confuse human-scale Swap / Trade / tape math. Launcher [`CreateTokenMsg`](smartcontracts/contracts/community-token-launcher/src/msg.rs) forwards `name` / `symbol` / `decimals` unchanged. Columbus-5 listed token wasm is **11611**; instantiate checks only apply to **new** instantiates from whichever `token_code_id` the launcher points at. --- ## Why this is needed Retail creators copy tickers from other chains (9 / 18 dp, emoji names, `TOKEN-V2`). The dApp currently allows **0 decimals** and **non-alphanumeric names**, and only caps decimals at 18 on-chain. CLI / LCD users can bypass the UI entirely. Treasury and manager defaulting “in submit math” but not in the inputs is a footgun: users think the fields are required-empty, or they paste a wrong address without seeing whether it is **their** wallet. Helper copy must say **connected wallet** vs **not connected wallet**. --- ## Constraints / guardrails 1. **Charset** — `name` and `symbol` are **`^[A-Za-z0-9]+$` only** (no spaces, hyphen, unicode, punctuation). Symbol still uppercased on submit. Preserve name case. 2. **Length** — align with `cw20-base` so the UI cannot look valid then revert: **name 3–50**, **symbol 3–12**. Reject 1–2 char symbols in the UI **and** in community-tax `instantiate` (do not wait for cw20-base). 3. **Decimals** — integer **`6 ≤ decimals ≤ 18`**. Default **6**. Reject `5`, `19`, `6.5`, empty, `NaN`. New contract error should name the range (not only max). 4. **On-chain is the source of truth** — UI validation is not enough. `community-tax-token::instantiate` must reject out-of-range decimals and bad name/symbol **before** `cw20_base::instantiate`. Launcher may fail-fast with the same checks; token instantiate revert already rolls back the UST1 forward. 5. **Do not migrate live 11611 tokens** just to add instantiate checks. Existing tokens keep their metadata. New wasm → launcher `UpdateConfig { token_code_id }` → [#589](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/589) REPORT **GO** → factory `AddWhitelistedCodeId`. Keep 11611 listed for existing pairs (**F6**). Do not whitelist launcher / AutoLP code ids (**O601-2**). 6. **Frontend may ship first** as a client gate; CLI bypass remains until the new token code_id is live. Document that gap in the skill until ops catch up. 7. **Treasury / manager** — autoset to the **connected** wallet when connected and the field is empty. Do **not** overwrite a different address the user typed. Helper **exactly**: `connected wallet` if `value === connected address` (bech32-normalized); else `not connected wallet`. Disconnect → helper `not connected wallet`; submit still gated (**C593**). User may still set a **different** valid `terra1…` (not forced to self). 8. **Wasm admin stays CMM** (**T592-5**). Autofill manager ≠ making the user contract admin. 9. **No `/token/migrate` page** in this issue. Reuse validators if #603 later adds a form. 10. Keep **C593-1–C593-13**, **I595** pay card, **C593-12** free create. No innerHTML of chain strings; `isValidTerraBech32Address` on addresses. --- ## Relevant files | Path | Role | |------|------| | [`frontend-dapp/src/pages/CreateTokenPage.tsx`](frontend-dapp/src/pages/CreateTokenPage.tsx) | Name / symbol / decimals / treasury / manager | | [`frontend-dapp/src/pages/CreateTokenPage.test.tsx`](frontend-dapp/src/pages/CreateTokenPage.test.tsx) | Vitest | | [`frontend-dapp/src/utils/communityTaxSku.ts`](frontend-dapp/src/utils/communityTaxSku.ts) | Shared parsers (add identity helpers here or a sibling util) | | [`smartcontracts/contracts/community-tax-token/src/msg.rs`](smartcontracts/contracts/community-tax-token/src/msg.rs) | `MAX_DECIMALS`; add `MIN_DECIMALS = 6` | | [`smartcontracts/contracts/community-tax-token/src/contract.rs`](smartcontracts/contracts/community-tax-token/src/contract.rs) | `instantiate` | | [`smartcontracts/contracts/community-tax-token/src/error.rs`](smartcontracts/contracts/community-tax-token/src/error.rs) | `DecimalsCap` | | [`smartcontracts/contracts/community-tax-token/src/multitest.rs`](smartcontracts/contracts/community-tax-token/src/multitest.rs) | Crate tests | | [`smartcontracts/contracts/community-token-launcher/src/contract.rs`](smartcontracts/contracts/community-token-launcher/src/contract.rs) | Optional fail-fast | | [`docs/frontend.md`](docs/frontend.md) § Create Token | New **C593** rows | | [`docs/contracts-terraclassic.md`](docs/contracts-terraclassic.md) § Community tax CW20 | Instantiate rules | | [`skills/AGENTS_FRONTEND_CREATE_TOKEN.md`](skills/AGENTS_FRONTEND_CREATE_TOKEN.md) · [`skills/AGENTS_COMMUNITY_TAX_CW20.md`](skills/AGENTS_COMMUNITY_TAX_CW20.md) | Playbooks | --- ## Recommended direction 1. Shared validators used by the page **and** hook builders (`buildCreateTokenHook` / `buildFreeCreateTokenMsg`) so paid and free create cannot encode illegal metadata. 2. Contract: `MIN_DECIMALS = 6`, `MAX_DECIMALS = 18`; `validate_identity(name, symbol, decimals)` before cw20-base init. Errors: decimals range, `InvalidName`, `InvalidSymbol`. 3. UI: inline errors under each field; disable Create / Pay until valid + ack + wallet. 4. On wallet connect: if treasury/manager empty, set to `address`. Helper line under each input (`data-testid` for tests). 5. Ops follow-up (can be the same MR’s docs, not necessarily Coolify in this ticket): new token code_id + launcher pointer + #589 + whitelist. LocalTerra store is enough to prove instantiate rejects. --- ## Acceptance criteria - [ ] UI + contract reject decimals **&lt; 6** and **&gt; 18** (including `0`, `5`, `19`). - [ ] UI + contract accept **6** and **18**. - [ ] UI + contract reject name/symbol with space, hyphen, unicode, punctuation; accept `A-Za-z0-9` within length bounds (name 3–50, symbol 3–12). - [ ] Symbol still submitted uppercase; name case preserved. - [ ] 1–2 character name or symbol cannot look valid in the UI; contract also rejects. - [ ] Connected: treasury and manager inputs **show** the connected address (not only submit fallback); helper **connected wallet**. - [ ] User pastes another valid address → helper **not connected wallet**; that address is what instantiate uses. - [ ] Disconnected: helper **not connected wallet**; no create CTA (**C593**). - [ ] Connecting does not overwrite a non-empty different address the user already typed. - [ ] Free create and paid SKU invoice hooks both carry the validated fields. - [ ] Docs + skills updated (new invariants). `make verify-issue-593` stays green; new `make verify-issue-<iid>` added. - [ ] Columbus-5: document that 11611 does not gain these instantiate checks until launcher `token_code_id` rotates (no silent mainnet store in this ticket unless ops is in-scope). --- ## Test plan (all paths) | ID | Path | Expect | |----|------|--------| | **P1** | Decimals `6`, `18` | Instantiate / UI submit OK | | **P2** | Decimals `0`, `5`, `19`, `6.5`, `""`, `-1` | UI error; contract `instantiate` revert | | **P3** | Name `Demo`, symbol `DEMO` | OK | | **P4** | Name `My Token`, `Demo!`, `🚀`, empty, `ab` (len 2) | Reject | | **P5** | Symbol `DE-MO`, `demo_1`, `D`, `TOOLONGSYMBOLX` | Reject | | **P6** | Symbol `demo` | Accept in UI; hook `DEMO` | | **P7** | Connect wallet, empty treasury/manager | Both filled; helper connected wallet | | **P8** | Change treasury to another `terra1…` | Helper not connected wallet; hook uses paste | | **P9** | Disconnect after fill | Helper not connected wallet; CTA hidden | | **P10** | Connect after user typed other addr | Do not clobber | | **P11** | Free create (0 SKU) vs paid create | Same identity encoding | | **P12** | LCD/CLI instantiate with `decimals: 0` or name `"x y"` against **new** wasm | Revert (not only UI) | | **P13** | Existing 11611 token queries | Unchanged metadata; no migrate required | --- ## Attack / abuse test plan | ID | Vector | Expect | |----|--------|--------| | **A1** | Craft launcher `create_token` JSON with `decimals: 0` or `2` (UI bypass) | Token instantiate revert; UST1 invoice not kept | | **A2** | Name/symbol with RTL / zero-width / homoglyph / newline | Reject (non `[A-Za-z0-9]`) | | **A3** | Very long name (`&gt;50`) / symbol (`&gt;12`) | Reject (gas/UI spam) | | **A4** | `decimals: 255` (`u8` max) | Revert (`&gt;18`) | | **A5** | HTML/script in name | Charset reject; never `innerHTML` | | **A6** | Autoset overwritten by `?manager=` / `?treasury=` query | **Ignore query** (**C593-10** / **I595-10**) | | **A7** | Autofill a **contract** address as manager without showing not-connected | Allowed if valid bech32, but helper **not connected wallet**; no wasm-admin change | | **A8** | Spoof connect then swap wallet before sign | Hook must use addresses in the **signed** msg; helper follows current session | | **A9** | Rogue instantiate with `--admin` not CMM | Still uncatalogued (**O601-4**); identity checks still apply | | **A10** | Rotate launcher to new code_id without factory whitelist | New creates cannot list pairs until #589 GO + `AddWhitelistedCodeId` — document; do not skip GO | --- ## Verification criteria ```bash make verify-issue-593 # after impl: make verify-issue-<this-iid> cd smartcontracts && cargo test -p cl8y-community-tax-token -p cl8y-community-token-launcher bash scripts/with-node.sh --cwd frontend-dapp -- npm test -- --run \ src/pages/CreateTokenPage.test.tsx \ src/utils/communityTaxSku.test.ts \ src/utils/communityTaxInvoice.test.ts ``` - [ ] Contract tests cover decimals 5 / 6 / 18 / 19 and bad name/symbol. - [ ] Vitest covers helpers + connected vs not-connected copy (`data-testid`). - [ ] Skills list the new identity invariants; `docs/frontend.md` / `docs/contracts-terraclassic.md` match. - [ ] No `git commit --no-verify`. No 8654 whitelist. No `/token/migrate` importer.
PlasticDigits commented 2026-08-23 06:48:18 +00:00 (Migrated from gitlab.com)

marked as related to #592

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

marked as related to #593

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

marked as related to #601

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

marked as related to #603

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

marked as related to #605

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

Sibling implementation (SKU init + percent tax UX, not bps): #605

Sibling implementation (SKU init + percent tax UX, not bps): #605
PlasticDigits commented 2026-08-23 06:48:40 +00:00 (Migrated from gitlab.com)

mentioned in issue #605

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

mentioned in merge request !1121

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

mentioned in issue #608

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

mentioned in commit fe47dd8c60

mentioned in commit fe47dd8c60132caf0241258a1bb67e9845eb8833
PlasticDigits commented 2026-08-23 11:52:15 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1122

mentioned in merge request !1122
PlasticDigits commented 2026-08-23 11:52:35 +00:00 (Migrated from gitlab.com)

Implemented in !1122 (issue/604-605-create-token-identity-sku).

Acceptance

  • UI + contract reject decimals < 6 and > 18 (including 0, 5, 19)
  • UI + contract accept 6 and 18
  • UI + contract reject name/symbol with space, hyphen, unicode, punctuation; accept A-Za-z0-9 (name 3–50, symbol 3–12)
  • Symbol submitted uppercase; name case preserved
  • 1–2 character name/symbol cannot look valid in the UI; contract also rejects
  • Connected: treasury/manager show the connected address; helper connected wallet
  • Pasted other valid address → helper not connected wallet; that address is what instantiate uses
  • Disconnected: helper not connected wallet; no create CTA
  • Connecting does not overwrite a non-empty different address
  • Free create and paid SKU hooks both carry the validated fields
  • Docs + skills (C604-1–C604-3). make verify-issue-593 green; make verify-issue-604 added
  • Columbus-5 11611 gap documented (no silent mainnet store)

Verification

  • Contract tests cover decimals 5 / 6 / 18 / 19 and bad name/symbol
  • Vitest covers helpers + connected vs not-connected copy (data-testid)
  • Skills + docs/frontend.md / docs/contracts-terraclassic.md match
  • No git commit --no-verify. No 8654 whitelist. No /token/migrate importer

Not in this ticket (as specified)

  • Live 11611 is unchanged until launcher token_code_id rotates after #589 GO + AddWhitelistedCodeId
  • LCD/CLI instantiate against new wasm (P12) needs a LocalTerra store of this branch's wasm — reviewer item on !1122
  • Existing 11611 query/metadata (P13) is unchanged by design (no migrate)
Implemented in !1122 (`issue/604-605-create-token-identity-sku`). ## Acceptance - [x] UI + contract reject decimals < 6 and > 18 (including 0, 5, 19) - [x] UI + contract accept 6 and 18 - [x] UI + contract reject name/symbol with space, hyphen, unicode, punctuation; accept `A-Za-z0-9` (name 3–50, symbol 3–12) - [x] Symbol submitted uppercase; name case preserved - [x] 1–2 character name/symbol cannot look valid in the UI; contract also rejects - [x] Connected: treasury/manager show the connected address; helper `connected wallet` - [x] Pasted other valid address → helper `not connected wallet`; that address is what instantiate uses - [x] Disconnected: helper `not connected wallet`; no create CTA - [x] Connecting does not overwrite a non-empty different address - [x] Free create and paid SKU hooks both carry the validated fields - [x] Docs + skills (`C604-1–C604-3`). `make verify-issue-593` green; `make verify-issue-604` added - [x] Columbus-5 11611 gap documented (no silent mainnet store) ## Verification - [x] Contract tests cover decimals 5 / 6 / 18 / 19 and bad name/symbol - [x] Vitest covers helpers + connected vs not-connected copy (`data-testid`) - [x] Skills + `docs/frontend.md` / `docs/contracts-terraclassic.md` match - [x] No `git commit --no-verify`. No 8654 whitelist. No `/token/migrate` importer ## Not in this ticket (as specified) - Live 11611 is unchanged until launcher `token_code_id` rotates after #589 GO + `AddWhitelistedCodeId` - LCD/CLI instantiate against **new** wasm (P12) needs a LocalTerra store of this branch's wasm — reviewer item on !1122 - Existing 11611 query/metadata (P13) is unchanged by design (no migrate)
PlasticDigits commented 2026-08-23 12:32:53 +00:00 (Migrated from gitlab.com)

mentioned in commit 715d9555bd

mentioned in commit 715d9555bd01f1007f37a459bd255e0c9916afbb
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-23 12:32:53 +00:00
PlasticDigits commented 2026-08-23 12:34:08 +00:00 (Migrated from gitlab.com)

mentioned in commit 33e4153f87

mentioned in commit 33e4153f87ef075614781734950f0cfa211695c2
PlasticDigits commented 2026-08-23 12:40:59 +00:00 (Migrated from gitlab.com)

mentioned in issue #611

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

marked as related to #611

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

Merge !1122 — in-repo #604 acceptance passed (make verify-issue-604 / make verify-issue-593 green). Combined with #605 on the same MR.

Non-blocking: Create exempt-list UI validates bech32 only; protocol addresses still fail at instantiate (ProtocolExemptNotAllowed). Connect-after-typed-address (P10) is covered at util level, not a page integration test.

On-chain enforcement is not live until launcher token_code_id rotates. Tracked in #611 (store → #589 GO → whitelist; keep 11611 listed).

**Merge !1122** — in-repo #604 acceptance passed (`make verify-issue-604` / `make verify-issue-593` green). Combined with #605 on the same MR. **Non-blocking:** Create exempt-list UI validates bech32 only; protocol addresses still fail at instantiate (`ProtocolExemptNotAllowed`). Connect-after-typed-address (P10) is covered at util level, not a page integration test. **On-chain enforcement is not live** until launcher `token_code_id` rotates. Tracked in #611 (store → #589 GO → whitelist; keep 11611 listed).
PlasticDigits commented 2026-08-23 13:05:31 +00:00 (Migrated from gitlab.com)

mentioned in issue #612

mentioned in issue #612
PlasticDigits commented 2026-08-24 11:45:21 +00:00 (Migrated from gitlab.com)

mentioned in issue #603

mentioned in issue #603
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-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
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#604
No description provided.