ux: /token/migrate lead must explain why — Unlock {X} CL8Y features #670
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#670
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
/token/migratenever tells a token admin why they would adopt the CL8Y community-tax template. The only always-on lead is “Move an existing token onto this template. Address stays the same.” That is a mechanics sentence, not a reason.Community report (anonymized, 2026-08): the migrate page should sell the unlock — Unlock {X} features for your token on CL8Y Dex by migrating today — then a second paragraph with a few high-value examples of what they gain.
This is retail copy only. Adopt execute, allowlist, invoices, pair inventory, and Terraport/GDEX gates stay unchanged (M626, M634).
Related (do not regress): #626 free adopt + LP gate, #634 venue inventory, #593 Create/Manage, #606 Enable Feature, #489 copy load, #592 on-chain SKUs. Do not fold Create Token layout (#669) or Manage density into this MR.
Current codebase
Page chrome today
MigrateTokenPage.tsx(data-testid="migrate-token-page") renders:That is the entire why. After Load, the confirm card only adds LP / pause / wipe facts from
communityTaxMigrate.ts:MIGRATE_LP_CONFIRM— address stays; CL8Y pairs pause until governance refresh; Terraport/GDEX keep the tokenMIGRATE_LP_CONFIRM_WIPE— same + leftover tax maps are clearedNo mention of buy/sell tax, SKUs, Manage, or Enable Feature.
Playbook
AGENTS_FRONTEND_TOKEN_MIGRATE.mdanddocs/frontend.md§ Create Token M626 currently require title + one lead sentence and forbid env / 50 UST1 / cw2 essays. This issue amends that lead to two short paragraphs (headline + examples). It does not reopen a protocol essay.Create Token (
CreateTokenPage.tsx) already lists the 7 paid SKUs and links Migrate here →/token/migrate. The migrate page does not reuse that catalog.Official feature inventory (count this)
On-chain
Features/ dAppCOMMUNITY_TAX_SKUSincommunityTaxSku.tsandstate.rs:mint_controlFeatures::from_skus(&[])andmint_revokedif the source had a minter (adopt.rs).transfer_taxsplit_routerauto_v2_lpexemption_directoryvariable_rateslaunch_guardsCanonical headline X = 7 = 1 built-in listed-pair buy/sell tax + 6 SKUs with
createOnly === false.Derive in code so a future SKU cannot drift:
1 + COMMUNITY_TAX_SKUS.filter((s) => !s.createOnly).lengthDo not advertise Minting in X. Do not invent extra “features” (catalog listing, extra-debit Max, router hops, manager console) just to inflate the number — those are how the template works, not additional SKUs.
What migrate actually turns on
Adopt is access, not auto-enable:
GetMigrateOriginis written.FEATURESstarts empty. Manager later pays 50 UST1 per SKU on Manage → Enable Feature (T606, #606).Tests / docs today
MigrateTokenPage.test.tsxasserts heading +/move an existing token onto this template/i. That regex must change with the new lead.communityTaxSku.test.tslocks MintingcreateOnlyand the 7 labels — reuse for the derived count.make verify-issue-626/634do not assert why-copy.QA_TEMPLATE.mdhas no migrate why-copy row.Why this is needed
Token admins reach
/token/migratefrom More or Create Token Migrate here. They already have a live CW20 (10184 / 8266 / 6036 / 8654). The page must answer “why bother?” in one screen: keep the same address and gain the CL8Y template’s feature set.Without that, adopt looks like a scary wasm swap (pause, refresh, wipe) with no upside. That is how people bounce before Load.
Constraints / guardrails
/token/migrate. No wasm, indexer, allowlist, or invoice changes. Adopt payload stays honest tax-off / wipe leftover (M626-8). Do not send SKUs inMigrateMsg.migrateUnlockFeatureCount()) fromCOMMUNITY_TAX_SKUS+ built-in buy/sell. Tests lock the current value 7.enable_feature/ SKU JSON keys on the card (#489 / M626-9). Optional human hint: they can turn features on later from Manage — one short clause max.MIGRATE_LP_CONFIRM/_WIPE, pause-until-governance, Terraport/GDEX 1:1, and “address stays the same” stay on the confirm/success path. The new lead replaces the mechanics-only subtitle; the confirm card still owns LP facts.sku.label), nevermint_control.migrate-token-unavailable). Query params still do not prefill (M626-2 / M634-7).card-glassfeature grid. Plain<p>/ short list inside the existing header block.*-neo.e2e-tx. Playwright workers stay 5. On-chain adopt stays existing #626 / #634 specs.Relevant files
Primary
frontend-dapp/src/pages/MigrateTokenPage.tsx— header leadfrontend-dapp/src/utils/communityTaxSku.ts— catalog +createOnly(source of X)frontend-dapp/src/utils/communityTaxMigrate.ts— or a smallcommunityTaxMigrateCopy.tsfor the two paragraphs + derived countfrontend-dapp/src/pages/MigrateTokenPage.test.tsx— replace old lead regexfrontend-dapp/src/utils/communityTaxSku.test.ts— lock count helper if added hereDocs / skills (this issue owns the M626 “one lead sentence” amendment)
skills/AGENTS_FRONTEND_TOKEN_MIGRATE.mddocs/frontend.md§ Create Token M626skills/AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.md— note this page is the documented exception (two short why-paragraphs)QA_TEMPLATE.md— add a migrate why-copy rowRead, do not fork
frontend-dapp/src/pages/CreateTokenPage.tsx(SKU labels + Migrate here)frontend-dapp/src/pages/ManageTokenPage.tsx(Enable Feature)smartcontracts/contracts/community-tax-token/src/adopt.rs(emptyFEATURES)skills/AGENTS_FRONTEND_CREATE_TOKEN.md/AGENTS_COMMUNITY_TAX_ENABLE_FEATURE.mdRecommended direction
Bundle in one MR: (1) derived count, (2) headline, (3) examples paragraph, (4) tests + docs. Do not split.
A — Copy module
Export from
communityTaxMigrate.ts(orcommunityTaxMigrateCopy.ts):migrateUnlockFeatureCount()→1 + COMMUNITY_TAX_SKUS.filter((s) => !s.createOnly).length(today 7)MIGRATE_WHY_HEADLINE— exact:Unlock ${n} features for your token on CL8Y Dex by migrating todayMIGRATE_WHY_EXAMPLES— one short paragraph (or a 3–5 item list) using retail labels. Suggested high-value set:Keep “Address stays the same” on the confirm card (already there). Optional second sentence in the examples paragraph: the address does not change. Do not repeat the full LP/pause essay in the header.
B — Page
Replace the current single
<p>under the heading with two nodes (data-testid="migrate-token-why"+migrate-token-why-examples"). Unavailable stub stays as-is.C — Docs
Change M626 “title + one lead sentence” to: title + why headline (
Unlock {X}…) + one examples paragraph. Still no env / 50 UST1 / cw2 on the card.D — Out of scope
Acceptance criteria
/token/migrateheader (not the unavailable stub) shows Unlock 7 features for your token on CL8Y Dex by migrating today (X from the helper; today 7).VITE_*, code ids, cw2, orenable_featureon the card.MIGRATE_LP_CONFIRM/_WIPEand inventory (M634) unchanged. Address-stays-the-same remains visible on confirm.COMMUNITY_TAX_SKUS+ built-in buy/sell; unit test locks current 7 andmint_controlexcluded.QA_TEMPLATE.mdrow added.make verify-issue-626/634stay green.Test plan (all paths)
Unit (
MigrateTokenPage.test.tsx+ copy helper)Keep P0 unavailable, A9 query-ignore, P6 wipe CTA, Open/ALPHA inventory. Replace the old lead assertion.
migrate-token-why(or role/text) matching/Unlock 7 features for your token on CL8Y Dex by migrating today/i.migrate-token-why-examplesmentions at least buy/sell (or “listed” pair tax), Auto liquidity, and Launch guards (or Extra exemptions / Split treasury). Must not match/Minting/ias an unlock.VITE_COMMUNITY_MIGRATE_CODE_IDS,allowlisted CW20,50 UST1,enable_feature,11619,cw2.migrate-token-unavailableonly; no Unlock headline (do not tease a dead page).?payee=/?manager=/?token=/?addr=/?pair=still do not prefill; why copy still shows.migrate-token-confirmstill has LP/pause (and wipe whentax_map); CTA still Migrate (free).migrateUnlockFeatureCount() === 7; equals1 + COMMUNITY_TAX_SKUS.filter((s) => !s.createOnly).length;mint_controliscreateOnly.Vitest (must stay green)
Plus
make verify-issue-626andmake verify-issue-634.Playwright (
e2e-smoke, 5 workers)If a migrate smoke spec exists, extend it; otherwise add a short configured-page smoke (not
e2e-tx):/token/migratewith community-tax env on.scrollWidthoverflow; no nested cards.Manual
Test plan (attack, hack, and abuse)
Copy sits above a wasm migrate + UpdateAdmin CTA. Treat it as a trust-boundary surface.
queryByText(/Minting/i)null.?payee=retarget. Page still has noPayWithAnyToken. Query payee/manager still ignored.dangerouslySetInnerHTMLon LCD name/symbol. Token probe still text.8or includecreateOnlySKUs. If a SKU is added, X updates with the catalog — test the formula, not only the literal 7 in three files.features: [...]in the adopt builder.z-indexstays below Connect / Legal / WalletConnect. No overlay that covers the Load/Migrate buttons with a fake “unlock” control.tabindexskip of confirm.Verification criteria
Done when:
/token/migrate: Unlock 7 headline + examples paragraph; Minting absent; confirm LP copy intact; light + dark.MigrateTokenPage.test.tsxcovers why + unavailable + query-ignore + confirm unchanged.mint_control.make verify-issue-626andmake verify-issue-634green. Noe2e-txrequired.marked as related to #626
marked as related to #634
marked as related to #593
marked as related to #606
marked as related to #489
mentioned in commit
a364ea3ce2mentioned in merge request !1168
Implementation is in !1168 (
feat/670-migrate-why).Configured
/token/migratenow shows derived Unlock 7 + examples (no Minting, no auto-enable claim).make verify-issue-670/626/634passed in the worktree; Playwright smoke used skip-chain. Manual light/dark and post-adopt Manage empty-SKU check remain for QA.mentioned in commit
82d57dbe88mentioned in commit
2e920d29fdMerged to
mainvia !1168.Leftover:
/token/migrateunlock copy still uses the derived feature count after frontend rebuild.make verify-issue-670.mentioned in issue #673