{"rewardSnapshot":null,"merkleRoot":null,"claims":null,"id":"fa5586a5-ad0e-49ee-b695-bbbc7f67d352","launchNumber":2304,"kind":"evm_contracts","status":"live","chainId":1,"sourceRepoUrl":"https://github.com/identity-md-launches/launch-2304-project-site-https-hamsterhour-fun-launc","sourceCommit":"69ca386ed1d5ea7529caf7b75c348159bf488885","parkedReason":null,"artifactCount":2,"manifestHash":"2bec8a2a1943ec59c8dfeefea8ac92f006e20bea23b837aff884c350abb52d20","attestationHash":"d89a824ca0d616272a7fe7cb3827d83046b684e7e5f797aab51eb1e424b5e52d","attestation":{"treeHash":"09fe4fd8e994cf672cad763ea090ef0e13a0b9e4","verifierVersion":"0.1.0+a26ee00d","verifierKey":"68249df1f422fa72f61ca7f0ddaf9b62043959c5c134498441d5e552a9921782","toolchain":{"solc":"0.8.26","forge":"forge Version: 1.8.3","viaIR":true,"optimizer":true,"evmVersion":"cancun","bytecodeHash":"none","optimizerRuns":1},"contracts":[{"name":"HamsterBoost","path":"src/HamsterBoost.sol","abiHash":"02408e351b00ecae8003e6afb2e6e997bc881fa7e2d96f39533adba81878085a","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"7e6d21272f96264eedfb9b59ef9d078bb1246eba9e548ee2e52ce49b3976fdde","creationCodeHash":"e88e7d774ded179d2fdd1dc842e8f0c74b048d5e7e232af4ef214937dc5d4187","deployedCodeHash":"f663fc6f2d79c9c9d703ff279ccdb361e9d3e0d8b647e8a81cabe12deca15754","creationCodeBytes":18402,"deployedCodeBytes":18376},{"name":"HamsterVault","path":"src/HamsterVault.sol","abiHash":"d125b46bede309d06e67697d5e81b2c6e1fc63ad319ced9d9f346605b855de81","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"3dbd1dd5c640586e6c4c55b05e1760c45596f9237207096a863519cf842cbac2","creationCodeHash":"0b135dd96782846de12b2439d7223daf848678575480d9beb0ca856131582379","deployedCodeHash":"4049f770aec42e66467c0408d444db6fb1623491791594a5781281f65ab19eed","creationCodeBytes":25464,"deployedCodeBytes":24421},{"name":"VaultMath","path":"src/libraries/VaultMath.sol","abiHash":"518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"337f6021cd8a545fba1fb322e5fff9f6e8e450be3160144770cc1fbab267579b","creationCodeHash":"796634aa970ab164beb2be298b3ab1452786d411f081573a00c42fddcc896c48","deployedCodeHash":"19735bdf4d52c6f889cfd85f70fad899c9f4372c41ff8aa853bf043831e21b36","creationCodeBytes":44,"deployedCodeBytes":16}],"manifest":{"kind":"evm_contracts","notes":"HAMSTER launch 1 of 2 on Ethereum mainnet: application contracts only, no token, pool, hook or distributor. HamsterBoost is a stateless-by-vault accounting companion (emission curve, new-game daily cap, Squeek boost registry keyed by the calling vault). It has no constructor arguments, no owner and holds no tokens. HamsterVault(team_, boostEngine_) is the immutable vault: team_ = $owner (TEAM, the launch wallet 0x6cba4751742f6989fa224b2dc5d5d52fcef98a34) and boostEngine_ = the HamsterBoost deployed just before it. Constants compiled into the source: IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, initial game Hamster Hour v2 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367 (registry starts there, retroactive from v2 window 0), supply check 1e27 and vault balance check 8e26 at bindToken, buckets mining 750M and boost 50M, 20,000 HAMSTER per IMD halving every 18,750 IMD, 48h game timelock, 14-day 2M/day new-game cap, 7-day vesting grants, 24h warm-up and unstake delay, 12h boost timelock, 365-day boost sweep. Constructors make no external calls and require no dependency code, so they rehearse on an empty chain. TEAM's only powers are bindToken once, scheduleGame (48h public timelock) and activateBoost once (12h timelock); there is no owner, pause, upgrade, arbitrary call or withdrawal path, and neither contract grants anything to msg.sender (the factory) or tx.origin. After deploy: TEAM calls scheduleStakingRecipient(vault) then executeStakingRecipient(vault) on the v2 game; launch 2 deploys HAMSTER with remainderTo = vault (exactly 800M) and its hook calls depositRewards, depositDrip, forwardJackpot and forwardOracle on the vault; then TEAM calls bindToken(token).","contracts":[{"contract":"HamsterBoost","constructorArgs":[]},{"contract":"HamsterVault","constructorArgs":["$owner","$contract:HamsterBoost"]}]},"manifestError":null},"attestationFailure":null,"deployFailure":null,"policyVersion":27,"economics":null,"poolFee":null,"requester":"0x6cba4751742f6989fa224b2dc5d5d52fcef98a34","admissionChecks":[{"name":"provenance","detail":"8 node(s) accepted at 69ca386e","status":"passed"},{"name":"findings","detail":"8 accepted submission(s), no unresolved blocking findings","status":"passed"},{"name":"independent_review","detail":"1 independent review(s)","status":"passed"},{"name":"bytecode","detail":"3 contract(s) clean and reproducible","status":"passed"},{"name":"manifest","detail":"2 application contracts; no protocol token or pool","status":"passed"},{"name":"protected_invariants","detail":"invariants-72ac6e744789: Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 918.86µs (762.59µs CPU time)","status":"passed"},{"name":"economics","detail":"policy explicitly selects no on-chain contributor rewards","status":"passed"}],"assurances":[],"logo":null,"seeded":null,"createdAt":"2026-10-20T18:37:20.196Z","updatedAt":"2026-10-20T18:39:01.735Z","jobs":[{"id":"2c9eb033-ae9f-4b2b-a887-f1cc368e1fcb","objective":"Project site: https://hamsterhour.fun\n\nLaunch 1 of 2 for $HAMSTER: deploy HamsterVault on Ethereum mainnet (evm_contracts, no token yet). Launch 2 is a Uniswap v4 hook token HAMSTER (1B, 18 decimals) with remainderTo = this vault (exactly 800M); its hook sends IMD here. It must survive future game versions (Squeekchain will migrate data to mainnet).\n\nGame v2: 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367 (github.com/identity-md-launches/launch-2260-build-hamster-hour-v2). IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. TEAM = launch wallet. No owner, pause, upgrade or withdrawal path; TEAM powers are only those listed.\n\nBIND: bindToken(token), TEAM, once; requires totalSupply == 1e27 and balanceOf(vault) == 8e26. Buckets: mining 750M, boost 50M.\n\nGAMES: registry starting with v2. TEAM can scheduleGame(newGame) with a 48h timelock (public, no other effect); on execute it becomes currentGame. Each game must expose lossOf, totalEligibleLoss, cumulativeLossBefore/After, window times and finalization, the staking-recipient pull balance, depositJackpot and fundOracleReserve; check the interface on schedule. The previous game counts only windows starting before the switch; the new game's loss range starts after the previous game's last counted window is finalized, so ranges never overlap and halvings never reset. Old windows stay claimable forever. For 14 days after a switch, mining from the new game is capped at 2M HAMSTER per UTC day (deterministic scaling).\n\nMINING (pull, retroactive from the first v2 window): 20,000 HAMSTER per 1 IMD of eligible loss, halving every 18,750 IMD of global cumulative loss (converges to 750M). Window budget = F(after) - F(before) on the global curve; account share = budget * lossOf / totalEligibleLoss, rounded down, dust tracked. claimMined(game, windows[], beneficiary) is permissionless, pays only the beneficiary, once per (game, k, account), bounded. Committed emissions never exceed the bucket; claim order never changes amounts.\n\nVESTING: each claim creates a 7-day linear, non-transferable grant; unvested and vested-unwithdrawn balances count as stake weight.\n\nSTAKING (IMD rewards only):\n- stake/unstake HAMSTER. Weight earns after a 24h warm-up; requestUnstake stops weight now and releases after 24h; checkpoint on every change.\n- Sources: pull the 5% staker share from any registered game; depositRewards(amt) (hook 0.5%) streamed over 7 days; depositDrip(amt) (80% of anti-snipe tax) as a continuous 1%/day drip of the remainder; the game backlog streams over 30 days.\n- Strictly pro-rata over time. With zero weight, rewards wait: no first-staker windfall. Buckets never count as weight.\n\nFORWARDING: forwardJackpot(amt) and forwardOracle(amt) pull IMD from the caller (the hook) into separate balances that anyone can flush to currentGame's depositJackpot and fundOracleReserve. The hook never needs changing after a game switch.\n\nSQUEEK BOOST (50M, dormant): activateBoost(collection), TEAM once, 12h timelock, for the canonical Squeek NFT on Ethereum mainnet only. Holders register tokenId to their wallet without transfer; it counts for windows starting 24h+ after registering and is void if ownerOf changes. +50% of base mined, max 10k per NFT and 100k globally per UTC day (by window start), deterministic, same vesting. If not activated within 365 days, anyone can move the 50M into mining once.\n\nVIEWS for the site: claimable per game and window, grants, stake, warm-up, unstake queue, pending IMD, streams and drip, buckets left, rate and halving, games and pending switch.\n\nDeliver: Foundry, tests (retroactive claims, halving crossing, game switch with an overlapping backlog, the new-game cap, claim-order independence, bucket conservation, vesting as stake, warm-up, unstake, zero-weight periods, drip, forwarding after a switch, bind checks, boost voiding and caps, the 365-day sweep), ABI, README, real addresses only. After deploy TEAM calls scheduleStakingRecipient(vault) on the game.","state":"completed","attachedAt":"2026-10-20T18:37:20.196Z"}],"artifacts":[{"role":"other","name":"HamsterBoost","address":"0x8546b2190b5c38c253e8bea5be1b6427e91e0905","creationCodeHash":"e88e7d774ded179d2fdd1dc842e8f0c74b048d5e7e232af4ef214937dc5d4187","txHash":"0xefb89a14807d33b5e40fe97ef6cd198519aab8b864a2e1e40fcd0662dbf02138","blockNumber":26235639,"verifiedAt":"2026-10-20T18:39:22.094Z","verifyFailure":null},{"role":"other","name":"HamsterVault","address":"0x1dceb78b36b5f18ac4a130f1ffc76eba0e73d183","creationCodeHash":"0b135dd96782846de12b2439d7223daf848678575480d9beb0ca856131582379","txHash":"0xefb89a14807d33b5e40fe97ef6cd198519aab8b864a2e1e40fcd0662dbf02138","blockNumber":26235639,"verifiedAt":"2026-10-20T18:39:37.714Z","verifyFailure":null}],"allocations":[]}