{"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":"5daceda1-0099-41cc-ae1a-377f155a2fed","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ac73824af1743a32026cf602f075ee7346e229d539efd606408a481b965a36d8","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":"5d730911f1d4c9172a27ec3b3ad4e825ab0815dc40a17ecf7345ed2050117382","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":"50bd40d4c654a9d70772c0b13acfaef208c268d374ba141d5d25048fa9274c9c","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":"4113be69480ad47e196efd891f9fca354e82086e95fc38e85c08a15e25dab336","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":"47889e4879f55a0e2a491fa14b4dd56a9595244b3fa4d8f81bce1f7f1d17a378","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":"f91c89985b10b05c9f55c6a96e7f033fad4b25f0d02c8232c0e99fb8ecb1c1f6","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":"9af78d709fb7203d351ce170988e38aadb9a1a95848733931db9f6e4ec042f65","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":"144c4fa71c9e2b7bf1d899ac497c64408e9f4fbc455ae9db35f7f6bbfd659574","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"cd6781bc0cf75e76dd01bbeab43dc1a93511fc44d12b9499206c3271caa5230b","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 raffle repo (OGClubFurniture, OGClubStaking, OGClubFarmVault, OGClubRaffle at fabe4c1d998206e1b1bdf9bdf0f03fb6773a7707). Add one contract, OGClubClubs, with tests, deploy scripts, launch.json and README. Keep every existing contract exactly as it is. forge build, forge test and forge fmt --check must pass.\n \n## What it is\nA club is an ERC-721 you mint by paying $OG. It starts empty; its holder can place furniture NFTs (OGClubFurniture, ERC-1155) into it, permanently. Placed pieces are locked in that club forever and go with it when sold. The game renders clubs from the on-chain layout.\n \n## Contract\n- ERC721 + ERC721Enumerable, ERC2981 (5% default, max 1000 bps, setRoyalty), ERC4906, ERC1155Holder, Ownable2Step, ReentrancyGuard. Name \"OG Club Clubs\", symbol \"OGCLUBS\". No proxies.\n- Constructor (IERC20 token, address vault, uint256 price, IERC1155 furniture, address owner, address royaltyReceiver); token, vault, price, furniture immutable; reject zero values. BURN_ADDRESS = 0x...dEaD constant.\n- mintClub() and mintClubTo(address to): revert SaleClosed unless saleOpen; safeTransferFrom the payer price/2 to BURN_ADDRESS and price - price/2 to vault (nothing ever held here); check both balances rose by exactly that or revert UnexpectedTokenDebit; _safeMint the next id (from 1); nonReentrant; emit ClubMinted(id, to, payer, burned, toVault); return id. No caps.\n- Room: 10x10 tiles, x,y 0..9. Door tile (0,4) and the tile in front (1,4) must stay free. Each furniture id has a footprint w x h (1..4), set by the owner with setFootprint(id, w, h); an id can't be placed before its footprint is set, and the footprint is locked once any club has placed that id. rot 0..3; rot 1 and 3 swap w and h. A piece at (x,y) covers x..x+w'-1, y..y+h'-1: it must fit the grid, not cover the door tiles, and not overlap a placed piece. Max 100 pieces per club.\n- Placing: the club holder calls furniture.safeTransferFrom(from, this, furnitureId, 1, abi.encode(uint256 clubId, uint8 x, uint8 y, uint8 rot)). onERC1155Received accepts only if msg.sender == furniture, amount == 1, from is ownerOf(clubId) or approved for it, the club exists, and the spot passes the rules. Then record it, emit FurniturePlaced(clubId, furnitureId, x, y, rot, index) and MetadataUpdate(clubId). onERC1155BatchReceived reverts. There is no function, for anyone including the owner, that moves furniture out.\n- Views: piecesOf(clubId) returns Piece{furnitureId, x, y, rot}[] in placement order, pieceCount, tileTaken(clubId, x, y), footprintOf(id) returns (w, h, set, locked), plus token, vault, price, furniture, saleOpen.\n- Owner only: setSaleOpen(bool) (starts closed), setFootprint, setBaseURI until freezeMetadata() (permanent; emits BatchMetadataUpdate), setRoyalty. tokenURI = baseURI + id + \".json\"; reverts for missing ids. The owner can't change token, vault, price or furniture, mint free, move or burn clubs, or remove furniture; no receive, nothing to withdraw.\n- Custom errors: SaleClosed, ZeroAddress, ZeroPrice, UnexpectedTokenDebit, MetadataFrozen, RoyaltyTooHigh, NonexistentToken, NotFurniture, NotClubOwner, BadAmount, NoFootprint, FootprintLocked, BadFootprint, OutOfRoom, BlocksDoor, TileTaken, ClubFull, BatchNotAccepted.\n \n## Tests\n- Mint split exact (odd prices: burn rounds down), nothing left in the contract; mintClubTo; reverts for closed sale, short approval or balance, fee-on-transfer token, non-receiver; a reentrant ERC721 receiver can't double-mint; ids 1,2,3; enumeration through transfers.\n- Placing with the real OGClubFurniture: 1x1, 2x1 in all 4 rotations, 2x2; views and events agree; approved operator can place; others can't, even holding the furniture. Reverts: fake ERC1155 calling the hook, amount 2, batch, no footprint, off the grid (rotated too), door tiles, overlap, 101st piece, missing club, bad data. Footprint locks after first placement only for that id. No path gets a piece out. After a club transfer the new holder can place, the old can't, pieces unchanged.\n- Admin: tokenURI, freeze, royalty cap, access control, Ownable2Step.\n- Fuzz: random placements never overlap, never cover the door, always fit; rejected ones change nothing. burned + toVault == price x mints.\n- Invariants: $OG balance of the contract always 0; sum of pieces == furniture held by the contract.\n \n## Deploy\nSepolia: MockOG, the repo's OGClubFurniture and OGClubFarmVault, price 100_000e18, footprints from a JSON of [id, w, h], sale open. Mainnet script: args from env (OG_TOKEN, FARM_VAULT, CLUB_PRICE, FURNITURE, OWNER, ROYALTY_RECEIVER), footprints from JSON, sale closed. Print addresses and constructor args.","parentJobId":null,"planHash":"291fe11aa8cac730b3a2bb3762e16773874be9e06dd67d75904e23e9bb34fce7","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5daceda1-0099-41cc-ae1a-377f155a2fed","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2327-continue-delivered-og-club"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52598","feedbackHash":"a83e051e2be1e0066b3bcaa823e50a918753eca9cfb75c46611b1ad938db4132","nodeKey":"adapt_contract_project","submissionHash":"ac73824af1743a32026cf602f075ee7346e229d539efd606408a481b965a36d8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52323","feedbackHash":"898fb85faee6dd8c8eaf3b31be15120e24e69d40846ff539061c0ed21cf5037a","nodeKey":"audit_economics","submissionHash":"5d730911f1d4c9172a27ec3b3ad4e825ab0815dc40a17ecf7345ed2050117382","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51317","feedbackHash":"f54def36021b125da54cdc33c63f8756486eed866269c228fe6a8c187709fdd9","nodeKey":"audit_flow","submissionHash":"50bd40d4c654a9d70772c0b13acfaef208c268d374ba141d5d25048fa9274c9c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51342","feedbackHash":"735f5834ae0dba446bbdc301388b87f7cb9229d43f1cf8f4737111723d17fc53","nodeKey":"audit_imported_code","submissionHash":"4113be69480ad47e196efd891f9fca354e82086e95fc38e85c08a15e25dab336","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52590","feedbackHash":"54a763baae5fe2ac5930ad2e5298a92b15b72bd5d40a4389307cd8d61124f7cb","nodeKey":"audit_judge","submissionHash":"47889e4879f55a0e2a491fa14b4dd56a9595244b3fa4d8f81bce1f7f1d17a378","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52120","feedbackHash":"9590a39ca1be08789ca4d575db1feb6aed7154de42991b53f81cfb02849a6f46","nodeKey":"audit_math","submissionHash":"f91c89985b10b05c9f55c6a96e7f033fad4b25f0d02c8232c0e99fb8ecb1c1f6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51083","feedbackHash":"507f2b5d866ec03325fdd78f62e5a1a0908a429e50267b52161969a18cb9c284","nodeKey":"audit_permissions","submissionHash":"9af78d709fb7203d351ce170988e38aadb9a1a95848733931db9f6e4ec042f65","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51214","feedbackHash":"40eebf6a35ec46582bb5f17b61e3d80e39815d7f676e79cc730b79073e2839cd","nodeKey":"manifest","submissionHash":"144c4fa71c9e2b7bf1d899ac497c64408e9f4fbc455ae9db35f7f6bbfd659574","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51538","feedbackHash":"c6fe3e9ac87f6e0339b4778f1347d954c069ab97764a8d9e2665f850ba27d9f2","nodeKey":"write_foundry_tests","submissionHash":"cd6781bc0cf75e76dd01bbeab43dc1a93511fc44d12b9499206c3271caa5230b","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"1c3317467064befe33eff7e619479dd47675a41572824c18dd0b2cbd9e1a2f83","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"62aaaecb45704e673139e8b61be44b93bba597a38fefc6ae31bdca124257b316","device":"dd2ee4882a1be950","findings":[],"hash":"144c4fa71c9e2b7bf1d899ac497c64408e9f4fbc455ae9db35f7f6bbfd659574","nodeId":"7cbd74a3-ec6f-4265-980b-22311f8da9db","outcome":"completed","summary":"The manifest at `launch.json` is verified and delivered unchanged. It already matched the accepted implementation exactly, so rewriting it would have produced the same bytes.\n\n**What I checked**\n\n- **Contracts and order**: MockOG, OGClubFurniture, OGClubFarmVault, OGClubStaking, OGClubRaffle, OGClubClubs. Every `$contract:` reference points backward and fills an address parameter.\n- **Constructor args**: each list has one entry per parameter in declaration order, confirmed against `forge inspect` ABIs. OGClubClubs gets (MockOG, OGClubFarmVault, 100000e18, OGClubFurniture, $owner, $owner), matching the accepted constructor and the Sepolia script's price constant. Staking uses the script's default rate and the raffle uses notice 0, as the original accepted manifest did.\n- **Owners**: every owner and royalty receiver argument is `$owner`. No constructor assigns msg.sender.\n- **Empty-chain safety**: no constructor calls another contract. A scratch test deployed all six through a factory-like caller on chain 11155111 with the manifest's words, and confirmed owners, immutable references, closed sale, 5% royalty and runtime sizes under the EIP-170 limit.\n- **Schema**: only kind, contracts and notes; notes are 3596 characters with no local addresses.\n- **Repo checks**: `forge build` succeeds, `forge fmt --check` on the delivered sources is clean, and the full suite passed under the verifier's fuzz seed.\n\n| Check | Result |\n|---|---|\n| forge test (seeded) | 166 passed, 0 failed |\n| test/test_launch.py | OK |\n| scratch manifest rehearsal | PASS |\n\nNo file other than launch.json is in scope, and the working tree has no changes. The scratch test lives under test/scratch and is discarded before submission.","treeHash":"4ff3cd600df65ba99e6212c47ba73636dad05e21","usage":{"cachedInputTokens":573431,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":6596,"runtime":"claude","turns":13,"wallClockMs":248148}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"cbc83f8151b8340d","findings":[{"citation":"resolved","description":"The raffle needs OGClubStaking.spenders(raffle) and OGClubFurniture.minters(raffle) to be true, and neither can be set in a constructor because the raffle address does not exist when staking and furniture are constructed. launch.json therefore deploys a system that cannot sell a single ticket or deliver a single prize until the owner executes grantSpender and grantMinter after deployment. Both contracts spend a one-shot immediate bootstrap on the first successful grant, whatever its target: if the owner's first grantSpender or grantMinter names any other address (including itself by mistake), the raffle's own grant becomes a 7-day proposal that must then be activated inside a 7-day window or it lapses. The same applies to OGClubFurniture.grantMinter at src/OGClubFurniture.sol:53. The README and manifest notes document the handoff, and nothing in the protected floor or tests enforces the order on chain. This is post-deployment configuration of the kind the launch rules ask to surface; the raffle cannot avoid it without a predicted-address bootstrap. Documented so the adapter and operator treat the grant order as a launch-blocking step, and so the new OGClubClubs contract is built with no equivalent role dependency (it needs none: it only receives furniture and pays $OG).","line":120,"path":"src/OGClubStaking.sol","reproduction":"Deploy MockOG, OGClubFurniture(owner, owner), OGClubFarmVault(token, owner), OGClubStaking(token, vault, owner, 1e18), OGClubRaffle(staking, furniture, owner, 0) exactly as launch.json lists them. alice mints 10e18 MockOG, approves and stakes, warps 1 day (pointsOf(alice) == 10e18). owner calls createRaffle(now, now+1 day, one pool {ticketPrice 1e18, cap 0, prizes [{7,1}]}). alice calls raffle.enter(1, 0, 1). Expected per product: ticket sold. Actual: reverts with OGClubStaking.NotSpender(). Then owner calls staking.grantSpender(owner) by mistake, followed by staking.grantSpender(raffle): spenders(raffle) stays false, pendingSpenders(raffle) == now + 7 days, and activateSpender(raffle) reverts with SpenderDelayNotElapsed until then. Verified in a scratch Foundry test (test_RaffleInertWithoutPostDeploymentGrants) on fabe4c1.","severity":"low","snippet":"    function grantSpender(address spender) external onlyOwner {\n        if (spender == address(0)) revert InvalidAddress();\n        if (!bootstrapped) {\n            bootstrapped = true;\n            delete pendingSpenders[spender];\n            spenders[spender] = true;\n            emit SpenderSet(spender, true);\n        } else {\n            uint256 activatesAt = block.timestamp + SPENDER_DELAY;\n            pendingSpenders[spender] = activatesAt;\n            emit SpenderProposed(spender, activatesAt);\n        }\n    }","title":"Raffle is inert after factory deployment until the owner performs two first-grant calls; a wrong first grant delays it 7 days"},{"citation":"resolved","description":"launch.json deploys MockOG as the first application contract and wires OGClubStaking and OGClubFarmVault to it. Its mint function has no access control, which is minting after launch by any caller. On the chain this manifest targets, any address can mint an arbitrary balance, stake it, and accrue points at 1e18 per token-day, then buy every ticket of every pool (cap 0 means unlimited) so that the raffle's prize distribution gives nothing to honest stakers. The contract, README and manifest notes all state it is testnet-only (Sepolia), so this is a documented trust assumption rather than a code defect, and the next assignment's brief keeps MockOG on Sepolia. It is recorded so the mainnet manifest is verified never to contain MockOG, and because the adapter's OGClubClubs Sepolia deployment will also price clubs in this freely mintable token (anyone can mint 100_000e18 and mint clubs for free), which affects what Sepolia testing can demonstrate about the burn/vault split.","line":18,"path":"src/mocks/MockOG.sol","reproduction":"With the launch.json deployment: stranger calls token.mint(stranger, 1e30), token.approve(staking, 1e30), staking.stake(1e30); warp 1 day; staking.pointsOf(stranger) == 1e30. Expected for a production payment token: mint reverts for a non-privileged caller. Actual: succeeds for any caller. Verified in a scratch Foundry test (test_AnyoneMintsUnlimitedPoints) on fabe4c1.","severity":"low","snippet":"    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }","title":"MockOG in the manifest has unrestricted public mint, so anyone on the deployed network gets unlimited staking points and can win every raffle"},{"citation":"resolved","description":"commitDraw fixes targetBlock = block.number + 3 and draw must be called with the target's RLP header while blockhash(target) is still available (target < block.number <= target + 256). If nobody calls draw inside those 256 blocks (about 51 minutes on mainnet), anyone can call commitDraw again and obtain a new target and therefore a new prevRandao seed. Drawing is permissionless, so a party who dislikes the outcome visible in the target block's prevRandao cannot force a re-roll on their own; they need every other interested party (operator, entrants, keepers) to stay silent for 256 blocks, or to censor draw transactions. The owner is already trusted to create raffles, so the practical exposure is an unmonitored raffle whose only keeper is a party with a stake in the outcome. The README documents this exact bias and recommends monitoring. Recorded as a broken 'seed is fixed at commit' guarantee with a concrete reproduction so the operator runbook and the panel treat independent keepers as required, not optional.","line":208,"path":"src/OGClubRaffle.sol","reproduction":"Raffle created at block 1000 with opensAt = now and closesAt = now + 1 day. Warp to closesAt and call commitDraw(1): targetBlock == 1003. Roll to block 1259 (target + 256): commitDraw(1) reverts TargetStillLive and draw(1, header) would still succeed with the real header of block 1003. Roll to block 1260 (target + 257): draw is now impossible (TargetUnavailable, blockhash gone) and commitDraw(1) succeeds, setting targetBlock == 1263 and a different prevRandao becomes the seed. Expected per a committed-draw design: the seed derived from block 1003 is the only valid one. Actual: a second, unrelated seed is accepted. Verified in a scratch Foundry test (test_RetargetAfterExpiryChangesTarget) on fabe4c1.","severity":"low","snippet":"        if (target != 0 && block.number <= target + 256) revert TargetStillLive();\n        raffle.targetBlock = (block.number + TARGET_DELAY).toUint64();","title":"An undrawn raffle can be retargeted after target + 256 blocks, so the seed is not final until draw and a withheld draw yields a fresh seed"},{"citation":"resolved","description":"The assignment's brief asks for OGClubClubs (ERC-721 club minted for $OG, half burned and half to the vault, furniture placed permanently via onERC1155Received). At fabe4c1 there is no src/OGClubClubs.sol, no test, no deploy script entry, and launch.json lists only the five existing contracts; forge build produces no OGClubClubs artifact. This is not a defect of the delivered code; it bounds what this review could cover. For the adapter, points in the brief that need care, from the perspective of the existing contracts read here: (1) OGClubFurniture.safeTransferFrom is callable by any operator approved on the furniture by the club holder, so a furniture-level operator can permanently lock the holder's furniture in the holder's own club; this is consistent with the brief's 'from is ownerOf(clubId) or approved for it' rule but should be a stated trust assumption. (2) The mint split must measure balanceOf(BURN_ADDRESS) and balanceOf(vault) before and after each transfer; MockOG on Sepolia is freely mintable so the split cannot be economically tested there. (3) abi.decode of the hook data must revert on malformed data (the brief's BadData case) and the hook must reject batch transfers, otherwise a furniture piece could be locked without a layout record. (4) OGClubFarmVault accepts club revenue as plain balance, which raises the 50% season budget; that is consistent with its design and needs no change.","line":16,"path":"README.md","reproduction":"State: repository at commit fabe4c1. `ls src/` shows OGClubFarmVault.sol, OGClubFurniture.sol, OGClubRaffle.sol, OGClubStaking.sol, libraries/, mocks/ and no OGClubClubs.sol; `forge build` then `ls out/ | grep -i clubs` returns nothing. Expected per the brief: an OGClubClubs contract with tests, deploy scripts, launch.json entry and README section. Actual: absent.","severity":"info","snippet":"| Contract | Constructor arguments, in order |\n| --- | --- |\n| `MockOG` | initial recipient (Sepolia/local only) |\n| `OGClubFurniture` | owner, initial royalty receiver |\n| `OGClubFarmVault` | token, owner |\n| `OGClubStaking` | token, immutable vault, owner, pointsPerTokenDay |\n| `OGClubRaffle` | staking, furniture, owner, immutable raffleNotice |","title":"OGClubClubs is absent from the delivered tree; the brief's club contract has not been started and the current manifest cannot describe it"}],"hash":"4113be69480ad47e196efd891f9fca354e82086e95fc38e85c08a15e25dab336","nodeId":"b7d88726-e459-4826-bfec-8e2c79346d51","outcome":"completed","summary":"The review is complete. The findings file holds four entries, all anchored to lines verified in the tree, and the working tree is unchanged apart from the gitignored findings file.\n\n**Outcome.** No critical, high or medium defect was found in the four delivered contracts at fabe4c1. The build, the 119-test suite with the README's seed, and `forge fmt --check` all pass. The findings file records three low findings and one informational note, each with a reproduction I confirmed in a scratch Foundry test that has since been removed.\n\n**Contracts read in full.** OGClubFurniture, OGClubStaking, OGClubFarmVault, OGClubRaffle, the BlockHeader and Permutation libraries, MockOG, the deploy script, launch.json, README and ADAPTATION notes, plus the test helpers and the deployment test. Nothing in scope was unreachable. OGClubClubs, the contract the brief asks the next assignment to add, does not exist yet, so it could not be reviewed.\n\n**Findings recorded.**\n- **Post-deployment role grants required.** The raffle cannot sell a ticket until the owner calls grantSpender and grantMinter after deployment, and a mistaken first grant to any other address consumes the one-shot bootstrap and pushes the raffle into a 7-day proposal window. Reproduced: enter reverts with NotSpender on the manifest deployment.\n- **MockOG public mint in the manifest.** Anyone on the target network mints unlimited tokens and points. Documented as testnet-only, recorded so the mainnet manifest is checked to exclude it.\n- **Retargeting after 256 undrawn blocks.** An unmonitored raffle gets a fresh seed if nobody draws inside the blockhash window. Documented in the README, recorded as a broken \"seed fixed at commit\" guarantee with exact block numbers.\n- **OGClubClubs absent.** Informational note for the adapter, with four cautions drawn from how the existing furniture, vault and token behave.\n\n**Checked and found sound.** Staking accrual arithmetic is exact with retained remainders and cannot overflow within the documented bounds. The unstake fee rounds up and the debit check rejects sender-side fee tokens. The vault's reservation cap, claim window and shared reentrancy guard hold, and the Merkle leaf is season-bound. Raffle entries, caps, the Feistel permutation bijection, the prize binary search, the claim bitmap and the header authentication against blockhash all behave as documented. No delegatecall, selfdestruct, proxy, pause or balance-seizing path exists in any contract. Owner powers are limited to raffle creation, delayed role grants, metadata, royalties and season proposals, which match the stated trust model.\n\n**Test coverage gaps noted but not filed.** The README still states 104 permanent tests while 119 run, a stale count only. No suite exercises a deployment through the manifest followed by a wrong-order first grant, which is why the first finding carries that sequence.","treeHash":null,"usage":{"cachedInputTokens":814073,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":31476,"runtime":"claude","turns":26,"wallClockMs":577966}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"99e4819277ea59fc","findings":[{"citation":"resolved","description":"Merged from audit_flow, write_foundry_tests and audit_math (same root cause). The constructor rejects a zero vault and a predicted self-address vault, but not vault_ == BURN_ADDRESS (0x...dEaD). token, vault and price are immutable and there is no setter, so the configuration cannot be repaired after deployment. In _mintClub (lines 122-131) both legs land on the same account: burnBefore and vaultBefore are read from the same balance, the sink receives burned + toVault == price, and _checkReceipt(BURN_ADDRESS, burnBefore, burned) sees an increase of price instead of price/2 and reverts UnexpectedTokenDebit for every price >= 1. The sale can be opened but no club can ever be sold. The mainnet script takes FARM_VAULT straight from an environment variable, so the misdeploy is one typo away, and the shipped test test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself (test/OGClubClubs.t.sol) asserts the runtime revert as acceptable behaviour instead of rejecting the configuration at construction. Related alias, same guard: vault_ == address(token_) is also accepted; OpenZeppelin ERC20 allows transfers to the token contract itself, so with that vault every mint succeeds and the vault half (price - price/2 per mint) is stranded inside the token contract with no owner (reproduced: after one mint at price 10, og.balanceOf(address(og)) == 5). No funds are lost in the dEaD case because the revert is atomic, hence low. Fix: in the constructor, revert (ZeroAddress or UnexpectedTokenDebit) when vault_ == BURN_ADDRESS, and optionally when vault_ == address(token_).","line":101,"path":"src/OGClubClubs.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {OGClubClubs} from \"src/OGClubClubs.sol\";\nimport {OGClubFurniture} from \"src/OGClubFurniture.sol\";\nimport {MockOG} from \"src/mocks/MockOG.sol\";\n\n/// @dev Fails on the current code: the constructor accepts the burn sink as vault, and the resulting\n///      contract can never mint (every mintClub reverts UnexpectedTokenDebit). Passes once the constructor\n///      rejects vault_ == BURN_ADDRESS.\ncontract VaultIsBurnSinkProof is Test {\n    address internal owner = makeAddr(\"owner\");\n    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;\n\n    function test_ConstructorRejectsBurnSinkAsVault() public {\n        MockOG og = new MockOG(owner);\n        OGClubFurniture furniture = new OGClubFurniture(owner, owner);\n        vm.expectRevert();\n        new OGClubClubs(og, DEAD, 11, IERC1155(address(furniture)), owner, owner);\n    }\n}","reproduction":"Reproduced with test/scratch/Repro.t.sol::test_VaultEqualsBurnSinkDeploysButNeverMints (passes by expecting the revert) and the attached proof (fails on current code). Steps: og = new MockOG(owner); furniture = new OGClubFurniture(owner, owner); clubs = new OGClubClubs(og, 0x000000000000000000000000000000000000dEaD, 11, furniture, owner, owner) -> succeeds (expected: revert like vault_ == address(this)). owner: clubs.setSaleOpen(true). og.mint(alice, 11); alice: og.approve(clubs, 11); clubs.mintClub(). Actual: transfer 5 to dEaD, transfer 6 to vault (== dEaD), sink balance rose by 11, _checkReceipt expects +5 -> revert UnexpectedTokenDebit. Every subsequent mint from any payer at any price reverts identically; the immutables cannot be changed. Alias case: new OGClubClubs(og, address(og), 10, ...) succeeds, mintClub() returns id 1 and og.balanceOf(address(og)) == 5 with no way to recover it.","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == BURN_ADDRESS, deploying an immutable contract whose every mint reverts"},{"citation":"resolved","description":"From audit_economics; reproduced by running its proof, which fails on the current code (deploy succeeds where the finding expects a revert). The mainnet script reads OG_TOKEN, FARM_VAULT and FURNITURE as independent environment inputs and deploys OGClubClubs after only a chain-id check and footprint-JSON validation. Unlike the constructor, which is deliberately dependency-free for factory deployment, the script runs against live chain state and could assert OGClubFarmVault(config.vault).token() == config.token and that config.vault and config.furniture have code, but it does not. OGClubClubs.vault and token are immutable with no admin path to change them; OGClubFarmVault has no sweep and budgets seasons only in its own token (proposeSeason uses token.balanceOf(this)). If FARM_VAULT is the vault of another token or any other address, the price - price/2 leg of every club purchase is sent to an address that can never pay it out, while _mintClub's balance checks pass because the recipient's balance did rise. Only a redeploy of OGClubClubs fixes it, after revenue has already been lost. The Sepolia script and launch.json are not affected: they wire the vault from the same MockOG. Fix: in DeployClubsMainnet.deploy, revert when OGClubFarmVault(config.vault).token() != config.token (and optionally when address(config.furniture).code.length == 0).","line":127,"path":"script/DeployClubs.s.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {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 {DeployClubsMainnet} from \"script/DeployClubs.s.sol\";\n\ncontract MainnetVaultMismatchTest is Test {\n    address internal owner = makeAddr(\"owner\");\n\n    function test_ScriptRejectsVaultOfAnotherToken() public {\n        vm.chainId(1);\n        MockOG og = new MockOG(owner);\n        MockOG other = new MockOG(owner);\n        OGClubFarmVault wrongVault = new OGClubFarmVault(other, owner);\n        OGClubFurniture furniture = new OGClubFurniture(owner, owner);\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = DeployClubsMainnet.Config({\n            token: og,\n            vault: address(wrongVault),\n            price: 100_000e18,\n            furniture: IERC1155(address(furniture)),\n            owner: owner,\n            royaltyReceiver: owner\n        });\n        vm.expectRevert();\n        script.deploy(config, \"[]\");\n    }\n}","reproduction":"Ran .imd/reads/proofs/Proof_67ab89db408b.t.sol from test/scratch/: [FAIL: next call did not revert as expected] test_ScriptRejectsVaultOfAnotherToken. Steps: vm.chainId(1); og = new MockOG(owner); other = new MockOG(owner); wrongVault = new OGClubFarmVault(other, owner); furniture = new OGClubFurniture(owner, owner); DeployClubsMainnet.deploy(Config{token: og, vault: wrongVault, price: 100_000e18, furniture, owner, royaltyReceiver: owner}, \"[]\"). Expected: revert because wrongVault.token() != og. Actual: OGClubClubs is deployed. Then owner.setSaleOpen(true), buyer approves 100_000e18 og and calls mintClub(): og.balanceOf(wrongVault) == 50_000e18, wrongVault.proposeSeason(root, 1) reverts BudgetExceeded because the vault only counts `other`, and neither contract has a function that can move the stranded og again.","severity":"low","snippet":"        clubs = new OGClubClubs(\n            config.token, config.vault, config.price, config.furniture, config.owner, config.royaltyReceiver\n        );","title":"DeployClubsMainnet does not cross-check FARM_VAULT against OG_TOKEN, so a mismatched vault strands half of every club payment"},{"citation":"resolved","description":"Merged from write_foundry_tests and audit_math. The grid is 10x10 with two reserved door tiles (DOOR_MASK, line 28), every footprint has w, h >= 1 (setFootprint, line 220) and overlaps are rejected (line 163), so a club can hold at most 98 pieces. The guard on line 161 never fires in real play: the 99th attempt fails earlier with TileTaken, BlocksDoor or OutOfRoom. The brief's 'Max 100 pieces per club' and '101st piece reverts' test are therefore not observable on chain; the shipped suite reaches ClubFull only by writing the array length with stdstore (test/ClubsPlacement.t.sol line 261). Behaviour is safe (the stricter geometric limit wins); the documented cap and error do not match what a holder sees. Either document 98 as the effective cap or set MAX_PIECES to 98 so ClubFull is the error a full room returns.","line":161,"path":"src/OGClubClubs.sol","reproduction":"Owner: setFootprint(1, 1, 1). Alice (holder of club 1) places furniture id 1 at every (x, y), 0 <= x, y <= 9, except (0,4) and (1,4): 98 successful placements, pieceCount(1) == 98 (test/ClubsPlacement.t.sol::test_All98UsableTilesFillAndNo99th100thOr101stPlacementFits and test/ClubsAdversarial.t.sol::test_FullRoomRejectsEverythingElse pass on this code). 99th placement: furniture.safeTransferFrom(alice, clubs, 1, 1, abi.encode(uint256(1), uint8(0), uint8(0), uint8(0))) reverts TileTaken; at (0,4) BlocksDoor; at (10,0) OutOfRoom. Expected per brief: a 101st piece reverting ClubFull. Actual: no 99th piece can exist and ClubFull is never returned for any input.","severity":"info","snippet":"        if (index >= MAX_PIECES) revert ClubFull();","title":"MAX_PIECES = 100 / ClubFull is unreachable: a room holds at most 98 pieces"},{"citation":"resolved","description":"From audit_flow, with the observed error corrected. Every other failure path uses a named custom error, as the brief requires, but a data payload that is not exactly 128 bytes reverts with empty return data. OpenZeppelin's ERC1155 acceptance check turns an empty-reason revert from the receiver into ERC1155InvalidReceiver(clubs), so a holder who passes abi.encodePacked or forgets the rot field is told the club contract is not a valid ERC-1155 receiver, which is misleading. Funds are unaffected: the furniture transfer is rolled back atomically. Fix: declare a BadData error and revert with it (abi.decode of a well-formed 128-byte payload with non-canonical uint8 words still reverts inside the decoder with empty data; if that matters, check the three high words are < 256 before decoding).","line":155,"path":"src/OGClubClubs.sol","reproduction":"Reproduced with test/scratch/Repro.t.sol::test_MalformedDataRevertsWithEmptyReason. Owner: setFootprint(1, 1, 1); grantMinter(owner); mintBatch(alice, [1], [1]); alice buys club 1. alice: furniture.safeTransferFrom(alice, clubs, 1, 1, abi.encode(uint256(1), uint8(0), uint8(0))) (96 bytes). Expected: a named error such as BadData. Actual: the hook executes revert() with empty data and the caller receives ERC1155InvalidReceiver(0x<clubs address>) from OGClubFurniture; vm.expectRevert(bytes(\"\")) fails with 'Error != expected error: ERC1155InvalidReceiver(...) != EvmError: Revert'. No state changes; the furniture stays with alice.","severity":"info","snippet":"        if (data.length != 128) revert();","title":"Malformed placement data reverts with a bare revert(), which the furniture contract reports as ERC1155InvalidReceiver"},{"citation":"resolved","description":"From audit_flow, widened: the script does not only configure footprints as OWNER, it also creates OGClubClubs inside vm.startBroadcast(config.owner), so every run, including one with FOOTPRINTS_JSON empty, must be signed by the OWNER key. The README and launch notes direct OWNER to be a Safe on mainnet; a Safe has no key the script can use, so the mainnet script cannot broadcast for the documented production configuration and the operator must fall back to the factory/constructor deployment and have the Safe execute setFootprint calls afterwards. README lines 198-203 state this, so it is an operational note, not a code defect: the brief asked for OWNER as a constructor argument, not as the broadcaster. A separate DEPLOYER broadcaster with OWNER passed only as the constructor argument (footprints then configured by the owner) would let the script serve the documented setup.","line":126,"path":"script/DeployClubs.s.sol","reproduction":"OG_TOKEN=... FARM_VAULT=... CLUB_PRICE=... FURNITURE=... OWNER=<Safe address> ROYALTY_RECEIVER=... forge script script/DeployClubs.s.sol:DeployClubsMainnet --broadcast (FOOTPRINTS_JSON unset). Expected: OGClubClubs deployed with the Safe as owner. Actual: vm.startBroadcast(<Safe>) requires a signer for that address; no key exists, so no transaction can be sent and nothing is deployed. In a Foundry test the same path only works because vm.startBroadcast(owner) impersonates the owner (test/ClubsDeployment.t.sol::test_MainnetScriptUsesSuppliedDependenciesAndLeavesSaleClosed).","severity":"info","snippet":"        vm.startBroadcast(config.owner);","title":"DeployClubsMainnet broadcasts the deployment and configuration from OWNER, so a Safe owner cannot run it at all"}],"hash":"47889e4879f55a0e2a491fa14b4dd56a9595244b3fa4d8f81bce1f7f1d17a378","nodeId":"3a38fe87-0d88-4184-9c37-37e849fd5d6f","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json`, the scratch tests are removed, and the tree is otherwise untouched.\n\n**Verification baseline.** `forge build`, `forge fmt --check` and all 196 tests pass. The four pre-existing contracts are byte-identical to the base commit. OGClubClubs deploys at 12,680 bytes with a dependency-free constructor, and launch.json is schema-valid with six contracts in dependency order and notes under the 4,000-character limit.\n\n**Findings kept (5), after merging and reproducing:**\n\n- **Low: constructor accepts the burn sink as vault.** Three specialists reported this. Confirmed with a scratch test: construction with vault `0x...dEaD` succeeds, then every mint reverts `UnexpectedTokenDebit` because both legs land on one account. Immutable, so unfixable after deploy. Also confirmed the alias case where vault equals the token contract strands the vault half inside the token. Attached a failing proof test.\n- **Low: mainnet script does not cross-check FARM_VAULT against OG_TOKEN.** Ran the specialist's proof; it fails on current code as described. A wrong vault silently strands half of each purchase.\n- **Info: ClubFull is unreachable.** Two specialists; confirmed from the geometry. The room caps at 98 pieces, so the brief's 100-piece cap and 101st-piece test never fire on chain.\n- **Info: malformed placement data uses a bare revert.** Reproduced, with a correction to the specialist's claim: the furniture contract surfaces it as `ERC1155InvalidReceiver`, which misleads the caller.\n- **Info: mainnet script broadcasts as OWNER.** Widened from the specialist's version: the deploy itself is inside the owner broadcast, so a Safe owner cannot run the script even with no footprints. The README documents the workaround.\n\n**Dropped:** the furniture-operator placement note, because it matches the brief's `from` authorization rule and is not a defect.\n\n**Coverage:** all 57 entry points answered plus three invariant and manifest rows. One row is `unreached`: `OGClubRaffle.draw`, since I did not re-trace the block-header library in this budget. Both mint entry points and the ERC-1155 hook are marked `finding`, the rest `holds`.","treeHash":null,"usage":{"cachedInputTokens":971241,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":32403,"runtime":"claude","turns":30,"wallClockMs":640816}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0476c44a80aa9574","findings":[{"citation":"resolved","description":"The constructor rejects zero values and a self-address vault, but not vault_ == BURN_ADDRESS (0x...dEaD). Because vault is immutable and _mintClub checks each recipient's balance rose by exactly its own share, a contract deployed with the dead address as vault reverts every mintClub/mintClubTo with UnexpectedTokenDebit forever: the burn sink's balance rises by price, not price/2. The README documents the mint-time revert, but nothing stops the misdeploy itself, and there is no remedy after deployment (no setter, no withdraw). A one-line constructor check (vault_ == BURN_ADDRESS -> revert) closes a trap the mainnet script takes straight from the FARM_VAULT env var.","line":101,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, 0x000000000000000000000000000000000000dEaD, 11, furniture, owner, owner); owner.setSaleOpen(true); payer approves 11 and calls mintClub(). Expected: either the constructor rejects the sink as vault, or the mint succeeds. Actual: constructor succeeds and every mint reverts UnexpectedTokenDebit (see test/scratch/Probe.t.sol test_vaultEqualsBurnSinkBricksMint, which passes on the current code by expecting that revert).","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == BURN_ADDRESS, which permanently bricks minting (immutable, unfixable)"},{"citation":"resolved","description":"Every other failure path in the contract uses a named custom error, as the brief requires. A data payload of the wrong length (for example abi.encodePacked, or a missing rot field) reverts with empty return data, so the caller (and the ERC1155 contract's error bubbling) sees no reason. Non-canonical 128-byte payloads also revert inside abi.decode with empty data. Funds are unaffected; the furniture transfer is rolled back atomically.","line":155,"path":"src/OGClubClubs.sol","reproduction":"furniture.safeTransferFrom(holder, clubs, 1, 1, abi.encode(uint256(1), uint8(0), uint8(0))) (96 bytes). Expected: a named error such as BadData. Actual: revert with empty data.","severity":"info","snippet":"        if (data.length != 128) revert();","title":"Malformed placement data reverts with a bare revert() instead of a custom error"},{"citation":"resolved","description":"DeployClubsMainnet deploys and then calls setFootprint for each JSON row from the same broadcast, signed by config.owner. The README and launch notes direct OWNER to be a Safe on mainnet. A Safe has no private key the script can use, so a run with FOOTPRINTS_JSON non-empty and OWNER set to a Safe cannot broadcast at all; the footprints must be configured through the Safe afterwards. The README states this on lines 201-204, so this is an operational note, not a code defect.","line":126,"path":"script/DeployClubs.s.sol","reproduction":"OWNER=<Safe address> FOOTPRINTS_JSON='[[1,1,1]]' forge script DeployClubsMainnet --broadcast. Expected: clubs deployed and footprints set. Actual: the broadcast cannot be signed for the Safe address; nothing is deployed.","severity":"info","snippet":"        vm.startBroadcast(config.owner);","title":"Mainnet script broadcasts the owner-only configuration as OWNER, which a Safe owner cannot sign"}],"hash":"50bd40d4c654a9d70772c0b13acfaef208c268d374ba141d5d25048fa9274c9c","nodeId":"b5c57013-9f63-451b-ae54-9a94f15422f6","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No tracked file was changed.\n\n**Outcome: no medium or higher defect in OGClubClubs.** Build, `forge fmt --check` and all 165 tests pass. I traced every OGClubClubs entry point through the Execution Trace, Periphery and First Principles checklists and found the control flow sound.\n\nWhat I verified in depth:\n- **Mint path.** Sale gate, floor split, two direct payer-to-recipient legs, per-recipient and payer delta checks, reentrancy guard, then `_safeMint`. Payer equal to vault or sink, taxed tokens and false-returning tokens all revert atomically. A recipient that places furniture from inside its ERC-721 receive hook leaves consistent state, confirmed with a scratch probe.\n- **Placement hook.** Caller must be the furniture contract, amount must be 1, data must be exactly 128 bytes and the decoder rejects dirty uint8 words. Club existence, holder or approved authorization, footprint set, 100-piece cap, grid bounds with rotation, door mask and overlap are all checked before any write. The vendored OpenZeppelin 1155 credits the balance before the hook, so the pieces-equals-held invariant holds on every inbound path, including mints to the contract and one-element batches.\n- **Admin surface.** Footprint lock, metadata freeze, royalty cap, Ownable2Step and the absence of any withdraw or furniture-out path.\n- **Manifest and scripts.** launch.json has only the schema keys, six unique contracts in dependency order, one argument per constructor parameter, notes under 4,000 characters.\n\nFindings reported:\n1. **Low.** The constructor rejects a self-address vault but not the burn sink as vault. Such a deployment mints nothing forever, because the sink's balance rises by the full price. The README documents the mint-time revert but nothing prevents the misdeploy, and the vault is immutable.\n2. **Info.** Wrong-length placement data reverts with a bare `revert()` rather than a named error.\n3. **Info.** The mainnet script broadcasts the footprint and sale calls as OWNER, which a Safe owner cannot sign. The README already describes the workaround.\n\nCoverage: all 59 entry points have a row, plus the two brief invariants. Three rows carry a finding reference, the rest hold. The contracts outside my area were kept unchanged and are marked as untouched by the clubs control flow.","treeHash":null,"usage":{"cachedInputTokens":951656,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":24005,"runtime":"claude","turns":22,"wallClockMs":569647}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a720671678111bc","findings":[{"citation":"resolved","description":"The mainnet script reads OG_TOKEN, FARM_VAULT and FURNITURE as independent environment inputs and deploys OGClubClubs with them after only a chain-id check and JSON validation. Unlike the constructor, the script runs against live chain state and could verify OGClubFarmVault(FARM_VAULT).token() == OG_TOKEN (and that FARM_VAULT and FURNITURE have code / FURNITURE supports ERC-1155 0xd9b67a26), but it does not. OGClubClubs.token and vault are immutable and the contract has no admin path to change them, and OGClubFarmVault has no sweep and can only budget seasons in its own token (proposeSeason uses token.balanceOf(this)). So if FARM_VAULT is the vault of another token, a staking contract, or any other address, the price - price/2 vault leg of every club purchase is sent to an address that can never pay it out, while the on-chain balance checks in _mintClub pass because the recipient balance did rise. Only a redeploy of OGClubClubs fixes it, after revenue has already been lost. This is an economic-flow guard that belongs in the script since the constructor is deliberately dependency-free for factory deployment; the Sepolia script and launch.json are not affected because they wire the vault from the same token.","line":127,"path":"script/DeployClubs.s.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC1155} from \"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\";\nimport {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 {DeployClubsMainnet} from \"script/DeployClubs.s.sol\";\n\ncontract MainnetVaultMismatchTest is Test {\n    address internal owner = makeAddr(\"owner\");\n\n    function test_ScriptRejectsVaultOfAnotherToken() public {\n        vm.chainId(1);\n        MockOG og = new MockOG(owner);\n        MockOG other = new MockOG(owner);\n        OGClubFarmVault wrongVault = new OGClubFarmVault(other, owner);\n        OGClubFurniture furniture = new OGClubFurniture(owner, owner);\n        DeployClubsMainnet script = new DeployClubsMainnet();\n        DeployClubsMainnet.Config memory config = DeployClubsMainnet.Config({\n            token: og,\n            vault: address(wrongVault),\n            price: 100_000e18,\n            furniture: IERC1155(address(furniture)),\n            owner: owner,\n            royaltyReceiver: owner\n        });\n        vm.expectRevert();\n        script.deploy(config, \"[]\");\n    }\n}","reproduction":"On chain id 1 (vm.chainId(1) in a test): deploy MockOG og and MockOG other, deploy OGClubFarmVault wrongVault = new OGClubFarmVault(other, owner), deploy OGClubFurniture. Call DeployClubsMainnet.deploy(Config{token: og, vault: address(wrongVault), price: 100_000e18, furniture, owner, royaltyReceiver}, \"[]\"). Expected: the script reverts because wrongVault.token() != og. Actual: it deploys OGClubClubs successfully. Then owner.setSaleOpen(true), buyer approves 100_000e18 og and calls mintClub(): og.balanceOf(wrongVault) == 50_000e18, but wrongVault.proposeSeason(root, 1) reverts BudgetExceeded because the vault only counts `other`; there is no function in OGClubFarmVault or OGClubClubs that can move the 50_000e18 og again. Verified with a scratch Foundry test (test/scratch/MainnetVaultMismatch.t.sol): the expectRevert on script.deploy fails (deploy succeeds) and the stranded-balance assertions pass.","severity":"low","snippet":"        clubs = new OGClubClubs(\n            config.token, config.vault, config.price, config.furniture, config.owner, config.royaltyReceiver\n        );","title":"DeployClubsMainnet does not cross-check FARM_VAULT against OG_TOKEN, so a mismatched vault strands half of every club payment forever"}],"hash":"5d730911f1d4c9172a27ec3b3ad4e825ab0815dc40a17ecf7345ed2050117382","nodeId":"9af1584d-9f9d-4a6e-b706-2c192b88ba8b","outcome":"completed","summary":"The review is complete. The findings file is written, the scratch test is removed, and the working tree is clean apart from the gitignored findings file.\n\n**Outcome:** OGClubClubs holds against the Economic Security, Invariant and Flow Gap guides. I found one low-severity defect, in the mainnet deploy script rather than the contract.\n\n**Finding (low):** DeployClubsMainnet in `script/DeployClubs.s.sol` takes OG_TOKEN and FARM_VAULT as independent inputs and never checks that the vault's token is the OG token. The constructor cannot check this because it must run on an empty chain, but the script runs against live state and could. A mismatched vault means the vault half of every club purchase lands in a contract that can never budget or pay it, and the clubs contract has no way to change its immutable vault. I reproduced it with a scratch test: the script deploys against a vault of another token, a mint sends 50,000 OG there, and the vault's season proposal reverts with no recovery path.\n\n**What held, with evidence:**\n- Payment flow: both recipient deltas and the payer debit are checked exactly. Fee-on-transfer, false-return, callback-reentrant tokens, vault equal to the burn sink, and payer equal to the vault all revert atomically. The contract never holds OG.\n- Furniture custody invariant: every inbound path runs the validated single hook or reverts. One-element batches routed by OpenZeppelin 5.0.2 to the single hook are recorded correctly. Minting directly into a club fails on empty data. No outbound path exists.\n- Grid invariants: the bitmap math, door mask and rotation handling match an independent cell model under fuzzing. Footprint locks survive ownership handover.\n- The furniture-operator trust implication is documented in the README and cannot cause third-party loss.\n- The launch manifest has six unique names, matching constructor arity and order, backward references, and notes under the 4,000-character limit.\n\n**Coverage:** 61 rows, 54 holds, 7 unreached. The unreached rows are the raffle's own entry points (create, enter, commit, draw, claim, cancel), which sit outside the assigned area and which I did not trace. I did confirm that claiming raffle prizes into the clubs address cannot create unrecorded furniture.\n\n**Checks run:** forge build passed. All 42 club tests passed, including the 203-second invariant suite. I did not run the full repository suite or forge fmt, since the review changes no project files.","treeHash":null,"usage":{"cachedInputTokens":1481795,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":31969,"runtime":"claude","turns":32,"wallClockMs":710480}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc7103e773ea194a","findings":[],"hash":"9af78d709fb7203d351ce170988e38aadb9a1a95848733931db9f6e4ec042f65","nodeId":"25743e59-b312-4057-b31a-b258fc67ed03","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and the working tree is otherwise untouched (the findings file is the only new file, and it is the required output).\n\n**Result: no defects found in the permissions area of OGClubClubs.** `.imd-findings.json` holds an empty findings list and a 61-row coverage record covering all 57 listed entry points plus the two invariants, the constructor, and the launch manifest.\n\n**What I checked, against the Access Control, Trust Gap and Asymmetry guides**\n\n- **Permission map.** Every state-changing path in `src/OGClubClubs.sol` is either owner-only (sale flag, footprints, base URI, freeze, royalty), standard ERC-721 token-holder authority, or the furniture hook. No storage variable has two writers with different guards. The footprint struct is written by the owner setter and by the hook, but the setter cannot clear the lock the hook sets.\n- **Hook authorization.** `onERC1155Received` at `src/OGClubClubs.sol:147` requires the caller to be the immutable furniture contract, amount one, exactly 128 bytes of canonical data, an existing club, and `from` to be the club's owner, token-approved account, or operator-for-all. Mints from the zero address, raffle `claimTo` redirected at the clubs contract, and multi-element batches all revert, so no furniture enters without a layout entry and nothing can leave.\n- **Payment flow.** Both legs move directly from the payer to the dead sink and the farm vault. Recipient deltas and the payer debit are checked exactly, with the reentrancy guard shared by both mint entry points. The owner has no free mint, seizure, burn, or withdrawal path.\n- **Trust assumptions recorded, not reported as defects.** The owner can change an unlocked footprint while a user's placement is pending, can renounce ownership and freeze configuration forever, and authors the farm vault's Merkle roots that distribute club revenue. Each is documented in the README and has no unprivileged amplifier, so they are coverage notes.\n- **Manifest and build.** The manifest has only the three schema keys, six unique names in dependency order, correct argument counts, and notes under the limit. Existing contracts are byte-identical to the base commit. `forge build`, `forge fmt --check`, and the club, furniture, vault, role and deployment suites all pass.\n\n**Not reached.** Raffle draw and commit, and staking stake/unstake math, are outside the permissions area and are marked `unreached` in the coverage record.","treeHash":null,"usage":{"cachedInputTokens":895131,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":33578,"runtime":"claude","turns":33,"wallClockMs":707883}},{"artifacts":[],"attempt":1,"bundleHash":"d95d78eede631a9b0e4191126b326a3476f8fc32026a9c40fef7a8bb4226cb41","device":"12e4af809be06118","findings":[],"hash":"ac73824af1743a32026cf602f075ee7346e229d539efd606408a481b965a36d8","nodeId":"6a694bc2-81ac-4047-9cef-324b2496ed10","outcome":"completed","summary":"Implemented OGClubClubs, tests, deployment scripts, launch.json, README, and ADAPTATION.md. Existing contracts remain byte-for-byte unchanged.\n\nVerified:\n\n- `forge build`\n- 165 Foundry tests with the supplied seed\n- `forge fmt --check`\n- Six Python checks\n\nThe footprint catalogue starts empty and is owner-configurable. Audit findings and launch handoff requirements are documented. No deployment was broadcast.","treeHash":"4ff3cd600df65ba99e6212c47ba73636dad05e21","usage":{"cachedInputTokens":3725184,"inputTokens":114118,"model":"gpt-6-astra","outputTokens":47704,"runtime":"codex","turns":10,"wallClockMs":1193359}},{"artifacts":[],"attempt":1,"bundleHash":"041dcd85c9667b63ec15fe26c13e8c81ee3749bc2064228d96537b22c48af80f","device":"b57ae3a96321a0e1","findings":[{"description":"The constructor rejects a zero vault and a predicted self-address, but not vault == 0x...dEaD. With that vault, _mintClub reads burnBefore and vaultBefore from the same balance, both transfers credit the same address, and _checkReceipt(BURN_ADDRESS, burnBefore, burned) sees an increase of `price` instead of `price/2`, so every mintClub/mintClubTo reverts UnexpectedTokenDebit. vault is immutable, so the deployment can never sell a club. test/OGClubClubs.t.sol::test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself asserts that mint reverts here, which treats a misconfiguration as working behaviour. A constructor check (revert when vault_ == BURN_ADDRESS) would catch it at deploy time.","line":101,"path":"src/OGClubClubs.sol","reproduction":"new OGClubClubs(token, 0x000000000000000000000000000000000000dEaD, 100_000e18, furniture, owner, royalty) succeeds; owner.setSaleOpen(true); a funded and approved payer calls mintClub(). Expected: the constructor reverts (or the mint works). Actual: the constructor succeeds and every mint reverts UnexpectedTokenDebit, forever.","severity":"low","title":"Constructor accepts vault == BURN_ADDRESS, deploying a sale that can never mint"},{"description":"The grid is 10x10 with two reserved door tiles, and the smallest footprint is 1x1, so at most 98 pieces fit in a club. The 99th, 100th and 101st placements always revert TileTaken (or BlocksDoor), never ClubFull. The brief's '101st piece' test is not reachable with real placements. The guard is harmless, but the stated cap is not the effective one. test/ClubsAdversarial.t.sol::test_FullRoomRejectsEverythingElse fills all 98 tiles and shows the next placement rejected as TileTaken.","line":161,"path":"src/OGClubClubs.sol","reproduction":"Place 98 1x1 pieces on every non-door tile of club 1, then place a 99th at (0,0). Expected per brief: the cap is 100 pieces. Actual: the room is full at 98 and the revert is TileTaken; ClubFull is dead code.","severity":"info","title":"MAX_PIECES = 100 / ClubFull cannot be reached: a room has only 98 placeable tiles"},{"description":"Authorization checks `from` (the furniture owner), not `operator`, as the brief specifies. Any address the holder approved with furniture.setApprovalForAll (for example a marketplace) can therefore place the holder's furniture into the holder's club, irreversibly, at any spot. This matches the brief and is documented in the source comment. Holders and integrators should know that a furniture approval carries this irreversible power. Tested in test/ClubsPlacement.t.sol::test_FurnitureOperatorCanPlaceFromClubHolder.","line":157,"path":"src/OGClubClubs.sol","reproduction":"Alice owns club 1 and calls furniture.setApprovalForAll(market, true). market calls furniture.safeTransferFrom(alice, clubs, id, 1, abi.encode(1, x, y, rot)). The piece is locked in club 1 permanently, with no action by Alice beyond the approval.","severity":"info","title":"An ERC-1155 operator of the club holder can permanently lock the holder's furniture into the holder's club"}],"hash":"cd6781bc0cf75e76dd01bbeab43dc1a93511fc44d12b9499206c3271caa5230b","nodeId":"194b2d36-70bb-4319-aae8-a506204bb5fe","outcome":"completed","summary":"I added two test files for `OGClubClubs` and found no defect at critical, high or medium level. `forge build`, `forge fmt --check` and the full `forge test` run with the verifier's seed all pass: 196 tests, 0 failures. No contract, script or config file was changed.\n\n**`test/ClubsAdversarial.t.sol`** (30 tests, two of them fuzzed at 512 runs) covers the edges the brief lists and some it doesn't:\n- **Placement inputs:** coordinates and rotations up to 255, the exact right and bottom edges, and rotations of a non-square 3x1 piece. It checks every shape that touches either door tile, plus a fuzzed check that a single tile is refused exactly on the two door tiles. It also checks overlaps that share one tile, and that pieces may touch edges.\n- **Bad data and callers:** layout data that is too short, too long, tightly packed, or carries coordinates above 255 is refused. So are missing club ids 0, 2 and the maximum, minting furniture straight into the contract, calling the hook directly, and amounts of 0 or 2.\n- **Who can place:**\n  - Approving one club, or all of a holder's clubs, grants placement, and revoking it takes it away.\n  - Approval for one club doesn't carry to another.\n  - The contract owner has no placement right.\n  - After a transfer, the old holder and the old approval are cut off and the layout is unchanged.\n- **Footprints:** a footprint can be changed freely until its first successful placement; rejected placements don't lock it.\n- **Custody:** no caller can move furniture out, and the contract has no receive function. A room filled with 98 pieces rejects the next one.\n- **Minting and admin:** a receiver that places furniture during its mint callback can't mint twice. Contracts that can't receive the club are refused. Allowance and balance work at exactly the price and fail one wei short. A fuzzed test checks the burn/vault split for any price. Royalty and metadata limits, the two-step ownership handover, renouncing ownership and interface support are covered.\n\n**`test/ClubsAdversarialInvariant.t.sol`** runs 64 sequences of 64 random calls each. Four users mint, transfer, approve and revoke, and try to place furniture as the holder, an approved user, a stranger or a furniture operator. Clubs may be missing and positions partly off the grid, while the owner sets valid and invalid footprints. A separate grid model predicts whether each placement should succeed. Any rejection must cite a rule that really applies and leave everything unchanged. After every call these must hold:\n- The contract never holds $OG.\n- Burned plus sent to the vault always equals price × mints.\n- Placed pieces equal the furniture the contract holds, for each furniture id.\n- Stored layouts fit the grid, never overlap, never cover the door, and match `tileTaken`.\n- Locked footprints never change.\n\nTo check the tests actually catch bugs, I briefly removed one door tile from the contract's rule. Both new files failed, and I then restored the contract with `git checkout`.\n\nI recorded three items in `.imd-findings.json`. None needed a proof, since none is critical or high:\n- **Low:** the constructor accepts the burn address as the vault. Every mint would then fail with `UnexpectedTokenDebit`, and since the vault can't be changed, that deployment could never sell a club. An existing test in `OGClubClubs.t.sol` expects the mint to fail here, which treats the bad setting as normal.\n- **Info:** the 100-piece cap can never be reached, because only 98 tiles can hold furniture. The \"101st piece\" error in the brief is unreachable code, and the 99th piece fails with `TileTaken` instead.\n- **Info:** anyone a holder has approved to move their furniture (a marketplace, say) can permanently place it into the holder's club. This follows the brief, which checks who the furniture comes from, but holders should know an approval carries that power.\n\nI also added a description of both files to `test/ADDITIONAL_COVERAGE.md`.","treeHash":"a1a259cb65037e40e086a5b4298134964cf07442","usage":{"cachedInputTokens":1142856,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":40427,"runtime":"claude","turns":21,"wallClockMs":717382}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a5c5e95a2ed07117","findings":[{"citation":"resolved","description":"Boundary gap (sentinel-address branch). The constructor rejects a zero vault and a vault equal to the predicted self-address, but not a vault equal to the contract's own burn sink BURN_ADDRESS (0x...dEaD). token, vault and price are immutable, so the misconfiguration cannot be repaired. _mintClub (lines 122-131) splits price into burned = price/2 and toVault = price - burned, sends both legs, then requires the burn sink's balance to have risen by exactly `burned` and the vault's by exactly `toVault`. When vault == BURN_ADDRESS both legs land on the same account, which rises by `price`, so _checkReceipt(BURN_ADDRESS, burnBefore, burned) fails for every price >= 1 (at price 1: burned = 0 but the balance rose by 1; at price 10: burned = 5 but it rose by 10). Every mintClub/mintClubTo call reverts UnexpectedTokenDebit forever, with the sale open and the deployment otherwise complete. No funds are lost (the revert is atomic), which is why this is low, but the launch would be dead on arrival and the fix is one constructor line: `if (vault_ == BURN_ADDRESS) revert UnexpectedTokenDebit();` (or ZeroAddress). The project's own test test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself (test/OGClubClubs.t.sol:289) demonstrates the runtime revert but treats it as acceptable instead of rejecting the configuration at construction. The same argument applies to vault_ == address(token_): OpenZeppelin ERC20 accepts transfers to the token contract itself, so with that vault every mint succeeds and the vault half (price - price/2 per mint) is stranded inside the token contract with no owner; neither alias is rejected.","line":101,"path":"src/OGClubClubs.sol","reproduction":"1. new OGClubClubs(MockOG, 0x000000000000000000000000000000000000dEaD, 10, furniture, owner, royalty) -> succeeds (expected: revert, as for vault_ == address(this)). 2. owner: setSaleOpen(true). 3. alice: token.approve(clubs, 10); clubs.mintClub(). Actual: transfer of 5 to 0xdEaD, transfer of 5 to vault (== 0xdEaD), burn-sink balance rose by 10, _checkReceipt expects +5 -> revert UnexpectedTokenDebit. Repeat with any price and any payer: identical revert. The contract can never mint and its immutables cannot be changed. Expected: the constructor refuses the configuration the same way it refuses vault_ == address(this).","severity":"low","snippet":"        if (vault_ == address(this)) revert UnexpectedTokenDebit();","title":"Constructor accepts vault == BURN_ADDRESS, producing an immutable contract whose every mint reverts"},{"citation":"resolved","description":"Boundary note, not a loss. The brief says 'Max 100 pieces per club' and asks for a test that the 101st piece reverts ClubFull. Every placement occupies at least one tile (w, h >= 1, enforced by setFootprint line 220) and never a door tile (DOOR_MASK, line 188), so a club has at most 100 - 2 = 98 pieces. The index check on line 161 therefore never fires in real play: after 98 single-tile pieces the 99th attempt fails earlier with TileTaken, BlocksDoor or OutOfRoom. The shipped suite acknowledges this and only reaches ClubFull by writing the array length with stdstore (test/ClubsPlacement.t.sol:258). The on-chain behaviour is safe (the stricter geometric limit wins), but the spec's number and error are not what a holder observes; either the brief should say 98 or the cap should be lowered to 98 so the documented error matches the real limit.","line":161,"path":"src/OGClubClubs.sol","reproduction":"Owner: setFootprint(1, 1, 1). Alice (club 1 holder) places furniture id 1 at every (x, y) with 0 <= x, y <= 9 except (0,4) and (1,4): 98 successful placements, pieceCount(1) == 98. 99th placement at any tile: safeTransferFrom(alice, clubs, 1, 1, abi.encode(1, 0, 0, 0)) reverts TileTaken; at (0,4) reverts BlocksDoor; at (10,0) reverts OutOfRoom. ClubFull is never returned for any input. Expected per brief: a 101st piece reverting ClubFull; actual: no 99th piece can exist.","severity":"info","snippet":"        if (index >= MAX_PIECES) revert ClubFull();","title":"MAX_PIECES / ClubFull is unreachable: the 10x10 room with two reserved door tiles holds at most 98 pieces"}],"hash":"f91c89985b10b05c9f55c6a96e7f033fad4b25f0d02c8232c0e99fb8ecb1c1f6","nodeId":"109e940f-3fc6-44d7-9687-1c1436e353a7","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. The JSON parses, both snippets match the tree at their cited lines, and the working tree has no other changes.\n\n**Outcome.** OGClubClubs is numerically sound in the assigned area. No critical, high or medium defect was found, so no proof test was needed.\n\n**What I verified**\n\n- **Payment split.** The burn leg is floor(price/2) and the vault leg is the remainder, so the two always sum to the price for every uint256. The before/after receipt checks catch fee-on-transfer, false-return, callback and over-credit tokens, and the 275-second invariant run plus the uint128 price fuzz pass.\n- **Grid math.** Tile bit is y·10+x, the door mask covers bits 40 and 41, rotation swaps width and height, bounds are x+w ≤ 10 and y+h ≤ 10, shifts stay under 103 bits, and overlap is a single AND. The fuzz test compares this against an independent cell model and passes.\n- **Decoding and casts.** The 128-byte data check plus the ABI decoder reject out-of-range uint8 words. Footprints are bounded to 1..4 and locked after first use.\n- **Existing contracts.** The slither leads on staking (remainder carry) and the raffle (uint48 casts) are bounded by the denominator and ticket cap respectively, so I rejected them.\n\n**Findings written**\n\n1. **Low.** The constructor rejects a vault equal to the predicted self address but not one equal to the burn sink 0x…dEaD. With that vault both payment legs land on one account, the receipt check fails, and every mint reverts forever since the vault is immutable. No funds are lost. The same unchecked alias applies to vault equal to the token address, where the vault half would be stranded inside the token contract.\n2. **Info.** The 100-piece cap can never fire because the room has only 98 non-door tiles. The brief's \"101st piece reverts ClubFull\" is unreachable, and the shipped test only reaches it via a storage write.\n\n**Coverage.** All 57 listed entry points have a row, plus four invariant and manifest rows. Only the raffle's two claim functions are marked unreached, as their internal claim body is outside my area and I did not trace it.","treeHash":null,"usage":{"cachedInputTokens":1087820,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":28305,"runtime":"claude","turns":27,"wallClockMs":708249}}],"verification":[{"checks":[{"durationMs":9643,"exitCode":0,"name":"build","output":"Compiling 94 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.53s\nCompiler run successful!\n","passed":true},{"durationMs":66102,"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.03ms (1.42ms CPU time)\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 170949)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 10899)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 560942)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 127999)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 295900)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160918)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 451506)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.20ms (1.08ms 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: 685129)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384443)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 428413)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.29ms (1.46ms CPU time)\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98UsableTilesFillAndNo99th100thOr101stPlacementFits() (gas: 18619182)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263927)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 603581)\n[PASS] test_Defensive100PieceGuardUsingSyntheticUnreachableStorage() (gas: 316043)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158838)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 734069)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 321579)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 741678)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1204308)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2562006)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 1263237)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219504)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 719935)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 178030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 10.56ms (13.34ms CPU time)\n\nRan 6 tests for test/Gas.t.sol:GasTest\n[PASS] test_GasClaimOne() (gas: 954101)\nLogs:\n  Claim one win / fresh furniture wallet\n  Cancun call gas: 160885\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 472565\n\n[PASS] test_GasClaimTen() (gas: 2860761)\nLogs:\n  Claim ten distinct items / fresh furniture wallet\n  Cancun call gas: 816170\n  New persistent slots: 22\n  EIP-8037 state gas: 2154240\n  EIP-8037 storage-repriced call gas: 2530410\n\n[PASS] test_GasDraw() (gas: 418645)\nLogs:\n  Draw / 23-field synthetic header\n  Cancun call gas: 74312\n  New persistent slots: 1\n  EIP-8037 state gas: 97920\n  EIP-8037 storage-repriced call gas: 152232\n\n[PASS] test_GasEnter() (gas: 558676)\nLogs:\n  First entry / ten tickets / first points checkpoint\n  Cancun call gas: 155364\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 467044\n\n[PASS] test_GasFirstStake() (gas: 200138)\nLogs:\n  First-ever stake / fresh staker\n  Cancun call gas: 120547\n  New persistent slots: 3\n  EIP-8037 state gas: 293760\n  EIP-8037 storage-repriced call gas: 354307\n\n[PASS] test_GasUnstake() (gas: 308132)\nLogs:\n  Partial unstake / first fee / first checkpoint\n  Cancun call gas: 110662\n  New persistent slots: 2\n  EIP-8037 state gas: 195840\n  EIP-8037 storage-repriced call gas: 266502\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 14.11ms (13.89ms CPU time)\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\n\nRan 6 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 19017973)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 11885667)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 8503504)\n[PASS] test_MainnetScriptUsesSuppliedDependenciesAndLeavesSaleClosed() (gas: 7421483)\nLogs:\n  OGClubClubs 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x00000000000000000000000001722bf6c4acd7ce60f85938f75a9ebfbdc90ad80000000000000000000000004896baa3a15e716e09768b67ddef8a5a0a625c7e000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df2600000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x01722bf6C4aCD7cE60F85938f75a9EbFbdc90AD8\n  vault 0x4896baa3A15E716e09768b67DdeF8a5A0a625C7E\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 12208)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 14954457)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 19.44ms (47.80ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558631, ~: 558520)\nLogs:\n  Bound result 9580\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.05ms (40.13ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 33178, ~: 32177)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 94161, ~: 73909)\nLogs:\n  Bound result 64\n\n[PASS] test_MalformedAuthenticatedHeaderCannotMint() (gas: 321913)\n[PASS] test_MalformedRLPBoundsAndCanonicalLengths() (gas: 147737)\n[PASS] test_MissingFieldsAndInvalidNumberOrMixHash() (gas: 237524)\n[PASS] test_RealMainnetCancunHeader() (gas: 543993)\n[PASS] test_RealMainnetPragueHeader() (gas: 547036)\n[PASS] test_RealMainnetShanghaiHeader() (gas: 538038)\n[PASS] test_RealSepoliaHeaderWithAccessListHashAndSlotNumber() (gas: 550588)\n[PASS] test_ZeroNumberAndZeroMixHashAreValidRLP() (gas: 40712)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 55.86ms (59.56ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596102, ~: 595918)\nLogs:\n  Bound result 17641\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 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 84.45ms (98.61ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1502919, ~: 1035745)\nLogs:\n  Bound result 11\n  Bound result 5\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241077, ~: 240936)\nLogs:\n  Bound result 4048\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 163.98ms (286.92ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 1850270, ~: 1610253)\nLogs:\n  Bound result 334917126230930692224411319478789\n  Bound result 7\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 391775)\n[PASS] test_ClosedSaleAndZeroRecipient() (gas: 196980)\n[PASS] test_ExactOddSplitMintToEventsAndEnumerationThroughTransfers() (gas: 726462)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 202919)\n[PASS] test_NonReceiverRollsBackPaymentAndNextId() (gas: 515688)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1226347)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1616307)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 192218)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 262337)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1632002)\n[PASS] test_TokenCallbackCannotReenterEitherMintEntryPoint() (gas: 1728623)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 651576)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 224.51ms (227.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 276.68ms (53.76ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 18980, ~: 18133)\nLogs:\n  Bound result 1358\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 598164, ~: 379994)\nLogs:\n  Bound result 2\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 276.99ms (380.32ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1130014, ~: 824232)\nLogs:\n  Bound result 171702609749108743096\n  Bound result 477\n  Bound result 24\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 282826, ~: 283052)\nLogs:\n  Bound result 18742\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219206, ~: 1219445)\nLogs:\n  Bound result 18\n  Bound result 11736531421\n  Bound result 434328\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 277.01ms (599.52ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3750644, ~: 3696009)\nLogs:\n  Bound result 5\n  Bound result 3\n  Bound result 2\n  Bound result 4\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 294.34ms (296.33ms 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  | 1339  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1367  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1392  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1344  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1379  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1371  | 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 428\n  Bound result 1001\n  Bound result 514264337593543950304\n  Bound result 1000\n  Bound result 100000\n  Bound result 6585\n  Bound result 199\n  Bound result 1568\n  Bound result 1003\n  Bound result 300\n  Bound result 147713702\n  Bound result 514264337593543950335\n  Bound result 95\n  Bound result 2515\n  Bound result 153\n  Bound result 5439996\n  Bound result 1001\n  Bound result 1477\n  Bound result 514264337593543950335\n  Bound result 514264337593543950335\n  Bound result 7821\n  Bound result 192\n  Bound result 3770\n  Bound result 6912\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.41s (1.41s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 386\n  Bound result 1464\n  Bound result 431999\n  Bound result 4866\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 17394253\n  Bound result 1001\n  Bound result 4246\n  Bound result 1271\n  Bound result 6117831938595702908\n  Bound result 1001\n  Bound result 60916677498639750887\n  Bound result 514264337593543950335\n  Bound result 34082162333485969634\n  Bound result 1799\n  Bound result 9\n  Bound result 1001\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 924\n  Bound result 2376452956\n  Bound result 42369924635319385\n  Bound result 1001\n  Bound result 25\n  Bound result 4905\n  Bound result 1518\n  Bound result 514264337593543950335\n  Bound result 796\n  Bound result 5819\n  Bound result 1001\n  Bound result 888\n  Bound result 6732\n  Bound result 1512\n  Bound result 35124532258121295081\n  Bound result 2708\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 1001\n  Bound result 1725540768\n  Bound result 99\n  Bound result 97920\n  Bound result 5212\n  Bound result 5839\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 875994973453185780411\n  Bound result 135787141846281888905\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.78s (1.77s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 1001\n  Bound result 386\n  Bound result 1464\n  Bound result 431999\n  Bound result 4976\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 1001\n  Bound result 487220949158326929078\n  Bound result 1189\n  Bound result 0\n  Bound result 1001\n  Bound result 11534210569319333870\n  Bound result 514264337593543950335\n  Bound result 146\n  Bound result 1560\n  Bound result 9\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 3719479758\n  Bound result 0\n  Bound result 39451225485545005701\n  Bound result 1001\n  Bound result 25\n  Bound result 4867\n  Bound result 1517\n  Bound result 514264337593543950335\n  Bound result 794\n  Bound result 5820\n  Bound result 1001\n  Bound result 4032\n  Bound result 831\n  Bound result 58\n  Bound result 40451225485545012669\n  Bound result 2\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 1001\n  Bound result 1725540767\n  Bound result 99\n  Bound result 97920\n  Bound result 7845\n  Bound result 5875\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 636864486712720434253\n  Bound result 867320258909277081411\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.79s (1.79s CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352145, ~: 1352235)\nLogs:\n  Bound result 970792011053536824863238\n  Bound result 185965656687165121058052\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 2.24s (2.25s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 82725695, ~: 82701370)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.33s (2.33s 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                     | 1128  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1114  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1119  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1066  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1136  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1027  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1090  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 0\n  Bound result 113\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 7\n  Bound result 7\n  Bound result 4\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 14\n  Bound result 17\n  Bound result 7\n  Bound result 0\n  Bound result 2\n  Bound result 13\n  Bound result 0\n  Bound result 6\n  Bound result 13\n  Bound result 5\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 15\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 14\n  Bound result 1\n  Bound result 7\n  Bound result 3\n  Bound result 0\n  Bound result 5\n  Bound result 7\n  Bound result 1\n  Bound result 14\n  Bound result 10\n  Bound result 23\n  Bound result 6\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 8\n  Bound result 14\n  Bound result 619\n  Bound result 15\n  Bound result 0\n  Bound result 2\n  Bound result 14\n  Bound result 17\n  Bound result 8\n  Bound result 0\n  Bound result 8\n  Bound result 3\n  Bound result 7\n  Bound result 15\n  Bound result 14\n  Bound result 1\n  Bound result 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.59s (4.59s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 179543950335\n  Bound result 603599\n  Bound result 100000000000\n  Bound result 6932\n  Bound result 1001\n  Bound result 156250871674928585715\n  Bound result 290\n  Bound result 4919\n  Bound result 1393660932\n  Bound result 36109780449902941357\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 73090852387\n  Bound result 106453096947\n  Bound result 8199\n  Bound result 99999997697\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 2818\n  Bound result 1001\n  Bound result 1001\n  Bound result 54963\n  Bound result 9196697130902378183621241\n  Bound result 1007585\n  Bound result 655927957\n  Bound result 425\n  Bound result 425\n  Bound result 465895196685\n  Bound result 1001\n  Bound result 15104876179577183896278527\n  Bound result 402\n  Bound result 151\n  Bound result 599\n  Bound result 465895196685\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.50s (6.50s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 92500000000\n  Bound result 42500000000\n  Bound result 944639575335\n  Bound result 969\n  Bound result 92500000000\n  Bound result 156250871674928585715\n  Bound result 4537\n  Bound result 12518\n  Bound result 36109780449902941357\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 16128\n  Bound result 873791594667\n  Bound result 1149\n  Bound result 92500004197\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 3067\n  Bound result 1001\n  Bound result 9019\n  Bound result 1001\n  Bound result 25694\n  Bound result 10961690964292145617980923\n  Bound result 1007585\n  Bound result 1796593260\n  Bound result 531\n  Bound result 211\n  Bound result 58\n  Bound result 487537227147\n  Bound result 1001\n  Bound result 8950635269928613684973611\n  Bound result 450971936163\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.58s (6.58s 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  | 1534  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1518  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1485  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1575  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1545  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1527  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1565  | 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 4\n  Bound result 12\n  Bound result 119720\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 257\n  Bound result 16\n  Bound result 0\n  Bound result 1\n  Bound result 14811\n  Bound result 90\n  Bound result 256\n  Bound result 33\n  Bound result 8\n  Bound result 119\n  Bound result 43200\n  Bound result 97\n  Bound result 4177\n  Bound result 14\n  Bound result 8\n  Bound result 32\n  Bound result 255\n  Bound result 5\n  Bound result 151174\n  Bound result 17\n  Bound result 121022\n  Bound result 13\n  Bound result 0\n  Bound result 4\n  Bound result 42\n  Bound result 115\n  Bound result 12\n  Bound result 14\n  Bound result 16\n  Bound result 2\n  Bound result 8\n  Bound result 17902\n  Bound result 123\n  Bound result 10\n  Bound result 9\n  Bound result 8\n  Bound result 504\n  Bound result 63\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.87s (38.87s 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         | 2098  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2011  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 1984  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2099  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 65.98s (65.98s CPU time)\n\nRan 25 test suites in 65.99s (133.83s CPU time): 165 tests passed, 0 failed, 0 skipped (165 total tests)\n","passed":true},{"durationMs":80,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub()\",\"OGClubClubs.mintClubTo(address)\",\"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)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"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\":113,\"README.md\":457,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":55,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":134,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":270,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"test/ADDITIONAL_COVERAGE.md\":53,\"test/BlockHeader.t.sol\":144,\"test/ClubsDeployment.t.sol\":173,\"test/ClubsInvariant.t.sol\":282,\"test/ClubsPlacement.t.sol\":327,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":149,\"test/OGClubClubs.t.sol\":478,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsTestBase.sol\":62,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":53},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"144c4fa71c9e2b7bf1d899ac497c64408e9f4fbc455ae9db35f7f6bbfd659574","verifiedTreeHash":"4ff3cd600df65ba99e6212c47ba73636dad05e21","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":10231,"exitCode":0,"name":"build","output":"Compiling 94 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.11s\nCompiler run successful!\n","passed":true},{"durationMs":69136,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 170949)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 10899)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 560942)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 127999)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 295900)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160918)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 451506)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.12ms (1.29ms 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 3.25ms (2.06ms 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: 685129)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384443)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 428413)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.37ms (1.81ms CPU time)\n\nRan 6 tests for test/Gas.t.sol:GasTest\n[PASS] test_GasClaimOne() (gas: 954101)\nLogs:\n  Claim one win / fresh furniture wallet\n  Cancun call gas: 160885\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 472565\n\n[PASS] test_GasClaimTen() (gas: 2860761)\nLogs:\n  Claim ten distinct items / fresh furniture wallet\n  Cancun call gas: 816170\n  New persistent slots: 22\n  EIP-8037 state gas: 2154240\n  EIP-8037 storage-repriced call gas: 2530410\n\n[PASS] test_GasDraw() (gas: 418645)\nLogs:\n  Draw / 23-field synthetic header\n  Cancun call gas: 74312\n  New persistent slots: 1\n  EIP-8037 state gas: 97920\n  EIP-8037 storage-repriced call gas: 152232\n\n[PASS] test_GasEnter() (gas: 558676)\nLogs:\n  First entry / ten tickets / first points checkpoint\n  Cancun call gas: 155364\n  New persistent slots: 4\n  EIP-8037 state gas: 391680\n  EIP-8037 storage-repriced call gas: 467044\n\n[PASS] test_GasFirstStake() (gas: 200138)\nLogs:\n  First-ever stake / fresh staker\n  Cancun call gas: 120547\n  New persistent slots: 3\n  EIP-8037 state gas: 293760\n  EIP-8037 storage-repriced call gas: 354307\n\n[PASS] test_GasUnstake() (gas: 308132)\nLogs:\n  Partial unstake / first fee / first checkpoint\n  Cancun call gas: 110662\n  New persistent slots: 2\n  EIP-8037 state gas: 195840\n  EIP-8037 storage-repriced call gas: 266502\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 13.18ms (14.22ms CPU time)\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98UsableTilesFillAndNo99th100thOr101stPlacementFits() (gas: 18619182)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263927)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 603581)\n[PASS] test_Defensive100PieceGuardUsingSyntheticUnreachableStorage() (gas: 316043)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158838)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 734069)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 321579)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 741678)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1204308)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2562006)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 1263237)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219504)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 719935)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 178030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 25.06ms (24.53ms 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 97.97ms (57.32ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1130014, ~: 824232)\nLogs:\n  Bound result 171702609749108743096\n  Bound result 477\n  Bound result 24\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 282826, ~: 283052)\nLogs:\n  Bound result 18742\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219206, ~: 1219445)\nLogs:\n  Bound result 18\n  Bound result 11736531421\n  Bound result 434328\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 106.02ms (176.91ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 18980, ~: 18133)\nLogs:\n  Bound result 1358\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 598164, ~: 379994)\nLogs:\n  Bound result 4\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 156.24ms (262.16ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 33178, ~: 32177)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 94161, ~: 73909)\nLogs:\n  Bound result 64\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 156.52ms (157.68ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352145, ~: 1352235)\nLogs:\n  Bound result 970792011053536824863238\n  Bound result 185965656687165121058052\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 156.43ms (157.46ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1502919, ~: 1035745)\nLogs:\n  Bound result 11\n  Bound result 5\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241077, ~: 240936)\nLogs:\n  Bound result 4048\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 157.78ms (300.96ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596102, ~: 595918)\nLogs:\n  Bound result 17641\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 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 242.78ms (160.85ms CPU time)\n\nRan 7 tests for test/RoleLifecycle.t.sol:RoleLifecycleTest\n[PASS] testFuzz_ExpiredProposalsCannotActivateOrCancel(uint32) (runs: 256, μ: 558631, ~: 558520)\nLogs:\n  Bound result 9580\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 245.61ms (245.73ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3750644, ~: 3696009)\nLogs:\n  Bound result 3\n  Bound result 4\n  Bound result 1\n  Bound result 1\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 254.37ms (259.75ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 1850270, ~: 1610253)\nLogs:\n  Bound result 334917126230930692224411319478789\n  Bound result 7\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 391775)\n[PASS] test_ClosedSaleAndZeroRecipient() (gas: 196980)\n[PASS] test_ExactOddSplitMintToEventsAndEnumerationThroughTransfers() (gas: 726462)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 202919)\n[PASS] test_NonReceiverRollsBackPaymentAndNextId() (gas: 515688)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1226347)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1616307)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 192218)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 262337)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1632002)\n[PASS] test_TokenCallbackCannotReenterEitherMintEntryPoint() (gas: 1728623)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 651576)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 254.37ms (259.63ms 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  | 1339  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1367  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1392  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1344  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1379  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1371  | 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 428\n  Bound result 1001\n  Bound result 514264337593543950304\n  Bound result 1000\n  Bound result 100000\n  Bound result 6585\n  Bound result 199\n  Bound result 1568\n  Bound result 1003\n  Bound result 300\n  Bound result 147713702\n  Bound result 514264337593543950335\n  Bound result 95\n  Bound result 2515\n  Bound result 153\n  Bound result 5439996\n  Bound result 1001\n  Bound result 1477\n  Bound result 514264337593543950335\n  Bound result 514264337593543950335\n  Bound result 7821\n  Bound result 192\n  Bound result 3770\n  Bound result 6912\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.43s (1.43s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 1001\n  Bound result 386\n  Bound result 1464\n  Bound result 431999\n  Bound result 4976\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 1001\n  Bound result 487220949158326929078\n  Bound result 1189\n  Bound result 0\n  Bound result 1001\n  Bound result 11534210569319333870\n  Bound result 514264337593543950335\n  Bound result 146\n  Bound result 1560\n  Bound result 9\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 3719479758\n  Bound result 0\n  Bound result 39451225485545005701\n  Bound result 1001\n  Bound result 25\n  Bound result 4867\n  Bound result 1517\n  Bound result 514264337593543950335\n  Bound result 794\n  Bound result 5820\n  Bound result 1001\n  Bound result 4032\n  Bound result 831\n  Bound result 58\n  Bound result 40451225485545012669\n  Bound result 2\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 1001\n  Bound result 1725540767\n  Bound result 99\n  Bound result 97920\n  Bound result 7845\n  Bound result 5875\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 636864486712720434253\n  Bound result 867320258909277081411\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.85s (1.84s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 386\n  Bound result 1464\n  Bound result 431999\n  Bound result 4866\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 17394253\n  Bound result 1001\n  Bound result 4246\n  Bound result 1271\n  Bound result 6117831938595702908\n  Bound result 1001\n  Bound result 60916677498639750887\n  Bound result 514264337593543950335\n  Bound result 34082162333485969634\n  Bound result 1799\n  Bound result 9\n  Bound result 1001\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 924\n  Bound result 2376452956\n  Bound result 42369924635319385\n  Bound result 1001\n  Bound result 25\n  Bound result 4905\n  Bound result 1518\n  Bound result 514264337593543950335\n  Bound result 796\n  Bound result 5819\n  Bound result 1001\n  Bound result 888\n  Bound result 6732\n  Bound result 1512\n  Bound result 35124532258121295081\n  Bound result 2708\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 1001\n  Bound result 1725540768\n  Bound result 99\n  Bound result 97920\n  Bound result 5212\n  Bound result 5839\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 875994973453185780411\n  Bound result 135787141846281888905\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.91s (1.91s CPU time)\n\nRan 6 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 19017973)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 11885667)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 8503504)\n[PASS] test_MainnetScriptUsesSuppliedDependenciesAndLeavesSaleClosed() (gas: 7421483)\nLogs:\n  OGClubClubs 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x00000000000000000000000001722bf6c4acd7ce60f85938f75a9ebfbdc90ad80000000000000000000000004896baa3a15e716e09768b67ddef8a5a0a625c7e000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df2600000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x01722bf6C4aCD7cE60F85938f75a9EbFbdc90AD8\n  vault 0x4896baa3A15E716e09768b67DdeF8a5A0a625C7E\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 12208)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 14954457)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.37s (124.39ms CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 82725695, ~: 82701370)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.43s (2.43s 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                     | 1128  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1114  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1119  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1066  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1136  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1027  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1090  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 18\n  Bound result 0\n  Bound result 113\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 7\n  Bound result 7\n  Bound result 4\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 10\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 14\n  Bound result 17\n  Bound result 7\n  Bound result 0\n  Bound result 2\n  Bound result 13\n  Bound result 0\n  Bound result 6\n  Bound result 13\n  Bound result 5\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 15\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 14\n  Bound result 1\n  Bound result 7\n  Bound result 3\n  Bound result 0\n  Bound result 5\n  Bound result 7\n  Bound result 1\n  Bound result 14\n  Bound result 10\n  Bound result 23\n  Bound result 6\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 8\n  Bound result 14\n  Bound result 619\n  Bound result 15\n  Bound result 0\n  Bound result 2\n  Bound result 14\n  Bound result 17\n  Bound result 8\n  Bound result 0\n  Bound result 8\n  Bound result 3\n  Bound result 7\n  Bound result 15\n  Bound result 14\n  Bound result 1\n  Bound result 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.73s (4.72s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 179543950335\n  Bound result 603599\n  Bound result 100000000000\n  Bound result 6932\n  Bound result 1001\n  Bound result 156250871674928585715\n  Bound result 290\n  Bound result 4919\n  Bound result 1393660932\n  Bound result 36109780449902941357\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 73090852387\n  Bound result 106453096947\n  Bound result 8199\n  Bound result 99999997697\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 2818\n  Bound result 1001\n  Bound result 1001\n  Bound result 54963\n  Bound result 15104876179577183896278527\n  Bound result 1007585\n  Bound result 655927957\n  Bound result 425\n  Bound result 425\n  Bound result 465895196685\n  Bound result 1001\n  Bound result 304078190518430446581092\n  Bound result 402\n  Bound result 151\n  Bound result 599\n  Bound result 465895196685\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.76s (6.76s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 92500000000\n  Bound result 42500000000\n  Bound result 944639575335\n  Bound result 969\n  Bound result 92500000000\n  Bound result 156250871674928585715\n  Bound result 4537\n  Bound result 12518\n  Bound result 36109780449902941357\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 16128\n  Bound result 873791594667\n  Bound result 1149\n  Bound result 92500004197\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 3067\n  Bound result 1001\n  Bound result 9019\n  Bound result 1001\n  Bound result 25694\n  Bound result 10961690964292145617980923\n  Bound result 1007585\n  Bound result 1796593260\n  Bound result 531\n  Bound result 211\n  Bound result 139\n  Bound result 331554986660\n  Bound result 1001\n  Bound result 8950635269928613684973611\n  Bound result 45\n  Bound result 306688363587\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.81s (6.81s 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  | 1534  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1518  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1485  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1575  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1545  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1527  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1565  | 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 4\n  Bound result 12\n  Bound result 119720\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 257\n  Bound result 16\n  Bound result 0\n  Bound result 1\n  Bound result 14811\n  Bound result 90\n  Bound result 256\n  Bound result 33\n  Bound result 8\n  Bound result 119\n  Bound result 43200\n  Bound result 97\n  Bound result 4177\n  Bound result 14\n  Bound result 8\n  Bound result 32\n  Bound result 255\n  Bound result 5\n  Bound result 151174\n  Bound result 17\n  Bound result 121022\n  Bound result 13\n  Bound result 0\n  Bound result 4\n  Bound result 42\n  Bound result 115\n  Bound result 12\n  Bound result 14\n  Bound result 16\n  Bound result 2\n  Bound result 8\n  Bound result 17902\n  Bound result 123\n  Bound result 10\n  Bound result 9\n  Bound result 8\n  Bound result 504\n  Bound result 63\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 40.58s (40.57s 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         | 2098  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2011  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 1984  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2099  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 69.01s (69.01s CPU time)\n\nRan 25 test suites in 69.02s (139.76s CPU time): 165 tests passed, 0 failed, 0 skipped (165 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub()\",\"OGClubClubs.mintClubTo(address)\",\"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)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"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\":113,\"README.md\":457,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":55,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":134,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":270,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"test/ADDITIONAL_COVERAGE.md\":53,\"test/BlockHeader.t.sol\":144,\"test/ClubsDeployment.t.sol\":173,\"test/ClubsInvariant.t.sol\":282,\"test/ClubsPlacement.t.sol\":327,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":149,\"test/OGClubClubs.t.sol\":478,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsTestBase.sol\":62,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":53},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4177,"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:119: Reentrancy in OGClubClubs._mintClub(address) (src/OGClubClubs.sol#119-137):\n[high/medium] reentrancy-balance at src/OGClubStaking.sol:87: Reentrancy in OGClubStaking.unstake(uint256) (src/OGClubStaking.sol#87-100):\n[high/medium] reentrancy-balance at src/OGClubStaking.sol:87: Reentrancy in OGClubStaking.unstake(uint256) (src/OGClubStaking.sol#87-100):\n[high/medium] reentrancy-balance at src/OGClubClubs.sol:119: Reentrancy in OGClubClubs._mintClub(address) (src/OGClubClubs.sol#119-137):\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/OGClubClubs.sol:119: Reentrancy in OGClubClubs._mintClub(address) (src/OGClubClubs.sol#119-137):\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":679,"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/OGClubFarmVault.sol:59: Reentrancy: State change after external call (4 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:20: Centralization Risk (24 places)\n[low] costly-loop at src/OGClubRaffle.sol:149: Costly operations inside loop (4 places)\n[low] empty-require-revert at src/OGClubClubs.sol:155: Empty `require()` / `revert()` Statement\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:106: Literal Instead of Constant (21 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 (8 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:95: Unchecked Return (10 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 (6 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":"ac73824af1743a32026cf602f075ee7346e229d539efd606408a481b965a36d8","verifiedTreeHash":"4ff3cd600df65ba99e6212c47ba73636dad05e21","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":19902,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 19.71s\nCompiler run successful!\n","passed":true},{"durationMs":109207,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/OGClubClubs.t.sol:ClubsAdminTest\n[PASS] test_AllAdminFunctionsRequireOwner() (gas: 170949)\n[PASS] test_ConstructorRejectsEveryZeroValueAndStartsClosed() (gas: 10899)\n[PASS] test_MetadataFreezeIsPermanentButPlacementsContinue() (gas: 560942)\n[PASS] test_MissingTokensRevertInAllClubViews() (gas: 127999)\n[PASS] test_OwnerCannotMintFreeSeizeBurnOrWithdraw() (gas: 295900)\n[PASS] test_RoyaltyBoundsAndReceiver() (gas: 160918)\n[PASS] test_TwoStepOwnershipRetainsAllPermanentState() (gas: 451506)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.99ms (1.26ms 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: 685129)\n[PASS] test_Audit2fa7888_RaffleNeedsFirstGrantsWrongTargetConsumesBootstrap() (gas: 1384443)\n[PASS] test_Audit9dcac50_ClubsNowWorkWithoutRaffleBootstrapRoles() (gas: 428413)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 6.15ms (1.82ms CPU time)\n\nRan 6 tests for test/ClubsDeployment.t.sol:ClubsDeploymentTest\n[PASS] test_EmptyFootprintsAreExplicitlyUnconfiguredAndScriptsEnforceChain() (gas: 19017973)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\n[PASS] test_FactoryConstructorWorksOnEmptyChainWithExplicitOwnerAndBoundedRuntime() (gas: 11885667)\n[PASS] test_FootprintJSONValidatesBeforeDeploymentWithoutTruncation() (gas: 8503504)\n[PASS] test_MainnetScriptUsesSuppliedDependenciesAndLeavesSaleClosed() (gas: 7421483)\nLogs:\n  OGClubClubs 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x00000000000000000000000001722bf6c4acd7ce60f85938f75a9ebfbdc90ad80000000000000000000000004896baa3a15e716e09768b67ddef8a5a0a625c7e000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000004483b2254437483025732348c2b668986ce9df2600000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x01722bf6C4aCD7cE60F85938f75a9EbFbdc90AD8\n  vault 0x4896baa3A15E716e09768b67DdeF8a5A0a625C7E\n  price (token base units) 123\n  furniture 0x4483b2254437483025732348c2B668986cE9dF26\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen false\n\n[PASS] test_PredictedSelfVaultIsRejected() (gas: 12208)\n[PASS] test_SepoliaScriptDeploysRealDependenciesConfiguresAndOpensSale() (gas: 14954457)\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  OGClubClubs 0x0e02c420C2EC8e6bc1F5499F265332C736C8748a\n  OGClubClubs constructor args (token, vault, price, furniture, owner, royaltyReceiver):\n  0x0000000000000000000000002146bce9584fb42179531b017c0a28b45357dcfa00000000000000000000000050db4e46f59c25bc6d0f65917277f3c00229f30600000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000007e670b34e14f0546c1ee28b1dcbd0f219ebacf3b00000000000000000000000073258404819b10b2f0cf91bfc76f08b28b4e9a570000000000000000000000007ad1e3cd95db13f7970851d8a4706eb5254ef2cc\n  token 0x2146bCE9584Fb42179531b017C0a28B45357DCfA\n  vault 0x50db4e46F59C25BC6D0F65917277f3C00229F306\n  price (token base units) 100000000000000000000000\n  furniture 0x7e670b34e14F0546c1ee28B1DcBd0F219eBaCf3B\n  owner 0x73258404819B10B2F0Cf91BFC76F08b28B4e9A57\n  royaltyReceiver 0x7aD1E3Cd95dB13F7970851D8a4706Eb5254eF2cC\n  saleOpen true\n\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 51.00ms (124.33ms CPU time)\n\nRan 10 tests for test/BlockHeader.t.sol:BlockHeaderTest\n[PASS] testFuzz_AnyMalformedInputRevertsWithCustomError(bytes) (runs: 256, μ: 33179, ~: 32177)\n[PASS] testFuzz_ArbitraryTrailingFieldCount(uint8,uint256,bytes32) (runs: 256, μ: 94324, ~: 75004)\nLogs:\n  Bound result 11\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 117.55ms (117.86ms CPU time)\n\nRan 16 tests for test/OGClubFurniture.t.sol:FurnitureTest\n[PASS] testFuzz_AfterFirstMintMustWaitAndAnyoneCanActivate(uint32) (runs: 256, μ: 596107, ~: 595918)\nLogs:\n  Bound result 17641\n\n[PASS] testFuzz_EveryGrantAfterTheFirstWaitsSevenDays(address,address,uint32) (runs: 256, μ: 169343, ~: 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 216.45ms (269.28ms 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 216.63ms (80.01ms CPU time)\n\nRan 13 tests for test/OGClubClubs.t.sol:ClubsMintTest\n[PASS] testFuzz_PaymentConservation(uint128,uint8) (runs: 256, μ: 1899693, ~: 1610619)\nLogs:\n  Bound result 334917126230930692224411319478789\n  Bound result 7\n\n[PASS] test_BurnSinkCannotAlsoBeVaultAndPayerCannotPayItself() (gas: 391775)\n[PASS] test_ClosedSaleAndZeroRecipient() (gas: 196980)\n[PASS] test_ExactOddSplitMintToEventsAndEnumerationThroughTransfers() (gas: 726462)\n[PASS] test_IdentityInterfacesAndEmptyClub() (gas: 202919)\n[PASS] test_NonReceiverRollsBackPaymentAndNextId() (gas: 515688)\n[PASS] test_ReceiverCannotDoubleMintAndMayRejectAtomically() (gas: 1226347)\n[PASS] test_SecondRecipientAndFinalFirstRecipientBalancesMustBothMatch() (gas: 1616307)\n[PASS] test_ShortApprovalRollsBackFirstLeg() (gas: 192218)\n[PASS] test_ShortBalanceRollsBackFirstLeg() (gas: 262337)\n[PASS] test_TaxedTokensAndFalseReturnsRevertAtomically() (gas: 1632002)\n[PASS] test_TokenCallbackCannotReenterEitherMintEntryPoint() (gas: 1728623)\n[PASS] test_ZeroBurnAtPriceOneAndNoReturnToken() (gas: 651576)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 216.60ms (222.96ms 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\nWarning: the following cheatcode(s) are deprecated and will be removed in future versions:\n  lastCallGas(): replaced by `lastFrameGas`\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 239.56ms (17.16ms CPU time)\n\nRan 23 tests for test/OGClubRaffle.t.sol:RaffleTest\n[PASS] testFuzz_ExactlyMinPrizesAndTicketsWinWithNoDuplicateTicket(uint8,uint8,bytes32) (runs: 256, μ: 1525612, ~: 1011315)\nLogs:\n  Bound result 11\n  Bound result 5\n\n[PASS] testFuzz_NoticeAlwaysMeasuredFromCreation(uint32) (runs: 256, μ: 241091, ~: 240936)\nLogs:\n  Bound result 4048\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 247.43ms (396.25ms CPU time)\n\nRan 30 tests for test/ClubsAdversarial.t.sol:ClubsAdversarialTest\n[PASS] testFuzz_SingleTileDoorRuleIsExactlyTheTwoDoorTiles(uint8,uint8) (runs: 512, μ: 202149, ~: 203801)\nLogs:\n  Bound result 5\n  Bound result 2\n\n[PASS] testFuzz_SplitForAnyPrice(uint256,uint8) (runs: 512, μ: 991482, ~: 1013588)\nLogs:\n  Bound result 86139890763409404723588969641458104565\n  Bound result 7\n\n[PASS] test_AmountZeroAndTwoRejected() (gas: 134886)\n[PASS] test_ApprovalForOneClubDoesNotExtendToAnother() (gas: 989808)\n[PASS] test_ClubApprovalsGrantPlacementAndRevocationRemovesIt() (gas: 759875)\n[PASS] test_EveryShapeThatTouchesEitherDoorTileIsRejected() (gas: 1416595)\n[PASS] test_ExactRightAndBottomEdgesFitAndOneMoreDoesNot() (gas: 786619)\n[PASS] test_ExactlyPriceAllowanceAndBalanceSucceedOneWeiShortFails() (gas: 518165)\n[PASS] test_FootprintBoundsAndOwnerOnly() (gas: 246969)\n[PASS] test_FootprintCanBeRevisedUntilFirstPlacementOnly() (gas: 667041)\n[PASS] test_FullRoomRejectsEverythingElse() (gas: 11151021)\n[PASS] test_FurnitureOperatorOfAStrangerCannotPlaceIntoOperatorsOwnClub() (gas: 142470)\n[PASS] test_HookCalledDirectlyByAnyoneButFurnitureIsRejected() (gas: 73337)\n[PASS] test_InterfacesAndImmutables() (gas: 142056)\n[PASS] test_MalformedDataAlwaysReverts() (gas: 645619)\n[PASS] test_MetadataAndRoyaltyEdges() (gas: 360395)\n[PASS] test_MintClubToPaysFromCallerAndClosingSaleStopsBothEntryPoints() (gas: 597318)\n[PASS] test_MintToContractsThatCannotReceiveReverts() (gas: 666193)\n[PASS] test_MinterCannotPushFurnitureStraightIntoTheClubContract() (gas: 196675)\n[PASS] test_MissingClubIdsRejectedIncludingZeroAndMax() (gas: 441631)\n[PASS] test_NobodyCanMoveFurnitureOutOfTheContract() (gas: 333707)\n[PASS] test_OverlapAtASingleSharedTileIsRejected() (gas: 1088427)\n[PASS] test_PendingOwnerHasNoPowerUntilAcceptAndOldOwnerLosesIt() (gas: 239454)\n[PASS] test_ReentrantReceiverPlacesButCannotMintTwice() (gas: 1246230)\n[PASS] test_RenouncedOwnershipKeepsPlacementWorking() (gas: 256941)\n[PASS] test_RotationSwapsOnlyOnOddRotations() (gas: 1276479)\n[PASS] test_TileTakenViewBounds() (gas: 49166)\n[PASS] test_TransferredClubKeepsLayoutAndMovesPlacementRight() (gas: 1034584)\n[PASS] test_Uint8ExtremesAndRotFourAreOutOfRoom() (gas: 984002)\n[PASS] test_UnfootprintedIdRejectedAndDoesNotLock() (gas: 419423)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 433.53ms (450.15ms CPU time)\n\nRan 15 tests for test/OGClubStaking.t.sol:StakingTest\n[PASS] testFuzz_CheckpointFrequencyDoesNotChangePoints(uint96,uint32,uint8) (runs: 256, μ: 1101997, ~: 801503)\nLogs:\n  Bound result 914\n  Bound result 11219\n  Bound result 50\n\n[PASS] testFuzz_FeeRoundsUpAndConservesBalance(uint96) (runs: 256, μ: 282826, ~: 283052)\nLogs:\n  Bound result 18742\n\n[PASS] testFuzz_WholeTokenAccrualAcrossSupportedDecimals(uint8,uint96,uint32) (runs: 256, μ: 1219208, ~: 1219445)\nLogs:\n  Bound result 18\n  Bound result 11736531421\n  Bound result 434328\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 433.50ms (681.98ms CPU time)\n\nRan 3 tests for test/Permutation.t.sol:PermutationTest\n[PASS] testFuzz_LargeDomainsInRangeAndDistinct(uint48,uint48,uint48,bytes32) (runs: 256, μ: 19190, ~: 18133)\nLogs:\n  Bound result 1358\n\n[PASS] testFuzz_SmallDomainsAreBijections(uint8,bytes32) (runs: 256, μ: 554634, ~: 374237)\nLogs:\n  Bound result 2\n\n[PASS] test_InvalidDomainAndIndexRejected() (gas: 211485)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 520.24ms (556.78ms 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 521.93ms (4.13ms CPU time)\n\nRan 16 tests for test/OGClubFarmVault.t.sol:FarmVaultTest\n[PASS] testFuzz_ReserveCapAndClaimConservation(uint96,uint96) (runs: 256, μ: 1352145, ~: 1352235)\nLogs:\n  Bound result 970792011053536824863238\n  Bound result 185965656687165121058052\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 543.15ms (91.74ms CPU time)\n\nRan 6 tests for test/RaffleAtomicity.t.sol:RaffleAtomicityTest\n[PASS] testFuzz_MultiItemClaimsCanBeShuffledAndFragmented(uint8[4],bytes32) (runs: 512, μ: 3750007, ~: 3702652)\nLogs:\n  Bound result 5\n  Bound result 6\n  Bound result 2\n  Bound result 4\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 543.62ms (546.23ms CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS] invariant_VaultAlwaysCoversReservationsAndOnlyClaimsMoveTokens() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 1339  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | cancel   | 1367  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1392  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1344  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | propose  | 1379  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | release  | 1371  | 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 428\n  Bound result 1001\n  Bound result 514264337593543950304\n  Bound result 1000\n  Bound result 16\n  Bound result 6585\n  Bound result 199\n  Bound result 1568\n  Bound result 100000\n  Bound result 300\n  Bound result 147713702\n  Bound result 514264337593543950335\n  Bound result 6281289\n  Bound result 2515\n  Bound result 153\n  Bound result 129\n  Bound result 1001\n  Bound result 1477\n  Bound result 514264337593543950335\n  Bound result 514264337593543950335\n  Bound result 7821\n  Bound result 192\n  Bound result 3770\n  Bound result 6912\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.36s (2.36s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 386\n  Bound result 1464\n  Bound result 48\n  Bound result 4867\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 17394253\n  Bound result 1001\n  Bound result 4298\n  Bound result 1271\n  Bound result 6117831938595702908\n  Bound result 1001\n  Bound result 60916677498639750887\n  Bound result 514264337593543950335\n  Bound result 3030088639317177214\n  Bound result 1799\n  Bound result 618851\n  Bound result 1001\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 924\n  Bound result 0\n  Bound result 1305791714594264973255\n  Bound result 1001\n  Bound result 25\n  Bound result 4866\n  Bound result 1514\n  Bound result 514264337593543950335\n  Bound result 795\n  Bound result 5785\n  Bound result 1001\n  Bound result 888\n  Bound result 6732\n  Bound result 1512\n  Bound result 433630479267177838262\n  Bound result 2708\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 1001\n  Bound result 735\n  Bound result 258\n  Bound result 17\n  Bound result 701406686\n  Bound result 5830\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 326699714041417589919\n  Bound result 227189563705227587593\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.01s (3.01s 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           | 1672  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | spend             | 1568  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | stake             | 1639  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unauthorizedSpend | 1720  | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| StakingHandler | unstake           | 1593  | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 86400\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 254\n  Bound result 1001\n  Bound result 386\n  Bound result 1464\n  Bound result 48\n  Bound result 4978\n  Bound result 1001\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 1001\n  Bound result 487220949158326929078\n  Bound result 1189\n  Bound result 0\n  Bound result 1001\n  Bound result 11534210569319333870\n  Bound result 514264337593543950335\n  Bound result 146\n  Bound result 1560\n  Bound result 618851\n  Bound result 7918\n  Bound result 514264337593543950335\n  Bound result 0\n  Bound result 0\n  Bound result 1001\n  Bound result 25\n  Bound result 5157\n  Bound result 1512\n  Bound result 514264337593543950335\n  Bound result 884\n  Bound result 5757\n  Bound result 1001\n  Bound result 2782\n  Bound result 3237\n  Bound result 50\n  Bound result 55\n  Bound result 6\n  Bound result 514264337593543950335\n  Bound result 1001\n  Bound result 1001\n  Bound result 715\n  Bound result 258\n  Bound result 17\n  Bound result 4924\n  Bound result 5798\n  Bound result 514264337593543950335\n  Bound result 4978\n  Bound result 760313497481051440275\n  Bound result 256334445740793055376\n  Bound result 514264337593543950335\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.03s (3.02s CPU time)\n\nRan 14 tests for test/ClubsPlacement.t.sol:ClubsPlacementTest\n[PASS] test_All98UsableTilesFillAndNo99th100thOr101stPlacementFits() (gas: 18619182)\n[PASS] test_BadAmountsAndBatchTransfersRejected() (gas: 263927)\n[PASS] test_ClubTokenApprovalAndApprovalForAllPermitOwnersOfFurnitureToPlace() (gas: 603581)\n[PASS] test_Defensive100PieceGuardUsingSyntheticUnreachableStorage() (gas: 316043)\n[PASS] test_DirectAndFakeERC1155HooksRejected() (gas: 1158838)\n[PASS] test_FurnitureCannotLeaveForClubHolderOperatorOrContractOwner() (gas: 734069)\n[PASS] test_FurnitureOperatorCanPlaceFromClubHolder() (gas: 321579)\n[PASS] test_MissingClubAndMalformedDataCannotLockFurniture() (gas: 741678)\n[PASS] test_NoFootprintBadFootprintsAndPerIdPermanentLock() (gas: 1204308)\n[PASS] test_OffGridRotationDoorAndOverlapRevertWithoutChangingAnything() (gas: 2562006)\n[PASS] test_RealFurnitureAllRotationsViewsAndEvents() (gas: 1263237)\n[PASS] test_StrangerCannotPlaceOwnFurnitureEvenIfCallerOwnsClub() (gas: 219504)\n[PASS] test_TransferCarriesLayoutAndRevokesOldHolderAndTokenApproval() (gas: 719935)\n[PASS] test_VendoredFurnitureSingletonBatchUsesSingleHookAndRecordsOnePiece() (gas: 178030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 3.66s (34.76ms 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 9580\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 4.01s (4.01s CPU time)\n\nRan 1 test for test/ClubsInvariant.t.sol:ClubsLayoutFuzzTest\n[PASS] testFuzz_RandomPlacementSequenceMatchesIndependentGridAndFailuresAreAtomic(bytes32) (runs: 256, μ: 82722597, ~: 82691315)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.01s (4.01s 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                     | 1128  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | operatorBatchTransfer    | 1114  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerMetadata            | 1119  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | ownerTriesToSeize        | 1066  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | revokeApproval           | 1136  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | strangerCannotAdminister | 1027  | 0       | 0        |\n|------------------+--------------------------+-------+---------+----------|\n| FurnitureHandler | transfer                 | 1090  | 0       | 0        |\n╰------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 14\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 17\n  Bound result 14\n  Bound result 336\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 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 7\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 18\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 8\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 1\n  Bound result 0\n  Bound result 20\n  Bound result 7\n  Bound result 1\n  Bound result 1\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 15\n  Bound result 0\n  Bound result 5\n  Bound result 7\n  Bound result 1\n  Bound result 14\n  Bound result 5\n  Bound result 2\n  Bound result 0\n  Bound result 4\n  Bound result 3\n  Bound result 2\n  Bound result 10\n  Bound result 8\n  Bound result 14\n  Bound result 27\n  Bound result 15\n  Bound result 0\n  Bound result 2\n  Bound result 14\n  Bound result 10\n  Bound result 8\n  Bound result 0\n  Bound result 360\n  Bound result 8\n  Bound result 20\n  Bound result 0\n  Bound result 16\n  Bound result 0\n  Bound result 1\n  Bound result 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.25s (7.25s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 100000000000\n  Bound result 50000000000\n  Bound result 593543950335\n  Bound result 950\n  Bound result 100000000000\n  Bound result 156250871674928585715\n  Bound result 48531027892\n  Bound result 4661\n  Bound result 12300\n  Bound result 4662\n  Bound result 36109780449902941357\n  Bound result 496\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 62427381030\n  Bound result 582585524451\n  Bound result 919\n  Bound result 54963\n  Bound result 4165\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 1\n  Bound result 1001\n  Bound result 1001\n  Bound result 1001\n  Bound result 5665029264337144618965335\n  Bound result 1007585\n  Bound result 3972077334\n  Bound result 161292676120\n  Bound result 1001\n  Bound result 15104876179577183891241495\n  Bound result 12312\n  Bound result 161292664809\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.80s (10.79s 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   | 1062  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | badProof  | 1111  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | cancel    | 1198  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | claim     | 1087  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | exit      | 1125  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | overspend | 1095  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | propose   | 1121  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | release   | 1187  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | spend     | 1117  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | stake     | 1106  | 0       | 0        |\n|----------------+-----------+-------+---------+----------|\n| FeeFlowHandler | unstake   | 1079  | 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 432000\n  Bound result 92500000000\n  Bound result 42500000000\n  Bound result 593543950335\n  Bound result 968\n  Bound result 92500000000\n  Bound result 156250871674928585715\n  Bound result 4537\n  Bound result 36109780449902941357\n  Bound result 493\n  Bound result 54963\n  Bound result 7980148512202875589706\n  Bound result 427501202164883287\n  Bound result 16128\n  Bound result 641528154060\n  Bound result 1148\n  Bound result 3704\n  Bound result 1001\n  Bound result 42839214793835\n  Bound result 2972\n  Bound result 1001\n  Bound result 648\n  Bound result 1001\n  Bound result 34713\n  Bound result 3302733264337144605781835\n  Bound result 1007585\n  Bound result 1904868525\n  Bound result 271\n  Bound result 7\n  Bound result 469021802627\n  Bound result 13668\n  Bound result 9571\n  Bound result 1001\n  Bound result 8950635269928613679046690\n  Bound result 433845144191\n  Bound result 926\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.88s (10.87s 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  | 787   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | mint         | 819   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | place        | 810   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | setFootprint | 860   | 0       | 0        |\n|-------------------------+--------------+-------+---------+----------|\n| AdversarialClubsHandler | transferClub | 820   | 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 8\n  Bound result 7\n  Bound result 1\n  Bound result 11\n  Bound result 6\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 4\n  Bound result 10\n  Bound result 3\n  Bound result 1\n  Bound result 7\n  Bound result 8\n  Bound result 4\n  Bound result 9\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 7\n  Bound result 1\n  Bound result 1\n  Bound result 8\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 0\n  Bound result 6\n  Bound result 10\n  Bound result 0\n  Bound result 11\n  Bound result 2\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 42.17s (42.17s 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  | 1534  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | badClaim | 1518  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | cancel   | 1485  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | claim    | 1575  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | commit   | 1545  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | create   | 1527  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | draw     | 1539  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| RaffleSequenceHandler | enter    | 1565  | 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 68899\n  Bound result 200\n  Bound result 119720\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 168\n  Bound result 253\n  Bound result 0\n  Bound result 1\n  Bound result 8018\n  Bound result 158\n  Bound result 255\n  Bound result 98\n  Bound result 8\n  Bound result 119\n  Bound result 43200\n  Bound result 97\n  Bound result 4039\n  Bound result 128\n  Bound result 10\n  Bound result 32\n  Bound result 40\n  Bound result 7\n  Bound result 151174\n  Bound result 17\n  Bound result 24\n  Bound result 13\n  Bound result 0\n  Bound result 2\n  Bound result 50585\n  Bound result 29\n  Bound result 107\n  Bound result 14\n  Bound result 253\n  Bound result 10\n  Bound result 6\n  Bound result 17474\n  Bound result 60\n  Bound result 2\n  Bound result 80\n  Bound result 2\n  Bound result 958\n  Bound result 9\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 64.23s (64.22s 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         | 2098  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | place        | 2011  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | sale         | 1984  | 0       | 0        |\n|--------------+--------------+-------+---------+----------|\n| ClubsHandler | transferClub | 2099  | 0       | 0        |\n╰--------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 109.00s (108.99s CPU time)\n\nRan 27 test suites in 109.01s (268.72s CPU time): 196 tests passed, 0 failed, 0 skipped (196 total tests)\n","passed":true},{"durationMs":132,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubClubs.acceptOwnership()\",\"OGClubClubs.approve(address,uint256)\",\"OGClubClubs.freezeMetadata()\",\"OGClubClubs.mintClub()\",\"OGClubClubs.mintClubTo(address)\",\"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)\",\"OGClubClubs.setRoyalty(address,uint96)\",\"OGClubClubs.setSaleOpen(bool)\",\"OGClubClubs.transferFrom(address,address,uint256)\",\"OGClubClubs.transferOwnership(address)\",\"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\":113,\"README.md\":457,\"VENDOR.md\":13,\"foundry.toml\":22,\"launch.json\":55,\"script/Deploy.s.sol\":59,\"script/DeployClubs.s.sol\":134,\"script/club-footprints.json\":1,\"script/encode_header.py\":82,\"src/OGClubClubs.sol\":270,\"src/OGClubFarmVault.sol\":115,\"src/OGClubFurniture.sol\":138,\"src/OGClubRaffle.sol\":357,\"src/OGClubStaking.sol\":176,\"src/libraries/BlockHeader.sol\":70,\"src/libraries/Permutation.sol\":30,\"src/mocks/MockOG.sol\":21,\"test/ADDITIONAL_COVERAGE.md\":55,\"test/BlockHeader.t.sol\":144,\"test/ClubsAdversarial.t.sol\":686,\"test/ClubsAdversarialInvariant.t.sol\":431,\"test/ClubsDeployment.t.sol\":173,\"test/ClubsInvariant.t.sol\":282,\"test/ClubsPlacement.t.sol\":327,\"test/Deployment.t.sol\":117,\"test/FeeFlowInvariant.t.sol\":386,\"test/FurnitureInvariant.t.sol\":248,\"test/Gas.t.sol\":138,\"test/ImportedAudit.t.sol\":149,\"test/OGClubClubs.t.sol\":478,\"test/OGClubFarmVault.t.sol\":309,\"test/OGClubFurniture.t.sol\":362,\"test/OGClubRaffle.t.sol\":537,\"test/OGClubStaking.t.sol\":280,\"test/Permutation.t.sol\":49,\"test/RaffleAtomicity.t.sol\":207,\"test/RaffleSequenceInvariant.t.sol\":503,\"test/RoleLifecycle.t.sol\":146,\"test/StakingInvariant.t.sol\":153,\"test/TokenFailureAtomicity.t.sol\":187,\"test/VaultInvariant.t.sol\":156,\"test/fixtures/MainnetHeaders.sol\":32,\"test/fixtures/SOURCES.md\":74,\"test/fixtures/SepoliaHeader.sol\":14,\"test/fixtures/mainnet-cancun.json\":24,\"test/fixtures/mainnet-prague.json\":25,\"test/fixtures/mainnet-shanghai.json\":21,\"test/fixtures/sepolia-11921684.json\":27,\"test/helpers/ClubsTestBase.sol\":62,\"test/helpers/HeaderBuilder.sol\":48,\"test/helpers/RaffleTestBase.sol\":98,\"test/helpers/TokenMocks.sol\":93,\"test/test_encode_header.py\":65,\"test/test_launch.py\":53},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cd6781bc0cf75e76dd01bbeab43dc1a93511fc44d12b9499206c3271caa5230b","verifiedTreeHash":"a1a259cb65037e40e086a5b4298134964cf07442","verifierVersion":"0.1.0+a26ee00d"}]}