{"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":"5424fd7a-6c3c-44cc-b938-e4e5718fce85","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":"60330fb6cf5277050b42b21dc4dcbbdcf68d2f575e2e75810b7d323fba0b3933","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":"Kiln: a Uniswap v4 hook for a new ETH/ZTO pool that charges a lower fee to wallets holding Pepeolithic NFTs, keeps the fee everyone else pays as a ZTO reserve, and uses that reserve to buy Pepeolithic pieces from anyone and sell them back. Two contracts, Launcher and Kiln. Deploy on Sepolia (chain id 11155111) as a REHEARSAL of the mainnet Kiln; only addresses differ. Nothing is upgradeable, pausable or ownable; no admin exists anywhere; the reserve can never be withdrawn, only paid out for pieces.\n\nADDRESSES (constants). The coin standing in for ZTO is Sepolia WETH 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14 (plain ERC-20, 18 decimals, write 18 as a constant; call it ZTO in the code). Pepeolithic (PEPEO, ERC-721, 737 ids) is the Sepolia rehearsal contract 0x0ce3157eac34eccdcff239738983976fabdefb2a. Uniswap v4 PoolManager on Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543. Native ETH is currency0 (address 0), ZTO currency1.\n\nCONSTRUCTORS make no external calls and read nothing on-chain (the verifier deploys in an empty EVM). The Kiln must NOT validate its own address bits in its constructor; the Launcher checks them after CREATE2. Launcher constructor args: zto, pepeo, poolManager, tickSpacing 60, lpFee 2000 (0.20%, static pool fee), tiers as two arrays: minPepes [0, 1, 4, 21] and kilnCut [13000, 8000, 3000, 0] in hundredths of a bip (1.30%, 0.80%, 0.30%, 0%), spreadBps 1500 (15%), depth 50. It stores them and the Kiln init-code hash (view initCodeHash()).\n\nLAUNCHER. One permissionless function open(bytes32 salt, uint160 sqrtPriceX96) that succeeds once: (1) deploys the Kiln with CREATE2 and reverts unless its address carries exactly the permission bits for beforeSwap, afterSwap, beforeSwapReturnDelta and afterSwapReturnDelta and no others; (2) initializes the ETH/ZTO pool on the PoolManager with lpFee, tickSpacing and the Kiln as hook at sqrtPriceX96; emits Opened(kiln, poolId). No liquidity is added by the Launcher: the deployer adds a ZTO-only range position later through the normal PositionManager, so the Kiln must not restrict liquidity in any way (no liquidity callbacks).\n\nKILN, FEE PASS. On every swap in its pool the Kiln reads pepes = PEPEO.balanceOf(tx.origin) (routers are msg.sender; tx.origin is the trader) and picks the highest tier whose minPepes <= pepes. The pool's static lpFee goes to liquidity as usual; on top, the Kiln takes kilnCut of the swap as its cut, ALWAYS IN ZTO: when ZTO is the input, from the input (beforeSwap return delta on the specified currency for exact-input, afterSwap on the unspecified for exact-output); when ETH is the input, from the ZTO output (afterSwap return delta for exact-input, beforeSwap for exact-output). Work out each of the four cases so the trader is charged kilnCut of the ZTO side and the pool's accounting settles. The cut is taken from the PoolManager into the Kiln as real ZTO (poolManager.take) and added to reserve. Tier 21 pays no cut at all. Emit Passed(trader, pepes, kilnCut, ztoTaken) per swap. No block-held guard; README states that a pass only needs to be in the wallet during the swap.\n\nKILN, PIECES. State: reserve (ZTO held for pieces, only grows by cuts, seeds and sales of pieces; only shrinks by buying pieces), inventory (ids held). Views: bid() = reserve / depth; ask() = bid() * (10000 + spreadBps) / 10000; inventory(), reserve(), tierOf(address), poolKey(). sell(uint256 id): the caller's PEPEO piece is pulled with transferFrom (caller approves first), price = bid() before the transfer, reserve -= price, ZTO.transfer(caller, price) requiring the bool, emits Sold(id, seller, price); reverts if bid() is 0. buy(uint256 id): id must be in inventory; price = ask(); ZTO.transferFrom(caller, kiln, price) requiring the bool, reserve += price, piece sent to caller with transferFrom (never safeTransferFrom, no receiver callbacks), emits Bought(id, buyer, price). seed(uint256 amount): anyone adds ZTO to reserve by transferFrom, emits Seeded(from, amount). No other way moves ZTO or pieces. Pieces arriving by plain transfer without sell() are not inventory and are stuck; README says so. Because bid is reserve/depth it is always payable, falls geometrically as pieces come in and rises with every cut, seed and sale.\n\nTESTS against the real v4 PoolManager (vendor v4-core and v4-periphery test routers) with a mock ZTO and a mock ERC-721: open() once and only at an address with the right bits; a ZTO-only range position above the opening price added through the test liquidity router; swaps in all four cases (ETH in / ZTO in, exact in / exact out) for wallets holding 0, 1, 4 and 21 pieces, checking the ZTO cut equals kilnCut of the ZTO side within rounding, that tier 21 pays nothing, that the cut landed in reserve, and that the trader also paid lpFee; sell() pays bid and bid falls afterwards; buy() charges ask and the piece leaves inventory; buy of an id not held reverts; sell at zero reserve reverts; seed() grows bid; reserve never exceeds the Kiln's ZTO balance; nobody can withdraw. README with the rules, the tier table and the two caveats (tx.origin, stuck transfers). BUILD: solidity 0.8.26, optimizer + via-IR (via_ir = true, optimizer_runs = 1), custom errors only, no ReentrancyGuard (external token calls last), Kiln deployed code under 12,000 bytes. Slither: multiply before dividing; string.concat not encodePacked.","parentJobId":null,"planHash":"03a70395545cd9f4a2df58a56ef7b211fe41159c5a73cfb9e61bde0b0f68a070","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5424fd7a-6c3c-44cc-b938-e4e5718fce85","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1101-kiln-uniswap-v4-hook"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51734","feedbackHash":"244b6235e1ade781ebb640e0e288912eb6fae9f426bb127473eed93d60bcea7f","nodeKey":"build_contract_project","submissionHash":"60330fb6cf5277050b42b21dc4dcbbdcf68d2f575e2e75810b7d323fba0b3933","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a88fd7b1f3036f2551e1d547cb1c2977689d5016642484f886aac3cf39e3cb45","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"4306fabe288a75456c2c080e547aab9b5e6c45876b33703382148e7e25769f8b","device":"a68191e8efe5b6e4","findings":[],"hash":"60330fb6cf5277050b42b21dc4dcbbdcf68d2f575e2e75810b7d323fba0b3933","nodeId":"a893cf63-c8c8-4868-a484-23f3373e20f0","outcome":"completed","summary":"Implemented Launcher and Kiln, vendored dependencies, Sepolia preparation tools, and documentation.\n\n- `forge build` passed.\n- `forge test`: 43 passed.\n- `forge fmt --check` passed.\n- Kiln runtime: 5,356 bytes.\n\nThe [README](/home/imd/.identitymd-6/work/5424fd7a-6c3c-44cc-b938-e4e5718fce85/a893cf63-c8c8-4868-a484-23f3373e20f0/README.md) documents deployment, fee accounting, caveats, and the ZTO-only range price convention.\n\nNo transactions were broadcast.","treeHash":"9be4dd0764e0bb044d610173028b1f371261a975","usage":{"cachedInputTokens":1227648,"inputTokens":99779,"model":"gpt-6-astra","outputTokens":32975,"runtime":"codex","turns":6,"wallClockMs":810632}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bc30da9213bc5d7a","findings":[],"hash":"d6c72ba390ad85b8354b53e7600601d96a68e0c3700d1766c1819a46cb8bdd0d","nodeId":"6df3bbcf-ee43-48a6-8e8c-82075f902630","outcome":"failed","summary":"needs input: The compiled Launcher and Kiln constructors require uint256[] thresholds and uint24[] cuts, but launch.json permits only static ABI words. They also take int24 spacing, outside the documented supported constructor types. No manifest can both satisfy the deployment format and match the accepted constructors. Resolving this requires a revised accepted constructor ABI or deployment-format support, neither of which can be changed in this manifest-only assignment. — Should the accepted constructors be revised to use supported static arguments while preserving the approved tiers, or should the deployment format be extended to support their existing int24 and dynamic-array arguments?","treeHash":null,"usage":{"cachedInputTokens":332032,"inputTokens":24203,"model":"gpt-6-astra","outputTokens":3201,"runtime":"codex","turns":5,"wallClockMs":185052}}],"verification":[{"checks":[{"durationMs":39657,"exitCode":0,"name":"build","output":"Compiling 111 files with Solc 0.8.26\nSolc 0.8.26 finished in 39.51s\nCompiler run successful!\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/Launcher.sol:57:9\n   │\n57 │         emit Opened(address(deployed), key.toId());\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/Launcher.sol:56:9\n   │\n56 │         poolManager.initialize(key, sqrtPriceX96);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/KilnConfig.sol:55:45\n   │\n55 │             if (cuts[i] >= FEE_DENOMINATOR) revert InvalidConfig();\n   │                                             ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/KilnConfig.sol:57:17\n   │\n57 │                 revert InvalidConfig();\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/Kiln.sol:101:9\n    │\n101 │         emit Bought(id, msg.sender, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Kiln.sol:121:71\n    │\n121 │         return (this.beforeSwap.selector, toBeforeSwapDelta(_asInt128(taken), 0), 0);\n    │                                                                       ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Kiln.sol:156:42\n    │\n156 │         return (this.afterSwap.selector, unspecifiedDelta);\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/Kiln.sol:154:9\n    │\n154 │         emit Passed(tx.origin, pepes, cut, taken);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Kiln.sol:143:60\n    │\n143 │                 int256 expected = params.amountSpecified + int256(taken);\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/Kiln.sol:149:35\n    │\n149 │                 ? FullMath.mulDiv(uint256(int256(ztoDelta)), cut, FEE_DENOMINATOR)\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/Kiln.sol:150:31\n    │\n150 │                 : _grossUpCut(uint256(-int256(ztoDelta)), cut);\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/Kiln.sol:174:16\n    │\n174 │         return uint256(amount < 0 ? -amount : amount);\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/Kiln.sol:183:22\n    │\n183 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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/Kiln.sol:183:30\n    │\n183 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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/Kiln.sol:184:16\n    │\n184 │         return int128(int256(amount));\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/Kiln.sol:184:23\n    │\n184 │         return int128(int256(amount));\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\n","passed":true},{"durationMs":807,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Tools.t.sol:ToolsTest\n[PASS] test_minerFindsCorrectBitsAndPrediction() (gas: 1728406)\n[PASS] test_parameterEncodingDeploysInEmptySepoliaEVM() (gas: 2755730)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.94ms (6.19ms CPU time)\n\nRan 2 tests for test/Launcher.t.sol:ConstructorTest\n[PASS] test_invalidConfigurationRevertsLocally() (gas: 10599)\n[PASS] test_sepoliaConstructorsWorkWithoutCodeOrCallsOrAddressBits() (gas: 86939)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.24ms (1.20ms CPU time)\n\nRan 10 tests for test/Launcher.t.sol:LauncherTest\n[PASS] test_badAddressBitsRevertAndAllowRetry() (gas: 21525184)\n[PASS] test_initCodeHashMatchesExactConstructorBytes() (gas: 169449)\n[PASS] test_invalidPriceRollsBackCreate2AndCanRetry() (gas: 21551723)\n[PASS] test_onlyManagerCanCallSwapCallbacks() (gas: 59570)\n[PASS] test_openOncePermissionlessAtCorrectBitsAndEmits() (gas: 20324744)\n[PASS] test_rangeAboveOpeningV4TickIsETHOnly() (gas: 217733)\n[PASS] test_rejectEveryForeignPoolKeyComponent() (gas: 284857)\n[PASS] test_runtimeBoundAndNoEscapeOpcodes() (gas: 8262650)\n[PASS] test_tierBoundaries() (gas: 1917935)\n[PASS] test_ztoOnlyLiquidityThenTradingAndRemovingLiquidity() (gas: 963265)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 38.82ms (105.19ms CPU time)\n\nRan 12 tests for test/Swaps.t.sol:SwapsTest\n[PASS] testFuzz_swapAccounting(uint8,bool,bool,uint96) (runs: 256, μ: 626118, ~: 430516)\nLogs:\n  Bound result 0\n  Bound result 3047868\n\n[PASS] test_fourSwapCasesFourPasses() (gas: 1479161)\n[PASS] test_fourSwapCasesNoPass() (gas: 1269254)\n[PASS] test_fourSwapCasesOnePass() (gas: 1333831)\n[PASS] test_fourSwapCasesTwentyOnePasses() (gas: 2274389)\n[PASS] test_partialZTOInputRevertsAtomically() (gas: 201179)\n[PASS] test_partialZTOOutputRevertsAtomically() (gas: 212847)\n[PASS] test_passCanBeBorrowedForOnlyTheSwap() (gas: 848767)\n[PASS] test_peripheryRouterAllFourCasesAndSlippage() (gas: 2370020)\n[PASS] test_routerNFTDoesNotGiveTraderAPass() (gas: 432959)\n[PASS] test_unspecifiedZTOOnlyChargesFilledOutput() (gas: 260479)\n[PASS] test_zeroTierAllowsPartialSpecifiedSwap() (gas: 1302971)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 45.47ms (53.64ms CPU time)\n\nRan 16 tests for test/Pieces.t.sol:PiecesTest\n[PASS] testFuzz_sellsAlwaysPayAndBidFalls(uint128) (runs: 256, μ: 9725829, ~: 9725740)\nLogs:\n  Bound result 9999999999999999999996859\n\n[PASS] test_buyMissingIdReverts() (gas: 32627)\n[PASS] test_cannotSellListedPieceTwice() (gas: 390391)\n[PASS] test_directZTODonationDoesNotBecomeReserve() (gas: 156632)\n[PASS] test_dustReserveAllowsZeroAskForListedPiece() (gas: 504053)\n[PASS] test_falseBuyPaymentRollsBackInventory() (gas: 489700)\n[PASS] test_falseSeedTransferRollsBack() (gas: 125208)\n[PASS] test_falseSellPayoutRollsBackPieceAndReserve() (gas: 445506)\n[PASS] test_inventorySwapAndPopAndResell() (gas: 1384742)\n[PASS] test_noWithdrawalOrAdministrationSelectors() (gas: 675300)\n[PASS] test_plainTransferIsStuckAndNotInventory() (gas: 388124)\n[PASS] test_revertingPieceDeliveryRollsBackBuyPayment() (gas: 499216)\n[PASS] test_seedSellBuyAndEvents() (gas: 618648)\n[PASS] test_sellAtDustReserveReverts() (gas: 123014)\n[PASS] test_sellAtZeroReserveReverts() (gas: 172319)\n[PASS] test_sellerMustOwnAndApprovePiece() (gas: 507981)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 194.35ms (195.84ms CPU time)\n\nRan 1 test for test/ReserveInvariant.t.sol:ReserveInvariantTest\n[PASS]\nReserveInvariantTest invariants:\n[PASS] invariant_inventoryContainsUniqueCustodiedPieces\n[PASS] invariant_reserveIsBackedAndOnlySpentOnPieces\n ReserveInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| ReserveHandler | buy         | 1629  | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| ReserveHandler | donatePiece | 1586  | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| ReserveHandler | donateZTO   | 1684  | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| ReserveHandler | seed        | 1646  | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| ReserveHandler | sell        | 1647  | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 684.36ms (678.95ms CPU time)\n\nRan 6 test suites in 685.64ms (976.19ms CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":51,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Kiln.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Kiln.buy(uint256)\",\"Kiln.seed(uint256)\",\"Kiln.sell(uint256)\",\"Launcher.open(bytes32,uint160)\"],\"files\":{\".gitignore\":3,\"README.md\":262,\"foundry.toml\":22,\"remappings.txt\":8,\"script/MineSalt.s.sol\":15,\"script/SepoliaParameters.s.sol\":25,\"src/Kiln.sol\":186,\"src/KilnConfig.sol\":70,\"src/Launcher.sol\":59,\"src/Sepolia.sol\":25,\"test/KilnBase.sol\":87,\"test/Launcher.t.sol\":285,\"test/Pieces.t.sol\":242,\"test/ReserveInvariant.t.sol\":87,\"test/Swaps.t.sol\":247,\"test/Tools.t.sol\":40,\"test/mocks/MockTokens.sol\":62,\"tools/SaltMiner.sol\":25},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2489,"exitCode":0,"name":"slither","output":"[medium/high] erc20-interface at src/KilnConfig.sol:14: IPEPEO (src/KilnConfig.sol#12-15) has incorrect ERC20 function interface:IPEPEO.transferFrom(address,address,uint256) (src/KilnConfig.sol#14)\n[medium/high] incorrect-equality at src/Kiln.sol:79: Kiln.sell(uint256) (src/Kiln.sol#79-89) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/Kiln.sol:134: Kiln.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes).unspecifiedDelta (src/Kiln.sol#134) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Kiln.sol:114: Kiln.beforeSwap(address,PoolKey,IPoolManager.SwapParams,bytes).taken (src/Kiln.sol#114) is a local variable never initialized\n[medium/medium] unused-return at src/Launcher.sol:40: Launcher.open(bytes32,uint160) (src/Launcher.sol#40-58) ignores return value by poolManager.initialize(key,sqrtPriceX96) (src/Launcher.sol#56)\n[low/medium] reentrancy-events at src/Launcher.sol:40: Reentrancy in Launcher.open(bytes32,uint160) (src/Launcher.sol#40-58):","passed":true},{"durationMs":323,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Kiln.sol:70: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/Kiln.sol:70: Literal Instead of Constant (5 places)\n[low] unchecked-return at src/Launcher.sol:56: Unchecked Return\n[low] uninitialized-local-variable at src/KilnConfig.sol:54: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/Kiln.sol:88: Unsafe ERC20 Operation\n[low] unused-public-function at src/Kiln.sol:46: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"60330fb6cf5277050b42b21dc4dcbbdcf68d2f575e2e75810b7d323fba0b3933","verifiedTreeHash":"9be4dd0764e0bb044d610173028b1f371261a975","verifierVersion":"0.1.0+ad90ce4c"}]}