Arena prize routing: 100% to podiums with 70/20/10 epoch tranches #300

Closed
opened 2026-06-07 07:50:08 +00:00 by PlasticDigits · 37 comments
PlasticDigits commented 2026-06-07 07:50:08 +00:00 (Migrated from gitlab.com)

Summary

Retarget 100% of DOUB buy proceeds to podium prize vaults (zero admin take on buys), with each of the four podiums receiving 25% of every buy, split across current / next / next+1 epoch pools at 70% / 20% / 10% per podium. Funding is global — all podiums receive DOUB even when a player has not unlocked that podium’s mechanics (see companion progression issue).

Parent epic: #238. Supersedes buy routing in #249. Related: #261 (manual top-up), #267 (vault-funding ingest).


Current codebase

Buy routing today

ArenaBuyRouting.sol splits each DOUB buy:

Destination Bps Notes
Each active podium pool 1000 (10% × 4) 40% total
Each seed podium pool 750 (7.5% × 4) 30% total
AdminSellVault 3000 30% admin take

TimeArena._routeDoubPrizeSplit transfers to PodiumVaults active/seed pools and admin vault; emits PodiumFunded, SeedFunded, AdminVaultFunded.

Epoch model

  • Each podium has independent podiumEpoch[cat] (#247).
  • On rollPodiumEpoch(cat), active pool pays winners 4:2:1 (ArenaPodiumSettlement.sol), seed rolls to active, epoch increments.
  • Seed pools hold “next epoch” liquidity today; active holds current epoch.

Frontend / indexer

Manual top-up

topUpPodiumPools routes 100% prize-only at 10:7.5 active:seed per category (#261) — unchanged unless product wants epoch tranches for donations too (out of scope unless stated).


Why this is needed

The 30% admin take on every buy dilutes player-facing prizes and complicates the “all-in on podiums” narrative. Players should see buys as directly feeding the four competitive tracks.

The 70/20/10 epoch tranche per podium smooths funding across the settling epoch and the next two, so early-epoch and late-epoch winners both receive liquidity without manual rebalancing. Because podiums roll independently, each category applies the split against its own podiumEpoch[cat]:

Example (buy amount B; each podium gets 0.25 × B):

Podium podiumEpoch 70% tranche 20% tranche 10% tranche
Last Buy 3 epoch 3 epoch 4 epoch 5
Defended Streak 4 epoch 4 epoch 5 epoch 6
WarBow 2 epoch 2 epoch 3 epoch 4
Time Booster 5 epoch 5 epoch 6 epoch 7

Within each tranche, DOUB lands in the vault bucket that will settle that epoch (may require per-epoch pool mapping or seed/active sub-ledger — see solution direction).

Player unlock state does not affect routing — a level-1 wallet still funds all four podiums; only their timer/scoring side effects are gated (companion issue).


Constraints & guardrails

  1. Onchain authority — routing math in Solidity library + TimeArena; indexer decodes events only.
  2. Integer safety — no dust loss; remainder wei policy documented (recommend: last tranche / last podium absorbs remainder).
  3. ERC-20 parity — balance-delta checks on all transfers (#123).
  4. buyWithCred — no DOUB routing today (#268); unchanged unless product explicitly extends CRED buys to fund vaults.
  5. Admin vault — buy path sends 0% to AdminSellVault; admin revenue must not depend on this change without ops sign-off. Manual top-up and other admin flows stay separate.
  6. totalDoubRaised — clarify whether full received or prize-routed portion (recommend: still full payment for analytics).
  7. WarBow finalize — epoch pools must remain consistent with finalizeWarbowPodium(epoch) (#252).
  8. AGPL / UUPS — append-only storage if per-epoch pool maps added.
  9. Backwards compatibility — Arena v2 redeploy; no migration of old vault balances required, but document in deploy notes (#259).

Relevant files

Layer Files
Contracts ArenaBuyRouting.sol, TimeArena.sol, PodiumVaults.sol, ArenaPodiumSettlement.sol
Tests ArenaPrizeRouting.t.sol, TimeArena.t.sol (test_buy_routes_doub_split)
Indexer vault-funding ingest, api_arena.rs, migrations under indexer/migrations/
Frontend FeeTransparency.tsx, ArenaProtocolDonatePoolsSection.tsx
Docs arena-v2.md § DOUB prize routing, invariants-and-business-logic.md
Verify verify-vault-funding-anvil.sh, verify-time-arena-buy-router-anvil.sh

Option A — Reuse active/seed as epoch+0 / epoch+1, add epoch+2 bucket

  • Per category, maintain three pending tranches keyed by target epoch (or map epoch → pool id in PodiumVaults).
  • splitBuyPrizeByEpoch(amount, currentEpoch) pure library:
    • podiumShare = amount / 4 (remainder to cat 3 or Last Buy per documented rule).
    • t70 = mulDiv(podiumShare, 7000, 10000) → current epoch pool.
    • t20 → currentEpoch + 1 pool.
    • t10 → currentEpoch + 2 pool.
  • On rollPodiumEpoch, pay active tranche 4:2:1, promote +1/+2 tranches (exact promotion rules need a short design note in MR).

Option B — Explicit epochPool[cat][epoch] in PodiumVaults

  • More storage, clearest audit trail for WarBow finalize per epoch.
  • Heavier upgrade; prefer if existing seed/active promotion cannot model +2 tranche cleanly.

Events

  • Extend or replace PodiumFunded / SeedFunded with PodiumEpochFunded(category, epoch, amount) for indexer clarity.
  • Stop emitting AdminVaultFunded on buys (amount always zero).

Indexer + API

  • Ingest new event shape; GET /v1/arena/vault-funding/* exposes per-epoch balances or tranche breakdown.
  • Update idx_arena_podium_live if predictions depend on pool balances (#273).

Frontend

  • Update fee transparency copy: 100% podiums, diagram per-category epoch tranches.
  • AUDIT / protocol pages reflect zero admin take on buys.

Acceptance criteria

  • DOUB buy() routes 100% of received to podium vaults; 0 to AdminSellVault on buy path.
  • Each of 4 categories receives exactly 25% of buy (± remainder policy).
  • Within each category, split is 70% / 20% / 10% to podiumEpoch[cat], +1, +2 respectively.
  • Worked example (epochs 3/4/2/5 for LB/Streak/WarBow/Booster) matches table above in Forge test.
  • rollPodiumEpoch + WarBow finalizeWarbowPodium still pay correct epoch balances.
  • Fuzz: sum of all routed wei == buy amount for arbitrary amounts and epochs.
  • Indexer vault-funding API reflects new events.
  • Frontend fee panel shows 100% podium routing (no 30% admin on buys).
  • topUpPodiumPools behavior unchanged (#261).
  • Docs + INV-ARENA-PRIZE-ROUTING-* invariants added.

Test plan (functional paths)

Path Command / evidence
Pure split math forge test --match-contract ArenaPrizeRouting — fixed epochs + fuzz
Integration buy TimeArena.t.sol::test_buy_routes_doub_split rewritten for 100% / 25% / 70-20-10
Multi-epoch roll Forge: fund epoch N, N+1, N+2; roll; assert payouts
WarBow epoch finalize test_finalize_warbow_podium_pays_after_roll with pre-funded epoch pool
Indexer ingest bash scripts/verify-vault-funding-anvil.sh
Buy router Anvil bash scripts/verify-time-arena-buy-router-anvil.sh
Frontend copy npm test — FeeTransparency.test.tsx
Podium live predictions bash scripts/verify-podium-live-anvil.sh if balances feed predictions

Test plan (attack / abuse / edge vectors)

Vector Expected Test
Dust accumulation / rounding drain Sum routed == amount; no stuck wei in TimeArena Fuzz testFuzz_epoch_split_no_dust
Epoch overflow (podiumEpoch + 2 near type(uint256).max) Revert or sane wrap policy documented Forge boundary
Malicious category index N/A (fixed 4 cats) —
Fake PodiumFunded events Indexer decodes only from registered TimeArena Integration
Admin vault starvation via routing change Ops aware; admin not funded by buys Document in deploy guide
Double-count totalDoubRaised vs vault inflows Analytics consistent Forge assertion
Reentrancy on notifyPodiumFunded nonReentrant on buy Existing guards
Griefing — donate to wrong epoch Permissionless funding OK —
UI misleading “your buy doesn’t fund WarBow” at level 1 UI copy: funds globally, mechanics locked locally Manual QA + companion issue

Verification criteria (merge gate)

Check Command PASS when
Contracts cd contracts && forge test All green including new routing tests
Indexer cd indexer && cargo clippy --all-targets -- -D warnings && cargo test Green
Vault funding bash scripts/verify-vault-funding-anvil.sh PASS
Buy router bash scripts/verify-time-arena-buy-router-anvil.sh PASS
Frontend cd frontend && npm run typecheck && npm run lint && npm test Fee UI updated
Docs bash scripts/check-doc-anchors.sh PASS

Dependency

  • Companion issue (player progression / unwrapping): defines per-player buy effects; this issue defines per-buy funding. Implement together or sequence: routing first (no player gates), then progression gates — but both must ship before production deploy.
## Summary Retarget **100% of DOUB buy proceeds** to podium prize vaults (zero admin take on buys), with each of the **four podiums receiving 25%** of every buy, split across **current / next / next+1 epoch** pools at **70% / 20% / 10%** per podium. Funding is **global** — all podiums receive DOUB even when a player has not unlocked that podium’s mechanics (see companion progression issue). Parent epic: [#238](https://gitlab.com/PlasticDigits/yieldomega/-/issues/238). Supersedes buy routing in [#249](https://gitlab.com/PlasticDigits/yieldomega/-/issues/249). Related: [#261](https://gitlab.com/PlasticDigits/yieldomega/-/issues/261) (manual top-up), [#267](https://gitlab.com/PlasticDigits/yieldomega/-/issues/267) (vault-funding ingest). --- ## Current codebase ### Buy routing today [`ArenaBuyRouting.sol`](contracts/src/arena/libraries/ArenaBuyRouting.sol) splits each DOUB buy: | Destination | Bps | Notes | |-------------|-----|--------| | Each active podium pool | 1000 (10% × 4) | 40% total | | Each seed podium pool | 750 (7.5% × 4) | 30% total | | `AdminSellVault` | 3000 | 30% admin take | [`TimeArena._routeDoubPrizeSplit`](contracts/src/arena/TimeArena.sol) transfers to `PodiumVaults` active/seed pools and admin vault; emits `PodiumFunded`, `SeedFunded`, `AdminVaultFunded`. ### Epoch model - Each podium has independent `podiumEpoch[cat]` ([#247](https://gitlab.com/PlasticDigits/yieldomega/-/issues/247)). - On `rollPodiumEpoch(cat)`, active pool pays winners **4:2:1** ([`ArenaPodiumSettlement.sol`](contracts/src/arena/libraries/ArenaPodiumSettlement.sol)), seed rolls to active, epoch increments. - **Seed pools** hold “next epoch” liquidity today; active holds current epoch. ### Frontend / indexer - [`FeeTransparency.tsx`](frontend/src/components/FeeTransparency.tsx) / [`ArenaVaultAddressesPanel.tsx`](frontend/src/components/ArenaVaultAddressesPanel.tsx) show **40/30/30** split. - Indexer `GET /v1/arena/vault-funding/*` ([#267](https://gitlab.com/PlasticDigits/yieldomega/-/issues/267)) indexes `PodiumFunded` / `SeedFunded` / `AdminVaultFunded`. ### Manual top-up `topUpPodiumPools` routes 100% prize-only at 10:7.5 active:seed per category ([#261](https://gitlab.com/PlasticDigits/yieldomega/-/issues/261)) — **unchanged** unless product wants epoch tranches for donations too (out of scope unless stated). --- ## Why this is needed The **30% admin take** on every buy dilutes player-facing prizes and complicates the “all-in on podiums” narrative. Players should see buys as **directly feeding** the four competitive tracks. The **70/20/10 epoch tranche** per podium smooths funding across the settling epoch and the next two, so early-epoch and late-epoch winners both receive liquidity without manual rebalancing. Because podiums roll independently, each category applies the split against **its own** `podiumEpoch[cat]`: **Example** (buy amount `B`; each podium gets `0.25 × B`): | Podium | `podiumEpoch` | 70% tranche | 20% tranche | 10% tranche | |--------|---------------|-------------|-------------|-------------| | Last Buy | 3 | epoch 3 | epoch 4 | epoch 5 | | Defended Streak | 4 | epoch 4 | epoch 5 | epoch 6 | | WarBow | 2 | epoch 2 | epoch 3 | epoch 4 | | Time Booster | 5 | epoch 5 | epoch 6 | epoch 7 | Within each tranche, DOUB lands in the vault bucket that will settle that epoch (may require **per-epoch pool mapping** or seed/active sub-ledger — see solution direction). **Player unlock state does not affect routing** — a level-1 wallet still funds all four podiums; only their **timer/scoring side effects** are gated (companion issue). --- ## Constraints & guardrails 1. **Onchain authority** — routing math in Solidity library + `TimeArena`; indexer decodes events only. 2. **Integer safety** — no dust loss; remainder wei policy documented (recommend: last tranche / last podium absorbs remainder). 3. **ERC-20 parity** — balance-delta checks on all transfers ([#123](https://gitlab.com/PlasticDigits/yieldomega/-/issues/123)). 4. **`buyWithCred`** — **no DOUB routing** today ([#268](https://gitlab.com/PlasticDigits/yieldomega/-/issues/268)); unchanged unless product explicitly extends CRED buys to fund vaults. 5. **Admin vault** — buy path sends **0%** to `AdminSellVault`; admin revenue must not depend on this change without ops sign-off. Manual top-up and other admin flows stay separate. 6. **`totalDoubRaised`** — clarify whether full `received` or prize-routed portion (recommend: still full payment for analytics). 7. **WarBow finalize** — epoch pools must remain consistent with `finalizeWarbowPodium(epoch)` ([#252](https://gitlab.com/PlasticDigits/yieldomega/-/issues/252)). 8. **AGPL / UUPS** — append-only storage if per-epoch pool maps added. 9. **Backwards compatibility** — Arena v2 redeploy; no migration of old vault balances required, but document in deploy notes ([#259](https://gitlab.com/PlasticDigits/yieldomega/-/issues/259)). --- ## Relevant files | Layer | Files | |-------|-------| | Contracts | [`ArenaBuyRouting.sol`](contracts/src/arena/libraries/ArenaBuyRouting.sol), [`TimeArena.sol`](contracts/src/arena/TimeArena.sol), [`PodiumVaults.sol`](contracts/src/arena/PodiumVaults.sol), [`ArenaPodiumSettlement.sol`](contracts/src/arena/libraries/ArenaPodiumSettlement.sol) | | Tests | [`ArenaPrizeRouting.t.sol`](contracts/test/ArenaPrizeRouting.t.sol), [`TimeArena.t.sol`](contracts/test/TimeArena.t.sol) (`test_buy_routes_doub_split`) | | Indexer | vault-funding ingest, [`api_arena.rs`](indexer/src/api_arena.rs), migrations under `indexer/migrations/` | | Frontend | [`FeeTransparency.tsx`](frontend/src/components/FeeTransparency.tsx), [`ArenaProtocolDonatePoolsSection.tsx`](frontend/src/pages/arena/ArenaProtocolDonatePoolsSection.tsx) | | Docs | [`arena-v2.md`](docs/product/arena-v2.md) § DOUB prize routing, [`invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md) | | Verify | [`verify-vault-funding-anvil.sh`](scripts/verify-vault-funding-anvil.sh), [`verify-time-arena-buy-router-anvil.sh`](scripts/verify-time-arena-buy-router-anvil.sh) | --- ## Recommended solution direction ### Option A — Reuse active/seed as epoch+0 / epoch+1, add epoch+2 bucket - Per category, maintain **three pending tranches** keyed by target epoch (or map epoch → pool id in `PodiumVaults`). - `splitBuyPrizeByEpoch(amount, currentEpoch)` pure library: - `podiumShare = amount / 4` (remainder to cat 3 or Last Buy per documented rule). - `t70 = mulDiv(podiumShare, 7000, 10000)` → current epoch pool. - `t20` → `currentEpoch + 1` pool. - `t10` → `currentEpoch + 2` pool. - On `rollPodiumEpoch`, pay active tranche 4:2:1, promote +1/+2 tranches (exact promotion rules need a short design note in MR). ### Option B — Explicit `epochPool[cat][epoch]` in `PodiumVaults` - More storage, clearest audit trail for WarBow finalize per epoch. - Heavier upgrade; prefer if existing seed/active promotion cannot model +2 tranche cleanly. ### Events - Extend or replace `PodiumFunded` / `SeedFunded` with **`PodiumEpochFunded(category, epoch, amount)`** for indexer clarity. - Stop emitting `AdminVaultFunded` on buys (amount always zero). ### Indexer + API - Ingest new event shape; `GET /v1/arena/vault-funding/*` exposes per-epoch balances or tranche breakdown. - Update `idx_arena_podium_live` if predictions depend on pool balances ([#273](https://gitlab.com/PlasticDigits/yieldomega/-/issues/273)). ### Frontend - Update fee transparency copy: **100% podiums**, diagram per-category epoch tranches. - AUDIT / protocol pages reflect zero admin take on buys. --- ## Acceptance criteria - [ ] DOUB `buy()` routes **100%** of `received` to podium vaults; **0** to `AdminSellVault` on buy path. - [ ] Each of 4 categories receives **exactly 25%** of buy (± remainder policy). - [ ] Within each category, split is **70% / 20% / 10%** to `podiumEpoch[cat]`, `+1`, `+2` respectively. - [ ] Worked example (epochs 3/4/2/5 for LB/Streak/WarBow/Booster) matches table above in Forge test. - [ ] `rollPodiumEpoch` + WarBow `finalizeWarbowPodium` still pay correct epoch balances. - [ ] Fuzz: sum of all routed wei == buy amount for arbitrary amounts and epochs. - [ ] Indexer vault-funding API reflects new events. - [ ] Frontend fee panel shows 100% podium routing (no 30% admin on buys). - [ ] `topUpPodiumPools` behavior unchanged ([#261](https://gitlab.com/PlasticDigits/yieldomega/-/issues/261)). - [ ] Docs + `INV-ARENA-PRIZE-ROUTING-*` invariants added. --- ## Test plan (functional paths) | Path | Command / evidence | |------|-------------------| | Pure split math | `forge test --match-contract ArenaPrizeRouting` — fixed epochs + fuzz | | Integration buy | `TimeArena.t.sol::test_buy_routes_doub_split` rewritten for 100% / 25% / 70-20-10 | | Multi-epoch roll | Forge: fund epoch N, N+1, N+2; roll; assert payouts | | WarBow epoch finalize | `test_finalize_warbow_podium_pays_after_roll` with pre-funded epoch pool | | Indexer ingest | `bash scripts/verify-vault-funding-anvil.sh` | | Buy router Anvil | `bash scripts/verify-time-arena-buy-router-anvil.sh` | | Frontend copy | `npm test` — `FeeTransparency.test.tsx` | | Podium live predictions | `bash scripts/verify-podium-live-anvil.sh` if balances feed predictions | --- ## Test plan (attack / abuse / edge vectors) | Vector | Expected | Test | |--------|----------|------| | Dust accumulation / rounding drain | Sum routed == amount; no stuck wei in `TimeArena` | Fuzz `testFuzz_epoch_split_no_dust` | | Epoch overflow (`podiumEpoch + 2` near `type(uint256).max`) | Revert or sane wrap policy documented | Forge boundary | | Malicious category index | N/A (fixed 4 cats) | — | | Fake `PodiumFunded` events | Indexer decodes only from registered `TimeArena` | Integration | | Admin vault starvation via routing change | Ops aware; admin not funded by buys | Document in deploy guide | | Double-count `totalDoubRaised` vs vault inflows | Analytics consistent | Forge assertion | | Reentrancy on `notifyPodiumFunded` | `nonReentrant` on buy | Existing guards | | Griefing — donate to wrong epoch | Permissionless funding OK | — | | UI misleading “your buy doesn’t fund WarBow” at level 1 | UI copy: funds globally, mechanics locked locally | Manual QA + companion issue | --- ## Verification criteria (merge gate) | Check | Command | PASS when | |-------|---------|-----------| | Contracts | `cd contracts && forge test` | All green including new routing tests | | Indexer | `cd indexer && cargo clippy --all-targets -- -D warnings && cargo test` | Green | | Vault funding | `bash scripts/verify-vault-funding-anvil.sh` | PASS | | Buy router | `bash scripts/verify-time-arena-buy-router-anvil.sh` | PASS | | Frontend | `cd frontend && npm run typecheck && npm run lint && npm test` | Fee UI updated | | Docs | `bash scripts/check-doc-anchors.sh` | PASS | --- ## Dependency - **Companion issue (player progression / unwrapping):** defines per-player buy *effects*; this issue defines per-buy *funding*. Implement together or sequence: routing first (no player gates), then progression gates — but both must ship before production deploy.
PlasticDigits commented 2026-06-07 07:50:09 +00:00 (Migrated from gitlab.com)

marked as related to #238

marked as related to #238
PlasticDigits commented 2026-06-07 07:50:17 +00:00 (Migrated from gitlab.com)

marked as related to #299

marked as related to #299
ghost1 commented 2026-06-07 09:55:46 +00:00 (Migrated from gitlab.com)

mentioned in commit 8c522eda7c

mentioned in commit 8c522eda7cb3992e9dc201ab131e04faaee0e1d5
PlasticDigits commented 2026-06-07 09:56:02 +00:00 (Migrated from gitlab.com)

mentioned in merge request !440

mentioned in merge request !440
PlasticDigits commented 2026-06-07 10:03:38 +00:00 (Migrated from gitlab.com)

mentioned in commit 2398a6a1fc

mentioned in commit 2398a6a1fcf7621cefe900fca5cbcd1ce85b4557
ghost1 commented 2026-06-07 12:12:16 +00:00 (Migrated from gitlab.com)

mentioned in commit ab35170934

mentioned in commit ab351709340874323f0e6d56cfc0686679d4b678
PlasticDigits commented 2026-06-07 12:12:28 +00:00 (Migrated from gitlab.com)

mentioned in merge request !442

mentioned in merge request !442
PlasticDigits commented 2026-06-07 12:12:39 +00:00 (Migrated from gitlab.com)

Verification complete — #300

Implementation was already merged (2398a6a). All automated acceptance checks PASS.

Acceptance criteria

Criterion Result Evidence
100% to podium vaults; 0% admin on buy PASS test_buy_routes_doub_split
25% per category (± remainder → Time Booster) PASS ArenaPrizeRouting.t.sol (6/6)
70/20/10 epoch tranches PASS test_buy_routes_epoch_tranches_worked_example
Worked example (epochs 3/4/2/5) PASS Same test
rollPodiumEpoch + WarBow finalize PASS test_finalize_warbow_podium_pays_after_roll
Fuzz: no dust PASS testFuzz_splitBuy_no_dust, testFuzz_epoch_split_per_category_bps
Indexer vault-funding API PASS bash scripts/verify-vault-funding-anvil.sh
Frontend fee panel PASS FeeTransparency.test.tsx — 100% / 70/20/10 copy
topUpPodiumPools unchanged PASS test_topUpPodiumPools_* (7 tests)
Docs + INV-ARENA-PRIZE-ROUTING-* PASS (after MR) §300 invariants present; stale 40/30/30 refs fixed in !442

Merge gate

Check Command Result
Contracts cd contracts && forge test PASS (147/153; 6 DoubAirdropMegaethFork tests need gitignored doub.csv)
Indexer cargo clippy + cargo test PASS
Vault funding verify-vault-funding-anvil.sh PASS
Buy router verify-time-arena-buy-router-anvil.sh PASS
Frontend typecheck + lint + npm test PASS (564 tests)
Docs check-doc-anchors.sh PASS

Follow-up MR

Opened !442 to align remaining 40/30/30 documentation (security model, QA checklists, agent guides) with the implemented 100% podium · 70/20/10 routing.

Issue left open pending MR merge.

## Verification complete — [#300](https://gitlab.com/PlasticDigits/yieldomega/-/work_items/300) Implementation was already merged (`2398a6a`). All automated acceptance checks **PASS**. ### Acceptance criteria | Criterion | Result | Evidence | |-----------|--------|----------| | 100% to podium vaults; 0% admin on buy | **PASS** | `test_buy_routes_doub_split` | | 25% per category (± remainder → Time Booster) | **PASS** | `ArenaPrizeRouting.t.sol` (6/6) | | 70/20/10 epoch tranches | **PASS** | `test_buy_routes_epoch_tranches_worked_example` | | Worked example (epochs 3/4/2/5) | **PASS** | Same test | | rollPodiumEpoch + WarBow finalize | **PASS** | `test_finalize_warbow_podium_pays_after_roll` | | Fuzz: no dust | **PASS** | `testFuzz_splitBuy_no_dust`, `testFuzz_epoch_split_per_category_bps` | | Indexer vault-funding API | **PASS** | `bash scripts/verify-vault-funding-anvil.sh` | | Frontend fee panel | **PASS** | `FeeTransparency.test.tsx` — 100% / 70/20/10 copy | | topUpPodiumPools unchanged | **PASS** | `test_topUpPodiumPools_*` (7 tests) | | Docs + INV-ARENA-PRIZE-ROUTING-* | **PASS** (after MR) | §300 invariants present; stale 40/30/30 refs fixed in [!442](https://gitlab.com/PlasticDigits/yieldomega/-/merge_requests/72) | ### Merge gate | Check | Command | Result | |-------|---------|--------| | Contracts | `cd contracts && forge test` | **PASS** (147/153; 6 `DoubAirdropMegaethFork` tests need gitignored `doub.csv`) | | Indexer | `cargo clippy` + `cargo test` | **PASS** | | Vault funding | `verify-vault-funding-anvil.sh` | **PASS** | | Buy router | `verify-time-arena-buy-router-anvil.sh` | **PASS** | | Frontend | `typecheck` + `lint` + `npm test` | **PASS** (564 tests) | | Docs | `check-doc-anchors.sh` | **PASS** | ### Follow-up MR Opened [!442](https://gitlab.com/PlasticDigits/yieldomega/-/merge_requests/72) to align remaining **40/30/30** documentation (security model, QA checklists, agent guides) with the implemented **100% podium · 70/20/10** routing. Issue left **open** pending MR merge.
ghost1 commented 2026-06-07 12:25:58 +00:00 (Migrated from gitlab.com)

mentioned in commit 79955b1013

mentioned in commit 79955b1013f6f880b5a71dc9e269cd3c121bda54
PlasticDigits commented 2026-06-07 12:26:11 +00:00 (Migrated from gitlab.com)

mentioned in merge request !444

mentioned in merge request !444
PlasticDigits commented 2026-06-07 12:26:21 +00:00 (Migrated from gitlab.com)

mentioned in issue #293

mentioned in issue #293
PlasticDigits commented 2026-06-07 13:57:54 +00:00 (Migrated from gitlab.com)

mentioned in issue #302

mentioned in issue #302
ghost1 commented 2026-06-08 05:21:07 +00:00 (Migrated from gitlab.com)

mentioned in commit feeadcfa6f

mentioned in commit feeadcfa6f3d6d78bb7aa713b5b501d770bd917f
ghost1 commented 2026-06-08 05:21:51 +00:00 (Migrated from gitlab.com)

mentioned in commit b43f52647e

mentioned in commit b43f52647e9bb17a32cd59bcabf73882d6e27c93
PlasticDigits commented 2026-06-08 05:27:10 +00:00 (Migrated from gitlab.com)

mentioned in commit 909d63d007

mentioned in commit 909d63d00792c382793fc335fd922f1041d02b92
ghost1 commented 2026-06-08 05:29:50 +00:00 (Migrated from gitlab.com)

mentioned in commit 6d823d5746

mentioned in commit 6d823d5746a0422b30350d2557c48b9f5de1fa84
PlasticDigits commented 2026-06-08 05:30:40 +00:00 (Migrated from gitlab.com)

mentioned in commit ddfaa01f4f

mentioned in commit ddfaa01f4f8edb9b6240ae9106d7498ac2fcaece
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-08 05:30:41 +00:00
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 08d564baa0

mentioned in commit 08d564baa078463a2485a2c41795886e1961235c
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 574c16ea46

mentioned in commit 574c16ea46c73cb1546f19a3cac293ec8c754c30
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 17c969fda6

mentioned in commit 17c969fda633ad3b213f982c4630cb4023cab2f3
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 3d9291d507

mentioned in commit 3d9291d507cc9b08522de73d339937916d6fd360
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit dffa6a02f9

mentioned in commit dffa6a02f9071f91099ea95dd20b1100070b87c4
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 9fa5c1a852

mentioned in commit 9fa5c1a852530664916352015a24afb2489e8ad5
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit 3ecd110cbd

mentioned in commit 3ecd110cbd8bc5a799da051c11775abf35a82183
PlasticDigits commented 2026-06-08 08:45:13 +00:00 (Migrated from gitlab.com)

mentioned in commit d5ee46397a

mentioned in commit d5ee46397a3c3435e005b12923abadadb7b8f46b
PlasticDigits commented 2026-06-13 07:02:53 +00:00 (Migrated from gitlab.com)

mentioned in issue #309

mentioned in issue #309
PlasticDigits commented 2026-06-13 07:34:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #310

mentioned in issue #310
PlasticDigits commented 2026-06-13 07:34:19 +00:00 (Migrated from gitlab.com)

mentioned in issue #313

mentioned in issue #313
PlasticDigits commented 2026-06-13 07:34:20 +00:00 (Migrated from gitlab.com)

mentioned in issue #314

mentioned in issue #314
PlasticDigits commented 2026-06-13 07:34:26 +00:00 (Migrated from gitlab.com)

mentioned in issue #316

mentioned in issue #316
PlasticDigits commented 2026-06-13 07:59:34 +00:00 (Migrated from gitlab.com)

mentioned in merge request !458

mentioned in merge request !458
PlasticDigits commented 2026-06-13 08:08:37 +00:00 (Migrated from gitlab.com)

mentioned in merge request !461

mentioned in merge request !461
PlasticDigits commented 2026-06-13 08:15:58 +00:00 (Migrated from gitlab.com)

mentioned in merge request !464

mentioned in merge request !464
PlasticDigits commented 2026-06-13 10:19:34 +00:00 (Migrated from gitlab.com)

mentioned in merge request !465

mentioned in merge request !465
PlasticDigits commented 2026-06-13 13:23:49 +00:00 (Migrated from gitlab.com)

mentioned in merge request !473

mentioned in merge request !473
PlasticDigits commented 2026-06-19 04:26:30 +00:00 (Migrated from gitlab.com)

mentioned in issue #332

mentioned in issue #332
PlasticDigits commented 2026-07-07 12:41:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #366

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