{"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":"abea5e14-4681-4e2c-9e23-e2081557514d","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"834eee79e2131bd255188b7bbb8d639dddea8d200d32c4bd9f1f10cbc6bcad85","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"accepted"}],"objective":"SOURCE-ONLY Foundry prototype. GitHub contracts/tests/docs; NO deployment. ALL values/assets/wallets are LOCAL FIXTURES, not launch decisions.\n\nToken name: IMDAO\nToken symbol: IMDAO\nTotal supply: 1,000,000 whole IMDAO, 18 decimals.\nMinting after launch: None; fixture mint/distribution/delegation to multiple voters, valueless liquidity.\nTransfer rules: OpenZeppelin ERC20Votes, block-number checkpoints; no tax/rebase/blacklist/pause/later mint.\nWhat each contract does: IMDAO/mock IMD Votes, restricted governor/timelock, v4 hook, treasury/recipient registry, V1/V2 policies, mock oracle.\nWho can call what: Anyone swaps/removes own liquidity; delegates propose/vote; governor queues/cancels; open execution. Timelock alone authorizes payout/enrollment/policy/oracle. Guardian ONLY suspends recipients. No admin/AI bypass.\nNumbers the contracts enforce: Fee/cap 25 bps additional to LP fee. Development/reserve V1 80/20, V2 60/40. Proposal threshold 10,000 base IMDAO at prior block; vote delay 1 block, duration 100 blocks; quorum 40,000 unboosted IMDAO FOR+ABSTAIN; weighted FOR>AGAINST. Timelock 3600 seconds. Per asset, lifetime gross payout caps: 10,000 whole units/recipient, 100,000 globally. One action/proposal. Oracle one pending, 3600-second timeout, zero payment.\nUpgrades and pausing: Only policy/recipient changes. No proxy/other upgrade/delegatecall/arbitrary call/trading pause. Suspension blocks payouts only. Token/hook/treasury/PoolId fixed.\nOutside services and values: Real local Uniswap v4 PoolManager/router; IMDAO/mock ERC20 pair, both 18 decimals. Separate mock IMD Votes: 18 decimals, not treasury asset. Fixture guardian; no live API/IMD/keys/ETH.\n\nVOTING\nSame past proposal snapshot: C=IMDAO.getPastVotes, I=mockIMD.getPastVotes; weight=C+min(floor(C/4),I). 18-decimal units; max 25% bonus, IMD alone zero. Threshold/quorum use C; base/weighted tallies separate. Both delegated; one vote/delegate/proposal, no current balances. Immutable fixture formula; delegated IMD power, NOT verified live holdings. Production checkpoints/escrow/chain/decimals/borrowing risk unresolved.\n\nAUTHORITY\nProposal binds fixed target, zero value, canonical calldata and descriptionHash of frozen purpose/text/source links. ONLY allow hook.activatePolicy(candidate,codeHash), treasury.setRecipient(recipient,expectedVersion,enabled,metadataHash), treasury.pay(paymentId,asset,bucket,recipient,version,amount,purposeHash), oracle.request(questionHash). Reject other targets/selectors, batches, malformed/trailing data, timelock self-calls/role/delay changes. Governor sole proposer/canceller; execution open; timelock sole admin; remove bootstrap roles. Freeze/verify wiring; no reinitialization/cyclic constructors. Social/oracle confer no votes. Expose proposal/snapshot/deadline/tally/state events/views. Original proposer may cancel any unexecuted proposal. Direct timelock execution and governor wrappers share all checks/accounting.\n\nRECIPIENTS\nStart unapproved. Timelocked setRecipient requires current expectedVersion; each change increments version, clears acceptance and binds operator/purpose metadataHash. Enable creates PendingAcceptance; only recipient may accept current version to become Active. Disable blocks on execution. Guardian suspend increments version/blocks immediately; no enable/spend powers. Re-enable requires fresh governance/acceptance; stale enrollment proposals fail version check. Payment proposal/queue/execution require Active matching version, nonzero non-system recipient. Enroll BEFORE payment proposal; replacements need fresh enrollment, never edit payouts. Allowlisting proves no honesty/signer continuity; real operator/multisig verification deferred.\n\nFEES\nAuthenticate manager/PoolId. afterSwap return-delta surcharge=floor(abs(unspecified delta)*25/10000), paid in unspecified currency. Prove signs/currency/slippage in both directions, exact-input/output. NOT verified IMD creator fees. manager.take sends settled cash to immutable treasury; hook alone credits exact receipt, never estimates/ERC6909 claims. Insufficient manager cash reverts; disclose limitation. development=floor(receipt*developmentBps/10000), remainder reserve; policy affects future FEES only. Raw transfers=unallocated surplus, not spendable income. No conversion/sweep/LP-principal claim.\n\nPAYOUTS\nPositive amount, supported asset/bucket, purpose hash. Nonzero paymentId binds one proposal forever. Queue atomically reserves asset/bucket cash AND recipient/global cap capacity and schedules timelock. Enforce grossPaid+reserved<=cap per asset across ALL buckets. No cap reset/netting on returns or re-enrollment, no cross-asset valuation. Record readyAt, expiresAt=readyAt+604800 seconds. Timelock alone pays exact reserved tuple at readyAt<=now<expiresAt; recheck recipient version/status. Consume bucket/reservation, increase gross paid, transfer once. Failure rolls back for retry/cancel. Each milestone needs a vote.\nGovernor cancellation atomically cancels timelock/releases cash/cap reservations. Anyone can cancel queued payment if expired OR recipient version/status invalid; proposer may cancel earlier. No loops/replay. Target enforces expiry/status on direct execution. Nonpayments have no expiry.\n\nBUSINESS RETURNS\nreturnUnspent(paymentId,amount,evidenceHash) and depositProceeds(paymentId,amount,evidenceHash): only original recipient of PAID payment, even if suspended. Pull positive amount of original payment asset from caller; credit exact receipt to original bucket. Cumulative returns<=original payout; proceeds uncapped, separate ledger. Unique receipt IDs/evidence hashes. Returns are recipient-declared; proceeds NOT audited profit. Never reduce gross cap usage/rewrite payments. Recipient approvals INTO treasury allowed, treasury approvals OUT forbidden. Donations stay surplus. No clawback/business/fiat/tax automation.\n\nACCOUNTING\nPer asset: fees+returns+proceeds-grossPayments=development+reserve. Reservations INCLUDED in buckets, not extra liabilities; reserved<=bucket; cash>=buckets, excess=surplus. Solvency and exact sender debit AND recipient credit on every movement; SafeERC20, CEI, reentrancy protection, atomic rollback. No unsupported tokens.\nV1/V2 direct pure non-proxy policies, no mutable/external dependencies: pin both runtime hashes; activation verifies code/hash. Two weights sum to 10000; STATICCALL 30000 gas, bounded copying, exactly 64 bytes; invalid uses built-in 80/20. Cannot raise fees/redirect custody/alter old balances.\n\nORACLE MOCK\nTimelock-only request with nonce/chain/consumer/question-bound ID; Pending/Answered/Expired; unanswered=UNKNOWN. Immutable delivery authenticates fixture responder; fixed-size boolean envelope, matching request/domain/question, Pending and now<expiry. Anyone expires at now>=expiry. Reject forged/malformed/duplicate/late answers; retries need fresh governance. Callback records evidence only, no spending/upgrades/calls; never in swap/LP paths. Not live IMD/truth proof.\n\nDELIVER/VERIFY\nOrder: governance/registry/treasury, fees/payouts/returns, policies/oracle. src/, test/, README: ABIs/roles/states/fixtures/invariants/limitations/commands. Pin dependencies/solc=0.8.26/EVM. No FFI/filesystem/env/network cheatcodes. Run forge fmt --check, forge build, forge test; report results/static-analysis availability. Unit/fuzz/invariants: four real-manager swap cases, hook permissions/LP exits, unauthorized/bootstrap routes, snapshots/redelegation/bonus/quorum/double votes, enrollment/version races/suspension, cross-bucket caps, queue/cancel/expiry/direct-execution boundaries, failed transfer/retry/replay, returns/re-spend/cap persistence, proceeds/surplus/conservation, reentrancy/nonstandard tokens, policy/oracle faults. Freeze commit for independent review. No public deploy/sign/fund, website/imports/dispatch/buybacks/rewards. Document live IMD/fee/hook/oracle gaps, production voting/budget/guardian/multisig/migration gates. No launch-ready claims.","parentJobId":null,"planHash":"91a24c41beb0dde43692b98abed43f7169680eb2e7ae27c3a13d7ba6db90e02a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"abea5e14-4681-4e2c-9e23-e2081557514d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-968-imdao"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51727","feedbackHash":"f321841751b595078826414dcaaf7cc112565dc1e1da02dde211439beb0e996c","nodeKey":"build_contract_project","submissionHash":"6854fd6153cb136c2c3cb9180f066f71fd9751ff2e931b9532529d18df722c24","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51496","feedbackHash":"89f67e0836b1bf7f47ade29c98c46d13d27602a402731dd0530c946b32916712","nodeKey":"build_contract_project","submissionHash":"834eee79e2131bd255188b7bbb8d639dddea8d200d32c4bd9f1f10cbc6bcad85","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"577553689bc73d118fb0d7fd72975d506cefcfb621254f687d9728dddd3bc2b3","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"7aa97cf622a23d5f19a5020910585dc303d12a65457b71b010c693fe01935ea4","device":"6e1819675bb7567a","findings":[],"hash":"6854fd6153cb136c2c3cb9180f066f71fd9751ff2e931b9532529d18df722c24","nodeId":"6b6bbe49-056b-4d30-b992-a502b33635e0","outcome":"completed","summary":"Implemented the source-only prototype with vendored dependencies, ABIs, tests, and [documentation](/root/nft4/.identitymd/work/abea5e14-4681-4e2c-9e23-e2081557514d/6b6bbe49-056b-4d30-b992-a502b33635e0/README.md).\n\n- `forge build` and `forge fmt --check`: pass.\n- `forge test`: **43 passing**, including fuzz and invariants. Offline run also passes.\n- Slither/Mythril unavailable. A cleared-environment check could not locate the compiler; documented in the verification report.\n\nNo deployment occurred. A SHA-256 review manifest freezes the deliverables; no Git commit was created because `.git/` changes are prohibited.","treeHash":"6dc44ddfc8334f07fc2ec67a1c80bd8b28a260e4","usage":{"cachedInputTokens":3818496,"inputTokens":145272,"model":"gpt-6-astra","outputTokens":57575,"runtime":"codex","turns":9,"wallClockMs":1817925}},{"artifacts":[],"attempt":2,"bundleHash":"c5a87180bc7fd29b877c99e4417b18367461bb08c8fa0b0b7587cf8fa8981eac","device":"b3e0a28d5c3d1a63","findings":[],"hash":"834eee79e2131bd255188b7bbb8d639dddea8d200d32c4bd9f1f10cbc6bcad85","nodeId":"6b6bbe49-056b-4d30-b992-a502b33635e0","outcome":"completed","summary":"Implemented the source-only prototype, including caller-only router prefunding, vendored dependencies, ABIs, tests, and documentation.\n\n- `forge build`, `forge test`, and `forge fmt --check` pass with solc 0.8.26.\n- 58 test groups pass, including offline/parallel verification.\n- No high-severity Forge lint findings; remaining warnings documented. Slither/Mythril unavailable.\n- `REVIEW.sha256` freezes 155 files. No deployment or Git changes; creating the review commit remains with the contributor network because `.git/` was prohibited.","treeHash":"fd2332c7013e06b5b504a2c52835982c7fd5465c","usage":{"cachedInputTokens":3584768,"inputTokens":143469,"model":"gpt-6-astra","outputTokens":67780,"runtime":"codex","turns":13,"wallClockMs":2119548}}],"verification":[{"checks":[{"durationMs":83110,"exitCode":0,"name":"build","output":"Compiling 115 files with Solc 0.8.26\nSolc 0.8.26 finished in 82.94s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MockOracle.sol:72:17\n   │\n72 │         require(block.timestamp < r.expiresAt && evidence != bytes32(0), \"expired/evidence\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `bootstrap` is changed without an event but is used for access control\n   ╭▸ src/RestrictedTimelock.sol:44:9\n   │\n44 │         bootstrap = address(0);\n   │         ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MockOracle.sol:82:47\n   │\n82 │         require(r.status == Status.Pending && block.timestamp >= r.expiresAt, \"not expired\");\n   │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:123:38\n    │\n123 │         if (paymentId != bytes32(0)) treasury.bind(abi.decode(data[4:], (Treasury.Terms)), id);\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/FixtureRouter.sol:77:21\n   │\n77 │             require(uint256(-inputDelta) <= a.maxInput && uint256(outputDelta) >= a.minOutput, \"slippage\");\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/RestrictedGovernor.sol:124:9\n    │\n124 │         emit ProposalCreated(id, msg.sender, target, data, descriptionHash, description, p.snapshot, p.deadline);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/FixtureRouter.sol:77:59\n   │\n77 │             require(uint256(-inputDelta) <= a.maxInput && uint256(outputDelta) >= a.minOutput, \"slippage\");\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[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/RestrictedTimelock.sol:37:21\n   │\n37 │     function freeze(address governor_) external {\n   │                     ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/FixtureRouter.sol:82:13\n   │\n82 │             (delta,) = manager.modifyLiquidity(_key, a.liquidityParams, \"\");\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/RestrictedGovernor.sol:148:35\n    │\n148 │             (uint256 current,,) = treasury.recipients(recipient);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/RestrictedTimelock.sol:59:9\n   │\n59 │         IGovernorWiring(governor).validateAction(target, data);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/FeeHook.sol:61:29\n   │\n61 │     function activatePolicy(address candidate, bytes32 codeHash) external {\n   │                             ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-events-access-control]: `bootstrap` is changed without an event but is used for access control\n    ╭▸ src/Treasury.sol:125:9\n    │\n125 │         bootstrap = address(0);\n    │         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/RestrictedTimelock.sol:90:13\n   │\n90 │             FeeHook(target).activatePolicy(candidate, hash);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:198:40\n    │\n198 │         if (p.paymentId != bytes32(0)) treasury.reserve(p.paymentId, id, block.timestamp + 3600);\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/RestrictedTimelock.sol:94:13\n   │\n94 │             Treasury(target).setRecipient(recipient, version, enabled, metadata);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/RestrictedTimelock.sol:97:13\n   │\n97 │             Treasury(target).pay(t.paymentId, t.asset, t.bucket, t.recipient, t.version, t.amount, t.purposeHash);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedTimelock.sol:100:13\n    │\n100 │             MockOracle(target).request(abi.decode(args, (bytes32)));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:199:9\n    │\n199 │         timelock.schedule(id, p.target, p.data);\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/RestrictedTimelock.sol:75:34\n   │\n75 │         require(o.readyAt > 0 && block.timestamp >= o.readyAt && !o.done && !o.cancelled, \"operation state/time\");\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/RestrictedGovernor.sol:200:9\n    │\n200 │         emit ProposalQueued(id, block.timestamp + 3600);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/RestrictedGovernor.sol:196:9\n    │\n196 │         this.validateAction(p.target, p.data);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-events-access-control]: `system` is changed without an event but is used for access control\n    ╭▸ src/Treasury.sol:128:9\n    │\n128 │         system[timelock] = true;\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/RestrictedTimelock.sol:79:9\n   │\n79 │         emit Executed(id);\n   │         ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/RestrictedTimelock.sol:76:9\n   │\n76 │         IGovernorWiring(governor).validateAction(o.target, o.data);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:217:23\n    │\n217 │         if (p.queued) timelock.cancel(id);\n    │                       ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:218:40\n    │\n218 │         if (p.paymentId != bytes32(0)) treasury.cancel(p.paymentId);\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/RestrictedGovernor.sol:219:9\n    │\n219 │         emit ProposalCancelled(id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/Treasury.sol:98:85\n   │\n98 │     constructor(address timelock_, address guardian_, address manager_, address a0, address a1) {\n   │                                                                                     ━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/FeeHook.sol:96:13\n   │\n96 │             emit Surcharge(asset, fee, unspecified);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/FeeHook.sol:86:29\n   │\n86 │         uint256 magnitude = uint256(unspecified < 0 ? -int256(unspecified) : int256(unspecified));\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/FeeHook.sol:98:44\n   │\n98 │         return (IHooks.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/FeeHook.sol:98:51\n   │\n98 │         return (IHooks.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[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:111:40\n    │\n111 │     function freeze(address governor_, address hook_, address router) external {\n    │                                        ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:111:21\n    │\n111 │     function freeze(address governor_, address hook_, address router) external {\n    │                     ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n   ╭▸ src/FixtureRouter.sol:97:13\n   │\n97 │             token.safeTransferFrom(sender, address(manager), amount);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/FixtureRouter.sol:92:26\n   │\n92 │         uint256 amount = uint256(delta < 0 ? -int256(delta) : int256(delta));\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:100:17\n    │\n100 │                 token.balanceOf(sender) + amount == userBefore\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:101:24\n    │\n101 │                     && token.balanceOf(address(manager)) == managerBefore + amount,\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:107:17\n    │\n107 │                 token.balanceOf(sender) == userBefore + amount\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:108:24\n    │\n108 │                     && token.balanceOf(address(manager)) + amount == managerBefore,\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/RestrictedTimelock.sol:100:13\n    │\n100 │             MockOracle(target).request(abi.decode(args, (bytes32)));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/Treasury.sol:220:93\n    │\n220 │     function reserve(bytes32 id, bytes32 proposalId, uint256 readyAt) external onlyGovernor nonReentrant {\n    │                                                                                             ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Treasury.sol:224:17\n    │\n224 │         require(readyAt == block.timestamp + 3600, \"readyAt\");\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/Treasury.sol:243:55\n    │\n243 │     function cancel(bytes32 id) external onlyGovernor nonReentrant {\n    │                                                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Treasury.sol:254:17\n    │\n254 │             && (block.timestamp >= p.expiresAt || !active(p.terms.recipient, p.terms.version));\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/Treasury.sol:265:29\n    │\n265 │     ) external onlyTimelock nonReentrant {\n    │                             ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Treasury.sol:270:17\n    │\n270 │         require(block.timestamp >= p.readyAt && block.timestamp < p.expiresAt, \"payment window\");\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/Treasury.sol:270:49\n    │\n270 │         require(block.timestamp >= p.readyAt && block.timestamp < p.expiresAt, \"payment window\");\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:282:13\n    │\n282 │             IERC20(asset).balanceOf(address(this)) + amount == beforeSender\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:283:20\n    │\n283 │                 && IERC20(asset).balanceOf(recipient) == beforeRecipient + amount,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:298:13\n    │\n298 │             IERC20(asset).balanceOf(address(this)) == treasuryBefore + amount\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:299:20\n    │\n299 │                 && IERC20(asset).balanceOf(manager) + amount == managerBefore,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:343:13\n    │\n343 │             IERC20(t.asset).balanceOf(msg.sender) + amount == beforeSender\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:344:20\n    │\n344 │                 && IERC20(t.asset).balanceOf(address(this)) == beforeTreasury + amount,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\n","passed":true},{"durationMs":1204,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/PolicyOracle.t.sol:PolicyReaderTest\n[PASS] test_faultsFallbackAndBoundedGas() (gas: 1511219)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 526.56µs (339.00µs CPU time)\n\nRan 4 tests for test/TokenFaults.t.sol:TokenFaultsTest\n[PASS] test_failedTransfersRollbackReservationsAndTimelockThenRetry() (gas: 3400497)\n[PASS] test_feeReceiptRejectsRecipientTaxSenderTaxAndFalseTransfers() (gas: 802236)\n[PASS] test_recipientCannotReenterPaidPaymentDuringTransfer() (gas: 3084145)\n[PASS] test_safeERC20NoReturnTokenAndReceiptFailuresRollback() (gas: 3043864)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 25.22ms (4.11ms CPU time)\n\nRan 10 tests for test/Governance.t.sol:GovernanceTest\n[PASS] testFuzz_weightFormula(uint96,uint96) (runs: 256, μ: 348558, ~: 352096)\nLogs:\n  Bound result 162514264337593543791877\n  Bound result 746\n\n[PASS] test_bootstrapErasedAndAllUnauthorizedRoutes() (gas: 506880)\n[PASS] test_fixedSupplyClockAndNoMint() (gas: 69412)\n[PASS] test_proposerCancelsAllUnexecutedStatesAndNonpaymentNoExpiry() (gas: 1873435)\n[PASS] test_quorumUnboostedForPlusAbstainOnly() (gas: 1112966)\n[PASS] test_restrictedCanonicalSingleAction() (gas: 698288)\n[PASS] test_snapshotRedelegationBonusAndDoubleVote() (gas: 1086228)\n[PASS] test_thresholdUsesPriorBaseBlockAndDelegation() (gas: 837869)\n[PASS] test_voteDeadlineAndPermissionlessExecution() (gas: 1051972)\n[PASS] test_weightedMajorityCanDifferFromBase() (gas: 765400)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 26.74ms (13.79ms CPU time)\n\nRan 9 tests for test/Swaps.t.sol:SwapsTest\n[PASS] testFuzz_realManagerFourDirections(bool,bool,uint96) (runs: 256, μ: 1776984, ~: 1776189)\nLogs:\n  Bound result 999000000000000012870\n\n[PASS] test_authenticationPermissionsAndLPExit() (gas: 1282004)\n[PASS] test_insufficientSettledManagerCashRevertsAtomically() (gas: 229906)\n[PASS] test_realManagerExactInputOneForZero() (gas: 1770526)\n[PASS] test_realManagerExactInputZeroForOne() (gas: 1772760)\n[PASS] test_realManagerExactOutputOneForZero() (gas: 1767362)\n[PASS] test_realManagerExactOutputZeroForOne() (gas: 1775287)\n[PASS] test_slippageBothCurrenciesExactInputOutput() (gas: 4180170)\n[PASS] test_zeroRoundedFee() (gas: 225838)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 54.69ms (45.37ms CPU time)\n\nRan 6 tests for test/PolicyOracle.t.sol:PolicyOracleTest\n[PASS] test_oracleForgedMalformedWrongDomainAndQuestion() (gas: 1198723)\n[PASS] test_oracleNoVotesFundsOrAuthorityAndFalseIsAnAnswer() (gas: 1052115)\n[PASS] test_oracleSinglePendingTimeoutBoundaryAndFreshGovernanceRetry() (gas: 1977953)\n[PASS] test_policyActivationFutureFeesOnlyAndHashPinning() (gas: 1763853)\n[PASS] test_policyCodeChangeAfterQueueFailsExecution() (gas: 878241)\n[PASS] test_policyCodeFaultCannotChangeCustodyOrBlockSwap() (gas: 460198)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 68.64ms (6.17ms CPU time)\n\nRan 12 tests for test/Treasury.t.sol:TreasuryTest\n[PASS] testFuzz_returnConservation(uint96,uint96,uint96) (runs: 256, μ: 3094018, ~: 3111895)\nLogs:\n  Bound result 1519\n  Bound result 407\n  Bound result 1279016626365983785552\n\n[PASS] test_cashReservationCannotUseSurplusOrAnotherBucket() (gas: 6619259)\n[PASS] test_crossBucketReservationsCapAndCancel() (gas: 6694926)\n[PASS] test_disableInvalidatesQueuedPaymentOnlyWhenExecuted() (gas: 3441633)\n[PASS] test_enrollmentAcceptanceVersionAndSystemRecipients() (gas: 1459627)\n[PASS] test_expiryExclusiveAndAnyoneCleanupAtBoundary() (gas: 2939553)\n[PASS] test_globalLifetimeCapAcrossRecipientsBucketsAndIndependentAssets() (gas: 29344546)\n[PASS] test_invalidPaymentTermsAndPermanentIdBinding() (gas: 2734065)\n[PASS] test_queuePaymentReservesCashAndCapsAndDirectExecutionBoundary() (gas: 2973034)\n[PASS] test_returnsProceedsSurplusEvidenceAndLifetimeCapPersistence() (gas: 6838340)\n[PASS] test_staleEnrollmentCannotUndoGuardianAndFreshAcceptanceRequired() (gas: 2045119)\n[PASS] test_suspensionAtEachStageAndPublicCancellationReleases() (gas: 5829170)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 71.97ms (95.50ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:AccountingInvariantsTest\n[PASS] invariant_conservationSolvencyReservationsAndCaps() (runs: 64, calls: 3072, reverts: 0)\n\n╭-------------------+----------+-------+---------+----------╮\n| Contract          | Selector | Calls | Reverts | Discards |\n+===========================================================+\n| AccountingHandler | cancel   | 340   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | donate   | 351   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | elapse   | 362   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | enroll   | 336   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | execute  | 322   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | queue    | 327   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | receipts | 331   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | suspend  | 351   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | swap     | 352   | 0       | 0        |\n╰-------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 4556465094508370\n  Bound result 7\n  Bound result 990000002595376817\n  Bound result 2827\n  Bound result 990000000000000066\n  Bound result 14086\n  Bound result 16383\n  Bound result 100\n  Bound result 4421\n  Bound result 11038231843278\n  Bound result 588068\n  Bound result 1264811664\n  Bound result 4\n  Bound result 173581474011444135\n  Bound result 4837\n  Bound result 990000000000003858\n  Bound result 15348\n  Bound result 3309\n  Bound result 936181882258671946\n  Bound result 2114333237\n  Bound result 13467\n  Bound result 2835717308\n  Bound result 138234\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.09s (1.07s CPU time)\n\nRan 7 test suites in 1.10s (1.34s CPU time): 43 tests passed, 0 failed, 0 skipped (43 total tests)\n","passed":true},{"durationMs":93,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FeeHook.activatePolicy(address,bytes32)\",\"FeeHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FixtureRouter.modifyLiquidity((int24,int24,int256,bytes32))\",\"FixtureRouter.swap((bool,int256,uint160),uint256,uint256)\",\"FixtureRouter.unlockCallback(bytes)\",\"IMDAO.approve(address,uint256)\",\"IMDAO.delegate(address)\",\"IMDAO.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\",\"IMDAO.transfer(address,uint256)\",\"IMDAO.transferFrom(address,address,uint256)\",\"MockAsset.approve(address,uint256)\",\"MockAsset.transfer(address,uint256)\",\"MockAsset.transferFrom(address,address,uint256)\",\"MockDelivery.deliver(bytes)\",\"MockIMD.approve(address,uint256)\",\"MockIMD.delegate(address)\",\"MockIMD.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\",\"MockIMD.transfer(address,uint256)\",\"MockIMD.transferFrom(address,address,uint256)\",\"MockOracle.expire(bytes32)\",\"MockOracle.onAnswer(bytes)\",\"MockOracle.request(bytes32)\",\"RestrictedGovernor.cancel(bytes32)\",\"RestrictedGovernor.castVote(bytes32,uint8)\",\"RestrictedGovernor.execute(bytes32)\",\"RestrictedGovernor.propose(address,uint256,bytes,string)\",\"RestrictedGovernor.queue(bytes32)\",\"RestrictedTimelock.cancel(bytes32)\",\"RestrictedTimelock.execute(bytes32)\",\"RestrictedTimelock.freeze(address)\",\"RestrictedTimelock.schedule(bytes32,address,bytes)\",\"Treasury.accept(uint256)\",\"Treasury.bind((bytes32,address,uint8,address,uint256,uint256,bytes32),bytes32)\",\"Treasury.cancel(bytes32)\",\"Treasury.creditFee(address,uint256,uint256,uint256,uint256)\",\"Treasury.depositProceeds(bytes32,uint256,bytes32)\",\"Treasury.freeze(address,address,address)\",\"Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32)\",\"Treasury.reserve(bytes32,bytes32,uint256)\",\"Treasury.returnUnspent(bytes32,uint256,bytes32)\",\"Treasury.setRecipient(address,uint256,bool,bytes32)\",\"Treasury.suspend(address)\"],\"files\":{\".gitignore\":2,\"LICENSE\":23,\"README.md\":110,\"docs/DEPENDENCIES.md\":16,\"docs/INTERFACES.md\":59,\"docs/POLICY_HASHES.json\":16,\"docs/REVIEW.md\":35,\"docs/REVIEW_SHA256SUMS\":158,\"docs/VERIFICATION.md\":47,\"docs/abi/FeeHook.json\":407,\"docs/abi/FixtureRouter.json\":233,\"docs/abi/IMDAO.json\":780,\"docs/abi/MockAsset.json\":321,\"docs/abi/MockDelivery.json\":57,\"docs/abi/MockIMD.json\":780,\"docs/abi/MockOracle.json\":254,\"docs/abi/PolicyV1.json\":20,\"docs/abi/PolicyV2.json\":20,\"docs/abi/RestrictedGovernor.json\":594,\"docs/abi/RestrictedTimelock.json\":261,\"docs/abi/Treasury.json\":1114,\"docs/checks/forge-build.txt\":479,\"docs/checks/forge-test-offline.txt\":90,\"docs/checks/forge-test.txt\":90,\"foundry.toml\":21,\"src/FeeHook.sol\":100,\"src/FixtureRouter.sol\":113,\"src/MockOracle.sol\":92,\"src/Policies.sol\":37,\"src/RestrictedGovernor.sol\":221,\"src/RestrictedTimelock.sol\":103,\"src/Tokens.sol\":26,\"src/Treasury.sol\":363,\"src/Wiring.sol\":27,\"test/Governance.t.sol\":275,\"test/Invariants.t.sol\":229,\"test/PolicyOracle.t.sol\":236,\"test/Swaps.t.sol\":160,\"test/SystemFixture.sol\":196,\"test/TokenFaults.t.sol\":170,\"test/Treasury.t.sol\":339},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":9788,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/FixtureRouter.sol:89: FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112) uses arbitrary from in transferFrom: token.safeTransferFrom(sender,address(manager),amount) (src/FixtureRouter.sol#97)\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[high/medium] reentrancy-balance at src/FixtureRouter.sol:89: Reentrancy in FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112):\n[medium/high] incorrect-equality at src/FixtureRouter.sol:89: FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FixtureRouter.sol:89: FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:319: Treasury._receipt(bytes32,uint256,bytes32,bool) (src/Treasury.sol#319-349) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:220: Treasury.reserve(bytes32,bytes32,uint256) (src/Treasury.sol#220-241) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:291: Treasury.creditFee(address,uint256,uint256,uint256,uint256) (src/Treasury.sol#291-309) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/RestrictedTimelock.sol:56: RestrictedTimelock.schedule(bytes32,address,bytes) (src/RestrictedTimelock.sol#56-62) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:257: Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32) (src/Treasury.sol#257-288) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/FixtureRouter.sol:61: FixtureRouter.modifyLiquidity(IPoolManager.ModifyLiquidityParams).a (src/FixtureRouter.sol#61) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FixtureRouter.sol:47: FixtureRouter.swap(IPoolManager.SwapParams,uint256,uint256).a (src/FixtureRouter.sol#47) is a local variable never initialized\n[medium/medium] unused-return at src/RestrictedGovernor.sol:128: RestrictedGovernor.validateAction(address,bytes) (src/RestrictedGovernor.sol#128-161) ignores return value by (current,None,None) = treasury.recipients(recipient) (src/RestrictedGovernor.sol#148)\n[medium/medium] unused-return at src/FixtureRouter.sol:68: FixtureRouter.unlockCallback(bytes) (src/FixtureRouter.sol#68-87) ignores return value by (delta,None) = manager.modifyLiquidity(_key,a.liquidityParams,) (src/FixtureRouter.sol#82)\n[medium/medium] unused-return at src/RestrictedTimelock.sol:73: RestrictedTimelock.execute(bytes32) (src/RestrictedTimelock.sol#73-80) ignores return value by IGovernorWiring(governor).validateAction(o.target,o.data) (src/RestrictedTimelock.sol#76)\n[medium/medium] unused-return at src/RestrictedGovernor.sol:193: RestrictedGovernor.queue(bytes32) (src/RestrictedGovernor.sol#193-201) ignores return value by this.validateAction(p.target,p.data) (src/RestrictedGovernor.sol#196)\n[medium/medium] unused-return at src/RestrictedTimelock.sol:82: RestrictedTimelock._dispatch(address,bytes) (src/RestrictedTimelock.sol#82-102) ignores return value by MockOracle(target).request(abi.decode(args,(bytes32))) (src/RestrictedTimelock.sol#100)\n[medium/medium] unused-return at src/RestrictedTimelock.sol:56: RestrictedTimelock.schedule(bytes32,address,bytes) (src/RestrictedTimelock.sol#56-62) ignores return value by IGovernorWiring(governor).validateAction(target,data) (src/RestrictedTimelock.sol#59)\n[low/medium] missing-zero-check at src/Treasury.sol:111: Treasury.freeze(address,address,address).governor_ (src/Treasury.sol#111) lacks a zero-check on :\n[low/medium] timestamp at src/RestrictedTimelock.sol:64: RestrictedTimelock.cancel(bytes32) (src/RestrictedTimelock.sol#64-70) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedTimelock.sol:73: RestrictedTimelock.execute(bytes32) (src/RestrictedTimelock.sol#73-80) uses timestamp for comparisons\n[low/medium] timestamp at src/Treasury.sol:251: Treasury.publiclyCancellable(bytes32) (src/Treasury.sol#251-255) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedTimelock.sol:56: RestrictedTimelock.schedule(bytes32,address,bytes) (src/RestrictedTimelock.sol#56-62) uses timestamp for comparisons\n[low/medium] timestamp at src/MockOracle.sol:80: MockOracle.expire(bytes32) (src/MockOracle.sol#80-86) uses timestamp for comparisons\n[low/medium] timestamp at src/MockOracle.sol:64: MockOracle.onAnswer(bytes) (src/MockOracle.sol#64-78) uses timestamp for comparisons\n[low/medium] timestamp at src/Treasury.sol:220: Treasury.reserve(bytes32,bytes32,uint256) (src/Treasury.sol#220-241) uses timestamp for comparisons\n[low/medium] timestamp at src/Treasury.sol:257: Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32) (src/Treasury.sol#257-288) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/FixtureRouter.sol:89: FixtureRouter._settle(Currency,address,int128) (src/FixtureRouter.sol#89-112) uses arbitrary from in transferFrom: token.safeTransferFrom(sender,address(manager),amount) (src/FixtureRouter.sol#97)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"6854fd6153cb136c2c3cb9180f066f71fd9751ff2e931b9532529d18df722c24","verifiedTreeHash":"6dc44ddfc8334f07fc2ec67a1c80bd8b28a260e4","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":62892,"exitCode":0,"name":"build","output":"Compiling 118 files with Solc 0.8.26\nSolc 0.8.26 finished in 62.71s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/MockOracle.sol:60:17\n   │\n60 │     constructor(address timelock_, MockDelivery delivery_) {\n   │                 ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-events-access-control]: `systemAddress` is changed without an event but is used for access control\n    ╭▸ src/Treasury.sol:146:9\n    │\n146 │         systemAddress[governor_] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `bootstrap` is changed without an event but is used for access control\n    ╭▸ src/Treasury.sol:158:9\n    │\n158 │         bootstrap = address(0);\n    │         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/FeeHook.sol:37:60\n   │\n37 │     constructor(IPoolManager manager_, Treasury treasury_, address timelock_, uint24 lpFee, int24 tickSpacing) {\n   │                                                            ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MockOracle.sol:83:17\n   │\n83 │         require(block.timestamp < r.expiresAt, \"late answer\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:104:9\n    │\n104 │         address asset0_,\n    │         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:105:9\n    │\n105 │         address asset1_\n    │         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:101:9\n    │\n101 │         address timelock_,\n    │         ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MockOracle.sol:95:47\n   │\n95 │         require(r.status == Status.Pending && block.timestamp >= r.expiresAt, \"not expired\");\n   │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:103:9\n    │\n103 │         address manager_,\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/FeeHook.sol:90:29\n   │\n90 │     function activatePolicy(address candidate, bytes32 codeHash) external {\n   │                             ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeHook.sol:125:9\n    │\n125 │         emit Surcharge(poolId, asset, magnitude, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/FixtureRouter.sol:89:17\n   │\n89 │         require(token.balanceOf(msg.sender) + amount == beforeCaller, \"prefund debit\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/FixtureRouter.sol:90:17\n   │\n90 │         require(token.balanceOf(address(this)) == beforeRouter + amount, \"prefund credit\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/FixtureRouter.sol:99:17\n   │\n99 │         require(token.balanceOf(address(this)) == baseline, \"refund debit\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:100:17\n    │\n100 │         require(token.balanceOf(msg.sender) == beforeCaller + amount, \"refund credit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:135:40\n    │\n135 │     function freeze(address governor_, address hook_, address router_) external {\n    │                                        ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Treasury.sol:135:21\n    │\n135 │     function freeze(address governor_, address hook_, address router_) external {\n    │                     ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_budget0` is updated\n    ╭▸ src/FixtureRouter.sol:145:13\n    │\n145 │             manager.sync(currency);\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_budget0` is updated\n    ╭▸ src/FixtureRouter.sol:149:21\n    │\n149 │             require(manager.settle() == amount, \"settled amount\");\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/FixtureRouter.sol:124:13\n    │\n124 │             emit LiquidityFees(accrued);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:161:13\n    │\n161 │             treasury.bind(a, 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/RestrictedGovernor.sol:163:9\n    │\n163 │ ┏         emit ProposalCreated(\n164 │ ┃             id, msg.sender, target, data, descriptionHash, purpose, text, sources, p.snapshot, p.deadline\n165 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:147:21\n    │\n147 │             require(token.balanceOf(address(this)) + amount == beforeRouter, \"settle debit\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:148:21\n    │\n148 │             require(token.balanceOf(address(manager)) == beforeManager + amount, \"settle credit\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:155:21\n    │\n155 │             require(token.balanceOf(address(this)) == beforeRouter + amount, \"take credit\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FixtureRouter.sol:156:21\n    │\n156 │             require(token.balanceOf(address(manager)) + amount == beforeManager, \"take debit\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[missing-events-access-control]: `bootstrap` is changed without an event but is used for access control\n   ╭▸ src/RestrictedTimelock.sol:56:9\n   │\n56 │         bootstrap = address(0);\n   │         ━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:205:40\n    │\n205 │         if (p.paymentId != bytes32(0)) treasury.reserve(p.paymentId, id, readyAt);\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:206:31\n    │\n206 │         uint256 scheduledAt = timelock.schedule(id, p.target, p.data);\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/RestrictedGovernor.sol:207:17\n    │\n207 │         require(scheduledAt == readyAt, \"schedule mismatch\");\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/RestrictedGovernor.sol:208:9\n    │\n208 │         emit ProposalQueued(id, readyAt);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:222:32\n    │\n222 │         if (s == State.Queued) timelock.cancel(id);\n    │                                ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/RestrictedTimelock.sol:45:21\n   │\n45 │     function freeze(address governor_) external {\n   │                     ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedGovernor.sol:223:40\n    │\n223 │         if (p.paymentId != bytes32(0)) treasury.cancel(p.paymentId);\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/RestrictedGovernor.sol:224:9\n    │\n224 │         emit ProposalCancelled(id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedTimelock.sol:111:13\n    │\n111 │             FeeHook(target).activatePolicy(candidate, codeHash);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedTimelock.sol:115:13\n    │\n115 │             Treasury(target).setRecipient(recipient, version, enabled, metadata);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedTimelock.sol:118:13\n    │\n118 │             Treasury(target).pay(a.paymentId, a.asset, a.bucket, a.recipient, a.version, a.amount, a.purposeHash);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/RestrictedTimelock.sol:121:33\n    │\n121 │             bytes32 requestId = MockOracle(target).request(abi.decode(args, (bytes32)));\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/RestrictedTimelock.sol:94:59\n   │\n94 │         require(frozen && o.status == Status.Scheduled && block.timestamp >= o.readyAt, \"not ready\");\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/RestrictedTimelock.sol:98:9\n   │\n98 │         emit Executed(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/Treasury.sol:230:17\n    │\n230 │         require(readyAt >= block.timestamp + 3600, \"delay\");\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/RestrictedTimelock.sol:122:13\n    │\n122 │             emit OracleRequestCreated(id, requestId);\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/Treasury.sol:262:17\n    │\n262 │             && (block.timestamp >= p.expiresAt || !active(p.terms.recipient, p.terms.version));\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/Treasury.sol:280:17\n    │\n280 │         require(block.timestamp >= p.readyAt && block.timestamp < p.expiresAt, \"payment window\");\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/Treasury.sol:280:49\n    │\n280 │         require(block.timestamp >= p.readyAt && block.timestamp < p.expiresAt, \"payment window\");\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:291:17\n    │\n291 │         require(token.balanceOf(address(this)) + amount == senderBefore, \"sender debit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:292:17\n    │\n292 │         require(token.balanceOf(recipient) == receiverBefore + amount, \"recipient credit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Treasury.sol:314:9\n    │\n314 │         IHookWiring(hook).takeFee(asset, amount);\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/Treasury.sol:318:9\n    │\n318 │         emit FeeReceived(asset, amount, development, amount - development);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:315:17\n    │\n315 │         require(token.balanceOf(address(this)) == beforeCash + amount, \"fee credit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:316:17\n    │\n316 │         require(token.balanceOf(manager) + amount == beforeManager, \"fee debit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:353:17\n    │\n353 │         require(token.balanceOf(msg.sender) + amount == senderBefore, \"return debit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Treasury.sol:354:17\n    │\n354 │         require(token.balanceOf(address(this)) == beforeCash + amount, \"return credit\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\n","passed":true},{"durationMs":2271,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/OraclePolicies.t.sol:PolicyFaultsTest\n[PASS] testFuzz_policyWeightsValidation(uint256,uint256) (runs: 256, μ: 130709, ~: 130650)\n[PASS] test_boundedCopyStaticAndGasFallbacks() (gas: 875301)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.66ms (3.39ms CPU time)\n\nRan 1 test for test/OraclePolicies.t.sol:PolicyPinningTest\n[PASS] test_onlyExactPinnedRuntimeAndChangedCodeFallback() (gas: 1771937)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.83ms (917.73µs CPU time)\n\nRan 4 tests for test/OraclePolicies.t.sol:OracleTest\n[PASS] test_answerAtLastSecondAndNoVotingAuthority() (gas: 1034970)\n[PASS] test_authenticationMalformedEnvelopeAndDomainBinding() (gas: 1279614)\n[PASS] test_onePendingTimeoutBoundaryFreshGovernanceRetry() (gas: 2044543)\n[PASS] test_pendingUnknownNoPaymentNonceAndFalseAnswer() (gas: 1085673)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 9.27ms (2.58ms CPU time)\n\nRan 3 tests for test/RouterFaults.t.sol:RouterFaultsTest\n[PASS] testFuzz_badPrefundingRejectedAndVictimUntouched(uint8) (runs: 256, μ: 207610, ~: 191881)\nLogs:\n  Bound result 5\n\n[PASS] test_optionalNoReturnAssetWithRealManager() (gas: 942248)\n[PASS] test_reentryCannotStartSwapOrForgeManagerCallback() (gas: 1207363)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 19.20ms (12.91ms CPU time)\n\nRan 10 tests for test/TreasuryAccounting.t.sol:TreasuryAccountingTest\n[PASS] testFuzz_exactFeesRejectNonstandardMovements(uint8) (runs: 256, μ: 258784, ~: 266830)\nLogs:\n  Bound result 4\n\n[PASS] testFuzz_exactPayoutRejectsNonstandardMovements(uint8) (runs: 256, μ: 1072633, ~: 1089196)\nLogs:\n  Bound result 5\n\n[PASS] testFuzz_exactReturnsRejectNonstandardMovements(uint8) (runs: 256, μ: 1281105, ~: 1290033)\nLogs:\n  Bound result 3\n\n[PASS] test_crossBucketRecipientCapIncludesReservationsAndPaid() (gas: 2184128)\n[PASS] test_directTargetEnforcesTimeAndSuspension() (gas: 1317040)\n[PASS] test_globalCapAcrossRecipientsBucketsAndReservations() (gas: 7208414)\n[PASS] test_optionalNoReturnTokenSafeERC20AndReentrantPayoutBlocked() (gas: 1833591)\n[PASS] test_rawDonationsProceedsAndNoOutgoingApprovals() (gas: 1100566)\n[PASS] test_reservedTupleCannotChangeAnyField() (gas: 671930)\n[PASS] test_returnsAndReenrollmentNeverResetLifetimeCaps() (gas: 2016236)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 38.05ms (93.68ms CPU time)\n\nRan 13 tests for test/Payouts.t.sol:PayoutsTest\n[PASS] test_competingQueuesCannotDoubleReserveCash() (gas: 4709282)\n[PASS] test_disableTakesEffectAtExecutionAndReenrollNeverEditsPayout() (gas: 5248367)\n[PASS] test_enrollBeforeProposalAndOnlyRecipientAcceptsCurrentVersion() (gas: 1845978)\n[PASS] test_enrollmentRaceGuardianAndFreshAcceptance() (gas: 3072568)\n[PASS] test_executeAtLastSecondAndProposerCancelsBeforeReady() (gas: 4908935)\n[PASS] test_failedReceiptAllowanceRollsBackEvidenceForRetry() (gas: 3852161)\n[PASS] test_failedTransferRollsBackForRetryNoReplay() (gas: 3737117)\n[PASS] test_publicExpiryCancellationAndPaymentIdNeverReusable() (gas: 3936337)\n[PASS] test_queueFailureAtomicAndDonationsNotIncome() (gas: 3320279)\n[PASS] test_queueReservesCashAndCapsAndDirectExecutionAtReady() (gas: 3692395)\n[PASS] test_returnsProceedsEvidenceAndSuspendedRecipient() (gas: 6766056)\n[PASS] test_suspensionInvalidatesProposalQueueAndExecutionWithPublicRelease() (gas: 5396912)\n[PASS] test_zeroAndSystemRecipientsUnsupportedAssetBucketAndPurpose() (gas: 1526221)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 38.45ms (29.39ms CPU time)\n\nRan 11 tests for test/Fees.t.sol:FeesTest\n[PASS] testFuzz_swapAccounting(bool,bool,uint96) (runs: 256, μ: 638645, ~: 640061)\nLogs:\n  Bound result 471092\n\n[PASS] test_donationsStaySurplusAndRouterCannotSpendVictimAllowance() (gas: 946451)\n[PASS] test_hookPermissionsAuthenticationAndPoolFixed() (gas: 184288)\n[PASS] test_insufficientManagerCashRevertsAtomically() (gas: 590267)\n[PASS] test_lpOwnershipExitsAndSuspensionDoesNotPauseTrading() (gas: 1232817)\n[PASS] test_oneForZeroExactInput() (gas: 633418)\n[PASS] test_oneForZeroExactOutput() (gas: 630673)\n[PASS] test_policyChangesOnlyFutureFees() (gas: 2176154)\n[PASS] test_slippageAtomicityAllFourCases() (gas: 1645957)\n[PASS] test_zeroForOneExactInput() (gas: 635708)\n[PASS] test_zeroForOneExactOutput() (gas: 638273)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 49.86ms (50.73ms CPU time)\n\nRan 12 tests for test/Governance.t.sol:GovernanceTest\n[PASS] testFuzz_bonusUses18DecimalFlooredQuarter(uint96,uint96) (runs: 256, μ: 352742, ~: 354584)\nLogs:\n  Bound result 2265\n  Bound result 17104\n\n[PASS] test_againstExcludedAbstainIncludedAndWeightedMajority() (gas: 1293273)\n[PASS] test_bootstrapUnauthorizedAndNoAdminBypass() (gas: 346394)\n[PASS] test_canonicalActionsNoValueBatchesOrTimelockSelfCalls() (gas: 528068)\n[PASS] test_descriptionFrozenAndDuplicateProposalRejected() (gas: 365387)\n[PASS] test_nonpaymentNoExpiryOpenDirectExecutionAndCancellation() (gas: 1403979)\n[PASS] test_originalProposerCanCancelEvenAfterLosingVotes() (gas: 873880)\n[PASS] test_snapshotsRedelegationAndDoubleVotes() (gas: 1198885)\n[PASS] test_supplyDelegationClockAndNoMint() (gas: 83487)\n[PASS] test_thresholdPriorBlockAndImdAloneCannotPropose() (gas: 638590)\n[PASS] test_unboostedQuorumNotWeightedParticipation() (gas: 518594)\n[PASS] test_weightedTieFailsAndExactBaseQuorumSucceeds() (gas: 1362325)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 49.84ms (18.88ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:AccountingInvariantTest\n[PASS]\nAccountingInvariantTest invariants:\n[PASS] invariant_conservationSolvencyReservationsCapsAndSurplus\n[PASS] invariant_paymentHistoryCannotBeRewrittenOrOverReturned\n AccountingInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-------------------+----------+-------+---------+----------╮\n| Contract          | Selector | Calls | Reverts | Discards |\n+===========================================================+\n| AccountingHandler | cancel   | 556   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | donate   | 526   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | enroll   | 517   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | fee      | 472   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | pay      | 493   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | queue    | 521   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | receipt  | 509   | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| AccountingHandler | suspend  | 502   | 0       | 0        |\n╰-------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 11000000000000000000\n  Bound result 100000000000000000000\n  Bound result 7063\n  Bound result 32344148921761814736\n  Bound result 2731\n  Bound result 565880817472\n  Bound result 1749532374\n  Bound result 6980\n  Bound result 2612\n  Bound result 4675\n  Bound result 1743\n  Bound result 13363\n  Bound result 2052\n  Bound result 417\n  Bound result 3793\n  Bound result 3956\n  Bound result 9444\n  Bound result 2308568641749047981\n  Bound result 1735\n  Bound result 289\n  Bound result 219\n  Bound result 4016\n  Bound result 511251357961726244\n  Bound result 8132\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.50s (1.49s CPU time)\n\nRan 1 test for test/SwapInvariants.t.sol:SwapInvariantTest\n[PASS] invariant_realManagerFeesAreSettledCashAndRouterKeepsNoUserFunds() (runs: 64, calls: 4096, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| SwapHandler | swap     | 4096  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 9000000000350703343\n  Bound result 9000000000000006681\n  Bound result 9000000000000016986\n  Bound result 9000000000000004081\n  Bound result 9000000000000004141\n  Bound result 9000000000000006273\n  Bound result 9000000001376963489\n  Bound result 9000000004376301373\n  Bound result 9000000000000014057\n  Bound result 9000000032201268946\n  Bound result 1900918422793071251\n  Bound result 9000000000000000139\n  Bound result 9000000000000000584\n  Bound result 9000000000000002004\n  Bound result 9000000000000011795\n  Bound result 9000000003707953493\n  Bound result 9000000000000002280\n  Bound result 9000000000000001415\n  Bound result 9000227691743582413\n  Bound result 9000000000000002584\n  Bound result 9000000000000003708\n  Bound result 9000000001986657297\n  Bound result 9000000000002001921\n  Bound result 9000000001041089359\n  Bound result 9000000000000003489\n  Bound result 9000000000000003845\n  Bound result 9000000000000013501\n  Bound result 9000000000000004618\n  Bound result 9000000000000002571\n  Bound result 1000000000000000001\n  Bound result 9000000000000002837\n  Bound result 9329588325206441563\n  Bound result 9000000000000001944\n  Bound result 9000000000000065536\n  Bound result 9000000000000001776\n  Bound result 9000000000000014735\n  Bound result 9000000000264222801\n  Bound result 9000000225213830175\n  Bound result 9000000000000002217\n  Bound result 9000000000000017295\n  Bound result 9000000000000000507\n  Bound result 5421863015596745206\n  Bound result 1000000000000000003\n  Bound result 9000000000000004993\n  Bound result 9000000000000015956\n  Bound result 9000000000000000721\n  Bound result 9038858771434007985\n  Bound result 4187242112666072227\n  Bound result 2264337584740821167\n  Bound result 9000493372093057170\n  Bound result 9000000000000016685\n  Bound result 9000000000000013811\n  Bound result 9000000000000006691\n  Bound result 9000000709438150682\n  Bound result 9000000000000007323\n  Bound result 9000000000000000025\n  Bound result 9000000000000012861\n  Bound result 9000000000003082985\n  Bound result 9089279633880188712\n  Bound result 9000000000000013200\n  Bound result 9000000000000000418\n  Bound result 2264337584740821166\n  Bound result 9000000000000002536\n  Bound result 9000000000000007076\n  Bound result 5308989728213241409\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.09s (2.08s CPU time)\n\nRan 10 test suites in 2.09s (3.80s CPU time): 58 tests passed, 0 failed, 0 skipped (58 total tests)\n","passed":true},{"durationMs":89,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FeeHook.activatePolicy(address,bytes32)\",\"FeeHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FeeHook.takeFee(address,uint256)\",\"FixtureRouter.modifyLiquidity((int24,int24,int256,bytes32),uint256,uint256)\",\"FixtureRouter.swap((bool,int256,uint160),uint256,uint256)\",\"FixtureRouter.unlockCallback(bytes)\",\"IMDAO.approve(address,uint256)\",\"IMDAO.delegate(address)\",\"IMDAO.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\",\"IMDAO.transfer(address,uint256)\",\"IMDAO.transferFrom(address,address,uint256)\",\"MockAsset.approve(address,uint256)\",\"MockAsset.transfer(address,uint256)\",\"MockAsset.transferFrom(address,address,uint256)\",\"MockDelivery.deliver(address,bytes)\",\"MockIMD.approve(address,uint256)\",\"MockIMD.delegate(address)\",\"MockIMD.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\",\"MockIMD.transfer(address,uint256)\",\"MockIMD.transferFrom(address,address,uint256)\",\"MockOracle.expire(bytes32)\",\"MockOracle.onAnswer(bytes)\",\"MockOracle.request(bytes32)\",\"RestrictedGovernor.cancel(bytes32)\",\"RestrictedGovernor.castVote(bytes32,uint8)\",\"RestrictedGovernor.execute(bytes32)\",\"RestrictedGovernor.propose(address,uint256,bytes,string,string,string)\",\"RestrictedGovernor.queue(bytes32)\",\"RestrictedTimelock.cancel(bytes32)\",\"RestrictedTimelock.execute(bytes32)\",\"RestrictedTimelock.freeze(address)\",\"RestrictedTimelock.schedule(bytes32,address,bytes)\",\"Treasury.accept(uint256)\",\"Treasury.bind((bytes32,address,uint8,address,uint256,uint256,bytes32),bytes32)\",\"Treasury.cancel(bytes32)\",\"Treasury.creditFee(address,uint256,uint256)\",\"Treasury.depositProceeds(bytes32,uint256,bytes32)\",\"Treasury.freeze(address,address,address)\",\"Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32)\",\"Treasury.reserve(bytes32,bytes32,uint256)\",\"Treasury.returnUnspent(bytes32,uint256,bytes32)\",\"Treasury.setRecipient(address,uint256,bool,bytes32)\",\"Treasury.suspend(address)\"],\"files\":{\".gitignore\":3,\"LICENSE\":23,\"README.md\":203,\"REVIEW.sha256\":155,\"dependencies.lock.json\":157,\"docs/VERIFICATION.md\":55,\"docs/abi/FeeHook.json\":610,\"docs/abi/FixtureRouter.json\":200,\"docs/abi/IMDAO.json\":780,\"docs/abi/MockAsset.json\":321,\"docs/abi/MockDelivery.json\":44,\"docs/abi/MockIMD.json\":780,\"docs/abi/MockOracle.json\":254,\"docs/abi/PolicyV1.json\":20,\"docs/abi/PolicyV2.json\":20,\"docs/abi/README.md\":26,\"docs/abi/RestrictedGovernor.json\":600,\"docs/abi/RestrictedTimelock.json\":300,\"docs/abi/Treasury.json\":1257,\"foundry.toml\":20,\"remappings.txt\":4,\"src/FeeHook.sol\":136,\"src/FixtureRouter.sol\":159,\"src/IMDAO.sol\":29,\"src/Interfaces.sol\":38,\"src/MockOracle.sol\":100,\"src/Policies.sol\":34,\"src/RestrictedGovernor.sol\":226,\"src/RestrictedTimelock.sol\":125,\"src/Treasury.sol\":367,\"test/Fees.t.sol\":162,\"test/Governance.t.sol\":246,\"test/Invariants.t.sol\":211,\"test/OraclePolicies.t.sol\":257,\"test/Payouts.t.sol\":290,\"test/RouterFaults.t.sol\":59,\"test/SwapInvariants.t.sol\":55,\"test/TreasuryAccounting.t.sol\":259,\"test/helpers/Fixture.sol\":186,\"test/helpers/TreasuryHarness.sol\":162},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":10408,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/Treasury.sol:304: Reentrancy in Treasury.creditFee(address,uint256,uint256) (src/Treasury.sol#304-319):\n[high/medium] reentrancy-balance at src/Treasury.sol:304: Reentrancy in Treasury.creditFee(address,uint256,uint256) (src/Treasury.sol#304-319):\n[medium/high] incorrect-equality at src/Treasury.sol:329: Treasury._receipt(bytes32,uint256,bytes32,bool) (src/Treasury.sol#329-357) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:329: Treasury._receipt(bytes32,uint256,bytes32,bool) (src/Treasury.sol#329-357) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:304: Treasury.creditFee(address,uint256,uint256) (src/Treasury.sol#304-319) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/RestrictedGovernor.sol:200: RestrictedGovernor.queue(bytes32) (src/RestrictedGovernor.sol#200-209) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:265: Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32) (src/Treasury.sol#265-295) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:304: Treasury.creditFee(address,uint256,uint256) (src/Treasury.sol#304-319) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Treasury.sol:265: Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32) (src/Treasury.sol#265-295) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/RestrictedGovernor.sol:101: RestrictedGovernor.validateAction(address,bytes).canonical (src/RestrictedGovernor.sol#101) is a local variable never initialized\n[low/medium] missing-zero-check at src/FeeHook.sol:90: FeeHook.activatePolicy(address,bytes32).candidate (src/FeeHook.sol#90) lacks a zero-check on :\n[low/medium] missing-zero-check at src/FeeHook.sol:117: FeeHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes).asset (src/FeeHook.sol#117) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/FixtureRouter.sol:65: Reentrancy in FixtureRouter._run(FixtureRouter.Action,uint256,uint256) (src/FixtureRouter.sol#65-82):\n[low/medium] timestamp at src/Treasury.sol:227: Treasury.reserve(bytes32,bytes32,uint256) (src/Treasury.sol#227-249) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedTimelock.sol:85: RestrictedTimelock.cancel(bytes32) (src/RestrictedTimelock.sol#85-90) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedTimelock.sol:72: RestrictedTimelock.schedule(bytes32,address,bytes) (src/RestrictedTimelock.sol#72-83) uses timestamp for comparisons\n[low/medium] timestamp at src/Treasury.sol:259: Treasury.publiclyCancellable(bytes32) (src/Treasury.sol#259-263) uses timestamp for comparisons\n[low/medium] timestamp at src/Treasury.sol:265: Treasury.pay(bytes32,address,uint8,address,uint256,uint256,bytes32) (src/Treasury.sol#265-295) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedTimelock.sol:92: RestrictedTimelock.execute(bytes32) (src/RestrictedTimelock.sol#92-99) uses timestamp for comparisons\n[low/medium] timestamp at src/RestrictedGovernor.sol:200: RestrictedGovernor.queue(bytes32) (src/RestrictedGovernor.sol#200-209) uses timestamp for comparisons\n[low/medium] timestamp at src/MockOracle.sol:76: MockOracle.onAnswer(bytes) (src/MockOracle.sol#76-91) uses timestamp for comparisons\n[low/medium] timestamp at src/MockOracle.sol:93: MockOracle.expire(bytes32) (src/MockOracle.sol#93-99) uses timestamp for comparisons","passed":true},{"durationMs":885,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/FeeHook.sol:42: Reentrancy: State change after external call (28 places)\n[high] storage-array-memory-edit at src/RestrictedTimelock.sol:97: Storage Array Edited with Memory (2 places)\n[low] large-numeric-literal at src/FeeHook.sol:43: Large Numeric Literal (14 places)\n[low] literal-instead-of-constant at src/Policies.sol:31: Literal Instead of Constant (24 places)\n[low] missing-inheritance at src/MockOracle.sol:5: Missing Inheritance (2 places)\n[low] state-change-without-event at src/FeeHook.sol:130: State Change Without Event (3 places)\n[low] state-no-address-check at src/FeeHook.sol:93: Address State Variable Set Without Checks (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"834eee79e2131bd255188b7bbb8d639dddea8d200d32c4bd9f1f10cbc6bcad85","verifiedTreeHash":"fd2332c7013e06b5b504a2c52835982c7fd5465c","verifierVersion":"0.1.0+ad90ce4c"}]}