{"assessments":[],"deployments":[{"attestationHash":"707fce7f3e5750ddf2fbd1155bccefaa397144a3c6505ffb87d1a677317da149","chainId":11155111,"contracts":[{"address":"0x368063a2e7997abcbc681801975f405d1848c58a","blockNumber":11943512,"name":"MockSwarmPepe","role":"other","txHash":"0x802d4a573411410b6df6be7601027d23b11a3b0caf570bce9581094cfe078a72"},{"address":"0x1e9e3b81f8c88b3be911290e6330d9095f0674df","blockNumber":11943512,"name":"MockOG","role":"other","txHash":"0x802d4a573411410b6df6be7601027d23b11a3b0caf570bce9581094cfe078a72"},{"address":"0x56c5ad2780d1f85dcebf666ea3667c92b82dee40","blockNumber":11943512,"name":"OGClubHouses","role":"other","txHash":"0x802d4a573411410b6df6be7601027d23b11a3b0caf570bce9581094cfe078a72"},{"address":"0x7bfb2c8697f6886db59fc9c7e57f5cdd35222a02","blockNumber":11943512,"name":"OGClubDeeds","role":"other","txHash":"0x802d4a573411410b6df6be7601027d23b11a3b0caf570bce9581094cfe078a72"},{"address":"0xedd7056dd1b0c13b060630e5401acc8799920c90","blockNumber":11943512,"name":"MockDelegateRegistry","role":"other","txHash":"0x802d4a573411410b6df6be7601027d23b11a3b0caf570bce9581094cfe078a72"}],"id":"7dcccef5-7ef0-4fa5-a390-a6b8d872da0f","manifestHash":"2ddffb1ec8f93f6ed59aa6f206817d635f5b324687164d75d9749e2b35ad453e","status":"live"}],"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":"7a5e3a10-d2d7-4a0a-9727-0e166290f8b8","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3f61af5751725784ffd14d309357f30ab8a9ce2d115043bd3bb63ccc89a41163","dependsOn":["build_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":"8028f4976b528521f77900fedd13d4980202d97e3296a53d0f5ef89cb95bdb10","dependsOn":["build_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":"19c1f0be9704d9c8d1c86c69a0f8f27e501f7a324f4716fcf7062630be9ef668","dependsOn":["build_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":"5dcb9883e886549f181957b7f47ffd0bc00f9c1597e94c9c74f62482595450ff","dependsOn":["build_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":"176f5b3d48c7fb0ecda0f805624ea3bc49fad212917d83cdd6bedd459e973bbe","dependsOn":["build_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":"ea4fc949ab1c85de4e4e263dd495d5581d297628b5d46426634d86c956f4266c","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"d01ac5808c2678133ad7014515f263a19cb33e185cb44169f25f8f216ade0996","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"193bae5034e24340088e9c4676e094974500e9d87386ca51f171f1afbb874af1","dependsOn":["build_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":"Build a Foundry project (Solidity ^0.8.24, OpenZeppelin 5.x, no proxies, custom errors, NatSpec): two small contracts that sell places in the OG Club game for the OG ERC-20 (18 decimals). Do not deploy. forge build, forge test and forge fmt --check must pass. Every owner will be a Safe on mainnet.\n \n## Shared payment rules (both contracts)\n- Constructor: token, vault (immutable), owner, initialPrice, priceNotice (immutable, at most 30 days: 7 days on mainnet, 0 on test networks).\n- Every purchase moves price/2 from the payer to BURN_ADDRESS (0x000000000000000000000000000000000000dEaD) and price - price/2 to the vault, straight from the payer with transferFrom; the contract never holds tokens. Check both recipients received the exact amounts, so a fee-on-transfer token reverts (ShortTransfer).\n- Buyers pass maxPrice and the purchase reverts if the price is higher.\n- setPrice(newPrice): owner; takes effect priceNotice after the call (a later call replaces a pending one); price() returns the price in force now, and a view shows the pending price and when it starts.\n- setPaused(bool): owner; stops new purchases only. The owner has no other power over payments, houses or clubs.\n \n## 1. OGClubHouses (initialPrice 100,000 OG)\nA house is a wallet's membership: one per wallet, permanent, not transferable, never revoked.\n- buyHouse(maxPrice): a house for msg.sender.\n- buyHouseFor(account, maxPrice): msg.sender pays, account gets the house (lets a delegate.xyz hot wallet buy for its vault). account nonzero.\n- Reverts AlreadyHasHouse if the account has one. hasHouse(account) and houseCount views.\n- Event HouseBought(account indexed, payer indexed, price, burned, toVault).\n \n## 2. OGClubDeeds (ERC-721 \"OG Club\", symbol OGCLUB, initialPrice 250,000 OG)\nA club deed: one per Swarm Pepe, ever. Token id = Pepe id. Whoever holds the deed owns the club in the game; deeds trade freely.\n- Extra constructor args: swarmPepe (ERC-721), delegateRegistry (delegate.xyz v2), royaltyReceiver.\n- mint(pepeId, maxPrice): allowed if msg.sender is the Pepe's ownerOf, or if the registry's checkDelegateForERC721(msg.sender, owner, swarmPepe, pepeId, bytes32(0)) is true. The deed is minted to the Pepe's owner, the payer is msg.sender. Reverts ClubExists if that Pepe already minted one (even if the deed was later sold or the Pepe changed hands).\n- Event ClubMinted(pepeId indexed, owner indexed, payer, price, burned, toVault).\n- tokenURI = baseURI + id + \".json\"; owner setBaseURI until freezeMetadata (permanent). ERC-2981 royalties, default 5%, owner may change up to 10%.\n- No owner mint, no burn, no transfer restrictions.\n \n## Tests\n- Exact split including an odd price in wei; contract token balance always 0; maxPrice protection; paused purchases revert and unpausing restores them.\n- Price notice at its exact boundary, a replaced pending change, notice 0 takes effect at once; constructor rejects a notice above 30 days and zero addresses.\n- Houses: one per wallet, buyHouseFor, events.\n- Deeds: owner mints; a delegate mints to the vault and pays; a stranger reverts; ClubExists after a mint even once the Pepe or the deed moves; a revoked delegation reverts; tokenURI, freeze, royalty bounds.\n- A fee-on-transfer mock token makes every purchase revert.\n- Fuzz the split; an invariant that burned + vault totals equal what payers spent.\n \n## Deployment\nscript/Deploy.s.sol and launch.json: a Sepolia test deployment with MockOG (public mint), a mock Swarm Pepe (public mint), a mock delegate registry, vault = the deployer, priceNotice 0. README: how to buy (approve the exact price, then buy), the owner powers, and mainnet: existing OG token, Swarm Pepe 0x999ce0CE8C5f7661e0c74a568FfE27CEB9177bDB, delegate.xyz 0x00000000000000447e69651d841bD8D104Bed493, the farming vault as vault, a fresh deployer, OWNER a Safe, PRICE_NOTICE=604800.\n\nToken name: notoken\nToken symbol: nt\nTotal supply: 1","parentJobId":null,"planHash":"434864cc1af2f2ef59dc84ce12c0d4e0ae458ec2885ac35010e4847c38e8fb96","previousHash":"72abb6094309de2a5e3197814f9e86a0be168a1914815f5539f4ee73c5c81902","projectId":"7a5e3a10-d2d7-4a0a-9727-0e166290f8b8","publication":{"commit":"c2b439783f7d61bad84ed8e58b608c4694e42e12","deliveredAt":"2026-10-18T20:42:05.747Z","repoUrl":"https://github.com/identity-md-launches/launch-2188-notoken"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"6f13ed46ec59cb09c67db488ae3f8d3f463a1c4ee904dbdc2f929d6f27a17d28","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c9743cd9807c4c3a","findings":[{"citation":"resolved","description":"Asymmetry between caller classes. _collectPayment measures the vault's balance before and after both transferFrom legs and requires a net increase of exactly toVault. When msg.sender is the vault itself, the first leg debits burned from the vault and the second leg is a self-transfer with no net effect, so the vault's balance ends lower than it started and _checkReceipt reverts with ShortTransfer(vault, toVault, 0). The same happens in OGClubDeeds.mint when the farming vault is the Pepe's ownerOf. Every other wallet can buy its own house (brief: buyHouse is 'a house for msg.sender') and every other Pepe owner can mint its own deed; the vault can only be bought for by a third party (buyHouseFor, or a delegate paying in mint). The README already documents this restriction, so this is a design limitation with a concrete failing input rather than a permission bypass. If the author wants the vault to be a first-class buyer, the receipt check can compute the vault's expected net change as toVault - burned when msg.sender == vault (and the payer debit check as burned), or simply skip the vault receipt check for that payer since the payer-debit check still proves the burn leg.","line":117,"path":"src/OGClubPayments.sol","reproduction":"OGClubHouses(token, vault=V, owner, 100000e18, 0). Mint 1,000,000e18 OG to V. As V: og.approve(houses, 100000e18); houses.buyHouse(100000e18). Expected (per brief): V receives a house, 50000e18 burned, 50000e18 net to V. Actual: revert ShortTransfer(V, 50000e18, 0); hasHouse(V) stays false. Same for deeds: MockSwarmPepe.mint(V, 7); as V approve 250000e18 and call deeds.mint(7, 250000e18) -> revert ShortTransfer(V, 125000e18, 0). A delegate (registry.delegateERC721(delegate, pepe, 7, bytes32(0), true) from V) paying from its own balance succeeds and the deed is minted to V. Verified in a scratch Foundry test on this tree.","severity":"low","snippet":"        _checkReceipt(vault, vaultBefore, toVault);","title":"The immutable vault address can never pay for its own house or deed (payer == vault always reverts ShortTransfer)"},{"citation":"resolved","description":"Not a permission bypass; recorded as the owner-role trust assumptions required by the assignment. (1) Ownable2Step makes handover two-step, but OpenZeppelin's renounceOwnership stays single-step. If the owner Safe calls setPaused(true) and then renounceOwnership(), owner() is address(0) forever and no one can ever call setPaused(false): new houses and deeds can never be purchased again, while a previously scheduled price still activates. The README documents this. (2) setPrice has no lower bound, so the owner may announce a price of 0 (after the immutable notice, 7 days on mainnet); purchases then transfer nothing to BURN_ADDRESS or the vault, which is visible on-chain via pendingPrice() during the notice. Both are owner-only actions with no unprivileged amplifier, so they are trust assumptions, not defects. Mitigation if desired: override renounceOwnership to revert (or to require !paused()), and optionally floor the price.","line":14,"path":"src/OGClubPayments.sol","reproduction":"As owner: houses.setPaused(true); houses.renounceOwnership(). State: owner()==address(0), paused()==true. Any later houses.setPaused(false) reverts OwnableUnauthorizedAccount; houses.buyHouse(x) reverts EnforcedPause for every caller, permanently. Verified in a scratch Foundry test on this tree.","severity":"info","snippet":"abstract contract OGClubPayments is Ownable2Step, Pausable, ReentrancyGuard {","title":"Trust assumptions of the owner role: single-step renounce while paused permanently disables purchases; setPrice(0) is allowed"}],"hash":"176f5b3d48c7fb0ecda0f805624ea3bc49fad212917d83cdd6bedd459e973bbe","nodeId":"ed1f481d-964f-4aeb-b545-6d158934df98","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, both cited snippets match the tree, the scratch directory is removed, and the working tree has no other changes.\n\n**Outcome:** the permission model of both contracts holds. I found no guard gap, escalation path, confused deputy, or asymmetry that an unprivileged caller can exploit. Two low-impact items are recorded with reproductions.\n\n**What I checked, against the Access Control, Trust Gap and Asymmetry guides:**\n- Every storage variable has exactly one writer path and its guard is the strongest available. No internal helper is reachable from a weaker entry point.\n- Both payment legs always name the caller as payer, so no function can spend another wallet's allowance.\n- The mint authorisation matches the brief: Pepe owner, or the registry check with the caller as delegate and the current owner as vault. Reentrancy through the ERC-721 receiver hook is blocked by the guard, and the one-deed-per-Pepe flag is set before any external call.\n- Price scheduling is symmetric between the write and both views at the exact boundary, and a replaced pending change restarts the full notice.\n- Ownership uses OpenZeppelin two-step handover with correct guards on every path.\n- The two mainnet dependencies named in the brief answer the exact interfaces the contract calls, verified over a public RPC.\n- The launch manifest uses only the schema's keys, with arguments in declaration order and no zero address.\n\n**Findings recorded:**\n- Low: the farming vault can never pay for its own house or deed. The vault receipt check sees a net decrease when the payer is the vault, so the purchase reverts with ShortTransfer. A third party can still buy for it. The README documents this.\n- Info: owner trust assumptions. Renouncing ownership while paused disables purchases permanently, and the owner may schedule a zero price. Both are owner-only with no unprivileged amplifier.\n\n**Coverage:** all 21 listed entry points have a row, plus four invariant and dependency rows. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":794787,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":26748,"runtime":"claude","turns":21,"wallClockMs":375215}},{"artifacts":[],"attempt":1,"bundleHash":"406b25da3f08b648e7b2f9bac2a2b80acbd1377dd3fe0244bbd1af2a05f9b158","device":"e8e860c7f2306473","findings":[{"description":"mint() sends the deed with _safeMint to swarmPepe.ownerOf(pepeId). If that owner is a contract that does not implement IERC721Receiver (some custody contracts, escrow or staking wrappers, older multisigs), every mint attempt reverts, including one by a valid delegate.xyz delegate. The brief only says the deed is minted to the Pepe's owner; it does not ask for the receiver check. The deed can still be minted after the Pepe moves to a receiving wallet, so nothing is lost permanently, but a delegate cannot mint for such a vault. The existing test test_NonReceivingOwnerRollsBackPaymentAndEligibility shows this happens and that the payment rolls back. Using _mint (or documenting the limitation) is a design choice for the requester.","line":94,"path":"src/OGClubDeeds.sol","reproduction":"Pepe 7 is owned by a contract with no onERC721Received; that contract delegates to EOA D through the registry; D approves the price and calls mint(7, price). Expected (per the brief): deed 7 minted to the contract, D pays. Actual: reverts ERC721InvalidReceiver(contract) and no club can be minted while the Pepe stays there.","severity":"low","title":"Deeds use _safeMint to the Pepe owner, so a Pepe held by a contract without onERC721Received can never get its club"},{"description":"_collectPayment checks the vault's balance rose by price - price/2. When msg.sender == vault, the vault leg is a self-transfer and the vault's balance actually falls by the burn share, so the purchase reverts with ShortTransfer. This follows from the brief's exact-receipt rule, and README line ~92 documents it. The Sepolia recipe makes the deployer the vault, so whoever tests the Sepolia deployment has to buy from a second wallet. Reported for awareness only, not as a correctness defect.","line":117,"path":"src/OGClubPayments.sol","reproduction":"Houses with vault = V, price 100,000e18. V approves and calls buyHouse(100,000e18). Actual: revert ShortTransfer(V, 50,000e18, 0). Covered by test_VaultCannotPayItselfAndPassExactReceiptChecks.","severity":"info","title":"The vault cannot buy from its own wallet, so the Sepolia deployer (vault = deployer) cannot test purchases with that wallet"},{"description":"Ownable2Step inherits renounceOwnership. If the owner Safe renounces while setPaused(true) is in force, nobody can ever unpause, and houses and deeds can never be bought again. Renouncing while unpaused fixes the price forever instead. Neither case touches existing houses or deeds, which matches the brief's limits on owner power, but an irreversible stop to all sales is an owner power the README should mention. It could also be disabled.","line":14,"path":"src/OGClubPayments.sol","reproduction":"owner: setPaused(true); renounceOwnership(). Afterwards buyHouse/mint always revert EnforcedPause and setPaused reverts OwnableUnauthorizedAccount for every caller.","severity":"info","title":"renounceOwnership while paused stops purchases permanently"}],"hash":"193bae5034e24340088e9c4676e094974500e9d87386ca51f171f1afbb874af1","nodeId":"438f47c9-5f58-4603-9dff-02fdc7eced7d","outcome":"completed","summary":"I found no defect in either contract serious enough to need a failing proof. The previous suite already had 102 passing tests, and I added two test files on top of it. `forge build`, `forge fmt --check` and `forge test` with the verifier's fuzz seed all pass: 119 tests, none failing.\n\n**`test/PriceScheduleInvariant.t.sol`** is a new invariant suite (128 runs × 64 calls). It checks the price schedule against a log of every `setPrice` call rather than the contracts' own storage.\n- **What it drives:** three sales with a 7-day, 1-second and zero notice. Random calls set prices (some odd), have strangers try `setPrice`, move time forward (including to exactly one second before, on, and after a change takes effect), pause, and buy at the exact price, one wei under it, or with no limit.\n- **What must hold after every sequence:**\n  - `price()` and `pendingPrice()` match the log at every step.\n  - Each purchase charges exactly the price in force, split exactly between burn and vault.\n  - Burned plus vault totals equal what payers spent, and neither contract ever holds tokens.\n- Four fixed timelines check the log-based expectation against the contracts' actual `price()`/`pendingPrice()`, so the invariant can't pass by checking nothing.\n\n**`test/EdgeCases.t.sol`** adds 12 unit tests for cases not covered before:\n- the largest price a payer can actually hold, which is odd and splits exactly without overflow;\n- a 30-day notice accepted, 30 days + 1 second rejected on both contracts, and the 30-day boundary on deeds;\n- which error wins when several checks fail at once (pause first, then duplicate or `ClubExists`, then price limit, then authorisation);\n- `setPaused` repeated is a no-op, and pausing one contract doesn't pause the other;\n- a delegation for one Pepe doesn't authorise another;\n- an unminted deed has no owner or URI;\n- the royalty cap at exactly 10%, 0% allowed, and 10.01% rejected.\n\n`.imd-findings.json` reports three things for the requester to decide, none critical:\n- **Low:** deeds are minted with `_safeMint`. If a Pepe's owner is a contract that can't receive NFTs, no club can be minted for it while it sits there, not even by a valid delegate. Payment rolls back, so nothing is lost.\n- **Info:** the vault can't buy from its own wallet; the exact-receipt check rejects it, and the README already says so. Because the Sepolia deployment makes the deployer the vault, testers need a second wallet to buy.\n- **Info:** the inherited `renounceOwnership` lets the owner give up control while sales are paused, which stops all purchases forever. The README should mention it, or it could be disabled.","treeHash":"503a978fb8a5ddf8ef8c246cefc1ac5eafdd9c53","usage":{"cachedInputTokens":1081402,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":22852,"runtime":"claude","turns":19,"wallClockMs":268381}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddcecd7483f623f7","findings":[{"citation":"resolved","description":"Merged from audit_permissions, audit_economics, audit_flow and the write_foundry_tests note (same root cause). _collectPayment snapshots the vault balance, moves price/2 to BURN_ADDRESS and price - price/2 to the vault with transferFrom from msg.sender, then requires the vault's net balance to have risen by exactly toVault. When the payer is the vault, the vault leg is a self-transfer (net zero) and the burn leg lowers the vault balance, so the check reverts ShortTransfer(vault, toVault, 0) on an honest 18-decimal token even though both recipients were paid exactly. The brief says buyHouse gives 'a house for msg.sender' and that a Pepe's ownerOf may mint; both are refused for the one address that is the vault. Houses can still be gifted to the vault by a third party, and a delegate can still mint the vault's deed, so no funds are lost and nothing is permanently blocked. In the Sepolia manifest $owner is vault, owner and the initially funded wallet, so the deployment wallet cannot exercise buyHouse or mint from its own account (the public faucet lets any other wallet fund itself). The README documents the restriction. Reported so the author confirms it is intended; a minimal fix keeping the fee-on-transfer protection is to expect a net vault change of -burned when msg.sender == vault (the payer-debit check at lines 119-123 already proves the burn leg), or to reject msg.sender == vault with a dedicated error instead of a misleading ShortTransfer.","line":117,"path":"src/OGClubPayments.sol","reproduction":"Deploy MockOG, OGClubHouses(token, vault=V, owner=O, 100000e18, 0) and OGClubDeeds(token, V, O, 250000e18, 0, pepe, registry, O). Mint 1,000,000e18 OG to V and Pepe 7 to V. As V: og.approve(houses, 100000e18); houses.buyHouse(100000e18). Expected per brief: V gets a house, 50,000e18 goes to 0xdEaD, V keeps the other half. Actual: revert ShortTransfer(V, 50000e18, 0); hasHouse(V) stays false. As V: og.approve(deeds, 250000e18); deeds.mint(7, 250000e18) -> revert ShortTransfer(V, 125000e18, 0); clubExists(7) stays false. After O calls houses.setPrice(1), V's houses.buyHouse(1) reverts ShortTransfer(V, 1, 0). Only at price 0 does V's own purchase succeed. Verified with a scratch Foundry test on this tree (test/scratch/Repro.t.sol, test_VaultSelfPayReverts, not kept).","severity":"low","snippet":"        _checkReceipt(vault, vaultBefore, toVault);","title":"The vault wallet can never pay for a house or deed at any positive price: net-balance receipt check reverts ShortTransfer when msg.sender == vault"},{"citation":"resolved","description":"Merged from write_foundry_tests and audit_flow (same root cause). The deed recipient is swarmPepe.ownerOf(pepeId), which the payer does not choose. OpenZeppelin's _safeMint calls onERC721Received on a contract recipient and reverts ERC721InvalidReceiver if the selector is not returned. A Pepe custodied by a contract that is not an ERC-721 receiver (an escrow or staking wrapper, a Safe without its fallback handler, an older multisig) therefore cannot have its one deed minted by anyone, including a delegate.xyz hot wallet the brief explicitly wants to support. The brief only requires the deed to be minted to the Pepe's owner and asks for no receiver check. The purchase rolls back entirely (clubExists reset, no tokens moved), so nothing is lost; the Pepe must first move to a receiving address. The README documents the requirement and the suite covers the rollback (test_NonReceivingOwnerRollsBackPaymentAndEligibility). Design choice for the author: _mint would let every Pepe owner receive its deed, at the cost of allowing a mint into a contract that cannot move it.","line":94,"path":"src/OGClubDeeds.sol","reproduction":"Deploy deeds with price 250000e18 and notice 0. Deploy an empty contract R (no onERC721Received). Mint Pepe 42 to EOA D and transferFrom it to R (plain transfer, no receiver check). From R: registry.delegateERC721(D, pepe, 42, bytes32(0), true). D holds 1,000,000e18 OG and approves deeds for 250000e18. Expected per brief: D, a valid delegate, mints deed 42 to R and pays. Actual: deeds.mint(42, 250000e18) from D reverts ERC721InvalidReceiver(R); clubExists(42) is false and D's balance is unchanged. Verified with a scratch Foundry test on this tree (test/scratch/Repro.t.sol, test_NonReceiverPepeOwnerBlocksDelegateMint, not kept).","severity":"low","snippet":"        _safeMint(pepeOwner, pepeId);","title":"Deeds use _safeMint to the Pepe owner, so a Pepe held by a contract without onERC721Received can never get its club deed, even when a valid delegate pays"},{"citation":"resolved","description":"Merged from write_foundry_tests and audit_permissions. Not a permission bypass; recorded as the owner-role trust assumption. Ownable2Step makes the handover two-step, but OpenZeppelin's renounceOwnership stays single-step. If the owner Safe calls setPaused(true) and then renounceOwnership(), owner() is address(0) forever and nobody can call setPaused(false): houses and deeds can never be bought again, while existing houses and deeds are untouched and a previously scheduled price still activates. Renouncing while unpaused instead fixes the price forever. setPrice also has no floor, so the owner may announce a zero price after the notice period, which is visible through pendingPrice(). The README documents both. Optional mitigation: override renounceOwnership to revert or to require !paused().","line":14,"path":"src/OGClubPayments.sol","reproduction":"As owner O: houses.setPaused(true); houses.renounceOwnership(). State: owner() == address(0), paused() == true. O's later houses.setPaused(false) reverts OwnableUnauthorizedAccount(O); any caller's houses.buyHouse(100000e18) reverts EnforcedPause, permanently. Verified with a scratch Foundry test on this tree (test/scratch/Repro.t.sol, test_RenounceWhilePausedIsPermanent, not kept).","severity":"info","snippet":"abstract contract OGClubPayments is Ownable2Step, Pausable, ReentrancyGuard {","title":"Owner trust assumption: single-step renounceOwnership while paused disables all future purchases permanently; setPrice(0) is allowed"}],"hash":"19c1f0be9704d9c8d1c86c69a0f8f27e501f7a324f4716fcf7062630be9ef668","nodeId":"872ddd8a-0bcc-483a-905f-4698add19dc4","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds three findings and a 23-row coverage record, with every snippet verified against the tree. The scratch tests are removed and no repository file was changed.\n\n**Outcome.** The code is sound. Build, the full suite of 119 tests, and `forge fmt --check` all pass. No critical, high or medium defect exists, so no proof files were needed. The eight specialist reports collapse into three distinct root causes, all of which I reproduced in a scratch Foundry test before keeping them.\n\n**Findings kept, with severity recalibrated by impact:**\n\n- **Low, vault cannot pay for itself.** Four specialists reported the same root cause in `src/OGClubPayments.sol:117`. The vault's net-balance receipt check sees a self-transfer plus a burn debit and reverts with ShortTransfer at every positive price. Reproduced for buyHouse, mint, and a 1 wei price. No funds are lost and third parties can still buy for the vault, so this stays low rather than a permission defect.\n- **Low, safe-mint blocks non-receiver Pepe owners.** Two specialists reported `src/OGClubDeeds.sol:94`. A Pepe custodied by a contract without onERC721Received can never get its deed, even through a valid delegate, which the brief explicitly wants to support. The purchase rolls back cleanly.\n- **Info, renounce while paused is permanent.** Two specialists reported this as an owner trust assumption. Reproduced: after setPaused(true) then renounceOwnership, no one can unpause. Documented in the README, so recorded as a trust assumption only.\n\n**Static-analysis leads dropped.** The Slither timestamp lines are the intended price schedule. The Aderyn reentrancy line is two view calls to immutable dependencies behind nonReentrant. The unchecked-return line is an intentional discard of the result of the ownership check in tokenURI.\n\n**My own pass.** I traced all 21 entry points and the launch manifest. The price schedule holds at the exact notice boundary, on replacement and after activation. Delegate and stranger paths, ClubExists persistence after both NFTs move, tokenURI, freeze and royalty bounds behave as specified. The manifest uses only the three allowed keys, argument counts match each constructor in order, and no constructor makes an external call.","treeHash":null,"usage":{"cachedInputTokens":693206,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":17062,"runtime":"claude","turns":16,"wallClockMs":261665}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea62f3bebece9304","findings":[{"citation":"resolved","description":"_collectPayment measures the vault's net balance change and requires it to equal toVault. When msg.sender == vault, the second transferFrom is a self-transfer. The vault's net change is then -burned, not +toVault, so _checkReceipt reverts ShortTransfer(vault, toVault, 0) even with a standard 18-decimal token. The brief makes vault = the deployer for the Sepolia deployment. launch.json and script/Deploy.s.sol pass $owner/deployer as the vault, so the deployer, who also holds the initial mock supply, cannot buyHouse, buyHouseFor or mint (when it owns the Pepe) from its own wallet. On mainnet the farming vault can never buy a house or deed for itself either; a third party has to pay. This is documented in the README and test_VaultCannotPayItselfAndPassExactReceiptChecks. It is still an unrequested restriction that comes from how the fee-on-transfer check is written, not from the brief's payment rule (price/2 burned, the rest to the vault, both exact).","line":116,"path":"src/OGClubPayments.sol","reproduction":"Deploy with Deploy.deploy(D, O) on chain 11155111 (vault = D). D calls MockOG.mint(D, 100000e18), then approve(houses, 100000e18), then houses.buyHouse(100000e18). Expected: 50000e18 goes to 0xdEaD, D's net debit is 50000e18 (its vault share returns to itself), and the house is granted. Actual: revert ShortTransfer(D, 50000e18, 0); the house is not granted. deeds.mint(id, 250000e18) by D for a Pepe D owns reverts the same way. A fix that keeps the FoT protection: when msg.sender == vault, expect the vault's net change to be -burned and skip the vault-leg transfer, or check the payer's exact debit together with the burn receipt.","severity":"low","snippet":"        _checkReceipt(BURN_ADDRESS, burnBefore, burned);\n        _checkReceipt(vault, vaultBefore, toVault);","title":"The vault wallet can never pay for a purchase, and in the Sepolia recipe that is the deployer/owner wallet"}],"hash":"3f61af5751725784ffd14d309357f30ab8a9ce2d115043bd3bb63ccc89a41163","nodeId":"3af941c8-0aec-47a9-ae48-22ebd6f46919","outcome":"completed","summary":"The economics review found no high or medium defects and one low-severity finding. I wrote it to `.imd-findings.json` with a coverage row for all 21 entry points plus one for the conservation invariant. I changed no files; `forge test` passed all 102 tests.\n\n**Finding (low): the vault wallet can never pay for a purchase.** The check is at `src/OGClubPayments.sol:116-117`. When the buyer is the vault itself, its share is a transfer to itself. The vault's balance then drops by the burned half instead of rising by its share, so the purchase reverts with `ShortTransfer` even with a normal token.\n- **Reproduction:** deploy with `Deploy.deploy(D, O)` on Sepolia, so `vault = D`. D mints 100,000 OG, approves the houses contract and calls `buyHouse(100000e18)`. It reverts with `ShortTransfer(D, 50000e18, 0)`. `deeds.mint` by D for a Pepe D owns fails the same way.\n- **Impact:** the brief sets vault = the deployer for Sepolia, and `launch.json` passes `$owner` as both vault and owner. So the wallet that deploys, owns and holds the initial mock tokens can't test any purchase from its own wallet. On mainnet, the farming vault can't buy for itself; someone else has to pay for it.\n- **Status:** the README documents this limitation and `test_VaultCannotPayItselfAndPassExactReceiptChecks` asserts it. It still comes from how the fee-on-transfer check is written, not from the brief.\n- **Suggested fix:** when the payer is the vault, expect its balance to fall by the burned half instead of rising. That keeps the fee-on-transfer protection.\n\n**What holds:**\n- **Split:** every purchase sends floor(price/2) to `0x…dEaD` and the rest to the vault, and the payer's exact debit is checked. The contracts never hold tokens.\n- **`maxPrice`:** it is checked before any transfer, and the price can't change within the transaction.\n- **Price notice:** a new price takes effect exactly at the boundary. Replacing a pending change keeps a price that has already taken effect, and a zero notice applies at once.\n- **Pause:** it stops purchases only; deed transfers and approvals keep working.\n- **One deed per Pepe:** the flag is set before payment and stays set after the Pepe or the deed changes hands.\n- **Delegate mints:** the registry is checked with full rights (`bytes32(0)`), and the deed goes to the Pepe's owner.\n- **Royalty:** capped at 10%.\n\n**Static-analysis leads:**\n- **Aderyn's \"high\" reentrancy:** a false positive. The mint callback runs after the state change and behind the reentrancy guard.\n- **Slither's timestamp warnings:** these are the intended notice logic.\n\n**Owner powers to note (not defects):**\n- **Renouncing while paused:** this disables purchases permanently. It's an owner power the README documents.\n- **Zero-amount transfers:** prices of 0 or 1 wei mean a transfer of 0. That would only break if the real OG token rejects zero transfers, which I couldn't check.","treeHash":null,"usage":{"cachedInputTokens":364499,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":8357,"runtime":"claude","turns":7,"wallClockMs":98805}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bdd9b74dce66953d","findings":[],"hash":"5dcb9883e886549f181957b7f47ffd0bc00f9c1597e94c9c74f62482595450ff","nodeId":"45617761-a612-489d-8c8b-8bf10b5b435f","outcome":"completed","summary":"The review is complete. No reproducible defects were found in the Math Precision, Boundary or Numerical Gap areas, and the findings file records an empty list with a full coverage record.\n\n**What was checked**\n\n- The payment split in `_collectPayment` at `src/OGClubPayments.sol:108`. Burn gets the floor of half, the vault gets the remainder, and the two always sum to the price with no multiplication that could overflow. Verified at 0, 1, 101, the launch prices and the largest mintable price.\n- The receipt and payer-debit checks against taxed, false-returning, self-paying and second-leg-undo tokens. All revert with the right amounts and roll back fully. The existing adversarial suite already covers these, and I re-ran it.\n- The price notice. Activation is inclusive at exactly call time plus notice, a replaced announcement never takes effect, an already activated price is preserved when a new one is scheduled in the same second, and a notice scheduled at timestamp zero keeps a nonzero sentinel. The 30-day cap rules out timestamp overflow.\n- Royalty bounds and rounding. The cap is 1000 of 10000, and tiny sale prices floor to zero as ERC-2981 expects.\n- The external boundaries in `mint`: nonexistent Pepe reverts in `ownerOf`, zero owner is rejected, and a contract owner that cannot receive ERC-721 rolls back both payment legs, which the README documents as intended.\n\n**Static analysis leads**\n\nBoth Slither timestamp lines are the intended inclusive notice comparison. The Aderyn reentrancy lead at `src/OGClubDeeds.sol:83` is two view calls before a state write inside a `nonReentrant` function, and the unchecked-return lead is the intentional `_requireOwned` guard. None became findings.\n\n**One assumption left open**\n\nThe real mainnet OG token address was not available, so I could not confirm it credits the 0xdEaD address normally and accepts zero-value transfers. If it does not, every purchase would revert with ShortTransfer. That is fail-closed rather than a loss, and the coverage record notes it.\n\nBuild, full test suite and `forge fmt --check` all pass. The scratch tests I used for the edge probes have been removed, and the tree is otherwise unchanged.","treeHash":null,"usage":{"cachedInputTokens":631860,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":18421,"runtime":"claude","turns":24,"wallClockMs":292463}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f3b611cf8afb513f","findings":[{"citation":"resolved","description":"Area: Execution Trace / First Principles (stale-identity assumption). _collectPayment assumes the payer, the burn address and the vault are three distinct accounts. It snapshots the vault balance, moves price/2 to BURN_ADDRESS and price - price/2 to the vault with transferFrom, then requires the vault's net balance to have grown by exactly toVault. When msg.sender == vault, the vault leg is a self-transfer (net zero) and the burn leg actually reduces the vault's balance, so _checkReceipt(vault, ...) reverts with ShortTransfer(vault, toVault, 0) on an honest, non-fee token even though both recipients were paid exactly the requested amounts. With price 1 wei the burn leg is zero and the vault leg is a 1-wei self-transfer; it still reverts. The brief introduces ShortTransfer to reject fee-on-transfer tokens; here it rejects a legitimate purchase. This matters for the shipped Sepolia manifest (launch.json binds $owner as vault, owner, royalty receiver and the only wallet that is funded with the initial token), so the deployment wallet cannot exercise buyHouse or mint itself, and on mainnet for any treasury or Safe that is both the farming vault and a would-be member. The README and test_VaultCannotPayItselfAndPassExactReceiptChecks document this as intended; it is reported so the author confirms the limitation is acceptable rather than accidental. A minimal fix that preserves the recipient checks: measure the payer's debit (already done at lines 119-123) and, when msg.sender == vault, expect the vault's net change to be -burned instead of +toVault (or simply reject msg.sender == vault with a dedicated error so the failure is explicit rather than a misleading ShortTransfer).","line":117,"path":"src/OGClubPayments.sol","reproduction":"Deploy MockOG, OGClubHouses(token, vault=V, owner=V, 100000e18, 0) and OGClubDeeds(token, V, V, 250000e18, 0, pepe, registry, V) exactly as launch.json does with $owner = V. Mint 1,000,000e18 to V, mint Pepe 7 to V, and from V approve both apps for the full price. Expected per brief: V (the Pepe's ownerOf and a wallet without a house) can call houses.buyHouse(100000e18) and deeds.mint(7, 250000e18); 50,000e18 ends at 0xdEaD and the vault keeps the other half. Actual: houses.buyHouse(100000e18) reverts ShortTransfer(V, 50000e18, 0); deeds.mint(7, 250000e18) reverts ShortTransfer(V, 125000e18, 0); after houses.setPrice(1), houses.buyHouse(1) reverts ShortTransfer(V, 1, 0). hasHouse(V) stays false and clubExists(7) stays false. Verified with a scratch Foundry test (test/scratch/VaultPayer.t.sol, not kept) that passes on the current code with those expectRevert assertions.","severity":"low","snippet":"        _checkReceipt(vault, vaultBefore, toVault);","title":"Net-balance receipt check makes the vault wallet unable to buy a house or mint a deed at any positive price"},{"citation":"resolved","description":"Area: Execution Trace (external call corner case). The deed recipient is swarmPepe.ownerOf(pepeId), which the payer does not choose. If that owner is a contract that does not return the IERC721Receiver selector (a Safe without its fallback handler, a staking or escrow contract, a plain multisig), OpenZeppelin's checkOnERC721Received reverts with ERC721InvalidReceiver and the whole purchase rolls back. No funds are lost and clubExists is reset, so this is a reachability limit rather than a security defect: the Pepe must first be moved to an address that can receive ERC-721s before its one deed can ever be minted, and a delegate.xyz hot wallet cannot work around it. The README documents the requirement and the suite covers it (test_NonReceivingOwnerRollsBackPaymentAndEligibility). Reported as a trade-off for the author to confirm: using _mint instead of _safeMint would let every Pepe owner receive its deed (consistent with 'deeds trade freely' and the absence of transfer restrictions), at the cost of allowing a mint to a contract that cannot move it; keeping _safeMint is a defensible choice.","line":94,"path":"src/OGClubDeeds.sol","reproduction":"Deploy the deeds as in the tests with price 250000e18 and notice 0. Deploy an empty contract R (no onERC721Received). Transfer Pepe 42 to R with plain transferFrom. From R, call registry.delegateERC721(hot, pepe, 42, bytes32(0), true). Fund and approve hot for 250000e18. Expected by a reader of the brief: hot (a valid delegate) can mint deed 42 to R. Actual: deeds.mint(42, 250000e18) from hot reverts ERC721InvalidReceiver(R); clubExists(42) is false and hot keeps its tokens. The same happens if R itself could call mint. Only moving the Pepe out of R first makes the deed mintable.","severity":"info","snippet":"        _safeMint(pepeOwner, pepeId);","title":"Safe-mint to the Pepe owner blocks any deed for a Pepe held by a contract without an ERC-721 receiver, even when a delegate pays"}],"hash":"8028f4976b528521f77900fedd13d4980202d97e3296a53d0f5ef89cb95bdb10","nodeId":"275f228d-cfbe-4088-85ad-b15673e5075d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with 2 findings and 25 coverage rows. The scratch test was removed and the tree is otherwise unchanged.\n\n**Outcome: no exploitable defect in the Execution Trace, Periphery or First Principles areas.** Build, all 102 tests and the formatter check pass. The payment base, the notice clock, the delegate check and the one-deed-per-Pepe rule all trace correctly, including the boundary cases the guides call for (exact notice timestamp, replaced announcement, zero and one-wei prices, reentrancy through the token and the ERC-721 receiver, fee-on-transfer on either leg).\n\n**Findings reported**\n\n- **Low, `src/OGClubPayments.sol:117`.** The net-balance receipt check rejects a payer who is the vault. From the vault wallet, `buyHouse` and `mint` revert with `ShortTransfer` at every positive price on an honest token. This matters for the Sepolia manifest, where `$owner` is the vault, the owner and the only funded wallet. The README and an existing test document it as intended, so I flagged it for the author to confirm rather than as a security defect.\n- **Info, `src/OGClubDeeds.sol:94`.** Safe-mint to the Pepe owner means a Pepe held by a contract without an ERC-721 receiver can never get its deed, even via a delegate, until it is moved. Documented and tested as intended. Reported as a trade-off.\n\n**External checks done against mainnet via a public RPC.** The Swarm Pepe address reports name \"Swarm Pepe\", symbol SPEPE, supports the ERC-721 interface and reverts on `ownerOf` for unminted ids. The delegate registry address has code and answers the exact `checkDelegateForERC721` signature the contract calls. The mainnet OG token address is not given anywhere, so its transfer semantics remain an open operator item, not a finding.\n\n**Static-analysis leads** (two timestamp warnings, one reentrancy and one unchecked-return lead) were traced and dismissed with reasons in the coverage record. The manifest and deploy script were checked against the schema rules and the brief and hold.","treeHash":null,"usage":{"cachedInputTokens":1199929,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":31140,"runtime":"claude","turns":38,"wallClockMs":464010}},{"artifacts":[],"attempt":1,"bundleHash":"b44b8be99905af8fd2997811ecd5abc32a440a0a70b38d27d5b49c0dc748476a","device":"d13d3bb393e39302","findings":[],"hash":"d01ac5808c2678133ad7014515f263a19cb33e185cb44169f25f8f216ade0996","nodeId":"2e8cb17f-f11a-4edb-8a34-3dc081627611","outcome":"completed","summary":"Updated `launch.json` with clarified Sepolia configuration notes. Verified all five contracts, constructor arguments and dependency references against compiled ABIs.\n\nChecks passed: `forge build`, `forge test` with the supplied fuzz seed (102 tests), and `forge fmt --check`.\n\nOnly `launch.json` changed. Nothing was deployed.","treeHash":"2fee94c7254717c75fdcc87950731b8a1be92a2d","usage":{"cachedInputTokens":241708,"inputTokens":47754,"model":"gpt-6.1-sol","outputTokens":4004,"runtime":"codex","turns":3,"wallClockMs":82188}},{"artifacts":[],"attempt":1,"bundleHash":"d52ebe0cd2e8c010e73d5358d4a881636411f80c7cc576f8a04306925a1b76de","device":"2a2028177fd413f2","findings":[],"hash":"ea4fc949ab1c85de4e4e263dd495d5581d297628b5d46426634d86c956f4266c","nodeId":"375cb1b3-b3a5-4c82-8cf8-938f8662bcb5","outcome":"completed","summary":"Implemented both contracts, vendored dependencies, Sepolia mocks, deployment script, `launch.json`, and operating documentation.\n\nValidation passed:\n\n- `forge build`, including a clean offline build\n- `forge test`: 102 passed with the supplied fuzz seed, including accounting invariants\n- `forge fmt --check`\n- Manifest, constructor arguments, and runtime-size checks\n\nNo contracts were deployed or transactions broadcast.","treeHash":"3c2d3a43a11d0cd59ab9817c2c6685785c26ac6f","usage":{"cachedInputTokens":1077760,"inputTokens":87268,"model":"gpt-6-astra","outputTokens":46453,"runtime":"codex","turns":6,"wallClockMs":924845}}],"verification":[{"checks":[{"durationMs":3766,"exitCode":0,"name":"build","output":"Compiling 64 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.67s\nCompiler run successful!\n","passed":true},{"durationMs":1687,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 25 tests for test/OGClubDeeds.t.sol:OGClubDeedsTest\n[PASS] testFuzz_RoyaltyBoundsAndRounding(uint96,uint128) (runs: 512, μ: 39994, ~: 37813)\n[PASS] test_AdminHasNoSpecialMintPrivilege() (gas: 64475)\n[PASS] test_ClubExistsAfterDeedIsSoldAndPepeChangesHands() (gas: 383983)\n[PASS] test_ConstructorDoesNotRequireLiveExternalContracts() (gas: 35143)\n[PASS] test_ConstructorRejectsZeroPepeRegistryAndRoyaltyReceiver() (gas: 14853)\n[PASS] test_DefaultAndBoundedRoyalty() (gas: 171809)\n[PASS] test_DelegateCanMintToContractVault() (gas: 479458)\n[PASS] test_DelegateMintsToPepeOwnerAndPaysWithItsOwnTokens() (gas: 299398)\n[PASS] test_DelegationMustMatchCurrentOwnerCollectionIdAndZeroRights() (gas: 267122)\n[PASS] test_ERC721ApprovalDoesNotAuthorizeMint() (gas: 112240)\n[PASS] test_MetadataAndRoyaltyAreOwnerOnly() (gas: 92265)\n[PASS] test_MetadataFreezeDoesNotFreezeRoyaltySettingsOrTransfers() (gas: 347543)\n[PASS] test_NameSymbolAndInterfaces() (gas: 87598)\n[PASS] test_NonReceivingOwnerRollsBackPaymentAndEligibility() (gas: 715897)\n[PASS] test_OldOwnersDelegationCannotBeUsedAfterPepeMoves() (gas: 415196)\n[PASS] test_OwnerMintsAndEventTracksOwnerAndPayer() (gas: 240699)\n[PASS] test_PausedDeedsCanStillBeApprovedAndTraded() (gas: 469068)\n[PASS] test_RepeatedMintFailsBeforeFurtherPayment() (gas: 223789)\n[PASS] test_RevokedDelegationReverts() (gas: 182556)\n[PASS] test_StrangerCannotMintEvenWithEnoughTokens() (gas: 77002)\n[PASS] test_TransferToZeroIsNotABurn() (gas: 223645)\n[PASS] test_URIAndPermanentFreeze() (gas: 505991)\n[PASS] test_URIMustReferToMintedDeed() (gas: 12987)\n[PASS] test_UnmintedPepeCannotProduceDeed() (gas: 51956)\n[PASS] test_ZeroAndLargestPepeIdsAndURIFormatting() (gas: 525052)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 9.78ms (11.22ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:DeedsPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 408294, ~: 410006)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 30673)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 13199)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 15202)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 12916)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 12915)\n[PASS] test_ExactSplitAndNoCustody() (gas: 364124)\n[PASS] test_InitialConfiguration() (gas: 83798)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 278211)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 279055)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 368173)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 594358)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 467417)\n[PASS] test_NoticeUpperBound() (gas: 15331)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 398947)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78494)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 490646)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168839)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158297)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132128)\n[PASS] test_TwoStepOwnerHandover() (gas: 241432)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 552301)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 364580)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 219405)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 25.84ms (21.26ms CPU time)\n\nRan 7 tests for test/OGClubHouses.t.sol:OGClubHousesTest\n[PASS] test_AdminChangesCannotRemoveMembership() (gas: 350572)\n[PASS] test_BuyHouseForSelfEmitsPaymentAndMembership() (gas: 204147)\n[PASS] test_DuplicateHouseRejectedAcrossBothEntrypoints() (gas: 246196)\n[PASS] test_GiftToVaultChargesOnlyHotWalletAndEmitsBothAddresses() (gas: 320388)\n[PASS] test_GiftedWalletCannotPurchaseAnotherHouse() (gas: 200685)\n[PASS] test_PauseAlsoStopsSelfPurchaseAndUnpauseRestoresIt() (gas: 272068)\n[PASS] test_ZeroGiftRecipientRevertsBeforePayment() (gas: 60546)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 26.27ms (1.83ms CPU time)\n\nRan 4 tests for test/PriceScheduleInvariant.t.sol:PriceScheduleOracleTest\n[PASS] test_ActivatedPriceSurvivesNextAnnouncement() (gas: 309278)\n[PASS] test_OneSecondNoticeAndZeroNotice() (gas: 332899)\n[PASS] test_PurchaseAtExactQuoteBelowAndAbove() (gas: 767796)\n[PASS] test_ReplacedAnnouncementNeverActivates() (gas: 345868)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 27.06ms (944.13µs CPU time)\n\nRan 8 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_AllFiveLaunchRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 15667392)\n[PASS] test_ConstructorsWorkTogetherWithoutExternalCodeAndUseExplicitOwner() (gas: 7163188)\n[PASS] test_DeedsRejectOwnPredictedAddressAsVault() (gas: 11890)\n[PASS] test_ExplicitSepoliaConfigurationAndFaucets() (gas: 5150223)\n[PASS] test_HousesRejectOwnPredictedAddressAsVault() (gas: 8859)\n[PASS] test_RecipeRejectsMainnet() (gas: 36859)\n[PASS] test_RecipeRejectsMissingAddresses() (gas: 60779)\n[PASS] test_SafeAddressCanExerciseOwnerFunctions() (gas: 4761426)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 27.10ms (39.39ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:HousesPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 377659, ~: 379374)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 26149)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 8719)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 8722)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 8436)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 8435)\n[PASS] test_ExactSplitAndNoCustody() (gas: 333806)\n[PASS] test_InitialConfiguration() (gas: 83534)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 295245)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 296089)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 338308)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 533222)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 436715)\n[PASS] test_NoticeUpperBound() (gas: 10851)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 368315)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78400)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 460510)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168518)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158064)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132005)\n[PASS] test_TwoStepOwnerHandover() (gas: 241321)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 491431)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 329402)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 188965)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 27.11ms (20.01ms CPU time)\n\nRan 13 tests for test/AdversarialPayments.t.sol:AdversarialPaymentsTest\n[PASS] testFuzz_FeeOnTransferRollsBackBothContracts(uint96) (runs: 512, μ: 1275997, ~: 1275947)\nLogs:\n  Bound result 32052066\n\n[PASS] test_FalseReturningTokenRollsBackFirstLegOnAllEntrypoints() (gas: 1310650)\n[PASS] test_FeeOnBurnLegRejectsEveryPurchaseEntrypoint() (gas: 1523612)\n[PASS] test_FeeOnEveryTransferRejectsEveryPurchaseEntrypoint() (gas: 1531805)\n[PASS] test_FeeOnVaultLegRejectsEveryPurchaseEntrypointAndRollsBackBurn() (gas: 1527495)\n[PASS] test_NFTReceiverCannotReenterButCanTradeItsDeed() (gas: 1168958)\n[PASS] test_NoReturnTokenWorksWithExactReceipts() (gas: 926868)\n[PASS] test_SecondLegCannotUndoFirstReceipt() (gas: 1494289)\n[PASS] test_SenderSurchargeRejectsEveryPurchaseEntrypoint() (gas: 1483372)\n[PASS] test_TokenCallbackCannotReenterDeedMint() (gas: 1488196)\n[PASS] test_TokenCallbackCannotReenterGiftPurchase() (gas: 1495912)\n[PASS] test_TokenCallbackCannotReenterSelfPurchase() (gas: 1468685)\n[PASS] test_VaultCannotPayItselfAndPassExactReceiptChecks() (gas: 313828)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 30.88ms (37.05ms CPU time)\n\nRan 12 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] test_ClubExistsReportedBeforeAuthorization() (gas: 405227)\n[PASS] test_DeedOfUnmintedIdHasNoOwnerAndNoURI() (gas: 40836)\n[PASS] test_DelegationForAnotherPepeDoesNotAuthorize() (gas: 573917)\n[PASS] test_DuplicateBeatsMaxPriceButPauseBeatsEverything() (gas: 434302)\n[PASS] test_LargestPayablePriceSplitsExactlyWithoutOverflow() (gas: 308276)\n[PASS] test_PauseIsPerContract() (gas: 425906)\n[PASS] test_PendingIncreaseDoesNotChargeEarlyBuyers() (gas: 343050)\n[PASS] test_RoyaltyExactCapAndZeroAllowed() (gas: 133088)\n[PASS] test_SetPausedIsIdempotentAndOnlyEmitsOnChange() (gas: 156133)\n[PASS] test_StrangerWithTokensButTooLowLimitStillGetsPriceError() (gas: 185283)\n[PASS] test_ThirtyDayNoticeBoundaryOnDeeds() (gas: 536085)\n[PASS] test_ThirtyDayNoticeIsAcceptedAndOneSecondMoreIsNot() (gas: 33948)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 30.83ms (5.49ms CPU time)\n\nRan 1 test for test/PriceScheduleInvariant.t.sol:PriceScheduleInvariantTest\n[PASS]\nPriceScheduleInvariantTest invariants:\n[PASS] invariant_BurnPlusVaultEqualsSpentAndNoCustody\n[PASS] invariant_PendingViewMatchesAnnouncementLog\n[PASS] invariant_PriceMatchesAnnouncementLog\n PriceScheduleInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| ScheduleHandler | announce         | 1165  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| ScheduleHandler | pause            | 1170  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| ScheduleHandler | purchase         | 2392  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| ScheduleHandler | strangerAnnounce | 1162  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| ScheduleHandler | warp             | 1143  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| ScheduleHandler | warpToBoundary   | 1160  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.57s (1.57s CPU time)\n\nRan 1 test for test/PaymentsInvariant.t.sol:PaymentsInvariantTest\n[PASS]\nPaymentsInvariantTest invariants:\n[PASS] invariant_BurnPlusVaultEqualsActualPayerSpending\n[PASS] invariant_ClubEligibilityStaysConsumedAfterTrading\n[PASS] invariant_HousesArePermanentAndCountedOnce\n[PASS] invariant_PurchasesNeverLeaveTokensInEitherContract\n PaymentsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| PaymentHandler | advanceTime  | 1129  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | buyHouse     | 1187  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | mintClub     | 1144  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPause     | 1189  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPrices    | 1177  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferDeed | 1176  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferPepe | 1190  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.59s (1.59s CPU time)\n\nRan 10 test suites in 1.59s (3.37s CPU time): 119 tests passed, 0 failed, 0 skipped (119 total tests)\n","passed":true},{"durationMs":53,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubDeeds.acceptOwnership()\",\"OGClubDeeds.approve(address,uint256)\",\"OGClubDeeds.freezeMetadata()\",\"OGClubDeeds.mint(uint256,uint256)\",\"OGClubDeeds.renounceOwnership()\",\"OGClubDeeds.safeTransferFrom(address,address,uint256)\",\"OGClubDeeds.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubDeeds.setApprovalForAll(address,bool)\",\"OGClubDeeds.setBaseURI(string)\",\"OGClubDeeds.setPaused(bool)\",\"OGClubDeeds.setPrice(uint256)\",\"OGClubDeeds.setRoyalty(address,uint96)\",\"OGClubDeeds.transferFrom(address,address,uint256)\",\"OGClubDeeds.transferOwnership(address)\",\"OGClubHouses.acceptOwnership()\",\"OGClubHouses.buyHouse(uint256)\",\"OGClubHouses.buyHouseFor(address,uint256)\",\"OGClubHouses.renounceOwnership()\",\"OGClubHouses.setPaused(bool)\",\"OGClubHouses.setPrice(uint256)\",\"OGClubHouses.transferOwnership(address)\"],\"files\":{\".gitignore\":5,\"LICENSE\":22,\"README.md\":268,\"foundry.toml\":25,\"launch.json\":42,\"remappings.txt\":3,\"script/Deploy.s.sol\":67,\"src/OGClubDeeds.sol\":133,\"src/OGClubHouses.sol\":53,\"src/OGClubPayments.sol\":135,\"src/interfaces/IDelegateRegistry.sol\":18,\"src/mocks/MockDelegateRegistry.sol\":48,\"src/mocks/MockOG.sol\":20,\"src/mocks/MockSwarmPepe.sol\":16,\"test/AdversarialPayments.t.sol\":285,\"test/Deploy.t.sol\":144,\"test/EdgeCases.t.sol\":227,\"test/OGClubDeeds.t.sol\":386,\"test/OGClubHouses.t.sol\":115,\"test/PaymentsInvariant.t.sol\":223,\"test/PriceScheduleInvariant.t.sol\":298,\"test/SharedPayments.t.sol\":407,\"test/mocks/AdversarialTokens.sol\":121},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"193bae5034e24340088e9c4676e094974500e9d87386ca51f171f1afbb874af1","verifiedTreeHash":"503a978fb8a5ddf8ef8c246cefc1ac5eafdd9c53","verifierVersion":"0.1.0+5921f9e9"},{"checks":[{"durationMs":2990,"exitCode":0,"name":"build","output":"Compiling 62 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.91s\nCompiler run successful!\n","passed":true},{"durationMs":1598,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/OGClubHouses.t.sol:OGClubHousesTest\n[PASS] test_AdminChangesCannotRemoveMembership() (gas: 350572)\n[PASS] test_BuyHouseForSelfEmitsPaymentAndMembership() (gas: 204147)\n[PASS] test_DuplicateHouseRejectedAcrossBothEntrypoints() (gas: 246196)\n[PASS] test_GiftToVaultChargesOnlyHotWalletAndEmitsBothAddresses() (gas: 320388)\n[PASS] test_GiftedWalletCannotPurchaseAnotherHouse() (gas: 200685)\n[PASS] test_PauseAlsoStopsSelfPurchaseAndUnpauseRestoresIt() (gas: 272068)\n[PASS] test_ZeroGiftRecipientRevertsBeforePayment() (gas: 60546)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.59ms (1.83ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:HousesPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 377695, ~: 379374)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 26149)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 8719)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 8722)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 8436)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 8435)\n[PASS] test_ExactSplitAndNoCustody() (gas: 333806)\n[PASS] test_InitialConfiguration() (gas: 83534)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 295245)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 296089)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 338308)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 533222)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 436715)\n[PASS] test_NoticeUpperBound() (gas: 10851)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 368315)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78400)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 460510)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168518)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158064)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132005)\n[PASS] test_TwoStepOwnerHandover() (gas: 241321)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 491431)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 329402)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 188965)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 24.09ms (22.62ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:DeedsPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 408330, ~: 410006)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 30673)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 13199)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 15202)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 12916)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 12915)\n[PASS] test_ExactSplitAndNoCustody() (gas: 364124)\n[PASS] test_InitialConfiguration() (gas: 83798)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 278211)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 279055)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 368173)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 594358)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 467417)\n[PASS] test_NoticeUpperBound() (gas: 15331)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 398947)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78494)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 490646)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168839)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158297)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132128)\n[PASS] test_TwoStepOwnerHandover() (gas: 241432)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 552301)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 364580)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 219405)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 24.21ms (23.42ms CPU time)\n\nRan 25 tests for test/OGClubDeeds.t.sol:OGClubDeedsTest\n[PASS] testFuzz_RoyaltyBoundsAndRounding(uint96,uint128) (runs: 512, μ: 39994, ~: 37813)\n[PASS] test_AdminHasNoSpecialMintPrivilege() (gas: 64475)\n[PASS] test_ClubExistsAfterDeedIsSoldAndPepeChangesHands() (gas: 383983)\n[PASS] test_ConstructorDoesNotRequireLiveExternalContracts() (gas: 35143)\n[PASS] test_ConstructorRejectsZeroPepeRegistryAndRoyaltyReceiver() (gas: 14853)\n[PASS] test_DefaultAndBoundedRoyalty() (gas: 171809)\n[PASS] test_DelegateCanMintToContractVault() (gas: 479458)\n[PASS] test_DelegateMintsToPepeOwnerAndPaysWithItsOwnTokens() (gas: 299398)\n[PASS] test_DelegationMustMatchCurrentOwnerCollectionIdAndZeroRights() (gas: 267122)\n[PASS] test_ERC721ApprovalDoesNotAuthorizeMint() (gas: 112240)\n[PASS] test_MetadataAndRoyaltyAreOwnerOnly() (gas: 92265)\n[PASS] test_MetadataFreezeDoesNotFreezeRoyaltySettingsOrTransfers() (gas: 347543)\n[PASS] test_NameSymbolAndInterfaces() (gas: 87598)\n[PASS] test_NonReceivingOwnerRollsBackPaymentAndEligibility() (gas: 715897)\n[PASS] test_OldOwnersDelegationCannotBeUsedAfterPepeMoves() (gas: 415196)\n[PASS] test_OwnerMintsAndEventTracksOwnerAndPayer() (gas: 240699)\n[PASS] test_PausedDeedsCanStillBeApprovedAndTraded() (gas: 469068)\n[PASS] test_RepeatedMintFailsBeforeFurtherPayment() (gas: 223789)\n[PASS] test_RevokedDelegationReverts() (gas: 182556)\n[PASS] test_StrangerCannotMintEvenWithEnoughTokens() (gas: 77002)\n[PASS] test_TransferToZeroIsNotABurn() (gas: 223645)\n[PASS] test_URIAndPermanentFreeze() (gas: 505991)\n[PASS] test_URIMustReferToMintedDeed() (gas: 12987)\n[PASS] test_UnmintedPepeCannotProduceDeed() (gas: 51956)\n[PASS] test_ZeroAndLargestPepeIdsAndURIFormatting() (gas: 525052)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 24.43ms (22.39ms CPU time)\n\nRan 8 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_AllFiveLaunchRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 15667392)\n[PASS] test_ConstructorsWorkTogetherWithoutExternalCodeAndUseExplicitOwner() (gas: 7163188)\n[PASS] test_DeedsRejectOwnPredictedAddressAsVault() (gas: 11890)\n[PASS] test_ExplicitSepoliaConfigurationAndFaucets() (gas: 5150223)\n[PASS] test_HousesRejectOwnPredictedAddressAsVault() (gas: 8859)\n[PASS] test_RecipeRejectsMainnet() (gas: 36859)\n[PASS] test_RecipeRejectsMissingAddresses() (gas: 60779)\n[PASS] test_SafeAddressCanExerciseOwnerFunctions() (gas: 4761426)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 25.58ms (51.31ms CPU time)\n\nRan 13 tests for test/AdversarialPayments.t.sol:AdversarialPaymentsTest\n[PASS] testFuzz_FeeOnTransferRollsBackBothContracts(uint96) (runs: 512, μ: 1275997, ~: 1275947)\nLogs:\n  Bound result 368\n\n[PASS] test_FalseReturningTokenRollsBackFirstLegOnAllEntrypoints() (gas: 1310650)\n[PASS] test_FeeOnBurnLegRejectsEveryPurchaseEntrypoint() (gas: 1523612)\n[PASS] test_FeeOnEveryTransferRejectsEveryPurchaseEntrypoint() (gas: 1531805)\n[PASS] test_FeeOnVaultLegRejectsEveryPurchaseEntrypointAndRollsBackBurn() (gas: 1527495)\n[PASS] test_NFTReceiverCannotReenterButCanTradeItsDeed() (gas: 1168958)\n[PASS] test_NoReturnTokenWorksWithExactReceipts() (gas: 926868)\n[PASS] test_SecondLegCannotUndoFirstReceipt() (gas: 1494289)\n[PASS] test_SenderSurchargeRejectsEveryPurchaseEntrypoint() (gas: 1483372)\n[PASS] test_TokenCallbackCannotReenterDeedMint() (gas: 1488196)\n[PASS] test_TokenCallbackCannotReenterGiftPurchase() (gas: 1495912)\n[PASS] test_TokenCallbackCannotReenterSelfPurchase() (gas: 1468685)\n[PASS] test_VaultCannotPayItselfAndPassExactReceiptChecks() (gas: 313828)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 31.00ms (37.00ms CPU time)\n\nRan 1 test for test/PaymentsInvariant.t.sol:PaymentsInvariantTest\n[PASS]\nPaymentsInvariantTest invariants:\n[PASS] invariant_BurnPlusVaultEqualsActualPayerSpending\n[PASS] invariant_ClubEligibilityStaysConsumedAfterTrading\n[PASS] invariant_HousesArePermanentAndCountedOnce\n[PASS] invariant_PurchasesNeverLeaveTokensInEitherContract\n PaymentsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| PaymentHandler | advanceTime  | 1129  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | buyHouse     | 1187  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | mintClub     | 1144  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPause     | 1189  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPrices    | 1177  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferDeed | 1176  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferPepe | 1190  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.50s (1.50s CPU time)\n\nRan 7 test suites in 1.51s (1.65s CPU time): 102 tests passed, 0 failed, 0 skipped (102 total tests)\n","passed":true},{"durationMs":56,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubDeeds.acceptOwnership()\",\"OGClubDeeds.approve(address,uint256)\",\"OGClubDeeds.freezeMetadata()\",\"OGClubDeeds.mint(uint256,uint256)\",\"OGClubDeeds.renounceOwnership()\",\"OGClubDeeds.safeTransferFrom(address,address,uint256)\",\"OGClubDeeds.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubDeeds.setApprovalForAll(address,bool)\",\"OGClubDeeds.setBaseURI(string)\",\"OGClubDeeds.setPaused(bool)\",\"OGClubDeeds.setPrice(uint256)\",\"OGClubDeeds.setRoyalty(address,uint96)\",\"OGClubDeeds.transferFrom(address,address,uint256)\",\"OGClubDeeds.transferOwnership(address)\",\"OGClubHouses.acceptOwnership()\",\"OGClubHouses.buyHouse(uint256)\",\"OGClubHouses.buyHouseFor(address,uint256)\",\"OGClubHouses.renounceOwnership()\",\"OGClubHouses.setPaused(bool)\",\"OGClubHouses.setPrice(uint256)\",\"OGClubHouses.transferOwnership(address)\"],\"files\":{\".gitignore\":5,\"LICENSE\":22,\"README.md\":268,\"foundry.toml\":25,\"launch.json\":42,\"remappings.txt\":3,\"script/Deploy.s.sol\":67,\"src/OGClubDeeds.sol\":133,\"src/OGClubHouses.sol\":53,\"src/OGClubPayments.sol\":135,\"src/interfaces/IDelegateRegistry.sol\":18,\"src/mocks/MockDelegateRegistry.sol\":48,\"src/mocks/MockOG.sol\":20,\"src/mocks/MockSwarmPepe.sol\":16,\"test/AdversarialPayments.t.sol\":285,\"test/Deploy.t.sol\":144,\"test/OGClubDeeds.t.sol\":386,\"test/OGClubHouses.t.sol\":115,\"test/PaymentsInvariant.t.sol\":223,\"test/SharedPayments.t.sol\":407,\"test/mocks/AdversarialTokens.sol\":121},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d01ac5808c2678133ad7014515f263a19cb33e185cb44169f25f8f216ade0996","verifiedTreeHash":"2fee94c7254717c75fdcc87950731b8a1be92a2d","verifierVersion":"0.1.0+5921f9e9"},{"checks":[{"durationMs":5122,"exitCode":0,"name":"build","output":"Compiling 62 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.98s\nCompiler run successful!\n","passed":true},{"durationMs":2291,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 25 tests for test/OGClubDeeds.t.sol:OGClubDeedsTest\n[PASS] testFuzz_RoyaltyBoundsAndRounding(uint96,uint128) (runs: 512, μ: 39994, ~: 37813)\n[PASS] test_AdminHasNoSpecialMintPrivilege() (gas: 64475)\n[PASS] test_ClubExistsAfterDeedIsSoldAndPepeChangesHands() (gas: 383983)\n[PASS] test_ConstructorDoesNotRequireLiveExternalContracts() (gas: 35143)\n[PASS] test_ConstructorRejectsZeroPepeRegistryAndRoyaltyReceiver() (gas: 14853)\n[PASS] test_DefaultAndBoundedRoyalty() (gas: 171809)\n[PASS] test_DelegateCanMintToContractVault() (gas: 479458)\n[PASS] test_DelegateMintsToPepeOwnerAndPaysWithItsOwnTokens() (gas: 299398)\n[PASS] test_DelegationMustMatchCurrentOwnerCollectionIdAndZeroRights() (gas: 267122)\n[PASS] test_ERC721ApprovalDoesNotAuthorizeMint() (gas: 112240)\n[PASS] test_MetadataAndRoyaltyAreOwnerOnly() (gas: 92265)\n[PASS] test_MetadataFreezeDoesNotFreezeRoyaltySettingsOrTransfers() (gas: 347543)\n[PASS] test_NameSymbolAndInterfaces() (gas: 87598)\n[PASS] test_NonReceivingOwnerRollsBackPaymentAndEligibility() (gas: 715897)\n[PASS] test_OldOwnersDelegationCannotBeUsedAfterPepeMoves() (gas: 415196)\n[PASS] test_OwnerMintsAndEventTracksOwnerAndPayer() (gas: 240699)\n[PASS] test_PausedDeedsCanStillBeApprovedAndTraded() (gas: 469068)\n[PASS] test_RepeatedMintFailsBeforeFurtherPayment() (gas: 223789)\n[PASS] test_RevokedDelegationReverts() (gas: 182556)\n[PASS] test_StrangerCannotMintEvenWithEnoughTokens() (gas: 77002)\n[PASS] test_TransferToZeroIsNotABurn() (gas: 223645)\n[PASS] test_URIAndPermanentFreeze() (gas: 505991)\n[PASS] test_URIMustReferToMintedDeed() (gas: 12987)\n[PASS] test_UnmintedPepeCannotProduceDeed() (gas: 51956)\n[PASS] test_ZeroAndLargestPepeIdsAndURIFormatting() (gas: 525052)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 26.52ms (21.02ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:HousesPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 377695, ~: 379374)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 26149)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 8719)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 8722)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 8436)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 8435)\n[PASS] test_ExactSplitAndNoCustody() (gas: 333806)\n[PASS] test_InitialConfiguration() (gas: 83534)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 295245)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 296089)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 338308)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 533222)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 436715)\n[PASS] test_NoticeUpperBound() (gas: 10851)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 368315)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78400)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 460510)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168518)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158064)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132005)\n[PASS] test_TwoStepOwnerHandover() (gas: 241321)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 491431)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 329402)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 188965)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 29.65ms (36.81ms CPU time)\n\nRan 8 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_AllFiveLaunchRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 15667392)\n[PASS] test_ConstructorsWorkTogetherWithoutExternalCodeAndUseExplicitOwner() (gas: 7163188)\n[PASS] test_DeedsRejectOwnPredictedAddressAsVault() (gas: 11890)\n[PASS] test_ExplicitSepoliaConfigurationAndFaucets() (gas: 5150223)\n[PASS] test_HousesRejectOwnPredictedAddressAsVault() (gas: 8859)\n[PASS] test_RecipeRejectsMainnet() (gas: 36859)\n[PASS] test_RecipeRejectsMissingAddresses() (gas: 60779)\n[PASS] test_SafeAddressCanExerciseOwnerFunctions() (gas: 4761426)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 38.70ms (73.49ms CPU time)\n\nRan 24 tests for test/SharedPayments.t.sol:DeedsPaymentsTest\n[PASS] testFuzz_ExactSplit(uint128) (runs: 512, μ: 408330, ~: 410006)\n[PASS] test_ConstructorDoesNotCallTokenOrVault() (gas: 30673)\n[PASS] test_ConstructorRejectsBurnAddressAsVault() (gas: 13199)\n[PASS] test_ConstructorRejectsZeroOwner() (gas: 15202)\n[PASS] test_ConstructorRejectsZeroToken() (gas: 12916)\n[PASS] test_ConstructorRejectsZeroVault() (gas: 12915)\n[PASS] test_ExactSplitAndNoCustody() (gas: 364124)\n[PASS] test_InitialConfiguration() (gas: 83798)\n[PASS] test_InsufficientAllowanceOnSecondLegRollsBackFirstLeg() (gas: 278211)\n[PASS] test_InsufficientBalanceOnSecondLegRollsBackFirstLeg() (gas: 279055)\n[PASS] test_MaxPriceFailureDoesNotSpendOrGrant() (gas: 368173)\n[PASS] test_NoticeExactBoundaryAndPurchasesOnBothSides() (gas: 594358)\n[PASS] test_NoticeKeepsRunningWhilePaused() (gas: 467417)\n[PASS] test_NoticeUpperBound() (gas: 15331)\n[PASS] test_OddPriceRemainderGoesToVault() (gas: 398947)\n[PASS] test_OnlyOwnerChangesPriceOrPause() (gas: 78494)\n[PASS] test_PauseAndUnpauseRestorePurchases() (gas: 490646)\n[PASS] test_ReplacedAnnouncementRestartsNotice() (gas: 168839)\n[PASS] test_ReschedulingAtActivatedBoundaryPreservesEffectivePrice() (gas: 158297)\n[PASS] test_ReschedulingLongAfterActivationPreservesEffectivePrice() (gas: 132128)\n[PASS] test_TwoStepOwnerHandover() (gas: 241432)\n[PASS] test_ZeroAndOneWeiPrices() (gas: 552301)\n[PASS] test_ZeroNoticeImmediateEvenAtTimestampZero() (gas: 364580)\n[PASS] test_ZeroPriceAnnouncementIsNotMistakenForNoPendingChange() (gas: 219405)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 40.90ms (27.59ms CPU time)\n\nRan 7 tests for test/OGClubHouses.t.sol:OGClubHousesTest\n[PASS] test_AdminChangesCannotRemoveMembership() (gas: 350572)\n[PASS] test_BuyHouseForSelfEmitsPaymentAndMembership() (gas: 204147)\n[PASS] test_DuplicateHouseRejectedAcrossBothEntrypoints() (gas: 246196)\n[PASS] test_GiftToVaultChargesOnlyHotWalletAndEmitsBothAddresses() (gas: 320388)\n[PASS] test_GiftedWalletCannotPurchaseAnotherHouse() (gas: 200685)\n[PASS] test_PauseAlsoStopsSelfPurchaseAndUnpauseRestoresIt() (gas: 272068)\n[PASS] test_ZeroGiftRecipientRevertsBeforePayment() (gas: 60546)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 41.01ms (3.15ms CPU time)\n\nRan 13 tests for test/AdversarialPayments.t.sol:AdversarialPaymentsTest\n[PASS] testFuzz_FeeOnTransferRollsBackBothContracts(uint96) (runs: 512, μ: 1275997, ~: 1275947)\nLogs:\n  Bound result 23294639797497798220\n\n[PASS] test_FalseReturningTokenRollsBackFirstLegOnAllEntrypoints() (gas: 1310650)\n[PASS] test_FeeOnBurnLegRejectsEveryPurchaseEntrypoint() (gas: 1523612)\n[PASS] test_FeeOnEveryTransferRejectsEveryPurchaseEntrypoint() (gas: 1531805)\n[PASS] test_FeeOnVaultLegRejectsEveryPurchaseEntrypointAndRollsBackBurn() (gas: 1527495)\n[PASS] test_NFTReceiverCannotReenterButCanTradeItsDeed() (gas: 1168958)\n[PASS] test_NoReturnTokenWorksWithExactReceipts() (gas: 926868)\n[PASS] test_SecondLegCannotUndoFirstReceipt() (gas: 1494289)\n[PASS] test_SenderSurchargeRejectsEveryPurchaseEntrypoint() (gas: 1483372)\n[PASS] test_TokenCallbackCannotReenterDeedMint() (gas: 1488196)\n[PASS] test_TokenCallbackCannotReenterGiftPurchase() (gas: 1495912)\n[PASS] test_TokenCallbackCannotReenterSelfPurchase() (gas: 1468685)\n[PASS] test_VaultCannotPayItselfAndPassExactReceiptChecks() (gas: 313828)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 55.02ms (66.05ms CPU time)\n\nRan 1 test for test/PaymentsInvariant.t.sol:PaymentsInvariantTest\n[PASS]\nPaymentsInvariantTest invariants:\n[PASS] invariant_BurnPlusVaultEqualsActualPayerSpending\n[PASS] invariant_ClubEligibilityStaysConsumedAfterTrading\n[PASS] invariant_HousesArePermanentAndCountedOnce\n[PASS] invariant_PurchasesNeverLeaveTokensInEitherContract\n PaymentsInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| PaymentHandler | advanceTime  | 1129  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | buyHouse     | 1187  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | mintClub     | 1144  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPause     | 1189  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | setPrices    | 1177  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferDeed | 1176  | 0       | 0        |\n|----------------+--------------+-------+---------+----------|\n| PaymentHandler | transferPepe | 1190  | 0       | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.16s (2.15s CPU time)\n\nRan 7 test suites in 2.16s (2.39s CPU time): 102 tests passed, 0 failed, 0 skipped (102 total tests)\n","passed":true},{"durationMs":82,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OGClubDeeds.acceptOwnership()\",\"OGClubDeeds.approve(address,uint256)\",\"OGClubDeeds.freezeMetadata()\",\"OGClubDeeds.mint(uint256,uint256)\",\"OGClubDeeds.renounceOwnership()\",\"OGClubDeeds.safeTransferFrom(address,address,uint256)\",\"OGClubDeeds.safeTransferFrom(address,address,uint256,bytes)\",\"OGClubDeeds.setApprovalForAll(address,bool)\",\"OGClubDeeds.setBaseURI(string)\",\"OGClubDeeds.setPaused(bool)\",\"OGClubDeeds.setPrice(uint256)\",\"OGClubDeeds.setRoyalty(address,uint96)\",\"OGClubDeeds.transferFrom(address,address,uint256)\",\"OGClubDeeds.transferOwnership(address)\",\"OGClubHouses.acceptOwnership()\",\"OGClubHouses.buyHouse(uint256)\",\"OGClubHouses.buyHouseFor(address,uint256)\",\"OGClubHouses.renounceOwnership()\",\"OGClubHouses.setPaused(bool)\",\"OGClubHouses.setPrice(uint256)\",\"OGClubHouses.transferOwnership(address)\"],\"files\":{\".gitignore\":5,\"LICENSE\":22,\"README.md\":268,\"foundry.toml\":25,\"launch.json\":42,\"remappings.txt\":3,\"script/Deploy.s.sol\":67,\"src/OGClubDeeds.sol\":133,\"src/OGClubHouses.sol\":53,\"src/OGClubPayments.sol\":135,\"src/interfaces/IDelegateRegistry.sol\":18,\"src/mocks/MockDelegateRegistry.sol\":48,\"src/mocks/MockOG.sol\":20,\"src/mocks/MockSwarmPepe.sol\":16,\"test/AdversarialPayments.t.sol\":285,\"test/Deploy.t.sol\":144,\"test/OGClubDeeds.t.sol\":386,\"test/OGClubHouses.t.sol\":115,\"test/PaymentsInvariant.t.sol\":223,\"test/SharedPayments.t.sol\":407,\"test/mocks/AdversarialTokens.sol\":121},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3463,"exitCode":0,"name":"slither","output":"[low/medium] timestamp at src/OGClubPayments.sol:65: OGClubPayments.price() (src/OGClubPayments.sol#65-68) uses timestamp for comparisons\n[low/medium] timestamp at src/OGClubPayments.sol:72: OGClubPayments.pendingPrice() (src/OGClubPayments.sol#72-75) uses timestamp for comparisons","passed":true},{"durationMs":689,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/OGClubDeeds.sol:83: Reentrancy: State change after external call (2 places)\n[low] centralization-risk at src/OGClubDeeds.sol:99: Centralization Risk (6 places)\n[low] push-zero-opcode at src/OGClubDeeds.sol:2: PUSH0 Opcode (7 places)\n[low] unchecked-return at src/OGClubDeeds.sol:124: Unchecked Return\n[low] unspecific-solidity-pragma at src/OGClubDeeds.sol:2: Unspecific Solidity Pragma (7 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ea4fc949ab1c85de4e4e263dd495d5581d297628b5d46426634d86c956f4266c","verifiedTreeHash":"3c2d3a43a11d0cd59ab9817c2c6685785c26ac6f","verifierVersion":"0.1.0+5921f9e9"}]}