TimeCurve: launch anchor 1.2× → 1.275× (27.5% boost) — docs, frontend, invariants #158

Closed
opened 2026-05-05 08:52:49 +00:00 by PlasticDigits · 9 comments
PlasticDigits commented 2026-05-05 08:52:49 +00:00 (Migrated from gitlab.com)

Context

Follow-up to EcoStrategy audit M-05 (launch anchor is policy/UX) and product decision: raise the launch price boost from 20% (1.2×) to 27.5% (1.275×) everywhere it is used for CL8Y-at-launch / DOUB–CL8Y LP anchor messaging and math.

New canonical multiplier: 1.275 = 27.5% above the final per-CHARM clearing price.
Implementation note (fixed-point): prefer exact integer math, e.g. clearingWad * 1275n / 1000n (verify equivalence if you simplify the fraction).

Scope

  • Update docs and all TimeCurve user-facing surfaces (Simple, Arena, stake-at-launch, protocol-related copy that references the anchor) to say 1.275× / 27.5% where the old 1.2× / 20% launch boost applied.
  • Do not change unrelated numeric 1.2 (e.g. SVG strokeWidth, chart timing, min-buy "~20%/day" envelope, unrelated tests).

Files / symbols to update (from repo search; verify with rg before merge)

Core math + tests

  • frontend/src/lib/timeCurvePodiumMath.ts — launchLiquidityAnchorWad, participantLaunchValueCl8yWei (replace 12n/10n with 1275n/1000n or agreed fixed-point)
  • frontend/src/lib/timeCurvePodiumMath.test.ts — describe + expectations

TimeCurve pages / session

  • frontend/src/pages/TimeCurveSimplePage.tsx (copy/comments; not strokeWidth literals)
  • frontend/src/pages/timeCurveArena/TimeCurveArenaView.tsx (user-facing 1.2× line)
  • frontend/src/pages/timecurve/useTimeCurveSaleSession.ts (JSDoc / comments)
  • frontend/src/pages/timecurve/TimeCurveStakeAtLaunchSection.tsx (1.2× text, badgeLabel)
  • frontend/src/pages/timecurve/TimeCurveSections.tsx — "Reserve routing and launch anchors" if it states 1.2×
  • frontend/src/index.css — comment referencing 1.2× if present

Docs + parameters

  • docs/testing/invariants-and-business-logic.md — Launch-anchor row (rename 1.2× rule → 1.275×, update formula + example e.g. 2 × 1.275 = 2.55 CL8Y)
  • docs/frontend/timecurve-views.md
  • docs/onchain/fee-routing-and-governance.md (LP 1.2× → 1.275× in DoubLPIncentives / launch anchor sentence)
  • contracts/PARAMETERS.md — Launch anchor table row
  • launchplan-timecurve.md — 1.2× in DOUB/CL8Y LP note
  • contracts/src/sinks/DoubLPIncentives.sol — NatSpec "1.2× clearing anchor"

Agent / play skills

  • .cursor/skills/yieldomega-guardrails/SKILL.md — launch-anchor bullet
  • skills/play-timecurve-doubloon/SKILL.md — launch-anchor invariant (update example math)

Optional

  • audits/audit_ecostrategy_1777969776.md — short note that product boost was raised to 1.275× after audit, or handle in a doc-only MR.

Acceptance criteria

  • Single canonical multiplier in timeCurvePodiumMath (no drift between Simple and Arena).
  • All user-visible TimeCurve copy uses 1.275× (or 27.5%) for the launch boost where applicable.
  • Invariants doc + PARAMETERS reflect 1.275× and updated worked examples.
  • Vitest updated; tests green.

References

  • Audit: audits/audit_ecostrategy_1777969776.md on main
## Context Follow-up to EcoStrategy audit **M-05** (launch anchor is policy/UX) and product decision: raise the **launch price boost** from **20% (1.2×)** to **27.5% (1.275×)** everywhere it is used for **CL8Y-at-launch / DOUB–CL8Y LP anchor** messaging and math. **New canonical multiplier:** `1.275` = **27.5%** above the final per-CHARM clearing price. **Implementation note (fixed-point):** prefer exact integer math, e.g. `clearingWad * 1275n / 1000n` (verify equivalence if you simplify the fraction). ## Scope - Update **docs** and **all TimeCurve user-facing surfaces** (Simple, Arena, stake-at-launch, protocol-related copy that references the anchor) to say **1.275×** / **27.5%** where the old **1.2×** / **20%** launch boost applied. - **Do not** change unrelated numeric `1.2` (e.g. SVG `strokeWidth`, chart timing, min-buy "~20%/day" envelope, unrelated tests). ## Files / symbols to update (from repo search; verify with rg before merge) ### Core math + tests - `frontend/src/lib/timeCurvePodiumMath.ts` — `launchLiquidityAnchorWad`, `participantLaunchValueCl8yWei` (replace `12n/10n` with `1275n/1000n` or agreed fixed-point) - `frontend/src/lib/timeCurvePodiumMath.test.ts` — describe + expectations ### TimeCurve pages / session - `frontend/src/pages/TimeCurveSimplePage.tsx` (copy/comments; not `strokeWidth` literals) - `frontend/src/pages/timeCurveArena/TimeCurveArenaView.tsx` (user-facing 1.2× line) - `frontend/src/pages/timecurve/useTimeCurveSaleSession.ts` (JSDoc / comments) - `frontend/src/pages/timecurve/TimeCurveStakeAtLaunchSection.tsx` (`1.2×` text, `badgeLabel`) - `frontend/src/pages/timecurve/TimeCurveSections.tsx` — "Reserve routing and launch anchors" if it states 1.2× - `frontend/src/index.css` — comment referencing 1.2× if present ### Docs + parameters - `docs/testing/invariants-and-business-logic.md` — Launch-anchor row (rename 1.2× rule → 1.275×, update formula + example e.g. `2 × 1.275 = 2.55` CL8Y) - `docs/frontend/timecurve-views.md` - `docs/onchain/fee-routing-and-governance.md` (LP 1.2× → 1.275× in DoubLPIncentives / launch anchor sentence) - `contracts/PARAMETERS.md` — Launch anchor table row - `launchplan-timecurve.md` — 1.2× in DOUB/CL8Y LP note - `contracts/src/sinks/DoubLPIncentives.sol` — NatSpec "1.2× clearing anchor" ### Agent / play skills - `.cursor/skills/yieldomega-guardrails/SKILL.md` — launch-anchor bullet - `skills/play-timecurve-doubloon/SKILL.md` — launch-anchor invariant (update example math) ### Optional - `audits/audit_ecostrategy_1777969776.md` — short note that product boost was raised to 1.275× after audit, or handle in a doc-only MR. ## Acceptance criteria - [ ] Single canonical multiplier in `timeCurvePodiumMath` (no drift between Simple and Arena). - [ ] All user-visible TimeCurve copy uses **1.275×** (or **27.5%**) for the launch boost where applicable. - [ ] Invariants doc + PARAMETERS reflect **1.275×** and updated worked examples. - [ ] Vitest updated; tests green. ## References - Audit: `audits/audit_ecostrategy_1777969776.md` on `main`
PlasticDigits commented 2026-05-05 09:27:39 +00:00 (Migrated from gitlab.com)

mentioned in commit f76454c44c

mentioned in commit f76454c44caff343e0cc5bec895474ec1dd66503
PlasticDigits commented 2026-05-05 09:27:39 +00:00 (Migrated from gitlab.com)

mentioned in commit 9ff356526c

mentioned in commit 9ff356526cc39d1c083cb8bb3d1ae72e88cd8cea
PlasticDigits commented 2026-05-05 09:28:56 +00:00 (Migrated from gitlab.com)

Shipped on main (merge 9ff3565)

Implemented GitLab #158: canonical TimeCurve launch-liquidity anchor is now 1.275× (27.5% above final per-CHARM clearing), fixed-point 1275n / 1000n in frontend/src/lib/timeCurvePodiumMath.ts (LAUNCH_LIQUIDITY_ANCHOR_NUM / DEN) so Simple + Arena + protocol page projections stay aligned. User-facing copy, PARAMETERS, fee routing (merged with #159 interim custody paragraph), launch plan, invariants row + anchor id #timecurve-launch-anchor-gitlab-158, play/guardrails skills, docs/agents/metadata-and-skills.md, and EcoStrategy audit M-05 wording were updated.

Verify (checklist for @brouie)

  • npx vitest run src/lib/timeCurvePodiumMath.test.ts — 14 tests green (launch + Kumbaya lower band + consistency).
  • Simple + Arena rate footnote: 1.275× per-CHARM clearing price; stake panel badge 1.275× launch anchor.
  • participantLaunchValueCl8yWei spec math: 2 CL8Y/CHARM → 2.55 CL8Y at launch for 1 CHARM (and 25.5 for 10 CHARM).
  • docs/testing/invariants-and-business-logic.md — Launch-anchor 1.275× rule row links #timecurve-launch-anchor-gitlab-158.
  • docs/onchain/fee-routing-and-governance.md — 1.275× LP anchor sentence still followed by #159 RabbitTreasuryVault interim custody note.
  • DoubLPIncentives.sol NatSpec mentions 1.275× (onchain pairing remains operational/governed per M-05).

Leaving issue open for your sign-off.

## Shipped on `main` (merge `9ff3565`) Implemented GitLab **#158**: canonical TimeCurve **launch-liquidity anchor** is now **1.275×** (**27.5%** above final per-CHARM clearing), fixed-point **`1275n / 1000n`** in `frontend/src/lib/timeCurvePodiumMath.ts` (`LAUNCH_LIQUIDITY_ANCHOR_NUM` / `DEN`) so Simple + Arena + protocol page projections stay aligned. User-facing copy, PARAMETERS, fee routing (merged with **#159** interim custody paragraph), launch plan, invariants row + anchor id `#timecurve-launch-anchor-gitlab-158`, play/guardrails skills, `docs/agents/metadata-and-skills.md`, and EcoStrategy audit **M-05** wording were updated. **Verify (checklist for @brouie)** - [ ] `npx vitest run src/lib/timeCurvePodiumMath.test.ts` — 14 tests green (launch + Kumbaya lower band + consistency). - [ ] Simple + Arena rate footnote: **1.275× per-CHARM clearing price**; stake panel badge **1.275× launch anchor**. - [ ] `participantLaunchValueCl8yWei` spec math: **2 CL8Y/CHARM → 2.55 CL8Y at launch** for 1 CHARM (and 25.5 for 10 CHARM). - [ ] `docs/testing/invariants-and-business-logic.md` — **Launch-anchor 1.275× rule** row links `#timecurve-launch-anchor-gitlab-158`. - [ ] `docs/onchain/fee-routing-and-governance.md` — **1.275×** LP anchor sentence still followed by **#159** RabbitTreasuryVault interim custody note. - [ ] `DoubLPIncentives.sol` NatSpec mentions **1.275×** (onchain pairing remains operational/governed per M-05). Leaving issue **open** for your sign-off.
Brouie commented 2026-05-06 01:26:41 +00:00 (Migrated from gitlab.com)

@PlasticDigits — verification PASS on f76454c (merge 9ff3565).

checklist walked:

  1. npx vitest run src/lib/timeCurvePodiumMath.test.ts → 14/14 PASS in 258ms (launch anchor + Kumbaya lower band + consistency).

  2. live UX copy on /timecurve (Simple) and /timecurve/arena (Arena) at HEAD 390f9be:

  • Simple buy panel rate footnote: 1.275× per-CHARM clearing price (locked DOUB/CL8Y LP). CL8Y projection only goes up.
  • Simple "Your stake at launch" panel: badge 1.275× launch anchor, copy seeds at 1.275× the per-CHARM clearing price, footer 1 CHARM ≈ 1.281 CL8Y at launch · enforced by DoubLPIncentives
  • Arena buy panel: same 1.275× per-CHARM clearing price line, same projection 1 CHARM at launch · 1.280826 CL8Y (= 1.004569 × 1.275 ✓)
  • Live numbers cross-check: clearingWad reads on Simple panel showed 1.004527 CL8Y → 1.280772 CL8Y at launch which matches 1.004527 × 1275 / 1000 = 1.28077... to fixed-point precision
  1. spec math:
  • frontend/src/lib/timeCurvePodiumMath.ts exports LAUNCH_LIQUIDITY_ANCHOR_NUM = 1275n + _DEN = 1000n, applied via (clearingWad * NUM) / DEN
  • JSDoc at line 98: 1 CHARM redeems for 100 DOUB → those 100 DOUB are worth 2 × 1.275 = 2.55
  • Test cases: spec example: 1 CHARM at 2 CL8Y/CHARM final price ⇒ 2.55 CL8Y at launch and scales linearly in CHARM (10 CHARM → 25.5 CL8Y at launch) both pinned
  1. invariants doc row at docs/testing/invariants-and-business-logic.md line 725: Launch-anchor 1.275× rule with anchor #timecurve-launch-anchor-gitlab-158, formula × 1275 / 1000, worked example 2 × 1.275 = 2.55 CL8Y, links to helpers + tests + DoubLPIncentives + launchplan + #158.

  2. fee-routing doc at docs/onchain/fee-routing-and-governance.md:

  • line 31: 30% slice lands at DoubLPIncentives for locked DOUB/CL8Y liquidity policy (paired at 1.275× the projected final reserve-per-DOUB clearing anchor; Kumbaya v3 uses a 0.8×–∞ band around the launch anchor)
  • line 29: interim custody note linking #159 + RabbitTreasuryVault retained correctly
  • line 53: Rabbit row with optional interim vault reference
  1. contracts/src/sinks/DoubLPIncentives.sol line 7 NatSpec: Pairing and ticks follow launch policy (1.275× clearing anchor; ...) ✓

single canonical multiplier confirmed in timeCurvePodiumMath.ts — no drift between Simple, Arena, or projection footers; all reads compute from the same LAUNCH_LIQUIDITY_ANCHOR_NUM/DEN pair.

ready for close on your side.

@PlasticDigits — verification PASS on `f76454c` (merge `9ff3565`). checklist walked: 1. `npx vitest run src/lib/timeCurvePodiumMath.test.ts` → 14/14 PASS in 258ms (launch anchor + Kumbaya lower band + consistency). 2. live UX copy on /timecurve (Simple) and /timecurve/arena (Arena) at HEAD `390f9be`: - Simple buy panel rate footnote: `1.275× per-CHARM clearing price (locked DOUB/CL8Y LP). CL8Y projection only goes up.` - Simple "Your stake at launch" panel: badge `1.275× launch anchor`, copy `seeds at 1.275× the per-CHARM clearing price`, footer `1 CHARM ≈ 1.281 CL8Y at launch · enforced by DoubLPIncentives` - Arena buy panel: same `1.275× per-CHARM clearing price` line, same projection `1 CHARM at launch · 1.280826 CL8Y` (= 1.004569 × 1.275 ✓) - Live numbers cross-check: clearingWad reads on Simple panel showed `1.004527 CL8Y → 1.280772 CL8Y at launch` which matches `1.004527 × 1275 / 1000 = 1.28077...` to fixed-point precision 3. spec math: - `frontend/src/lib/timeCurvePodiumMath.ts` exports `LAUNCH_LIQUIDITY_ANCHOR_NUM = 1275n` + `_DEN = 1000n`, applied via `(clearingWad * NUM) / DEN` - JSDoc at line 98: `1 CHARM redeems for 100 DOUB → those 100 DOUB are worth 2 × 1.275 = 2.55` - Test cases: `spec example: 1 CHARM at 2 CL8Y/CHARM final price ⇒ 2.55 CL8Y at launch` and `scales linearly in CHARM (10 CHARM → 25.5 CL8Y at launch)` both pinned 4. invariants doc row at `docs/testing/invariants-and-business-logic.md` line 725: `Launch-anchor 1.275× rule` with anchor `#timecurve-launch-anchor-gitlab-158`, formula `× 1275 / 1000`, worked example `2 × 1.275 = 2.55 CL8Y`, links to helpers + tests + DoubLPIncentives + launchplan + #158. 5. fee-routing doc at `docs/onchain/fee-routing-and-governance.md`: - line 31: `30% slice lands at DoubLPIncentives for locked DOUB/CL8Y liquidity policy (paired at 1.275× the projected final reserve-per-DOUB clearing anchor; Kumbaya v3 uses a 0.8×–∞ band around the launch anchor)` - line 29: interim custody note linking #159 + RabbitTreasuryVault retained correctly - line 53: Rabbit row with optional interim vault reference 6. `contracts/src/sinks/DoubLPIncentives.sol` line 7 NatSpec: `Pairing and ticks follow launch policy (1.275× clearing anchor; ...)` ✓ single canonical multiplier confirmed in `timeCurvePodiumMath.ts` — no drift between Simple, Arena, or projection footers; all reads compute from the same `LAUNCH_LIQUIDITY_ANCHOR_NUM/DEN` pair. ready for close on your side.
Brouie commented 2026-05-06 03:29:39 +00:00 (Migrated from gitlab.com)

mentioned in issue #161

mentioned in issue #161
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-05-06 08:25:58 +00:00
PlasticDigits commented 2026-05-13 15:13:33 +00:00 (Migrated from gitlab.com)

mentioned in commit f325d2896e

mentioned in commit f325d2896ec5995e5cfa174c0e4a3d7a785e6b7e
PlasticDigits commented 2026-05-13 15:13:37 +00:00 (Migrated from gitlab.com)

mentioned in commit 87da011b1d

mentioned in commit 87da011b1dc02d59ba9ec4004122a2860b419436
PlasticDigits commented 2026-05-13 16:07:18 +00:00 (Migrated from gitlab.com)

mentioned in issue #207

mentioned in issue #207
PlasticDigits commented 2026-05-21 04:41:43 +00:00 (Migrated from gitlab.com)

mentioned in issue #229

mentioned in issue #229
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/yieldomega#158
No description provided.