{"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":"28510d34-7aba-43ca-93d1-4162f8065b4f","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"fcb95c8adec0b04945de3b7c75de2c1027d8cb0726ff3defe2037df380491b86","dependsOn":["manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"117dcf99916a3d51e6bc356196f89f161ec870fe744352af329745e6b5aafadd","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Launch the Swarmlings repository on Ethereum mainnet as a univ4_hook launch paired with IMD, exactly as launch.json describes: token Swarmlings (LING) with constructor (), hook SwarmlingsHook with constructor ($poolManager, $token) at an address whose low 14 bits are all set (0x3FFF, all hook flags), pool IMD / LING at fee 12500, tick spacing 60. Do not change the contracts' behaviour; adapt only what the launcher needs, and leave src/ untouched: the hook's bytecode is tuned so the protected floor finds its CREATE2 salt quickly from both its factory probe and the test contract (BUILD_TAG in SwarmlingsHook.sol, guarded by test/HookSalt.t.sol), and the vendored DN404 keeps balance and totalSupply in slots of their own so forge-std deal works on any account (test/DealProbe.t.sol); launches 1954 and 2167 parked on exactly these two points. Access: the token and the NFT contract have no owner and cannot change; owner() is a marketplace label with no power. The hook is a router whose fee slices and modules can be changed only by SwarmlingsCouncil, already deployed at 0x4d0b3507D80f678d9e658Fd5482Ca6a96636A032 and owned by the dev wallet 0x92cEf4823119f3332A85A39023eEbA01a06890c4, at once with a logged memo, within limits fixed in code: total hook fee at most 5%, the holders' 1.25% fixed, no module can block a sell or a liquidity removal. At launch there are no slices and no modules. Anyone may call SwarmlingsHook.distribute(), Swarmlings.syncEth(), syncToken(), addRewards() and a sink's poke(); claim(), claimEth() and claimToken() pay only the caller's own rewards; claimDev() pays only the fixed DEV wallet. Numbers: 300,000 LING per NFT, 3,333 NFTs max, 1.25% hook fee in IMD to holders on every LING / IMD pool using the hook, a 60-second launch snipe tax on buys falling from 40% to 0 (to holders), 5% creator fee on NFT sales (half to holders in ETH, half to DEV), rewards that arrive on one UTC day are paid out the next day per second held, poolBps 9000, auto-skip above 800 NFTs minted in one transfer. This job only launches the contracts; the site is built afterwards in a continuation that reads the live addresses.","parentJobId":null,"planHash":"1c601564e34e88aef6fd3449cca5b14d0f84d11eb2f5bb890a65c61efc1b98df","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"28510d34-7aba-43ca-93d1-4162f8065b4f","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2176-launch-swarmlings-repository-ethereum"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51130","feedbackHash":"86ff94fa02317990ea394c92b0a78d3502de541c91788d40aa190a01e8cc6d8c","nodeKey":"audit_imported_code","submissionHash":"fcb95c8adec0b04945de3b7c75de2c1027d8cb0726ff3defe2037df380491b86","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50979","feedbackHash":"2861cda0d0ece2e68c952cc4f57c3457015f924c34273c26ddf5b5f8cc3b0d75","nodeKey":"manifest","submissionHash":"117dcf99916a3d51e6bc356196f89f161ec870fe744352af329745e6b5aafadd","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"86f1722727850e6d4cf4c012564d501c606058a35aef2905de4e2e5df8e2356b","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"61a97aa861fd6f1d34366703dcb6f47fa8c5694a2cb28276741890e4182772a8","device":"eaa98ad0794d4f76","findings":[],"hash":"117dcf99916a3d51e6bc356196f89f161ec870fe744352af329745e6b5aafadd","nodeId":"b30ec919-584e-4e3b-bab6-d77c7aed058b","outcome":"completed","summary":"Updated `launch.json` with precise launch notes, retaining the required constructors, all 14 hook permissions, and exact IMD pool values. Notes are 2,829 characters.\n\nValidation passed: `forge build` succeeded and all 245 tests passed with the supplied fuzz seed. Only `launch.json` changed.","treeHash":"3dd0dafef775014bdf98c6bd454bc2471d6812a3","usage":{"cachedInputTokens":316416,"inputTokens":41508,"model":"gpt-6-astra","outputTokens":4544,"runtime":"codex","turns":4,"wallClockMs":125980}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"232b62e021f6f394","findings":[{"citation":"resolved","description":"afterInitialize binds the first IMD/LING pool it sees at fee 12500 whatever its tickSpacing or initializer. If a third party could initialize PoolKey(IMD, LING, 12500, tickSpacing 1, hook) between hook deployment and the factory's initialize, the launch pool (tickSpacing 60) would not be the bound pool: modules, sinks, _launchKey and the snipe window would belong to the stranger's pool, although the holder fee would still be charged on both (_isCharged checks the pair only). This cannot happen on IMD: the verified LaunchFactory.launch() deploys the hook by CREATE2 and calls poolManager.initialize in the same transaction, and before the hook has code the PoolManager's beforeInitialize call fails the selector check. The 2026-10-10 audit records this as accepted; no change is requested. Noted so the adapter does not split deployment and initialization into separate transactions.","line":292,"path":"src/SwarmlingsHook.sol","reproduction":"State: hook deployed, launch pool not yet initialized (only possible outside the factory). Input: anyone calls PoolManager.initialize(PoolKey(currency0 = min(IMD, LING), currency1 = max(IMD, LING), fee 12500, tickSpacing 1, hooks = hook), 2^96). Actual: launchPoolSet becomes true, launchPool is the tickSpacing-1 pool, launchedAt is now; the factory's later tickSpacing-60 pool is charged but never runs modules. Expected under the atomic factory flow: the factory's own pool is the first and only candidate, which the verified LaunchFactory guarantees (test/Launcher.t.sol and the existing suite exercise the bound-pool case).","severity":"info","snippet":"        if (!launchPoolSet && key.fee == LAUNCH_LP_FEE) {","title":"Launch-pool binding keys on the fee tier only, not on tick spacing (accepted A-4/G-8; safe because LaunchFactory.launch is atomic)"},{"citation":"resolved","description":"When IMD is the specified currency the holder fee is taken in beforeSwap on the full specified amount, so afterSwap refuses a swap whose pool delta is smaller than amountSpecified + fee (a price limit reached, or the pool's LING exhausted). The trade reverts rather than being charged on an amount that was never swapped. This is deliberate and commented, and it is not a module blocking a sell; it is intrinsic and applies to exact-out sells too. Routers that use the MIN/MAX sqrt price limits only hit it when liquidity runs out. Informational: expected behaviour for traders and integrators, not a launch blocker.","line":366,"path":"src/SwarmlingsHook.sol","reproduction":"State: launch pool seeded with LING only (as the factory does), 800,000,000 LING in range. Input: a trader swaps exact-in with amountSpecified = -1e30 IMD, zeroForOne = (IMD is currency0), sqrtPriceLimit = MIN_SQRT_PRICE+1 or MAX_SQRT_PRICE-1. Actual: the pool runs out of LING, rewardDelta is smaller in magnitude than 1e30 - fee, afterSwap reverts PartialFill() and the whole swap is undone. Expected by a trader used to v4: a partial fill of what the pool holds. Same for an exact-out sell (amountSpecified > 0 in IMD) with a price limit that stops the swap early.","severity":"info","snippet":"            if (rewardDelta != params.amountSpecified + int256(fee)) revert PartialFill();","title":"Exact-in buys and exact-out sells revert with PartialFill instead of filling partially when the swap stops early"},{"citation":"resolved","description":"The reference checklist asks reviewers to flag anything configured after deployment rather than in a constructor. Here setSlices, setModules, disableModule and setCouncil are callable by `council`, set in the constructor to the constant COUNCIL = 0x4d0b3507D80f678d9e658Fd5482Ca6a96636A032. On mainnet that address has code and its owner() is the DEV wallet 0x92cEf4823119f3332A85A39023eEbA01a06890c4, as the brief states. The bounds the brief relies on hold in code: setSlices rejects a sum over MAX_FEE_BPS - HOLDER_FEE_BPS (375 bps), the holder floor is a constant, _quote clamps quoted extras and the total at 500 bps, guards may revert only when mayRevert is true (buys, liquidity additions, donations), sells and liquidity removals run observers only, and quoter/observer/poke failures are logged, never bubbled. At launch _slices and _modules are empty. The 2026-10-10 audit accepted the instant single-key council (C-3). No change requested; recorded so the adapter does not treat the council surface as a defect.","line":860,"path":"src/SwarmlingsHook.sol","reproduction":"Input: from 0x92cEf4823119f3332A85A39023eEbA01a06890c4 call SwarmlingsCouncil.execute(hook, abi.encodeCall(setSlices, ([Slice(sink, 376, false)])), memo). Actual: reverts FeeTooHigh() because 376 > 375. Input: setSlices([Slice(sink, 375, false)]) then a 1,000 IMD exact-in buy after the snipe window. Actual: feeBps() == 500, fee 50 IMD, 37.5 IMD minted as claims to the sink and 12.5 IMD to the hook for holders. Input: any address other than the council calls setSlices. Actual: OnlyCouncil().","severity":"info","snippet":"    function setSlices(Slice[] calldata s) external onlyCouncil {","title":"Fee slices, modules and the council are configured after deployment by SwarmlingsCouncil, within constants fixed in code (design endorsed by the brief; council verified on chain)"},{"citation":"resolved","description":"SwarmlingsMirror.transferFrom (and both safeTransferFrom overloads, which route through it) consult the fixed StrictAuthorizedTransferSecurityRegistry at 0xA000027A9B2802E1ddf7000061001e5c005A0000. Its verified source shows that for a collection with no configuration the policy is: a transfer where operator == from passes, otherwise the operator must be on list 0 (OpenSea's default operator list) or be the transiently authorized operator. So a holder can move their own Swarmling, Seaport sales work, but a marketplace or custodian not on OpenSea's list cannot move an approved NFT until DEV, as the collection editor, changes the policy. LING transfers always move the NFTs regardless. The 2026-10-10 audit documents this (L-4) and test/fork/Validator.t.sol asserts exactly this behaviour on a mainnet fork. Not a launch blocker; recorded for the site built afterwards.","line":138,"path":"src/SwarmlingsMirror.sol","reproduction":"State: mainnet, alice holds Swarmling id 1 (900,000 LING). Input: alice calls mirror.setApprovalForAll(market, true) for an address not on OpenSea's default list; market calls mirror.transferFrom(alice, bob, 1). Actual: reverts StrictAuthorizedTransferSecurityRegistry__UnauthorizedTransfer(). Input: alice calls mirror.transferFrom(alice, bob, 1) herself. Actual: succeeds. Input: alice calls ling.transfer(bob, 300000e18). Actual: succeeds and bob receives one NFT.","severity":"info","snippet":"            ITransferValidator(TRANSFER_VALIDATOR).validateTransfer(msg.sender, from, to, id);","title":"NFT transfers through the mirror by a non-whitelisted operator are refused by OpenSea's registry until DEV configures the collection; owner transfers and all LING transfers work"},{"citation":"resolved","description":"SwarmlingsHook's runtime is 22,072 bytes (forge build --sizes), so its code deposit alone is about 4.41M gas at 200 gas per byte. A scratch Foundry deployment of the hook by CREATE2 with constructor arguments (manager, token) measured 4,482,988 gas, and pool initialize through beforeInitialize/afterInitialize 184,183 gas. Adding the token with its mirror (about 3.8M per the docs), the MerkleDistributor, the LING transfers, the seed and the registry write, the whole LaunchFactory.launch() transaction is on the order of 11 to 12M gas, under the 16,777,216 cap IMD's preflight enforces. Informational for the deployer's gasCeilingWei check; the figure in the docs is stale, the hook has grown since it was written.","line":51,"path":"docs/OPERATIONS.md","reproduction":"Input: forge test with a contract that does `create2(0, add(code, 0x20), mload(code), salt)` where code = abi.encodePacked(type(SwarmlingsHook).creationCode, abi.encode(manager, token)) and salt is mined for 0x3FFF, measuring gasleft() around it. Actual: 4,482,988 gas on a fresh PoolManager and a freshly deployed Swarmlings. Expected per docs/OPERATIONS.md: about 1.3M.","severity":"info","snippet":"gas for the token with its NFT contract (mainnet about 3.8M) and about 9.6M for the hook (mainnet about 1.3M).","title":"docs/OPERATIONS.md understates the hook's mainnet deployment gas (measured about 4.48M, not 1.3M); the launch transaction still fits the 16,777,216 cap"},{"citation":"resolved","description":"test/HookSalt.t.sol asserts the search length for six (deployer, manager, token) triples using fixed probe addresses, and passes (under 1,000 salts from the factory probe and from forge's default test contract with the probe manager and token). The CREATE2 address depends on the init-code hash, which includes the constructor arguments, so for any other manager or token address the count is an independent draw with mean 16,384. In the scratch run above (forge test contract as deployer, a fresh PoolManager and a freshly deployed Swarmlings) the first 0x3FFF salt was number 13,889. This does not affect the mainnet launch: LaunchFactory takes `hookSalt` as a parameter mined off chain, and predictHook() lets the deployer check it before sending. It only matters if the protected floor mines with addresses other than the probes the test encodes.","line":75,"path":"src/SwarmlingsHook.sol","reproduction":"Input: the _salts loop from test/HookSalt.t.sol with deployer = 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496, manager = a PoolManager deployed by that contract, token = a Swarmlings deployed by that contract with CREATE2 salt 2168. Actual: 13,889 salts before the first address whose low 14 bits are all set. With the probe addresses the test uses: at most 1,000 (test passes).","severity":"info","snippet":"    bytes32 public constant BUILD_TAG = 0xe9d95bd536ee9aae05c175a1c761dd6312df345bb863ffd9790d390d508dbb8e;","title":"BUILD_TAG keeps the salt search short only for the probe addresses test/HookSalt.t.sol encodes; with other manager and token addresses the count is arbitrary"}],"hash":"fcb95c8adec0b04945de3b7c75de2c1027d8cb0726ff3defe2037df380491b86","nodeId":"d969c4d0-9e78-4b70-acb2-163fd5f510ce","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written and validated. The working tree is otherwise untouched (the scratch test was removed and `.imd-findings.json` is gitignored).\n\n**Verdict: nothing found that would stop or break this launch.** All six recorded items are informational.\n\n**What was checked**\n\n- All of `src/` (token, hook, mirror, council, interfaces, seven modules), the vendored DN404 diffed against upstream commit 3397cb1 (only the two documented struct-field changes), `launch.json`, and the launcher-compatibility tests.\n- The real IMD launch factory at 0x12C63b58…, read from its Sourcify-verified source, so the hook was traced against the exact mainnet sequence: atomic CREATE2 of token and hook, flag check equal to 0x3FFF, pool initialize, LING-only seed, and zero-liquidity fee collects. The hook returns a zero delta to the factory in every one of those paths, so neither of the factory's revert guards can fire.\n- The IMD token is a plain LayerZero OFT over OpenZeppelin ERC20 with no transfer fee, pause or blacklist.\n- On chain: the council has code and its owner is the DEV wallet; the renderer has code.\n- Build clean, 241 tests pass including invariants, every contract under EIP-170, manifest keys and notes length valid, no forbidden opcodes or proxies.\n\n**Informational items recorded**\n\n- Launch-pool binding keys on fee tier only (already accepted in the prior audit; safe because the factory is atomic).\n- Exact-in buys and exact-out sells revert with PartialFill rather than filling partially when liquidity runs out.\n- Council-configured slices and modules are post-deployment configuration, bounded in code and endorsed by the brief.\n- Mirror NFT transfers by operators outside OpenSea's default list are refused until DEV configures the collection; owner and LING transfers always work.\n- The hook costs about 4.48M gas to deploy, not the 1.3M the operations doc states. The full launch transaction still fits under the 16.78M cap.\n- BUILD_TAG's short salt search holds for the probe addresses in the test, not for arbitrary addresses; the factory takes an off-chain mined salt, so this does not affect mainnet.\n\n**Not reached:** the renderer sources under `renderer/`, and the bodies of the larger existing test files, which were run but not read line by line.","treeHash":null,"usage":{"cachedInputTokens":1768240,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":61048,"runtime":"claude","turns":38,"wallClockMs":870670}}],"verification":[{"checks":[{"durationMs":13089,"exitCode":0,"name":"build","output":"Compiling 111 files with Solc 0.8.26\nSolc 0.8.26 finished in 12.94s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SwarmlingsHook.sol:242:51:\n    |\n242 |     function currentSwap() external view returns (bool buy, uint256 bps, uint256 fee) {\n    |                                                   ^^^^^^^^\nNote: The other declaration is here:\n   --> src/SwarmlingsHook.sol:707:5:\n    |\n707 |     function buy(uint256 budget, uint160 sqrtPriceLimitX96)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SwarmlingsHook.sol:320:9:\n    |\n320 |         bool buy = _isBuy(params);\n    |         ^^^^^^^^\nNote: The other declaration is here:\n   --> src/SwarmlingsHook.sol:707:5:\n    |\n707 |     function buy(uint256 budget, uint160 sqrtPriceLimitX96)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SwarmlingsHook.sol:358:9:\n    |\n358 |         bool buy = _isBuy(params);\n    |         ^^^^^^^^\nNote: The other declaration is here:\n   --> src/SwarmlingsHook.sol:707:5:\n    |\n707 |     function buy(uint256 budget, uint160 sqrtPriceLimitX96)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SwarmlingsHook.sol:520:21:\n    |\n520 |     function _quote(bool buy, uint256 depth) private returns (uint256 bps) {\n    |                     ^^^^^^^^\nNote: The other declaration is here:\n   --> src/SwarmlingsHook.sol:707:5:\n    |\n707 |     function buy(uint256 budget, uint160 sqrtPriceLimitX96)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SwarmlingsHook.sol:644:49:\n    |\n644 |     function _collect(uint256 fee, uint256 bps, bool buy) private {\n    |                                                 ^^^^^^^^\nNote: The other declaration is here:\n   --> src/SwarmlingsHook.sol:707:5:\n    |\n707 |     function buy(uint256 budget, uint160 sqrtPriceLimitX96)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:287:30:\n    |\n287 |     function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n    |                              ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:287:68:\n    |\n287 |     function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n    |                                                                    ^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:287:90:\n    |\n287 |     function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n    |                                                                                          ^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:312:9:\n    |\n312 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:315:9:\n    |\n315 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:341:9:\n    |\n341 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:345:9:\n    |\n345 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:392:9:\n    |\n392 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:394:9:\n    |\n394 |         ModifyLiquidityParams calldata params,\n    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:395:9:\n    |\n395 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:409:9:\n    |\n409 |         BalanceDelta delta,\n    |         ^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:411:9:\n    |\n411 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:427:9:\n    |\n427 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:429:9:\n    |\n429 |         ModifyLiquidityParams calldata params,\n    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:430:9:\n    |\n430 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:444:9:\n    |\n444 |         BalanceDelta delta,\n    |         ^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:446:9:\n    |\n446 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:489:9:\n    |\n489 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:491:9:\n    |\n491 |         uint256 amount0,\n    |         ^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:492:9:\n    |\n492 |         uint256 amount1,\n    |         ^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:493:9:\n    |\n493 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:502:9:\n    |\n502 |         address sender,\n    |         ^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:504:9:\n    |\n504 |         uint256 amount0,\n    |         ^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:505:9:\n    |\n505 |         uint256 amount1,\n    |         ^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/SwarmlingsHook.sol:506:9:\n    |\n506 |         bytes calldata hookData\n    |         ^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/fork/Validator.t.sol:58:5:\n   |\n58 |     function test_fork_marketplaceView() public {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":3028,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/fork/Validator.t.sol:ValidatorForkTest\n[PASS] test_fork_marketplaceView() (gas: 2305)\n[PASS] test_fork_ownersMoveTheirOwnNfts() (gas: 2305)\n[PASS] test_fork_realImdRewards() (gas: 2371)\n[PASS] test_fork_unauthorizedOperatorsAreStopped() (gas: 2306)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 326.45µs (44.27µs CPU time)\n\nRan 1 test for test/Manifest.t.sol:ManifestTest\n[PASS] test_launchJsonPairsWithImdAtTheLaunchTier() (gas: 30044)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 602.02µs (429.08µs CPU time)\n\nRan 3 tests for test/Launcher.t.sol:ImdFirstLauncherTest\n[PASS] test_dealWritesLingBalanceAndSupply() (gas: 567399)\n[PASS] test_launcherCollectsItsWholeFeeInsideTheJitWindow() (gas: 937914)\n[PASS] test_launcherIsTheDeployer() (gas: 5671)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.93ms (1.61ms CPU time)\n\nRan 1 test for test/SwarmlingsHook.t.sol:TokenOnlySeedTest\n[PASS] test_firstBuysWorkWithAnEmptyManager() (gas: 3942827)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.97ms (2.88ms CPU time)\n\nRan 3 tests for test/Launcher.t.sol:LingFirstLauncherTest\n[PASS] test_dealWritesLingBalanceAndSupply() (gas: 567399)\n[PASS] test_launcherCollectsItsWholeFeeInsideTheJitWindow() (gas: 937573)\n[PASS] test_launcherIsTheDeployer() (gas: 5671)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.47ms (2.54ms CPU time)\n\nRan 1 test for test/DealProbe.t.sol:DealProbeTest\n[PASS] test_dealWorksOnEveryAccountShape() (gas: 2524430)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.68ms (4.24ms CPU time)\n\nRan 1 test for test/GasCap.t.sol:GasCapTest\n[PASS] test_gasWorstCases() (gas: 28648469)\nLogs:\n  n 800\n  buy exact-out minting n    9774484\n  transfer moving n NFTs     6002821\n  sell burning n NFTs        4037720\n  plain transfer minting n   9574611\n  EIP-7825 cap               16777216\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.49ms (11.82ms CPU time)\n\nRan 1 test for test/HookSalt.t.sol:HookSaltTest\n[PASS] test_floorFindsTheHookSaltQuickly() (gas: 11832814)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.90ms (14.63ms CPU time)\n\nRan 3 tests for test/Launcher.t.sol:NativeLauncherTest\n[PASS] test_dealWritesLingBalanceAndSupply() (gas: 567399)\n[PASS] test_launcherCollectsItsWholeFeeInsideTheJitWindow() (gas: 2570726)\n[PASS] test_launcherIsTheDeployer() (gas: 5671)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 25.08ms (2.61ms CPU time)\n\nRan 22 tests for test/SwarmlingsHook.t.sol:ImdFirstHookTest\n[PASS] testFuzz_feeModes(uint256,uint8) (runs: 256, μ: 5523209, ~: 4386131)\n[PASS] test_buyExactIn() (gas: 407268)\n[PASS] test_buyExactOut() (gas: 495526)\n[PASS] test_callbacksOnlyFromManager() (gas: 121066)\n[PASS] test_distributeNeedsMinimum() (gas: 1883128)\n[PASS] test_distributeStreamsEverythingToHolders() (gas: 1177534)\n[PASS] test_everyLingRewardPoolPaysTheHolderFee() (gas: 866061)\n[PASS] test_feesWithNoHoldersWaitForTheFirstNft() (gas: 1471034)\n[PASS] test_flashBorrowedNftsEarnNothing() (gas: 9113583)\n[PASS] test_holdersClaim() (gas: 3925847)\n[PASS] test_jitPenaltyOnlyWithinTheWindow() (gas: 929495)\n[PASS] test_launchPoolCannotBeHijacked() (gas: 442219)\n[PASS] test_onlyTheFirstLaunchPairPays() (gas: 90346)\n[PASS] test_partialFillRevertsWhenFeeWasTakenUpFront() (gas: 201036)\n[PASS] test_permissionsAndLaunchPool() (gas: 79828)\n[PASS] test_poolAndRoutersNeverHoldNfts() (gas: 7932230)\n[PASS] test_rewardsFollowTimeHeld() (gas: 1651823)\n[PASS] test_sellExactIn() (gas: 628754)\n[PASS] test_sellExactOut() (gas: 840593)\n[PASS] test_skippedHandOverGivesALateBuyerNoBackPay() (gas: 7972548)\n[PASS] test_unsolicitedUnlockCallbackReverts() (gas: 35256)\n[PASS] test_whaleBuyMintsManyNfts() (gas: 1598337)\nLogs:\n  gas, exact-out buy minting 100 NFTs: 1574761\n\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 204.33ms (227.84ms CPU time)\n\nRan 22 tests for test/SwarmlingsHook.t.sol:NativeHookTest\n[PASS] testFuzz_feeModes(uint256,uint8) (runs: 256, μ: 6253357, ~: 6780517)\n[PASS] test_buyExactIn() (gas: 2132152)\n[PASS] test_buyExactOut() (gas: 463829)\n[PASS] test_callbacksOnlyFromManager() (gas: 120586)\n[PASS] test_distributeNeedsMinimum() (gas: 584275)\n[PASS] test_distributeStreamsEverythingToHolders() (gas: 2839273)\n[PASS] test_everyLingRewardPoolPaysTheHolderFee() (gas: 753571)\n[PASS] test_feesWithNoHoldersWaitForTheFirstNft() (gas: 1361598)\n[PASS] test_flashBorrowedNftsEarnNothing() (gas: 14913521)\n[PASS] test_holdersClaim() (gas: 13532068)\n[PASS] test_jitPenaltyOnlyWithinTheWindow() (gas: 2621465)\n[PASS] test_launchPoolCannotBeHijacked() (gas: 421407)\n[PASS] test_onlyTheFirstLaunchPairPays() (gas: 89994)\n[PASS] test_partialFillRevertsWhenFeeWasTakenUpFront() (gas: 199425)\n[PASS] test_permissionsAndLaunchPool() (gas: 79818)\n[PASS] test_poolAndRoutersNeverHoldNfts() (gas: 1740637)\n[PASS] test_rewardsFollowTimeHeld() (gas: 9861725)\n[PASS] test_sellExactIn() (gas: 563181)\n[PASS] test_sellExactOut() (gas: 735791)\n[PASS] test_skippedHandOverGivesALateBuyerNoBackPay() (gas: 2418)\n[PASS] test_unsolicitedUnlockCallbackReverts() (gas: 35256)\n[PASS] test_whaleBuyMintsManyNfts() (gas: 1576268)\nLogs:\n  gas, exact-out buy minting 100 NFTs: 1552692\n\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 218.02ms (219.54ms CPU time)\n\nRan 22 tests for test/SwarmlingsHook.t.sol:LingFirstHookTest\n[PASS] testFuzz_feeModes(uint256,uint8) (runs: 256, μ: 5328142, ~: 4386946)\n[PASS] test_buyExactIn() (gas: 406905)\n[PASS] test_buyExactOut() (gas: 496341)\n[PASS] test_callbacksOnlyFromManager() (gas: 121066)\n[PASS] test_distributeNeedsMinimum() (gas: 1882832)\n[PASS] test_distributeStreamsEverythingToHolders() (gas: 1177988)\n[PASS] test_everyLingRewardPoolPaysTheHolderFee() (gas: 863213)\n[PASS] test_feesWithNoHoldersWaitForTheFirstNft() (gas: 1471197)\n[PASS] test_flashBorrowedNftsEarnNothing() (gas: 9094271)\n[PASS] test_holdersClaim() (gas: 3926404)\n[PASS] test_jitPenaltyOnlyWithinTheWindow() (gas: 929186)\n[PASS] test_launchPoolCannotBeHijacked() (gas: 442285)\n[PASS] test_onlyTheFirstLaunchPairPays() (gas: 90280)\n[PASS] test_partialFillRevertsWhenFeeWasTakenUpFront() (gas: 200653)\n[PASS] test_permissionsAndLaunchPool() (gas: 79828)\n[PASS] test_poolAndRoutersNeverHoldNfts() (gas: 7932240)\n[PASS] test_rewardsFollowTimeHeld() (gas: 1652219)\n[PASS] test_sellExactIn() (gas: 629060)\n[PASS] test_sellExactOut() (gas: 839487)\n[PASS] test_skippedHandOverGivesALateBuyerNoBackPay() (gas: 7953620)\n[PASS] test_unsolicitedUnlockCallbackReverts() (gas: 35256)\n[PASS] test_whaleBuyMintsManyNfts() (gas: 1599154)\nLogs:\n  gas, exact-out buy minting 100 NFTs: 1575578\n\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 218.01ms (168.55ms CPU time)\n\nRan 32 tests for test/Hive.t.sol:NativeHiveTest\n[PASS] testFuzz_feeSplitsAcrossModes(uint256,uint8) (runs: 256, μ: 6655975, ~: 6992854)\n[PASS] test_audit_badQuotersNeverBlockSells() (gas: 1824459)\n[PASS] test_audit_dirtySinkNeverBlocksSwaps() (gas: 1451593)\n[PASS] test_audit_dueSinkDoesNotMakeLowGasSwapsRevert() (gas: 3228230)\n[PASS] test_audit_failingSinkDoesNotStarveTheNext() (gas: 2580705)\n[PASS] test_audit_jitTopUpIsPenalizedToo() (gas: 6987830)\n[PASS] test_audit_nestedSwapKeepsTheOuterFee() (gas: 1411855)\n[PASS] test_audit_returnDataBombIsNotPaidByTraders() (gas: 6731771)\n[PASS] test_audit_sinkCannotBeTheHook() (gas: 74210)\n[PASS] test_audit_twapHasNoLag() (gas: 8829760)\n[PASS] test_autoLiquidityBuildsAPermanentPosition() (gas: 5892833)\n[PASS] test_buybackBurnsSupply() (gas: 1122265)\n[PASS] test_buybackLeavesTheRestWhenTheBandIsHit() (gas: 18789360)\n[PASS] test_councilExecutesAtOnce() (gas: 216183)\n[PASS] test_councilLivesAtTheConstant() (gas: 54256)\n[PASS] test_frozenCouncil() (gas: 98620)\n[PASS] test_guardsRevertBuysNeverSells() (gas: 1993775)\n[PASS] test_journal() (gas: 63399)\n[PASS] test_lowGasSkipsObserversInsteadOfReverting() (gas: 435876)\n[PASS] test_maxBuyGuard() (gas: 2634610)\n[PASS] test_moduleValidationAndEmergencyDisable() (gas: 1604689)\n[PASS] test_observersNeverBlock() (gas: 1086094)\n[PASS] test_onlyTheCouncilConfigures() (gas: 88266)\n[PASS] test_ownerCanHandTheCouncilOn() (gas: 105133)\n[PASS] test_quotedExtraGoesToHoldersAndIsCapped() (gas: 5902480)\n[PASS] test_servicesOnlyForSinks() (gas: 2477338)\n[PASS] test_sliceValidation() (gas: 515803)\n[PASS] test_snipeTaxDecaysOverTheFirstMinute() (gas: 5184147)\n[PASS] test_snipeTaxNeverHitsSells() (gas: 553952)\n[PASS] test_snipeTaxSitsOutsideTheCouncilCap() (gas: 1798874)\n[PASS] test_treasurySinkForwardsToTheRecipient() (gas: 4603801)\n[PASS] test_twapAndVolatilityFee() (gas: 11388093)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 224.51ms (300.98ms CPU time)\n\nRan 30 tests for test/Swarmlings.t.sol:SwarmlingsTest\n[PASS] testFuzz_rewardsNeverExceedWhatArrived(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1577203, ~: 1565281)\n[PASS] test_claimCannotBeReentered() (gas: 793322)\n[PASS] test_claimCountsUnsyncedCreatorFees() (gas: 490861)\n[PASS] test_claimOneAssetAtATime() (gas: 660208)\n[PASS] test_constructor() (gas: 93526)\n[PASS] test_contractsSkipUnlessTheyOptIn() (gas: 727413)\n[PASS] test_creatorFeeSplitsHalfToDev() (gas: 592619)\n[PASS] test_delegatedWalletsGetNftsLikeAnyWallet() (gas: 555177)\n[PASS] test_eachDayPaysWhatArrivedTheDayBefore() (gas: 679239)\n[PASS] test_holdingForAMomentEarnsAMomentsShare() (gas: 878009)\n[PASS] test_hugeBuySwitchesToSkipInsteadOfRunningOutOfGas() (gas: 19647302)\n[PASS] test_keepPutsFavouritesFirst() (gas: 610545)\n[PASS] test_keepRejectsOthersAndDuplicates() (gas: 534268)\n[PASS] test_nextMintIdsFollowTheCycle() (gas: 10862767)\n[PASS] test_nftSaleKeepsEarningsWithSeller() (gas: 984151)\n[PASS] test_quietDaysKeepTheQueueIntact() (gas: 569771)\n[PASS] test_rewardWithNoNftsWaitsForTheFirstOne() (gas: 507064)\n[PASS] test_rewardsStreamOverADay() (gas: 1175903)\n[PASS] test_royaltyInfo() (gas: 43821)\n[PASS] test_selfTransferProtectsAFavourite() (gas: 590857)\n[PASS] test_sellingBelowAUnitBurnsTheNewestAndKeepsEarnings() (gas: 676847)\n[PASS] test_swapFeesNeverGoToDev() (gas: 391016)\n[PASS] test_swarmShareMintsNoNftUntilTopUp() (gas: 368177)\n[PASS] test_tokenURIComesFromRenderer() (gas: 482313)\n[PASS] test_tokenURIPlaceholderWithoutRenderer() (gas: 275913)\n[PASS] test_tokenURISurvivesARevertingRenderer() (gas: 413397)\n[PASS] test_transfersMoveExactAmounts(uint256) (runs: 256, μ: 594085, ~: 175054)\n[PASS] test_unitBoundaries() (gas: 669130)\n[PASS] test_validatorGatesOperatorTransfersOnly() (gas: 1181428)\n[PASS] test_validatorIsFixed() (gas: 8547)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 229.78ms (483.48ms CPU time)\n\nRan 33 tests for test/Swarmlings.t.sol:SwarmlingsMainnetTest\n[PASS] testFuzz_rewardsNeverExceedWhatArrived(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1649917, ~: 1636977)\n[PASS] test_claimCannotBeReentered() (gas: 856468)\n[PASS] test_claimCannotReenterSyncToken() (gas: 1583765)\n[PASS] test_claimCountsUnsyncedCreatorFees() (gas: 549505)\n[PASS] test_claimOneAssetAtATime() (gas: 744254)\n[PASS] test_constructor() (gas: 98934)\n[PASS] test_contractsSkipUnlessTheyOptIn() (gas: 777880)\n[PASS] test_creatorFeeSplitsHalfToDev() (gas: 633939)\n[PASS] test_delegatedWalletsGetNftsLikeAnyWallet() (gas: 620049)\n[PASS] test_eachDayPaysWhatArrivedTheDayBefore() (gas: 715275)\n[PASS] test_holdingForAMomentEarnsAMomentsShare() (gas: 950781)\n[PASS] test_hugeBuySwitchesToSkipInsteadOfRunningOutOfGas() (gas: 19741084)\n[PASS] test_keepPutsFavouritesFirst() (gas: 660991)\n[PASS] test_keepRejectsOthersAndDuplicates() (gas: 584713)\n[PASS] test_mainnetEarnsBothCurrencies() (gas: 1189502)\n[PASS] test_nextMintIdsFollowTheCycle() (gas: 10927616)\n[PASS] test_nftSaleKeepsEarningsWithSeller() (gas: 1035736)\n[PASS] test_quietDaysKeepTheQueueIntact() (gas: 605919)\n[PASS] test_rewardWithNoNftsWaitsForTheFirstOne() (gas: 543190)\n[PASS] test_rewardsStreamOverADay() (gas: 1249281)\n[PASS] test_royaltyInfo() (gas: 43821)\n[PASS] test_selfTransferProtectsAFavourite() (gas: 670110)\n[PASS] test_sellingBelowAUnitBurnsTheNewestAndKeepsEarnings() (gas: 730114)\n[PASS] test_swapFeesNeverGoToDev() (gas: 429729)\n[PASS] test_swarmShareMintsNoNftUntilTopUp() (gas: 418644)\n[PASS] test_tokenURIComesFromRenderer() (gas: 518397)\n[PASS] test_tokenURIPlaceholderWithoutRenderer() (gas: 312019)\n[PASS] test_tokenURISurvivesARevertingRenderer() (gas: 449503)\n[PASS] test_transfersMoveExactAmounts(uint256) (runs: 256, μ: 661675, ~: 211094)\n[PASS] test_unitBoundaries() (gas: 748407)\n[PASS] test_unsolicitedImdGoesToHoldersToo() (gas: 570945)\n[PASS] test_validatorGatesOperatorTransfersOnly() (gas: 1260750)\n[PASS] test_validatorIsFixed() (gas: 8525)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 229.83ms (312.00ms CPU time)\n\nRan 32 tests for test/Hive.t.sol:LingFirstHiveTest\n[PASS] testFuzz_feeSplitsAcrossModes(uint256,uint8) (runs: 256, μ: 5693547, ~: 4689986)\n[PASS] test_audit_badQuotersNeverBlockSells() (gas: 3259579)\n[PASS] test_audit_dirtySinkNeverBlocksSwaps() (gas: 2766794)\n[PASS] test_audit_dueSinkDoesNotMakeLowGasSwapsRevert() (gas: 1587709)\n[PASS] test_audit_failingSinkDoesNotStarveTheNext() (gas: 933278)\n[PASS] test_audit_jitTopUpIsPenalizedToo() (gas: 5421867)\n[PASS] test_audit_nestedSwapKeepsTheOuterFee() (gas: 1611600)\n[PASS] test_audit_returnDataBombIsNotPaidByTraders() (gas: 6776099)\n[PASS] test_audit_sinkCannotBeTheHook() (gas: 74210)\n[PASS] test_audit_twapHasNoLag() (gas: 8921940)\n[PASS] test_autoLiquidityBuildsAPermanentPosition() (gas: 7034392)\n[PASS] test_buybackBurnsSupply() (gas: 2429060)\n[PASS] test_buybackLeavesTheRestWhenTheBandIsHit() (gas: 2395685)\n[PASS] test_councilExecutesAtOnce() (gas: 216207)\n[PASS] test_councilLivesAtTheConstant() (gas: 54256)\n[PASS] test_frozenCouncil() (gas: 98632)\n[PASS] test_guardsRevertBuysNeverSells() (gas: 2093986)\n[PASS] test_journal() (gas: 63399)\n[PASS] test_lowGasSkipsObserversInsteadOfReverting() (gas: 436127)\n[PASS] test_maxBuyGuard() (gas: 2746988)\n[PASS] test_moduleValidationAndEmergencyDisable() (gas: 4051282)\n[PASS] test_observersNeverBlock() (gas: 2384663)\n[PASS] test_onlyTheCouncilConfigures() (gas: 88290)\n[PASS] test_ownerCanHandTheCouncilOn() (gas: 105133)\n[PASS] test_quotedExtraGoesToHoldersAndIsCapped() (gas: 1593427)\n[PASS] test_servicesOnlyForSinks() (gas: 779747)\n[PASS] test_sliceValidation() (gas: 515839)\n[PASS] test_snipeTaxDecaysOverTheFirstMinute() (gas: 18522749)\n[PASS] test_snipeTaxNeverHitsSells() (gas: 617331)\n[PASS] test_snipeTaxSitsOutsideTheCouncilCap() (gas: 7546872)\n[PASS] test_treasurySinkForwardsToTheRecipient() (gas: 1491169)\n[PASS] test_twapAndVolatilityFee() (gas: 13274756)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 229.85ms (304.72ms CPU time)\n\nRan 32 tests for test/Hive.t.sol:ImdFirstHiveTest\n[PASS] testFuzz_feeSplitsAcrossModes(uint256,uint8) (runs: 256, μ: 5789895, ~: 4689171)\n[PASS] test_audit_badQuotersNeverBlockSells() (gas: 3259263)\n[PASS] test_audit_dirtySinkNeverBlocksSwaps() (gas: 2766786)\n[PASS] test_audit_dueSinkDoesNotMakeLowGasSwapsRevert() (gas: 1586995)\n[PASS] test_audit_failingSinkDoesNotStarveTheNext() (gas: 933641)\n[PASS] test_audit_jitTopUpIsPenalizedToo() (gas: 5422152)\n[PASS] test_audit_nestedSwapKeepsTheOuterFee() (gas: 1631250)\n[PASS] test_audit_returnDataBombIsNotPaidByTraders() (gas: 6775793)\n[PASS] test_audit_sinkCannotBeTheHook() (gas: 74210)\n[PASS] test_audit_twapHasNoLag() (gas: 8923341)\n[PASS] test_autoLiquidityBuildsAPermanentPosition() (gas: 7035949)\n[PASS] test_buybackBurnsSupply() (gas: 2430172)\n[PASS] test_buybackLeavesTheRestWhenTheBandIsHit() (gas: 2391373)\n[PASS] test_councilExecutesAtOnce() (gas: 216207)\n[PASS] test_councilLivesAtTheConstant() (gas: 54256)\n[PASS] test_frozenCouncil() (gas: 98632)\n[PASS] test_guardsRevertBuysNeverSells() (gas: 2094347)\n[PASS] test_journal() (gas: 63399)\n[PASS] test_lowGasSkipsObserversInsteadOfReverting() (gas: 436128)\n[PASS] test_maxBuyGuard() (gas: 2743354)\n[PASS] test_moduleValidationAndEmergencyDisable() (gas: 4051874)\n[PASS] test_observersNeverBlock() (gas: 2384959)\n[PASS] test_onlyTheCouncilConfigures() (gas: 88290)\n[PASS] test_ownerCanHandTheCouncilOn() (gas: 105133)\n[PASS] test_quotedExtraGoesToHoldersAndIsCapped() (gas: 1594386)\n[PASS] test_servicesOnlyForSinks() (gas: 780112)\n[PASS] test_sliceValidation() (gas: 515839)\n[PASS] test_snipeTaxDecaysOverTheFirstMinute() (gas: 18522889)\n[PASS] test_snipeTaxNeverHitsSells() (gas: 617025)\n[PASS] test_snipeTaxSitsOutsideTheCouncilCap() (gas: 7547170)\n[PASS] test_treasurySinkForwardsToTheRecipient() (gas: 1491015)\n[PASS] test_twapAndVolatilityFee() (gas: 13279332)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 243.62ms (306.05ms CPU time)\n\nRan 2 tests for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_claimsAreCounted\n[PASS] invariant_hookLedger\n[PASS] invariant_nftsMatchBalances\n[PASS] invariant_rewardsAreSolvent\n InvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------+------------+-------+---------+----------╮\n| Contract | Selector   | Calls | Reverts | Discards |\n+====================================================+\n| Handler  | buy        | 825   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | claim      | 805   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | creatorFee | 815   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | devClaim   | 843   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | distribute | 792   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | donate     | 822   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | sell       | 838   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | sendLing   | 815   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | sendNft    | 805   | 0       | 0        |\n|----------+------------+-------+---------+----------|\n| Handler  | wait       | 832   | 0       | 0        |\n╰----------+------------+-------+---------+----------╯\n\n[PASS] test_handlerTradesForReal() (gas: 34780467)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.85s (2.89s CPU time)\n\nRan 18 test suites in 2.86s (4.73s CPU time): 245 tests passed, 0 failed, 0 skipped (245 total tests)\n","passed":true},{"durationMs":139,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AutoLiquidity.collect()\",\"AutoLiquidity.poke()\",\"BuybackBurn.poke()\",\"Swarmlings.addRewards()\",\"Swarmlings.approve(address,uint256)\",\"Swarmlings.burn(uint256)\",\"Swarmlings.claim()\",\"Swarmlings.claimDev()\",\"Swarmlings.claimEth()\",\"Swarmlings.claimToken()\",\"Swarmlings.fallback()\",\"Swarmlings.keep(uint256[])\",\"Swarmlings.receive()\",\"Swarmlings.setSkipNFT(bool)\",\"Swarmlings.syncEth()\",\"Swarmlings.syncToken()\",\"Swarmlings.transfer(address,uint256)\",\"Swarmlings.transferFrom(address,address,uint256)\",\"SwarmlingsCouncil.execute(address,bytes,string)\",\"SwarmlingsCouncil.post(string)\",\"SwarmlingsCouncil.setOwner(address)\",\"SwarmlingsHook.addLiquidity(int24,int24,uint128)\",\"SwarmlingsHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"SwarmlingsHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"SwarmlingsHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"SwarmlingsHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"SwarmlingsHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SwarmlingsHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"SwarmlingsHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"SwarmlingsHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"SwarmlingsHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SwarmlingsHook.buy(uint256,uint160)\",\"SwarmlingsHook.collectFees(int24,int24)\",\"SwarmlingsHook.disableModule(address)\",\"SwarmlingsHook.distribute()\",\"SwarmlingsHook.receive()\",\"SwarmlingsHook.setCouncil(address)\",\"SwarmlingsHook.setModules((address,uint16,bool)[])\",\"SwarmlingsHook.setSlices((address,uint16,bool)[])\",\"SwarmlingsHook.take(address,address,uint256)\",\"SwarmlingsHook.unlockCallback(bytes)\",\"SwarmlingsMirror.approve(address,uint256)\",\"SwarmlingsMirror.fallback()\",\"SwarmlingsMirror.pullOwner()\",\"SwarmlingsMirror.receive()\",\"SwarmlingsMirror.safeTransferFrom(address,address,uint256)\",\"SwarmlingsMirror.safeTransferFrom(address,address,uint256,bytes)\",\"SwarmlingsMirror.setApprovalForAll(address,bool)\",\"SwarmlingsMirror.transferFrom(address,address,uint256)\",\"TreasurySink.poke()\",\"TwapOracle.onBeforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"TwapOracle.record()\"],\"files\":{\".gitignore\":8,\"LICENSE\":21,\"README.md\":156,\"docs/DEPENDENCIES.md\":31,\"docs/HIVE.md\":133,\"docs/OPERATIONS.md\":99,\"docs/SECURITY.md\":128,\"docs/abi/AutoLiquidity.json\":276,\"docs/abi/BuybackBurn.json\":224,\"docs/abi/MaxBuy.json\":204,\"docs/abi/Swarmlings.json\":964,\"docs/abi/SwarmlingsCouncil.json\":137,\"docs/abi/SwarmlingsHook.json\":2085,\"docs/abi/SwarmlingsMirror.json\":607,\"docs/abi/SwarmlingsRenderer.json\":152,\"docs/abi/TreasurySink.json\":223,\"docs/abi/TwapOracle.json\":259,\"docs/abi/VolatilityFee.json\":228,\"docs/audit/2026-10-10/AUDIT-REPORT.md\":57,\"docs/audit/2026-10-10/CROPS.md\":152,\"docs/audit/2026-10-10/findings-access-control.md\":201,\"docs/audit/2026-10-10/findings-defi-amm.md\":91,\"docs/audit/2026-10-10/findings-dos.md\":93,\"docs/audit/2026-10-10/findings-erc20.md\":63,\"docs/audit/2026-10-10/findings-erc721.md\":143,\"docs/audit/2026-10-10/findings-flashloans.md\":112,\"docs/audit/2026-10-10/findings-general.md\":204,\"docs/audit/2026-10-10/findings-precision-math.md\":111,\"docs/audit/2026-10-10/poc/AccessControlAudit.t.sol\":283,\"docs/audit/2026-10-10/poc/AmmAudit.t.sol\":470,\"docs/audit/2026-10-10/poc/Dos.t.sol\":638,\"docs/audit/2026-10-10/poc/ERC20Audit.t.sol\":640,\"docs/audit/2026-10-10/poc/Erc721Audit.t.sol\":490,\"docs/audit/2026-10-10/poc/Erc721AuditFork.t.sol\":186,\"docs/audit/2026-10-10/poc/FlashAtomic.t.sol\":297,\"docs/audit/2026-10-10/poc/FlashJit.t.sol\":88,\"docs/audit/2026-10-10/poc/FlashOracle.t.sol\":120,\"docs/audit/2026-10-10/poc/FlashSinks.t.sol\":256,\"docs/audit/2026-10-10/poc/FlashSkip.t.sol\":32,\"docs/audit/2026-10-10/poc/GeneralAudit.t.sol\":176,\"docs/audit/2026-10-10/poc/PrecisionMath.t.sol\":204,\"docs/audit/2026-10-10/poc/RendererCode.sol\":4,\"docs/audit/2026-10-10/poc/RendererGas.t.sol\":30,\"foundry.toml\":23,\"launch.json\":39,\"remappings.txt\":4,\"renderer/README.md\":17,\"renderer/foundry.toml\":16,\"renderer/lib/solady/LICENSE.txt\":21,\"renderer/lib/solady/src/utils/Base64.sol\":171,\"renderer/lib/solady/src/utils/DynamicBufferLib.sol\":1318,\"renderer/lib/solady/src/utils/LibBytes.sol\":882,\"renderer/lib/solady/src/utils/LibString.sol\":979,\"renderer/script/Deploy.s.sol\":32,\"renderer/src/SwarmlingsData.sol\":35,\"renderer/src/SwarmlingsRenderer.sol\":566,\"renderer/test/Renderer.t.sol\":86,\"renderer/test/data/expected-riso2.bin\":467,\"renderer/test/data/logo.svg\":1,\"renderer/test/data/riso2-1.svg\":1,\"renderer/test/data/riso2-1697.svg\":1,\"renderer/test/data/riso2-32.svg\":1,\"script/Day1Modules.s.sol\":72,\"script/DeployCouncil.s.sol\":30,\"src/Swarmlings.sol\":482,\"src/SwarmlingsCouncil.sol\":54,\"src/SwarmlingsHook.sol\":946,\"src/SwarmlingsMirror.sol\":147,\"src/interfaces/IHive.sol\":151,\"src/modules/AutoLiquidity.sol\":71,\"src/modules/BuybackBurn.sol\":47,\"src/modules/HiveSink.sol\":64,\"src/modules/MaxBuy.sol\":54,\"src/modules/TreasurySink.sol\":34,\"src/modules/TwapOracle.sol\":122,\"src/modules/VolatilityFee.sol\":72,\"test/DealProbe.t.sol\":31,\"test/GasCap.t.sol\":38,\"test/Hive.t.sol\":847,\"test/HookSalt.t.sol\":39,\"test/Invariant.t.sol\":248,\"test/Launcher.t.sol\":81,\"test/Manifest.t.sol\":33,\"test/Swarmlings.t.sol\":626,\"test/SwarmlingsHook.t.sol\":463,\"test/fork/Validator.t.sol\":78,\"test/utils/SwarmlingsBase.sol\":204},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"117dcf99916a3d51e6bc356196f89f161ec870fe744352af329745e6b5aafadd","verifiedTreeHash":"3dd0dafef775014bdf98c6bd454bc2471d6812a3","verifierVersion":"0.1.0+745c1db4"}]}