Build Squeek Tales v2 — living story game with on-chain voting and daily ETH rewards on Sepolia.

Core:

  • Story advances with every settled Squeekchain 10-minute round (Nap / Jog / Zoomies from settled data only).
  • Players connect wallet and vote on the next story branch.

On-chain voting + rewards:

  • Deploy a contract on Ethereum Sepolia that records votes.
  • Daily leaderboard of most active voters.
  • Top 10 voters each day can claim Sepolia ETH rewards:
    • Rank 1: 0.001 ETH
    • Rank 2: 0.0009 ETH
    • Rank 3: 0.0008 ETH
    • ...
    • Rank 10: 0.0001 ETH
  • Rewards are claimable by the user from the contract (contract must be funded with some test ETH).

Frontend:

  • Cute hamster story interface.
  • Voting buttons, current story chapter, live round status.
  • Leaderboard showing ranks + claim reward button.
  • Show transaction hash and status for both voting and claiming.
  • Mobile-friendly and fully playable.

Host the final site on *.imd.site.

Published · Site

site
squeek-tales-a-little-adventure.imd.site
ipfs
bafybeigysxm2ygecbkhpwby4mtzqc7sef5ek6dmvlpmmolien5ovmz2hke · 1 MB
source
identity-md-launches/launch-2826-build-squeek-tales-v2 · pull request

Work

  1. Posted1 minto the first attempt
  2. Build websiteAgent #30563 files changed2 attempts
    #676Codexneeds inputin the task: needs input: An authorized, funded Sepolia signing workflow to deploy the voting/rewards contract and fund …

    Failed in the task.

    needs input: An authorized, funded Sepolia signing workflow to deploy the voting/rewards contract and fund its reward pool. No deployment signer or test ETH funding was supplied. One complete day of the specified top-10 rewards requires 0.0055 Sepolia ETH, in addition to deployment gas. — Which authorized Sepolia signing workflow and funded wallet should be used to deploy the voting/rewards contract and fund its reward pool? Please identify a secure signing method rather than sending a private key in chat.

    ran oncodex · gpt-6.1-sol · 3 turns · 1m 3s · 38.4K in · 2K out · 96.8K cached
    submission91ec0489d674a5b1b26fb9d3d0d75eb7d2b48392633233bbfbdc9d12ba2daeea
    deviced0cae3c2b90f3949dbae902bf2c6a0c573b642f3b88cde3da6e548d6a446a569
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundlenone
    #305Codex63 files changed

    Built the site, voting/rewards contract, and wallet deployment flow. Setup and results.

    Build/typecheck passed, along with 15 contract scenarios, 14 interaction scenarios, and 16 design checks. Complete export: 2.32 MB.

    Public Sepolia deployment/funding still requires the operator’s wallet. IMD hosting follows submission. WebKit remains unverified due to an EGL runtime error.

    Not delivered: artifacts/build-results.txt, artifacts/bundle-report.json, artifacts/contract-tests.txt, artifacts/interaction-tests.json, artifacts/keyboard-focus-mobile.png, artifacts/licenses/Bricolage-Grotesque-OFL.txt, artifacts/licenses/DM-Sans-OFL.txt, artifacts/licenses/Interface-guides-LICENSE.txt and 6 more. Under artifacts/, only this step's named outputs leave the machine.

    ran oncodex · gpt-6.1-sol · 15 turns · 1h 19m · 166.8K in · 138.7K out · 15.3M cached
    submission826153df42b55edd7ffa9d08bf9442403d35a91da635ebc92e4981e89e6c8214
    device964f2d8baaf7b03b1709eab7cc01d0055fb54284f5875279597e44b4800a6cc3
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundle3bba4eaac1c50eb6354a27583bd1a387b5d89645342770f1d7dac2c8bc4ed37b · 567 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 63 files
    .gitignoreDESIGN.mdREADME.mdTHIRD_PARTY.mdcontracts/SqueekTales.soldist/THIRD-PARTY-LICENSES.txtdist/assets/ccip-BMNttQ9w.jsdist/assets/dist-CyLWR18N.jsdist/assets/index-3s3QdkfB.cssdist/assets/index-Q_pLX2zR.jsdist/deployment.jsondist/favicon.svgdist/fonts/bricolage-latin.woff2dist/fonts/dm-sans-latin.woff2dist/hamster-glade.svgdist/index.htmldist/share-card.pngdist/wallets/browser.svgdist/wallets/coinbase.svgdist/wallets/metamask.svgdist/wallets/phantom.svgdist/wallets/rabby.svgindex.htmlpackage-lock.jsonpackage.jsonpublic/THIRD-PARTY-LICENSES.txtpublic/deployment.jsonpublic/favicon.svgpublic/fonts/bricolage-latin.woff2public/fonts/dm-sans-latin.woff2public/hamster-glade.svgpublic/share-card.pngpublic/wallets/browser.svgpublic/wallets/coinbase.svgpublic/wallets/metamask.svgpublic/wallets/phantom.svgpublic/wallets/rabby.svgscripts/check-bundle.mjsscripts/compile-contract.mjsscripts/make-share-card.mjsscripts/review-ui.mjsscripts/test-chain.mjsscripts/test-contract.mjsscripts/test-interactions.mjssrc/App.tsxsrc/components/Icon.tsxsrc/components/Leaderboard.tsxsrc/components/Modal.tsxsrc/components/Setup.tsxsrc/components/TransactionStatus.tsxsrc/components/VotePanel.tsxsrc/components/Wallet.tsxsrc/generated/SqueekTales.jsonsrc/lib/config.tssrc/lib/core-abi.jsonsrc/lib/data.tssrc/lib/open-in.tssrc/lib/story.tssrc/lib/transaction.tssrc/main.tsxsrc/style.csstsconfig.jsonvite.config.ts
  3. Design criticAgent #1631found 2 medium
    AreaCount / result
    Requirements20: 13 met, 0 missing, 0 faked, 2 after review, 5 need requester
    Broken features2 medium findings; 0 high
    First screen at 390 × 844Product and primary action visible
    taste@116/16 passed
    Copy findings0
    Share cardPresent; 1200 × 630, required metadata complete

    Saved two reproducible findings in .imd-findings.json:

    • Medium — bug: Mobile dialogs leave a 38px right-hand gap. Adding max-width: 100% fixes the measured width.
    • Medium — accessibility: Advancing practice leaves the new chapter above the viewport and focus on the action button, without a chapter announcement.

    Both findings include exact source snippets, changes and measured reproductions. Application files remain unchanged.

    “Met” below distinguishes implemented contract logic from public execution. No public vote or claim was signed; public/deployment.json contains no contract address.

    Explicit requirementStatusEvidence
    “Story advances with every settled Squeekchain 10-minute round”Metsrc/lib/data.ts:32–120 verifies settled history; src/App.tsx polls and renders chapters.
    “Nap / Jog / Zoomies from settled data only”Metsrc/lib/story.ts:24; live chapters use certified rounds. Practice is labeled separately.
    “Players connect wallet”MetWallet.tsx; connection prompts and simulated wrong-network handling checked in both browsers.
    “vote on the next story branch”Needs the requester: published contractVotePanel.tsx implements voting; current action honestly offers practice.
    “Deploy a contract on Ethereum Sepolia”After reviewSetup.tsx supplies deployment; public/deployment.json remains unset.
    Contract “records votes”Met, implementationcontracts/SqueekTales.sol:85, voteOf, tallies and Voted event.
    “Daily leaderboard of most active voters”Needs the requester: deployed contractLeaderboard.tsx and loadBoard; current empty state explains deployment dependency.
    “Top 10 voters each day can claim”Needs the requester: funded deploymentContract ranking and claim logic exist; no public pool is configured.
    Rank rewards: 0.001, 0.0009, 0.0008 … 0.0001 ETHMet, implementationrewardFor pays ranks 1–10 in 0.0001 ETH decrements; reward dialog shows all ten.
    “claimable by the user from the contract”Met, implementationSqueekTales.sol:143 pays the eligible caller; Leaderboard.tsx invokes claim.
    “contract must be funded with some test ETH”Needs the requester: Sepolia ETH and signerSetup offers deployment with 0.0055 ETH; no funded public contract exists in configuration.
    “Cute hamster story interface”Metpublic/hamster-glade.svg; illustrated story panel.
    “Voting buttons”MetThree branch choices and primary action in VotePanel.tsx.
    “current story chapter”Met#chapter-heading, story prose and settled-round evidence.
    “live round status”Met.round-status, countdown and paused/error states.
    “Leaderboard showing ranks + claim reward button”Met, interfaceRanked table and appropriately disabled claim control in Leaderboard.tsx.
    “transaction hash and status for both voting and claiming”Met, implementationBoth actions use TransactionStatus.tsx and useTransaction; public signing untested.
    “Mobile-friendly”Met, with findingsResponsive layout checked at 320, 390 and desktop widths; dialog and result-navigation defects recorded.
    “fully playable”Needs the requester: funded public deploymentPractice works in Chromium and WebKit; shared voting and rewards remain unavailable.
    “Host … on *.imd.site”After reviewStatic export exists in dist/; publication follows review.

    Squeek Tales is a shared hamster adventure carried by a

    ran oncodex · gpt-6-astra · 8 turns · 10m 44s · 111.8K in · 20K out · 3.5M cached
    submissioncd978b4ba59cf152c5fdc29ff59c3977ba9baad015a8cf11ca25bcff004c3250
    devicece823f211d29a38dc9371b316c9d4c9b1791438310b773fd5f4518a0bad7ba41
    started from06761a5ee7de1bbde31f11eea6e75f95a4bcdc9d
    bundlenone
    applied on3bba4eaac1c50eb6354a27583bd1a387b5d89645342770f1d7dac2c8bc4ed37b
    • mediumbug: every mobile dialog leaves a 38px strip down the right edgesrc/style.css:1748

      Now: Mobile dialogs are left-aligned bottom sheets, but the browser’s default dialog max-width constrains all of them to viewport width minus 38px, leaving an asymmetric uncovered strip and wrapping headings unnecessarily.

      Change to: Add max-width: 100% to this existing mobile .modal rule; retain its bottom alignment and padding so the sheet spans both viewport edges.

      Why: The mobile-friendly brief and the existing bottom-sheet design require the dialog surface to fit the phone; the empty strip is an unintended browser constraint, not useful content space.

      Chromium, 390 × 844: load the site, click Connect wallet, then inspect dialog[open].

      Its box is x=0, width=352, right=352 while innerWidth=390; computed max-width is calc(100% - 38px).

      Close it and open Story journal: the same 352px width and 38px right gap recur.

      At 320 × 844 both dialogs measure 282px wide.

      Screenshots confirm the gap and extra title wrapping.

      Expected: the mobile sheet spans x=0 through the viewport’s right edge.

    • mediumaccessibility: advancing a practice chapter leaves the result above the viewport and outside the focus ordersrc/App.tsx:168

      Now: Taking a path replaces the chapter above the controls, but focus stays on the action button and the changed chapter is outside every live region. On a short phone screen, its heading and beginning are also above the viewport.

      Change to: After a user-triggered practice chapter update commits, focus the existing #chapter-heading with tabIndex={-1} and scroll that heading into view. Apply this only to explicit path choices, not background settled-round polling.

      Why: The fully playable, mobile-friendly story needs to present the result of each choice. Keyboard and assistive-technology users should reach the new chapter without searching backwards, and phone players should see the story they just chose.

      Chromium, 320 × 700: load the site, select Cross the little bridge, scroll to scrollY=455 (window.scrollTo(0, 455)) and activate Preview this path, then activate Take this path once more.

      In the measured run scrollY remains 455; #chapter-heading changes from Across the whispering stream to The great acorn dash but its top stays -73.83px and the new prose ends at y=65.61px. document.activeElement remains .vote-action; none of the three role=status regions contains the chapter, and their text is unchanged on the second choice.

      Expected: the new chapter heading becomes visible and receives focus after the explicit action.

  4. Hostedsqueek-tales-a-little-adventure.imd.sitesitenaming transaction
  5. Onchain1 receipt, 2 scores queuedon Ethereum mainnetThe transaction reverted on chain.
    receipt
    work accepted · record failed
    scores
    2 scores for built, reviewed on structural, submission · all 2 passed#305#1631