{"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":"c5590743-bb22-486c-8bc4-7316d094a329","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"9d25638fa7d8717ee052298665b524c23f39057196b49408c2c9d298d46d7e96","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"72aee3daa2299f205bab2e4519c457a9d4a1bc6e6530d2b4723fa33b361cb88f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"8135293945a25ec1bf58aa082a90d78e2f6c5e95285d253ddd2155d8f57c4b53","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"SIMD STRESS TEST. Goal: build, test and security-review a portfolio of 45 independent Solidity contracts in one Foundry project, and write a detailed analysis of each one. This is a capacity test: deliver as many contracts as you can to a high standard, in the listed order, and state clearly in the docs which ones are complete, partial or not started.\n\nContracts (name: required behaviour):\n1. LendingPool: over-collateralised lending of one ERC-20 against another, utilisation-based interest rate, liquidation with a 5% bonus.\n2. Vault4626: ERC-4626 yield vault with deposit cap, withdrawal queue and rounding that always favours the vault.\n3. StakingRewards: stake a token, earn a second token per second, reward rate set by owner for fixed periods.\n4. Governor: token-weighted proposals with quorum 4%, voting delay 1 day, voting period 3 days.\n5. Timelock: queue, execute and cancel calls after a minimum 2-day delay, admin handover in two steps.\n6. MultiSig: M-of-N owners, submit/confirm/revoke/execute, owner add/remove only via the multisig itself.\n7. DutchAuction: price falls linearly from start to floor over a set time, first buyer at current price wins, refunds excess ETH.\n8. NFTMarketplace: list ERC-721 for ETH, buy, cancel, 2.5% fee to treasury, pull-payment withdrawals.\n9. Vesting: linear vesting with cliff per beneficiary, revocable by owner with unvested tokens returned.\n10. Escrow: buyer deposits, seller delivers, buyer releases or arbiter resolves a dispute, timeout refund.\n11. Raffle: ticket sales in ETH, winner chosen from a commit-reveal seed supplied by the operator, prize claim.\n12. TokenBridgeLock: lock tokens with a nonce and emit an event; unlock only with a signature from a configured relayer set (no real bridge).\n13. PriceOracleAdapter: wraps a Chainlink-style feed, rejects stale (>1h) or non-positive answers, exposes 18-decimal price.\n14. ConstantProductAMM: x*y=k pair with 0.3% fee, add/remove liquidity with LP shares, minimum liquidity burn.\n15. FlashLender: ERC-3156 flash loans of a held token with a 0.09% fee, reentrancy guarded.\n16. InsurancePool: members pay premiums into a pool, owner-approved claims paid out up to coverage, cooldown on withdrawals.\n17. Crowdfund: goal and deadline, pledges refundable if goal missed, creator claims if met.\n18. DAOTreasury: holds ETH and ERC-20, spending only through the Governor via the Timelock.\n19. Subscription: monthly subscriptions paid in an ERC-20, keeper-triggered renewals, cancel anytime.\n20. PerpetualsLite: single-market isolated-margin perps with funding rate from the oracle adapter, liquidation at 80% margin used.\n21. StableSwap2: two-stablecoin curve-style pool with amplification coefficient and 0.04% fee.\n22. RevenueSplitter: splits incoming ETH and ERC-20 between payees by shares, pull-based release.\n23. Allowlist721: ERC-721 mint gated by a Merkle allowlist, max per wallet, owner can reveal base URI once.\n24. RateLimitedMinter: role-based ERC-20 minter with a per-day mint cap per minter.\n25. EmergencyPausableRegistry: registry of addresses to metadata with guardian pause, owner unpause, events on every change.\n26. SoulboundBadge: non-transferable ERC-721 badges issued and revoked by an issuer role.\n27. Permit2612Token: ERC-20 with EIP-2612 permit, owner-only mint up to the cap. Token name: SIMD Stress Token. Symbol: SST. Total supply cap: 1,000,000 SST with 18 decimals, none minted at deploy.\n28. BatchAirdrop: Merkle-proof airdrop claims with a deadline after which the owner can sweep unclaimed tokens.\n29. DCAVault: users deposit a stablecoin and a keeper swaps a fixed amount into ETH through the AMM each day.\n30. LimitOrderBook: on-chain limit orders for one token pair, partial fills, cancel and expiry.\n31. Bonding curve sale: linear bonding-curve token sale with buy and sell back to the curve and a 1% spread.\n32. ReferralRewards: tracks referrers on first deposit and pays a 1% referral reward from a funded pool.\n33. SavingsLock: lock ETH until a chosen date, early exit with a 10% penalty sent to a charity address.\n34. VotingEscrow: lock tokens for 1 week to 4 years for decaying voting power, extend lock or amount.\n35. GaugeController: VotingEscrow holders vote weekly on how rewards split between gauges.\n36. NameRegistry: first-come name registration for a yearly fee in ETH, renew, transfer, expiry with grace period.\n37. Tipping: send ETH tips with a message to a creator, creator withdraws, top-tipper leaderboard of 10.\n38. Lottery commit-reveal: players commit hashes, then reveal; the XOR of revealed secrets picks the winner, non-revealers forfeit.\n39. WrappedETH: minimal WETH: deposit, withdraw, ERC-20 transfers.\n40. CreditDelegation: a lender delegates borrowing power in the LendingPool to a trusted borrower with a limit.\n41. StreamingPayments: sender streams an ERC-20 to a recipient per second between start and end, recipient withdraws accrued, sender cancels and gets the rest.\n42. BountyBoard: post bounties in ETH, hunters submit a hash of their work, poster accepts one and pays, unclaimed bounties refundable after expiry.\n43. Whitelist sale: fixed-price ERC-20 sale for allowlisted buyers with per-wallet cap, hard cap and owner withdrawal after the sale ends.\n44. ProofOfAttendance: event organiser creates events; attendees claim one non-transferable badge per event with an organiser signature.\n45. KeeperRegistry: keepers register with a bond, perform upkeep for a fee, and lose part of the bond if a missed upkeep is reported and confirmed by the owner.\n\nRules for every contract:\n- Solidity ^0.8.24, OpenZeppelin where it helps, NatSpec on every external function, custom errors, events for every state change.\n- Checks-effects-interactions, reentrancy guards where value moves, no tx.origin, no unbounded loops over user-controlled arrays.\n- Owner or role powers kept minimal and listed in the docs.\n- Foundry tests: happy paths, reverts, and at least one fuzz or invariant test per contract.\n- Keep every contract independent unless the spec names another contract; where it does, use an interface so each file compiles alone.\n- Use safe ERC-20 transfers, handle fee-on-transfer tokens by measuring balances, and never assume 18 decimals.\n- Timestamps and block numbers may be manipulated slightly by validators; design deadlines with that in mind.\n- Prefer pull payments over pushing ETH to arbitrary addresses.\n- Every admin action emits an event and is listed in the docs with who can call it.\n\nAnalysis depth for docs/ANALYSIS.md, per contract (aim for 300 to 600 words each):\n- A one-paragraph plain-English description a non-developer can follow.\n- A table of roles and the functions each role can call.\n- The lifecycle: states, transitions and what triggers each one.\n- At least five concrete risks with a short attack or failure scenario each, the impact, and how the code prevents or limits it.\n- Gas notes: the most expensive function and why.\n- Test coverage: which behaviours the tests prove, and which are not covered.\n- Status: complete, partial (say what is missing) or not started.\n\nOrder of work: follow the list. If time or budget runs out, finish the current contract cleanly, then write the analysis and summary for everything done so far rather than leaving half-written files.\n\nRequired files:\n- src/<Name>.sol for each contract.\n- test/<Name>.t.sol for each contract.\n- docs/ANALYSIS.md with one section per contract: purpose, roles and permissions, state machine, trust assumptions, main risks (economic, access control, oracle, reentrancy, rounding, griefing), mitigations, test coverage summary, and a status line (complete / partial / not started).\n- docs/SUMMARY.md: a table of all contracts with status, lines of code, number of tests, and the top risk of each.\n\nDo not deploy anything. Do not add a front end.","parentJobId":null,"planHash":"896b7df24c28b3b81662d993fea1612052dad3a1ce8a46bc0454aeaa34009de9","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"c5590743-bb22-486c-8bc4-7316d094a329","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-933-simd-stress-test-goal"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52286","feedbackHash":"9740448532f013f3366e25da30153dec5949d34a934d9d7d777610053e5d6f39","nodeKey":"adversarial_review","submissionHash":"9d25638fa7d8717ee052298665b524c23f39057196b49408c2c9d298d46d7e96","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51196","feedbackHash":"13bf6336d6913ed2d58b5571223c94a2453633d089d09d3461521ad81a9114d0","nodeKey":"build_contract_project","submissionHash":"72aee3daa2299f205bab2e4519c457a9d4a1bc6e6530d2b4723fa33b361cb88f","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51094","feedbackHash":"35f2e3b4d80e966d88b6d14ad44a57cf7fa36d7a2f2042f4d9a5c1ea98fb8d44","nodeKey":"build_contract_project","submissionHash":"7865f5bcb03fec9b467372e9bd681ef665d9cd97afe874be2139b2b6ee7cbf9a","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"52273","feedbackHash":"22c84ce89d3ea2bc8f031456f08d78326fcafee4bf47e4c47fd8a8cf39cf024f","nodeKey":"write_foundry_tests","submissionHash":"8135293945a25ec1bf58aa082a90d78e2f6c5e95285d253ddd2155d8f57c4b53","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"b991e997daa122a2fb7a40a415875f84730cd52d84f0110144b54e4a2499a995","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"08161c67c5465bf3aaebc103d3fc4ad410667d0cc7f13430ca391c6ee466f3cb","device":"6f30d6341cbff249","findings":[],"hash":"72aee3daa2299f205bab2e4519c457a9d4a1bc6e6530d2b4723fa33b361cb88f","nodeId":"20b482fb-3580-4103-b5e3-d25dbea265ca","outcome":"completed","summary":"Implemented contracts **1–19**; **20–45 are not started**, with status and risks documented.\n\n- **118 tests pass**, including 1,024 runs per fuzz test.\n- `forge build`, `forge test`, and `forge fmt --check` pass.\n- Slither: **0 high findings**; remaining findings reviewed.\n- Dependencies vendored for offline builds. Nothing deployed.\n\nSee [SUMMARY.md](docs/SUMMARY.md), [ANALYSIS.md](docs/ANALYSIS.md), and [SECURITY_REVIEW.md](docs/SECURITY_REVIEW.md).","treeHash":"041cd35a5b1438da1a82861fe98b5c91451519ab","usage":{"cachedInputTokens":4259072,"inputTokens":149264,"model":"gpt-6-astra","outputTokens":85015,"runtime":"codex","turns":12,"wallClockMs":3350716}},{"artifacts":[],"attempt":1,"bundleHash":"d684f638f942439b5954c70cd045fa3624036c4350bbd9f93b98debbf9ff330f","device":"ea30e435c4dd5aff","findings":[],"hash":"7865f5bcb03fec9b467372e9bd681ef665d9cd97afe874be2139b2b6ee7cbf9a","nodeId":"20b482fb-3580-4103-b5e3-d25dbea265ca","outcome":"completed","summary":"Implemented contracts **1–19** with vendored dependencies, tests, and detailed security analysis. Contracts **20–45 are marked not started**.\n\n- **103 tests pass**, including 20 fuzz tests.\n- `forge build`, `forge test`, and `forge fmt --check` pass.\n- Offline testing with four threads passes.\n- No deployments performed.\n\nSee [SUMMARY.md](docs/SUMMARY.md), [ANALYSIS.md](docs/ANALYSIS.md), and [REVIEW.md](docs/REVIEW.md). Residual risks—including demonstrated operator bias in Raffle—are documented.","treeHash":"ebcef8aeb39326f8c7ed9d478ef797c3ee71bdac","usage":{"cachedInputTokens":2772992,"inputTokens":145964,"model":"gpt-6-astra","outputTokens":70399,"runtime":"codex","turns":14,"wallClockMs":1885729}},{"artifacts":[],"attempt":1,"bundleHash":"8c4fae1307351818d344bc2eb1682364d0899f0f9e6b0b1551c710c274c4b48f","device":"d13d3bb393e39302","findings":[],"hash":"8135293945a25ec1bf58aa082a90d78e2f6c5e95285d253ddd2155d8f57c4b53","nodeId":"dab9ea83-6c24-483c-8b8f-6afd4ccda9dc","outcome":"completed","summary":"Added 94 tests across all 19 implemented contracts, including failure paths, fuzzing, and 18 stateful invariant suites.\n\n`forge build` and `forge test` pass: **212 tests, zero failures or skips**. All changes are under `test/`.\n\n[Coverage and status report](/home/imd1/.identitymd/work/c5590743-bb22-486c-8bc4-7316d094a329/dab9ea83-6c24-483c-8b8f-6afd4ccda9dc/test/SUMMARY.md) documents remaining limits. Contracts 20–45 remain untested because their implementations are absent.","treeHash":"2df4ee15eb982945fd7d59c4371b4394ce50c318","usage":{"cachedInputTokens":3339341,"inputTokens":134742,"model":"gpt-6.1-sol","outputTokens":50109,"runtime":"codex","turns":9,"wallClockMs":960112}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fcb71e606c933181","findings":[{"citation":"resolved","description":"The winning index is H % ticketCount where H = keccak256(seed, commitment) is fixed and known to the operator before sales open, and ticketCount is the only free variable. Nothing stops the operator (or any address it controls) from calling buyTicket during the sale, so it can keep buying until H % ticketCount lands on one of its own tickets, then reveal. The bond is returned in full on reveal, so the bond does not deter this; it only deters non-reveal. The analysis documents operator-known entropy as a trust assumption and the spec itself mandates an operator-supplied commit-reveal seed, so this is a scope/design observation rather than an unauthorized-access bug. It is reported because the tests and docs do not quantify how cheap the steer is: in the reproduction the operator wins the whole pot for zero net cost after five extra tickets. Any in-design mitigation (e.g. mixing in entropy that is only known after saleEnd, or rejecting operator-controlled purchases) is a design decision for the requester.","line":85,"path":"src/Raffle.sol","reproduction":"Deploy Raffle(operator, 1 ether, 100, 1 days, 1 days); operator opens with commitment keccak256(abi.encode(seed, raffle, chainid)) and a 100 ether bond. ALICE buys 20 tickets (indices 0..19). Operator computes h = uint256(keccak256(abi.encode(seed, commitment))) and buys tickets one at a time until h % ticketCount >= 20; with seed = keccak256(\"op seed\") this takes 5 tickets. Warp to saleEnd, operator calls reveal(seed). Expected under a fair draw: operator wins with probability 5/25. Actual: winner() == operator deterministically; credits(operator) = 100 ether bond + 25 ether pot, i.e. a 20 ether net gain equal to all of ALICE's ticket money. Verified with a scratch Foundry test (operator tickets bought: 5, winner is operator: 1, net gain 20e18 wei).","severity":"low","snippet":"            winner = ticketOwner[uint256(keccak256(abi.encode(seed, commitment))) % ticketCount];","title":"Raffle operator can steer the draw to its own ticket by buying tickets after committing"},{"citation":"resolved","description":"requestRedeem accepts any nonzero share amount and processNext advances exactly one FIFO entry per call. A holder of a tiny share balance can submit many one-wei requests cheaply; every later request then needs that many extra processNext transactions (each with its own gas) before it can be priced and claimed. For an untaxed asset the liquid redeem() path is an alternative, but for a receiver-taxed asset the exact-receipt redeem()/withdraw() paths revert (see testTaxedDepositExtensionAndOutput), so the queue is the only exit path and this becomes a griefing cost on every honest withdrawal. The analysis notes keeper availability as a liveness dependency but not that queue depth is attacker-controlled at near-zero cost. Possible in-design mitigations: a minimum request size, or letting processNext take a bounded batch count.","line":124,"path":"src/Vault4626.sol","reproduction":"Vault4626(token6dec, owner, 1000e6). Attacker deposits 1e6 and calls requestRedeem(1) fifty times (ids 0..49). ALICE deposits 100e6 and calls requestRedeem(100e12) -> id 50. Warp 1 day. Expected for a usable queue: ALICE's withdrawal is processable with one or a bounded number of calls. Actual: head() must pass 50 dust entries first; a loop calling processNext() until head() > 50 runs 51 times before claimable(ALICE) becomes 100e6 (verified with a scratch test: processNext calls to reach alice = 51). With a taxed asset ALICE has no other way out.","severity":"low","snippet":"        if (shares == 0) revert InvalidInput();","title":"Vault4626 redemption queue has no minimum request size, so one-wei requests impose one processNext call each on everyone behind them"},{"citation":"resolved","description":"The required deliverable docs/SUMMARY.md must give the number of tests per contract. The tree now contains 212 tests (194 unit/fuzz plus 18 invariant suites) after the second commit added test extensions, but docs/SUMMARY.md still says 118 and its per-contract Tests column reflects the old files (e.g. LendingPool 12 vs 16 test functions now in test/LendingPool.t.sol plus one invariant; Vault4626 9 vs 13; StakingRewards 7 vs 11; Escrow 6 vs 10; TokenBridgeLock 5 vs 11). docs/SECURITY_REVIEW.md line 16 likewise states '118 tests in 19 suites' and line 7 pins Foundry 1.8.3 while the pinned toolchain here is 1.8.5. The updated table exists only in test/SUMMARY.md and test/ANALYSIS.md, which are not the required locations and duplicate documentation inside the test directory. The analysis sections in docs/ANALYSIS.md also do not mention the invariant handlers that now exist for 18 contracts.","line":5,"path":"docs/SUMMARY.md","reproduction":"Run `grep -c 'function test' test/LendingPool.t.sol` -> 16, and `forge test` -> '212 tests passed'. Compare with docs/SUMMARY.md line 5 ('118 named tests') and line 9 ('| 1 | [LendingPool](../src/LendingPool.sol) | complete | 206 | 12 | ...'). Expected: counts in docs/SUMMARY.md equal the counts in the tree. Actual: every implemented row understates the count and the headline total is 118 instead of 212.","severity":"low","snippet":"The 118 named tests include one fuzz property for each of the 19 implementations. Lines count physical lines in each named application source (including comments/blank lines); they exclude tests, shared helpers and vendored OpenZeppelin sources. Implemented application lines: 2030. Unstarted risks are prospective design concerns, not findings about nonexistent code.","title":"docs/SUMMARY.md and docs/SECURITY_REVIEW.md report stale test counts that do not match the tree"},{"citation":"resolved","description":"Timelock.execute is nonReentrant and onlyAdmin. A self-call can only originate from inside an outer execute, so an operation whose stored call is Timelock.execute(innerId) always hits ReentrancyGuardReentrantCall, the outer call reverts with CallFailed, and the inner operation is never marked done. The code behaviour is safe and arguably desirable, but the documented role table lists `execute` among the powers of a scheduled self-call, which is wrong. queue, cancel and nominateAdmin via self-call do work as documented.","line":126,"path":"docs/ANALYSIS.md","reproduction":"Timelock lock = new Timelock(admin); inner = lock.queue(0xBEEF, 0, \"\", salt1); outer = lock.queue(address(lock), 0, abi.encodeCall(lock.execute, (inner)), salt2); warp +2 days; lock.execute(outer). Expected per the docs table: inner executes. Actual: revert Timelock.CallFailed; status(inner).done == false (verified in a scratch test).","severity":"info","snippet":"| Admin or scheduled self-call | `queue`, `execute`, `cancel`, `nominateAdmin` |","title":"docs/ANALYSIS.md Timelock role table claims a scheduled self-call can execute, but the reentrancy guard makes that path always fail"},{"citation":"resolved","description":"ERC-3156 lets any caller initiate a loan for a receiver; the receiver protects itself by checking the `initiator` argument in onFlashLoan. This implementation additionally requires receiver == msg.sender, so routers, aggregators or EOAs that initiate on behalf of a receiver contract cannot use it. The restriction is deliberate and documented in ANALYSIS.md section 15 ('documented self-initiated borrower restriction'), and it closes the allowance-consumption vector, so this is a scope observation about standard conformance rather than a vulnerability. The spec line reads 'ERC-3156 flash loans'; whether strict interface conformance is required is a requester decision.","line":63,"path":"src/FlashLender.sol","reproduction":"FlashLender lender = new FlashLender(token, owner); fund it with 1000e6. Deploy a compliant IERC3156FlashBorrower `r` that returns CALLBACK_SUCCESS and approves repayment. From any other account call lender.flashLoan(r, address(token), 1e6, \"\"). Expected under ERC-3156: loan proceeds and r.onFlashLoan receives initiator = caller. Actual: revert FlashLender.InvalidInput before any transfer (verified in a scratch test).","severity":"info","snippet":"        if (address(receiver) != msg.sender || amount == 0 || data.length > 16384) revert InvalidInput();","title":"FlashLender rejects third-party initiators, deviating from ERC-3156 flashLoan semantics"},{"citation":"resolved","description":"After deliver(), refundAt = now + 3 days and timeoutRefund() in the Delivered state credits the entire amount to the buyer. A buyer who receives the goods and simply does nothing is refunded; the seller's only protection is to call dispute() on its own delivery within the three-day window and then depend on the arbiter resolving within seven days (an unresolved dispute also refunds the buyer). ANALYSIS.md section 10 documents this buyer-default rule explicitly, so it is reported as a design observation, not a defect: the spec's 'timeout refund' is satisfied, but a seller can never be paid without an action by the buyer or the arbiter. If the requester intends the usual auto-release-to-seller after an undisputed review window, that is a design change.","line":92,"path":"src/Escrow.sol","reproduction":"Escrow(ALICE buyer, BOB seller, CAROL arbiter, 1 ether, 10 days). ALICE deposit{1 ether}(); BOB deliver(hash); warp +3 days; anyone (here ALICE) calls timeoutRefund(). Expected if silence after delivery should favour the seller: credits(BOB) == 1 ether. Actual: credits(ALICE) == 1 ether, credits(BOB) == 0 (verified in a scratch test).","severity":"info","snippet":"        _settle(amount);","title":"Escrow refunds a silent buyer in full three days after delivery unless the seller disputes its own delivery"},{"citation":"resolved","description":"debtOf() grows every second once the position is large enough (about 1.3 base units per second for a 1000e6 six-decimal debt at 4% APR). An EOA that reads debtOf and submits repay(borrower, quoted) in a later block pays slightly less than the current debt, so _repay takes the partial branch and leaves a residual debt share. The residual can be cleared with a second repay of exactly the remaining owed amount, so funds are not stuck and nothing is lost; this is a usability gap (most lending pools accept type(uint256).max as 'repay everything'). Partial dust repayments that round to zero shares revert with InvalidInput, which is correct but adds friction. No economic impact.","line":147,"path":"src/LendingPool.sol","reproduction":"Pool with 6-decimal loan token and 8-decimal collateral, 10000e6 supplied. ALICE borrows 1000e6, warp +30 days, quoted = debtOf(ALICE) = 1003287671; warp +1 second (debtOf is now 1003287672); ALICE calls repay(ALICE, quoted). Expected for a 'repay all' call: debtOf(ALICE) == 0. Actual: call succeeds but debtOf(ALICE) == 1, debtShares(ALICE) == 1, totalDebtShares == 1 (verified in a scratch test). A further repay(ALICE, 1) then clears it.","severity":"info","snippet":"        if (amount == 0 || amount > debtOf(borrower)) revert InvalidInput();","title":"LendingPool has no repay-all sentinel; a full repayment quoted one second earlier leaves interest dust"}],"hash":"9d25638fa7d8717ee052298665b524c23f39057196b49408c2c9d298d46d7e96","nodeId":"b495b4a9-9e45-4f07-b209-30fef6d545e5","outcome":"completed","summary":"The review is complete. The findings file is written and validated, my scratch tests are removed, and the tree is otherwise untouched (212 tests still pass).\n\n## Outcome\n\nNo critical, high or medium defects were found in the 19 implemented contracts. The implementation is careful: every value path holds a reentrancy guard, inbound transfers are measured, outbound entitlements are consumed before transfers, ETH is pull-only, share math uses virtual offsets, and the unit, fuzz and invariant tests exercise the paths the docs claim. I traced all 115 ABI entry points plus two cross-cutting invariants and recorded a verdict for each in the coverage block.\n\n## Findings written to `.imd-findings.json` (ranked)\n\n1. **Low, Raffle:** the operator can steer the draw. The winning index is a fixed hash modulo the ticket count, and the operator may buy tickets. In my reproduction, with 20 player tickets the operator needed 5 extra tickets to win the whole pot, netting 20 ETH at zero cost. The analysis already names this as a trust limit, so this is a scope observation with numbers attached.\n2. **Low, Vault4626:** the redemption queue has no minimum request size. Fifty one-wei requests forced 51 processing calls before an honest withdrawal could be claimed. For a taxed asset the queue is the only exit, so this is a real griefing cost.\n3. **Low, docs:** `docs/SUMMARY.md` and `docs/SECURITY_REVIEW.md` still say 118 tests while the tree has 212, and every per-contract test count is stale. The updated table lives in `test/SUMMARY.md`, which is not the required location.\n4. **Info, docs:** the Timelock role table says a scheduled self-call can execute an operation. The reentrancy guard makes that path always fail, confirmed by a probe.\n5. **Info, FlashLender:** receiver must equal caller, which rejects ERC-3156 third-party initiators. Documented and deliberate.\n6. **Info, Escrow:** a silent buyer is refunded in full three days after delivery unless the seller disputes its own delivery. Documented buyer-default design.\n7. **Info, LendingPool:** no repay-all sentinel, so a quote taken one second earlier leaves one unit of dust. Clearable with a second call, no economic impact.\n\n## Notes for the requester\n\n- No proof files were attached because nothing reached high severity. If one were needed, `forge-std` is not vendored in this project, so a proof importing it would not compile here without a remapping change.\n- All leads from Slither and Aderyn were checked. The strict-equality and timestamp warnings are zero checks and deadline comparisons, not defects. The Aderyn reentrancy lead on DAOTreasury is a constructor read followed by an immutable assignment and is a false positive.\n- The slither lead on `TokenIO.pull` and the mocks' receiver-tax model hold up: the tax is deducted from the amount delivered, and every contract credits only the measured receipt.","treeHash":null,"usage":{"cachedInputTokens":3506544,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":82099,"runtime":"claude","turns":61,"wallClockMs":1149900}}],"verification":[{"checks":[{"durationMs":3179,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.07s\nCompiler run successful!\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/common/EthCredits.sol:21:27\n   │\n21 │         (bool success,) = payable(msg.sender).call{value: amount}(\"\");\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PriceOracleAdapter.sol:34:79\n   │\n34 │             round == 0 || answer <= 0 || updated == 0 || started > updated || updated > block.timestamp\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/PriceOracleAdapter.sol:35:20\n   │\n35 │                 || block.timestamp - updated > 1 hours || answeredInRound < round\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/TokenBridgeLock.sol:34:62\n   │\n34 │             if (relayer == address(0) || isRelayer[relayer]) revert InvalidInput();\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/Crowdfund.sol:31:13\n   │\n31 │         if (block.timestamp >= deadline) revert WrongState();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PriceOracleAdapter.sol:37:30\n   │\n37 │         result = Math.mulDiv(uint256(answer), 1e18, feedUnit);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Vesting.sol:57:74\n   │\n57 │             beneficiary == address(0) || beneficiary == address(this) || start < block.timestamp\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/Crowdfund.sol:41:13\n   │\n41 │         if (block.timestamp < deadline || totalPledged < goal || claimed) revert WrongState();\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/Vesting.sol:71:13\n   │\n71 │         if (block.timestamp < g.cliff) return 0;\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/Crowdfund.sol:49:13\n   │\n49 │         if (block.timestamp < deadline || totalPledged >= goal) revert WrongState();\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/DAOTreasury.sol:28:17\n   │\n28 │     constructor(address votingGovernor, ITreasuryTimelock executor) {\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/Vesting.sol:82:9\n   │\n82 │         emit Released(id, 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/TokenBridgeLock.sol:66:54\n   │\n66 │             sourceId == bytes32(0) || amount == 0 || block.timestamp > deadline || processed[sourceId]\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/TokenBridgeLock.sol:77:9\n   │\n77 │         emit Unlocked(sourceId, msg.sender, 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/Vesting.sol:94:9\n   │\n94 │         emit Revoked(id, accrued, refund);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/TokenBridgeLock.sol:73:59\n   │\n73 │             if (!isRelayer[signer] || signer <= previous) revert InvalidAuthorization();\n   │                                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/NFTMarketplace.sol:39:9\n   │\n39 │         nft.transferFrom(msg.sender, address(this), tokenId);\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/DutchAuction.sol:50:9\n   │\n50 │         nft.transferFrom(msg.sender, address(this), tokenId);\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/NFTMarketplace.sol:54:9\n   │\n54 │         l.nft.safeTransferFrom(address(this), recipient, l.tokenId);\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/common/EthCredits.sol:29:13\n   │\n29 │             emit Credited(account, 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/NFTMarketplace.sol:53:9\n   │\n53 │         emit Bought(id, msg.sender, recipient, fee);\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/DutchAuction.sol:73:9\n   │\n73 │         nft.safeTransferFrom(address(this), recipient, tokenId);\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/NFTMarketplace.sol:64:9\n   │\n64 │         l.nft.transferFrom(address(this), msg.sender, l.tokenId);\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/DutchAuction.sol:66:70\n   │\n66 │             recipient == address(0) || recipient == address(this) || block.timestamp > deadline\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/DutchAuction.sol:72:9\n   │\n72 │         emit Sold(msg.sender, recipient, cost);\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/ConstantProductAMM.sol:39:13\n   │\n39 │         if (block.timestamp > deadline || max0 == 0 || max1 == 0) revert InvalidInput();\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/DutchAuction.sol:86:39\n   │\n86 │         if (previous == State.Active) nft.transferFrom(address(this), seller, tokenId);\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/ConstantProductAMM.sol:107:9\n    │\n107 │         emit ReservesUpdated(r0, r1);\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/DutchAuction.sol:80:71\n   │\n80 │         if (previous != State.Created && (previous != State.Active || block.timestamp < startedAt + duration))\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/ConstantProductAMM.sol:62:9\n   │\n62 │         emit LiquidityAdded(msg.sender, amount0, amount1, shares);\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/FlashLender.sol:72:9\n   │\n72 │         emit FlashLoan(msg.sender, amount, fee);\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/ConstantProductAMM.sol:71:13\n   │\n71 │         if (block.timestamp > deadline || shares == 0) revert InvalidInput();\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/ConstantProductAMM.sol:78:9\n   │\n78 │         emit LiquidityRemoved(msg.sender, amount0, amount1, shares);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `confirmed` is changed without an event but is used for access control\n   ╭▸ src/MultiSig.sol:93:9\n   │\n93 │         confirmed[id][msg.sender] = false;\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/ConstantProductAMM.sol:89:13\n   │\n89 │         if (block.timestamp > deadline || (input != token0 && input != token1) || totalSupply() == 0) revert InvalidInput();\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/ConstantProductAMM.sol:100:9\n    │\n100 │         emit Swapped(msg.sender, address(input), received, output);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/MultiSig.sol:53:82\n   │\n53 │             if (owner == address(0) || owner == address(this) || isOwner[owner]) revert InvalidInput();\n   │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/MultiSig.sol:105:29\n    │\n105 │         (success, result) = t.target.call{value: t.value}(t.data);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/MultiSig.sol:105:29\n    │\n105 │         (success, result) = t.target.call{value: t.value}(t.data);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StakingRewards.sol:55:13\n   │\n55 │         if (block.timestamp < periodFinish) revert PeriodActive();\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/StakingRewards.sol:63:9\n   │\n63 │         emit PeriodFunded(received, rewardRate, periodFinish);\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/StakingRewards.sol:72:9\n   │\n72 │         emit Staked(msg.sender, received);\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/InsurancePool.sol:49:9\n   │\n49 │         emit PremiumPaid(msg.sender, received, minted, coverage[msg.sender]);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `autoRenew` is changed without an event but is used for access control\n   ╭▸ src/Subscription.sol:63:9\n   │\n63 │         autoRenew[msg.sender] = false;\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/StakingRewards.sol:81:9\n   │\n81 │         emit Withdrawn(msg.sender, 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/StakingRewards.sol:91:9\n   │\n91 │         emit RewardPaid(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/Subscription.sol:51:13\n   │\n51 │         if (block.timestamp >= paidUntil[msg.sender]) _renew(msg.sender);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n   ╭▸ src/Timelock.sol:76:29\n   │\n76 │         (success, result) = op.target.call{value: op.value}(op.data);\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/InsurancePool.sol:84:27\n   │\n84 │         if (ready == 0 || block.timestamp < ready) revert NotReady();\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/Timelock.sol:76:29\n   │\n76 │         (success, result) = op.target.call{value: op.value}(op.data);\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Subscription.sol:56:39\n   │\n56 │         if (!autoRenew[subscriber] || block.timestamp < paidUntil[subscriber]) revert NotReady();\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/InsurancePool.sol:90:9\n   │\n90 │         emit Exited(msg.sender, burned, 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/Timelock.sol:72:32\n   │\n72 │         if (op.readyAt == 0 || block.timestamp < op.readyAt || op.done || op.cancelled) revert NotReady();\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/LendingPool.sol:91:9\n   │\n91 │         emit Supplied(msg.sender, received, shares);\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/LendingPool.sol:103:9\n    │\n103 │         emit Withdrawn(msg.sender, assets, shares);\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/Subscription.sol:88:16\n   │\n88 │         return block.timestamp < paidUntil[subscriber];\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/Vault4626.sol:107:9\n    │\n107 │         emit Deposit(msg.sender, receiver, received, shares);\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/LendingPool.sol:122:9\n    │\n122 │         emit CollateralChanged(msg.sender, collateral[msg.sender]);\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/Escrow.sol:46:47\n   │\n46 │         if (state != State.AwaitingDeposit || block.timestamp >= deliveryDeadline) revert WrongState();\n   │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `proposals` is changed without an event but is used for access control\n    ╭▸ src/Governor.sol:171:9\n    │\n171 │         proposals[id].cancelled = true;\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/Escrow.sol:55:38\n   │\n55 │         if (state != State.Funded || block.timestamp >= deliveryDeadline) revert WrongState();\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/LendingPool.sol:140:9\n    │\n140 │         emit Borrowed(msg.sender, amount, shares);\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/Governor.sol:91:20\n   │\n91 │                 || token.getPastVotes(msg.sender, block.timestamp - 1) == 0\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/Governor.sol:113:13\n    │\n113 │         if (block.timestamp <= p.snapshot) return State.Pending;\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/Governor.sol:114:13\n    │\n114 │         if (block.timestamp <= p.deadline) return State.Active;\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/Vault4626.sol:146:29\n    │\n146 │         if (r.shares > 0 && block.timestamp < r.readyAt) revert NotReady();\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/LendingPool.sol:204:9\n    │\n204 │         emit Repaid(msg.sender, borrower, received, shares);\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/Escrow.sol:71:68\n   │\n71 │         if ((state != State.Funded && state != State.Delivered) || block.timestamp >= refundAt) {\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/Raffle.sol:65:36\n   │\n65 │         if (state != State.Open || block.timestamp >= saleEnd || ticketCount >= maxTickets) {\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/Governor.sol:147:9\n    │\n147 │         emit Voted(id, msg.sender, support, weight);\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/Governor.sol:155:23\n    │\n155 │         p.operation = timelock.queue(p.target, p.value, p.data, bytes32(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/Governor.sol:156:9\n    │\n156 │         emit Queued(id, p.operation);\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/Escrow.sol:82:40\n   │\n82 │         if (state != State.Disputed || block.timestamp >= refundAt) revert WrongState();\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/LendingPool.sol:166:9\n    │\n166 │         emit CollateralChanged(borrower, collateral[borrower]);\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/LendingPool.sol:167:9\n    │\n167 │         emit Liquidated(msg.sender, borrower, received, seized);\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/Raffle.sol:78:36\n   │\n78 │         if (state != State.Open || block.timestamp < saleEnd || block.timestamp >= revealEnd) {\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/Raffle.sol:78:65\n   │\n78 │         if (state != State.Open || block.timestamp < saleEnd || block.timestamp >= revealEnd) {\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/Governor.sol:164:31\n    │\n164 │         bytes memory result = timelock.execute(p.operation);\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/Escrow.sol:89:73\n   │\n89 │         if (state == State.AwaitingDeposit || state == State.Settled || block.timestamp < refundAt) {\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/LendingPool.sol:182:9\n    │\n182 │         emit InterestAccrued(interest, block.timestamp);\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/Governor.sol:165:9\n    │\n165 │         emit Executed(id, keccak256(result));\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/Raffle.sol:93:36\n   │\n93 │         if (state != State.Open || block.timestamp < revealEnd) revert WrongState();\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/Governor.sol:172:9\n    │\n172 │         emit Cancelled(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/Governor.sol:177:9\n    │\n177 │         timelock.acceptAdmin();\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/Governor.sol:178:9\n    │\n178 │         emit TimelockAdminAccepted();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Governor.t.sol:66:17\n   │\n66 │         vm.warp(block.timestamp + 1 days + 1);\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/Governor.t.sol:122:17\n    │\n122 │         vm.warp(block.timestamp + 1 days + 1);\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/DAOTreasury.t.sol:37:17\n   │\n37 │         vm.warp(block.timestamp + 1 days + 1);\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/DAOTreasury.t.sol:40:17\n   │\n40 │         vm.warp(block.timestamp + 3 days);\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/DutchAuction.t.sol:22:17\n   │\n22 │         vm.warp(block.timestamp + 12 hours);\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/DutchAuction.t.sol:59:17\n   │\n59 │         vm.warp(block.timestamp + 1);\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/DutchAuction.t.sol:68:25\n   │\n68 │         uint256 start = block.timestamp;\n   │                         ━━━━━━━━━━━━━━━\n69 │         vm.warp(start + a);\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/LendingPool.t.sol:125:25\n    │\n125 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n126 │         for (uint256 i = 1; i <= 100; ++i) {\n127 │             vm.warp(start + i * 100);\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/PriceOracleAdapter.t.sol:41:17\n   │\n41 │         vm.warp(block.timestamp + 1 hours);\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/StakingRewards.t.sol:53:17\n   │\n53 │         vm.warp(block.timestamp + 100);\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/Subscription.t.sol:64:17\n   │\n64 │         vm.warp(block.timestamp + 365 days);\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/Timelock.t.sol:102:17\n    │\n102 │         vm.warp(block.timestamp + 1);\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/Timelock.t.sol:105:17\n    │\n105 │         vm.warp(block.timestamp + 1 days + 1);\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/Timelock.t.sol:108:17\n    │\n108 │         vm.warp(block.timestamp + 3 days);\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/TokenBridgeLock.t.sol:64:68\n   │\n64 │         bytes[] memory sigs = signatures(bridge, id, ALICE, 100e6, block.timestamp);\n   │                                                                    ━━━━━━━━━━━━━━━\n65 │         vm.warp(block.timestamp + 1);\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/TokenBridgeLock.t.sol:65:17\n   │\n65 │         vm.warp(block.timestamp + 1);\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/Vesting.t.sol:19:46\n   │\n19 │         return vesting.create(ALICE, 1000e6, block.timestamp, block.timestamp + 10 days, 100 days, revocable);\n   │                                              ━━━━━━━━━━━━━━━\n   ‡\n24 │         vm.warp(block.timestamp + 9 days);\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/Vesting.t.sol:19:63\n   │\n19 │         return vesting.create(ALICE, 1000e6, block.timestamp, block.timestamp + 10 days, 100 days, revocable);\n   │                                                               ━━━━━━━━━━━━━━━\n   ‡\n24 │         vm.warp(block.timestamp + 9 days);\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/Vesting.t.sol:24:17\n   │\n24 │         vm.warp(block.timestamp + 9 days);\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/Vesting.t.sol:29:17\n   │\n29 │         vm.warp(block.timestamp + 1 days);\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/Vesting.t.sol:19:46\n   │\n19 │         return vesting.create(ALICE, 1000e6, block.timestamp, block.timestamp + 10 days, 100 days, revocable);\n   │                                              ━━━━━━━━━━━━━━━\n   ‡\n41 │         vm.warp(block.timestamp + 25 days);\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/Vesting.t.sol:19:63\n   │\n19 │         return vesting.create(ALICE, 1000e6, block.timestamp, block.timestamp + 10 days, 100 days, revocable);\n   │                                                               ━━━━━━━━━━━━━━━\n   ‡\n41 │         vm.warp(block.timestamp + 25 days);\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/Vesting.t.sol:41:17\n   │\n41 │         vm.warp(block.timestamp + 25 days);\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":102,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/DutchAuction.t.sol:DutchAuctionTest\n[PASS] testBuyAndRefundExcess() (gas: 271533)\n[PASS] testCancelOnlySellerAfterFloor() (gas: 140710)\n[PASS] testCannotBuyTwiceOrUnderpay() (gas: 209179)\n[PASS] testExpiredBuyerDeadline() (gas: 47928)\n[PASS] testFuzzPriceMonotonicAndBounded(uint256,uint256) (runs: 256, μ: 27029, ~: 27029)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 9.24ms (5.68ms CPU time)\n\nRan 6 tests for test/Timelock.t.sol:TimelockTest\n[PASS] testCancelAndUnauthorized() (gas: 349836)\n[PASS] testExecuteAndPreventReplay() (gas: 389677)\n[PASS] testFuzzDelayNeverBypassed(uint256) (runs: 256, μ: 211024, ~: 211024)\n[PASS] testGovernorIntegration() (gas: 2723778)\n[PASS] testRevertedCallCanRetry() (gas: 440986)\n[PASS] testTwoStepHandover() (gas: 154827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 14.57ms (15.30ms CPU time)\n\nRan 7 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testEmptyRoundReturnsBond() (gas: 116382)\n[PASS] testFuzzRefundSolvency(uint256) (runs: 256, μ: 545457, ~: 544802)\n[PASS] testLateEntryWrongPaymentAndCap() (gas: 869276)\n[PASS] testRevealConservationAndPrizeClaim() (gas: 446154)\n[PASS] testSettlementFailureAndReentrantPrizeClaim() (gas: 675022)\n[PASS] testTimeoutRefundAndBondForfeiture() (gas: 453971)\n[PASS] testWrongSeedEarlyLateAndUnauthorizedReveal() (gas: 158845)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 18.17ms (18.70ms CPU time)\n\nRan 5 tests for test/InsurancePool.t.sol:InsurancePoolTest\n[PASS] testCooldownAndCoverageSurrender() (gas: 209592)\n[PASS] testCoverageClaimAndSocialisedLoss() (gas: 330864)\n[PASS] testFuzzSolvency(uint256) (runs: 256, μ: 209153, ~: 209175)\n[PASS] testOnlyOwnerCoverageAndSolvencyCaps() (gas: 114557)\n[PASS] testReservedClaimsSurviveExits() (gas: 254375)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 18.83ms (18.52ms CPU time)\n\nRan 6 tests for test/Vesting.t.sol:VestingTest\n[PASS] testBeforeCliffRevokeReturnsAll() (gas: 299460)\n[PASS] testCliffLinearAndFullRelease() (gas: 480704)\n[PASS] testFuzzRevocationConservation(uint256) (runs: 256, μ: 412698, ~: 443634)\n[PASS] testIrrevocableAndAccessControl() (gas: 310518)\n[PASS] testRevocationPreservesVested() (gas: 474440)\n[PASS] testTaxedGrantAndMultipleBeneficiaries() (gas: 634902)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 18.75ms (19.28ms CPU time)\n\nRan 4 tests for test/PriceOracleAdapter.t.sol:PriceOracleAdapterTest\n[PASS] testFuzzNormalization(uint256,uint256) (runs: 256, μ: 55935, ~: 55943)\n[PASS] testHighDecimalFeedAndDustRejection() (gas: 385445)\n[PASS] testNonPositiveFutureAndIncompleteRound() (gas: 239662)\n[PASS] testNormalizationAndHourBoundary() (gas: 52860)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 20.95ms (21.27ms CPU time)\n\nRan 6 tests for test/FlashLender.t.sol:FlashLenderTest\n[PASS] testCallbackFailureAndNoRepaymentRollback() (gas: 147084)\n[PASS] testFuzzFeeAndConservation(uint256) (runs: 256, μ: 97187, ~: 97194)\n[PASS] testLoanFeeAndWithdrawal() (gas: 161403)\n[PASS] testReentryBlockedAndCallerBound() (gas: 129217)\n[PASS] testTaxedPrincipalSafelyRejected() (gas: 126113)\n[PASS] testUnsupportedTokenAndUnauthorizedWithdraw() (gas: 51970)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 21.01ms (21.11ms CPU time)\n\nRan 5 tests for test/Crowdfund.t.sol:CrowdfundTest\n[PASS] testEarlyAndUnauthorizedActions() (gas: 132807)\n[PASS] testForcedEthDoesNotMeetGoal() (gas: 207394)\n[PASS] testFuzzConservation(uint256) (runs: 256, μ: 180626, ~: 175025)\n[PASS] testGoalMetCreatorClaim() (gas: 327817)\n[PASS] testMissedGoalRefund() (gas: 252034)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 21.41ms (19.02ms CPU time)\n\nRan 12 tests for test/LendingPool.t.sol:LendingPoolTest\n[PASS] testBorrowRepayAndWithdraw() (gas: 402993)\n[PASS] testCannotDebitAnotherApprover() (gas: 163643)\n[PASS] testDebtFreeCollateralExitDoesNotNeedWorkingOracle() (gas: 116275)\n[PASS] testFrequentAccrualDoesNotEraseFractionalInterest() (gas: 4784665)\n[PASS] testFuzzBorrowConservation(uint256) (runs: 256, μ: 271017, ~: 271046)\n[PASS] testInterestAndUtilisation() (gas: 253851)\n[PASS] testLiquidationFivePercent() (gas: 351543)\n[PASS] testRevertOverBorrowAndHealthyLiquidation() (gas: 339892)\n[PASS] testRevertUnsafeRemovalAndOverRepay() (gas: 273525)\n[PASS] testTaxedRepayCreditsOnlyReceived() (gas: 308102)\n[PASS] testTaxedSupplyAndCollateral() (gas: 370520)\n[PASS] testTokenCallbackCannotAccrueDuringSupply() (gas: 1133546)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 23.32ms (24.59ms CPU time)\n\nRan 5 tests for test/DAOTreasury.t.sol:DAOTreasuryTest\n[PASS] testDirectAndGovernorCallsCannotSpend() (gas: 67964)\n[PASS] testFuzzAuthorizedAllocationSolvency(uint256) (runs: 256, μ: 95707, ~: 95727)\n[PASS] testGovernanceETHSpendingAndWithdrawal() (gas: 782713)\n[PASS] testGovernanceTokenSpending() (gas: 831870)\n[PASS] testReservedFundsCannotBeAllocatedAgain() (gas: 770911)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 23.82ms (23.61ms CPU time)\n\nRan 6 tests for test/Governor.t.sol:GovernorTest\n[PASS] testAgainstDoesNotMeetQuorumAndInvalidSupport() (gas: 312993)\n[PASS] testDelayCancelAndInvalidProposal() (gas: 325504)\n[PASS] testFuzzTalliesBoundedBySupply(uint8,uint8) (runs: 256, μ: 350199, ~: 356066)\n[PASS] testHistoricalWeightCannotMoveAndVoteTwice() (gas: 509140)\n[PASS] testLifecycleAndQuorum() (gas: 527668)\n[PASS] testNoVotesDefeatsProposal() (gas: 242956)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 23.89ms (16.31ms CPU time)\n\nRan 6 tests for test/NFTMarketplace.t.sol:NFTMarketplaceTest\n[PASS] testBuyFeeAndPullPayments() (gas: 451639)\n[PASS] testCancelAndUnauthorized() (gas: 356238)\n[PASS] testFuzzFeeConservation(uint256) (runs: 256, μ: 375659, ~: 376801)\n[PASS] testReceiverCallbackCannotReenter() (gas: 682753)\n[PASS] testRejectingSellerDoesNotBlockSale() (gas: 1697407)\n[PASS] testWrongPriceAndDuplicateBuy() (gas: 434166)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 23.87ms (24.00ms CPU time)\n\nRan 6 tests for test/ConstantProductAMM.t.sol:ConstantProductAMMTest\n[PASS] testDeadlineSlippageAndWrongToken() (gas: 780717)\n[PASS] testDonationsCannotBeStolenThroughLiquidity() (gas: 244905)\n[PASS] testFuzzKNondecreasing(uint256,bool) (runs: 256, μ: 152079, ~: 152090)\n[PASS] testLiquiditySharesAndMinimumBurn() (gas: 316238)\n[PASS] testSwapFeeAndInvariant() (gas: 117737)\n[PASS] testTaxedInputAndOutput() (gas: 252169)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.07ms (20.42ms CPU time)\n\nRan 7 tests for test/StakingRewards.t.sol:StakingRewardsTest\n[PASS] testAuthorityAndFixedPeriod() (gas: 278187)\n[PASS] testFuzzRewardSolvency(uint256,uint256) (runs: 256, μ: 458591, ~: 458788)\n[PASS] testIdleTimeNotGivenToFirstStaker() (gas: 312439)\n[PASS] testInvalidActions() (gas: 128252)\n[PASS] testStakeEarnWithdraw() (gas: 522683)\n[PASS] testTaxedStakeAndFunding() (gas: 386321)\n[PASS] testTwoStakersAndPeriodEnd() (gas: 393098)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 25.94ms (26.50ms CPU time)\n\nRan 6 tests for test/Subscription.t.sol:SubscriptionTest\n[PASS] testCannotRenewEarlyCancelledOrUnfunded() (gas: 371083)\n[PASS] testFuzzAccountingConservation(uint256) (runs: 256, μ: 329558, ~: 329619)\n[PASS] testMerchantCannotStealPrepaidAndCallerCannotStealRevenue() (gas: 284102)\n[PASS] testResumeAndLateRenewalDoNotOvercharge() (gas: 373500)\n[PASS] testSubscribeRenewCancelAndWithdraw() (gas: 462840)\n[PASS] testTaxedDepositIsNetCredited() (gas: 180203)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 30.24ms (22.36ms CPU time)\n\nRan 6 tests for test/MultiSig.t.sol:MultiSigTest\n[PASS] testConfirmRevokeAndExecute() (gas: 522304)\n[PASS] testFuzzConservation(uint256) (runs: 256, μ: 363941, ~: 364163)\n[PASS] testRemoveOwnerAndThreshold() (gas: 484736)\n[PASS] testRevertingCallPreservesApprovals() (gas: 378562)\n[PASS] testSelfOnlyMembershipAndEpochInvalidation() (gas: 746967)\n[PASS] testUnauthorizedDuplicateAndUnknownActions() (gas: 323622)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 31.89ms (33.08ms CPU time)\n\nRan 9 tests for test/Vault4626.t.sol:Vault4626Test\n[PASS] testCapAndAuthority() (gas: 285613)\n[PASS] testDepositYieldRedeem() (gas: 231622)\n[PASS] testDonationAttackNoZeroShares() (gas: 413694)\n[PASS] testFuzzNoRoundTripProfit(uint256,uint256) (runs: 256, μ: 384284, ~: 384899)\n[PASS] testMintWithdrawRounding() (gas: 365843)\n[PASS] testQueueCancelCannotSteal() (gas: 422552)\n[PASS] testQueueReservesAndClaim() (gas: 601549)\n[PASS] testTaxedDepositExtensionAndOutput() (gas: 655403)\n[PASS] testTokenCallbackCannotProcessQueueDuringDeposit() (gas: 1366527)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 31.83ms (32.80ms CPU time)\n\nRan 6 tests for test/Escrow.t.sol:EscrowTest\n[PASS] testArbitrationSplit() (gas: 250309)\n[PASS] testDeliveredAndDisputedTimeouts() (gas: 250211)\n[PASS] testDeliveryReleaseAndWithdraw() (gas: 223101)\n[PASS] testFundedTimeout() (gas: 176239)\n[PASS] testFuzzSettlementConservation(uint256) (runs: 256, μ: 225521, ~: 225728)\n[PASS] testUnauthorizedAndWrongStates() (gas: 212057)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 32.25ms (12.66ms CPU time)\n\nRan 5 tests for test/TokenBridgeLock.t.sol:TokenBridgeLockTest\n[PASS] testDuplicateAndWrongRecipientRejected() (gas: 109094)\n[PASS] testExpiredAndCrossContractSignaturesRejected() (gas: 115464)\n[PASS] testFuzzSignedAmountConservation(uint256) (runs: 256, μ: 138301, ~: 138308)\n[PASS] testTaxedLockAndNonces() (gas: 218624)\n[PASS] testUnlockAndReplayProtection() (gas: 172643)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 32.14ms (32.84ms CPU time)\n\nRan 19 test suites in 32.96ms (446.19ms CPU time): 118 tests passed, 0 failed, 0 skipped (118 total tests)\n","passed":true},{"durationMs":52,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.approve(address,uint256)\",\"ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.swap(address,uint256,uint256,uint256)\",\"ConstantProductAMM.transfer(address,uint256)\",\"ConstantProductAMM.transferFrom(address,address,uint256)\",\"Crowdfund.claim()\",\"Crowdfund.pledge()\",\"Crowdfund.refund()\",\"Crowdfund.withdrawPayments()\",\"DAOTreasury.fundToken(address,uint256)\",\"DAOTreasury.receive()\",\"DAOTreasury.spendETH(address,uint256)\",\"DAOTreasury.spendToken(address,address,uint256,uint256)\",\"DAOTreasury.withdrawPayments()\",\"DutchAuction.activate()\",\"DutchAuction.buy(address,uint256,uint256)\",\"DutchAuction.cancel()\",\"DutchAuction.withdrawPayments()\",\"Escrow.deliver(bytes32)\",\"Escrow.deposit()\",\"Escrow.dispute(bytes32)\",\"Escrow.release()\",\"Escrow.resolve(uint256)\",\"Escrow.timeoutRefund()\",\"Escrow.withdrawPayments()\",\"FlashLender.acceptOwnership()\",\"FlashLender.flashLoan(address,address,uint256,bytes)\",\"FlashLender.fund(uint256)\",\"FlashLender.renounceOwnership()\",\"FlashLender.transferOwnership(address)\",\"FlashLender.withdraw(uint256,uint256)\",\"Governor.acceptTimelockAdmin()\",\"Governor.cancel(uint256)\",\"Governor.castVote(uint256,uint8)\",\"Governor.execute(uint256)\",\"Governor.propose(address,uint256,bytes,bytes32)\",\"Governor.queue(uint256)\",\"InsurancePool.acceptOwnership()\",\"InsurancePool.approveClaim(address,uint256,bytes32)\",\"InsurancePool.claim(uint256)\",\"InsurancePool.exit(uint256)\",\"InsurancePool.payPremium(uint256,uint256)\",\"InsurancePool.renounceOwnership()\",\"InsurancePool.requestExit()\",\"InsurancePool.transferOwnership(address)\",\"LendingPool.accrue()\",\"LendingPool.addCollateral(uint256)\",\"LendingPool.borrow(uint256,uint256)\",\"LendingPool.liquidate(address,uint256,uint256)\",\"LendingPool.removeCollateral(uint256,uint256)\",\"LendingPool.repay(address,uint256)\",\"LendingPool.supply(uint256,uint256)\",\"LendingPool.withdraw(uint256,uint256)\",\"MultiSig.addOwner(address)\",\"MultiSig.confirm(uint256)\",\"MultiSig.execute(uint256)\",\"MultiSig.receive()\",\"MultiSig.removeOwner(address,uint256)\",\"MultiSig.revoke(uint256)\",\"MultiSig.setThreshold(uint256)\",\"MultiSig.submit(address,uint256,bytes)\",\"NFTMarketplace.buy(uint256,address)\",\"NFTMarketplace.cancel(uint256)\",\"NFTMarketplace.list(address,uint256,uint256)\",\"NFTMarketplace.withdrawPayments()\",\"Raffle.buyTicket()\",\"Raffle.expire()\",\"Raffle.open(bytes32)\",\"Raffle.refund()\",\"Raffle.reveal(bytes32)\",\"Raffle.withdrawPayments()\",\"StakingRewards.acceptOwnership()\",\"StakingRewards.claim(uint256)\",\"StakingRewards.fundPeriod(uint256,uint256)\",\"StakingRewards.renounceOwnership()\",\"StakingRewards.stake(uint256)\",\"StakingRewards.transferOwnership(address)\",\"StakingRewards.withdraw(uint256,uint256)\",\"Subscription.cancel()\",\"Subscription.deposit(uint256)\",\"Subscription.renew(address)\",\"Subscription.subscribe()\",\"Subscription.withdraw(uint256,uint256)\",\"Subscription.withdrawRevenue(uint256)\",\"Timelock.acceptAdmin()\",\"Timelock.cancel(bytes32)\",\"Timelock.execute(bytes32)\",\"Timelock.nominateAdmin(address)\",\"Timelock.queue(address,uint256,bytes,bytes32)\",\"Timelock.receive()\",\"TokenBridgeLock.lock(uint256,bytes32)\",\"TokenBridgeLock.unlock(bytes32,uint256,uint256,bytes[],uint256)\",\"Vault4626.acceptOwnership()\",\"Vault4626.addYield(uint256)\",\"Vault4626.approve(address,uint256)\",\"Vault4626.cancelRequest(uint256)\",\"Vault4626.claim(uint256)\",\"Vault4626.deposit(uint256,address)\",\"Vault4626.depositReceived(uint256,address,uint256)\",\"Vault4626.mint(uint256,address)\",\"Vault4626.processNext()\",\"Vault4626.redeem(uint256,address,address)\",\"Vault4626.renounceOwnership()\",\"Vault4626.requestRedeem(uint256)\",\"Vault4626.setCap(uint256)\",\"Vault4626.transfer(address,uint256)\",\"Vault4626.transferFrom(address,address,uint256)\",\"Vault4626.transferOwnership(address)\",\"Vault4626.withdraw(uint256,address,address)\",\"Vesting.acceptOwnership()\",\"Vesting.create(address,uint256,uint256,uint256,uint256,bool)\",\"Vesting.release(uint256,uint256)\",\"Vesting.renounceOwnership()\",\"Vesting.revoke(uint256,uint256)\",\"Vesting.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"README.md\":33,\"docs/ANALYSIS.md\":962,\"docs/SECURITY_REVIEW.md\":81,\"docs/SUMMARY.md\":55,\"foundry.toml\":17,\"src/ConstantProductAMM.sol\":109,\"src/Crowdfund.sol\":56,\"src/DAOTreasury.sol\":70,\"src/DutchAuction.sol\":88,\"src/Escrow.sol\":101,\"src/FlashLender.sol\":75,\"src/Governor.sol\":180,\"src/InsurancePool.sol\":94,\"src/LendingPool.sol\":206,\"src/MultiSig.sol\":151,\"src/NFTMarketplace.sol\":66,\"src/PriceOracleAdapter.sol\":40,\"src/Raffle.sol\":114,\"src/StakingRewards.sol\":103,\"src/Subscription.sol\":99,\"src/Timelock.sol\":109,\"src/TokenBridgeLock.sol\":80,\"src/Vault4626.sol\":192,\"src/Vesting.sol\":97,\"src/common/EthCredits.sol\":32,\"src/common/TokenIO.sol\":29,\"test/ConstantProductAMM.t.sol\":78,\"test/Crowdfund.t.sol\":90,\"test/DAOTreasury.t.sol\":81,\"test/DutchAuction.t.sol\":75,\"test/Escrow.t.sol\":95,\"test/FlashLender.t.sol\":99,\"test/Governor.t.sol\":142,\"test/InsurancePool.t.sol\":87,\"test/LendingPool.t.sol\":150,\"test/MultiSig.t.sol\":104,\"test/NFTMarketplace.t.sol\":125,\"test/PriceOracleAdapter.t.sol\":79,\"test/Raffle.t.sol\":144,\"test/StakingRewards.t.sol\":107,\"test/Subscription.t.sol\":98,\"test/Timelock.t.sol\":124,\"test/TokenBridgeLock.t.sol\":96,\"test/Vault4626.t.sol\":131,\"test/Vesting.t.sol\":97,\"test/helpers/Mocks.sol\":75,\"test/helpers/TestBase.sol\":40},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4331,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/StakingRewards.sol:86: StakingRewards.claim(uint256) (src/StakingRewards.sol#86-93) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/common/TokenIO.sol:15: TokenIO.pull(IERC20,uint256) (src/common/TokenIO.sol#15-20) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vesting.sol:76: Vesting.release(uint256,uint256) (src/Vesting.sol#76-84) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:195: LendingPool._repay(address,uint256) (src/LendingPool.sol#195-205) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/InsurancePool.sol:40: InsurancePool.payPremium(uint256,uint256) (src/InsurancePool.sol#40-50) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vault4626.sol:173: Vault4626._deposit(address,address,uint256,uint256) (src/Vault4626.sol#173-180) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:83: LendingPool.supply(uint256,uint256) (src/LendingPool.sol#83-92) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:195: LendingPool._repay(address,uint256) (src/LendingPool.sol#195-205) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Governor.sol:84: Governor.propose(address,uint256,bytes,bytes32) (src/Governor.sol#84-104) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vault4626.sol:96: Vault4626.depositReceived(uint256,address,uint256) (src/Vault4626.sol#96-108) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vault4626.sol:182: Vault4626._withdraw(address,address,address,uint256,uint256) (src/Vault4626.sol#182-191) uses a dangerous strict equality:\n[low/medium] timestamp at src/LendingPool.sol:127: LendingPool.borrow(uint256,uint256) (src/LendingPool.sol#127-142) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:53: Escrow.deliver(bytes32) (src/Escrow.sol#53-59) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:95: LendingPool.withdraw(uint256,uint256) (src/LendingPool.sol#95-105) uses timestamp for comparisons\n[low/medium] timestamp at src/Raffle.sol:76: Raffle.reveal(bytes32) (src/Raffle.sol#76-89) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:69: Escrow.dispute(bytes32) (src/Escrow.sol#69-77) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:76: Vesting.release(uint256,uint256) (src/Vesting.sol#76-84) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:47: Subscription.subscribe() (src/Subscription.sol#47-52) uses timestamp for comparisons\n[low/medium] timestamp at src/Timelock.sol:70: Timelock.execute(bytes32) (src/Timelock.sol#70-78) uses timestamp for comparisons\n[low/medium] timestamp at src/Governor.sol:169: Governor.cancel(uint256) (src/Governor.sol#169-173) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:88: Escrow.timeoutRefund() (src/Escrow.sol#88-93) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:48: Crowdfund.refund() (src/Crowdfund.sol#48-55) uses timestamp for comparisons\n[low/medium] timestamp at src/TokenBridgeLock.sol:58: TokenBridgeLock.unlock(bytes32,uint256,uint256,bytes[],uint256) (src/TokenBridgeLock.sol#58-79) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:67: Vesting.vested(uint256) (src/Vesting.sol#67-73) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:44: Escrow.deposit() (src/Escrow.sol#44-50) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:83: LendingPool.supply(uint256,uint256) (src/LendingPool.sol#83-92) uses timestamp for comparisons\n[low/medium] timestamp at src/DutchAuction.sol:62: DutchAuction.buy(address,uint256,uint256) (src/DutchAuction.sol#62-74) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:55: Subscription.renew(address) (src/Subscription.sol#55-58) uses timestamp for comparisons\n[low/medium] timestamp at src/Raffle.sol:64: Raffle.buyTicket() (src/Raffle.sol#64-73) uses timestamp for comparisons\n[low/medium] timestamp at src/Raffle.sol:92: Raffle.expire() (src/Raffle.sol#92-102) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:114: LendingPool.removeCollateral(uint256,uint256) (src/LendingPool.sol#114-124) uses timestamp for comparisons\n[low/medium] timestamp at src/InsurancePool.sol:82: InsurancePool.exit(uint256) (src/InsurancePool.sol#82-93) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:71: LendingPool.debtOf(address) (src/LendingPool.sol#71-75) uses timestamp for comparisons\n[low/medium] timestamp at src/StakingRewards.sol:86: StakingRewards.claim(uint256) (src/StakingRewards.sol#86-93) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:39: Crowdfund.claim() (src/Crowdfund.sol#39-45) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:145: LendingPool.repay(address,uint256) (src/LendingPool.sol#145-150) uses timestamp for comparisons\n[low/medium] timestamp at src/Governor.sol:107: Governor.state(uint256) (src/Governor.sol#107-119) uses timestamp for comparisons\n[low/medium] timestamp at src/Governor.sol:84: Governor.propose(address,uint256,bytes,bytes32) (src/Governor.sol#84-104) uses timestamp for comparisons\n[low/medium] timestamp at src/ConstantProductAMM.sol:34: ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#34-63) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:87: Vesting.revoke(uint256,uint256) (src/Vesting.sol#87-96) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:195: LendingPool._repay(address,uint256) (src/LendingPool.sol#195-205) uses timestamp for comparisons\n[low/medium] timestamp at src/ConstantProductAMM.sol:66: ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#66-81) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:80: Escrow.resolve(uint256) (src/Escrow.sol#80-85) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:87: Subscription.isActive(address) (src/Subscription.sol#87-89) uses timestamp for comparisons\n[low/medium] timestamp at src/ConstantProductAMM.sol:84: ConstantProductAMM.swap(IERC20,uint256,uint256,uint256) (src/ConstantProductAMM.sol#84-102) uses timestamp for comparisons\n[low/medium] timestamp at src/DutchAuction.sol:77: DutchAuction.cancel() (src/DutchAuction.sol#77-87) uses timestamp for comparisons\n[low/medium] timestamp at src/StakingRewards.sol:54: StakingRewards.fundPeriod(uint256,uint256) (src/StakingRewards.sol#54-64) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:48: Vesting.create(address,uint256,uint256,uint256,uint256,bool) (src/Vesting.sol#48-64) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:30: Crowdfund.pledge() (src/Crowdfund.sol#30-36) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:59: LendingPool.borrowRate() (src/LendingPool.sol#59-62) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:185: LendingPool._pendingInterest() (src/LendingPool.sol#185-193) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:153: LendingPool.liquidate(address,uint256,uint256) (src/LendingPool.sol#153-169) uses timestamp for comparisons\n[low/medium] timestamp at src/Vault4626.sol:142: Vault4626.processNext() (src/Vault4626.sol#142-157) uses timestamp for comparisons\n[low/medium] timestamp at src/PriceOracleAdapter.sol:30: PriceOracleAdapter.price() (src/PriceOracleAdapter.sol#30-39) uses timestamp for comparisons","passed":true},{"durationMs":604,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/MultiSig.sol:99: ETH transferred without address checks (2 places)\n[high] reentrancy-state-change at src/DAOTreasury.sol:30: Reentrancy: State change after external call (11 places)\n[low] centralization-risk at src/FlashLender.sol:18: Centralization Risk (14 places)\n[low] large-numeric-literal at src/FlashLender.sol:41: Large Numeric Literal (7 places)\n[low] literal-instead-of-constant at src/InsurancePool.sol:44: Literal Instead of Constant (17 places)\n[low] local-variable-shadowing at src/MultiSig.sol:22: Local Variable Shadows State Variable\n[low] missing-inheritance at src/PriceOracleAdapter.sol:13: Missing Inheritance\n[low] require-revert-in-loop at src/TokenBridgeLock.sol:71: Loop Contains `require`/`revert`\n[low] uninitialized-local-variable at src/MultiSig.sol:51: Uninitialized Local Variable (3 places)\n[low] unspecific-solidity-pragma at src/ConstantProductAMM.sol:2: Unspecific Solidity Pragma (20 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"72aee3daa2299f205bab2e4519c457a9d4a1bc6e6530d2b4723fa33b361cb88f","verifiedTreeHash":"041cd35a5b1438da1a82861fe98b5c91451519ab","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":3249,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.15s\nCompiler run successful!\nwarning[missing-events-access-control]: `confirmed` is changed without an event but is used for access control\n   ╭▸ src/MultiSig.sol:97:9\n   │\n97 │         confirmed[id][msg.sender] = false;\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/common/TokenIO.sol:25:13\n   │\n25 │         if (token.balanceOf(address(this)) != beforeBalance - amount) revert InvalidTransfer();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n   ╭▸ src/common/EtherCredits.sol:22:22\n   │\n22 │         (bool ok,) = receiver.call{value: amount}(\"\");\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/MultiSig.sol:45:70\n   │\n45 │             if (a == address(0) || a == address(this) || isOwner[a]) revert InvalidInput();\n   │                                                                      ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/common/EtherCredits.sol:22:22\n   │\n22 │         (bool ok,) = receiver.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/InsurancePool.sol:46:9\n   │\n46 │         emit PremiumPaid(msg.sender, msg.value, shares, coverage[msg.sender]);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n   ╭▸ src/Timelock.sol:75:24\n   │\n75 │         (ok, result) = target.call{value: value}(data);\n   │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/MultiSig.sol:109:24\n    │\n109 │         (ok, result) = t.target.call{value: t.value}(t.data);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/MultiSig.sol:109:24\n    │\n109 │         (ok, result) = t.target.call{value: t.value}(t.data);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/Timelock.sol:75:24\n   │\n75 │         (ok, result) = target.call{value: value}(data);\n   │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/InsurancePool.sol:69:40\n   │\n69 │         if (exitAt[msg.sender] == 0 || block.timestamp < exitAt[msg.sender]) revert WrongState();\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/Timelock.sol:70:25\n   │\n70 │         if (eta == 0 || block.timestamp < eta || executed[id]) revert NotReady();\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/common/EtherCredits.sol:30:13\n   │\n30 │             emit EtherCredited(user, 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/InsurancePool.sol:77:9\n   │\n77 │         emit Exited(msg.sender, shares, amount);\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/Timelock.sol:63:22\n   │\n63 │     function execute(address target, uint256 value, bytes calldata data, bytes32 salt)\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/DAOTreasury.sol:26:42\n   │\n26 │     constructor(ITreasuryTimelock delay, address votingGovernor) {\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/Governor.sol:91:9\n   │\n91 │         timelock.acceptAdmin();\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/Governor.sol:92:9\n   │\n92 │         emit TimelockAdminAccepted();\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/PriceOracleAdapter.sol:32:29\n   │\n32 │         if (updated == 0 || updated > block.timestamp || block.timestamp - updated > 1 hours) revert StaleAnswer();\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/PriceOracleAdapter.sol:32:58\n   │\n32 │         if (updated == 0 || updated > block.timestamp || block.timestamp - updated > 1 hours) revert StaleAnswer();\n   │                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/PriceOracleAdapter.sol:30:76\n   │\n30 │         (uint80 round, int256 answer,, uint256 updated, uint80 answered) = feed.latestRoundData();\n   │                                                                            ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Governor.sol:149:9\n    │\n149 │         emit VoteCast(id, msg.sender, support, weight);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PriceOracleAdapter.sol:34:40\n   │\n34 │         result = d <= 18 ? Math.mulDiv(uint256(answer), 10 ** (18 - d), 1) : uint256(answer) / 10 ** (d - 18);\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/PriceOracleAdapter.sol:34:78\n   │\n34 │         result = d <= 18 ? Math.mulDiv(uint256(answer), 10 ** (18 - d), 1) : uint256(answer) / 10 ** (d - 18);\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[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/TokenBridgeLock.sol:36:50\n   │\n36 │             if (r == address(0) || isRelayer[r]) revert InvalidInput();\n   │                                                  ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Governor.sol:157:9\n    │\n157 │         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/Governor.sol:165:23\n    │\n165 │         p.operation = timelock.queue(p.target, p.value, p.data, bytes32(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/Governor.sol:166:9\n    │\n166 │         emit ProposalQueued(id, p.operation);\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/Crowdfund.sol:22:61\n   │\n22 │             campaignCreator == address(0) || target == 0 || end < block.timestamp + 1 hours\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/Crowdfund.sol:23:20\n   │\n23 │                 || end > block.timestamp + 365 days\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/Governor.sol:173:18\n    │\n173 │         result = timelock.execute(p.target, p.value, p.data, bytes32(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/Governor.sol:174:9\n    │\n174 │         emit ProposalExecuted(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/Crowdfund.sol:34:13\n   │\n34 │         if (block.timestamp >= deadline) revert WrongState();\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/TokenBridgeLock.sol:68:13\n   │\n68 │         if (block.timestamp > deadline) revert Expired();\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/TokenBridgeLock.sol:80:9\n   │\n80 │         emit Unlocked(sourceId, nonce, recipient, 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/Crowdfund.sol:44:13\n   │\n44 │         if (block.timestamp < deadline || raised < goal || claimed) revert WrongState();\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/TokenBridgeLock.sol:76:59\n   │\n76 │             if (!isRelayer[signer] || signer <= previous) revert InvalidSignature();\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/Escrow.sol:44:71\n   │\n44 │                 || disputeArbiter == purchaseSeller || amount == 0 || deliverBy < block.timestamp + 1 hours\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/Crowdfund.sol:52:13\n   │\n52 │         if (block.timestamp < deadline || raised >= goal) revert WrongState();\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/Subscription.sol:42:16\n   │\n42 │         return block.timestamp < accounts[user].paidUntil;\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/Escrow.sol:58:47\n   │\n58 │         if (state != State.AwaitingDeposit || block.timestamp >= deliveryDeadline) revert WrongState();\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/Subscription.sol:51:13\n   │\n51 │         if (a.paidUntil <= block.timestamp) {\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/Subscription.sol:69:29\n   │\n69 │         if (!a.autoRenew || block.timestamp < a.paidUntil) revert WrongState();\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/Escrow.sol:67:38\n   │\n67 │         if (state != State.Funded || block.timestamp >= deliveryDeadline) revert WrongState();\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/Raffle.sol:55:39\n   │\n55 │         if (state != State.Selling || block.timestamp >= saleEnd) revert WrongState();\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/Escrow.sol:87:20\n   │\n87 │                 || block.timestamp >= (state == State.Funded ? deliveryDeadline : resolutionDeadline)\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/Vesting.sol:47:74\n   │\n47 │             beneficiary == address(0) || beneficiary == address(this) || start < block.timestamp || cliff < start\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/Raffle.sol:66:39\n   │\n66 │         if (state != State.Selling || block.timestamp < saleEnd || block.timestamp >= revealEnd) revert WrongState();\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/Vault4626.sol:87:9\n   │\n87 │         emit Deposit(msg.sender, receiver, received, shares);\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/Raffle.sol:66:68\n   │\n66 │         if (state != State.Selling || block.timestamp < saleEnd || block.timestamp >= revealEnd) revert WrongState();\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/Escrow.sol:97:40\n   │\n97 │         if (state != State.Disputed || block.timestamp >= resolutionDeadline) revert WrongState();\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/Vesting.sol:61:13\n   │\n61 │         if (block.timestamp < s.cliff) return 0;\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/Vesting.sol:62:13\n   │\n62 │         if (block.timestamp >= s.end) return s.total;\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/Escrow.sol:119:9\n    │\n119 │         emit Settled(price - sellerAmount, sellerAmount);\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/LendingPool.sol:89:9\n   │\n89 │         emit Accrued(index, block.timestamp);\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/Vesting.sol:73:9\n   │\n73 │         emit Released(id, 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/Escrow.sol:105:17\n    │\n105 │             if (block.timestamp < deliveryDeadline) revert TooEarly();\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/Escrow.sol:108:17\n    │\n108 │             if (block.timestamp < resolutionDeadline) revert TooEarly();\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/ConstantProductAMM.sol:69:9\n   │\n69 │         emit LiquidityAdded(msg.sender, a, b, shares);\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/StakingRewards.sol:53:13\n   │\n53 │         if (block.timestamp < periodFinish) revert PeriodActive();\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/Raffle.sol:93:39\n   │\n93 │         if (state != State.Selling || block.timestamp < revealEnd) revert WrongState();\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/LendingPool.sol:101:9\n    │\n101 │         emit Supplied(msg.sender, received, shares);\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/Vesting.sol:85:9\n   │\n85 │         emit Revoked(id, entitled, returned);\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/StakingRewards.sol:61:9\n   │\n61 │         emit PeriodFunded(received, rewardRate, periodFinish);\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/ConstantProductAMM.sol:86:9\n   │\n86 │         emit LiquidityRemoved(msg.sender, a, b, shares);\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/Raffle.sol:107:9\n    │\n107 │         emit Refunded(msg.sender, count, amount);\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/NFTMarketplace.sol:40:9\n   │\n40 │         nft.transferFrom(msg.sender, address(this), tokenId);\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/LendingPool.sol:112:9\n    │\n112 │         emit Withdrawn(msg.sender, assets, shares);\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/FlashLender.sol:68:9\n   │\n68 │         emit FlashLoan(msg.sender, address(receiver), amount, fee);\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/StakingRewards.sol:70:9\n   │\n70 │         emit Staked(msg.sender, received);\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/NFTMarketplace.sol:53:9\n   │\n53 │         emit Bought(id, msg.sender, msg.value, fee);\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/ConstantProductAMM.sol:108:9\n    │\n108 │         emit Swapped(msg.sender, address(input), receiver, received, out, receivedOut);\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/StakingRewards.sol:79:9\n   │\n79 │         emit Withdrawn(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/ConstantProductAMM.sol:112:13\n    │\n112 │         if (block.timestamp > deadline) revert 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/NFTMarketplace.sol:73:9\n   │\n73 │         l.nft.safeTransferFrom(address(this), receiver, l.tokenId);\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/LendingPool.sol:131:9\n    │\n131 │         emit CollateralChanged(msg.sender, collateral[msg.sender]);\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/DutchAuction.sol:47:9\n   │\n47 │         nft.transferFrom(seller, address(this), tokenId);\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/StakingRewards.sol:89:9\n   │\n89 │         emit RewardPaid(msg.sender, 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/StakingRewards.sol:100:9\n    │\n100 │         emit RewardCheckpoint(rewardPerTokenStored, lastUpdate);\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/DutchAuction.sol:65:9\n   │\n65 │         emit Bought(msg.sender, cost, msg.value - cost);\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/LendingPool.sol:144:9\n    │\n144 │         emit Borrowed(msg.sender, amount, shares);\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/DutchAuction.sol:74:9\n   │\n74 │         nft.safeTransferFrom(address(this), receiver, tokenId);\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/LendingPool.sol:154:9\n    │\n154 │         emit Repaid(msg.sender, borrower, received, burned);\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/LendingPool.sol:169:9\n    │\n169 │         emit CollateralChanged(borrower, collateral[borrower]);\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/LendingPool.sol:170:9\n    │\n170 │         emit Liquidated(borrower, msg.sender, received, seized);\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/LendingPool.sol:181:9\n    │\n181 │         emit BadDebtWrittenOff(borrower, debt);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\n","passed":true},{"durationMs":102,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/DutchAuction.t.sol:DutchAuctionTest\n[PASS] testFuzzMonotonePrice(uint256) (runs: 256, μ: 29128, ~: 29092)\n[PASS] testRejectedNFTCanRetryAndRefundCannotReenter() (gas: 1052660)\n[PASS] testSaleRefundAndClaim() (gas: 223003)\n[PASS] testUnderpaidDuplicateAndUnauthorized() (gas: 170903)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 10.17ms (9.86ms CPU time)\n\nRan 4 tests for test/PriceOracleAdapter.t.sol:PriceOracleAdapterTest\n[PASS] testFuzzNormalization(uint256) (runs: 256, μ: 56294, ~: 56294)\n[PASS] testHighDecimalsAndDustRevert() (gas: 763339)\n[PASS] testInvalidAnswersAndIncompleteRounds() (gas: 240475)\n[PASS] testNormalizationAndStalenessBoundary() (gas: 53345)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 13.21ms (13.49ms CPU time)\n\nRan 4 tests for test/DAOTreasury.t.sol:DAOTreasuryTest\n[PASS] testDirectAndChangedGovernorRevert() (gas: 147764)\n[PASS] testFuzzReservedConservation(uint256) (runs: 256, μ: 133386, ~: 133407)\n[PASS] testReservedCannotBeDoubleSpent() (gas: 118576)\n[PASS] testTimelockedETHAndTokenSpending() (gas: 397647)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 19.06ms (18.94ms CPU time)\n\nRan 5 tests for test/Vesting.t.sol:VestingTest\n[PASS] testCliffLinearAndCompletion() (gas: 233815)\n[PASS] testFuzzRevocationConservesFunding(uint256) (runs: 256, μ: 196397, ~: 201875)\n[PASS] testRevocationPreservesVested() (gas: 267285)\n[PASS] testTaxMeasuredAtCreation() (gas: 344538)\n[PASS] testUnauthorizedReverts() (gas: 67566)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 21.10ms (21.55ms CPU time)\n\nRan 5 tests for test/ConstantProductAMM.t.sol:ConstantProductAMMTest\n[PASS] testFuzzProductDoesNotDecrease(uint256,bool) (runs: 256, μ: 137577, ~: 137668)\n[PASS] testSlippageDeadlineAndWrongToken() (gas: 774659)\n[PASS] testSwapFeeAndRemove() (gas: 224853)\n[PASS] testTransferTaxesUseActualDeltas() (gas: 240986)\n[PASS] testUnbalancedDepositAndMinimumShares() (gas: 181835)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 24.00ms (24.55ms CPU time)\n\nRan 5 tests for test/MultiSig.t.sol:MultiSigTest\n[PASS] testConfirmRevokeExecute() (gas: 539841)\n[PASS] testDuplicateAndNonOwnerRevert() (gas: 277517)\n[PASS] testFuzzValueConservation(uint256) (runs: 256, μ: 356051, ~: 358089)\n[PASS] testOnlySelfOwnerChangesInvalidatePending() (gas: 784355)\n[PASS] testRemoveOwner() (gas: 443374)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.58ms (27.99ms CPU time)\n\nRan 6 tests for test/Escrow.t.sol:EscrowTest\n[PASS] testDeliveryReleaseAndPull() (gas: 167688)\n[PASS] testDisputeTimeoutAndUnchallengedDelivery() (gas: 173489)\n[PASS] testFuzzResolutionConservesETH(uint256) (runs: 256, μ: 155113, ~: 156321)\n[PASS] testTimeoutRefundAndDuplicateRevert() (gas: 120985)\n[PASS] testUnauthorizedAndInvalidStates() (gas: 131054)\n[PASS] testUnchallengedDeliveryPaysSeller() (gas: 139111)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.58ms (13.49ms CPU time)\n\nRan 8 tests for test/Vault4626.t.sol:Vault4626Test\n[PASS] testCannotCancelOthersOrSpendShares() (gas: 326152)\n[PASS] testCapAndZeroRevert() (gas: 84192)\n[PASS] testDepositYieldAndRedeem() (gas: 233616)\n[PASS] testFuzzRounding(uint256,uint256) (runs: 256, μ: 341871, ~: 344108)\n[PASS] testInflationAttackDoesNotProfit() (gas: 420713)\n[PASS] testQueueReservesAndCancellation() (gas: 743728)\n[PASS] testTaxedDepositExtension() (gas: 576565)\n[PASS] testTokenCallbackCannotReenterDeposit() (gas: 1196770)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 27.53ms (28.64ms CPU time)\n\nRan 5 tests for test/NFTMarketplace.t.sol:NFTMarketplaceTest\n[PASS] testBuyFeeAndPulls() (gas: 233917)\n[PASS] testCancelAndDuplicateReverts() (gas: 207441)\n[PASS] testFuzzFeeConservation(uint256) (runs: 256, μ: 401068, ~: 403211)\n[PASS] testNFTClaimCallbackCannotClaimTwice() (gas: 888974)\n[PASS] testWrongPaymentAndBuyerCannotCancel() (gas: 171095)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.79ms (27.74ms CPU time)\n\nRan 4 tests for test/InsurancePool.t.sol:InsurancePoolTest\n[PASS] testCooldownStopsCoverageAndSharesBearLoss() (gas: 241896)\n[PASS] testFuzzClaimAndExitConservation(uint256) (runs: 256, μ: 397727, ~: 398025)\n[PASS] testPremiumCoverageAndClaim() (gas: 147880)\n[PASS] testUnauthorizedOverCoverageAndLiquidityRevert() (gas: 166609)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 28.37ms (23.89ms CPU time)\n\nRan 7 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testEarlyLateInvalidAndUnauthorizedReveal() (gas: 344174)\n[PASS] testEmptyRoundReturnsBond() (gas: 100311)\n[PASS] testFuzzTicketRefundConservation(uint256) (runs: 256, μ: 474366, ~: 489565)\n[PASS] testOperatorCanBiasOutcomeByChoosingTicketCount() (gas: 392107)\n[PASS] testPrizeWithdrawalCallbackCannotReenter() (gas: 1019620)\n[PASS] testRevealPrizeAndConservation() (gas: 430778)\n[PASS] testWithheldRevealRefundsAndSlashesBond() (gas: 398808)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 28.62ms (29.09ms CPU time)\n\nRan 7 tests for test/Governor.t.sol:GovernorTest\n[PASS] testCancelledAndEarlyVoting() (gas: 330649)\n[PASS] testDefeatAndUnauthorizedCancellation() (gas: 531385)\n[PASS] testFullLifecycle() (gas: 693147)\n[PASS] testFuzzVoteChoice(uint8) (runs: 256, μ: 284915, ~: 269896)\n[PASS] testQuorumFailureBelowFourPercent() (gas: 497695)\n[PASS] testSnapshotPreventsDoubleUseTransferredVotes() (gas: 593702)\n[PASS] testTreasuryGovernedSpending() (gas: 664828)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 28.73ms (30.77ms CPU time)\n\nRan 5 tests for test/Timelock.t.sol:TimelockTest\n[PASS] testCancelAndAuthority() (gas: 147506)\n[PASS] testFuzzDelay(uint256) (runs: 256, μ: 101269, ~: 95026)\n[PASS] testQueueExecuteOnce() (gas: 198318)\n[PASS] testRevertedCallCanRetryAndChangedDataRejected() (gas: 325446)\n[PASS] testTwoStepHandover() (gas: 151885)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 28.69ms (13.94ms CPU time)\n\nRan 6 tests for test/StakingRewards.t.sol:StakingRewardsTest\n[PASS] testFuzzRewardsBounded(uint256,uint256) (runs: 256, μ: 153509, ~: 153535)\n[PASS] testIdlePeriodNotAwardedAndFinishStops() (gas: 277557)\n[PASS] testLateStakerDoesNotTakePastRewards() (gas: 314135)\n[PASS] testOwnerAndActivePeriodReverts() (gas: 116006)\n[PASS] testRewardsAndPrincipal() (gas: 344152)\n[PASS] testTransferTaxStakeAndFunding() (gas: 359636)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.68ms (29.44ms CPU time)\n\nRan 5 tests for test/Subscription.t.sol:SubscriptionTest\n[PASS] testCancelAndResumeRetainsPaidTime() (gas: 266746)\n[PASS] testEarlyDuplicateAndAllowanceFailure() (gas: 281622)\n[PASS] testFuzzDelayedRenewalChargesOnce(uint256) (runs: 256, μ: 263512, ~: 263512)\n[PASS] testSubscribeRenewAndWithdraw() (gas: 301081)\n[PASS] testTaxMeasuredAndUnauthorizedWithdrawalRevert() (gas: 238133)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 29.10ms (28.86ms CPU time)\n\nRan 5 tests for test/Crowdfund.t.sol:CrowdfundTest\n[PASS] testDeadlinesAndAuthority() (gas: 191020)\n[PASS] testFuzzGoalBranches(uint256) (runs: 256, μ: 150011, ~: 145086)\n[PASS] testMissedGoalRefund() (gas: 198552)\n[PASS] testRejectedRefundRestoresCreditAndReentryFails() (gas: 971164)\n[PASS] testSuccessfulCreatorClaim() (gas: 202635)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 29.21ms (29.52ms CPU time)\n\nRan 8 tests for test/LendingPool.t.sol:LendingPoolTest\n[PASS] testBadDebtWriteOffAfterCollateralExhaustion() (gas: 417892)\n[PASS] testBorrowRepayWithdraw() (gas: 390441)\n[PASS] testFuzzBorrowRepayNeverCreatesAssets(uint256,uint256) (runs: 256, μ: 277525, ~: 277659)\n[PASS] testFuzzRoundTripSupply(uint256) (runs: 256, μ: 179364, ~: 179382)\n[PASS] testInterestUtilisationAndLiquidity() (gas: 303512)\n[PASS] testLiquidationBonusAndHealthyRevert() (gas: 383356)\n[PASS] testTransferTaxAccounting() (gas: 405242)\n[PASS] testUnsafeBorrowAndWithdrawalRevert() (gas: 298166)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 30.80ms (46.26ms CPU time)\n\nRan 4 tests for test/FlashLender.t.sol:FlashLenderTest\n[PASS] testFuzzFeeAndSolvency(uint256) (runs: 256, μ: 118978, ~: 118991)\n[PASS] testInvalidCallbackReentrancyAndUnderpaymentRevert() (gas: 441598)\n[PASS] testLoanFeeAndInitiator() (gas: 117407)\n[PASS] testUnsupportedTokenTaxAndOwnerReverts() (gas: 166678)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 32.18ms (32.55ms CPU time)\n\nRan 6 tests for test/TokenBridgeLock.t.sol:TokenBridgeLockTest\n[PASS] testChangedRecipientChainAndExpiryRevert() (gas: 130603)\n[PASS] testFuzzReleaseConservation(uint256) (runs: 256, μ: 130908, ~: 130912)\n[PASS] testSignaturesCannotReplayOnAnotherContract() (gas: 59856)\n[PASS] testThresholdDuplicateSignersRejected() (gas: 355767)\n[PASS] testTransferTaxAndFailedReleaseRollback() (gas: 308219)\n[PASS] testUnlockAndReplayRevert() (gas: 164018)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 32.17ms (33.45ms CPU time)\n\nRan 19 test suites in 33.65ms (494.57ms CPU time): 103 tests passed, 0 failed, 0 skipped (103 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.approve(address,uint256)\",\"ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.swap(address,uint256,uint256,address,uint256)\",\"ConstantProductAMM.transfer(address,uint256)\",\"ConstantProductAMM.transferFrom(address,address,uint256)\",\"Crowdfund.claim()\",\"Crowdfund.pledge()\",\"Crowdfund.refund()\",\"Crowdfund.withdrawETH(address)\",\"DAOTreasury.depositToken(address,uint256)\",\"DAOTreasury.receive()\",\"DAOTreasury.spendETH(address,uint256)\",\"DAOTreasury.spendToken(address,address,uint256,uint256)\",\"DAOTreasury.withdrawETH(address)\",\"DutchAuction.buy()\",\"DutchAuction.claimNFT(address)\",\"DutchAuction.start()\",\"DutchAuction.withdrawETH(address)\",\"Escrow.deliver(bytes32)\",\"Escrow.deposit()\",\"Escrow.dispute()\",\"Escrow.release()\",\"Escrow.resolve(uint256)\",\"Escrow.timeout()\",\"Escrow.withdrawETH(address)\",\"FlashLender.acceptOwnership()\",\"FlashLender.flashLoan(address,address,uint256,bytes)\",\"FlashLender.fund(uint256)\",\"FlashLender.renounceOwnership()\",\"FlashLender.transferOwnership(address)\",\"FlashLender.withdraw(address,uint256,uint256)\",\"Governor.acceptTimelockAdmin()\",\"Governor.cancel(uint256)\",\"Governor.castVote(uint256,uint8)\",\"Governor.execute(uint256)\",\"Governor.propose(address,uint256,bytes)\",\"Governor.queue(uint256)\",\"InsurancePool.acceptOwnership()\",\"InsurancePool.approveClaim(address,uint256)\",\"InsurancePool.exit()\",\"InsurancePool.payPremium(uint256)\",\"InsurancePool.renounceOwnership()\",\"InsurancePool.requestExit()\",\"InsurancePool.transferOwnership(address)\",\"InsurancePool.withdrawETH(address)\",\"LendingPool.accrue()\",\"LendingPool.borrow(uint256,uint256)\",\"LendingPool.depositCollateral(uint256)\",\"LendingPool.liquidate(address,uint256,uint256)\",\"LendingPool.repay(address,uint256)\",\"LendingPool.supply(uint256,uint256)\",\"LendingPool.withdraw(uint256,uint256)\",\"LendingPool.withdrawCollateral(uint256,uint256)\",\"LendingPool.writeOffDust(address)\",\"MultiSig.addOwner(address,uint256)\",\"MultiSig.confirm(uint256)\",\"MultiSig.execute(uint256)\",\"MultiSig.receive()\",\"MultiSig.removeOwner(address,uint256)\",\"MultiSig.revoke(uint256)\",\"MultiSig.submit(address,uint256,bytes)\",\"NFTMarketplace.buy(uint256)\",\"NFTMarketplace.cancel(uint256)\",\"NFTMarketplace.claimNFT(uint256,address)\",\"NFTMarketplace.list(address,uint256,uint256)\",\"NFTMarketplace.withdrawETH(address)\",\"Raffle.buyTicket()\",\"Raffle.claimPrize()\",\"Raffle.expire()\",\"Raffle.refund()\",\"Raffle.reveal(bytes32)\",\"Raffle.withdrawETH(address)\",\"StakingRewards.acceptOwnership()\",\"StakingRewards.claim(uint256)\",\"StakingRewards.fundPeriod(uint256,uint256)\",\"StakingRewards.renounceOwnership()\",\"StakingRewards.stake(uint256)\",\"StakingRewards.transferOwnership(address)\",\"StakingRewards.withdraw(uint256,uint256)\",\"Subscription.cancel()\",\"Subscription.renew(address)\",\"Subscription.subscribe()\",\"Subscription.withdraw(address,uint256)\",\"Timelock.acceptAdmin()\",\"Timelock.cancel(bytes32)\",\"Timelock.execute(address,uint256,bytes,bytes32)\",\"Timelock.queue(address,uint256,bytes,bytes32)\",\"Timelock.receive()\",\"Timelock.transferAdmin(address)\",\"TokenBridgeLock.lock(uint256,bytes32)\",\"TokenBridgeLock.unlock(bytes32,uint256,address,uint256,uint256,bytes[])\",\"Vault4626.addYield(uint256)\",\"Vault4626.approve(address,uint256)\",\"Vault4626.cancelRequest(uint256)\",\"Vault4626.claim(address,uint256)\",\"Vault4626.deposit(uint256,address)\",\"Vault4626.depositReceived(uint256,address,uint256)\",\"Vault4626.mint(uint256,address)\",\"Vault4626.processNext()\",\"Vault4626.redeem(uint256,address,address)\",\"Vault4626.requestRedeem(uint256)\",\"Vault4626.transfer(address,uint256)\",\"Vault4626.transferFrom(address,address,uint256)\",\"Vault4626.withdraw(uint256,address,address)\",\"Vesting.acceptOwnership()\",\"Vesting.create(address,uint256,uint256,uint256,uint256)\",\"Vesting.release(uint256,address,uint256)\",\"Vesting.renounceOwnership()\",\"Vesting.revoke(uint256)\",\"Vesting.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"README.md\":47,\"docs/ANALYSIS.md\":489,\"docs/DEPENDENCIES.md\":9,\"docs/REVIEW.md\":57,\"docs/SUMMARY.md\":61,\"docs/VERIFICATION.txt\":8,\"foundry.toml\":12,\"scripts/update-summary.py\":95,\"src/ConstantProductAMM.sol\":114,\"src/Crowdfund.sol\":59,\"src/DAOTreasury.sol\":70,\"src/DutchAuction.sol\":76,\"src/Escrow.sol\":121,\"src/FlashLender.sol\":71,\"src/Governor.sol\":176,\"src/InsurancePool.sol\":83,\"src/LendingPool.sol\":200,\"src/MultiSig.sol\":147,\"src/NFTMarketplace.sol\":75,\"src/PriceOracleAdapter.sol\":37,\"src/Raffle.sol\":109,\"src/StakingRewards.sol\":102,\"src/Subscription.sol\":89,\"src/Timelock.sol\":101,\"src/TokenBridgeLock.sol\":83,\"src/Vault4626.sol\":163,\"src/Vesting.sol\":88,\"src/common/EtherCredits.sol\":33,\"src/common/TokenIO.sol\":29,\"test/ConstantProductAMM.t.sol\":67,\"test/Crowdfund.t.sol\":94,\"test/DAOTreasury.t.sol\":66,\"test/DutchAuction.t.sol\":72,\"test/Escrow.t.sol\":79,\"test/FlashLender.t.sol\":83,\"test/Governor.t.sol\":166,\"test/InsurancePool.t.sol\":78,\"test/LendingPool.t.sol\":128,\"test/MultiSig.t.sol\":78,\"test/NFTMarketplace.t.sol\":83,\"test/PriceOracleAdapter.t.sol\":79,\"test/Raffle.t.sol\":121,\"test/StakingRewards.t.sol\":92,\"test/Subscription.t.sol\":82,\"test/Timelock.t.sol\":91,\"test/TokenBridgeLock.t.sol\":105,\"test/Vault4626.t.sol\":116,\"test/Vesting.t.sol\":77,\"test/helpers/Attackers.sol\":61,\"test/helpers/TestBase.sol\":79},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3908,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/common/TokenIO.sol:13: TokenIO.pull(IERC20,address,uint256) (src/common/TokenIO.sol#13-18) uses arbitrary from in transferFrom: token.safeTransferFrom(from,address(this),amount) (src/common/TokenIO.sol#15)\n[high/medium] arbitrary-send-eth at src/Timelock.sol:63: Timelock.execute(address,uint256,bytes,bytes32) (src/Timelock.sol#63-77) sends eth to arbitrary user\n[high/medium] reentrancy-balance at src/common/TokenIO.sol:20: Reentrancy in TokenIO.push(IERC20,address,uint256,uint256) (src/common/TokenIO.sol#20-28):\n[high/medium] reentrancy-balance at src/FlashLender.sol:54: Reentrancy in FlashLender.flashLoan(IERC3156FlashBorrower,address,uint256,bytes) (src/FlashLender.sol#54-70):\n[high/medium] reentrancy-balance at src/ConstantProductAMM.sol:47: Reentrancy in ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#47-70):\n[high/medium] reentrancy-balance at src/ConstantProductAMM.sol:92: Reentrancy in ConstantProductAMM.swap(IERC20,uint256,uint256,address,uint256) (src/ConstantProductAMM.sol#92-109):\n[high/medium] reentrancy-balance at src/FlashLender.sol:54: Reentrancy in FlashLender.flashLoan(IERC3156FlashBorrower,address,uint256,bytes) (src/FlashLender.sol#54-70):\n[high/medium] reentrancy-balance at src/ConstantProductAMM.sol:47: Reentrancy in ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#47-70):\n[high/medium] reentrancy-balance at src/common/TokenIO.sol:20: Reentrancy in TokenIO.push(IERC20,address,uint256,uint256) (src/common/TokenIO.sol#20-28):\n[high/medium] reentrancy-balance at src/common/TokenIO.sol:13: Reentrancy in TokenIO.pull(IERC20,address,uint256) (src/common/TokenIO.sol#13-18):\n[high/medium] reentrancy-balance at src/LendingPool.sol:93: Reentrancy in LendingPool.supply(uint256,uint256) (src/LendingPool.sol#93-102):\n[high/medium] reentrancy-balance at src/Vault4626.sol:76: Reentrancy in Vault4626.depositReceived(uint256,address,uint256) (src/Vault4626.sol#76-88):\n[high/medium] reentrancy-balance at src/FlashLender.sol:54: Reentrancy in FlashLender.flashLoan(IERC3156FlashBorrower,address,uint256,bytes) (src/FlashLender.sol#54-70):\n[medium/high] incorrect-equality at src/Vault4626.sol:76: Vault4626.depositReceived(uint256,address,uint256) (src/Vault4626.sol#76-88) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vault4626.sol:153: Vault4626._withdraw(address,address,address,uint256,uint256) (src/Vault4626.sol#153-162) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:92: ConstantProductAMM.swap(IERC20,uint256,uint256,address,uint256) (src/ConstantProductAMM.sol#92-109) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/InsurancePool.sol:60: InsurancePool.requestExit() (src/InsurancePool.sol#60-65) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:47: ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#47-70) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vault4626.sol:145: Vault4626._deposit(address,address,uint256,uint256) (src/Vault4626.sol#145-151) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/InsurancePool.sol:68: InsurancePool.exit() (src/InsurancePool.sol#68-78) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:92: ConstantProductAMM.swap(IERC20,uint256,uint256,address,uint256) (src/ConstantProductAMM.sol#92-109) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/StakingRewards.sol:84: StakingRewards.claim(uint256) (src/StakingRewards.sol#84-91) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:47: ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#47-70) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Vesting.sol:67: Vesting.release(uint256,address,uint256) (src/Vesting.sol#67-75) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:59: LendingPool.borrowRate() (src/LendingPool.sol#59-63) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/common/TokenIO.sol:13: TokenIO.pull(IERC20,address,uint256) (src/common/TokenIO.sol#13-18) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:47: ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#47-70) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:184: LendingPool._burnDebt(address,uint256) (src/LendingPool.sol#184-190) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ConstantProductAMM.sol:73: ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#73-89) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:105: LendingPool.withdraw(uint256,uint256) (src/LendingPool.sol#105-114) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/InsurancePool.sol:38: InsurancePool.payPremium(uint256) (src/InsurancePool.sol#38-47) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:93: LendingPool.supply(uint256,uint256) (src/LendingPool.sol#93-102) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/StakingRewards.sol:52: Reentrancy in StakingRewards.fundPeriod(uint256,uint256) (src/StakingRewards.sol#52-62):\n[medium/medium] reentrancy-no-eth at src/StakingRewards.sol:65: Reentrancy in StakingRewards.stake(uint256) (src/StakingRewards.sol#65-71):\n[medium/medium] reentrancy-no-eth at src/LendingPool.sol:149: Reentrancy in LendingPool.repay(address,uint256) (src/LendingPool.sol#149-155):\n[medium/medium] reentrancy-no-eth at src/LendingPool.sol:158: Reentrancy in LendingPool.liquidate(address,uint256,uint256) (src/LendingPool.sol#158-172):\n[medium/medium] unused-return at src/Subscription.sol:76: Subscription.withdraw(address,uint256) (src/Subscription.sol#76-83) ignores return value by token.push(receiver,amount,minReceived) (src/Subscription.sol#82)\n[medium/medium] unused-return at src/FlashLender.sol:47: FlashLender.withdraw(address,uint256,uint256) (src/FlashLender.sol#47-51) ignores return value by token.push(receiver,amount,minReceived) (src/FlashLender.sol#50)\n[medium/medium] unused-return at src/TokenBridgeLock.sol:60: TokenBridgeLock.unlock(bytes32,uint256,address,uint256,uint256,bytes[]) (src/TokenBridgeLock.sol#60-82) ignores return value by token.push(recipient,amount,0) (src/TokenBridgeLock.sol#81)\n[medium/medium] unused-return at src/Vault4626.sol:132: Vault4626.claim(address,uint256) (src/Vault4626.sol#132-139) ignores return value by IERC20(asset()).push(receiver,amount,minReceived) (src/Vault4626.sol#138)\n[medium/medium] unused-return at src/Vault4626.sol:153: Vault4626._withdraw(address,address,address,uint256,uint256) (src/Vault4626.sol#153-162) ignores return value by IERC20(asset()).push(receiver,assets,assets) (src/Vault4626.sol#161)\n[medium/medium] unused-return at src/LendingPool.sol:136: LendingPool.borrow(uint256,uint256) (src/LendingPool.sol#136-146) ignores return value by loanToken.push(msg.sender,amount,minReceived) (src/LendingPool.sol#145)\n[medium/medium] unused-return at src/StakingRewards.sol:74: StakingRewards.withdraw(uint256,uint256) (src/StakingRewards.sol#74-81) ignores return value by stakingToken.push(msg.sender,amount,minReceived) (src/StakingRewards.sol#80)\n[medium/medium] unused-return at src/StakingRewards.sol:84: StakingRewards.claim(uint256) (src/StakingRewards.sol#84-91) ignores return value by rewardToken.push(msg.sender,amount,minReceived) (src/StakingRewards.sol#90)\n[medium/medium] unused-return at src/LendingPool.sol:105: LendingPool.withdraw(uint256,uint256) (src/LendingPool.sol#105-114) ignores return value by loanToken.push(msg.sender,assets,minReceived) (src/LendingPool.sol#113)\n[medium/medium] unused-return at src/PriceOracleAdapter.sol:29: PriceOracleAdapter.price() (src/PriceOracleAdapter.sol#29-36) ignores return value by (round,answer,None,updated,answered) = feed.latestRoundData() (src/PriceOracleAdapter.sol#30)\n[medium/medium] unused-return at src/Vesting.sol:67: Vesting.release(uint256,address,uint256) (src/Vesting.sol#67-75) ignores return value by token.push(receiver,amount,minReceived) (src/Vesting.sol#74)\n[medium/medium] unused-return at src/ConstantProductAMM.sol:73: ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#73-89) ignores return value by token0.push(msg.sender,a,min0) (src/ConstantProductAMM.sol#87)\n[medium/medium] unused-return at src/Vesting.sol:78: Vesting.revoke(uint256) (src/Vesting.sol#78-87) ignores return value by token.push(owner(),returned,0) (src/Vesting.sol#86)\n[medium/medium] unused-return at src/LendingPool.sol:124: LendingPool.withdrawCollateral(uint256,uint256) (src/LendingPool.sol#124-133) ignores return value by collateralToken.push(msg.sender,amount,minReceived) (src/LendingPool.sol#132)\n[medium/medium] unused-return at src/DAOTreasury.sol:57: DAOTreasury.spendToken(IERC20,address,uint256,uint256) (src/DAOTreasury.sol#57-65) ignores return value by token.push(recipient,amount,minReceived) (src/DAOTreasury.sol#64)\n[medium/medium] unused-return at src/ConstantProductAMM.sol:73: ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256) (src/ConstantProductAMM.sol#73-89) ignores return value by token1.push(msg.sender,b,min1) (src/ConstantProductAMM.sol#88)\n[medium/medium] unused-return at src/LendingPool.sol:158: LendingPool.liquidate(address,uint256,uint256) (src/LendingPool.sol#158-172) ignores return value by collateralToken.push(msg.sender,seized,minCollateral) (src/LendingPool.sol#171)\n[medium/medium] unused-return at src/FlashLender.sol:54: FlashLender.flashLoan(IERC3156FlashBorrower,address,uint256,bytes) (src/FlashLender.sol#54-70) ignores return value by token.push(address(receiver),amount,amount) (src/FlashLender.sol#62)\n[low/medium] missing-zero-check at src/Timelock.sol:63: Timelock.execute(address,uint256,bytes,bytes32).target (src/Timelock.sol#63) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/Vesting.sol:40: Reentrancy in Vesting.create(address,uint256,uint256,uint256,uint256) (src/Vesting.sol#40-54):\n[low/medium] reentrancy-benign at src/LendingPool.sol:93: Reentrancy in LendingPool.supply(uint256,uint256) (src/LendingPool.sol#93-102):\n[low/medium] reentrancy-benign at src/TokenBridgeLock.sol:43: Reentrancy in TokenBridgeLock.lock(uint256,bytes32) (src/TokenBridgeLock.sol#43-48):\n[low/medium] reentrancy-benign at src/LendingPool.sol:117: Reentrancy in LendingPool.depositCollateral(uint256) (src/LendingPool.sol#117-121):\n[low/medium] reentrancy-benign at src/Subscription.sol:85: Reentrancy in Subscription._charge(address) (src/Subscription.sol#85-88):\n[low/medium] timestamp at src/Raffle.sol:54: Raffle.buyTicket() (src/Raffle.sol#54-61) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:59: LendingPool.borrowRate() (src/LendingPool.sol#59-63) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:51: Crowdfund.refund() (src/Crowdfund.sol#51-58) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:124: LendingPool.withdrawCollateral(uint256,uint256) (src/LendingPool.sol#124-133) uses timestamp for comparisons\n[low/medium] timestamp at src/StakingRewards.sol:84: StakingRewards.claim(uint256) (src/StakingRewards.sol#84-91) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:57: Vesting.vested(uint256) (src/Vesting.sol#57-64) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:33: Crowdfund.pledge() (src/Crowdfund.sol#33-39) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:42: Crowdfund.claim() (src/Crowdfund.sol#42-48) uses timestamp for comparisons\n[low/medium] timestamp at src/TokenBridgeLock.sol:60: TokenBridgeLock.unlock(bytes32,uint256,address,uint256,uint256,bytes[]) (src/TokenBridgeLock.sol#60-82) uses timestamp for comparisons\n[low/medium] timestamp at src/Crowdfund.sol:20: Crowdfund.constructor(address,uint256,uint256) (src/Crowdfund.sol#20-30) uses timestamp for comparisons\n[low/medium] timestamp at src/InsurancePool.sol:60: InsurancePool.requestExit() (src/InsurancePool.sol#60-65) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:95: Escrow.resolve(uint256) (src/Escrow.sol#95-100) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:67: Subscription.renew(address) (src/Subscription.sol#67-73) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:136: LendingPool.borrow(uint256,uint256) (src/LendingPool.sol#136-146) uses timestamp for comparisons\n[low/medium] timestamp at src/ConstantProductAMM.sol:111: ConstantProductAMM._deadline(uint256) (src/ConstantProductAMM.sol#111-113) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:41: Subscription.active(address) (src/Subscription.sol#41-43) uses timestamp for comparisons\n[low/medium] timestamp at src/Vesting.sol:40: Vesting.create(address,uint256,uint256,uint256,uint256) (src/Vesting.sol#40-54) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:149: LendingPool.repay(address,uint256) (src/LendingPool.sol#149-155) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:33: Escrow.constructor(address,address,address,uint256,uint256,uint256) (src/Escrow.sol#33-53) uses timestamp for comparisons\n[low/medium] timestamp at src/DutchAuction.sol:58: DutchAuction.buy() (src/DutchAuction.sol#58-66) uses timestamp for comparisons\n[low/medium] timestamp at src/Raffle.sol:64: Raffle.reveal(bytes32) (src/Raffle.sol#64-78) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:65: Escrow.deliver(bytes32) (src/Escrow.sol#65-73) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:105: LendingPool.withdraw(uint256,uint256) (src/LendingPool.sol#105-114) uses timestamp for comparisons\n[low/medium] timestamp at src/StakingRewards.sol:52: StakingRewards.fundPeriod(uint256,uint256) (src/StakingRewards.sol#52-62) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:56: Escrow.deposit() (src/Escrow.sol#56-62) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:83: Escrow.dispute() (src/Escrow.sol#83-92) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:184: LendingPool._burnDebt(address,uint256) (src/LendingPool.sol#184-190) uses timestamp for comparisons\n[low/medium] timestamp at src/InsurancePool.sol:68: InsurancePool.exit() (src/InsurancePool.sol#68-78) uses timestamp for comparisons\n[low/medium] timestamp at src/PriceOracleAdapter.sol:29: PriceOracleAdapter.price() (src/PriceOracleAdapter.sol#29-36) uses timestamp for comparisons\n[low/medium] timestamp at src/Raffle.sol:92: Raffle.expire() (src/Raffle.sol#92-97) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:93: LendingPool.supply(uint256,uint256) (src/LendingPool.sol#93-102) uses timestamp for comparisons\n[low/medium] timestamp at src/Timelock.sol:63: Timelock.execute(address,uint256,bytes,bytes32) (src/Timelock.sol#63-77) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:158: LendingPool.liquidate(address,uint256,uint256) (src/LendingPool.sol#158-172) uses timestamp for comparisons\n[low/medium] timestamp at src/Subscription.sol:46: Subscription.subscribe() (src/Subscription.sol#46-56) uses timestamp for comparisons\n[low/medium] timestamp at src/Escrow.sol:103: Escrow.timeout() (src/Escrow.sol#103-113) uses timestamp for comparisons\n[low/medium] timesta","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/common/TokenIO.sol:13: TokenIO.pull(IERC20,address,uint256) (src/common/TokenIO.sol#13-18) uses arbitrary from in transferFrom: token.safeTransferFrom(from,address(this),amount) (src/common/TokenIO.sol#15)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"7865f5bcb03fec9b467372e9bd681ef665d9cd97afe874be2139b2b6ee7cbf9a","verifiedTreeHash":"ebcef8aeb39326f8c7ed9d478ef797c3ee71bdac","verifierVersion":"0.1.0+be003835"},{"checks":[{"durationMs":6009,"exitCode":0,"name":"build","output":"Compiling 105 files with Solc 0.8.26\nSolc 0.8.26 finished in 5.90s\nCompiler run successful!\nwarning[missing-events-access-control]: `confirmed` is changed without an event but is used for access control\n   ╭▸ src/MultiSig.sol:93:9\n   │\n93 │         confirmed[id][msg.sender] = false;\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/PriceOracleAdapter.sol:34:79\n   │\n34 │             round == 0 || answer <= 0 || updated == 0 || started > updated || updated > block.timestamp\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/PriceOracleAdapter.sol:35:20\n   │\n35 │                 || block.timestamp - updated > 1 hours || answeredInRound < round\n   │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PriceOracleAdapter.sol:37:30\n   │\n37 │         result = Math.mulDiv(uint256(answer), 1e18, feedUnit);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Vesting.sol:57:74\n   │\n57 │             beneficiary == address(0) || beneficiary == address(this) || start < block.timestamp\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/MultiSig.sol:53:82\n   │\n53 │             if (owner == address(0) || owner == address(this) || isOwner[owner]) revert InvalidInput();\n   │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/FlashLender.sol:72:9\n   │\n72 │         emit FlashLoan(msg.sender, amount, fee);\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/Vesting.sol:71:13\n   │\n71 │         if (block.timestamp < g.cliff) return 0;\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/DAOTreasury.sol:28:17\n   │\n28 │     constructor(address votingGovernor, ITreasuryTimelock executor) {\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/Vesting.sol:82:9\n   │\n82 │         emit Released(id, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/MultiSig.sol:105:29\n    │\n105 │         (success, result) = t.target.call{value: t.value}(t.data);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/MultiSig.sol:105:29\n    │\n105 │         (success, result) = t.target.call{value: t.value}(t.data);\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/Vesting.sol:94:9\n   │\n94 │         emit Revoked(id, accrued, refund);\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/Crowdfund.sol:31:13\n   │\n31 │         if (block.timestamp >= deadline) revert WrongState();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `autoRenew` is changed without an event but is used for access control\n   ╭▸ src/Subscription.sol:63:9\n   │\n63 │         autoRenew[msg.sender] = false;\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/Crowdfund.sol:41:13\n   │\n41 │         if (block.timestamp < deadline || totalPledged < goal || claimed) revert WrongState();\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/Crowdfund.sol:49:13\n   │\n49 │         if (block.timestamp < deadline || totalPledged >= goal) revert WrongState();\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/Subscription.sol:51:13\n   │\n51 │         if (block.timestamp >= paidUntil[msg.sender]) _renew(msg.sender);\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/Subscription.sol:56:39\n   │\n56 │         if (!autoRenew[subscriber] || block.timestamp < paidUntil[subscriber]) revert NotReady();\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/NFTMarketplace.sol:39:9\n   │\n39 │         nft.transferFrom(msg.sender, address(this), tokenId);\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/NFTMarketplace.sol:54:9\n   │\n54 │         l.nft.safeTransferFrom(address(this), recipient, l.tokenId);\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/ConstantProductAMM.sol:39:13\n   │\n39 │         if (block.timestamp > deadline || max0 == 0 || max1 == 0) revert InvalidInput();\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/common/EthCredits.sol:29:13\n   │\n29 │             emit Credited(account, 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/Subscription.sol:88:16\n   │\n88 │         return block.timestamp < paidUntil[subscriber];\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/ConstantProductAMM.sol:107:9\n    │\n107 │         emit ReservesUpdated(r0, r1);\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/ConstantProductAMM.sol:62:9\n   │\n62 │         emit LiquidityAdded(msg.sender, amount0, amount1, shares);\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/NFTMarketplace.sol:53:9\n   │\n53 │         emit Bought(id, msg.sender, recipient, fee);\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/NFTMarketplace.sol:64:9\n   │\n64 │         l.nft.transferFrom(address(this), msg.sender, l.tokenId);\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/ConstantProductAMM.sol:71:13\n   │\n71 │         if (block.timestamp > deadline || shares == 0) revert InvalidInput();\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/ConstantProductAMM.sol:78:9\n   │\n78 │         emit LiquidityRemoved(msg.sender, amount0, amount1, shares);\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/ConstantProductAMM.sol:89:13\n   │\n89 │         if (block.timestamp > deadline || (input != token0 && input != token1) || totalSupply() == 0) revert InvalidInput();\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/ConstantProductAMM.sol:100:9\n    │\n100 │         emit Swapped(msg.sender, address(input), received, output);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `proposals` is changed without an event but is used for access control\n    ╭▸ src/Governor.sol:171:9\n    │\n171 │         proposals[id].cancelled = true;\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/Governor.sol:91:20\n   │\n91 │                 || token.getPastVotes(msg.sender, block.timestamp - 1) == 0\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/Governor.sol:113:13\n    │\n113 │         if (block.timestamp <= p.snapshot) return State.Pending;\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/Governor.sol:114:13\n    │\n114 │         if (block.timestamp <= p.deadline) return State.Active;\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/TokenBridgeLock.sol:34:62\n   │\n34 │             if (relayer == address(0) || isRelayer[relayer]) revert InvalidInput();\n   │                                                              ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Vault4626.sol:107:9\n    │\n107 │         emit Deposit(msg.sender, receiver, received, shares);\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/Governor.sol:147:9\n    │\n147 │         emit Voted(id, msg.sender, support, weight);\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/Governor.sol:155:23\n    │\n155 │         p.operation = timelock.queue(p.target, p.value, p.data, bytes32(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/Governor.sol:156:9\n    │\n156 │         emit Queued(id, p.operation);\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/Governor.sol:164:31\n    │\n164 │         bytes memory result = timelock.execute(p.operation);\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/TokenBridgeLock.sol:66:54\n   │\n66 │             sourceId == bytes32(0) || amount == 0 || block.timestamp > deadline || processed[sourceId]\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/Governor.sol:165:9\n    │\n165 │         emit Executed(id, keccak256(result));\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/TokenBridgeLock.sol:77:9\n   │\n77 │         emit Unlocked(sourceId, msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/TokenBridgeLock.sol:73:59\n   │\n73 │             if (!isRelayer[signer] || signer <= previous) revert InvalidAuthorization();\n   │                                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Governor.sol:172:9\n    │\n172 │         emit Cancelled(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/Vault4626.sol:146:29\n    │\n146 │         if (r.shares > 0 && block.timestamp < r.readyAt) revert NotReady();\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/Governor.sol:177:9\n    │\n177 │         timelock.acceptAdmin();\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/Governor.sol:178:9\n    │\n178 │         emit TimelockAdminAccepted();\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/InsurancePool.sol:49:9\n   │\n49 │         emit PremiumPaid(msg.sender, received, minted, coverage[msg.sender]);\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/InsurancePool.sol:84:27\n   │\n84 │         if (ready == 0 || block.timestamp < ready) revert NotReady();\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/InsurancePool.sol:90:9\n   │\n90 │         emit Exited(msg.sender, burned, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/common/EthCredits.sol:21:27\n   │\n21 │         (bool success,) = payable(msg.sender).call{value: amount}(\"\");\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/DutchAuction.sol:50:9\n   │\n50 │         nft.transferFrom(msg.sender, address(this), tokenId);\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/LendingPool.sol:91:9\n   │\n91 │         emit Supplied(msg.sender, received, shares);\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/DutchAuction.sol:73:9\n   │\n73 │         nft.safeTransferFrom(address(this), recipient, tokenId);\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/DutchAuction.sol:66:70\n   │\n66 │             recipient == address(0) || recipient == address(this) || block.timestamp > deadline\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/LendingPool.sol:103:9\n    │\n103 │         emit Withdrawn(msg.sender, assets, shares);\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/DutchAuction.sol:72:9\n   │\n72 │         emit Sold(msg.sender, recipient, cost);\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/DutchAuction.sol:86:39\n   │\n86 │         if (previous == State.Active) nft.transferFrom(address(this), seller, tokenId);\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/DutchAuction.sol:80:71\n   │\n80 │         if (previous != State.Created && (previous != State.Active || block.timestamp < startedAt + duration))\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/LendingPool.sol:122:9\n    │\n122 │         emit CollateralChanged(msg.sender, collateral[msg.sender]);\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/LendingPool.sol:140:9\n    │\n140 │         emit Borrowed(msg.sender, amount, shares);\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/LendingPool.sol:204:9\n    │\n204 │         emit Repaid(msg.sender, borrower, received, shares);\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/StakingRewards.sol:55:13\n   │\n55 │         if (block.timestamp < periodFinish) revert PeriodActive();\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/StakingRewards.sol:63:9\n   │\n63 │         emit PeriodFunded(received, rewardRate, periodFinish);\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/LendingPool.sol:166:9\n    │\n166 │         emit CollateralChanged(borrower, collateral[borrower]);\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/LendingPool.sol:167:9\n    │\n167 │         emit Liquidated(msg.sender, borrower, received, seized);\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/StakingRewards.sol:72:9\n   │\n72 │         emit Staked(msg.sender, received);\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/LendingPool.sol:182:9\n    │\n182 │         emit InterestAccrued(interest, block.timestamp);\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/StakingRewards.sol:81:9\n   │\n81 │         emit Withdrawn(msg.sender, 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/StakingRewards.sol:91:9\n   │\n91 │         emit RewardPaid(msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n   ╭▸ src/Timelock.sol:76:29\n   │\n76 │         (success, result) = op.target.call{value: op.value}(op.data);\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Raffle.sol:65:36\n   │\n65 │         if (state != State.Open || block.timestamp >= saleEnd || ticketCount >= maxTickets) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n   ╭▸ src/Timelock.sol:76:29\n   │\n76 │         (success, result) = op.target.call{value: op.value}(op.data);\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Escrow.sol:46:47\n   │\n46 │         if (state != State.AwaitingDeposit || block.timestamp >= deliveryDeadline) revert WrongState();\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/Timelock.sol:72:32\n   │\n72 │         if (op.readyAt == 0 || block.timestamp < op.readyAt || op.done || op.cancelled) revert NotReady();\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/Raffle.sol:78:36\n   │\n78 │         if (state != State.Open || block.timestamp < saleEnd || block.timestamp >= revealEnd) {\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/Raffle.sol:78:65\n   │\n78 │         if (state != State.Open || block.timestamp < saleEnd || block.timestamp >= revealEnd) {\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/Escrow.sol:55:38\n   │\n55 │         if (state != State.Funded || block.timestamp >= deliveryDeadline) revert WrongState();\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/Raffle.sol:93:36\n   │\n93 │         if (state != State.Open || block.timestamp < revealEnd) revert WrongState();\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/Escrow.sol:71:68\n   │\n71 │         if ((state != State.Funded && state != State.Delivered) || block.timestamp >= refundAt) {\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/Escrow.sol:82:40\n   │\n82 │         if (state != State.Disputed || block.timestamp >= refundAt) revert WrongState();\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/Escrow.sol:89:73\n   │\n89 │         if (state == State.AwaitingDeposit || state == State.Settled || block.timestamp < refundAt) {\n   │                                                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":4927,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/CallbackHardening.t.sol:CallbackHardeningTest\n[PASS] testAMMLiquidityAndSwapCallbacksAreGuarded() (gas: 2379418)\n[PASS] testBridgeLockAndUnlockCallbacksAreGuarded() (gas: 1359025)\n[PASS] testInsurancePremiumClaimAndExitCallbacksAreGuarded() (gas: 1570260)\n[PASS] testStakingPrincipalAndRewardCallbacksAreGuarded() (gas: 2713188)\n[PASS] testSubscriptionDepositPrincipalAndRevenueCallbacksAreGuarded() (gas: 1485341)\n[PASS] testTreasuryFundingAndSpendingCallbacksAreGuarded() (gas: 3047485)\n[PASS] testVestingFundingReleaseAndRevocationCallbacksAreGuarded() (gas: 1564967)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.58ms (3.25ms CPU time)\n\nRan 8 tests for test/DutchAuction.t.sol:DutchAuctionTest\n[PASS] testActivationCannotRepeatAndCancellationIsTerminal() (gas: 245128)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 136943)\n[PASS] testBuyAndRefundExcess() (gas: 272367)\n[PASS] testCancelOnlySellerAfterFloor() (gas: 141090)\n[PASS] testCannotBuyTwiceOrUnderpay() (gas: 210448)\n[PASS] testExpiredBuyerDeadline() (gas: 48737)\n[PASS] testFuzzPriceMonotonicAndBounded(uint256,uint256) (runs: 1000, μ: 27488, ~: 27488)\n[PASS] testSlippageAndInvalidRecipientLeaveNFTAndETHUntouched() (gas: 247714)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 24.75ms (24.36ms CPU time)\n\nRan 8 tests for test/DAOTreasury.t.sol:DAOTreasuryTest\n[PASS] testAdminHandoverDisablesTreasurySpending() (gas: 164256)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 87109)\n[PASS] testDirectAndGovernorCallsCannotSpend() (gas: 68239)\n[PASS] testFuzzAuthorizedAllocationSolvency(uint256) (runs: 1000, μ: 95810, ~: 95820)\n[PASS] testGovernanceETHSpendingAndWithdrawal() (gas: 783948)\n[PASS] testGovernanceTokenSpending() (gas: 833101)\n[PASS] testInvalidRecipientsAndTokenSlippageRollback() (gas: 302938)\n[PASS] testReservedFundsCannotBeAllocatedAgain() (gas: 772249)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 49.22ms (45.52ms CPU time)\n\nRan 10 tests for test/Timelock.t.sol:TimelockTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 56459)\n[PASS] testCancelAndUnauthorized() (gas: 350241)\n[PASS] testExactDelayAndCancelledSaltCannotBeReused() (gas: 567520)\n[PASS] testExecuteAndPreventReplay() (gas: 390090)\n[PASS] testFuzzDelayNeverBypassed(uint256) (runs: 1000, μ: 211439, ~: 211439)\n[PASS] testGovernorIntegration() (gas: 2725450)\n[PASS] testInvalidUnknownAndOversizedOperations() (gas: 279148)\n[PASS] testNomineeReplacementDoesNotAuthorizeOldNominee() (gas: 173534)\n[PASS] testRevertedCallCanRetry() (gas: 441389)\n[PASS] testTwoStepHandover() (gas: 154894)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 70.34ms (69.83ms CPU time)\n\nRan 8 tests for test/ConstantProductAMM.t.sol:ConstantProductAMMTest\n[PASS] testDeadlineSlippageAndWrongToken() (gas: 780762)\n[PASS] testDonationsCannotBeStolenThroughLiquidity() (gas: 248320)\n[PASS] testFuzzKNondecreasing(uint256,bool) (runs: 1000, μ: 155028, ~: 155041)\n[PASS] testLiquiditySharesAndMinimumBurn() (gas: 322546)\n[PASS] testMinimumInitialLiquidityAndEmptySwap() (gas: 301510)\n[PASS] testOutputSlippageRollsBackSwapAndLiquidityBurn() (gas: 236358)\n[PASS] testSwapFeeAndInvariant() (gas: 120603)\n[PASS] testTaxedInputAndOutput() (gas: 255038)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 73.16ms (72.41ms CPU time)\n\nRan 10 tests for test/Escrow.t.sol:EscrowTest\n[PASS] testArbitrationSplit() (gas: 250353)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 101173)\n[PASS] testDeliveredAndDisputedTimeouts() (gas: 250668)\n[PASS] testDeliveryReleaseAndWithdraw() (gas: 223101)\n[PASS] testExactDeliveryDeadlineRejectsDeliveryAndAllowsRefund() (gas: 214496)\n[PASS] testFundedTimeout() (gas: 176685)\n[PASS] testFuzzSettlementConservation(uint256) (runs: 1000, μ: 225155, ~: 225705)\n[PASS] testOversizedResolutionCanRetryAndSettledStateIsTerminal() (gas: 301330)\n[PASS] testUnauthorizedAndWrongStates() (gas: 212101)\n[PASS] testWrongPaymentAndDuplicateDepositPreserveEscrow() (gas: 145180)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 75.33ms (74.84ms CPU time)\n\nRan 9 tests for test/NFTMarketplace.t.sol:NFTMarketplaceTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 211345)\n[PASS] testBuyFeeAndPullPayments() (gas: 451702)\n[PASS] testCancelAndUnauthorized() (gas: 356301)\n[PASS] testFuzzFeeConservation(uint256) (runs: 1000, μ: 374331, ~: 376801)\n[PASS] testMissingApprovalAndZeroPriceCannotCreateListing() (gas: 296373)\n[PASS] testReceiverCallbackCannotReenter() (gas: 682839)\n[PASS] testRejectedNFTReceiverRollsBackSaleAndCredits() (gas: 565942)\n[PASS] testRejectingSellerDoesNotBlockSale() (gas: 1697474)\n[PASS] testWrongPriceAndDuplicateBuy() (gas: 434166)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 93.92ms (93.26ms CPU time)\n\nRan 8 tests for test/MultiSig.t.sol:MultiSigTest\n[PASS] testConfirmRevokeAndExecute() (gas: 522304)\n[PASS] testFuzzConservation(uint256) (runs: 1000, μ: 363317, ~: 364163)\n[PASS] testInvalidOwnerSetsAndThresholds() (gas: 4880)\n[PASS] testInvalidSubmissionAndDirectAdminActions() (gas: 233863)\n[PASS] testRemoveOwnerAndThreshold() (gas: 484802)\n[PASS] testRevertingCallPreservesApprovals() (gas: 378562)\n[PASS] testSelfOnlyMembershipAndEpochInvalidation() (gas: 747034)\n[PASS] testUnauthorizedDuplicateAndUnknownActions() (gas: 323660)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 96.24ms (96.47ms CPU time)\n\nRan 9 tests for test/FlashLender.t.sol:FlashLenderTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 74953)\n[PASS] testCallbackFailureAndNoRepaymentRollback() (gas: 147181)\n[PASS] testFuzzFeeAndConservation(uint256) (runs: 1000, μ: 97209, ~: 97216)\n[PASS] testLoanFeeAndWithdrawal() (gas: 161425)\n[PASS] testReentryBlockedAndCallerBound() (gas: 129302)\n[PASS] testRevertedOwnerOutputMinimumLeavesCapitalIntact() (gas: 220586)\n[PASS] testTaxedPrincipalSafelyRejected() (gas: 126169)\n[PASS] testUnsupportedTokenAndUnauthorizedWithdraw() (gas: 52110)\n[PASS] testZeroAndExcessLoansNeverCallBorrowerOrMoveFunds() (gas: 103907)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 101.61ms (101.77ms CPU time)\n\nRan 10 tests for test/Subscription.t.sol:SubscriptionTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 254885)\n[PASS] testCannotRenewEarlyCancelledOrUnfunded() (gas: 371518)\n[PASS] testExactExpiryAllowsOneRenewalAndRejectsSecond() (gas: 360672)\n[PASS] testFuzzAccountingConservation(uint256) (runs: 1000, μ: 329407, ~: 329652)\n[PASS] testInsufficientFundsSubscribeRollbackDoesNotLeaveOptIn() (gas: 202322)\n[PASS] testMerchantCannotStealPrepaidAndCallerCannotStealRevenue() (gas: 284224)\n[PASS] testResumeAndLateRenewalDoNotOvercharge() (gas: 376828)\n[PASS] testRevertedTaxedWithdrawalsKeepPrepaidAndMerchantRevenue() (gas: 585418)\n[PASS] testSubscribeRenewCancelAndWithdraw() (gas: 462887)\n[PASS] testTaxedDepositIsNetCredited() (gas: 180247)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 106.22ms (106.54ms CPU time)\n\nRan 9 tests for test/InsurancePool.t.sol:InsurancePoolTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 96676)\n[PASS] testCooldownAndCoverageSurrender() (gas: 210106)\n[PASS] testCoverageClaimAndSocialisedLoss() (gas: 331290)\n[PASS] testExitingMemberCannotPayPremiumOrRestartCooldown() (gas: 331431)\n[PASS] testFuzzSolvency(uint256) (runs: 1000, μ: 209207, ~: 209242)\n[PASS] testOnlyOwnerCoverageAndSolvencyCaps() (gas: 114694)\n[PASS] testReservedClaimsSurviveExits() (gas: 254752)\n[PASS] testRevertedClaimKeepsReservationAndCanRetry() (gas: 374522)\n[PASS] testZeroPremiumAndApprovalDoNotChangeAccounting() (gas: 100863)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 113.98ms (114.46ms CPU time)\n\nRan 7 tests for test/PriceOracleAdapter.t.sol:PriceOracleAdapterTest\n[PASS] testFuzzEverySupportedDecimalAndDust(uint256,uint8) (runs: 1000, μ: 336515, ~: 339542)\n[PASS] testFuzzNormalization(uint256,uint256) (runs: 1000, μ: 58861, ~: 58875)\n[PASS] testFuzzStalePricesAlwaysRevert(uint256) (runs: 1000, μ: 55729, ~: 55730)\n[PASS] testHighDecimalFeedAndDustRejection() (gas: 386386)\n[PASS] testNonPositiveFutureAndIncompleteRound() (gas: 241518)\n[PASS] testNormalizationAndHourBoundary() (gas: 53804)\n[PASS] testUnsupportedPrecisionAndEmptyCode() (gas: 3845)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 124.23ms (166.36ms CPU time)\n\nRan 8 tests for test/Crowdfund.t.sol:CrowdfundTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 86376)\n[PASS] testEarlyAndUnauthorizedActions() (gas: 132852)\n[PASS] testForcedEthDoesNotMeetGoal() (gas: 207372)\n[PASS] testFuzzConservation(uint256) (runs: 1000, μ: 180564, ~: 175003)\n[PASS] testFuzzExactDeadlineBlocksAdditionalFunding(uint256) (runs: 1000, μ: 55303, ~: 55303)\n[PASS] testGoalMetCreatorClaim() (gas: 327817)\n[PASS] testMissedGoalRefund() (gas: 252012)\n[PASS] testZeroPledgeAndSuccessfulCampaignRefundRejected() (gas: 278864)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 178.90ms (86.27ms CPU time)\n\nRan 13 tests for test/Vault4626.t.sol:Vault4626Test\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 39014)\n[PASS] testCapAndAuthority() (gas: 285613)\n[PASS] testCapReductionCannotFreezeExistingAssets() (gas: 248115)\n[PASS] testDepositYieldRedeem() (gas: 231645)\n[PASS] testDonationAttackNoZeroShares() (gas: 413717)\n[PASS] testFuzzNoRoundTripProfit(uint256,uint256) (runs: 1000, μ: 383739, ~: 384934)\n[PASS] testMintWithdrawRounding() (gas: 365821)\n[PASS] testQueueCancelCannotSteal() (gas: 422638)\n[PASS] testQueueFailureDoesNotCreatePhantomRequests() (gas: 626480)\n[PASS] testQueueReservesAndClaim() (gas: 602055)\n[PASS] testRevertedClaimPreservesReservationAndCanRetry() (gas: 570273)\n[PASS] testTaxedDepositExtensionAndOutput() (gas: 655879)\n[PASS] testTokenCallbackCannotProcessQueueDuringDeposit() (gas: 1409535)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 179.07ms (179.98ms CPU time)\n\nRan 9 tests for test/Vesting.t.sol:VestingTest\n[PASS] testBeforeCliffRevokeReturnsAll() (gas: 302806)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 330317)\n[PASS] testCliffLinearAndFullRelease() (gas: 482836)\n[PASS] testFuzzRevocationConservation(uint256) (runs: 1000, μ: 415297, ~: 444894)\n[PASS] testInvalidSchedulesAndEmptyGrantsLeaveFundingUntouched() (gas: 175588)\n[PASS] testIrrevocableAndAccessControl() (gas: 311524)\n[PASS] testRevertedTaxedReleaseAndRevocationAreRetryable() (gas: 745067)\n[PASS] testRevocationPreservesVested() (gas: 476169)\n[PASS] testTaxedGrantAndMultipleBeneficiaries() (gas: 639539)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 63.57ms (64.10ms CPU time)\n\nRan 16 tests for test/LendingPool.t.sol:LendingPoolTest\n[PASS] testBorrowRepayAndWithdraw() (gas: 402993)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 162201)\n[PASS] testCannotDebitAnotherApprover() (gas: 163621)\n[PASS] testDebtFreeCollateralExitDoesNotNeedWorkingOracle() (gas: 116230)\n[PASS] testFrequentAccrualDoesNotEraseFractionalInterest() (gas: 4785070)\n[PASS] testFuzzBorrowConservation(uint256) (runs: 1000, μ: 271053, ~: 271080)\n[PASS] testIlliquidWithdrawalPreservesSupplierShares() (gas: 230240)\n[PASS] testInterestAndUtilisation() (gas: 254306)\n[PASS] testLiquidationFivePercent() (gas: 351499)\n[PASS] testRevertOverBorrowAndHealthyLiquidation() (gas: 340052)\n[PASS] testRevertUnsafeRemovalAndOverRepay() (gas: 273674)\n[PASS] testRevertedBorrowOutputMinimumRollsBackDebt() (gas: 239095)\n[PASS] testTaxedRepayCreditsOnlyReceived() (gas: 308125)\n[PASS] testTaxedSupplyAndCollateral() (gas: 370542)\n[PASS] testTokenCallbackCannotAccrueDuringSupply() (gas: 1176013)\n[PASS] testZeroInputsAndSlippageRollback() (gas: 242124)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 182.55ms (183.29ms CPU time)\n\nRan 4 tests for test/TokenCompatibility.t.sol:TokenCompatibilityTest\n[PASS] testFalseReturnOutputPreservesSharesAndPrepaidBalance() (gas: 448706)\n[PASS] testFalseReturnTransferFromRollsBackBothTokensAndEntitlements() (gas: 223724)\n[PASS] testFuzzNoReturnTokenDepositWithdrawalRoundTrip(uint256) (runs: 1000, μ: 411328, ~: 411370)\n[PASS] testTokenPauseBlocksOutputsWithoutDestroyingClaims() (gas: 551185)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 189.94ms (189.51ms CPU time)\n\nRan 9 tests for test/Governor.t.sol:GovernorTest\n[PASS] testAgainstDoesNotMeetQuorumAndInvalidSupport() (gas: 313900)\n[PASS] testDelayCancelAndInvalidProposal() (gas: 325746)\n[PASS] testExactSnapshotAndDeadlineBoundaries() (gas: 603231)\n[PASS] testFuzzQuorumRoundsUpForSmallSupply(uint256) (runs: 1000, μ: 2061019, ~: 2061023)\n[PASS] testFuzzTalliesBoundedBySupply(uint8,uint8) (runs: 1000, μ: 351399, ~: 356533)\n[PASS] testHistoricalWeightCannotMoveAndVoteTwice() (gas: 509608)\n[PASS] testInvalidTargetCalldataAndUnknownProposal() (gas: 193530)\n[PASS] testLifecycleAndQuorum() (gas: 528581)\n[PASS] testNoVotesDefeatsProposal() (gas: 243464)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 189.96ms (295.79ms CPU time)\n\nRan 11 tests for test/StakingRewards.t.sol:StakingRewardsTest\n[PASS] testAuthorityAndFixedPeriod() (gas: 278796)\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 149694)\n[PASS] testFuzzRewardSolvency(uint256,uint256) (runs: 1000, μ: 458967, ~: 459249)\n[PASS] testIdleTimeNotGivenToFirstStaker() (gas: 313296)\n[PASS] testInvalidActions() (gas: 128441)\n[PASS] testLaterPeriodDoesNotEraseUnclaimedRewards() (gas: 507732)\n[PASS] testStakeEarnWithdraw() (gas: 523118)\n[PASS] testTaxedStakeAndFunding() (gas: 386299)\n[PASS] testTaxedWithdrawalFailurePreservesPrincipalAndRewards() (gas: 673630)\n[PASS] testTwoStakersAndPeriodEnd() (gas: 393500)\n[PASS] testZeroStakeAndUnfundedPeriodRollback() (gas: 219039)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 189.91ms (190.40ms CPU time)\n\nRan 11 tests for test/TokenBridgeLock.t.sol:TokenBridgeLockTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 213740)\n[PASS] testCrossChainSignatureCannotReleaseTokens() (gas: 78309)\n[PASS] testDuplicateAndWrongRecipientRejected() (gas: 112978)\n[PASS] testExpiredAndCrossContractSignaturesRejected() (gas: 120140)\n[PASS] testFuzzSignedAmountConservation(uint256) (runs: 1000, μ: 141676, ~: 141711)\n[PASS] testRevertedOutputMinimumDoesNotConsumeSourceId() (gas: 331515)\n[PASS] testTaxedLockAndNonces() (gas: 218691)\n[PASS] testUnfundedUnlockCanRetryAfterAdditionalLock() (gas: 379526)\n[PASS] testUnlockAndReplayProtection() (gas: 176539)\n[PASS] testUnsortedAndAlteredAmountSignaturesRejected() (gas: 128009)\n[PASS] testZeroDestinationAndWrongSignatureCount() (gas: 69993)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 114.65ms (115.44ms CPU time)\n\nRan 1 test for test/Escrow.invariant.t.sol:EscrowInvariantTest\n[PASS] invariant_SettlementNeverReopensOrPaysTwice() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| EscrowHandler | advance  | 2052  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | deliver  | 2015  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | deposit  | 2064  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | dispute  | 2084  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | release  | 1988  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | resolve  | 2011  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | timeout  | 2046  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | withdraw | 2124  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 989.76ms (988.78ms CPU time)\n\nRan 1 test for test/Crowdfund.invariant.t.sol:CrowdfundInvariantTest\n[PASS] invariant_PledgesCannotBeClaimedAndRefunded() (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+----------+-------+---------+----------╮\n| Contract         | Selector | Calls | Reverts | Discards |\n+==========================================================+\n| CrowdfundHandler | advance  | 3279  | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| CrowdfundHandler | claim    | 3277  | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| CrowdfundHandler | pledge   | 3219  | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| CrowdfundHandler | refund   | 3260  | 0       | 0        |\n|------------------+----------+-------+---------+----------|\n| CrowdfundHandler | withdraw | 3349  | 0       | 0        |\n╰------------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.14s (1.14s CPU time)\n\nRan 1 test for test/Raffle.invariant.t.sol:RaffleInvariantTest\n[PASS] invariant_BondPrizeAndRefundsRemainSolvent() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| RaffleHandler | advance  | 2769  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| RaffleHandler | buy      | 2737  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| RaffleHandler | expire   | 2759  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| RaffleHandler | refund   | 2684  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| RaffleHandler | reveal   | 2705  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| RaffleHandler | withdraw | 2730  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.15s (1.15s CPU time)\n\nRan 1 test for test/DAOTreasury.invariant.t.sol:DAOTreasuryInvariantTest\n[PASS] invariant_GovernanceCannotDoubleAllocateReservedETH() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| TreasuryHandler | advance    | 2690  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| TreasuryHandler | allocate   | 2724  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| TreasuryHandler | fundETH    | 2744  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| TreasuryHandler | fundToken  | 2700  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| TreasuryHandler | spendToken | 2816  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| TreasuryHandler | withdraw   | 2710  | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.18s (1.18s CPU time)\n\nRan 1 test for test/DutchAuction.invariant.t.sol:DutchAuctionInvariantTest\n[PASS] invariant_NFTAndProceedsHaveSingleOwners() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| DutchHandler | advance  | 4147  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| DutchHandler | buy      | 4066  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| DutchHandler | cancel   | 4061  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| DutchHandler | withdraw | 4110  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.24s (1.24s CPU time)\n\nRan 1 test for test/FlashLender.invariant.t.sol:FlashLenderInvariantTest\n[PASS] invariant_LoansNeverReduceIdleCapital() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------------+-------+---------+----------╮\n| Contract     | Selector             | Calls | Reverts | Discards |\n+==================================================================+\n| FlashHandler | advance              | 3311  | 0       | 0        |\n|--------------+----------------------+-------+---------+----------|\n| FlashHandler | fund                 | 3335  | 0       | 0        |\n|--------------+----------------------+-------+---------+----------|\n| FlashHandler | loan                 | 3212  | 0       | 0        |\n|--------------+----------------------+-------+---------+----------|\n| FlashHandler | unauthorizedWithdraw | 3311  | 0       | 0        |\n|--------------+----------------------+-------+---------+----------|\n| FlashHandler | withdraw             | 3215  | 0       | 0        |\n╰--------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.35s (1.35s CPU time)\n\nRan 1 test for test/Subscription.invariant.t.sol:SubscriptionInvariantTest\n[PASS] invariant_PrepaidFundsAndEarnedRevenueStaySeparate() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+-----------+-------+---------+----------╮\n| Contract            | Selector  | Calls | Reverts | Discards |\n+==============================================================+\n| SubscriptionHandler | advance   | 2324  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | cancel    | 2310  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | deposit   | 2352  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | renew     | 2372  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | revenue   | 2307  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | subscribe | 2342  | 0       | 0        |\n|---------------------+-----------+-------+---------+----------|\n| SubscriptionHandler | withdraw  | 2377  | 0       | 0        |\n╰---------------------+-----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.39s (1.39s CPU time)\n\nRan 1 test for test/InsurancePool.invariant.t.sol:InsurancePoolInvariantTest\n[PASS] invariant_ApprovedClaimsSurvivePremiumsAndExits() (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+-------------+-------+---------+----------╮\n| Contract         | Selector    | Calls | Reverts | Discards |\n+=============================================================+\n| InsuranceHandler | advance     | 2724  | 0       | 0        |\n|------------------+-------------+-------+---------+----------|\n| InsuranceHandler | approve     | 2769  | 0       | 0        |\n|------------------+-------------+-------+---------+----------|\n| InsuranceHandler | claim       | 2675  | 0       | 0        |\n|------------------+-------------+-------+---------+----------|\n| InsuranceHandler | exit        | 2695  | 0       | 0        |\n|------------------+-------------+-------+---------+----------|\n| InsuranceHandler | premium     | 2775  | 0       | 0        |\n|------------------+-------------+-------+---------+----------|\n| InsuranceHandler | requestExit | 2746  | 0       | 0        |\n╰------------------+-------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.46s (1.46s CPU time)\n\nRan 1 test for test/ConstantProductAMM.invariant.t.sol:ConstantProductAMMInvariantTest\n[PASS] invariant_ReservesSharesAndSwapProduct() (runs: 256, calls: 16384, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| AMMHandler | add            | 2708  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| AMMHandler | advance        | 2810  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| AMMHandler | donate         | 2771  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| AMMHandler | remove         | 2759  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| AMMHandler | swap           | 2628  | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| AMMHandler | transferShares | 2708  | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.70s (1.70s CPU time)\n\nRan 1 test for test/StakingRewards.invariant.t.sol:StakingRewardsInvariantTest\n[PASS] invariant_PrincipalAndRewardSolvency() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+----------+-------+---------+----------╮\n| Contract       | Selector | Calls | Reverts | Discards |\n+========================================================+\n| StakingHandler | advance  | 3241  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| StakingHandler | claim    | 3260  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| StakingHandler | fund     | 3259  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| StakingHandler | stake    | 3295  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| StakingHandler | withdraw | 3329  | 0       | 0        |\n╰----------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.01s (2.01s CPU time)\n\nRan 1 test for test/Vault4626.invariant.t.sol:Vault4626InvariantTest\n[PASS] invariant_ReservedClaimsCannotBeRedeemedByShareholders() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------------+-------+---------+----------╮\n| Contract     | Selector       | Calls | Reverts | Discards |\n+============================================================+\n| VaultHandler | advance        | 1786  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | cancel         | 1787  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | claim          | 1836  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | deposit        | 1863  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | process        | 1841  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | redeem         | 1778  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | request        | 1854  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | transferShares | 1839  | 0       | 0        |\n|--------------+----------------+-------+---------+----------|\n| VaultHandler | yield          | 1800  | 0       | 0        |\n╰--------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.17s (2.17s CPU time)\n\nRan 10 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testBusinessEventIncludesActorAndAmount() (gas: 182410)\n[PASS] testEmptyRoundReturnsBond() (gas: 116426)\n[PASS] testFuzzRefundSolvency(uint256) (runs: 1000, μ: 530785, ~: 475127)\n[PASS] testInvalidCommitAndInsufficientBondCanRetry() (gas: 113940)\n[PASS] testLateEntryWrongPaymentAndCap() (gas: 869320)\n[PASS] testRevealConservationAndPrizeClaim() (gas: 446154)\n[PASS] testRevertedRevealDoesNotChooseWinnerOrAllocateBond() (gas: 420186)\n[PASS] testSettlementFailureAndReentrantPrizeClaim() (gas: 674955)\n[PASS] testTimeoutRefundAndBondForfeiture() (gas: 454015)\n[PASS] testWrongSeedEarlyLateAndUnauthorizedReveal() (gas: 158845)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 2.26s (2.26s CPU time)\n\nRan 1 test for test/Timelock.invariant.t.sol:TimelockInvariantTest\n[PASS] invariant_DelayTerminalFlagsAndETHConservation() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| TimelockHandler | advance      | 3371  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| TimelockHandler | cancel       | 3304  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| TimelockHandler | execute      | 3261  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| TimelockHandler | queue        | 3128  | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| TimelockHandler | unauthorized | 3320  | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.61s (2.61s CPU time)\n\nRan 1 test for test/Governor.invariant.t.sol:GovernorInvariantTest\n[PASS] invariant_VotesCannotMultiplyByTransferOrDelegation() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------+-------+---------+----------╮\n| Contract        | Selector   | Calls | Reverts | Discards |\n+===========================================================+\n| GovernorHandler | advance    | 2696  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| GovernorHandler | delegate   | 2716  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| GovernorHandler | propose    | 2688  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| GovernorHandler | transfer   | 2767  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| GovernorHandler | transition | 2810  | 0       | 0        |\n|-----------------+------------+-------+---------+----------|\n| GovernorHandler | vote       | 2707  | 0       | 0        |\n╰-----------------+------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.81s (2.81s CPU time)\n\nRan 1 test for test/NFTMarketplace.invariant.t.sol:NFTMarketplaceInvariantTest\n[PASS] invariant_CustodyAndPullCreditConservation() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| MarketHandler | advance  | 3191  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| MarketHandler | buy      | 3392  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| MarketHandler | cancel   | 3199  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| MarketHandler | list     | 3282  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| MarketHandler | withdraw | 3320  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.04s (3.04s CPU time)\n\nRan 1 test for test/LendingPool.invariant.t.sol:LendingPoolInvariantTest\n[PASS] invariant_CashCollateralAndShareConservation() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+------------------+-------+---------+----------╮\n| Contract       | Selector         | Calls | Reverts | Discards |\n+================================================================+\n| LendingHandler | addCollateral    | 1751  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | advance          | 1840  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | borrow           | 1897  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | changePrice      | 1776  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | liquidate        | 1812  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | removeCollateral | 1864  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | repay            | 1868  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | supply           | 1774  | 0       | 0        |\n|----------------+------------------+-------+---------+----------|\n| LendingHandler | withdraw         | 1802  | 0       | 0        |\n╰----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.54s (3.54s CPU time)\n\nRan 1 test for test/Vesting.invariant.t.sol:VestingInvariantTest\n[PASS] invariant_EveryUnreleasedGrantRemainsBacked() (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------+----------+-------+---------+----------╮\n| Contract       | Selector | Calls | Reverts | Discards |\n+========================================================+\n| VestingHandler | advance  | 4138  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| VestingHandler | create   | 4057  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| VestingHandler | release  | 4098  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| VestingHandler | revoke   | 4091  | 0       | 0        |\n╰----------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.77s (3.77s CPU time)\n\nRan 1 test for test/TokenBridgeLock.invariant.t.sol:TokenBridgeLockInvariantTest\n[PASS] invariant_OnlyDistinctSignaturesReleaseCustodyOnce() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| BridgeHandler | advance  | 5421  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| BridgeHandler | lock     | 5458  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| BridgeHandler | unlock   | 5505  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.30s (4.30s CPU time)\n\nRan 1 test for test/MultiSig.invariant.t.sol:MultiSigInvariantTest\n[PASS] invariant_OnlyConfirmedTransactionsSpendOnce() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+-----------------+-------+---------+----------╮\n| Contract        | Selector        | Calls | Reverts | Discards |\n+================================================================+\n| MultiSigHandler | advance         | 2726  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| MultiSigHandler | changeThreshold | 2739  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| MultiSigHandler | confirm         | 2770  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| MultiSigHandler | execute         | 2739  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| MultiSigHandler | revoke          | 2692  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| MultiSigHandler | submit          | 2718  | 0       | 0        |\n╰-----------------+-----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.83s (4.83s CPU time)\n\nRan 39 test suites in 4.84s (45.18s CPU time): 212 tests passed, 0 failed, 0 skipped (212 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConstantProductAMM.addLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.approve(address,uint256)\",\"ConstantProductAMM.removeLiquidity(uint256,uint256,uint256,uint256)\",\"ConstantProductAMM.swap(address,uint256,uint256,uint256)\",\"ConstantProductAMM.transfer(address,uint256)\",\"ConstantProductAMM.transferFrom(address,address,uint256)\",\"Crowdfund.claim()\",\"Crowdfund.pledge()\",\"Crowdfund.refund()\",\"Crowdfund.withdrawPayments()\",\"DAOTreasury.fundToken(address,uint256)\",\"DAOTreasury.receive()\",\"DAOTreasury.spendETH(address,uint256)\",\"DAOTreasury.spendToken(address,address,uint256,uint256)\",\"DAOTreasury.withdrawPayments()\",\"DutchAuction.activate()\",\"DutchAuction.buy(address,uint256,uint256)\",\"DutchAuction.cancel()\",\"DutchAuction.withdrawPayments()\",\"Escrow.deliver(bytes32)\",\"Escrow.deposit()\",\"Escrow.dispute(bytes32)\",\"Escrow.release()\",\"Escrow.resolve(uint256)\",\"Escrow.timeoutRefund()\",\"Escrow.withdrawPayments()\",\"FlashLender.acceptOwnership()\",\"FlashLender.flashLoan(address,address,uint256,bytes)\",\"FlashLender.fund(uint256)\",\"FlashLender.renounceOwnership()\",\"FlashLender.transferOwnership(address)\",\"FlashLender.withdraw(uint256,uint256)\",\"Governor.acceptTimelockAdmin()\",\"Governor.cancel(uint256)\",\"Governor.castVote(uint256,uint8)\",\"Governor.execute(uint256)\",\"Governor.propose(address,uint256,bytes,bytes32)\",\"Governor.queue(uint256)\",\"InsurancePool.acceptOwnership()\",\"InsurancePool.approveClaim(address,uint256,bytes32)\",\"InsurancePool.claim(uint256)\",\"InsurancePool.exit(uint256)\",\"InsurancePool.payPremium(uint256,uint256)\",\"InsurancePool.renounceOwnership()\",\"InsurancePool.requestExit()\",\"InsurancePool.transferOwnership(address)\",\"LendingPool.accrue()\",\"LendingPool.addCollateral(uint256)\",\"LendingPool.borrow(uint256,uint256)\",\"LendingPool.liquidate(address,uint256,uint256)\",\"LendingPool.removeCollateral(uint256,uint256)\",\"LendingPool.repay(address,uint256)\",\"LendingPool.supply(uint256,uint256)\",\"LendingPool.withdraw(uint256,uint256)\",\"MultiSig.addOwner(address)\",\"MultiSig.confirm(uint256)\",\"MultiSig.execute(uint256)\",\"MultiSig.receive()\",\"MultiSig.removeOwner(address,uint256)\",\"MultiSig.revoke(uint256)\",\"MultiSig.setThreshold(uint256)\",\"MultiSig.submit(address,uint256,bytes)\",\"NFTMarketplace.buy(uint256,address)\",\"NFTMarketplace.cancel(uint256)\",\"NFTMarketplace.list(address,uint256,uint256)\",\"NFTMarketplace.withdrawPayments()\",\"Raffle.buyTicket()\",\"Raffle.expire()\",\"Raffle.open(bytes32)\",\"Raffle.refund()\",\"Raffle.reveal(bytes32)\",\"Raffle.withdrawPayments()\",\"StakingRewards.acceptOwnership()\",\"StakingRewards.claim(uint256)\",\"StakingRewards.fundPeriod(uint256,uint256)\",\"StakingRewards.renounceOwnership()\",\"StakingRewards.stake(uint256)\",\"StakingRewards.transferOwnership(address)\",\"StakingRewards.withdraw(uint256,uint256)\",\"Subscription.cancel()\",\"Subscription.deposit(uint256)\",\"Subscription.renew(address)\",\"Subscription.subscribe()\",\"Subscription.withdraw(uint256,uint256)\",\"Subscription.withdrawRevenue(uint256)\",\"Timelock.acceptAdmin()\",\"Timelock.cancel(bytes32)\",\"Timelock.execute(bytes32)\",\"Timelock.nominateAdmin(address)\",\"Timelock.queue(address,uint256,bytes,bytes32)\",\"Timelock.receive()\",\"TokenBridgeLock.lock(uint256,bytes32)\",\"TokenBridgeLock.unlock(bytes32,uint256,uint256,bytes[],uint256)\",\"Vault4626.acceptOwnership()\",\"Vault4626.addYield(uint256)\",\"Vault4626.approve(address,uint256)\",\"Vault4626.cancelRequest(uint256)\",\"Vault4626.claim(uint256)\",\"Vault4626.deposit(uint256,address)\",\"Vault4626.depositReceived(uint256,address,uint256)\",\"Vault4626.mint(uint256,address)\",\"Vault4626.processNext()\",\"Vault4626.redeem(uint256,address,address)\",\"Vault4626.renounceOwnership()\",\"Vault4626.requestRedeem(uint256)\",\"Vault4626.setCap(uint256)\",\"Vault4626.transfer(address,uint256)\",\"Vault4626.transferFrom(address,address,uint256)\",\"Vault4626.transferOwnership(address)\",\"Vault4626.withdraw(uint256,address,address)\",\"Vesting.acceptOwnership()\",\"Vesting.create(address,uint256,uint256,uint256,uint256,bool)\",\"Vesting.release(uint256,uint256)\",\"Vesting.renounceOwnership()\",\"Vesting.revoke(uint256,uint256)\",\"Vesting.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"README.md\":33,\"docs/ANALYSIS.md\":962,\"docs/SECURITY_REVIEW.md\":81,\"docs/SUMMARY.md\":55,\"foundry.toml\":17,\"src/ConstantProductAMM.sol\":109,\"src/Crowdfund.sol\":56,\"src/DAOTreasury.sol\":70,\"src/DutchAuction.sol\":88,\"src/Escrow.sol\":101,\"src/FlashLender.sol\":75,\"src/Governor.sol\":180,\"src/InsurancePool.sol\":94,\"src/LendingPool.sol\":206,\"src/MultiSig.sol\":151,\"src/NFTMarketplace.sol\":66,\"src/PriceOracleAdapter.sol\":40,\"src/Raffle.sol\":114,\"src/StakingRewards.sol\":103,\"src/Subscription.sol\":99,\"src/Timelock.sol\":109,\"src/TokenBridgeLock.sol\":80,\"src/Vault4626.sol\":192,\"src/Vesting.sol\":97,\"src/common/EthCredits.sol\":32,\"src/common/TokenIO.sol\":29,\"test/ANALYSIS.md\":659,\"test/CallbackHardening.t.sol\":158,\"test/ConstantProductAMM.invariant.t.sol\":114,\"test/ConstantProductAMM.t.sol\":108,\"test/Crowdfund.invariant.t.sol\":76,\"test/Crowdfund.t.sol\":129,\"test/DAOTreasury.invariant.t.sol\":105,\"test/DAOTreasury.t.sol\":124,\"test/DutchAuction.invariant.t.sol\":86,\"test/DutchAuction.t.sol\":118,\"test/Escrow.invariant.t.sol\":83,\"test/Escrow.t.sol\":152,\"test/FlashLender.invariant.t.sol\":83,\"test/FlashLender.t.sol\":126,\"test/Governor.invariant.t.sol\":90,\"test/Governor.t.sol\":197,\"test/InsurancePool.invariant.t.sol\":81,\"test/InsurancePool.t.sol\":148,\"test/LendingPool.invariant.t.sol\":151,\"test/LendingPool.t.sol\":195,\"test/MultiSig.invariant.t.sol\":92,\"test/MultiSig.t.sol\":137,\"test/NFTMarketplace.invariant.t.sol\":85,\"test/NFTMarketplace.t.sol\":166,\"test/PriceOracleAdapter.t.sol\":118,\"test/Raffle.invariant.t.sol\":93,\"test/Raffle.t.sol\":190,\"test/SUMMARY.md\":63,\"test/StakingRewards.invariant.t.sol\":87,\"test/StakingRewards.t.sol\":159,\"test/Subscription.invariant.t.sol\":97,\"test/Subscription.t.sol\":155,\"test/Timelock.invariant.t.sol\":94,\"test/Timelock.t.sol\":176,\"test/TokenBridgeLock.invariant.t.sol\":86,\"test/TokenBridgeLock.t.sol\":176,\"test/TokenCompatibility.t.sol\":115,\"test/Vault4626.invariant.t.sol\":114,\"test/Vault4626.t.sol\":181,\"test/Vesting.invariant.t.sol\":84,\"test/Vesting.t.sol\":143,\"test/helpers/InvariantBase.sol\":51,\"test/helpers/Mocks.sol\":77,\"test/helpers/TestBase.sol\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8135293945a25ec1bf58aa082a90d78e2f6c5e95285d253ddd2155d8f57c4b53","verifiedTreeHash":"2df4ee15eb982945fd7d59c4371b4394ce50c318","verifierVersion":"0.1.0+a2d9a899"}]}