feat(voting): frontend registration, WYSIWYG proposals (≥1000 CL8Y), and signed voting UX #511
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#511
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
Ship the dApp UX for offchain CL8Y snapshot voting: wallet registration (sign message), WYSIWYG proposal creation (requires ≥1000 CL8Y + signature), and voting — talking only to
operator-voting+ existing LCD/wallet stack. No smart contracts.Depends on:
operator-votingAPIs (signatures, proposals, votes, blacklist enforcement server-side)CL8Y: hpax3 /
VITE_CL8Y_TOKEN_ADDRESS(same asset as fee-discount tiers).Current codebase
frontend-dapp/src/services/terraclassic/wallet.ts— Keplr / Station / WC / Simulated WalletterraWalletSignTxRaw.ts,terraBroadcast.ts— Amino/Direct for txs onlyvite-env.d.tslackssignArbitrarygetTokenBalanceinqueries.ts; tiers UX on fee-discount pagesApp.tsx,components/common/navItems.ts— no voting routesdocs/design-system.md, skillsAGENTS_FRONTEND_DESIGN_SYSTEM.md,AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.mdVITE_OPERATOR_VOTING_URL)Why this is needed
Operators and tokenholders need a browser flow to opt into the electorate, publish human-readable proposals, and cast signed votes weighted by registered CL8Y balances — without governance multisig or on-chain poll contracts. The UI must make registration before proposal creation obvious, show eligibility (≥1000 CL8Y to propose), and fail clearly when blacklisted or unregistered.
Constraints / guardrails
operator-voting; frontend never trusts client-side blacklist alone (server enforcesVOTING_BLACKLIST_ADDRESSES).signArbitrary(ADR-36) primary; Simulated Wallet must work on LocalTerra for QA; document Station/WC support matrix (degrade gracefully if arbitrary sign unsupported).VITE_OPERATOR_VOTING_URL, existingVITE_CL8Y_TOKEN_ADDRESS; never embed DB URLs./voteor/governance(product pick — avoid clashing with on-chain “governance” multisig docs; prefer/vote).Relevant files
frontend-dapp/src/App.tsx,components/common/Layout.tsx,navItems.ts,navItems.test.tsfrontend-dapp/src/services/terraclassic/wallet.ts,terraWalletSignTxRaw.ts,queries.ts,vite-env.d.tsfrontend-dapp/src/utils/constants.ts,tokenRegistry.tsservices/operatorVoting.ts(API client + sign payload helpers)frontend-dapp/.env*, Coolify frontend env examplesAGENTS_FRONTEND_DESIGN_SYSTEM.md,AGENTS_FRONTEND_COPY_COGNITIVE_LOAD.md,AGENTS_FRONTEND_THEME_TOGGLE.mdRecommended direction
Routes
/vote— list proposals + registration CTA/vote/new— WYSIWYG create (wallet connected, ≥1000 CL8Y gate, sign + submit)/vote/:id— render proposal, snapshot info, cast vote, show resultsRegistration
signArbitraryover canonical register payload →POST /v1/register.Proposal create
Vote
QA
operator-votingand/or full stack.Acceptance criteria
VITE_OPERATOR_VOTING_URLdocumented; Coolify frontend env updated in examples.Test plan (all paths)
operator-voting.<script>/onerror=does not execute.navItemstests; basic keyboard focus on editor/actions.Test plan — attack, hack & abuse vectors
Verification criteria
make test-frontend/ targeted vitest for new modules pass.operator-voting.Labels
frontendUXenhancementsecurityproductPriority
P1
mentioned in issue #509
mentioned in issue #510
Bundle links
operator-votingAPI (frontend talks only to this + LCD/wallet)Blocked by #510 for real API; #509 required for meaningful snapshot weights.
marked as related to #509
marked as related to #510
mentioned in issue #588
marked as related to #588
Scope add: EVM wallets on
/vote(core)A majority of CL8Y holders are on BSC, not Terra Classic. The dApp must let users connect an EVM wallet (injected EIP-1193 / WalletConnect
eip155:56) and complete register → propose (≥1000 BEP-20 CL8Y) → vote withpersonal_sign.Do not ship a Keplr-only
/voteas done. Do not break Cosmos WalletConnect mobile pairing (#519 / #554 / #566). Balance reads stay on the indexer — noVITE_*BSC RPC (same hygiene as #571).Tracking issue (BSC integration): https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/588
/voteUXVoting work left this repo on 2026-08-25.
Canonical project: https://gitlab.com/PlasticDigits/voting
Also opened there: Legal clickwrap (#5), wallet reuse (#6). Do not implement voting in this DEX repo.
mentioned in issue #637