{"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":"3d06ba1a-acd4-47b4-8569-cdd4448e2ceb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"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":"ready"},{"acceptedSubmissionHash":"88fae829ae23d0fca53e4c1d264489c5435e460d5f692cbb133fed01932e5c52","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":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"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":"ready"},{"acceptedSubmissionHash":null,"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":"ready"},{"acceptedSubmissionHash":"3e0dbbb11a3cb4f0b28695d6e0f9be077804dab089a9328569f968eb99032781","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":"fd527965bcce2600ff192e29f426d32dd86642e50f6d1906fd233f0594fa8a63","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Blacklamp (LAMP).\nToken name: Blacklamp\nToken symbol: LAMP\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: Launch BLACKLAMP on Ethereum mainnet, FREE1376-style hook, not a Community Coin. Fixed supply, 18 decimals. No owner, mint, pause, upgrade, or sweep. No transfer tax. 90% seeds the ETH pool, 10% to swarm, requester 0.\n\nUniswap v4 ETH pair only. 2% of ETH side stays in the hook. No fee elsewhere. No withdraw, no admin. Failed buy reverts.\n\n1% buys IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 to 0x000000000000000000000000000000000000dEaD. 1% buys the cheapest Identity.md seat 0x0000ec93127baa929e58e97dd0095a2bfb38ec1d via a Seaport listing anyone submits, to dead in the same tx. Reject above floor. Caller pays gas.\n\n8-hour nights, 99 max. Hold through dawn for a non-transferable stamp. Sell removes it. 3 nights = wick = 2 votes. One swarm NFT per night to queue front. No qualifier burns that mint. One per address.\n\nVote in last hour. 1 lamp 1 vote, referral adds at most 1. Pass: 50 lamps and 60%. Options: next alley, collector or thief. Pepe cannot vote or change fees. Referral is the buy address. Held at dawn mints one guide stamp. No self or same-funding referral.\n\nIPFS site: Pepe, green frog, magenta lips, orange imd robe, lantern. Show fees, burned IMD, buried seats, ETH to floor, current night. No admin. Foundry tests for split, dead transfers, no withdraw, one NFT, vote thresholds. One factory tx, this pool is the launch pool.","parentJobId":null,"planHash":"f554868f51d430a3dd40f66cda732239f65a4604ca97a00e86b40d8a1b3b3878","previousHash":"94957d60127d9d043b4904cf6edea1516cf8c265e08dbeef9ec51a7c083422cf","projectId":"3d06ba1a-acd4-47b4-8569-cdd4448e2ceb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-958-blacklamp"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51009","feedbackHash":"8501ed5c3bd1d4af82f3b71dff8cd256020d97cf7aca69b5d7c4af25be8232ee","nodeKey":"audit_flow","submissionHash":"88fae829ae23d0fca53e4c1d264489c5435e460d5f692cbb133fed01932e5c52","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51290","feedbackHash":"9cf594b233148b2f90dd4780c4f65fdcb525d45107946f88c72179b52134feb2","nodeKey":"write_foundry_tests","submissionHash":"fd527965bcce2600ff192e29f426d32dd86642e50f6d1906fd233f0594fa8a63","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d8e7fa4f83a09cff5a74767fdff0a425bd341bbe88aa0ad2480a4ad3385aa648","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6d18805b99aeb48a","findings":[],"hash":"1b587035f8de40d5792d8ad3b83bb8a5c776dde24a0d41b428b2a2549ea0ba3e","nodeId":"bc391b88-d82c-47f0-9232-9a1960b9d953","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"gpt-6-astra","outputTokens":0,"runtime":"codex","turns":4,"wallClockMs":305718}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"76ce625b2d0c8171","findings":[],"hash":"32d29fb6df27ab6fb5b3c18fe721bf92c746207b6dddd09d89224e5c08f4ba1b","nodeId":"01b6bd03-e299-4e33-98c7-04035b388ae3","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"gpt-6-astra","outputTokens":0,"runtime":"codex","turns":4,"wallClockMs":427149}},{"artifacts":[],"attempt":2,"bundleHash":"29988f086fb103cdc69156bf79a78ae2a1e50287ba356f2b04e4677aa841d8e8","device":"c5f970da1a0cc219","findings":[],"hash":"3e0dbbb11a3cb4f0b28695d6e0f9be077804dab089a9328569f968eb99032781","nodeId":"42fac5e4-d47d-41c1-b411-159edc5ea0b0","outcome":"completed","summary":"Implemented the contracts, atomic launch tooling, vendored dependencies, and IPFS-ready site. Fixed the rejected arbitrary-payer callback.\n\nPassed `forge build`, 38 Solidity tests, 2 tooling tests, and `forge fmt --check`. Slither reports no high findings.\n\nDeployment inputs and floor/referral assumptions are documented in [README.md](/home/seat/.identitymd/work/3d06ba1a-acd4-47b4-8569-cdd4448e2ceb/42fac5e4-d47d-41c1-b411-159edc5ea0b0/README.md). No transactions were broadcast.","treeHash":"bd829c858ffb011a612e8cd0680cb5ec22da7552","usage":{"cachedInputTokens":4371072,"inputTokens":146443,"model":"gpt-6-astra","outputTokens":64894,"runtime":"codex","turns":9,"wallClockMs":1895286}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"78362912813d42a5","findings":[],"hash":"6ac59166878acf5d3e6bb58ddfedc917a16b6cbed2c5de3e618fdc6200bba25b","nodeId":"42e19dc0-044d-4012-8fac-88a304265dfa","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"gpt-6-astra","outputTokens":0,"runtime":"codex","turns":2,"wallClockMs":150469}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"88cc3b0a22556b9a","findings":[{"citation":"resolved","description":"prune removes an order from the heap without clearing listings[hash].active or activeOrder[tokenId]. Loss of approval or temporary transfer of the NFT is reversible, so after approval/ownership returns isLive(hash) becomes true even though floor can never find the order. An expensive order may then pass both SeatBook.buySeat and BlacklampHook.buySeat despite a cheaper submitted order being reported live. Resubmitting the removed signed order reverts as duplicate listing; a different order at the same price reverts as replacement not cheaper. Deactivate removed orders and clear the matching activeOrder pointer, allowing a restored listing to be submitted and indexed again.","line":119,"path":"src/SeatBook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SeatBook} from \"src/SeatBook.sol\";\nimport {ISeaport, Order, OrderParameters, OfferItem, ConsiderationItem} from \"src/SeaportTypes.sol\";\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\n\ncontract PrunedListingRegressionTest is Test {\n    address constant SEAT = 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D;\n    address constant PORT = address(0x5151);\n    address constant SELLER = address(0xA);\n    bytes32 constant HASH = bytes32(uint256(1));\n\n    function testRestoredPrunedOrderCanBeResubmitted() public {\n        vm.warp(1800000000);\n        // Only model external venue responses; SeatBook's storage and heap are real.\n        vm.etch(PORT, hex\"00\");\n        vm.etch(SEAT, hex\"00\");\n        SeatBook book = new SeatBook(ISeaport(PORT));\n        vm.mockCall(PORT, abi.encodeWithSelector(ISeaport.getCounter.selector), abi.encode(uint256(0)));\n        vm.mockCall(PORT, abi.encodeWithSelector(ISeaport.validate.selector), abi.encode(true));\n        vm.mockCall(PORT, abi.encodeWithSelector(ISeaport.getOrderHash.selector), abi.encode(HASH));\n        vm.mockCall(PORT, abi.encodeWithSelector(ISeaport.getOrderStatus.selector),\n            abi.encode(true, false, uint256(0), uint256(0)));\n        vm.mockCall(SEAT, abi.encodeWithSelector(IERC721.ownerOf.selector, uint256(1)), abi.encode(SELLER));\n        bytes memory approvalQuery = abi.encodeWithSelector(IERC721.isApprovedForAll.selector, SELLER, PORT);\n        vm.mockCall(SEAT, approvalQuery, abi.encode(true));\n        vm.mockCall(SEAT, abi.encodeWithSelector(IERC721.getApproved.selector, uint256(1)), abi.encode(address(0)));\n\n        OfferItem[] memory offer = new OfferItem[](1);\n        offer[0] = OfferItem(2, SEAT, 1, 1, 1);\n        ConsiderationItem[] memory consideration = new ConsiderationItem[](1);\n        consideration[0] = ConsiderationItem(0, address(0), 0, 0.005 ether, 0.005 ether, payable(SELLER));\n        Order memory order = Order(OrderParameters(SELLER, address(0), offer, consideration, 0,\n            block.timestamp, block.timestamp + 7 days, 0, 1, 0, 1), hex\"1234\");\n        assertEq(book.submitListing(order), HASH);\n\n        // Seller temporarily revokes approval while ownership, order and counter stay unchanged.\n        vm.mockCall(SEAT, approvalQuery, abi.encode(false));\n        assertFalse(book.isLive(HASH));\n        book.prune(1);\n        assertEq(book.listingCount(), 0);\n        vm.mockCall(SEAT, approvalQuery, abi.encode(true));\n\n        // Expected: a keeper can restore the executable signed listing to the book.\n        // Current code reverts here with \"duplicate listing\" because prune left active=true.\n        assertEq(book.submitListing(order), HASH);\n        assertEq(book.listingCount(), 1);\n        (bytes32 floorHash, uint256 floorPrice) = book.floor();\n        assertEq(floorHash, HASH);\n        assertEq(floorPrice, 0.005 ether);\n    }\n}","reproduction":"At timestamp 1800000000, submit valid full/open Seaport order A for seat #1 from seller 0x000000000000000000000000000000000000000a, price 5000000000000000 wei, endTime 1800604800, conduitKey=0, seller approves Seaport directly. Submit order B for seat #2 from seller 0x000000000000000000000000000000000000000b for 10000000000000000 wei with the same timing/type. Neither order is cancelled or filled and both counters remain unchanged. Seller A revokes the Seaport approval; anyone calls prune(1), removing A. Seller A restores approval without changing the signed order. Actual: isLive(A)=true but floor() returns B at 0.01 ETH rather than A at 0.005 ETH. With at least 0.01 ETH seatBudget, hook.buySeat(B,0.01 ether) passes the floor check and pays twice the live cheapest submitted price. submitListing(A) also reverts duplicate listing, preventing a keeper from restoring its heap entry. Expected: pruning must not leave an active, live but unindexed order, and a removed order that becomes executable again must be resubmittable. Locally reproduced using faithful getCounter/getOrderStatus/approval/owner return values: forge test --match-path test/scratch/ControlFlowReview.t.sol -vv failed its floor assertion (B != A) and its resubmission test (duplicate listing). The attached self-contained regression was separately run with forge test --match-path test/scratch/PrunedListingRegression.t.sol -vv and failed with duplicate listing. Clearing the active flag when pruning allows this restoration test to reach and verify the recovered floor.","severity":"medium","snippet":"        for (uint256 i = 0; i < maxSteps && heap.length > 0; ++i) {\n            if (isLive(heap[0])) break;\n            bytes32 stale = _pop();\n            emit Pruned(stale);\n        }","title":"Pruning leaves active orders outside the heap, breaking floor selection and resubmission"}],"hash":"88fae829ae23d0fca53e4c1d264489c5435e460d5f692cbb133fed01932e5c52","nodeId":"9abd293b-afba-46b6-92f9-3db5567c755c","outcome":"completed","summary":"Recorded one medium finding in [.imd-findings.json](/home/imd1/.identitymd/work/3d06ba1a-acd4-47b4-8569-cdd4448e2ceb/9abd293b-afba-46b6-92f9-3db5567c755c/.imd-findings.json): pruned listings remain active, breaking floor selection and resubmission.\n\nCovered launch, swap callbacks, fee purchases, night settlement, referrals, voting, and helpers. All 38 existing Foundry tests pass; the attached regression fails as expected.\n\nImplementation unchanged. Live mainnet dependencies remain unverified.","treeHash":null,"usage":{"cachedInputTokens":1341056,"inputTokens":101472,"model":"gpt-6.1-sol","outputTokens":11278,"runtime":"codex","turns":6,"wallClockMs":429767}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"080b27034220eb6f","findings":[],"hash":"8d6a78522b21b535c1d35790472697d5618a5cd460268928696f95f563359607","nodeId":"17d09148-d3c7-4148-af5a-46402fdc59f3","outcome":"failed","summary":"needs input: The accepted NightMarket constructor requires a nonzero immutable Pepe address, and IMDBuyer requires a chosen V3 router, IMD/WETH pool and positive minimum-liquidity threshold. These launch inputs are unspecified; script/launch-config.example.json also leaves the PoolManager and Seaport addresses null. No permitted placeholder identifies Pepe, and these contracts have no setters for the missing inputs. Separately, src/BlacklampHook.sol:59 fixes the launch pool fee to 0 and line 89 rejects nonzero LP fees, while this assignment permits only 500, 3000 or 10000. This implementation/policy conflict cannot be repaired by editing launch.json. Omitting the application contracts would omit the requested launch behavior. — Can you provide the approved immutable launch configuration (Pepe address, IMD V3 router and pool, minimum-liquidity threshold, Seaport and PoolManager addresses) together with an accepted implementation compatible with the required pool fee tiers of 500, 3000 or 10000?","treeHash":null,"usage":{"cachedInputTokens":565248,"inputTokens":48671,"model":"gpt-6-astra","outputTokens":2272,"runtime":"codex","turns":3,"wallClockMs":125023}},{"artifacts":[],"attempt":1,"bundleHash":"c5471d28c016a9857e4dfa9ff27e462de0cb49c27dc1032f9b719e26950e903c","device":"e698c63d215db960","findings":[],"hash":"fc11f0031e1454bdfeb4d7d04f04fd1bd9813d113e3514995f5fb6049b280086","nodeId":"42fac5e4-d47d-41c1-b411-159edc5ea0b0","outcome":"completed","summary":"Implemented contracts, tests, and the IPFS-ready site.\n\nVerified: `forge build`, `forge test` (**46 passing**), and `forge fmt --check`.\n\n[README](README.md) documents deployment inputs and assumptions: floor uses submitted listings, funding checks compare recorded buy payers, and voting is per qualifying holder.\n\nNo mainnet deployment or IPFS publication was performed.","treeHash":"496aad6a7b71c9604ad359fb38f70de9663c73e7","usage":{"cachedInputTokens":7780096,"inputTokens":182526,"model":"gpt-6-astra","outputTokens":103163,"runtime":"codex","turns":13,"wallClockMs":3048944}},{"artifacts":[],"attempt":1,"bundleHash":"ee6836e736ed2b976fcc343dc89d1af0466cbb7312ed2cf9e39f7264f25b8565","device":"80750826af198795","findings":[],"hash":"fd527965bcce2600ff192e29f426d32dd86642e50f6d1906fd233f0594fa8a63","nodeId":"a4ddcc52-aabd-4d7f-8d08-7f4b43369617","outcome":"completed","summary":"Added failure-path tests, 1,000-run fuzz tests, and three stateful invariant suites. All changes are under `test/`.\n\nValidation passed:\n\n- `forge build`\n- `forge test`: 60 passed, zero failures\n- 49,152 randomized invariant calls\n\nNo implementation defects were confirmed. Live V3/Seaport fork validation remains outstanding; offline integration limits are documented in `test/TESTING.md`.","treeHash":"1c97eb50ddb291e14ad7a2b2255c9633c9125a87","usage":{"cachedInputTokens":2357376,"inputTokens":116596,"model":"gpt-6-astra","outputTokens":23867,"runtime":"codex","turns":9,"wallClockMs":812789}}],"verification":[{"checks":[{"durationMs":29093,"exitCode":0,"name":"build","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 28.94s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/PoolInitializationGuard.sol:12:17\n   │\n12 │     constructor(address manager_) {\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MerkleDistributor.sol:48:9\n   │\n48 │         emit Claimed(pairedSeat, index, account, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/IMDBuyer.sol:85:22\n   │\n85 │         int24 tick = int24(change / int56(uint56(WINDOW)));\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int24' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `pendingSeed` is changed without an event but is used for access control\n    ╭▸ src/ProjectFactory.sol:142:9\n    │\n142 │         pendingSeed = 0;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingSwap` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:182:9\n    │\n182 │         pendingSwap = keccak256(data);\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingSwap` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:192:9\n    │\n192 │         pendingSwap = 0;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/ProjectFactory.sol:81:23\n   │\n81 │         uint160 raw = uint160(Math.sqrt(ratio));\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/IMDBuyer.sol:100:68\n    │\n100 │         require(msg.value > 0 && msg.value <= type(uint128).max && deadline >= block.timestamp, \"invalid buy\");\n    │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/IMDBuyer.sol:101:38\n    │\n101 │         uint256 minimum = minimumOut(uint128(msg.value));\n    │                                      ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:102:17\n    │\n102 │         require(lamp.transfer(address(swarm), lamp.SUPPLY() / 10), \"swarm delivery failed\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:122:33\n    │\n122 │         int24 initializedTick = c.manager.initialize(launchHook.poolKey(), sqrtPrice);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:127:32\n    │\n127 │         bytes memory settled = c.manager.unlock(seed);\n    │                                ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/ProjectFactory.sol:132:9\n    │\n132 │ ┏         emit Launched(\n133 │ ┃             address(lamp), address(launchHook), address(market), address(swarm), sqrtPrice, uint128(liq), seedDust\n134 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:121:35\n    │\n121 │         require(liq > 0 && liq <= uint128(type(int128).max), \"invalid liquidity\");\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:124:99\n    │\n124 │         bytes memory seed = abi.encode(LaunchLiquidity.Seed(launchHook.poolKey(), -887220, upper, uint128(liq)));\n    │                                                                                                   ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:133:93\n    │\n133 │             address(lamp), address(launchHook), address(market), address(swarm), sqrtPrice, uint128(liq), seedDust\n    │                                                                                             ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/BlacklampHook.sol:36:40\n   │\n36 │     constructor(IPoolManager manager_, address lamp_, IMDBuyer buyer_, SeatBook book_) {\n   │                                        ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NightMarket.sol:99:16\n   │\n99 │         return n > MAX_NIGHTS ? 0 : n;\n   │                ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:35:51\n   │\n35 │             manager.take(currency, address(this), uint128(delta));\n   │                                                   ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:37:28\n   │\n37 │             uint256 owed = uint256(-int256(delta));\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Blacklamp.sol:33:42\n   │\n33 │         Checkpoint memory c = Checkpoint(uint48(block.timestamp), outflowNonce[account], uint144(balanceOf(account)));\n   │                                          ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint48' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Blacklamp.sol:33:90\n   │\n33 │         Checkpoint memory c = Checkpoint(uint48(block.timestamp), outflowNonce[account], uint144(balanceOf(account)));\n   │                                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint144' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/BlacklampHook.sol:78:9\n   │\n78 │         nonReentrant\n   │         ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:133:9\n    │\n133 │         emit Retained(fee, totalFees);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SeatBook.sol:96:17\n   │\n96 │         require(seaport.validate(orders), \"invalid signature\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:92:30\n   │\n92 │             uint256 amount = uint256(p.amountSpecified < 0 ? -p.amountSpecified : p.amountSpecified);\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:95:67\n   │\n95 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                   ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:95:74\n   │\n95 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                          ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:45:17\n   │\n45 │         require(p.startTime <= block.timestamp && p.endTime > block.timestamp, \"listing not current\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:45:51\n   │\n45 │         require(p.startTime <= block.timestamp && p.endTime > block.timestamp, \"listing not current\");\n   │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/SeatBook.sol:56:13\n   │\n56 │ ┏             require(\n57 │ ┃                 c.itemType == 0 && c.token == address(0) && c.identifierOrCriteria == 0 && c.startAmount == c.endAmount\n58 │ ┃                     && c.recipient != address(0),\n59 │ ┃                 \"native fixed price only\"\n60 │ ┃             );\n   │ ┗━━━━━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SeatBook.sol:102:60\n    │\n102 │         if (!l.active || activeOrder[l.tokenId] != hash || block.timestamp >= l.order.parameters.endTime) return false;\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/BlacklampHook.sol:103:9\n    │\n103 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:110:33\n    │\n110 │                 uint256 input = uint256(-p.amountSpecified);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:111:53\n    │\n111 │                 require(-int256(delta.amount0()) == int256(input - input * 2 / 100), \"partial buy\");\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:113:34\n    │\n113 │                 uint256 output = uint256(p.amountSpecified);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:104:13\n    │\n104 │         if (seaport.getCounter(seller) != l.counter) return false;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:105:74\n    │\n105 │         (bool validated, bool cancelled, uint256 filled, uint256 size) = seaport.getOrderStatus(hash);\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:107:13\n    │\n107 │         try IERC721(SEAT).ownerOf(l.tokenId) returns (address owner) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:112:16\n    │\n112 │         return IERC721(SEAT).isApprovedForAll(seller, address(seaport))\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:113:16\n    │\n113 │             || IERC721(SEAT).getApproved(l.tokenId) == address(seaport);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:114:52\n    │\n114 │                 require(int256(delta.amount0()) == int256(output + output * 2 / 98), \"partial sell\");\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:118:27\n    │\n118 │         uint256 ethSide = uint256(delta.amount0() < 0 ? -int256(delta.amount0()) : int256(delta.amount0()));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:44\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:51\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SeatBook.sol:147:9\n    │\n147 │         emit Buried(hash, tokenId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/BlacklampHook.sol:144:31\n    │\n144 │         bytes memory result = manager.unlock(\"\");\n    │                               ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/BlacklampHook.sol:158:54\n    │\n158 │         require(amount > 0 && amount <= imdBudget && deadline >= block.timestamp, \"invalid IMD spend\");\n    │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:164:9\n    │\n164 │         emit IMDBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:174:9\n    │\n174 │         emit SeatBuried(tokenId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:131:20\n    │\n131 │                 && deadline >= block.timestamp,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:215:9\n    │\n215 │         emit Joined(n, account);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:160:9\n    │\n160 │         emit Bought(buyer, msg.sender, msg.value, received, referral[buyer]);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:130:42\n    │\n130 │             msg.value > 0 && msg.value < uint256(uint128(type(int128).max)) && minOut > 0\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:130:50\n    │\n130 │             msg.value > 0 && msg.value < uint256(uint128(type(int128).max)) && minOut > 0\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:151:42\n    │\n151 │         BalanceDelta delta = _swap(true, uint128(msg.value));\n    │                                          ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:152:45\n    │\n152 │         require(-int256(delta.amount0()) == int256(msg.value) && delta.amount1() > 0, \"incomplete buy\");\n    │                                             ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:153:20\n    │\n153 │         received = uint128(delta.amount1());\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:170:17\n    │\n170 │         require(lamp.transferFrom(msg.sender, address(this), amount), \"input failed\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:176:24\n    │\n176 │         (bool paid,) = payable(msg.sender).call{value: received}(\"\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:183:33\n    │\n183 │         bytes memory response = manager.unlock(data);\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:165:79\n    │\n165 │             amount > 0 && amount < uint128(type(int128).max) && minOut > 0 && deadline >= block.timestamp,\n    │                                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:175:9\n    │\n175 │         emit Sold(msg.sender, amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:165:36\n    │\n165 │             amount > 0 && amount < uint128(type(int128).max) && minOut > 0 && deadline >= block.timestamp,\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:173:20\n    │\n173 │         received = uint128(delta.amount0());\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:228:13\n    │\n228 │         if (block.timestamp < time) return false;\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-oz-erc721-mint]: `ERC721._mint` does not check that the recipient can receive the token; use `_safeMint`\n    ╭▸ src/NightMarket.sol:287:9\n    │\n287 │         _mint(winner, n);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-oz-erc721-mint\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:267:13\n    │\n267 │             block.timestamp >= dawn(n) && n == nextNFTNight && !nftSettled[n] && maxSteps > 0 && maxSteps <= 256,\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:230:40\n    │\n230 │         (uint256 held, uint64 nonce) = lamp.stateBefore(account, time);\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/NightMarket.sol:103:9\n    │\n103 │         require(n > 0 && n <= MAX_NIGHTS, \"invalid night\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:299:22\n    │\n299 │             n > 0 && block.timestamp >= dawn(n) - 1 hours && choice < 3 && !voted[n][msg.sender],\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:311:17\n    │\n311 │         require(block.timestamp >= dawn(n) && maxSteps > 0 && maxSteps <= 256, \"cannot settle vote\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":134,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/Purchases.t.sol:PurchasesTest\n[PASS] testBadListingsAndForgedSignatureRejected() (gas: 782068)\n[PASS] testCheapestSeatBuriedAndSellerPaidInSameTransaction() (gas: 2556471)\n[PASS] testIMDBuyerCannotReenterTreasury() (gas: 918148)\n[PASS] testIMDFailuresRestoreFundsAndAccounting() (gas: 1486667)\n[PASS] testIMDFeeBuysToDead() (gas: 773574)\n[PASS] testSeaportCannotReenterBookOrHook() (gas: 2398806)\n[PASS] testSeatFailureAndWrongRecipientRevertEverything() (gas: 2011009)\n[PASS] testStaleCancelledRevokedAndExpiredFloorCanBePruned() (gas: 3230333)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.45ms (6.06ms CPU time)\n\nRan 15 tests for test/Nights.t.sol:NightsTest\n[PASS] testGuideMustAlsoHoldThroughDawn() (gas: 1170415)\n[PASS] testHistoricalDawnSurvivesDelayedSettlement() (gas: 688465)\n[PASS] testHoldDawnStampAndTransferRemovesIt() (gas: 616248)\n[PASS] testLaterNightCannotTakeEarlierNightAward() (gas: 701078)\n[PASS] testNoQualifierBurnsNightAndNinetyNineNightCap() (gas: 9267524)\n[PASS] testPepeTimingDuplicateAndInvalidChoices() (gas: 612571)\n[PASS] testReferralIsActualBuyAddressAndBonusCappedAtOne() (gas: 1742743)\n[PASS] testSelfAndSamePayerReferralsRevert() (gas: 1204399)\n[PASS] testSellAfterVotingRemovesBallotAtDawn() (gas: 15525239)\n[PASS] testSoldBeforeDawnCannotRegainQualificationByRebuying() (gas: 936024)\n[PASS] testThreeNightsWickAndOnlyOneNFTPerAddress() (gas: 1656351)\n[PASS] testVoteBelowQuorumFailsDespiteUnanimity() (gas: 15044425)\n[PASS] testVoteBelowSixtyPercentFails() (gas: 15367038)\n[PASS] testVoteExactlyFiftyAndSixtyPercentPasses() (gas: 15468653)\n[PASS] testZeroAndSelfTransfersDoNotDestroyStamp() (gas: 412983)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 28.36ms (38.23ms CPU time)\n\nRan 15 tests for test/LaunchAndTrading.t.sol:LaunchAndTradingTest\n[PASS] testAllowanceCannotBeSpentFromCallbackData() (gas: 288452)\n[PASS] testApplicationDeploymentFailureRollsBackEntireLaunch() (gas: 6638954)\n[PASS] testBuyAndSellFailuresAreAtomic() (gas: 1322542)\n[PASS] testBuySellFeeSplitAndCollection() (gas: 983530)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 23796)\n[PASS] testExactOutputTradesUseOnlyETHFee() (gas: 1227516)\n[PASS] testFuzzFeeConservation(uint96) (runs: 256, μ: 585586, ~: 592458)\nLogs:\n  Bound result 1999999990000000036\n\n[PASS] testLaunchCannotRepeatOrUseWrongConfig() (gas: 4315777)\n[PASS] testNoAdminMintSweepOrWithdraw() (gas: 1413635)\n[PASS] testOtherPoolsCannotUseHookAndAdditionalFeesRevert() (gas: 276613)\n[PASS] testSellPayoutCannotReenter() (gas: 1191042)\n[PASS] testSupplyAndAtomicLaunch() (gas: 111824)\n[PASS] testSwarmClaimsExactAndOnce() (gas: 206892)\n[PASS] testTokenRuntimeHasNoDelegationOrDestruction() (gas: 1041218)\n[PASS] testUnlaunchedFactoryRejectsConfigurationAndCodeSubstitution() (gas: 4102199)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 33.90ms (30.51ms CPU time)\n\nRan 3 test suites in 34.82ms (78.71ms CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":8399,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/Blacklamp.sol:32: Blacklamp._record(address) (src/Blacklamp.sol#32-37) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/NightMarket.sol:226: NightMarket.eligibleAtDawn(uint256,address) (src/NightMarket.sol#226-232) uses a dangerous strict equality:\n[low/medium] calls-loop at src/NightMarket.sol:226: NightMarket.eligibleAtDawn(uint256,address) (src/NightMarket.sol#226-232) has external calls inside a loop: (held,nonce) = lamp.stateBefore(account,time) (src/NightMarket.sol#230)\n[low/medium] calls-loop at src/SeatBook.sol:100: SeatBook.isLive(bytes32) (src/SeatBook.sol#100-114) has external calls inside a loop: owner = IERC721(SEAT).ownerOf(l.tokenId) (src/SeatBook.sol#107-111)\n[low/medium] calls-loop at src/SeatBook.sol:100: SeatBook.isLive(bytes32) (src/SeatBook.sol#100-114) has external calls inside a loop: seaport.getCounter(seller) != l.counter (src/SeatBook.sol#104)\n[low/medium] calls-loop at src/SeatBook.sol:100: SeatBook.isLive(bytes32) (src/SeatBook.sol#100-114) has external calls inside a loop: IERC721(SEAT).isApprovedForAll(seller,address(seaport)) || IERC721(SEAT).getApproved(l.tokenId) == address(seaport) (src/SeatBook.sol#112-113)\n[low/medium] calls-loop at src/SeatBook.sol:100: SeatBook.isLive(bytes32) (src/SeatBook.sol#100-114) has external calls inside a loop: (validated,cancelled,filled,size) = seaport.getOrderStatus(hash) (src/SeatBook.sol#105)\n[low/medium] calls-loop at src/NightMarket.sol:226: NightMarket.eligibleAtDawn(uint256,address) (src/NightMarket.sol#226-232) has external calls inside a loop: (held,nonce) = lamp.stateBefore(account,time) (src/NightMarket.sol#230)\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:89: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.Config,ProjectFactory.Code) (src/ProjectFactory.sol#89-135):\n[low/medium] reentrancy-benign at src/NightMarket.sol:128: Reentrancy in NightMarket._buy(address,address,uint256,uint256) (src/NightMarket.sol#128-161):\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:89: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.Config,ProjectFactory.Code) (src/ProjectFactory.sol#89-135):\n[low/medium] reentrancy-benign at src/BlacklampHook.sol:157: Reentrancy in BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#157-165):\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:89: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.Config,ProjectFactory.Code) (src/ProjectFactory.sol#89-135):\n[low/medium] reentrancy-events at src/MerkleDistributor.sol:31: Reentrancy in MerkleDistributor.claim(bool,uint256,address,bytes32[]) (src/MerkleDistributor.sol#31-49):\n[low/medium] timestamp at src/NightMarket.sol:163: NightMarket.sell(uint128,uint256,uint256) (src/NightMarket.sol#163-178) uses timestamp for comparisons\n[low/medium] timestamp at src/Blacklamp.sol:32: Blacklamp._record(address) (src/Blacklamp.sol#32-37) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:226: NightMarket.eligibleAtDawn(uint256,address) (src/NightMarket.sol#226-232) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:102: NightMarket.dawn(uint256) (src/NightMarket.sol#102-105) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:310: NightMarket.settleVote(uint256,uint256) (src/NightMarket.sol#310-334) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:97: NightMarket.currentNight() (src/NightMarket.sol#97-100) uses timestamp for comparisons\n[low/medium] timestamp at src/SeatBook.sol:42: SeatBook.submitListing(Order) (src/SeatBook.sol#42-98) uses timestamp for comparisons\n[low/medium] timestamp at src/SeatBook.sol:100: SeatBook.isLive(bytes32) (src/SeatBook.sol#100-114) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:265: NightMarket.settleNFT(uint256,uint256) (src/NightMarket.sol#265-289) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:243: NightMarket.claimStamp(uint256,address) (src/NightMarket.sol#243-262) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:128: NightMarket._buy(address,address,uint256,uint256) (src/NightMarket.sol#128-161) uses timestamp for comparisons\n[low/medium] timestamp at src/IMDBuyer.sol:99: IMDBuyer.buy(uint256,uint256) (src/IMDBuyer.sol#99-111) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:206: NightMarket._join(address) (src/NightMarket.sol#206-216) uses timestamp for comparisons\n[low/medium] timestamp at src/BlacklampHook.sol:157: BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#157-165) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:296: NightMarket.vote(uint8) (src/NightMarket.sol#296-308) uses timestamp for comparisons","passed":true},{"durationMs":701,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/BlacklampHook.sol:19: Contract locks Ether without a withdraw function (3 places)\n[high] eth-send-unchecked-address at src/NightMarket.sol:163: ETH transferred without address checks\n[high] reentrancy-state-change at src/BlacklampHook.sol:161: Reentrancy: State change after external call (17 places)\n[low] costly-loop at src/NightMarket.sol:316: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/Blacklamp.sol:8: Large Numeric Literal (6 places)\n[low] literal-instead-of-constant at src/BlacklampHook.sol:93: Literal Instead of Constant (27 places)\n[low] local-variable-shadowing at src/ProjectFactory.sol:40: Local Variable Shadows State Variable (2 places)\n[low] non-reentrant-not-first at src/BlacklampHook.sol:78: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/NightMarket.sol:274: Loop Contains `require`/`revert` (3 places)\n[low] state-change-without-event at src/BlacklampHook.sol:68: State Change Without Event (6 places)\n[low] unchecked-return at src/NightMarket.sol:341: Unchecked Return\n[low] unsafe-erc20-operation at src/MerkleDistributor.sol:47: Unsafe ERC20 Operation (3 places)\n[low] unsafe-oz-erc721-mint at src/NightMarket.sol:287: Unsafe `ERC721::_mint()`\n[low] unused-public-function at src/NightMarket.sol:243: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3e0dbbb11a3cb4f0b28695d6e0f9be077804dab089a9328569f968eb99032781","verifiedTreeHash":"bd829c858ffb011a612e8cd0680cb5ec22da7552","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":26443,"exitCode":0,"name":"build","output":"Compiling 116 files with Solc 0.8.26\nSolc 0.8.26 finished in 26.33s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:24:33\n   │\n24 │           (BalanceDelta delta,) = manager.modifyLiquidity(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n25 │ ┃             s.key, ModifyLiquidityParams(s.tickLower, s.tickUpper, int256(uint256(s.liquidity)), 0), \"\"\n26 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/PoolInitializationGuard.sol:13:17\n   │\n13 │     constructor(address manager_) {\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:33:51\n   │\n33 │             manager.take(currency, address(this), uint128(delta));\n   │                                                   ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:35:30\n   │\n35 │             uint256 amount = uint256(-int256(delta));\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:37:17\n   │\n37 │                 manager.settle{value: amount}();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/LaunchLiquidity.sol:41:17\n   │\n41 │                 manager.settle();\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-events-access-control]: `firstPayer` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:116:74\n    │\n116 │         if (firstPayer[recipient] == address(0) && amountOut >= 1 ether) firstPayer[recipient] = msg.sender;\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/IMDBuyer.sol:80:35\n   │\n80 │         (int56[] memory ticks,) = imdPool.observe(ages);\n   │                                   ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/IMDBuyer.sol:82:22\n   │\n82 │         int24 tick = int24(diff / int56(uint56(TWAP_WINDOW)));\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int24' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `entries` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:191:9\n    │\n191 │         entries[n][msg.sender] = Entry(lamp.outflowNonce(msg.sender), block.timestamp, referrer);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[boolean-cst]: misuse of a boolean constant\n    ╭▸ src/SeatBook.sol:136:45\n    │\n136 │         if (heap.length == 0) return (0, 0, false);\n    │                                             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/BlacklampHook.sol:36:9\n   │\n36 │         address token_,\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/ProjectFactory.sol:115:17\n    │\n115 │         upper = (tick / 60) * 60;\n    │                 ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:114:50\n    │\n114 │         int24 tick = TickMath.getTickAtSqrtPrice(uint160(raw));\n    │                                                  ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `listings` is updated\n   ╭▸ src/SeatBook.sol:95:17\n   │\n95 │         require(seaport.validate(orders), \"invalid signature\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/SeatBook.sol:88:13\n   │\n88 │             price += p.consideration[i].startAmount;\n   │             ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:135:17\n    │\n135 │         require(token.transfer(address(distributor), token.SUPPLY() / 10));\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:68:20\n   │\n68 │                 && p.startTime <= block.timestamp && block.timestamp < p.endTime && p.offer.length == 1\n   │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:68:54\n   │\n68 │                 && p.startTime <= block.timestamp && block.timestamp < p.endTime && p.offer.length == 1\n   │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:153:9\n    │\n153 │         manager.initialize(key, sqrtPrice);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:156:9\n    │\n156 │         manager.unlock(seed);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:159:32\n    │\n159 │         if (dust != 0) require(token.transfer(address(manager), dust));\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SeatBook.sol:113:9\n    │\n113 │         emit ListingSubmitted(hash, price, abi.encode(order));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/SeatBook.sol:80:13\n   │\n80 │ ┏             require(\n81 │ ┃                 p.consideration[i].itemType == ItemType.NATIVE && p.consideration[i].token == address(0)\n82 │ ┃                     && p.consideration[i].identifierOrCriteria == 0\n83 │ ┃                     && p.consideration[i].startAmount == p.consideration[i].endAmount\n   ‡ ┃\n86 │ ┃                 \"not fixed ETH\"\n87 │ ┃             );\n   │ ┗━━━━━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/ProjectFactory.sol:168:9\n    │\n168 │ ┏         emit Launched(\n169 │ ┃             tokenAddress,\n170 │ ┃             hookAddress,\n171 │ ┃             market,\n    ‡ ┃\n179 │ ┃             dust\n180 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SeatBook.sol:118:24\n    │\n118 │         if (!l.seen || block.timestamp >= l.end || seaport.getCounter(l.seller) != l.counter) return false;\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:151:47\n    │\n151 │         require(liquidity > 0 && liquidity <= uint128(type(int128).max), \"invalid liquidity\");\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/ProjectFactory.sol:153:9\n    │\n153 │         manager.initialize(key, sqrtPrice);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SeatBook.sol:119:61\n    │\n119 │         (bool validated, bool cancelled, uint256 filled,) = seaport.getOrderStatus(hash);\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:154:86\n    │\n154 │         bytes memory seed = abi.encode(LaunchLiquidity.Seed(key, p.lowerTick, upper, uint128(liquidity)));\n    │                                                                                      ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/ProjectFactory.sol:156:9\n    │\n156 │         manager.unlock(seed);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:178:13\n    │\n178 │             uint128(liquidity),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:108:24\n    │\n108 │             abi.decode(manager.unlock(abi.encode(true, msg.value, msg.sender)), (BalanceDelta));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:110:9\n    │\n110 │         hook.collectFees();\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:114:17\n    │\n114 │         require(lamp.transfer(recipient, amountOut));\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:118:52\n    │\n118 │         if (!l.seen || block.timestamp >= l.end || seaport.getCounter(l.seller) != l.counter) return false;\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:119:61\n    │\n119 │         (bool validated, bool cancelled, uint256 filled,) = seaport.getOrderStatus(hash);\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:126:13\n    │\n126 │         try IERC721(SEAT).ownerOf(l.tokenId) returns (address owner) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:131:16\n    │\n131 │         return IERC721(SEAT).isApprovedForAll(l.seller, address(seaport))\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NightMarket.sol:97:13\n   │\n97 │             block.timestamp <= deadline && minOut > 0 && msg.value > 0\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:132:16\n    │\n132 │             || IERC721(SEAT).getApproved(l.tokenId) == address(seaport);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:117:9\n    │\n117 │         emit Bought(recipient, msg.sender, msg.value, amountOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/NightMarket.sol:98:33\n   │\n98 │                 && msg.value <= uint256(uint128(type(int128).max)),\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/NightMarket.sol:98:41\n   │\n98 │                 && msg.value <= uint256(uint128(type(int128).max)),\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:111:37\n    │\n111 │         require(delta.amount0() == -int256(msg.value), \"partial buy\");\n    │                                     ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:112:21\n    │\n112 │         amountOut = uint128(delta.amount1());\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:131:24\n    │\n131 │             abi.decode(manager.unlock(abi.encode(false, uint256(amount), msg.sender)), (BalanceDelta));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:133:9\n    │\n133 │         hook.collectFees();\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-balance]: external call can be reentered before a stale contract balance is checked\n    ╭▸ src/SeatBook.sol:167:13\n    │\n167 │ ┏             seaport.fulfillAdvancedOrder{value: price}(\n168 │ ┃                 advanced, new CriteriaResolver[](0), 0, 0x000000000000000000000000000000000000dEaD\n169 │ ┃             ),\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-balance\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:137:22\n    │\n137 │         (bool ok,) = msg.sender.call{value: amountOut}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SeatBook.sol:150:17\n    │\n150 │         require(block.timestamp <= deadline, \"expired request\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:126:13\n    │\n126 │             block.timestamp <= deadline && minOut > 0 && amount > 0 && amount <= uint128(type(int128).max),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SeatBook.sol:176:9\n    │\n176 │         emit SeatBuried(cheapest, tokenId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:139:9\n    │\n139 │         emit Sold(msg.sender, amount, amountOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SeatBook.sol:175:17\n    │\n175 │         require(address(this).balance == balanceBefore - price, \"unexpected ETH movement\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:126:82\n    │\n126 │             block.timestamp <= deadline && minOut > 0 && amount > 0 && amount <= uint128(type(int128).max),\n    │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:135:21\n    │\n135 │         amountOut = uint128(delta.amount0());\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n    ╭▸ src/NightMarket.sol:155:21\n    │\n155 │             require(lamp.transferFrom(payer, address(manager), uint256(-int256(delta.amount1()))));\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SeatBook.sol:195:20\n    │\n195 │             while (index * 2 + 1 < heap.length) {\n    │                    ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MerkleDistributor.sol:55:9\n   │\n55 │         emit Claimed(group, index, account, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/BlacklampHook.sol:97:77\n   │\n97 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                             ━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/BlacklampHook.sol:85:9\n   │\n85 │         nonReentrant\n   │         ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:136:9\n    │\n136 │         emit FeeRetained(ethSide, half, half);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:96:46\n   │\n96 │         if (params.zeroForOne) fee = _retain(uint256(-params.amountSpecified));\n   │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:97:63\n   │\n97 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                               ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:97:70\n   │\n97 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                      ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:149:24\n    │\n149 │                 buy_, -int256(amount), buy_ ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:155:64\n    │\n155 │             require(lamp.transferFrom(payer, address(manager), uint256(-int256(delta.amount1()))));\n    │                                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/NightMarket.sol:156:13\n    │\n156 │             manager.settle();\n    │             ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/BlacklampHook.sol:112:83\n    │\n112 │                 delta.amount1() > 0 && int256(delta.amount0()) == -int256(gross - 2 * (gross / 100)),\n    │                                                                                   ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:167:16\n    │\n167 │         return n > MAX_NIGHTS ? MAX_NIGHTS + 1 : n;\n    │                ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/BlacklampHook.sol:121:58\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                          ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/BlacklampHook.sol:106:28\n    │\n106 │     ) external onlyManager nonReentrant returns (bytes4, int128) {\n    │                            ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:110:29\n    │\n110 │             uint256 gross = uint256(-params.amountSpecified);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:112:68\n    │\n112 │                 delta.amount1() > 0 && int256(delta.amount0()) == -int256(gross - 2 * (gross / 100)),\n    │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:119:27\n    │\n119 │             fee = _retain(uint128(delta.amount0()));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:44\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:51\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:177:36\n    │\n177 │         require(n <= MAX_NIGHTS && block.timestamp < dawn(n) - 1 hours, \"enrollment closed\");\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:203:17\n    │\n203 │         require(block.timestamp >= dawn(n) && eligible(n, account), \"not held through dawn\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:250:36\n    │\n250 │         require(n <= MAX_NIGHTS && block.timestamp >= dawn(n) - 1 hours, \"not voting hour\");\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:263:17\n    │\n263 │         require(block.timestamp >= dawn(n), \"not dawn\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/BlacklampHook.sol:126:15\n    │\n126 │         fee = 2 * half;\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/BlacklampHook.sol:149:9\n    │\n149 │         manager.unlock(abi.encode(amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:151:9\n    │\n151 │         emit FeesCollected(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/BlacklampHook.sol:149:9\n    │\n149 │         manager.unlock(abi.encode(amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/NightMarket.sol:310:13\n    │\n310 │         if (recipient == address(0)) {\n    │             ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-oz-erc721-mint]: `ERC721._mint` does not check that the recipient can receive the token; use `_safeMint`\n    ╭▸ src/NightMarket.sol:316:9\n    │\n316 │         _mint(recipient, n);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-oz-erc721-mint\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:294:13\n    │\n294 │             block.timestamp >= dawn(n) && n == nextSettlementNight && !nightSettled[n] && maxScan > 0,\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:198:52\n    │\n198 │         return e.joined != 0 && account != pepe && lamp.balanceOf(account) >= 1 ether\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:199:16\n    │\n199 │             && lamp.outflowNonce(account) == e.nonce;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:208:25\n    │\n208 │         uint256 nonce = lamp.outflowNonce(account);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:219:59\n    │\n219 │             guide != address(0) && !guideMinted[guide] && lamp.balanceOf(guide) >= 1 ether\n    │                                                           ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:223:33\n    │\n223 │             guideNonce[guide] = lamp.outflowNonce(guide);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `imdBudget` is updated\n    ╭▸ src/BlacklampHook.sol:149:9\n    │\n149 │         manager.unlock(abi.encode(amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-balance]: external call can be reentered before a stale contract balance is checked\n    ╭▸ src/BlacklampHook.sol:170:28\n    │\n170 │           uint256 received = imdRouter.exactInputSingle{value: amount}(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n171 │ ┃             IV3Router.ExactInputSingleParams(weth, IMD, venueFee, DEAD, deadline, amount, minOut, 0)\n172 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-balance\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/BlacklampHook.sol:162:17\n    │\n162 │         require(block.timestamp <= deadline && amount != 0 && amount <= imdBudget, \"invalid purchase\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:177:9\n    │\n177 │         emit IMDBurned(amount, actual);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/BlacklampHook.sol:175:17\n    │\n175 │         require(address(this).balance == beforeETH - amount, \"unexpected ETH movement\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\n","passed":true},{"durationMs":121,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_untaxedTransfers(uint256) (runs: 256, μ: 239851, ~: 239809)\nLogs:\n  Bound result 100000000000000000000000000\n\n[PASS] test_noPrivilegedOperations() (gas: 274692)\n[PASS] test_supplyAndMetadata() (gas: 49265)\n[PASS] test_zeroAndSelfTransfersCannotInvalidateCredentials() (gas: 101727)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.11ms (6.62ms CPU time)\n\nRan 13 tests for test/Nights.t.sol:NightsTest\n[PASS] test_49UnanimousLampsFailQuorum() (gas: 22105665)\n[PASS] test_58PercentFailsMajority() (gas: 22575777)\n[PASS] test_99NightLimitAndChronologicalSettlement() (gas: 8717724)\n[PASS] test_dawnStampWickAndSellRevocation() (gas: 1528574)\n[PASS] test_fifoOneNFTPerNightOnePerAddressAndNoTransfers() (gas: 1585397)\n[PASS] test_passRequires50DistinctLampsAndExactly60Percent() (gas: 22622020)\n[PASS] test_referralGuideHeldAtDawnAndCappedAtOne() (gas: 1996861)\n[PASS] test_selfSamePayerAndUnknownReferralRejected() (gas: 1108707)\n[PASS] test_sellerSkippedAndEmptyNightConsumedAtDead() (gas: 1302552)\n[PASS] test_soldReferralDoesNotGrantGuide() (gas: 987910)\n[PASS] test_transfersInvalidateButDustIncomingCannotGrief() (gas: 1027780)\n[PASS] test_unsolicitedSponsoredBuyRejected() (gas: 52118)\n[PASS] test_votingWindowDuplicateAndPepeExclusion() (gas: 1057576)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 23.08ms (47.56ms CPU time)\n\nRan 9 tests for test/Seats.t.sol:SeatsTest\n[PASS] test_budgetExpiryDuplicateAndSignatureRejections() (gas: 787225)\n[PASS] test_contractPayeeCannotPinAnUnfillableFloor() (gas: 748632)\n[PASS] test_expiryCounterOwnershipAndApprovalInvalidateFloor() (gas: 1940603)\n[PASS] test_failedSeatTransferRollsBackEverything() (gas: 1340088)\n[PASS] test_heapKeepsCheapestAfterMultiplePurchases() (gas: 3777026)\n[PASS] test_prunedOrderCanReturnWhenApprovalIsRestored() (gas: 852516)\n[PASS] test_realSeaportCheapestSeatGoesToDeadSameTransaction() (gas: 1703736)\n[PASS] test_staleCancelledFloorNeedsPermissionlessPruning() (gas: 1629305)\n[PASS] test_wrongCollectionCurrencyDynamicPriceAndConduitRejected() (gas: 323211)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 39.01ms (12.82ms CPU time)\n\nRan 6 tests for test/Factory.t.sol:FactoryTest\n[PASS] test_badSeedRollsBackEveryDeploymentAndTransfer() (gas: 15143198)\n[PASS] test_factoryHasNoLPRemovalOrSweep() (gas: 79525)\n[PASS] test_factoryRejectsUnpinnedCodeAndForeignUnlocks() (gas: 384883)\n[PASS] test_forgedProofIndexAndGroupAreRejected() (gas: 85224)\n[PASS] test_offlineApplicationConstructionAndFailClosedVenueUse() (gas: 10366342)\n[PASS] test_swarmSharesAreClaimedWholeWithNoRequesterAllocation() (gas: 261032)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 39.07ms (13.30ms CPU time)\n\nRan 14 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_buyAndSellSplitConserveETH(uint128) (runs: 256, μ: 731469, ~: 736706)\nLogs:\n  Bound result 194737750331811008\n\n[PASS] test_IMDBuyBlocksReentry() (gas: 677324)\n[PASS] test_IMDBuyFailuresRollbackBudgets() (gas: 750714)\n[PASS] test_IMDSlippageDeadlineBudgetAndOracleEnforced() (gas: 596955)\n[PASS] test_buyIMDTransfersDirectlyToDead() (gas: 572703)\n[PASS] test_exactOutputAndPartialInputRevert() (gas: 817078)\n[PASS] test_failedBuySlippageRollsBackSwapAndFees() (gas: 430876)\n[PASS] test_genericV4RouterPaysSameFee() (gas: 934354)\n[PASS] test_launchSplitAndNoRequesterRemainder() (gas: 84633)\n[PASS] test_noWithdrawAdminSweepOrFeeChanges() (gas: 563932)\n[PASS] test_poolBindingAndCallbackAuthentication() (gas: 170867)\n[PASS] test_protocolFeeCannotSilentlyAddAnotherCharge() (gas: 183936)\n[PASS] test_purchaseCollectsGenericRouterFeesAutomatically() (gas: 1034010)\n[PASS] test_venueIdentityIsValidatedBeforeSpending() (gas: 470482)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 39.07ms (34.43ms CPU time)\n\nRan 5 test suites in 39.68ms (147.35ms CPU time): 46 tests passed, 0 failed, 0 skipped (46 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Blacklamp.approve(address,uint256)\",\"Blacklamp.transfer(address,uint256)\",\"Blacklamp.transferFrom(address,address,uint256)\",\"BlacklampHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"BlacklampHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"BlacklampHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"BlacklampHook.buyIMD(uint128,uint256,uint256)\",\"BlacklampHook.collectFees()\",\"BlacklampHook.prune(uint256)\",\"BlacklampHook.receive()\",\"BlacklampHook.submitListing(((address,address,(uint8,address,uint256,uint256,uint256)[],(uint8,address,uint256,uint256,uint256,address)[],uint8,uint256,uint256,bytes32,uint256,bytes32,uint256),bytes))\",\"BlacklampHook.unlockCallback(bytes)\",\"MerkleDistributor.claim(uint8,uint256,address,bytes32[])\",\"NightMarket.allowSponsor(address)\",\"NightMarket.approve(address,uint256)\",\"NightMarket.buy(address,uint256,uint256)\",\"NightMarket.claimDawn(uint256,address)\",\"NightMarket.enroll(address)\",\"NightMarket.finalizeVote(uint256)\",\"NightMarket.receive()\",\"NightMarket.safeTransferFrom(address,address,uint256)\",\"NightMarket.safeTransferFrom(address,address,uint256,bytes)\",\"NightMarket.sell(uint128,uint256,uint256)\",\"NightMarket.setApprovalForAll(address,bool)\",\"NightMarket.settleNight(uint256,uint256)\",\"NightMarket.transferFrom(address,address,uint256)\",\"NightMarket.unlockCallback(bytes)\",\"NightMarket.vote(uint8)\",\"ProjectFactory.launchCustom((bytes32,bytes32,bytes32,bytes32,bytes32,uint32,uint32,uint256,int24),bytes,bytes)\",\"ProjectFactory.unlockCallback(bytes)\"],\"files\":{\".gitignore\":7,\"README.md\":94,\"docs/DEPLOYMENT.md\":36,\"docs/REVIEW.md\":24,\"docs/VALIDATION.md\":20,\"docs/dependencies.json\":32,\"foundry.toml\":28,\"script/Prepare.s.sol\":44,\"script/configure-site.py\":25,\"script/vendor-seaport.py\":82,\"site/abi.js\":1,\"site/app.js\":157,\"site/config.js\":2,\"site/index.html\":44,\"site/pepe.svg\":1,\"site/style.css\":1,\"site/vendor/README.txt\":4,\"site/vendor/ethers.LICENSE.md\":21,\"site/vendor/ethers.min.js\":1,\"src/Blacklamp.sol\":19,\"src/BlacklampHook.sol\":179,\"src/HookFlags.sol\":11,\"src/IMDBuyer.sol\":99,\"src/LaunchLiquidity.sol\":45,\"src/MerkleDistributor.sol\":57,\"src/NightMarket.sol\":340,\"src/PoolInitializationGuard.sol\":23,\"src/ProjectFactory.sol\":196,\"src/SeatBook.sol\":206,\"test/Factory.t.sol\":96,\"test/Hook.t.sol\":242,\"test/Nights.t.sol\":250,\"test/Seats.t.sol\":199,\"test/Token.t.sol\":65,\"test/helpers/Deploy.sol\":17,\"test/helpers/Fixtures.sol\":271,\"test/helpers/ReleaseCode.sol\":18,\"test/helpers/SeaportBytecode.sol\":103},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8073,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/NightMarket.sol:142: NightMarket.unlockCallback(bytes) (src/NightMarket.sol#142-162) uses arbitrary from in transferFrom: require(bool)(lamp.transferFrom(payer,address(manager),uint256(- int256(delta.amount1())))) (src/NightMarket.sol#155)\n[high/medium] arbitrary-send-eth at src/NightMarket.sol:120: NightMarket.sell(uint128,uint256,uint256) (src/NightMarket.sol#120-140) sends eth to arbitrary user\n[high/medium] reentrancy-balance at src/BlacklampHook.sol:161: Reentrancy in BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178):\n[medium/medium] divide-before-multiply at src/BlacklampHook.sol:124: BlacklampHook._retain(uint256) (src/BlacklampHook.sol#124-137) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/ProjectFactory.sol:110: ProjectFactory.openingPrice(uint256) (src/ProjectFactory.sol#110-119) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/BlacklampHook.sol:161: BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BlacklampHook.sol:161: BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SeatBook.sol:149: SeatBook.buySeat(Order,uint256) (src/SeatBook.sol#149-177) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/BlacklampHook.sol:161: Reentrancy in BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178):\n[medium/medium] reentrancy-no-eth at src/SeatBook.sol:63: Reentrancy in SeatBook.submitListing(Order) (src/SeatBook.sol#63-114):\n[medium/medium] uninitialized-local at src/BlacklampHook.sol:95: BlacklampHook.beforeSwap(address,PoolKey,SwapParams,bytes).fee (src/BlacklampHook.sol#95) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BlacklampHook.sol:108: BlacklampHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).fee (src/BlacklampHook.sol#108) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SeatBook.sol:78: SeatBook.submitListing(Order).price (src/SeatBook.sol#78) is a local variable never initialized\n[medium/medium] unused-return at src/BlacklampHook.sol:144: BlacklampHook._collectFees() (src/BlacklampHook.sol#144-152) ignores return value by manager.unlock(abi.encode(amount)) (src/BlacklampHook.sol#149)\n[medium/medium] unused-return at src/LaunchLiquidity.sol:31: LaunchLiquidity.settle(IPoolManager,Currency,int128) (src/LaunchLiquidity.sol#31-44) ignores return value by manager.settle() (src/LaunchLiquidity.sol#41)\n[medium/medium] unused-return at src/LaunchLiquidity.sol:22: LaunchLiquidity.settleSeed(IPoolManager,bytes) (src/LaunchLiquidity.sol#22-29) ignores return value by (delta,None) = manager.modifyLiquidity(s.key,ModifyLiquidityParams(s.tickLower,s.tickUpper,int256(uint256(s.liquidity)),0),) (src/LaunchLiquidity.sol#24-26)\n[medium/medium] unused-return at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) ignores return value by (validated,cancelled,filled,None) = seaport.getOrderStatus(hash) (src/SeatBook.sol#119)\n[medium/medium] unused-return at src/ProjectFactory.sol:121: ProjectFactory.launchCustom(ProjectFactory.LaunchParams,bytes,bytes) (src/ProjectFactory.sol#121-181) ignores return value by manager.initialize(key,sqrtPrice) (src/ProjectFactory.sol#153)\n[medium/medium] unused-return at src/ProjectFactory.sol:121: ProjectFactory.launchCustom(ProjectFactory.LaunchParams,bytes,bytes) (src/ProjectFactory.sol#121-181) ignores return value by manager.unlock(seed) (src/ProjectFactory.sol#156)\n[medium/medium] unused-return at src/LaunchLiquidity.sol:31: LaunchLiquidity.settle(IPoolManager,Currency,int128) (src/LaunchLiquidity.sol#31-44) ignores return value by manager.settle{value: amount}() (src/LaunchLiquidity.sol#37)\n[medium/medium] unused-return at src/BlacklampHook.sol:82: BlacklampHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/BlacklampHook.sol#82-98) ignores return value by (None,None,protocolFee,None) = StateLibrary.getSlot0(manager,PoolIdLibrary.toId(key)) (src/BlacklampHook.sol#89)\n[medium/medium] unused-return at src/IMDBuyer.sol:77: IMDBuyer._minimumIMD(uint128) (src/IMDBuyer.sol#77-98) ignores return value by (ticks,None) = imdPool.observe(ages) (src/IMDBuyer.sol#80)\n[medium/medium] unused-return at src/NightMarket.sol:142: NightMarket.unlockCallback(bytes) (src/NightMarket.sol#142-162) ignores return value by manager.settle() (src/NightMarket.sol#156)\n[medium/high] write-after-write at src/NightMarket.sol:28: NightMarket.trading (src/NightMarket.sol#28) is written in both\n[medium/high] write-after-write at src/NightMarket.sol:28: NightMarket.trading (src/NightMarket.sol#28) is written in both\n[low/medium] calls-loop at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) has external calls inside a loop: ! l.seen || block.timestamp >= l.end || seaport.getCounter(l.seller) != l.counter (src/SeatBook.sol#118)\n[low/medium] calls-loop at src/NightMarket.sol:207: NightMarket._stamp(uint256,address) (src/NightMarket.sol#207-227) has external calls inside a loop: guideNonce[guide] = lamp.outflowNonce(guide) (src/NightMarket.sol#223)\n[low/medium] calls-loop at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) has external calls inside a loop: owner = IERC721(SEAT).ownerOf(l.tokenId) (src/SeatBook.sol#126-130)\n[low/medium] calls-loop at src/NightMarket.sol:196: NightMarket.eligible(uint256,address) (src/NightMarket.sol#196-200) has external calls inside a loop: e.joined != 0 && account != pepe && lamp.balanceOf(account) >= 1000000000000000000 && lamp.outflowNonce(account) == e.nonce (src/NightMarket.sol#198-199)\n[low/medium] calls-loop at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) has external calls inside a loop: IERC721(SEAT).isApprovedForAll(l.seller,address(seaport)) || IERC721(SEAT).getApproved(l.tokenId) == address(seaport) (src/SeatBook.sol#131-132)\n[low/medium] calls-loop at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) has external calls inside a loop: (validated,cancelled,filled,None) = seaport.getOrderStatus(hash) (src/SeatBook.sol#119)\n[low/medium] calls-loop at src/NightMarket.sol:207: NightMarket._stamp(uint256,address) (src/NightMarket.sol#207-227) has external calls inside a loop: guide != address(0) && ! guideMinted[guide] && lamp.balanceOf(guide) >= 1000000000000000000 && eligible(n,guide) (src/NightMarket.sol#219-220)\n[low/medium] calls-loop at src/NightMarket.sol:207: NightMarket._stamp(uint256,address) (src/NightMarket.sol#207-227) has external calls inside a loop: nonce = lamp.outflowNonce(account) (src/NightMarket.sol#208)\n[low/medium] reentrancy-benign at src/SeatBook.sol:63: Reentrancy in SeatBook.submitListing(Order) (src/SeatBook.sol#63-114):\n[low/medium] reentrancy-benign at src/NightMarket.sol:120: Reentrancy in NightMarket.sell(uint128,uint256,uint256) (src/NightMarket.sol#120-140):\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:121: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.LaunchParams,bytes,bytes) (src/ProjectFactory.sol#121-181):\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:121: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.LaunchParams,bytes,bytes) (src/ProjectFactory.sol#121-181):\n[low/medium] reentrancy-benign at src/BlacklampHook.sol:144: Reentrancy in BlacklampHook._collectFees() (src/BlacklampHook.sol#144-152):\n[low/medium] reentrancy-benign at src/BlacklampHook.sol:161: Reentrancy in BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178):\n[low/medium] reentrancy-benign at src/NightMarket.sol:90: Reentrancy in NightMarket.buy(address,uint256,uint256) (src/NightMarket.sol#90-118):\n[low/medium] reentrancy-benign at src/ProjectFactory.sol:121: Reentrancy in ProjectFactory.launchCustom(ProjectFactory.LaunchParams,bytes,bytes) (src/ProjectFactory.sol#121-181):\n[low/medium] reentrancy-benign at src/NightMarket.sol:90: Reentrancy in NightMarket.buy(address,uint256,uint256) (src/NightMarket.sol#90-118):\n[low/medium] reentrancy-events at src/MerkleDistributor.sol:48: Reentrancy in MerkleDistributor.claim(uint8,uint256,address,bytes32[]) (src/MerkleDistributor.sol#48-56):\n[low/medium] timestamp at src/SeatBook.sol:63: SeatBook.submitListing(Order) (src/SeatBook.sol#63-114) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:175: NightMarket.enroll(address) (src/NightMarket.sol#175-194) uses timestamp for comparisons\n[low/medium] timestamp at src/SeatBook.sol:116: SeatBook.isLive(bytes32) (src/SeatBook.sol#116-133) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:248: NightMarket.vote(uint8) (src/NightMarket.sol#248-259) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:90: NightMarket.buy(address,uint256,uint256) (src/NightMarket.sol#90-118) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:262: NightMarket.finalizeVote(uint256) (src/NightMarket.sol#262-277) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:292: NightMarket.settleNight(uint256,uint256) (src/NightMarket.sol#292-318) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:165: NightMarket.currentNight() (src/NightMarket.sol#165-168) uses timestamp for comparisons\n[low/medium] timestamp at src/BlacklampHook.sol:161: BlacklampHook.buyIMD(uint128,uint256,uint256) (src/BlacklampHook.sol#161-178) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:170: NightMarket.dawn(uint256) (src/NightMarket.sol#170-173) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:202: NightMarket.claimDawn(uint256,address) (src/NightMarket.sol#202-205) uses timestamp for comparisons\n[low/medium] timestamp at src/NightMarket.sol:120: NightMarket.sell(uint128,uint256,uint256) (src/NightMarket.sol#120-140) uses timestamp for comparisons\n[low/medium] timestamp at src/SeatBook.sol:149: SeatBook.buySeat(Order,uint256) (src/SeatBook.sol#149-177) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/NightMarket.sol:142: NightMarket.unlockCallback(bytes) (src/NightMarket.sol#142-162) uses arbitrary from in transferFrom: require(bool)(lamp.transferFrom(payer,address(manager),uint256(- int256(delta.amount1())))) (src/NightMarket.sol#155)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"fc11f0031e1454bdfeb4d7d04f04fd1bd9813d113e3514995f5fb6049b280086","verifiedTreeHash":"496aad6a7b71c9604ad359fb38f70de9663c73e7","verifierVersion":"0.1.0+ef8fb83e"},{"checks":[{"durationMs":48419,"exitCode":0,"name":"build","output":"Compiling 111 files with Solc 0.8.26\nSolc 0.8.26 finished in 48.29s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/PoolInitializationGuard.sol:12:17\n   │\n12 │     constructor(address manager_) {\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/BlacklampHook.sol:36:40\n   │\n36 │     constructor(IPoolManager manager_, address lamp_, IMDBuyer buyer_, SeatBook book_) {\n   │                                        ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MerkleDistributor.sol:48:9\n   │\n48 │         emit Claimed(pairedSeat, index, account, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `pendingSeed` is changed without an event but is used for access control\n    ╭▸ src/ProjectFactory.sol:142:9\n    │\n142 │         pendingSeed = 0;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:35:51\n   │\n35 │             manager.take(currency, address(this), uint128(delta));\n   │                                                   ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchLiquidity.sol:37:28\n   │\n37 │             uint256 owed = uint256(-int256(delta));\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SeatBook.sol:96:17\n   │\n96 │         require(seaport.validate(orders), \"invalid signature\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/ProjectFactory.sol:81:23\n   │\n81 │         uint160 raw = uint160(Math.sqrt(ratio));\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/BlacklampHook.sol:78:9\n   │\n78 │         nonReentrant\n   │         ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:133:9\n    │\n133 │         emit Retained(fee, totalFees);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:45:17\n   │\n45 │         require(p.startTime <= block.timestamp && p.endTime > block.timestamp, \"listing not current\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:92:30\n   │\n92 │             uint256 amount = uint256(p.amountSpecified < 0 ? -p.amountSpecified : p.amountSpecified);\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:95:67\n   │\n95 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                   ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BlacklampHook.sol:95:74\n   │\n95 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                          ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SeatBook.sol:45:51\n   │\n45 │         require(p.startTime <= block.timestamp && p.endTime > block.timestamp, \"listing not current\");\n   │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/SeatBook.sol:56:13\n   │\n56 │ ┏             require(\n57 │ ┃                 c.itemType == 0 && c.token == address(0) && c.identifierOrCriteria == 0 && c.startAmount == c.endAmount\n58 │ ┃                     && c.recipient != address(0),\n59 │ ┃                 \"native fixed price only\"\n60 │ ┃             );\n   │ ┗━━━━━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/IMDBuyer.sol:85:22\n   │\n85 │         int24 tick = int24(change / int56(uint56(WINDOW)));\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int24' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SeatBook.sol:102:60\n    │\n102 │         if (!l.active || activeOrder[l.tokenId] != hash || block.timestamp >= l.order.parameters.endTime) return false;\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:102:17\n    │\n102 │         require(lamp.transfer(address(swarm), lamp.SUPPLY() / 10), \"swarm delivery failed\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:122:33\n    │\n122 │         int24 initializedTick = c.manager.initialize(launchHook.poolKey(), sqrtPrice);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/ProjectFactory.sol:127:32\n    │\n127 │         bytes memory settled = c.manager.unlock(seed);\n    │                                ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/IMDBuyer.sol:100:68\n    │\n100 │         require(msg.value > 0 && msg.value <= type(uint128).max && deadline >= block.timestamp, \"invalid buy\");\n    │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/ProjectFactory.sol:132:9\n    │\n132 │ ┏         emit Launched(\n133 │ ┃             address(lamp), address(launchHook), address(market), address(swarm), sqrtPrice, uint128(liq), seedDust\n134 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/IMDBuyer.sol:101:38\n    │\n101 │         uint256 minimum = minimumOut(uint128(msg.value));\n    │                                      ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:104:13\n    │\n104 │         if (seaport.getCounter(seller) != l.counter) return false;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:105:74\n    │\n105 │         (bool validated, bool cancelled, uint256 filled, uint256 size) = seaport.getOrderStatus(hash);\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:107:13\n    │\n107 │         try IERC721(SEAT).ownerOf(l.tokenId) returns (address owner) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/BlacklampHook.sol:103:9\n    │\n103 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:112:16\n    │\n112 │         return IERC721(SEAT).isApprovedForAll(seller, address(seaport))\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SeatBook.sol:113:16\n    │\n113 │             || IERC721(SEAT).getApproved(l.tokenId) == address(seaport);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:121:35\n    │\n121 │         require(liq > 0 && liq <= uint128(type(int128).max), \"invalid liquidity\");\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:124:99\n    │\n124 │         bytes memory seed = abi.encode(LaunchLiquidity.Seed(launchHook.poolKey(), -887220, upper, uint128(liq)));\n    │                                                                                                   ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:110:33\n    │\n110 │                 uint256 input = uint256(-p.amountSpecified);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/ProjectFactory.sol:133:93\n    │\n133 │             address(lamp), address(launchHook), address(market), address(swarm), sqrtPrice, uint128(liq), seedDust\n    │                                                                                             ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:111:53\n    │\n111 │                 require(-int256(delta.amount0()) == int256(input - input * 2 / 100), \"partial buy\");\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:113:34\n    │\n113 │                 uint256 output = uint256(p.amountSpecified);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:114:52\n    │\n114 │                 require(int256(delta.amount0()) == int256(output + output * 2 / 98), \"partial sell\");\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:118:27\n    │\n118 │         uint256 ethSide = uint256(delta.amount0() < 0 ? -int256(delta.amount0()) : int256(delta.amount0()));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:44\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/BlacklampHook.sol:121:51\n    │\n121 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SeatBook.sol:147:9\n    │\n147 │         emit Buried(hash, tokenId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Blacklamp.sol:33:42\n   │\n33 │         Checkpoint memory c = Checkpoint(uint48(block.timestamp), outflowNonce[account], uint144(balanceOf(account)));\n   │                                          ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint48' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Blacklamp.sol:33:90\n   │\n33 │         Checkpoint memory c = Checkpoint(uint48(block.timestamp), outflowNonce[account], uint144(balanceOf(account)));\n   │                                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint144' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `pendingSwap` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:182:9\n    │\n182 │         pendingSwap = keccak256(data);\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingSwap` is changed without an event but is used for access control\n    ╭▸ src/NightMarket.sol:192:9\n    │\n192 │         pendingSwap = 0;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/BlacklampHook.sol:144:31\n    │\n144 │         bytes memory result = manager.unlock(\"\");\n    │                               ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/BlacklampHook.sol:158:54\n    │\n158 │         require(amount > 0 && amount <= imdBudget && deadline >= block.timestamp, \"invalid IMD spend\");\n    │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:164:9\n    │\n164 │         emit IMDBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BlacklampHook.sol:174:9\n    │\n174 │         emit SeatBuried(tokenId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NightMarket.sol:99:16\n   │\n99 │         return n > MAX_NIGHTS ? 0 : n;\n   │                ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:131:20\n    │\n131 │                 && deadline >= block.timestamp,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:215:9\n    │\n215 │         emit Joined(n, account);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:160:9\n    │\n160 │         emit Bought(buyer, msg.sender, msg.value, received, referral[buyer]);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:130:42\n    │\n130 │             msg.value > 0 && msg.value < uint256(uint128(type(int128).max)) && minOut > 0\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:130:50\n    │\n130 │             msg.value > 0 && msg.value < uint256(uint128(type(int128).max)) && minOut > 0\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:151:42\n    │\n151 │         BalanceDelta delta = _swap(true, uint128(msg.value));\n    │                                          ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:152:45\n    │\n152 │         require(-int256(delta.amount0()) == int256(msg.value) && delta.amount1() > 0, \"incomplete buy\");\n    │                                             ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:153:20\n    │\n153 │         received = uint128(delta.amount1());\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:170:17\n    │\n170 │         require(lamp.transferFrom(msg.sender, address(this), amount), \"input failed\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:176:24\n    │\n176 │         (bool paid,) = payable(msg.sender).call{value: received}(\"\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/NightMarket.sol:183:33\n    │\n183 │         bytes memory response = manager.unlock(data);\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:165:79\n    │\n165 │             amount > 0 && amount < uint128(type(int128).max) && minOut > 0 && deadline >= block.timestamp,\n    │                                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NightMarket.sol:175:9\n    │\n175 │         emit Sold(msg.sender, amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:165:36\n    │\n165 │             amount > 0 && amount < uint128(type(int128).max) && minOut > 0 && deadline >= block.timestamp,\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/NightMarket.sol:173:20\n    │\n173 │         received = uint128(delta.amount0());\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:228:13\n    │\n228 │         if (block.timestamp < time) return false;\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-oz-erc721-mint]: `ERC721._mint` does not check that the recipient can receive the token; use `_safeMint`\n    ╭▸ src/NightMarket.sol:287:9\n    │\n287 │         _mint(winner, n);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-oz-erc721-mint\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:267:13\n    │\n267 │             block.timestamp >= dawn(n) && n == nextNFTNight && !nftSettled[n] && maxSteps > 0 && maxSteps <= 256,\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NightMarket.sol:230:40\n    │\n230 │         (uint256 held, uint64 nonce) = lamp.stateBefore(account, time);\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/NightMarket.sol:103:9\n    │\n103 │         require(n > 0 && n <= MAX_NIGHTS, \"invalid night\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:299:22\n    │\n299 │             n > 0 && block.timestamp >= dawn(n) - 1 hours && choice < 3 && !voted[n][msg.sender],\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NightMarket.sol:311:17\n    │\n311 │         require(block.timestamp >= dawn(n) && maxSteps > 0 && maxSteps <= 256, \"cannot settle vote\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":18392,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/TokenHistory.t.sol:TokenHistoryTest\n[PASS] testFullSupplyRoundTripAndNeutralTransfers() (gas: 398374)\n[PASS] testFuzzHistoricalSearchAcrossManyCheckpoints(uint256,uint8,uint8) (runs: 1000, μ: 1715408, ~: 1303973)\nLogs:\n  Bound result 19\n  Bound result 709115912132876056919413270\n  Bound result 370787161203783145351068750\n  Bound result 601638124034085503642149140\n  Bound result 740935811614421862757465105\n  Bound result 659905980186131795112591576\n  Bound result 649050387754095629441068146\n  Bound result 144227957124031449607656586\n  Bound result 329077035599193017905538612\n  Bound result 590075610486962356776618291\n  Bound result 130642237927463980890275142\n  Bound result 306455332182329874478662082\n  Bound result 666540570539969310689910253\n  Bound result 133301600921952469430498770\n  Bound result 8384114522305775583300518\n  Bound result 86201074215265113232156598\n  Bound result 14404745277220539876392432\n  Bound result 393216532902527203419656804\n  Bound result 488822758626812807236078539\n  Bound result 586769603983101031574815967\n  Bound result 4\n\n[PASS] testRejectedTransferFromDoesNotWriteHistoryOrConsumeAllowance() (gas: 286273)\n[PASS] testTimestampIsExclusiveAndSameBlockChangesCoalesce() (gas: 487050)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 940.13ms (940.27ms CPU time)\n\nRan 8 tests for test/Purchases.t.sol:PurchasesTest\n[PASS] testBadListingsAndForgedSignatureRejected() (gas: 782068)\n[PASS] testCheapestSeatBuriedAndSellerPaidInSameTransaction() (gas: 2556471)\n[PASS] testIMDBuyerCannotReenterTreasury() (gas: 918148)\n[PASS] testIMDFailuresRestoreFundsAndAccounting() (gas: 1486667)\n[PASS] testIMDFeeBuysToDead() (gas: 773574)\n[PASS] testSeaportCannotReenterBookOrHook() (gas: 2398806)\n[PASS] testSeatFailureAndWrongRecipientRevertEverything() (gas: 2011009)\n[PASS] testStaleCancelledRevokedAndExpiredFloorCanBePruned() (gas: 3230333)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 960.20ms (5.78ms CPU time)\n\nRan 15 tests for test/LaunchAndTrading.t.sol:LaunchAndTradingTest\n[PASS] testAllowanceCannotBeSpentFromCallbackData() (gas: 288452)\n[PASS] testApplicationDeploymentFailureRollsBackEntireLaunch() (gas: 6638954)\n[PASS] testBuyAndSellFailuresAreAtomic() (gas: 1322542)\n[PASS] testBuySellFeeSplitAndCollection() (gas: 983530)\n[PASS] testConstructorMintsOnlyToDeployer() (gas: 23796)\n[PASS] testExactOutputTradesUseOnlyETHFee() (gas: 1227516)\n[PASS] testFuzzFeeConservation(uint96) (runs: 256, μ: 586130, ~: 592468)\nLogs:\n  Bound result 1999999990001226952\n\n[PASS] testLaunchCannotRepeatOrUseWrongConfig() (gas: 4315777)\n[PASS] testNoAdminMintSweepOrWithdraw() (gas: 1413635)\n[PASS] testOtherPoolsCannotUseHookAndAdditionalFeesRevert() (gas: 276613)\n[PASS] testSellPayoutCannotReenter() (gas: 1191042)\n[PASS] testSupplyAndAtomicLaunch() (gas: 111824)\n[PASS] testSwarmClaimsExactAndOnce() (gas: 206892)\n[PASS] testTokenRuntimeHasNoDelegationOrDestruction() (gas: 1041218)\n[PASS] testUnlaunchedFactoryRejectsConfigurationAndCodeSubstitution() (gas: 4102199)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 960.23ms (949.17ms CPU time)\n\nRan 14 tests for test/AdversarialEdges.t.sol:AdversarialEdgesTest\n[PASS] testExpiryIsExclusiveAndCounterInvalidationDoesNotAffectOtherSellers() (gas: 1646439)\n[PASS] testFundingIdentityConsentAndReferralStayFixed() (gas: 1127551)\n[PASS] testFuzzRepeatedRoundTripCannotCreateETH(uint96,uint8) (runs: 1000, μ: 1616568, ~: 1333048)\nLogs:\n  Bound result 81380501262245962\n  Bound result 1\n\n[PASS] testFuzzThreeWayVoteThresholds(uint8,uint8,uint8,uint8) (runs: 1000, μ: 16529526, ~: 16062341)\nLogs:\n  Bound result 46\n  Bound result 16\n  Bound result 2\n  Bound result 24\n\n[PASS] testListingDuplicateReplacementAndBoundedPruning() (gas: 1894740)\n[PASS] testNightBoundariesAndSettlementWorkLimits() (gas: 590261)\n[PASS] testOddWeiFeesAlternateBudgetRounding() (gas: 908036)\n[PASS] testOneWeiSellCannotDestroyTokensForZeroOutput() (gas: 880157)\n[PASS] testPartialExactInputBuyRevertsItsPrechargedFee() (gas: 867697)\n[PASS] testRejectedETHPayoutRestoresTokensFeesAndAllowance() (gas: 1216692)\n[PASS] testSeatPriceCapAndWrongPaymentDoNotConsumeListing() (gas: 1481112)\n[PASS] testSellBeyondActiveLiquidityRollsBackEntireInput() (gas: 1300149)\n[PASS] testTradingRejectsZeroExpiredAndInt128Boundary() (gas: 305022)\n[PASS] testUnauthorizedCallbacksAndETHTransfersFail() (gas: 213131)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 960.46ms (1.20s CPU time)\n\nRan 15 tests for test/Nights.t.sol:NightsTest\n[PASS] testGuideMustAlsoHoldThroughDawn() (gas: 1170415)\n[PASS] testHistoricalDawnSurvivesDelayedSettlement() (gas: 688465)\n[PASS] testHoldDawnStampAndTransferRemovesIt() (gas: 616248)\n[PASS] testLaterNightCannotTakeEarlierNightAward() (gas: 701078)\n[PASS] testNoQualifierBurnsNightAndNinetyNineNightCap() (gas: 9267524)\n[PASS] testPepeTimingDuplicateAndInvalidChoices() (gas: 612571)\n[PASS] testReferralIsActualBuyAddressAndBonusCappedAtOne() (gas: 1742743)\n[PASS] testSelfAndSamePayerReferralsRevert() (gas: 1204399)\n[PASS] testSellAfterVotingRemovesBallotAtDawn() (gas: 15525239)\n[PASS] testSoldBeforeDawnCannotRegainQualificationByRebuying() (gas: 936024)\n[PASS] testThreeNightsWickAndOnlyOneNFTPerAddress() (gas: 1656351)\n[PASS] testVoteBelowQuorumFailsDespiteUnanimity() (gas: 15044425)\n[PASS] testVoteBelowSixtyPercentFails() (gas: 15367038)\n[PASS] testVoteExactlyFiftyAndSixtyPercentPasses() (gas: 15468653)\n[PASS] testZeroAndSelfTransfersDoNotDestroyStamp() (gas: 412983)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 960.52ms (57.95ms CPU time)\n\nRan 2 tests for test/invariant/DistributionInvariant.t.sol:DistributionInvariantTest\n[PASS] invariant_onlyCommittedClaimsSpendTheSwarmAllocation() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+------------+-------+---------+----------╮\n| Contract            | Selector   | Calls | Reverts | Discards |\n+===============================================================+\n| DistributionHandler | claim      | 5443  | 0       | 0        |\n|---------------------+------------+-------+---------+----------|\n| DistributionHandler | forgeClaim | 5488  | 0       | 0        |\n|---------------------+------------+-------+---------+----------|\n| DistributionHandler | transfer   | 5453  | 0       | 0        |\n╰---------------------+------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8000000000000000\n  Bound result 3\n  Bound result 20000000000000000\n  Bound result 57600\n  Bound result 8025\n  Bound result 2827\n  Bound result 4092\n  Bound result 200\n  Bound result 7602179\n  Bound result 828417\n  Bound result 4407669221144046213800780\n  Bound result 6215\n  Bound result 999999\n  Bound result 53333\n  Bound result 1000000\n  Bound result 9\n  Bound result 38031162438158\n  Bound result 15115486070941113040279388\n  Bound result 24284021253455099536836900\n  Bound result 6774\n  Bound result 7504\n  Bound result 10000000000\n  Bound result 209\n  Bound result 26864658714096808543434874\n  Bound result 7676\n  Bound result 1652706262\n  Bound result 127\n  Bound result 37\n\n[PASS] testEveryClaimPaysAllRemainderAndCannotRepeat() (gas: 1241298)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.12s (2.12s CPU time)\n\nRan 1 test for test/invariant/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_ethAndTokenConservation\n[PASS] invariant_feeLiabilitiesAreBackedAndSplitEqually\n[PASS] invariant_purchasesReachDeadAndCountersMatchDeliveries\n TreasuryInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+---------------------+-------+---------+----------╮\n| Contract        | Selector            | Calls | Reverts | Discards |\n+====================================================================+\n| TreasuryHandler | burnIMD             | 1676  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | burySeat            | 1652  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | buy                 | 1659  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | collect             | 1603  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | forbiddenWithdrawal | 1645  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | forceETH            | 1550  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | move                | 1662  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | rejectedBuy         | 1581  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | sell                | 1733  | 0       | 0        |\n|-----------------+---------------------+-------+---------+----------|\n| TreasuryHandler | submit              | 1623  | 0       | 0        |\n╰-----------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n  Bound result 100\n  Bound result 100\n  Bound result 10000000000\n  Bound result 99999990000010964\n  Bound result 73936509593269993\n  Bound result 386308408269159\n  Bound result 9999999999000\n  Bound result 8874\n  Bound result 1000000000000000\n  Bound result 604785627502101\n  Bound result 887220\n  Bound result 423688144506871678483473\n  Bound result 456575437364868838\n  Bound result 25378203525647002\n  Bound result 16989110298698257\n  Bound result 1000000000000000\n  Bound result 499999999950\n  Bound result 0\n  Bound result 3000\n  Bound result 2388599813631917\n  Bound result 99999999999999998\n  Bound result 99999999999999998\n  Bound result 99999990000887273\n  Bound result 27352166387667191\n  Bound result 2\n  Bound result 13911\n  Bound result 5000000000000001\n  Bound result 446002117177788503\n  Bound result 0\n  Bound result 9\n  Bound result 99999999999999997\n  Bound result 13\n  Bound result 554298709277203571\n  Bound result 99999990000011293\n  Bound result 346671089300167\n  Bound result 326258256699853136577000\n  Bound result 6\n  Bound result 999999999900\n  Bound result 97428887807018549374578\n  Bound result 99999990000004171\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.38s (4.37s CPU time)\n\nRan 1 test for test/invariant/NightInvariant.t.sol:NightInvariantTest\n[PASS]\nNightInvariantTest invariants:\n[PASS] invariant_oneImmutableAwardPerNightAndPerHolder\n[PASS] invariant_stampsAndHistoricalEligibilityMatchActions\n NightInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+---------------------+-------+---------+----------╮\n| Contract     | Selector            | Calls | Reverts | Discards |\n+=================================================================+\n| NightHandler | advance             | 2106  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | claim               | 2110  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | join                | 2030  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | move                | 2035  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | rejectAwardTransfer | 2012  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | settleNFT           | 2047  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | settleVote          | 1960  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| NightHandler | vote                | 2084  | 0       | 0        |\n╰--------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 25200\n  Bound result 3600\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 6\n  Bound result 1\n  Bound result 6\n  Bound result 25200\n  Bound result 3600\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 6\n  Bound result 2\n  Bound result 6\n  Bound result 25200\n  Bound result 3600\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 6\n  Bound result 3\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 8669915696374135568\n  Bound result 3\n  Bound result 1013\n  Bound result 32\n  Bound result 1892\n  Bound result 8678339113059173208\n  Bound result 2\n  Bound result 19778\n  Bound result 5886732497676094962\n  Bound result 17010079285216684185\n  Bound result 19490098694026193472\n  Bound result 3\n  Bound result 2\n  Bound result 21960\n  Bound result 4\n  Bound result 1\n  Bound result 1601\n  Bound result 1\n  Bound result 3\n  Bound result 112669859548149319\n  Bound result 23257\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 976338237\n  Bound result 13051711083336807290\n  Bound result 6\n  Bound result 4\n  Bound result 5\n  Bound result 4\n  Bound result 352\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 18.29s (18.26s CPU time)\n\nRan 8 test suites in 18.30s (29.58s CPU time): 60 tests passed, 0 failed, 0 skipped (60 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fd527965bcce2600ff192e29f426d32dd86642e50f6d1906fd233f0594fa8a63","verifiedTreeHash":"1c97eb50ddb291e14ad7a2b2255c9633c9125a87","verifierVersion":"0.1.0+ad90ce4c"}]}