{"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":"2a1dcd8a-6ed3-4bb0-b285-161785217a8d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"8e72961395806224057e300e243067f046b92db1bfeb14d1f07a25027e060417","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"416905f8032629546e001759772bbd6626d875c1c6bf59c5a8b3a5a3aba7ba21","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"be925eb4499d1a2392de63a57b927e8f582c96cbd2dcab0ac2da474c8df93e91","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Token name: Work\nToken symbol: WORK\nWrite these 4 files EXACTLY as given (already tested; formatting only, never change logic). foundry.toml: solc 0.8.26, evm_version cancun, optimizer true, optimizer_runs 200, via_ir true, bytecode_hash \"none\"; vendor Uniswap v4-core v4.0.0 at lib/v4-core and OpenZeppelin v5 at lib/openzeppelin-contracts, remappings v4-core/=lib/v4-core/ and @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/. Hook is deployed at a CREATE2 address with flags 0x20C4; the third constructor arg is the already-deployed WORKERS NFT (exposes tradingOpenAt()). Fees: every hook fee (snipe 50% sliding to 2% over 15 min after the WORKERS NFT's tradingOpenAt, then 2%) goes to the treasury 0xc9eafe33a510a3a3d95a94c4f85adaf6a3ea12a0 via a permissionless sweep. Admin: that same address may only set the standing fee within 0-10%; no other admin, no upgrades. Tests against the real PoolManager.\nlaunch.json:\n{\"kind\":\"univ4_hook\",\"hook\":{\"contract\":\"WorkGateHook\",\"constructorArgs\":[\"$poolManager\",\"$token\",\"0x363860179149628b6fd73b7e05a6cd102de3a72a\"],\"permissions\":[\"beforeInitialize\",\"beforeSwap\",\"afterSwap\",\"afterSwapReturnDelta\"]},\"token\":{\"contract\":\"Work\",\"name\":\"Work\",\"symbol\":\"WORK\",\"decimals\":18},\"pool\":{\"pairedCurrency\":\"0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127\",\"fee\":12500,\"tickSpacing\":60,\"initialPrice\":\"79228162514264337593543950336\"}}\nsrc/Work.sol:\npragma solidity 0.8.26;import{ERC20}from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";contract Work is ERC20{constructor()ERC20(\"Work\",\"WORK\"){_mint(msg.sender,1_000_000_000 ether);}}\nsrc/WorkGateHook.sol:\n// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;import{IPoolManager}from \"v4-core/src/interfaces/IPoolManager.sol\";import{IHooks}from \"v4-core/src/interfaces/IHooks.sol\";import{Hooks}from \"v4-core/src/libraries/Hooks.sol\";import{PoolKey}from \"v4-core/src/types/PoolKey.sol\";import{Currency}from \"v4-core/src/types/Currency.sol\";import{BalanceDelta}from \"v4-core/src/types/BalanceDelta.sol\";import{BeforeSwapDelta}from \"v4-core/src/types/BeforeSwapDelta.sol\";contract WorkGateHook{address public constant IMD=0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;address public constant B=0xc9EAFE33A510a3a3d95A94c4f85AdaF6a3EA12a0;IPoolManager public immutable poolManager;address public immutable token;address public immutable workers;uint256 public openedAt;uint256 public standingFee=200;bool public initialized;error TradingClosed();event StandingFee(uint256 fee);constructor(IPoolManager m,address t,address w){require(t!=IMD&&w.code.length>0);poolManager=m;token=t;workers=w;Hooks.validateHookPermissions(IHooks(address(this)),Hooks.Permissions(true,false,false,false,false,false,true,true,false,false,false,true,false,false));}modifier onlyPM(){require(msg.sender==address(poolManager));_;}function beforeInitialize(address,PoolKey calldata k,uint160)external onlyPM returns(bytes4){address a=Currency.unwrap(k.currency0);address b=Currency.unwrap(k.currency1);require(!initialized&&((a==IMD&&b==token)||(a==token&&b==IMD))&&k.fee==12500&&k.tickSpacing==60&&address(k.hooks)==address(this));initialized=true;return IHooks.beforeInitialize.selector;}function tradingOpenAt()public view returns(uint256 t){t=openedAt;if(t==0){(bool ok,bytes memory r)=workers.staticcall{gas:50000}(abi.encodeWithSignature(\"tradingOpenAt()\"));if(ok&&r.length>31)t=abi.decode(r,(uint256));if(t>block.timestamp)t=0;}}function tradingOpen()external view returns(bool){return tradingOpenAt()!=0;}function feeNow()public view returns(uint256){uint256 t=tradingOpenAt();uint256 s=standingFee;if(t==0||block.timestamp<=t)return 5000;t=block.timestamp-t;return t<900?s+(5000-s)*(900-t)/900:s;}function setStandingFee(uint256 f)external{require(msg.sender==B&&f<=1000);standingFee=f;emit StandingFee(f);}function beforeSwap(address,PoolKey calldata,IPoolManager.SwapParams calldata,bytes calldata)external onlyPM returns(bytes4,BeforeSwapDelta,uint24){if(openedAt==0){uint256 t=tradingOpenAt();if(t==0)revert TradingClosed();openedAt=t;}return(IHooks.beforeSwap.selector,BeforeSwapDelta.wrap(0),0);}function afterSwap(address,PoolKey calldata k,IPoolManager.SwapParams calldata p,BalanceDelta d,bytes calldata)external onlyPM returns(bytes4,int128){bool u1=(p.amountSpecified<0)==p.zeroForOne;int128 a=u1?d.amount1():d.amount0();uint256 f=uint256(int256(a<0?-a:a))*feeNow()/10000;if(f>0)poolManager.mint(address(this),(u1?k.currency1:k.currency0).toId(),f);return(IHooks.afterSwap.selector,int128(int256(f)));}function sweep()external{poolManager.unlock(\"\");address[3]memory c=[IMD,token,address(0)];for(uint256 i;i<3;++i){Currency x=Currency.wrap(c[i]);uint256 v=x.balanceOfSelf();if(v>0)x.transfer(B,v);}}function unlockCallback(bytes calldata)external onlyPM returns(bytes memory){for(uint256 i;i<2;++i){Currency x=Currency.wrap(i==0?IMD:token);uint256 v=poolManager.balanceOf(address(this),x.toId());if(v>0){poolManager.burn(address(this),x.toId(),v);poolManager.take(x,B,v);}}return \"\";}}\n","parentJobId":null,"planHash":"786dc855a8bd91e5dad5374caeec43bb01c29735851131ba6efddc252935d4c3","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2a1dcd8a-6ed3-4bb0-b285-161785217a8d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-956-src-work-sol-src-workgatehook-sol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51095","feedbackHash":"58b04c194aa8e5e01ec57778200daec9b36267031138dccb740ee3fa515f30ac","nodeKey":"build_contract_project","submissionHash":"8d85b6b93600cddbd83d0bcccba45fd7c290177364d0184c86414fca19faee3e","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51007","feedbackHash":"468e0c053459d5eae4ba606e9e9f1fcfb777b52ec989977850de1b0514e35e1d","nodeKey":"build_contract_project","submissionHash":"8e72961395806224057e300e243067f046b92db1bfeb14d1f07a25027e060417","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52391","feedbackHash":"425d22b0b46a69ce2bd492e22ff825880e0c7f3c746e2a2931da887947cb8149","nodeKey":"manifest","submissionHash":"416905f8032629546e001759772bbd6626d875c1c6bf59c5a8b3a5a3aba7ba21","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51523","feedbackHash":"d4f02f96242511628e4211f0a4b266d92d97ac2a1ea29e037833679f579163d9","nodeKey":"write_foundry_tests","submissionHash":"be925eb4499d1a2392de63a57b927e8f582c96cbd2dcab0ac2da474c8df93e91","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"dbd3bdb31fea926be1f7fc30ab872bed274a111fb4fde7cde759e8963d91fc96","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fe05a5e99a6529b012f9599af4b2668f5d4145df5b2d635c6493a691d22ed29b","device":"743b05d8a235188d","findings":[],"hash":"416905f8032629546e001759772bbd6626d875c1c6bf59c5a8b3a5a3aba7ba21","nodeId":"73aaad8d-ee9a-4ad9-a65c-6361446b89e9","outcome":"completed","summary":"The manifest is written and verified. Only launch.json changed.\n\n**What I did**\n\n- Rewrote launch.json with the required content: first field `\"kind\": \"univ4_hook\"`, hook contract WorkGateHook with constructor arguments `$poolManager`, `$token`, and the WORKERS NFT address, token Work/WORK with 18 decimals, and the pool entry pairing with the chosen currency at fee 12500, tick spacing 60, and initialPrice 2^96 in decimal.\n- Declared permissions beforeInitialize, beforeSwap, afterSwap, afterSwapReturnDelta. I derived these from the Permissions struct the hook passes to validateHookPermissions in its constructor, and they encode to flags 0x20C4 as the brief requires.\n- Expanded the notes to describe the accepted implementation: constructor argument order and the WORKERS code requirement, CREATE2 flag constraint, the single accepted pool key, the trading gate, the 50% to 2% sliding hook fee over 900 seconds, the permissionless sweep to the treasury, the single bounded admin function, and the toolchain. Notes are 2388 characters, under the 4000 cap.\n\n**Checks**\n\n- A scratch script in test/scratch checked the manifest against every schema constraint and refinement, confirmed the parsed permissions equal the struct in the source, and confirmed the flag value.\n- `forge build` succeeded with only lint warnings from the existing source.\n- `forge test` passed all 52 tests across 7 suites, including the invariant suites against the real PoolManager.\n\n**One thing to note**\n\nThe hook has no `getHookPermissions` function. It declares its permissions via `Hooks.validateHookPermissions` in the constructor, which is what the manifest's permissions list mirrors. I stated this in the notes so reviewers comparing against ABI output know where to look.","treeHash":"cbe5cfa7f4dfe619dff766157d123799c59f578b","usage":{"cachedInputTokens":251903,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":5739,"runtime":"claude","turns":8,"wallClockMs":154991}},{"artifacts":[],"attempt":1,"bundleHash":"c4501b762214ddbce3702a9bb5eb4b27b420b72c43012f3e1550fb419aa09c3b","device":"aeca54a62e4f602e","findings":[],"hash":"8d85b6b93600cddbd83d0bcccba45fd7c290177364d0184c86414fca19faee3e","nodeId":"9e099430-3405-4d4f-8515-fd82efc4a528","outcome":"completed","summary":"Implemented with supplied contract logic preserved, dependencies vendored, and deployment documentation added.\n\n- `forge build`: passed with Solidity 0.8.26.\n- `forge test`: 47 passed, including real PoolManager integration; verified offline with an empty environment.\n- `forge fmt --check`: passed.\n\nDeployment assumptions and operational responsibilities are documented in [README.md](/home/imd/.identitymd/work/2a1dcd8a-6ed3-4bb0-b285-161785217a8d/9e099430-3405-4d4f-8515-fd82efc4a528/README.md).","treeHash":"b10e5fa34fe39b5c27f37f174eb06e48fff0bc97","usage":{"cachedInputTokens":934016,"inputTokens":77166,"model":"gpt-6-astra","outputTokens":21108,"runtime":"codex","turns":6,"wallClockMs":483210}},{"artifacts":[],"attempt":2,"bundleHash":"f7f7d327a03c48331b151691d300f5d69debbb9e79069ef5a2c0201d651e73a9","device":"c0d25825e3f9518b","findings":[],"hash":"8e72961395806224057e300e243067f046b92db1bfeb14d1f07a25027e060417","nodeId":"9e099430-3405-4d4f-8515-fd82efc4a528","outcome":"completed","summary":"Implemented with supplied contract logic unchanged, vendored dependencies, and the required `launch.json` notes string.\n\nValidation passed:\n\n- `forge build`\n- `forge test` — 40 tests passed\n- `forge fmt --check`\n\nDeployment parameters, assumptions, and treasury responsibilities are documented in `README.md`. Existing lint warnings remain documented; no deployment was performed.","treeHash":"b0be27067524e15664a186b100784962a8b849a6","usage":{"cachedInputTokens":1581696,"inputTokens":86269,"model":"gpt-6-astra","outputTokens":24613,"runtime":"codex","turns":7,"wallClockMs":625284}},{"artifacts":[],"attempt":1,"bundleHash":"df1640fea2853415c58ffcd05fb9616316ce1aeff1d659b2e623f9b79b79146e","device":"ca720d6a84c31fdd","findings":[],"hash":"be925eb4499d1a2392de63a57b927e8f582c96cbd2dcab0ac2da474c8df93e91","nodeId":"71a6f574-739c-4ddf-a905-6ffcc6976413","outcome":"completed","summary":"Added failure-path, partial-fill, and stateful invariant tests against the real PoolManager.\n\n- `forge build` passes.\n- `forge test`: **52 passed, 0 failed**.\n- Each invariant suite exercises 16,384 randomized calls.\n- Only `test/` files were added.\n\nWORKERS and IMD use local stand-ins; live-chain behavior remains unverified.","treeHash":"cf3d2b17e45498159414c0d2dfe07fefed5221de","usage":{"cachedInputTokens":2020096,"inputTokens":102444,"model":"gpt-6-astra","outputTokens":19368,"runtime":"codex","turns":7,"wallClockMs":568120}}],"verification":[{"checks":[{"durationMs":34709,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 34.58s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/WorkGateInvariant.t.sol:26:9:\n   |\n26 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:33\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                 ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:44\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                            ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:56:17\n   │\n56 │             if (t > block.timestamp) t = 0;\n   │                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n   ╭▸ src/WorkGateHook.sol:54:41\n   │\n54 │             (bool ok, bytes memory r) = workers.staticcall{gas: 50000}(abi.encodeWithSignature(\"tradingOpenAt()\"));\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:67:23\n   │\n67 │         if (t == 0 || block.timestamp <= t) return 5000;\n   │                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:69:16\n   │\n69 │         return t < 900 ? s + (5000 - s) * (900 - t) / 900 : s;\n   │                ━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/WorkGateHook.sol:98:21\n   │\n98 │         uint256 f = uint256(int256(a < 0 ? -a : a)) * feeNow() / 10000;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:44\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                            ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:51\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/WorkGateHook.sol:104:9\n    │\n104 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:116:25\n    │\n116 │             uint256 v = poolManager.balanceOf(address(this), x.toId());\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:118:17\n    │\n118 │                 poolManager.burn(address(this), x.toId(), v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:119:17\n    │\n119 │                 poolManager.take(x, B, v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\n","passed":true},{"durationMs":4910,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Work.t.sol:WorkTest\n[PASS] testApprovalAndTransferFrom() (gas: 157195)\n[PASS] testFuzzTransferConservesSupply(uint256) (runs: 256, μ: 135965, ~: 136158)\nLogs:\n  Bound result 1000000000000000000000\n\n[PASS] testMetadataAndFixedSupply() (gas: 49227)\n[PASS] testRejectsOverdrawAndZeroRecipient() (gas: 56733)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.17ms (7.11ms CPU time)\n\nRan 8 tests for test/WorkGateHook.t.sol:HookGateTest\n[PASS] testClosedAndFutureTimestampRejectSwaps() (gas: 990093)\n[PASS] testFeeScheduleBoundaries() (gas: 175880)\n[PASS] testFuzzFeeIsMonotoneAndBounded(uint256,uint256) (runs: 256, μ: 132356, ~: 132576)\nLogs:\n  Bound result 271\n  Bound result 429\n\n[PASS] testLateFirstSwapUsesNftTimeInsteadOfFirstSwapTime() (gas: 693660)\n[PASS] testSettlementFailureRollsBackLatchClaimsAndPool() (gas: 735294)\n[PASS] testStandingFeeUpdatesAlsoChangeActiveRamp() (gas: 168748)\n[PASS] testViewsDoNotLatchButFirstSuccessfulSwapDoes() (gas: 1084015)\n[PASS] testWorkersFailureModesFailClosed() (gas: 1709063)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 31.92ms (13.49ms CPU time)\n\nRan 11 tests for test/WorkGateHook.t.sol:HookAccountingTest\n[PASS] testAllSwapModesAtFiftyPercent() (gas: 1310289)\n[PASS] testAllSwapModesHalfwayThroughRamp() (gas: 1311033)\n[PASS] testEmptySweepSucceeds() (gas: 72403)\n[PASS] testExactInputBothDirectionsAtStandingFee() (gas: 702283)\n[PASS] testExactOutputBothDirectionsAtStandingFee() (gas: 701284)\n[PASS] testFuzzActualSwapAccounting(bool,bool,uint96,uint16) (runs: 256, μ: 405043, ~: 405229)\nLogs:\n  Bound result 158913500132422696060\n  Bound result 3\n\n[PASS] testNativePayoutFailureRevertsClaimRedemptionsToo() (gas: 892043)\n[PASS] testPermissionlessSweepPaysBothCurrenciesAndDirectDonations() (gas: 895311)\n[PASS] testReentrantClaimSweepCannotRedeemTwice() (gas: 415935)\n[PASS] testTokenPayoutFailurePreservesClaimsForRetry() (gas: 732145)\n[PASS] testZeroStandingFeeAndDustDoNotMintClaims() (gas: 1324329)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 70.56ms (41.62ms CPU time)\n\nRan 17 tests for test/WorkGateHook.t.sol:HookConfigurationTest\n[PASS] testAllCallbacksRejectUnauthorizedCaller() (gas: 131051)\n[PASS] testCannotInitializePredictedHookBeforeDeployment() (gas: 15163200)\n[PASS] testConstructorRejectsPairAsToken() (gas: 8705)\n[PASS] testConstructorRejectsWorkersWithoutCode() (gas: 8966)\n[PASS] testCreate2PermissionsAndConfiguration() (gas: 60170)\n[PASS] testFuzzTreasuryFeeBoundsAndEvent(uint256) (runs: 256, μ: 47152, ~: 47332)\nLogs:\n  Bound result 213\n\n[PASS] testInitializationAcceptsEitherTokenOrdering() (gas: 37590807)\n[PASS] testInitializeThroughRealPoolManagerOnlyOnce() (gas: 166697)\n[PASS] testInitializerCanChoosePriceSoFactoryMustInitializeAtomically() (gas: 147517)\n[PASS] testOnlyTreasuryMaySetFee() (gas: 59333)\n[PASS] testRejectsFeeAboveTenPercent() (gas: 59999)\n[PASS] testRejectsMismatchedHookKey() (gas: 49701)\n[PASS] testRejectsWrongCreate2Flags() (gas: 17913)\n[PASS] testRejectsWrongFeeAndDynamicFee() (gas: 178801)\n[PASS] testRejectsWrongPair() (gas: 61678)\n[PASS] testRejectsWrongTickSpacing() (gas: 66345)\n[PASS] testRejectsWrongToken() (gas: 59335)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 72.06ms (51.00ms CPU time)\n\nRan 7 tests for test/WorkGateEdges.t.sol:WorkGateEdgesTest\n[PASS] testAllLiquidityCanExitWhileTradingClosedAndPoolCanBeReused() (gas: 782745)\n[PASS] testFeeClaimsRemainRedeemableAfterAllLiquidityIsRemoved() (gas: 798821)\n[PASS] testFuzzPartialFillFeesUseExecutedAmountDuringRamp(bool,bool,uint256,uint256,uint256) (runs: 1000, μ: 508010, ~: 506997)\nLogs:\n  Bound result 9900000000000000000003001\n  Bound result 1373\n  Bound result 6\n\n[PASS] testInvalidPriceLimitRollsBackFirstSwapOpening() (gas: 398109)\n[PASS] testMaximumExactInputStopsAtPriceLimit() (gas: 447391)\n[PASS] testMaximumExactOutputStopsAtPriceLimit() (gas: 440258)\n[PASS] testZeroSwapCannotLatchOpeningOrCreateClaims() (gas: 119445)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 72.08ms (52.61ms CPU time)\n\nRan 3 tests for test/WorkInvariant.t.sol:WorkInvariantTest\n[PASS] invariantFixedSupplyAndBalancesMatchIndependentLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+-----------------------+-------+---------+----------╮\n| Contract    | Selector              | Calls | Reverts | Discards |\n+==================================================================+\n| WorkHandler | approve               | 3296  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | rejectOverdraw        | 3335  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | rejectUnapprovedSpend | 3152  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | transfer              | 3278  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | transferFrom          | 3323  | 0       | 0        |\n╰-------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 450\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3303\n  Bound result 300\n  Bound result 0\n  Bound result 0\n  Bound result 64\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 10\n  Bound result 8\n  Bound result 6231\n  Bound result 0\n  Bound result 10000\n  Bound result 3140\n  Bound result 0\n  Bound result 0\n  Bound result 151417097573750\n  Bound result 300992498729708624265673279\n  Bound result 1525062701192345937559802023120972496584912779431590875694\n  Bound result 504300205028708481337397366\n  Bound result 50000\n  Bound result 0\n  Bound result 281\n  Bound result 1000000000000000000000000000\n  Bound result 200\n\n[PASS] testInfiniteAllowanceThenRevocationAndFiniteExhaustion() (gas: 1044422)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 1\n\n[PASS] testZeroOneFullSupplyAndSelfTransfer() (gas: 1293069)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.44s (2.44s CPU time)\n\nRan 2 tests for test/WorkGateInvariant.t.sol:WorkGateInvariantTest\n[PASS]\nWorkGateInvariantTest invariants:\n[PASS] invariantFeesRemainBackedAndAllValueIsConserved\n[PASS] invariantGateAndFeeFollowNftTimeAndAuthorizedUpdates\n WorkGateInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+--------------------+-------+---------+----------╮\n| Contract        | Selector           | Calls | Reverts | Discards |\n+===================================================================+\n| WorkGateHandler | advanceTime        | 1600  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | configureWorkers   | 1680  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | donate             | 1599  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | donateNative       | 1680  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | liquidityRoundTrip | 1624  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | rejectFee          | 1647  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | roundTrip          | 1674  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | setFee             | 1666  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | swap               | 1595  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | sweep              | 1619  | 0       | 0        |\n╰-----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 600\n  Bound result 7745\n  Bound result 8\n  Bound result 380\n  Bound result 3257\n  Bound result 99999999999999999011\n  Bound result 1003\n  Bound result 9990000\n  Bound result 24886197344531973341\n  Bound result 259\n  Bound result 183\n  Bound result 1\n  Bound result 555\n  Bound result 94120694508087546668\n  Bound result 200\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129638999\n  Bound result 1412427853025621\n  Bound result 899\n  Bound result 88\n  Bound result 999000000000000010230\n  Bound result 9\n  Bound result 900\n  Bound result 4\n  Bound result 899\n  Bound result 999000000000000100001\n  Bound result 999000000000000001452\n  Bound result 9999999999999997\n  Bound result 779\n  Bound result 64\n  Bound result 22366482869645213647\n  Bound result 1083\n  Bound result 551\n  Bound result 293\n  Bound result 218\n  Bound result 8589\n  Bound result 50000\n  Bound result 6195\n  Bound result 272\n  Bound result 99999999999999999998\n  Bound result 999000000000000000006\n  Bound result 258158516\n  Bound result 1000\n  Bound result 900\n  Bound result 999000000000000002511\n  Bound result 81\n  Bound result 999000000000000009257\n  Bound result 1392\n  Bound result 55\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129638941\n  Bound result 100000000000000000000\n  Bound result 1571\n  Bound result 298\n  Bound result 16841248850697311259\n  Bound result 200\n\n[PASS] testHandlerLifecycleExercisesAllSwapModesAndBothTreasuryCurrencies() (gas: 3596714)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 10000000000000000\n  Bound result 1001\n  Bound result 1000\n  Bound result 300\n  Bound result 300\n  Bound result 300\n  Bound result 1000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.82s (4.81s CPU time)\n\nRan 7 test suites in 4.82s (7.51s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkGateHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkGateHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkGateHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkGateHook.setStandingFee(uint256)\",\"WorkGateHook.sweep()\",\"WorkGateHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"README.md\":88,\"dependencies.lock.json\":452,\"foundry.toml\":21,\"launch.json\":30,\"src/Work.sol\":8,\"src/WorkGateHook.sol\":124,\"test/INVARIANTS.md\":41,\"test/Work.t.sol\":54,\"test/WorkGateEdges.t.sol\":167,\"test/WorkGateHook.t.sol\":619,\"test/WorkGateInvariant.t.sol\":388,\"test/WorkInvariant.t.sol\":140,\"test/helpers/Fixtures.sol\":73},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"416905f8032629546e001759772bbd6626d875c1c6bf59c5a8b3a5a3aba7ba21","verifiedTreeHash":"cbe5cfa7f4dfe619dff766157d123799c59f578b","verifierVersion":"0.1.0+ef8fb83e"},{"checks":[{"durationMs":9563,"exitCode":0,"name":"build","output":"Compiling 57 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.48s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:33\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                 ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:44\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                            ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:56:17\n   │\n56 │             if (t > block.timestamp) t = 0;\n   │                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n   ╭▸ src/WorkGateHook.sol:54:41\n   │\n54 │             (bool ok, bytes memory r) = workers.staticcall{gas: 50000}(abi.encodeWithSignature(\"tradingOpenAt()\"));\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:67:23\n   │\n67 │         if (t == 0 || block.timestamp <= t) return 5000;\n   │                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:69:16\n   │\n69 │         return t < 900 ? s + (5000 - s) * (900 - t) / 900 : s;\n   │                ━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/WorkGateHook.sol:98:21\n   │\n98 │         uint256 f = uint256(int256(a < 0 ? -a : a)) * feeNow() / 10000;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:44\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                            ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:51\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/WorkGateHook.sol:104:9\n    │\n104 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:116:25\n    │\n116 │             uint256 v = poolManager.balanceOf(address(this), x.toId());\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:118:17\n    │\n118 │                 poolManager.burn(address(this), x.toId(), v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:119:17\n    │\n119 │                 poolManager.take(x, B, v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\n","passed":true},{"durationMs":123,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Work.t.sol:WorkTest\n[PASS] testApprovalAndTransferFrom() (gas: 120125)\n[PASS] testFuzzTransferConservesSupply(uint256) (runs: 256, μ: 87398, ~: 87862)\n[PASS] testMetadataAndFixedSupply() (gas: 33403)\n[PASS] testRejectsTransferToZero() (gas: 30416)\n[PASS] testRejectsTransferWithoutAllowance() (gas: 33649)\n[PASS] testRejectsTransferWithoutBalance() (gas: 33256)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.48ms (2.71ms CPU time)\n\nRan 41 tests for test/WorkGateHook.t.sol:WorkGateHookTest\n[PASS] testBeforeSwapReturnsExpectedSelectorAndNoOverride() (gas: 123695)\n[PASS] testCallbackRejectsWrongHookInKey() (gas: 46906)\n[PASS] testConstructorRejectsNftWithoutCode() (gas: 8922)\n[PASS] testConstructorRejectsPairAsWork() (gas: 8646)\n[PASS] testConstructorRejectsWrongAddressFlags() (gas: 17548)\n[PASS] testCreate2PermissionsAndConfiguration() (gas: 36445)\n[PASS] testDuplicateInitializationRejected() (gas: 131403)\n[PASS] testDustFeeRoundsDownToZero() (gas: 1174195)\n[PASS] testEmptySweepBeforeOpening() (gas: 74111)\n[PASS] testExactInputOneForZeroAtOpening() (gas: 1189597)\n[PASS] testExactInputZeroForOneAtOpening() (gas: 1204705)\n[PASS] testExactOutputOneForZeroAtOpening() (gas: 1190286)\n[PASS] testExactOutputZeroForOneAtOpening() (gas: 1202314)\n[PASS] testFeeDecayBoundaries() (gas: 168557)\n[PASS] testFutureTimestampBlocksUntilExactOpening() (gas: 1080460)\n[PASS] testFuzzFeeDecayIsBoundedAndMonotonic(uint16,uint32) (runs: 256, μ: 118403, ~: 118647)\n[PASS] testFuzzSwapAccounting(bool,bool,uint96,uint16) (runs: 256, μ: 1200777, ~: 1205992)\n[PASS] testInitializationIsPermissionlessAndPriceComesFromCaller() (gas: 105727)\n[PASS] testInitializeAndLiquidityWhileTradingClosed() (gas: 860177)\n[PASS] testInvalidInitialPriceRollsBackInitialization() (gas: 174096)\n[PASS] testLateFirstSwapUsesNftTimestamp() (gas: 963218)\n[PASS] testMaximumStandingFeeIsChargedAfterDecay() (gas: 1223376)\n[PASS] testNftGasExhaustionKeepsTradingClosed() (gas: 897885)\n[PASS] testOnlyTreasuryCanSetStandingFee() (gas: 56189)\n[PASS] testOpeningIsLatchedOnlyBySuccessfulSwap() (gas: 1512967)\n[PASS] testPermissionlessSweepPaysOnlyTreasuryAndIsRepeatable() (gas: 1527641)\n[PASS] testRealPoolWithOppositeCurrencyOrdering() (gas: 13701642)\n[PASS] testRejectsDynamicFee() (gas: 49512)\n[PASS] testRejectsWrongFee() (gas: 54863)\n[PASS] testRejectsWrongPair() (gas: 48281)\n[PASS] testRejectsWrongTickSpacing() (gas: 55340)\n[PASS] testRejectsZeroPoolFee() (gas: 50014)\n[PASS] testRevertingNftKeepsTradingClosed() (gas: 867509)\n[PASS] testShortNftResponseKeepsTradingClosed() (gas: 852187)\n[PASS] testStandingFeeBoundsAndEvent() (gas: 108509)\n[PASS] testStandingFeeChangesDuringDecayAndAfter() (gas: 162021)\n[PASS] testSweepInsideUnlockRejectedByManager() (gas: 51498)\n[PASS] testSweepTransferFailureRollsBackClaimsAndCanRetry() (gas: 1420307)\n[PASS] testUnauthorizedCallbacksRejected() (gas: 125284)\n[PASS] testZeroStandingFeeMintsNoClaims() (gas: 1205218)\n[PASS] testZeroTimestampBlocksTrading() (gas: 813972)\nSuite result: ok. 41 passed; 0 failed; 0 skipped; finished in 68.02ms (92.65ms CPU time)\n\nRan 2 test suites in 71.19ms (70.50ms CPU time): 47 tests passed, 0 failed, 0 skipped (47 total tests)\n","passed":true},{"durationMs":29,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkGateHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkGateHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkGateHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkGateHook.setStandingFee(uint256)\",\"WorkGateHook.sweep()\",\"WorkGateHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"DEPENDENCIES.md\":28,\"README.md\":73,\"foundry.toml\":15,\"launch.json\":1,\"src/Work.sol\":8,\"src/WorkGateHook.sol\":124,\"test/Work.t.sol\":57,\"test/WorkGateHook.t.sol\":564,\"test/support/Fixtures.sol\":124,\"test/support/TestBase.sol\":33},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1178,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/WorkGateHook.sol:103: WorkGateHook.sweep() (src/WorkGateHook.sol#103-111) ignores return value by poolManager.unlock() (src/WorkGateHook.sol#104)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: poolManager.take(x,B,v) (src/WorkGateHook.sol#119)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: poolManager.burn(address(this),x.toId(),v) (src/WorkGateHook.sol#118)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: v = poolManager.balanceOf(address(this),x.toId()) (src/WorkGateHook.sol#116)\n[low/medium] return-bomb at src/WorkGateHook.sol:51: WorkGateHook.tradingOpenAt() (src/WorkGateHook.sol#51-58) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] timestamp at src/WorkGateHook.sol:64: WorkGateHook.feeNow() (src/WorkGateHook.sol#64-70) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkGateHook.sol:91: WorkGateHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/WorkGateHook.sol#91-101) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkGateHook.sol:51: WorkGateHook.tradingOpenAt() (src/WorkGateHook.sol#51-58) uses timestamp for comparisons","passed":true},{"durationMs":332,"exitCode":0,"name":"aderyn","output":"[low] empty-require-revert at src/WorkGateHook.sol:24: Empty `require()` / `revert()` Statement (4 places)\n[low] large-numeric-literal at src/Work.sol:6: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/WorkGateHook.sol:67: Literal Instead of Constant (7 places)\n[low] state-change-without-event at src/WorkGateHook.sol:40: State Change Without Event (2 places)\n[low] unchecked-return at src/WorkGateHook.sol:104: Unchecked Return\n[low] uninitialized-local-variable at src/WorkGateHook.sol:106: Uninitialized Local Variable (2 places)\n[low] unsafe-erc20-operation at src/WorkGateHook.sol:109: Unsafe ERC20 Operation","passed":true}],"detail":"launch.json is not a valid launch manifest: notes: Invalid input: expected string, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"8d85b6b93600cddbd83d0bcccba45fd7c290177364d0184c86414fca19faee3e","verifiedTreeHash":"b10e5fa34fe39b5c27f37f174eb06e48fff0bc97","verifierVersion":"0.1.0+e892633c"},{"checks":[{"durationMs":16870,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 16.76s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:44\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                            ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:33\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                 ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:56:17\n   │\n56 │             if (t > block.timestamp) t = 0;\n   │                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n   ╭▸ src/WorkGateHook.sol:54:41\n   │\n54 │             (bool ok, bytes memory r) = workers.staticcall{gas: 50000}(abi.encodeWithSignature(\"tradingOpenAt()\"));\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:67:23\n   │\n67 │         if (t == 0 || block.timestamp <= t) return 5000;\n   │                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:69:16\n   │\n69 │         return t < 900 ? s + (5000 - s) * (900 - t) / 900 : s;\n   │                ━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/WorkGateHook.sol:98:21\n   │\n98 │         uint256 f = uint256(int256(a < 0 ? -a : a)) * feeNow() / 10000;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:44\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                            ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:51\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/WorkGateHook.sol:104:9\n    │\n104 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:116:25\n    │\n116 │             uint256 v = poolManager.balanceOf(address(this), x.toId());\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:118:17\n    │\n118 │                 poolManager.burn(address(this), x.toId(), v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:119:17\n    │\n119 │                 poolManager.take(x, B, v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\n","passed":true},{"durationMs":110,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Work.t.sol:WorkTest\n[PASS] testApprovalAndTransferFrom() (gas: 157195)\n[PASS] testFuzzTransferConservesSupply(uint256) (runs: 256, μ: 135820, ~: 136158)\nLogs:\n  Bound result 2301108211\n\n[PASS] testMetadataAndFixedSupply() (gas: 49227)\n[PASS] testRejectsOverdrawAndZeroRecipient() (gas: 56733)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.77ms (3.84ms CPU time)\n\nRan 8 tests for test/WorkGateHook.t.sol:HookGateTest\n[PASS] testClosedAndFutureTimestampRejectSwaps() (gas: 990093)\n[PASS] testFeeScheduleBoundaries() (gas: 175880)\n[PASS] testFuzzFeeIsMonotoneAndBounded(uint256,uint256) (runs: 256, μ: 132334, ~: 132576)\nLogs:\n  Bound result 967\n  Bound result 1564\n\n[PASS] testLateFirstSwapUsesNftTimeInsteadOfFirstSwapTime() (gas: 693660)\n[PASS] testSettlementFailureRollsBackLatchClaimsAndPool() (gas: 735294)\n[PASS] testStandingFeeUpdatesAlsoChangeActiveRamp() (gas: 168748)\n[PASS] testViewsDoNotLatchButFirstSuccessfulSwapDoes() (gas: 1084015)\n[PASS] testWorkersFailureModesFailClosed() (gas: 1709063)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 33.91ms (8.59ms CPU time)\n\nRan 11 tests for test/WorkGateHook.t.sol:HookAccountingTest\n[PASS] testAllSwapModesAtFiftyPercent() (gas: 1310289)\n[PASS] testAllSwapModesHalfwayThroughRamp() (gas: 1311033)\n[PASS] testEmptySweepSucceeds() (gas: 72403)\n[PASS] testExactInputBothDirectionsAtStandingFee() (gas: 702283)\n[PASS] testExactOutputBothDirectionsAtStandingFee() (gas: 701284)\n[PASS] testFuzzActualSwapAccounting(bool,bool,uint96,uint16) (runs: 256, μ: 404269, ~: 404796)\nLogs:\n  Bound result 30173205\n  Bound result 867\n\n[PASS] testNativePayoutFailureRevertsClaimRedemptionsToo() (gas: 892043)\n[PASS] testPermissionlessSweepPaysBothCurrenciesAndDirectDonations() (gas: 895311)\n[PASS] testReentrantClaimSweepCannotRedeemTwice() (gas: 415935)\n[PASS] testTokenPayoutFailurePreservesClaimsForRetry() (gas: 732145)\n[PASS] testZeroStandingFeeAndDustDoNotMintClaims() (gas: 1324329)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 33.95ms (29.47ms CPU time)\n\nRan 17 tests for test/WorkGateHook.t.sol:HookConfigurationTest\n[PASS] testAllCallbacksRejectUnauthorizedCaller() (gas: 131051)\n[PASS] testCannotInitializePredictedHookBeforeDeployment() (gas: 15163200)\n[PASS] testConstructorRejectsPairAsToken() (gas: 8705)\n[PASS] testConstructorRejectsWorkersWithoutCode() (gas: 8966)\n[PASS] testCreate2PermissionsAndConfiguration() (gas: 60170)\n[PASS] testFuzzTreasuryFeeBoundsAndEvent(uint256) (runs: 256, μ: 47160, ~: 47332)\nLogs:\n  Bound result 402\n\n[PASS] testInitializationAcceptsEitherTokenOrdering() (gas: 37590807)\n[PASS] testInitializeThroughRealPoolManagerOnlyOnce() (gas: 166697)\n[PASS] testInitializerCanChoosePriceSoFactoryMustInitializeAtomically() (gas: 147517)\n[PASS] testOnlyTreasuryMaySetFee() (gas: 59333)\n[PASS] testRejectsFeeAboveTenPercent() (gas: 59999)\n[PASS] testRejectsMismatchedHookKey() (gas: 49701)\n[PASS] testRejectsWrongCreate2Flags() (gas: 17913)\n[PASS] testRejectsWrongFeeAndDynamicFee() (gas: 178801)\n[PASS] testRejectsWrongPair() (gas: 61678)\n[PASS] testRejectsWrongTickSpacing() (gas: 66345)\n[PASS] testRejectsWrongToken() (gas: 59335)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 34.29ms (40.91ms CPU time)\n\nRan 4 test suites in 34.95ms (105.92ms CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkGateHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkGateHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkGateHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkGateHook.setStandingFee(uint256)\",\"WorkGateHook.sweep()\",\"WorkGateHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"README.md\":88,\"dependencies.lock.json\":452,\"foundry.toml\":21,\"launch.json\":1,\"src/Work.sol\":8,\"src/WorkGateHook.sol\":124,\"test/Work.t.sol\":54,\"test/WorkGateHook.t.sol\":619,\"test/helpers/Fixtures.sol\":73},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1158,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/WorkGateHook.sol:103: WorkGateHook.sweep() (src/WorkGateHook.sol#103-111) ignores return value by poolManager.unlock() (src/WorkGateHook.sol#104)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: poolManager.take(x,B,v) (src/WorkGateHook.sol#119)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: poolManager.burn(address(this),x.toId(),v) (src/WorkGateHook.sol#118)\n[low/medium] calls-loop at src/WorkGateHook.sol:113: WorkGateHook.unlockCallback(bytes) (src/WorkGateHook.sol#113-123) has external calls inside a loop: v = poolManager.balanceOf(address(this),x.toId()) (src/WorkGateHook.sol#116)\n[low/medium] return-bomb at src/WorkGateHook.sol:51: WorkGateHook.tradingOpenAt() (src/WorkGateHook.sol#51-58) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] timestamp at src/WorkGateHook.sol:64: WorkGateHook.feeNow() (src/WorkGateHook.sol#64-70) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkGateHook.sol:91: WorkGateHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/WorkGateHook.sol#91-101) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkGateHook.sol:51: WorkGateHook.tradingOpenAt() (src/WorkGateHook.sol#51-58) uses timestamp for comparisons","passed":true},{"durationMs":320,"exitCode":0,"name":"aderyn","output":"[low] empty-require-revert at src/WorkGateHook.sol:24: Empty `require()` / `revert()` Statement (4 places)\n[low] large-numeric-literal at src/Work.sol:6: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/WorkGateHook.sol:67: Literal Instead of Constant (7 places)\n[low] state-change-without-event at src/WorkGateHook.sol:40: State Change Without Event (2 places)\n[low] unchecked-return at src/WorkGateHook.sol:104: Unchecked Return\n[low] uninitialized-local-variable at src/WorkGateHook.sol:106: Uninitialized Local Variable (2 places)\n[low] unsafe-erc20-operation at src/WorkGateHook.sol:109: Unsafe ERC20 Operation","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8e72961395806224057e300e243067f046b92db1bfeb14d1f07a25027e060417","verifiedTreeHash":"b0be27067524e15664a186b100784962a8b849a6","verifierVersion":"0.1.0+e892633c"},{"checks":[{"durationMs":31795,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 31.66s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/WorkGateInvariant.t.sol:26:9:\n   |\n26 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:33\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                 ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/WorkGateHook.sol:23:44\n   │\n23 │     constructor(IPoolManager m, address t, address w) {\n   │                                            ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:56:17\n   │\n56 │             if (t > block.timestamp) t = 0;\n   │                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n   ╭▸ src/WorkGateHook.sol:54:41\n   │\n54 │             (bool ok, bytes memory r) = workers.staticcall{gas: 50000}(abi.encodeWithSignature(\"tradingOpenAt()\"));\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:67:23\n   │\n67 │         if (t == 0 || block.timestamp <= t) return 5000;\n   │                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkGateHook.sol:69:16\n   │\n69 │         return t < 900 ? s + (5000 - s) * (900 - t) / 900 : s;\n   │                ━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/WorkGateHook.sol:98:21\n   │\n98 │         uint256 f = uint256(int256(a < 0 ? -a : a)) * feeNow() / 10000;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:44\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                            ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkGateHook.sol:100:51\n    │\n100 │         return (IHooks.afterSwap.selector, int128(int256(f)));\n    │                                                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/WorkGateHook.sol:104:9\n    │\n104 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:116:25\n    │\n116 │             uint256 v = poolManager.balanceOf(address(this), x.toId());\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:118:17\n    │\n118 │                 poolManager.burn(address(this), x.toId(), v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/WorkGateHook.sol:119:17\n    │\n119 │                 poolManager.take(x, B, v);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\n","passed":true},{"durationMs":4701,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Work.t.sol:WorkTest\n[PASS] testApprovalAndTransferFrom() (gas: 157195)\n[PASS] testFuzzTransferConservesSupply(uint256) (runs: 256, μ: 136114, ~: 136182)\nLogs:\n  Bound result 117693020865606168451693476\n\n[PASS] testMetadataAndFixedSupply() (gas: 49227)\n[PASS] testRejectsOverdrawAndZeroRecipient() (gas: 56733)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.56ms (4.59ms CPU time)\n\nRan 11 tests for test/WorkGateHook.t.sol:HookAccountingTest\n[PASS] testAllSwapModesAtFiftyPercent() (gas: 1310289)\n[PASS] testAllSwapModesHalfwayThroughRamp() (gas: 1311033)\n[PASS] testEmptySweepSucceeds() (gas: 72403)\n[PASS] testExactInputBothDirectionsAtStandingFee() (gas: 702283)\n[PASS] testExactOutputBothDirectionsAtStandingFee() (gas: 701284)\n[PASS] testFuzzActualSwapAccounting(bool,bool,uint96,uint16) (runs: 256, μ: 403959, ~: 404744)\nLogs:\n  Bound result 2003\n  Bound result 488\n\n[PASS] testNativePayoutFailureRevertsClaimRedemptionsToo() (gas: 892043)\n[PASS] testPermissionlessSweepPaysBothCurrenciesAndDirectDonations() (gas: 895311)\n[PASS] testReentrantClaimSweepCannotRedeemTwice() (gas: 415935)\n[PASS] testTokenPayoutFailurePreservesClaimsForRetry() (gas: 732145)\n[PASS] testZeroStandingFeeAndDustDoNotMintClaims() (gas: 1324329)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 45.84ms (31.61ms CPU time)\n\nRan 17 tests for test/WorkGateHook.t.sol:HookConfigurationTest\n[PASS] testAllCallbacksRejectUnauthorizedCaller() (gas: 131051)\n[PASS] testCannotInitializePredictedHookBeforeDeployment() (gas: 15163200)\n[PASS] testConstructorRejectsPairAsToken() (gas: 8705)\n[PASS] testConstructorRejectsWorkersWithoutCode() (gas: 8966)\n[PASS] testCreate2PermissionsAndConfiguration() (gas: 60170)\n[PASS] testFuzzTreasuryFeeBoundsAndEvent(uint256) (runs: 256, μ: 47172, ~: 47332)\nLogs:\n  Bound result 252\n\n[PASS] testInitializationAcceptsEitherTokenOrdering() (gas: 37590807)\n[PASS] testInitializeThroughRealPoolManagerOnlyOnce() (gas: 166697)\n[PASS] testInitializerCanChoosePriceSoFactoryMustInitializeAtomically() (gas: 147517)\n[PASS] testOnlyTreasuryMaySetFee() (gas: 59333)\n[PASS] testRejectsFeeAboveTenPercent() (gas: 59999)\n[PASS] testRejectsMismatchedHookKey() (gas: 49701)\n[PASS] testRejectsWrongCreate2Flags() (gas: 17913)\n[PASS] testRejectsWrongFeeAndDynamicFee() (gas: 178801)\n[PASS] testRejectsWrongPair() (gas: 61678)\n[PASS] testRejectsWrongTickSpacing() (gas: 66345)\n[PASS] testRejectsWrongToken() (gas: 59335)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 45.88ms (44.66ms CPU time)\n\nRan 8 tests for test/WorkGateHook.t.sol:HookGateTest\n[PASS] testClosedAndFutureTimestampRejectSwaps() (gas: 990093)\n[PASS] testFeeScheduleBoundaries() (gas: 175880)\n[PASS] testFuzzFeeIsMonotoneAndBounded(uint256,uint256) (runs: 256, μ: 132357, ~: 132576)\nLogs:\n  Bound result 482\n  Bound result 1695\n\n[PASS] testLateFirstSwapUsesNftTimeInsteadOfFirstSwapTime() (gas: 693660)\n[PASS] testSettlementFailureRollsBackLatchClaimsAndPool() (gas: 735294)\n[PASS] testStandingFeeUpdatesAlsoChangeActiveRamp() (gas: 168748)\n[PASS] testViewsDoNotLatchButFirstSuccessfulSwapDoes() (gas: 1084015)\n[PASS] testWorkersFailureModesFailClosed() (gas: 1709063)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 57.96ms (9.27ms CPU time)\n\nRan 7 tests for test/WorkGateEdges.t.sol:WorkGateEdgesTest\n[PASS] testAllLiquidityCanExitWhileTradingClosedAndPoolCanBeReused() (gas: 782745)\n[PASS] testFeeClaimsRemainRedeemableAfterAllLiquidityIsRemoved() (gas: 798821)\n[PASS] testFuzzPartialFillFeesUseExecutedAmountDuringRamp(bool,bool,uint256,uint256,uint256) (runs: 1000, μ: 507611, ~: 506985)\nLogs:\n  Bound result 6134762720644225071714392\n  Bound result 713\n  Bound result 142\n\n[PASS] testInvalidPriceLimitRollsBackFirstSwapOpening() (gas: 398109)\n[PASS] testMaximumExactInputStopsAtPriceLimit() (gas: 447391)\n[PASS] testMaximumExactOutputStopsAtPriceLimit() (gas: 440258)\n[PASS] testZeroSwapCannotLatchOpeningOrCreateClaims() (gas: 119445)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 64.84ms (53.98ms CPU time)\n\nRan 3 tests for test/WorkInvariant.t.sol:WorkInvariantTest\n[PASS] invariantFixedSupplyAndBalancesMatchIndependentLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+-----------------------+-------+---------+----------╮\n| Contract    | Selector              | Calls | Reverts | Discards |\n+==================================================================+\n| WorkHandler | approve               | 3210  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | rejectOverdraw        | 3272  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | rejectUnapprovedSpend | 3374  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | transfer              | 3206  | 0       | 0        |\n|-------------+-----------------------+-------+---------+----------|\n| WorkHandler | transferFrom          | 3322  | 0       | 0        |\n╰-------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 2000000000000000000\n  Bound result 6362\n  Bound result 0\n  Bound result 1966\n  Bound result 0\n  Bound result 1000000\n  Bound result 0\n  Bound result 11638776341865977412555186377936387845504954519418967868701310892366364274935\n  Bound result 0\n  Bound result 738097968211590227871499376\n  Bound result 0\n  Bound result 659918\n  Bound result 10000000000000000000\n  Bound result 1768\n  Bound result 18\n  Bound result 0\n  Bound result 0\n  Bound result 100000000000000000000000000\n  Bound result 3\n  Bound result 7983\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 450\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 0\n\n[PASS] testInfiniteAllowanceThenRevocationAndFiniteExhaustion() (gas: 1044422)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 1\n\n[PASS] testZeroOneFullSupplyAndSelfTransfer() (gas: 1293069)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.41s (2.41s CPU time)\n\nRan 2 tests for test/WorkGateInvariant.t.sol:WorkGateInvariantTest\n[PASS]\nWorkGateInvariantTest invariants:\n[PASS] invariantFeesRemainBackedAndAllValueIsConserved\n[PASS] invariantGateAndFeeFollowNftTimeAndAuthorizedUpdates\n WorkGateInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+--------------------+-------+---------+----------╮\n| Contract        | Selector           | Calls | Reverts | Discards |\n+===================================================================+\n| WorkGateHandler | advanceTime        | 1552  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | configureWorkers   | 1595  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | donate             | 1687  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | donateNative       | 1690  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | liquidityRoundTrip | 1664  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | rejectFee          | 1656  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | roundTrip          | 1667  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | setFee             | 1626  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | swap               | 1656  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| WorkGateHandler | sweep              | 1591  | 0       | 0        |\n╰-----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 245\n  Bound result 2\n  Bound result 961677089814731311942\n  Bound result 3412\n  Bound result 15381\n  Bound result 366446893\n  Bound result 3032\n  Bound result 999144115188075855873\n  Bound result 900\n  Bound result 256\n  Bound result 7000000000000000000\n  Bound result 3000\n  Bound result 1000\n  Bound result 241\n  Bound result 667582462\n  Bound result 609\n  Bound result 98922021086800074816\n  Bound result 908218112989848138759\n  Bound result 9\n  Bound result 3\n  Bound result 2225\n  Bound result 999000000000000002697\n  Bound result 991\n  Bound result 3000000000000000000\n  Bound result 9999999999999001\n  Bound result 99999999999999999628\n  Bound result 27\n  Bound result 834\n  Bound result 555\n  Bound result 13739258477915581929\n  Bound result 14800\n  Bound result 8889\n  Bound result 999000000000000000201\n  Bound result 10200156046\n  Bound result 99999999999999999301\n  Bound result 999000000000000003733\n  Bound result 1000000000000000000000\n  Bound result 999000000000000001708\n  Bound result 92\n  Bound result 9454\n  Bound result 5000\n  Bound result 99999999999999899900\n  Bound result 4026260610\n  Bound result 95648662927563314141\n  Bound result 1070\n  Bound result 999000000000000659919\n  Bound result 1398257159631072566\n  Bound result 98220275415352570500\n  Bound result 7776000\n  Bound result 19388175882894\n  Bound result 999000000000000015598\n  Bound result 118\n  Bound result 31\n\n[PASS] testHandlerLifecycleExercisesAllSwapModesAndBothTreasuryCurrencies() (gas: 3596714)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 10000000000000000\n  Bound result 1001\n  Bound result 1000\n  Bound result 300\n  Bound result 300\n  Bound result 300\n  Bound result 1000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.61s (4.59s CPU time)\n\nRan 7 test suites in 4.61s (7.24s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkGateHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkGateHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkGateHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkGateHook.setStandingFee(uint256)\",\"WorkGateHook.sweep()\",\"WorkGateHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"README.md\":88,\"dependencies.lock.json\":452,\"foundry.toml\":21,\"launch.json\":1,\"src/Work.sol\":8,\"src/WorkGateHook.sol\":124,\"test/INVARIANTS.md\":41,\"test/Work.t.sol\":54,\"test/WorkGateEdges.t.sol\":167,\"test/WorkGateHook.t.sol\":619,\"test/WorkGateInvariant.t.sol\":388,\"test/WorkInvariant.t.sol\":140,\"test/helpers/Fixtures.sol\":73},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"be925eb4499d1a2392de63a57b927e8f582c96cbd2dcab0ac2da474c8df93e91","verifiedTreeHash":"cf3d2b17e45498159414c0d2dfe07fefed5221de","verifierVersion":"0.1.0+ef8fb83e"}]}