Investigate routing WarBow CL8Y fees through FeeRouter instead of 100% burn #217

Closed
opened 2026-05-19 07:53:21 +00:00 by PlasticDigits · 1 comment
PlasticDigits commented 2026-05-19 07:53:21 +00:00 (Migrated from gitlab.com)

Summary

Today TimeCurve buys route the full gross accepted asset through FeeRouter.distributeFees (canonical 30% LP / 40% burn / 20% podium / 0% team / 10% Rabbit — see docs/onchain/fee-routing-and-governance.md).

WarBow user-driven CL8Y pulls (warbowSteal, warbowRevenge, warbowActivateGuard, including steal-limit bypass) bypass FeeRouter entirely: after balance-delta ingress, the contract transfers 100% of the pulled amount to BURN_SINK (0x…dEaD) and emits WarBowCl8yBurned for accounting.

This issue tracks an investigation (not an implementation commitment) into whether WarBow fees should instead follow the same FeeRouter split as buys — or a dedicated WarBow split — rather than burning all CL8Y to the dead address.

Current onchain behavior (reference)

  • Buy path: _pullAcceptedExact → feeRouter.distributeFees(acceptedAsset, received) — TimeCurve.sol _buy leg.
  • WarBow path: _pullAcceptedExact → acceptedAsset.safeTransfer(BURN_SINK, …) — steal (incl. bypass), revenge, guard.
  • Gate: buyFeeRoutingEnabled blocks both buy routing and WarBow CL8Y pulls (issue #55, INV-* invariants).
  • Policy exception: WarBow burns are an approved public CL8Y outflow per issue #70 / docs/onchain/cl8y-flow-audit.md.
  • Tests: TimeCurveWarBowCl8yBurns.t.sol (fuzz exact sink amounts; burn-sink caller guard #123).

Fixed WarBow burn amounts (WAD, accepted asset)

Action CL8Y
Steal 1
Steal daily-limit bypass (optional) +50
Revenge 1
Guard 10

(claimWarBowFlag has no CL8Y leg.)

Questions to answer

Product / economics

  • Should WarBow CL8Y fund the same sinks as buys (LP, podium pool, Rabbit, partial burn), or a different bps table (e.g. higher podium / WarBow prize funding)?
  • How does routing WarBow fees affect podium pool depth, totalRaised semantics, and WarBow prize category (25% of podium slice) vs pure deflation?
  • Volume expectations: WarBow burns are small fixed fees vs variable buy gross — is the UX/governance win material?

Contracts

  • Implementation options: (a) safeTransfer + feeRouter.distributeFees per WarBow tx; (b) accumulate on TimeCurve and batch distribute; (c) separate router config / sink weights for WarBow-only.
  • Interaction with buyFeeRoutingEnabled, FeeRouter distributable-token allowlist (#122), and ERC20 parity (#123).
  • Upgrade / proxy path if live; whether to preserve WarBowCl8yBurned events for indexer continuity or add parallel FeesRouted-style telemetry.
  • Revisit audit #70 exception set if WarBow stops being a pure burn.

Indexer / frontend

  • idx_timecurve_warbow_cl8y_burned and WarBow action tables assume burn semantics today.
  • Arena / Simple UX copy and canonical fee sinks footer (#93) may need to describe WarBow routing if policy changes.

Suggested deliverables

  1. Written recommendation (route via FeeRouter vs keep 100% burn vs hybrid) with bps table if routing.
  2. Impact matrix: contracts, indexer schema/API, frontend, ops monitoring, governance docs.
  3. Optional spike PR or Forge branch proving distributeFees wiring for one WarBow action (no mainnet deploy).

Out of scope (unless explicitly expanded)

  • Changing WarBow BP rules (#211, #134) or burn amounts.
  • Referral / buy fee economics.
## Summary Today **TimeCurve buys** route the full gross accepted asset through **`FeeRouter.distributeFees`** (canonical **30% LP / 40% burn / 20% podium / 0% team / 10% Rabbit** — see [`docs/onchain/fee-routing-and-governance.md`](docs/onchain/fee-routing-and-governance.md)). **WarBow** user-driven CL8Y pulls (`warbowSteal`, `warbowRevenge`, `warbowActivateGuard`, including steal-limit bypass) **bypass `FeeRouter` entirely**: after balance-delta ingress, the contract transfers **100%** of the pulled amount to **`BURN_SINK` (`0x…dEaD`)** and emits **`WarBowCl8yBurned`** for accounting. This issue tracks an **investigation** (not an implementation commitment) into whether WarBow fees should instead follow the same **FeeRouter split** as buys — or a **dedicated WarBow split** — rather than burning all CL8Y to the dead address. ## Current onchain behavior (reference) - **Buy path:** `_pullAcceptedExact` → `feeRouter.distributeFees(acceptedAsset, received)` — [`TimeCurve.sol`](contracts/src/TimeCurve.sol) `_buy` leg. - **WarBow path:** `_pullAcceptedExact` → `acceptedAsset.safeTransfer(BURN_SINK, …)` — steal (incl. bypass), revenge, guard. - **Gate:** `buyFeeRoutingEnabled` blocks **both** buy routing **and** WarBow CL8Y pulls ([issue #55](https://gitlab.com/PlasticDigits/yieldomega/-/issues/55), [`INV-*` invariants](docs/testing/invariants-and-business-logic.md)). - **Policy exception:** WarBow burns are an **approved public CL8Y outflow** per [issue #70](https://gitlab.com/PlasticDigits/yieldomega/-/issues/70) / `docs/onchain/cl8y-flow-audit.md`. - **Tests:** [`TimeCurveWarBowCl8yBurns.t.sol`](contracts/test/TimeCurveWarBowCl8yBurns.t.sol) (fuzz exact sink amounts; burn-sink caller guard [#123](https://gitlab.com/PlasticDigits/yieldomega/-/issues/123)). ### Fixed WarBow burn amounts (WAD, accepted asset) | Action | CL8Y | |--------|------| | Steal | 1 | | Steal daily-limit bypass (optional) | +50 | | Revenge | 1 | | Guard | 10 | (`claimWarBowFlag` has **no** CL8Y leg.) ## Questions to answer ### Product / economics - Should WarBow CL8Y **fund the same sinks as buys** (LP, podium pool, Rabbit, partial burn), or a **different** bps table (e.g. higher podium / WarBow prize funding)? - How does routing WarBow fees affect **podium pool depth**, **totalRaised** semantics, and **WarBow prize category** (25% of podium slice) vs **pure deflation**? - Volume expectations: WarBow burns are **small fixed fees** vs **variable buy gross** — is the UX/governance win material? ### Contracts - Implementation options: (a) `safeTransfer` + `feeRouter.distributeFees` per WarBow tx; (b) accumulate on `TimeCurve` and batch distribute; (c) separate router config / sink weights for WarBow-only. - Interaction with **`buyFeeRoutingEnabled`**, **`FeeRouter` distributable-token allowlist** ([#122](https://gitlab.com/PlasticDigits/yieldomega/-/issues/122)), and **ERC20 parity** ([#123](https://gitlab.com/PlasticDigits/yieldomega/-/issues/123)). - **Upgrade / proxy** path if live; whether to preserve **`WarBowCl8yBurned`** events for indexer continuity or add parallel **`FeesRouted`**-style telemetry. - Revisit **audit #70** exception set if WarBow stops being a pure burn. ### Indexer / frontend - [`idx_timecurve_warbow_cl8y_burned`](indexer/migrations/20260402140000_warbow_extra_events.up.sql) and WarBow action tables assume burn semantics today. - Arena / Simple UX copy and **canonical fee sinks** footer ([#93](https://gitlab.com/PlasticDigits/yieldomega/-/issues/93)) may need to describe WarBow routing if policy changes. ## Suggested deliverables 1. **Written recommendation** (route via FeeRouter vs keep 100% burn vs hybrid) with bps table if routing. 2. **Impact matrix**: contracts, indexer schema/API, frontend, ops monitoring, governance docs. 3. **Optional spike PR** or Forge branch proving `distributeFees` wiring for one WarBow action (no mainnet deploy). ## Out of scope (unless explicitly expanded) - Changing WarBow **BP rules** ([#211](https://gitlab.com/PlasticDigits/yieldomega/-/issues/211), [#134](https://gitlab.com/PlasticDigits/yieldomega/-/issues/134)) or burn **amounts**. - Referral / buy fee economics. ## Related - [`docs/product/primitives.md`](docs/product/primitives.md) — WarBow burns - [`docs/testing/invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md) — WarBow CL8Y burns (#70), `buyFeeRoutingEnabled` (#55) - [`skills/play-timecurve-warbow/SKILL.md`](skills/play-timecurve-warbow/SKILL.md)
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-05-20 04:16:06 +00:00
PlasticDigits commented 2026-05-20 04:16:07 +00:00 (Migrated from gitlab.com)

Implemented & working, closed

Implemented & working, closed
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#217
No description provided.