{"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":"working"},{"acceptedSubmissionHash":null,"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":"working"},{"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":"working"},{"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":"working"},{"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":null,"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":"working"}],"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":"0000000000000000000000000000000000000000000000000000000000000000","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":"51327","feedbackHash":"0058ea65cb6f2de7922a900ccd495eab247d2856ed133e9101326161dd4dcc0d","nodeKey":"build_contract_project","submissionHash":"3e0dbbb11a3cb4f0b28695d6e0f9be077804dab089a9328569f968eb99032781","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51521","feedbackHash":"8fee0f1ef112735507754cc1051cd51172720f9a1c3281674cc9f78cb68b6b3e","nodeKey":"build_contract_project","submissionHash":"fc11f0031e1454bdfeb4d7d04f04fd1bd9813d113e3514995f5fb6049b280086","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"0a2a4c2fc21a23573e55c9168d20e94e4534b5ff0b47ecb6054c1918c54f86c1","state":"blocked","submissions":[{"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":"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}}],"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"}]}