{"rewardSnapshot":null,"merkleRoot":null,"claims":null,"id":"31f83052-5918-402f-9f13-5f4afd80b879","launchNumber":2201,"kind":"evm_contracts","status":"live","chainId":1,"sourceRepoUrl":"https://github.com/identity-md-launches/launch-2201-build-deploy-gameescrow-version","sourceCommit":"1b3818f785ed2c252f20f22e3aec7fdbd9d86836","parkedReason":null,"artifactCount":1,"manifestHash":"10070a69e319ddbd701be6350f4065717dc4010c1813b1e9efa9eba5c7d3eb71","attestationHash":"4d1ba7a15d4257d3ee6abeb8c5c0030d18346e35c81d32773da0a7c160857c81","attestation":{"treeHash":"6b9f8ddd5d9d7cbfdbe006892c847b8417d02b1c","verifierVersion":"0.1.0+a6ee6548","verifierKey":"68249df1f422fa72f61ca7f0ddaf9b62043959c5c134498441d5e552a9921782","toolchain":{"solc":"0.8.26","forge":"forge Version: 1.8.3","viaIR":false,"optimizer":true,"evmVersion":"cancun","bytecodeHash":"none","optimizerRuns":200},"contracts":[{"name":"GameEscrow","path":"src/GameEscrow.sol","abiHash":"39b8478dec146a4d8f00c3efdee42b4075193e73436cb1d8dec4c99c18e8af6e","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"e0765feac041be70e476db81c7dc0b60bf797838c9b8b9eb453243d7de246b8f","creationCodeHash":"3dd52c2abaaf167fb54eab8f9140178a3ed00647ad24b69a9f7435ea55cb36d0","deployedCodeHash":"8ca9e4ff0f5d49cf69e641682bca16c36e53ec3b92ccf715a4bc227a47eb23e1","creationCodeBytes":9010,"deployedCodeBytes":7525}],"manifest":{"kind":"evm_contracts","notes":"Deploy GameEscrow v2 with $owner as the initial result signer. The accepted contract fixes ownership at 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5, supports only IMD and SHIFT, and sends the fixed 5% settlement fee to 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44, rounding the fee down and paying the remainder to the winner. Constructor limits in whole tokens are IMD 0.5–1000 and SHIFT 10000–50000000. The owner may rotate the result signer, change limits within the fixed hard caps, and pause or unpause new opens and joins. Settlement, refunds and cancellation remain available while paused.","contracts":[{"contract":"GameEscrow","constructorArgs":["$owner"]}]},"manifestError":null},"attestationFailure":null,"deployFailure":null,"policyVersion":27,"economics":null,"poolFee":null,"requester":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","admissionChecks":[{"name":"provenance","detail":"8 node(s) accepted at 1b3818f7","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":"1 contract(s) clean and reproducible","status":"passed"},{"name":"manifest","detail":"1 application contracts; no protocol token or pool","status":"passed"},{"name":"protected_invariants","detail":"invariants-9c691c05ee3c: Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.09ms (3.53ms 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-18T23:58:52.647Z","updatedAt":"2026-10-18T23:59:49.425Z","jobs":[{"id":"e568de57-17f3-4cb0-b05f-37bc363e32df","objective":"Build and deploy GameEscrow, version 2 of NIGHTSHIFT's PinballEscrow (live at 0x908da27d2caa584133dfb41fec9d6362dca6bcdd), for player-versus-player skill games (Space Pinball, NIGHT CHESS and later games). Two players stake the same amount of the same token; the winner, as decided by the NIGHTSHIFT server's verified result, takes the pot minus a 5% fee. The only change from v1: players choose the amount.\n\nTokens: only IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) and $SHIFT (0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac), both plain ERC-20 with 18 decimals and no transfer fee. Any stake between a per-token minimum and maximum is allowed. Initial limits, set in the constructor: IMD min 0.5, max 1000; SHIFT min 10000, max 50000000 (whole tokens). The owner may change a token's min and max with setLimits(token, min, max) (event LimitsSet), but never above a hard cap fixed in the code (IMD 10000, SHIFT 1000000000) and never with min > max; changing limits never affects matches already opened.\n\nFlow:\n1. open(bytes32 matchId, address token, uint256 stake, bytes32 game): player A deposits the stake (transferFrom, exact amount, within the limits). game is a free label (e.g. \"pinball\", \"chess\"). Emits Opened(matchId, token, stake, game, playerA). matchId must be new.\n2. join(bytes32 matchId): player B deposits the same token and exact stake. Emits Joined(matchId, playerB). Exactly two players; A cannot join her own match.\n3. settle(bytes32 matchId, address winner, bool draw, uint256 deadline, bytes signature): anyone may submit the result signed by the result signer (EIP-712 typed data: domain name \"NightshiftGames\", version \"2\", chainId, this contract; struct Result(bytes32 matchId, address winner, bool draw, uint256 deadline)). The signature must be valid, not expired, for a joined, unsettled match, and winner must be one of the two players unless draw. Winner gets 95% of the pot; 5% goes to the fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44. A draw refunds both players in full. Emits Settled(matchId, winner, draw, payout, fee).\n4. refund(bytes32 matchId): if a match is not joined within 1 hour of open, A gets her stake back; if a joined match is not settled within 24 hours, both get their stake back. Emits Refunded(matchId).\n5. cancel(bytes32 matchId): player A may cancel her own match before anyone joins and get her stake back at once. Emits Cancelled(matchId).\n6. Views: matches(matchId) returning token, stake, game, playerA, playerB, openedAt, joinedAt, settled; limits(token) returning min and max.\n\nOwner: 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5. The owner can only change the result signer (setSigner, event), the limits within the hard caps (setLimits, event), and pause new opens and joins (pause/unpause; settle, refund and cancel keep working while paused). The owner can never move, take or redirect any stake, change the 5% fee, the fee recipient or the tokens. No upgradeability, no delegatecall, no selfdestruct. Reentrancy-safe (checks-effects-interactions plus a guard), SafeERC20, every state change emits an event. Initial result signer: a constructor argument equal to $owner.\n\nTests (Foundry): full flows for both tokens with amounts at and between the limits, below/above limits refused, draw, both refunds, cancel, wrong signer, expired and replayed signatures, signature for the wrong contract or chain refused, winner not a player refused, double settle, joining your own match, wrong stake, paused opens/joins, fee exactly 5% to the splitter (including odd amounts and rounding), setLimits bounds and hard caps, fuzz on stakes and call orders.","state":"completed","attachedAt":"2026-10-18T23:58:52.647Z"}],"artifacts":[{"role":"other","name":"GameEscrow","address":"0xf460fd9ad76f18414f54a2431870e8a116193489","creationCodeHash":"3dd52c2abaaf167fb54eab8f9140178a3ed00647ad24b69a9f7435ea55cb36d0","txHash":"0x64bfbe8e5db1a38fafdcd85e535472a36d542aefa4bb3daa1ebeac59ca2b85a7","blockNumber":26222893,"verifiedAt":"2026-10-19T00:00:29.126Z","verifyFailure":null}],"allocations":[]}