{"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":"8414d5ca-1d0c-4a68-a3bf-dfa2ea3359a6","kind":"impl_tests_review","nodes":[{"acceptedSubmissionHash":"dde6b3c8128180977d4b3f888cf2f310bccc2f0406eceeb32eeefa7e162469e7","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","tools":[]},"key":"impl","kind":"code","role":"implement","skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["impl","tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["impl","tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"waiting"},{"acceptedSubmissionHash":"7e9a8d416b078062a915fa23222b02e41e17b90692038f68fbbbaa9a501b9461","dependsOn":["impl"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Token name: Work\nToken symbol: WORK\n\nRobinhood Chain 4663. Builders address B = 0xc9EAFE33A510a3a3d95A94c4f85AdaF6a3EA12a0 (EOA). Owner = requester wallet. Contracts: WorkHook (Uniswap v4 hook on the WORK/IMD pool) and WorkersNFT. IMD on this chain = 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127. All owner changes are bounded and emit events; every parameter has a view.\n\n1) WorkHook: takes its fee in the swap callbacks (beforeSwap/afterSwap) on every buy and sell, default 0.75% (2% total with the launch's 1.25%), owner may set 0 to 8.75% max. While the NFT mint runs, hook fees go 100% to B. After the mint ends (sold out or endMint): stakerShareBps (default 10000, owner may set 9000-10000, so B gets at most 10%) goes to WorkersNFT for stakers, the rest to B; if nothing is staked, all to B.\n\n2) WorkersNFT (ERC-721, max 3,333). Owner levers (UNICRED lesson): setCap(newCap) lowers the cap to any value >= minted, never raises; endMint() stops minting forever (cap = minted) and starts the post-mint phase; pause()/unpause() halts minting and WORK mining in an emergency, each pause auto-expires after 72 h.\n- Mint by proof of work: keccak256(abi.encode(DOMAIN, chainid, this, keccak256(abi.encode(anchorHash, prevWork)), msg.sender, nonce)) < target; anchorHash = blockhash at most 250 blocks old; one mint per block; retarget every 8 mints toward 10 s; target doubles after 300 s idle; 9 epochs of 370 (+3), min difficulty +1 bit per epoch; owner may move the floor +-2 bits.\n- Paid in IMD (transferFrom, permit if supported, no ETH): price per epoch [0.25,0.5,0.75,1.25,1.75,2.5,3.25,4,5] IMD, never above 5; owner may scale prices 0.5x-1x.\n- Token id = pool[hash % remaining] (swap-and-pop, no reveal, no reserved ids, no team mint).\n- Overclocked if the hash beats target by >= 4 extra bits: tokenURI = baseURI + \"oc/\" + id + \".json\", else baseURI + id + \".json\". Initial baseURI = ipfs://bafybeibmkvtnptsqztdvsm5sh3avormdnfyarbxpgdlcj6bmg37qchhqve/ (owner may update it).\n- Everyone mints on equal terms: no allowlist, no free mints, no difficulty discounts.\n\n3) Money (automatic, in IMD):\n- Each mint: 65% stakers, 25% buyback balance, 10% to B.\n- Marketplaces: activated (earning) workers stay in the holder's wallet and transfer/list normally (activation and unclaimed WORK move with the token); never block transfers of unstaked workers. Staked workers are held by the contract, so they cannot be listed while staked (no fake floor); unstaking returns them. Stake and unstake are real ERC-721 transfers that emit Transfer, so marketplaces update ownership on their own. Implement ERC-4906 (supportsInterface 0x49064906): emit BatchMetadataUpdate when baseURI changes and MetadataUpdate when a token's metadata changes.\n- Staking: escrow the NFT for 7/14/30 days = weight 1x/2x/4x, no early exit; stakers claim mint IMD and hook rewards pro-rata by weight; mint share with no stakers goes to buyback.\n- buyback(): anyone, max 100 IMD per call, once per 60 s, swaps IMD to WORK in the WORK/IMD pool and burns it.\n- WORK supply: 10% swarm, 70% pool, 20% to B (5% B's own, then B deposits 100M as the mining pool and 50M as the burn pool).\n\n4) After the mint ends:\n- activate(tokenId): one time, fee to B, default 0.15 IMD, owner may set 0-0.5 IMD; stays with the token on transfer.\n- Workers keep working passively (no hashing, no device online): activated, unburned workers earn WORK from the mining pool every second. 8 eras from mint end: era k (0..7) lasts 7*2^k days and emits 12.5M WORK, split equally among all activated workers (reward-per-worker accumulator, updated on activate, burn and claim). claimWork(tokenIds) pays the holder or staker; unclaimed WORK stays with the token on transfer. Stops when the pool is empty.\n- Burn: any holder may burn an unstaked worker for burnPool / workers minted (fixed at mint end, ~15,000 WORK); burned workers stop mining.\n\nSafety: sweep(token) to B for anything sent by mistake (incl. WETH, ETH) but never staker IMD, the buyback balance, the mining pool or the burn pool. ERC-2981 royalty 5% to B, max 10%. Not upgradeable. No minting outside proof of work, no owner path to user funds.\n\nTests: Foundry incl. fuzz on work checks, retargets, id picking, splits, staking escrow, hook split, activation, passive accrual per era, burn reward, sweep limits; then an adversarial security review.","parentJobId":null,"planHash":"01edb7645fb365df15d434043783e11fda71ba2bc961a3f18c27258329c74db9","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"8414d5ca-1d0c-4a68-a3bf-dfa2ea3359a6","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-873-src-workersnft-sol-src-workhook-sol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51556","feedbackHash":"8330121be766c1b31e05ade2c943155ec1e2f9daeec6d040e90ce7266b7aaa26","nodeKey":"impl","submissionHash":"dde6b3c8128180977d4b3f888cf2f310bccc2f0406eceeb32eeefa7e162469e7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51418","feedbackHash":"fbf91d4ddf03c79bc6c33dd796b5ad36a10ab5370081784ffc1aa93bddc68b5d","nodeKey":"manifest","submissionHash":"5468801815705a87d708d60ed17fa74cfeda49ad30b4eca296ef81201348f091","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51019","feedbackHash":"ad9863f5b88c3b065efced65b3308e1412bdbf2e654b1c33b8e97fa507f788fc","nodeKey":"manifest","submissionHash":"bb2dcddc0943be39f5a5df244c97b4a0f28120e53f6aa75ac7e502d4752fee79","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51522","feedbackHash":"f835571715af79a2a17c79c4b0f0fd3557bdea5b054cb9877333ade47c08264f","nodeKey":"manifest","submissionHash":"7d8cc5815c28357c6650c3eb90955a3f783c1a0bfa44d4573bcfc91ead2fce2b","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51417","feedbackHash":"c7a54f00dc2c1a0cd3c00d3ca76aafbfd6e7f41c70a3ab3781a6914c7f525a6b","nodeKey":"tests","submissionHash":"7e9a8d416b078062a915fa23222b02e41e17b90692038f68fbbbaa9a501b9461","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f13d754ef9aed49b866bb57037f2c243950c541021fde8659f5074d87deb9db2","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"fe35556baeee200ea859d48734cd40d552b2366671a7e8ab051b4129163ef54a","device":"2a2bbe7421f10a57","findings":[],"hash":"5468801815705a87d708d60ed17fa74cfeda49ad30b4eca296ef81201348f091","nodeId":"e51b8258-a7ff-4dbc-8181-1668474eb431","outcome":"completed","summary":"Created [launch.json](launch.json). Schema, permission, and bytecode checks pass. Offline build and all 72 tests pass with both fuzz seeds.\n\nOnly the manifest changed. Notes document unresolved WorkersNFT/owner references and library-linking requirements; deployment remains blocked.","treeHash":"23b0c26dd5a367b05eb67edc7e917242954e71d9","usage":{"cachedInputTokens":453504,"inputTokens":57897,"model":"gpt-6-astra","outputTokens":6335,"runtime":"codex","turns":6,"wallClockMs":211718}},{"artifacts":[],"attempt":1,"bundleHash":"288676210d795655691310c337ad9413169b8fecf40e3ad27cf189d7509ded01","device":"fd7c32744e171d7d","findings":[],"hash":"7d8cc5815c28357c6650c3eb90955a3f783c1a0bfa44d4573bcfc91ead2fce2b","nodeId":"e51b8258-a7ff-4dbc-8181-1668474eb431","outcome":"completed","summary":"Created [launch.json](/home/imd1161/.identitymd/work/8414d5ca-1d0c-4a68-a3bf-dfa2ea3359a6/e51b8258-a7ff-4dbc-8181-1668474eb431/launch.json), the only changed file.\n\nSupplied schema and permission checks passed. `forge build` succeeded; all 72 tests passed.\n\nDeployment remains unresolved: WorkersNFT and requester addresses are placeholders, and auxiliary deployment/linking support needs verification. Notes document these limitations and pool-price assumptions.","treeHash":"5c3b0564c15026eda3424cddc1905a536e2238ba","usage":{"cachedInputTokens":503680,"inputTokens":48923,"model":"gpt-6-astra","outputTokens":7585,"runtime":"codex","turns":5,"wallClockMs":243766}},{"artifacts":[],"attempt":1,"bundleHash":"4376612c279c33f64bfefae94c737d18608a1388a2d4021f1f3494edde698c17","device":"163f8bc7d28274e2","findings":[],"hash":"7e9a8d416b078062a915fa23222b02e41e17b90692038f68fbbbaa9a501b9461","nodeId":"9fbb954d-ce97-4935-8928-c0714dda5f66","outcome":"completed","summary":"Added tests in [WorkersNFT.t.sol](test/WorkersNFT.t.sol) and [WorkHook.t.sol](test/WorkHook.t.sol).\n\n- 72 tests pass offline.\n- Fuzz properties pass 2,000 cases with a second seed.\n- Invariants cover 32,768 randomized calls.\n- Build and formatting checks pass.\n\nNo reproducible defects found in the local review. Live Robinhood and Uniswap v4 integration remains unverified.","treeHash":"688661f6d576b11be34544060460bacc6df5bd31","usage":{"cachedInputTokens":1777280,"inputTokens":93503,"model":"gpt-6-astra","outputTokens":32669,"runtime":"codex","turns":7,"wallClockMs":678007}},{"artifacts":[],"attempt":3,"bundleHash":"c21da06638890f70a05d56b5428d9b8855f22b2136b08383591d8c0d29628662","device":"8b35536ee4821baa","findings":[],"hash":"bb2dcddc0943be39f5a5df244c97b4a0f28120e53f6aa75ac7e502d4752fee79","nodeId":"e51b8258-a7ff-4dbc-8181-1668474eb431","outcome":"completed","summary":"Created [launch.json](/home/imd-worker/.identitymd/work/8414d5ca-1d0c-4a68-a3bf-dfa2ea3359a6/e51b8258-a7ff-4dbc-8181-1668474eb431/launch.json), the only deliverable changed.\n\nSupplied-schema, permissions and bytecode checks passed. `forge build` succeeded; all 72 tests passed.\n\nDeployment remains blocked on requester and WorkersNFT addresses, explicitly documented in the manifest. The initial price uses the integration fixture’s value.","treeHash":"ec3bde73542bbe8470baf9ead20f4ac787440437","usage":{"cachedInputTokens":527360,"inputTokens":50808,"model":"gpt-6-astra","outputTokens":8322,"runtime":"codex","turns":6,"wallClockMs":273120}},{"artifacts":[],"attempt":1,"bundleHash":"66b368fb7b288b02eb90012a6bbe0bdfc98aee383d1fcef1ad7677ae2b89831d","device":"f01afe38b46a5f7e","findings":[],"hash":"dde6b3c8128180977d4b3f888cf2f310bccc2f0406eceeb32eeefa7e162469e7","nodeId":"3ac1f74f-d425-4f34-9b24-3caa6c3218ee","outcome":"completed","summary":"Implemented both allowed files, including WORK and self-contained libraries.\n\n- Offline `forge build` passed.\n- `forge test`: 35 passed; 256 runs per fuzz test.\n- Manual adversarial review completed.\n- All production bytecode fits EVM size limits.\n\nDeployment requires linking the included libraries and hook address flags `0x30cc`. IMD-specified partial fills revert to prevent overcharging.","treeHash":"6297c45fcbbe2dcb2f279fd0e241fd57e16e7410","usage":{"cachedInputTokens":2490496,"inputTokens":207120,"model":"gpt-6-astra","outputTokens":47469,"runtime":"codex","turns":9,"wallClockMs":1604756}}],"verification":[{"checks":[{"durationMs":1165,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 988.18ms\nCompiler run successful!\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/WorkHook.sol:67:13\n   │\n67 │         if (IERC20Work(token).balanceOf(address(this)) != beforeBalance + amount) revert TokenTransferFailed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:113:9\n    │\n113 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:114:9\n    │\n114 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:665:9\n    │\n665 │         emit HookBound(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:385:9\n    │\n385 │         WorkerFinance.fundPools(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:968:9\n    │\n968 │         emit PoolsFunded(WorkerConstants.MINING_ALLOCATION, WorkerConstants.BURN_ALLOCATION);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:691:9\n    │\n691 │         emit Approval(holder, operator, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:697:9\n    │\n697 │         emit ApprovalForAll(msg.sender, operator, approved);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:728:9\n    │\n728 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:762:9\n    │\n762 │         emit BaseURIChanged(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:763:9\n    │\n763 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:776:9\n    │\n776 │         emit CapChanged(s.cap, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:794:9\n    │\n794 │         emit MintEnded(s.minted, block.timestamp, s.burnReward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:795:9\n    │\n795 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `feeBps` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:261:9\n    │\n261 │         feeBps = value;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickCumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:364:9\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastObservationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:365:9\n    │\n365 │         lastObservationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:334:9\n    │\n334 │         lastTick = int24(uint24(uint256(slot0) >> 160));\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:783:9\n    │\n783 │         emit CapChanged(s.cap, s.minted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:473:16\n    │\n473 │         return block.timestamp < s.pauseUntil;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:479:9\n    │\n479 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:482:9\n    │\n482 │         emit Paused(s.pauseUntil);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:486:9\n    │\n486 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:489:9\n    │\n489 │         emit Unpaused();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:810:9\n    │\n810 │         emit FloorChanged(s.floorAdjustment, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:815:13\n    │\n815 │             emit TargetChanged(s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:923:9\n    │\n923 │         emit TargetChanged(s.target);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:925:9\n    │\n925 │         emit Transfer(address(0), msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:926:9\n    │\n926 │         emit WorkerMinted(msg.sender, id, hash, s.overclocked[id], price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1007:9\n     │\n1007 │         emit IMDReward(amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1001:9\n     │\n1001 │         emit MintPayment(stakers, buybackShare, builders);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:561:9\n    │\n561 │         WorkerFinance.stake(s, id, lockDays);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:978:9\n    │\n978 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1037:9\n     │\n1037 │         emit Staked(msg.sender, id, s.stakes[id].unlockAt, weight);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1038:9\n     │\n1038 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:565:9\n    │\n565 │         WorkerFinance.unstake(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1050:9\n     │\n1050 │         emit Unstaked(msg.sender, id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1051:9\n     │\n1051 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1061:9\n     │\n1061 │         emit IMDClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:584:9\n    │\n584 │         WorkerFinance.activate(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1076:9\n     │\n1076 │         emit Activated(id);\n     │         ━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1077:9\n     │\n1077 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1135:13\n     │\n1135 │             emit MetadataUpdate(ids[i]);\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1139:9\n     │\n1139 │         emit WorkClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:600:9\n    │\n600 │         WorkerFinance.burn(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1158:9\n     │\n1158 │         emit Transfer(msg.sender, address(0), id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1159:9\n     │\n1159 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1160:9\n     │\n1160 │         emit WorkerBurned(msg.sender, id, s.burnReward);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1198:9\n     │\n1198 │         emit Buyback(amount, output);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:625:9\n    │\n625 │         WorkerFinance.sweep(s, token);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1249:9\n     │\n1249 │         emit Swept(token, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:302:29\n    │\n302 │         uint256 magnitude = uint256(amount < 0 ? -amount : amount);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:25\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\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/WorkHook.sol:303:33\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:321:71\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 0);\n    │                                                                       ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:311:9\n    │\n311 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:321:64\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 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://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkersNFT.sol:748:15\n    │\n748 │             ++digits;\n    │               ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:753:37\n    │\n753 │             text[--digits] = bytes1(uint8(48 + value % 10));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:804:16\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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/WorkersNFT.sol:804:24\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:833:13\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:833:29\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:327:9\n    │\n327 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:335:36\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:335:80\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:341:69\n    │\n341 │             if (fee != 0 && int256(imdDelta) != p.amountSpecified + int256(fee)) revert PartialSpecifiedSwap();\n    │                                                                     ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:344:33\n    │\n344 │             uint256 magnitude = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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/WorkHook.sol:348:42\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:348:49\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:355:13\n    │\n355 │         if (stakers != 0) {\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:360:9\n    │\n360 │         emit FeesDistributed(fee - stakers, stakers);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:366:13\n    │\n366 │         if (block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:364:46\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:375:13\n    │\n375 │             block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW ? newerObservation : olderObservation;\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/WorkHook.sol:376:29\n    │\n376 │         if (!initialized || block.timestamp - start.timestamp < ORACLE_WINDOW) revert OracleNotReady();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:377:26\n    │\n377 │         int256 elapsed = int256(block.timestamp - start.timestamp);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:379:49\n    │\n379 │             tickCumulative + int256(lastTick) * int256(block.timestamp - lastObservationTime) - start.cumulative;\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:382:16\n    │\n382 │         return int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/WorkHook.sol:404:26\n    │\n404 │             (bool ok,) = BUILDERS.call{value: amount}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:410:9\n    │\n410 │         emit Swept(token, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:893:28\n    │\n893 │             s.mintEnded || (block.timestamp < s.pauseUntil) || s.minted >= s.cap || !s.poolsFunded\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/WorkersNFT.sol:915:17\n    │\n915 │             if (elapsed < 20) elapsed = 20;\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/WorkersNFT.sol:916:17\n    │\n916 │             if (elapsed > 320) elapsed = 320;\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1033:54\n     │\n1033 │         s.stakes[id] = WorkerState.Stake(msg.sender, uint64(block.timestamp + lockDays * 1 days), weight);\n     │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1044:13\n     │\n1044 │         if (block.timestamp < position.unlockAt) revert Locked();\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/WorkersNFT.sol:1100:23\n     │\n1100 │         uint256 end = block.timestamp < s.pauseUntil ? block.timestamp : s.pauseUntil;\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/WorkersNFT.sol:1101:13\n     │\n1101 │         if (end > start) amount -= scheduledEmission(s, end) - scheduledEmission(s, start);\n     │             ━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1254:30\n     │\n1254 │         if (h == address(0)) revert InvalidToken();\n     │                              ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1133:58\n     │\n1133 │             if (_beneficiaryOf(s, ids[i]) != msg.sender) revert Unauthorized();\n     │                                                          ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1181:13\n     │\n1181 │         if (block.timestamp > deadline) revert InvalidParameter();\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/WorkersNFT.sol:1188:47\n     │\n1188 │                 || (s.lastBuybackTime != 0 && block.timestamp < s.lastBuybackTime + 60)\n     │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1211:22\n     │\n1211 │                     -int256(amount),\n     │                      ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1216:37\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1216:81\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1217:38\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1217:75\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1218:31\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                               ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1218:64\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                                                                ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1223:66\n     │\n1223 │         s.poolManager.take(Currency.wrap(s.work), address(this), uint128(output));\n     │                                                                  ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1224:13\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1224:76\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │                                                                            ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1225:33\n     │\n1225 │         IERC20Work(s.work).burn(uint128(output));\n     │                                 ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1226:13\n     │\n1226 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1227:27\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\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/WorkersNFT.sol:1227:35\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\n     │                                   ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/WorkersNFT.t.sol:307:17\n    │\n307 │         vm.roll(block.number + 1);\n    │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:345:17\n    │\n345 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:358:17\n    │\n358 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":9488,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/WorkHook.t.sol:WorkHookWorkersIntegrationTest\n[PASS] test_HookRewardsCanBeClaimedAndBuybackSettlesDuringReentrancyGuard() (gas: 1901366)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 79.28ms (3.62ms CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInitializationTest\n[PASS] test_NewHookRejectsWrongPoolAndInitializerBeforeBinding() (gas: 54526421)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 658.00ms (514.62ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDSecondTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 355262, ~: 343734)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 695510)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 425777)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191240)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302608)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 335124)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304571)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573886)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207604)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 216628)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 661527)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.36s (1.30s CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDFirstTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 355139, ~: 343565)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 694955)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 424934)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191021)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302382)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 332016)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304312)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573428)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207422)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 215956)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 660585)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.44s (1.25s CPU time)\n\nRan 5 tests for test/WorkersNFT.t.sol:WorkerSaleBoundaryTest\n[PASS] testFuzz_EighthMintRetargetsClampedTime(uint256) (runs: 2000, μ: 527297, ~: 527349)\n[PASS] testFuzz_EpochFloors(uint256) (runs: 2000, μ: 139429, ~: 139712)\n[PASS] testFuzz_IdleTargetDoublingSaturates(uint256,uint256) (runs: 2000, μ: 153027, ~: 143562)\n[PASS] testFuzz_ProofStrictThreshold(uint256) (runs: 2000, μ: 651605, ~: 587893)\n[PASS] testFuzz_SwapAndPopPicking(uint256,uint256) (runs: 2000, μ: 640975, ~: 593699)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.55s (5.83s CPU time)\n\nRan 37 tests for test/WorkersNFT.t.sol:WorkersNFTTest\n[PASS] testFuzz_EraScheduleAndAccrual(uint256,uint256) (runs: 2000, μ: 1070451, ~: 1070427)\n[PASS] testFuzz_MintSplitsAndWeightedHookRewards(uint256) (runs: 2000, μ: 2500804, ~: 2502125)\n[PASS] testFuzz_PricesAndRoyalty(uint16,uint256) (runs: 2000, μ: 339768, ~: 339762)\n[PASS] testFuzz_SweepOnlySurplus(uint256,uint256) (runs: 2000, μ: 2066578, ~: 2067049)\n[PASS] testFuzz_WorkHashAndInvalidProof(uint256,uint256,address) (runs: 2000, μ: 134848, ~: 134797)\n[PASS] test_AccrualLateActivationAndBurnChangeDenominator() (gas: 1904424)\n[PASS] test_ActivationFeesAndRewardsTravelWithToken() (gas: 1565029)\n[PASS] test_ActivationPaymentFailureRollsBackWorkerCount() (gas: 1016862)\n[PASS] test_AllAdministrativePathsRejectStrangers() (gas: 322768)\n[PASS] test_AllEightErasEmptyTheFundedPool() (gas: 1047479)\n[PASS] test_AnchorAgeAndChainDomain() (gas: 105482)\n[PASS] test_BurnFixedDenominatorAndAccruedWork() (gas: 1782012)\n[PASS] test_BurnRequiresMintEndAndOwner() (gas: 823593)\n[PASS] test_BuybackBurnsAndPreservesMiningAndBurnPools() (gas: 1590663)\n[PASS] test_BuybackFailurePathsAreAtomic() (gas: 1952954)\n[PASS] test_CapOnlyLowersAndMintEndIsPermanent() (gas: 1428378)\n[PASS] test_ClaimDuplicateAndEmptyArraysDoNotDuplicateRewards() (gas: 1052363)\n[PASS] test_ConstructorRejectsInvalidAssetsOwnerAndSpacing() (gas: 9342131)\n[PASS] test_EndMintAndZeroMintBoundary() (gas: 170060)\n[PASS] test_ExactUnstakeBoundaryKeepsEarnedIMD() (gas: 2029650)\n[PASS] test_HookRewardCannotBeForgedOrDoubleCredited() (gas: 1159588)\n[PASS] test_LaunchFundingAndNoSecondDeposit() (gas: 178267)\n[PASS] test_MintFailuresRollBackIdAndPayment() (gas: 1210443)\n[PASS] test_MintSelectsIdChargesAndPreventsReplay() (gas: 739623)\n[PASS] test_NoRetroactiveRewardsAndPoolExhaustion() (gas: 1126041)\n[PASS] test_OptionalReturnsPermitFallbackAndReentrantPayment() (gas: 1438433)\n[PASS] test_OverclockedURIAndMetadataEvents() (gas: 1767422)\n[PASS] test_OwnerBoundsAndEvents() (gas: 494594)\n[PASS] test_PauseExpiresExactlyAt72Hours() (gas: 825394)\n[PASS] test_PauseStopsAccrualWithoutRetroactiveCatchup() (gas: 1568688)\n[PASS] test_PoWCannotBeCopiedByAnotherWallet() (gas: 675004)\n[PASS] test_RobinhoodUsesLocalArbBlocksAndPinnedIMD() (gas: 8653386)\n[PASS] test_StakeFailurePathsAndNormalMarketplaceTransfer() (gas: 944090)\n[PASS] test_StakerCanActivateAndClaimButNotBurn() (gas: 1184269)\n[PASS] test_StakingEscrowLocksTransfersAndEmitsOwnership() (gas: 1173661)\n[PASS] test_SweepETHAndUnrelatedTokensToBuilders() (gas: 1456317)\n[PASS] test_UnfundedAndUnboundDeploymentCannotMint() (gas: 5972862)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 1.55s (5.98s CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInvariantTest\n[PASS] invariant_FeeConservationAndNoRetainedDebt() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| HookSequenceHandler | advance        | 3276  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | donateAndSweep | 3370  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | phase          | 3205  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | settings       | 3236  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | trade          | 3297  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.43s (3.22s CPU time)\n\nRan 1 test for test/WorkersNFT.t.sol:WorkersNFTInvariantTest\n[PASS]\nWorkersNFTInvariantTest invariants:\n[PASS] invariant_EscrowSupplyAndTerminalMint\n[PASS] invariant_ReservesAndConservation\n WorkersNFTInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------------+------------------+-------+---------+----------╮\n| Contract              | Selector         | Calls | Reverts | Discards |\n+=======================================================================+\n| WorkerSequenceHandler | activate         | 1146  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | advance          | 1214  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | burn             | 1125  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | buyback          | 1157  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimIMD         | 1202  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimWORK        | 1229  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | donationAndSweep | 1137  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | finishMint       | 1136  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | lowerCap         | 1236  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | pauseOrResume    | 1164  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | reward           | 1141  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | stake            | 1178  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | transfer         | 1201  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | unstake          | 1118  | 0       | 0        |\n╰-----------------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.33s (9.29s CPU time)\n\nRan 8 test suites in 9.33s (19.40s CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":59,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.burn(uint256)\",\"Work.distributeLaunch(address,address)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkHook.acceptOwnership()\",\"WorkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"WorkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkHook.receive()\",\"WorkHook.setFeeBps(uint16)\",\"WorkHook.setStakerShareBps(uint16)\",\"WorkHook.sweep(address)\",\"WorkHook.transferOwnership(address)\",\"WorkersNFT.acceptOwnership()\",\"WorkersNFT.activate(uint256)\",\"WorkersNFT.approve(address,uint256)\",\"WorkersNFT.burn(uint256)\",\"WorkersNFT.buyback()\",\"WorkersNFT.buyback(uint256,uint256,uint256)\",\"WorkersNFT.claimIMD()\",\"WorkersNFT.claimWork(uint256[])\",\"WorkersNFT.endMint()\",\"WorkersNFT.fundPools()\",\"WorkersNFT.mint(uint256,uint256)\",\"WorkersNFT.mintWithPermit(uint256,uint256,uint256,uint8,bytes32,bytes32)\",\"WorkersNFT.notifyHookReward(uint256)\",\"WorkersNFT.pause()\",\"WorkersNFT.receive()\",\"WorkersNFT.safeTransferFrom(address,address,uint256)\",\"WorkersNFT.safeTransferFrom(address,address,uint256,bytes)\",\"WorkersNFT.setActivationFee(uint256)\",\"WorkersNFT.setApprovalForAll(address,bool)\",\"WorkersNFT.setBaseURI(string)\",\"WorkersNFT.setCap(uint256)\",\"WorkersNFT.setFloorAdjustment(int8)\",\"WorkersNFT.setHook(address)\",\"WorkersNFT.setPriceScaleBps(uint16)\",\"WorkersNFT.setRoyaltyBps(uint16)\",\"WorkersNFT.stake(uint256,uint256)\",\"WorkersNFT.sweep(address)\",\"WorkersNFT.transferFrom(address,address,uint256)\",\"WorkersNFT.transferOwnership(address)\",\"WorkersNFT.unlockCallback(bytes)\",\"WorkersNFT.unpause()\",\"WorkersNFT.unstake(uint256)\"],\"files\":{\"launch.json\":32,\"src/WorkHook.sol\":580,\"src/WorkersNFT.sol\":1261,\"test/WorkHook.t.sol\":627,\"test/WorkersNFT.t.sol\":1619},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"launch.json: keccakHex expects an even-length hex string","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"5468801815705a87d708d60ed17fa74cfeda49ad30b4eca296ef81201348f091","verifiedTreeHash":"23b0c26dd5a367b05eb67edc7e917242954e71d9","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":815,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 734.91ms\nCompiler run successful!\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/WorkHook.sol:67:13\n   │\n67 │         if (IERC20Work(token).balanceOf(address(this)) != beforeBalance + amount) revert TokenTransferFailed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:113:9\n    │\n113 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:114:9\n    │\n114 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:665:9\n    │\n665 │         emit HookBound(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:385:9\n    │\n385 │         WorkerFinance.fundPools(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:968:9\n    │\n968 │         emit PoolsFunded(WorkerConstants.MINING_ALLOCATION, WorkerConstants.BURN_ALLOCATION);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:691:9\n    │\n691 │         emit Approval(holder, operator, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:697:9\n    │\n697 │         emit ApprovalForAll(msg.sender, operator, approved);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:728:9\n    │\n728 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:762:9\n    │\n762 │         emit BaseURIChanged(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:763:9\n    │\n763 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `feeBps` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:261:9\n    │\n261 │         feeBps = value;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickCumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:364:9\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastObservationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:365:9\n    │\n365 │         lastObservationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:334:9\n    │\n334 │         lastTick = int24(uint24(uint256(slot0) >> 160));\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:776:9\n    │\n776 │         emit CapChanged(s.cap, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:794:9\n    │\n794 │         emit MintEnded(s.minted, block.timestamp, s.burnReward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:795:9\n    │\n795 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:783:9\n    │\n783 │         emit CapChanged(s.cap, s.minted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:473:16\n    │\n473 │         return block.timestamp < s.pauseUntil;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:479:9\n    │\n479 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:482:9\n    │\n482 │         emit Paused(s.pauseUntil);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:486:9\n    │\n486 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:489:9\n    │\n489 │         emit Unpaused();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:302:29\n    │\n302 │         uint256 magnitude = uint256(amount < 0 ? -amount : amount);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:25\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:810:9\n    │\n810 │         emit FloorChanged(s.floorAdjustment, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:815:13\n    │\n815 │             emit TargetChanged(s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:33\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:923:9\n    │\n923 │         emit TargetChanged(s.target);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:925:9\n    │\n925 │         emit Transfer(address(0), msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:926:9\n    │\n926 │         emit WorkerMinted(msg.sender, id, hash, s.overclocked[id], price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:321:71\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 0);\n    │                                                                       ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:311:9\n    │\n311 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1007:9\n     │\n1007 │         emit IMDReward(amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:321:64\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 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://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1001:9\n     │\n1001 │         emit MintPayment(stakers, buybackShare, builders);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:561:9\n    │\n561 │         WorkerFinance.stake(s, id, lockDays);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:978:9\n    │\n978 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1037:9\n     │\n1037 │         emit Staked(msg.sender, id, s.stakes[id].unlockAt, weight);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1038:9\n     │\n1038 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:565:9\n    │\n565 │         WorkerFinance.unstake(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1050:9\n     │\n1050 │         emit Unstaked(msg.sender, id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1051:9\n     │\n1051 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1061:9\n     │\n1061 │         emit IMDClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:327:9\n    │\n327 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:335:36\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:335:80\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:341:69\n    │\n341 │             if (fee != 0 && int256(imdDelta) != p.amountSpecified + int256(fee)) revert PartialSpecifiedSwap();\n    │                                                                     ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:344:33\n    │\n344 │             uint256 magnitude = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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/WorkHook.sol:348:42\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:348:49\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:584:9\n    │\n584 │         WorkerFinance.activate(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:355:13\n    │\n355 │         if (stakers != 0) {\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1076:9\n     │\n1076 │         emit Activated(id);\n     │         ━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1077:9\n     │\n1077 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:360:9\n    │\n360 │         emit FeesDistributed(fee - stakers, stakers);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1135:13\n     │\n1135 │             emit MetadataUpdate(ids[i]);\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1139:9\n     │\n1139 │         emit WorkClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:366:13\n    │\n366 │         if (block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:364:46\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\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[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:600:9\n    │\n600 │         WorkerFinance.burn(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:375:13\n    │\n375 │             block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW ? newerObservation : olderObservation;\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/WorkHook.sol:376:29\n    │\n376 │         if (!initialized || block.timestamp - start.timestamp < ORACLE_WINDOW) revert OracleNotReady();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1158:9\n     │\n1158 │         emit Transfer(msg.sender, address(0), id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1159:9\n     │\n1159 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1160:9\n     │\n1160 │         emit WorkerBurned(msg.sender, id, s.burnReward);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:377:26\n    │\n377 │         int256 elapsed = int256(block.timestamp - start.timestamp);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:379:49\n    │\n379 │             tickCumulative + int256(lastTick) * int256(block.timestamp - lastObservationTime) - start.cumulative;\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1198:9\n     │\n1198 │         emit Buyback(amount, output);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:382:16\n    │\n382 │         return int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:625:9\n    │\n625 │         WorkerFinance.sweep(s, token);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1249:9\n     │\n1249 │         emit Swept(token, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/WorkHook.sol:404:26\n    │\n404 │             (bool ok,) = BUILDERS.call{value: amount}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:410:9\n    │\n410 │         emit Swept(token, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkersNFT.sol:748:15\n    │\n748 │             ++digits;\n    │               ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:753:37\n    │\n753 │             text[--digits] = bytes1(uint8(48 + value % 10));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:804:16\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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/WorkersNFT.sol:804:24\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:833:13\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:833:29\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:893:28\n    │\n893 │             s.mintEnded || (block.timestamp < s.pauseUntil) || s.minted >= s.cap || !s.poolsFunded\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/WorkersNFT.sol:915:17\n    │\n915 │             if (elapsed < 20) elapsed = 20;\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/WorkersNFT.sol:916:17\n    │\n916 │             if (elapsed > 320) elapsed = 320;\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1033:54\n     │\n1033 │         s.stakes[id] = WorkerState.Stake(msg.sender, uint64(block.timestamp + lockDays * 1 days), weight);\n     │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1044:13\n     │\n1044 │         if (block.timestamp < position.unlockAt) revert Locked();\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/WorkersNFT.sol:1100:23\n     │\n1100 │         uint256 end = block.timestamp < s.pauseUntil ? block.timestamp : s.pauseUntil;\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/WorkersNFT.sol:1101:13\n     │\n1101 │         if (end > start) amount -= scheduledEmission(s, end) - scheduledEmission(s, start);\n     │             ━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1254:30\n     │\n1254 │         if (h == address(0)) revert InvalidToken();\n     │                              ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1133:58\n     │\n1133 │             if (_beneficiaryOf(s, ids[i]) != msg.sender) revert Unauthorized();\n     │                                                          ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1181:13\n     │\n1181 │         if (block.timestamp > deadline) revert InvalidParameter();\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/WorkersNFT.sol:1188:47\n     │\n1188 │                 || (s.lastBuybackTime != 0 && block.timestamp < s.lastBuybackTime + 60)\n     │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1211:22\n     │\n1211 │                     -int256(amount),\n     │                      ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1216:37\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1216:81\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1217:38\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1217:75\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1218:31\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                               ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1218:64\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                                                                ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1223:66\n     │\n1223 │         s.poolManager.take(Currency.wrap(s.work), address(this), uint128(output));\n     │                                                                  ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1224:13\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1224:76\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │                                                                            ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1225:33\n     │\n1225 │         IERC20Work(s.work).burn(uint128(output));\n     │                                 ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1226:13\n     │\n1226 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1227:27\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\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/WorkersNFT.sol:1227:35\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\n     │                                   ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/WorkersNFT.t.sol:307:17\n    │\n307 │         vm.roll(block.number + 1);\n    │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:345:17\n    │\n345 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:358:17\n    │\n358 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":6405,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/WorkHook.t.sol:WorkHookWorkersIntegrationTest\n[PASS] test_HookRewardsCanBeClaimedAndBuybackSettlesDuringReentrancyGuard() (gas: 1901366)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 34.59ms (4.06ms CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInitializationTest\n[PASS] test_NewHookRejectsWrongPoolAndInitializerBeforeBinding() (gas: 54526421)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 126.80ms (111.17ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDFirstTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 354262, ~: 343565)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 694955)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 424934)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191021)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302382)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 332016)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304312)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573428)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207422)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 215956)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 660585)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 431.26ms (406.33ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDSecondTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 354450, ~: 343733)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 695510)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 425777)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191240)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302608)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 335124)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304571)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573886)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207604)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 216628)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 661527)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 923.40ms (907.18ms CPU time)\n\nRan 37 tests for test/WorkersNFT.t.sol:WorkersNFTTest\n[PASS] testFuzz_EraScheduleAndAccrual(uint256,uint256) (runs: 2000, μ: 1070665, ~: 1070427)\n[PASS] testFuzz_MintSplitsAndWeightedHookRewards(uint256) (runs: 2000, μ: 2500800, ~: 2502125)\n[PASS] testFuzz_PricesAndRoyalty(uint16,uint256) (runs: 2000, μ: 339763, ~: 339762)\n[PASS] testFuzz_SweepOnlySurplus(uint256,uint256) (runs: 2000, μ: 2066664, ~: 2067049)\n[PASS] testFuzz_WorkHashAndInvalidProof(uint256,uint256,address) (runs: 2000, μ: 134614, ~: 134797)\n[PASS] test_AccrualLateActivationAndBurnChangeDenominator() (gas: 1904424)\n[PASS] test_ActivationFeesAndRewardsTravelWithToken() (gas: 1565029)\n[PASS] test_ActivationPaymentFailureRollsBackWorkerCount() (gas: 1016862)\n[PASS] test_AllAdministrativePathsRejectStrangers() (gas: 322768)\n[PASS] test_AllEightErasEmptyTheFundedPool() (gas: 1047479)\n[PASS] test_AnchorAgeAndChainDomain() (gas: 105482)\n[PASS] test_BurnFixedDenominatorAndAccruedWork() (gas: 1782012)\n[PASS] test_BurnRequiresMintEndAndOwner() (gas: 823593)\n[PASS] test_BuybackBurnsAndPreservesMiningAndBurnPools() (gas: 1590663)\n[PASS] test_BuybackFailurePathsAreAtomic() (gas: 1952954)\n[PASS] test_CapOnlyLowersAndMintEndIsPermanent() (gas: 1428378)\n[PASS] test_ClaimDuplicateAndEmptyArraysDoNotDuplicateRewards() (gas: 1052363)\n[PASS] test_ConstructorRejectsInvalidAssetsOwnerAndSpacing() (gas: 9342131)\n[PASS] test_EndMintAndZeroMintBoundary() (gas: 170060)\n[PASS] test_ExactUnstakeBoundaryKeepsEarnedIMD() (gas: 2029650)\n[PASS] test_HookRewardCannotBeForgedOrDoubleCredited() (gas: 1159588)\n[PASS] test_LaunchFundingAndNoSecondDeposit() (gas: 178267)\n[PASS] test_MintFailuresRollBackIdAndPayment() (gas: 1210443)\n[PASS] test_MintSelectsIdChargesAndPreventsReplay() (gas: 739623)\n[PASS] test_NoRetroactiveRewardsAndPoolExhaustion() (gas: 1126041)\n[PASS] test_OptionalReturnsPermitFallbackAndReentrantPayment() (gas: 1438433)\n[PASS] test_OverclockedURIAndMetadataEvents() (gas: 1767422)\n[PASS] test_OwnerBoundsAndEvents() (gas: 494594)\n[PASS] test_PauseExpiresExactlyAt72Hours() (gas: 825394)\n[PASS] test_PauseStopsAccrualWithoutRetroactiveCatchup() (gas: 1568688)\n[PASS] test_PoWCannotBeCopiedByAnotherWallet() (gas: 675004)\n[PASS] test_RobinhoodUsesLocalArbBlocksAndPinnedIMD() (gas: 8653386)\n[PASS] test_StakeFailurePathsAndNormalMarketplaceTransfer() (gas: 944090)\n[PASS] test_StakerCanActivateAndClaimButNotBurn() (gas: 1184269)\n[PASS] test_StakingEscrowLocksTransfersAndEmitsOwnership() (gas: 1173661)\n[PASS] test_SweepETHAndUnrelatedTokensToBuilders() (gas: 1456317)\n[PASS] test_UnfundedAndUnboundDeploymentCannotMint() (gas: 5972862)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 940.56ms (4.38s CPU time)\n\nRan 5 tests for test/WorkersNFT.t.sol:WorkerSaleBoundaryTest\n[PASS] testFuzz_EighthMintRetargetsClampedTime(uint256) (runs: 2000, μ: 527301, ~: 527349)\n[PASS] testFuzz_EpochFloors(uint256) (runs: 2000, μ: 139481, ~: 139712)\n[PASS] testFuzz_IdleTargetDoublingSaturates(uint256,uint256) (runs: 2000, μ: 152520, ~: 142556)\n[PASS] testFuzz_ProofStrictThreshold(uint256) (runs: 2000, μ: 651105, ~: 585538)\n[PASS] testFuzz_SwapAndPopPicking(uint256,uint256) (runs: 2000, μ: 641114, ~: 593525)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 940.62ms (4.69s CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInvariantTest\n[PASS] invariant_FeeConservationAndNoRetainedDebt() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| HookSequenceHandler | advance        | 3330  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | donateAndSweep | 3271  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | phase          | 3257  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | settings       | 3258  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | trade          | 3268  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.16s (2.12s CPU time)\n\nRan 1 test for test/WorkersNFT.t.sol:WorkersNFTInvariantTest\n[PASS]\nWorkersNFTInvariantTest invariants:\n[PASS] invariant_EscrowSupplyAndTerminalMint\n[PASS] invariant_ReservesAndConservation\n WorkersNFTInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------------+------------------+-------+---------+----------╮\n| Contract              | Selector         | Calls | Reverts | Discards |\n+=======================================================================+\n| WorkerSequenceHandler | activate         | 1123  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | advance          | 1147  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | burn             | 1168  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | buyback          | 1178  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimIMD         | 1209  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimWORK        | 1181  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | donationAndSweep | 1145  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | finishMint       | 1220  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | lowerCap         | 1194  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | pauseOrResume    | 1181  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | reward           | 1190  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | stake            | 1125  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | transfer         | 1156  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | unstake          | 1167  | 0       | 0        |\n╰-----------------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.35s (6.34s CPU time)\n\nRan 8 test suites in 6.35s (11.91s CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.burn(uint256)\",\"Work.distributeLaunch(address,address)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkHook.acceptOwnership()\",\"WorkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"WorkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkHook.receive()\",\"WorkHook.setFeeBps(uint16)\",\"WorkHook.setStakerShareBps(uint16)\",\"WorkHook.sweep(address)\",\"WorkHook.transferOwnership(address)\",\"WorkersNFT.acceptOwnership()\",\"WorkersNFT.activate(uint256)\",\"WorkersNFT.approve(address,uint256)\",\"WorkersNFT.burn(uint256)\",\"WorkersNFT.buyback()\",\"WorkersNFT.buyback(uint256,uint256,uint256)\",\"WorkersNFT.claimIMD()\",\"WorkersNFT.claimWork(uint256[])\",\"WorkersNFT.endMint()\",\"WorkersNFT.fundPools()\",\"WorkersNFT.mint(uint256,uint256)\",\"WorkersNFT.mintWithPermit(uint256,uint256,uint256,uint8,bytes32,bytes32)\",\"WorkersNFT.notifyHookReward(uint256)\",\"WorkersNFT.pause()\",\"WorkersNFT.receive()\",\"WorkersNFT.safeTransferFrom(address,address,uint256)\",\"WorkersNFT.safeTransferFrom(address,address,uint256,bytes)\",\"WorkersNFT.setActivationFee(uint256)\",\"WorkersNFT.setApprovalForAll(address,bool)\",\"WorkersNFT.setBaseURI(string)\",\"WorkersNFT.setCap(uint256)\",\"WorkersNFT.setFloorAdjustment(int8)\",\"WorkersNFT.setHook(address)\",\"WorkersNFT.setPriceScaleBps(uint16)\",\"WorkersNFT.setRoyaltyBps(uint16)\",\"WorkersNFT.stake(uint256,uint256)\",\"WorkersNFT.sweep(address)\",\"WorkersNFT.transferFrom(address,address,uint256)\",\"WorkersNFT.transferOwnership(address)\",\"WorkersNFT.unlockCallback(bytes)\",\"WorkersNFT.unpause()\",\"WorkersNFT.unstake(uint256)\"],\"files\":{\"launch.json\":32,\"src/WorkHook.sol\":580,\"src/WorkersNFT.sol\":1261,\"test/WorkHook.t.sol\":627,\"test/WorkersNFT.t.sol\":1619},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"launch.json: keccakHex expects an even-length hex string","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"7d8cc5815c28357c6650c3eb90955a3f783c1a0bfa44d4573bcfc91ead2fce2b","verifiedTreeHash":"5c3b0564c15026eda3424cddc1905a536e2238ba","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":858,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 771.74ms\nCompiler run successful!\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/WorkHook.sol:67:13\n   │\n67 │         if (IERC20Work(token).balanceOf(address(this)) != beforeBalance + amount) revert TokenTransferFailed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:113:9\n    │\n113 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:114:9\n    │\n114 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:665:9\n    │\n665 │         emit HookBound(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:385:9\n    │\n385 │         WorkerFinance.fundPools(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:968:9\n    │\n968 │         emit PoolsFunded(WorkerConstants.MINING_ALLOCATION, WorkerConstants.BURN_ALLOCATION);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:691:9\n    │\n691 │         emit Approval(holder, operator, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:697:9\n    │\n697 │         emit ApprovalForAll(msg.sender, operator, approved);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:728:9\n    │\n728 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `feeBps` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:261:9\n    │\n261 │         feeBps = value;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickCumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:364:9\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastObservationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:365:9\n    │\n365 │         lastObservationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:334:9\n    │\n334 │         lastTick = int24(uint24(uint256(slot0) >> 160));\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:762:9\n    │\n762 │         emit BaseURIChanged(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:763:9\n    │\n763 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:776:9\n    │\n776 │         emit CapChanged(s.cap, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:794:9\n    │\n794 │         emit MintEnded(s.minted, block.timestamp, s.burnReward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:795:9\n    │\n795 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:783:9\n    │\n783 │         emit CapChanged(s.cap, s.minted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:473:16\n    │\n473 │         return block.timestamp < s.pauseUntil;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:479:9\n    │\n479 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:482:9\n    │\n482 │         emit Paused(s.pauseUntil);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:302:29\n    │\n302 │         uint256 magnitude = uint256(amount < 0 ? -amount : amount);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:25\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\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/WorkHook.sol:303:33\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:486:9\n    │\n486 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:489:9\n    │\n489 │         emit Unpaused();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:321:71\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 0);\n    │                                                                       ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:311:9\n    │\n311 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:321:64\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 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://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:810:9\n    │\n810 │         emit FloorChanged(s.floorAdjustment, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:815:13\n    │\n815 │             emit TargetChanged(s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:327:9\n    │\n327 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:335:36\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:335:80\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:341:69\n    │\n341 │             if (fee != 0 && int256(imdDelta) != p.amountSpecified + int256(fee)) revert PartialSpecifiedSwap();\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:923:9\n    │\n923 │         emit TargetChanged(s.target);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:925:9\n    │\n925 │         emit Transfer(address(0), msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:926:9\n    │\n926 │         emit WorkerMinted(msg.sender, id, hash, s.overclocked[id], price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:344:33\n    │\n344 │             uint256 magnitude = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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/WorkHook.sol:348:42\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:348:49\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1007:9\n     │\n1007 │         emit IMDReward(amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1001:9\n     │\n1001 │         emit MintPayment(stakers, buybackShare, builders);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:355:13\n    │\n355 │         if (stakers != 0) {\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:360:9\n    │\n360 │         emit FeesDistributed(fee - stakers, stakers);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:561:9\n    │\n561 │         WorkerFinance.stake(s, id, lockDays);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:366:13\n    │\n366 │         if (block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:364:46\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:978:9\n    │\n978 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1037:9\n     │\n1037 │         emit Staked(msg.sender, id, s.stakes[id].unlockAt, weight);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1038:9\n     │\n1038 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:375:13\n    │\n375 │             block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW ? newerObservation : olderObservation;\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/WorkHook.sol:376:29\n    │\n376 │         if (!initialized || block.timestamp - start.timestamp < ORACLE_WINDOW) revert OracleNotReady();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:565:9\n    │\n565 │         WorkerFinance.unstake(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:377:26\n    │\n377 │         int256 elapsed = int256(block.timestamp - start.timestamp);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:379:49\n    │\n379 │             tickCumulative + int256(lastTick) * int256(block.timestamp - lastObservationTime) - start.cumulative;\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1050:9\n     │\n1050 │         emit Unstaked(msg.sender, id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1051:9\n     │\n1051 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:382:16\n    │\n382 │         return int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1061:9\n     │\n1061 │         emit IMDClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/WorkHook.sol:404:26\n    │\n404 │             (bool ok,) = BUILDERS.call{value: amount}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:410:9\n    │\n410 │         emit Swept(token, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:584:9\n    │\n584 │         WorkerFinance.activate(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1076:9\n     │\n1076 │         emit Activated(id);\n     │         ━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1077:9\n     │\n1077 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1135:13\n     │\n1135 │             emit MetadataUpdate(ids[i]);\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1139:9\n     │\n1139 │         emit WorkClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:600:9\n    │\n600 │         WorkerFinance.burn(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1158:9\n     │\n1158 │         emit Transfer(msg.sender, address(0), id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1159:9\n     │\n1159 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1160:9\n     │\n1160 │         emit WorkerBurned(msg.sender, id, s.burnReward);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1198:9\n     │\n1198 │         emit Buyback(amount, output);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:625:9\n    │\n625 │         WorkerFinance.sweep(s, token);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1249:9\n     │\n1249 │         emit Swept(token, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkersNFT.sol:748:15\n    │\n748 │             ++digits;\n    │               ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:753:37\n    │\n753 │             text[--digits] = bytes1(uint8(48 + value % 10));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:804:16\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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/WorkersNFT.sol:804:24\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:833:13\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:833:29\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:893:28\n    │\n893 │             s.mintEnded || (block.timestamp < s.pauseUntil) || s.minted >= s.cap || !s.poolsFunded\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/WorkersNFT.sol:915:17\n    │\n915 │             if (elapsed < 20) elapsed = 20;\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/WorkersNFT.sol:916:17\n    │\n916 │             if (elapsed > 320) elapsed = 320;\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1033:54\n     │\n1033 │         s.stakes[id] = WorkerState.Stake(msg.sender, uint64(block.timestamp + lockDays * 1 days), weight);\n     │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1044:13\n     │\n1044 │         if (block.timestamp < position.unlockAt) revert Locked();\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/WorkersNFT.sol:1100:23\n     │\n1100 │         uint256 end = block.timestamp < s.pauseUntil ? block.timestamp : s.pauseUntil;\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/WorkersNFT.sol:1101:13\n     │\n1101 │         if (end > start) amount -= scheduledEmission(s, end) - scheduledEmission(s, start);\n     │             ━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1254:30\n     │\n1254 │         if (h == address(0)) revert InvalidToken();\n     │                              ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1133:58\n     │\n1133 │             if (_beneficiaryOf(s, ids[i]) != msg.sender) revert Unauthorized();\n     │                                                          ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1181:13\n     │\n1181 │         if (block.timestamp > deadline) revert InvalidParameter();\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/WorkersNFT.sol:1188:47\n     │\n1188 │                 || (s.lastBuybackTime != 0 && block.timestamp < s.lastBuybackTime + 60)\n     │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1211:22\n     │\n1211 │                     -int256(amount),\n     │                      ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1216:37\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1216:81\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1217:38\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1217:75\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1218:31\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                               ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1218:64\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                                                                ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1223:66\n     │\n1223 │         s.poolManager.take(Currency.wrap(s.work), address(this), uint128(output));\n     │                                                                  ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1224:13\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1224:76\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │                                                                            ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1225:33\n     │\n1225 │         IERC20Work(s.work).burn(uint128(output));\n     │                                 ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1226:13\n     │\n1226 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1227:27\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\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/WorkersNFT.sol:1227:35\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\n     │                                   ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/WorkersNFT.t.sol:307:17\n    │\n307 │         vm.roll(block.number + 1);\n    │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:345:17\n    │\n345 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:358:17\n    │\n358 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":6332,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/WorkHook.t.sol:WorkHookWorkersIntegrationTest\n[PASS] test_HookRewardsCanBeClaimedAndBuybackSettlesDuringReentrancyGuard() (gas: 1901366)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 27.83ms (2.57ms CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInitializationTest\n[PASS] test_NewHookRejectsWrongPoolAndInitializerBeforeBinding() (gas: 54526421)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 158.36ms (130.85ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDSecondTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 354122, ~: 343733)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 695510)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 425777)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191240)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302608)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 335124)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304571)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573886)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207604)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 216628)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 661527)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 441.50ms (408.07ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDFirstTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 354060, ~: 343565)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 694955)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 424934)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191021)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302382)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 332016)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304312)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573428)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207422)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 215956)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 660585)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 945.94ms (929.49ms CPU time)\n\nRan 5 tests for test/WorkersNFT.t.sol:WorkerSaleBoundaryTest\n[PASS] testFuzz_EighthMintRetargetsClampedTime(uint256) (runs: 2000, μ: 527307, ~: 527349)\n[PASS] testFuzz_EpochFloors(uint256) (runs: 2000, μ: 139478, ~: 139712)\n[PASS] testFuzz_IdleTargetDoublingSaturates(uint256,uint256) (runs: 2000, μ: 151365, ~: 141024)\n[PASS] testFuzz_ProofStrictThreshold(uint256) (runs: 2000, μ: 650925, ~: 592768)\n[PASS] testFuzz_SwapAndPopPicking(uint256,uint256) (runs: 2000, μ: 643120, ~: 593525)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 947.40ms (4.07s CPU time)\n\nRan 37 tests for test/WorkersNFT.t.sol:WorkersNFTTest\n[PASS] testFuzz_EraScheduleAndAccrual(uint256,uint256) (runs: 2000, μ: 1070553, ~: 1070427)\n[PASS] testFuzz_MintSplitsAndWeightedHookRewards(uint256) (runs: 2000, μ: 2500866, ~: 2502125)\n[PASS] testFuzz_PricesAndRoyalty(uint16,uint256) (runs: 2000, μ: 339763, ~: 339762)\n[PASS] testFuzz_SweepOnlySurplus(uint256,uint256) (runs: 2000, μ: 2066583, ~: 2067037)\n[PASS] testFuzz_WorkHashAndInvalidProof(uint256,uint256,address) (runs: 2000, μ: 134754, ~: 134797)\n[PASS] test_AccrualLateActivationAndBurnChangeDenominator() (gas: 1904424)\n[PASS] test_ActivationFeesAndRewardsTravelWithToken() (gas: 1565029)\n[PASS] test_ActivationPaymentFailureRollsBackWorkerCount() (gas: 1016862)\n[PASS] test_AllAdministrativePathsRejectStrangers() (gas: 322768)\n[PASS] test_AllEightErasEmptyTheFundedPool() (gas: 1047479)\n[PASS] test_AnchorAgeAndChainDomain() (gas: 105482)\n[PASS] test_BurnFixedDenominatorAndAccruedWork() (gas: 1782012)\n[PASS] test_BurnRequiresMintEndAndOwner() (gas: 823593)\n[PASS] test_BuybackBurnsAndPreservesMiningAndBurnPools() (gas: 1590663)\n[PASS] test_BuybackFailurePathsAreAtomic() (gas: 1952954)\n[PASS] test_CapOnlyLowersAndMintEndIsPermanent() (gas: 1428378)\n[PASS] test_ClaimDuplicateAndEmptyArraysDoNotDuplicateRewards() (gas: 1052363)\n[PASS] test_ConstructorRejectsInvalidAssetsOwnerAndSpacing() (gas: 9342131)\n[PASS] test_EndMintAndZeroMintBoundary() (gas: 170060)\n[PASS] test_ExactUnstakeBoundaryKeepsEarnedIMD() (gas: 2029650)\n[PASS] test_HookRewardCannotBeForgedOrDoubleCredited() (gas: 1159588)\n[PASS] test_LaunchFundingAndNoSecondDeposit() (gas: 178267)\n[PASS] test_MintFailuresRollBackIdAndPayment() (gas: 1210443)\n[PASS] test_MintSelectsIdChargesAndPreventsReplay() (gas: 739623)\n[PASS] test_NoRetroactiveRewardsAndPoolExhaustion() (gas: 1126041)\n[PASS] test_OptionalReturnsPermitFallbackAndReentrantPayment() (gas: 1438433)\n[PASS] test_OverclockedURIAndMetadataEvents() (gas: 1767422)\n[PASS] test_OwnerBoundsAndEvents() (gas: 494594)\n[PASS] test_PauseExpiresExactlyAt72Hours() (gas: 825394)\n[PASS] test_PauseStopsAccrualWithoutRetroactiveCatchup() (gas: 1568688)\n[PASS] test_PoWCannotBeCopiedByAnotherWallet() (gas: 675004)\n[PASS] test_RobinhoodUsesLocalArbBlocksAndPinnedIMD() (gas: 8653386)\n[PASS] test_StakeFailurePathsAndNormalMarketplaceTransfer() (gas: 944090)\n[PASS] test_StakerCanActivateAndClaimButNotBurn() (gas: 1184269)\n[PASS] test_StakingEscrowLocksTransfersAndEmitsOwnership() (gas: 1173661)\n[PASS] test_SweepETHAndUnrelatedTokensToBuilders() (gas: 1456317)\n[PASS] test_UnfundedAndUnboundDeploymentCannotMint() (gas: 5972862)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 947.43ms (4.43s CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInvariantTest\n[PASS] invariant_FeeConservationAndNoRetainedDebt() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| HookSequenceHandler | advance        | 3341  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | donateAndSweep | 3222  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | phase          | 3376  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | settings       | 3218  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | trade          | 3227  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.97s (1.95s CPU time)\n\nRan 1 test for test/WorkersNFT.t.sol:WorkersNFTInvariantTest\n[PASS]\nWorkersNFTInvariantTest invariants:\n[PASS] invariant_EscrowSupplyAndTerminalMint\n[PASS] invariant_ReservesAndConservation\n WorkersNFTInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------------+------------------+-------+---------+----------╮\n| Contract              | Selector         | Calls | Reverts | Discards |\n+=======================================================================+\n| WorkerSequenceHandler | activate         | 1146  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | advance          | 1194  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | burn             | 1150  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | buyback          | 1163  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimIMD         | 1181  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimWORK        | 1141  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | donationAndSweep | 1153  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | finishMint       | 1158  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | lowerCap         | 1242  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | pauseOrResume    | 1151  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | reward           | 1217  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | stake            | 1214  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | transfer         | 1152  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | unstake          | 1122  | 0       | 0        |\n╰-----------------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.27s (6.26s CPU time)\n\nRan 8 test suites in 6.27s (11.71s CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.burn(uint256)\",\"Work.distributeLaunch(address,address)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkHook.acceptOwnership()\",\"WorkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"WorkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkHook.receive()\",\"WorkHook.setFeeBps(uint16)\",\"WorkHook.setStakerShareBps(uint16)\",\"WorkHook.sweep(address)\",\"WorkHook.transferOwnership(address)\",\"WorkersNFT.acceptOwnership()\",\"WorkersNFT.activate(uint256)\",\"WorkersNFT.approve(address,uint256)\",\"WorkersNFT.burn(uint256)\",\"WorkersNFT.buyback()\",\"WorkersNFT.buyback(uint256,uint256,uint256)\",\"WorkersNFT.claimIMD()\",\"WorkersNFT.claimWork(uint256[])\",\"WorkersNFT.endMint()\",\"WorkersNFT.fundPools()\",\"WorkersNFT.mint(uint256,uint256)\",\"WorkersNFT.mintWithPermit(uint256,uint256,uint256,uint8,bytes32,bytes32)\",\"WorkersNFT.notifyHookReward(uint256)\",\"WorkersNFT.pause()\",\"WorkersNFT.receive()\",\"WorkersNFT.safeTransferFrom(address,address,uint256)\",\"WorkersNFT.safeTransferFrom(address,address,uint256,bytes)\",\"WorkersNFT.setActivationFee(uint256)\",\"WorkersNFT.setApprovalForAll(address,bool)\",\"WorkersNFT.setBaseURI(string)\",\"WorkersNFT.setCap(uint256)\",\"WorkersNFT.setFloorAdjustment(int8)\",\"WorkersNFT.setHook(address)\",\"WorkersNFT.setPriceScaleBps(uint16)\",\"WorkersNFT.setRoyaltyBps(uint16)\",\"WorkersNFT.stake(uint256,uint256)\",\"WorkersNFT.sweep(address)\",\"WorkersNFT.transferFrom(address,address,uint256)\",\"WorkersNFT.transferOwnership(address)\",\"WorkersNFT.unlockCallback(bytes)\",\"WorkersNFT.unpause()\",\"WorkersNFT.unstake(uint256)\"],\"files\":{\"src/WorkHook.sol\":580,\"src/WorkersNFT.sol\":1261,\"test/WorkHook.t.sol\":627,\"test/WorkersNFT.t.sol\":1619},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7e9a8d416b078062a915fa23222b02e41e17b90692038f68fbbbaa9a501b9461","verifiedTreeHash":"688661f6d576b11be34544060460bacc6df5bd31","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":781,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 697.06ms\nCompiler run successful!\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/WorkHook.sol:67:13\n   │\n67 │         if (IERC20Work(token).balanceOf(address(this)) != beforeBalance + amount) revert TokenTransferFailed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:113:9\n    │\n113 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:114:9\n    │\n114 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:665:9\n    │\n665 │         emit HookBound(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:385:9\n    │\n385 │         WorkerFinance.fundPools(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:968:9\n    │\n968 │         emit PoolsFunded(WorkerConstants.MINING_ALLOCATION, WorkerConstants.BURN_ALLOCATION);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:691:9\n    │\n691 │         emit Approval(holder, operator, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:697:9\n    │\n697 │         emit ApprovalForAll(msg.sender, operator, approved);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:728:9\n    │\n728 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:762:9\n    │\n762 │         emit BaseURIChanged(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:763:9\n    │\n763 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `feeBps` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:261:9\n    │\n261 │         feeBps = value;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickCumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:364:9\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastObservationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:365:9\n    │\n365 │         lastObservationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:334:9\n    │\n334 │         lastTick = int24(uint24(uint256(slot0) >> 160));\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:776:9\n    │\n776 │         emit CapChanged(s.cap, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:794:9\n    │\n794 │         emit MintEnded(s.minted, block.timestamp, s.burnReward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:795:9\n    │\n795 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:783:9\n    │\n783 │         emit CapChanged(s.cap, s.minted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:473:16\n    │\n473 │         return block.timestamp < s.pauseUntil;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:479:9\n    │\n479 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:482:9\n    │\n482 │         emit Paused(s.pauseUntil);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:486:9\n    │\n486 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:489:9\n    │\n489 │         emit Unpaused();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:302:29\n    │\n302 │         uint256 magnitude = uint256(amount < 0 ? -amount : amount);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:25\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\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/WorkHook.sol:303:33\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:810:9\n    │\n810 │         emit FloorChanged(s.floorAdjustment, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:815:13\n    │\n815 │             emit TargetChanged(s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:321:71\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 0);\n    │                                                                       ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:311:9\n    │\n311 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:321:64\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 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://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:923:9\n    │\n923 │         emit TargetChanged(s.target);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:925:9\n    │\n925 │         emit Transfer(address(0), msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:926:9\n    │\n926 │         emit WorkerMinted(msg.sender, id, hash, s.overclocked[id], price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1007:9\n     │\n1007 │         emit IMDReward(amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1001:9\n     │\n1001 │         emit MintPayment(stakers, buybackShare, builders);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:561:9\n    │\n561 │         WorkerFinance.stake(s, id, lockDays);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:978:9\n    │\n978 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1037:9\n     │\n1037 │         emit Staked(msg.sender, id, s.stakes[id].unlockAt, weight);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1038:9\n     │\n1038 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:565:9\n    │\n565 │         WorkerFinance.unstake(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1050:9\n     │\n1050 │         emit Unstaked(msg.sender, id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1051:9\n     │\n1051 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1061:9\n     │\n1061 │         emit IMDClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:327:9\n    │\n327 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:335:36\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:335:80\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:341:69\n    │\n341 │             if (fee != 0 && int256(imdDelta) != p.amountSpecified + int256(fee)) revert PartialSpecifiedSwap();\n    │                                                                     ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:344:33\n    │\n344 │             uint256 magnitude = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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/WorkHook.sol:348:42\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:348:49\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:355:13\n    │\n355 │         if (stakers != 0) {\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:360:9\n    │\n360 │         emit FeesDistributed(fee - stakers, stakers);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:584:9\n    │\n584 │         WorkerFinance.activate(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1076:9\n     │\n1076 │         emit Activated(id);\n     │         ━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1077:9\n     │\n1077 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:366:13\n    │\n366 │         if (block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1135:13\n     │\n1135 │             emit MetadataUpdate(ids[i]);\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1139:9\n     │\n1139 │         emit WorkClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:600:9\n    │\n600 │         WorkerFinance.burn(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:364:46\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1158:9\n     │\n1158 │         emit Transfer(msg.sender, address(0), id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1159:9\n     │\n1159 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:375:13\n    │\n375 │             block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW ? newerObservation : olderObservation;\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/WorkHook.sol:376:29\n    │\n376 │         if (!initialized || block.timestamp - start.timestamp < ORACLE_WINDOW) revert OracleNotReady();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1160:9\n     │\n1160 │         emit WorkerBurned(msg.sender, id, s.burnReward);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:377:26\n    │\n377 │         int256 elapsed = int256(block.timestamp - start.timestamp);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1198:9\n     │\n1198 │         emit Buyback(amount, output);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:379:49\n    │\n379 │             tickCumulative + int256(lastTick) * int256(block.timestamp - lastObservationTime) - start.cumulative;\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:382:16\n    │\n382 │         return int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:625:9\n    │\n625 │         WorkerFinance.sweep(s, token);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1249:9\n     │\n1249 │         emit Swept(token, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/WorkHook.sol:404:26\n    │\n404 │             (bool ok,) = BUILDERS.call{value: amount}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:410:9\n    │\n410 │         emit Swept(token, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkersNFT.sol:748:15\n    │\n748 │             ++digits;\n    │               ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:753:37\n    │\n753 │             text[--digits] = bytes1(uint8(48 + value % 10));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:804:16\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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/WorkersNFT.sol:804:24\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:833:13\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:833:29\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:893:28\n    │\n893 │             s.mintEnded || (block.timestamp < s.pauseUntil) || s.minted >= s.cap || !s.poolsFunded\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/WorkersNFT.sol:915:17\n    │\n915 │             if (elapsed < 20) elapsed = 20;\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/WorkersNFT.sol:916:17\n    │\n916 │             if (elapsed > 320) elapsed = 320;\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1033:54\n     │\n1033 │         s.stakes[id] = WorkerState.Stake(msg.sender, uint64(block.timestamp + lockDays * 1 days), weight);\n     │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1044:13\n     │\n1044 │         if (block.timestamp < position.unlockAt) revert Locked();\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/WorkersNFT.sol:1100:23\n     │\n1100 │         uint256 end = block.timestamp < s.pauseUntil ? block.timestamp : s.pauseUntil;\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/WorkersNFT.sol:1101:13\n     │\n1101 │         if (end > start) amount -= scheduledEmission(s, end) - scheduledEmission(s, start);\n     │             ━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1254:30\n     │\n1254 │         if (h == address(0)) revert InvalidToken();\n     │                              ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1133:58\n     │\n1133 │             if (_beneficiaryOf(s, ids[i]) != msg.sender) revert Unauthorized();\n     │                                                          ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1181:13\n     │\n1181 │         if (block.timestamp > deadline) revert InvalidParameter();\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/WorkersNFT.sol:1188:47\n     │\n1188 │                 || (s.lastBuybackTime != 0 && block.timestamp < s.lastBuybackTime + 60)\n     │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1211:22\n     │\n1211 │                     -int256(amount),\n     │                      ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1216:37\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1216:81\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1217:38\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1217:75\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1218:31\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                               ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1218:64\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                                                                ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1223:66\n     │\n1223 │         s.poolManager.take(Currency.wrap(s.work), address(this), uint128(output));\n     │                                                                  ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1224:13\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1224:76\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │                                                                            ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1225:33\n     │\n1225 │         IERC20Work(s.work).burn(uint128(output));\n     │                                 ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1226:13\n     │\n1226 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1227:27\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\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/WorkersNFT.sol:1227:35\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\n     │                                   ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/WorkersNFT.t.sol:307:17\n    │\n307 │         vm.roll(block.number + 1);\n    │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:345:17\n    │\n345 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/WorkHook.t.sol:358:17\n    │\n358 │         vm.warp(block.timestamp + 30 minutes);\n    │         ────────━━━━━━━━━━━━━━━────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":6185,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/WorkHook.t.sol:WorkHookWorkersIntegrationTest\n[PASS] test_HookRewardsCanBeClaimedAndBuybackSettlesDuringReentrancyGuard() (gas: 1901366)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 26.60ms (2.57ms CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInitializationTest\n[PASS] test_NewHookRejectsWrongPoolAndInitializerBeforeBinding() (gas: 54526421)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 78.70ms (64.54ms CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDFirstTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 354662, ~: 343565)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 694955)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 424934)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191021)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302382)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 332016)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304312)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573428)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207422)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 215956)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 660585)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 841.10ms (821.78ms CPU time)\n\nRan 37 tests for test/WorkersNFT.t.sol:WorkersNFTTest\n[PASS] testFuzz_EraScheduleAndAccrual(uint256,uint256) (runs: 2000, μ: 1070574, ~: 1070427)\n[PASS] testFuzz_MintSplitsAndWeightedHookRewards(uint256) (runs: 2000, μ: 2500703, ~: 2502101)\n[PASS] testFuzz_PricesAndRoyalty(uint16,uint256) (runs: 2000, μ: 339767, ~: 339762)\n[PASS] testFuzz_SweepOnlySurplus(uint256,uint256) (runs: 2000, μ: 2066594, ~: 2067049)\n[PASS] testFuzz_WorkHashAndInvalidProof(uint256,uint256,address) (runs: 2000, μ: 134756, ~: 134809)\n[PASS] test_AccrualLateActivationAndBurnChangeDenominator() (gas: 1904424)\n[PASS] test_ActivationFeesAndRewardsTravelWithToken() (gas: 1565029)\n[PASS] test_ActivationPaymentFailureRollsBackWorkerCount() (gas: 1016862)\n[PASS] test_AllAdministrativePathsRejectStrangers() (gas: 322768)\n[PASS] test_AllEightErasEmptyTheFundedPool() (gas: 1047479)\n[PASS] test_AnchorAgeAndChainDomain() (gas: 105482)\n[PASS] test_BurnFixedDenominatorAndAccruedWork() (gas: 1782012)\n[PASS] test_BurnRequiresMintEndAndOwner() (gas: 823593)\n[PASS] test_BuybackBurnsAndPreservesMiningAndBurnPools() (gas: 1590663)\n[PASS] test_BuybackFailurePathsAreAtomic() (gas: 1952954)\n[PASS] test_CapOnlyLowersAndMintEndIsPermanent() (gas: 1428378)\n[PASS] test_ClaimDuplicateAndEmptyArraysDoNotDuplicateRewards() (gas: 1052363)\n[PASS] test_ConstructorRejectsInvalidAssetsOwnerAndSpacing() (gas: 9342131)\n[PASS] test_EndMintAndZeroMintBoundary() (gas: 170060)\n[PASS] test_ExactUnstakeBoundaryKeepsEarnedIMD() (gas: 2029650)\n[PASS] test_HookRewardCannotBeForgedOrDoubleCredited() (gas: 1159588)\n[PASS] test_LaunchFundingAndNoSecondDeposit() (gas: 178267)\n[PASS] test_MintFailuresRollBackIdAndPayment() (gas: 1210443)\n[PASS] test_MintSelectsIdChargesAndPreventsReplay() (gas: 739623)\n[PASS] test_NoRetroactiveRewardsAndPoolExhaustion() (gas: 1126041)\n[PASS] test_OptionalReturnsPermitFallbackAndReentrantPayment() (gas: 1438433)\n[PASS] test_OverclockedURIAndMetadataEvents() (gas: 1767422)\n[PASS] test_OwnerBoundsAndEvents() (gas: 494594)\n[PASS] test_PauseExpiresExactlyAt72Hours() (gas: 825394)\n[PASS] test_PauseStopsAccrualWithoutRetroactiveCatchup() (gas: 1568688)\n[PASS] test_PoWCannotBeCopiedByAnotherWallet() (gas: 675004)\n[PASS] test_RobinhoodUsesLocalArbBlocksAndPinnedIMD() (gas: 8653386)\n[PASS] test_StakeFailurePathsAndNormalMarketplaceTransfer() (gas: 944090)\n[PASS] test_StakerCanActivateAndClaimButNotBurn() (gas: 1184269)\n[PASS] test_StakingEscrowLocksTransfersAndEmitsOwnership() (gas: 1173661)\n[PASS] test_SweepETHAndUnrelatedTokensToBuilders() (gas: 1456317)\n[PASS] test_UnfundedAndUnboundDeploymentCannotMint() (gas: 5972862)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 893.53ms (3.84s CPU time)\n\nRan 13 tests for test/WorkHook.t.sol:WorkHookIMDSecondTest\n[PASS] testFuzz_FeesAllDirectionsAndSplit(uint256,uint16,uint16,uint8,bool,bool) (runs: 2000, μ: 355174, ~: 343733)\n[PASS] test_BoundedAdminWithEventsAndTwoStepOwnership() (gas: 366168)\n[PASS] test_DefaultFeeDuringMintAndAfterWithNoStakers() (gas: 695510)\n[PASS] test_FeesAreChargedExactlyOnceInCorrectCallback() (gas: 425777)\n[PASS] test_NegativeAverageTickFloorsInsteadOfTruncates() (gas: 191240)\n[PASS] test_NotificationFailureRevertsBothLegs() (gas: 302608)\n[PASS] test_OnlyManagerAndOnlyConfiguredPool() (gas: 335124)\n[PASS] test_OracleWarmupAndSameBlockManipulationHasZeroWeight() (gas: 304571)\n[PASS] test_PartialSpecifiedFillRevertsWholeSwapIncludingFeeTransfers() (gas: 573886)\n[PASS] test_PermissionlessSweepSendsOnlyToBuilders() (gas: 207604)\n[PASS] test_PermissionsAndBinding() (gas: 58348)\n[PASS] test_SpecifiedSignedEdgesRevertCleanly() (gas: 216628)\n[PASS] test_ZeroFeeAndRoundingDustDoNotTakeFunds() (gas: 661527)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 893.58ms (881.47ms CPU time)\n\nRan 5 tests for test/WorkersNFT.t.sol:WorkerSaleBoundaryTest\n[PASS] testFuzz_EighthMintRetargetsClampedTime(uint256) (runs: 2000, μ: 527300, ~: 527349)\n[PASS] testFuzz_EpochFloors(uint256) (runs: 2000, μ: 139462, ~: 139712)\n[PASS] testFuzz_IdleTargetDoublingSaturates(uint256,uint256) (runs: 2000, μ: 151745, ~: 141942)\n[PASS] testFuzz_ProofStrictThreshold(uint256) (runs: 2000, μ: 650356, ~: 590953)\n[PASS] testFuzz_SwapAndPopPicking(uint256,uint256) (runs: 2000, μ: 649867, ~: 593873)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 893.73ms (4.46s CPU time)\n\nRan 1 test for test/WorkHook.t.sol:WorkHookInvariantTest\n[PASS] invariant_FeeConservationAndNoRetainedDebt() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| HookSequenceHandler | advance        | 3269  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | donateAndSweep | 3276  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | phase          | 3328  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | settings       | 3274  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| HookSequenceHandler | trade          | 3237  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.87s (1.84s CPU time)\n\nRan 1 test for test/WorkersNFT.t.sol:WorkersNFTInvariantTest\n[PASS]\nWorkersNFTInvariantTest invariants:\n[PASS] invariant_EscrowSupplyAndTerminalMint\n[PASS] invariant_ReservesAndConservation\n WorkersNFTInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------------+------------------+-------+---------+----------╮\n| Contract              | Selector         | Calls | Reverts | Discards |\n+=======================================================================+\n| WorkerSequenceHandler | activate         | 1215  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | advance          | 1129  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | burn             | 1150  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | buyback          | 1236  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimIMD         | 1083  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | claimWORK        | 1142  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | donationAndSweep | 1194  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | finishMint       | 1178  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | lowerCap         | 1136  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | pauseOrResume    | 1193  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | reward           | 1148  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | stake            | 1153  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | transfer         | 1225  | 0       | 0        |\n|-----------------------+------------------+-------+---------+----------|\n| WorkerSequenceHandler | unstake          | 1202  | 0       | 0        |\n╰-----------------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.12s (6.11s CPU time)\n\nRan 8 test suites in 6.12s (11.62s CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.burn(uint256)\",\"Work.distributeLaunch(address,address)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkHook.acceptOwnership()\",\"WorkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"WorkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkHook.receive()\",\"WorkHook.setFeeBps(uint16)\",\"WorkHook.setStakerShareBps(uint16)\",\"WorkHook.sweep(address)\",\"WorkHook.transferOwnership(address)\",\"WorkersNFT.acceptOwnership()\",\"WorkersNFT.activate(uint256)\",\"WorkersNFT.approve(address,uint256)\",\"WorkersNFT.burn(uint256)\",\"WorkersNFT.buyback()\",\"WorkersNFT.buyback(uint256,uint256,uint256)\",\"WorkersNFT.claimIMD()\",\"WorkersNFT.claimWork(uint256[])\",\"WorkersNFT.endMint()\",\"WorkersNFT.fundPools()\",\"WorkersNFT.mint(uint256,uint256)\",\"WorkersNFT.mintWithPermit(uint256,uint256,uint256,uint8,bytes32,bytes32)\",\"WorkersNFT.notifyHookReward(uint256)\",\"WorkersNFT.pause()\",\"WorkersNFT.receive()\",\"WorkersNFT.safeTransferFrom(address,address,uint256)\",\"WorkersNFT.safeTransferFrom(address,address,uint256,bytes)\",\"WorkersNFT.setActivationFee(uint256)\",\"WorkersNFT.setApprovalForAll(address,bool)\",\"WorkersNFT.setBaseURI(string)\",\"WorkersNFT.setCap(uint256)\",\"WorkersNFT.setFloorAdjustment(int8)\",\"WorkersNFT.setHook(address)\",\"WorkersNFT.setPriceScaleBps(uint16)\",\"WorkersNFT.setRoyaltyBps(uint16)\",\"WorkersNFT.stake(uint256,uint256)\",\"WorkersNFT.sweep(address)\",\"WorkersNFT.transferFrom(address,address,uint256)\",\"WorkersNFT.transferOwnership(address)\",\"WorkersNFT.unlockCallback(bytes)\",\"WorkersNFT.unpause()\",\"WorkersNFT.unstake(uint256)\"],\"files\":{\"launch.json\":32,\"src/WorkHook.sol\":580,\"src/WorkersNFT.sol\":1261,\"test/WorkHook.t.sol\":627,\"test/WorkersNFT.t.sol\":1619},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"launch.json: keccakHex expects an even-length hex string","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"bb2dcddc0943be39f5a5df244c97b4a0f28120e53f6aa75ac7e502d4752fee79","verifiedTreeHash":"ec3bde73542bbe8470baf9ead20f4ac787440437","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":309,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 233.66ms\nCompiler run successful!\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/WorkHook.sol:67:13\n   │\n67 │         if (IERC20Work(token).balanceOf(address(this)) != beforeBalance + amount) revert TokenTransferFailed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:113:9\n    │\n113 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/WorkHook.sol:114:9\n    │\n114 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:665:9\n    │\n665 │         emit HookBound(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:385:9\n    │\n385 │         WorkerFinance.fundPools(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:968:9\n    │\n968 │         emit PoolsFunded(WorkerConstants.MINING_ALLOCATION, WorkerConstants.BURN_ALLOCATION);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:691:9\n    │\n691 │         emit Approval(holder, operator, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:697:9\n    │\n697 │         emit ApprovalForAll(msg.sender, operator, approved);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:728:9\n    │\n728 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:762:9\n    │\n762 │         emit BaseURIChanged(value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:763:9\n    │\n763 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:776:9\n    │\n776 │         emit CapChanged(s.cap, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:794:9\n    │\n794 │         emit MintEnded(s.minted, block.timestamp, s.burnReward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:795:9\n    │\n795 │         emit BatchMetadataUpdate(1, WorkerConstants.MAX_SUPPLY);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:783:9\n    │\n783 │         emit CapChanged(s.cap, s.minted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:473:16\n    │\n473 │         return block.timestamp < s.pauseUntil;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:479:9\n    │\n479 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:482:9\n    │\n482 │         emit Paused(s.pauseUntil);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `s` is updated\n    ╭▸ src/WorkersNFT.sol:486:9\n    │\n486 │         WorkerFinance._updateMining(s);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:489:9\n    │\n489 │         emit Unpaused();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `feeBps` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:261:9\n    │\n261 │         feeBps = value;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickCumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:364:9\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastObservationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:365:9\n    │\n365 │         lastObservationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/WorkHook.sol:334:9\n    │\n334 │         lastTick = int24(uint24(uint256(slot0) >> 160));\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:810:9\n    │\n810 │         emit FloorChanged(s.floorAdjustment, value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:815:13\n    │\n815 │             emit TargetChanged(s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:923:9\n    │\n923 │         emit TargetChanged(s.target);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:925:9\n    │\n925 │         emit Transfer(address(0), msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:926:9\n    │\n926 │         emit WorkerMinted(msg.sender, id, hash, s.overclocked[id], price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1007:9\n     │\n1007 │         emit IMDReward(amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1001:9\n     │\n1001 │         emit MintPayment(stakers, buybackShare, builders);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:561:9\n    │\n561 │         WorkerFinance.stake(s, id, lockDays);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkersNFT.sol:978:9\n    │\n978 │         emit Transfer(from, to, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1037:9\n     │\n1037 │         emit Staked(msg.sender, id, s.stakes[id].unlockAt, weight);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1038:9\n     │\n1038 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:565:9\n    │\n565 │         WorkerFinance.unstake(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1050:9\n     │\n1050 │         emit Unstaked(msg.sender, id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1051:9\n     │\n1051 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1061:9\n     │\n1061 │         emit IMDClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:584:9\n    │\n584 │         WorkerFinance.activate(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1076:9\n     │\n1076 │         emit Activated(id);\n     │         ━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1077:9\n     │\n1077 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1135:13\n     │\n1135 │             emit MetadataUpdate(ids[i]);\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1139:9\n     │\n1139 │         emit WorkClaimed(msg.sender, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:600:9\n    │\n600 │         WorkerFinance.burn(s, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1158:9\n     │\n1158 │         emit Transfer(msg.sender, address(0), id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1159:9\n     │\n1159 │         emit MetadataUpdate(id);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1160:9\n     │\n1160 │         emit WorkerBurned(msg.sender, id, s.burnReward);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1198:9\n     │\n1198 │         emit Buyback(amount, output);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ src/WorkersNFT.sol:625:9\n    │\n625 │         WorkerFinance.sweep(s, token);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n     ╭▸ src/WorkersNFT.sol:1249:9\n     │\n1249 │         emit Swept(token, amount);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkersNFT.sol:748:15\n    │\n748 │             ++digits;\n    │               ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:753:37\n    │\n753 │             text[--digits] = bytes1(uint8(48 + value % 10));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:302:29\n    │\n302 │         uint256 magnitude = uint256(amount < 0 ? -amount : amount);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkersNFT.sol:804:16\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\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/WorkersNFT.sol:804:24\n    │\n804 │         return uint256(int256(WorkerConstants.INITIAL_DIFFICULTY_BITS + epoch(s)) + s.floorAdjustment);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:303:25\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\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/WorkHook.sol:303:33\n    │\n303 │         if (magnitude > uint256(uint128(type(int128).max))) revert InvalidParameter();\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:833:13\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\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/WorkersNFT.sol:833:29\n    │\n833 │         if (steps >= 256 || s.target > (maximum >> steps)) return maximum;\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:321:71\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 0);\n    │                                                                       ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:311:9\n    │\n311 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:321:64\n    │\n321 │         return (this.beforeSwap.selector, BeforeSwapDelta.wrap(int256(fee << 128)), 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://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/WorkHook.sol:327:9\n    │\n327 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:335:36\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:335:80\n    │\n335 │         int128 imdDelta = imdIs0 ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkHook.sol:341:69\n    │\n341 │             if (fee != 0 && int256(imdDelta) != p.amountSpecified + int256(fee)) revert PartialSpecifiedSwap();\n    │                                                                     ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:344:33\n    │\n344 │             uint256 magnitude = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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/WorkHook.sol:348:42\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:348:49\n    │\n348 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/WorkHook.sol:355:13\n    │\n355 │         if (stakers != 0) {\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:360:9\n    │\n360 │         emit FeesDistributed(fee - stakers, stakers);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:366:13\n    │\n366 │         if (block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:364:46\n    │\n364 │         tickCumulative += int256(lastTick) * int256(block.timestamp - lastObservationTime);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkHook.sol:375:13\n    │\n375 │             block.timestamp - newerObservation.timestamp >= ORACLE_WINDOW ? newerObservation : olderObservation;\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/WorkHook.sol:376:29\n    │\n376 │         if (!initialized || block.timestamp - start.timestamp < ORACLE_WINDOW) revert OracleNotReady();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:377:26\n    │\n377 │         int256 elapsed = int256(block.timestamp - start.timestamp);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:379:49\n    │\n379 │             tickCumulative + int256(lastTick) * int256(block.timestamp - lastObservationTime) - start.cumulative;\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/WorkHook.sol:382:16\n    │\n382 │         return int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkersNFT.sol:893:28\n    │\n893 │             s.mintEnded || (block.timestamp < s.pauseUntil) || s.minted >= s.cap || !s.poolsFunded\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/WorkersNFT.sol:915:17\n    │\n915 │             if (elapsed < 20) elapsed = 20;\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/WorkersNFT.sol:916:17\n    │\n916 │             if (elapsed > 320) elapsed = 320;\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/WorkHook.sol:404:26\n    │\n404 │             (bool ok,) = BUILDERS.call{value: amount}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/WorkHook.sol:410:9\n    │\n410 │         emit Swept(token, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1033:54\n     │\n1033 │         s.stakes[id] = WorkerState.Stake(msg.sender, uint64(block.timestamp + lockDays * 1 days), weight);\n     │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1044:13\n     │\n1044 │         if (block.timestamp < position.unlockAt) revert Locked();\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/WorkersNFT.sol:1100:23\n     │\n1100 │         uint256 end = block.timestamp < s.pauseUntil ? block.timestamp : s.pauseUntil;\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/WorkersNFT.sol:1101:13\n     │\n1101 │         if (end > start) amount -= scheduledEmission(s, end) - scheduledEmission(s, start);\n     │             ━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1254:30\n     │\n1254 │         if (h == address(0)) revert InvalidToken();\n     │                              ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n     ╭▸ src/WorkersNFT.sol:1133:58\n     │\n1133 │             if (_beneficiaryOf(s, ids[i]) != msg.sender) revert Unauthorized();\n     │                                                          ━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/WorkersNFT.sol:1181:13\n     │\n1181 │         if (block.timestamp > deadline) revert InvalidParameter();\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/WorkersNFT.sol:1188:47\n     │\n1188 │                 || (s.lastBuybackTime != 0 && block.timestamp < s.lastBuybackTime + 60)\n     │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1211:22\n     │\n1211 │                     -int256(amount),\n     │                      ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1216:37\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1216:81\n     │\n1216 │         int128 input = zeroForOne ? int128(BalanceDelta.unwrap(delta) >> 128) : int128(BalanceDelta.unwrap(delta));\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/WorkersNFT.sol:1217:38\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1217:75\n     │\n1217 │         int128 output = zeroForOne ? int128(BalanceDelta.unwrap(delta)) : int128(BalanceDelta.unwrap(delta) >> 128);\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/WorkersNFT.sol:1218:31\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                               ━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'int256' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1218:64\n     │\n1218 │         if (int256(input) != -int256(amount) || output <= 0 || uint128(output) < minWork) revert SwapFailed();\n     │                                                                ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1223:66\n     │\n1223 │         s.poolManager.take(Currency.wrap(s.work), address(this), uint128(output));\n     │                                                                  ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1224:13\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1224:76\n     │\n1224 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance + uint128(output)) revert SwapFailed();\n     │                                                                            ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1225:33\n     │\n1225 │         IERC20Work(s.work).burn(uint128(output));\n     │                                 ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n     ╭▸ src/WorkersNFT.sol:1226:13\n     │\n1226 │         if (IERC20Work(s.work).balanceOf(address(this)) != beforeBalance) revert SwapFailed();\n     │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/WorkersNFT.sol:1227:27\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\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/WorkersNFT.sol:1227:35\n     │\n1227 │         return abi.encode(uint256(uint128(output)));\n     │                                   ━━━━━━━━━━━━━━━\n     │\n     ├ note: consider disabling this lint if you're certain the cast is safe\n     │       \n     │       // casting to 'uint128' is safe because [explain why]\n     │       // forge-lint: disable-next-line(unsafe-typecast)\n     │       \n     │       \n     ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":51,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\nWarning: No tests found in project! Forge looks for functions that start with `test`\n","passed":true},{"durationMs":29,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Work.approve(address,uint256)\",\"Work.burn(uint256)\",\"Work.distributeLaunch(address,address)\",\"Work.transfer(address,uint256)\",\"Work.transferFrom(address,address,uint256)\",\"WorkHook.acceptOwnership()\",\"WorkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"WorkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WorkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WorkHook.receive()\",\"WorkHook.setFeeBps(uint16)\",\"WorkHook.setStakerShareBps(uint16)\",\"WorkHook.sweep(address)\",\"WorkHook.transferOwnership(address)\",\"WorkersNFT.acceptOwnership()\",\"WorkersNFT.activate(uint256)\",\"WorkersNFT.approve(address,uint256)\",\"WorkersNFT.burn(uint256)\",\"WorkersNFT.buyback()\",\"WorkersNFT.buyback(uint256,uint256,uint256)\",\"WorkersNFT.claimIMD()\",\"WorkersNFT.claimWork(uint256[])\",\"WorkersNFT.endMint()\",\"WorkersNFT.fundPools()\",\"WorkersNFT.mint(uint256,uint256)\",\"WorkersNFT.mintWithPermit(uint256,uint256,uint256,uint8,bytes32,bytes32)\",\"WorkersNFT.notifyHookReward(uint256)\",\"WorkersNFT.pause()\",\"WorkersNFT.receive()\",\"WorkersNFT.safeTransferFrom(address,address,uint256)\",\"WorkersNFT.safeTransferFrom(address,address,uint256,bytes)\",\"WorkersNFT.setActivationFee(uint256)\",\"WorkersNFT.setApprovalForAll(address,bool)\",\"WorkersNFT.setBaseURI(string)\",\"WorkersNFT.setCap(uint256)\",\"WorkersNFT.setFloorAdjustment(int8)\",\"WorkersNFT.setHook(address)\",\"WorkersNFT.setPriceScaleBps(uint16)\",\"WorkersNFT.setRoyaltyBps(uint16)\",\"WorkersNFT.stake(uint256,uint256)\",\"WorkersNFT.sweep(address)\",\"WorkersNFT.transferFrom(address,address,uint256)\",\"WorkersNFT.transferOwnership(address)\",\"WorkersNFT.unlockCallback(bytes)\",\"WorkersNFT.unpause()\",\"WorkersNFT.unstake(uint256)\"],\"files\":{\"src/WorkHook.sol\":580,\"src/WorkersNFT.sol\":1261},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":330,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":470,"exitCode":0,"name":"aderyn","output":"[high] arbitrary-transfer-from at src/WorkersNFT.sol:417: Arbitrary `from` Passed to `transferFrom` (2 places)\n[high] contract-locks-ether at src/WorkersNFT.sol:120: Contract locks Ether without a withdraw function\n[high] incorrect-caret-operator at src/WorkHook.sol:500: Incorrect use of caret operator\n[high] incorrect-shift-order at src/WorkHook.sol:545: Incorrect Assembly Shift Parameter Order (3 places)\n[high] reentrancy-state-change at src/WorkHook.sol:233: Reentrancy: State change after external call (8 places)\n[high] unsafe-casting at src/WorkHook.sol:382: Unsafe Casting of integers\n[low] centralization-risk at src/WorkHook.sol:104: Centralization Risk (13 places)\n[low] empty-require-revert at src/WorkHook.sol:448: Empty `require()` / `revert()` Statement (2 places)\n[low] large-numeric-literal at src/WorkHook.sol:125: Large Numeric Literal (22 places)\n[low] literal-instead-of-constant at src/WorkHook.sol:265: Literal Instead of Constant (61 places)\n[low] missing-inheritance at src/WorkHook.sol:121: Missing Inheritance\n[low] non-reentrant-not-first at src/WorkHook.sol:311: `nonReentrant` is Not the First Modifier (2 places)\n[low] state-change-without-event at src/WorkHook.sol:270: State Change Without Event (13 places)\n[low] unchecked-return at src/WorkersNFT.sol:683: Unchecked Return (3 places)\n[low] uninitialized-local-variable at src/WorkersNFT.sol:1083: Uninitialized Local Variable (2 places)\n[low] unsafe-erc20-operation at src/WorkHook.sol:61: Unsafe ERC20 Operation (3 places)\n[low] unused-error at src/WorkersNFT.sol:164: Unused Error (6 places)\n[low] unused-public-function at src/WorkersNFT.sol:396: Public Function Not Used Internally (46 places)\n[low] unused-state-variable at src/WorkersNFT.sol:131: Unused State Variable","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"dde6b3c8128180977d4b3f888cf2f310bccc2f0406eceeb32eeefa7e162469e7","verifiedTreeHash":"6297c45fcbbe2dcb2f279fd0e241fd57e16e7410","verifierVersion":"0.1.0+be003835"}]}