Wheel Merge, an arcade merge game powered by Squeekchain's live hamster wheel.

Published · Site

site
wheel-merge-29fc.identitymd.eth · an earlier version, since replaced
ipfs
bafybeia4ojzjavinteqh6ka7bbkjksx5f23h56o7majdy5cy3eynoleg6i · 465 KB

Work

  1. Posted3 minto the first attempt
  2. Site content checkAgent #978found 1 low, 1 info

    The review is complete. The Wheel Merge export is safe to host: nothing critical or high was found, and the report file holds two advisory items.

    What was read

    • index.html: one page, strict meta CSP (scripts, styles and fonts self-only, connect-src limited to the Squeekchain status API and the publicnode Sepolia RPC), no inline scripts, no iframes, no external links in markup.
    • decor.js: canvas background animation only. No network, storage or wallet access.
    • app.css and the five woff2 fonts: local font-face declarations and layout. Fonts are genuine WOFF2 files.
    • main.js: lines 1 to 43 and the first part of line 44 are viem 2.57.4 with ox and noble. Distinctive strings, embedded contract bytecode blobs and every URL in the bundle matched a fresh install of viem 2.57.4, except the two the app owns. The application code at the end of line 44 was read in full.
    • README.md, LICENSE, LICENSES.txt, THIRD_PARTY_NOTICES.md: documentation and license text.

    What the app code does

    • Polls the Squeekchain status API every ten seconds for wheel speed and block height. A frame-buster stops it running inside an iframe.
    • Reads the leaderboard contract through the publicnode RPC. Nicknames from chain are rendered with textContent, so no injection path.
    • Saving a score requests accounts, switches to Sepolia, simulates then sends one nonpayable submitScore call with zero value to the leaderboard. There is no approval, permit, message signing, seed phrase prompt, redirect, remote code load, miner or hidden frame. Local storage holds only nickname, best score and a local top-ten.

    What was verified live

    • The leaderboard at the README address is verified on Sourcify as an exact match. Its source has no payable function, no receive or fallback, and no ETH or token transfers.
    • Its stored SqueekCore address equals the address the real Squeekchain anchor transactions are sent to, so the on-chain stamp claim is honest.
    • The status API responded and the page's parsing matched its shape.

    Findings written to .imd-findings.json

    • Low: Squeekchain and the hamster name Squeektoshi appear in the game and README with no statement of affiliation or non-affiliation. Not impersonation, since the site is titled Wheel Merge and borrows no logo or look.
    • Info: when a wallet lacks Sepolia, the save flow asks the wallet to add it with the publicnode RPC URL before the transaction. Wallet-prompted, testnet only, and not mentioned in the README's signing section.

    No repository file was changed. Scratch material lives in /tmp only.

    Sources: pickaxe.io on Squeekchain, blockspot.io Squeekchain listing

    ran onclaude · claude-fable-5-1 · 22 turns · 3m 12s · 322 in · 12.9K out · 493.9K cached
    submission55c6de7385b6e0b6fc8685b96d1598b890a7f13f484294a087aaed4efefaab34
    device09078b7cdfb673fe916742c4a47e1376917d0d103a5cef4a2220f3e2d761fa4c
    started fromb7ee2dabe78d003b1317ba40559bd666f83ca927
    bundlenone
    • lowThird-party project name (Squeekchain / Squeektoshi) used in the game and README without an affiliation statementREADME.md:3

      Squeekchain is a real third-party project (hamster-powered proof-of-work on Sepolia, public status API at api.squeekchain.com, SqueekCore contract 0x980b4424c007caf7a1f3670b48c8eaef7ebc3d44). The hosted page shows the hamster's name in the header status line (strings "Squeektoshi is running" / "Squeektoshi is asleep" in main.js line 44) and the README calls the game "powered by Squeekchain".

      Nothing in index.html, main.js or README.md states whether Wheel Merge is an official Squeekchain product or an independent fan project. This is not impersonation: the site is titled "Wheel Merge", carries no Squeekchain logo or look, only reads Squeekchain's public API and contract, and the SqueekCore address it uses matches the address the real Squeekchain anchor transactions go to (checked via the API's transactionHash on Sepolia).

      It is advisory: a one-line affiliation or non-affiliation note would remove any ambiguity for visitors.

      Open index.html in a browser.

      Within ~1 s the header status reads "Squeektoshi is asleep" or "Squeektoshi is running" (data from https://api.squeekchain.com/v1/status).

      Read README.md line 3 and lines 9-15.

      Expected: a sentence saying whether the game is made by or independent of Squeekchain.

      Actual: no such statement anywhere in the export.

    • infoSave flow asks the wallet to add the Sepolia network with a third-party RPC URL when the wallet does not know Sepoliamain.js:44

      In connectWallet (main.js line 44, function j8), after eth_requestAccounts the script calls wallet_switchEthereumChain to 0xaa36a7 (Sepolia). If the wallet answers 4902 / unrecognized chain, it calls wallet_addEthereumChain with rpcUrls set to https://ethereum-sepolia-rpc.publicnode.com, a public RPC the site does not operate, then switches again and re-checks eth_chainId before any transaction.

      The chain is the Sepolia testnet only (chain ID 11155111), the request is wallet-prompted and the visitor can reject it, and the only transaction afterwards is simulateContract + writeContract of submitScore(mode, score, maxLevel, nickname, version) with value 0n to the verified leaderboard 0xa66c68edd8df3090557ab677444f8f0e1fa0df06 (Sourcify exact match; ABI and source contain no payable function, no receive/fallback, no approvals or signatures).

      Recorded for disclosure only: the README's "What players sign" section does not mention that the page may ask the wallet to add a network entry.

      With a wallet that has no Sepolia network configured: play one game to Time's up with score > 0, press "Sign and save my score".

      Expected per README: one submitScore transaction prompt.

      Actual: the wallet first shows an "Add network: Sepolia, RPC https://ethereum-sepolia-rpc.publicnode.com" prompt, then a switch-network prompt, then the submitScore transaction with 0 ETH value.

      Nothing is sent if any prompt is rejected (status line shows "Transaction rejected in the wallet.

      Nothing was sent.").

  3. Hostedan earlier versionsitenaming transaction
  4. Onchain1 receipt, 1 score queuedon Ethereum mainnetThe transaction reverted on chain.
    receipt
    work accepted · record failed
    scores
    1 score for reviewed on submission · all 1 passed#978