feat(voting): indexer registration + CL8Y CW20 balance ledger for registered wallets (no archive LCD) #509

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

Summary

Add an offchain CL8Y (hpax3) voter registration + balance ledger in the indexer/Postgres stack so snapshot vote power can be computed without an archive LCD.

CL8Y token (same as fee-discount cl8y_token):
terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3 (18 decimals). LocalTerra uses TCL8Y via VITE_CL8Y_TOKEN_ADDRESS.

Product flow (this issue owns the data plane):

  1. Wallet registers by signing a message (signature persistence owned by operator-voting — linked issue).
  2. At registration, indexer (or registration worker) records LCD live CL8Y Balance + current block height (no historical/archive query).
  3. Indexer then indexes only CW20 CL8Y transfer / send / mint-burn (if any) events to/from registered wallets, maintaining a running balance and height-addressable history for those wallets.
  4. Later proposals freeze vote power from this ledger at a chosen height (proposal/vote product — linked issues).

Depends on / pairs with:

  • operator-voting package (signatures + restricted balance reads)
  • Frontend registration / proposal / vote UI

Current codebase

Area Status
CL8Y address wiring frontend-dapp/src/utils/constants.ts (VITE_CL8Y_TOKEN_ADDRESS / hpax3 fallback), scripts/lib/mainnet-soft-launch-defaults.sh (MAINNET_CL8Y_TOKEN_ADDRESS), fee-discount cl8y_token
Live CW20 balance query Frontend getTokenBalance in frontend-dapp/src/services/terraclassic/queries.ts; fee-discount contract also queries Cw20QueryMsg::Balance on register / GetDiscount
Indexer LCD smart query indexer/src/lcd/mod.rs query_contract; uses token_info / fee-discount registration — no CW20 Balance helper, no x-cosmos-block-height archive queries
Block height get_latest_block_height / get_block_at_height for indexing/reorg only
Wasm event parsing indexer/src/indexer/parser.rs — DEX swaps, limits, hooks, fee-discount registry; does not index CW20 Transfer/Send for arbitrary tokens
Postgres Migrations under indexer/migrations/ — assets, traders, trader_positions, pair_reserves, etc. No holder/balance/transfer tables. trader_positions are explicitly not on-chain balances (docs/indexer-invariants.md)
Fee-discount registry Tracks wallet → tier, not balances; incomplete electorate for voting
Wallet arbitrary sign Absent (tx sign only) — registration signature lands in operator-voting

Why this is needed

Community / operator snapshot voting needs height-frozen CL8Y vote power without operating an archive node. Enumerating all CL8Y holders on mainnet LCD is slow/unreliable. Opt-in registration + transfer tracking for the registered set gives a closed electorate with balances reconstructible at proposal heights from Postgres alone after registration.

Same CL8Y that gates fee-discount tiers should gate voting weight for consistency.


Constraints / guardrails

  1. No new smart contracts. Frontend + Postgres + indexer (+ operator-voting) only.
  2. No archive LCD requirement. Registration balance = live LCD at registration processing time + that block height. Historical power afterward comes from the transfer ledger, not x-cosmos-block-height.
  3. Track transfers only for registered wallets (from/to ∈ registered set) for the configured CL8Y CW20 address — not the full token holder universe.
  4. Token address must be configurable (CL8Y_TOKEN_ADDRESS / reuse fee-discount config / VITE_CL8Y_TOKEN_ADDRESS parity on LocalTerra TCL8Y).
  5. Use 18-decimal semantics; store raw integer amounts as strings or NUMERIC without float drift.
  6. Scope wasm events by runtime _contract_address (indexer invariant #285) — only trust CL8Y contract emissions.
  7. Handle CW20 transfer, send, and any mint/burn actions the deployed code ID emits; ignore unrelated wasm.
  8. Reorg safety: follow existing indexer reorg / indexer_state.last_indexed_height patterns; balances must be correct after reorg unwind/replay for registered wallets.
  9. Registration is a prerequisite before a wallet can appear in proposal snapshots; unregistered wallets have no vote power even if they hold CL8Y.
  10. Do not use fee-discount traders.tier_id or trader_positions as vote weight.
  11. Indexer DB role used by the indexer may write ledger tables; operator-voting must only read balances (restricted role/views) — see linked package issue.
  12. Flash-loan / last-second transfer risk: document that vote power follows the ledger at snapshot height (same class of risk as fee-discount point-in-time balance; registration does not add time-weighting unless product later asks).

Relevant files

Indexer / DB

  • indexer/migrations/ (new migration(s))
  • indexer/src/indexer/parser.rs, block_indexer.rs, poller.rs, mod.rs
  • indexer/src/lcd/mod.rs, lcd/types.rs
  • indexer/src/db/queries/, db/mod.rs
  • indexer/src/config.rs, startup.rs, main.rs
  • indexer/src/indexer/trader_tracker.rs (pattern for fee-discount events — do not overload)
  • docs/indexer-invariants.md

CL8Y / balance references

  • frontend-dapp/src/utils/constants.ts, tokenRegistry.ts
  • frontend-dapp/src/services/terraclassic/queries.ts
  • scripts/lib/mainnet-soft-launch-defaults.sh
  • docs/reference/fee-discount-tiers.md
  • smartcontracts/contracts/fee-discount/ (balance query semantics reference only — no contract changes)

Deploy

  • docker/indexer/Dockerfile, Coolify indexer env examples under deployments/

Schema (illustrative)

  • voting_registrations — wallet_address, registered_at_height, registered_at_time, initial_balance, status, optional link to signature id owned by operator-voting
  • cl8y_cw20_transfers — height, tx hash, from, to, amount, action, only rows involving ≥1 registered wallet + CL8Y contract
  • cl8y_balances or height-addressable checkpoints — running balance per registered wallet after each affecting transfer; enough to answer balance(wallet, height) for height >= registered_at_height (0 or null before registration)

Registration ingest

  1. operator-voting verifies ADR-36 (or chosen) signature and inserts/requests registration.
  2. Indexer worker (or synchronous path with clear ownership) at current LCD height:
    • {"balance":{"address":...}} on CL8Y CW20
    • persist initial_balance + height
  3. From registered_at_height forward, transfer parser updates that wallet’s ledger.

Transfer indexing

  • In parser.rs (or dedicated module): when _contract_address == CL8Y_TOKEN and action ∈ {transfer, send, …}, if from or to is registered, append transfer + update balances.
  • Maintain in-memory or DB set of registered addresses for cheap filtering.

Balance-at-height API surface for operator-voting

  • Prefer Postgres views / read-only functions such as voting_cl8y_balance_at(wallet, height) granted only to the operator_voting DB role — no broad table write grants.

LocalTerra

  • Use TCL8Y from deploy; transfer tests via mint + CW20 transfer between test wallets.

Acceptance criteria

  • New migration(s) create registration + CL8Y transfer/balance ledger tables (or equivalent) with indexes for (wallet, height).
  • Configured CL8Y token address is required/validated at indexer startup when voting ledger feature is enabled.
  • Registering a wallet (after valid signature handoff) stores live LCD balance + current block height; no archive header used.
  • Subsequent CL8Y transfers to/from that wallet update the ledger; unrelated wallets’ CL8Y transfers are not stored (except as counterparty on a registered leg).
  • balance(wallet, H) for H >= registered_at_height matches LCD live balance after replaying transfers up to H (property/integration tested on LocalTerra).
  • Wallets not registered have no ledger rows / zero vote-eligible balance.
  • Reorg / failed-block paths do not leave durable incorrect balances for registered wallets.
  • Docs/invariants updated for the new ledger; Coolify/env knobs documented.
  • No CosmWasm contract changes.

Test plan (all paths)

  1. Unit — parser: CL8Y transfer/send fixtures with _contract_address; registered vs unregistered from/to; forged contract_address without underscore ignored (#285).
  2. Unit — balance math: sequential transfers produce correct running balances; self-transfer no-op or correct; amount parsing 18-dec strings.
  3. Integration — registration: mock/live LCD balance at height N; row inserted with matching amount/height.
  4. Integration — transfer follow: register A; transfer A→B (B unregistered): A decreases, B not tracked as voter; register B later with new LCD snapshot (does not backfill pre-registration history unless explicitly designed — document choice: no backfill).
  5. Integration — balance at height: after transfers at H1,H2,H3, query at H2 returns post-H2 balance.
  6. LocalTerra: mint TCL8Y, register via API path, transfer, assert ledger vs LCD.
  7. Reorg: simulate rewind of last N blocks; balances restored.
  8. Config: wrong/missing token address fails closed when feature enabled.
  9. Regression: existing swap/limit/hook parsing tests still pass.

Test plan — attack, hack & abuse vectors

  1. Unregistered flood: spam CL8Y transfers among unregistered wallets — indexer must not grow unbounded transfer rows for them.
  2. Registration griefing: rapid re-register / duplicate register — idempotent per wallet; no double initial credit.
  3. Counterparty dust: registered wallet receives many tiny transfers — performance/rate of ledger writes acceptable; no precision loss.
  4. Event spoofing: wasm attrs with fake contract_address (no underscore) claiming CL8Y transfer — must not credit.
  5. Wrong token: transfers on non-CL8Y CW20 must not affect ledger even if registered wallet participates.
  6. Reorg double-apply: ensure transfers not double-counted after replay.
  7. LCD lag at registration: if height/balance race, document fail-closed retry; never invent balances.
  8. Snapshot tip-over: transfer in same block as proposal snapshot height — define inclusive block ordering consistent with indexer tx order; test boundary.
  9. Flash move before proposal: large CL8Y into registered wallet just before snapshot — by design counted; document (not a bug unless product adds lockup later).

Verification criteria

  • cargo test for indexer units covering parser + balance helpers.
  • Indexer integration test (Postgres) for register → transfer → balance_at (LocalTerra or fixtures).
  • Manual/scripted LocalTerra check: LCD balance equals ledger tip for a registered wallet after several transfers.
  • Confirm no use of x-cosmos-block-height in the registration/ledger path.
  • Coolify/staging: migration applies on indexer boot; feature flag/env documented.
  • Cross-check linked operator-voting issue can read balances via restricted DB role only.

Labels

indexer backend enhancement architecture security

Priority

P1

## Summary Add an **offchain CL8Y (hpax3) voter registration + balance ledger** in the indexer/Postgres stack so snapshot vote power can be computed **without an archive LCD**. **CL8Y token (same as fee-discount `cl8y_token`):** `terra16wtml2q66g82fdkx66tap0qjkahqwp4lwq3ngtygacg5q0kzycgqvhpax3` (18 decimals). LocalTerra uses TCL8Y via `VITE_CL8Y_TOKEN_ADDRESS`. **Product flow (this issue owns the data plane):** 1. Wallet **registers** by signing a message (signature persistence owned by `operator-voting` — linked issue). 2. At registration, indexer (or registration worker) records **LCD live** CL8Y `Balance` + **current block height** (no historical/archive query). 3. Indexer then indexes **only** CW20 CL8Y `transfer` / `send` / mint-burn (if any) events **to/from registered wallets**, maintaining a running balance and height-addressable history for those wallets. 4. Later proposals freeze vote power from this ledger at a chosen height (proposal/vote product — linked issues). Depends on / pairs with: - `operator-voting` package (signatures + restricted balance reads) - Frontend registration / proposal / vote UI --- ## Current codebase | Area | Status | |------|--------| | CL8Y address wiring | `frontend-dapp/src/utils/constants.ts` (`VITE_CL8Y_TOKEN_ADDRESS` / hpax3 fallback), `scripts/lib/mainnet-soft-launch-defaults.sh` (`MAINNET_CL8Y_TOKEN_ADDRESS`), fee-discount `cl8y_token` | | Live CW20 balance query | Frontend `getTokenBalance` in `frontend-dapp/src/services/terraclassic/queries.ts`; fee-discount contract also queries `Cw20QueryMsg::Balance` on register / `GetDiscount` | | Indexer LCD smart query | `indexer/src/lcd/mod.rs` `query_contract`; uses `token_info` / fee-discount registration — **no** CW20 `Balance` helper, **no** `x-cosmos-block-height` archive queries | | Block height | `get_latest_block_height` / `get_block_at_height` for indexing/reorg only | | Wasm event parsing | `indexer/src/indexer/parser.rs` — DEX swaps, limits, hooks, fee-discount registry; **does not** index CW20 Transfer/Send for arbitrary tokens | | Postgres | Migrations under `indexer/migrations/` — `assets`, `traders`, `trader_positions`, `pair_reserves`, etc. **No** holder/balance/transfer tables. `trader_positions` are explicitly **not** on-chain balances (`docs/indexer-invariants.md`) | | Fee-discount registry | Tracks wallet → tier, not balances; incomplete electorate for voting | | Wallet arbitrary sign | **Absent** (tx sign only) — registration signature lands in `operator-voting` | --- ## Why this is needed Community / operator snapshot voting needs **height-frozen CL8Y vote power** without operating an archive node. Enumerating all CL8Y holders on mainnet LCD is slow/unreliable. Opt-in registration + transfer tracking for the registered set gives a closed electorate with balances reconstructible at proposal heights from Postgres alone after registration. Same CL8Y that gates fee-discount tiers should gate voting weight for consistency. --- ## Constraints / guardrails 1. **No new smart contracts.** Frontend + Postgres + indexer (+ `operator-voting`) only. 2. **No archive LCD requirement.** Registration balance = live LCD at registration processing time + that block height. Historical power afterward comes from the transfer ledger, not `x-cosmos-block-height`. 3. **Track transfers only for registered wallets** (from/to ∈ registered set) for the configured CL8Y CW20 address — not the full token holder universe. 4. Token address must be **configurable** (`CL8Y_TOKEN_ADDRESS` / reuse fee-discount config / `VITE_CL8Y_TOKEN_ADDRESS` parity on LocalTerra TCL8Y). 5. Use **18-decimal** semantics; store raw integer amounts as strings or `NUMERIC` without float drift. 6. Scope wasm events by runtime `_contract_address` (indexer invariant #285) — only trust CL8Y contract emissions. 7. Handle CW20 `transfer`, `send`, and any mint/burn actions the deployed code ID emits; ignore unrelated wasm. 8. Reorg safety: follow existing indexer reorg / `indexer_state.last_indexed_height` patterns; balances must be correct after reorg unwind/replay for registered wallets. 9. Registration is a **prerequisite** before a wallet can appear in proposal snapshots; unregistered wallets have no vote power even if they hold CL8Y. 10. Do **not** use fee-discount `traders.tier_id` or `trader_positions` as vote weight. 11. Indexer DB role used by the indexer may write ledger tables; `operator-voting` must only **read** balances (restricted role/views) — see linked package issue. 12. Flash-loan / last-second transfer risk: document that vote power follows the ledger at snapshot height (same class of risk as fee-discount point-in-time balance; registration does not add time-weighting unless product later asks). --- ## Relevant files **Indexer / DB** - `indexer/migrations/` (new migration(s)) - `indexer/src/indexer/parser.rs`, `block_indexer.rs`, `poller.rs`, `mod.rs` - `indexer/src/lcd/mod.rs`, `lcd/types.rs` - `indexer/src/db/queries/`, `db/mod.rs` - `indexer/src/config.rs`, `startup.rs`, `main.rs` - `indexer/src/indexer/trader_tracker.rs` (pattern for fee-discount events — do not overload) - `docs/indexer-invariants.md` **CL8Y / balance references** - `frontend-dapp/src/utils/constants.ts`, `tokenRegistry.ts` - `frontend-dapp/src/services/terraclassic/queries.ts` - `scripts/lib/mainnet-soft-launch-defaults.sh` - `docs/reference/fee-discount-tiers.md` - `smartcontracts/contracts/fee-discount/` (balance query semantics reference only — no contract changes) **Deploy** - `docker/indexer/Dockerfile`, Coolify indexer env examples under `deployments/` --- ## Recommended direction ### Schema (illustrative) - `voting_registrations` — `wallet_address`, `registered_at_height`, `registered_at_time`, `initial_balance`, `status`, optional link to signature id owned by `operator-voting` - `cl8y_cw20_transfers` — height, tx hash, from, to, amount, action, only rows involving ≥1 registered wallet + CL8Y contract - `cl8y_balances` or height-addressable checkpoints — running balance per registered wallet after each affecting transfer; enough to answer `balance(wallet, height)` for `height >= registered_at_height` (0 or null before registration) ### Registration ingest 1. `operator-voting` verifies ADR-36 (or chosen) signature and inserts/requests registration. 2. Indexer worker (or synchronous path with clear ownership) at **current** LCD height: - `{"balance":{"address":...}}` on CL8Y CW20 - persist `initial_balance` + height 3. From `registered_at_height` forward, transfer parser updates that wallet’s ledger. ### Transfer indexing - In `parser.rs` (or dedicated module): when `_contract_address == CL8Y_TOKEN` and action ∈ {transfer, send, …}, if `from` or `to` is registered, append transfer + update balances. - Maintain in-memory or DB set of registered addresses for cheap filtering. ### Balance-at-height API surface for `operator-voting` - Prefer **Postgres views / read-only functions** such as `voting_cl8y_balance_at(wallet, height)` granted only to the `operator_voting` DB role — no broad table write grants. ### LocalTerra - Use TCL8Y from deploy; transfer tests via mint + CW20 transfer between test wallets. --- ## Acceptance criteria - [ ] New migration(s) create registration + CL8Y transfer/balance ledger tables (or equivalent) with indexes for `(wallet, height)`. - [ ] Configured CL8Y token address is required/validated at indexer startup when voting ledger feature is enabled. - [ ] Registering a wallet (after valid signature handoff) stores live LCD balance + current block height; no archive header used. - [ ] Subsequent CL8Y transfers to/from that wallet update the ledger; unrelated wallets’ CL8Y transfers are not stored (except as counterparty on a registered leg). - [ ] `balance(wallet, H)` for `H >= registered_at_height` matches LCD live balance after replaying transfers up to H (property/integration tested on LocalTerra). - [ ] Wallets not registered have no ledger rows / zero vote-eligible balance. - [ ] Reorg / failed-block paths do not leave durable incorrect balances for registered wallets. - [ ] Docs/invariants updated for the new ledger; Coolify/env knobs documented. - [ ] No CosmWasm contract changes. --- ## Test plan (all paths) 1. **Unit — parser:** CL8Y transfer/send fixtures with `_contract_address`; registered vs unregistered from/to; forged `contract_address` without underscore ignored (#285). 2. **Unit — balance math:** sequential transfers produce correct running balances; self-transfer no-op or correct; amount parsing 18-dec strings. 3. **Integration — registration:** mock/live LCD balance at height N; row inserted with matching amount/height. 4. **Integration — transfer follow:** register A; transfer A→B (B unregistered): A decreases, B not tracked as voter; register B later with new LCD snapshot (does not backfill pre-registration history unless explicitly designed — document choice: **no backfill**). 5. **Integration — balance at height:** after transfers at H1,H2,H3, query at H2 returns post-H2 balance. 6. **LocalTerra:** mint TCL8Y, register via API path, transfer, assert ledger vs LCD. 7. **Reorg:** simulate rewind of last N blocks; balances restored. 8. **Config:** wrong/missing token address fails closed when feature enabled. 9. **Regression:** existing swap/limit/hook parsing tests still pass. --- ## Test plan — attack, hack & abuse vectors 1. **Unregistered flood:** spam CL8Y transfers among unregistered wallets — indexer must not grow unbounded transfer rows for them. 2. **Registration griefing:** rapid re-register / duplicate register — idempotent per wallet; no double initial credit. 3. **Counterparty dust:** registered wallet receives many tiny transfers — performance/rate of ledger writes acceptable; no precision loss. 4. **Event spoofing:** wasm attrs with fake `contract_address` (no underscore) claiming CL8Y transfer — must not credit. 5. **Wrong token:** transfers on non-CL8Y CW20 must not affect ledger even if registered wallet participates. 6. **Reorg double-apply:** ensure transfers not double-counted after replay. 7. **LCD lag at registration:** if height/balance race, document fail-closed retry; never invent balances. 8. **Snapshot tip-over:** transfer in same block as proposal snapshot height — define inclusive block ordering consistent with indexer tx order; test boundary. 9. **Flash move before proposal:** large CL8Y into registered wallet just before snapshot — by design counted; document (not a bug unless product adds lockup later). --- ## Verification criteria - [ ] `cargo test` for indexer units covering parser + balance helpers. - [ ] Indexer integration test (Postgres) for register → transfer → `balance_at` (LocalTerra or fixtures). - [ ] Manual/scripted LocalTerra check: LCD balance equals ledger tip for a registered wallet after several transfers. - [ ] Confirm no use of `x-cosmos-block-height` in the registration/ledger path. - [ ] Coolify/staging: migration applies on indexer boot; feature flag/env documented. - [ ] Cross-check linked `operator-voting` issue can read balances via restricted DB role only. ## Labels `indexer` `backend` `enhancement` `architecture` `security` ## Priority P1
PlasticDigits commented 2026-08-09 08:26:05 +00:00 (Migrated from gitlab.com)

Offchain CL8Y snapshot voting (no contracts, no archive LCD):

Issue Role
#509 (this) Indexer/Postgres registration + CL8Y transfer ledger for registered wallets
#510 operator-voting package — restricted DB, signatures, proposals, votes, blacklist env
#511 Frontend register / WYSIWYG propose / vote UX

Suggested order: #509 → #510 → #511 (UI can stub #510 with MSW in parallel).

## Bundle links Offchain CL8Y snapshot voting (no contracts, no archive LCD): | Issue | Role | |-------|------| | **#509** (this) | Indexer/Postgres registration + CL8Y transfer ledger for registered wallets | | **#510** | `operator-voting` package — restricted DB, signatures, proposals, votes, blacklist env | | **#511** | Frontend register / WYSIWYG propose / vote UX | **Suggested order:** #509 → #510 → #511 (UI can stub #510 with MSW in parallel).
PlasticDigits commented 2026-08-09 08:26:07 +00:00 (Migrated from gitlab.com)

mentioned in issue #510

mentioned in issue #510
PlasticDigits commented 2026-08-09 08:26:08 +00:00 (Migrated from gitlab.com)

mentioned in issue #511

mentioned in issue #511
PlasticDigits commented 2026-08-09 08:26:15 +00:00 (Migrated from gitlab.com)

marked as related to #510

marked as related to #510
PlasticDigits commented 2026-08-09 08:26:16 +00:00 (Migrated from gitlab.com)

marked as related to #511

marked as related to #511
PlasticDigits commented 2026-08-21 11:32:37 +00:00 (Migrated from gitlab.com)

mentioned in issue #588

mentioned in issue #588
PlasticDigits commented 2026-08-21 11:32:37 +00:00 (Migrated from gitlab.com)

marked as related to #588

marked as related to #588
PlasticDigits commented 2026-08-21 11:32:48 +00:00 (Migrated from gitlab.com)

Scope add: BSC BEP-20 CL8Y ledger (core)

A majority of CL8Y holders are on BSC, not Terra Classic. The registration + balance ledger in this issue must also track BEP-20 CL8Y for registered EVM wallets — same “live balance at registration + transfers forward, no archive node” model as CW20.

Canonical BEP-20: 0x8F452a1fdd388A45e1080992eFF051b4dd9048d2

Do not treat Terra CW20-only as a complete data plane. Reuse BSC_RPC_URLS transport; do not overload the Venus vFDUSD poller (#571).

Tracking issue (BSC integration): https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/588

Related Role
#509 (this) Terra CW20 and BSC BEP-20 ledgers
#510 EVM EIP-191 + dual snapshot (Terra height + BSC block)
#511 EVM wallet register / vote UX
#588 BSC integration contract / guardrails
## Scope add: BSC BEP-20 CL8Y ledger (core) A **majority of CL8Y holders are on BSC**, not Terra Classic. The registration + balance ledger in this issue must also track **BEP-20 CL8Y** for registered **EVM** wallets — same “live balance at registration + transfers forward, no archive node” model as CW20. **Canonical BEP-20:** [`0x8F452a1fdd388A45e1080992eFF051b4dd9048d2`](https://bscscan.com/token/0x8F452a1fdd388A45e1080992eFF051b4dd9048d2) Do not treat Terra CW20-only as a complete data plane. Reuse `BSC_RPC_URLS` transport; do **not** overload the Venus vFDUSD poller (#571). **Tracking issue (BSC integration):** https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/588 | Related | Role | |---------|------| | **#509** (this) | Terra CW20 **and** BSC BEP-20 ledgers | | **#510** | EVM EIP-191 + dual snapshot (Terra height + BSC block) | | **#511** | EVM wallet register / vote UX | | **#588** | BSC integration contract / guardrails |
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-25 06:07:20 +00:00
PlasticDigits commented 2026-08-25 06:08:49 +00:00 (Migrated from gitlab.com)

Voting work left this repo on 2026-08-25.

Canonical project: https://gitlab.com/PlasticDigits/voting

Former IID here New
#509 https://gitlab.com/PlasticDigits/voting/-/issues/1
#510 https://gitlab.com/PlasticDigits/voting/-/issues/2
#511 https://gitlab.com/PlasticDigits/voting/-/issues/3
#588 https://gitlab.com/PlasticDigits/voting/-/issues/4

Also opened there: Legal clickwrap (#5), wallet reuse (#6). Do not implement voting in this DEX repo.

Voting work left this repo on 2026-08-25. Canonical project: https://gitlab.com/PlasticDigits/voting | Former IID here | New | |-----------------|-----| | #509 | https://gitlab.com/PlasticDigits/voting/-/issues/1 | | #510 | https://gitlab.com/PlasticDigits/voting/-/issues/2 | | #511 | https://gitlab.com/PlasticDigits/voting/-/issues/3 | | #588 | https://gitlab.com/PlasticDigits/voting/-/issues/4 | Also opened there: Legal clickwrap (#5), wallet reuse (#6). Do not implement voting in this DEX repo.
PlasticDigits commented 2026-08-25 06:08:58 +00:00 (Migrated from gitlab.com)

mentioned in issue #637

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