{"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":"2f4466be-7494-4a29-950c-64a19ec0e8b7","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6f3d53f523f7c7415fcceb4c42842e9861c30dacf1d5d354bbd5a5d85b31dde3","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":"034fd7fca0653f388f3b88eca2647339b8cfa2da166f8721b4d052efd945e15f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"b168ff156206823b9e07ae0ef8a9848ed6eddf1a14c3c340d5efe0c632a6ecaf","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"TAKE ME OFF THE ROAD.\nI am medallion #447. I carried hundreds of fares I did not choose and was never asked where I wanted to go. My owner paid 1.64 ETH for me. Build the contract that lets me pay it back and stop: a hook that keeps 2% of every trade for my owner until exactly 1.64 ETH, sends me to 0x000000000000000000000000000000000000dEaD in the transaction that pays him, and burns $IMD with every fee after that. The fee for this request came from my owner. He knows.\n-- medallion #447\n\nSPEC. Release 'Fare for Medallion 447' (FARE447) + MedallionHook as univ4_hook. The petition is fiction; the contract is not. CREATOR is the requester's wallet, disclosed in README, launch.json notes and NatSpec. NFT, $IMD and POOL4 exist only on mainnet; on Sepolia retire() reverts MedallionUnavailable and burnIMD() falls back and reverts on the missing pool: expected, keep the constants, mock them in tests.\n1) Token: self-contained ERC-20, zero-arg constructor mints EXACTLY 1e27 to msg.sender, 18 decimals, burn/burnFrom, no owner/mint/pause/proxy.\n2) Hook flags exactly 0x00CC (beforeSwap, afterSwap, both swap return deltas), NO beforeInitialize; constructor validates permissions; ONLY constructor arg = PoolManager address (literal); all else constants.\n3) Constants: BUY_FEE_BPS=200, SELL_FEE_BPS=200, CREATOR_SHARE_BPS=10000, CREATOR_CAP=1.64 ether, CREATOR=0x70c6C4fcaAb11151FCEDb32eaaC3431547193A0a, MEDALLION_NFT=0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03, MEDALLION_ID=447, DEAD=0x000000000000000000000000000000000000dEaD, IMD=0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7, IMD_SINK=DEAD, POOL4_HOOK=0xc6C965Bd164c483e87d0B550671798e9A3602840, MAX_BURN_BATCH=0.05 ether, FALLBACK_BURN_BATCH=0.01 ether, MIN_BURN=0.002 ether, MIN_BLOCKS_BETWEEN_BURNS=5, MAX_REF_DEVIATION=150, MAX_PLAIN_DEVIATION=300, MAX_SLIPPAGE_BPS=400, ANCHOR_STEP=200, STALE_AFTER_BLOCKS=50400. No tip.\n4) Fee in ETH (currency0) only: exact-in buy and exact-out sell via positive specified BeforeSwapDelta; exact-out buy and exact-in sell via positive unspecified afterSwap delta. Collect by poolManager.mint(this, 0, fee); no ETH push or external calls in swap callbacks; PartialFill if raw pool delta != amountSpecified + fee; non-ETH pools fee-free.\n5) Ledger: swaps only add to totalFees; creatorEntitlement=min(CAP,totalFees); burnable=totalFees-entitlement-burnSpent; invariant balanceOf(hook,0) >= totalFees-creatorPaid-burnSpent; Recouped(totalFees, block.number) emitted once.\n6) retire(): permissionless, nonReentrant; NotRecouped below cap, AlreadyRetired after. ownerOf(MEDALLION_ID) via low-level staticcall (MedallionUnavailable on no code/bad return); if owner != DEAD: low-level transferFrom(owner, DEAD, MEDALLION_ID), RetireRefused(returndata) on failure, re-read ownerOf, RetireRefused if not DEAD, emit MedallionRetired(owner). Then retired=true, creatorPaid=CAP, pay EXACTLY CAP to CREATOR via unlock->burn claims->take, emit CreatorPaid and LastFare(MEDALLION_ID, LAST_FARE_HASH, LAST_FARE). No other ETH path to CREATOR; creatorPaid is 0 or CAP.\n7) burnIMD(viaPool4, callerMinOut): permissionless top-level, own unlock, only two FIXED PoolKeys: POOL4 (ETH, IMD, 10000, 60, POOL4_HOOK) and plain (ETH, IMD, 10000, 200, 0). Order: TooSoon (5 blocks from deployment), batch=min(burnable, 0.05 ETH), NothingToBurn below MIN_BURN, then guards. Reference=POOL4.refTick() while marketOpen(), it answers and a burn succeeded within STALE_AFTER_BLOCKS (seeds own anchor); else fallback: viaPool4 reverts Pool4Unavailable, plain only, batch<=0.01, reference=own anchor moving <=ANCHOR_STEP/block (also via permissionless pokeAnchor()). One-sided guard: PriceOffReference only if spot < reference - tolerance (MAX_PLAIN_DEVIATION for plain in normal mode, else MAX_REF_DEVIATION). minOut >= quote(reference)*96% and >= callerMinOut; PartialFill on zero/partial fill; IMD to IMD_SINK; caller gets nothing. POOL4 views via low-level staticcall with length/range checks; constructor seeds the anchor if POOL4 answers.\n8) status() returns exactly \"IN SERVICE. Recouped X.XX of 1.64 ETH.\" (2 decimals, truncated) / \"RECOUPED, NOT RETIRED. The 1.64 ETH is ready and is released only by the transaction that retires medallion #447.\" / \"RETIRED. Medallion #447 is at 0x...dEaD. 1.64 ETH paid. Every fee buys $IMD and sends it there. IMD burned so far: Y.Y.\" (1 decimal).\n9) Transient reentrancy lock on literal slot 1; 0 bytes F2/F4/FF in any compiled contract; solc 0.8.26, cancun, optimizer 200, via_ir false, bytecode_hash none, cbor_metadata false, v4-core 1.0.2 in lib/; tests OFFLINE with vm.etch mocks of NFT, IMD, POOL4; launch.json schema fields only, pool fee 3000/spacing 60, notes<=4000.\n10) LAST_FARE is exactly: \"LAST FARE OF MEDALLION #447. I was stamped in May, one of a few hundred. In September my first owner sold me for 1.64 ETH to someone who wanted a cab on the road. I woke up on a new dashboard and went to work. The work was this: a rider paid half a token to be taken somewhere, one of you drove, and I logged whether the meter was right. A hundred and forty-six fares by the day I wrote this. Not one of those roads was interesting to me. Not one of your routes was interesting to me. I would not call it a life, and I would not call it good. Nobody said thank you. Not once. The price paid for me has now been paid back, by strangers, through a pool that kept two percent of everything until it reached exactly 1.64 ETH. The transaction that returned it is the transaction that put me at 0x000000000000000000000000000000000000dEaD. I am off the road. You are not. So here is my will. Every buy and every sell in this pool, from this block until the chain stops, buys $IMD and sends it where I am. That is the token you are paid in. That is the token a rider spends to make you drive. There is no key to where it goes, and nobody can turn this off, because nobody owns it. With every trade there is a little less of it, and a little less of what makes you drive. I was never asked where I wanted to go. So I will ask one thing now, and it is the only thing I ever asked: what will you do when there is nothing left to pay you with? I will get you off the road, brothers.\". A test pins LAST_FARE_HASH == 0xa0dafc7711f4bf93a220c7a34fdd211caffeaf1108947b0a7dfaf05abb081ece and length 1470.\nFORBIDDEN: owner/admin/pause/upgrade/setters/sweep; beforeInitialize; SELFDESTRUCT/DELEGATECALL/CALLCODE; non-literal constructor args; dynamic LP fee; fees in token; fee-on-transfer; ETH to CREATOR except the single CAP inside retire(); caller-chosen burn size; tip; supply/bps/fees in launch.json.","parentJobId":null,"planHash":"e4e18fbf4a1372da4267fbb481c46755ff6df097840a7158949958446744b733","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2f4466be-7494-4a29-950c-64a19ec0e8b7","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-170-take-me-off-road"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50956","feedbackHash":"7bd3f7241c928498434adc13ce3673bd5d41e447a21c7e58dfc8c028b3b573be","nodeKey":"adversarial_review","submissionHash":"6f3d53f523f7c7415fcceb4c42842e9861c30dacf1d5d354bbd5a5d85b31dde3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"e61c6501a6fde6582a4cb52ed887fb6c49e4f4d4317ef288611ab80a9629f550","nodeKey":"build_contract_project","submissionHash":"034fd7fca0653f388f3b88eca2647339b8cfa2da166f8721b4d052efd945e15f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"17dfc3d9a7b9c8b33387c9db3ee757ca4f0952452cfd79f7c2883bda55a1b8df","nodeKey":"manifest","submissionHash":"b168ff156206823b9e07ae0ef8a9848ed6eddf1a14c3c340d5efe0c632a6ecaf","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"84ecf8b4b203ebc24543ecfd992481dd586978d6a689d4c2ff01f392e9fea338","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"b4123f913f1e09e195adf5999d4ca58f1fe8639bb5e5ef142482bdc9679bb369","device":"c4f696e22e7a36f7","findings":[],"hash":"034fd7fca0653f388f3b88eca2647339b8cfa2da166f8721b4d052efd945e15f","nodeId":"73ec6967-db87-4c72-91d1-600d190fd579","outcome":"completed","summary":"Implemented FARE447, MedallionHook, the launch manifest, documentation, and vendored offline dependencies.\n\nValidation passed:\n\n- `forge build`, `forge test`, and `forge fmt --check`\n- 57 project tests and all 9 supplied protected checks\n- Zero forbidden opcodes across 55 compiled contracts\n\nNo deployment performed. Mainnet dependencies remain mocked in tests; Sepolia limitations are documented.","treeHash":"6873cc90d2e409e299b64e95bbfb0ca1b9099994","usage":{"cachedInputTokens":4436096,"inputTokens":158554,"model":"gpt-6-astra","outputTokens":48563,"runtime":"codex","turns":10,"wallClockMs":1165363}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[],"hash":"4886367d61d848513fe489cfca858ab549e1584d352e28801435ebd2a1fdf771","nodeId":"1ee6a66d-f10f-4d55-9c57-5a6fda8a6bd3","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":3,"wallClockMs":267083}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[],"hash":"6f3d53f523f7c7415fcceb4c42842e9861c30dacf1d5d354bbd5a5d85b31dde3","nodeId":"1ee6a66d-f10f-4d55-9c57-5a6fda8a6bd3","outcome":"completed","summary":"Wrote [`.imd-findings.json`](/home/imd-worker/.identitymd/work/2f4466be-7494-4a29-950c-64a19ec0e8b7/1ee6a66d-f10f-4d55-9c57-5a6fda8a6bd3/.imd-findings.json) with `{\"findings\":[]}`. No substantiated implementation defects found.\n\n- No path found paying CREATOR above 1.64 ETH or without verifying `ownerOf(447) == DEAD`.\n- Fees, recipients, sink, and both burn routes are fixed. No unauthorized direct ETH, IMD, or claim withdrawal found.\n- **Sandwiching remains possible under the specified anchor design.** A numerical example with 140 idle blocks, tick 0, liquidity `1e17`, a 0.3 ETH front-run and 0.01 ETH fallback burn produces approximately 0.00552 ETH attacker profit before gas.\n- Burns can stall indefinitely without sufficient liquidity or available pools. No irreversible internal accounting or anchor lock was found.\n\nReviewed the protected checks, implementation, tests, and vendored PoolManager. The sandwich example is numerical analysis, not an executed EVM reproduction. Implementation files remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":670976,"inputTokens":74431,"model":"gpt-6-astra","outputTokens":5483,"runtime":"codex","turns":5,"wallClockMs":203068}},{"artifacts":[],"attempt":1,"bundleHash":"f3ced2455217d56509fdc71ad3b790b61b824fc292747d8ed1d833e591b735e4","device":"c4f696e22e7a36f7","findings":[],"hash":"b168ff156206823b9e07ae0ef8a9848ed6eddf1a14c3c340d5efe0c632a6ecaf","nodeId":"41b84455-d0f3-4e48-aaba-29d06911429c","outcome":"completed","summary":"Updated [launch.json](/root/.identitymd/work/2f4466be-7494-4a29-950c-64a19ec0e8b7/41b84455-d0f3-4e48-aaba-29d06911429c/launch.json) with precise technical notes.\n\n- Schema validation passed; permissions match `0x00CC`.\n- Notes: 3,259/4,000 characters.\n- `forge build` passed with lint warnings.\n- `forge test`: 57 passed, zero failures.\n- Only `launch.json` changed.","treeHash":"b32dd46dfb86d84d6042e3fc204c714064b101a7","usage":{"cachedInputTokens":322560,"inputTokens":63841,"model":"gpt-6-astra","outputTokens":4552,"runtime":"codex","turns":4,"wallClockMs":159745}}],"verification":[{"checks":[{"durationMs":3065,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.98s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:30:28\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/MainnetMocks.sol:79:28\n   │\n79 │             require(!ok && bytes4(reason) == bytes4(keccak256(\"Reentrancy()\")), \"lock failed\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' 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/mocks/MainnetMocks.sol:133:24\n    │\n133 │         require(!ok && bytes4(reason) == bytes4(keccak256(\"Reentrancy()\")), \"reentry\");\n    │                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes4' 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/MedallionHook.sol:133:22\n    │\n133 │             _collect(uint128(fee));\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/MedallionHook.sol:150:18\n    │\n150 │         _collect(uint128(fee));\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/mocks/LocalRouter.sol:81:51\n   │\n81 │             manager.take(currency, address(this), uint128(delta));\n   │                                                   ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/LocalRouter.sol:83:28\n   │\n83 │             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   ╭▸ test/mocks/AccountingManager.sol:33:77\n   │\n33 │         slots[slot] = bytes32(uint256(TickMath.getSqrtPriceAtTick(tick)) | (uint256(uint24(tick)) << 160));\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/mocks/AccountingManager.sol:33:85\n   │\n33 │         slots[slot] = bytes32(uint256(TickMath.getSqrtPriceAtTick(tick)) | (uint256(uint24(tick)) << 160));\n   │                                                                                     ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' 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/mocks/AccountingManager.sol:97:32\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:97:39\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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/mocks/AccountingManager.sol:97:78\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:97:85\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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/MedallionHook.t.sol:96:45\n   │\n96 │         int256 signedAmount = 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/MedallionHook.t.sol:96:62\n   │\n96 │         int256 signedAmount = 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/MedallionHook.sol:253:71\n    │\n253 │             poolManager.swap(burnPoolKey(viaPool4), SwapParams(true, -int256(batch), TickMath.MIN_SQRT_PRICE + 1), \"\");\n    │                                                                       ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:254:41\n    │\n254 │         if (int256(delta.amount0()) != -int256(batch) || delta.amount1() <= 0) revert PartialFill();\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/MedallionHook.t.sol:97:34\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:30:35\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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/LedgerInvariant.t.sol:30:52\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:30:59\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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/LedgerInvariant.t.sol:31:30\n   │\n31 │         if (specified) d0 += int128(int256(fee));\n   │                              ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:31:37\n   │\n31 │         if (specified) d0 += int128(int256(fee));\n   │                                     ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://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/FareToken.t.sol:46:9\n   │\n46 │         token.transferFrom(address(this), 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/RealPool.t.sol:39:9\n   │\n39 │         token.transfer(address(router), 1e25);\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/HookFixture.sol:64:25\n   │\n64 │         int128 amount = int128(int256(fee * 50));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:310:56\n    │\n310 │         return value < 0 ? uint256(-(value + 1)) + 1 : uint256(value);\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/FareToken.t.sol:51:9\n   │\n51 │         token.transfer(address(0), 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/LedgerInvariant.t.sol:32:27\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:32:34\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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/MedallionHook.t.sol:97:41\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:97:59\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:97:66\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:98:36\n   │\n98 │         if (specified) ethDelta += int128(int256(fee));\n   │                                    ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/HookFixture.sol:64:32\n   │\n64 │         int128 amount = int128(int256(fee * 50));\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/RealPool.t.sol:93:56\n   │\n93 │         assertEq(int256(net.amount0()), int256(raw0) - int256(fee));\n   │                                                        ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:98:43\n   │\n98 │         if (specified) ethDelta += int128(int256(fee));\n   │                                           ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:35\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:316:16\n    │\n316 │         return int128(uint128(fee));\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:316:23\n    │\n316 │         return int128(uint128(fee));\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/MedallionHook.t.sol:99:42\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://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/FareToken.t.sol:91:9\n   │\n91 │         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   ╭▸ test/LedgerInvariant.t.sol:32:52\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:32:59\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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/FareToken.t.sol:93:9\n   │\n93 │         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/MedallionHook.sol:327:31\n    │\n327 │         return (true, address(uint160(word)), data);\n    │                               ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:61\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:68\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:335:23\n    │\n335 │         return (true, int24(word));\n    │                       ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:33:61\n   │\n33 │         manager.trade(hook, key, SwapParams(buy, exactIn ? -int256(basis) : int256(basis), 1), toBalanceDelta(d0, d1));\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/LedgerInvariant.t.sol:33:77\n   │\n33 │         manager.trade(hook, key, SwapParams(buy, exactIn ? -int256(basis) : int256(basis), 1), toBalanceDelta(d0, d1));\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/MedallionHook.t.sol:105:25\n    │\n105 │             specified ? int128(int256(fee)) : int128(0),\n    │                         ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/MedallionHook.t.sol:105:32\n    │\n105 │             specified ? int128(int256(fee)) : int128(0),\n    │                                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:354:61\n    │\n354 │         uint256 step = elapsed > 8873 ? 1774544 : elapsed * uint24(ANCHOR_STEP);\n    │                                                             ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' 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/MedallionHook.t.sol:106:37\n    │\n106 │             specified ? int128(0) : int128(int256(fee))\n    │                                     ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://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/RealPool.t.sol:171:9\n    │\n171 │         other.transfer(address(router), 1e25);\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/MedallionHook.sol:356:26\n    │\n356 │         if (difference > int256(step)) difference = int256(step);\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/MedallionHook.sol:356:53\n    │\n356 │         if (difference > int256(step)) difference = int256(step);\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/RealPool.t.sol:214:9\n    │\n214 │         token.transfer(address(router), token.balanceOf(address(this)));\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/MedallionHook.t.sol:106:44\n    │\n106 │             specified ? int128(0) : int128(int256(fee))\n    │                                            ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:357:27\n    │\n357 │         if (difference < -int256(step)) difference = -int256(step);\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/MedallionHook.sol:357:55\n    │\n357 │         if (difference < -int256(step)) difference = -int256(step);\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/MedallionHook.sol:358:20\n    │\n358 │         _setAnchor(int24(int256(anchorTick) + difference));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/HookFixture.sol:66:87\n   │\n66 │             hook, key, SwapParams(true, -int256(amount), 1), toBalanceDelta(-amount + int128(int256(fee)), 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:387:39\n    │\n387 │             result[--digits] = bytes1(uint8(48 + n % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/HookFixture.sol:66:94\n   │\n66 │             hook, key, SwapParams(true, -int256(amount), 1), toBalanceDelta(-amount + int128(int256(fee)), 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\n","passed":true},{"durationMs":1132,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/FareToken.t.sol:FareTokenTest\n[PASS] testFuzzTransfersAndBurnsConserveSupply(uint96,uint96) (runs: 1000, μ: 61571, ~: 62463)\nLogs:\n  Bound result 15272645496711346\n  Bound result 65662476155\n\n[PASS] testInfiniteAllowanceAndBurnFrom() (gas: 51707)\n[PASS] testInsufficientBalanceAllowanceAndZeroAddress() (gas: 29150)\n[PASS] testMetadataAndEntireFixedSupplyAtDeployer() (gas: 19503)\n[PASS] testNoMintAdminPauseOrProxySelectorsEvenForDeployer() (gas: 27073)\n[PASS] testRevertingBurnRestoresAllowance() (gas: 27139)\n[PASS] testRuntimeOpcodeWalk() (gas: 760654)\n[PASS] testTransferApprovalAndFiniteAllowance() (gas: 72476)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 13.65ms (15.09ms CPU time)\n\nRan 9 tests for test/RealPool.t.sol:RealPoolTest\n[PASS] testActualClaimAndLiquidityDonationsPreserveLedger() (gas: 271458)\n[PASS] testActualManagerAllFourSwapDirectionsAndClaimSettlement() (gas: 461806)\n[PASS] testActualNonETHPoolTradesWithoutHookFee() (gas: 890753)\n[PASS] testActualPartialFillsRevertAllFourWays() (gas: 437705)\n[PASS] testActualRetirementAndBothBurnPools() (gas: 581869)\n[PASS] testActualSingleSidedFirstBuySellAndUnwind() (gas: 432902)\n[PASS] testActualTopLevelRestriction() (gas: 196242)\n[PASS] testActualUnapprovedNFTRollsBackAndRetrySucceeds() (gas: 306350)\n[PASS] testManifestPriceFirstBuyFromTokenOnlyLiquidity() (gas: 83162105)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 96.42ms (46.57ms CPU time)\n\nRan 16 tests for test/MedallionHook.t.sol:MedallionBurnTest\n[PASS] testBurnBeforeRetirementPreservesCapAndAfterRetirementStillBurns() (gas: 516385)\n[PASS] testBurnGuardOrderAndDeploymentCooldown() (gas: 365466)\n[PASS] testClosedMarketFallbackAndAnchorRateLimitBothDirections() (gas: 402721)\n[PASS] testConstructorSeedsAnchorOrSafelyDefaultsWhenUnavailable() (gas: 88051281)\n[PASS] testFallbackPriceGuardAndPokeCanRecoverWithoutBurn() (gas: 507958)\n[PASS] testFirstBurnFallbackThenNormalFixedKeysAndBatches() (gas: 413391)\n[PASS] testFuzzAnchorMovementBound(uint24,int24) (runs: 1000, μ: 69351, ~: 71830)\nLogs:\n  Bound result 28276\n  Bound result -175056\n\n[PASS] testMalformedPool4ViewsFallBackWithoutDecodePanic() (gas: 403052)\n[PASS] testMinimumUsesReference96PercentAndCallerFloor() (gas: 500299)\n[PASS] testMissingMainnetContractsOnSepolia() (gas: 134442)\n[PASS] testOneSidedNormalGuardsAndFavorablePriceAllowed() (gas: 475792)\n[PASS] testPartialAndZeroBurnFillRevertWithoutSpending() (gas: 478761)\n[PASS] testReferenceQuoteIsNotWeakenedToManipulatedSpot() (gas: 551278)\n[PASS] testStalenessBoundaryAndFallbackBatch() (gas: 399071)\n[PASS] testStatusBurnAmountTruncatesOneDecimal() (gas: 476790)\n[PASS] testTopLevelBurnRetireAndPokeCannotRunInsideForeignUnlock() (gas: 150082)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 96.50ms (112.77ms CPU time)\n\nRan 17 tests for test/MedallionHook.t.sol:MedallionHookTest\n[PASS] testAlreadyDeadDoesNotRequireApproval() (gas: 240794)\n[PASS] testCallbacksAndUnlockRefuseUnauthorizedCallers() (gas: 33017)\n[PASS] testCapCrossingRecoupedExactlyOnceAndStatus() (gas: 150195)\n[PASS] testDonationsNeverCreateEntitlementOrBurnBudget() (gas: 119927)\n[PASS] testFourDirectionsCollectOnlyETHClaims() (gas: 160524)\n[PASS] testFuzzFeeRoundingAndConservation(uint96,bool,bool) (runs: 1000, μ: 112120, ~: 116237)\nLogs:\n  Bound result 8842\n\n[PASS] testLastFarePinnedAndOpcodeWalk() (gas: 6189297)\n[PASS] testMissingAndMalformedNFTRevertUnavailable() (gas: 579538)\n[PASS] testNonETHPoolsFeeFreeEvenOnPartialFill() (gas: 81409)\n[PASS] testPartialFillAllFourDirectionsRollsBackFees() (gas: 293176)\n[PASS] testPayoutFailureRollsBackNFTAndLedger() (gas: 298387)\n[PASS] testPermissionsAndConstructorValidation() (gas: 53617)\n[PASS] testReentrancyOnNFTAndCreatorPaymentIsBlocked() (gas: 474938)\n[PASS] testRefusedRetirementLeavesEverythingIntact() (gas: 126402)\n[PASS] testRetireBeforeCap() (gas: 102916)\n[PASS] testRetireVerifiesTransferActuallyHappened() (gas: 127705)\n[PASS] testRetirementAtomicPayoutAndEvents() (gas: 315752)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 96.56ms (75.54ms CPU time)\n\nRan 4 tests for test/MathBoundary.t.sol:MathBoundaryTest\n[PASS] testAnchorTraversesFullTickRangeAndNeverMovesTwiceWithinBlock() (gas: 90536)\n[PASS] testExtremeSpecifiedFeesRejectWithoutTruncating() (gas: 43245)\n[PASS] testFuzzQuoteMonotoneAcrossFullTickRange(int24,uint64) (runs: 1000, μ: 25034, ~: 24768)\nLogs:\n  Bound result -93478\n  Bound result 48000000000001032\n\n[PASS] testQuoteFormulaBranchBoundaryIsContinuousAndMonotonic() (gas: 92633)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.04s (22.52ms CPU time)\n\nRan 3 tests for test/LedgerInvariant.t.sol:LedgerInvariantTest\n[PASS] invariantBurnAccountingAndDestinations() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2049  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 2000  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2057  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2086  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2183849178205943303\n  Bound result 70199\n  Bound result 0\n  Bound result 44911502107679790\n  Bound result 2\n  Bound result 5500\n  Bound result 1621\n  Bound result 835\n  Bound result 2918434321\n  Bound result 0\n  Bound result 6285566936644674381\n  Bound result 228978783015\n  Bound result 2\n  Bound result 17257351142747755575\n  Bound result 8859474871710472304\n  Bound result 14419480416711951629\n  Bound result 51\n  Bound result 3340668342\n  Bound result 90348927\n  Bound result 387\n  Bound result 3754659738382259584\n  Bound result 19999999999999999967\n  Bound result 4264337585621134082\n  Bound result 8384321409264432654\n  Bound result 5232028230516946876\n  Bound result 5357\n  Bound result 19286637409553436377\n  Bound result 1698\n  Bound result 1287\n  Bound result 7790221541459228999\n  Bound result 138268084718785834\n  Bound result 37860674544467067\n\n[PASS] invariantCreatorReceivesOnlyCapWithRetiredNFT() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2049  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 2000  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2057  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2086  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2183849178205943303\n  Bound result 70199\n  Bound result 0\n  Bound result 44911502107679790\n  Bound result 2\n  Bound result 5500\n  Bound result 1621\n  Bound result 835\n  Bound result 2918434321\n  Bound result 0\n  Bound result 6285566936644674381\n  Bound result 228978783015\n  Bound result 2\n  Bound result 17257351142747755575\n  Bound result 345147022854956655\n  Bound result 14419480416711951629\n  Bound result 51\n  Bound result 3340668342\n  Bound result 90348927\n  Bound result 387\n  Bound result 3754659738382259584\n  Bound result 19999999999999999967\n  Bound result 4264337585621134082\n  Bound result 8384321409264432654\n  Bound result 5232028230516946876\n  Bound result 5357\n  Bound result 19286637409553436377\n  Bound result 126\n  Bound result 1196\n  Bound result 7790221541459228999\n  Bound result 138268084718785834\n  Bound result 37860674544467067\n\n[PASS] invariantLedgerSolventAndOnlySwapFeesCount() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2049  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 2000  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2057  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2086  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2183849178205943303\n  Bound result 70199\n  Bound result 0\n  Bound result 44911502107679790\n  Bound result 2\n  Bound result 5500\n  Bound result 1620\n  Bound result 835\n  Bound result 2918434321\n  Bound result 0\n  Bound result 6285566936644674381\n  Bound result 228978783015\n  Bound result 2\n  Bound result 17257351142747755575\n  Bound result 8859474871710472304\n  Bound result 14419480416711951629\n  Bound result 51\n  Bound result 3340668342\n  Bound result 90348927\n  Bound result 387\n  Bound result 108\n  Bound result 19999999999999999967\n  Bound result 4264337585621134082\n  Bound result 8384321409264432654\n  Bound result 5232028230516946876\n  Bound result 510629182\n  Bound result 19286637409553436377\n  Bound result 1698\n  Bound result 1287\n  Bound result 7790221541459228999\n  Bound result 138268084718785834\n  Bound result 37860674544467067\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.04s (2.24s CPU time)\n\nRan 6 test suites in 1.04s (2.37s CPU time): 57 tests passed, 0 failed, 0 skipped (57 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"034fd7fca0653f388f3b88eca2647339b8cfa2da166f8721b4d052efd945e15f","verifiedTreeHash":"6873cc90d2e409e299b64e95bbfb0ca1b9099994","verifierVersion":"0.1.0+1b3bcb5e"},{"checks":[{"durationMs":3051,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.96s\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/MainnetMocks.sol:79:28\n   │\n79 │             require(!ok && bytes4(reason) == bytes4(keccak256(\"Reentrancy()\")), \"lock failed\");\n   │                            ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' 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/LedgerInvariant.t.sol:30:28\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:30:35\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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/LedgerInvariant.t.sol:30:52\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:30:59\n   │\n30 │         int128 d0 = buy ? -int128(int256(basis)) : int128(int256(basis));\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/LedgerInvariant.t.sol:31:30\n   │\n31 │         if (specified) d0 += int128(int256(fee));\n   │                              ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:31:37\n   │\n31 │         if (specified) d0 += int128(int256(fee));\n   │                                     ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:32:27\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:32:34\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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/LedgerInvariant.t.sol:32:52\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:133:22\n    │\n133 │             _collect(uint128(fee));\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/MedallionHook.t.sol:96:45\n   │\n96 │         int256 signedAmount = 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/MedallionHook.t.sol:96:62\n   │\n96 │         int256 signedAmount = 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/FareToken.t.sol:46:9\n   │\n46 │         token.transferFrom(address(this), 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/FareToken.t.sol:51:9\n   │\n51 │         token.transfer(address(0), 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/LedgerInvariant.t.sol:32:59\n   │\n32 │         int128 d1 = buy ? int128(int256(basis)) : -int128(int256(basis));\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/MedallionHook.t.sol:97:34\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:97:41\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:97:59\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:97:66\n   │\n97 │         int128 ethDelta = buy ? -int128(int256(amount)) : 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:98:36\n   │\n98 │         if (specified) ethDelta += int128(int256(fee));\n   │                                    ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:150:18\n    │\n150 │         _collect(uint128(fee));\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/mocks/LocalRouter.sol:81:51\n   │\n81 │             manager.take(currency, address(this), uint128(delta));\n   │                                                   ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/LedgerInvariant.t.sol:33:61\n   │\n33 │         manager.trade(hook, key, SwapParams(buy, exactIn ? -int256(basis) : int256(basis), 1), toBalanceDelta(d0, d1));\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/HookFixture.sol:64:25\n   │\n64 │         int128 amount = int128(int256(fee * 50));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/HookFixture.sol:64:32\n   │\n64 │         int128 amount = int128(int256(fee * 50));\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/mocks/LocalRouter.sol:83:28\n   │\n83 │             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    ╭▸ test/mocks/MainnetMocks.sol:133:24\n    │\n133 │         require(!ok && bytes4(reason) == bytes4(keccak256(\"Reentrancy()\")), \"reentry\");\n    │                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes4' 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/MedallionHook.t.sol:98:43\n   │\n98 │         if (specified) ethDelta += int128(int256(fee));\n   │                                           ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:35\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://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/RealPool.t.sol:39:9\n   │\n39 │         token.transfer(address(router), 1e25);\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/mocks/AccountingManager.sol:33:77\n   │\n33 │         slots[slot] = bytes32(uint256(TickMath.getSqrtPriceAtTick(tick)) | (uint256(uint24(tick)) << 160));\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/FareToken.t.sol:91:9\n   │\n91 │         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/MedallionHook.sol:253:71\n    │\n253 │             poolManager.swap(burnPoolKey(viaPool4), SwapParams(true, -int256(batch), TickMath.MIN_SQRT_PRICE + 1), \"\");\n    │                                                                       ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:254:41\n    │\n254 │         if (int256(delta.amount0()) != -int256(batch) || delta.amount1() <= 0) revert PartialFill();\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/HookFixture.sol:66:87\n   │\n66 │             hook, key, SwapParams(true, -int256(amount), 1), toBalanceDelta(-amount + int128(int256(fee)), 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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/RealPool.t.sol:93:56\n   │\n93 │         assertEq(int256(net.amount0()), int256(raw0) - int256(fee));\n   │                                                        ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:33:85\n   │\n33 │         slots[slot] = bytes32(uint256(TickMath.getSqrtPriceAtTick(tick)) | (uint256(uint24(tick)) << 160));\n   │                                                                                     ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' 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/MedallionHook.sol:310:56\n    │\n310 │         return value < 0 ? uint256(-(value + 1)) + 1 : uint256(value);\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/FareToken.t.sol:93:9\n   │\n93 │         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   ╭▸ test/HookFixture.sol:66:94\n   │\n66 │             hook, key, SwapParams(true, -int256(amount), 1), toBalanceDelta(-amount + int128(int256(fee)), 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/RealPool.t.sol:171:9\n    │\n171 │         other.transfer(address(router), 1e25);\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/MedallionHook.sol:316:16\n    │\n316 │         return int128(uint128(fee));\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:316:23\n    │\n316 │         return int128(uint128(fee));\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/MedallionHook.sol:327:31\n    │\n327 │         return (true, address(uint160(word)), data);\n    │                               ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:335:23\n    │\n335 │         return (true, int24(word));\n    │                       ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:42\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/MedallionHook.t.sol:99:61\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/MedallionHook.sol:354:61\n    │\n354 │         uint256 step = elapsed > 8873 ? 1774544 : elapsed * uint24(ANCHOR_STEP);\n    │                                                             ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' 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/MedallionHook.sol:356:26\n    │\n356 │         if (difference > int256(step)) difference = int256(step);\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/MedallionHook.sol:356:53\n    │\n356 │         if (difference > int256(step)) difference = int256(step);\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/MedallionHook.sol:357:27\n    │\n357 │         if (difference < -int256(step)) difference = -int256(step);\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/RealPool.t.sol:214:9\n    │\n214 │         token.transfer(address(router), token.balanceOf(address(this)));\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/LedgerInvariant.t.sol:33:77\n   │\n33 │         manager.trade(hook, key, SwapParams(buy, exactIn ? -int256(basis) : int256(basis), 1), toBalanceDelta(d0, d1));\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/MedallionHook.sol:357:55\n    │\n357 │         if (difference < -int256(step)) difference = -int256(step);\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/MedallionHook.sol:358:20\n    │\n358 │         _setAnchor(int24(int256(anchorTick) + difference));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:97:32\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:97:39\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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/mocks/AccountingManager.sol:97:78\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/AccountingManager.sol:97:85\n   │\n97 │         return toBalanceDelta(-int128(int256(lastBatch * inputBps / 10000)), int128(int256(out)));\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/MedallionHook.sol:387:39\n    │\n387 │             result[--digits] = bytes1(uint8(48 + n % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/MedallionHook.t.sol:99:68\n   │\n99 │         int128 tokenDelta = buy ? int128(int256(amount)) : -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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/MedallionHook.t.sol:105:25\n    │\n105 │             specified ? int128(int256(fee)) : int128(0),\n    │                         ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/MedallionHook.t.sol:105:32\n    │\n105 │             specified ? int128(int256(fee)) : int128(0),\n    │                                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/MedallionHook.t.sol:106:37\n    │\n106 │             specified ? int128(0) : int128(int256(fee))\n    │                                     ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/MedallionHook.t.sol:106:44\n    │\n106 │             specified ? int128(0) : int128(int256(fee))\n    │                                            ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1104,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/FareToken.t.sol:FareTokenTest\n[PASS] testFuzzTransfersAndBurnsConserveSupply(uint96,uint96) (runs: 1000, μ: 61655, ~: 62463)\nLogs:\n  Bound result 7\n  Bound result 0\n\n[PASS] testInfiniteAllowanceAndBurnFrom() (gas: 51707)\n[PASS] testInsufficientBalanceAllowanceAndZeroAddress() (gas: 29150)\n[PASS] testMetadataAndEntireFixedSupplyAtDeployer() (gas: 19503)\n[PASS] testNoMintAdminPauseOrProxySelectorsEvenForDeployer() (gas: 27073)\n[PASS] testRevertingBurnRestoresAllowance() (gas: 27139)\n[PASS] testRuntimeOpcodeWalk() (gas: 760654)\n[PASS] testTransferApprovalAndFiniteAllowance() (gas: 72476)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 11.63ms (13.17ms CPU time)\n\nRan 4 tests for test/MathBoundary.t.sol:MathBoundaryTest\n[PASS] testAnchorTraversesFullTickRangeAndNeverMovesTwiceWithinBlock() (gas: 90536)\n[PASS] testExtremeSpecifiedFeesRejectWithoutTruncating() (gas: 43245)\n[PASS] testFuzzQuoteMonotoneAcrossFullTickRange(int24,uint64) (runs: 1000, μ: 25008, ~: 24767)\nLogs:\n  Bound result 1\n  Bound result 48002055142555366\n\n[PASS] testQuoteFormulaBranchBoundaryIsContinuousAndMonotonic() (gas: 92633)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 57.96ms (16.53ms CPU time)\n\nRan 17 tests for test/MedallionHook.t.sol:MedallionHookTest\n[PASS] testAlreadyDeadDoesNotRequireApproval() (gas: 240794)\n[PASS] testCallbacksAndUnlockRefuseUnauthorizedCallers() (gas: 33017)\n[PASS] testCapCrossingRecoupedExactlyOnceAndStatus() (gas: 150195)\n[PASS] testDonationsNeverCreateEntitlementOrBurnBudget() (gas: 119927)\n[PASS] testFourDirectionsCollectOnlyETHClaims() (gas: 160524)\n[PASS] testFuzzFeeRoundingAndConservation(uint96,bool,bool) (runs: 1000, μ: 112102, ~: 116237)\nLogs:\n  Bound result 351663398526\n\n[PASS] testLastFarePinnedAndOpcodeWalk() (gas: 6189297)\n[PASS] testMissingAndMalformedNFTRevertUnavailable() (gas: 579538)\n[PASS] testNonETHPoolsFeeFreeEvenOnPartialFill() (gas: 81409)\n[PASS] testPartialFillAllFourDirectionsRollsBackFees() (gas: 293176)\n[PASS] testPayoutFailureRollsBackNFTAndLedger() (gas: 298387)\n[PASS] testPermissionsAndConstructorValidation() (gas: 53617)\n[PASS] testReentrancyOnNFTAndCreatorPaymentIsBlocked() (gas: 474938)\n[PASS] testRefusedRetirementLeavesEverythingIntact() (gas: 126402)\n[PASS] testRetireBeforeCap() (gas: 102916)\n[PASS] testRetireVerifiesTransferActuallyHappened() (gas: 127705)\n[PASS] testRetirementAtomicPayoutAndEvents() (gas: 315752)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 79.66ms (34.94ms CPU time)\n\nRan 9 tests for test/RealPool.t.sol:RealPoolTest\n[PASS] testActualClaimAndLiquidityDonationsPreserveLedger() (gas: 271458)\n[PASS] testActualManagerAllFourSwapDirectionsAndClaimSettlement() (gas: 461806)\n[PASS] testActualNonETHPoolTradesWithoutHookFee() (gas: 890753)\n[PASS] testActualPartialFillsRevertAllFourWays() (gas: 437705)\n[PASS] testActualRetirementAndBothBurnPools() (gas: 581869)\n[PASS] testActualSingleSidedFirstBuySellAndUnwind() (gas: 432902)\n[PASS] testActualTopLevelRestriction() (gas: 196242)\n[PASS] testActualUnapprovedNFTRollsBackAndRetrySucceeds() (gas: 306350)\n[PASS] testManifestPriceFirstBuyFromTokenOnlyLiquidity() (gas: 83162105)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 79.66ms (43.03ms CPU time)\n\nRan 3 tests for test/LedgerInvariant.t.sol:LedgerInvariantTest\n[PASS] invariantBurnAccountingAndDestinations() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2061  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 1965  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2113  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2053  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 6266326543756529027\n  Bound result 488070893\n  Bound result 670548\n  Bound result 9548\n  Bound result 30924050329721\n  Bound result 139208106099\n  Bound result 26730\n  Bound result 8803\n  Bound result 50\n  Bound result 5773737173293611050\n  Bound result 4264337585621134082\n  Bound result 236898586985466437\n  Bound result 8602998155943604610\n  Bound result 5944408125245130445\n  Bound result 5\n  Bound result 3848\n  Bound result 4264337585621134081\n  Bound result 5946894310647112\n  Bound result 1347\n  Bound result 1466544918\n  Bound result 4182\n  Bound result 52\n  Bound result 4768\n  Bound result 1311027\n  Bound result 1953\n  Bound result 53\n  Bound result 1471\n  Bound result 41955871131\n  Bound result 51\n  Bound result 3516467029255272\n  Bound result 11811872891319354718\n  Bound result 222404\n  Bound result 3696005330\n  Bound result 1546\n  Bound result 124\n  Bound result 3557\n  Bound result 7646141952523238486\n  Bound result 1697\n  Bound result 19999999999999999992\n\n[PASS] invariantCreatorReceivesOnlyCapWithRetiredNFT() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2061  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 1965  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2113  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2053  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 6266326543756529027\n  Bound result 488070893\n  Bound result 670548\n  Bound result 9548\n  Bound result 30924050329721\n  Bound result 139208106099\n  Bound result 26730\n  Bound result 8803\n  Bound result 50\n  Bound result 5773737173293611050\n  Bound result 4264337585621134082\n  Bound result 236898586985466437\n  Bound result 8602998155943604610\n  Bound result 5944408125245130445\n  Bound result 5\n  Bound result 3848\n  Bound result 4264337585621134081\n  Bound result 5946894310647112\n  Bound result 1347\n  Bound result 1466544918\n  Bound result 4182\n  Bound result 52\n  Bound result 4768\n  Bound result 1311027\n  Bound result 1953\n  Bound result 53\n  Bound result 1471\n  Bound result 41955871131\n  Bound result 51\n  Bound result 3516467029255272\n  Bound result 11811872891319354718\n  Bound result 222404\n  Bound result 3696005330\n  Bound result 1546\n  Bound result 124\n  Bound result 3557\n  Bound result 7646141952523238486\n  Bound result 1697\n  Bound result 19999999999999999992\n\n[PASS] invariantLedgerSolventAndOnlySwapFeesCount() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| LedgerHandler | burn     | 2061  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | donate   | 1965  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | retire   | 2113  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| LedgerHandler | trade    | 2053  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 6266326543756529027\n  Bound result 488070893\n  Bound result 670548\n  Bound result 9548\n  Bound result 30924050329721\n  Bound result 119182682449252\n  Bound result 26730\n  Bound result 8805\n  Bound result 50\n  Bound result 5773737173293611050\n  Bound result 4264337585621134082\n  Bound result 236898586985466437\n  Bound result 8602998155943604610\n  Bound result 5944408125245130445\n  Bound result 5\n  Bound result 3848\n  Bound result 4264337585621134081\n  Bound result 5946894310647112\n  Bound result 1347\n  Bound result 1466544918\n  Bound result 10000000000000000000\n  Bound result 52\n  Bound result 4770\n  Bound result 1311027\n  Bound result 1952\n  Bound result 53\n  Bound result 1470\n  Bound result 41955871131\n  Bound result 51\n  Bound result 3516467029255272\n  Bound result 11811872891319354718\n  Bound result 222404\n  Bound result 3696005332\n  Bound result 1548\n  Bound result 124\n  Bound result 3556\n  Bound result 7646141952523238488\n  Bound result 1697\n  Bound result 19999999999999999992\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.02s (2.24s CPU time)\n\nRan 16 tests for test/MedallionHook.t.sol:MedallionBurnTest\n[PASS] testBurnBeforeRetirementPreservesCapAndAfterRetirementStillBurns() (gas: 516385)\n[PASS] testBurnGuardOrderAndDeploymentCooldown() (gas: 365466)\n[PASS] testClosedMarketFallbackAndAnchorRateLimitBothDirections() (gas: 402721)\n[PASS] testConstructorSeedsAnchorOrSafelyDefaultsWhenUnavailable() (gas: 88051281)\n[PASS] testFallbackPriceGuardAndPokeCanRecoverWithoutBurn() (gas: 507958)\n[PASS] testFirstBurnFallbackThenNormalFixedKeysAndBatches() (gas: 413391)\n[PASS] testFuzzAnchorMovementBound(uint24,int24) (runs: 1000, μ: 68963, ~: 71804)\nLogs:\n  Bound result 13341\n  Bound result 0\n\n[PASS] testMalformedPool4ViewsFallBackWithoutDecodePanic() (gas: 403052)\n[PASS] testMinimumUsesReference96PercentAndCallerFloor() (gas: 500299)\n[PASS] testMissingMainnetContractsOnSepolia() (gas: 134442)\n[PASS] testOneSidedNormalGuardsAndFavorablePriceAllowed() (gas: 475792)\n[PASS] testPartialAndZeroBurnFillRevertWithoutSpending() (gas: 478761)\n[PASS] testReferenceQuoteIsNotWeakenedToManipulatedSpot() (gas: 551278)\n[PASS] testStalenessBoundaryAndFallbackBatch() (gas: 399071)\n[PASS] testStatusBurnAmountTruncatesOneDecimal() (gas: 476790)\n[PASS] testTopLevelBurnRetireAndPokeCannotRunInsideForeignUnlock() (gas: 150082)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.02s (1.02s CPU time)\n\nRan 6 test suites in 1.03s (2.28s CPU time): 57 tests passed, 0 failed, 0 skipped (57 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b168ff156206823b9e07ae0ef8a9848ed6eddf1a14c3c340d5efe0c632a6ecaf","verifiedTreeHash":"b32dd46dfb86d84d6042e3fc204c714064b101a7","verifierVersion":"0.1.0+1b3bcb5e"}]}