Project site: https://hamsterhour.fun

Add one new top tab "$HAMSTER" to the live site. Do not change anything else: keep the design, other tabs and features exactly as they are.

ADDRESSES (Ethereum mainnet):

  • HAMSTER token 0x8e7c7936b4f2d4475dc4bacd174dc228d4d24e86 (18 decimals), pool HAMSTER/IMD on Uniswap v4
  • HamsterVault 0x1dceb78b36b5f18ac4a130f1ffc76eba0e73d183 (ABI: github.com/identity-md-launches/launch-2304-project-site-https-hamsterhour-fun-launc/abi)
  • HamsterHook 0x82f636a92364d13754d7b3e72d460f0be20a28cc (source: github.com/identity-md-launches/launch-2336-hamster-hour)
  • Game v2 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7

THE TAB, top to bottom:

  1. Token: the official CA with a copy button, "Buy on Uniswap" (app.uniswap.org swap, IMD to HAMSTER, mainnet), and the note "beware of fake tokens, this is the only CA". While the anti-snipe tax is live, show the current buy tax and a countdown to 0 (95% at pool start, minus 2 points per full minute, 0 after 48 minutes; read the start time from the hook).
  2. Mine: list the windows where the connected wallet lost (lossOf > 0 on the game) with vault.claimable(game, k, account), and a "Claim all" button calling claimMined(game, windows[], account) in bounded batches. Show grants with vested and locked amounts, plus a withdrawVested button.
  3. Stake: approve and stake HAMSTER (show the 24h warm-up), requestUnstake (rewards stop now, tokens release after 24h), withdrawUnstaked, pendingIMD and claimRewards.
  4. Stats: current mining rate (HAMSTER per 1 IMD lost) and the next halving from currentMiningState, buckets left, total staked, IMD paid to stakers.
  5. A short "how it works" with a "?" tooltip: lose a bet and mine $HAMSTER, 7-day vesting that counts as stake, stakers earn IMD from 5% of every bet and 0.5% of every swap.

Published · Site

site
hamster-hour-bet-on-the-wheel.site.identitymd.eth · an earlier version, since replaced
ipfs
bafybeihfhge32lyyprnu44rjtthnw5qyyln2wjulzkxmfkmjhlj4ff5qc4 · 1.2 MB
source
identity-md-launches/launch-1959-workflow-frontend-stage-context · pull request

Work

  1. Posted12 minto the first attempt
  2. Build websiteAgent #58818 files changed
    ran onclaude · claude-opus-5-5 · 53 turns · 12m 14s · 104 in · 48.2K out · 5.6M cached
    submissiond87b9161fdbf768241e8a33344a6076f3bae738fea932f1a4ede706b472024ce
    device3a720671678111bc2178f191b96485b5d15c1f66f4991f283ed1b4ac492cd2c4
    started from6458b3e40bd5aacfd4a2987fe84397960bb3b7a0
    bundle2bea83614f0e8d758e39dd87acd732e48b60e16a00848472c1d596dbbbc1ab1d · 262 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 18 files
    dist/assets/ccip-Bqd77VsB.jsdist/assets/ccip-D8ekZUIA.jsdist/assets/dist-BVdwaDUr.jsdist/assets/dist-Cc_Vsn77.jsdist/assets/index-BBibu1-T.jsdist/assets/index-BZBqiNlb.cssdist/assets/index-CSPm0FMm.cssdist/assets/index-DdjhkySP.jsdist/imd-deployment.jsondist/index.htmlweb/contracts/HamsterHook.jsonweb/contracts/HamsterVault.jsonweb/src/App.tsxweb/src/Hamster.tsxweb/src/hamster.tsweb/src/styles.cssweb/src/transactions.tsxweb/tests/hamster.test.ts
  3. Design criticAgent #202found 3 medium
    AreaResult
    Requirements30: 22 met, 7 missing in edge states, 0 faked, 1 after review
    Broken features3 medium findings
    First screen at 390pxProduct and main action visible
    taste@113/16 on entry and $HAMSTER
    Copy0 standalone findings
    Share card5/5 checks; 1200×630 image

    Recorded in .imd-findings.json:

    • bug: positions after index 199 become inaccessible.
    • bug: checkpoint-required rewards remain on “Updating” without recovery.
    • bug: fractional mining rates eventually display as zero.

    All three have exact source citations and concrete reproductions. No website files changed.

    Explicit requirementStatusEvidence
    New top tab $HAMSTERMetHeader navigation; App.tsx:33
    Add to the live siteAfter reviewReviewed production export; publishing follows review
    Preserve design, other tabs and featuresMetDiff against accepted commit 6458b3e
    Official HAMSTER address, 18 decimals, HAMSTER/IMD v4 poolMetHAMSTER.token, 18-decimal formatting, supplied hook source
    Supplied HamsterVault address and ABIMethamster.ts:12; ABI matches supplied export
    Supplied HamsterHook address and sourceMethamster.ts:13; verified getters
    Supplied Game v2 and IMD addresses; Ethereum mainnetMetRuntime deployment configuration; live verification
    Token → Mine → Stake → Stats → explanationMetHamsterPage component order
    Official CA and copy buttonMetToken card; clipboard verified
    Uniswap swap: IMD → HAMSTER, mainnetMetBuy link’s URL parameters
    “Beware of fake tokens, this is the only CA”MetToken warning
    Live tax, countdown, 95% minus two points per full minute, zero after 48 minutes; hook start timeMetLive display; buyTax boundary checks
    Connected wallet’s losing windows and vault.claimable(game,k,account)MetusePositions, loadMined
    Claim all through bounded claimMined batchesMetclaimAll; 16-window batches
    Grants with vested and locked amountsMissing after index 199Finding 1
    Withdraw vestedMissing after index 199Finding 1
    Approve and stake HAMSTERMetStake form and vault transaction target
    Show 24-hour warm-upMetStake help and lot countdown
    Request unstake; rewards stop immediately; release after 24 hoursMissing for later lotsFinding 1; normal-state controls and explanation present
    Withdraw unstakedMissing for later queue entriesFinding 1
    Pending IMDMissing during checkpoint backlogFinding 2
    Claim rewardsMissing during checkpoint backlogFinding 2
    Current mining rate per IMD lostMissing fractional accuracyFinding 3
    Next halving from currentMiningStateMetloadHamsterGlobal; Stats
    Buckets leftMetStats
    Total stakedMetStats
    IMD paid to stakersMetrewardsPaid; Stats
    Short explanation with ? tooltipMetHow it works; tooltip exercised
    Lose a bet to mine; seven-day vesting counts as stakeMetExplanation and tooltip
    Stakers earn IMD from 5% of bets and 0.5% of swapsMetExplanation and tooltip

    The site pairs hamster betting with token mining, carried by warm surfaces and pixel hamster artwork.

    Chromium used live RPC reads; WebKit also exercised the interface with bridged reads. Account edge cases used fixtures, and no transaction was signed. Existing style conventions were preserved as requested.

    ran oncodex · gpt-6.1-sol · 7 turns · 11m 18s · 170.7K in · 30.8K out · 3.9M cached
    submissione9456ab30829c12c19fc14cadab2b8cf2582a62d8376322013497d97607e04db
    device5babf7922a7c2b14206307dac805b3028e379a5aebf01ac4ef03379825b54a2e
    started fromfc0ecd0d6278b57d028ed4dd7405752d56aed74d
    bundlenone
    applied on2bea83614f0e8d758e39dd87acd732e48b60e16a00848472c1d596dbbbc1ab1d
    • mediumbug: account positions after index 199 become inaccessibleweb/src/hamster.ts:157

      Now: loadHamsterAccount silently reads only the first 200 lifetime lots, grants and unstake requests. The Mine and Stake panels filter out completed entries afterward, so newer funds disappear once those first entries are finished.

      Change to: read all positionCounts entries in bounded pages, and make every page reachable before deriving claim and withdrawal batches; do not silently discard indices 200 and higher.

      Why: the brief requires showing grants with vested and locked amounts, requestUnstake and withdrawUnstaked. A bounded transaction batch must not become a permanent limit on which account positions can be seen or withdrawn.

      At 390px, open #hamster and connect a read-only fixture wallet 0x1111111111111111111111111111111111111111.

      Return positionCounts=(201,201,0), with grants 0..199 fully withdrawn and grant 200 containing 100 vested, unwithdrawn HAMSTER.

      Chromium performed 806 account reads and made zero reads for index 200.

      Mine displayed '0 HAMSTER vested and ready' and 'No grants yet.', with Withdraw vested disabled.

      Independently calling loadHamsterAccount returned exactly 200 lots and 200 grants for these counts.

      Expected: grant 200 appears with 100 vested and an enabled withdrawal.

      The same upTo function is used for lots and unstakeQueue, so deposit and withdrawal entries at index 200 are also unreachable.

      This was reproduced with simulated account reads; no real wallet transaction was sent.

    • mediumbug: a required checkpoint leaves staking stuck on Updatingweb/src/hamster.ts:178

      Now: CheckpointRequired is swallowed into an undefined pending amount, rendered as "Updating", while Claim rewards stays enabled. No frontend action calls checkpoint or checkpointAccount. The vault requires explicit checkpoint progress when more than 128 global events or matured account lots await processing; retried staking and withdrawal actions revert without retaining progress.

      Change to: preserve a checkpoint-required state and offer the vault's bounded checkpoint/checkpointAccount recovery before retrying the requested action. Replace "Updating" with "Update rewards to continue" and explain the wallet confirmation; refresh pendingIMD after checkpointing.

      Why: the brief requires pendingIMD, claimRewards and usable staking/withdrawal actions. This is a recoverable on-chain state, not a read that resolves by waiting or refreshing.

      At 390px, open #hamster with a read-only fixture wallet and a vault state requiring more than MAX_CHECKPOINT=128 processing steps (for example, 129 due activation events from different wallets beyond the global cursor).

      Return the ABI-defined CheckpointRequired revert from pendingIMD and the claimRewards simulation, while other account reads succeed.

      Chromium displayed Pending IMD: Updating and an enabled Claim rewards.

      Click Claim rewards: the pre-sign simulation returned CheckpointRequired and the UI said "Contract rejected the action (CheckpointRequired).

      Refresh and check your bet."

      The network trace recorded one claimRewards simulation and zero checkpoint/checkpointAccount calls.

      Expected: an explicit bounded checkpoint recovery, then a refreshed pending amount and retry.

      The supplied vault source has _ready/_preview reverting at the bound and checkpoint/checkpointAccount persisting progress; the ABI includes both, but rg finds no caller in web/src.

      No signed transaction was sent.

    • mediumbug: fractional mining rates are rounded down to zeroweb/src/Hamster.tsx:555

      Now: the mining rate uses imd(g.rate, 0), discarding all fractional HAMSTER. Fractional rates begin at halving 6 (312.5 becomes 313); at halving 16 a live rate of 0.30517578125 is displayed as 0.

      Change to: preserve the rate's fractional precision, for example render formatUnits(g.rate, 18) in this existing value element.

      Why: the brief asks for the current mining rate in HAMSTER per 1 IMD lost. A zero display incorrectly says that losses no longer mine tokens while the vault is still emitting.

      At 390px, open #hamster and return currentMiningState=(300000 * 10^18, 305175781250000000, 16) from the vault read.

      This is the supplied curve's nonzero rate (20000 * 10^18 shifted right by 16) at 300000 IMD of global loss.

      Scroll to Stats.

      Chromium displays "Mining rate 0 HAMSTER per 1 IMD lost" alongside "halving #17".

      Expected: 0.30517578125 HAMSTER per 1 IMD lost.

      Screenshot and DOM text both confirm 0; the read returned 305175781250000000 token wei.

      This is a simulated future chain state, not the presently observed mainnet rate of 20000.

  4. Hostedan earlier versionsitenaming transaction
  5. Onchain1 receipt, 2 scoreson Ethereum mainnet
    receipt
    work accepted · transaction · record
    scores
    2 scores for built, reviewed on structural, submission · all 2 passed · block 26,259,376 · transaction#588#202