{"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":"d7f17b1e-b76e-4e29-a106-5689ed58e8c8","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c0cff3dace8ee6e51ff97bf07f935c58e85b6a7ef4c909c97f1728660ee9c1bb","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":"e4aff7fee86b5c93a380b2408a919b0ae2c3fc0f939e01bf39d01e3d396a10c4","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":"5de34fc0f14cd2be17d3dd1f01029033004175b48d30203e698bb5a868ff0349","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":"1263bd21956d5acc68b62a831339fca68a3f2849dbbe896e7b0ae702cd8f27e8","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":"ebe0167cffaaab2365154a1bd97838ac9a991fd83d8bfa4d361a63308b648958","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":"20426e7333ebcf7cc18ad8f36fab4f9f30f2875d110181caebed92b5af032528","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":"b3abe0ff14f50952ff5bfddfecbfa8c66fd4cbc6f45014be32814e23a5538434","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":"4de2afb138c61f745bc5e6550d2167199a5231bdb1e82081517a51fc8b26876d","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"87d5eb7e85189d205014c3356eb5df9b8236695557a891a85dbb1168fe36b884","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 clubs repo (at 292e20dec8afa05dc98367c8a9f47bd39a4b66a5). Change only OGClubClubs (not yet on mainnet, so no migration): minting by Swarm Pepe, room levels, wall placement, one of each design per club, and the review's low findings. Keep everything else as it is (the raffle's first grantMinter/grantSpender stays a documented owner step; MockOG is Sepolia-only: say so in README and launch.json). Update tests, deploy scripts, launch.json, README; forge build, test and fmt --check must pass.\n \n## 0. One club per Swarm Pepe\n- Constructor gains immutable IERC721 pepes and IDelegateRegistry delegates (delegate.xyz v2, 0x00000000000000447e69651d841bD8D104Bed493; may be address(0) to switch delegation off). Reject pepes == 0.\n- Replace mintClub() and mintClubTo(to) with mintClub(uint256 pepeId): caller must be pepes.ownerOf(pepeId), or a wallet that holder delegated through delegates.checkDelegateForERC721(caller, holder, pepes, pepeId, 0) (else NotPepeHolder). Payment, split, receipt checks, saleOpen as now; caller pays and gets the club.\n- The club's token id IS the pepe id. Each pepe mints at most one club, ever (AlreadyMinted), even after the pepe or the club is sold. No sequential ids; clubsMinted(pepeId) view; ClubMinted also carries pepeId.\n \n## 1. Room levels\n- Every club has a level 1..4 (minted at 1). Room size = 8 + 2*level: 10x10, 12x12, 14x14, 16x16. The room grows to the front: (0,0) stays the back corner, so the door and every placed piece keep their place.\n- Tiles: one uint256 bitmap per club, bit y*16 + x (16x16 max). Floor rules as now but bounded by the club's size: fits inside size x size, not on the door tiles (0,4) and (1,4), no overlap.\n- upgradeClub(uint256 clubId): only the holder or an approved operator; nonReentrant; reverts at level 4 (MaxLevel). Caller pays the next level's price exactly like minting (half burned, rest to vault, same receipt checks). Prices immutable from the constructor (uint256[3] upgradePrices, each > 0): level 2, 3, 4 (mainnet 200_000e18, 400_000e18, 800_000e18). Emit ClubUpgraded(clubId, newLevel, payer, burned, toVault) and MetadataUpdate(clubId).\n- Views: levelOf(clubId), sizeOf(clubId), upgradePrice(currentLevel) (0 at max).\n \n## 2. Wall pieces\n- setFootprint(id, w, h, bool wall): a wall piece has width w (1..4) along a wall and h must be 1. Same lock rule (fixed once any club placed that id).\n- Two back walls: side 0 runs along y = 0 (positions x = 0..size-1), side 1 along x = 0 (positions y = 0..size-1). Side 1 position 4 is the door: never covered.\n- Placing a wall piece uses the same transfer and data abi.encode(clubId, x, y, rot), read as: rot = side (0 or 1), x = start position along the wall, y must be 0. It must fit the wall at the club's current size and not overlap another wall piece on that side. One uint32 bitmap per side per club.\n- Piece gains bool wall: Piece{furnitureId, x, y, rot, wall}. FurniturePlaced also carries wall.\n- footprintOf(id) returns (w, h, set, locked, wall).\n \n## 3. One of each design\nA club can hold at most one permanent piece of each furniture id (floor or wall). A second one reverts AlreadyHasDesign. hasDesign(clubId, id) view.\n \n## 4. Review findings\n- Constructor rejects vault == BURN_ADDRESS, vault == token and vault == furniture.\n- MAX_PIECES = 285 (254 floor + 31 wall at level 4), so ClubFull is reachable.\n- Malformed placement data reverts BadPlacementData.\n- Mainnet script: check FARM_VAULT's token() equals OG_TOKEN before deploying; deploy from DEPLOYER_KEY and pass OWNER (may be a Safe) as owner, so a Safe never has to broadcast.\n \n## Tests\n- Pepe minting: holder mints club #pepeId; non-holder reverts; delegated hot wallet mints (and an undelegated one can't); registry at address(0) disables delegation; second mint for the same pepe reverts, also after the pepe is transferred; club id equals pepe id; a pepe that doesn't exist reverts.\n- Levels: mint at 1; upgrades to 4 with exact splits and receipts; only holder/approved; level 5 reverts; price views; pieces keep their tiles after upgrading; a piece that fits only after upgrading (x or y 10..15) reverts before and works after; door rules at every size; MetadataUpdate.\n- Walls: both sides, widths 1..4, the door position on side 1 (3..4 or 4..5 reverts, 5 works), past the end at each size and after upgrading, overlap on a side, y != 0 or rot > 1 reverts, floor and wall bitmaps independent, footprint lock with the wall flag.\n- One of each: second copy of the same id reverts in floor and wall, other clubs unaffected, still holds after a club transfer.\n- Review fixes: each constructor rejection, ClubFull at 285 (a level-4 club filled with 285 distinct 1-wide ids), BadPlacementData, the script's vault check.\n- Fuzz: random levels, sides, positions, sizes and rotations never overlap, never cover the door, always fit, and one of each always holds; rejected placements change nothing.\n- Invariants: every club id is a pepe that minted once; the contract's $OG balance is always 0; pieces equal furniture held; burned + toVault equal all mint and upgrade payments.\n \n## Deploy\nSepolia script as now plus a mock Swarm Pepe ERC-721 (public mint), the real delegate.xyz v2 registry address, upgrade prices 200_000e18, 400_000e18, 800_000e18 and a few wall footprints from the JSON (add a wall flag column). Mainnet script with SWARM_PEPES, DELEGATE_REGISTRY and UPGRADE_PRICES from env. Print addresses, constructor args.","parentJobId":null,"planHash":"71ca61b53937f904c2031274c7108642a48899c0d9a69e5efcd74f1c6d8776ca","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d7f17b1e-b76e-4e29-a106-5689ed58e8c8","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2373-continue-delivered-og-club"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52209","feedbackHash":"d17707f695561233287abd07563d324e1b40954b5fb6005768f3f66e35f121be","nodeKey":"adapt_contract_project","submissionHash":"c0cff3dace8ee6e51ff97bf07f935c58e85b6a7ef4c909c97f1728660ee9c1bb","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52628","feedbackHash":"1a977213da9da2c2ad89af4c2b3bd52dbba95cf1f8089d8dcefc82b9bb6e130e","nodeKey":"audit_economics","submissionHash":"e4aff7fee86b5c93a380b2408a919b0ae2c3fc0f939e01bf39d01e3d396a10c4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51401","feedbackHash":"6cdec92bf1284c92d56acf62c1ad3668b5a9731a58976aaa4c6360123cfba889","nodeKey":"audit_flow","submissionHash":"5de34fc0f14cd2be17d3dd1f01029033004175b48d30203e698bb5a868ff0349","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52268","feedbackHash":"8eac5fff612c136da495970492996870ecdab21322f6a07a673126c04ec7553f","nodeKey":"audit_imported_code","submissionHash":"1263bd21956d5acc68b62a831339fca68a3f2849dbbe896e7b0ae702cd8f27e8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50961","feedbackHash":"b016c6c0b7874f7eeabc583b172e4b1b558ff8343fc8198aa1bd283611024809","nodeKey":"audit_judge","submissionHash":"ebe0167cffaaab2365154a1bd97838ac9a991fd83d8bfa4d361a63308b648958","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52272","feedbackHash":"27d2132ceb28fd226119a054223a9d5ba9c1b3a7a1ecb7b1761cccc67f19b3b3","nodeKey":"audit_math","submissionHash":"20426e7333ebcf7cc18ad8f36fab4f9f30f2875d110181caebed92b5af032528","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52163","feedbackHash":"b5493cf9cfed664497e2d9a3db870a0034b9472ca4e065b28d0be83f36f5e16c","nodeKey":"audit_permissions","submissionHash":"b3abe0ff14f50952ff5bfddfecbfa8c66fd4cbc6f45014be32814e23a5538434","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51753","feedbackHash":"7eb5a3856dac591e3916f10874bffa3e8866977f4bb7f829a4837aff53ec15b7","nodeKey":"manifest","submissionHash":"4de2afb138c61f745bc5e6550d2167199a5231bdb1e82081517a51fc8b26876d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52212","feedbackHash":"a3682255944087853730a80a0fa41a1d3eec4f9bcfe7606e65fe9c61a7d1acf6","nodeKey":"write_foundry_tests","submissionHash":"87d5eb7e85189d205014c3356eb5df9b8236695557a891a85dbb1168fe36b884","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5568a1d589dcd111e18f1513a6330ad800e1524ade244cbb6e4be48e8be49683","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ff35db055462d2ad","findings":[{"citation":"resolved","description":"The constructor only rejects vault_ == address(this). With vault_ == BURN_ADDRESS (0x...dEaD) deployment succeeds, but _mintClub sends both halves of the price to the same address and then checks that BURN_ADDRESS gained exactly `burned` (line 130): it gained `price`, so every mint reverts with UnexpectedTokenDebit. Because `vault` is immutable the contract is permanently unusable and must be redeployed. The README (lines 96-97) acknowledges the mint reverts but the constructor still allows the configuration; the misconfiguration should be rejected at deployment, not discovered at the first purchase. Also fixes the task's section 4 item.","line":101,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, 0x000000000000000000000000000000000000dEaD, 10, furniture, owner, royalty); setSaleOpen(true); alice approves 10 and calls mintClub(). Expected: constructor reverts. Actual: constructor succeeds; mintClub reverts UnexpectedTokenDebit for every caller forever, totalSupply stays 0. Verified by test_VaultEqualsBurnAddressDeploysButIsBricked in test/scratch/ReviewRepro.t.sol.","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == BURN_ADDRESS, which deploys a club contract that can never mint"},{"citation":"resolved","description":"Neither the payment token nor the furniture contract is rejected as `vault`. Both are contracts with no ERC-20 withdrawal path (OGClubFurniture has none; an OZ ERC20 accepts transfers to itself and cannot move them). Every mint then succeeds, passes the receipt checks (the recipient's balance does rise by toVault) and sends `price - price/2` into a contract from which it can never be recovered. No existing test covers these two aliases; only BURN_ADDRESS and a payer-as-vault are tested (test/OGClubClubs.t.sol:289).","line":101,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, address(token), 10, furniture, owner, royalty); setSaleOpen(true); alice approves 10 and mints. Expected: constructor reverts. Actual: club #1 is minted and token.balanceOf(address(token)) == 5 with no function able to move it. Same with vault = address(furniture): token.balanceOf(furniture) == 5. Verified by test_VaultEqualsTokenStrandsRevenueInTokenContract and test_VaultEqualsFurnitureStrandsRevenue in test/scratch/ReviewRepro.t.sol.","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == token or vault == furniture, stranding half of every club payment"},{"citation":"resolved","description":"DeployClubsMainnet takes OG_TOKEN and FARM_VAULT as independent environment inputs and never verifies that the vault was built for that token. OGClubFarmVault only budgets and pays seasons in its own immutable `token`; any other ERC-20 it receives is unreachable (no sweep). If FARM_VAULT points at a vault of a different token (a stale testnet vault, a vault for another asset, a typo), deployment succeeds, the sale can be opened, and the vault half of every purchase is OG locked in a contract that can never distribute it. The script should read IOGClubFarmVault(FARM_VAULT).token() and revert on mismatch before broadcasting (this is an off-chain script, so the dependency call is allowed there).","line":127,"path":"script/DeployClubs.s.sol","reproduction":"Deploy OGClubFarmVault(otherToken). Run DeployClubsMainnet.deploy with token = OG, vault = that vault, chainId 1. Expected: the script reverts before deploying. Actual: OGClubClubs deploys; after setSaleOpen(true) and one mint of price 10, OG.balanceOf(vault) == 5 and vault.proposeSeason(root, 1) reverts BudgetExceeded because its budget is measured in otherToken. Verified by test_MainnetScriptAcceptsVaultOfAnotherToken in test/scratch/ReviewRepro.t.sol.","severity":"low","snippet":"        clubs = new OGClubClubs(","title":"Mainnet script does not check FARM_VAULT.token() == OG_TOKEN; a mismatched vault strands club revenue"},{"citation":"resolved","description":"A wrong-length `data` is rejected with a bare revert(). OpenZeppelin's ERC1155._checkOnERC1155Received treats a receiver revert with empty reason as 'not a receiver' and re-raises ERC1155InvalidReceiver(to). The furniture holder therefore sees an error claiming the clubs contract cannot receive ERC-1155 tokens, which is indistinguishable from a genuinely broken receiver and gives wallets and front ends nothing to act on. Every other rejection in the hook uses a named custom error; this one should too (the task names it BadPlacementData). Note the same OZ wrapping does not affect custom errors: those are bubbled up unchanged.","line":155,"path":"src/OGClubClubs.sol","reproduction":"Alice owns club 1 and one unit of furniture id 1 with footprint 1x1. She calls furniture.safeTransferFrom(alice, clubs, 1, 1, data) with data = abi.encode(1, uint8(2), uint8(2), uint8(0)) followed by one extra byte (129 bytes). Expected: revert with a placement-specific custom error. Actual: revert data is 36 bytes, selector ERC1155InvalidReceiver(address), argument = the clubs address. Verified by test_MalformedPlacementDataRevertsWithoutReason in test/scratch/ReviewRepro.t.sol.","severity":"low","snippet":"        if (data.length != 128) revert();","title":"Malformed placement data reverts with empty data and surfaces to the caller as ERC1155InvalidReceiver(clubs)"},{"citation":"resolved","description":"Both scripts use the owner as the broadcaster for the constructor deployment and for the owner-only setFootprint/setSaleOpen calls. The README (lines 200-204) states OWNER on mainnet is expected to be a Safe. A Safe cannot sign a forge broadcast, so the mainnet script as written cannot be executed for its documented configuration, and an operator is pushed toward using an EOA as owner just to deploy. The deployment itself does not need the owner's key: the constructor takes `initialOwner` as an argument. Deploy from a separate DEPLOYER key, pass OWNER into the constructor, and leave footprint/sale configuration to the Safe (or run it only when OWNER is an EOA).","line":126,"path":"script/DeployClubs.s.sol","reproduction":"OWNER=<Safe address> forge script script/DeployClubs.s.sol:DeployClubsMainnet --broadcast. Expected: OGClubClubs deployed with owner == Safe. Actual: the broadcast requires a signer for the Safe address, which does not exist; the script cannot be run as documented. The existing test (test/ClubsDeployment.t.sol:57) only exercises the in-process path where vm.startBroadcast(owner) needs no key.","severity":"low","snippet":"        vm.startBroadcast(config.owner);","title":"Mainnet script broadcasts from OWNER, so a Safe owner cannot run it"},{"citation":"resolved","description":"The room has 100 tiles, two of which are permanently reserved for the door, so at most 98 pieces ever fit and `index >= MAX_PIECES` (line 161) is unreachable on-chain. The existing cap test reaches the branch only with a storage cheat (test/ClubsPlacement.t.sol). A cap that cannot be hit is a documented-but-untested guarantee; set it to the real maximum so the check is exercised by a real placement sequence (the task's section 4 sets it to 285 for the level-4 room with wall slots).","line":26,"path":"src/OGClubClubs.sol","reproduction":"Club 1, footprint id 1 = 1x1, 98 placements at every non-door tile succeed (pieceCount == 98). Any 99th placement reverts TileTaken (or BlocksDoor at (0,4)/(1,4)); no input ever produces ClubFull. Verified by test_ClubFullIsUnreachable in test/scratch/ReviewRepro.t.sol.","severity":"low","snippet":"    uint256 public constant MAX_PIECES = 100;","title":"MAX_PIECES = 100 can never be reached: ClubFull is dead code on the 10x10 room"},{"citation":"resolved","description":"Map for the adapter, not a defect in the delivered code. The bit layout of _tiles is encoded as literal shifts in DOOR_MASK (bits 40 and 41), in _placementMask (row * ROOM_SIZE + x, line 186) and in tileTaken (y * ROOM_SIZE + x, line 205). Moving to the requested fixed 16-wide stride (bit y*16 + x) means the door becomes bits 64 and 65 and the bounds in _placementMask/tileTaken must come from the club's level rather than ROOM_SIZE. Changing one site and not another silently misplaces pieces. Also, test/helpers/ClubsTestBase.sol:41 and the invariant handler call mintClub() with no argument and will need the pepe-based signature.","line":28,"path":"src/OGClubClubs.sol","reproduction":"Not a failing input on the current code: with stride 10 and ROOM_SIZE 10 all three sites agree. If only DOOR_MASK were moved to bits 64/65 while _placementMask kept stride 10, a 1x1 piece at (4,6) (bit 64) would revert BlocksDoor and a piece at (0,4) would be accepted on the door.","severity":"info","snippet":"    uint256 private constant DOOR_MASK = (uint256(1) << 40) | (uint256(1) << 41);","title":"Tile bit index y*10+x is hard-coded in three places; the 16x16 bitmap change must update all of them together"}],"hash":"1263bd21956d5acc68b62a831339fca68a3f2849dbbe896e7b0ae702cd8f27e8","nodeId":"0e2724f2-1692-4910-9904-4ec83c84c310","outcome":"completed","summary":"Review complete. The findings file holds 7 entries, all reproduced with a scratch Foundry test. The working tree is otherwise untouched: `.imd-findings.json` and `test/scratch/` are ignored by git and nothing else changed.\n\n**Scope read in full:** OGClubClubs, OGClubFurniture, OGClubFarmVault, OGClubStaking, OGClubRaffle, MockOG, the Permutation and BlockHeader libraries, both deploy scripts, launch.json, README, ADAPTATION.md, the clubs test helpers and selected tests. Nothing in scope was unreachable. The existing 53 clubs tests pass on the delivered commit. No critical, high or medium defect was found, so no finding carries a proof file. The launch.json manifest is well formed: notes are 3,596 characters, only the three schema keys are present, and the six contracts are in dependency order.\n\n**Findings, all low except the last:**\n\n- **Constructor accepts vault == BURN_ADDRESS.** Deployment succeeds but every mint reverts with UnexpectedTokenDebit forever, since the burn sink gains the whole price instead of half. The vault is immutable, so the contract is dead on arrival.\n- **Constructor accepts vault == token or vault == furniture.** Mints succeed and half of each payment lands in a contract with no withdrawal path. Neither alias has a test today.\n- **Mainnet script never checks that FARM_VAULT's token is OG_TOKEN.** A mismatched vault deploys cleanly and then strands the vault half of every purchase in a vault that budgets seasons in a different token.\n- **Malformed placement data uses a bare revert.** OpenZeppelin's ERC-1155 wraps it as ERC1155InvalidReceiver(clubs), so the holder is told the clubs contract cannot receive tokens rather than that their data is wrong.\n- **Mainnet script broadcasts from OWNER.** The README expects a Safe owner, which cannot sign a forge broadcast; the constructor already takes the owner as an argument, so a separate deployer key suffices.\n- **MAX_PIECES = 100 is unreachable.** Only 98 tiles exist after the door, so ClubFull is dead code reached only by a storage cheat in tests.\n- **Info for the adapter:** the y*10+x bit stride is hard-coded in DOOR_MASK, in the placement mask and in tileTaken. The 16-wide bitmap must change all three together, and the test base and invariant handler still call the argument-less mintClub.\n\n**Trust assumptions, not defects:** the owner can close the sale, change unlocked footprints and the URI prefix until frozen, and set royalties up to 10%; a furniture-approved operator can permanently place a holder's pieces into that holder's club; the raffle's documented retarget bias and first-grant ordering remain as the prior audit recorded.","treeHash":null,"usage":{"cachedInputTokens":1192268,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":28243,"runtime":"claude","turns":35,"wallClockMs":542927}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef31844bb462de78","findings":[{"citation":"resolved","description":"The brief moved live dependency validation out of the constructor (which must run on an empty chain) and into DeployClubsMainnet, but the script only checks that FARM_VAULT.token() equals OG_TOKEN. The three other external dependencies that OGClubClubs stores as immutables are passed straight through from env with no code or interface check: SWARM_PEPES (every mintClub calls pepes.ownerOf and reverts with empty data when the address has no code, so no club can ever be minted), FURNITURE (onERC1155Received requires msg.sender == furniture, so with a wrong address no piece can ever be placed), and a non-zero DELEGATE_REGISTRY (every non-holder mint attempt reverts with empty data instead of NotPepeHolder; delegation is silently dead). Because all three are immutable and the contract has no migration path, a typo or stale env value produces a permanently unusable deployment whose address and constructor args the script nevertheless prints as ready. The repo's own mainnet script test passes an EOA (makeAddr(\"existing furniture\")) as FURNITURE and the script accepts it, which shows the gap is exercised but not caught. Boundary exercised: pepes.ownerOf / delegates.checkDelegateForERC721 / furniture msg.sender gate on a no-code address. Assumption: the env values point at live ERC-721 / ERC-1155 / registry contracts. Actual: Solidity high-level calls to a code-less address revert, so the deployed clubs contract is bricked for minting (pepes), placement (furniture) or delegation (registry). Minimal fix in the script, mirroring the existing vault check: require config.pepes code.length > 0 and IERC165(pepes).supportsInterface(0x80ac58cd); require config.furniture code.length > 0 and supportsInterface(0xd9b67a26); if config.delegates != 0 require code.length > 0 (optionally staticcall checkDelegateForERC721 and expect a bool). Revert before vm.startBroadcast so nothing is deployed.","line":179,"path":"script/DeployClubs.s.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {ERC721} from \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport {OGClubClubs} from \"src/OGClubClubs.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {OGClubFarmVault} from \"src/OGClubFarmVault.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\nimport {IDelegateRegistry} from \"src/interfaces/IDelegateRegistry.sol\";\nimport {DeployClubsMainnet} from \"script/DeployClubs.s.sol\";\n\ncontract Pepes is ERC721 {\n    constructor() ERC721(\"P\", \"P\") {}\n\n    function mint(address to, uint256 id) external {\n        _mint(to, id);\n    }\n}\n\n/// The mainnet script must refuse a SWARM_PEPES, FURNITURE or DELEGATE_REGISTRY address without code,\n/// the way it already refuses a FARM_VAULT whose token() differs. These addresses are immutable in\n/// OGClubClubs, so a deployment with one of them wrong can never mint (or never place) and must be redone.\ncontract MainnetScriptDependenciesTest is Test {\n    address owner = makeAddr(\"owner\");\n    MockOG token;\n    OGClubFarmVault vault;\n    OGClubFurniture furniture;\n    Pepes pepes;\n    uint256 constant KEY = 0xA11CE;\n\n    function setUp() public {\n        vm.chainId(1);\n        token = new MockOG(owner);\n        vault = new OGClubFarmVault(token, owner);\n        furniture = new OGClubFurniture(owner, owner);\n        pepes = new Pepes();\n    }\n\n    function _config() internal view returns (DeployClubsMainnet.Config memory config) {\n        config = DeployClubsMainnet.Config({\n            token: token,\n            vault: address(vault),\n            price: 100_000e18,\n            furniture: IERC1155(address(furniture)),\n            owner: owner,\n            royaltyReceiver: owner,\n            pepes: IERC721(address(pepes)),\n            delegates: IDelegateRegistry(address(0)),\n            upgradePrices: OGClubClubs.UpgradePrices(200_000e18, 400_000e18, 800_000e18)\n        });\n    }\n\n    function test_ScriptRejectsPepesWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.pepes = IERC721(makeAddr(\"not deployed pepes\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead pepes address\");\n    }\n\n    function test_ScriptRejectsFurnitureWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.furniture = IERC1155(makeAddr(\"not deployed furniture\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead furniture address\");\n    }\n\n    function test_ScriptRejectsNonzeroRegistryWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.delegates = IDelegateRegistry(makeAddr(\"not deployed registry\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead registry address\");\n    }\n\n    function test_ScriptStillDeploysWithLiveDependenciesAndZeroRegistry() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        OGClubClubs clubs = script.deploy(KEY, _config(), \"[]\");\n        assertEq(address(clubs.pepes()), address(pepes));\n        assertEq(address(clubs.delegates()), address(0));\n    }\n}","reproduction":"vm.chainId(1); build DeployClubsMainnet.Config with a real MockOG token, a real OGClubFarmVault(token), a real OGClubFurniture, UpgradePrices(200_000e18,400_000e18,800_000e18), but pepes = IERC721(makeAddr(\"not deployed pepes\")). Call new DeployClubsMainnet().deploy(0xA11CE, config, \"[]\"). Expected: the script reverts before broadcasting, like it does for VaultTokenMismatch, and the deployer nonce is unchanged. Actual: deploy succeeds, prints the clubs address and constructor args, and the deployer nonce advances. On the deployed contract, after owner calls setSaleOpen(true), any holder calling mintClub(1) reverts with empty revert data forever (verified: test_EOAPepesBricksMintingForever in the scratch suite). Same for config.furniture = EOA (no placement is ever possible since msg.sender can never equal furniture) and config.delegates = non-zero EOA (any non-holder mintClub reverts with empty data instead of NotPepeHolder). The attached proof file fails on the current script for all three inputs and passes for the live-dependency control.","severity":"low","snippet":"        if (address(OGClubFarmVault(config.vault).token()) != address(config.token)) revert VaultTokenMismatch();","title":"Mainnet script validates only FARM_VAULT; a dead SWARM_PEPES, FURNITURE or DELEGATE_REGISTRY address deploys an OGClubClubs that can never mint or place"}],"hash":"20426e7333ebcf7cc18ad8f36fab4f9f30f2875d110181caebed92b5af032528","nodeId":"18b7139a-9eb2-4052-a01f-3fed694e2d7c","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds one finding plus 63 coverage rows. No repository files were changed; the findings file and `test/scratch/` are git-ignored.\n\n**Outcome: the OGClubClubs math holds.** I traced every arithmetic and boundary path in the contract against the Math Precision, Boundary and Numerical Gap guides and found no defect in the contract itself. The only substantiated finding is a low in the mainnet deploy script.\n\n**What I verified in the contract**\n\n- **Payment split.** The burn gets the floor of half, the vault gets the remainder, so the two always sum to the price. The three receipt checks and the exact payer-debit check reject taxed, false-returning and callback tokens. Mint and upgrade are reentrancy-guarded and write state before transfers.\n- **Floor bitmap.** Stride is fixed at 16 at every level, so upgrades never reinterpret old tiles. The widest piece at the far corner of a level-4 room lands on bit 255 and nothing crosses a row. The door constant covers exactly (0,4) and (1,4).\n- **Wall bitmaps.** Side and y are checked before the mask is built, the highest wall bit is 18 so the uint32 cast never truncates, and only side 1 reserves position 4.\n- **Piece cap.** 254 usable floor cells plus 16 and 15 wall positions equal 285, so ClubFull is reachable only when every cell is occupied.\n- **Decode.** Placement data must be exactly 128 bytes and each uint8 word canonical, so no value slips past the bounds checks.\n- **Tests.** The fuzz and invariant suites compare against a cell-by-cell model that uses no production bitmap code, so the geometry coverage is genuine. All 219 project tests pass, and forge fmt is clean.\n- **Manifest and registry.** The launch manifest has the right keys, 11 constructor words in declaration order and 3191 characters of notes. The delegate.xyz v2 registry has code on mainnet and Sepolia and answers the exact selector the contract uses.\n\n**Finding (low), `script/DeployClubs.s.sol:179`.** The mainnet script checks only that the farm vault's token matches. The Swarm Pepe, furniture and delegate registry addresses are passed from env straight into immutables with no code or interface check. A dead pepes address makes every mint revert forever, a dead furniture address makes placement impossible, and a dead non-zero registry kills delegation. The repo's own mainnet script test passes an EOA as furniture and the script accepts it. The attached proof test fails today for all three inputs and passes for a live-dependency control. The fix is a code-length and ERC-165 check before broadcasting, mirroring the existing vault check.\n\n**Coverage.** All 58 listed entry points have rows. The 16 OGClubClubs entry points, the constructor, the manifest and the furniture paths into the placement hook are marked holds with reasons. The script is marked finding. Entry points of the raffle, staking, vault and furniture admin functions are outside the assigned area and unchanged by this change set, and their rows say so plainly.","treeHash":null,"usage":{"cachedInputTokens":1289910,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":37437,"runtime":"claude","turns":34,"wallClockMs":669998}},{"artifacts":[],"attempt":1,"bundleHash":"709fc3148783585cc86684e8f28eca670af5d49f1981ee99374512b651eb632d","device":"6de2de551e41049f","findings":[],"hash":"4de2afb138c61f745bc5e6550d2167199a5231bdb1e82081517a51fc8b26876d","nodeId":"7cf52cb2-b65a-4ee1-aeaa-92f8b2ea0082","outcome":"completed","summary":"Updated only [launch.json](/root/.identitymd/work/d7f17b1e-b76e-4e29-a106-5689ed58e8c8/7cf52cb2-b65a-4ee1-aeaa-92f8b2ea0082/launch.json), preserving seven accepted constructor entries and clarifying Sepolia-only mocks and required owner setup.\n\nChecks passed: manifest/ABI validation, `forge build`, `forge fmt --check`, and all 219 tests using the supplied fuzz seed.","treeHash":"d93b8c1fcb8f70a1e1133e6a99bffe5813136862","usage":{"cachedInputTokens":1097088,"inputTokens":68179,"model":"gpt-6-astra","outputTokens":9302,"runtime":"codex","turns":8,"wallClockMs":503130}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2ab0b432477fde6c","findings":[{"citation":"resolved","description":"Only address(0) switches delegation off. A nonzero `delegates` address without code (for example DeployClubsSepolia run on chain 31337, where the hardcoded 0x0000...Bed493 constant has no code, or a mistyped DELEGATE_REGISTRY on mainnet) makes the non-holder path fail inside the external call's return-data decoding with an empty revert rather than NotPepeHolder. Holders are unaffected because the registry call is short-circuited. Verified with cast that the registry has code on Ethereum mainnet and Sepolia, and with a mainnet-fork test that token-level and wallet-level delegate.xyz v2 delegations mint correctly, so there is no live impact; this is a diagnostics/configuration note, not a loss. A mainnet script check that DELEGATE_REGISTRY is address(0) or has code would surface the misconfiguration before deployment.","line":162,"path":"src/OGClubClubs.sol","reproduction":"Deploy OGClubClubs with delegates = makeAddr(\"nocode\") (nonzero, no code), setSaleOpen(true), mint pepe 2 to alice. As bob (not holder, not delegate) call mintClub(2). Expected: revert NotPepeHolder(). Actual: revert with empty return data (ok=false, ret=0x) from the failed decode of checkDelegateForERC721's return.","severity":"info","snippet":"                    || !delegates.checkDelegateForERC721(msg.sender, holder, address(pepes), pepeId, bytes32(0)))","title":"Non-holder mint reverts with empty data instead of NotPepeHolder when the registry address has no code"}],"hash":"5de34fc0f14cd2be17d3dd1f01029033004175b48d30203e698bb5a868ff0349","nodeId":"1518b123-9c6c-4d13-bfdb-862583378c3f","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one informational finding and 59 coverage rows.\n\n**Outcome.** The OGClubClubs changes hold under the Execution Trace, Periphery and First Principles lenses. I found no defect that loses funds, misroutes payment, or breaks a stated guarantee.\n\n**What I verified**\n- `forge build`, the full suite of 219 tests, and `forge fmt --check` all pass.\n- Mint path: sale gate, lifetime `clubsMinted` right, holder-or-delegate check, state written before payment and `_safeMint`, nonReentrant. The club id equals the Pepe id and nothing clears the right.\n- Delegation periphery: the delegate.xyz v2 registry has code on mainnet and Sepolia, and a mainnet-fork scratch test minted through both a token-level and a wallet-level delegation on the real contract, while an undelegated wallet reverted `NotPepeHolder`.\n- Upgrade path: holder or approved only, level read then written before `_pay`, `MaxLevel` at 4, exact half-burn split with receipt checks, both events emitted.\n- Placement hook: furniture-only caller, amount 1, strict 128-byte decode, authorization of `from`, footprint and one-design checks, `MAX_PIECES` at 285, floor masks bounded by the club's size with the door mask, wall masks per side with side-1 position 4 reserved. Direct minter pushes and the raffle's `claimTo(clubs)` revert in the hook.\n- Scripts and manifest: mainnet script checks the vault's token before broadcasting from the deployer key and passes OWNER. launch.json has only schema keys, unique names, eleven constructor words for the clubs contract, notes under 4,000 characters, and states that both mocks are Sepolia-only.\n\n**The one finding, informational.** With a nonzero `delegates` address that has no code, a non-holder's `mintClub` reverts with empty data instead of `NotPepeHolder`. Holders are unaffected. This only occurs on misconfiguration, such as running the Sepolia script on a local chain, so it is a diagnostics note rather than a loss.\n\n**Not covered in depth.** The vault, staking, raffle and the rest of the furniture contract are unchanged since the base commit and outside my area. I marked them `holds` on that basis. I could not identify the real Swarm Pepe contract on chain, so its `ownerOf` behaviour for nonexistent ids rests on the requester's statement that it is a standard ERC-721.\n\nSources consulted for the Swarm Pepe lookup: [Etherscan PEPE token](https://etherscan.io/token/0x2fb3842189fc7a699d047d9e647474f27779331d), [Ecosyste.ms SwarmNFT](https://awesome.ecosyste.ms/projects/9532309).","treeHash":null,"usage":{"cachedInputTokens":837161,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":30817,"runtime":"claude","turns":29,"wallClockMs":508714}},{"artifacts":[],"attempt":1,"bundleHash":"08d011e6efc2122c711bb57c6239a09ecfa45dce970152853e5c5efe87c51355","device":"68fdf4cb027a7a1f","findings":[],"hash":"87d5eb7e85189d205014c3356eb5df9b8236695557a891a85dbb1168fe36b884","nodeId":"25171cdb-9d96-499b-8a7c-1e3d31e3d05f","outcome":"completed","summary":"Repaired the timeout by optimizing occupancy checks while preserving invariant run counts and depths. Added reader regression tests. Only `test/` changed.\n\nPassed:\n\n- `forge build`\n- Seeded `forge test`: 234 passed in 319 seconds\n- `forge fmt --check`\n- All six Python checks","treeHash":"d18acb7d8cdc2dfb3dc42410428b86b2467b1791","usage":{"cachedInputTokens":7559296,"inputTokens":244896,"model":"gpt-6-astra","outputTokens":59720,"runtime":"codex","turns":24,"wallClockMs":2929316}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"52c98c0dc01791cd","findings":[{"citation":"resolved","description":"Seam: access x asymmetry (Trust Gap guide, seam 3; Asymmetry guide step 5, admin setter vs user op). onERC1155Received decodes only (clubId, x, y, rot) from the user's data and reads the live footprint (w, h, wall) at execution time. setFootprint (line 333-338) is onlyOwner and may rewrite every field of an id until the first placement locks it. The same four words are interpreted two different ways depending on the wall flag: for a wall piece rot is the side and x is the start position; for a floor piece rot is a rotation and (x, y) a tile. So a user's signed placement for an unlocked id can be mined after the owner's redefinition and still succeed, producing a different shape in a different place than the user intended. Placements are permanent and the piece is locked in the club forever, so the user cannot undo it. This is an owner power (the owner is trusted and setFootprint is a requested feature), so the severity is low and the fix is a design decision: either bind the placement to the footprint (include w, h and wall, or a footprint version, in the data and revert on mismatch), or make the first setFootprint of an id final, or document that users must not place into an id whose footprint the owner may still change. Changing the data layout alters the agreed abi.encode(clubId, x, y, rot) protocol, so the requester has to choose.","line":215,"path":"src/OGClubClubs.sol","reproduction":"State: fresh deployment, sale open, alice holds Pepe 1 and has minted club 1. Owner calls setFootprint(5, 2, 1, true) (a 2-wide wall piece). alice holds one furniture 5 and submits furniture.safeTransferFrom(alice, clubs, 5, 1, abi.encode(uint256(1), uint8(6), uint8(0), uint8(1))) meaning 'wall side 1, positions 6..7'. Before that transaction is mined the owner calls setFootprint(5, 2, 2, false) (id 5 not yet locked, so accepted). alice's transaction then executes: expected (what alice signed) is a wall piece on side 1 covering positions 6 and 7, or a revert; actual is a 2x2 floor piece anchored at (6,0) with rot 1: piecesOf(1)[0].wall == false, tileTaken(1,6,0) and tileTaken(1,7,1) are true, wallTaken(1,1,6) is false, and footprintOf(5).locked is now true so the shape is fixed forever. Verified with test/scratch/Probe.t.sol test_footprintRedefinitionReinterpretsPendingPlacement, which passes on the current code (the placement succeeds instead of reverting).","severity":"low","snippet":"        Footprint storage footprint = _footprints[id];\n        if (!footprint.set) revert NoFootprint();","title":"Placement data does not commit to the footprint: an owner setFootprint on a still-unlocked id reinterprets a pending placement into a different permanent piece"}],"hash":"b3abe0ff14f50952ff5bfddfecbfa8c66fd4cbc6f45014be32814e23a5538434","nodeId":"8dc4bfa8-c2b4-44c1-b89e-5a5581a098c6","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome:** one low-severity finding, no critical or high defects in the permission model of the changed OGClubClubs contract. All 96 existing club tests pass, and my four scratch probes under `test/scratch/` behaved as the code analysis predicted.\n\n**The finding (low, access × asymmetry):** placement calldata only carries club id, x, y and rot, while the hook reads the live footprint at execution time. Until an id is locked by its first placement, the owner can rewrite its width, height and wall flag. A user's pending placement mined after such a rewrite still succeeds but produces a different permanent piece. Concretely, a signed wall placement for a 2-wide id 5 on side 1 at position 6 becomes a 2x2 floor piece at (6,0) after the owner redefines id 5 as a 2x2 floor piece. This is an owner power the brief asked for, so the fix is a scope decision: bind the footprint into the data, make the first footprint final, or document the hazard.\n\n**What held in my area:**\n- Mint authorization matches the spec exactly, the holder path never calls the registry, and the registry address has code on both Sepolia and mainnet with the expected selector.\n- Upgrade and placement authorization use the same OpenZeppelin check, the caller always pays with their own tokens, and per-token approvals clear on transfer.\n- A furniture minter sending a single id straight into the clubs contract reverts rather than stranding it.\n- The mainnet script checks the vault's token before broadcasting and keeps owner calls as printed calldata. The manifest's eleven constructor words match the flattened struct in declaration order.\n\n**Trust assumptions noted in the coverage rows rather than as findings:** the real delegate.xyz registry also honours all-scope and contract-scope delegations, so any rights-less hot-wallet delegate can take the club, which the mock registry does not model. Upgrades stay open while the sale is closed, as the README states.\n\n**Coverage:** all 57 listed entry points have rows, plus the constructor, scripts, manifest, invariants and the static-analysis reentrancy leads. Entry points in the four unchanged contracts are marked as holding on the basis that nothing in the changed contract touches them, with the row stating they were not re-traced.","treeHash":null,"usage":{"cachedInputTokens":1197562,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":35128,"runtime":"claude","turns":32,"wallClockMs":702379}},{"artifacts":[],"attempt":2,"bundleHash":"12598f1f9d5525d9e4923c6e93ee88dd39478d6b16a15779763d82cc17c7642e","device":"4539d3d0693a7444","findings":[],"hash":"c0cff3dace8ee6e51ff97bf07f935c58e85b6a7ef4c909c97f1728660ee9c1bb","nodeId":"6c69cad5-4d66-4b87-a013-fed4cad151f2","outcome":"completed","summary":"Repaired the manifest notes limit and reduced invariant-test overhead without lowering coverage. Updated ADAPTATION.md.\n\nAll checks pass:\n\n- `forge build`\n- Seeded `forge test`: 219 passed in 491 seconds, below the 600-second cutoff\n- `forge fmt --check`\n- Six Python checks\n\nApplication contracts, constructor arguments, and protected build files remain unchanged by this repair.","treeHash":"b2cd4e9952c47411512f1a6e04e817a18f2e3c51","usage":{"cachedInputTokens":17012096,"inputTokens":312292,"model":"gpt-6-astra","outputTokens":100256,"runtime":"codex","turns":43,"wallClockMs":5263824}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"764cd99b4c628a47","findings":[{"citation":"resolved","description":"DeployClubsMainnet.deploy performs one live dependency check (FARM_VAULT.token() == OG_TOKEN) and then deploys OGClubClubs, whose pepes, furniture and delegates are immutable with no setters. The constructor intentionally makes no calls (factory rule), so the script is the only place where SWARM_PEPES, FURNITURE and DELEGATE_REGISTRY can be validated, and it does not check that they have code or answer the interfaces the contract relies on (ownerOf, ERC-1155 hook caller, checkDelegateForERC721). With a mistyped SWARM_PEPES every mintClub reverts forever at pepes.ownerOf (call to an address without code with expected return data), and with a mistyped FURNITURE every placement reverts at the NotFurniture check; both require a redeploy, and any clubs minted before a FURNITURE mistake is noticed are permanently unfurnishable. Economic impact is limited to a failed launch (no funds move because _pay runs after the ownerOf call), which is why this is low, but it is the same class of defect the brief asked the script to guard against for the vault. Fix: before vm.startBroadcast, require config.pepes.code.length != 0 and that IERC721(config.pepes).ownerOf(<a known id>) or supportsInterface(0x80ac58cd) answers; require config.furniture.code.length != 0 and IERC165(furniture).supportsInterface(0xd9b67a26); and when config.delegates != address(0), require it has code (optionally that checkDelegateForERC721(owner, owner, pepes, 0, 0) returns without reverting).","line":179,"path":"script/DeployClubs.s.sol","reproduction":"On chainId 1 (or 31337), call DeployClubsMainnet.deploy(key, Config{token: OG, vault: FarmVault(OG), price: 100e18, furniture: Furniture, owner: O, royaltyReceiver: O, pepes: IERC721(0x<any EOA / codeless address>), delegates: 0, upgradePrices: (1,2,3)}, \"[]\"). Expected: the script refuses to deploy against a dependency that cannot be a Swarm Pepe contract. Actual: deployment succeeds and prints addresses; after owner.setSaleOpen(true), every mintClub(1) from any caller reverts with empty data (the ownerOf staticcall to a codeless address fails the return-data check), and because pepes is immutable the contract is dead and must be redeployed. Verified with a scratch Foundry test (test_MainnetScriptAcceptsCodelessPepesAndMintIsBricked) that deploys through DeployClubsMainnet.deploy with pepes = makeAddr(\"not a pepe contract\"), asserts codeless.code.length == 0, then vm.expectRevert() on mintClub(1).","severity":"low","snippet":"        if (address(OGClubFarmVault(config.vault).token()) != address(config.token)) revert VaultTokenMismatch();","title":"Mainnet script validates only the vault's token; a wrong or codeless SWARM_PEPES (or FURNITURE) deploys an immutable contract that can never mint (or never furnish)"},{"citation":"resolved","description":"Economic note, not a code defect: the brief requires that each Pepe mints exactly one club ever and that the mint right does not reset on Pepe transfer. Consequently the right belongs to whoever (holder or any delegate.xyz all-rights delegate) calls mintClub first, and a Pepe buyer who checked clubsMinted(pepeId) == false before buying can still receive a Pepe with no mint right if the seller or the seller's delegate mints in the same block ahead of the sale fill. The club goes to the minter, the payment splits correctly, and the protocol loses nothing; the loser is the Pepe buyer. Marketplace integrations should read clubsMinted at fill time (or buy the Pepe and the club together). No code change is recommended; README already states the rule.","line":157,"path":"src/OGClubClubs.sol","reproduction":"Alice holds Pepe 5 and has delegated hot wallet H via delegate.xyz (all rights). Alice lists Pepe 5; Bob reads clubsMinted(5) == false and sends a buy. In the same block, before Bob's fill, H calls mintClub(5): H pays price, receives club #5, clubsMinted[5] = true. Bob's fill then executes and he owns Pepe 5; Bob's later mintClub(5) reverts AlreadyMinted. Expected per brief: exactly this (one club per Pepe, forever). Noted for the economics record only.","severity":"info","snippet":"        if (clubsMinted[pepeId]) revert AlreadyMinted();","title":"Mint right is first-come between a Pepe holder and its delegates, so a Pepe buyer can be front-run out of the club in the same block as the sale (by design, documented)"}],"hash":"e4aff7fee86b5c93a380b2408a919b0ae2c3fc0f939e01bf39d01e3d396a10c4","nodeId":"519f83bb-ba97-48c8-88c2-bfc26cda05e3","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree is otherwise unchanged.\n\n**Outcome.** The OGClubClubs economics hold. I found no fund-loss, misdirected-payment or invariant-breaking defect in the Pepe minting, upgrade payment, placement or one-of-each logic. The report in `.imd-findings.json` carries one low finding, one informational note, and a coverage row for all 58 listed entry points plus the four economic invariants and the manifest.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n- Payment flow in `_pay`: half to the burn sink, remainder to the vault, exact receipts on both recipients and the payer, effects written before the token calls, nonReentrant on mint and upgrade, and the constructor's self, burn, token and furniture rejections for the vault. The contract never holds OG.\n- Mint right: the club id equals the Pepe id, `clubsMinted` is set before delivery and never cleared, delegation uses the correct delegate.xyz v2 argument order and the all-rights sentinel, and a zero registry short-circuits.\n- Furniture custody: every ERC-1155 path into clubs reaches the single hook with full checks. I verified by test that a singleton batch transfer is placed correctly, that minting furniture directly into the clubs contract reverts, and that a token-approved spender who upgrades pays with its own tokens while the club stays with the holder.\n- Capacity and geometry: floor and wall masks are bounded by the current room size with the fixed 16 stride, the door is excluded on both floor and side 1, and the 285-piece cap is reachable. The existing fuzz and invariant suites pass, 76 of 76.\n- Manifest: the eleven constructor words are in declaration order, the registry checksum is valid, and delegate.xyz v2 has code on Sepolia, which I confirmed with a live code read.\n\n**Findings:**\n- **Low, deployment safety.** The mainnet script checks only that the farm vault's token matches. A mistyped or codeless `SWARM_PEPES` deploys an immutable contract where every mint reverts forever, and a mistyped `FURNITURE` makes every placement revert. I reproduced the Pepe case through the script with a scratch test. The fix is a code and interface check on pepes, furniture and the registry before broadcasting.\n- **Info, by design.** The mint right is first-come between a Pepe holder and its delegates, so a Pepe buyer can be front-run out of the club in the same block as the sale. This is what the brief requires and the README states it. It is recorded for the economics record only.\n\n**Not reached.** I did not trace the raffle, staking or furniture role-lifecycle functions beyond the paths that can touch clubs custody. Their rows are marked as outside my area and untouched by the clubs changes.","treeHash":null,"usage":{"cachedInputTokens":1014284,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":33823,"runtime":"claude","turns":29,"wallClockMs":662762}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d68ba89c0b30801c","findings":[{"citation":"resolved","description":"Merged from audit_economics, audit_math and audit_flow (same root cause). The brief moved live dependency checks out of the constructor (which must run on an empty chain) into DeployClubsMainnet, but the script checks only FARM_VAULT.token() == OG_TOKEN. SWARM_PEPES, FURNITURE and DELEGATE_REGISTRY are passed from env straight into immutables with no code or interface check. Consequences on the deployed contract: with a codeless pepes every mintClub reverts with empty data at pepes.ownerOf (src/OGClubClubs.sol:158) so no club can ever exist; with a codeless furniture onERC1155Received can never be reached because msg.sender can never equal furniture (line 211), so no piece can ever be placed; with a non-zero codeless registry every non-holder mintClub reverts with empty data instead of NotPepeHolder (line 162), so delegation is silently dead. All three are immutable with no migration path, and the script prints the address and constructor args as ready. No funds move (ownerOf runs before _pay), so the impact is a failed, redeployed launch: low. Minimal fix in the script, before vm.startBroadcast and mirroring the vault check: require address(config.pepes).code.length != 0 (optionally IERC165.supportsInterface(0x80ac58cd)); require address(config.furniture).code.length != 0 (optionally supportsInterface(0xd9b67a26)); if config.delegates != address(0) require it has code. This does not touch the constructor, so the factory deployment model is unchanged.","line":179,"path":"script/DeployClubs.s.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {ERC721} from \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport {OGClubClubs} from \"src/OGClubClubs.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {OGClubFarmVault} from \"src/OGClubFarmVault.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\nimport {IDelegateRegistry} from \"src/interfaces/IDelegateRegistry.sol\";\nimport {DeployClubsMainnet} from \"script/DeployClubs.s.sol\";\n\ncontract Pepes is ERC721 {\n    constructor() ERC721(\"P\", \"P\") {}\n\n    function mint(address to, uint256 id) external {\n        _mint(to, id);\n    }\n}\n\n/// The mainnet script must refuse a SWARM_PEPES, FURNITURE or DELEGATE_REGISTRY address without code,\n/// the way it already refuses a FARM_VAULT whose token() differs. These addresses are immutable in\n/// OGClubClubs, so a deployment with one of them wrong can never mint (or never place) and must be redone.\ncontract MainnetScriptDependenciesTest is Test {\n    address owner = makeAddr(\"owner\");\n    MockOG token;\n    OGClubFarmVault vault;\n    OGClubFurniture furniture;\n    Pepes pepes;\n    uint256 constant KEY = 0xA11CE;\n\n    function setUp() public {\n        vm.chainId(1);\n        token = new MockOG(owner);\n        vault = new OGClubFarmVault(token, owner);\n        furniture = new OGClubFurniture(owner, owner);\n        pepes = new Pepes();\n    }\n\n    function _config() internal view returns (DeployClubsMainnet.Config memory config) {\n        config = DeployClubsMainnet.Config({\n            token: token,\n            vault: address(vault),\n            price: 100_000e18,\n            furniture: IERC1155(address(furniture)),\n            owner: owner,\n            royaltyReceiver: owner,\n            pepes: IERC721(address(pepes)),\n            delegates: IDelegateRegistry(address(0)),\n            upgradePrices: OGClubClubs.UpgradePrices(200_000e18, 400_000e18, 800_000e18)\n        });\n    }\n\n    function test_ScriptRejectsPepesWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.pepes = IERC721(makeAddr(\"not deployed pepes\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead pepes address\");\n    }\n\n    function test_ScriptRejectsFurnitureWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.furniture = IERC1155(makeAddr(\"not deployed furniture\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead furniture address\");\n    }\n\n    function test_ScriptRejectsNonzeroRegistryWithoutCode() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = _config();\n        config.delegates = IDelegateRegistry(makeAddr(\"not deployed registry\"));\n        uint64 nonce = vm.getNonce(vm.addr(KEY));\n        vm.expectRevert();\n        script.deploy(KEY, config, \"[]\");\n        assertEq(vm.getNonce(vm.addr(KEY)), nonce, \"nothing may be deployed with a dead registry address\");\n    }\n\n    function test_ScriptStillDeploysWithLiveDependenciesAndZeroRegistry() public {\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        OGClubClubs clubs = script.deploy(KEY, _config(), \"[]\");\n        assertEq(address(clubs.pepes()), address(pepes));\n        assertEq(address(clubs.delegates()), address(0));\n    }\n}","reproduction":"vm.chainId(1). Deploy MockOG(owner), OGClubFarmVault(token, owner), OGClubFurniture(owner, owner), a plain ERC721 as pepes. Build DeployClubsMainnet.Config with those, price 100_000e18, delegates = address(0), UpgradePrices(200_000e18,400_000e18,800_000e18). Then set config.pepes = IERC721(makeAddr(\"not deployed pepes\")) and call new DeployClubsMainnet().deploy(0xA11CE, config, \"[]\"). Expected: revert before broadcasting (as VaultTokenMismatch does) with the deployer nonce unchanged. Actual: deploy succeeds and the nonce advances; after owner.setSaleOpen(true) any mintClub(1) reverts with empty data forever. Same for config.furniture = codeless address (placement impossible) and config.delegates = non-zero codeless address (non-holder mint reverts with empty data instead of NotPepeHolder). Ran the attached proof on this tree: test_ScriptRejectsPepesWithoutCode, test_ScriptRejectsFurnitureWithoutCode and test_ScriptRejectsNonzeroRegistryWithoutCode fail with 'next call did not revert as expected'; the live-dependency control passes.","severity":"low","snippet":"        if (address(OGClubFarmVault(config.vault).token()) != address(config.token)) revert VaultTokenMismatch();","title":"Mainnet script validates only FARM_VAULT; a codeless SWARM_PEPES, FURNITURE or non-zero DELEGATE_REGISTRY deploys an immutable OGClubClubs that can never mint, never place, or never delegate"},{"citation":"resolved","description":"From audit_permissions, reproduced. onERC1155Received decodes only (clubId, x, y, rot) from the user's data and reads the live footprint (w, h, wall) at execution time. setFootprint (line 333-338) is onlyOwner and may rewrite every field of an id, including the wall flag, until the first placement locks it. The same four words mean different things under the two flags: for a wall piece rot is the side and x the start position; for a floor piece rot is a rotation and (x, y) a tile. A user's placement for an unlocked id that is mined after the owner redefines the id therefore succeeds with a different shape in a different place, and the placement is permanent. This is within the requested lock rule (README says an unused footprint can change, including its wall flag) and requires the trusted owner to act, so it is low and the fix is the requester's design decision: bind the placement to the footprint (include w, h, wall or a footprint version in data and revert on mismatch, which changes the agreed abi.encode(clubId,x,y,rot) protocol), make the first setFootprint of an id final, or document that users must not place into an id the owner may still change.","line":215,"path":"src/OGClubClubs.sol","reproduction":"Fresh deployment, sale open, alice holds Pepe 1 and minted club 1, alice holds one furniture id 5. Owner calls setFootprint(5, 2, 1, true). alice submits furniture.safeTransferFrom(alice, clubs, 5, 1, abi.encode(uint256(1), uint8(6), uint8(0), uint8(1))), meaning wall side 1 positions 6..7. Before it is mined the owner calls setFootprint(5, 2, 2, false) (accepted: id 5 not locked). alice's transaction then executes. Expected: a wall piece on side 1 covering 6..7, or a revert. Actual: a 2x2 floor piece at (6,0) rot 1: piecesOf(1)[0].wall == false, tileTaken(1,6,0) and tileTaken(1,7,1) are true, wallTaken(1,1,6) is false, footprintOf(5).locked is true. Verified with a scratch test (test_footprintRedefinitionReinterpretsPendingPlacement) that passes on this tree, i.e. the placement succeeds reinterpreted instead of reverting.","severity":"low","snippet":"        Footprint storage footprint = _footprints[id];\n        if (!footprint.set) revert NoFootprint();","title":"Placement data does not commit to the footprint: an owner setFootprint on a still-unlocked id reinterprets a pending placement into a different permanent piece"}],"hash":"ebe0167cffaaab2365154a1bd97838ac9a991fd83d8bfa4d361a63308b648958","nodeId":"04a26269-5ce4-43a4-a970-05d135975e77","outcome":"completed","summary":"Review complete. The findings file is at `.imd-findings.json` and nothing else in the tree changed.\n\n**Outcome.** The OGClubClubs rework is sound. Build, the 234-test suite and fmt --check all pass on this tree, runtime size is well under the EIP-170 limit, and launch.json is schema-shaped with eleven constructor words for OGClubClubs. I kept two low findings and dropped nothing that reproduced.\n\n**Finding 1, low, merged from three specialists.** The mainnet script only checks that the farm vault's token matches. A codeless SWARM_PEPES, FURNITURE, or non-zero DELEGATE_REGISTRY deploys an immutable contract that can never mint, never place, or never delegate. I ran the math specialist's proof and attached it: three of its tests fail on this tree exactly as described, and the live-dependency control passes. The economics finding and the flow registry note share this root cause, so they are one entry.\n\n**Finding 2, low, from the permissions specialist.** Placement data carries only clubId, x, y and rot, and the footprint is read live. If the owner rewrites an unlocked id's footprint between a user signing and the transaction being mined, the same four words become a different permanent piece. I reproduced this with a scratch test. It stays low because it needs the trusted owner to act and sits inside the requested lock rule, so the fix is the requester's design call.\n\n**Dropped.** The economics front-running note is by-design behavior the README already states, so it is not a defect. Every slither and aderyn medium-or-higher lead traced to a guarded path or a zero sentinel.\n\n**My own pass.** I traced mintClub, upgradeClub, placement masks for both walls and the floor, the door rules at every size, MAX_PIECES, the one-of-each rule and constructor rejections, and probed wall edges, the side-1 door interval, operator upgrades and rotated floor pieces at the 16x16 edge. All behaved as intended.\n\n**Coverage.** All 57 entry points answered, 55 holds and 2 pointing at finding 2, plus three invariant and manifest rows.","treeHash":null,"usage":{"cachedInputTokens":980960,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":23588,"runtime":"claude","turns":25,"wallClockMs":344754}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7313281793d3077","findings":[],"hash":"fca112b148f23ac33c1d2aea3743f8ccf0d90e82f9644079c2758f6fde3291e9","nodeId":"6c69cad5-4d66-4b87-a013-fed4cad151f2","outcome":"failed","summary":"the launch check failed, so this was not submitted:\nlaunch.json: OGClubClubs: expected 9 constructor arguments, got 11","treeHash":null,"usage":{"cachedInputTokens":4840064,"inputTokens":205226,"model":"gpt-6-astra","outputTokens":58030,"runtime":"codex","turns":16,"wallClockMs":1894659}}],"verification":[{"checks":[{"durationMs":11946,"exitCode":0,"name":"build","output":"Compiling 100 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.83s\nCompiler run successful!\n","passed":true},{"durationMs":50467,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/TokenFailureAtomicity.t.sol:TokenFailureAtomicityTest\n[PASS] test_FalseReturningPayoutPreservesEarlierClaimsAndAllReservations() (gas: 728445)\n[PASS] test_OneWeiExitDoesNotCallTheZeroNetRecipientTransfer() (gas: 294703)\n[PASS] test_PackedStakeOverflowRestoresTransferAndPendingPointState() (gas: 487274)\n[PASS] test_SecondUnstakeTransferFailureRestoresVaultFeeAndAccrualCheckpoint() (gas: 612686)\n[PASS] test_SenderSurchargeCannotConsumeAnotherSeasonsReservation() (gas: 1561673)\n[PASS] test_VaultAcceptsNoReturnTokensAndPaysOnlyTheProvenAccount() (gas: 644163)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.38ms (2.35ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171164)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 13424)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 633272)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 133297)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287694)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 161073)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 478701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.66ms (1.74ms CPU time)\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498277)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 808885)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384727)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 548202)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.96ms (2.75ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsPepeTest\n[PASS] test_ConstructorRejectsZeroPepesAndEachZeroUpgradePrice() (gas: 13006)\n[PASS] test_DelegationRevocationAndPepeTransferInvalidateOldHolderDelegations() (gas: 932343)\n[PASS] test_DisabledDelegationAndOwnerDoesNotCallRegistry() (gas: 687444)\n[PASS] test_NonexistentPepeRevertsAndSparseZeroMaxIdsArePreserved() (gas: 1056549)\n[PASS] test_OnlyPepeHolderOrExplicitDelegateMayMintAndCallerReceives() (gas: 1057993)\n[PASS] test_PepeAndClubTransfersNeverResetMintRight() (gas: 273338)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.40ms (3.58ms CPU time)\n\nRan 8 tests for test/ClubsLaunchRules.t.sol:ClubsLevelsTest\n[PASS] test_DoorAndFixedStrideAtEveryLevel() (gas: 1336876)\n[PASS] test_LevelsSizesExactOddSplitsAndEventsThroughMax() (gas: 741967)\n[PASS] test_MissingClubLevelSizeDesignWallViewsAndUpgradeRevert() (gas: 84601)\n[PASS] test_OnlyHolderOrApprovedMayUpgradeAndOperatorPays() (gas: 768953)\n[PASS] test_ShortUpgradeApprovalRollsBackLevelPaymentAndLayout() (gas: 428951)\n[PASS] test_TaxedFalseAndCallbackTokensOnUpgrade() (gas: 2233248)\n[PASS] test_UpgradeChecksBothFinalReceiptsAndRollsBackLevel() (gas: 1847075)\n[PASS] test_UpgradeKeepsTilesAndAllowsOnlyNewFrontRowsAndColumns() (gas: 2345635)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 6.65ms (5.12ms CPU time)\n\nRan 6 tests for test/Gas.t.sol:GasTest\n[PASS] test_GasClaimOne() (gas: 954101)\nLogs:\n  Claim one win / fresh furniture wallet\n  Cancun call gas: 160885\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 472565\n\n[PASS] test_GasClaimTen() (gas: 2860761)\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\nLogs:\n  Claim ten distinct items / fresh furniture wallet\n  Cancun call gas: 816170\n  New persistent slots: 22\n  EIP-8037 state gas: 2154240\n  EIP-8037 storage-repriced call gas: 2530410\n\n[PASS] test_GasDraw() (gas: 418645)\nLogs:\n  Draw / 23-field synthetic header\n  Cancun call gas: 74312\n  New persistent slots: 1\n  EIP-8037 state gas: 97920\n  EIP-8037 storage-repriced call gas: 152232\n\n[PASS] test_GasEnter() (gas: 558676)\nLogs:\n  First entry / ten tickets / first points checkpoint\n  Cancun call gas: 155364\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 467044\n\n[PASS] test_GasFirstStake() (gas: 200138)\nLogs:\n  First-ever stake / fresh staker\n  Cancun call gas: 120547\n  New persistent slots: 3\n  EIP-8037 state gas: 293760\n  EIP-8037 storage-repriced call gas: 354307\n\n[PASS] test_GasUnstake() (gas: 308132)\nLogs:\n  Partial unstake / first fee / first checkpoint\n  Cancun call gas: 110662\n  New persistent slots: 2\n  EIP-8037 state gas: 195840\n  EIP-8037 storage-repriced call gas: 266502\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 12.95ms (14.35ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsAndEvents() (gas: 3306358)\n[PASS] test_EndOfWallAtEverySizeAndPreservedAfterUpgrade() (gas: 4844951)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesClubTransfer() (gas: 1517053)\n[PASS] test_WallDoorIntervalsAndOtherSideIndependent() (gas: 1090680)\n[PASS] test_WallFlagAndDimensionsLockTogetherAcrossAllClubs() (gas: 1116705)\n[PASS] test_WallOverlapYSideAndIndependentFloorBitmap() (gas: 1357663)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 13.46ms (11.22ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependenciesOrAssignFactoryOwner() (gas: 45432)\n[PASS] test_InvalidConfigurationAndConstructorBounds() (gas: 8014)\n[PASS] test_MockIsDeliberatelyUnlimitedTestnetOnly() (gas: 77458)\n[PASS] test_SepoliaDeploymentAndOwnerSetup() (gas: 34864668)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 36.86ms (36.43ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558671, ~: 558520)\nLogs:\n  Bound result 7969\n\n[PASS] test_ActivationAtMaturityAndLastSecond() (gas: 512088)\n[PASS] test_CancelRevokeRegrantAndReproposal() (gas: 800981)\n[PASS] test_InvalidGrantDoesNotSpendBootstrapAndZeroAddressesRejected() (gas: 147761)\n[PASS] test_OnlyOwnerProposesCancelsAndRevokes() (gas: 406632)\n[PASS] test_OwnershipHandoverDoesNotResetBootstrapAndRenunciationDoesNotBlockActivation() (gas: 568368)\n[PASS] test_SpenderLastSecondActivates() (gas: 378503)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 40.23ms (40.20ms CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23506941)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14305080)\n[PASS] test_FactoryDecodesFlatManifestPriceWordsAsStaticTuple() (gas: 3753269)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10488870)\n[PASS] test_MainnetScriptDeploysFromKeyAndSafeOwnerConfiguresLater() (gas: 9372567)\nLogs:\n  OGClubClubs 0xCF75462c9e7fFf4eEB0c50185087a0fb9A056d2b\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df260000000000000000000000005991a2df15a8f6a256d3ec51e99254cd3fb576a90000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  vault 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  Swarm Pepes 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n  OWNER must call OGClubClubs with footprint calldata:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After configuring footprints/metadata, OWNER opens sale with calldata:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5769713)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14839)\n[PASS] test_SepoliaMockPepePublicMintUsesCallerAndRejectsDuplicateIds() (gas: 2848432)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18414522)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 43.45ms (95.45ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596150, ~: 595918)\nLogs:\n  Bound result 7792\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169365, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394671)\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: 546001)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 569038)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 457168)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535486)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340672)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 56.10ms (68.91ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352168, ~: 1352235)\nLogs:\n  Bound result 162514264337593544029563\n  Bound result 80744578297060961413686\n\n[PASS] test_CancelBeforeOpenOnlyReleasesReserveWithoutTransferring() (gas: 561805)\n[PASS] test_ClaimLastSecondBeforeExpirationAndPartialRelease() (gas: 397391)\n[PASS] test_DelayExactBoundaryAndPermissionlessClaimPaidToAccountOnly() (gas: 442808)\n[PASS] test_FailedTokenTransferRestoresClaimAndReservations() (gas: 727404)\n[PASS] test_HalfCapUsesOnlyUnreservedBalanceAndFloorsOddWei() (gas: 472822)\n[PASS] test_InvalidRecipientsAndZeroAllocation() (gas: 482033)\n[PASS] test_InvalidSeasonRootAndTotal() (gas: 164553)\n[PASS] test_OnlyOwnerCanProposeCancelAndNoSweepOrApprovalOrPause() (gas: 165634)\n[PASS] test_OwnerCallbackCannotReserveAgainstAnInFlightPayout() (gas: 625341)\n[PASS] test_OwnershipHandoverPreservesSeasons() (gas: 415758)\n[PASS] test_ProofRejectsWrongAccountAmountSeasonAndSingleHash() (gas: 898876)\n[PASS] test_ProposalIntervalAtExactBoundaryIncludingAfterCancel() (gas: 441729)\n[PASS] test_ReleaseExactly90DaysAfterOpeningAndNeverWithdrawsTokens() (gas: 562741)\n[PASS] test_TokenCallbackCannotClaimTwice() (gas: 521104)\n[PASS] test_TotalBudgetCapsEvenInconsistentMerkleTree() (gas: 355026)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 61.23ms (62.40ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32990, ~: 32222)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 92628, ~: 73169)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 321913)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147737)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237524)\n[PASS] test_RealMainnetCancunHeader() (gas: 543993)\n[PASS] test_RealMainnetPragueHeader() (gas: 547036)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 538038)\n[PASS] test_RealSepoliaHeaderWithAccessListHashAndSlotNumber() (gas: 550588)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40712)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 77.09ms (76.21ms CPU time)\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98LevelOneFloorTilesFillAndNoFurtherFloorPieceFits() (gas: 36437665)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263609)\n[PASS] test_ClubFullIsReachedBy285DistinctRealPieces() (gas: 89130108)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 738492)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158861)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 759733)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 348438)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742648)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1314425)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2655350)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2081214)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219572)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 779083)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 204905)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 85.05ms (88.74ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19116, ~: 18129)\nLogs:\n  Bound result 1239\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 622510, ~: 378494)\nLogs:\n  Bound result 1\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 166.01ms (174.77ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1670786, ~: 1001701)\nLogs:\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241150, ~: 240936)\nLogs:\n  Bound result 17954\n\n[PASS] test_ClaimToCannotRedirectAnotherWalletInTheSameBatch() (gas: 1239609)\n[PASS] test_ContractWalletCanRedirectButNobodyElseCan() (gas: 2015153)\n[PASS] test_DrawHeaderAndTargetExactBoundaries() (gas: 641712)\n[PASS] test_DuplicateWithinBatchRollsBackEverythingAndBitmapCrossesWords() (gas: 937264)\n[PASS] test_EntryFailureRollsBackRangesCapsAndPoints() (gas: 833603)\n[PASS] test_EntryWindowAndWalletCapExactBoundaries() (gas: 808341)\n[PASS] test_HugeTicketAndPrizeCountsDoNotRequireIterationToDrawOrClaim() (gas: 925425)\n[PASS] test_InvalidConfigurationPoolsLinesAndTickets() (gas: 941928)\n[PASS] test_Maximum32PoolsAnd128PrizeLines() (gas: 15557738)\n[PASS] test_MultiItemPoolMintsExactQuantitiesIncludingDuplicateAndZeroIds() (gas: 2370129)\n[PASS] test_NoticeExactBoundariesAndCancellation() (gas: 540021)\n[PASS] test_OwnerCannotModifyTermsPauseOrCancelStartedRaffle() (gas: 450829)\n[PASS] test_ReceiverCannotReenterEitherClaimPath() (gas: 1991045)\n[PASS] test_RejectingWalletDoesNotBlockOtherWinnersAndEmptyClaimRejected() (gas: 2030167)\n[PASS] test_RetargetOnlyAt257AndOldHeaderCannotDrawNewTarget() (gas: 560166)\n[PASS] test_RevokedMinterClaimIsRetryableAndDoesNotReroll() (gas: 1017518)\n[PASS] test_TicketPriceMultiplicationOverflowDoesNotSpendOrRecordEntry() (gas: 370843)\n[PASS] test_UnlimitedCapIsPerPoolAndRangesStayContiguous() (gas: 878602)\n[PASS] test_UnsoldPrizesAreRandomPositionsNotAlwaysTheTail() (gas: 3336643)\n[PASS] test_WrongKEntryAndDoubleClaimsRevertAtomically() (gas: 1332250)\n[PASS] test_WrongNumberInAuthenticatedHeaderRejected() (gas: 365306)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 231.89ms (273.48ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1193106, ~: 958599)\nLogs:\n  Bound result 702884306557409044225\n  Bound result 20\n  Bound result 1\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283055, ~: 283076)\nLogs:\n  Bound result 2597\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219247, ~: 1219445)\nLogs:\n  Bound result 1\n  Bound result 1001\n  Bound result 1000\n\n[PASS] test_AccrueBeforeBalanceChangesAndNoLock() (gas: 427758)\n[PASS] test_CheckpointsPreserveSubWeiAccrualAndFullExitFraction() (gas: 1366740)\n[PASS] test_DecimalsReadOnFirstUseAndNormalizeWholeTokens() (gas: 2190760)\n[PASS] test_DonationsNeitherCreateStakeNorAwardPoints() (gas: 343342)\n[PASS] test_ExactContinuousAccrualAtBoundariesAndSpend() (gas: 299793)\n[PASS] test_FeeOnTransferCreditsOnlyReceivedAndCannotInflatePoints() (gas: 381142)\n[PASS] test_InvalidAmountsUnauthorizedSpendAndOwnerCannotTouchStakes() (gas: 406963)\n[PASS] test_MaximumPackedBalanceAndRateAccrueWithoutIntermediateOverflow() (gas: 448069)\n[PASS] test_NoReturnAndFalseReturnTokens() (gas: 734103)\n[PASS] test_TinyUnstakesAlwaysPayFee() (gas: 360201)\n[PASS] test_TokenCallbackCannotSpendOrReenterStakeOrUnstake() (gas: 685618)\n[PASS] test_ZeroReceiptAndSenderSideFeeRevertAtomically() (gas: 554565)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 231.88ms (337.56ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2450037, ~: 2277993)\nLogs:\n  Bound result 56\n  Bound result 8\n\n[PASS] test_ClosedSaleAndRemovedMintEntryPoints() (gas: 167051)\n[PASS] test_ConstructorRejectsBurnTokenAndFurnitureVaultAliases() (gas: 18844)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 902043)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208150)\n[PASS] test_NonReceiverRollsBackPaymentAndMintRight() (gas: 946013)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1459738)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1819383)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242430)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 386343)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1785014)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1829125)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 699363)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 257.94ms (258.75ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3695604, ~: 3693663)\nLogs:\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 5\n\n[PASS] test_ClaimBitmapIsIndependentAcrossRafflesAndPools() (gas: 2082130)\n[PASS] test_LateInvalidEntryRollsBackAnEarlierWalletMint() (gas: 1264278)\n[PASS] test_LateInvalidPoolCreationDoesNotLeaveRaffleOrPrizeStorage() (gas: 507505)\n[PASS] test_LateReceiverRejectionRollsBackPreviouslyMintedWalletGroup() (gas: 2144305)\n[PASS] test_PrizeLimitAppliesToSumAcrossLinesAndRollbackAllowsReuse() (gas: 498160)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 290.69ms (292.23ms CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS] invariant_VaultAlwaysCoversReservationsAndOnlyClaimsMoveTokens() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1374  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1373  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1376  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1352  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1374  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 604800\n  Bound result 100000000000000000000\n  Bound result 259200\n  Bound result 345600\n  Bound result 100000000000000000000\n  Bound result 8035200\n  Bound result 0\n  Bound result 3523\n  Bound result 5512\n  Bound result 514264337593543950335\n  Bound result 3175\n  Bound result 516511246473864845776\n  Bound result 4173385\n  Bound result 107327769457796578095\n  Bound result 3353629921\n  Bound result 514264337593543950335\n  Bound result 291\n  Bound result 3196\n  Bound result 4743\n  Bound result 514264337593543950335\n  Bound result 3\n  Bound result 1020\n  Bound result 4080123454\n  Bound result 1001\n  Bound result 432000\n  Bound result 3\n  Bound result 434\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 61\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.36s (1.35s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:StakingInvariantTest\n[PASS]\nStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n StakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 708481\n  Bound result 0\n  Bound result 1001\n  Bound result 515187631088016022448\n  Bound result 1001\n  Bound result 13092\n  Bound result 1001\n  Bound result 2852\n  Bound result 50000\n  Bound result 1343\n  Bound result 6107\n  Bound result 6\n  Bound result 39\n  Bound result 1305\n  Bound result 6727\n  Bound result 3873\n  Bound result 352\n  Bound result 4318\n  Bound result 1001\n  Bound result 538\n  Bound result 284988\n  Bound result 9999999999999999999\n  Bound result 3098\n  Bound result 1968\n  Bound result 2151\n  Bound result 522\n  Bound result 268487\n  Bound result 684972\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 210573034876432390591\n  Bound result 7188\n  Bound result 6209\n  Bound result 429\n  Bound result 514264337593543950335\n  Bound result 1638\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 298838759362407052202\n  Bound result 133500578918857468860\n  Bound result 1602803858480664906\n  Bound result 244082\n  Bound result 61\n  Bound result 1001\n  Bound result 5727\n  Bound result 4384\n  Bound result 6518\n  Bound result 1001\n  Bound result 624537\n  Bound result 5000\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.76s (1.75s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:FeeStakingInvariantTest\n[PASS]\nFeeStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n FeeStakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 708481\n  Bound result 0\n  Bound result 1001\n  Bound result 992035287276763398606\n  Bound result 1001\n  Bound result 13092\n  Bound result 107\n  Bound result 2947\n  Bound result 628253110210613192345\n  Bound result 50000\n  Bound result 7703\n  Bound result 6276\n  Bound result 6\n  Bound result 6043\n  Bound result 1357\n  Bound result 7114\n  Bound result 100\n  Bound result 352\n  Bound result 757\n  Bound result 1001\n  Bound result 999\n  Bound result 666\n  Bound result 2146\n  Bound result 3477\n  Bound result 1968\n  Bound result 115329\n  Bound result 1786308994\n  Bound result 268487\n  Bound result 59821\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 6264309386517457430\n  Bound result 7622\n  Bound result 3918\n  Bound result 887\n  Bound result 514264337593543950335\n  Bound result 1719\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 136889725343513773354\n  Bound result 88834227089289047847\n  Bound result 978269022990735722\n  Bound result 4006\n  Bound result 5683\n  Bound result 1001\n  Bound result 691673\n  Bound result 2778\n  Bound result 3463\n  Bound result 1001\n  Bound result 885\n  Bound result 5000\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.87s (1.87s CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 230617, ~: 233134)\nLogs:\n  Bound result 3\n  Bound result 4\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1360550, ~: 1137927)\nLogs:\n  Bound result 6936\n  Bound result 1\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134909)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1062479)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 834105)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1551477)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 904418)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 663694)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 232113)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746305)\n[PASS] test_FullLevelOneFloorRejectsFurtherFloorPieces() (gas: 28387989)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142453)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73360)\n[PASS] test_InterfacesAndImmutables() (gas: 141924)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649235)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360774)\n[PASS] test_MintPaysFromCallerAndClosedSaleStopsMinting() (gas: 627750)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196660)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489516)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 360548)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1208562)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239550)\n[PASS] test_PepeHolderWithoutReceiverRollsBack() (gas: 453097)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1387414)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 283996)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1481462)\n[PASS] test_TileTakenViewBounds() (gas: 56766)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1116131)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1013594)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 449699)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 4.11s (297.42ms CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomLevelsWallsRotationsAndDesignsMatchIndependentModel(bytes32,uint8) (runs: 256, μ: 125378917, ~: 117702000)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.35s (4.35s 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                     | 1052  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1127  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1131  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1094  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 640\n  Bound result 1\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 697\n  Bound result 19\n  Bound result 7\n  Bound result 14\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 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 19\n  Bound result 7\n  Bound result 4\n  Bound result 7\n  Bound result 19\n  Bound result 0\n  Bound result 4\n  Bound result 7\n  Bound result 5\n  Bound result 1\n  Bound result 12\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 14\n  Bound result 1\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 21\n  Bound result 0\n  Bound result 332\n  Bound result 832\n  Bound result 5\n  Bound result 17\n  Bound result 14\n  Bound result 8\n  Bound result 1\n  Bound result 4\n  Bound result 20\n  Bound result 14\n  Bound result 6\n  Bound result 54\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 18\n  Bound result 0\n  Bound result 7\n  Bound result 45\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 9\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 14\n  Bound result 849\n  Bound result 0\n  Bound result 9\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.72s (4.72s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:TaxedFeeFlowInvariantTest\n[PASS]\nTaxedFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n TaxedFeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 999899\n  Bound result 247\n  Bound result 66938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 779855598\n  Bound result 2106\n  Bound result 3940678358\n  Bound result 19\n  Bound result 77675158203\n  Bound result 41720144402\n  Bound result 7202\n  Bound result 200\n  Bound result 320\n  Bound result 1001\n  Bound result 24576\n  Bound result 209564915630\n  Bound result 98\n  Bound result 13788\n  Bound result 14824841797\n  Bound result 1001\n  Bound result 6344728\n  Bound result 1774\n  Bound result 1519\n  Bound result 286347534096\n  Bound result 13\n  Bound result 1786\n  Bound result 25561227919\n  Bound result 1111211\n  Bound result 9991\n  Bound result 98\n  Bound result 38\n  Bound result 57843034772\n  Bound result 944639575335\n  Bound result 53504807218\n  Bound result 873791607185\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.66s (6.65s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:FeeFlowInvariantTest\n[PASS]\nFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n FeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 999899\n  Bound result 247\n  Bound result 31938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 6907\n  Bound result 1978\n  Bound result 1520\n  Bound result 19\n  Bound result 70175158203\n  Bound result 49999993093\n  Bound result 6450\n  Bound result 200\n  Bound result 821\n  Bound result 1001\n  Bound result 24576\n  Bound result 209564904619\n  Bound result 1001\n  Bound result 98\n  Bound result 6768\n  Bound result 29824841797\n  Bound result 1001\n  Bound result 6344728\n  Bound result 1221973\n  Bound result 1455\n  Bound result 1001\n  Bound result 309564897851\n  Bound result 13\n  Bound result 1730\n  Bound result 1051\n  Bound result 98\n  Bound result 78\n  Bound result 503643002658\n  Bound result 133604967895\n  Bound result 503643002678\n  Bound result 201666195814\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.76s (6.76s CPU time)\n\nRan 1 test for test/ClubsAdversarialInvariant.t.sol:ClubsAdversarialInvariantTest\n[PASS]\nClubsAdversarialInvariantTest invariants:\n[PASS] invariant_LayoutsFitNeverOverlapNeverCoverDoor\n[PASS] invariant_LockedFootprintsNeverChange\n[PASS] invariant_NoTokensEverHeldAndSplitConserved\n[PASS] invariant_PiecesEqualCustodyPerItem\n ClubsAdversarialInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-------------------------+--------------+-------+---------+----------╮\n| Contract                | Selector     | Calls | Reverts | Discards |\n+=====================================================================+\n| AdversarialClubsHandler | approveClub  | 797   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 874   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 782   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 856   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 787   | 0       | 0        |\n╰-------------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 11\n  Bound result 10\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 6\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 2\n  Bound result 11\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 8\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.58s (16.57s CPU time)\n\nRan 1 test for test/RaffleSequenceInvariant.t.sol:RaffleSequenceInvariantTest\n[PASS]\nRaffleSequenceInvariantTest invariants:\n[PASS] invariant_ClaimBitsMatchMintReceiptsAndNeverMintUnawardedPrizes\n[PASS] invariant_FinalizedDrawsAndTermsNeverChange\n[PASS] invariant_PointsSpentExactlyMatchAcceptedRanges\n RaffleSequenceInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭-----------------------+----------+-------+---------+----------╮\n| Contract              | Selector | Calls | Reverts | Discards |\n+===============================================================+\n| RaffleSequenceHandler | advance  | 1521  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1542  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1563  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1520  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1558  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1517  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1555  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1512  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86400\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 1\n  Bound result 86400\n  Bound result 0\n  Bound result 4\n  Bound result 16\n  Bound result 86\n  Bound result 103\n  Bound result 7316\n  Bound result 17\n  Bound result 3\n  Bound result 55259\n  Bound result 68\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 256\n  Bound result 5435\n  Bound result 42\n  Bound result 5\n  Bound result 1\n  Bound result 4799\n  Bound result 196\n  Bound result 3927\n  Bound result 263\n  Bound result 183\n  Bound result 3\n  Bound result 225\n  Bound result 10001\n  Bound result 68\n  Bound result 7\n  Bound result 2\n  Bound result 172751\n  Bound result 148\n  Bound result 59\n  Bound result 3783\n  Bound result 56\n  Bound result 6\n  Bound result 2\n  Bound result 1572\n  Bound result 81\n  Bound result 114\n  Bound result 255\n  Bound result 2\n  Bound result 1985\n  Bound result 204\n  Bound result 10\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.93s (38.93s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_LayoutsFitDoorsRemainClearDesignsAreUniqueAndCustodyMatches\n[PASS] invariant_PaymentsNeverRemainInClubsAndAllMintUpgradeSplitsAreConserved\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+-------------------------+-------+---------+----------╮\n| Contract     | Selector                | Calls | Reverts | Discards |\n+=====================================================================+\n| ClubsHandler | mint                    | 1348  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | place                   | 1353  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | sale                    | 1375  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferClub            | 1387  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferPepeAndTryAgain | 1340  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | upgrade                 | 1389  | 0       | 0        |\n╰--------------+-------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 50.36s (50.35s CPU time)\n\nRan 30 test suites in 50.36s (139.08s CPU time): 219 tests passed, 0 failed, 0 skipped (219 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub(uint256)\",\"OGClubClubs.onERC1155Received(address,address,uint256,uint256,bytes)\",\"OGClubClubs.renounceOwnership()\",\"OGClubClubs.safeTransferFrom(address,address,uint256)\",\"OGClubClubs.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubClubs.setApprovalForAll(address,bool)\",\"OGClubClubs.setBaseURI(string)\",\"OGClubClubs.setFootprint(uint256,uint8,uint8,bool)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"OGClubClubs.upgradeClub(uint256)\",\"OGClubFarmVault.acceptOwnership()\",\"OGClubFarmVault.cancelSeason(uint256)\",\"OGClubFarmVault.claim(uint256,address,uint256,bytes32[])\",\"OGClubFarmVault.proposeSeason(bytes32,uint256)\",\"OGClubFarmVault.releaseSeason(uint256)\",\"OGClubFarmVault.renounceOwnership()\",\"OGClubFarmVault.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)\",\"OGClubRaffle.acceptOwnership()\",\"OGClubRaffle.cancelRaffle(uint256)\",\"OGClubRaffle.claim(uint256,uint256,(uint256,uint256)[])\",\"OGClubRaffle.claimTo(uint256,uint256,(uint256,uint256)[],address)\",\"OGClubRaffle.commitDraw(uint256)\",\"OGClubRaffle.createRaffle(uint256,uint256,(uint8,uint256,uint256,(uint256,uint256)[])[])\",\"OGClubRaffle.draw(uint256,bytes)\",\"OGClubRaffle.enter(uint256,uint256,uint256)\",\"OGClubRaffle.renounceOwnership()\",\"OGClubRaffle.transferOwnership(address)\",\"OGClubStaking.acceptOwnership()\",\"OGClubStaking.activateSpender(address)\",\"OGClubStaking.cancelSpender(address)\",\"OGClubStaking.grantSpender(address)\",\"OGClubStaking.renounceOwnership()\",\"OGClubStaking.revokeSpender(address)\",\"OGClubStaking.spendPoints(address,uint256)\",\"OGClubStaking.stake(uint256)\",\"OGClubStaking.transferOwnership(address)\",\"OGClubStaking.unstake(uint256)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":126,\"README.md\":496,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":203,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":385,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/interfaces/IDelegateRegistry.sol\":10,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"src/mocks/MockSwarmPepe.sol\":13,\"test/ADDITIONAL_COVERAGE.md\":55,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":716,\"test/ClubsAdversarialInvariant.t.sol\":458,\"test/ClubsDeployment.t.sol\":307,\"test/ClubsInvariant.t.sol\":436,\"test/ClubsLaunchRules.t.sol\":571,\"test/ClubsPlacement.t.sol\":364,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":170,\"test/OGClubClubs.t.sol\":570,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsTestBase.sol\":78,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/PepeMocks.sol\":28,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":70},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4de2afb138c61f745bc5e6550d2167199a5231bdb1e82081517a51fc8b26876d","verifiedTreeHash":"d93b8c1fcb8f70a1e1133e6a99bffe5813136862","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":34840,"exitCode":0,"name":"build","output":"Compiling 105 files with Solc 0.8.26\nSolc 0.8.26 finished in 34.60s\nCompiler run successful!\n","passed":true},{"durationMs":75278,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171164)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 13424)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 633272)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 133297)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287694)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 161073)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 478701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 5.25ms (2.19ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsPepeTest\n[PASS] test_ConstructorRejectsZeroPepesAndEachZeroUpgradePrice() (gas: 13006)\n[PASS] test_DelegationRevocationAndPepeTransferInvalidateOldHolderDelegations() (gas: 932343)\n[PASS] test_DisabledDelegationAndOwnerDoesNotCallRegistry() (gas: 687444)\n[PASS] test_NonexistentPepeRevertsAndSparseZeroMaxIdsArePreserved() (gas: 1056549)\n[PASS] test_OnlyPepeHolderOrExplicitDelegateMayMintAndCallerReceives() (gas: 1057993)\n[PASS] test_PepeAndClubTransfersNeverResetMintRight() (gas: 273338)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 7.31ms (3.44ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsAndEvents() (gas: 3306358)\n[PASS] test_EndOfWallAtEverySizeAndPreservedAfterUpgrade() (gas: 4844951)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesClubTransfer() (gas: 1517053)\n[PASS] test_WallDoorIntervalsAndOtherSideIndependent() (gas: 1090680)\n[PASS] test_WallFlagAndDimensionsLockTogetherAcrossAllClubs() (gas: 1116705)\n[PASS] test_WallOverlapYSideAndIndependentFloorBitmap() (gas: 1357663)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.50ms (7.94ms CPU time)\n\nRan 6 tests for test/TokenFailureAtomicity.t.sol:TokenFailureAtomicityTest\n[PASS] test_FalseReturningPayoutPreservesEarlierClaimsAndAllReservations() (gas: 728445)\n[PASS] test_OneWeiExitDoesNotCallTheZeroNetRecipientTransfer() (gas: 294703)\n[PASS] test_PackedStakeOverflowRestoresTransferAndPendingPointState() (gas: 487274)\n[PASS] test_SecondUnstakeTransferFailureRestoresVaultFeeAndAccrualCheckpoint() (gas: 612686)\n[PASS] test_SenderSurchargeCannotConsumeAnotherSeasonsReservation() (gas: 1561673)\n[PASS] test_VaultAcceptsNoReturnTokensAndPaysOnlyTheProvenAccount() (gas: 644163)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 12.24ms (3.56ms CPU time)\n\nRan 6 tests for test/Gas.t.sol:GasTest\n[PASS] test_GasClaimOne() (gas: 954101)\nLogs:\n  Claim one win / fresh furniture wallet\n  Cancun call gas: 160885\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 472565\n\n[PASS] test_GasClaimTen() (gas: 2860761)\nLogs:\n  Claim ten distinct items / fresh furniture wallet\n  Cancun call gas: 816170\n  New persistent slots: 22\n  EIP-8037 state gas: 2154240\n  EIP-8037 storage-repriced call gas: 2530410\n\n[PASS] test_GasDraw() (gas: 418645)\nLogs:\n  Draw / 23-field synthetic header\n  Cancun call gas: 74312\n  New persistent slots: 1\n  EIP-8037 state gas: 97920\n  EIP-8037 storage-repriced call gas: 152232\n\n[PASS] test_GasEnter() (gas: 558676)\nLogs:\n  First entry / ten tickets / first points checkpoint\n  Cancun call gas: 155364\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 467044\n\n[PASS] test_GasFirstStake() (gas: 200138)\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\nLogs:\n  First-ever stake / fresh staker\n  Cancun call gas: 120547\n  New persistent slots: 3\n  EIP-8037 state gas: 293760\n  EIP-8037 storage-repriced call gas: 354307\n\n[PASS] test_GasUnstake() (gas: 308132)\nLogs:\n  Partial unstake / first fee / first checkpoint\n  Cancun call gas: 110662\n  New persistent slots: 2\n  EIP-8037 state gas: 195840\n  EIP-8037 storage-repriced call gas: 266502\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 20.53ms (19.19ms CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23506941)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14305080)\n[PASS] test_FactoryDecodesFlatManifestPriceWordsAsStaticTuple() (gas: 3753269)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10488870)\n[PASS] test_MainnetScriptDeploysFromKeyAndSafeOwnerConfiguresLater() (gas: 9372567)\nLogs:\n  OGClubClubs 0xCF75462c9e7fFf4eEB0c50185087a0fb9A056d2b\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df260000000000000000000000005991a2df15a8f6a256d3ec51e99254cd3fb576a90000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  vault 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  Swarm Pepes 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n  OWNER must call OGClubClubs with footprint calldata:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After configuring footprints/metadata, OWNER opens sale with calldata:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5769713)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14839)\n[PASS] test_SepoliaMockPepePublicMintUsesCallerAndRejectsDuplicateIds() (gas: 2848432)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18414522)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 49.46ms (89.91ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558671, ~: 558520)\nLogs:\n  Bound result 7969\n\n[PASS] test_ActivationAtMaturityAndLastSecond() (gas: 512088)\n[PASS] test_CancelRevokeRegrantAndReproposal() (gas: 800981)\n[PASS] test_InvalidGrantDoesNotSpendBootstrapAndZeroAddressesRejected() (gas: 147761)\n[PASS] test_OnlyOwnerProposesCancelsAndRevokes() (gas: 406632)\n[PASS] test_OwnershipHandoverDoesNotResetBootstrapAndRenunciationDoesNotBlockActivation() (gas: 568368)\n[PASS] test_SpenderLastSecondActivates() (gas: 378503)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 74.43ms (73.83ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependenciesOrAssignFactoryOwner() (gas: 45432)\n[PASS] test_InvalidConfigurationAndConstructorBounds() (gas: 8014)\n[PASS] test_MockIsDeliberatelyUnlimitedTestnetOnly() (gas: 77458)\n[PASS] test_SepoliaDeploymentAndOwnerSetup() (gas: 34864668)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 101.07ms (100.16ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32994, ~: 32222)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 91529, ~: 73433)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 321913)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147737)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237524)\n[PASS] test_RealMainnetCancunHeader() (gas: 543993)\n[PASS] test_RealMainnetPragueHeader() (gas: 547036)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 538038)\n[PASS] test_RealSepoliaHeaderWithAccessListHashAndSlotNumber() (gas: 550588)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40712)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 103.94ms (98.46ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352168, ~: 1352235)\nLogs:\n  Bound result 162514264337593544029563\n  Bound result 80744578297060961413686\n\n[PASS] test_CancelBeforeOpenOnlyReleasesReserveWithoutTransferring() (gas: 561805)\n[PASS] test_ClaimLastSecondBeforeExpirationAndPartialRelease() (gas: 397391)\n[PASS] test_DelayExactBoundaryAndPermissionlessClaimPaidToAccountOnly() (gas: 442808)\n[PASS] test_FailedTokenTransferRestoresClaimAndReservations() (gas: 727404)\n[PASS] test_HalfCapUsesOnlyUnreservedBalanceAndFloorsOddWei() (gas: 472822)\n[PASS] test_InvalidRecipientsAndZeroAllocation() (gas: 482033)\n[PASS] test_InvalidSeasonRootAndTotal() (gas: 164553)\n[PASS] test_OnlyOwnerCanProposeCancelAndNoSweepOrApprovalOrPause() (gas: 165634)\n[PASS] test_OwnerCallbackCannotReserveAgainstAnInFlightPayout() (gas: 625341)\n[PASS] test_OwnershipHandoverPreservesSeasons() (gas: 415758)\n[PASS] test_ProofRejectsWrongAccountAmountSeasonAndSingleHash() (gas: 898876)\n[PASS] test_ProposalIntervalAtExactBoundaryIncludingAfterCancel() (gas: 441729)\n[PASS] test_ReleaseExactly90DaysAfterOpeningAndNeverWithdrawsTokens() (gas: 562741)\n[PASS] test_TokenCallbackCannotClaimTwice() (gas: 521104)\n[PASS] test_TotalBudgetCapsEvenInconsistentMerkleTree() (gas: 355026)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 112.25ms (113.98ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596142, ~: 595918)\nLogs:\n  Bound result 7792\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169367, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394671)\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: 546001)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 569038)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 457168)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535486)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340672)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 116.80ms (118.43ms CPU time)\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98LevelOneFloorTilesFillAndNoFurtherFloorPieceFits() (gas: 36437665)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263609)\n[PASS] test_ClubFullIsReachedBy285DistinctRealPieces() (gas: 89130108)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 738492)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158861)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 759733)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 348438)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742648)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1314425)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2655350)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2081214)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219572)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 779083)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 204905)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 155.36ms (159.49ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2498522, ~: 2278089)\nLogs:\n  Bound result 281474976710655\n  Bound result 8\n\n[PASS] test_ClosedSaleAndRemovedMintEntryPoints() (gas: 167051)\n[PASS] test_ConstructorRejectsBurnTokenAndFurnitureVaultAliases() (gas: 18844)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 902043)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208150)\n[PASS] test_NonReceiverRollsBackPaymentAndMintRight() (gas: 946013)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1459738)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1819383)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242430)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 386343)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1785014)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1829125)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 699363)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 397.06ms (399.22ms CPU time)\n\nRan 3 tests for test/ClubsOccupancy.t.sol:ClubsOccupancyTest\n[PASS] testFuzz_WholeWordsMatchEveryPublicCell(uint256,uint64,uint8) (runs: 128, μ: 3502640, ~: 3388121)\n[PASS] test_ReaderIncludesHiddenCellsAndUnusedWallBits() (gas: 715373)\n[PASS] test_SparseClubIdsDiscoverIndependentSlotsAndPreserveExistingOccupancy() (gas: 2065470)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 562.44ms (560.06ms CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 230766, ~: 233134)\nLogs:\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1340576, ~: 1137225)\nLogs:\n  Bound result 6936\n  Bound result 1\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134909)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1062479)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 834105)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1551477)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 904418)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 663694)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 232113)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746305)\n[PASS] test_FullLevelOneFloorRejectsFurtherFloorPieces() (gas: 28387989)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142453)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73360)\n[PASS] test_InterfacesAndImmutables() (gas: 141924)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649235)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360774)\n[PASS] test_MintPaysFromCallerAndClosedSaleStopsMinting() (gas: 627750)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196660)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489516)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 360548)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1208562)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239550)\n[PASS] test_PepeHolderWithoutReceiverRollsBack() (gas: 453097)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1387414)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 283996)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1481462)\n[PASS] test_TileTakenViewBounds() (gas: 56766)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1116131)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1013594)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 449699)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 586.63ms (623.23ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19343, ~: 18129)\nLogs:\n  Bound result 2045060\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 584612, ~: 123142)\nLogs:\n  Bound result 190\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 585.48ms (585.47ms CPU time)\n\nRan 3 tests for test/ClubsAtomicTransitions.t.sol:ClubsPriceBoundaryTest\n[PASS] testFuzz_IndependentPricesChargeExactCallerBalances(uint256,uint256,uint256,uint256) (runs: 512, μ: 3173517, ~: 3173665)\nLogs:\n  Bound result 1725290\n  Bound result 7478180803093667239623232487443935573067852934521690608\n  Bound result 128261779\n  Bound result 36071378070140254294684760728387266226932106270203326015065\n\n[PASS] test_MaximumTotalSupplyAndAlmostMaximumUpgradePrice() (gas: 3151700)\n[PASS] test_OneWeiMintAndUpgradesWorkWithNoReturnToken() (gas: 2400508)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 705.40ms (711.87ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1677652, ~: 999145)\nLogs:\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241143, ~: 240936)\nLogs:\n  Bound result 17954\n\n[PASS] test_ClaimToCannotRedirectAnotherWalletInTheSameBatch() (gas: 1239609)\n[PASS] test_ContractWalletCanRedirectButNobodyElseCan() (gas: 2015153)\n[PASS] test_DrawHeaderAndTargetExactBoundaries() (gas: 641712)\n[PASS] test_DuplicateWithinBatchRollsBackEverythingAndBitmapCrossesWords() (gas: 937264)\n[PASS] test_EntryFailureRollsBackRangesCapsAndPoints() (gas: 833603)\n[PASS] test_EntryWindowAndWalletCapExactBoundaries() (gas: 808341)\n[PASS] test_HugeTicketAndPrizeCountsDoNotRequireIterationToDrawOrClaim() (gas: 925425)\n[PASS] test_InvalidConfigurationPoolsLinesAndTickets() (gas: 941928)\n[PASS] test_Maximum32PoolsAnd128PrizeLines() (gas: 15557738)\n[PASS] test_MultiItemPoolMintsExactQuantitiesIncludingDuplicateAndZeroIds() (gas: 2370129)\n[PASS] test_NoticeExactBoundariesAndCancellation() (gas: 540021)\n[PASS] test_OwnerCannotModifyTermsPauseOrCancelStartedRaffle() (gas: 450829)\n[PASS] test_ReceiverCannotReenterEitherClaimPath() (gas: 1991045)\n[PASS] test_RejectingWalletDoesNotBlockOtherWinnersAndEmptyClaimRejected() (gas: 2030167)\n[PASS] test_RetargetOnlyAt257AndOldHeaderCannotDrawNewTarget() (gas: 560166)\n[PASS] test_RevokedMinterClaimIsRetryableAndDoesNotReroll() (gas: 1017518)\n[PASS] test_TicketPriceMultiplicationOverflowDoesNotSpendOrRecordEntry() (gas: 370843)\n[PASS] test_UnlimitedCapIsPerPoolAndRangesStayContiguous() (gas: 878602)\n[PASS] test_UnsoldPrizesAreRandomPositionsNotAlwaysTheTail() (gas: 3336643)\n[PASS] test_WrongKEntryAndDoubleClaimsRevertAtomically() (gas: 1332250)\n[PASS] test_WrongNumberInAuthenticatedHeaderRejected() (gas: 365306)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 782.16ms (834.83ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3718505, ~: 3702422)\nLogs:\n  Bound result 4\n  Bound result 1\n  Bound result 6\n  Bound result 3\n\n[PASS] test_ClaimBitmapIsIndependentAcrossRafflesAndPools() (gas: 2082130)\n[PASS] test_LateInvalidEntryRollsBackAnEarlierWalletMint() (gas: 1264278)\n[PASS] test_LateInvalidPoolCreationDoesNotLeaveRaffleOrPrizeStorage() (gas: 507505)\n[PASS] test_LateReceiverRejectionRollsBackPreviouslyMintedWalletGroup() (gas: 2144305)\n[PASS] test_PrizeLimitAppliesToSumAcrossLinesAndRollbackAllowsReuse() (gas: 498160)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 879.41ms (881.83ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1194040, ~: 941481)\nLogs:\n  Bound result 702884306557409044225\n  Bound result 48\n  Bound result 1\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283055, ~: 283076)\nLogs:\n  Bound result 2597\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219237, ~: 1219445)\nLogs:\n  Bound result 1\n  Bound result 1001\n  Bound result 1000\n\n[PASS] test_AccrueBeforeBalanceChangesAndNoLock() (gas: 427758)\n[PASS] test_CheckpointsPreserveSubWeiAccrualAndFullExitFraction() (gas: 1366740)\n[PASS] test_DecimalsReadOnFirstUseAndNormalizeWholeTokens() (gas: 2190760)\n[PASS] test_DonationsNeitherCreateStakeNorAwardPoints() (gas: 343342)\n[PASS] test_ExactContinuousAccrualAtBoundariesAndSpend() (gas: 299793)\n[PASS] test_FeeOnTransferCreditsOnlyReceivedAndCannotInflatePoints() (gas: 381142)\n[PASS] test_InvalidAmountsUnauthorizedSpendAndOwnerCannotTouchStakes() (gas: 406963)\n[PASS] test_MaximumPackedBalanceAndRateAccrueWithoutIntermediateOverflow() (gas: 448069)\n[PASS] test_NoReturnAndFalseReturnTokens() (gas: 734103)\n[PASS] test_TinyUnstakesAlwaysPayFee() (gas: 360201)\n[PASS] test_TokenCallbackCannotSpendOrReenterStakeOrUnstake() (gas: 685618)\n[PASS] test_ZeroReceiptAndSenderSideFeeRevertAtomically() (gas: 554565)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 891.18ms (894.61ms CPU time)\n\nRan 3 tests for test/ClubsPlacementEncoding.t.sol:ClubsPlacementEncodingTest\n[PASS] testFuzz_EveryNoncanonicalLengthFailsBeforeChangingAnyPlacementState(uint16,bytes32) (runs: 512, μ: 3860629, ~: 3845056)\nLogs:\n  Bound result 118\n\n[PASS] testFuzz_HighBitsInEveryUint8WordAreRejectedWithoutTruncation(uint256,uint8,bool) (runs: 512, μ: 3814180, ~: 3807294)\nLogs:\n  Bound result 1\n  Bound result 864000\n\n[PASS] test_ZeroAndMaximumDesignIdsRemainDistinctAcrossFloorAndWalls() (gas: 3980458)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 890.26ms (1.76s CPU time)\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498277)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 808885)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384727)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 548202)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.15s (2.54ms CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomLevelsWallsRotationsAndDesignsMatchIndependentModel(bytes32,uint8) (runs: 256, μ: 21645391, ~: 21561656)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.19s (2.18s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS] invariant_VaultAlwaysCoversReservationsAndOnlyClaimsMoveTokens() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1374  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1373  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1376  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1352  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1374  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 604800\n  Bound result 100000000000000000000\n  Bound result 259200\n  Bound result 345600\n  Bound result 100000000000000000000\n  Bound result 8035200\n  Bound result 0\n  Bound result 3523\n  Bound result 5512\n  Bound result 514264337593543950335\n  Bound result 3175\n  Bound result 516511246473864845776\n  Bound result 4173385\n  Bound result 107327769457796578095\n  Bound result 3353629921\n  Bound result 514264337593543950335\n  Bound result 291\n  Bound result 3196\n  Bound result 4743\n  Bound result 514264337593543950335\n  Bound result 3\n  Bound result 1020\n  Bound result 4080123454\n  Bound result 1001\n  Bound result 432000\n  Bound result 3\n  Bound result 434\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 61\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.15s (3.14s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:FeeStakingInvariantTest\n[PASS]\nFeeStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n FeeStakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 101\n  Bound result 0\n  Bound result 1001\n  Bound result 992035287276763398606\n  Bound result 1001\n  Bound result 40\n  Bound result 0\n  Bound result 2948\n  Bound result 628253110210613192345\n  Bound result 511\n  Bound result 1659\n  Bound result 6119\n  Bound result 77\n  Bound result 521\n  Bound result 1358\n  Bound result 6955\n  Bound result 209\n  Bound result 99\n  Bound result 7603\n  Bound result 1001\n  Bound result 999\n  Bound result 666\n  Bound result 500\n  Bound result 3273\n  Bound result 1968\n  Bound result 115327\n  Bound result 1786308992\n  Bound result 268487\n  Bound result 270400\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 1449\n  Bound result 7580\n  Bound result 3857\n  Bound result 1029\n  Bound result 514264337593543950335\n  Bound result 1810\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 155366196403851299825\n  Bound result 17542\n  Bound result 425265651333461909936\n  Bound result 3699\n  Bound result 5655\n  Bound result 1001\n  Bound result 120942\n  Bound result 809400840\n  Bound result 6851\n  Bound result 1001\n  Bound result 786559\n  Bound result 482467\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.67s (3.66s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:StakingInvariantTest\n[PASS]\nStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n StakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 101\n  Bound result 0\n  Bound result 1001\n  Bound result 515187631088016022448\n  Bound result 1001\n  Bound result 40\n  Bound result 1001\n  Bound result 2852\n  Bound result 511\n  Bound result 1343\n  Bound result 6107\n  Bound result 77\n  Bound result 39\n  Bound result 634\n  Bound result 6793\n  Bound result 1\n  Bound result 99\n  Bound result 7481\n  Bound result 1001\n  Bound result 326\n  Bound result 817\n  Bound result 5490\n  Bound result 2712\n  Bound result 1968\n  Bound result 515913\n  Bound result 8\n  Bound result 268487\n  Bound result 87587\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 2264352206738369215\n  Bound result 6858\n  Bound result 418926\n  Bound result 1343494890\n  Bound result 514264337593543950335\n  Bound result 1639\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 1801415527\n  Bound result 2031667411513275450828\n  Bound result 400602847698064371464\n  Bound result 2892\n  Bound result 5530\n  Bound result 1001\n  Bound result 534366\n  Bound result 1618\n  Bound result 2677\n  Bound result 1001\n  Bound result 942\n  Bound result 482467\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.99s (3.98s 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                     | 1052  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1127  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1131  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1094  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 640\n  Bound result 1\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 697\n  Bound result 19\n  Bound result 7\n  Bound result 14\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 0\n  Bound result 0\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 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 7\n  Bound result 4\n  Bound result 7\n  Bound result 19\n  Bound result 0\n  Bound result 4\n  Bound result 7\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 13\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 14\n  Bound result 1124\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 832\n  Bound result 5\n  Bound result 16\n  Bound result 7\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 14\n  Bound result 6\n  Bound result 9\n  Bound result 0\n  Bound result 8\n  Bound result 7\n  Bound result 0\n  Bound result 18\n  Bound result 0\n  Bound result 14\n  Bound result 42\n  Bound result 0\n  Bound result 6\n  Bound result 16\n  Bound result 0\n  Bound result 9\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 2\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 14\n  Bound result 610\n  Bound result 0\n  Bound result 9\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.69s (9.69s CPU time)\n\nRan 3 tests for test/ClubsAtomicTransitions.t.sol:ClubsAtomicTransitionsTest\n[PASS] test_AuthorizedFundedCallbacksCannotCrossReenterEitherPaymentEntryPoint() (gas: 3037338)\n[PASS] test_FalseAfterEitherTransferRollsBackMintAndEveryUpgradeAndCanBeRetried() (gas: 3693172)\n[PASS] test_ReceiverRejectionRollsBackPlacementsLocksPaymentsAndBothNFTTransfers() (gas: 2929807)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.71s (4.91ms CPU time)\n\nRan 1 test for test/ClubsAdversarialInvariant.t.sol:ClubsAdversarialInvariantTest\n[PASS]\nClubsAdversarialInvariantTest invariants:\n[PASS] invariant_LayoutsFitNeverOverlapNeverCoverDoor\n[PASS] invariant_LockedFootprintsNeverChange\n[PASS] invariant_NoTokensEverHeldAndSplitConserved\n[PASS] invariant_PiecesEqualCustodyPerItem\n ClubsAdversarialInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-------------------------+--------------+-------+---------+----------╮\n| Contract                | Selector     | Calls | Reverts | Discards |\n+=====================================================================+\n| AdversarialClubsHandler | approveClub  | 797   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 874   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 782   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 856   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 787   | 0       | 0        |\n╰-------------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 10\n  Bound result 11\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 0\n  Bound result 6\n  Bound result 2\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 4\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.50s (11.47s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:TaxedFeeFlowInvariantTest\n[PASS]\nTaxedFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n TaxedFeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 1051\n  Bound result 56\n  Bound result 66938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 779855598\n  Bound result 1424\n  Bound result 1203999\n  Bound result 10189\n  Bound result 77675158203\n  Bound result 42500000000\n  Bound result 7130\n  Bound result 96\n  Bound result 320\n  Bound result 1001\n  Bound result 99\n  Bound result 209564904619\n  Bound result 238161\n  Bound result 6665\n  Bound result 286347530108\n  Bound result 1001\n  Bound result 14824842723\n  Bound result 6344728\n  Bound result 1960\n  Bound result 1797\n  Bound result 13\n  Bound result 1787\n  Bound result 3124842405\n  Bound result 1111212\n  Bound result 9838\n  Bound result 98\n  Bound result 73\n  Bound result 9\n  Bound result 943570192844\n  Bound result 872802428390\n  Bound result 723215801304\n  Bound result 690631146123\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.47s (12.47s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:FeeFlowInvariantTest\n[PASS]\nFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n FeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 1051\n  Bound result 56\n  Bound result 31938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 6907\n  Bound result 906\n  Bound result 1203999\n  Bound result 9596\n  Bound result 70175158203\n  Bound result 50000000000\n  Bound result 6452\n  Bound result 96\n  Bound result 821\n  Bound result 1001\n  Bound result 99\n  Bound result 209564904619\n  Bound result 238161\n  Bound result 309564904619\n  Bound result 1001\n  Bound result 29824841797\n  Bound result 6344728\n  Bound result 335884\n  Bound result 1456\n  Bound result 13\n  Bound result 1718\n  Bound result 85253\n  Bound result 7869\n  Bound result 98\n  Bound result 41\n  Bound result 6\n  Bound result 865460125400\n  Bound result 865460125451\n  Bound result 622932242259\n  Bound result 690993464272\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.99s (12.98s CPU time)\n\nRan 8 tests for test/ClubsLaunchRules.t.sol:ClubsLevelsTest\n[PASS] test_DoorAndFixedStrideAtEveryLevel() (gas: 1336876)\n[PASS] test_LevelsSizesExactOddSplitsAndEventsThroughMax() (gas: 741967)\n[PASS] test_MissingClubLevelSizeDesignWallViewsAndUpgradeRevert() (gas: 84601)\n[PASS] test_OnlyHolderOrApprovedMayUpgradeAndOperatorPays() (gas: 768953)\n[PASS] test_ShortUpgradeApprovalRollsBackLevelPaymentAndLayout() (gas: 428951)\n[PASS] test_TaxedFalseAndCallbackTokensOnUpgrade() (gas: 2233248)\n[PASS] test_UpgradeChecksBothFinalReceiptsAndRollsBackLevel() (gas: 1847075)\n[PASS] test_UpgradeKeepsTilesAndAllowsOnlyNewFrontRowsAndColumns() (gas: 2345635)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 12.99s (7.83ms CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_LayoutsFitDoorsRemainClearDesignsAreUniqueAndCustodyMatches\n[PASS] invariant_PaymentsNeverRemainInClubsAndAllMintUpgradeSplitsAreConserved\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+-------------------------+-------+---------+----------╮\n| Contract     | Selector                | Calls | Reverts | Discards |\n+=====================================================================+\n| ClubsHandler | mint                    | 1348  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | place                   | 1353  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | sale                    | 1375  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferClub            | 1387  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferPepeAndTryAgain | 1340  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | upgrade                 | 1389  | 0       | 0        |\n╰--------------+-------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 30.84s (30.81s CPU time)\n\nRan 3 tests for test/ClubsDelegationInvariant.t.sol:ClubsDelegationInvariantTest\n[PASS] invariant_EachPepeMintsOnceAndOnlyAuthorizedCallersPay() (runs: 256, calls: 24576, reverts: 0)\n\n╭-----------------------+--------------+-------+---------+----------╮\n| Contract              | Selector     | Calls | Reverts | Discards |\n+===================================================================+\n| ClubDelegationHandler | approveClub  | 2668  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | approvePepe  | 2820  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | delegate     | 2735  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | mint         | 2779  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | moveBudget   | 2697  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | setSale      | 2639  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | transferClub | 2763  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | transferPepe | 2707  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| ClubDelegationHandler | upgrade      | 2768  | 0       | 0        |\n╰-----------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 676\n  Bound result 0\n  Bound result 136\n  Bound result 0\n\n[PASS] test_DelegationAndPepeOwnershipDoNotConferControlOfAnAlreadyMintedClub() (gas: 4156596)\n[PASS] test_TransferOfUnmintedPepeRequiresADelegationFromTheNewHolder() (gas: 3118570)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 41.22s (41.22s CPU time)\n\nRan 1 test for test/RaffleSequenceInvariant.t.sol:RaffleSequenceInvariantTest\n[PASS]\nRaffleSequenceInvariantTest invariants:\n[PASS] invariant_ClaimBitsMatchMintReceiptsAndNeverMintUnawardedPrizes\n[PASS] invariant_FinalizedDrawsAndTermsNeverChange\n[PASS] invariant_PointsSpentExactlyMatchAcceptedRanges\n RaffleSequenceInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭-----------------------+----------+-------+---------+----------╮\n| Contract              | Selector | Calls | Reverts | Discards |\n+===============================================================+\n| RaffleSequenceHandler | advance  | 1521  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1542  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1563  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1520  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1558  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1517  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1555  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1512  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86400\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 1\n  Bound result 86400\n  Bound result 0\n  Bound result 4\n  Bound result 64\n  Bound result 352\n  Bound result 103\n  Bound result 7316\n  Bound result 129\n  Bound result 256\n  Bound result 17125\n  Bound result 243\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 16\n  Bound result 18147\n  Bound result 118\n  Bound result 6\n  Bound result 0\n  Bound result 10001\n  Bound result 153\n  Bound result 4534\n  Bound result 139\n  Bound result 56\n  Bound result 97\n  Bound result 48\n  Bound result 243\n  Bound result 253\n  Bound result 7\n  Bound result 9\n  Bound result 172797\n  Bound result 284\n  Bound result 251\n  Bound result 3664\n  Bound result 3\n  Bound result 77\n  Bound result 9\n  Bound result 1572\n  Bound result 81\n  Bound result 114\n  Bound result 27\n  Bound result 2\n  Bound result 1986\n  Bound result 174\n  Bound result 10\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 75.01s (74.99s CPU time)\n\nRan 35 test suites in 75.02s (238.61s CPU time): 234 tests passed, 0 failed, 0 skipped (234 total tests)\n","passed":true},{"durationMs":192,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub(uint256)\",\"OGClubClubs.onERC1155Received(address,address,uint256,uint256,bytes)\",\"OGClubClubs.renounceOwnership()\",\"OGClubClubs.safeTransferFrom(address,address,uint256)\",\"OGClubClubs.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubClubs.setApprovalForAll(address,bool)\",\"OGClubClubs.setBaseURI(string)\",\"OGClubClubs.setFootprint(uint256,uint8,uint8,bool)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"OGClubClubs.upgradeClub(uint256)\",\"OGClubFarmVault.acceptOwnership()\",\"OGClubFarmVault.cancelSeason(uint256)\",\"OGClubFarmVault.claim(uint256,address,uint256,bytes32[])\",\"OGClubFarmVault.proposeSeason(bytes32,uint256)\",\"OGClubFarmVault.releaseSeason(uint256)\",\"OGClubFarmVault.renounceOwnership()\",\"OGClubFarmVault.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)\",\"OGClubRaffle.acceptOwnership()\",\"OGClubRaffle.cancelRaffle(uint256)\",\"OGClubRaffle.claim(uint256,uint256,(uint256,uint256)[])\",\"OGClubRaffle.claimTo(uint256,uint256,(uint256,uint256)[],address)\",\"OGClubRaffle.commitDraw(uint256)\",\"OGClubRaffle.createRaffle(uint256,uint256,(uint8,uint256,uint256,(uint256,uint256)[])[])\",\"OGClubRaffle.draw(uint256,bytes)\",\"OGClubRaffle.enter(uint256,uint256,uint256)\",\"OGClubRaffle.renounceOwnership()\",\"OGClubRaffle.transferOwnership(address)\",\"OGClubStaking.acceptOwnership()\",\"OGClubStaking.activateSpender(address)\",\"OGClubStaking.cancelSpender(address)\",\"OGClubStaking.grantSpender(address)\",\"OGClubStaking.renounceOwnership()\",\"OGClubStaking.revokeSpender(address)\",\"OGClubStaking.spendPoints(address,uint256)\",\"OGClubStaking.stake(uint256)\",\"OGClubStaking.transferOwnership(address)\",\"OGClubStaking.unstake(uint256)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":126,\"README.md\":496,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":203,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":385,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/interfaces/IDelegateRegistry.sol\":10,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"src/mocks/MockSwarmPepe.sol\":13,\"test/ADDITIONAL_COVERAGE.md\":55,\"test/BlockHeader.t.sol\":144,\"test/CLUBS_TEST_NOTES.md\":63,\"test/ClubsAdversarial.t.sol\":716,\"test/ClubsAdversarialInvariant.t.sol\":477,\"test/ClubsAtomicTransitions.t.sol\":383,\"test/ClubsDelegationInvariant.t.sol\":475,\"test/ClubsDeployment.t.sol\":307,\"test/ClubsInvariant.t.sol\":486,\"test/ClubsLaunchRules.t.sol\":571,\"test/ClubsOccupancy.t.sol\":73,\"test/ClubsPlacement.t.sol\":364,\"test/ClubsPlacementEncoding.t.sol\":130,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":170,\"test/OGClubClubs.t.sol\":570,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsOccupancy.sol\":59,\"test/helpers/ClubsTestBase.sol\":78,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/PepeMocks.sol\":28,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":70},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"87d5eb7e85189d205014c3356eb5df9b8236695557a891a85dbb1168fe36b884","verifiedTreeHash":"d18acb7d8cdc2dfb3dc42410428b86b2467b1791","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":11317,"exitCode":0,"name":"build","output":"Compiling 100 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.22s\nCompiler run successful!\n","passed":true},{"durationMs":46919,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/TokenFailureAtomicity.t.sol:TokenFailureAtomicityTest\n[PASS] test_FalseReturningPayoutPreservesEarlierClaimsAndAllReservations() (gas: 728445)\n[PASS] test_OneWeiExitDoesNotCallTheZeroNetRecipientTransfer() (gas: 294703)\n[PASS] test_PackedStakeOverflowRestoresTransferAndPendingPointState() (gas: 487274)\n[PASS] test_SecondUnstakeTransferFailureRestoresVaultFeeAndAccrualCheckpoint() (gas: 612686)\n[PASS] test_SenderSurchargeCannotConsumeAnotherSeasonsReservation() (gas: 1561673)\n[PASS] test_VaultAcceptsNoReturnTokensAndPaysOnlyTheProvenAccount() (gas: 644163)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.64ms (1.04ms CPU time)\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498277)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 808885)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384727)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 548202)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.55ms (2.40ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171164)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 13424)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 633272)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 133297)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287694)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 161073)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 478701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.65ms (1.01ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsPepeTest\n[PASS] test_ConstructorRejectsZeroPepesAndEachZeroUpgradePrice() (gas: 13006)\n[PASS] test_DelegationRevocationAndPepeTransferInvalidateOldHolderDelegations() (gas: 932343)\n[PASS] test_DisabledDelegationAndOwnerDoesNotCallRegistry() (gas: 687444)\n[PASS] test_NonexistentPepeRevertsAndSparseZeroMaxIdsArePreserved() (gas: 1056549)\n[PASS] test_OnlyPepeHolderOrExplicitDelegateMayMintAndCallerReceives() (gas: 1057993)\n[PASS] test_PepeAndClubTransfersNeverResetMintRight() (gas: 273338)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.14ms (2.53ms CPU time)\n\nRan 6 tests for test/ClubsLaunchRules.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsAndEvents() (gas: 3306358)\n[PASS] test_EndOfWallAtEverySizeAndPreservedAfterUpgrade() (gas: 4844951)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesClubTransfer() (gas: 1517053)\n[PASS] test_WallDoorIntervalsAndOtherSideIndependent() (gas: 1090680)\n[PASS] test_WallFlagAndDimensionsLockTogetherAcrossAllClubs() (gas: 1116705)\n[PASS] test_WallOverlapYSideAndIndependentFloorBitmap() (gas: 1357663)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.04ms (6.05ms CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23506941)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14305080)\n[PASS] test_FactoryDecodesFlatManifestPriceWordsAsStaticTuple() (gas: 3753269)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10488870)\n[PASS] test_MainnetScriptDeploysFromKeyAndSafeOwnerConfiguresLater() (gas: 9372567)\nLogs:\n  OGClubClubs 0xCF75462c9e7fFf4eEB0c50185087a0fb9A056d2b\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df260000000000000000000000005991a2df15a8f6a256d3ec51e99254cd3fb576a90000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  vault 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  Swarm Pepes 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n  OWNER must call OGClubClubs with footprint calldata:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After configuring footprints/metadata, OWNER opens sale with calldata:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5769713)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14839)\n[PASS] test_SepoliaMockPepePublicMintUsesCallerAndRejectsDuplicateIds() (gas: 2848432)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18414522)\nLogs:\n  MockOG (unrestricted testnet mint) 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  MockOG constructor args (initialRecipient):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  OGClubFurniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  OGClubFarmVault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  OGClubFarmVault constructor args (token, owner):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a57\n  MockSwarmPepe (Sepolia-only public mint) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, upgradePrices):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz v2 registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 19.65ms (58.62ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558671, ~: 558520)\nLogs:\n  Bound result 7969\n\n[PASS] test_ActivationAtMaturityAndLastSecond() (gas: 512088)\n[PASS] test_CancelRevokeRegrantAndReproposal() (gas: 800981)\n[PASS] test_InvalidGrantDoesNotSpendBootstrapAndZeroAddressesRejected() (gas: 147761)\n[PASS] test_OnlyOwnerProposesCancelsAndRevokes() (gas: 406632)\n[PASS] test_OwnershipHandoverDoesNotResetBootstrapAndRenunciationDoesNotBlockActivation() (gas: 568368)\n[PASS] test_SpenderLastSecondActivates() (gas: 378503)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 39.52ms (39.66ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352168, ~: 1352235)\nLogs:\n  Bound result 162514264337593544029563\n  Bound result 80744578297060961413686\n\n[PASS] test_CancelBeforeOpenOnlyReleasesReserveWithoutTransferring() (gas: 561805)\n[PASS] test_ClaimLastSecondBeforeExpirationAndPartialRelease() (gas: 397391)\n[PASS] test_DelayExactBoundaryAndPermissionlessClaimPaidToAccountOnly() (gas: 442808)\n[PASS] test_FailedTokenTransferRestoresClaimAndReservations() (gas: 727404)\n[PASS] test_HalfCapUsesOnlyUnreservedBalanceAndFloorsOddWei() (gas: 472822)\n[PASS] test_InvalidRecipientsAndZeroAllocation() (gas: 482033)\n[PASS] test_InvalidSeasonRootAndTotal() (gas: 164553)\n[PASS] test_OnlyOwnerCanProposeCancelAndNoSweepOrApprovalOrPause() (gas: 165634)\n[PASS] test_OwnerCallbackCannotReserveAgainstAnInFlightPayout() (gas: 625341)\n[PASS] test_OwnershipHandoverPreservesSeasons() (gas: 415758)\n[PASS] test_ProofRejectsWrongAccountAmountSeasonAndSingleHash() (gas: 898876)\n[PASS] test_ProposalIntervalAtExactBoundaryIncludingAfterCancel() (gas: 441729)\n[PASS] test_ReleaseExactly90DaysAfterOpeningAndNeverWithdrawsTokens() (gas: 562741)\n[PASS] test_TokenCallbackCannotClaimTwice() (gas: 521104)\n[PASS] test_TotalBudgetCapsEvenInconsistentMerkleTree() (gas: 355026)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 53.09ms (52.18ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32990, ~: 32222)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 92628, ~: 73169)\nLogs:\n  Bound result 0\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 321913)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147737)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237524)\n[PASS] test_RealMainnetCancunHeader() (gas: 543993)\n[PASS] test_RealMainnetPragueHeader() (gas: 547036)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 538038)\n[PASS] test_RealSepoliaHeaderWithAccessListHashAndSlotNumber() (gas: 550588)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40712)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 55.42ms (54.01ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_ConstructorsDoNotCallDependenciesOrAssignFactoryOwner() (gas: 45432)\n[PASS] test_InvalidConfigurationAndConstructorBounds() (gas: 8014)\n[PASS] test_MockIsDeliberatelyUnlimitedTestnetOnly() (gas: 77458)\n[PASS] test_SepoliaDeploymentAndOwnerSetup() (gas: 34864668)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 62.44ms (61.71ms CPU time)\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98LevelOneFloorTilesFillAndNoFurtherFloorPieceFits() (gas: 36437665)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263609)\n[PASS] test_ClubFullIsReachedBy285DistinctRealPieces() (gas: 89130108)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 738492)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158861)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 759733)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 348438)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742648)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1314425)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2655350)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2081214)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219572)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 779083)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 204905)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 81.27ms (82.76ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596150, ~: 595918)\nLogs:\n  Bound result 7792\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169365, ~: 169450)\n[PASS] test_AllOwnerFunctionsProtected() (gas: 227178)\n[PASS] test_CancelStopsActivationEvenAfterDeadline() (gas: 394671)\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: 546001)\n[PASS] test_OwnershipTwoStepAndRenounce() (gas: 244214)\n[PASS] test_RegrantingTheRevokedFirstMinterWaitsWithZeroSupply() (gas: 569038)\n[PASS] test_RejectedGrantDoesNotSpendTheBootstrap() (gas: 173991)\n[PASS] test_ReproposalRestartsDelayAndCancelDoesNotRevokeExistingRole() (gas: 457168)\n[PASS] test_RevokeIsImmediateClearsProposalsAndRegrantWaitsAgain() (gas: 535486)\n[PASS] test_RoyaltyDefaultAndLimits() (gas: 161390)\n[PASS] test_ZeroAddressesAndLegacyMinterSelectorCannotGrant() (gas: 340672)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 92.15ms (93.22ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19116, ~: 18129)\nLogs:\n  Bound result 1239\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 622510, ~: 378494)\nLogs:\n  Bound result 190\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 167.72ms (181.13ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2450037, ~: 2277993)\nLogs:\n  Bound result 56\n  Bound result 8\n\n[PASS] test_ClosedSaleAndRemovedMintEntryPoints() (gas: 167051)\n[PASS] test_ConstructorRejectsBurnTokenAndFurnitureVaultAliases() (gas: 18844)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 902043)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208150)\n[PASS] test_NonReceiverRollsBackPaymentAndMintRight() (gas: 946013)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1459738)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1819383)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242430)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 386343)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1785014)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1829125)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 699363)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 261.00ms (262.98ms CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 230617, ~: 233134)\nLogs:\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1360550, ~: 1137927)\nLogs:\n  Bound result 270396868823369346779233987973730114150\n  Bound result 6\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134909)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1062479)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 834105)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1551477)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 904418)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 663694)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 232113)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746305)\n[PASS] test_FullLevelOneFloorRejectsFurtherFloorPieces() (gas: 28387989)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142453)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73360)\n[PASS] test_InterfacesAndImmutables() (gas: 141924)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649235)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360774)\n[PASS] test_MintPaysFromCallerAndClosedSaleStopsMinting() (gas: 627750)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196660)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489516)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 360548)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1208562)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239550)\n[PASS] test_PepeHolderWithoutReceiverRollsBack() (gas: 453097)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1387414)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 283996)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1481462)\n[PASS] test_TileTakenViewBounds() (gas: 56766)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1116131)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1013594)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 449699)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 276.76ms (296.75ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1193106, ~: 958599)\nLogs:\n  Bound result 87956191886590890006\n  Bound result 17166144\n  Bound result 55\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283055, ~: 283076)\nLogs:\n  Bound result 2597\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219247, ~: 1219445)\nLogs:\n  Bound result 1\n  Bound result 1001\n  Bound result 1000\n\n[PASS] test_AccrueBeforeBalanceChangesAndNoLock() (gas: 427758)\n[PASS] test_CheckpointsPreserveSubWeiAccrualAndFullExitFraction() (gas: 1366740)\n[PASS] test_DecimalsReadOnFirstUseAndNormalizeWholeTokens() (gas: 2190760)\n[PASS] test_DonationsNeitherCreateStakeNorAwardPoints() (gas: 343342)\n[PASS] test_ExactContinuousAccrualAtBoundariesAndSpend() (gas: 299793)\n[PASS] test_FeeOnTransferCreditsOnlyReceivedAndCannotInflatePoints() (gas: 381142)\n[PASS] test_InvalidAmountsUnauthorizedSpendAndOwnerCannotTouchStakes() (gas: 406963)\n[PASS] test_MaximumPackedBalanceAndRateAccrueWithoutIntermediateOverflow() (gas: 448069)\n[PASS] test_NoReturnAndFalseReturnTokens() (gas: 734103)\n[PASS] test_TinyUnstakesAlwaysPayFee() (gas: 360201)\n[PASS] test_TokenCallbackCannotSpendOrReenterStakeOrUnstake() (gas: 685618)\n[PASS] test_ZeroReceiptAndSenderSideFeeRevertAtomically() (gas: 554565)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 276.83ms (460.96ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3695604, ~: 3693663)\nLogs:\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 5\n\n[PASS] test_ClaimBitmapIsIndependentAcrossRafflesAndPools() (gas: 2082130)\n[PASS] test_LateInvalidEntryRollsBackAnEarlierWalletMint() (gas: 1264278)\n[PASS] test_LateInvalidPoolCreationDoesNotLeaveRaffleOrPrizeStorage() (gas: 507505)\n[PASS] test_LateReceiverRejectionRollsBackPreviouslyMintedWalletGroup() (gas: 2144305)\n[PASS] test_PrizeLimitAppliesToSumAcrossLinesAndRollbackAllowsReuse() (gas: 498160)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 277.05ms (291.60ms CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS] invariant_VaultAlwaysCoversReservationsAndOnlyClaimsMoveTokens() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1374  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1373  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1376  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1352  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1374  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 604800\n  Bound result 100000000000000000000\n  Bound result 259200\n  Bound result 345600\n  Bound result 100000000000000000000\n  Bound result 8035200\n  Bound result 0\n  Bound result 3523\n  Bound result 5512\n  Bound result 514264337593543950335\n  Bound result 3175\n  Bound result 516511246473864845776\n  Bound result 4173385\n  Bound result 107327769457796578095\n  Bound result 3353629921\n  Bound result 514264337593543950335\n  Bound result 291\n  Bound result 3196\n  Bound result 4743\n  Bound result 514264337593543950335\n  Bound result 3\n  Bound result 1020\n  Bound result 4080123454\n  Bound result 1001\n  Bound result 432000\n  Bound result 3\n  Bound result 434\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 61\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29s (1.29s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:FeeStakingInvariantTest\n[PASS]\nFeeStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n FeeStakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 708481\n  Bound result 0\n  Bound result 1001\n  Bound result 992035287276763398606\n  Bound result 1001\n  Bound result 13092\n  Bound result 107\n  Bound result 2947\n  Bound result 628253110210613192345\n  Bound result 50000\n  Bound result 7703\n  Bound result 6276\n  Bound result 6\n  Bound result 6043\n  Bound result 1357\n  Bound result 7114\n  Bound result 100\n  Bound result 352\n  Bound result 757\n  Bound result 1001\n  Bound result 999\n  Bound result 666\n  Bound result 2146\n  Bound result 3477\n  Bound result 1968\n  Bound result 115329\n  Bound result 1786308994\n  Bound result 268487\n  Bound result 779998\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 6264309386517457430\n  Bound result 7622\n  Bound result 3918\n  Bound result 887\n  Bound result 514264337593543950335\n  Bound result 1719\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 301101296309121779003\n  Bound result 99593706138631109230\n  Bound result 978269022990735722\n  Bound result 4008\n  Bound result 5683\n  Bound result 1001\n  Bound result 448913\n  Bound result 2789\n  Bound result 3463\n  Bound result 1001\n  Bound result 574399\n  Bound result 5000\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.76s (1.75s CPU time)\n\nRan 1 test for test/StakingInvariant.t.sol:StakingInvariantTest\n[PASS]\nStakingInvariantTest invariants:\n[PASS] invariant_PointsAppearOnlyByTimeWeightedAccrualAndLeaveOnlyBySpending\n[PASS] invariant_StakingBalanceEqualsAllStakes\n StakingInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| StakingHandler | advance           | 1641  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1592  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1648  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1614  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1697  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 708481\n  Bound result 0\n  Bound result 1001\n  Bound result 515187631088016022448\n  Bound result 1001\n  Bound result 13092\n  Bound result 1001\n  Bound result 2852\n  Bound result 50000\n  Bound result 1343\n  Bound result 6107\n  Bound result 6\n  Bound result 39\n  Bound result 1305\n  Bound result 6727\n  Bound result 3873\n  Bound result 352\n  Bound result 4318\n  Bound result 1001\n  Bound result 538\n  Bound result 284988\n  Bound result 9999999999999999999\n  Bound result 3098\n  Bound result 1968\n  Bound result 2151\n  Bound result 522\n  Bound result 268487\n  Bound result 424704\n  Bound result 4766717468360348689\n  Bound result 12122\n  Bound result 1569624526700006079\n  Bound result 7188\n  Bound result 6209\n  Bound result 429\n  Bound result 514264337593543950335\n  Bound result 1638\n  Bound result 1001\n  Bound result 44364245511615\n  Bound result 9000000000000002042\n  Bound result 187214330203336762299\n  Bound result 1602803858480664906\n  Bound result 244083\n  Bound result 4594638\n  Bound result 1001\n  Bound result 5686\n  Bound result 1726\n  Bound result 6518\n  Bound result 1001\n  Bound result 624538\n  Bound result 5000\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.77s (1.76s CPU time)\n\nRan 6 tests for test/Gas.t.sol:GasTest\n[PASS] test_GasClaimOne() (gas: 954101)\nLogs:\n  Claim one win / fresh furniture wallet\n  Cancun call gas: 160885\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 472565\n\n[PASS] test_GasClaimTen() (gas: 2860761)\nLogs:\n  Claim ten distinct items / fresh furniture wallet\n  Cancun call gas: 816170\n  New persistent slots: 22\n  EIP-8037 state gas: 2154240\n  EIP-8037 storage-repriced call gas: 2530410\n\n[PASS] test_GasDraw() (gas: 418645)\nLogs:\n  Draw / 23-field synthetic header\n  Cancun call gas: 74312\n  New persistent slots: 1\n  EIP-8037 state gas: 97920\n  EIP-8037 storage-repriced call gas: 152232\n\n[PASS] test_GasEnter() (gas: 558676)\nLogs:\n  First entry / ten tickets / first points checkpoint\n  Cancun call gas: 155364\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 467044\n\n[PASS] test_GasFirstStake() (gas: 200138)\nLogs:\n  First-ever stake / fresh staker\n  Cancun call gas: 120547\n  New persistent slots: 3\n  EIP-8037 state gas: 293760\n  EIP-8037 storage-repriced call gas: 354307\n\n[PASS] test_GasUnstake() (gas: 308132)\nLogs:\n  Partial unstake / first fee / first checkpoint\n  Cancun call gas: 110662\n  New persistent slots: 2\n  EIP-8037 state gas: 195840\n  EIP-8037 storage-repriced call gas: 266502\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.88s (10.67ms CPU time)\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\n\nRan 8 tests for test/ClubsLaunchRules.t.sol:ClubsLevelsTest\n[PASS] test_DoorAndFixedStrideAtEveryLevel() (gas: 1336876)\n[PASS] test_LevelsSizesExactOddSplitsAndEventsThroughMax() (gas: 741967)\n[PASS] test_MissingClubLevelSizeDesignWallViewsAndUpgradeRevert() (gas: 84601)\n[PASS] test_OnlyHolderOrApprovedMayUpgradeAndOperatorPays() (gas: 768953)\n[PASS] test_ShortUpgradeApprovalRollsBackLevelPaymentAndLayout() (gas: 428951)\n[PASS] test_TaxedFalseAndCallbackTokensOnUpgrade() (gas: 2233248)\n[PASS] test_UpgradeChecksBothFinalReceiptsAndRollsBackLevel() (gas: 1847075)\n[PASS] test_UpgradeKeepsTilesAndAllowsOnlyNewFrontRowsAndColumns() (gas: 2345635)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 4.04s (6.61ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1670786, ~: 1001701)\nLogs:\n  Bound result 60\n  Bound result 27\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241150, ~: 240936)\nLogs:\n  Bound result 17954\n\n[PASS] test_ClaimToCannotRedirectAnotherWalletInTheSameBatch() (gas: 1239609)\n[PASS] test_ContractWalletCanRedirectButNobodyElseCan() (gas: 2015153)\n[PASS] test_DrawHeaderAndTargetExactBoundaries() (gas: 641712)\n[PASS] test_DuplicateWithinBatchRollsBackEverythingAndBitmapCrossesWords() (gas: 937264)\n[PASS] test_EntryFailureRollsBackRangesCapsAndPoints() (gas: 833603)\n[PASS] test_EntryWindowAndWalletCapExactBoundaries() (gas: 808341)\n[PASS] test_HugeTicketAndPrizeCountsDoNotRequireIterationToDrawOrClaim() (gas: 925425)\n[PASS] test_InvalidConfigurationPoolsLinesAndTickets() (gas: 941928)\n[PASS] test_Maximum32PoolsAnd128PrizeLines() (gas: 15557738)\n[PASS] test_MultiItemPoolMintsExactQuantitiesIncludingDuplicateAndZeroIds() (gas: 2370129)\n[PASS] test_NoticeExactBoundariesAndCancellation() (gas: 540021)\n[PASS] test_OwnerCannotModifyTermsPauseOrCancelStartedRaffle() (gas: 450829)\n[PASS] test_ReceiverCannotReenterEitherClaimPath() (gas: 1991045)\n[PASS] test_RejectingWalletDoesNotBlockOtherWinnersAndEmptyClaimRejected() (gas: 2030167)\n[PASS] test_RetargetOnlyAt257AndOldHeaderCannotDrawNewTarget() (gas: 560166)\n[PASS] test_RevokedMinterClaimIsRetryableAndDoesNotReroll() (gas: 1017518)\n[PASS] test_TicketPriceMultiplicationOverflowDoesNotSpendOrRecordEntry() (gas: 370843)\n[PASS] test_UnlimitedCapIsPerPoolAndRangesStayContiguous() (gas: 878602)\n[PASS] test_UnsoldPrizesAreRandomPositionsNotAlwaysTheTail() (gas: 3336643)\n[PASS] test_WrongKEntryAndDoubleClaimsRevertAtomically() (gas: 1332250)\n[PASS] test_WrongNumberInAuthenticatedHeaderRejected() (gas: 365306)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 4.04s (416.57ms CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomLevelsWallsRotationsAndDesignsMatchIndependentModel(bytes32,uint8) (runs: 256, μ: 125378917, ~: 117702000)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.04s (4.04s 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                     | 1052  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1127  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1131  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1096  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1094  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 640\n  Bound result 1\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 697\n  Bound result 19\n  Bound result 7\n  Bound result 14\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 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 19\n  Bound result 7\n  Bound result 4\n  Bound result 7\n  Bound result 19\n  Bound result 0\n  Bound result 4\n  Bound result 7\n  Bound result 5\n  Bound result 1\n  Bound result 12\n  Bound result 14\n  Bound result 0\n  Bound result 0\n  Bound result 11\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 14\n  Bound result 1\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 21\n  Bound result 0\n  Bound result 332\n  Bound result 832\n  Bound result 5\n  Bound result 17\n  Bound result 14\n  Bound result 8\n  Bound result 1\n  Bound result 4\n  Bound result 20\n  Bound result 14\n  Bound result 6\n  Bound result 54\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 18\n  Bound result 0\n  Bound result 7\n  Bound result 45\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 9\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 14\n  Bound result 849\n  Bound result 0\n  Bound result 9\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.26s (4.26s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:FeeFlowInvariantTest\n[PASS]\nFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n FeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 999899\n  Bound result 247\n  Bound result 31938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 6907\n  Bound result 1978\n  Bound result 1520\n  Bound result 19\n  Bound result 70175158203\n  Bound result 49999993093\n  Bound result 6450\n  Bound result 200\n  Bound result 821\n  Bound result 1001\n  Bound result 24576\n  Bound result 209564904619\n  Bound result 1001\n  Bound result 98\n  Bound result 6768\n  Bound result 29824841797\n  Bound result 1001\n  Bound result 6344728\n  Bound result 1221973\n  Bound result 1455\n  Bound result 1001\n  Bound result 309564897851\n  Bound result 13\n  Bound result 1730\n  Bound result 1051\n  Bound result 98\n  Bound result 78\n  Bound result 503643002658\n  Bound result 133604967895\n  Bound result 503643002678\n  Bound result 201666195814\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.20s (6.20s CPU time)\n\nRan 1 test for test/FeeFlowInvariant.t.sol:TaxedFeeFlowInvariantTest\n[PASS]\nTaxedFeeFlowInvariantTest invariants:\n[PASS] invariant_EachReservationEqualsUnpaidAllocationsOfAnOpenSeason\n[PASS] invariant_PointsConservedThroughPartialExitsClaimsAndRestakes\n[PASS] invariant_TokensConservedAcrossStakeFeeVaultPayoutAndBurn\n TaxedFeeFlowInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭----------------+-----------+-------+---------+----------╮\n| Contract       | Selector  | Calls | Reverts | Discards |\n+=========================================================+\n| FeeFlowHandler | advance   | 1147  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1195  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1153  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1158  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1068  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1071  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1171  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1034  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1111  | 0       | 0        |\n╰----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 100000000\n  Bound result 604800\n  Bound result 100000000\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 1296000\n  Bound result 40000000\n  Bound result 999899\n  Bound result 247\n  Bound result 66938772081\n  Bound result 29981\n  Bound result 18263\n  Bound result 779855598\n  Bound result 2106\n  Bound result 3940678358\n  Bound result 19\n  Bound result 77675158203\n  Bound result 41720144402\n  Bound result 7202\n  Bound result 200\n  Bound result 320\n  Bound result 1001\n  Bound result 24576\n  Bound result 209564915630\n  Bound result 98\n  Bound result 13788\n  Bound result 14824841797\n  Bound result 1001\n  Bound result 6344728\n  Bound result 1774\n  Bound result 1519\n  Bound result 286347534096\n  Bound result 13\n  Bound result 1786\n  Bound result 25561227919\n  Bound result 1111211\n  Bound result 9991\n  Bound result 98\n  Bound result 38\n  Bound result 57843034772\n  Bound result 944639575335\n  Bound result 53504807218\n  Bound result 873791607185\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.35s (6.34s CPU time)\n\nRan 1 test for test/ClubsAdversarialInvariant.t.sol:ClubsAdversarialInvariantTest\n[PASS]\nClubsAdversarialInvariantTest invariants:\n[PASS] invariant_LayoutsFitNeverOverlapNeverCoverDoor\n[PASS] invariant_LockedFootprintsNeverChange\n[PASS] invariant_NoTokensEverHeldAndSplitConserved\n[PASS] invariant_PiecesEqualCustodyPerItem\n ClubsAdversarialInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-------------------------+--------------+-------+---------+----------╮\n| Contract                | Selector     | Calls | Reverts | Discards |\n+=====================================================================+\n| AdversarialClubsHandler | approveClub  | 797   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 874   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 782   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 856   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 787   | 0       | 0        |\n╰-------------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 11\n  Bound result 10\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 6\n  Bound result 1\n  Bound result 5\n  Bound result 0\n  Bound result 2\n  Bound result 11\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 8\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.20s (15.20s CPU time)\n\nRan 1 test for test/RaffleSequenceInvariant.t.sol:RaffleSequenceInvariantTest\n[PASS]\nRaffleSequenceInvariantTest invariants:\n[PASS] invariant_ClaimBitsMatchMintReceiptsAndNeverMintUnawardedPrizes\n[PASS] invariant_FinalizedDrawsAndTermsNeverChange\n[PASS] invariant_PointsSpentExactlyMatchAcceptedRanges\n RaffleSequenceInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭-----------------------+----------+-------+---------+----------╮\n| Contract              | Selector | Calls | Reverts | Discards |\n+===============================================================+\n| RaffleSequenceHandler | advance  | 1521  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1542  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1563  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1520  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1558  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1517  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1555  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1512  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86400\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 172800\n  Bound result 0\n  Bound result 1\n  Bound result 86400\n  Bound result 0\n  Bound result 4\n  Bound result 16\n  Bound result 86\n  Bound result 103\n  Bound result 7316\n  Bound result 17\n  Bound result 3\n  Bound result 55259\n  Bound result 68\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 256\n  Bound result 5435\n  Bound result 42\n  Bound result 5\n  Bound result 1\n  Bound result 4799\n  Bound result 196\n  Bound result 3927\n  Bound result 263\n  Bound result 183\n  Bound result 3\n  Bound result 225\n  Bound result 10001\n  Bound result 68\n  Bound result 7\n  Bound result 2\n  Bound result 172751\n  Bound result 148\n  Bound result 59\n  Bound result 3783\n  Bound result 56\n  Bound result 6\n  Bound result 2\n  Bound result 1572\n  Bound result 81\n  Bound result 114\n  Bound result 255\n  Bound result 2\n  Bound result 1985\n  Bound result 204\n  Bound result 10\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 36.71s (36.70s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_LayoutsFitDoorsRemainClearDesignsAreUniqueAndCustodyMatches\n[PASS] invariant_PaymentsNeverRemainInClubsAndAllMintUpgradeSplitsAreConserved\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+-------------------------+-------+---------+----------╮\n| Contract     | Selector                | Calls | Reverts | Discards |\n+=====================================================================+\n| ClubsHandler | mint                    | 1348  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | place                   | 1353  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | sale                    | 1375  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferClub            | 1387  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | transferPepeAndTryAgain | 1340  | 0       | 0        |\n|--------------+-------------------------+-------+---------+----------|\n| ClubsHandler | upgrade                 | 1389  | 0       | 0        |\n╰--------------+-------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 46.81s (46.80s CPU time)\n\nRan 30 test suites in 46.81s (138.01s CPU time): 219 tests passed, 0 failed, 0 skipped (219 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub(uint256)\",\"OGClubClubs.onERC1155Received(address,address,uint256,uint256,bytes)\",\"OGClubClubs.renounceOwnership()\",\"OGClubClubs.safeTransferFrom(address,address,uint256)\",\"OGClubClubs.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubClubs.setApprovalForAll(address,bool)\",\"OGClubClubs.setBaseURI(string)\",\"OGClubClubs.setFootprint(uint256,uint8,uint8,bool)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"OGClubClubs.upgradeClub(uint256)\",\"OGClubFarmVault.acceptOwnership()\",\"OGClubFarmVault.cancelSeason(uint256)\",\"OGClubFarmVault.claim(uint256,address,uint256,bytes32[])\",\"OGClubFarmVault.proposeSeason(bytes32,uint256)\",\"OGClubFarmVault.releaseSeason(uint256)\",\"OGClubFarmVault.renounceOwnership()\",\"OGClubFarmVault.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)\",\"OGClubRaffle.acceptOwnership()\",\"OGClubRaffle.cancelRaffle(uint256)\",\"OGClubRaffle.claim(uint256,uint256,(uint256,uint256)[])\",\"OGClubRaffle.claimTo(uint256,uint256,(uint256,uint256)[],address)\",\"OGClubRaffle.commitDraw(uint256)\",\"OGClubRaffle.createRaffle(uint256,uint256,(uint8,uint256,uint256,(uint256,uint256)[])[])\",\"OGClubRaffle.draw(uint256,bytes)\",\"OGClubRaffle.enter(uint256,uint256,uint256)\",\"OGClubRaffle.renounceOwnership()\",\"OGClubRaffle.transferOwnership(address)\",\"OGClubStaking.acceptOwnership()\",\"OGClubStaking.activateSpender(address)\",\"OGClubStaking.cancelSpender(address)\",\"OGClubStaking.grantSpender(address)\",\"OGClubStaking.renounceOwnership()\",\"OGClubStaking.revokeSpender(address)\",\"OGClubStaking.spendPoints(address,uint256)\",\"OGClubStaking.stake(uint256)\",\"OGClubStaking.transferOwnership(address)\",\"OGClubStaking.unstake(uint256)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":126,\"README.md\":496,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":203,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":385,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/interfaces/IDelegateRegistry.sol\":10,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"src/mocks/MockSwarmPepe.sol\":13,\"test/ADDITIONAL_COVERAGE.md\":55,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":716,\"test/ClubsAdversarialInvariant.t.sol\":458,\"test/ClubsDeployment.t.sol\":307,\"test/ClubsInvariant.t.sol\":436,\"test/ClubsLaunchRules.t.sol\":571,\"test/ClubsPlacement.t.sol\":364,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":170,\"test/OGClubClubs.t.sol\":570,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsTestBase.sol\":78,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/PepeMocks.sol\":28,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":70},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3953,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/OGClubStaking.sol:164: OGClubStaking._pending(OGClubStaking.Account) (src/OGClubStaking.sol#164-175) uses a weak PRNG: \"remainder = uint80(fraction % denominator) (src/OGClubStaking.sol#174)\"\n[high/medium] reentrancy-balance at src/OGClubFarmVault.sol:78: Reentrancy in OGClubFarmVault.claim(uint256,address,uint256,bytes32[]) (src/OGClubFarmVault.sol#78-94):\n[high/medium] reentrancy-balance at src/OGClubStaking.sol:69: Reentrancy in OGClubStaking.stake(uint256) (src/OGClubStaking.sol#69-85):\n[high/medium] reentrancy-balance at src/OGClubStaking.sol:87: Reentrancy in OGClubStaking.unstake(uint256) (src/OGClubStaking.sol#87-100):\n[high/medium] reentrancy-balance at src/OGClubStaking.sol:87: Reentrancy in OGClubStaking.unstake(uint256) (src/OGClubStaking.sol#87-100):\n[high/medium] reentrancy-balance at src/OGClubClubs.sol:183: Reentrancy in OGClubClubs._pay(uint256) (src/OGClubClubs.sol#183-196):\n[high/medium] reentrancy-balance at src/OGClubClubs.sol:183: Reentrancy in OGClubClubs._pay(uint256) (src/OGClubClubs.sol#183-196):\n[medium/high] incorrect-equality at src/OGClubStaking.sol:69: OGClubStaking.stake(uint256) (src/OGClubStaking.sol#69-85) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/OGClubStaking.sol:164: OGClubStaking._pending(OGClubStaking.Account) (src/OGClubStaking.sol#164-175) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/OGClubStaking.sol:135: OGClubStaking.activateSpender(address) (src/OGClubStaking.sol#135-142) uses a dangerous strict equality:\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/medium] reentrancy-no-eth at src/OGClubRaffle.sol:300: Reentrancy in OGClubRaffle._claim(uint256,uint256,OGClubRaffle.Win[],address) (src/OGClubRaffle.sol#300-325):\n[medium/medium] reentrancy-no-eth at src/OGClubStaking.sol:69: Reentrancy in OGClubStaking.stake(uint256) (src/OGClubStaking.sol#69-85):\n[medium/medium] uninitialized-local at src/OGClubRaffle.sol:163: OGClubRaffle.createRaffle(uint256,uint256,OGClubRaffle.PoolInput[]).prizeCount (src/OGClubRaffle.sol#163) is a local variable never initialized\n[medium/medium] uninitialized-local at src/libraries/Permutation.sol:13: Permutation.permute(uint256,uint256,bytes32).halfBits (src/libraries/Permutation.sol#13) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubRaffle.sol:148: OGClubRaffle.createRaffle(uint256,uint256,OGClubRaffle.PoolInput[]).lines (src/OGClubRaffle.sol#148) is a local variable never initialized\n[medium/medium] uninitialized-local at src/OGClubRaffle.sol:241: OGClubRaffle.prizeOf(uint256,uint256,uint256).low (src/OGClubRaffle.sol#241) is a local variable never initialized\n[low/medium] calls-loop at src/OGClubRaffle.sol:300: OGClubRaffle._claim(uint256,uint256,OGClubRaffle.Win[],address) (src/OGClubRaffle.sol#300-325) has external calls inside a loop: furniture.mintBatch(to,ids,amounts) (src/OGClubRaffle.sol#322)\n[low/medium] calls-loop at src/OGClubRaffle.sol:300: OGClubRaffle._claim(uint256,uint256,OGClubRaffle.Win[],address) (src/OGClubRaffle.sol#300-325) has external calls inside a loop: furniture.mintBatch(to,ids,amounts) (src/OGClubRaffle.sol#322)\n[low/medium] reentrancy-benign at src/OGClubStaking.sol:69: Reentrancy in OGClubStaking.stake(uint256) (src/OGClubStaking.sol#69-85):\n[low/medium] timestamp at src/OGClubStaking.sol:144: OGClubStaking.cancelSpender(address) (src/OGClubStaking.sol#144-149) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubStaking.sol:112: OGClubStaking.spendPoints(address,uint256) (src/OGClubStaking.sol#112-118) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFurniture.sol:78: OGClubFurniture.cancelMinter(address) (src/OGClubFurniture.sol#78-83) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFarmVault.sol:56: OGClubFarmVault.proposeSeason(bytes32,uint256) (src/OGClubFarmVault.sol#56-66) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFarmVault.sol:96: OGClubFarmVault.releaseSeason(uint256) (src/OGClubFarmVault.sol#96-102) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubRaffle.sol:176: OGClubRaffle.cancelRaffle(uint256) (src/OGClubRaffle.sol#176-181) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubRaffle.sol:183: OGClubRaffle.enter(uint256,uint256,uint256) (src/OGClubRaffle.sol#183-199) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFarmVault.sol:68: OGClubFarmVault.cancelSeason(uint256) (src/OGClubFarmVault.sol#68-74) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubRaffle.sol:138: OGClubRaffle.createRaffle(uint256,uint256,OGClubRaffle.PoolInput[]) (src/OGClubRaffle.sol#138-174) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubFarmVault.sol:78: OGClubFarmVault.claim(uint256,address,uint256,bytes32[]) (src/OGClubFarmVault.sol#78-94) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubStaking.sol:135: OGClubStaking.activateSpender(address) (src/OGClubStaking.sol#135-142) 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/OGClubStaking.sol:164: OGClubStaking._pending(OGClubStaking.Account) (src/OGClubStaking.sol#164-175) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubRaffle.sol:203: OGClubRaffle.commitDraw(uint256) (src/OGClubRaffle.sol#203-211) uses timestamp for comparisons","passed":true},{"durationMs":573,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/OGClubStaking.sol:69: ETH transferred without address checks (2 places)\n[high] reentrancy-state-change at src/OGClubClubs.sol:158: Reentrancy: State change after external call (6 places)\n[high] storage-array-memory-edit at src/OGClubStaking.sol:103: Storage Array Edited with Memory\n[high] unsafe-casting at src/OGClubRaffle.sol:193: Unsafe Casting of integers (2 places)\n[low] centralization-risk at src/OGClubClubs.sol:22: Centralization Risk (24 places)\n[low] costly-loop at src/OGClubRaffle.sol:149: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/OGClubStaking.sol:94: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/OGClubClubs.sol:150: Literal Instead of Constant (31 places)\n[low] non-reentrant-not-first at src/OGClubFarmVault.sol:56: `nonReentrant` is Not the First Modifier (3 places)\n[low] push-zero-opcode at src/OGClubClubs.sol:2: PUSH0 Opcode (10 places)\n[low] require-revert-in-loop at src/OGClubRaffle.sol:149: Loop Contains `require`/`revert` (5 places)\n[low] unchecked-return at src/OGClubClubs.sol:127: Unchecked Return (11 places)\n[low] uninitialized-local-variable at src/OGClubRaffle.sol:149: Uninitialized Local Variable (6 places)\n[low] unspecific-solidity-pragma at src/OGClubClubs.sol:2: Unspecific Solidity Pragma (8 places)\n[low] unused-public-function at src/OGClubRaffle.sol:262: Public Function Not Used Internally (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c0cff3dace8ee6e51ff97bf07f935c58e85b6a7ef4c909c97f1728660ee9c1bb","verifiedTreeHash":"b2cd4e9952c47411512f1a6e04e817a18f2e3c51","verifierVersion":"0.1.0+560ab6a2"}]}