{"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":"722cdd8b-4f02-45d3-a11e-27973c377122","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2940c4b9000daf78164ba276970e6dc9c2fbc97b422e94f3cf62d4d86bd1c62c","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":"dd1446ca34b27e1a651bfa57b895fd0bd88bf76ca0b8a223f763290d7785def2","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":"7bc0278384481d72612a45511628b618dbc54d6cac25684c7f754de6aa715686","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Release TOLLGATE (symbol TOLL), a Uniswap v4 token+hook launched as univ4_hook. TollgateHook charges a 2% fee in NATIVE ETH on every buy and every sell of the pool. 100% of hook fees are owed to a fixed CREATOR wallet until exactly 1 ETH has accrued (CREATOR_CAP); a permissionless payCreator() pays what is owed. After the cap every fee is burnable: a permissionless burnEth() sends it to 0x000000000000000000000000000000000000dEaD. Context: this is a technical rehearsal of the fee-and-cap mechanics (flags 0x00CC with both swap return deltas, a capped fee to a fixed wallet, a permissionless burn) ahead of a later production launch by the same requester; it is not a consumer product and makes no claims beyond what the code does. The creator fee is intentional and must be disclosed in README, launch.json notes and NatSpec; the reviewer must verify its cap, recipient and immutability.\n\nMANDATORY:\n1) Token: self-contained ERC-20, zero-argument constructor, mints EXACTLY 10^27 (1e27) to msg.sender (the LaunchFactory), 18 decimals, no owner, no mint, no pause, no proxy; burn/burnFrom allowed. NEVER 10^24 (launch 123 was parked on SupplyMismatch).\n2) Hook permissions exactly: beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta (flags 0x00CC). NO beforeInitialize (launch 138 was parked on an initialize guard). Constructor calls Hooks.validateHookPermissions. The ONLY constructor argument is the PoolManager address (a literal address). Everything else is a compile-time constant in source.\n3) Constants: BUY_FEE_BPS=200, SELL_FEE_BPS=200, CREATOR_CAP=1 ether, CREATOR=0x70c6C4fcaAb11151FCEDb32eaaC3431547193A0a, BURN_SINK=0x000000000000000000000000000000000000dEaD, MIN_BURN=0.01 ether, MIN_BLOCKS_BETWEEN_BURNS=5.\n4) Fee always in ETH (currency0): exact-in buy and exact-out sell take it in beforeSwap as a positive specified BeforeSwapDelta; exact-out buy and exact-in sell take it in afterSwap as a positive unspecified int128. Collect with poolManager.mint(address(this), 0, fee) (ERC-6909 claim); never push ETH or call external contracts inside swap callbacks. Revert PartialFill if the raw pool delta != amountSpecified + fee. In a pool whose currency0 is not native ETH (e.g. foreign MockERC20 pools of the protected suite) charge nothing and return zero deltas.\n5) Lazy ledger: the swap path only increments totalFees. creatorEntitlement = min(CREATOR_CAP, totalFees); burnable = totalFees - creatorEntitlement - burned. Invariant: PoolManager.balanceOf(hook, 0) >= totalFees - creatorPaid - burned (anyone may transfer ERC-6909 claims to the hook; they stay stuck, there is no sweep). Emit CapReached(totalFees, block.number) exactly once, in the swap that crosses the cap.\n6) payCreator(): permissionless, nonReentrant; pays creatorEntitlement - creatorPaid to CREATOR via unlock -> burn claims -> take; reverts NothingDue when nothing is owed; never more than CREATOR_CAP in total.\n7) burnEth(): permissionless top-level call (separate unlock, never inside a swap), nonReentrant, 5-block cooldown counted from deployment (TooSoon), amount = burnable, revert NothingToBurn below MIN_BURN; via unlock -> burn claims -> take to BURN_SINK. No external contracts other than the PoolManager.\n8) Reentrancy lock on a literal transient slot (1), as PvPadHook, so no hashed constant lands in a data section. A linear opcode walk of every compiled contract must find 0 bytes F2/F4/FF.\n9) Toolchain: solc 0.8.26, evm cancun, optimizer 200, via_ir false, bytecode_hash none, cbor_metadata false, dependencies vendored under lib/ (v4-core 1.0.2).\n10) Tests run OFFLINE (worker checks get no RPC) with a locally deployed PoolManager and routers.\n\nFORBIDDEN: owner, admin, pause, upgrade, fee setter, recipient setter, sweep; beforeInitialize or any initialize gating; SELFDESTRUCT, DELEGATECALL, CALLCODE in any compiled contract; non-literal constructor args such as $token or $pad (launch 137); dynamic LP fee; fees in the token; fee-on-transfer token; any payout to CREATOR beyond 1 ETH in total; putting supply, bps or fees into launch.json; launch.json notes over 4000 characters.","parentJobId":null,"planHash":"09a643b1c973e04582d5ae03264e0b5352bf7d4156d144cdd9eb5b094b7d5d03","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"722cdd8b-4f02-45d3-a11e-27973c377122","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-168-release-tollgate-symbol-toll"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50904","feedbackHash":"158d9fd0d3529ee09d6578033f19ffeaed8457895ed38986580ddaf748b5428b","nodeKey":"adversarial_review","submissionHash":"2940c4b9000daf78164ba276970e6dc9c2fbc97b422e94f3cf62d4d86bd1c62c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50974","feedbackHash":"f4226367689a90b4f7e1e35b1273e474aafb6bf7a223ab8245adbed1a4f1af56","nodeKey":"build_contract_project","submissionHash":"dd1446ca34b27e1a651bfa57b895fd0bd88bf76ca0b8a223f763290d7785def2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50974","feedbackHash":"c15079780f4a0016b4353e554ab7129be50a2bceee9fb2e59e3a00b1337cb7d7","nodeKey":"manifest","submissionHash":"7bc0278384481d72612a45511628b618dbc54d6cac25684c7f754de6aa715686","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5a687bb13df6061c59787888b62adf0d1fb696c02e453ad4420da8632f14e144","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c4f696e22e7a36f7","findings":[],"hash":"2940c4b9000daf78164ba276970e6dc9c2fbc97b422e94f3cf62d4d86bd1c62c","nodeId":"c8d30134-62a5-4254-83cd-fe6e715a0ddf","outcome":"completed","summary":"Wrote [`.imd-findings.json`](/root/.identitymd/work/722cdd8b-4f02-45d3-a11e-27973c377122/c8d30134-62a5-4254-83cd-fe6e715a0ddf/.imd-findings.json) containing `{\"findings\":[]}`.\n\nNo substantiated defects found:\n\n- No path pays CREATOR over 1 ETH or changes fees, recipients, or sink. Required disclosures are present.\n- No third-party payout griefing, successful reentrancy, or unauthorized extraction found. CREATOR rejecting ETH blocks its own payout; burns remain available.\n- All four swap modes match the documented 2% calculation and rounding. Exact-output price limits cannot bypass fees; partial fills revert without changing the ledger.\n\nSeven temporary adversarial checks passed offline, including 1,000 fuzz cases. The opcode scan passed. Implementation and repository tests remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":1078272,"inputTokens":84299,"model":"gpt-6-astra","outputTokens":8234,"runtime":"codex","turns":6,"wallClockMs":309109}},{"artifacts":[],"attempt":1,"bundleHash":"db2d75de609bb91d7a20f6b6eb007c193179141d768d0bbec0909e1793f7036d","device":"98b4506bef931d13","findings":[],"hash":"7bc0278384481d72612a45511628b618dbc54d6cac25684c7f754de6aa715686","nodeId":"570ce988-2c29-4dea-b7bb-574b7eade5df","outcome":"completed","summary":"The manifest is rewritten, validated, and committed. Only launch.json changed.\n\n**What was wrong.** The previous launch.json carried fields the schema rejects at every level: `name`, `chainId`, `hook.source`, `hook.flags` and `token.source`. Because the schema sets `additionalProperties: false`, the whole manifest would have failed to parse. Its notes were also within 19 characters of the cap.\n\n**What the new manifest says.** It keeps `\"kind\": \"univ4_hook\"` as the first field and uses only schema fields.\n\n- Hook `TollgateHook`, one constructor argument, the literal canonical mainnet PoolManager address, and the four permissions beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta.\n- Token `TollToken`, name TOLLGATE, symbol TOLL, 18 decimals.\n- Pool paired with native ETH at the zero address, static LP fee 3000, tick spacing 60, initialPrice `79228162514264337593543950336000`, which is sqrt(1e6) times 2^96, so 1 ETH opens at 1,000,000 TOLL as in test/LaunchRehearsal.t.sol.\n- Notes disclose the 2% ETH fee, the fixed creator wallet, the 1 ETH lifetime cap, the permissionless payout and burn, the burn sink, immutability, the mechanics, the ledger invariant, and the review points. They give no supply figure and no basis-point figure, and they now state that supply, allocations, chain and policy are not manifest fields.\n\n**Checks run.**\n\n| Check | Result |\n| --- | --- |\n| JSON Schema validation with refinements, from test/scratch | passes, notes at 3954 characters, pure ASCII |\n| Manifest permissions folded to an address mask | 0x00CC |\n| Compiled hook ABI constructor | single `address manager`; token has no arguments |\n| Protected Hook and Token floor suites, fed the manifest's constructor literal, flags and decimals | 9 of 9 pass |\n| `forge build` and full repository `forge test` | 55 of 55 pass |\n\nThe commit is cc1d807 on top of the accepted work. Scratch files under test/scratch were left in place, since they are discarded before submission.","treeHash":"0062451a4b8bc89cfb01683f8f5d842132b0a6eb","usage":{"cachedInputTokens":1124407,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":15854,"runtime":"claude","turns":23,"wallClockMs":183708}},{"artifacts":[],"attempt":1,"bundleHash":"3616de9109700df1f2b4892c6a448149144d55fd7803bfc148851e198495c844","device":"98b4506bef931d13","findings":[],"hash":"dd1446ca34b27e1a651bfa57b895fd0bd88bf76ca0b8a223f763290d7785def2","nodeId":"e7a6d595-0f8f-43ef-81b4-36e5dfc3d95f","outcome":"completed","summary":"Committed as `74a0b6e` on `main`, working tree clean. The deliverable is complete.\n\n**What was built**\n\n- `src/TollToken.sol`: self-contained ERC-20, zero-argument constructor, mints exactly 1e27 to `msg.sender`, 18 decimals, `burn`/`burnFrom`, no owner, mint, pause or proxy, no imports.\n- `src/TollgateHook.sol`: flags `0x00CC` only, PoolManager address as the sole constructor argument, constants exactly as specified. Fee is always ETH: exact-in buy and exact-out sell take it in `beforeSwap` as a positive specified delta, the other two directions in `afterSwap` as a positive unspecified delta. Collection is `poolManager.mint(hook, 0, fee)` inside the swap, so the first buy into an ETH-less pool works. `PartialFill` guards the raw delta. Non-ETH pools trade fee-free. Lazy ledger, `CapReached` once, permissionless `payCreator()` and `burnEth()` each in their own unlock, reentrancy lock on transient slot 1.\n- `src/HookFlags.sol` and `test/mocks/MockERC20.sol` at the paths the protected suite imports.\n- `lib/`: v4-core 1.0.2 (from the npm tarball, `src/test` excluded), forge-std v1.9.7, solmate `Owned`, all plain files, no submodules.\n- Docs: `README.md`, `docs/DISCLOSURE.md`, `docs/deployment.md`, `docs/dependencies.md`, and `launch.json` whose notes disclose CREATOR, the 1 ETH cap, the 2%/2% fee and the burn sink in 3,981 characters.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| `forge build` (clean, offline) | success |\n| `forge test` | 55 passed, 0 failed (11 token, 38 hook unit/fuzz, 5 launch rehearsal, 7 invariants) |\n| `forge fmt --check` | clean |\n| Opcode walk of every compiled artifact | 106 artifacts, zero `F2`/`F4`/`FF` |\n| Protected suite from `.imd/reads` (run from `test/scratch`) | 9 of 9 pass with `IMD_POOL_MANAGER` set, 8 pass and 1 skip without it |\n| Invariant coverage (last run) | cap crossed, 3 burns, 1 payout, claims donated |\n\n**Two judgment calls to be aware of**\n\n- The constructor rejects only the zero address, not a code-less manager. The protected suite may deploy the hook before any code exists at the literal, and a code check there would have failed the entire floor in `setUp`. The fork rehearsal is where a wrong literal gets caught, and `docs/deployment.md` says so.\n- `launch.json` names the Ethereum mainnet PoolManager since no chain was specified. The notes and deployment doc explain that retargeting only requires substituting the canonical PoolManager and re-mining the salt.\n\nFees under 50 wei of ETH round to zero and trade fee-free. This is documented in the disclosure rather than reverted, since it charges nothing extra and keeps dust swaps working.","treeHash":"438bb16011ec9b541b8a8653efd23dfd41a131fb","usage":{"cachedInputTokens":4276811,"inputTokens":930,"model":"claude-fable-5-1","outputTokens":106876,"runtime":"claude","turns":65,"wallClockMs":1221155}}],"verification":[{"checks":[{"durationMs":2552,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.47s\nCompiler run successful!\nwarning: unknown id: 'unused-return'\n    ╭▸ src/TollgateHook.sol:289:9\n    │\n289 │         // forge-lint: disable-next-item(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning: unknown id: 'unused-return'\n    ╭▸ src/TollgateHook.sol:304:9\n    │\n304 │         // forge-lint: disable-next-item(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/TestRouter.sol:81:43\n   │\n81 │             manager.take(currency, payer, 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/helpers/TestRouter.sol:83:30\n   │\n83 │             uint256 amount = uint256(-int256(delta));\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n    ╭▸ test/LaunchRehearsal.t.sol:115:21\n    │\n115 │         seedUpper = (tick / TICK_SPACING) * TICK_SPACING; // <= tick, aligned\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/LaunchRehearsal.t.sol:122:89\n    │\n122 │         BalanceDelta d = router.modify(key, ModifyLiquidityParams(seedLower, seedUpper, int256(liquidity), 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/LaunchRehearsal.t.sol:201:65\n    │\n201 │         BalanceDelta sell = router.swap(key, swapParams(false, -int256(bought / 2)));\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/TollToken.t.sol:47:9\n   │\n47 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/LaunchRehearsal.t.sol:204:35\n    │\n204 │         assertEq(sell.amount1(), -int256(bought / 2));\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/TollgateHook.t.sol:218:49\n    │\n218 │         (int128 a0, int128 a1) = ethSwap(true, -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/TollgateHook.t.sol:219:70\n    │\n219 │         BalanceDelta raw = router.swap(foreignKey, swapParams(true, -int256(amount - 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/TollToken.t.sol:49:9\n   │\n49 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TollToken.t.sol:61:9\n   │\n61 │         token.transferFrom(address(this), bob, 2 ether);\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/TollToken.t.sol:67:9\n   │\n67 │         token.transferFrom(address(this), bob, 1 ether);\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/TollToken.t.sol:123:9\n    │\n123 │         token.transfer(to, 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/TollgateInvariant.t.sol:57:24\n   │\n57 │             exactIn ? -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/TollgateHook.t.sol:221:23\n    │\n221 │         assertEq(a0, -int256(amount), \"user pays exactly the amount specified\");\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/TollgateHook.t.sol:224:65\n    │\n224 │         assertEq(token.balanceOf(address(this)) - tokensBefore, uint256(int256(a1)));\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/TollgateInvariant.t.sol:57:41\n   │\n57 │             exactIn ? -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/TollgateHook.t.sol:236:48\n    │\n236 │         (int128 a0, int128 a1) = ethSwap(true, 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/TollgateHook.t.sol:237:69\n    │\n237 │         BalanceDelta raw = router.swap(foreignKey, swapParams(true, 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/TollgateHook.t.sol:241:22\n    │\n241 │         assertEq(a1, int256(amount), \"user receives exactly the tokens specified\");\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/TollgateHook.t.sol:242:18\n    │\n242 │         assertEq(uint256(-int256(a0)), rawEth + fee, \"user pays raw ETH input plus 2%\");\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/TollgateHook.t.sol:252:50\n    │\n252 │         (int128 a0, int128 a1) = ethSwap(false, -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/TollgateHook.t.sol:253:71\n    │\n253 │         BalanceDelta raw = router.swap(foreignKey, swapParams(false, -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/TollgateHook.t.sol:257:23\n    │\n257 │         assertEq(a1, -int256(amount), \"user pays exactly the tokens specified\");\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/TollgateHook.t.sol:258:18\n    │\n258 │         assertEq(uint256(int256(a0)), rawEth - fee, \"user receives raw ETH output minus 2%\");\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/TollgateHook.t.sol:269:49\n    │\n269 │         (int128 a0, int128 a1) = ethSwap(false, 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/TollgateHook.t.sol:270:70\n    │\n270 │         BalanceDelta raw = router.swap(foreignKey, swapParams(false, int256(amount + 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/TollgateInvariant.t.sol:122:9\n    │\n122 │         token.transfer(address(handler), 1_000_000 ether);\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/TollgateHook.t.sol:272:22\n    │\n272 │         assertEq(a0, int256(amount), \"user receives exactly the ETH specified\");\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/TollgateHook.t.sol:283:39\n    │\n283 │         int256 specified = exactIn ? -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/TollgateHook.t.sol:283:56\n    │\n283 │         int256 specified = exactIn ? -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/TollgateHook.t.sol:294:46\n    │\n294 │             int256 rawSpecified = exactIn ? -int256(amount - fee) : int256(amount + 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/TollgateHook.t.sol:294:69\n    │\n294 │             int256 rawSpecified = exactIn ? -int256(amount - fee) : int256(amount + 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/TollgateHook.t.sol:304:56\n    │\n304 │             assertEq(int256(a0), rawEth < 0 ? rawEth - int256(fee) : rawEth - 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/TollgateHook.t.sol:304:79\n    │\n304 │             assertEq(int256(a0), rawEth < 0 ? rawEth - int256(fee) : rawEth - 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/TollgateHook.t.sol:371:24\n    │\n371 │         ethSwap(true, -int256(fees * 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/TollgateHook.t.sol:457:28\n    │\n457 │             ethSwap(true, -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\n","passed":true},{"durationMs":514,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/TollToken.t.sol:TollTokenTest\n[PASS] testFuzz_transfersConserveSupply(address,uint256) (runs: 256, μ: 46852, ~: 47373)\nLogs:\n  Bound result 713735546882039288284683828\n\n[PASS] test_approveAndTransferFrom() (gas: 76588)\n[PASS] test_burnFromUsesAllowance() (gas: 39040)\n[PASS] test_burnLowersSupply() (gas: 28758)\n[PASS] test_infiniteAllowanceIsNotDecreased() (gas: 69598)\n[PASS] test_metadata() (gas: 12769)\n[PASS] test_noAdminOrMintSelectorExists() (gas: 79287)\n[PASS] test_runtimeHasNoEscapeHatch() (gas: 372037)\n[PASS] test_transferMovesExactlyWhatItWasAsked() (gas: 46490)\n[PASS] test_transferRejectsInsufficientBalanceAndZeroRecipient() (gas: 18091)\n[PASS] test_zeroArgumentConstructorMintsExactlyOneE27ToDeployer() (gas: 386089)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 369.95ms (9.17ms CPU time)\n\nRan 5 tests for test/LaunchRehearsal.t.sol:LaunchRehearsalTest\n[PASS] test_firstExactInBuyIntoEthlessPoolPaysTwoPercent() (gas: 2061455)\n[PASS] test_firstExactOutBuyIntoEthlessPoolPaysTwoPercent() (gas: 2055725)\n[PASS] test_fullRehearsalThroughCapPayoutAndBurn() (gas: 2639668)\n[PASS] test_seedRangeSitsBelowTheOpeningTick() (gas: 1871545)\n[PASS] test_sellAfterABuyPaysTwoPercentOfTheEthOut() (gas: 2226881)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 389.34ms (5.78ms CPU time)\n\nRan 38 tests for test/TollgateHook.t.sol:TollgateHookTest\n[PASS] testFuzz_creatorPaidNeverExceedsCap(uint96[6]) (runs: 256, μ: 752750, ~: 743429)\nLogs:\n  Bound result 39990005239572541994\n  Bound result 43474589582625435\n  Bound result 39990000000000030809\n  Bound result 27884337591562750971\n  Bound result 2948586681080980513\n  Bound result 11640197887512134367\n\n[PASS] testFuzz_feeIsTwoPercentOfTheEthLegInEveryDirection(uint96,bool,bool) (runs: 256, μ: 326743, ~: 323294)\nLogs:\n  Bound result 999999000000000000026\n\n[PASS] test_afterSwapRejectsPartialFillBeforeTouchingTheLedger() (gas: 31959)\n[PASS] test_anyRouterAndAnyCallerPaysTheSameFee() (gas: 1073095)\n[PASS] test_beforeSwapReturnsTheFeeOnlyWhenEthIsSpecified() (gas: 52077)\n[PASS] test_burnEthCannotRunInsideAnotherUnlock() (gas: 436923)\n[PASS] test_burnEthCooldownStartsAtDeployment() (gas: 21955)\n[PASS] test_burnEthRevertsNothingToBurnBeforeTheCap() (gas: 195998)\n[PASS] test_burnEthRevertsNothingToBurnBelowMinBurn() (gas: 370940)\n[PASS] test_burnEthSendsExactlyTheBurnableAmountToTheSink() (gas: 461965)\n[PASS] test_callbacksRefuseCallersOtherThanThePoolManager() (gas: 27918)\n[PASS] test_capReachedCarriesTheOvershootingTotal() (gas: 293211)\n[PASS] test_capReachedEmittedExactlyOnceInTheCrossingSwap() (gas: 471803)\n[PASS] test_constantsAreTheSpecifiedOnes() (gas: 20248)\n[PASS] test_constructorAcceptsAManagerAddressWithoutCodeYet() (gas: 1171644)\n[PASS] test_constructorRejectsAddressWithoutTheFlags() (gas: 68332)\n[PASS] test_constructorRejectsTheZeroManager() (gas: 37173)\n[PASS] test_creatorContractThatDoesNotReenterIsPaid() (gas: 309215)\n[PASS] test_directReentrancyProbeOnCallbacksIsRefused() (gas: 451950)\n[PASS] test_donatedClaimsDoNotChangeTheLedgerAndStayStuck() (gas: 420776)\n[PASS] test_dustBelowFiftyWeiPaysNoFeeButStillTrades() (gas: 254924)\n[PASS] test_exactInBuyTakesTwoPercentOfEthInBeforeSwap() (gas: 326019)\n[PASS] test_exactInSellTakesTwoPercentOfEthInAfterSwap() (gas: 290758)\n[PASS] test_exactOutBuyTakesTwoPercentOfEthInAfterSwap() (gas: 314015)\n[PASS] test_exactOutSellTakesTwoPercentOfEthInBeforeSwap() (gas: 293393)\n[PASS] test_foreignPoolTradesFeeFreeInAllFourModes() (gas: 334772)\n[PASS] test_ledgerStartsEmptyAndCoolingDown() (gas: 37660)\n[PASS] test_liquidityCanAlwaysBeRemoved() (gas: 376076)\n[PASS] test_partialFillsRevertInAllFourModes() (gas: 312590)\n[PASS] test_payCreatorNeverPaysMoreThanOneEtherInTotal() (gas: 466154)\n[PASS] test_payCreatorPaysExactlyWhatIsDueToTheCreatorOnly() (gas: 354158)\n[PASS] test_payCreatorRevertsNothingDueWhenNothingAccrued() (gas: 13117)\n[PASS] test_permissionsAreExactlyTheFourSwapFlags() (gas: 17797)\n[PASS] test_reenteringBurnEthFromTheCreatorReverts() (gas: 362341)\n[PASS] test_reenteringPayCreatorFromTheCreatorReverts() (gas: 335684)\n[PASS] test_runtimeCodeHasNoEscapeHatch() (gas: 1529320)\n[PASS] test_swapAgainstAnEmptyPoolRevertsPartialFill() (gas: 488974)\n[PASS] test_unlockCallbackRefusesWhenNoPayoutIsInFlight() (gas: 15827)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 389.71ms (182.35ms CPU time)\n\nRan 7 tests for test/TollgateInvariant.t.sol:TollgateInvariantTest\n[PASS] invariant_burnableIsZeroUntilTheCapAndExactAfterIt() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 920156914473922152\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 958999603826347142\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 5\n  Bound result 6\n  Bound result 18597\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 3145607596465856242\n\n[PASS] invariant_capReachedEmittedExactlyOnce() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 920156914473922153\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 958999603826347142\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 5\n  Bound result 6\n  Bound result 18597\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 3145607596465856243\n\n[PASS] invariant_claimsBackTheLedger() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 79843085526072414\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 12907\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000002040\n  Bound result 6\n  Bound result 2\n  Bound result 18646\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584569\n  burned 826911308694584569\n  donated 1346294163691672318\n\n[PASS] invariant_creatorPaidNeverExceedsOneEther() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 156855043822844340\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 766720712722889385\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 4\n  Bound result 5\n  Bound result 17038\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 2190026834711319114\n\n[PASS] invariant_feesOnlyGrowThroughSwaps() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 79843085526072414\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 958999603826347142\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 5\n  Bound result 6\n  Bound result 18597\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 2305293767518006504\n\n[PASS] invariant_managerIsLockedBetweenCalls() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 492491861008315872\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 766720712722889385\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 4\n  Bound result 5\n  Bound result 17038\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 2525663651896790646\n\n[PASS] invariant_sinkHoldsExactlyWhatWasBurned() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 485   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 453   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 471   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 451   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 444   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 19999000060304234061\n  Bound result 5\n  Bound result 7\n  Bound result 19999000000001965050\n  Bound result 8109582\n  Bound result 955786268554714534\n  Bound result 5\n  Bound result 19999000001943787937\n  Bound result 920156914473922153\n  Bound result 159511066904620497\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 3105031650675144555\n  Bound result 2\n  Bound result 8064178263651952141\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 151153742698123738\n  Bound result 4\n  Bound result 958999603826347142\n  Bound result 3\n  Bound result 1\n  Bound result 19999000000000005639\n  Bound result 5\n  Bound result 6\n  Bound result 18597\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  swaps 7\n  payouts 3\n  burns 3\n  totalFees 1826911308694584642\n  burned 826911308694584642\n  donated 3145607596465856243\n\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 430.84ms (2.50s CPU time)\n\nRan 4 test suites in 432.36ms (1.58s CPU time): 61 tests passed, 0 failed, 0 skipped (61 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7bc0278384481d72612a45511628b618dbc54d6cac25684c7f754de6aa715686","verifiedTreeHash":"0062451a4b8bc89cfb01683f8f5d842132b0a6eb","verifierVersion":"0.1.0+1b3bcb5e"},{"checks":[{"durationMs":2348,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.26s\nCompiler run successful!\nwarning: unknown id: 'unused-return'\n    ╭▸ src/TollgateHook.sol:289:9\n    │\n289 │         // forge-lint: disable-next-item(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TollToken.t.sol:47:9\n   │\n47 │         token.transfer(bob, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TollToken.t.sol:49:9\n   │\n49 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TollToken.t.sol:61:9\n   │\n61 │         token.transferFrom(address(this), bob, 2 ether);\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/TollToken.t.sol:67:9\n   │\n67 │         token.transferFrom(address(this), bob, 1 ether);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/TestRouter.sol:81:43\n   │\n81 │             manager.take(currency, payer, 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/helpers/TestRouter.sol:83:30\n   │\n83 │             uint256 amount = uint256(-int256(delta));\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning: unknown id: 'unused-return'\n    ╭▸ src/TollgateHook.sol:304:9\n    │\n304 │         // forge-lint: disable-next-item(unused-return)\n    ╰╴        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TollToken.t.sol:123:9\n    │\n123 │         token.transfer(to, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n    ╭▸ test/LaunchRehearsal.t.sol:115:21\n    │\n115 │         seedUpper = (tick / TICK_SPACING) * TICK_SPACING; // <= tick, aligned\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/TollgateHook.t.sol:218:49\n    │\n218 │         (int128 a0, int128 a1) = ethSwap(true, -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/TollgateInvariant.t.sol:57:24\n   │\n57 │             exactIn ? -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/TollgateInvariant.t.sol:57:41\n   │\n57 │             exactIn ? -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/TollgateHook.t.sol:219:70\n    │\n219 │         BalanceDelta raw = router.swap(foreignKey, swapParams(true, -int256(amount - 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/LaunchRehearsal.t.sol:122:89\n    │\n122 │         BalanceDelta d = router.modify(key, ModifyLiquidityParams(seedLower, seedUpper, int256(liquidity), 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/TollgateHook.t.sol:221:23\n    │\n221 │         assertEq(a0, -int256(amount), \"user pays exactly the amount specified\");\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/TollgateHook.t.sol:224:65\n    │\n224 │         assertEq(token.balanceOf(address(this)) - tokensBefore, uint256(int256(a1)));\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/TollgateInvariant.t.sol:122:9\n    │\n122 │         token.transfer(address(handler), 1_000_000 ether);\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/LaunchRehearsal.t.sol:201:65\n    │\n201 │         BalanceDelta sell = router.swap(key, swapParams(false, -int256(bought / 2)));\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/LaunchRehearsal.t.sol:204:35\n    │\n204 │         assertEq(sell.amount1(), -int256(bought / 2));\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/TollgateHook.t.sol:236:48\n    │\n236 │         (int128 a0, int128 a1) = ethSwap(true, 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/TollgateHook.t.sol:237:69\n    │\n237 │         BalanceDelta raw = router.swap(foreignKey, swapParams(true, 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/TollgateHook.t.sol:241:22\n    │\n241 │         assertEq(a1, int256(amount), \"user receives exactly the tokens specified\");\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/TollgateHook.t.sol:242:18\n    │\n242 │         assertEq(uint256(-int256(a0)), rawEth + fee, \"user pays raw ETH input plus 2%\");\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/TollgateHook.t.sol:252:50\n    │\n252 │         (int128 a0, int128 a1) = ethSwap(false, -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/TollgateHook.t.sol:253:71\n    │\n253 │         BalanceDelta raw = router.swap(foreignKey, swapParams(false, -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/TollgateHook.t.sol:257:23\n    │\n257 │         assertEq(a1, -int256(amount), \"user pays exactly the tokens specified\");\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/TollgateHook.t.sol:258:18\n    │\n258 │         assertEq(uint256(int256(a0)), rawEth - fee, \"user receives raw ETH output minus 2%\");\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/TollgateHook.t.sol:269:49\n    │\n269 │         (int128 a0, int128 a1) = ethSwap(false, 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/TollgateHook.t.sol:270:70\n    │\n270 │         BalanceDelta raw = router.swap(foreignKey, swapParams(false, int256(amount + 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/TollgateHook.t.sol:272:22\n    │\n272 │         assertEq(a0, int256(amount), \"user receives exactly the ETH specified\");\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/TollgateHook.t.sol:283:39\n    │\n283 │         int256 specified = exactIn ? -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/TollgateHook.t.sol:283:56\n    │\n283 │         int256 specified = exactIn ? -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/TollgateHook.t.sol:294:46\n    │\n294 │             int256 rawSpecified = exactIn ? -int256(amount - fee) : int256(amount + 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/TollgateHook.t.sol:294:69\n    │\n294 │             int256 rawSpecified = exactIn ? -int256(amount - fee) : int256(amount + 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/TollgateHook.t.sol:304:56\n    │\n304 │             assertEq(int256(a0), rawEth < 0 ? rawEth - int256(fee) : rawEth - 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/TollgateHook.t.sol:304:79\n    │\n304 │             assertEq(int256(a0), rawEth < 0 ? rawEth - int256(fee) : rawEth - 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/TollgateHook.t.sol:371:24\n    │\n371 │         ethSwap(true, -int256(fees * 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/TollgateHook.t.sol:457:28\n    │\n457 │             ethSwap(true, -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\n","passed":true},{"durationMs":505,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/TollToken.t.sol:TollTokenTest\n[PASS] testFuzz_transfersConserveSupply(address,uint256) (runs: 256, μ: 46894, ~: 47373)\nLogs:\n  Bound result 5000000000000000\n\n[PASS] test_approveAndTransferFrom() (gas: 76588)\n[PASS] test_burnFromUsesAllowance() (gas: 39040)\n[PASS] test_burnLowersSupply() (gas: 28758)\n[PASS] test_infiniteAllowanceIsNotDecreased() (gas: 69598)\n[PASS] test_metadata() (gas: 12769)\n[PASS] test_noAdminOrMintSelectorExists() (gas: 79287)\n[PASS] test_runtimeHasNoEscapeHatch() (gas: 372037)\n[PASS] test_transferMovesExactlyWhatItWasAsked() (gas: 46490)\n[PASS] test_transferRejectsInsufficientBalanceAndZeroRecipient() (gas: 18091)\n[PASS] test_zeroArgumentConstructorMintsExactlyOneE27ToDeployer() (gas: 386089)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 7.49ms (11.20ms CPU time)\n\nRan 38 tests for test/TollgateHook.t.sol:TollgateHookTest\n[PASS] testFuzz_creatorPaidNeverExceedsCap(uint96[6]) (runs: 256, μ: 753774, ~: 743429)\nLogs:\n  Bound result 27266609710374703663\n  Bound result 10000000000000000\n  Bound result 39990000000000473089\n  Bound result 14199890663642745895\n  Bound result 10000000000000001\n  Bound result 39990000000000008793\n\n[PASS] testFuzz_feeIsTwoPercentOfTheEthLegInEveryDirection(uint96,bool,bool) (runs: 256, μ: 327843, ~: 323294)\nLogs:\n  Bound result 742505337593464722093\n\n[PASS] test_afterSwapRejectsPartialFillBeforeTouchingTheLedger() (gas: 31959)\n[PASS] test_anyRouterAndAnyCallerPaysTheSameFee() (gas: 1073095)\n[PASS] test_beforeSwapReturnsTheFeeOnlyWhenEthIsSpecified() (gas: 52077)\n[PASS] test_burnEthCannotRunInsideAnotherUnlock() (gas: 436923)\n[PASS] test_burnEthCooldownStartsAtDeployment() (gas: 21955)\n[PASS] test_burnEthRevertsNothingToBurnBeforeTheCap() (gas: 195998)\n[PASS] test_burnEthRevertsNothingToBurnBelowMinBurn() (gas: 370940)\n[PASS] test_burnEthSendsExactlyTheBurnableAmountToTheSink() (gas: 461965)\n[PASS] test_callbacksRefuseCallersOtherThanThePoolManager() (gas: 27918)\n[PASS] test_capReachedCarriesTheOvershootingTotal() (gas: 293211)\n[PASS] test_capReachedEmittedExactlyOnceInTheCrossingSwap() (gas: 471803)\n[PASS] test_constantsAreTheSpecifiedOnes() (gas: 20248)\n[PASS] test_constructorAcceptsAManagerAddressWithoutCodeYet() (gas: 1171644)\n[PASS] test_constructorRejectsAddressWithoutTheFlags() (gas: 68332)\n[PASS] test_constructorRejectsTheZeroManager() (gas: 37173)\n[PASS] test_creatorContractThatDoesNotReenterIsPaid() (gas: 309215)\n[PASS] test_directReentrancyProbeOnCallbacksIsRefused() (gas: 451950)\n[PASS] test_donatedClaimsDoNotChangeTheLedgerAndStayStuck() (gas: 420776)\n[PASS] test_dustBelowFiftyWeiPaysNoFeeButStillTrades() (gas: 254924)\n[PASS] test_exactInBuyTakesTwoPercentOfEthInBeforeSwap() (gas: 326019)\n[PASS] test_exactInSellTakesTwoPercentOfEthInAfterSwap() (gas: 290758)\n[PASS] test_exactOutBuyTakesTwoPercentOfEthInAfterSwap() (gas: 314015)\n[PASS] test_exactOutSellTakesTwoPercentOfEthInBeforeSwap() (gas: 293393)\n[PASS] test_foreignPoolTradesFeeFreeInAllFourModes() (gas: 334772)\n[PASS] test_ledgerStartsEmptyAndCoolingDown() (gas: 37660)\n[PASS] test_liquidityCanAlwaysBeRemoved() (gas: 376076)\n[PASS] test_partialFillsRevertInAllFourModes() (gas: 312590)\n[PASS] test_payCreatorNeverPaysMoreThanOneEtherInTotal() (gas: 466154)\n[PASS] test_payCreatorPaysExactlyWhatIsDueToTheCreatorOnly() (gas: 354158)\n[PASS] test_payCreatorRevertsNothingDueWhenNothingAccrued() (gas: 13117)\n[PASS] test_permissionsAreExactlyTheFourSwapFlags() (gas: 17797)\n[PASS] test_reenteringBurnEthFromTheCreatorReverts() (gas: 362341)\n[PASS] test_reenteringPayCreatorFromTheCreatorReverts() (gas: 335684)\n[PASS] test_runtimeCodeHasNoEscapeHatch() (gas: 1529320)\n[PASS] test_swapAgainstAnEmptyPoolRevertsPartialFill() (gas: 488974)\n[PASS] test_unlockCallbackRefusesWhenNoPayoutIsInFlight() (gas: 15827)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 107.76ms (174.73ms CPU time)\n\nRan 7 tests for test/TollgateInvariant.t.sol:TollgateInvariantTest\n[PASS] invariant_burnableIsZeroUntilTheCapAndExactAfterIt() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2246260767011953179\n  burned 846260648451292184\n  donated 538325019905688844\n\n[PASS] invariant_capReachedEmittedExactlyOnce() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2247638496569439343\n  burned 847638361798921438\n  donated 538325019905688844\n\n[PASS] invariant_claimsBackTheLedger() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18645\n  Bound result 19999000000000004089\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 1383437906\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 4\n  Bound result 12719\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3062\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002558\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004026\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2251418927676065294\n  burned 851418760445663904\n  donated 538325021289129596\n\n[PASS] invariant_creatorPaidNeverExceedsOneEther() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2247638496569439343\n  burned 847638361798921438\n  donated 538325019905688844\n\n[PASS] invariant_feesOnlyGrowThroughSwaps() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2247638496569439343\n  burned 847638361798921438\n  donated 538325019905688844\n\n[PASS] invariant_managerIsLockedBetweenCalls() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2247638496569439343\n  burned 847638361798921438\n  donated 538325019905688844\n\n[PASS] invariant_sinkHoldsExactlyWhatWasBurned() (runs: 48, calls: 2304, reverts: 0)\n\n╭----------+----------+-------+---------+----------╮\n| Contract | Selector | Calls | Reverts | Discards |\n+==================================================+\n| Handler  | burn     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | donate   | 460   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | pay      | 443   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | roll     | 467   | 0       | 0        |\n|----------+----------+-------+---------+----------|\n| Handler  | swap     | 467   | 0       | 0        |\n╰----------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 5952460689759176468\n  Bound result 19999000000000000291\n  Bound result 3\n  Bound result 264337593543950333\n  Bound result 18736\n  Bound result 19999000000000000526\n  Bound result 0\n  Bound result 6\n  Bound result 116010\n  Bound result 0\n  Bound result 91054286712361\n  Bound result 898\n  Bound result 192668555382231247\n  Bound result 6\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 8895\n  Bound result 2\n  Bound result 4415893385769951\n  Bound result 3051\n  Bound result 6\n  Bound result 0\n  Bound result 3\n  Bound result 6277081759601520210\n  Bound result 5\n  Bound result 6\n  Bound result 19999000000000002664\n  Bound result 1\n  Bound result 7\n  Bound result 19999000000000004027\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 1000000000000003\n  Bound result 76811923306877358\n  Bound result 2\n  Bound result 1000000000000000\n  Bound result 3\n  Bound result 6\n  Bound result 1\n  Bound result 19999003502633481986\n  swaps 9\n  payouts 2\n  burns 2\n  totalFees 2247638496569439343\n  burned 847638361798921438\n  donated 538325019905688844\n\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 406.27ms (2.46s CPU time)\n\nRan 5 tests for test/LaunchRehearsal.t.sol:LaunchRehearsalTest\n[PASS] test_firstExactInBuyIntoEthlessPoolPaysTwoPercent() (gas: 2061455)\n[PASS] test_firstExactOutBuyIntoEthlessPoolPaysTwoPercent() (gas: 2055725)\n[PASS] test_fullRehearsalThroughCapPayoutAndBurn() (gas: 2639668)\n[PASS] test_seedRangeSitsBelowTheOpeningTick() (gas: 1871545)\n[PASS] test_sellAfterABuyPaysTwoPercentOfTheEthOut() (gas: 2226881)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 406.30ms (5.64ms CPU time)\n\nRan 4 test suites in 407.55ms (927.82ms CPU time): 61 tests passed, 0 failed, 0 skipped (61 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"dd1446ca34b27e1a651bfa57b895fd0bd88bf76ca0b8a223f763290d7785def2","verifiedTreeHash":"438bb16011ec9b541b8a8653efd23dfd41a131fb","verifierVersion":"0.1.0+1b3bcb5e"}]}