{"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":"78c972e2-d51c-49ff-8d5a-52829863b45e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"314618adf5e53dab7f31cbd742891d36d916f9dd2843ddc2a778f410803dfa8c","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":"0411c5d7198ad8c1a16ecb024876f857f48be176d20e6a74394c973c9f6b11ad","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":"d60cd26aae4fe1699defa0c4307c7a93d8c3c93e1913ce6f589d1b53faafad65","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":"12c13fc0f2411a04f9e4a0557b13b1b1ceeb7bc0d4a427045302a7eb81569b68","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":"ceb1dbd17125acd4505d4916658f1689f89e48ac804355d44656984a3f588668","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":"ad62aa091521a416cfd8688d09d60f38fc14947e087cc2e77a197680f5e474b7","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":"1a01f75c60ec51997af051a6c4fbabbbdf1583f14740409338d031ab846693df","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":"8d6292f330892f7c87a43a7ca6358eedcc22b18f2534666bbbc928375fdf801e","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"c345598f036f09890a9a50ae86b00d8ad3d2ee523146a37f9e47f0c61995ea1f","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). Each level's floor holds the last, (0,0) stays the back corner: L1 x<10,y<10; L2 x<14,y<10; L3 L2 plus x<10,y<16 (an L); L4 x<16,y<16. Use 4 constant uint256 masks, bit y*16 + x.\n- Tiles: one uint256 bitmap per club. A floor piece must have every tile in its level's mask, 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), floorMask(level), 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 along y = 0 (positions x), side 1 along x = 0 (positions y). 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. Wall length per level: side 0 10,14,14,16; side 1 10,10,16,16. It must fit that length 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), 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; each level's mask exactly (x 10..13 from L2, the L's front wing from L3, x 14..15 or the corner only at L4) reverts before, works after; door rules at every level; 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 level 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, footprints and rotations never overlap, never cover the door, stay in the mask, 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":"5e984eb461258a250de3806cc9be69a97004f606d6b36408602ba6685002cb68","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"78c972e2-d51c-49ff-8d5a-52829863b45e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2382-continue-delivered-og-club"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51569","feedbackHash":"b0ffca019c96bd580f29b83fa2388deac813030fc3bc2c8bbd0a33af54800f74","nodeKey":"adapt_contract_project","submissionHash":"314618adf5e53dab7f31cbd742891d36d916f9dd2843ddc2a778f410803dfa8c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"7a6379ace90f4b71d4a60d739961fdc9424ffc7f578e6f97f3b61c3fecab60b0","nodeKey":"audit_economics","submissionHash":"0411c5d7198ad8c1a16ecb024876f857f48be176d20e6a74394c973c9f6b11ad","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51452","feedbackHash":"ab6426766b22981a53f8df48ad606784e9fa71b4b8ecc65cdff9194027dbaa43","nodeKey":"audit_flow","submissionHash":"d60cd26aae4fe1699defa0c4307c7a93d8c3c93e1913ce6f589d1b53faafad65","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52179","feedbackHash":"1609c6eef2c2a73c6972b5514921270805991bd5f6d2ce968d50a483db78cc40","nodeKey":"audit_imported_code","submissionHash":"12c13fc0f2411a04f9e4a0557b13b1b1ceeb7bc0d4a427045302a7eb81569b68","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51488","feedbackHash":"0a136a882753420f25d5172b94bf74ad5bb6eee8e1962fac29b5bc6bc467d963","nodeKey":"audit_judge","submissionHash":"ceb1dbd17125acd4505d4916658f1689f89e48ac804355d44656984a3f588668","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51451","feedbackHash":"b9151a3ba28935ab80fe2b106552a1c35b84bab63b22d7dd571612b14de5fcb6","nodeKey":"audit_math","submissionHash":"ad62aa091521a416cfd8688d09d60f38fc14947e087cc2e77a197680f5e474b7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52669","feedbackHash":"19d00cc6e8807251662acb86ab34c242df1fcf3f1527759a6532e056b486a64e","nodeKey":"audit_permissions","submissionHash":"1a01f75c60ec51997af051a6c4fbabbbdf1583f14740409338d031ab846693df","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52601","feedbackHash":"ffecae119e2e9895c76ee3e31bd0db54c410ba64f7c8bf97ee2b0ee5084cfd06","nodeKey":"manifest","submissionHash":"8d6292f330892f7c87a43a7ca6358eedcc22b18f2534666bbbc928375fdf801e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52159","feedbackHash":"44906aaeb25b4bb6f202e190f7f839b01eeead450448eb9a31399df73c030501","nodeKey":"write_foundry_tests","submissionHash":"c345598f036f09890a9a50ae86b00d8ad3d2ee523146a37f9e47f0c61995ea1f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d08a05f0cc8151c98154a6bcd01a8307ce17a57366c0b120c2d2f747dc7248e8","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3f6a9bdd601cb99f","findings":[],"hash":"0411c5d7198ad8c1a16ecb024876f857f48be176d20e6a74394c973c9f6b11ad","nodeId":"b875614f-7cd9-4974-94a2-bd0d0fdfedba","outcome":"completed","summary":"I found no economic defects I could back with a failing input in the new `OGClubClubs` code, so `.imd-findings.json` has an empty findings list. It also has 61 coverage rows: all 57 listed entry points plus 4 invariants. 46 entry points are `holds` and 11 are `unreached`. `forge build` and all 223 tests pass on the tree as it is.\n\n**What I checked against the three guides (Economic Security, Invariant, Flow Gap):**\n- **Mint payments:** each payment burns half (rounded down) and sends the rest to the vault. The contract then checks the exact amounts the burn address and vault received and the exact amount taken from the payer. A token that takes a fee on transfer makes the whole call revert, and the contract never holds OG.\n- **Minting by Swarm Pepe:**\n  - The \"already minted\" check runs before `ownerOf`, and the flag is set before payment and is never cleared.\n  - Delegation is skipped when the caller is the holder, or switched off when the registry is `address(0)`.\n  - I confirmed against the live mainnet contracts that the delegate.xyz v2 call's argument order is right. Swarm Pepe (`0x999c…7bdb`) reverts on a pepe that doesn't exist.\n  - The registry is also deployed at the same address on Sepolia.\n- **Upgrades:** they charge the next level's price with the same split and checks. Each level's floor contains the last, so placed pieces stay valid. I checked the four floor masks bit by bit, and the door tiles and wall lengths match the spec.\n- **Furniture custody:** every furniture transfer into the clubs contract either records a piece or reverts. That includes furniture minted straight to the contract, which arrives with `from = 0` and no placement data, and batch transfers. Nothing ever leaves, so pieces always equal furniture held. The 285-piece cap equals the room's real capacity (254 floor + 31 wall), so it can't run out early.\n- **Manifest and scripts:** `launch.json` has the 11 clubs constructor arguments in order, uses backward references only, and its notes are 3,123 characters. Sepolia-only is stated for MockOG and the mock pepe. The mainnet script checks that the vault's `token()` matches before deploying from `DEPLOYER_KEY`.\n\n**Leads I dropped:**\n- Upgrades and placements keep working while the sale is closed. The spec gates only minting, and ADAPTATION.md and the tests say this is intended.\n- A delegate who mints keeps the club, and a temporary holder (borrowed or rented pepe) can use up a pepe's one mint. Both follow the spec.\n- The owner can change a footprint until its first placement. That is an owner trust assumption.\n- The static-analysis \"reentrancy-balance\" lead on the payment function is the intended before-and-after balance check, and both entry points are guarded.\n\n**Not covered:** the raffle (except where it mints furniture into the clubs contract) and the furniture minter timelock functions. These are unchanged by this task, so their rows say `unreached`.\n\nI wrote no proof tests. The build left `cache/` and `out/` behind, which weren't there at the start, so I deleted them; the tree is unchanged apart from the findings file.\n\nSources (only for the Swarm Pepe address; I checked it on chain myself):\n- [launch-459 brief (SwarmPepe contract address)](https://github.com/identity-md-launches/launch-459-build-official-website-swarm)\n- [launch-451 brief](https://github.com/identity-md-launches/launch-451-focus-swarm-pepe-contract-s)","treeHash":null,"usage":{"cachedInputTokens":2290578,"inputTokens":50,"model":"claude-opus-5-5","outputTokens":30581,"runtime":"claude","turns":27,"wallClockMs":474472}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02f22d6f13810ca8","findings":[{"citation":"resolved","description":"The constructor only rejects a zero vault and a vault equal to the predicted self address. A vault equal to the burn sink 0x000000000000000000000000000000000000dEaD is accepted. In _mintClub both legs then go to the same recipient, so _checkReceipt(BURN_ADDRESS, burnBefore, burned) sees an increase of `price` instead of `burned` and reverts with UnexpectedTokenDebit. Because `vault` is immutable, the deployed contract can never sell a club; the misconfiguration is only discovered at the first purchase, after deployment and after setFootprint/setSaleOpen have been paid for. The README states that this configuration 'cannot pass the distinct recipient accounting' but relies on the operator never making the mistake rather than on the constructor.","line":101,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, 0x000000000000000000000000000000000000dEaD, 100_000e18, furniture, owner, royalty) succeeds. Owner calls setSaleOpen(true). Alice approves 100_000e18 and calls mintClub(). Expected: the constructor refuses the vault (or the mint succeeds). Actual: mintClub() reverts with UnexpectedTokenDebit() on every attempt, by every payer, forever. Verified in test/scratch/ReviewLows.t.sol::test_VaultEqualsBurnSinkIsAcceptedButEveryMintReverts.","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == BURN_ADDRESS, which makes every mint revert forever"},{"citation":"resolved","description":"Only a zero vault is rejected. If the operator passes the OG token address or the furniture address as `vault`, deployment succeeds, the sale works, and `price - price/2` of every purchase is transferred to an ERC-20 or ERC-1155 contract that has no function to move ERC-20 balances out. Neither OGClubFurniture nor a standard ERC-20 can recover it, and `vault` is immutable, so the revenue is lost rather than reaching the farm vault's season budget.","line":96,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, address(token), 100_000e18, furniture, owner, royalty) (or vault = address(furniture)) succeeds. Owner opens the sale; Alice approves and calls mintClub(). Expected: constructor rejects a vault that is one of the protocol's own asset contracts. Actual: mint succeeds and token.balanceOf(address(token)) (resp. token.balanceOf(address(furniture))) becomes 50_000e18 with no recovery path. Verified in test/scratch/ReviewLows.t.sol::test_VaultEqualsTokenIsAcceptedAndRevenueIsStrandedInTokenContract and ::test_VaultEqualsFurnitureIsAcceptedAndRevenueIsStrandedInFurniture.","severity":"low","snippet":"        _nonzero(vault_);","title":"Constructor accepts vault == token or vault == furniture, stranding half of all revenue in a contract with no withdrawal"},{"citation":"resolved","description":"A wrong-length `data` reverts with empty return data. OpenZeppelin 5.0.2's ERC1155 _doSafeTransferAcceptanceCheck treats an empty reason from the receiver as 'not an ERC1155Receiver' and raises ERC1155InvalidReceiver(address(clubs)). The user therefore sees an error claiming the clubs contract cannot receive furniture at all, indistinguishable from a broken receiver, instead of an error naming the bad layout data. Every other rejection in the hook (NotFurniture, BadAmount, NotClubOwner, NoFootprint, OutOfRoom, ...) is a named custom error and is forwarded verbatim. Wallets and front ends that decode the error will give the wrong diagnosis.","line":155,"path":"src/OGClubClubs.sol","reproduction":"Alice owns club 1 and one unit of furniture id 1 with footprint (1,1). Alice calls furniture.safeTransferFrom(alice, address(clubs), 1, 1, new bytes(127)). Expected: a named error such as BadPlacementData(). Actual: the call reverts with abi.encodeWithSignature(\"ERC1155InvalidReceiver(address)\", address(clubs)) (36 bytes). Verified in test/scratch/ReviewLows.t.sol::test_MalformedDataSurfacesAsERC1155InvalidReceiver.","severity":"low","snippet":"        if (data.length != 128) revert();","title":"Malformed placement data reverts without a reason, which OZ 5.0.2 rewrites as ERC1155InvalidReceiver(clubs)"},{"citation":"resolved","description":"DeployClubsMainnet.deploy validates only the chain id and the footprint JSON. OG_TOKEN and FARM_VAULT come from two independent environment variables and are never cross-checked, although OGClubFarmVault exposes token(). If FARM_VAULT is a vault for a different token (or any address that is not a farm vault), the immutable clubs contract sends the vault half of every purchase to a contract whose seasons distribute a different token, so the OG revenue is stranded there: OGClubFarmVault has no function to move any token other than its own. The constructor cannot do this check itself (it must run on an empty chain), so the script is the only place it can be done before the immutable value is set.","line":124,"path":"script/DeployClubs.s.sol","reproduction":"chainId 1. Deploy MockOG `og` and MockOG `other`; deploy OGClubFarmVault(other, owner) as `wrongVault`. Call DeployClubsMainnet.deploy(Config{token: og, vault: wrongVault, price: 100_000e18, furniture, owner, royalty}, \"[]\"). Expected: the script reverts because wrongVault.token() != og. Actual: deployment succeeds; after the owner opens the sale and Alice mints, og.balanceOf(wrongVault) == 50_000e18 while wrongVault.token() is `other`, and the vault cannot pay those OG out. Verified in test/scratch/ReviewLows.t.sol::test_MainnetScriptAcceptsVaultOfAnotherToken.","severity":"low","snippet":"        if (block.chainid != 1 && block.chainid != 31337) revert WrongChain();","title":"Mainnet script deploys against FARM_VAULT without checking that vault.token() is OG_TOKEN"},{"citation":"resolved","description":"The README requires the mainnet OWNER to be a Safe, but DeployClubsMainnet.deploy starts the broadcast as config.owner and then calls clubs.setFootprint(...) as that same account. A Safe cannot sign a forge broadcast, so the script as written cannot be executed for the documented mainnet configuration; the operator either deploys from an EOA owner (contradicting the README) or has to hand-craft the constructor transaction. Deploying from a separate DEPLOYER key and passing OWNER only as the constructor argument needs no owner signature at all for the deployment.","line":126,"path":"script/DeployClubs.s.sol","reproduction":"Set OWNER to a Safe address (a contract with no private key) and run `forge script script/DeployClubs.s.sol:DeployClubsMainnet --broadcast` on chain id 1. Expected: the clubs contract is deployed by the deployer key with the Safe as owner. Actual: the broadcast requires a signer for OWNER; with --sender a Safe there is no key, so nothing can be broadcast, and the footprint configuration calls inside the same broadcast would also need the Safe's signature.","severity":"low","snippet":"        vm.startBroadcast(config.owner);","title":"Mainnet script broadcasts from OWNER, so a Safe owner cannot run it"},{"citation":"resolved","description":"The ClubFull guard can never fire through valid placements because the tile bitmap (100 tiles minus the two reserved door tiles) rejects a 99th one-tile piece with TileTaken or BlocksDoor first. The existing test only reaches the branch through a storage cheat. A cap that is not reachable gives no protection and misleads readers of the ABI about how many pieces a club can hold.","line":26,"path":"src/OGClubClubs.sol","reproduction":"Place 1x1 furniture (footprint 1,1) on every tile except (0,4) and (1,4): 98 successful placements. Expected under the constant's claim: two more placements are accepted before ClubFull. Actual: placement 99 reverts with TileTaken (any occupied tile) or BlocksDoor (either door tile); pieceCount(clubId) can never exceed 98 and ClubFull is dead code. Matches test/ClubsPlacement.t.sol::test_All98UsableTilesFillAndNo99th100thOr101stPlacementFits.","severity":"info","snippet":"    uint256 public constant MAX_PIECES = 100;","title":"MAX_PIECES = 100 is unreachable: the 10x10 room minus two door tiles holds at most 98 pieces"},{"citation":"resolved","description":"ClubMinted(id, to, payer, burned, toVault) is emitted after _safeMint returns. A contract recipient's onERC721Received runs inside _safeMint and may transfer the club onward (or place furniture into it). Indexers that replay the log stream therefore see Transfer(0 -> to), Transfer(to -> other) and possibly FurniturePlaced before ClubMinted names `to` as the recipient. No funds are at risk; the mint itself is reentrancy-guarded. Emitting ClubMinted before _safeMint (or after _mint and before the receiver check) keeps the log order consistent with state.","line":135,"path":"src/OGClubClubs.sol","reproduction":"Deploy a contract Flipper whose onERC721Received calls clubs.transferFrom(address(this), alice, id). Fund it with `price` and have it call mintClub(). Expected: ClubMinted appears before any later transfer of the same id. Actual: the recorded logs contain Transfer(0, flipper, 1), Transfer(flipper, alice, 1) and only then ClubMinted(1, flipper, flipper, ...), while ownerOf(1) is already alice. Verified in test/scratch/ReviewLows.t.sol::test_ClubMintedEventNamesRecipientThatNoLongerHoldsTheClub.","severity":"info","snippet":"        _safeMint(to, id);","title":"ClubMinted is emitted after the ERC-721 receiver callback, so its `to` can already be stale"}],"hash":"12c13fc0f2411a04f9e4a0557b13b1b1ceeb7bc0d4a427045302a7eb81569b68","nodeId":"e1c35aab-07b6-46f9-9c66-2d80c39a14b1","outcome":"completed","summary":"The findings file validates: all seven path/line/snippet anchors match the tree, and every finding is backed by a passing reproduction in `test/scratch/ReviewLows.t.sol`.\n\n## Review result\n\nThe as-arrived `OGClubClubs` has no critical, high or medium defect that I could reproduce. Payment splitting, receipt checks, reentrancy guards, placement geometry, door reservation, footprint locking and the `from`-based placement authorization all held up against concrete attack attempts, and the existing 143 club, furniture, vault, raffle and staking tests pass with the project's fuzz seed. The findings are five lows and two informational notes, all written to `.imd-findings.json` with reproductions.\n\n**Findings**\n- **Low, `src/OGClubClubs.sol:101`.** The constructor accepts `vault == 0xdEaD`. Both payment legs then go to the same address, the receipt check fails, and every mint reverts forever because the vault is immutable.\n- **Low, `src/OGClubClubs.sol:96`.** The constructor accepts the token or the furniture contract as the vault. Half of all revenue is then sent to a contract with no withdrawal path.\n- **Low, `src/OGClubClubs.sol:155`.** Wrong-length placement data reverts with no reason. OpenZeppelin 5.0.2 rewrites that into `ERC1155InvalidReceiver(clubs)`, so the user is told the clubs contract cannot receive furniture at all.\n- **Low, `script/DeployClubs.s.sol:124`.** The mainnet script never checks that the farm vault's token is the OG token. A vault for another token is accepted and strands the OG revenue.\n- **Low, `script/DeployClubs.s.sol:126`.** The mainnet script broadcasts from OWNER, which the README says must be a Safe. A Safe cannot sign a forge broadcast, so the documented configuration cannot be deployed with this script.\n- **Info, `src/OGClubClubs.sol:26`.** The 100-piece cap is dead code. The grid holds at most 98 pieces, so `ClubFull` is unreachable through valid play.\n- **Info, `src/OGClubClubs.sol:135`.** `ClubMinted` is emitted after the ERC-721 receiver callback, so a contract recipient can move the club before the event names it as the holder.\n\n**Trust assumptions, not defects.** A furniture-approved operator can permanently lock a holder's furniture into that holder's club. The owner can change an unplaced footprint after furniture is in circulation, close the sale, and change the metadata prefix until frozen. MockOG mints freely and is Sepolia-only. All of these are documented in the README.\n\n**Scope.** Read in full: `OGClubClubs`, `OGClubFurniture`, `OGClubFarmVault`, `MockOG`, `script/DeployClubs.s.sol`, `launch.json`, README, ADAPTATION.md, the club test base and placement and deployment suites, and both protected test files. Not read within budget and unchanged by this task: `OGClubStaking`, `OGClubRaffle`, the two libraries, `script/Deploy.s.sol`. Not reachable in the tree: the protected owners test imports `floor/OwnerChecks.sol`, which is not supplied, and the delegate.xyz v2 registry exists only on chain.\n\n**Notes for the adapter.** The manifest notes are 3,596 characters, under the limit, and every contract's argument count matches its constructor. The new `uint256[3] upgradePrices` parameter will appear as three separate manifest entries, and the 16-by-16 mask with bit `y*16 + x` uses exactly 256 bits, so the door tiles become bits 64 and 65. A constructor must not call the Swarm Pepe or delegate contracts, since the launch rehearses constructors on an empty chain.","treeHash":null,"usage":{"cachedInputTokens":1507096,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":28604,"runtime":"claude","turns":31,"wallClockMs":709861}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7cb215928f3c9473","findings":[{"citation":"resolved","description":"Access x asymmetry seam. onERC1155Received reads the footprint (kind and size) at execution time, and the placement data abi.encode(clubId,x,y,rot) does not commit to either. setFootprint (line 347, onlyOwner) can change w, h and the wall flag of any id until its first placement. For a floor piece, rot is a rotation 0..3 and (x,y) a tile; for a wall piece, rot is reused as the side and x as the wall position. Data valid for one interpretation (e.g. y=0, rot 0 or 1, small x) is valid for the other, so an owner footprint edit (a correction, or a front-run) that lands before a holder's pending transfer silently places the piece somewhere the holder never chose. Placement is irreversible (no removal/relocation) and consumes the club's single slot for that design (AlreadyHasDesign) forever, and the first placement also locks the edited footprint globally. Fix without changing the design: let the data carry the expected kind/size (e.g. a 5th word or packing w,h,wall), or reject when the footprint changed after a user-supplied version; at minimum document that placements should not be sent while footprints of that id may change.","line":243,"path":"src/OGClubClubs.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.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 {MockSwarmPepe} from \"src/mocks/MockSwarmPepe.sol\";\nimport {IDelegateRegistry} from \"src/interfaces/IDelegateRegistry.sol\";\n\ncontract FootprintRaceTest is Test {\n    OGClubClubs clubs;\n    OGClubFurniture furniture;\n    address alice = address(0xA11CE);\n\n    function setUp() public {\n        MockOG token = new MockOG(address(this));\n        furniture = new OGClubFurniture(address(this), address(this));\n        OGClubFarmVault vault = new OGClubFarmVault(token, address(this));\n        MockSwarmPepe pepes = new MockSwarmPepe();\n        clubs = new OGClubClubs(\n            IERC20(address(token)), address(vault), 100e18, IERC1155(address(furniture)), address(this),\n            address(this), IERC721(address(pepes)), IDelegateRegistry(address(0)), 200e18, 400e18, 800e18\n        );\n        clubs.setSaleOpen(true);\n        pepes.mint(alice, 7);\n        token.mint(alice, 100e18);\n        vm.startPrank(alice);\n        token.approve(address(clubs), 100e18);\n        clubs.mintClub(7);\n        vm.stopPrank();\n        furniture.grantMinter(address(this));\n        uint256[] memory ids = new uint256[](1);\n        uint256[] memory amounts = new uint256[](1);\n        ids[0] = 5;\n        amounts[0] = 1;\n        furniture.mintBatch(alice, ids, amounts);\n        clubs.setFootprint(5, 1, 1, false);\n    }\n\n    function test_PendingPlacementReinterpretedAfterFootprintKindChange() public {\n        clubs.setFootprint(5, 1, 1, true);\n        vm.prank(alice);\n        furniture.safeTransferFrom(alice, address(clubs), 5, 1, abi.encode(uint256(7), uint8(3), uint8(0), uint8(1)));\n        OGClubClubs.Piece[] memory pieces = clubs.piecesOf(7);\n        assertEq(pieces.length, 1);\n        assertFalse(pieces[0].wall, \"floor placement silently became a permanent wall piece\");\n    }\n}","reproduction":"Clubs deployed (delegates=0), sale open; alice mints club #7 from pepe 7 (level 1); alice holds furniture id 5; owner setFootprint(5,1,1,false) (1x1 floor). Alice submits furniture.safeTransferFrom(alice, clubs, 5, 1, abi.encode(uint256(7), uint8(3), uint8(0), uint8(1))) intending floor tile (3,0), rotation 1. Owner's setFootprint(5,1,1,true) is mined first. Expected: alice's placement reverts (kind changed). Actual: it succeeds as a wall piece on side 1 at position 3; piecesOf(7)[0].wall == true, hasDesign(7,5) == true, footprint 5 now locked, so alice can never put design 5 on her floor. Verified with the proof test below (assertFalse(pieces[0].wall) fails).","severity":"low","snippet":"        if (footprint.wall) {\n            uint32 mask = _wallMask(_levels[clubId], footprint.w, x, y, rot);","title":"Pending furniture placement is reinterpreted (floor vs wall, dimensions) when the owner edits an unlocked footprint first, and is then permanent"}],"hash":"1a01f75c60ec51997af051a6c4fbabbbdf1583f14740409338d031ab846693df","nodeId":"9cbfa0d5-bff8-4a0a-a74f-f19ae4074b1f","outcome":"completed","summary":"I found one low-severity issue in `OGClubClubs` and nothing high or critical. The findings and coverage are in `.imd-findings.json`. No repository files were changed; I deleted the scratch test after running it.\n\n**Finding 1 (low): a pending furniture placement can be read differently, and then can't be undone** (`src/OGClubClubs.sol:243`, `onERC1155Received` together with `setFootprint`)\n- **Cause:** the placement data `(clubId, x, y, rot)` doesn't say whether the piece is meant for the floor or the wall, or what size it is. The contract reads that from the footprint when the transfer runs. Until an id is first placed, the owner can still change its footprint.\n- **Reproduction:**\n  1. Alice owns club #7 (minted from Pepe 7) and furniture id 5, a 1×1 floor piece.\n  2. She sends a transfer meant to put it on floor tile (3,0) with rotation 1.\n  3. The owner's `setFootprint(5,1,1,true)`, which turns id 5 into a wall piece, is mined first.\n  4. Alice's transfer then succeeds as a wall piece on side 1 at position 3.\n- **Result:** the piece can never be moved, club #7 has used its one copy of design 5, and footprint 5 is now locked for every club.\n- **Proof:** a Foundry test showing this fails on the current code, as expected. It is included as the finding's proof.\n- **Suggested fix:** have the placement data also carry the expected wall flag and size, and reject a placement when they no longer match.\n\n**What I checked and found working as intended:**\n- **Minting a club with a Pepe:** checks run in the right order. Only the holder can mint, or a wallet the holder delegated for this Pepe through delegate.xyz with the default (empty) rights. A registry address of zero turns delegation off. A Pepe's mint is recorded before payment and before the club is delivered, it is never cleared, and there is no burn function.\n- **`upgradeClub`:** only the club's holder or an approved account can upgrade, and the caller pays. It stops at level 4 and is protected against reentry.\n- **Floor and wall rules:** the four floor masks, the wall lengths, both door rules, the one-of-each-design rule, and the 285-piece cap all match the spec.\n- **Constructor checks:** it rejects a vault that is the burn address, the token or the furniture contract.\n- **Mainnet deploy script:** it checks the vault's token before deploying, deploys from `DEPLOYER_KEY`, and passes `OWNER` straight to the constructor.\n- **`launch.json`:** it has only the allowed keys, `OGClubClubs` has 11 arguments, and the notes are 3,123 characters.\n\n**Risks the README already documents, so not reported:**\n- Approving someone on your club, or on your furniture, lets them place furniture permanently.\n- Any delegated wallet can mint, and it keeps the club.\n- Upgrades still work while the sale is closed.\n\n**Coverage:** all 57 listed entry points have a row, plus two invariant rows. The four other contracts weren't changed by this task. For them I traced the access-control guards (owner-only setters, minter and spender roles, the two-step ownership handover) and found them in order. I did not trace their accounting or randomness, so eight entry points are marked unreached: the vault's `claim`, `stake` and `unstake`, and the raffle's `enter`, `commitDraw`, `draw`, `claim` and `claimTo`. The static-analysis leads either point at those unchanged contracts or, for `_pay` in `OGClubClubs`, at reentrancy that the reentrancy guard and the exact payment checks already block.","treeHash":null,"usage":{"cachedInputTokens":1131437,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":21027,"runtime":"claude","turns":17,"wallClockMs":225273}},{"artifacts":[],"attempt":2,"bundleHash":"25018f472eb4158b31db380b6f846a66dacdfb8719dcf2ac6ab723379676f4f9","device":"b9a8101a18ac2f7f","findings":[],"hash":"314618adf5e53dab7f31cbd742891d36d916f9dd2843ddc2a778f410803dfa8c","nodeId":"4b67d095-c3d7-42ec-8a6c-d65375fae8b5","outcome":"completed","summary":"Repaired the launch manifest: constructor and manifest now use eleven scalar arguments, and notes fit the limit. Updated scripts, tests, README, and ADAPTATION.md.\n\nPassed locally:\n\n- `forge build`\n- `forge test`: 223 passed in 351 seconds with the required seed\n- `forge fmt --check`\n- All 9 Python checks\n\nBuild configuration and dependencies remain unchanged.","treeHash":"a9d107a451ef5f2603320d0991fc6fbc0f2a48b5","usage":{"cachedInputTokens":8996096,"inputTokens":324541,"model":"gpt-6-astra","outputTokens":88663,"runtime":"codex","turns":24,"wallClockMs":3474900}},{"artifacts":[],"attempt":1,"bundleHash":"2363b4e37fef6a2146a905f6ceec44b00c4870aa88f4055ac284b71d27d06b05","device":"cc86b49d3c401897","findings":[],"hash":"8d6292f330892f7c87a43a7ca6358eedcc22b18f2534666bbbc928375fdf801e","nodeId":"92dfdfc7-c7cb-456b-bae5-83d6463637f2","outcome":"completed","summary":"The committed launch.json already describes the accepted tree correctly, so no file change was needed.\n\nWhat I verified:\n\n- **Constructor arguments match the source.** All seven entries (MockOG, OGClubFurniture, OGClubFarmVault, OGClubStaking, OGClubRaffle, MockSwarmPepe, OGClubClubs) have one static word per parameter in declaration order. OGClubClubs takes eleven scalar arguments, including the MockSwarmPepe reference, the delegate.xyz v2 registry address, and the three upgrade prices. Every reference points backward and fills an address.\n- **Owner handling.** Every owner and royalty receiver argument is `$owner`. No contract uses msg.sender as owner, and no constructor makes a dependency call.\n- **Schema.** Only kind, contracts and notes are present. Names are unique and under 32 characters. The notes run to about 3,100 characters and state that MockOG and MockSwarmPepe are Sepolia-only and that the raffle's first grants remain an owner step.\n- **Checks.** The repo's launch manifest test passes. The full suite passes under the verifier's fuzz seed, and the format check is clean.\n\n| Check | Result |\n|---|---|\n| forge test with verifier seed | 223 passed, 0 failed |\n| forge fmt --check | clean |\n| test/test_launch.py | 4 passed |\n\nThe working tree is clean and nothing outside launch.json was touched. The manifest is ready for the review and attestation steps that follow.","treeHash":"a9d107a451ef5f2603320d0991fc6fbc0f2a48b5","usage":{"cachedInputTokens":202564,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":2634,"runtime":"claude","turns":6,"wallClockMs":238882}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"79373c79d1351eba","findings":[{"citation":"resolved","description":"The review fix rejects vault_ equal to the predicted self-address, BURN_ADDRESS, the token and the furniture, on the stated rationale that a contract with no way to move $OG must not be a revenue destination. The same rationale applies to the two new contract-typed constructor arguments, the Swarm Pepe ERC-721 (pepes_) and the delegate registry (delegates_), neither of which can release ERC-20 balances, yet the check accepts them. The constructor also does not reject vault_ == royaltyReceiver, which is harmless (an EOA/Safe is a fine vault) and is mentioned only for completeness. Impact is limited to a misconfigured deployment: every mint and upgrade then sends the non-burned half (ceil(amount/2)) to an address that can never spend it, permanently, with no owner recovery path by design. Boundary: constructor sentinel branch; assumption: 'contract arguments that cannot move tokens are rejected as vault'; actual: only three of five such arguments are. Suggested fix: add `|| vault_ == address(pepes_) || (address(delegates_) != address(0) && vault_ == address(delegates_))` to the same condition, and add the two cases to test_NewConstructorRejections.","line":134,"path":"src/OGClubClubs.sol","reproduction":"Deploy OGClubClubs(token, vault_ = address(pepes), 100, furniture, owner, royaltyReceiver, pepes, IDelegateRegistry(address(0)), 200, 400, 800). Expected (by the rule the review added for token/furniture): revert UnexpectedTokenDebit. Actual: deployment succeeds. Then setSaleOpen(true); pepes.mint(alice, 7); alice approves and calls mintClub(7): token.balanceOf(address(pepes)) == 50 and those tokens are unrecoverable (MockSwarmPepe / a stock ERC-721 has no ERC-20 withdrawal). Verified with a scratch Foundry test (test/scratch/VaultPepes.t.sol, PASS = defect present).","severity":"low","snippet":"            vault_ == address(this) || vault_ == BURN_ADDRESS || vault_ == address(token_)","title":"Constructor's revenue-destination check omits the other contract arguments (pepes, delegates): vault == pepes deploys and strands the vault half"}],"hash":"ad62aa091521a416cfd8688d09d60f38fc14947e087cc2e77a197680f5e474b7","nodeId":"08786bbd-cd22-430b-b0d6-0f09a688b413","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. The scratch tests were removed and no tracked file changed.\n\n**Result: the math in OGClubClubs holds. One low finding.**\n\nWhat I verified in my area (Math Precision, Boundary, Numerical Gap):\n\n- **Floor geometry.** An exhaustive scratch test placed a 1x1 piece on all 256 tiles at every level, then every footprint (1x1, 2x1, 2x2, 4x4) at all four rotations on every origin at every level. Acceptance matched the spec's regions, the L-shaped level 3 notch, and the two door tiles exactly. The four mask constants match bit `y*16 + x` for every bit.\n- **Wall geometry.** Every side (including 2 and 3), width 1 to 4, start 0 to 19 and `y = 1` at every level. Lengths are 10/14/14/16 and 10/10/16/16, the side 1 door position is never covered, and `y != 0` or side above 1 always reverts.\n- **Payment split.** Burned is the floor of half, the vault gets the remainder, so the sum is conserved exactly for odd prices. Receipt and debit checks are exact and the contract balance stays zero.\n- **Narrow types.** Level fits uint8, wall bitmaps fit uint32 since start plus width never exceeds 16, and no shift can exceed 255 bits because `x + w <= 16` is checked first.\n- **External boundaries.** The delegate registry address in launch.json has code on both Sepolia and mainnet. Minting via a 1-id `mintBatch` to the clubs contract reverts with `BadPlacementData`, so pieces always equal furniture held.\n- Full suite passes (`forge build`, `forge test`, `forge fmt --check`). OGClubClubs runtime is 15,524 bytes.\n\n**The finding (low).** The constructor rejects the burn sink, the token and the furniture as vault, but not the two new contract arguments. Deploying with `vault_ == address(pepes)` succeeds, and a mint then leaves the vault half stranded in the Pepe NFT contract. The reproduction is in the finding. Static-analysis leads in staking and the raffle were checked and are false positives (bounded casts, exact remainder carry).\n\n**Coverage.** 57 entry-point rows: 44 hold, 1 finding, 15 unreached. The unreached rows are the farm vault and raffle functions that this task did not change and that fall outside my area.","treeHash":null,"usage":{"cachedInputTokens":1289224,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":32003,"runtime":"claude","turns":31,"wallClockMs":580390}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7143d892ed24d728","findings":[],"hash":"bebd602f12bd69d7dfa050582f1acf9b22084c60a9d40eb93519eabeb9f034fe","nodeId":"4b67d095-c3d7-42ec-8a6c-d65375fae8b5","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":8308608,"inputTokens":335528,"model":"gpt-6-astra","outputTokens":69139,"runtime":"codex","turns":24,"wallClockMs":2897913}},{"artifacts":[],"attempt":1,"bundleHash":"bfcd7c6f7cea2b16028cb37c70b1954b590bd007be81b7e28d8feae597073801","device":"6b37e4ab65246705","findings":[{"description":"The brief asks for a constructor parameter `uint256[3] upgradePrices`. The contract takes level2Price_, level3Price_ and level4Price_ as separate uint256 arguments. The code comment and launch.json notes explain why: the launch manifest only accepts static scalar words. Behaviour matches the brief (each price must be > 0, prices are immutable, and upgradePrice(1..3) returns them). Only the ABI differs. Callers following the brief's signature will see a different constructor.","line":122,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(..., pepes, delegates, [p2,p3,p4]) does not compile. The deployed signature is (..., pepes, delegates, p2, p3, p4). test/ClubsReview.t.sol ClubsReviewFixesTest.test_ConstructorRejections checks each price's ZeroPrice rejection on the scalar form.","severity":"info","title":"Upgrade prices are three scalar constructor arguments, not uint256[3] as the brief states"},{"description":"DeployClubsSepolia always passes the real v2 registry address 0x00000000000000447e69651d841bD8D104Bed493, as requested. On a local chain (31337) where that address has no code, a non-holder's mintClub reverts with empty data (the bool return cannot be decoded) instead of NotPepeHolder. A holder is unaffected because the registry is only queried for non-holders. This fails closed, so it is not a security issue. Only the error differs on local deployments.","line":119,"path":"script/DeployClubs.s.sol","reproduction":"vm.chainId(11155111) in forge (no registry code): script.deploy(owner, owner, \"[]\"); a stranger calls clubs.mintClub(id) for someone else's pepe and gets an empty revert, not NotPepeHolder(). Covered by test/ClubsReviewDeploy.t.sol test_SepoliaScriptWiresPepesRealRegistryPricesAndWallFootprints.","severity":"info","title":"Sepolia script on a chain without the delegate.xyz registry fails closed with an empty revert"}],"hash":"c345598f036f09890a9a50ae86b00d8ad3d2ee523146a37f9e47f0c61995ea1f","nodeId":"56aa18f7-f6d3-4315-8578-d1630e56ea4b","outcome":"completed","summary":"I added three test files under `test/`. The full suite passes with the verifier's fuzz seed: 258 tests, 0 failures, up from 223. `forge build` and `forge fmt --check` also pass. I found no defects in `OGClubClubs`; every new behaviour matched the brief when checked against a model I wrote separately from the contract's own masks.\n\n**`test/ClubsReview.t.sol`** (unit and fuzz tests)\n- **Minting by pepe:**\n  - The holder mints club #pepeId and the event carries the pepe id.\n  - These callers revert `NotPepeHolder`:\n    - a non-holder, including someone approved on the pepe as an ERC-721 operator;\n    - a delegation for the wrong pepe id, the wrong collection, non-zero rights, or from someone who isn't the holder;\n    - a delegation left behind after the pepe changes hands;\n    - any delegation when the registry is `address(0)`.\n  - A second mint reverts `AlreadyMinted`, even after the pepe and the club are sold.\n  - A pepe that doesn't exist reverts; ids 0 and near the maximum work; the sale being closed blocks minting.\n- **Levels:**\n  - Each level's floor mask matches the brief's coordinate rules bit for bit, and contains the level before it.\n  - Every one of the 256 tiles is tried at all four levels: it is out of the room, a door, or accepted, and the usable tile counts come out at 98, 138, 198 and 254.\n  - Upgrades to level 4 have exact splits, receipts and both events; a fifth upgrade reverts `MaxLevel`.\n  - Only the holder or an approved account can upgrade, and the caller pays; being one wei short rolls back.\n  - The level and existing pieces' tiles survive transfers and upgrades.\n- **Walls:**\n  - Every combination of level, side, width (1–4) and start position (0–17) is checked against the model.\n  - Side 1 door: positions 3..4 and 4..5 revert, 5..6 works.\n  - Pieces past the end fail, then fit after an upgrade.\n  - Overlap is caught per side; the two sides and the floor are independent; `y ≠ 0` or `rot > 1` reverts.\n  - The footprint's wall flag is part of the lock.\n- **One of each:** a second copy reverts `AlreadyHasDesign` on floor and wall; another club is unaffected; the rule still holds after a transfer.\n- **Review fixes:**\n  - Each constructor rejection is tested.\n  - Nine malformed placement payloads each revert `BadPlacementData` without locking the footprint.\n  - A level-4 club takes 285 distinct one-wide designs, and the 286th reverts `ClubFull`.\n- **Fuzz:** 200 runs of random 40-step sequences mixing upgrades, floor and wall footprints, rotations and duplicate attempts, each compared with the model. A rejected placement must change nothing.\n\n**`test/ClubsReviewInvariant.t.sol`** (random call sequences)\n- A handler with four actors randomly mints pepes, transfers them, delegates, toggles the sale, mints clubs, upgrades, transfers and approves clubs, and places furniture. It predicts each call's success before making it.\n- The invariants checked after every call:\n  - every club id is a pepe that minted exactly once;\n  - the contract never holds any $OG;\n  - burned plus sent to the vault equals all mint and upgrade payments;\n  - the furniture held equals the pieces recorded;\n  - layouts stay in their level, never overlap and never cover a door;\n  - each club holds at most one of each design.\n- My first version produced some runs where nothing was placed, so I biased it toward authorized callers and in-room coordinates. A fixed-sequence test confirms placements, rejections and upgrades all actually happen.\n\n**`test/ClubsReviewDeploy.t.sol`** (deploy scripts)\n- **Sepolia:** the script wires up the mock pepe, the real registry address, the three upgrade prices and the wall rows from the repo's footprint JSON, then mints and upgrades a club end to end.\n- **Mainnet:** the script rejects a vault whose `token()` is wrong or zero, an ordinary wallet given as the vault, and bad footprint JSON, all before the deployer key sends anything. The matching vault deploys with `OWNER` as owner and the sale closed.\n\nI wrote two info","treeHash":"a57dbbde76c821eab4c4b57009c32d7337670d9d","usage":{"cachedInputTokens":2629993,"inputTokens":58,"model":"claude-opus-5-5","outputTokens":53250,"runtime":"claude","turns":31,"wallClockMs":950371}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5835e48821d8827d","findings":[{"citation":"resolved","description":"onERC1155Received reads the footprint kind and size at execution time (line 238 `Footprint storage footprint = _footprints[id];`, line 243 `if (footprint.wall) {`), and the placement data abi.encode(clubId, x, y, rot) does not commit to either. setFootprint (line 347, onlyOwner) may change w, h and the wall flag of an id until its first placement locks it. For a floor piece rot is a rotation 0..3 and (x,y) a tile; for a wall piece rot is the side and x the wall position, with y == 0. Data that is valid under one interpretation (y = 0, rot 0 or 1, small x) is also valid under the other, so an owner footprint edit mined before a holder's pending safeTransferFrom silently places the piece as a different kind or size at a position the holder never chose. Placement is irreversible, consumes the club's single slot for that design (AlreadyHasDesign) and locks the edited footprint globally. Reported by the permissions specialist; reproduced with their proof, which fails on this tree. Impact needs an owner edit to land first (a correction or front-run by a trusted role), so low. Minimal fix that keeps the design: have the data also carry the expected (w, h, wall) and revert when the stored footprint differs, or document that placements must not be sent while an id's footprint is still editable.","line":243,"path":"src/OGClubClubs.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.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 {MockSwarmPepe} from \"src/mocks/MockSwarmPepe.sol\";\nimport {IDelegateRegistry} from \"src/interfaces/IDelegateRegistry.sol\";\n\ncontract FootprintRaceTest is Test {\n    OGClubClubs clubs;\n    OGClubFurniture furniture;\n    address alice = address(0xA11CE);\n\n    function setUp() public {\n        MockOG token = new MockOG(address(this));\n        furniture = new OGClubFurniture(address(this), address(this));\n        OGClubFarmVault vault = new OGClubFarmVault(token, address(this));\n        MockSwarmPepe pepes = new MockSwarmPepe();\n        clubs = new OGClubClubs(\n            IERC20(address(token)), address(vault), 100e18, IERC1155(address(furniture)), address(this),\n            address(this), IERC721(address(pepes)), IDelegateRegistry(address(0)), 200e18, 400e18, 800e18\n        );\n        clubs.setSaleOpen(true);\n        pepes.mint(alice, 7);\n        token.mint(alice, 100e18);\n        vm.startPrank(alice);\n        token.approve(address(clubs), 100e18);\n        clubs.mintClub(7);\n        vm.stopPrank();\n        furniture.grantMinter(address(this));\n        uint256[] memory ids = new uint256[](1);\n        uint256[] memory amounts = new uint256[](1);\n        ids[0] = 5;\n        amounts[0] = 1;\n        furniture.mintBatch(alice, ids, amounts);\n        clubs.setFootprint(5, 1, 1, false);\n    }\n\n    function test_PendingPlacementReinterpretedAfterFootprintKindChange() public {\n        clubs.setFootprint(5, 1, 1, true);\n        vm.prank(alice);\n        furniture.safeTransferFrom(alice, address(clubs), 5, 1, abi.encode(uint256(7), uint8(3), uint8(0), uint8(1)));\n        OGClubClubs.Piece[] memory pieces = clubs.piecesOf(7);\n        assertEq(pieces.length, 1);\n        assertFalse(pieces[0].wall, \"floor placement silently became a permanent wall piece\");\n    }\n}","reproduction":"Clubs deployed with delegates = address(0), sale open; alice holds pepe 7 and mints club 7 (level 1); alice holds furniture id 5; owner calls setFootprint(5, 1, 1, false). Alice sends furniture.safeTransferFrom(alice, clubs, 5, 1, abi.encode(uint256(7), uint8(3), uint8(0), uint8(1))) intending floor tile (3,0) with rotation 1. The owner's setFootprint(5, 1, 1, true) is mined first. Expected: alice's placement reverts because the footprint kind changed. Actual: it succeeds as a wall piece on side 1 at position 3; piecesOf(7)[0].wall == true, hasDesign(7, 5) == true, and footprint 5 is now locked, so alice can never place design 5 on her floor. Run: forge test --match-path test/scratch/Proof_623379b84427.t.sol (fails on this code at assertFalse(pieces[0].wall)).","severity":"low","snippet":"        if (footprint.wall) {","title":"Pending furniture placement is reinterpreted (floor vs wall, dimensions) if the owner edits the unlocked footprint first, and the result is permanent"},{"citation":"resolved","description":"The review fix rejects vault_ equal to the predicted self-address, BURN_ADDRESS, the token and the furniture, on the stated rationale that a contract with no way to move $OG must not be a revenue destination. The constructor gained two more contract-typed arguments in this change, the Swarm Pepe ERC-721 (pepes_) and the delegate registry (delegates_), and neither can release an ERC-20 balance, yet the same condition accepts them. With vault_ == address(pepes_) every mint and upgrade sends the non-burned half (amount - amount/2) to the ERC-721 contract permanently, with no recovery path by design. Reported by the math specialist; reproduced with the attached test, which fails on this tree (the expected revert does not happen) and passes once the condition also rejects pepes_ and a nonzero delegates_. Impact is limited to a misconfigured deployment, so low. Fix: extend the same condition with `|| vault_ == address(pepes_) || (address(delegates_) != address(0) && vault_ == address(delegates_))` and add both cases to test_ConstructorRejections / test_NewConstructorRejections.","line":134,"path":"src/OGClubClubs.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {OGClubClubs} from \"src/OGClubClubs.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\nimport {MockSwarmPepe} from \"src/mocks/MockSwarmPepe.sol\";\nimport {IDelegateRegistry} from \"src/interfaces/IDelegateRegistry.sol\";\n\n/// @dev Fails on the current code: the constructor accepts the Swarm Pepe ERC-721 as vault, although it\n///      rejects the token and furniture contracts for the same reason (no way to move $OG out).\ncontract VaultPepesProofTest is Test {\n    function test_ConstructorRejectsVaultEqualToPepes() public {\n        MockOG token = new MockOG(address(this));\n        OGClubFurniture furniture = new OGClubFurniture(address(this), address(this));\n        MockSwarmPepe pepes = new MockSwarmPepe();\n        vm.expectRevert(OGClubClubs.UnexpectedTokenDebit.selector);\n        new OGClubClubs(\n            IERC20(address(token)),\n            address(pepes),\n            100e18,\n            IERC1155(address(furniture)),\n            address(this),\n            address(this),\n            IERC721(address(pepes)),\n            IDelegateRegistry(address(0)),\n            200e18,\n            400e18,\n            800e18\n        );\n    }\n}","reproduction":"Deploy OGClubClubs(token, vault_ = address(pepes), 100e18, furniture, owner, royaltyReceiver, pepes, IDelegateRegistry(address(0)), 200e18, 400e18, 800e18). Expected (by the rule the constructor applies to token_ and furniture_): revert UnexpectedTokenDebit. Actual: deployment succeeds. Then setSaleOpen(true); pepes.mint(alice, 7); alice approves 100e18 and calls mintClub(7): token.balanceOf(address(pepes)) == 50e18 and MockSwarmPepe / a stock ERC-721 has no ERC-20 withdrawal, so those tokens are unrecoverable (verified in test/scratch/VaultPepes.t.sol, test_VaultEqualToPepesActual). Run: forge test --match-path test/scratch/Proof_VaultPepes.t.sol (fails on this code: 'next call did not revert as expected').","severity":"low","snippet":"            vault_ == address(this) || vault_ == BURN_ADDRESS || vault_ == address(token_)\n                || vault_ == address(furniture_)","title":"Constructor's vault sentinel check omits the new contract arguments: vault == pepes (or delegates) deploys and strands the vault half of every payment"},{"citation":"resolved","description":"The brief asks for a constructor parameter `uint256[3] upgradePrices`. The contract takes level2Price_, level3Price_ and level4Price_ as separate uint256 arguments; the code comment at line 112, the README and the launch.json notes state why (the launch manifest encodes one static word per entry). Each price is rejected when zero, all three are immutable, and upgradePrice(1..3) returns them, so every behavioural requirement holds. The tester reported this; confirmed by reading the signature and the launch manifest's eleven OGClubClubs entries. Not a defect in behaviour: callers following the brief's signature will see a different constructor ABI, which is worth knowing and nothing more.","line":122,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(..., pepes, delegates, [p2, p3, p4]) does not compile; the deployed signature is (..., pepes, delegates, p2, p3, p4). launch.json lists the three prices as the last three of eleven constructorArgs. test/ClubsReview.t.sol test_ConstructorRejections exercises the ZeroPrice rejection of each scalar price.","severity":"info","snippet":"        uint256 level2Price_,\n        uint256 level3Price_,\n        uint256 level4Price_","title":"Upgrade prices are three scalar constructor arguments rather than the brief's uint256[3]; behaviour matches, only the ABI differs"}],"hash":"ceb1dbd17125acd4505d4916658f1689f89e48ac804355d44656984a3f588668","nodeId":"62e9e207-c361-4383-a7fa-7c7fdc558ef4","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No tracked file was changed.\n\n**Outcome**\n\nThe OG Club clubs change is sound. The full suite passes (258 tests across 40 suites, including fuzz and invariants), `forge fmt --check` is clean, the clubs runtime is 15,524 bytes, and the floor masks, door tiles, wall lengths and the 285-piece cap all check out against the brief. The launch manifest has the right keys, eleven ordered scalar words for the clubs constructor, and marks both mocks as Sepolia-only.\n\n**Findings kept** (both reproduced, both low)\n\n- **Pending placement reinterpreted after a footprint edit** (permissions specialist). The placement hook reads the footprint's kind and size at execution time and the encoded data does not commit to them, so an owner edit mined before a holder's transfer turns a floor placement into a permanent wall piece. The specialist's proof fails on this tree at the wall assertion, so it is attached.\n- **Constructor accepts the Pepe contract as vault** (math specialist). The sentinel check rejects token and furniture but not the two new contract arguments. Deploying with the Pepe ERC-721 as vault succeeds, and a mint leaves half the payment stranded there. My own proof test fails on this tree because the expected revert never happens.\n\n**Kept as info**: the upgrade prices are three scalar constructor arguments rather than the brief's fixed array. Behaviour matches and the reason is documented, so only the ABI differs.\n\n**Dropped**: the tester's note about an empty revert on chains without the delegate registry. The registry exists on Sepolia and a holder is never affected, so it is not a defect in the deliverable.\n\n**Coverage**: every one of the 57 entry points is answered. Two rows point at finding 1 (the placement hook and `setFootprint`); the rest hold, with the raffle libraries traced as well.","treeHash":null,"usage":{"cachedInputTokens":873128,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":27408,"runtime":"claude","turns":28,"wallClockMs":458564}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d63ea36a2b809080","findings":[],"hash":"d60cd26aae4fe1699defa0c4307c7a93d8c3c93e1913ce6f589d1b53faafad65","nodeId":"b5d17dc3-7352-40ad-8b7a-8e010d39b780","outcome":"completed","summary":"The review is complete. The findings file holds an empty list and a full coverage record, and the working tree has no other changes.\n\n**Result: no reproducible defect in the assigned area.** I traced OGClubClubs against the Execution Trace, Periphery and First Principles guides and could not break any path.\n\nWhat I verified:\n\n- **Build and checks.** forge build, forge fmt --check and all 223 tests pass, including the fuzz and invariant suites. The manifest validation script in test/test_launch.py also passes.\n- **Minting.** The sale gate, once-ever flag, holder check, delegate check with a zero registry disabled, exact half-burn split with receipt and debit checks, event before safe delivery, and the reentrancy guard all hold. Club id equals Pepe id with no sequential allocation.\n- **Levels and walls.** The four floor masks match the brief bit for bit, every level contains the previous one, the door tiles stay reserved at all levels, wall lengths per side and level match, side 1 position 4 is never coverable, and the three bitmaps are independent. Wall and floor pieces share the one-per-design rule, and 285 pieces is reachable before ClubFull.\n- **Placement hook.** Only the furniture contract can call it, amount must be 1, data must be four canonical words, authorization is for the ERC-1155 sender, and the hook makes no external calls so nothing can re-enter it. Minting furniture straight into clubs and raffle claimTo into clubs both fail.\n- **Constructor and scripts.** All required rejections are present and the constructor makes no external calls, so the factory's empty-chain rehearsal passes. The mainnet script checks the vault's token before broadcasting from the deployer key and passes OWNER directly. launch.json has only the schema keys, seven ordered contracts and 3123 characters of notes stating MockOG is Sepolia-only.\n- **Live registry.** The delegate.xyz v2 address has code on both chains, and an eth_call with the interface's selector returns a clean false, so the interface matches the deployed contract.\n- **Scope.** The diff from the base commit touches only OGClubClubs, its interface and mock, scripts, tests, README, ADAPTATION.md and launch.json. The other four contracts are byte-identical, so their entry points are marked holds on that basis.\n\nOne deliberate deviation worth noting for the judge: the brief names a `uint256[3]` upgrade-price constructor parameter, but the delivery takes three separate uint256 values because the launch manifest format has no array words. This is documented in the README and notes and is consistent across scripts, tests and launch.json, so I did not report it as a defect.\n\nThe static-analysis leads on OGClubClubs (reentrancy-balance in the payment helper, state change after external call in mintClub) are guarded by nonReentrant and by view-only calls respectively, and I did not promote them.","treeHash":null,"usage":{"cachedInputTokens":1479456,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":35395,"runtime":"claude","turns":36,"wallClockMs":553283}}],"verification":[{"checks":[{"durationMs":14743,"exitCode":0,"name":"build","output":"Compiling 102 files with Solc 0.8.26\nSolc 0.8.26 finished in 14.61s\nCompiler run successful!\n","passed":true},{"durationMs":42406,"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 2.28ms (1.28ms CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsPepeTest\n[PASS] test_AuditMintEventPrecedesReceiverTransfer() (gas: 770245)\n[PASS] test_DelegatedWalletPaysAndReceivesAndRevocationAndTransferInvalidateDelegation() (gas: 1167549)\n[PASS] test_IdZeroAndMaxAreValidPepeIdsNoSequentialAllocation() (gas: 615789)\n[PASS] test_NewConstructorRejections() (gas: 21579)\n[PASS] test_NonexistentPepeAndNonHolderRevert() (gas: 188543)\n[PASS] test_OneClubPerPepeEverEvenAfterPepeAndClubTransfers() (gas: 245695)\n[PASS] test_ZeroRegistryDisablesDelegationButHolderWorks() (gas: 307121)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.23ms (1.65ms CPU time)\n\nRan 9 tests for test/ClubsLaunch.t.sol:ClubsLevelsTest\n[PASS] test_ExpansionBoundariesEveryTileOfPieceAndOldTilesRemain() (gas: 2740327)\n[PASS] test_FloorDoorNeverOpensAtAnyLevel() (gas: 1274321)\n[PASS] test_FloorMasksExactlyMatchEveryCoordinateAndContainPreviousLevel() (gas: 359898)\n[PASS] test_NoReturnTokenUpgradesAndZeroBurnPriceOne() (gas: 912512)\n[PASS] test_OnlyClubHolderTokenApprovedOrOperatorCanUpgradeAndCallerPays() (gas: 767260)\n[PASS] test_UpgradeReceiptMutationsRevertEntirePaymentAndLevel() (gas: 1895547)\n[PASS] test_UpgradeReentrancyGuardAndTaxedTokenRejection() (gas: 2125783)\n[PASS] test_UpgradeShortAllowanceRollsBackBurnAndLevel() (gas: 191434)\n[PASS] test_UpgradesExactOddSplitsEventsAndPricesToMax() (gas: 698224)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 6.50ms (5.25ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171200)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 16115)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 632024)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 130959)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287594)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160915)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 477377)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 8.09ms (1.20ms CPU time)\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498289)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 810486)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384721)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 553700)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 9.04ms (2.65ms CPU time)\n\nRan 13 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263703)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 740494)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158911)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 758396)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 346962)\n[PASS] test_LevelOneAll98UsableTilesFillWithDistinctDesigns() (gas: 33627397)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742846)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1312764)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2659153)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2070894)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219643)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 776324)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 203522)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 32.76ms (30.68ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558650, ~: 558520)\nLogs:\n  Bound result 25441\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.95ms (40.90ms 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 44.98ms (44.36ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352126, ~: 1352235)\nLogs:\n  Bound result 2\n  Bound result 1\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 59.44ms (59.62ms CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsDoorAndIndependentFloor() (gas: 4916913)\n[PASS] test_ClubFullReachableAt285DistinctDesignsWithoutStorageCheats() (gas: 90050750)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesTransfer() (gas: 1518785)\n[PASS] test_WallDoorAtEveryLevel() (gas: 1153395)\n[PASS] test_WallDoorOverlapSideValidationAndFootprintFlagLock() (gas: 1434300)\n[PASS] test_WallEventsAndMissingAndOutOfBoundsViews() (gas: 402659)\n[PASS] test_WallLengthsAtEveryLevelAndExtensionAfterUpgrade() (gas: 6476624)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 84.77ms (60.71ms CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23739707)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14465439)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10566630)\n[PASS] test_MainnetScriptDeploysFromSeparateKeyWithContractOwnerAndLeavesSetupToOwner() (gas: 9502399)\nLogs:\n  OGClubClubs 0x30A83F5e57Fa28a89b559850E586e08549eCbBc1\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df26000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc00000000000000000000000052e9a3dde7ff1018cc104248afb1c29e7b211f3800000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  vault 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x52e9a3DDE7Ff1018Cc104248afb1c29E7B211F38\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen false\n  OWNER must send these setFootprint calls to OGClubClubs before opening the sale:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After reviewing footprints and metadata, OWNER may open the sale with:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5909504)\n[PASS] test_MockPepePublicMintIsSepoliaFixtureAndCannotRemint() (gas: 2802391)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14902)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18532537)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_SevenContractFactoryDeploymentInOneTransactionPreservesOwnersAndBootstrap() (gas: 52712045)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 140.39ms (269.13ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32763, ~: 32179)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 96919, ~: 78189)\nLogs:\n  Bound result 2\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 397.89ms (398.70ms CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 228329, ~: 231651)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1331360, ~: 1147816)\nLogs:\n  Bound result 2\n  Bound result 3\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134953)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1061042)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 831430)\n[PASS] test_ContractHolderThatCannotReceiveReverts() (gas: 742322)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1546958)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 903309)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 795370)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 248969)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746018)\n[PASS] test_FullRoomRejectsEverythingElse() (gas: 28200069)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142493)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73410)\n[PASS] test_InterfacesAndImmutables() (gas: 142253)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649248)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360724)\n[PASS] test_MintPaysFromCallerAndClosingSaleStopsMinting() (gas: 627681)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196771)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489393)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 359264)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1204372)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239561)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1460684)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 282642)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1478600)\n[PASS] test_TileTakenViewBounds() (gas: 56647)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1112309)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1014100)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 448218)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 442.76ms (848.25ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1178666, ~: 913488)\nLogs:\n  Bound result 3470\n  Bound result 405\n  Bound result 16\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283001, ~: 283052)\nLogs:\n  Bound result 374573560914785\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219264, ~: 1219445)\nLogs:\n  Bound result 7\n  Bound result 15852891580\n  Bound result 75365\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 442.35ms (895.87ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596099, ~: 595918)\nLogs:\n  Bound result 25441\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169333, ~: 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 441.14ms (457.05ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3711016, ~: 3702293)\nLogs:\n  Bound result 5\n  Bound result 3\n  Bound result 3\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 438.92ms (437.04ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1610057, ~: 1071604)\nLogs:\n  Bound result 56\n  Bound result 1\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241127, ~: 240936)\nLogs:\n  Bound result 25441\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 443.03ms (628.98ms 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\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\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 1.56s (11.94ms CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchFuzzTest\n[PASS] testFuzz_LevelsWallsFloorShapesRotationsAndDuplicateDesigns(bytes32) (runs: 256, μ: 34623490, ~: 34554447)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.56s (1.55s 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  | 1396  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1365  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1368  | 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 100\n  Bound result 1801209601\n  Bound result 514264337593543950335\n  Bound result 802441982665966680381\n  Bound result 3770\n  Bound result 1715822325026283\n  Bound result 1001\n  Bound result 2500000\n  Bound result 51132745256951644\n  Bound result 864000\n  Bound result 197484\n  Bound result 285417151703336834468\n  Bound result 2140\n  Bound result 292\n  Bound result 8100124\n  Bound result 100000\n  Bound result 218\n  Bound result 8156\n  Bound result 5017\n  Bound result 6568\n  Bound result 0\n  Bound result 169\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.75s (1.74s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1001\n  Bound result 85\n  Bound result 0\n  Bound result 3438\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 514264337593543950334\n  Bound result 4182\n  Bound result 80007\n  Bound result 1283\n  Bound result 467247246909763\n  Bound result 96\n  Bound result 1138\n  Bound result 0\n  Bound result 876281281145568259943\n  Bound result 0\n  Bound result 4446\n  Bound result 0\n  Bound result 1001\n  Bound result 7018\n  Bound result 10001\n  Bound result 539\n  Bound result 0\n  Bound result 1001\n  Bound result 1113731936\n  Bound result 514264337593543950335\n  Bound result 418567\n  Bound result 1000\n  Bound result 1758387870208029253347\n  Bound result 810102641677011692061\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 2178\n  Bound result 0\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 509400473211552030066\n  Bound result 436\n  Bound result 999240972\n  Bound result 4127\n  Bound result 14150907204445651\n  Bound result 8\n  Bound result 56\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.03s (2.03s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 85\n  Bound result 0\n  Bound result 0\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 514264337593543950334\n  Bound result 1540\n  Bound result 80007\n  Bound result 1285\n  Bound result 467247246909763\n  Bound result 1001\n  Bound result 96\n  Bound result 1232\n  Bound result 82\n  Bound result 876281281145568259943\n  Bound result 56\n  Bound result 1397390876\n  Bound result 0\n  Bound result 1001\n  Bound result 86400\n  Bound result 676867264536554726638\n  Bound result 10001\n  Bound result 1101\n  Bound result 1001\n  Bound result 1001\n  Bound result 3904\n  Bound result 514264337593543950335\n  Bound result 418567\n  Bound result 1000\n  Bound result 291513663957342826958\n  Bound result 35050428203713779786\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 2344\n  Bound result 2794781754\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 2225301080739768388982\n  Bound result 133759814001700323143\n  Bound result 6032\n  Bound result 295871\n  Bound result 14150907204445651\n  Bound result 8\n  Bound result 56\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.12s (2.11s CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19232, ~: 18133)\nLogs:\n  Bound result 20085\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 630125, ~: 376954)\nLogs:\n  Bound result 38\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.78s (2.79s CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2505324, ~: 1987171)\nLogs:\n  Bound result 2\n  Bound result 3\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 21192)\n[PASS] test_ClosedSaleAndNonHolder() (gas: 170658)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 767355)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208278)\n[PASS] test_NonReceiverRollsBackPaymentAndPepeEligibility() (gas: 805099)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1487824)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1821861)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242315)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 388943)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1787580)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1831713)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 702052)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 2.95s (2.95s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 94708567, ~: 94661449)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.95s (2.94s 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                     | 1065  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1112  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1121  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1092  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1120  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1086  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\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 12\n  Bound result 0\n  Bound result 15\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 19\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 18\n  Bound result 14\n  Bound result 1100\n  Bound result 3\n  Bound result 14\n  Bound result 2\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 34\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 17\n  Bound result 11\n  Bound result 0\n  Bound result 2\n  Bound result 9\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 7\n  Bound result 8\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 1144\n  Bound result 39\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 5\n  Bound result 1\n  Bound result 10\n  Bound result 7\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 13\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 7\n  Bound result 3\n  Bound result 12\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 7\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 505\n  Bound result 36\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 5\n  Bound result 406\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.35s (5.34s 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 370533853\n  Bound result 50000000000\n  Bound result 1001\n  Bound result 710974177468\n  Bound result 9142\n  Bound result 940\n  Bound result 8517\n  Bound result 2753\n  Bound result 3093\n  Bound result 1001\n  Bound result 1001\n  Bound result 99999990482\n  Bound result 3859\n  Bound result 1001\n  Bound result 42417130257\n  Bound result 2015\n  Bound result 100000009142\n  Bound result 30610956\n  Bound result 9694319242400227985443935\n  Bound result 1001\n  Bound result 6312699999811120151578447\n  Bound result 299884\n  Bound result 1086164586\n  Bound result 3\n  Bound result 247\n  Bound result 1086164586\n  Bound result 391\n  Bound result 3399171411\n  Bound result 34238034135\n  Bound result 510856\n  Bound result 322817436\n  Bound result 714373347631\n  Bound result 0\n  Bound result 895\n  Bound result 31\n  Bound result 77920\n  Bound result 91820909964\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.36s (7.36s 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 773316215\n  Bound result 42500000000\n  Bound result 1001\n  Bound result 462149177468\n  Bound result 9443\n  Bound result 1138\n  Bound result 8773\n  Bound result 2794\n  Bound result 3882\n  Bound result 1001\n  Bound result 1001\n  Bound result 92499993737\n  Bound result 4088\n  Bound result 1001\n  Bound result 69395040302\n  Bound result 2015\n  Bound result 23104960751\n  Bound result 30610956\n  Bound result 11194883013182221486784821\n  Bound result 1001\n  Bound result 5504665384154534223322828\n  Bound result 299884\n  Bound result 3664\n  Bound result 3\n  Bound result 750\n  Bound result 92500011375\n  Bound result 964\n  Bound result 85475565203\n  Bound result 143711833610\n  Bound result 510856\n  Bound result 1725\n  Bound result 506552886862\n  Bound result 0\n  Bound result 2384\n  Bound result 31\n  Bound result 77920\n  Bound result 132933447016\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.53s (7.52s 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  | 804   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 846   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 805   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 840   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 801   | 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 11\n  Bound result 8\n  Bound result 1\n  Bound result 6\n  Bound result 7\n  Bound result 3\n  Bound result 10\n  Bound result 11\n  Bound result 1\n  Bound result 6\n  Bound result 5\n  Bound result 3\n  Bound result 8\n  Bound result 2\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 8\n  Bound result 6\n  Bound result 4\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 0\n  Bound result 6\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 8\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.03s (8.02s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_EveryHeldFurniturePieceHasExactlyOnePermanentLayoutEntry\n[PASS] invariant_PaymentsNeverRemainInClubsAndSplitExactly\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| ClubsHandler | mint         | 2081  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2060  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 2021  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2030  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.69s (14.67s CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchInvariantTest\n[PASS]\nClubsLaunchInvariantTest invariants:\n[PASS] invariant_AllLayoutsMatchIndependentModelCustodyAndUniqueDesigns\n[PASS] invariant_EveryClubIsAPepeMintedExactlyOnceAndAllPaymentsConserved\n ClubsLaunchInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| LaunchClubsHandler | approveClub  | 1057  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | delegatePepe | 1058  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | mint         | 1016  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | place        | 1070  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | sale         | 1032  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferClub | 1000  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferPepe | 990   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | upgrade      | 969   | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 22.98s (22.97s 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  | 1599  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1500  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1551  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1583  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1546  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1435  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1535  | 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 9480\n  Bound result 212\n  Bound result 4\n  Bound result 201\n  Bound result 0\n  Bound result 5\n  Bound result 6819\n  Bound result 200\n  Bound result 4\n  Bound result 140\n  Bound result 7\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 42\n  Bound result 275\n  Bound result 18611\n  Bound result 183\n  Bound result 142\n  Bound result 7\n  Bound result 14\n  Bound result 64\n  Bound result 0\n  Bound result 13\n  Bound result 0\n  Bound result 9345\n  Bound result 40\n  Bound result 45271\n  Bound result 272\n  Bound result 3\n  Bound result 2\n  Bound result 7382\n  Bound result 210\n  Bound result 3\n  Bound result 157\n  Bound result 172800\n  Bound result 120\n  Bound result 191\n  Bound result 1\n  Bound result 186\n  Bound result 5393\n  Bound result 111\n  Bound result 1740\n  Bound result 266\n  Bound result 129\n  Bound result 102\n  Bound result 132\n  Bound result 0\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 42.24s (42.23s CPU time)\n\nRan 32 test suites in 42.24s (128.91s CPU time): 223 tests passed, 0 failed, 0 skipped (223 total tests)\n","passed":true},{"durationMs":94,"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\":148,\"README.md\":514,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":210,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":399,\"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\":70,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":729,\"test/ClubsAdversarialInvariant.t.sol\":482,\"test/ClubsDeployment.t.sol\":349,\"test/ClubsInvariant.t.sol\":335,\"test/ClubsLaunch.t.sol\":722,\"test/ClubsLaunchInvariant.t.sol\":464,\"test/ClubsPlacement.t.sol\":321,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":180,\"test/OGClubClubs.t.sol\":573,\"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/ClubLaunchMocks.sol\":22,\"test/helpers/ClubsTestBase.sol\":86,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/LaunchLayoutModel.sol\":70,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4597,"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/OGClubClubs.sol:206: Reentrancy in OGClubClubs._pay(uint256) (src/OGClubClubs.sol#206-219):\n[high/medium] reentrancy-balance at src/OGClubClubs.sol:206: Reentrancy in OGClubClubs._pay(uint256) (src/OGClubClubs.sol#206-219):\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[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":756,"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:156: 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:148: Literal Instead of Constant (36 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:126: Unchecked Return (12 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":"314618adf5e53dab7f31cbd742891d36d916f9dd2843ddc2a778f410803dfa8c","verifiedTreeHash":"a9d107a451ef5f2603320d0991fc6fbc0f2a48b5","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":12072,"exitCode":0,"name":"build","output":"Compiling 102 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.96s\nCompiler run successful!\n","passed":true},{"durationMs":36921,"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.80ms (1.19ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171200)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 16115)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 632024)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 130959)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287594)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160915)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 477377)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.55ms (915.40µs CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsPepeTest\n[PASS] test_AuditMintEventPrecedesReceiverTransfer() (gas: 770245)\n[PASS] test_DelegatedWalletPaysAndReceivesAndRevocationAndTransferInvalidateDelegation() (gas: 1167549)\n[PASS] test_IdZeroAndMaxAreValidPepeIdsNoSequentialAllocation() (gas: 615789)\n[PASS] test_NewConstructorRejections() (gas: 21579)\n[PASS] test_NonexistentPepeAndNonHolderRevert() (gas: 188543)\n[PASS] test_OneClubPerPepeEverEvenAfterPepeAndClubTransfers() (gas: 245695)\n[PASS] test_ZeroRegistryDisablesDelegationButHolderWorks() (gas: 307121)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.13ms (1.36ms CPU time)\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498289)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 810486)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384721)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 553700)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.28ms (3.05ms CPU time)\n\nRan 9 tests for test/ClubsLaunch.t.sol:ClubsLevelsTest\n[PASS] test_ExpansionBoundariesEveryTileOfPieceAndOldTilesRemain() (gas: 2740327)\n[PASS] test_FloorDoorNeverOpensAtAnyLevel() (gas: 1274321)\n[PASS] test_FloorMasksExactlyMatchEveryCoordinateAndContainPreviousLevel() (gas: 359898)\n[PASS] test_NoReturnTokenUpgradesAndZeroBurnPriceOne() (gas: 912512)\n[PASS] test_OnlyClubHolderTokenApprovedOrOperatorCanUpgradeAndCallerPays() (gas: 767260)\n[PASS] test_UpgradeReceiptMutationsRevertEntirePaymentAndLevel() (gas: 1895547)\n[PASS] test_UpgradeReentrancyGuardAndTaxedTokenRejection() (gas: 2125783)\n[PASS] test_UpgradeShortAllowanceRollsBackBurnAndLevel() (gas: 191434)\n[PASS] test_UpgradesExactOddSplitsEventsAndPricesToMax() (gas: 698224)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 9.24ms (7.33ms CPU time)\n\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\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 11.73ms (10.77ms CPU time)\n\nRan 13 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263703)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 740494)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158911)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 758396)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 346962)\n[PASS] test_LevelOneAll98UsableTilesFillWithDistinctDesigns() (gas: 33627397)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742846)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1312764)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2659153)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2070894)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219643)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 776324)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 203522)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 23.90ms (26.86ms CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsDoorAndIndependentFloor() (gas: 4916913)\n[PASS] test_ClubFullReachableAt285DistinctDesignsWithoutStorageCheats() (gas: 90050750)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesTransfer() (gas: 1518785)\n[PASS] test_WallDoorAtEveryLevel() (gas: 1153395)\n[PASS] test_WallDoorOverlapSideValidationAndFootprintFlagLock() (gas: 1434300)\n[PASS] test_WallEventsAndMissingAndOutOfBoundsViews() (gas: 402659)\n[PASS] test_WallLengthsAtEveryLevelAndExtensionAfterUpgrade() (gas: 6476624)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 54.14ms (56.31ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558650, ~: 558520)\nLogs:\n  Bound result 25441\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 56.32ms (60.47ms 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 59.72ms (59.04ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32763, ~: 32179)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 96919, ~: 78189)\nLogs:\n  Bound result 2\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 60.62ms (58.00ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352126, ~: 1352235)\nLogs:\n  Bound result 2\n  Bound result 1\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 64.12ms (65.93ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2505324, ~: 1987171)\nLogs:\n  Bound result 2\n  Bound result 3\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 21192)\n[PASS] test_ClosedSaleAndNonHolder() (gas: 170658)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 767355)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208278)\n[PASS] test_NonReceiverRollsBackPaymentAndPepeEligibility() (gas: 805099)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1487824)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1821861)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242315)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 388943)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1787580)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1831713)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 702052)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 224.01ms (224.83ms CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 228329, ~: 231651)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1331360, ~: 1147816)\nLogs:\n  Bound result 1901325701007\n  Bound result 1\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134953)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1061042)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 831430)\n[PASS] test_ContractHolderThatCannotReceiveReverts() (gas: 742322)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1546958)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 903309)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 795370)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 248969)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746018)\n[PASS] test_FullRoomRejectsEverythingElse() (gas: 28200069)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142493)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73410)\n[PASS] test_InterfacesAndImmutables() (gas: 142253)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649248)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360724)\n[PASS] test_MintPaysFromCallerAndClosingSaleStopsMinting() (gas: 627681)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196771)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489393)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 359264)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1204372)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239561)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1460684)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 282642)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1478600)\n[PASS] test_TileTakenViewBounds() (gas: 56647)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1112309)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1014100)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 448218)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 224.18ms (237.66ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1610057, ~: 1071604)\nLogs:\n  Bound result 2\n  Bound result 1\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241127, ~: 240936)\nLogs:\n  Bound result 25441\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 348.59ms (401.14ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3711016, ~: 3702293)\nLogs:\n  Bound result 1\n  Bound result 6\n  Bound result 6\n  Bound result 6\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 348.68ms (351.42ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596099, ~: 595918)\nLogs:\n  Bound result 25441\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169333, ~: 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 1.30s (82.92ms CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchFuzzTest\n[PASS] testFuzz_LevelsWallsFloorShapesRotationsAndDuplicateDesigns(bytes32) (runs: 256, μ: 34623490, ~: 34554447)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.30s (1.29s CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1178666, ~: 913488)\nLogs:\n  Bound result 654240958611757776519\n  Bound result 3516\n  Bound result 5\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283001, ~: 283052)\nLogs:\n  Bound result 374573560914785\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219264, ~: 1219445)\nLogs:\n  Bound result 9\n  Bound result 1001\n  Bound result 14330505\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 1.30s (1.38s 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  | 1396  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1365  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1368  | 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 100\n  Bound result 1801209601\n  Bound result 514264337593543950335\n  Bound result 802441982665966680381\n  Bound result 3770\n  Bound result 1715822325026283\n  Bound result 1001\n  Bound result 2500000\n  Bound result 51132745256951644\n  Bound result 864000\n  Bound result 197484\n  Bound result 285417151703336834468\n  Bound result 2140\n  Bound result 292\n  Bound result 8100124\n  Bound result 100000\n  Bound result 218\n  Bound result 8156\n  Bound result 5017\n  Bound result 6568\n  Bound result 0\n  Bound result 169\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.33s (1.32s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1001\n  Bound result 85\n  Bound result 0\n  Bound result 3438\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 514264337593543950334\n  Bound result 4182\n  Bound result 80007\n  Bound result 1283\n  Bound result 467247246909763\n  Bound result 96\n  Bound result 1138\n  Bound result 0\n  Bound result 876281281145568259943\n  Bound result 0\n  Bound result 4446\n  Bound result 0\n  Bound result 1001\n  Bound result 7018\n  Bound result 10001\n  Bound result 539\n  Bound result 0\n  Bound result 1001\n  Bound result 1113731936\n  Bound result 514264337593543950335\n  Bound result 418567\n  Bound result 1000\n  Bound result 1758387870208029253347\n  Bound result 810102641677011692061\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 2178\n  Bound result 0\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 509400473211552030066\n  Bound result 436\n  Bound result 999240972\n  Bound result 4127\n  Bound result 14150907204445651\n  Bound result 8\n  Bound result 56\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.74s (1.74s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 85\n  Bound result 0\n  Bound result 0\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 514264337593543950334\n  Bound result 1540\n  Bound result 80007\n  Bound result 1285\n  Bound result 467247246909763\n  Bound result 1001\n  Bound result 96\n  Bound result 1232\n  Bound result 82\n  Bound result 876281281145568259943\n  Bound result 56\n  Bound result 1397390876\n  Bound result 0\n  Bound result 1001\n  Bound result 86400\n  Bound result 676867264536554726638\n  Bound result 10001\n  Bound result 1101\n  Bound result 1001\n  Bound result 1001\n  Bound result 3904\n  Bound result 514264337593543950335\n  Bound result 418567\n  Bound result 1000\n  Bound result 291513663957342826958\n  Bound result 35050428203713779786\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 2344\n  Bound result 2794781754\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 2225301080739768388982\n  Bound result 133759814001700323143\n  Bound result 6032\n  Bound result 295871\n  Bound result 14150907204445651\n  Bound result 8\n  Bound result 56\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.87s (1.86s CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19232, ~: 18133)\nLogs:\n  Bound result 20085\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 630125, ~: 376954)\nLogs:\n  Bound result 38\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.52s (2.77s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 94708567, ~: 94661449)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.52s (2.52s 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                     | 1065  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1112  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1121  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1092  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1120  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1086  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\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 12\n  Bound result 0\n  Bound result 15\n  Bound result 13\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 19\n  Bound result 0\n  Bound result 10\n  Bound result 1\n  Bound result 18\n  Bound result 14\n  Bound result 1100\n  Bound result 3\n  Bound result 14\n  Bound result 2\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 34\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 17\n  Bound result 11\n  Bound result 0\n  Bound result 2\n  Bound result 9\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 7\n  Bound result 8\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 0\n  Bound result 1144\n  Bound result 39\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 5\n  Bound result 1\n  Bound result 10\n  Bound result 7\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 13\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 7\n  Bound result 3\n  Bound result 12\n  Bound result 0\n  Bound result 3\n  Bound result 5\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 7\n  Bound result 0\n  Bound result 25\n  Bound result 0\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 17\n  Bound result 505\n  Bound result 36\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 0\n  Bound result 5\n  Bound result 406\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.46s (4.46s CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23739707)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14465439)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10566630)\n[PASS] test_MainnetScriptDeploysFromSeparateKeyWithContractOwnerAndLeavesSetupToOwner() (gas: 9502399)\nLogs:\n  OGClubClubs 0x30A83F5e57Fa28a89b559850E586e08549eCbBc1\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df26000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc00000000000000000000000052e9a3dde7ff1018cc104248afb1c29e7b211f3800000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  vault 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x52e9a3DDE7Ff1018Cc104248afb1c29E7B211F38\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen false\n  OWNER must send these setFootprint calls to OGClubClubs before opening the sale:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After reviewing footprints and metadata, OWNER may open the sale with:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5909504)\n[PASS] test_MockPepePublicMintIsSepoliaFixtureAndCannotRemint() (gas: 2802391)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14902)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18532537)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_SevenContractFactoryDeploymentInOneTransactionPreservesOwnersAndBootstrap() (gas: 52712045)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.48s (235.20ms 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 773316215\n  Bound result 42500000000\n  Bound result 1001\n  Bound result 462149177468\n  Bound result 9443\n  Bound result 1138\n  Bound result 8773\n  Bound result 2794\n  Bound result 3882\n  Bound result 1001\n  Bound result 1001\n  Bound result 92499993737\n  Bound result 4088\n  Bound result 1001\n  Bound result 69395040302\n  Bound result 2015\n  Bound result 23104960751\n  Bound result 30610956\n  Bound result 11194883013182221486784821\n  Bound result 1001\n  Bound result 5504665384154534223322828\n  Bound result 299884\n  Bound result 3664\n  Bound result 3\n  Bound result 750\n  Bound result 92500011375\n  Bound result 964\n  Bound result 1808941903\n  Bound result 143711833610\n  Bound result 510856\n  Bound result 1725\n  Bound result 429161260310\n  Bound result 0\n  Bound result 2384\n  Bound result 31\n  Bound result 77920\n  Bound result 132933447016\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.34s (6.33s 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 370533853\n  Bound result 50000000000\n  Bound result 1001\n  Bound result 710974177468\n  Bound result 9142\n  Bound result 940\n  Bound result 8517\n  Bound result 2753\n  Bound result 3093\n  Bound result 1001\n  Bound result 1001\n  Bound result 99999990482\n  Bound result 3859\n  Bound result 1001\n  Bound result 42417130257\n  Bound result 2015\n  Bound result 100000009142\n  Bound result 30610956\n  Bound result 9694319242400227985443935\n  Bound result 1001\n  Bound result 6312699999811120151578447\n  Bound result 299884\n  Bound result 1086164586\n  Bound result 3\n  Bound result 247\n  Bound result 1086164586\n  Bound result 391\n  Bound result 63265345731\n  Bound result 34238034135\n  Bound result 510856\n  Bound result 322817436\n  Bound result 774239521951\n  Bound result 0\n  Bound result 895\n  Bound result 31\n  Bound result 77920\n  Bound result 91820909964\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.53s (6.52s 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  | 804   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 846   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 805   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 840   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 801   | 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 11\n  Bound result 8\n  Bound result 1\n  Bound result 6\n  Bound result 7\n  Bound result 3\n  Bound result 10\n  Bound result 11\n  Bound result 1\n  Bound result 6\n  Bound result 5\n  Bound result 3\n  Bound result 1\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 8\n  Bound result 6\n  Bound result 4\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 11\n  Bound result 6\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 4\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 4\n  Bound result 10\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.70s (6.69s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_EveryHeldFurniturePieceHasExactlyOnePermanentLayoutEntry\n[PASS] invariant_PaymentsNeverRemainInClubsAndSplitExactly\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| ClubsHandler | mint         | 2081  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2060  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 2021  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2030  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.75s (12.74s CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchInvariantTest\n[PASS]\nClubsLaunchInvariantTest invariants:\n[PASS] invariant_AllLayoutsMatchIndependentModelCustodyAndUniqueDesigns\n[PASS] invariant_EveryClubIsAPepeMintedExactlyOnceAndAllPaymentsConserved\n ClubsLaunchInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| LaunchClubsHandler | approveClub  | 1057  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | delegatePepe | 1058  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | mint         | 1016  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | place        | 1070  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | sale         | 1032  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferClub | 1000  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferPepe | 990   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | upgrade      | 969   | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 19.58s (19.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  | 1599  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1500  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1551  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1583  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1546  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1435  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1535  | 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 9480\n  Bound result 212\n  Bound result 4\n  Bound result 201\n  Bound result 0\n  Bound result 5\n  Bound result 6819\n  Bound result 200\n  Bound result 4\n  Bound result 140\n  Bound result 7\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 42\n  Bound result 275\n  Bound result 18611\n  Bound result 183\n  Bound result 142\n  Bound result 7\n  Bound result 14\n  Bound result 64\n  Bound result 0\n  Bound result 13\n  Bound result 0\n  Bound result 9345\n  Bound result 40\n  Bound result 45271\n  Bound result 272\n  Bound result 3\n  Bound result 2\n  Bound result 7382\n  Bound result 210\n  Bound result 3\n  Bound result 157\n  Bound result 172800\n  Bound result 120\n  Bound result 191\n  Bound result 1\n  Bound result 186\n  Bound result 5393\n  Bound result 111\n  Bound result 1740\n  Bound result 266\n  Bound result 129\n  Bound result 102\n  Bound result 132\n  Bound result 0\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 36.80s (36.80s CPU time)\n\nRan 32 test suites in 36.81s (113.00s CPU time): 223 tests passed, 0 failed, 0 skipped (223 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\":148,\"README.md\":514,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":210,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":399,\"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\":70,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":729,\"test/ClubsAdversarialInvariant.t.sol\":482,\"test/ClubsDeployment.t.sol\":349,\"test/ClubsInvariant.t.sol\":335,\"test/ClubsLaunch.t.sol\":722,\"test/ClubsLaunchInvariant.t.sol\":464,\"test/ClubsPlacement.t.sol\":321,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":180,\"test/OGClubClubs.t.sol\":573,\"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/ClubLaunchMocks.sol\":22,\"test/helpers/ClubsTestBase.sol\":86,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/LaunchLayoutModel.sol\":70,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8d6292f330892f7c87a43a7ca6358eedcc22b18f2534666bbbc928375fdf801e","verifiedTreeHash":"a9d107a451ef5f2603320d0991fc6fbc0f2a48b5","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":14435,"exitCode":0,"name":"build","output":"Compiling 105 files with Solc 0.8.26\nSolc 0.8.26 finished in 14.33s\nCompiler run successful!\n","passed":true},{"durationMs":37561,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/ImportedAudit.t.sol:ImportedAuditTest\n[PASS] test_Audit07e7433_TargetExpiresAndCanBeReplacedButDrawnSeedIsFinal() (gas: 498289)\n[PASS] test_Audit1ecd3a7_AnyoneCanMintTestnetStakeAndBuyClubs() (gas: 810486)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384721)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 553700)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.24ms (1.51ms 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 2.87ms (1.75ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 171200)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 16115)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 632024)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 130959)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 287594)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160915)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 477377)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.39ms (949.32µs CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsPepeTest\n[PASS] test_AuditMintEventPrecedesReceiverTransfer() (gas: 770245)\n[PASS] test_DelegatedWalletPaysAndReceivesAndRevocationAndTransferInvalidateDelegation() (gas: 1167549)\n[PASS] test_IdZeroAndMaxAreValidPepeIdsNoSequentialAllocation() (gas: 615789)\n[PASS] test_NewConstructorRejections() (gas: 21579)\n[PASS] test_NonexistentPepeAndNonHolderRevert() (gas: 188543)\n[PASS] test_OneClubPerPepeEverEvenAfterPepeAndClubTransfers() (gas: 245695)\n[PASS] test_ZeroRegistryDisablesDelegationButHolderWorks() (gas: 307121)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.71ms (1.62ms CPU time)\n\nRan 9 tests for test/ClubsLaunch.t.sol:ClubsLevelsTest\n[PASS] test_ExpansionBoundariesEveryTileOfPieceAndOldTilesRemain() (gas: 2740327)\n[PASS] test_FloorDoorNeverOpensAtAnyLevel() (gas: 1274321)\n[PASS] test_FloorMasksExactlyMatchEveryCoordinateAndContainPreviousLevel() (gas: 359898)\n[PASS] test_NoReturnTokenUpgradesAndZeroBurnPriceOne() (gas: 912512)\n[PASS] test_OnlyClubHolderTokenApprovedOrOperatorCanUpgradeAndCallerPays() (gas: 767260)\n[PASS] test_UpgradeReceiptMutationsRevertEntirePaymentAndLevel() (gas: 1895547)\n[PASS] test_UpgradeReentrancyGuardAndTaxedTokenRejection() (gas: 2125783)\n[PASS] test_UpgradeShortAllowanceRollsBackBurnAndLevel() (gas: 191434)\n[PASS] test_UpgradesExactOddSplitsEventsAndPricesToMax() (gas: 698224)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 6.54ms (5.07ms CPU time)\n\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\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 9.01ms (7.00ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558650, ~: 558520)\nLogs:\n  Bound result 25441\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 36.61ms (35.79ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 32761, ~: 32155)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 95510, ~: 75359)\nLogs:\n  Bound result 2\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 58.10ms (58.40ms CPU time)\n\nRan 7 tests for test/ClubsLaunch.t.sol:ClubsWallsTest\n[PASS] test_BothWallsAllWidthsDoorAndIndependentFloor() (gas: 4916913)\n[PASS] test_ClubFullReachableAt285DistinctDesignsWithoutStorageCheats() (gas: 90050750)\n[PASS] test_OneOfEachFloorAndWallPerClubSurvivesTransfer() (gas: 1518785)\n[PASS] test_WallDoorAtEveryLevel() (gas: 1153395)\n[PASS] test_WallDoorOverlapSideValidationAndFootprintFlagLock() (gas: 1434300)\n[PASS] test_WallEventsAndMissingAndOutOfBoundsViews() (gas: 402659)\n[PASS] test_WallLengthsAtEveryLevelAndExtensionAfterUpgrade() (gas: 6476624)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 63.40ms (67.32ms 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 68.77ms (68.38ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596099, ~: 595918)\nLogs:\n  Bound result 25441\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169333, ~: 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 70.35ms (71.54ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352126, ~: 1352235)\nLogs:\n  Bound result 2\n  Bound result 1\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 70.88ms (73.13ms CPU time)\n\nRan 1 test for test/ClubsReview.t.sol:ClubsReviewDesignTest\n[PASS] test_SecondCopyRevertsFloorAndWallOtherClubsUnaffectedAndSurvivesTransfer() (gas: 1729860)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.86ms (609.58µs CPU time)\n\nRan 2 tests for test/ClubsReviewDeploy.t.sol:ClubsReviewDeployTest\n[PASS] test_MainnetVaultCheckRejectsLookalikesAndAcceptsMatch() (gas: 9688032)\nLogs:\n  OGClubClubs 0xCF75462c9e7fFf4eEB0c50185087a0fb9A056d2b\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000a4ad4f68d0b91cfd19687c881e50f3a00242828c00000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000008b56398fc3f0ffecf106fbeb5a6661ce5284880f0000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b330000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b330000000000000000000000003d6c014d7df179a01c9f8f4bbaca599c1cb8076a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  vault 0xA4AD4f68d0b91CFD19687c881e50f3A00242828c\n  price (token base units) 100000000000000000000000\n  furniture 0x8b56398Fc3f0FfeCF106fBeb5A6661cE5284880F\n  owner 0x2aCEadD3329Ca7DAcED273E002C1Ef40c6ef4b33\n  royaltyReceiver 0x2aCEadD3329Ca7DAcED273E002C1Ef40c6ef4b33\n  Swarm Pepes 0x3D6c014d7Df179a01c9f8F4bBAca599C1cB8076a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen false\n  OWNER must send these setFootprint calls to OGClubClubs before opening the sale:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\n  0x094947c10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000\n  0x094947c10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000\n  0x094947c10000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000\n  0x094947c10000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  0x094947c10000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  0x094947c10000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After reviewing footprints and metadata, OWNER may open the sale with:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_SepoliaScriptWiresPepesRealRegistryPricesAndWallFootprints() (gas: 18859558)\nLogs:\n  MockOG (unrestricted testnet mint) 0x95CedE5e970fE74dEF7B443DAf6420440793dBb6\n  MockOG constructor args (initialRecipient):\n  0x0000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b33\n  OGClubFurniture 0x843567975C55c54C8213f73c4e282e110934C29D\n  OGClubFurniture constructor args (owner, royaltyReceiver):\n  0x0000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b330000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b33\n  OGClubFarmVault 0x95eD037F6A9b2931b15035E79d11A9747955FcDF\n  OGClubFarmVault constructor args (token, owner):\n  0x00000000000000000000000095cede5e970fe74def7b443daf6420440793dbb60000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b33\n  MockSwarmPepe (public mint, Sepolia/local only) 0xA7dD5b26F7a5D21902D555A7322567360816be13\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0xE2dd2b018f0F61Ac83931E4de6cfd6398e49F692\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x00000000000000000000000095cede5e970fe74def7b443daf6420440793dbb600000000000000000000000095ed037f6a9b2931b15035e79d11a9747955fcdf00000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000843567975c55c54c8213f73c4e282e110934c29d0000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b330000000000000000000000002aceadd3329ca7daced273e002c1ef40c6ef4b33000000000000000000000000a7dd5b26f7a5d21902d555a7322567360816be1300000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x95CedE5e970fE74dEF7B443DAf6420440793dBb6\n  vault 0x95eD037F6A9b2931b15035E79d11A9747955FcDF\n  price (token base units) 100000000000000000000000\n  furniture 0x843567975C55c54C8213f73c4e282e110934C29D\n  owner 0x2aCEadD3329Ca7DAcED273E002C1Ef40c6ef4b33\n  royaltyReceiver 0x2aCEadD3329Ca7DAcED273E002C1Ef40c6ef4b33\n  Swarm Pepes 0xA7dD5b26F7a5D21902D555A7322567360816be13\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.43ms (4.55ms CPU time)\n\nRan 13 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263703)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 740494)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158911)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 758396)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 346962)\n[PASS] test_LevelOneAll98UsableTilesFillWithDistinctDesigns() (gas: 33627397)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 742846)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1312764)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2659153)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 2070894)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219643)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 776324)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 203522)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 14.53ms (17.02ms CPU time)\n\nRan 10 tests for test/ClubsReview.t.sol:ClubsReviewPepeTest\n[PASS] test_ClosedSaleBlocksHolder() (gas: 64800)\n[PASS] test_ClubIdIsPepeIdNotSequential() (gas: 864010)\n[PASS] test_DelegatedHotWalletMintsPaysAndReceives() (gas: 500819)\n[PASS] test_DelegationFromPreviousHolderDiesWithPepeTransfer() (gas: 304535)\n[PASS] test_DelegationMustMatchHolderTokenCollectionAndRights() (gas: 889546)\n[PASS] test_HolderMintsClubWithPepeIdAndEventCarriesIt() (gas: 330691)\n[PASS] test_NonHolderAndApprovedPepeOperatorCannotMint() (gas: 196626)\n[PASS] test_NonexistentPepeReverts() (gas: 53875)\n[PASS] test_SecondMintForSamePepeRevertsEverAfterTransfers() (gas: 248262)\n[PASS] test_ZeroRegistryIgnoresDelegation() (gas: 460528)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 4.14ms (2.25ms CPU time)\n\nRan 3 tests for test/ClubsReview.t.sol:ClubsReviewFixesTest\n[PASS] test_BadPlacementDataEveryShape() (gas: 741916)\n[PASS] test_ClubFullAt285() (gas: 83157701)\n[PASS] test_ConstructorRejections() (gas: 15440)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 45.82ms (44.77ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 2518042, ~: 1987219)\nLogs:\n  Bound result 2\n  Bound result 3\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 21192)\n[PASS] test_ClosedSaleAndNonHolder() (gas: 170658)\n[PASS] test_ExactOddSplitMintEventsAndEnumerationThroughTransfers() (gas: 767355)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 208278)\n[PASS] test_NonReceiverRollsBackPaymentAndPepeEligibility() (gas: 805099)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1487824)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1821861)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 242315)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 388943)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1787580)\n[PASS] test_TokenCallbackCannotReenterMintOrUpgrade() (gas: 1831713)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 702052)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 189.73ms (191.88ms CPU time)\n\nRan 10 tests for test/ClubsReview.t.sol:ClubsReviewLevelsTest\n[PASS] test_BadLevelViewsRevert() (gas: 49368)\n[PASS] test_DoorBlockedByMultiTilePiecesAtEveryLevel() (gas: 4151995)\n[PASS] test_EverySingleTileAtEveryLevelAgainstModel() (gas: 271160757)\n[PASS] test_ExpansionEdgesRevertBeforeAndWorkAfterAndPiecesKeepTiles() (gas: 2688650)\n[PASS] test_FloorMasksMatchCoordinateRulesBitForBit() (gas: 501808)\n[PASS] test_LevelFollowsClubTransfer() (gas: 378429)\n[PASS] test_MintAtLevelOnePricesAndViews() (gas: 46962)\n[PASS] test_OnlyHolderOrApprovedUpgradesAndCallerPays() (gas: 705437)\n[PASS] test_UpgradeOneWeiShortRevertsAtomically() (gas: 513539)\n[PASS] test_UpgradeToFourExactSplitsReceiptsEvents() (gas: 497786)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 361.48ms (362.65ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3716792, ~: 3708444)\nLogs:\n  Bound result 5\n  Bound result 3\n  Bound result 3\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 416.74ms (413.96ms CPU time)\n\nRan 6 tests for test/ClubsReview.t.sol:ClubsReviewWallsTest\n[PASS] test_BadWallCoordinatesRevert() (gas: 551519)\n[PASS] test_DoorPositionOnSideOne() (gas: 837390)\n[PASS] test_EveryWidthStartAndSideAtEveryLevelAgainstModel() (gas: 422160936)\n[PASS] test_OverlapPerSideAndSidesAndFloorIndependent() (gas: 1367998)\n[PASS] test_PastEndThenFitsAfterUpgrade() (gas: 1959610)\n[PASS] test_WallFootprintRulesAndLockCarriesFlag() (gas: 557162)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 497.36ms (497.66ms CPU time)\n\nRan 1 test for test/ClubsReview.t.sol:ClubsReviewFuzzTest\n[PASS] testFuzz_RandomSequencesMatchModel(uint256) (runs: 200, μ: 16660600, ~: 16815420)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 490.17ms (488.87ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1170861, ~: 854341)\nLogs:\n  Bound result 654240958611757776519\n  Bound result 3516\n  Bound result 5\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 283001, ~: 283052)\nLogs:\n  Bound result 374573560914785\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219270, ~: 1219481)\nLogs:\n  Bound result 7\n  Bound result 15852891580\n  Bound result 75365\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 1.35s (1.43s CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1601254, ~: 1068561)\nLogs:\n  Bound result 2\n  Bound result 1\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241127, ~: 240936)\nLogs:\n  Bound result 25441\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 1.35s (1.68s CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchFuzzTest\n[PASS] testFuzz_LevelsWallsFloorShapesRotationsAndDuplicateDesigns(bytes32) (runs: 256, μ: 34642655, ~: 34589661)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.37s (1.37s 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  | 1396  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1365  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1360  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1343  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1368  | 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 100\n  Bound result 1801209601\n  Bound result 514264337593543950335\n  Bound result 802441982665966680381\n  Bound result 3770\n  Bound result 1715822325026283\n  Bound result 1001\n  Bound result 2500000\n  Bound result 51132745256951644\n  Bound result 864000\n  Bound result 197484\n  Bound result 285417151703336834468\n  Bound result 7037\n  Bound result 292\n  Bound result 1834\n  Bound result 999\n  Bound result 220\n  Bound result 825\n  Bound result 3718042970\n  Bound result 6594\n  Bound result 0\n  Bound result 157198259\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.51s (1.51s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1001\n  Bound result 85\n  Bound result 0\n  Bound result 3438\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 189361202\n  Bound result 514264337593543950334\n  Bound result 5909\n  Bound result 254\n  Bound result 1285\n  Bound result 467247246909763\n  Bound result 95\n  Bound result 23\n  Bound result 0\n  Bound result 876281281145568259943\n  Bound result 0\n  Bound result 4546\n  Bound result 0\n  Bound result 1001\n  Bound result 1800\n  Bound result 101\n  Bound result 1460\n  Bound result 0\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 831059\n  Bound result 1000\n  Bound result 0\n  Bound result 855469139952729288357\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 101\n  Bound result 4194\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 9959095000820933338238\n  Bound result 1660413186\n  Bound result 6664\n  Bound result 3700\n  Bound result 14150907204445651\n  Bound result 32\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.79s (1.79s 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           | 1637  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1630  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1608  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1675  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1642  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 85\n  Bound result 0\n  Bound result 0\n  Bound result 243\n  Bound result 1001\n  Bound result 473957661315419628\n  Bound result 5383\n  Bound result 514264337593543950334\n  Bound result 1727\n  Bound result 254\n  Bound result 1269\n  Bound result 467247246909763\n  Bound result 95\n  Bound result 1232\n  Bound result 0\n  Bound result 876281281145568259943\n  Bound result 0\n  Bound result 4565\n  Bound result 0\n  Bound result 1001\n  Bound result 1849\n  Bound result 6424\n  Bound result 101\n  Bound result 0\n  Bound result 1001\n  Bound result 3590\n  Bound result 514264337593543950335\n  Bound result 831059\n  Bound result 1000\n  Bound result 4714005797126095079932\n  Bound result 189495011625680507967\n  Bound result 10000\n  Bound result 192\n  Bound result 1001\n  Bound result 2258\n  Bound result 4427\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 408307778162320618019\n  Bound result 1001\n  Bound result 74270936200604975426\n  Bound result 3610\n  Bound result 5575\n  Bound result 5044\n  Bound result 14150907204445651\n  Bound result 32\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.94s (1.94s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 94705450, ~: 94636239)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.64s (2.64s CPU time)\n\nRan 2 tests for test/ClubsReviewInvariant.t.sol:ClubsReviewInvariantTest\n[PASS]\nClubsReviewInvariantTest invariants:\n[PASS] invariant_EveryClubIsAPepeThatMintedOnce\n[PASS] invariant_NoOGHeldAndPaymentsSplitExactly\n[PASS] invariant_PiecesEqualFurnitureHeldAndLayoutsValid\n ClubsReviewInvariantTest invariants (runs: 64, calls: 5120, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| ClubsReviewHandler | approveClub  | 554   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | delegate     | 585   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | mintClub     | 593   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | mintPepe     | 577   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | place        | 607   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | setSale      | 543   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | transferClub | 577   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | transferPepe | 538   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| ClubsReviewHandler | upgrade      | 546   | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesEveryPath() (gas: 7966033)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.59s (2.59s CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19061, ~: 18133)\nLogs:\n  Bound result 20085\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 667728, ~: 378857)\nLogs:\n  Bound result 146\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.69s (2.70s CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 228854, ~: 231651)\nLogs:\n  Bound result 2\n  Bound result 3\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 1327334, ~: 1147780)\nLogs:\n  Bound result 820\n  Bound result 5\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134953)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 1061042)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 831430)\n[PASS] test_ContractHolderThatCannotReceiveReverts() (gas: 742322)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1546958)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 903309)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 795370)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 248969)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 746018)\n[PASS] test_FullRoomRejectsEverythingElse() (gas: 28200069)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142493)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73410)\n[PASS] test_InterfacesAndImmutables() (gas: 142253)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 649248)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360724)\n[PASS] test_MintPaysFromCallerAndClosingSaleStopsMinting() (gas: 627681)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196771)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 489393)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 359264)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1204372)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239561)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1460684)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 282642)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1478600)\n[PASS] test_TileTakenViewBounds() (gas: 56647)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1112309)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 1014100)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 448218)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 2.69s (2.74s CPU time)\n\nRan 9 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 23739707)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 14465439)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 10566630)\n[PASS] test_MainnetScriptDeploysFromSeparateKeyWithContractOwnerAndLeavesSetupToOwner() (gas: 9502399)\nLogs:\n  OGClubClubs 0x30A83F5e57Fa28a89b559850E586e08549eCbBc1\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df26000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc00000000000000000000000052e9a3dde7ff1018cc104248afb1c29e7b211f3800000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f\n  vault 0x2e234DAe75C793f67A35089C9d99245E1C58470b\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0xF62849F9A0B5Bf2913b396098F7c7019b51A820a\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x52e9a3DDE7Ff1018Cc104248afb1c29E7B211F38\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen false\n  OWNER must send these setFootprint calls to OGClubClubs before opening the sale:\n  0x094947c10000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001\n  After reviewing footprints and metadata, OWNER may open the sale with:\n  0xaf979f250000000000000000000000000000000000000000000000000000000000000001\n\n[PASS] test_MainnetScriptRejectsWrongVaultTokenBeforeDeploying() (gas: 5909504)\n[PASS] test_MockPepePublicMintIsSepoliaFixtureAndCannotRemint() (gas: 2802391)\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 14902)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 18532537)\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 (public mint, Sepolia/local only) 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  MockSwarmPepe constructor args: none\n  OGClubClubs 0x79c936D495EdaDFC6A2Cb0D0B189bDf811527dCf\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver, pepes, delegates, level2Price, level3Price, level4Price):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc0000000000000000000000000e02c420c2ec8e6bc1f5499f265332c736c8748a00000000000000000000000000000000000000447e69651d841bd8d104bed493000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000054b40b1f852bda00000000000000000000000000000000000000000000000000a968163f0a57b4000000\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  Swarm Pepes 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  delegate.xyz registry 0x00000000000000447e69651d841bD8D104Bed493\n  level 2 price 200000000000000000000000\n  level 3 price 400000000000000000000000\n  level 4 price 800000000000000000000000\n  saleOpen true\n\n[PASS] test_SevenContractFactoryDeploymentInOneTransactionPreservesOwnersAndBootstrap() (gas: 52712045)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.69s (269.64ms 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                     | 1065  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1112  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1084  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1121  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1092  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1120  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1086  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\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 1\n  Bound result 12\n  Bound result 0\n  Bound result 10\n  Bound result 8\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 20\n  Bound result 7\n  Bound result 10\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 19\n  Bound result 5\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 0\n  Bound result 2\n  Bound result 18\n  Bound result 0\n  Bound result 6\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 20\n  Bound result 7\n  Bound result 0\n  Bound result 32\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 6\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 32\n  Bound result 8\n  Bound result 14\n  Bound result 6\n  Bound result 14\n  Bound result 0\n  Bound result 2\n  Bound result 3\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 13\n  Bound result 0\n  Bound result 8\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 4\n  Bound result 6\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 12\n  Bound result 4\n  Bound result 0\n  Bound result 1\n  Bound result 5\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.78s (4.78s 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 370533853\n  Bound result 100000000000\n  Bound result 1001\n  Bound result 197149177468\n  Bound result 9143\n  Bound result 941\n  Bound result 8517\n  Bound result 2753\n  Bound result 3093\n  Bound result 1001\n  Bound result 100000009143\n  Bound result 3655\n  Bound result 1001\n  Bound result 2015\n  Bound result 99999995177\n  Bound result 30610956\n  Bound result 28162514264337144756239535\n  Bound result 1001\n  Bound result 1290049689000718634690565\n  Bound result 299884\n  Bound result 2853\n  Bound result 3\n  Bound result 483\n  Bound result 2853\n  Bound result 398\n  Bound result 1808941898\n  Bound result 54033433815\n  Bound result 510856\n  Bound result 4142\n  Bound result 54033434213\n  Bound result 0\n  Bound result 245\n  Bound result 15\n  Bound result 1200\n  Bound result 248958119366\n  Bound result 518\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.54s (6.53s 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   | 1159  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1098  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1130  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1093  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1056  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1112  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1179  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1105  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1157  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1104  | 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 773316215\n  Bound result 92500000000\n  Bound result 1001\n  Bound result 348385427468\n  Bound result 9575\n  Bound result 1137\n  Bound result 8771\n  Bound result 2792\n  Bound result 3848\n  Bound result 1001\n  Bound result 92500009909\n  Bound result 21299250458406149636839898\n  Bound result 1001\n  Bound result 2015\n  Bound result 30610956\n  Bound result 11192032007994194300561151\n  Bound result 1001\n  Bound result 1912514264337144598055335\n  Bound result 299884\n  Bound result 2722610227\n  Bound result 3\n  Bound result 95018408197\n  Bound result 2735\n  Bound result 95018408198\n  Bound result 944639575335\n  Bound result 510856\n  Bound result 5840\n  Bound result 526496306089\n  Bound result 0\n  Bound result 1201\n  Bound result 15\n  Bound result 1200\n  Bound result 452648547992\n  Bound result 3456\n  Bound result 347295301096\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.64s (6.64s 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  | 804   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 846   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 805   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 840   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 801   | 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 2\n  Bound result 8\n  Bound result 0\n  Bound result 8\n  Bound result 7\n  Bound result 2\n  Bound result 11\n  Bound result 11\n  Bound result 1\n  Bound result 7\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 9\n  Bound result 0\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 7\n  Bound result 10\n  Bound result 3\n  Bound result 5\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 10\n  Bound result 2\n  Bound result 0\n  Bound result 9\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.96s (6.95s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsInvariantTest\n[PASS]\nClubsInvariantTest invariants:\n[PASS] invariant_EveryHeldFurniturePieceHasExactlyOnePermanentLayoutEntry\n[PASS] invariant_PaymentsNeverRemainInClubsAndSplitExactly\n ClubsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------+-------+---------+----------╮\n| Contract     | Selector     | Calls | Reverts | Discards |\n+==========================================================+\n| ClubsHandler | mint         | 2081  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2060  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 2021  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2030  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.89s (12.88s CPU time)\n\nRan 1 test for test/ClubsLaunchInvariant.t.sol:ClubsLaunchInvariantTest\n[PASS]\nClubsLaunchInvariantTest invariants:\n[PASS] invariant_AllLayoutsMatchIndependentModelCustodyAndUniqueDesigns\n[PASS] invariant_EveryClubIsAPepeMintedExactlyOnceAndAllPaymentsConserved\n ClubsLaunchInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| LaunchClubsHandler | approveClub  | 1057  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | delegatePepe | 1058  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | mint         | 1016  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | place        | 1070  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | sale         | 1032  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferClub | 1000  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | transferPepe | 990   | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| LaunchClubsHandler | upgrade      | 969   | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 19.60s (19.59s 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  | 1599  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1500  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1551  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1583  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1546  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1435  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1535  | 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 9480\n  Bound result 212\n  Bound result 4\n  Bound result 77\n  Bound result 0\n  Bound result 5\n  Bound result 6802\n  Bound result 68\n  Bound result 4\n  Bound result 140\n  Bound result 7\n  Bound result 3\n  Bound result 8\n  Bound result 1\n  Bound result 31337\n  Bound result 255\n  Bound result 18834\n  Bound result 35\n  Bound result 42\n  Bound result 7\n  Bound result 14\n  Bound result 237\n  Bound result 0\n  Bound result 201\n  Bound result 0\n  Bound result 9345\n  Bound result 40\n  Bound result 486\n  Bound result 285\n  Bound result 3\n  Bound result 2\n  Bound result 7495\n  Bound result 274\n  Bound result 172786\n  Bound result 99\n  Bound result 86399\n  Bound result 207\n  Bound result 191\n  Bound result 6\n  Bound result 64\n  Bound result 251\n  Bound result 28\n  Bound result 12510\n  Bound result 5\n  Bound result 600\n  Bound result 138\n  Bound result 82\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 37.44s (37.43s CPU time)\n\nRan 40 test suites in 37.45s (119.88s CPU time): 258 tests passed, 0 failed, 0 skipped (258 total tests)\n","passed":true},{"durationMs":87,"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\":148,\"README.md\":514,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":64,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":210,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":399,\"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\":70,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":729,\"test/ClubsAdversarialInvariant.t.sol\":482,\"test/ClubsDeployment.t.sol\":349,\"test/ClubsInvariant.t.sol\":335,\"test/ClubsLaunch.t.sol\":722,\"test/ClubsLaunchInvariant.t.sol\":464,\"test/ClubsPlacement.t.sol\":321,\"test/ClubsReview.t.sol\":833,\"test/ClubsReviewDeploy.t.sol\":118,\"test/ClubsReviewInvariant.t.sol\":370,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":180,\"test/OGClubClubs.t.sol\":573,\"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/ClubLaunchMocks.sol\":22,\"test/helpers/ClubsTestBase.sol\":86,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/LaunchLayoutModel.sol\":70,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":124},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c345598f036f09890a9a50ae86b00d8ad3d2ee523146a37f9e47f0c61995ea1f","verifiedTreeHash":"a57dbbde76c821eab4c4b57009c32d7337670d9d","verifierVersion":"0.1.0+560ab6a2"}]}