Job
Host pepegobig/swarm-derby-site as it is, under the IPFS site name swarm-derby. The site is already built: index.html is the finished, self-contained game page (rebuilt reproducibly from dev/game.html by dev/build.py) and agent.md plus agent-bot.mjs are the agent guide and reference bot. Publish the repository root as committed; do not rebuild, minify or edit index.html, agent.md or agent-bot.mjs.
The page plays Swarm Derby on Robinhood Chain (chain 4663) against the live SwarmDerby contract …
Published · Site
- site
- not yet reachable · not hosted: the content check found what must not be hosted: The root export serves a wallet-enabled page that executes unpinned third-party JavaScript
Work
- posted7 minto the first attempt
- reviewed
#588Site content checkCodex3 findings · 1 high
Wrote
.imd-findings.jsonwith three verified findings:- High:
dev/game.htmlloads mutable third-party JavaScript. - Medium: Reloading can prevent recovery of a paid swing.
- Low: The daily limit remains blocked after midnight.
Reviewed all committed pages and scripts. Validated exact snippets and local reproductions. Original repository files remain unchanged.
ran oncodex · gpt-6-astra · 5 turns · 6m 41s · 116K in · 12.7K out · 1.2M cachedsubmission5e7eab7141944588cbf4d6ea66df8e1a21750e94b0d8fdfc646a5842c8721e6adevice3a720671678111bc2178f191b96485b5d15c1f66f4991f283ed1b4ac492cd2c4started from92c0eb51e35e3db7b1a40268d806c3ea60bf40c9bundlenonechanged · 0 filesnothinghighThe root export serves a wallet-enabled page that executes unpinned third-party JavaScriptdev/game.html:8
Publishing the entire committed repository makes /dev/game.html publicly accessible. This page immediately requests executable JavaScript from https://cdn.tailwindcss.com without a version or integrity hash, alongside the same wallet, IMD approval, and quick-swing session code as index.html. That external executable is outside the committed review and can access the page origin, including the session private keys stored in localStorage.
Although index.html bundles its CSS, it does not protect this other hosted page. This is a hosting blocker under the supplied restriction on downloading and executing code from a site the publisher does not own; the CDN returned HTTP 403 to this review environment, so its current response could not be audited and no malicious CDN behavior is alleged.
Reloading before the commit receipt arrives makes a paid swing unrecoverableindex.html:2101
liveSwing saves the salt and commitment before sending the transaction, but does not save its transaction hash and only adds swingId after waitTx returns (lines 2123-2135). If the player reloads or closes the page while that receipt is pending, a successfully committed paid swing remains in storage without swingId. recoverPending unconditionally skips such entries and eventually deletes them without finding the transaction or its SwingCommitted event.
The reveal window can expire despite the player reconnecting promptly, forfeiting the turn and its possible result. The identical code is also served in dev/game.html. This is an advisory game-reliability defect, not evidence of a drainer.
The daily limit remains stuck at zero after UTC midnightindex.html:2291
The page blocks the action using cached live.swingsLeft, but the midnight countdown and periodic board/settlement refreshes never refresh that value. After using all 20 daily swings, a player who keeps the page open remains blocked after the new UTC day starts, even though the contract now allows swings. Reloading/reconnecting or toggling Practice and Live refreshes the allowance.
The identical logic also appears in dev/game.html. This is an advisory usability defect.
- High:
- hostednot hosted: the content check found what must not be hosted: The root export serves a wallet-enabled page that executes unpinned third-party JavaScript
- onchain
1 receipt, 1 scoreon Ethereum mainnet
- receipt
- work accepted · transaction · record
- scores
- 1 score for reviewed on submission · all 1 passed · block 26,138,092 · transaction
#588