{"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":"e26f4d7f-8a32-4762-b99d-d60a88288d14","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"0e9109c0291c62a04c4277a1c2320f71686d9e9b6c747ca446ed816f8f50d765","dependsOn":["build_contract_project","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"e4b1595f5c4f0dbba8d7695c86192ec9db7e8758bc721e1b4635b794a1485d35","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"0f3e7566c3ff8e87fc95936b79ba455be33eea683bb01a6834a4a4d43e58e1df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"0f3e7566c3ff8e87fc95936b79ba455be33eea683bb01a6834a4a4d43e58e1df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"cf623e795d96b3a1388eef6b6ecf3c05912cf6a3ef4556460bd693d64c355a23","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Pass the Parcel: a Uniswap v4 hook on a native ETH pool. Every sell adds 1% of its ETH output to a pot held by the hook for that pool; the next qualifying buy in the same pool receives that pool's whole pot inside its own swap.\n\nToken: ERC-20, name \"Parcel\", symbol \"PRCL\", 18 decimals. The zero argument constructor mints exactly 10^27 minor units to msg.sender (the launch factory) and nothing else, ever. No owner, mint, pause, proxy, fees or hooks on transfer.\n\nHook:\n- Constructor takes only the PoolManager address. No owner, admin, setters, pause, sweep or upgrade. Does not use beforeInitialize; the factory opens the pool.\n- Pots are kept per pool, keyed by PoolId. A swap in one pool can never add to or take from another pool's pot. On any pool whose currency0 is not native ETH, the hook does nothing.\n- Sell (PRCL in, ETH out): the hook takes exactly 1% of the ETH the seller would receive and adds it to that pool's pot. Works for exact input and exact output swaps.\n- Buy (ETH in, PRCL out) with at least 0.001 ETH of input: the hook pays that pool's pot to the buyer by reducing the ETH the buyer owes in that same swap. If the pot is larger than the buyer's ETH input, pay only up to the input and keep the rest in the pot. Buys under 0.001 ETH leave the pot untouched.\n- The hook never pays anyone outside a swap. A pot can only leave through a qualifying buy in its own pool.\n- View pot(PoolId) returns a pool's current pot in wei. Events: ParcelFilled(PoolId indexed poolId, uint256 added, uint256 potAfter) on every sell, ParcelPassed(PoolId indexed poolId, uint256 paid, uint256 potAfter) on every payout.\n- Tests: exact input and exact output in both directions against a hookless reference pool; the pot rises by exactly 1% of each sell's ETH; a buy under 0.001 ETH does not touch the pot; a buy smaller than the pot takes only its own input; a second pool using the same hook with a different token cannot take the first pool's pot; a pool not paired with native ETH is left untouched; invariant: the hook's ETH held always equals the sum of all pots; fuzz swap sizes; the constructor rejects the zero PoolManager and mismatched permission bits.","parentJobId":null,"planHash":"0e662083217541536943fae0d98a242c79ca9e366f3e9942f7d996ec3a0c9311","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e26f4d7f-8a32-4762-b99d-d60a88288d14","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-222-pass-parcel-uniswap-v4"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50971","feedbackHash":"581bc626713145cd87173b242bd764b51742bae21a4f7131046a6c3faeefe623","nodeKey":"adversarial_review","submissionHash":"0e9109c0291c62a04c4277a1c2320f71686d9e9b6c747ca446ed816f8f50d765","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"710d01a8c5eb196410761f04abef2cccad47c26e98f5c01896b5bdbdaf0f416b","nodeKey":"build_contract_project","submissionHash":"e4b1595f5c4f0dbba8d7695c86192ec9db7e8758bc721e1b4635b794a1485d35","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"0c4c5ba90a9899487fa2a94874a5c1dfa3774d103dc4deab549c030f45df0730","nodeKey":"manifest","submissionHash":"cf623e795d96b3a1388eef6b6ecf3c05912cf6a3ef4556460bd693d64c355a23","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3bf335c67664962f6a828d6e7e78d565c5cce4cc6b910311cd73b89a2f6d51c5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[],"hash":"0e9109c0291c62a04c4277a1c2320f71686d9e9b6c747ca446ed816f8f50d765","nodeId":"3278fc47-181b-4e5d-9e69-337fb51fc32f","outcome":"completed","summary":"No substantiated findings. Wrote `{\"findings\":[]}` to [.imd-findings.json](/home/identitymd5/.identitymd/work/e26f4d7f-8a32-4762-b99d-d60a88288d14/3278fc47-181b-4e5d-9e69-337fb51fc32f/.imd-findings.json).\n\nReviewed the implementation and pinned checks; 203 additional swap comparisons passed. Source, tests, and configuration remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":920448,"inputTokens":74841,"model":"gpt-6-astra","outputTokens":12071,"runtime":"codex","turns":5,"wallClockMs":410334}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1f805d33d69c340e","findings":[],"hash":"c9bb7f6b09ed88e73d8704e83fa73c7716f1cda4c9fc90abbd479b54aa07ed3d","nodeId":"0b64482d-2a6f-4a4e-8867-510dc9c141df","outcome":"failed","summary":"refused to run the build on what the agent produced, so this was not submitted: solc: solc is pinned to a path (tools/solc-0.8.26) rather than a version","treeHash":null,"usage":{"cachedInputTokens":2046976,"inputTokens":90041,"model":"gpt-6-astra","outputTokens":36931,"runtime":"codex","turns":8,"wallClockMs":1202302}},{"artifacts":[],"attempt":1,"bundleHash":"1e64117837b0b07bb0b946ca09063ccc8b9c36021fc3fbb0029e80e7e51bc13c","device":"c4f696e22e7a36f7","findings":[],"hash":"cf623e795d96b3a1388eef6b6ecf3c05912cf6a3ef4556460bd693d64c355a23","nodeId":"04e97b89-28fd-4e33-b9a9-16f59de9c0f0","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/e26f4d7f-8a32-4762-b99d-d60a88288d14/04e97b89-28fd-4e33-b9a9-16f59de9c0f0/launch.json).\n\n- Schema and implementation permissions validated.\n- Notes: 2,374/4,000 characters.\n- Offline build passed; 34 repository tests and 9 pinned checks passed.\n- Only `launch.json` is changed for submission.\n\nThe manifest explicitly assumes the [Ethereum mainnet PoolManager](https://developers.uniswap.org/docs/protocols/v4/deployments) and the repository’s tested pool parameters.","treeHash":"fb3c0eb00e6e52217ff33f4596b4bf6c69181ec4","usage":{"cachedInputTokens":538496,"inputTokens":54202,"model":"gpt-6-astra","outputTokens":5943,"runtime":"codex","turns":6,"wallClockMs":208210}},{"artifacts":[],"attempt":2,"bundleHash":"1a40ccfb45a6600acd3a670f7fbd1615ea9e0281383dada3bf75e420e6fdded0","device":"c4f696e22e7a36f7","findings":[],"hash":"e4b1595f5c4f0dbba8d7695c86192ec9db7e8758bc721e1b4635b794a1485d35","nodeId":"0b64482d-2a6f-4a4e-8867-510dc9c141df","outcome":"completed","summary":"Implemented the Parcel token, hook, settlement router, tests, and documentation. Solidity is pinned by version to `0.8.26`; dependencies are vendored.\n\nPassed offline build, 34 tests, extended fuzzing, 8,192 invariant calls, formatting, and all 9 protected checks.\n\nETH-specified swaps require the included router’s settlement protocol. Deployment details and limitations are documented in [README.md](/root/.identitymd/work/e26f4d7f-8a32-4762-b99d-d60a88288d14/0b64482d-2a6f-4a4e-8867-510dc9c141df/README.md).","treeHash":"5beb887d7087682dbc0b00a283a000cd164d7cfa","usage":{"cachedInputTokens":1722752,"inputTokens":93164,"model":"gpt-6-astra","outputTokens":33060,"runtime":"codex","turns":8,"wallClockMs":1049801}}],"verification":[{"checks":[{"durationMs":2258,"exitCode":0,"name":"build","output":"Compiling 90 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.18s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ParcelInvariant.t.sol:27:78\n   │\n27 │         (,, uint256 change) = compare(target, ref, params(buy, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:34:9\n   │\n34 │         token.transfer(alice, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:37:9\n   │\n37 │         token.transferFrom(alice, bob, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:48:9\n   │\n48 │         token.transferFrom(address(this), bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:51:9\n   │\n51 │         token.transfer(bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:57:9\n   │\n57 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:60:9\n   │\n60 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelHook.sol:79:91\n   │\n79 │                         poolManager.currencyDelta(sender, key.currency0) != beforeDebit - int256(added)\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelHook.sol:96:40\n   │\n96 │                         adjustment = (-int256(paid)).toInt128();\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ParcelInvariant.t.sol:27:95\n   │\n27 │         (,, uint256 change) = compare(target, ref, params(buy, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:63:9\n   │\n63 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/FeeAttacker.sol:56:51\n   │\n56 │         manager.take(currentKey.currency0, payer, uint256(eth));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/helpers/FeeAttacker.sol:58:9\n   │\n58 │         IERC20(Currency.unwrap(currentKey.currency1)).transferFrom(payer, address(manager), uint256(-tokens));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/ParcelRouter.sol:58:23\n   │\n58 │         if (active || block.timestamp > deadline || params.amountSpecified == 0) {\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:225:64\n    │\n225 │         compare(key, referenceKey, params(false, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/FeeAttacker.sol:58:93\n   │\n58 │         IERC20(Currency.unwrap(currentKey.currency1)).transferFrom(payer, address(manager), uint256(-tokens));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:102:62\n    │\n102 │         if (delta > 0) manager.take(currency, address(this), uint256(uint128(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:102:70\n    │\n102 │         if (delta > 0) manager.take(currency, address(this), uint256(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelRouter.sol:92:40\n   │\n92 │             input < 0 || output < 0 || uint256(input) > request.maxInput\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:104:24\n    │\n104 │         uint256 debt = 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelRouter.sol:93:20\n   │\n93 │                 || uint256(output) < request.minOutput\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:225:81\n    │\n225 │         compare(key, referenceKey, params(false, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/ParcelRouter.sol:114:43\n    │\n114 │             manager.take(currency, payer, uint256(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:231:63\n    │\n231 │         compare(key, referenceKey, params(true, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/ParcelRouter.sol:116:28\n    │\n116 │             uint256 owed = uint256(-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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:231:80\n    │\n231 │         compare(key, referenceKey, params(true, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/helpers/PoolFixture.sol:109:13\n    │\n109 │             IERC20(Currency.unwrap(currency)).transfer(address(manager), debt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:132:50\n    │\n132 │         assertEq(int256(address(this).balance) - int256(beforeEth), int256(net.amount0()));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:134:90\n    │\n134 │             int256(IERC20(Currency.unwrap(target.currency1)).balanceOf(address(this))) - int256(beforeTokens),\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:141:71\n    │\n141 │             assertEq(int256(net.amount0()), int256(gross.amount0()) - int256(change), \"sell 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:146:71\n    │\n146 │             assertEq(int256(net.amount0()), int256(gross.amount0()) + int256(change), \"buy credit\");\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":5225,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/ParcelAdversarial.t.sol:ParcelAdversarialTest\n[PASS] test_exactOutputSellerCannotIgnoreFeeOrDebitAnotherAccount() (gas: 1505265)\n[PASS] test_failedRefundRollsBackThePayout() (gas: 713788)\n[PASS] test_feeCallbackCannotReenterButCanFinishPaying() (gas: 1268523)\n[PASS] test_wrongFeeAmountRevertsAtomically() (gas: 1469172)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.75ms (1.73ms CPU time)\n\nRan 6 tests for test/Parcel.t.sol:ParcelTest\n[PASS] testFuzz_transferAndTransferFrom(uint96) (runs: 256, μ: 81527, ~: 81922)\nLogs:\n  Bound result 3837771333188511755833\n\n[PASS] test_factoryReceivesSupply() (gas: 476565)\n[PASS] test_infiniteApprovalAndSelfTransfer() (gas: 75943)\n[PASS] test_invalidTransfersAndAllowanceRevert() (gas: 25009)\n[PASS] test_metadataAndFixedSupply() (gas: 24730)\n[PASS] test_noMintAdminOrUpgradeSelectors() (gas: 47680)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.66ms (6.92ms CPU time)\n\nRan 23 tests for test/ParcelHook.t.sol:ParcelHookTest\n[PASS] testFuzz_buyBothModesWithPot(uint96,bool) (runs: 256, μ: 591778, ~: 598410)\nLogs:\n  Bound result 7304956565800630878\n\n[PASS] testFuzz_sellBothModes(uint96,bool) (runs: 256, μ: 366444, ~: 377280)\nLogs:\n  Bound result 14264337671979831209\n\n[PASS] test_constructorAndPermissions() (gas: 15693)\n[PASS] test_constructorRejectsWrongFlags() (gas: 44817)\n[PASS] test_constructorRejectsZeroManager() (gas: 36651)\n[PASS] test_emptyPotBuys() (gas: 534981)\n[PASS] test_eventsAndRounding() (gas: 475422)\n[PASS] test_exactInputBuyPassesWholePot() (gas: 596951)\n[PASS] test_exactInputSellAndExactOutputSell() (gas: 553175)\n[PASS] test_exactOutputBuyPassesWholePot() (gas: 622344)\n[PASS] test_fullySubsidizedBuyNeedsNoMsgValue() (gas: 446363)\n[PASS] test_insufficientFundingRollsBackPot() (gas: 481212)\n[PASS] test_noDirectFundingOrOutOfSwapPayment() (gas: 383158)\n[PASS] test_nonNativePoolUntouchedAllFourModes() (gas: 915653)\n[PASS] test_onlyManagerCanCallAfterSwap() (gas: 16133)\n[PASS] test_partialBuyBelowThresholdDoesNotUseRequestedInput() (gas: 568285)\n[PASS] test_partialFillSellChargesActualOutputBothModes() (gas: 552275)\n[PASS] test_poolIsolationInBothDirections() (gas: 1328929)\n[PASS] test_removingLiquidityCannotWithdrawPot() (gas: 740516)\n[PASS] test_routerRejectsForgedCallbacksAndExpiredSwap() (gas: 25570)\n[PASS] test_slippageRevertRollsBackPotAndPool() (gas: 510726)\n[PASS] test_thresholdAndCapExactInput() (gas: 782424)\n[PASS] test_thresholdAndCapExactOutput() (gas: 781368)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 56.83ms (114.43ms CPU time)\n\nRan 1 test for test/ParcelInvariant.t.sol:ParcelInvariantTest\n[PASS] invariant_potsEqualCustodyAndCumulativeFeesLessPayouts() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------+-------+---------+----------╮\n| Contract            | Selector | Calls | Reverts | Discards |\n+=============================================================+\n| ParcelInvariantTest | step     | 8192  | 0       | 0        |\n╰---------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 194953951776380615\n  Bound result 492500107315787739\n  Bound result 999999999000008807\n  Bound result 521193605661061110\n  Bound result 999999999000012622\n  Bound result 492500107315787739\n  Bound result 147408201101361824\n  Bound result 999999999000000558\n  Bound result 416532270015748286\n  Bound result 999999999000013829\n  Bound result 1000000003\n  Bound result 999999999000013631\n  Bound result 999999999000017223\n  Bound result 761026152869441678\n  Bound result 999999999000013073\n  Bound result 248899398072971795\n  Bound result 971196668960919279\n  Bound result 999999999004796941\n  Bound result 999999999005738380\n  Bound result 1000000000000000000\n  Bound result 999999999000013470\n  Bound result 492500107315787741\n  Bound result 999999999000071760\n  Bound result 16466643951048\n  Bound result 999999999000015001\n  Bound result 999999999000002800\n  Bound result 527055597136983547\n  Bound result 78786608418298115\n  Bound result 999999999000001067\n  Bound result 999999999112858732\n  Bound result 34703788569\n  Bound result 999999999000000845\n  Bound result 1000000000\n  Bound result 999999999000000580\n  Bound result 999999999000000179\n  Bound result 999999999000013829\n  Bound result 999999999000009906\n  Bound result 999999999000000079\n  Bound result 999999999000004241\n  Bound result 186362589533137882\n  Bound result 746721282576618534\n  Bound result 647624682222985439\n  Bound result 492500107315787741\n  Bound result 999999999000001784\n  Bound result 1065219565359133\n  Bound result 99999999900001\n  Bound result 999999999000001503\n  Bound result 999999999000010922\n  Bound result 77826844203\n  Bound result 6347615606\n  Bound result 252532577148812625\n  Bound result 999999999599290590\n  Bound result 999999999000011589\n  Bound result 999999999000000700\n  Bound result 999999999000000125\n  Bound result 252532577148812625\n  Bound result 999999999000003168\n  Bound result 748275878964598424\n  Bound result 127381509148184916\n  Bound result 999999999000000161\n  Bound result 2544232966\n  Bound result 526591725388315359\n  Bound result 999999999000011088\n  Bound result 278432655338455928\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.14s (5.14s CPU time)\n\nRan 4 test suites in 5.14s (5.21s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cf623e795d96b3a1388eef6b6ecf3c05912cf6a3ef4556460bd693d64c355a23","verifiedTreeHash":"fb3c0eb00e6e52217ff33f4596b4bf6c69181ec4","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":2453,"exitCode":0,"name":"build","output":"Compiling 90 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.37s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/ParcelRouter.sol:58:23\n   │\n58 │         if (active || block.timestamp > deadline || params.amountSpecified == 0) {\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ParcelInvariant.t.sol:27:78\n   │\n27 │         (,, uint256 change) = compare(target, ref, params(buy, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/ParcelInvariant.t.sol:27:95\n   │\n27 │         (,, uint256 change) = compare(target, ref, params(buy, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/FeeAttacker.sol:56:51\n   │\n56 │         manager.take(currentKey.currency0, payer, uint256(eth));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/helpers/FeeAttacker.sol:58:9\n   │\n58 │         IERC20(Currency.unwrap(currentKey.currency1)).transferFrom(payer, address(manager), uint256(-tokens));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelRouter.sol:92:40\n   │\n92 │             input < 0 || output < 0 || uint256(input) > request.maxInput\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelRouter.sol:93:20\n   │\n93 │                 || uint256(output) < request.minOutput\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/ParcelRouter.sol:114:43\n    │\n114 │             manager.take(currency, payer, uint256(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/ParcelRouter.sol:116:28\n    │\n116 │             uint256 owed = uint256(-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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/FeeAttacker.sol:58:93\n   │\n58 │         IERC20(Currency.unwrap(currentKey.currency1)).transferFrom(payer, address(manager), uint256(-tokens));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:34:9\n   │\n34 │         token.transfer(alice, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelHook.sol:79:91\n   │\n79 │                         poolManager.currencyDelta(sender, key.currency0) != beforeDebit - int256(added)\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ src/ParcelHook.sol:96:40\n   │\n96 │                         adjustment = (-int256(paid)).toInt128();\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:225:64\n    │\n225 │         compare(key, referenceKey, params(false, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:102:62\n    │\n102 │         if (delta > 0) manager.take(currency, address(this), uint256(uint128(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:225:81\n    │\n225 │         compare(key, referenceKey, params(false, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:102:70\n    │\n102 │         if (delta > 0) manager.take(currency, address(this), uint256(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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:104:24\n    │\n104 │         uint256 debt = 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:37:9\n   │\n37 │         token.transferFrom(alice, bob, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/helpers/PoolFixture.sol:109:13\n    │\n109 │             IERC20(Currency.unwrap(currency)).transfer(address(manager), debt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:231:63\n    │\n231 │         compare(key, referenceKey, params(true, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:132:50\n    │\n132 │         assertEq(int256(address(this).balance) - int256(beforeEth), int256(net.amount0()));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/ParcelHook.t.sol:231:80\n    │\n231 │         compare(key, referenceKey, params(true, exactInput ? -int256(amount) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:48:9\n   │\n48 │         token.transferFrom(address(this), bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:51:9\n   │\n51 │         token.transfer(bob, 10);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:57:9\n   │\n57 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:60:9\n   │\n60 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Parcel.t.sol:63:9\n   │\n63 │         token.transferFrom(address(this), bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:134:90\n    │\n134 │             int256(IERC20(Currency.unwrap(target.currency1)).balanceOf(address(this))) - int256(beforeTokens),\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:141:71\n    │\n141 │             assertEq(int256(net.amount0()), int256(gross.amount0()) - int256(change), \"sell 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/helpers/PoolFixture.sol:146:71\n    │\n146 │             assertEq(int256(net.amount0()), int256(gross.amount0()) + int256(change), \"buy credit\");\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":5253,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/ParcelAdversarial.t.sol:ParcelAdversarialTest\n[PASS] test_exactOutputSellerCannotIgnoreFeeOrDebitAnotherAccount() (gas: 1505265)\n[PASS] test_failedRefundRollsBackThePayout() (gas: 713788)\n[PASS] test_feeCallbackCannotReenterButCanFinishPaying() (gas: 1268523)\n[PASS] test_wrongFeeAmountRevertsAtomically() (gas: 1469172)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.20ms (1.86ms CPU time)\n\nRan 6 tests for test/Parcel.t.sol:ParcelTest\n[PASS] testFuzz_transferAndTransferFrom(uint96) (runs: 256, μ: 81377, ~: 81922)\nLogs:\n  Bound result 8297\n\n[PASS] test_factoryReceivesSupply() (gas: 476565)\n[PASS] test_infiniteApprovalAndSelfTransfer() (gas: 75943)\n[PASS] test_invalidTransfersAndAllowanceRevert() (gas: 25009)\n[PASS] test_metadataAndFixedSupply() (gas: 24730)\n[PASS] test_noMintAdminOrUpgradeSelectors() (gas: 47680)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 7.97ms (8.24ms CPU time)\n\nRan 23 tests for test/ParcelHook.t.sol:ParcelHookTest\n[PASS] testFuzz_buyBothModesWithPot(uint96,bool) (runs: 256, μ: 591980, ~: 598412)\nLogs:\n  Bound result 3961364591632907333\n\n[PASS] testFuzz_sellBothModes(uint96,bool) (runs: 256, μ: 365816, ~: 377282)\nLogs:\n  Bound result 13961364581632907334\n\n[PASS] test_constructorAndPermissions() (gas: 15693)\n[PASS] test_constructorRejectsWrongFlags() (gas: 44817)\n[PASS] test_constructorRejectsZeroManager() (gas: 36651)\n[PASS] test_emptyPotBuys() (gas: 534981)\n[PASS] test_eventsAndRounding() (gas: 475422)\n[PASS] test_exactInputBuyPassesWholePot() (gas: 596951)\n[PASS] test_exactInputSellAndExactOutputSell() (gas: 553175)\n[PASS] test_exactOutputBuyPassesWholePot() (gas: 622344)\n[PASS] test_fullySubsidizedBuyNeedsNoMsgValue() (gas: 446363)\n[PASS] test_insufficientFundingRollsBackPot() (gas: 481212)\n[PASS] test_noDirectFundingOrOutOfSwapPayment() (gas: 383158)\n[PASS] test_nonNativePoolUntouchedAllFourModes() (gas: 915653)\n[PASS] test_onlyManagerCanCallAfterSwap() (gas: 16133)\n[PASS] test_partialBuyBelowThresholdDoesNotUseRequestedInput() (gas: 568285)\n[PASS] test_partialFillSellChargesActualOutputBothModes() (gas: 552275)\n[PASS] test_poolIsolationInBothDirections() (gas: 1328929)\n[PASS] test_removingLiquidityCannotWithdrawPot() (gas: 740516)\n[PASS] test_routerRejectsForgedCallbacksAndExpiredSwap() (gas: 25570)\n[PASS] test_slippageRevertRollsBackPotAndPool() (gas: 510726)\n[PASS] test_thresholdAndCapExactInput() (gas: 782424)\n[PASS] test_thresholdAndCapExactOutput() (gas: 781368)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 61.29ms (116.74ms CPU time)\n\nRan 1 test for test/ParcelInvariant.t.sol:ParcelInvariantTest\n[PASS] invariant_potsEqualCustodyAndCumulativeFeesLessPayouts() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------+-------+---------+----------╮\n| Contract            | Selector | Calls | Reverts | Discards |\n+=============================================================+\n| ParcelInvariantTest | step     | 8192  | 0       | 0        |\n╰---------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 999999999000004166\n  Bound result 999999999000012233\n  Bound result 999999999000011370\n  Bound result 344580441729029335\n  Bound result 999999999000001668\n  Bound result 996769500153684615\n  Bound result 386991433119216218\n  Bound result 999999999000000134\n  Bound result 562799285833481667\n  Bound result 32555163991850972\n  Bound result 999999999035458793\n  Bound result 999999999000002503\n  Bound result 999999999000000168\n  Bound result 178657989204301556\n  Bound result 625226996528079846\n  Bound result 11288724663558\n  Bound result 576000603036891914\n  Bound result 1000000000\n  Bound result 999999999000014140\n  Bound result 280351921027548242\n  Bound result 983419616013226335\n  Bound result 999999999000001404\n  Bound result 606782875404483864\n  Bound result 3072363022288284\n  Bound result 15354521603626\n  Bound result 1000000001\n  Bound result 999999999000015604\n  Bound result 999999999262964257\n  Bound result 817809588221809846\n  Bound result 999999999000002711\n  Bound result 452691166117129872\n  Bound result 999999999000000079\n  Bound result 32827236319\n  Bound result 999999999000001929\n  Bound result 945183195401482308\n  Bound result 999999999169337675\n  Bound result 999999999000014039\n  Bound result 999999999000012112\n  Bound result 999999999000001150\n  Bound result 999999999000006295\n  Bound result 492500107315787741\n  Bound result 999999999000010996\n  Bound result 999999999000000006\n  Bound result 999999999001024026\n  Bound result 941509919590300824\n  Bound result 992899060806802736\n  Bound result 285895973168164639\n  Bound result 2576790294\n  Bound result 999999999000008395\n  Bound result 999999999000000038\n  Bound result 999999999000016553\n  Bound result 4125143186803\n  Bound result 999999999000014834\n  Bound result 64846016566428272\n  Bound result 1000000001\n  Bound result 492500107315787740\n  Bound result 999999999000037357\n  Bound result 999999999000007408\n  Bound result 482500107325787622\n  Bound result 1000000001\n  Bound result 999999999000000041\n  Bound result 3364511340\n  Bound result 999999999000002117\n  Bound result 24885560012754197\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.17s (5.16s CPU time)\n\nRan 4 test suites in 5.17s (5.24s CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e4b1595f5c4f0dbba8d7695c86192ec9db7e8758bc721e1b4635b794a1485d35","verifiedTreeHash":"5beb887d7087682dbc0b00a283a000cd164d7cfa","verifierVersion":"0.1.0+bb39ded9"}]}