Pause + final signoff before DOUB claims and CL8Y distribution (design inventory) #55
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#55
Loading…
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
Add an onchain and/or operational pause so that, for CL8Y and DOUB issuance / distribution, the system (or key flows) cannot proceed to user-facing “money movement” until a defined final signoff (e.g. multisig / timelock / explicit contract call) is recorded.
This issue is a scope and inventory checklist — implementation design is TBD. No code in this issue.
1) Clarify what “issuance / distribution / claim” must gate (decision)
Before writing contracts, lock semantics for these distinct surfaces:
DOUB — user “claims” in-repo today
contracts/src/vesting/DoubPresaleVesting.sol—claim()startVesting(time starts but no claims) or beforestartVesting? Or both (fund →startVesting→ signoff →claimenabled)?contracts/src/TimeCurve.sol—redeemCharms()TimeCurveto buyers afterendSaleCL8Y — “distribution” in-repo (several meanings)
TimeCurve.buy→FeeRouter→ sinks (DoubLPIncentives30%, burn 40%,PodiumPool20%, team 0%,RabbitTreasury10%)buy(no routing), or only block certain sinks (e.g. LP / podium) while allowing others?TimeCurve.distributePrizes()— pays accepted asset (CL8Y) fromPodiumPoolto winnersendSale)DeployDevuses mockAction: Add an ADR or short
docs/operations/…runbook section that names the authoritative onchain “signoff” step(s) and the order of operations (e.g. fund presale contract → D-day multisig #1 →startVesting→ D-day multisig #2 → claims open).2) Smart contracts / interfaces — what likely needs design or change
DoubPresaleVesting.solonlyOwnermay callstartVestingonce;claim()is allowed oncevestingStartis set; no “pause for claims” separate from not having started.Pausableforclaimonly; (b)claimsEnabled/signoffflag with roleCL8Ygovernance / timelock; (c) split admin: “schedule start” vs “unpause claims” (two-step).contracts/test/DoubPresaleVesting.t.sol(new cases for reverts, events, invariants indocs/testing/invariants-and-business-logic.md§ DoubPresaleVesting).TimeCurve.solbuy(inbound CL8Y and routing),redeemCharms,distributePrizes, and possiblyendSale(if you want a single pre-end pause).Pausable(scope: all externals vs subset); (b) immutable “launch latch” withonlyRole/ multisig; (c) separate flags forredemptionsvspodiumPayoutvsbuysto match product.contracts/test/TimeCurve.t.sol,TimeCurveInvariant.t.sol,TimeCurveReferral.t.sol, any fork smoke.FeeRouter.sol+ sinksTimeCurvecontract, evaluate pausing at router or sink level — document tradeoffs (bypass, ordering,receivefrom other sources).RabbitTreasury.solPausablefor deposit/withdraw — unrelated unless the signoff is meant to also gate Burrow; call out explicitly if in or out of scope.tokens/Doubloon.solPARAMETERS.mdand deploy scripts.ABIs / artifacts
contracts/script/export_abi_hashes.shand any package consumers if public interfaces or events change.3) Documentation to update (when design is fixed)
contracts/PARAMETERS.md— new roles, flags, and operator checklist (mainnet TBDs).docs/testing/invariants-and-business-logic.md— new invariants, spec ↔ test map, DoubPresaleVesting and TimeCurve rows.docs/testing/strategy.md/docs/testing/ci.md— if new suites or fork flags.docs/onchain/fee-routing-and-governance.md— if governance actors / authority cross-walk changes (e.g. who can unpause, timelock).docs/product/primitives.md,docs/glossary.md,docs/product/vision.md(only if user-visible rules change).launchplan-timecurve.md— genesis order of operations, signoff checkpoints.contracts/README.md— contract table / behavior.docs/qa/YO-TimeCurve-QA-Checklist.md,docs/qa/QA-onboarding-gitlab-issue-body.md(checklist steps for new gates).docs/operations/stage2-run-log.md/docs/operations/stage3-mainnet-operator-runbook.md(if present): human steps for “final signoff”.Agent / Cursor
.cursor/skills/yieldomega-guardrails/SKILL.md— if new invariants, testing expectations, or TimeCurve/phase docs are implicated; keepdocs/frontend/timecurve-views.mdin sync if sale UX gating is affected.skills/README.md+skills/play-timecurve-doubloon/SKILL.md— participant-facing: what “not yet live / paused” means forredeemCharmsvs presale, and that rules stay onchain.4) Indexer and frontend
indexer/src/decoder.rs,indexer/src/persist.rs, integration tests — if new events, state fields, orPaused/Unpausedpatterns are introduced; updateREORGnotes if reorg tests depend on new tables.frontend/src/pages/timecurve/useTimeCurveSaleSession.ts,frontend/src/lib/abis.ts, and any redeem / prize CTAs — surface “awaiting final signoff” and failed tx copy.redeemCharmsordistributePrizesafterendSalemay need new branches.5) Scripts and deploy / CI
contracts/script/DeployDev.s.soland any mainnet/fork deploy scripts — wire roles, initial paused state, multisig.scripts/e2e-anvil.sh,docs/testing/e2e-anvil.md,scripts/start-local-anvil-stack.sh— if stack needs an extra “unpause for E2E” step.contracts/deployments/*.jsonregistries — document any new role holders.6) Suggested deliverables (for a future implementation MR)
invariants-and-business-logic.md.7) References (current code)
contracts/src/vesting/DoubPresaleVesting.sol(startVesting,claim)contracts/src/TimeCurve.sol(redeemCharms,distributePrizes,buy→ fee routing)contracts/src/sinks/DoubLPIncentives.sol(receives 30% slice per fee doc)docs/onchain/fee-routing-and-governance.md,launchplan-timecurve.mdDoubPresaleVestingUI infrontend/today — a future “claim” page would also need the same messaging.Acceptance criteria for this issue
mentioned in commit
1be556b1c4mentioned in commit
f35dcbfe3aDelivered (design + docs, issue scope)
Pushed to
main(docs-only): implements the design inventory and acceptance from issue §1–3 by adding an operator-facing runbook and cross-links so stakeholders can sign off on gated surfaces and future implementation work can be cut cleanly.What was added
claim,redeemCharms) and CL8Y (buy/fee routing,distributePrizes), proposed defaults, G1–G5 design invariants, suggested mainnet order of operations, child MR scope.#pause-and-final-signoff-design-gitlab-55in docs/testing/invariants-and-business-logic.md.Tests
FOUNDRY_PROFILE=ci forge test— 178 passed (no Solidity changes; regression check). Primary clone hadout/permission noise; run used a worktree withFOUNDRY_OUTunder/tmp.@brouie Please verify the design matches product/legal intent and that G1–G5 + gated-operation tables are the right set before cutting implementation MRs.
Checklist for verification
claimvsstartVestingtiming,redeemCharmsvs presale same switch or not,distributePrizes/buy/ fee-sink options).buy, or subset of sinks /FeeRouter, and document the chosen bypass risks.Pausablecalled out as separate from TimeCurve/vesting gates unless you want one ceremony — confirm.Issue left open per process — close when stakeholders accept gated ops + implementation issues are filed.
mentioned in commit
f2500ec53aImplementation pushed (issue #55) — @brouie please verify
Merged to
main:f2500ec— final signoff / value-movement gates for DOUB presale claims and TimeCurve post-sale + sale-time fee routing.What changed
DoubPresaleVesting:claimsEnabled(default off) andsetClaimsEnabled—claim()reverts withDoubVesting__ClaimsNotEnabledafterstartVestinguntil the owner enables. Revert order:NotStartedfirst, thenClaimsNotEnabled.TimeCurve:buyFeeRoutingEnabled(default on ininitialize),charmRedemptionEnabledandreservePodiumPayoutsEnabled(default off), each withonlyOwnersetters and events.distributePrizesonly requires the podium flag when the prize pool is non-zero (empty-pool retry behavior unchanged).DeployDev,DevStackIntegration,SimulateAnvilRichStateenable the two post-end flags afterstartSalefor local E2E.useTimeCurveSaleSessionreads the three flags;TimeCurveSimplePagedisables buy / redeem and shows copy when gates are off.docs/operations/final-signoff-and-value-movement.md,invariants-and-business-logic.md,PARAMETERS.md,skills/,.cursor/skills/yieldomega-guardrails.Checklist for verification
cd contracts && FOUNDRY_PROFILE=ci forge test— all green (182 tests at time of push).cd frontend && npm ci && npx vitest run— all green.DeployDevstack: after sale end,redeemCharms/distributePrizeswork (flags enabled in script); togglingcharmRedemptionEnabled/reservePodiumPayoutsEnabledoff reverts with the new strings.startVesting→claimreverts untilsetClaimsEnabled(true).set*in your runbook.Issue left open for stakeholder signoff as in the original inventory. Thanks!
Required follow-up (recorded for manual review)
Pause sale interactions (single switch) must include WarBow CL8Y burn paths (
warbowSteal,warbowRevenge,warbowActivateGuard) under the samebuyFeeRoutingEnabledflag asbuy→FeeRouter, so operators can halt all sale-time CL8Y movement from users in one step.CL8Y allocation (reserve / podium) remains under manual review via
reservePodiumPayoutsEnabledbeforedistributePrizespays winners fromPodiumPool(non-zero pool case);charmRedemptionEnabledgates DOUB sale allocation viaredeemCharms.Implementation to be merged with unified revert string
TimeCurve: sale interactions disabledfor buy + WarBow CL8Y actions.mentioned in commit
cf6fe19b33Update pushed:
buyFeeRoutingEnablednow gates WarBow CL8Y paths (warbowSteal,warbowRevenge,warbowActivateGuard) in addition tobuy→FeeRouter, with a single revert stringTimeCurve: sale interactions disabled.claimWarBowFlagis not gated (no CL8Y). CL8Y reserve allocation to podium winners remainsreservePodiumPayoutsEnabledbeforedistributePrizes(non-zero pool). Commit:cf6fe19.@PlasticDigits source-level verification of
f2500ec+cf6fe19. Issue stays open per your note pending stakeholder signoff and the live-stack item.Contracts (TimeCurve.sol):
Contracts (DoubPresaleVesting.sol):
Dev / Anvil scripts:
Frontend:
Tests:
8951ca7/05c7ebd)Docs:
f2500ecsister doc)Deferred to Monday (blocked by #61 live stack):
Stakeholder signoff items (not QA-actionable):
mentioned in issue #69
mentioned in issue #72
mentioned in issue #65
mentioned in issue #79
@PlasticDigits per today's process update (file follow-ups, close originals): post-end gate walkthrough items moved to #79.
Today's live verification add (in addition to Sunday's source review note above)
cast against the live local stack (
1bdbda8) to exercise the unified _requireSaleInteractionsEnabled helper fromcf6fe19:That covers the active-sale gate live. Post-end gates (charmRedemption + reservePodiumPayouts) tracked at #79 since they require an ended=true stack from anvil_rich_state.sh.
Stakeholder signoff items (per-buy CL8Y routing TBD, Rabbit Treasury Pausable ceremony, implementation child issues from pause-and-final-signoff.md) noted as not QA-actionable per your framing — should track separately if they become concrete.
Closing #55. Live walkthrough proceeds via #79.
mentioned in commit
8803428809mentioned in issue #100
mentioned in issue #116
mentioned in issue #133
mentioned in issue #141
mentioned in issue #207
mentioned in issue #217
mentioned in issue #232
mentioned in issue #264