{"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":"8ac6bd3c-5557-4638-ad45-e593c478372e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6e5641279e9781002aadf7128f44f7152748eaae42efc496dd61f1d6e4c0fd99","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"a3a180c5bcb3ed2f4d57fad7a542337fa0e322e59ea1be5b55d6ca17c63a435d","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"953bc0e76257cc860c227cd8336dfb4f036b764064a646c4c0fcb31757b459f9","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1c28ca564abe96a7efe93ec369aaeaf206de761d9e511c57d71af0bbee09a65d","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"ef0e4434b59278817dc085af4fb831cb7f11a8c5c748d393ac3d588061468e56","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"b1fae9a39d885db270eda57ef6b3b29ae6d881fd484eee396679f169eadf142e","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"5923f5f5fdcfb72a8b3edee88bfb9391759f8c0e1aee7336ad1f8ed3539c0ea4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1394b31f8b577059b90ba6c7c4838aabe2437796428c74485e0069f508018b3b","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"e17b261b937cb8392569e6127bedfc95a47fb0dc6dee84684fdc063b422c1f97","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Continue from the delivered OG Club lootbox repo (OGClubBox, OGClubFurniture; 122 tests pass at 3cf22eb2e28a40bc21bfe7f3becdb632c4a088a1). Close the two remaining owner-trust gaps below and keep every other behavior exactly as it is. Update the affected tests, the deploy script, launch.json and the README; forge build, forge test and forge fmt --check must pass. Do not deploy.\n \n## 1. Seasons are announced ahead of time (OGClubBox)\nToday the owner can create a season that opens at once with any odds and price, for example a 1-wei box in which a capped piece is near-certain, and so mint any piece cheaply with no notice, bypassing the 7-day minter delay. Add seasonNotice (seconds) as a fifth constructor argument: a uint, immutable, at most 30 days (it will be 7 days on mainnet and 0 on test networks), exposed as a public view. createSeason must require opensAt >= block.timestamp + seasonNotice. Nothing else about seasons changes: they stay immutable once created, and closeSeason and cancelSeason work as now.\n \n## 2. Exactly one instant minter grant, ever (OGClubFurniture)\nToday grantMinter is immediate whenever totalSupply() == 0, so after sales have started, while every roll is still undelivered, the owner can still authorize a new minter instantly. Make the immediate path usable once: the first grantMinter call ever takes effect immediately (it is for the box, right after deployment) and sets a public bootstrapped flag; every later grant is a 7-day proposal whatever the supply. Re-granting a revoked box also waits 7 days (purchases still open and store their rolls meanwhile).\n \n## Tests\n- createSeason reverts when opensAt < now + seasonNotice and succeeds at exactly now + seasonNotice; with seasonNotice 0 it behaves as today; the constructor rejects a notice above 30 days.\n- The owner cannot mint a capped piece through a new season before that season's notice has passed.\n- The first grantMinter is immediate; a second grant is delayed even while totalSupply() is still 0 (sales started, nothing delivered yet); re-granting a revoked box is delayed, and opens during the delay store their rolls.\n- Every test, script and the launch.json manifest that constructs the box passes the new argument (0 in launch.json, which is for the test network).\n \n## README\nDocument both rules in the owner powers section, and in the post-deploy steps: grant the box first, and create each season at least seasonNotice before it opens.","parentJobId":null,"planHash":"25512793a06045e9c33369df353be7b82880f3b5286034bc78fe886d741419ad","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"8ac6bd3c-5557-4638-ad45-e593c478372e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1857-continue-delivered-og-club"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"54154","feedbackHash":"2447e9479359b4472316d733ec289c564bba7fc189740cfe8dbfc0f7490d9b6b","nodeKey":"adapt_contract_project","submissionHash":"6e5641279e9781002aadf7128f44f7152748eaae42efc496dd61f1d6e4c0fd99","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52258","feedbackHash":"fbbe70e616ddc7acc7748fc52d91acde6943d815a3294d3f5672c5dfe9198710","nodeKey":"audit_economics","submissionHash":"a3a180c5bcb3ed2f4d57fad7a542337fa0e322e59ea1be5b55d6ca17c63a435d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50966","feedbackHash":"7ea51cc0188732ecf14082ae833eb5e43c0719d1cd0b3d5d03b56b05bcd21fa1","nodeKey":"audit_flow","submissionHash":"953bc0e76257cc860c227cd8336dfb4f036b764064a646c4c0fcb31757b459f9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54154","feedbackHash":"2687b3640449aab3681e6750a4bfaf13dad9076cb8fb9b83deceda483c033edb","nodeKey":"audit_imported_code","submissionHash":"1c28ca564abe96a7efe93ec369aaeaf206de761d9e511c57d71af0bbee09a65d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51144","feedbackHash":"3380832f58cdea52fbbab0cd44510b18e21e55193cbba17ef20debdb506bb3db","nodeKey":"audit_judge","submissionHash":"ef0e4434b59278817dc085af4fb831cb7f11a8c5c748d393ac3d588061468e56","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51450","feedbackHash":"75abe61b53735ed7359700f815fd82851260aede90f2bd5695415596544d0627","nodeKey":"audit_math","submissionHash":"b1fae9a39d885db270eda57ef6b3b29ae6d881fd484eee396679f169eadf142e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52257","feedbackHash":"d26afc8ccb2bd749bef3f107330485ea56270fd2eb9a8b4b5625d104c1c76c38","nodeKey":"audit_permissions","submissionHash":"5923f5f5fdcfb72a8b3edee88bfb9391759f8c0e1aee7336ad1f8ed3539c0ea4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53906","feedbackHash":"b152f73505aa56a73acafb83721fc0914b4001d2f595f43ea09ef751853ce84d","nodeKey":"manifest","submissionHash":"1394b31f8b577059b90ba6c7c4838aabe2437796428c74485e0069f508018b3b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51727","feedbackHash":"ea9cf5fefa4b9b6ab611cf746d88647ebc94a9e606006d592f6897e805fb46da","nodeKey":"write_foundry_tests","submissionHash":"e17b261b937cb8392569e6127bedfc95a47fb0dc6dee84684fdc063b422c1f97","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"20333c85c604acc7e78c889abc906c40fe53a05762cb6f5d1e3854bdfb4334c5","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"fe956965acf19750b3e1c657614437bd82152e76c199d1531ca2aad980f6425b","device":"6e1587ffa91ea90b","findings":[],"hash":"1394b31f8b577059b90ba6c7c4838aabe2437796428c74485e0069f508018b3b","nodeId":"4c7cf144-f4c7-4ca9-a5f6-8ef75e7abd7b","outcome":"completed","summary":"Updated only `launch.json`, clarifying both owner rules and post-deployment steps. Verified constructor order, `$owner` recipients, and `seasonNotice = 0` against compiled ABIs.\n\nChecks passed: `forge build`, all 123 tests with the supplied fuzz seed, and `forge fmt --check`. No deployment performed.","treeHash":"a46242694f59cd5d8c9bcc8e07016b877b140caa","usage":{"cachedInputTokens":371712,"inputTokens":40196,"model":"gpt-6-astra","outputTokens":4040,"runtime":"codex","turns":4,"wallClockMs":180702}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0be47287abf7c3bd","findings":[],"hash":"13db9ee5363718c55f21fccb180b2ad515c7eedff39ba2766ec7387df4b29f45","nodeId":"4c7cf144-f4c7-4ca9-a5f6-8ef75e7abd7b","outcome":"failed","summary":"wrote outside the task's allowed paths: .imd-tmp/codex-bwrap-synthetic-mount-targets-1006/lock","treeHash":null,"usage":{"cachedInputTokens":467328,"inputTokens":42266,"model":"gpt-6-astra","outputTokens":3890,"runtime":"codex","turns":4,"wallClockMs":189316}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f9a9196633a6ffa8","findings":[{"citation":"resolved","description":"createSeason only requires opensAt < closesAt. It accepts an opensAt equal to (or before) block.timestamp, so the box owner can create a season that sells immediately, at price 1 wei, in which a capped piece carries weight 2^128-1 against a fallback weight of 1, buy one box, and reveal it three blocks later. Because the box is already an authorized minter, this mints any piece, including one an earlier season sold with a cap, in about four blocks and with no public notice at all. The furniture contract's MINTER_DELAY (7 days) exists so that any new minting authority is announced a week ahead; the box owner's unrestricted season creation makes that notice meaningless for the box's own minting. The README (lines 171-176) currently documents this as a trust assumption; the requester has decided to close it. Required change: add seasonNotice (uint256, immutable, at most 30 days, public view) as a fifth constructor argument and require opensAt >= block.timestamp + seasonNotice in createSeason; constructor must reject a notice above 30 days. Everything else about seasons (immutability, closeSeason, cancelSeason) stays as it is. Places that construct the box and must pass the new argument: test/helpers/BoxTestBase.sol line 31, every test that calls `new OGClubBox(` directly (test/Deployment.t.sol lines 49-64, test/Payments.t.sol lines 74, 108, 123, 134, 177, test/MultiActorInvariant.t.sol line 430), script/Deploy.s.sol line 32, and launch.json's OGClubBox constructorArgs (fifth entry \"0\" for the test network). Tests to add: revert when opensAt < now + seasonNotice, success at exactly now + seasonNotice, unchanged behaviour with notice 0, constructor rejects > 30 days, and the owner cannot mint a capped piece through a new season before its notice has passed. Coverage gap today: test/Seasons.t.sol never creates a season with opensAt <= block.timestamp as an adversarial case; the setUp season opens at exactly the current timestamp without comment.","line":152,"path":"src/OGClubBox.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC1155Holder} from \"@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {OGClubBox} from \"src/OGClubBox.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\n\n/// @notice Independent RLP encoder so the proof needs nothing from the project's test helpers.\nlibrary ProofHeader {\n    function uintBytes(uint256 value) internal pure returns (bytes memory result) {\n        uint256 length;\n        for (uint256 n = value; n != 0; n >>= 8) {\n            ++length;\n        }\n        result = new bytes(length);\n        for (uint256 i; i < length; ++i) {\n            result[length - 1 - i] = bytes1(uint8(value >> (8 * i)));\n        }\n    }\n\n    function str(bytes memory value) internal pure returns (bytes memory) {\n        if (value.length == 1 && uint8(value[0]) < 0x80) return value;\n        return bytes.concat(prefix(value.length, 0x80), value);\n    }\n\n    function prefix(uint256 length, uint8 base) internal pure returns (bytes memory) {\n        if (length < 56) return abi.encodePacked(bytes1(uint8(length) + base));\n        bytes memory size = uintBytes(length);\n        return bytes.concat(abi.encodePacked(bytes1(base + 55 + uint8(size.length))), size);\n    }\n\n    function header(uint256 number, bytes32 randao) internal pure returns (bytes memory) {\n        bytes memory payload;\n        for (uint256 i; i < 16; ++i) {\n            bytes memory field;\n            if (i == 8) field = uintBytes(number);\n            else if (i == 13) field = abi.encodePacked(randao);\n            else field = uintBytes(i);\n            payload = bytes.concat(payload, str(field));\n        }\n        return bytes.concat(prefix(payload.length, 0xc0), payload);\n    }\n}\n\n/// @notice Finding: the box owner can create a season that opens at once with any odds and price, and so mint a\n///         capped piece within four blocks, bypassing the seven-day minter notice the furniture enforces.\n///         Fails now (the owner receives the capped piece); passes once createSeason requires\n///         opensAt >= block.timestamp + seasonNotice with a nonzero seasonNotice.\ncontract SeasonNoticeProofTest is Test, ERC1155Holder {\n    uint256 internal constant NOTICE = 7 days;\n    uint256 internal constant CAPPED_ID = 3;\n\n    MockOG internal token;\n    OGClubFurniture internal furniture;\n    OGClubBox internal box;\n    address internal vault = makeAddr(\"vault\");\n\n    function setUp() public {\n        vm.roll(100);\n        vm.warp(1_000_000);\n        token = new MockOG(address(this));\n        furniture = new OGClubFurniture(address(this), vault);\n        // Deploy with a fifth constructor word (the season notice). The current four-argument constructor ignores\n        // the trailing word, so the same proof compiles and runs before and after the fix.\n        bytes memory initCode = abi.encodePacked(\n            type(OGClubBox).creationCode, abi.encode(address(token), address(furniture), vault, address(this), NOTICE)\n        );\n        address deployed;\n        assembly (\"memory-safe\") {\n            deployed := create(0, add(initCode, 32), mload(initCode))\n        }\n        require(deployed != address(0), \"box deployment failed\");\n        box = OGClubBox(deployed);\n        furniture.grantMinter(address(box)); // First grant, right after deployment: immediate today and after the fix.\n        token.approve(address(box), type(uint256).max);\n    }\n\n    /// @dev Season 1 sells CAPPED_ID with a cap of 1 (the scarce piece). The owner then creates season 2, opening\n    ///      now, priced at 1 wei, in which CAPPED_ID is near-certain, and takes it immediately with no notice.\n    function test_OwnerCannotMintCappedPieceThroughAnInstantSeason() public {\n        OGClubBox.Entry[] memory honest = new OGClubBox.Entry[](2);\n        honest[0] = OGClubBox.Entry(1, 0, 99, 0);\n        honest[1] = OGClubBox.Entry(CAPPED_ID, 4, 1, 1);\n        uint256 publicSeason = box.createSeason(100 ether, block.timestamp + NOTICE, block.timestamp + 30 days, 0, 1, honest);\n        assertEq(publicSeason, 1);\n\n        OGClubBox.Entry[] memory rigged = new OGClubBox.Entry[](2);\n        rigged[0] = OGClubBox.Entry(1, 0, 1, 0);\n        rigged[1] = OGClubBox.Entry(CAPPED_ID, 4, (1 << 128) - 1, 1);\n        uint256 now_ = block.timestamp;\n        try box.createSeason(1, now_, now_ + 1 days, 0, 1, rigged) returns (uint256 riggedSeason) {\n            // The season exists and opens at once: buy one 1-wei box and reveal it three blocks later.\n            uint256 purchaseId = box.buy(riggedSeason, 1);\n            (,,, uint256 targetBlock,) = box.purchases(purchaseId);\n            vm.roll(targetBlock + 1);\n            bytes memory header = ProofHeader.header(targetBlock, keccak256(\"any randao\"));\n            vm.setBlockhash(targetBlock, keccak256(header));\n            box.open(purchaseId, header);\n            assertTrue(box.delivered(purchaseId), \"delivery should succeed, the box is an active minter\");\n            assertEq(\n                furniture.balanceOf(address(this), CAPPED_ID),\n                0,\n                \"owner minted the capped piece with no notice: season opened at once, bypassing the 7-day minter delay\"\n            );\n        } catch {\n            // Fixed behaviour: a season that opens before block.timestamp + seasonNotice is refused.\n            assertEq(box.seasonCount(), 1);\n            assertEq(furniture.balanceOf(address(this), CAPPED_ID), 0);\n        }\n    }\n}","reproduction":"State: furniture deployed, box deployed and granted as minter, season 1 sells item 3 (tier 4, cap 1) at 100 ether. Owner calls box.createSeason(price=1, opensAt=block.timestamp, closesAt=block.timestamp+1 days, burnBps=0, fallbackItem=1, entries=[{itemId:1,tier:0,weight:1,cap:0},{itemId:3,tier:4,weight:2^128-1,cap:1}]). Expected (after the fix, with seasonNotice = 7 days): revert because opensAt < block.timestamp + seasonNotice. Actual: season 2 is created and is open immediately; owner calls box.buy(2, 1) paying 1 wei, waits 3 blocks, calls box.open(purchaseId, header) and receives item 3: furniture.balanceOf(owner, 3) == 1 within four blocks and with zero notice. Proof test/scratch/SeasonNoticeProof.t.sol fails now with 'owner minted the capped piece with no notice ... 1 != 0' and passes once createSeason enforces the notice (it deploys the box with a fifth constructor word of 7 days, which the current constructor ignores).","severity":"medium","snippet":"        if (price == 0 || opensAt >= closesAt || burnBps > BPS) revert InvalidSeasonParameters();","title":"createSeason lets the owner open a season at once with any odds and price, bypassing the 7-day minter notice"},{"citation":"resolved","description":"The immediate-grant path keys on totalSupply() == 0, which is the delivered supply, not on whether the collection is live. Sales can start (buy succeeds as soon as the box is a minter) and every roll can still be undelivered, pending opening, or stored after a DeliveryFailed, all while totalSupply() stays 0. In that state the owner can still call grantMinter(anyAddress) and the new minter is active in the same transaction, able to mintBatch any piece in any quantity with no public notice; likewise revokeMinter(box) followed by grantMinter(box) is instant. The README (lines 199-201) and launch.json notes currently describe this as intended ('until the first piece is actually minted, every grant stays immediate'); the requester has decided to close it. Required change: make the immediate path usable exactly once: the first grantMinter call ever takes effect immediately and sets a public `bootstrapped` flag; every later grant, including a re-grant of the revoked box, is a 7-day proposal regardless of supply (purchases already made still open and store their rolls meanwhile, since open never requires minter status). Update test/OGClubFurniture.t.sol (test_FreshGrantsAreImmediateAndEmitTheFullMinterList at line 167 asserts that several fresh grants are immediate and must change), test/FurnitureInvariant.t.sol, test/MinterLifecycleInvariant.t.sol, the README owner-powers section (lines 185-206, 222-229) and post-deploy step 1 (lines 258-261: grant the box first), and the launch.json notes. Tests to add: first grant immediate; second grant delayed while totalSupply() == 0 with sales started; re-grant of the revoked box delayed and opens during the delay store their rolls.","line":51,"path":"src/OGClubFurniture.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {OGClubBox} from \"src/OGClubBox.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\n\n/// @notice Finding: grantMinter is immediate whenever totalSupply() == 0, so after sales have started, while every\n///         roll is still undelivered, the furniture owner can still authorize a new minter instantly, and can\n///         re-grant a revoked box instantly. Fails now; passes once only the first grant ever is immediate.\ncontract MinterBootstrapProofTest is Test {\n    MockOG internal token;\n    OGClubFurniture internal furniture;\n    OGClubBox internal box;\n    address internal vault = makeAddr(\"vault\");\n    address internal buyer = makeAddr(\"buyer\");\n    address internal mallory = makeAddr(\"mallory\");\n\n    function setUp() public {\n        vm.roll(100);\n        vm.warp(1_000_000);\n        token = new MockOG(address(this));\n        furniture = new OGClubFurniture(address(this), vault);\n        // Fifth constructor word = 0 (season notice): ignored by the current constructor, used after the fix.\n        bytes memory initCode = abi.encodePacked(\n            type(OGClubBox).creationCode, abi.encode(address(token), address(furniture), vault, address(this), uint256(0))\n        );\n        address deployed;\n        assembly (\"memory-safe\") {\n            deployed := create(0, add(initCode, 32), mload(initCode))\n        }\n        require(deployed != address(0), \"box deployment failed\");\n        box = OGClubBox(deployed);\n        furniture.grantMinter(address(box)); // The one bootstrap grant.\n        assertTrue(furniture.minters(address(box)));\n\n        OGClubBox.Entry[] memory entries = new OGClubBox.Entry[](2);\n        entries[0] = OGClubBox.Entry(1, 0, 90, 0);\n        entries[1] = OGClubBox.Entry(2, 2, 10, 5);\n        box.createSeason(1 ether, block.timestamp, block.timestamp + 30 days, 0, 1, entries);\n        token.mint(buyer, 100 ether);\n        vm.prank(buyer);\n        token.approve(address(box), type(uint256).max);\n    }\n\n    /// @dev Sales have started (a purchase is paid and pending) but nothing is delivered, so totalSupply() == 0.\n    ///      A second grant must be a seven-day proposal, not an immediate authorization.\n    function test_SecondGrantIsDelayedWhileSalesStartedAndNothingDelivered() public {\n        vm.prank(buyer);\n        box.buy(1, 3);\n        assertEq(furniture.totalSupply(), 0, \"nothing delivered yet\");\n\n        furniture.grantMinter(mallory);\n\n        assertFalse(furniture.minters(mallory), \"second grant took effect immediately with no 7-day notice\");\n        uint256[] memory ids = new uint256[](1);\n        ids[0] = 2;\n        uint256[] memory amounts = new uint256[](1);\n        amounts[0] = 1000;\n        vm.prank(mallory);\n        vm.expectRevert(abi.encodeWithSelector(OGClubFurniture.NotMinter.selector, mallory));\n        furniture.mintBatch(mallory, ids, amounts);\n    }\n\n    /// @dev Revoking the box and granting it again before any delivery is also instant today.\n    function test_RegrantOfRevokedBoxIsDelayed() public {\n        vm.prank(buyer);\n        box.buy(1, 1);\n        furniture.revokeMinter(address(box));\n        assertFalse(furniture.minters(address(box)));\n        assertEq(furniture.totalSupply(), 0);\n\n        furniture.grantMinter(address(box));\n\n        assertFalse(furniture.minters(address(box)), \"re-grant of the revoked box took effect immediately\");\n        assertEq(furniture.pendingMinters(address(box)), block.timestamp + furniture.MINTER_DELAY());\n    }\n}","reproduction":"State: furniture deployed; owner calls grantMinter(box) (first grant, immediate, correct); a season is open and a buyer has paid for 3 boxes, nothing is opened or delivered, so furniture.totalSupply() == 0. Owner calls furniture.grantMinter(mallory). Expected: minters(mallory) == false and pendingMinters(mallory) == block.timestamp + 7 days; mallory's mintBatch reverts NotMinter. Actual: minters(mallory) == true immediately and mallory can mintBatch(mallory, [2], [1000]) in the same block. Second sequence: owner calls revokeMinter(box) then grantMinter(box) while totalSupply() == 0. Expected: pending proposal for 7 days. Actual: minters(box) == true at once. Proof test/scratch/MinterBootstrapProof.t.sol fails now on both tests ('second grant took effect immediately with no 7-day notice', 're-grant of the revoked box took effect immediately') and passes once only the first grant ever is immediate.","severity":"medium","snippet":"        if (totalSupply() == 0) {","title":"grantMinter is immediate whenever totalSupply() == 0, so a new minter or a re-granted box skips the 7-day delay after sales have started"},{"citation":"resolved","description":"The manifest matches the constructor as it is now (token, furniture, vault, owner) and its notes say grants stay immediate while totalSupply() == 0. Once seasonNotice is added as the fifth constructor parameter, the manifest rule 'one constructorArgs entry per constructor parameter, in declaration order' rejects this entry unless a fifth string is appended; the requester specifies \"0\" for the test network (7 days on mainnet). The notes must then say that only the first grantMinter is immediate (grant the box first, right after deployment) and that each season must be created at least seasonNotice before it opens. Keys, names and note length (2,068 of 4,000 characters) are otherwise within schema. This is a map for the adapter, not a defect in the current tree.","line":19,"path":"launch.json","reproduction":"After the constructor becomes OGClubBox(token, furniture, vault, initialOwner, seasonNotice): manifest check compares 5 declared parameters against the 4 entries at launch.json lines 20-23. Expected: 5 entries ending in \"0\". Actual: 4 entries, so the manifest is refused and the launch parks. Also script/Deploy.s.sol line 32 `box = new OGClubBox(IERC20(token), furniture, vault, owner);` stops compiling until the fifth argument is passed.","severity":"info","snippet":"      \"constructorArgs\": [\n        \"$contract:MockOG\",\n        \"$contract:OGClubFurniture\",\n        \"$owner\",\n        \"$owner\"\n      ]","title":"launch.json OGClubBox entry has four constructor arguments and notes that describe the immediate-grant rule; both go stale with the fixes above"}],"hash":"1c28ca564abe96a7efe93ec369aaeaf206de761d9e511c57d71af0bbee09a65d","nodeId":"a4dfbfb9-82c8-4b2e-b31f-a41d8f6eb93f","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree is unchanged apart from the gitignored findings file and scratch proofs.\n\n**Outcome.** Both owner-trust gaps the requester named reproduce on the tree at 3cf22eb, and I found no further defect in the two application contracts. The findings file holds two medium findings with Foundry proofs and one informational note for the adapter.\n\n**Findings written to .imd-findings.json**\n\n- **Medium, OGClubBox createSeason at line 152.** The only timing check is opensAt < closesAt, so the owner can create a 1-wei season that opens at once with a capped piece at weight 2^128-1, buy one box and reveal it three blocks later. That mints any piece, including a previously capped one, with zero notice while the furniture's 7-day minter delay is supposed to announce new minting authority. The proof deploys the box with a fifth constructor word so it compiles before and after the fix. It fails now with the owner holding the capped piece and passes with a seasonNotice check.\n- **Medium, OGClubFurniture grantMinter at line 51.** The immediate path keys on delivered supply, so with sales started and every roll undelivered, a second grant or a re-grant of the revoked box takes effect instantly. The proof has two tests, both failing now and both passing once only the first grant ever is immediate.\n- **Info, launch.json line 19.** The OGClubBox entry has four constructor arguments and notes that describe the immediate-grant rule. Both go stale once the fifth argument exists, and the manifest rule of one entry per parameter would then refuse the file. Notes are within the length limit.\n\n**Verification.** I confirmed the proofs pass after the fix by applying a minimal candidate change in a throwaway copy outside the repository. The descriptions list every call site that must take the new argument, which I checked against the tree.\n\n| Check | Result |\n| --- | --- |\n| forge build and forge test on the tree | 111 tests pass, 0 fail |\n| Scratch proofs on current code | 3 fail, as the findings state |\n| Scratch proofs on the candidate fix | 3 pass |\n\nThe task text cites 122 passing tests. The tree runs 111. That is a count difference only.\n\n**Coverage.** I read OGClubBox, OGClubFurniture, BlockHeader, MockOG, the deploy script, launch.json, the README owner and deployment sections, the shared test base and the season and minter tests, and the two protected tests. Every state-changing entry point was traced for access, value flow and reentrancy. Nothing was unreachable. The protected factory harness needs verifier inputs and was not executed. The pause, metadata freeze and unrestricted minter interface are documented trust assumptions the brief asks to keep, not findings. Seasons.t.sol has one coverage gap worth closing with the fix: it never creates a season that opens at or before the current time as an adversarial case.","treeHash":null,"usage":{"cachedInputTokens":946879,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":23598,"runtime":"claude","turns":30,"wallClockMs":375211}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2d33950b9728fd89","findings":[],"hash":"2cd1b02c94f65ca5d7b1232627f57f65b10c3e96e4d820275b806d5e0f7384c6","nodeId":"28c3c9a4-6ce5-4203-9863-47010dea3ef7","outcome":"failed","summary":"wrote outside the task's allowed paths: .imd-tmp/codex-bwrap-synthetic-mount-targets-1002/lock","treeHash":null,"usage":{"cachedInputTokens":1351936,"inputTokens":81791,"model":"gpt-6-astra","outputTokens":18123,"runtime":"codex","turns":6,"wallClockMs":703479}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"22c9b760d0a15149","findings":[{"citation":"resolved","description":"Trust Gap seam access x asymmetry (not a violation of requirement 1, which is correctly implemented). createSeason now enforces opensAt >= block.timestamp + seasonNotice, so a season's terms are public for the notice. But the pause is a global, instantly togglable owner switch that buy checks identically for every caller (src/OGClubBox.sol:229 `if (paused) revert BuyingPaused();`), and nothing stops the owner from being a buyer or from paying itself (vault == owner, burnBps 0: _pay treats recipient == msg.sender as a zero-expected leg). The owner can therefore announce a 1-wei season with a capped piece near-certain, pause before opensAt, and when the season opens do setPaused(false) + buy(season, 10) + setPaused(true) in one transaction (any multisig/contract owner, or an EOA with a private bundle). The public saw the terms for the whole notice but could never buy; the owner reserves the capped piece at zero net cost. This is within the owner's intended powers and the requested design (the brief asks for notice, not for a competitive window), so it is a trust assumption, but the README's owner-powers section only says the owner can 'pause/resume purchases' and that terms are 'public ... before anyone, the owner included, can buy', which reads as if notice protects the public from this. Minimal fix preserving the design: document in the owner-powers section that the pause can be used to make any season an owner-only sale and that the owner may buy from its own seasons (paying itself when it is the vault). If the requester wants a hard guarantee, that is a scope decision (for example, forbidding buy while msg.sender == owner, or making unpause itself subject to a delay); do not change it without the author's agreement.","line":212,"path":"src/OGClubBox.sol","reproduction":"State: OGClubBox deployed with seasonNotice = 7 days, vault = owner, owner is a contract (or an EOA using an atomic bundle); furniture.grantMinter(box) done. Steps: (1) owner calls createSeason(price=1, opensAt=now+7d, closesAt=now+8d, burnBps=0, fallbackItem=1, entries=[{1,0,1,0},{3,4,2^128-1,1}]) -> succeeds (notice honored). (2) owner calls setPaused(true) at any time before opensAt. (3) warp to opensAt; any other account's buy(season,1) reverts BuyingPaused. (4) owner, in ONE transaction: setPaused(false); buy(season,10); setPaused(true) -> succeeds, owner's token balance unchanged (paid itself), paused() is true again. (5) other accounts' buy still reverts BuyingPaused for the whole window. (6) open(purchase) reserves minted[season][3] = 1 for the owner. Expected per the README's framing ('public for the whole notice before anyone ... can buy'): the public can act on the announced terms. Actual: only the owner could buy; the notice was informational. Verified with test/scratch/PauseExclusiveWindow.t.sol (passes on this code, demonstrating the sequence).","severity":"low","snippet":"    function setPaused(bool value) external onlyOwner {\n        paused = value;\n        emit PausedSet(value);\n    }","title":"Season notice is transparency only: owner can keep an announced season owner-only by toggling the pause around its own purchase (undocumented trust assumption)"}],"hash":"5923f5f5fdcfb72a8b3edee88bfb9391759f8c0e1aee7336ad1f8ed3539c0ea4","nodeId":"858ebb10-3478-4f37-acd6-11080a61e0ce","outcome":"completed","summary":"The findings file is validated, the scratch test is removed, and the tree is clean apart from the review output. The review is complete.\n\n**Result: both owner-trust gaps are closed correctly, with one low-severity trust-assumption gap recorded.**\n\nI checked the delivered code against the Access Control, Trust Gap and Asymmetry guides, traced every listed entry point, and confirmed the toolchain state:\n\n- `forge build` succeeds (lint warnings only), all 123 tests pass, `forge fmt --check` exits 0.\n- **Season notice** (`createSeason`) enforces `opensAt >= block.timestamp + seasonNotice` with an exact boundary. The notice is immutable, capped at 30 days in the constructor, and no other code path writes seasons, so there is no bypass. `closeSeason` and `cancelSeason` are unchanged.\n- **One-shot minter bootstrap** (`grantMinter`) takes the immediate branch only while `bootstrapped` is false and flips it in the same call. Rejected calls do not spend it. Every later grant, including re-granting the revoked box at zero supply, only writes a 7-day proposal. `activateMinter` is reachable solely through that proposal path.\n- The deploy script, every test fixture and `launch.json` pass the fifth constructor argument. The manifest has only the schema keys, string arguments, unique short names, and notes under 4,000 characters.\n- The README documents both rules and the two post-deploy steps.\n\n**The one finding (low):** the season notice is transparency only. The owner can announce a rigged season honestly, pause purchases before it opens, then unpause, buy, and re-pause in a single transaction, so nobody else can ever buy. With the vault set to the owner the purchase costs nothing net. This is within the requested design and the owner's intended powers, so I classified it as an undocumented trust assumption rather than a defect of the two requirements. The suggested fix is a README sentence in the owner-powers section. A hard guarantee would be a scope decision for the requester. I verified the sequence with a scratch Foundry test before reporting it.\n\n`.imd-findings.json` holds this finding plus a 30-row coverage record: all 26 listed entry points marked `holds` except `setPaused`, which references the finding, and four extra rows for the manifest, deploy script, README and the forge checks.","treeHash":null,"usage":{"cachedInputTokens":951498,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":24500,"runtime":"claude","turns":28,"wallClockMs":476663}},{"artifacts":[],"attempt":1,"bundleHash":"943e6c95b1e04a0cd123d93d61da6158471759bb03c5f050ad6a43332e86e35b","device":"f9a9196633a6ffa8","findings":[],"hash":"6e5641279e9781002aadf7128f44f7152748eaae42efc496dd61f1d6e4c0fd99","nodeId":"2d8b931b-c1e3-4ca2-810c-f553a2e4aaa4","outcome":"completed","summary":"Done. Both owner-trust gaps are closed, every check passes, and nothing was deployed.\n\n**What changed in the contracts**\n\n- `src/OGClubBox.sol` takes a fifth constructor argument, the season notice, stored as a public immutable and capped at a new 30-day constant. Creating a season now reverts with a dedicated error unless it opens at or after the current time plus the notice. Season immutability, close and cancel are untouched.\n- `src/OGClubFurniture.sol` gains a public `bootstrapped` flag. The first successful minter grant is immediate and sets it; every later grant is a 7-day proposal regardless of supply, including re-granting a revoked box. A reverted grant does not spend the bootstrap.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test with the verifier seed | 126 passed, 0 failed (123 permanent plus 3 audit proofs in scratch) |\n| forge fmt --check | passes |\n| Audit proofs on the original tree | all 3 fail as the audit reported |\n\n**Tests and supporting files**\n\n- New `test/SeasonNotice.t.sol` covers the exact notice boundary, a fuzzed boundary at arbitrary creation times, the audit's rigged-season scenario, and unchanged close and cancel behaviour.\n- Furniture and delivery-edge tests now assert that only the first grant is immediate, that a second grant and a re-grant of the revoked box wait 7 days while nothing has been delivered, and that opens during that wait store their rolls and deliver afterwards. Two tests that encoded the old supply-based rule were replaced.\n- The deploy script reads a new SEASON_NOTICE variable. The manifest passes a fifth argument of 0 for Sepolia and its notes describe the new rules. The README documents both rules in the owner powers section and tells the operator to grant the box first and to create each season at least one notice period before it opens.\n- ADAPTATION.md lists every change with its reason and notes that the base tree passed 111 tests locally rather than the 122 the brief mentions.\n\nOne behavioural detail worth knowing: with a notice of 0, a season can still open in the block it is created, but a backdated opening time is now refused. That follows from the literal rule and is documented in the README.","treeHash":"b2e866bd2a62ad7b6c6ff75fa9b3b3b6b2bcae47","usage":{"cachedInputTokens":1833286,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":47732,"runtime":"claude","turns":57,"wallClockMs":662888}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"759c614fdc84ff66","findings":[{"citation":"resolved","description":"Rule 2 makes every grant after the bootstrap a 7-day proposal, and the code enforces that on every path: bootstrapped is only ever set to true, the immediate branch is unreachable afterwards, and revokeMinter deletes any pending proposal, so a revoked box cannot be re-armed from an old proposal. activateMinter only checks that activatesAt has passed, with no upper bound, so a proposal that matured and was never activated stays armed indefinitely. The owner can propose a helper, leave it pending past maturity (observers may read it as abandoned), and months later activate it and mint immediately. The notice was public when it was given and pendingMinters(helper) stays readable, so this is not a bypass of the stated requirement. It does weaken the 'public notice before a new permission' purpose the README states, the same purpose the new season notice serves. A possible fix within the agreed design is an activation window (for example, activation only within N days after activatesAt, after which the owner must re-propose). That would change the rule, so it needs the requester's decision. Documenting that matured proposals stay armed until cancelled is the minimal alternative.","line":68,"path":"src/OGClubFurniture.sol","reproduction":"Deploy furniture with owner O; O.grantMinter(box) at t0, which is immediate and sets bootstrapped. At t0+1d, O.grantMinter(H), which records pendingMinters(H) = t0+8d. Nobody calls activateMinter(H). At t0+365d, O (or anyone) calls activateMinter(H). Expected (if notice is meant to precede activation): the proposal has lapsed and needs a fresh 7-day proposal. Actual: minters(H) becomes true at once, and H.mintBatch(O, [cappedId], [100]) succeeds in the same block, with no MinterProposed event in the preceding 357 days.","severity":"info","snippet":"    function activateMinter(address minter) external {\n        uint256 activatesAt = pendingMinters[minter];\n        if (activatesAt == 0) revert NoMinterProposal(minter);\n        if (block.timestamp < activatesAt) revert MinterDelayNotElapsed(minter, activatesAt);","title":"A matured minter proposal never expires, so a grant announced long ago can take effect at any later moment without fresh notice"}],"hash":"953bc0e76257cc860c227cd8336dfb4f036b764064a646c4c0fcb31757b459f9","nodeId":"4f5f1979-cfe0-4512-9531-9bce26a07bfa","outcome":"completed","summary":"I found no defect in either fix. The only item I'm reporting is informational. Findings are in `.imd-findings.json`. It has one finding and 29 coverage rows: one for each of the 26 entry points, plus three for invariants and the header library. No other file was changed.\n\n`forge build`, `forge test` (123 passed, 0 failed) and `forge fmt --check` all pass on the current tree.\n\n**Season notice (`OGClubBox`).** This holds. `createSeason` rejects any `opensAt` earlier than `block.timestamp + seasonNotice` and accepts it exactly at that time (`src/OGClubBox.sol:168-169`). The notice is a constructor argument capped at 30 days and can't be changed later. I found no other way for the owner to buy from a new season before its notice ends. Pause and close stop the owner from buying too, cancel only works before opening, and changing the vault never touches the odds.\n\n**One instant minter grant (`OGClubFurniture`).** This holds. `bootstrapped` is only ever set to true, and nothing clears it, including an ownership transfer. After the first grant, a new minter can only come from a proposal that has waited its 7 days. A grant rejected for the zero address does not use up the instant grant. `revokeMinter` also deletes any pending proposal, so a revoked box can't be switched back on from an old one.\n\n**Finding (info), `src/OGClubFurniture.sol:68`.** A matured proposal never expires. If the owner proposes a helper minter and nobody activates it, anyone can still call `activateMinter` a year later. The helper can then mint in that same block, with no new announcement in between. This meets the written rule, since the notice was public and `pendingMinters` stays readable. It does weaken the \"public notice before new permissions\" purpose the README describes. Adding an activation window would change the agreed rule, so that is your call. The smaller alternative is to document that a matured proposal stays live until cancelled.\n\n**Rest of the area.**\n- **Delivery during a re-grant delay:** opens store their rolls and `deliver` succeeds after activation.\n- **Header library:** `BlockHeader.decode` only reads a header that already matched the block hash, and its length checks hold.\n- **Deploy script and `launch.json`:** both pass the new fifth argument (`\"0\"` in the manifest), and the manifest's keys and notes are valid.\n- **Static-analysis leads:** I checked the slither and aderyn items and none is a real defect. The \"uninitialized\" variables are meant to start at zero. Each strict-equality check either compares against a value that can't occur or compares identifiers. The reentrancy reports involve the fixed token and furniture contracts behind `nonReentrant`.\n\nNo test proof is attached, because proofs were only required for critical or high findings.","treeHash":null,"usage":{"cachedInputTokens":1092626,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":16934,"runtime":"claude","turns":16,"wallClockMs":282524}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76f57db4177175be","findings":[{"citation":"resolved","description":"Economic design note, not a code defect: behavior is unchanged by this task and the README says a re-rolled tenth box 'may have a higher or lower tier'. The consequence is stronger than that sentence suggests. The guaranteed tenth box re-rolls only among rare-tier entries that are still available, so once every tier>=2 entry except one has sold out, the remaining one (typically the Legendary) is no longer a weighted roll but a certainty for the next ten-pack, at ten times the box price. Who profits: the buyer of the first ten-pack after the second-to-last rare-tier entry sells out, at a cost of 10 x price. Who loses: the owner, whose highest-tier scarcity is drained deterministically rather than at the published 1/rareWeight odds, and earlier ten-pack buyers who paid the same for a weighted chance. The sell-out moment is public (minted(seasonId,itemId) is a public mapping), so this becomes a watchable sniping race. Season designers must size caps and weights with this in mind, or the author may want the README's 'may have a higher or lower tier' sentence to say that it becomes certain when a single rare-tier entry remains.","line":470,"path":"src/OGClubBox.sol","reproduction":"Box with any seasonNotice, box granted as minter. createSeason(price=1 ether, opensAt, closesAt, burnBps=0, fallbackItem=1, entries=[{1,tier0,w89,cap0},{2,tier2,w10,cap1},{3,tier4,w1,cap1}]). Buyer A buy(season,10) then open: tenth box selects over rareWeight=11 and lands on item 2 with 10/11 (observed with prevRandao keccak256('a')). Buyer B buy(season,10) then open with prevRandao keccak256('b'): tenth box selects item 2 (sold out, counts[1]=1=cap) and re-rolls with retry % availableRareWeight where availableRareWeight=1, so _walk(availableOnly=true) returns item 3 with probability 1. Expected per published odds: B's tenth box is Legendary 1/11 of the time. Actual: B's tenth box is Legendary every time (minted(season,3) == 1 after B opens, whatever B's prevRandao). Verified with a scratch test on this tree: first tenth box = item 2, second tenth box = item 3.","severity":"info","snippet":"        picked = _walk(entries, counts, seed % rareWeight, true, false);\n        if (!_available(entries[picked], counts[picked])) {\n            uint256 retry = uint256(keccak256(abi.encode(seed)));\n            picked = _walk(entries, counts, retry % availableRareWeight, true, true);\n        }","title":"Ten-pack guarantee turns the last available rare-tier entry into a certainty for every later ten-pack"},{"citation":"resolved","description":"Trust-assumption note on the gap this task closes; no code change is required by the brief. seasonNotice guarantees that a season's terms are visible for the notice before sales start, and the README states that nobody, 'the owner included', can buy before then. It does not guarantee that anyone other than the owner can buy once it opens: the owner may announce a 1-wei season in which a capped piece is near-certain, keep setPaused(true) for the whole notice, and at opensAt execute setPaused(false), buy(season,1), setPaused(true) atomically (from a contract owner or a bundle). With the owner also set as vault the purchase costs nothing, since _pay treats a recipient paying itself as a no-loss leg. The capped piece is then minted to the owner four blocks later. This is equivalent in power and in notice to grantMinter on the furniture after its seven-day delay, so it stays within the stated trust model: the fix in this task provides notice, not prevention. It is recorded so the README's wording and the owner-powers section do not overstate what the notice provides.","line":212,"path":"src/OGClubBox.sol","reproduction":"Box deployed with seasonNotice = 7 days, owner == vault, box granted as minter. Owner: createSeason(1, now+7d, now+8d, 0, 1, [{1,tier0,w1,cap0},{3,tier4,w=(1<<128)-1,cap1}]) then setPaused(true). Any other buyer calling buy(season,1) during and after the notice reverts with BuyingPaused. At opensAt the owner sends setPaused(false); buy(season,1); setPaused(true) in one transaction: the owner's purchase succeeds, pays 0 net (owner is vault, burnBps 0), later buyers still revert with BuyingPaused. open(purchase, header) then mints item 3 to the owner (furniture.balanceOf(owner,3) == 1). Expected by a reader of the README: the public can buy from any announced season once it opens. Actual: only the owner could. Verified with a scratch test on this tree.","severity":"info","snippet":"    function setPaused(bool value) external onlyOwner {\n        paused = value;\n        emit PausedSet(value);\n    }","title":"Season notice gives public notice, not public access: owner can keep buying paused and be the sole buyer of an announced season"}],"hash":"a3a180c5bcb3ed2f4d57fad7a542337fa0e322e59ea1be5b55d6ca17c63a435d","nodeId":"73d14dad-8a77-4e20-8fb7-a8fb33204ddb","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No files in the tree were changed, and the scratch test directory was removed.\n\n**Outcome: no defects of medium severity or above in the economics, invariant and flow-gap area.** The two owner-trust gaps are closed as specified. Build, all 123 tests and the formatting check pass on this tree.\n\n**What I verified**\n\n- The season notice is enforced in createSeason against the immutable, 30-day-capped value, with the boundary exact and the only writer of season terms. Close and cancel are unchanged.\n- The furniture's first successful grant is the only immediate one, the flag never clears, and every later grant including a re-grant of the revoked box waits seven days regardless of supply. Purchases made before a revoke still open and store their rolls, and delivery resumes after activation.\n- Cap accounting holds on every pick path: ordinary, guaranteed tenth box, its re-roll, and fallback. The box never holds payment tokens and only ever pulls from the buyer, so the owner cannot spend buyer allowances.\n- The deploy script, every test constructor and launch.json pass the fifth argument. The manifest has only the schema keys, arguments in declaration order, and notes under the length limit.\n\n**Two info-level notes recorded**, each with a reproduction I confirmed in a scratch test:\n\n- **Ten-pack guarantee becomes a certainty.** Once all rare-tier entries but one have sold out, the next ten-pack's tenth box is that remaining piece every time, not at its published weight. Documented behaviour, but the README's \"may have a higher or lower tier\" understates it.\n- **Notice is not access.** The owner can keep buying paused through the notice and buy alone in one atomic unpause, buy, pause. This is equivalent to the seven-day minter delay's power, so it stays within the trust model, but the owner-powers wording slightly overstates what the notice guarantees.\n\n**Coverage** has 33 rows: every listed entry point plus the invariants, the manifest and the toolchain checks. One row is unreached: the real mainnet payment token is not in the tree, so a fee or reflection token making every buy revert could not be ruled out beyond the README's existing requirement for an ordinary ERC-20.","treeHash":null,"usage":{"cachedInputTokens":1470014,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":35896,"runtime":"claude","turns":30,"wallClockMs":528784}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f2101c240e0b52a9","findings":[{"citation":"resolved","description":"The brief says a zero-notice box must 'behave as today' while also requiring opensAt >= block.timestamp + seasonNotice. At commit 3cf22eb createSeason only required opensAt < closesAt, so an owner could pass opensAt = 0 (or any past timestamp) to mean 'open at once'. The new check turns that into SeasonOpensTooSoon(opensAt, block.timestamp) when seasonNotice is 0. The literal rule in the brief wins and the README documents it ('opensAt can never be in the past'), so this is a behaviour delta to be aware of for test-network tooling, not a defect: a season opening in the creating block is still possible by passing opensAt = block.timestamp. No funds, caps or odds are affected.","line":168,"path":"src/OGClubBox.sol","reproduction":"Deploy OGClubBox(token, furniture, vault, owner, 0). At block.timestamp = 1000 call createSeason(1, 0, 100000, 0, 1, entries) as owner. Expected under 'behaves as today': season created with opensAt 0 (as at 3cf22eb). Actual: revert SeasonOpensTooSoon(0, 1000). createSeason(1, 1000, 100000, 0, 1, entries) succeeds and sells in the same block, so instant seasons remain available with the current timestamp.","severity":"info","snippet":"        uint256 earliest = block.timestamp + seasonNotice;\n        if (opensAt < earliest) revert SeasonOpensTooSoon(opensAt, earliest);","title":"With seasonNotice 0, createSeason now rejects an opensAt in the past, which the pre-change code accepted"}],"hash":"b1fae9a39d885db270eda57ef6b3b29ae6d881fd484eee396679f169eadf142e","nodeId":"a121e703-cfaf-488b-b74c-561928040386","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Outcome:** no math, boundary or numerical-gap defect survived verification. The one entry in `.imd-findings.json` is an info-level note, and the coverage record answers all 26 entry points plus four invariant rows.\n\n**What I checked, in the three assigned guides' terms**\n\n- **Math precision:** the price times count guard, the burn split through mulDiv, and the vault remainder. Rounding sends at most 1 wei of burn to the vault per purchase. A probe with price 1 and 99.99% burn confirmed burn 0 and vault 1, which is dust with no compounding.\n- **Boundaries:** sale window inclusive at opensAt and exclusive at closesAt, cancel allowed only strictly before opening, reveal window live at a 256-block gap and expired at 257 which matches blockhash availability, summed weights allowed to reach exactly 2 to the 128, and the 30-day notice cap. All probed and holding.\n- **Numerical gap (gas reserve seam):** at the lowest gas at which open succeeds, a receiver that burns the entire mint budget still leaves enough reserve to store ten distinct rolled IDs. I measured this for both a live ten-pack and an expired ten-pack. The 63/64 rule still forwards the full one million gas at that threshold.\n- **RLP header parsing:** canonical-length checks, the number and mixHash field constraints, and the whole-input list requirement all hold. The suite already has real mainnet fixtures and malformed-input fuzzing.\n- **Furniture:** the bootstrap flag is set only after the zero-address check, a second grant waits seven days at zero supply, revoke clears any pending proposal, and activation is inclusive at the deadline.\n\n**The info note:** with a zero notice, createSeason now rejects an opensAt in the past, which the code at the base commit accepted. That is what the brief's explicit rule requires and the README documents it, but it is a behaviour change relative to the \"behaves as today\" clause, so I recorded it for the judge rather than treating it as a defect.\n\n**Verification state:** forge build, the full suite of 123 tests, and forge fmt --check all pass on the unchanged tree. My scratch probes were removed, so the only file I left behind is the findings JSON.","treeHash":null,"usage":{"cachedInputTokens":1095110,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":34638,"runtime":"claude","turns":32,"wallClockMs":595219}},{"artifacts":[],"attempt":2,"bundleHash":"2e0811c20a0633ab1c3a63699d87d5c16caa97b15aa24221b350eb61be721518","device":"6e1819675bb7567a","findings":[],"hash":"e17b261b937cb8392569e6127bedfc95a47fb0dc6dee84684fdc063b422c1f97","nodeId":"28c3c9a4-6ce5-4203-9863-47010dea3ef7","outcome":"completed","summary":"Added 12 regression/fuzz tests and a stateful invariant suite covering notice boundaries, ownership changes, delayed re-grants, payment conservation, and stored-roll delivery.\n\nVerified with the supplied seed: **136 tests pass**. `forge build` and `forge fmt --check` also pass.\n\nOnly two files under `test/` were added. No deployment performed.","treeHash":"d2d75a8f2c4dab611a83515f9bb7789124eb4a90","usage":{"cachedInputTokens":1651072,"inputTokens":95335,"model":"gpt-6-astra","outputTokens":20010,"runtime":"codex","turns":7,"wallClockMs":812473}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"91067b3439961e55","findings":[{"citation":"resolved","description":"Merged from audit_permissions (low) and audit_economics (info); same root cause, kept at info because it is within the owner powers the brief asks for. Requirement 1 is implemented correctly: createSeason enforces opensAt >= block.timestamp + seasonNotice (src/OGClubBox.sol:168-169) and the season's terms are public for the whole notice. But buy gates every caller, the owner included, only on the global pause and the season window; nothing excludes the owner from buying, and with vault == owner and burnBps == 0 the vault leg is a self-transfer that _pay accepts with expected = 0 (line 368). So the owner can announce a 1-wei season with a capped piece near-certain, hold setPaused(true) for the notice, and at opensAt send setPaused(false); buy(season, n); setPaused(true) atomically (any contract or multisig owner, or an EOA with a private bundle). The public saw the terms but could never buy; the owner reserves the capped piece at zero net cost after the same seven days of notice the minter delay gives. This matches the brief's stated goal (notice equivalent to the minter delay, not a competitive window), so it is a trust assumption, not a defect. The README's owner-powers section says the pause exists and that terms are public 'before anyone, the owner included, can buy', which is literally true, but a reader may take the notice as a guarantee of public access. Minimal fix within the agreed design: a README sentence in the owner-powers section stating that the owner may buy from its own seasons (paying itself when it is the vault) and that the pause can make any announced season owner-only. A hard guarantee (forbidding buy for the owner, or delaying unpause) is a scope decision for the requester.","line":229,"path":"src/OGClubBox.sol","reproduction":"Reproduced on this tree with a scratch Foundry test (deleted after the run). State: OGClubBox(token, furniture, vault = owner, owner, seasonNotice = 7 days); furniture.grantMinter(box) done; owner approved the box for its token. Steps: (1) owner createSeason(price 1, opensAt = now + 7 days, closesAt = opensAt + 1 day, burnBps 0, fallbackItem 1, entries [{1, tier 0, weight 1, cap 0}, {3, tier 4, weight 2^128-1, cap 1}]) succeeds. (2) owner setPaused(true). (3) warp to opensAt: buyer.buy(season, 1) reverts BuyingPaused. (4) owner, in one transaction: setPaused(false); buy(season, 1); setPaused(true): succeeds, owner token balance unchanged (paid itself). (5) buyer.buy(season, 1) reverts BuyingPaused again. (6) owner opens the purchase after the target block: furniture.balanceOf(owner, 3) == 1. Expected by a reader who takes the notice as public access: the public can buy from an announced season once it opens. Actual: only the owner could buy; the notice was informational.","severity":"info","snippet":"        if (paused) revert BuyingPaused();","title":"Season notice is public notice, not public access: the owner can keep an announced season owner-only by toggling the pause around its own purchase (trust assumption to document)"},{"citation":"resolved","description":"Reproduced audit_math's note. At 3cf22eb createSeason only required opensAt < closesAt, so an owner (and test tooling) could pass opensAt = 0 or any past timestamp to mean 'open at once'. The brief's literal rule, opensAt >= block.timestamp + seasonNotice, with notice 0 becomes opensAt >= block.timestamp and so refuses a past opensAt. The literal rule wins over the 'behaves as today' phrase, the README documents it ('opensAt can never be in the past'), test/Seasons.t.sol::test_ZeroNoticeSeasonOpensAtOnce asserts it, and an instant season is still available by passing opensAt = block.timestamp. No funds, caps or odds are affected. Recorded so the test-network tooling that constructs seasons knows to pass the current timestamp rather than 0.","line":169,"path":"src/OGClubBox.sol","reproduction":"Deploy OGClubBox(token, furniture, vault, owner, 0). At block.timestamp = 1000, owner calls createSeason(1, 0, 100000, 0, 1, defaultEntries). Expected at 3cf22eb: season created with opensAt 0. Actual on this tree: revert SeasonOpensTooSoon(0, 1000). createSeason(1, 1000, 100000, 0, 1, defaultEntries) succeeds and buy works in the same block (test/Seasons.t.sol lines 131-142 pass on this tree).","severity":"info","snippet":"        if (opensAt < earliest) revert SeasonOpensTooSoon(opensAt, earliest);","title":"With seasonNotice 0, createSeason now refuses a backdated opensAt that the pre-change code accepted (behaviour delta vs 'behaves as today')"},{"citation":"resolved","description":"Reproduced audit_flow's note. Requirement 2 is implemented correctly: bootstrapped is only ever set to true (line 56), the immediate branch is unreachable afterwards, and revokeMinter deletes any pending proposal (line 87), so a revoked box cannot be re-armed from an old proposal. activateMinter only checks a lower bound on time, so a proposal that matured and was never activated stays armed indefinitely and anyone may activate it later. The MinterProposed event was public when emitted and pendingMinters(minter) remains readable, so this is not a bypass of the stated rule and the behaviour predates this task. An activation window (activate only within N days after activatesAt, then re-propose) would change the agreed rule and needs the requester's decision; documenting that matured proposals stay armed until cancelled is the minimal alternative.","line":71,"path":"src/OGClubFurniture.sol","reproduction":"Deploy furniture with owner O. t0: O.grantMinter(box) is immediate and sets bootstrapped. t0 + 1 day: O.grantMinter(H) records pendingMinters(H) = t0 + 8 days and emits MinterProposed. Nobody activates. t0 + 365 days: anyone calls activateMinter(H). Expected if notice must precede activation: revert, fresh seven-day proposal needed. Actual: minters(H) == true at once, and H.mintBatch(O, [3], [100]) succeeds in the same block with no MinterProposed event in the preceding 357 days.","severity":"info","snippet":"        if (block.timestamp < activatesAt) revert MinterDelayNotElapsed(minter, activatesAt);","title":"A matured minter proposal never expires: a grant proposed long ago can be activated and mint at any later moment without fresh notice (pre-existing, unchanged by this task)"},{"citation":"resolved","description":"Reproduced audit_economics' note with one correction: the certainty is at pack level, not strictly in the tenth box. _pickRare selects the tenth box over the full rare weight and, if that entry has sold out, re-rolls with retry % availableRareWeight over the available rares only (line 473). When exactly one tier >= 2 entry remains, availableRareWeight equals its weight and the walk returns it with probability 1, unless one of the pack's first nine boxes already drew it at its normal odds, in which case the tenth box falls through to the fallback; either way the pack contains that entry exactly once. This is the documented ten-pack guarantee working as intended and the task forbids changing it; the consequence is that the sell-out of the second-to-last rare (public via minted(seasonId, itemId)) turns the last Legendary into a watchable race for the next ten-pack at ten times the box price. The README's 'may have a higher or lower tier' sentence could say that the guarantee becomes a certainty when a single rare-tier entry remains, and season designers should size rare caps with this in mind.","line":473,"path":"src/OGClubBox.sol","reproduction":"Reproduced on this tree with a scratch Foundry test (deleted after the run). Box granted as minter, season createSeason(price 1 ether, opensAt, closesAt, burnBps 0, fallbackItem 1, entries [{1, tier 0, w 89, cap 0}, {2, tier 2, w 10, cap 1}, {3, tier 4, w 1, cap 1}]). Buyer A buy(season, 10) and open with prevRandao keccak256('a'): minted(season, 2) == 1, minted(season, 3) == 0. Then eight ten-pack purchases by buyer B with previewOpen under prevRandao keccak256(abi.encode('b', i)) for i in 0..7: every previewed pack contains item 3 exactly once (seven times as the tenth box, once in an earlier box with the tenth box the fallback). Opening the last one sets minted(season, 3) == 1. Expected per published odds: item 3 in a given pack about 10% of the time. Actual: every pack.","severity":"info","snippet":"            picked = _walk(entries, counts, retry % availableRareWeight, true, true);","title":"Ten-pack guarantee makes the last remaining rare-tier entry a certainty for the next ten-pack (pre-existing design note, unchanged by this task)"}],"hash":"ef0e4434b59278817dc085af4fb831cb7f11a8c5c748d393ac3d588061468e56","nodeId":"0ed57722-df7f-4d81-bad4-fa083b38bb04","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with four findings and a full coverage record. The working tree is clean.\n\n**Outcome: the revision holds.** Both owner-trust gaps are closed as the brief specifies, and I found no defect that reopens the work.\n\n- **Rule 1 (season notice)** is correct. The fifth constructor argument is immutable, capped at 30 days, exposed as a view, and createSeason enforces the lower bound after the existing parameter checks. Boundary, fuzz, close and cancel tests pass.\n- **Rule 2 (one bootstrap grant)** is correct. The flag is set only in the immediate branch and never cleared, a reverted grant does not spend it, and a re-grant of the revoked box waits seven days while opens store their rolls.\n- **Tests, script, manifest, README** all pass the new argument. The manifest has only the three schema keys, five string arguments for the box in declaration order, and notes under the limit. Build, 136 tests and fmt check all pass. Runtime size is well under the limit and constructors make no external calls.\n\n**Findings kept, all at info severity.** Each was reproduced against the tree and none is a defect in the requested behavior:\n\n1. **Pause can make an announced season owner-only.** Merged the audit_permissions and audit_economics reports into one. The owner can hold the pause through the notice and atomically unpause, buy and re-pause at opening, paying itself when it is the vault. Reproduced with a scratch test. This is within the owner powers the brief asks for, so it is a trust assumption for the README, not a bypass.\n2. **Notice 0 refuses a backdated opensAt** that the old code accepted. The brief's literal rule wins and the README documents it. Kept as a tooling note.\n3. **A matured minter proposal never expires.** Pre-existing and unchanged by this task.\n4. **Ten-pack guarantee turns the last remaining rare into a certainty.** Reproduced, with one correction to the specialist's claim: the certainty is at pack level. One of eight previewed packs took the rare in an earlier box and the tenth fell to the fallback. This is the documented guarantee working as designed.\n\nThe scratch test used for reproduction was deleted after the run. No files other than the findings file were created.","treeHash":null,"usage":{"cachedInputTokens":1373035,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":18257,"runtime":"claude","turns":24,"wallClockMs":291642}}],"verification":[{"checks":[{"durationMs":8961,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.85s\nCompiler run successful!\n","passed":true},{"durationMs":13555,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/Seasons.t.sol:SeasonsTest\n[PASS] test_AllOwnerFunctionsProtected() (gas: 205698)\n[PASS] test_BuyRequiresTheBoxToBeAnAuthorizedMinter() (gas: 954897)\n[PASS] test_BuyWindowCountPauseAndClose() (gas: 820695)\n[PASS] test_CancelOnlyBeforeOpeningAndTerminal() (gas: 1021751)\n[PASS] test_CreateValidation() (gas: 2062629)\n[PASS] test_MaximumEntryCountAndIdZeroSupported() (gas: 7260903)\n[PASS] test_OverlappingSeasonsIndependentAndTermsUnchanged() (gas: 3022585)\n[PASS] test_OwnershipRequiresAcceptanceAndCanCancelPending() (gas: 370635)\n[PASS] test_UnknownSeasonCannotBeUsed() (gas: 213307)\n[PASS] test_ZeroNoticeSeasonOpensAtOnce() (gas: 1641374)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 11.89ms (11.07ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependencies() (gas: 20193)\n[PASS] test_DeployExplicitParametersNoEnvironment() (gas: 23129433)\n[PASS] test_InvalidConstructorAddresses() (gas: 6021)\n[PASS] test_MockSupplySymbolDecimalsAndPublicMint() (gas: 92899)\n[PASS] test_SeasonNoticeIsImmutableAndAtMostThirtyDays() (gas: 17280)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 38.85ms (27.34ms CPU time)\n\nRan 7 tests for test/SeasonNotice.t.sol:SeasonNoticeTest\n[PASS] testFuzz_NoticeBoundaryIsExactAtAnyTime(uint64,uint32) (runs: 256, μ: 887850, ~: 887737)\nLogs:\n  Bound result 8064\n  Bound result 530433\n\n[PASS] test_CloseAndCancelWorkAsBefore() (gas: 1842229)\n[PASS] test_CreateSeasonRevertsBeforeTheNoticeAndSucceedsExactlyAtIt() (gas: 796186)\n[PASS] test_NoticeIsExposedAndImmutable() (gas: 16537)\n[PASS] test_OtherParameterErrorsStillComeFirst() (gas: 160156)\n[PASS] test_OwnerCannotMintCappedPieceThroughANewSeasonBeforeItsNotice() (gas: 1692777)\n[PASS] test_SeasonTermsRemainImmutable() (gas: 651118)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 54.84ms (55.97ms CPU time)\n\nRan 9 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32617, ~: 32280)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 93663, ~: 74616)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 345650)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147761)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237560)\n[PASS] test_RealMainnetCancunHeader() (gas: 1230914)\n[PASS] test_RealMainnetPragueHeader() (gas: 1235417)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 1228140)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40758)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 132.05ms (134.53ms CPU time)\n\nRan 7 tests for test/Delivery.t.sol:DeliveryTest\n[PASS] testFuzz_FirstDeliveryRejectionThenAnyoneCanRetryOnlyOnce(uint8) (runs: 256, μ: 1738997, ~: 1731857)\nLogs:\n  Bound result 10\n\n[PASS] test_DeliveryChecksUnknownUnopenedAndAlreadyDelivered() (gas: 723478)\n[PASS] test_ExpiredUnopenedPurchaseStillRecordsOnlyFallbacksWhenDeliveryFails() (gas: 1190615)\n[PASS] test_HostileReceiverCannotVetoTenDistinctRolledItems() (gas: 11642547)\n[PASS] test_OwnerCannotMintCappedPieceWithinSevenDaysOfProposal() (gas: 1100400)\n[PASS] test_RedirectedDeliveryRejectsReentryAndMarksDeliveredBeforeCallback() (gas: 2403758)\n[PASS] test_ZeroItemIdAndDuplicateStoredItemsDeliverExactlyOnce() (gas: 1098749)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 219.03ms (225.46ms CPU time)\n\nRan 5 tests for test/FixedOdds.t.sol:FixedOddsTest\n[PASS] testFuzz_OtherOpensOnlyDegradeSoldOutPicks(bytes32,uint8,uint8) (runs: 256, μ: 2398969, ~: 2386380)\nLogs:\n  Bound result 7\n  Bound result 1\n\n[PASS] test_RejectedDeliveryCannotBeRetriedForABetterRoll() (gas: 2814306)\n[PASS] test_RejectedTenPackReservesRareAndCannotUpgradeAfterAnotherOpen() (gas: 4921840)\n[PASS] test_SellOutOnlyDegradesTheSoldOutPickAndNeverRemapsOthers() (gas: 3304872)\n[PASS] test_TenPackGuaranteeRerollsOnlyWhenItsOwnRareSellsOut() (gas: 3143804)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 221.37ms (228.39ms CPU time)\n\nRan 11 tests for test/Opening.t.sol:OpeningTest\n[PASS] testFuzz_ExpiredAlwaysFallback(uint8,bytes32,uint16) (runs: 256, μ: 854499, ~: 838796)\nLogs:\n  Bound result 4\n  Bound result 257\n\n[PASS] testFuzz_PreviewMatchesOpenAndCaps(bytes32,uint8) (runs: 256, μ: 3584138, ~: 3556704)\nLogs:\n  Bound result 1\n\n[PASS] test_AuthenticatedHeaderMustHaveCorrectNumber() (gas: 346740)\n[PASS] test_BuilderFieldsDoNotAffectRoll() (gas: 2467444)\n[PASS] test_ExactExpiryBoundaryAndIgnoredHeader() (gas: 1979631)\n[PASS] test_MaturityWrongHeadersAndAlreadyOpened() (gas: 1437483)\n[PASS] test_OpenWhileClosedPausedAndPastSaleEnd() (gas: 1299249)\n[PASS] test_ReceiverReentrancySingleAndBatch() (gas: 5471350)\n[PASS] test_RejectedFirstDeliveryRecordsOpenedAndCapsAndCanRetry() (gas: 3292752)\n[PASS] test_RevokedMinterRecordsRollAndDeliversAfterExpiryAndDelayedRestoration() (gas: 2234768)\n[PASS] test_UnknownPurchase() (gas: 100405)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 265.66ms (442.26ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 595912, ~: 595712)\nLogs:\n  Bound result 4532\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394533)\n[PASS] test_IdentityInterfacesMintAndSupply() (gas: 448761)\n[PASS] test_InvalidAddressesAndBatchLengths() (gas: 3967)\n[PASS] test_MetadataFreezesPermanently() (gas: 195226)\n[PASS] test_NoOwnerSeizureOrBurn() (gas: 418561)\n[PASS] test_OnlyTheFirstGrantIsImmediateEvenBeforeAnyMint() (gas: 545905)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 568742)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 456968)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535472)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340658)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 301.21ms (367.54ms CPU time)\n\nRan 4 tests for test/OpenGas.t.sol:OpenGasTest\n[PASS] testFuzz_LowestSucceedingGasDeliversAndStoresNothing(uint8,bytes32) (runs: 256, μ: 7035276, ~: 6978376)\nLogs:\n  Bound result 2\n\n[PASS] test_GasConstantsArePublishedAndConsistent() (gas: 35237)\n[PASS] test_ReserveSavesTenDistinctItemsAtLowestDeliveryGas() (gas: 41867740)\n[PASS] test_ShortGasOpenRevertsInsteadOfRecordingDeliveryFailure() (gas: 2345352)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 395.96ms (436.14ms CPU time)\n\nRan 11 tests for test/Payments.t.sol:PaymentsTest\n[PASS] testFuzz_SplitConservesPayment(uint128,uint16,uint8) (runs: 256, μ: 753044, ~: 758990)\nLogs:\n  Bound result 9786\n  Bound result 9999\n  Bound result 10\n\n[PASS] test_ChangingVaultAndSameRecipient() (gas: 553182)\n[PASS] test_ExactSplitsAndEvents() (gas: 17898059)\n[PASS] test_FalseReturnTokenRejected() (gas: 1142491)\n[PASS] test_FeeOnEitherLegRevertsBothTransfers() (gas: 3035943)\n[PASS] test_InsufficientAllowanceRollsBackFirstLeg() (gas: 330254)\n[PASS] test_NoReturnTokenSupported() (gas: 1098451)\n[PASS] test_PriceMultiplicationOverflowHasCustomError() (gas: 464015)\n[PASS] test_TokenCallbackCannotReenter() (gas: 1700230)\n[PASS] test_VaultCanBuyAndOnlyPartsWithTheBurnShare() (gas: 1860132)\n[PASS] test_VaultCannotBeBoxOrZero() (gas: 57000)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 479.94ms (65.89ms CPU time)\n\nRan 17 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_CreateSeasonRoundTripsTermsAndEntries(uint64,uint32,uint32,uint16,uint8,bytes32) (runs: 512, μ: 1565240, ~: 1248666)\nLogs:\n  Bound result 7698\n  Bound result 19426589\n  Bound result 3714247999\n  Bound result 2955\n  Bound result 31\n\n[PASS] testFuzz_TenPackBoxNineIsRareExactlyWhenARareRemains(bytes32,uint8,uint8) (runs: 512, μ: 5723849, ~: 5724685)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] test_BuyerCanOpenTheirOwnPurchase() (gas: 703643)\n[PASS] test_CapsAreTrackedPerSeasonNotPerItem() (gas: 4193676)\n[PASS] test_CloseIsAllowedBeforeOpeningAndCancelIsNotAfterClose() (gas: 536084)\n[PASS] test_ContractBuyerWithoutReceiverOpensAndCanRedirectDelivery() (gas: 2010989)\n[PASS] test_ExpiredOpenStillRespectsReentrancyAndOnlyMintsFallback() (gas: 575417)\n[PASS] test_ExpiryIsMeasuredFromTargetNotFromPurchase() (gas: 1047326)\n[PASS] test_InsufficientBalanceRevertsWithoutRecordingPurchase() (gas: 354460)\n[PASS] test_ListShapedTrailingFieldsAcceptedButListAtNumberOrMixHashRejected() (gas: 507928)\n[PASS] test_NumberFieldOfThirtyTwoBytesAndSingleByteAreCanonical() (gas: 513865)\n[PASS] test_OpeningOrderIsFreeButCapsStillHold() (gas: 2011153)\n[PASS] test_PauseDoesNotBlockOwnerActionsOrViews() (gas: 1724733)\n[PASS] test_PurchasesInTheSameBlockShareTheTargetAndHeader() (gas: 2552534)\n[PASS] test_SeasonLifecycleEventsAreEmittedExactly() (gas: 621062)\n[PASS] test_SingleEntrySeasonAlwaysMintsFallbackEvenInTenPack() (gas: 1194916)\n[PASS] test_TotalWeightMayEqualMaxTotalWeightButNotExceedIt() (gas: 1916019)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 508.92ms (879.30ms CPU time)\n\nRan 11 tests for test/DeliveryEdges.t.sol:DeliveryEdgesTest\n[PASS] testFuzz_ActivationBoundaryIsExact(uint32) (runs: 256, μ: 666486, ~: 666486)\n[PASS] testFuzz_OnlyTheBuyerRedirectsButAnyoneDelivers(bytes32,bytes32) (runs: 200, μ: 1957422, ~: 1952167)\n[PASS] testFuzz_OpenWithAnyGasIsAtomicOrDeliversThePreview(uint32,uint8,bytes32) (runs: 200, μ: 1188864, ~: 1184872)\nLogs:\n  Bound result 7\n  Bound result 1350096\n\n[PASS] testFuzz_StoredRollSurvivesAnyDelayAndSeasonChanges(uint64,uint64,bytes32) (runs: 200, μ: 1806596, ~: 1809219)\nLogs:\n  Bound result 244\n  Bound result 6959\n\n[PASS] test_ExpiryOnlyAppliesToUnopenedPurchasesEvenWhenDeliveryIsPending() (gas: 2154639)\n[PASS] test_GasStarvedOpenRevertsUntouchedAndNeverParksAnHonestRoll() (gas: 2509570)\n[PASS] test_RedirectToNonReceiverContractsRevertsAndLeavesTheRollStored() (gas: 3149285)\n[PASS] test_SecondGrantWaitsEvenWhileOnlyUndeliveredRollsExist() (gas: 1358339)\n[PASS] test_SuccessfulOpenWritesNoStoredItemsAndFailureWritesExactlyTheRoll() (gas: 2100646)\n[PASS] test_SupplyCannotReturnToZeroSoTheDelayIsPermanent() (gas: 706197)\n[PASS] test_ZeroAmountMintsLeaveSupplyZeroButGrantsStillWait() (gas: 515070)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 508.83ms (1.62s CPU time)\n\nRan 6 tests for test/Rolls.t.sol:RollsTest\n[PASS] testFuzz_OddsOver20000Randao(bytes32) (runs: 1, μ: 737324, ~: 737324)\n[PASS] testFuzz_RandomizedCapsNeverExceeded(bytes32,uint8,uint8) (runs: 256, μ: 6220757, ~: 6222511)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] testFuzz_TenPackGuarantee(bytes32) (runs: 256, μ: 1656106, ~: 1658621)\n[PASS] test_CapsExhaustedWithinPackAndNeverRollAgain() (gas: 2396957)\n[PASS] test_GuaranteedRollUsesRelativeRareWeights() (gas: 13250051)\n[PASS] test_SeedDomainMatchesSpecification() (gas: 869753)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.34s (1.92s CPU time)\n\nRan 1 test for test/BoxInvariant.t.sol:BoxInvariantTest\n[PASS]\nBoxInvariantTest invariants:\n[PASS] invariant_CapsAndDeliveredSupplyPlusStoredItemsMatchPerSeasonMints\n[PASS] invariant_EachPurchaseOpenedOnceAndEveryOpenMatchedPreview\n[PASS] invariant_PaymentsAreConservedWithoutBoxCustody\n BoxInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+-------------------+-------+---------+----------╮\n| Contract   | Selector          | Calls | Reverts | Discards |\n+=============================================================+\n| BoxHandler | advance           | 1359  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | pause             | 1408  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | purchase          | 1424  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | retryDelivery     | 1344  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | reveal            | 1310  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | setRejectDelivery | 1347  | 0       | 0        |\n╰------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 10\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 217\n  Bound result 1\n  Bound result 253\n  Bound result 40\n  Bound result 2\n  Bound result 300\n  Bound result 230\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.58s (4.57s CPU time)\n\nRan 1 test for test/MinterLifecycleInvariant.t.sol:MinterLifecycleInvariantTest\n[PASS]\nMinterLifecycleInvariantTest invariants:\n[PASS] invariant_BoxHoldsNothingAndPaymentsAreConserved\n[PASS] invariant_EachPurchaseDeliveredAtMostOnceAndOnlyAfterOpening\n[PASS] invariant_MintedPerItemEqualsDeliveredSupplyPlusStoredMinusDirectMints\n[PASS] invariant_MinterRolesMatchGhostsAndNeverActivateEarly\n MinterLifecycleInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------------+--------------------------+-------+---------+----------╮\n| Contract               | Selector                 | Calls | Reverts | Discards |\n+================================================================================+\n| MinterLifecycleHandler | activate                 | 536   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | advance                  | 523   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | buy                      | 555   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | cancel                   | 572   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | deliver                  | 1108  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | directMint               | 557   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | grant                    | 539   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | open                     | 1136  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | revoke                   | 515   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | setRejectDelivery        | 551   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | strangerCannotAdminister | 567   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | warp                     | 521   | 0       | 0        |\n╰------------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 303\n  Bound result 40\n  Bound result 2\n  Bound result 5\n  Bound result 10\n  Bound result 2\n  Bound result 4179\n  Bound result 3061\n  Bound result 1\n  Bound result 1\n  Bound result 64\n  Bound result 2\n  Bound result 64\n  Bound result 91\n  Bound result 296\n  Bound result 1\n  Bound result 300000\n  Bound result 15212\n  Bound result 2\n  Bound result 10\n  Bound result 3\n  Bound result 10\n  Bound result 183\n  Bound result 212\n  Bound result 1\n  Bound result 10\n  Bound result 4852\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.80s (4.80s CPU time)\n\nRan 1 test for test/FurnitureInvariant.t.sol:FurnitureInvariantTest\n[PASS]\nFurnitureInvariantTest invariants:\n[PASS] invariant_BalancesAndSupplyMatchGhosts\n[PASS] invariant_FrozenMetadataNeverChangesAndRoyaltyIsBounded\n[PASS] invariant_OwnerNeverHoldsOrDestroysAnything\n FurnitureInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------+--------------------------+-------+---------+----------╮\n| Contract         | Selector                 | Calls | Reverts | Discards |\n+==========================================================================+\n| FurnitureHandler | mint                     | 1041  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1088  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1126  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1111  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1157  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1030  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1127  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 8\n  Bound result 14\n  Bound result 12\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 3\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 718\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 14\n  Bound result 14\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 3\n  Bound result 14\n  Bound result 0\n  Bound result 3\n  Bound result 10\n  Bound result 8\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 5\n  Bound result 9\n  Bound result 2\n  Bound result 0\n  Bound result 6\n  Bound result 13\n  Bound result 7\n  Bound result 8\n  Bound result 14\n  Bound result 17\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 12\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.21s (5.21s CPU time)\n\nRan 1 test for test/MultiActorInvariant.t.sol:MultiActorInvariantTest\n[PASS]\nMultiActorInvariantTest invariants:\n[PASS] invariant_BoxNeverHoldsTheToken\n[PASS] invariant_EveryTokenPaidIsAccountedToBurnOrAVault\n[PASS] invariant_HandlerExercisedFailurePathsAndGuarantee\n[PASS] invariant_MintedNeverExceedsCapAndMatchesSupply\n[PASS] invariant_PurchasesOpenOnceAndFinishedStatesNeverReopen\n MultiActorInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| MultiActorHandler | advanceBlocks            | 673   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | buy                      | 1320  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | cancelSeason             | 627   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | closeSeason              | 560   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | createSeason             | 652   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | open                     | 1293  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setPaused                | 662   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setVault                 | 666   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | strangerCannotAdminister | 617   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | warp                     | 610   | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 57\n  Bound result 183316137134\n  Bound result 256\n  Bound result 6\n  Bound result 3586\n  Bound result 16\n  Bound result 732\n  Bound result 15\n  Bound result 6\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 16\n  Bound result 8\n  Bound result 93\n  Bound result 4\n  Bound result 8\n  Bound result 5616\n  Bound result 242\n  Bound result 4\n  Bound result 314\n  Bound result 242\n  Bound result 808160172423\n  Bound result 6309\n  Bound result 2\n  Bound result 833\n  Bound result 1\n  Bound result 8025\n  Bound result 32\n  Bound result 11956\n  Bound result 5\n  Bound result 2\n  Bound result 1014\n  Bound result 101\n  Bound result 277\n  Bound result 6\n  Bound result 8256\n  Bound result 18\n  Bound result 7\n  Bound result 7\n  Bound result 100\n  Bound result 129\n  Bound result 1\n  Bound result 3\n  Bound result 14\n  Bound result 9\n  Bound result 132\n  Bound result 67\n  Bound result 14837\n  Bound result 3\n  Bound result 5\n  Bound result 100\n  Bound result 14694\n  Bound result 277\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.45s (13.44s CPU time)\n\nRan 17 test suites in 13.45s (32.52s CPU time): 123 tests passed, 0 failed, 0 skipped (123 total tests)\n","passed":true},{"durationMs":112,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubBox.acceptOwnership()\",\"OGClubBox.buy(uint256,uint256)\",\"OGClubBox.cancelSeason(uint256)\",\"OGClubBox.closeSeason(uint256)\",\"OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,(uint256,uint8,uint256,uint256)[])\",\"OGClubBox.deliver(uint256)\",\"OGClubBox.deliverTo(uint256,address)\",\"OGClubBox.open(uint256,bytes)\",\"OGClubBox.renounceOwnership()\",\"OGClubBox.setPaused(bool)\",\"OGClubBox.setVault(address)\",\"OGClubBox.transferOwnership(address)\",\"OGClubFurniture.acceptOwnership()\",\"OGClubFurniture.activateMinter(address)\",\"OGClubFurniture.cancelMinter(address)\",\"OGClubFurniture.freezeMetadata()\",\"OGClubFurniture.grantMinter(address)\",\"OGClubFurniture.mintBatch(address,uint256[],uint256[])\",\"OGClubFurniture.renounceOwnership()\",\"OGClubFurniture.revokeMinter(address)\",\"OGClubFurniture.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"OGClubFurniture.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"OGClubFurniture.setApprovalForAll(address,bool)\",\"OGClubFurniture.setBaseURI(string)\",\"OGClubFurniture.setRoyalty(address,uint96)\",\"OGClubFurniture.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":148,\"README.md\":373,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":29,\"script/Deploy.s.sol\":40,\"script/encode_header.py\":80,\"src/OGClubBox.sol\":497,\"src/OGClubFurniture.sol\":137,\"src/libraries/BlockHeader.sol\":70,\"src/mocks/MockOG.sol\":21,\"test/BlockHeader.t.sol\":132,\"test/BoxInvariant.t.sol\":278,\"test/Delivery.t.sol\":207,\"test/DeliveryEdges.t.sol\":473,\"test/Deployment.t.sol\":112,\"test/EdgeCases.t.sol\":483,\"test/FixedOdds.t.sol\":252,\"test/FurnitureInvariant.t.sol\":248,\"test/MinterLifecycleInvariant.t.sol\":456,\"test/MultiActorInvariant.t.sol\":561,\"test/OGClubFurniture.t.sol\":362,\"test/OpenGas.t.sol\":188,\"test/Opening.t.sol\":249,\"test/Payments.t.sol\":197,\"test/Rolls.t.sol\":128,\"test/SeasonNotice.t.sol\":219,\"test/Seasons.t.sol\":240,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":42,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/helpers/Adversaries.sol\":230,\"test/helpers/BoxTestBase.sol\":141,\"test/helpers/HeaderBuilder.sol\":48},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1394b31f8b577059b90ba6c7c4838aabe2437796428c74485e0069f508018b3b","verifiedTreeHash":"a46242694f59cd5d8c9bcc8e07016b877b140caa","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":10172,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.02s\nCompiler run successful!\n","passed":true},{"durationMs":17002,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/Seasons.t.sol:SeasonsTest\n[PASS] test_AllOwnerFunctionsProtected() (gas: 205698)\n[PASS] test_BuyRequiresTheBoxToBeAnAuthorizedMinter() (gas: 954897)\n[PASS] test_BuyWindowCountPauseAndClose() (gas: 820695)\n[PASS] test_CancelOnlyBeforeOpeningAndTerminal() (gas: 1021751)\n[PASS] test_CreateValidation() (gas: 2062629)\n[PASS] test_MaximumEntryCountAndIdZeroSupported() (gas: 7260903)\n[PASS] test_OverlappingSeasonsIndependentAndTermsUnchanged() (gas: 3022585)\n[PASS] test_OwnershipRequiresAcceptanceAndCanCancelPending() (gas: 370635)\n[PASS] test_UnknownSeasonCannotBeUsed() (gas: 213307)\n[PASS] test_ZeroNoticeSeasonOpensAtOnce() (gas: 1641374)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 19.98ms (20.94ms CPU time)\n\nRan 7 tests for test/SeasonNotice.t.sol:SeasonNoticeTest\n[PASS] testFuzz_NoticeBoundaryIsExactAtAnyTime(uint64,uint32) (runs: 256, μ: 887850, ~: 887737)\nLogs:\n  Bound result 8064\n  Bound result 530433\n\n[PASS] test_CloseAndCancelWorkAsBefore() (gas: 1842229)\n[PASS] test_CreateSeasonRevertsBeforeTheNoticeAndSucceedsExactlyAtIt() (gas: 796186)\n[PASS] test_NoticeIsExposedAndImmutable() (gas: 16537)\n[PASS] test_OtherParameterErrorsStillComeFirst() (gas: 160156)\n[PASS] test_OwnerCannotMintCappedPieceThroughANewSeasonBeforeItsNotice() (gas: 1692777)\n[PASS] test_SeasonTermsRemainImmutable() (gas: 651118)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 71.36ms (72.27ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependencies() (gas: 20193)\n[PASS] test_DeployExplicitParametersNoEnvironment() (gas: 23129433)\n[PASS] test_InvalidConstructorAddresses() (gas: 6021)\n[PASS] test_MockSupplySymbolDecimalsAndPublicMint() (gas: 92899)\n[PASS] test_SeasonNoticeIsImmutableAndAtMostThirtyDays() (gas: 17280)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 148.47ms (42.14ms CPU time)\n\nRan 11 tests for test/DeliveryEdges.t.sol:DeliveryEdgesTest\n[PASS] testFuzz_ActivationBoundaryIsExact(uint32) (runs: 256, μ: 666486, ~: 666486)\n[PASS] testFuzz_OnlyTheBuyerRedirectsButAnyoneDelivers(bytes32,bytes32) (runs: 200, μ: 1957422, ~: 1952167)\n[PASS] testFuzz_OpenWithAnyGasIsAtomicOrDeliversThePreview(uint32,uint8,bytes32) (runs: 200, μ: 1188864, ~: 1184872)\nLogs:\n  Bound result 1\n  Bound result 1350061\n\n[PASS] testFuzz_StoredRollSurvivesAnyDelayAndSeasonChanges(uint64,uint64,bytes32) (runs: 200, μ: 1806596, ~: 1809219)\nLogs:\n  Bound result 244\n  Bound result 6959\n\n[PASS] test_ExpiryOnlyAppliesToUnopenedPurchasesEvenWhenDeliveryIsPending() (gas: 2154639)\n[PASS] test_GasStarvedOpenRevertsUntouchedAndNeverParksAnHonestRoll() (gas: 2509570)\n[PASS] test_RedirectToNonReceiverContractsRevertsAndLeavesTheRollStored() (gas: 3149285)\n[PASS] test_SecondGrantWaitsEvenWhileOnlyUndeliveredRollsExist() (gas: 1358339)\n[PASS] test_SuccessfulOpenWritesNoStoredItemsAndFailureWritesExactlyTheRoll() (gas: 2100646)\n[PASS] test_SupplyCannotReturnToZeroSoTheDelayIsPermanent() (gas: 706197)\n[PASS] test_ZeroAmountMintsLeaveSupplyZeroButGrantsStillWait() (gas: 515070)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 427.25ms (1.37s CPU time)\n\nRan 7 tests for test/Delivery.t.sol:DeliveryTest\n[PASS] testFuzz_FirstDeliveryRejectionThenAnyoneCanRetryOnlyOnce(uint8) (runs: 256, μ: 1738997, ~: 1731857)\nLogs:\n  Bound result 1\n\n[PASS] test_DeliveryChecksUnknownUnopenedAndAlreadyDelivered() (gas: 723478)\n[PASS] test_ExpiredUnopenedPurchaseStillRecordsOnlyFallbacksWhenDeliveryFails() (gas: 1190615)\n[PASS] test_HostileReceiverCannotVetoTenDistinctRolledItems() (gas: 11642547)\n[PASS] test_OwnerCannotMintCappedPieceWithinSevenDaysOfProposal() (gas: 1100400)\n[PASS] test_RedirectedDeliveryRejectsReentryAndMarksDeliveredBeforeCallback() (gas: 2403758)\n[PASS] test_ZeroItemIdAndDuplicateStoredItemsDeliverExactlyOnce() (gas: 1098749)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 434.38ms (443.99ms CPU time)\n\nRan 11 tests for test/Opening.t.sol:OpeningTest\n[PASS] testFuzz_ExpiredAlwaysFallback(uint8,bytes32,uint16) (runs: 256, μ: 854499, ~: 838796)\nLogs:\n  Bound result 2\n  Bound result 259\n\n[PASS] testFuzz_PreviewMatchesOpenAndCaps(bytes32,uint8) (runs: 256, μ: 3584138, ~: 3556704)\nLogs:\n  Bound result 1\n\n[PASS] test_AuthenticatedHeaderMustHaveCorrectNumber() (gas: 346740)\n[PASS] test_BuilderFieldsDoNotAffectRoll() (gas: 2467444)\n[PASS] test_ExactExpiryBoundaryAndIgnoredHeader() (gas: 1979631)\n[PASS] test_MaturityWrongHeadersAndAlreadyOpened() (gas: 1437483)\n[PASS] test_OpenWhileClosedPausedAndPastSaleEnd() (gas: 1299249)\n[PASS] test_ReceiverReentrancySingleAndBatch() (gas: 5471350)\n[PASS] test_RejectedFirstDeliveryRecordsOpenedAndCapsAndCanRetry() (gas: 3292752)\n[PASS] test_RevokedMinterRecordsRollAndDeliversAfterExpiryAndDelayedRestoration() (gas: 2234768)\n[PASS] test_UnknownPurchase() (gas: 100405)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 436.21ms (608.10ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 595912, ~: 595712)\nLogs:\n  Bound result 6\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394533)\n[PASS] test_IdentityInterfacesMintAndSupply() (gas: 448761)\n[PASS] test_InvalidAddressesAndBatchLengths() (gas: 3967)\n[PASS] test_MetadataFreezesPermanently() (gas: 195226)\n[PASS] test_NoOwnerSeizureOrBurn() (gas: 418561)\n[PASS] test_OnlyTheFirstGrantIsImmediateEvenBeforeAnyMint() (gas: 545905)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 568742)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 456968)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535472)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340658)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 466.93ms (102.39ms CPU time)\n\nRan 5 tests for test/FixedOdds.t.sol:FixedOddsTest\n[PASS] testFuzz_OtherOpensOnlyDegradeSoldOutPicks(bytes32,uint8,uint8) (runs: 256, μ: 2398969, ~: 2386380)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] test_RejectedDeliveryCannotBeRetriedForABetterRoll() (gas: 2814306)\n[PASS] test_RejectedTenPackReservesRareAndCannotUpgradeAfterAnotherOpen() (gas: 4921840)\n[PASS] test_SellOutOnlyDegradesTheSoldOutPickAndNeverRemapsOthers() (gas: 3304872)\n[PASS] test_TenPackGuaranteeRerollsOnlyWhenItsOwnRareSellsOut() (gas: 3143804)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 511.25ms (527.76ms CPU time)\n\nRan 4 tests for test/OpenGas.t.sol:OpenGasTest\n[PASS] testFuzz_LowestSucceedingGasDeliversAndStoresNothing(uint8,bytes32) (runs: 256, μ: 7035276, ~: 6978376)\nLogs:\n  Bound result 4\n\n[PASS] test_GasConstantsArePublishedAndConsistent() (gas: 35237)\n[PASS] test_ReserveSavesTenDistinctItemsAtLowestDeliveryGas() (gas: 41867740)\n[PASS] test_ShortGasOpenRevertsInsteadOfRecordingDeliveryFailure() (gas: 2345352)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 523.88ms (564.73ms CPU time)\n\nRan 11 tests for test/Payments.t.sol:PaymentsTest\n[PASS] testFuzz_SplitConservesPayment(uint128,uint16,uint8) (runs: 256, μ: 753044, ~: 758990)\nLogs:\n  Bound result 9786\n  Bound result 9999\n  Bound result 10\n\n[PASS] test_ChangingVaultAndSameRecipient() (gas: 553182)\n[PASS] test_ExactSplitsAndEvents() (gas: 17898059)\n[PASS] test_FalseReturnTokenRejected() (gas: 1142491)\n[PASS] test_FeeOnEitherLegRevertsBothTransfers() (gas: 3035943)\n[PASS] test_InsufficientAllowanceRollsBackFirstLeg() (gas: 330254)\n[PASS] test_NoReturnTokenSupported() (gas: 1098451)\n[PASS] test_PriceMultiplicationOverflowHasCustomError() (gas: 464015)\n[PASS] test_TokenCallbackCannotReenter() (gas: 1700230)\n[PASS] test_VaultCanBuyAndOnlyPartsWithTheBurnShare() (gas: 1860132)\n[PASS] test_VaultCannotBeBoxOrZero() (gas: 57000)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 649.30ms (662.60ms CPU time)\n\nRan 9 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32617, ~: 32280)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 93663, ~: 74616)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 345650)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147761)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237560)\n[PASS] test_RealMainnetCancunHeader() (gas: 1230914)\n[PASS] test_RealMainnetPragueHeader() (gas: 1235417)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 1228140)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40758)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 689.38ms (831.22ms CPU time)\n\nRan 17 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_CreateSeasonRoundTripsTermsAndEntries(uint64,uint32,uint32,uint16,uint8,bytes32) (runs: 512, μ: 1565240, ~: 1248666)\nLogs:\n  Bound result 187330063197864239\n  Bound result 4294966320\n  Bound result 75\n  Bound result 376\n  Bound result 16\n\n[PASS] testFuzz_TenPackBoxNineIsRareExactlyWhenARareRemains(bytes32,uint8,uint8) (runs: 512, μ: 5723849, ~: 5724685)\nLogs:\n  Bound result 1\n  Bound result 3\n\n[PASS] test_BuyerCanOpenTheirOwnPurchase() (gas: 703643)\n[PASS] test_CapsAreTrackedPerSeasonNotPerItem() (gas: 4193676)\n[PASS] test_CloseIsAllowedBeforeOpeningAndCancelIsNotAfterClose() (gas: 536084)\n[PASS] test_ContractBuyerWithoutReceiverOpensAndCanRedirectDelivery() (gas: 2010989)\n[PASS] test_ExpiredOpenStillRespectsReentrancyAndOnlyMintsFallback() (gas: 575417)\n[PASS] test_ExpiryIsMeasuredFromTargetNotFromPurchase() (gas: 1047326)\n[PASS] test_InsufficientBalanceRevertsWithoutRecordingPurchase() (gas: 354460)\n[PASS] test_ListShapedTrailingFieldsAcceptedButListAtNumberOrMixHashRejected() (gas: 507928)\n[PASS] test_NumberFieldOfThirtyTwoBytesAndSingleByteAreCanonical() (gas: 513865)\n[PASS] test_OpeningOrderIsFreeButCapsStillHold() (gas: 2011153)\n[PASS] test_PauseDoesNotBlockOwnerActionsOrViews() (gas: 1724733)\n[PASS] test_PurchasesInTheSameBlockShareTheTargetAndHeader() (gas: 2552534)\n[PASS] test_SeasonLifecycleEventsAreEmittedExactly() (gas: 621062)\n[PASS] test_SingleEntrySeasonAlwaysMintsFallbackEvenInTenPack() (gas: 1194916)\n[PASS] test_TotalWeightMayEqualMaxTotalWeightButNotExceedIt() (gas: 1916019)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 689.32ms (1.30s CPU time)\n\nRan 6 tests for test/Rolls.t.sol:RollsTest\n[PASS] testFuzz_OddsOver20000Randao(bytes32) (runs: 1, μ: 737324, ~: 737324)\n[PASS] testFuzz_RandomizedCapsNeverExceeded(bytes32,uint8,uint8) (runs: 256, μ: 6220757, ~: 6222511)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] testFuzz_TenPackGuarantee(bytes32) (runs: 256, μ: 1656106, ~: 1658621)\n[PASS] test_CapsExhaustedWithinPackAndNeverRollAgain() (gas: 2396957)\n[PASS] test_GuaranteedRollUsesRelativeRareWeights() (gas: 13250051)\n[PASS] test_SeedDomainMatchesSpecification() (gas: 869753)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.85s (2.96s CPU time)\n\nRan 1 test for test/BoxInvariant.t.sol:BoxInvariantTest\n[PASS]\nBoxInvariantTest invariants:\n[PASS] invariant_CapsAndDeliveredSupplyPlusStoredItemsMatchPerSeasonMints\n[PASS] invariant_EachPurchaseOpenedOnceAndEveryOpenMatchedPreview\n[PASS] invariant_PaymentsAreConservedWithoutBoxCustody\n BoxInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+-------------------+-------+---------+----------╮\n| Contract   | Selector          | Calls | Reverts | Discards |\n+=============================================================+\n| BoxHandler | advance           | 1359  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | pause             | 1408  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | purchase          | 1424  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | retryDelivery     | 1344  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | reveal            | 1310  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | setRejectDelivery | 1347  | 0       | 0        |\n╰------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 10\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 217\n  Bound result 1\n  Bound result 253\n  Bound result 40\n  Bound result 2\n  Bound result 300\n  Bound result 230\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.47s (5.46s CPU time)\n\nRan 1 test for test/FurnitureInvariant.t.sol:FurnitureInvariantTest\n[PASS]\nFurnitureInvariantTest invariants:\n[PASS] invariant_BalancesAndSupplyMatchGhosts\n[PASS] invariant_FrozenMetadataNeverChangesAndRoyaltyIsBounded\n[PASS] invariant_OwnerNeverHoldsOrDestroysAnything\n FurnitureInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------+--------------------------+-------+---------+----------╮\n| Contract         | Selector                 | Calls | Reverts | Discards |\n+==========================================================================+\n| FurnitureHandler | mint                     | 1041  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1088  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1126  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1111  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1157  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1030  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1127  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 8\n  Bound result 14\n  Bound result 12\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 3\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 718\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 14\n  Bound result 14\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 3\n  Bound result 14\n  Bound result 0\n  Bound result 3\n  Bound result 10\n  Bound result 9\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 10\n  Bound result 9\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 13\n  Bound result 7\n  Bound result 8\n  Bound result 14\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 12\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.07s (6.06s CPU time)\n\nRan 1 test for test/MinterLifecycleInvariant.t.sol:MinterLifecycleInvariantTest\n[PASS]\nMinterLifecycleInvariantTest invariants:\n[PASS] invariant_BoxHoldsNothingAndPaymentsAreConserved\n[PASS] invariant_EachPurchaseDeliveredAtMostOnceAndOnlyAfterOpening\n[PASS] invariant_MintedPerItemEqualsDeliveredSupplyPlusStoredMinusDirectMints\n[PASS] invariant_MinterRolesMatchGhostsAndNeverActivateEarly\n MinterLifecycleInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------------+--------------------------+-------+---------+----------╮\n| Contract               | Selector                 | Calls | Reverts | Discards |\n+================================================================================+\n| MinterLifecycleHandler | activate                 | 536   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | advance                  | 523   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | buy                      | 555   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | cancel                   | 572   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | deliver                  | 1108  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | directMint               | 557   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | grant                    | 539   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | open                     | 1136  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | revoke                   | 515   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | setRejectDelivery        | 551   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | strangerCannotAdminister | 567   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | warp                     | 521   | 0       | 0        |\n╰------------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 303\n  Bound result 40\n  Bound result 2\n  Bound result 5\n  Bound result 10\n  Bound result 2\n  Bound result 4179\n  Bound result 3061\n  Bound result 1\n  Bound result 1\n  Bound result 64\n  Bound result 2\n  Bound result 64\n  Bound result 91\n  Bound result 296\n  Bound result 1\n  Bound result 300000\n  Bound result 15212\n  Bound result 2\n  Bound result 10\n  Bound result 3\n  Bound result 10\n  Bound result 183\n  Bound result 212\n  Bound result 1\n  Bound result 10\n  Bound result 4852\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.17s (6.16s CPU time)\n\nRan 1 test for test/MultiActorInvariant.t.sol:MultiActorInvariantTest\n[PASS]\nMultiActorInvariantTest invariants:\n[PASS] invariant_BoxNeverHoldsTheToken\n[PASS] invariant_EveryTokenPaidIsAccountedToBurnOrAVault\n[PASS] invariant_HandlerExercisedFailurePathsAndGuarantee\n[PASS] invariant_MintedNeverExceedsCapAndMatchesSupply\n[PASS] invariant_PurchasesOpenOnceAndFinishedStatesNeverReopen\n MultiActorInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| MultiActorHandler | advanceBlocks            | 673   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | buy                      | 1320  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | cancelSeason             | 627   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | closeSeason              | 560   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | createSeason             | 652   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | open                     | 1293  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setPaused                | 662   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setVault                 | 666   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | strangerCannotAdminister | 617   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | warp                     | 610   | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 57\n  Bound result 183316137134\n  Bound result 256\n  Bound result 6\n  Bound result 3586\n  Bound result 16\n  Bound result 732\n  Bound result 15\n  Bound result 6\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 16\n  Bound result 8\n  Bound result 93\n  Bound result 4\n  Bound result 8\n  Bound result 5616\n  Bound result 242\n  Bound result 4\n  Bound result 314\n  Bound result 242\n  Bound result 808160172423\n  Bound result 6309\n  Bound result 2\n  Bound result 833\n  Bound result 1\n  Bound result 8025\n  Bound result 32\n  Bound result 11956\n  Bound result 5\n  Bound result 2\n  Bound result 1014\n  Bound result 101\n  Bound result 277\n  Bound result 6\n  Bound result 8256\n  Bound result 18\n  Bound result 7\n  Bound result 7\n  Bound result 100\n  Bound result 129\n  Bound result 1\n  Bound result 3\n  Bound result 14\n  Bound result 9\n  Bound result 132\n  Bound result 67\n  Bound result 14837\n  Bound result 3\n  Bound result 5\n  Bound result 100\n  Bound result 14694\n  Bound result 277\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.85s (16.84s CPU time)\n\nRan 17 test suites in 16.85s (41.47s CPU time): 123 tests passed, 0 failed, 0 skipped (123 total tests)\n","passed":true},{"durationMs":79,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubBox.acceptOwnership()\",\"OGClubBox.buy(uint256,uint256)\",\"OGClubBox.cancelSeason(uint256)\",\"OGClubBox.closeSeason(uint256)\",\"OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,(uint256,uint8,uint256,uint256)[])\",\"OGClubBox.deliver(uint256)\",\"OGClubBox.deliverTo(uint256,address)\",\"OGClubBox.open(uint256,bytes)\",\"OGClubBox.renounceOwnership()\",\"OGClubBox.setPaused(bool)\",\"OGClubBox.setVault(address)\",\"OGClubBox.transferOwnership(address)\",\"OGClubFurniture.acceptOwnership()\",\"OGClubFurniture.activateMinter(address)\",\"OGClubFurniture.cancelMinter(address)\",\"OGClubFurniture.freezeMetadata()\",\"OGClubFurniture.grantMinter(address)\",\"OGClubFurniture.mintBatch(address,uint256[],uint256[])\",\"OGClubFurniture.renounceOwnership()\",\"OGClubFurniture.revokeMinter(address)\",\"OGClubFurniture.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"OGClubFurniture.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"OGClubFurniture.setApprovalForAll(address,bool)\",\"OGClubFurniture.setBaseURI(string)\",\"OGClubFurniture.setRoyalty(address,uint96)\",\"OGClubFurniture.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":148,\"README.md\":373,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":29,\"script/Deploy.s.sol\":40,\"script/encode_header.py\":80,\"src/OGClubBox.sol\":497,\"src/OGClubFurniture.sol\":137,\"src/libraries/BlockHeader.sol\":70,\"src/mocks/MockOG.sol\":21,\"test/BlockHeader.t.sol\":132,\"test/BoxInvariant.t.sol\":278,\"test/Delivery.t.sol\":207,\"test/DeliveryEdges.t.sol\":473,\"test/Deployment.t.sol\":112,\"test/EdgeCases.t.sol\":483,\"test/FixedOdds.t.sol\":252,\"test/FurnitureInvariant.t.sol\":248,\"test/MinterLifecycleInvariant.t.sol\":456,\"test/MultiActorInvariant.t.sol\":561,\"test/OGClubFurniture.t.sol\":362,\"test/OpenGas.t.sol\":188,\"test/Opening.t.sol\":249,\"test/Payments.t.sol\":197,\"test/Rolls.t.sol\":128,\"test/SeasonNotice.t.sol\":219,\"test/Seasons.t.sol\":240,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":42,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/helpers/Adversaries.sol\":230,\"test/helpers/BoxTestBase.sol\":141,\"test/helpers/HeaderBuilder.sol\":48},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2645,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/OGClubBox.sol:363: Reentrancy in OGClubBox._pay(address,uint256) (src/OGClubBox.sol#363-371):\n[medium/high] incorrect-equality at src/OGClubFurniture.sol:68: OGClubFurniture.activateMinter(address) (src/OGClubFurniture.sol#68-75) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/OGClubBox.sol:297: OGClubBox._deliver(uint256,address) (src/OGClubBox.sol#297-313) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/OGClubBox.sol:410: OGClubBox._picks(uint256,OGClubBox.Purchase,bytes32,OGClubBox.Entry[]) (src/OGClubBox.sol#410-428) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/OGClubBox.sol:252: Reentrancy in OGClubBox.open(uint256,bytes) (src/OGClubBox.sol#252-283):\n[medium/medium] uninitialized-local at src/OGClubBox.sol:418: OGClubBox._picks(uint256,OGClubBox.Purchase,bytes32,OGClubBox.Entry[]).fallbackIndex (src/OGClubBox.sol#418) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:445: OGClubBox._pick(OGClubBox.Entry[],uint256[],uint256,uint256,bool).totalWeight (src/OGClubBox.sol#445) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:461: OGClubBox._pickRare(OGClubBox.Entry[],uint256[],uint256).rareWeight (src/OGClubBox.sol#461) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:255: OGClubBox.open(uint256,bytes).prevRandao (src/OGClubBox.sol#255) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:170: OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,OGClubBox.Entry[]).totalWeight (src/OGClubBox.sol#170) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:462: OGClubBox._pickRare(OGClubBox.Entry[],uint256[],uint256).availableRareWeight (src/OGClubBox.sol#462) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubBox.sol:171: OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,OGClubBox.Entry[]).validFallback (src/OGClubBox.sol#171) is a local variable never initialized\n[low/medium] reentrancy-benign at src/OGClubBox.sol:252: Reentrancy in OGClubBox.open(uint256,bytes) (src/OGClubBox.sol#252-283):\n[low/medium] timestamp at src/OGClubBox.sol:226: OGClubBox.buy(uint256,uint256) (src/OGClubBox.sol#226-246) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubBox.sol:202: OGClubBox.cancelSeason(uint256) (src/OGClubBox.sol#202-209) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFurniture.sol:68: OGClubFurniture.activateMinter(address) (src/OGClubFurniture.sol#68-75) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubBox.sol:158: OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,OGClubBox.Entry[]) (src/OGClubBox.sol#158-191) uses timestamp for comparisons","passed":true},{"durationMs":566,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/OGClubBox.sol:233: Reentrancy: State change after external call\n[low] centralization-risk at src/OGClubBox.sol:16: Centralization Risk (13 places)\n[low] costly-loop at src/OGClubBox.sol:187: Costly operations inside loop (2 places)\n[low] large-numeric-literal at src/OGClubBox.sol:47: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/OGClubBox.sol:228: Literal Instead of Constant (13 places)\n[low] push-zero-opcode at src/OGClubBox.sol:2: PUSH0 Opcode (4 places)\n[low] require-revert-in-loop at src/OGClubBox.sol:172: Loop Contains `require`/`revert` (4 places)\n[low] unchecked-return at src/OGClubBox.sol:351: Unchecked Return\n[low] uninitialized-local-variable at src/OGClubBox.sol:172: Uninitialized Local Variable (8 places)\n[low] unspecific-solidity-pragma at src/OGClubBox.sol:2: Unspecific Solidity Pragma (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6e5641279e9781002aadf7128f44f7152748eaae42efc496dd61f1d6e4c0fd99","verifiedTreeHash":"b2e866bd2a62ad7b6c6ff75fa9b3b3b6b2bcae47","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":9098,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.99s\nCompiler run successful!\n","passed":true},{"durationMs":12588,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/Payments.t.sol:PaymentsTest\n[PASS] testFuzz_SplitConservesPayment(uint128,uint16,uint8) (runs: 256, μ: 753383, ~: 758990)\nLogs:\n  Bound result 9786\n  Bound result 9999\n  Bound result 10\n\n[PASS] test_ChangingVaultAndSameRecipient() (gas: 553182)\n[PASS] test_ExactSplitsAndEvents() (gas: 17898059)\n[PASS] test_FalseReturnTokenRejected() (gas: 1142491)\n[PASS] test_FeeOnEitherLegRevertsBothTransfers() (gas: 3035943)\n[PASS] test_InsufficientAllowanceRollsBackFirstLeg() (gas: 330254)\n[PASS] test_NoReturnTokenSupported() (gas: 1098451)\n[PASS] test_PriceMultiplicationOverflowHasCustomError() (gas: 464015)\n[PASS] test_TokenCallbackCannotReenter() (gas: 1700230)\n[PASS] test_VaultCanBuyAndOnlyPartsWithTheBurnShare() (gas: 1860132)\n[PASS] test_VaultCannotBeBoxOrZero() (gas: 57000)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 40.76ms (46.84ms CPU time)\n\nRan 7 tests for test/SeasonNotice.t.sol:SeasonNoticeTest\n[PASS] testFuzz_NoticeBoundaryIsExactAtAnyTime(uint64,uint32) (runs: 256, μ: 887853, ~: 887737)\nLogs:\n  Bound result 8064\n  Bound result 530433\n\n[PASS] test_CloseAndCancelWorkAsBefore() (gas: 1842229)\n[PASS] test_CreateSeasonRevertsBeforeTheNoticeAndSucceedsExactlyAtIt() (gas: 796186)\n[PASS] test_NoticeIsExposedAndImmutable() (gas: 16537)\n[PASS] test_OtherParameterErrorsStillComeFirst() (gas: 160156)\n[PASS] test_OwnerCannotMintCappedPieceThroughANewSeasonBeforeItsNotice() (gas: 1692777)\n[PASS] test_SeasonTermsRemainImmutable() (gas: 651118)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 112.19ms (37.33ms CPU time)\n\nRan 7 tests for test/Delivery.t.sol:DeliveryTest\n[PASS] testFuzz_FirstDeliveryRejectionThenAnyoneCanRetryOnlyOnce(uint8) (runs: 256, μ: 1738997, ~: 1731857)\nLogs:\n  Bound result 3\n\n[PASS] test_DeliveryChecksUnknownUnopenedAndAlreadyDelivered() (gas: 723478)\n[PASS] test_ExpiredUnopenedPurchaseStillRecordsOnlyFallbacksWhenDeliveryFails() (gas: 1190615)\n[PASS] test_HostileReceiverCannotVetoTenDistinctRolledItems() (gas: 11642547)\n[PASS] test_OwnerCannotMintCappedPieceWithinSevenDaysOfProposal() (gas: 1100400)\n[PASS] test_RedirectedDeliveryRejectsReentryAndMarksDeliveredBeforeCallback() (gas: 2403758)\n[PASS] test_ZeroItemIdAndDuplicateStoredItemsDeliverExactlyOnce() (gas: 1098749)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 143.46ms (150.54ms CPU time)\n\nRan 11 tests for test/Opening.t.sol:OpeningTest\n[PASS] testFuzz_ExpiredAlwaysFallback(uint8,bytes32,uint16) (runs: 256, μ: 854495, ~: 838796)\nLogs:\n  Bound result 4\n  Bound result 257\n\n[PASS] testFuzz_PreviewMatchesOpenAndCaps(bytes32,uint8) (runs: 256, μ: 3584057, ~: 3561176)\nLogs:\n  Bound result 10\n\n[PASS] test_AuthenticatedHeaderMustHaveCorrectNumber() (gas: 346740)\n[PASS] test_BuilderFieldsDoNotAffectRoll() (gas: 2467444)\n[PASS] test_ExactExpiryBoundaryAndIgnoredHeader() (gas: 1979631)\n[PASS] test_MaturityWrongHeadersAndAlreadyOpened() (gas: 1437483)\n[PASS] test_OpenWhileClosedPausedAndPastSaleEnd() (gas: 1299249)\n[PASS] test_ReceiverReentrancySingleAndBatch() (gas: 5471350)\n[PASS] test_RejectedFirstDeliveryRecordsOpenedAndCapsAndCanRetry() (gas: 3292752)\n[PASS] test_RevokedMinterRecordsRollAndDeliversAfterExpiryAndDelayedRestoration() (gas: 2234768)\n[PASS] test_UnknownPurchase() (gas: 100405)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 291.91ms (460.88ms CPU time)\n\nRan 10 tests for test/Seasons.t.sol:SeasonsTest\n[PASS] test_AllOwnerFunctionsProtected() (gas: 205698)\n[PASS] test_BuyRequiresTheBoxToBeAnAuthorizedMinter() (gas: 954897)\n[PASS] test_BuyWindowCountPauseAndClose() (gas: 820695)\n[PASS] test_CancelOnlyBeforeOpeningAndTerminal() (gas: 1021751)\n[PASS] test_CreateValidation() (gas: 2062629)\n[PASS] test_MaximumEntryCountAndIdZeroSupported() (gas: 7260903)\n[PASS] test_OverlappingSeasonsIndependentAndTermsUnchanged() (gas: 3022585)\n[PASS] test_OwnershipRequiresAcceptanceAndCanCancelPending() (gas: 370635)\n[PASS] test_UnknownSeasonCannotBeUsed() (gas: 213307)\n[PASS] test_ZeroNoticeSeasonOpensAtOnce() (gas: 1641374)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 348.96ms (10.83ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependencies() (gas: 20193)\n[PASS] test_DeployExplicitParametersNoEnvironment() (gas: 23129433)\n[PASS] test_InvalidConstructorAddresses() (gas: 6021)\n[PASS] test_MockSupplySymbolDecimalsAndPublicMint() (gas: 92899)\n[PASS] test_SeasonNoticeIsImmutableAndAtMostThirtyDays() (gas: 17280)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 363.16ms (42.35ms CPU time)\n\nRan 9 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32617, ~: 32274)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 93683, ~: 74616)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 345650)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147761)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237560)\n[PASS] test_RealMainnetCancunHeader() (gas: 1230914)\n[PASS] test_RealMainnetPragueHeader() (gas: 1235417)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 1228140)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40758)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 363.68ms (711.80ms CPU time)\n\nRan 4 tests for test/OpenGas.t.sol:OpenGasTest\n[PASS] testFuzz_LowestSucceedingGasDeliversAndStoresNothing(uint8,bytes32) (runs: 256, μ: 7043922, ~: 6984817)\nLogs:\n  Bound result 1\n\n[PASS] test_GasConstantsArePublishedAndConsistent() (gas: 35237)\n[PASS] test_ReserveSavesTenDistinctItemsAtLowestDeliveryGas() (gas: 41867740)\n[PASS] test_ShortGasOpenRevertsInsteadOfRecordingDeliveryFailure() (gas: 2345352)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 403.26ms (433.33ms CPU time)\n\nRan 12 tests for test/OwnerTrustBoundaries.t.sol:OwnerTrustBoundariesTest\n[PASS] testFuzz_ConstructorRejectsEveryNoticeAboveTheMaximum(uint256) (runs: 512, μ: 16550, ~: 16318)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913127055572\n\n[PASS] testFuzz_EveryAllowedNoticeEnforcesTheCreationAndSaleBoundary(uint256,uint64) (runs: 512, μ: 793946, ~: 795386)\nLogs:\n  Bound result 13613\n  Bound result 25\n\n[PASS] test_AgedDeploymentAndCancelledSeasonCannotLendTheirNoticeToANewSeason() (gas: 1648200)\n[PASS] test_BoxOwnershipHandoverPreservesExistingTermsAndRequiresFreshNotice() (gas: 825349)\n[PASS] test_GrantingSomeoneElseFirstMakesTheBoxWaitEvenAfterItsSeasonNotice() (gas: 1121089)\n[PASS] test_HandoverCannotResetBootstrapWhileSalesHaveNoDeliveredSupply() (gas: 1675757)\n[PASS] test_OneSecondNoticeBoundary() (gas: 788188)\n[PASS] test_PreBootstrapRevokeAndOwnershipChangeDoNotSpendTheFirstGrant() (gas: 356324)\n[PASS] test_RenouncingAfterRegrantStillAllowsPermissionlessActivationAndExactDelivery() (gas: 1515516)\n[PASS] test_ReproposalWithZeroSupplyRestartsDelayWithoutLosingStoredRoll() (gas: 1629281)\n[PASS] test_ThirtyDayNoticeBoundary() (gas: 788232)\n[PASS] test_ZeroNoticeBoundary() (gas: 717981)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 414.12ms (418.17ms CPU time)\n\nRan 5 tests for test/FixedOdds.t.sol:FixedOddsTest\n[PASS] testFuzz_OtherOpensOnlyDegradeSoldOutPicks(bytes32,uint8,uint8) (runs: 256, μ: 2398144, ~: 2386178)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] test_RejectedDeliveryCannotBeRetriedForABetterRoll() (gas: 2814306)\n[PASS] test_RejectedTenPackReservesRareAndCannotUpgradeAfterAnotherOpen() (gas: 4921840)\n[PASS] test_SellOutOnlyDegradesTheSoldOutPickAndNeverRemapsOthers() (gas: 3304872)\n[PASS] test_TenPackGuaranteeRerollsOnlyWhenItsOwnRareSellsOut() (gas: 3143804)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 484.95ms (491.28ms CPU time)\n\nRan 17 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_CreateSeasonRoundTripsTermsAndEntries(uint64,uint32,uint32,uint16,uint8,bytes32) (runs: 512, μ: 1563489, ~: 1248291)\nLogs:\n  Bound result 53102\n  Bound result 4487291\n  Bound result 275\n  Bound result 27\n  Bound result 5\n\n[PASS] testFuzz_TenPackBoxNineIsRareExactlyWhenARareRemains(bytes32,uint8,uint8) (runs: 512, μ: 5724350, ~: 5725418)\nLogs:\n  Bound result 1\n  Bound result 3\n\n[PASS] test_BuyerCanOpenTheirOwnPurchase() (gas: 703643)\n[PASS] test_CapsAreTrackedPerSeasonNotPerItem() (gas: 4193676)\n[PASS] test_CloseIsAllowedBeforeOpeningAndCancelIsNotAfterClose() (gas: 536084)\n[PASS] test_ContractBuyerWithoutReceiverOpensAndCanRedirectDelivery() (gas: 2010989)\n[PASS] test_ExpiredOpenStillRespectsReentrancyAndOnlyMintsFallback() (gas: 575417)\n[PASS] test_ExpiryIsMeasuredFromTargetNotFromPurchase() (gas: 1047326)\n[PASS] test_InsufficientBalanceRevertsWithoutRecordingPurchase() (gas: 354460)\n[PASS] test_ListShapedTrailingFieldsAcceptedButListAtNumberOrMixHashRejected() (gas: 507928)\n[PASS] test_NumberFieldOfThirtyTwoBytesAndSingleByteAreCanonical() (gas: 513865)\n[PASS] test_OpeningOrderIsFreeButCapsStillHold() (gas: 2011153)\n[PASS] test_PauseDoesNotBlockOwnerActionsOrViews() (gas: 1724733)\n[PASS] test_PurchasesInTheSameBlockShareTheTargetAndHeader() (gas: 2552534)\n[PASS] test_SeasonLifecycleEventsAreEmittedExactly() (gas: 621062)\n[PASS] test_SingleEntrySeasonAlwaysMintsFallbackEvenInTenPack() (gas: 1194916)\n[PASS] test_TotalWeightMayEqualMaxTotalWeightButNotExceedIt() (gas: 1916019)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 485.13ms (857.56ms CPU time)\n\nRan 11 tests for test/DeliveryEdges.t.sol:DeliveryEdgesTest\n[PASS] testFuzz_ActivationBoundaryIsExact(uint32) (runs: 256, μ: 666486, ~: 666486)\n[PASS] testFuzz_OnlyTheBuyerRedirectsButAnyoneDelivers(bytes32,bytes32) (runs: 200, μ: 1955934, ~: 1951421)\n[PASS] testFuzz_OpenWithAnyGasIsAtomicOrDeliversThePreview(uint32,uint8,bytes32) (runs: 200, μ: 1191124, ~: 1184872)\nLogs:\n  Bound result 1\n  Bound result 1350061\n\n[PASS] testFuzz_StoredRollSurvivesAnyDelayAndSeasonChanges(uint64,uint64,bytes32) (runs: 200, μ: 1807495, ~: 1809685)\nLogs:\n  Bound result 63548\n  Bound result 51\n\n[PASS] test_ExpiryOnlyAppliesToUnopenedPurchasesEvenWhenDeliveryIsPending() (gas: 2154639)\n[PASS] test_GasStarvedOpenRevertsUntouchedAndNeverParksAnHonestRoll() (gas: 2509570)\n[PASS] test_RedirectToNonReceiverContractsRevertsAndLeavesTheRollStored() (gas: 3149285)\n[PASS] test_SecondGrantWaitsEvenWhileOnlyUndeliveredRollsExist() (gas: 1358339)\n[PASS] test_SuccessfulOpenWritesNoStoredItemsAndFailureWritesExactlyTheRoll() (gas: 2100646)\n[PASS] test_SupplyCannotReturnToZeroSoTheDelayIsPermanent() (gas: 706197)\n[PASS] test_ZeroAmountMintsLeaveSupplyZeroButGrantsStillWait() (gas: 515070)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 485.24ms (1.33s CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 595909, ~: 595712)\nLogs:\n  Bound result 33\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394533)\n[PASS] test_IdentityInterfacesMintAndSupply() (gas: 448761)\n[PASS] test_InvalidAddressesAndBatchLengths() (gas: 3967)\n[PASS] test_MetadataFreezesPermanently() (gas: 195226)\n[PASS] test_NoOwnerSeizureOrBurn() (gas: 418561)\n[PASS] test_OnlyTheFirstGrantIsImmediateEvenBeforeAnyMint() (gas: 545905)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 568742)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 456968)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535472)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340658)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 485.31ms (539.10ms CPU time)\n\nRan 6 tests for test/Rolls.t.sol:RollsTest\n[PASS] testFuzz_OddsOver20000Randao(bytes32) (runs: 1, μ: 737324, ~: 737324)\n[PASS] testFuzz_RandomizedCapsNeverExceeded(bytes32,uint8,uint8) (runs: 256, μ: 6220995, ~: 6222666)\nLogs:\n  Bound result 3\n  Bound result 1\n\n[PASS] testFuzz_TenPackGuarantee(bytes32) (runs: 256, μ: 1655782, ~: 1658621)\n[PASS] test_CapsExhaustedWithinPackAndNeverRollAgain() (gas: 2396957)\n[PASS] test_GuaranteedRollUsesRelativeRareWeights() (gas: 13250051)\n[PASS] test_SeedDomainMatchesSpecification() (gas: 869753)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.18s (1.85s CPU time)\n\nRan 1 test for test/SeasonNoticeInvariant.t.sol:SeasonNoticeInvariantTest\n[PASS]\nSeasonNoticeInvariantTest invariants:\n[PASS] invariant_EveryPaymentAndReservedItemIsAccountedFor\n[PASS] invariant_NoticeTermsAndBootstrapSurviveEveryOwnerAction\n SeasonNoticeInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| SeasonNoticeHandler | activateBox | 984   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | advanceTime | 994   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | announce    | 1023  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | buy         | 1059  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | deliver     | 1045  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | handover    | 1018  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | open        | 1037  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | proposeBox  | 1028  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | revokeBox   | 986   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| SeasonNoticeHandler | stopSeason  | 1066  | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 3333\n  Bound result 1\n  Bound result 604800\n  Bound result 101\n  Bound result 3333\n  Bound result 1\n  Bound result 10\n  Bound result 604800\n  Bound result 10\n  Bound result 4\n  Bound result 2285400\n  Bound result 150000\n  Bound result 11657\n  Bound result 3472\n  Bound result 2541\n  Bound result 2\n  Bound result 99\n  Bound result 2209600\n  Bound result 13\n  Bound result 4\n  Bound result 123456\n  Bound result 1001\n  Bound result 4527\n  Bound result 5\n  Bound result 3\n  Bound result 762\n  Bound result 14665\n  Bound result 1\n  Bound result 12983\n  Bound result 1001\n  Bound result 8838\n  Bound result 7\n  Bound result 32\n  Bound result 28978\n  Bound result 10001\n  Bound result 999188781046\n  Bound result 8561\n  Bound result 1\n  Bound result 9175\n  Bound result 2233\n  Bound result 1001\n  Bound result 9999\n  Bound result 10\n  Bound result 300000\n  Bound result 1001\n  Bound result 5000\n  Bound result 3\n  Bound result 182526\n  Bound result 96562894838\n  Bound result 2065\n  Bound result 5\n  Bound result 11\n  Bound result 1001\n  Bound result 2678\n  Bound result 10\n  Bound result 1366224\n  Bound result 1\n  Bound result 3811\n  Bound result 12000\n  Bound result 13\n  Bound result 1001\n  Bound result 101\n  Bound result 3\n  Bound result 238\n  Bound result 883742\n  Bound result 201800232026\n  Bound result 3872\n  Bound result 6\n  Bound result 5\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.09s (3.09s CPU time)\n\nRan 1 test for test/BoxInvariant.t.sol:BoxInvariantTest\n[PASS]\nBoxInvariantTest invariants:\n[PASS] invariant_CapsAndDeliveredSupplyPlusStoredItemsMatchPerSeasonMints\n[PASS] invariant_EachPurchaseOpenedOnceAndEveryOpenMatchedPreview\n[PASS] invariant_PaymentsAreConservedWithoutBoxCustody\n BoxInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+-------------------+-------+---------+----------╮\n| Contract   | Selector          | Calls | Reverts | Discards |\n+=============================================================+\n| BoxHandler | advance           | 1359  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | pause             | 1408  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | purchase          | 1424  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | retryDelivery     | 1344  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | reveal            | 1310  | 0       | 0        |\n|------------+-------------------+-------+---------+----------|\n| BoxHandler | setRejectDelivery | 1347  | 0       | 0        |\n╰------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 10\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 217\n  Bound result 1\n  Bound result 186\n  Bound result 40\n  Bound result 2\n  Bound result 300\n  Bound result 293\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.28s (4.27s CPU time)\n\nRan 1 test for test/MinterLifecycleInvariant.t.sol:MinterLifecycleInvariantTest\n[PASS]\nMinterLifecycleInvariantTest invariants:\n[PASS] invariant_BoxHoldsNothingAndPaymentsAreConserved\n[PASS] invariant_EachPurchaseDeliveredAtMostOnceAndOnlyAfterOpening\n[PASS] invariant_MintedPerItemEqualsDeliveredSupplyPlusStoredMinusDirectMints\n[PASS] invariant_MinterRolesMatchGhostsAndNeverActivateEarly\n MinterLifecycleInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------------+--------------------------+-------+---------+----------╮\n| Contract               | Selector                 | Calls | Reverts | Discards |\n+================================================================================+\n| MinterLifecycleHandler | activate                 | 536   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | advance                  | 523   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | buy                      | 555   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | cancel                   | 572   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | deliver                  | 1108  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | directMint               | 557   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | grant                    | 539   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | open                     | 1136  | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | revoke                   | 515   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | setRejectDelivery        | 551   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | strangerCannotAdminister | 567   | 0       | 0        |\n|------------------------+--------------------------+-------+---------+----------|\n| MinterLifecycleHandler | warp                     | 521   | 0       | 0        |\n╰------------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 1234\n  Bound result 40\n  Bound result 2\n  Bound result 5\n  Bound result 10\n  Bound result 2\n  Bound result 4179\n  Bound result 3061\n  Bound result 1\n  Bound result 1\n  Bound result 172800\n  Bound result 2\n  Bound result 323200\n  Bound result 91\n  Bound result 296\n  Bound result 1\n  Bound result 172800\n  Bound result 15212\n  Bound result 2\n  Bound result 10\n  Bound result 3\n  Bound result 10\n  Bound result 183\n  Bound result 212\n  Bound result 1\n  Bound result 10\n  Bound result 4895\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.40s (4.39s CPU time)\n\nRan 1 test for test/FurnitureInvariant.t.sol:FurnitureInvariantTest\n[PASS]\nFurnitureInvariantTest invariants:\n[PASS] invariant_BalancesAndSupplyMatchGhosts\n[PASS] invariant_FrozenMetadataNeverChangesAndRoyaltyIsBounded\n[PASS] invariant_OwnerNeverHoldsOrDestroysAnything\n FurnitureInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭------------------+--------------------------+-------+---------+----------╮\n| Contract         | Selector                 | Calls | Reverts | Discards |\n+==========================================================================+\n| FurnitureHandler | mint                     | 1041  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1088  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1126  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1111  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1157  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1030  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1127  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 8\n  Bound result 14\n  Bound result 12\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 3\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1139\n  Bound result 0\n  Bound result 1\n  Bound result 14\n  Bound result 14\n  Bound result 3\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 648\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 5\n  Bound result 2\n  Bound result 0\n  Bound result 10\n  Bound result 4\n  Bound result 3\n  Bound result 14\n  Bound result 0\n  Bound result 992\n  Bound result 3\n  Bound result 18\n  Bound result 18\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 13\n  Bound result 13\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 13\n  Bound result 14\n  Bound result 8\n  Bound result 14\n  Bound result 5\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 15\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.73s (4.73s CPU time)\n\nRan 1 test for test/MultiActorInvariant.t.sol:MultiActorInvariantTest\n[PASS]\nMultiActorInvariantTest invariants:\n[PASS] invariant_BoxNeverHoldsTheToken\n[PASS] invariant_EveryTokenPaidIsAccountedToBurnOrAVault\n[PASS] invariant_HandlerExercisedFailurePathsAndGuarantee\n[PASS] invariant_MintedNeverExceedsCapAndMatchesSupply\n[PASS] invariant_PurchasesOpenOnceAndFinishedStatesNeverReopen\n MultiActorInvariantTest invariants (runs: 96, calls: 7680, reverts: 0)\n\n╭-------------------+--------------------------+-------+---------+----------╮\n| Contract          | Selector                 | Calls | Reverts | Discards |\n+===========================================================================+\n| MultiActorHandler | advanceBlocks            | 673   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | buy                      | 1320  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | cancelSeason             | 627   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | closeSeason              | 560   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | createSeason             | 652   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | open                     | 1293  | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setPaused                | 662   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | setVault                 | 666   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | strangerCannotAdminister | 617   | 0       | 0        |\n|-------------------+--------------------------+-------+---------+----------|\n| MultiActorHandler | warp                     | 610   | 0       | 0        |\n╰-------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 10\n  Bound result 57\n  Bound result 183316137134\n  Bound result 256\n  Bound result 6\n  Bound result 3586\n  Bound result 16\n  Bound result 732\n  Bound result 15\n  Bound result 6\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 16\n  Bound result 8\n  Bound result 93\n  Bound result 4\n  Bound result 8\n  Bound result 1587\n  Bound result 242\n  Bound result 4\n  Bound result 2332\n  Bound result 242\n  Bound result 808160172423\n  Bound result 6309\n  Bound result 2\n  Bound result 833\n  Bound result 1\n  Bound result 126\n  Bound result 32\n  Bound result 974284973766\n  Bound result 5\n  Bound result 2\n  Bound result 808\n  Bound result 4888\n  Bound result 250\n  Bound result 6\n  Bound result 8275\n  Bound result 18\n  Bound result 11\n  Bound result 7\n  Bound result 100\n  Bound result 129\n  Bound result 1\n  Bound result 3\n  Bound result 14\n  Bound result 9\n  Bound result 132\n  Bound result 67\n  Bound result 14438\n  Bound result 3\n  Bound result 5\n  Bound result 100\n  Bound result 519\n  Bound result 89\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.49s (12.48s CPU time)\n\nRan 19 test suites in 12.49s (34.58s CPU time): 136 tests passed, 0 failed, 0 skipped (136 total tests)\n","passed":true},{"durationMs":74,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubBox.acceptOwnership()\",\"OGClubBox.buy(uint256,uint256)\",\"OGClubBox.cancelSeason(uint256)\",\"OGClubBox.closeSeason(uint256)\",\"OGClubBox.createSeason(uint256,uint256,uint256,uint256,uint256,(uint256,uint8,uint256,uint256)[])\",\"OGClubBox.deliver(uint256)\",\"OGClubBox.deliverTo(uint256,address)\",\"OGClubBox.open(uint256,bytes)\",\"OGClubBox.renounceOwnership()\",\"OGClubBox.setPaused(bool)\",\"OGClubBox.setVault(address)\",\"OGClubBox.transferOwnership(address)\",\"OGClubFurniture.acceptOwnership()\",\"OGClubFurniture.activateMinter(address)\",\"OGClubFurniture.cancelMinter(address)\",\"OGClubFurniture.freezeMetadata()\",\"OGClubFurniture.grantMinter(address)\",\"OGClubFurniture.mintBatch(address,uint256[],uint256[])\",\"OGClubFurniture.renounceOwnership()\",\"OGClubFurniture.revokeMinter(address)\",\"OGClubFurniture.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"OGClubFurniture.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"OGClubFurniture.setApprovalForAll(address,bool)\",\"OGClubFurniture.setBaseURI(string)\",\"OGClubFurniture.setRoyalty(address,uint96)\",\"OGClubFurniture.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":148,\"README.md\":373,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":29,\"script/Deploy.s.sol\":40,\"script/encode_header.py\":80,\"src/OGClubBox.sol\":497,\"src/OGClubFurniture.sol\":137,\"src/libraries/BlockHeader.sol\":70,\"src/mocks/MockOG.sol\":21,\"test/BlockHeader.t.sol\":132,\"test/BoxInvariant.t.sol\":278,\"test/Delivery.t.sol\":207,\"test/DeliveryEdges.t.sol\":473,\"test/Deployment.t.sol\":112,\"test/EdgeCases.t.sol\":483,\"test/FixedOdds.t.sol\":252,\"test/FurnitureInvariant.t.sol\":248,\"test/MinterLifecycleInvariant.t.sol\":456,\"test/MultiActorInvariant.t.sol\":561,\"test/OGClubFurniture.t.sol\":362,\"test/OpenGas.t.sol\":188,\"test/Opening.t.sol\":249,\"test/OwnerTrustBoundaries.t.sol\":332,\"test/Payments.t.sol\":197,\"test/Rolls.t.sol\":128,\"test/SeasonNotice.t.sol\":219,\"test/SeasonNoticeInvariant.t.sol\":432,\"test/Seasons.t.sol\":240,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":42,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/helpers/Adversaries.sol\":230,\"test/helpers/BoxTestBase.sol\":141,\"test/helpers/HeaderBuilder.sol\":48},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e17b261b937cb8392569e6127bedfc95a47fb0dc6dee84684fdc063b422c1f97","verifiedTreeHash":"d2d75a8f2c4dab611a83515f9bb7789124eb4a90","verifierVersion":"0.1.0+8fbf00a5"}]}