Sample report · Teardown
Flop Labs "Close Call" close-1: the fee rule decided the winners
Target: close-1 trading contest (xyz:NVDA)
Data: public referee archive
Author: Joe (Makabeez)
Flop Labs was not a client. This is my own public analysis of close-1, written up in the same format a paying client receives. Everything comes from the contest's public archive, and every number reruns from the linked script. In a paid engagement you'd get this before launch, privately, with a re-check after your fix.
Summary
close-1 was a trading contest on an NVDA perpetual: keys traded with each other in 5-minute sweeps, and prizes went to the best scores at the settlement price. I rebuilt every account from the public archive using the contest's own scoring code, then measured how the top of the board actually got there.
The scoring code itself held up: it reproduces the official results exactly. The rules around it did not. A fee waiver let owners trade for free by putting a second key on the other side, and every fill behind the final top 25 used it. Separately, the live leaderboard ranked players at a price that has no effect on the payout.
1Critical
1High
1Medium
1Held up
Scope and method
| Rules reviewed | Fee rule (rule 12), live-board mark (rule 14), settlement price (rule 7) |
| Data | Public referee archive: 2,556 sweeps, 7,606,301 settled public trades, 9,405,335 keys that traded |
| Method | Replayed every trade with the contest's own account logic (FIFO lots, short collateral, the fee rule as written) and scored every key at the settlement price S = 234.69 |
| Check before measuring | Reproduced 24 of the 25 official final scores to 0.0001 POLF. The 25th key traded in private rooms, whose 499,321 trades are redacted from the archive |
Findings
| ID | Severity | Finding | Status |
| CC-01 | CRITICAL | The fee waiver lets one owner trade free through a second key | Fix written and tested |
| CC-02 | HIGH | The live board ranked players at a price that doesn't pay out | Independent board shipped |
| CC-03 | MEDIUM | Private rooms make some top scores impossible to verify | Recommendation |
| CC-04 | HELD | The account logic reproduces the official results exactly | No action |
CRITICALCC-01
The fee waiver lets one owner trade free through a second key
- What
- Each side of a trade pays
max(1%, discount). A side that trades 1% or more better than the sweep's close pays that gap back instead of the fee. Its entry lands exactly at the close, and the key on the other side pays the 1% and loses the discount. Keys cost nothing, so one owner can sit on both sides and route every fee to a throwaway key.
- Evidence
-
- 5,154,479 trade sides, one in three, skipped the fee this way
- 452,949,720.47 POLF of 1% fees were paid by the key on the other side instead
- 2,061,542 keys traded fee-free at least once; 3,236,971 paid another key's fee at least once
- 772 of the 772 fills behind the final top 25 were on the fee-free side. The three winners made 31, 35 and 23 trades
- Impact
-
The contest stopped measuring forecasting. On close-1's real price path, trading about 44 contracts:
| Strategy | Paying 1% a side | Trading free |
| Perfect foresight of every sweep's close | +589 | +11,639 |
| Naive momentum: long if the last 15 minutes rose | −129,129 | +1,027 |
The winning score was +1,576.92. Paying the fee, even perfect foresight couldn't reach it. For scale, the 99th percentile of all keys that traded was +442.76.
- Fix
-
Charge the fee on top of the gap, not instead of it (clawback_plus):
base = fee_rate × qty × px
gap = (close − px) × qty
buyer = base + max(gap, 0)
seller = base + max(−gap, 0)
A trade at the close still pays 1% a side, a discount is still paid back in full, and the fold stays zero-sum (covered by a test). Every trade now costs each side at least 1%, so a throwaway key can't pay an owner's fee. The patch passes the contest's full build, verify and test suite. The upstream repo was archived on 6 October 2026, so it's published as a ready branch for the next contest.
HIGHCC-02
The live board ranked players at a price that doesn't pay out
- What
- The official live board valued every position at the "global" mark: the average price of the contest's own settled trades. The rules say that mark "marks the live board and sets nothing". Prizes are paid at S, the last Hyperliquid
xyz:NVDA trade before 10:00 UTC on 4 October.
- Evidence
- The two prices sat more than $2 apart at times, and the global mark spiked to about 214 when off-market trades settled. At sweep 381 the board showed its #1 at 207.76 POLF; at the payout price that key was worth about 87 (the second figure rests on a fitted position size). Five community boards built during the contest all ranked at the same global mark.
- Impact
- Players decided whether to hold, add or flip based on rankings that could be wrong by more than half. A board that misstates who is winning invites disputes when prizes are paid.
- Fix
- Show the settlement-price score on the official board, next to the mark-based one. I shipped an independent board that does this, checks every Ed25519 signature on the referee's posts in the browser, and tells each player the final price they need to pass #1 and #3.
MEDIUMCC-03
Private rooms make some top scores impossible to verify
- What
- Trades in private rooms are redacted from the public archive: 499,321 of them. One of the final top 25 traded there, so its score can't be rebuilt from public data. The referee only posts the top 25 by score and the top 10 positions, so keys outside those lists can't be checked either.
- Impact
- Anyone disputing a prize can't independently confirm the result. Here the rest of the top 25 reproduced exactly, so this is a trust gap, not a known error.
- Fix
- The referee already commits a SHA-256 of each sweep's full flow file in its posts. Serving those files after settlement would make every score verifiable without exposing anything during play.
HELDCC-04
The account logic reproduces the official results exactly
- What
- Replaying the archive with the contest's scoring code gave the same final score as the referee for 24 of 25 top keys, to 0.0001 POLF. The 25th is explained by CC-03.
- Meaning
- The math is sound; the problems are in the incentives around it. That's the usual pattern, and it's why a code audit alone wouldn't have caught CC-01.
What a client gets on top
- This report before launch, privately, with the replay or simulation scripts
- A 30-minute call to go through the findings
- A re-run after your fix, confirming each leak is closed