{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"76074566-c1b7-47cf-bca5-8625a2f34d6b","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"70781349ce3d87a7b557f96ed9db7adf0421b2b55b1db40db83438eeb3488e4b","dependsOn":["build_contract_project","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"20a9285f8c1f58864bfd45d1e943a6f9dc874201e0a9891349d1c9d679000c52","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"269324ff9e5e01bfe7731132b67702bc755477d3df2de35825797d9855eafc91","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Build and independently review Odds and Evens, a simple two-player game played for a fixed-supply launch token, for a Sepolia project launch. Follow the evm-project-launch guidance exactly: a fixed-supply ERC-20 named Odds and Evens with symbol ODDS, 18 decimals, zero-argument constructor minting the whole supply to its deployer, no mint backdoor; and one game contract, OddsAndEvens, whose only constructor argument is the token address passed as $token. Game: a player opens a game by staking an amount of ODDS (transferFrom, so the player must approve first) and committing keccak256(number, salt) where number is 1 to 10, choosing odds or evens; a second player joins by staking the same amount and committing their own number; both reveal within a fixed 24-hour reveal window; the sum of the two numbers is even or odd and the player who chose that parity wins the whole pot; if only one player reveals before the deadline the revealer wins by forfeit; if nobody reveals, either player can cancel and both stakes are refunded. No house fee, no owner, no admin, no upgradeability, no external calls other than the token, pull-based or direct token payouts with checks-effects-interactions, and events for opened, joined, revealed, settled and cancelled games. Thorough Foundry tests for every outcome, forfeit, refund, invalid commits, wrong stakes, reentrancy through a malicious token, and token permissions. The manifest names the token and the game contract with the $token argument. Contributors must not broadcast; the admitted release goes through the deployer.","parentJobId":null,"planHash":"aa6f0e3e83d631661d39829de474225c04396cbcf9089b8c9753ddfe14a6a0f7","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"76074566-c1b7-47cf-bca5-8625a2f34d6b","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/Identity-md/launch-50-build-independently-review-odds"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50903","feedbackHash":"526555d1bbf91aaee0f7d298614ded5ebd36c8a655dddd58fd25c67679da2155","nodeKey":"adversarial_review","submissionHash":"70781349ce3d87a7b557f96ed9db7adf0421b2b55b1db40db83438eeb3488e4b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50906","feedbackHash":"2f08986eaa793bc6a3b23b7da4b03add911f7373f51736a292e7e6d33d223a13","nodeKey":"build_contract_project","submissionHash":"20a9285f8c1f58864bfd45d1e943a6f9dc874201e0a9891349d1c9d679000c52","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50906","feedbackHash":"17f251e5bc5a5fed43548f863e11b2f37d607b6ad88ab6907fa861a7bb63a251","nodeKey":"manifest","submissionHash":"269324ff9e5e01bfe7731132b67702bc755477d3df2de35825797d9855eafc91","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a450fc878ebf50272f7b44c9c250baf8fc13c384e89e79d5b831d9f287436da4","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"f7ba4e43cc1d4ae7dab574c9d1dd40a50c50f67519f42639b9bc151f1325b1a8","device":"90f1f5c3374333a0","findings":[],"hash":"20a9285f8c1f58864bfd45d1e943a6f9dc874201e0a9891349d1c9d679000c52","nodeId":"14903186-7c0f-44a7-b77f-d8522dfdef8d","outcome":"completed","summary":"Implemented the fixed-supply ODDS token, OddsAndEvens game, launch manifest, documentation, and independent review.\n\n- Offline build passed.\n- All 19 tests passed, including fuzzing and malicious-token reentrancy tests.\n- Formatting check passed.\n- Independent review found no blocking defects.\n\nDeployment assumptions and responsibilities are documented in `README.md`; review findings are in `REVIEW.md`. No transactions were broadcast.","treeHash":"42b996e4242edf997856c14b4655d729ce29e52f","usage":{"cachedInputTokens":482176,"inputTokens":40734,"model":null,"outputTokens":10311,"runtime":"codex","turns":6,"wallClockMs":369424}},{"artifacts":[],"attempt":1,"bundleHash":"33ea2c0fbeb6a2176a385de2a57643ec763d2641b4f831531e34aa3717011ca3","device":"90f1f5c3374333a0","findings":[],"hash":"269324ff9e5e01bfe7731132b67702bc755477d3df2de35825797d9855eafc91","nodeId":"b10bc70b-f365-4f15-8afc-55ca16344bde","outcome":"completed","summary":"Updated `launch.json` with valid manifest fields, `Token`, `OddsAndEvens(\"$token\")`, pool parameters, and explanatory notes.\n\nVerified constructor ABIs and manifest constraints. `forge build` succeeded; all 19 tests passed. Only `launch.json` changed.","treeHash":"5ed57b1505b6d4cf290db01cb1bd81db54155684","usage":{"cachedInputTokens":130176,"inputTokens":38987,"model":null,"outputTokens":1783,"runtime":"codex","turns":3,"wallClockMs":74092}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c4f696e22e7a36f7","findings":[],"hash":"70781349ce3d87a7b557f96ed9db7adf0421b2b55b1db40db83438eeb3488e4b","nodeId":"bf015295-1683-48e7-a916-5c4db4162b1c","outcome":"completed","summary":"Review complete. No substantiated defects found.\n\nCreated [.imd-findings.json](/root/.identitymd/work/76074566-c1b7-47cf-bca5-8625a2f34d6b/bf015295-1683-48e7-a916-5c4db4162b1c/.imd-findings.json) with an empty findings array.\n\nVerification: all 19 Foundry tests pass.","treeHash":null,"usage":{"cachedInputTokens":129536,"inputTokens":33738,"model":null,"outputTokens":1312,"runtime":"codex","turns":4,"wallClockMs":41672}}],"verification":[{"checks":[{"durationMs":2037,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.94s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/OddsAndEvens.sol:89:17\n   │\n89 │         require(block.timestamp < g.deadline, \"reveal expired\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:23:9\n   │\n23 │         token.transfer(address(1), n);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/OddsAndEvens.sol:110:44\n    │\n110 │         require(g.state == State.Joined && block.timestamp >= g.deadline, \"not expired\");\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/OddsAndEvens.sol:120:48\n    │\n120 │                 || (g.state == State.Joined && block.timestamp >= g.deadline && g.number1 == 0 && g.number2 == 0),\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/OddsAndEvens.t.sol:20:9\n   │\n20 │         token.transfer(alice, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/OddsAndEvens.t.sol:21:9\n   │\n21 │         token.transfer(bob, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:32:9\n   │\n32 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:35:9\n   │\n35 │         token.transferFrom(address(this), address(3), 7);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 4);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:46:9\n   │\n46 │         token.transferFrom(address(this), address(3), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:49:9\n   │\n49 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:52:9\n   │\n52 │         token.transfer(address(3), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:54:9\n   │\n54 │         token.transfer(address(this), 9);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":135,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_FailedDepositsRollback() (gas: 570145)\n[PASS] test_FailedPayoutCanRetryReveal() (gas: 377080)\n[PASS] test_ReentrancyForfeitAndRefund() (gas: 661617)\n[PASS] test_ReentrancyOnAllTokenInteractionPaths() (gas: 591174)\n[PASS] test_SecondRefundFailureRollsBackBothTransfers() (gas: 355947)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.54ms (6.94ms CPU time)\n\nRan 1 test for test/Deployment.t.sol:DeploymentTest\n[PASS] test_FactorySupplyAndRuntimePolicy() (gas: 5457006)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.25ms (7.82ms CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 45083, ~: 45530)\nLogs:\n  Bound result 4502764770907964219\n\n[PASS] test_MetadataAndSupply() (gas: 18138)\n[PASS] test_NoAdminOrMintEvenForDeployer() (gas: 32280)\n[PASS] test_Permissions() (gas: 106330)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 14.45ms (17.28ms CPU time)\n\nRan 9 tests for test/OddsAndEvens.t.sol:OddsAndEvensTest\n[PASS] testFuzz_AllParitiesAndRevealOrders(uint8,uint8,bool,bool) (runs: 256, μ: 342506, ~: 342508)\nLogs:\n  Bound result 1\n  Bound result 7\n\n[PASS] testFuzz_Forfeit(bool) (runs: 256, μ: 313828, ~: 313699)\n[PASS] testFuzz_NoRevealsRefund(bool) (runs: 256, μ: 336774, ~: 336707)\n[PASS] test_InvalidJoin() (gas: 505580)\n[PASS] test_InvalidOpenAndApproval() (gas: 391118)\n[PASS] test_InvalidRevealAndDeadline() (gas: 430367)\n[PASS] test_InvalidToken() (gas: 77468)\n[PASS] test_MultipleGamesConserveFunds() (gas: 484772)\n[PASS] test_UnmatchedCancelAndMissingGame() (gas: 261097)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 28.09ms (77.31ms CPU time)\n\nRan 4 test suites in 30.34ms (53.33ms CPU time): 19 tests passed, 0 failed, 0 skipped (19 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"20a9285f8c1f58864bfd45d1e943a6f9dc874201e0a9891349d1c9d679000c52","verifiedTreeHash":"42b996e4242edf997856c14b4655d729ce29e52f","verifierVersion":"0.1.0+c41c82c0"},{"checks":[{"durationMs":1945,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.84s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/OddsAndEvens.sol:89:17\n   │\n89 │         require(block.timestamp < g.deadline, \"reveal expired\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:23:9\n   │\n23 │         token.transfer(address(1), n);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/OddsAndEvens.t.sol:20:9\n   │\n20 │         token.transfer(alice, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/OddsAndEvens.t.sol:21:9\n   │\n21 │         token.transfer(bob, 100 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/OddsAndEvens.sol:110:44\n    │\n110 │         require(g.state == State.Joined && block.timestamp >= g.deadline, \"not expired\");\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/OddsAndEvens.sol:120:48\n    │\n120 │                 || (g.state == State.Joined && block.timestamp >= g.deadline && g.number1 == 0 && g.number2 == 0),\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:32:9\n   │\n32 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:35:9\n   │\n35 │         token.transferFrom(address(this), address(3), 7);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 4);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:46:9\n   │\n46 │         token.transferFrom(address(this), address(3), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:49:9\n   │\n49 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:52:9\n   │\n52 │         token.transfer(address(3), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:54:9\n   │\n54 │         token.transfer(address(this), 9);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":126,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_FailedDepositsRollback() (gas: 570145)\n[PASS] test_FailedPayoutCanRetryReveal() (gas: 377080)\n[PASS] test_ReentrancyForfeitAndRefund() (gas: 661617)\n[PASS] test_ReentrancyOnAllTokenInteractionPaths() (gas: 591174)\n[PASS] test_SecondRefundFailureRollsBackBothTransfers() (gas: 355947)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.27ms (2.58ms CPU time)\n\nRan 1 test for test/Deployment.t.sol:DeploymentTest\n[PASS] test_FactorySupplyAndRuntimePolicy() (gas: 5457006)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.07ms (6.66ms CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 44863, ~: 45530)\nLogs:\n  Bound result 8931\n\n[PASS] test_MetadataAndSupply() (gas: 18138)\n[PASS] test_NoAdminOrMintEvenForDeployer() (gas: 32280)\n[PASS] test_Permissions() (gas: 106330)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 19.51ms (20.00ms CPU time)\n\nRan 9 tests for test/OddsAndEvens.t.sol:OddsAndEvensTest\n[PASS] testFuzz_AllParitiesAndRevealOrders(uint8,uint8,bool,bool) (runs: 256, μ: 342557, ~: 342543)\nLogs:\n  Bound result 9\n  Bound result 1\n\n[PASS] testFuzz_Forfeit(bool) (runs: 256, μ: 313830, ~: 313699)\n[PASS] testFuzz_NoRevealsRefund(bool) (runs: 256, μ: 336775, ~: 336707)\n[PASS] test_InvalidJoin() (gas: 505580)\n[PASS] test_InvalidOpenAndApproval() (gas: 391118)\n[PASS] test_InvalidRevealAndDeadline() (gas: 430367)\n[PASS] test_InvalidToken() (gas: 77468)\n[PASS] test_MultipleGamesConserveFunds() (gas: 484772)\n[PASS] test_UnmatchedCancelAndMissingGame() (gas: 261097)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 21.90ms (59.98ms CPU time)\n\nRan 4 test suites in 22.92ms (49.76ms CPU time): 19 tests passed, 0 failed, 0 skipped (19 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"269324ff9e5e01bfe7731132b67702bc755477d3df2de35825797d9855eafc91","verifiedTreeHash":"5ed57b1505b6d4cf290db01cb1bd81db54155684","verifierVersion":"0.1.0+c41c82c0"}]}