{"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":"f74046f2-c50a-427c-95b4-3f8762f59392","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"92835b2f96c64d5f7610f35bba661bcd4316b696fd91d78c97a46392b749de2b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"e8adfc5fecef3ee8b04743224d0ecdc8509659fd8fd5894d0739be97930ba035","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"7cd12891a7667acf3f0e235869d5287e38deeba181e3e8f446ab50f2763da719","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"4da172e3ae4f75d2950f2e29a344f72fba6c4a3a9e6dc75eda68f99bbdf77035","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"4934e6d8f1684499a136f5d2128cda474986a1954d70f5b9178d99f4eec99a6f","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d63a722a59ff402e686623cc243ac468bfc6941917770bc6d563640cbb401043","dependsOn":[],"execution":{"mustProduce":["src/LaunchToken.sol"],"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"1f8be9225e3dd33568badc9ed82a8dbdecb51d05819cb76b7e18aa2fdbe83a4e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"e44b5ea39ffc28a77c117296d6b40c71b58505394a295816e44f39b2659ca068","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"ITEM: reward token and four contracts for Basket Protocol (its vault: the BASK token below) on Robinhood Chain (4663). No website; no Robinhood name or logo except the chain name.\nContracts:\n1. LaunchToken: the standard launch token, unchanged; it is ITEM, not BASK.\n2. ItemStaking(address item=$token)\n3. BaskUsdgGauge(address item=$token)\n4. ItemEthGauge(address item=$token)\n5. DevVesting(address item=$token, address beneficiary=0xc5e21e7A89F1fBDc5554e31702e627dD6262C856 as this literal); reverts if beneficiary is zero.\nConstants: BASK=0x739fD5B653aA092a434534FA1aDE67C1770b5a5B; USDG=0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168; WETH=0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73; V2_FACTORY=0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f.\nOutside services and values: only these, on chain 4663. BASK, WETH (18 decimals) and USDG (6), plain ERC-20s whose issuer may burn balances; V2_FACTORY.getPair(address,address), the canonical v2 pair or zero; a pair is a plain ERC-20 LP. Tests mock them; no forks or vm.env.\nRULES FOR 2-5:\n- Simplest code that satisfies this text: no feature, role, setting or safeguard it does not state.\n- solc 0.8.26, optimizer on (200 runs), evm cancun, bytecode_hash none, custom errors.\n- Constructors call no other contract. Time is block.timestamp.\n- No proxy, delegatecall, selfdestruct, owner, admin, pause, upgrade, rescue or sweep; never $owner. State-changing functions are nonReentrant and emit events.\n- Rewards: one index per reward token, 1e36 precision, full-precision mulDiv, rounding down. Before any stake change, update the global index, then the caller. A user accrues floor((stake * (index - userIndex) + carry) / 1e36), keeping the remainder as carry across claims and exits. Release by differences of the cumulative formulas below, never a rounded per-second rate. Never pay out more than received.\nGAUGES: stake a v2 LP, earn ITEM; one abstract base, two contracts. BaskUsdgGauge: tokenA BASK, tokenB USDG, ALLOCATION 490,000,000e18. ItemEthGauge: tokenA ITEM, tokenB WETH, ALLOCATION 210,000,000e18.\n- start(): once; requires pair = V2_FACTORY.getPair(tokenA, tokenB) non-zero, stores it, pulls exactly ALLOCATION of ITEM from the caller. Other ITEM sent is ignored. stake reverts before start.\n- released(t) = ALLOCATION * t * (2T - t) / T^2, T = 4 * 365 days, t = seconds since start with totalStaked > 0, capped at T; paid pro rata to staked LP.\n- stake(amount), withdraw(amount), claim(). Only claim() pays ITEM; withdraw moves only the LP, so it always works; a failed claim reverts whole.\nITEMSTAKING: stake ITEM; rewards: the fixed list BASK, USDG, WETH; anyone may send them. Once the vault's fee recipient, it gets fees as BASK with no call to it.\n- stake(amount), unstake(amount): any time; never transfer a reward token; no reward token can block them.\n- Per token, accounted = all stream amounts - all payments. Public sync(token) runs for all three tokens in stake and unstake, and for the claimed token in claim. It first advances the live stream to now; its timestamp moves while totalStaked is 0 but no stream time passes. A stream of F has released floor(F * s / D) after s staked seconds, s capped at D = 7 days. Then it reads balanceOf(this) by staticcall with 50,000 gas, copying at most 32 bytes; valid only if it succeeds with exactly 32 bytes. If invalid, below accounted, or fresh = balance - accounted above 1e30: no new stream. Else if fresh > 0 and no stream is unfinished: accounted += fresh and a stream of F = fresh starts now. A live stream is never backdated, restarted or changed; later amounts wait.\n- claim(token): only that token; pays min(accrued, the balance read); the unpaid rest stays owed. An invalid read or a failed or false transfer reverts the claim whole.\nDEVVESTING: ALLOCATION 40,000,000e18. fund(): once, pulls exactly ALLOCATION of ITEM from the caller; not revocable. elapsed = seconds since deployment; vested = 0 before 365 days, then ALLOCATION * min(elapsed, 1460 days) / 1460 days. release(), by anyone after fund(), sends vested - released to the beneficiary.\nWho can call what: anyone; no special powers; no call touches another's stake.\nNumbers the contracts enforce: all constants. Upgrades and pausing: none.\nVIEWS (public, at the current time, names exactly as written):\n- Gauges: item, tokenA, tokenB, V2_FACTORY, ALLOCATION, pair, started, stakedSeconds, released, rate, remaining, totalStaked, staked(user), earned(user). released = released(stakedSeconds); rate = 2 * ALLOCATION * (T - t) / T^2 per second while totalStaked > 0, else 0; remaining = ALLOCATION - released.\n- ItemStaking: item, BASK, USDG, WETH, totalStaked, staked(user), earned(user, token).\n- DevVesting: item, beneficiary, ALLOCATION, deployedAt, funded, vested, released.\nTESTS: each rule above and its reverts; lone and odd-sized stakers, both contracts: paid <= released less dust, last claimer in full; a reward token that reverts, returns false, burns gas, returns huge data or reports 0 or 2^256-1 never blocks stake, withdraw, unstake or other tokens; partial issuer burn; rounding at 1e27 and 1 wei; reentrancy; DevVesting on days 364, 365 and 1,460.\nREVIEW: fix real defects minimally; add no mechanism. Accepted, notes only: no staking lock; the first LP staker earns alone; claims are first come, first served while an issuer burn leaves ItemStaking short. ATTACK: stake timing, flash loans, payouts above receipts, extreme-size rounding, anything blocking withdraw or unstake, hostile reward tokens.\n\nToken name: Item\nToken symbol: ITEM","parentJobId":null,"planHash":"9fea1dda8cfb83cad4234c7d76c59ef3282c6ddb16c1ae7f5409c9c790c6a356","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f74046f2-c50a-427c-95b4-3f8762f59392","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2241-item"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52165","feedbackHash":"de59b06fdac4e678fbffdc670f9567cd39cda1318af3656a194b6f56b5e96ae0","nodeKey":"audit_economics","submissionHash":"92835b2f96c64d5f7610f35bba661bcd4316b696fd91d78c97a46392b749de2b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52681","feedbackHash":"de98642c90b8ce4c4d77252569aa8561f02f3f44bfb557745c50da731658a5ba","nodeKey":"audit_flow","submissionHash":"e8adfc5fecef3ee8b04743224d0ecdc8509659fd8fd5894d0739be97930ba035","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52628","feedbackHash":"c5212f7b1c33823fe6f86571f39aff7ea1c3f1d1d295724e3228089f7dbaf11f","nodeKey":"audit_judge","submissionHash":"7cd12891a7667acf3f0e235869d5287e38deeba181e3e8f446ab50f2763da719","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52679","feedbackHash":"98c1917b383b0d37677999e969111b9d7fe2c7164ca39ca026d403c7948a853c","nodeKey":"audit_math","submissionHash":"4da172e3ae4f75d2950f2e29a344f72fba6c4a3a9e6dc75eda68f99bbdf77035","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51452","feedbackHash":"5b00b7572cc8be54480f9f6b2b80d01475acea3897f8459eb1f2036fcbfc30b8","nodeKey":"audit_permissions","submissionHash":"4934e6d8f1684499a136f5d2128cda474986a1954d70f5b9178d99f4eec99a6f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53911","feedbackHash":"00f3cfa50a31905d0150c4e8cb2be17eeccbcb68943fb8334e27a5d7a2b794a2","nodeKey":"build_contract_project","submissionHash":"d63a722a59ff402e686623cc243ac468bfc6941917770bc6d563640cbb401043","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"2a7be74beaeed21f47f2e035cd4e78b09323bf3a8f2d0fef06625024fe238d83","nodeKey":"manifest","submissionHash":"1f8be9225e3dd33568badc9ed82a8dbdecb51d05819cb76b7e18aa2fdbe83a4e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"4aca3714e96e5588333e38b64a7016fb067298a70a250851c5a796cdaff677e1","nodeKey":"write_foundry_tests","submissionHash":"e44b5ea39ffc28a77c117296d6b40c71b58505394a295816e44f39b2659ca068","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3fbad6e3c6cd707af449682bf5778ed1296a6a48acd4f9e5ef5daa1369e90661","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"9fa5b12fc48368a4eb7ba22473c44f12c0443590d6badc5708f6826a8eed44a5","device":"3f6a9bdd601cb99f","findings":[],"hash":"1f8be9225e3dd33568badc9ed82a8dbdecb51d05819cb76b7e18aa2fdbe83a4e","nodeId":"9861ccf2-9fc5-4093-9a5f-94f93122803e","outcome":"completed","summary":"Created [launch.json](/home/seat/.identitymd/work/f74046f2-c50a-427c-95b4-3f8762f59392/9861ccf2-9fc5-4093-9a5f-94f93122803e/launch.json) with the four application contracts, verified constructor arguments, specified beneficiary, and required pool values.\n\n`forge build` succeeded. All 98 tests passed with the supplied fuzz seed. Only `launch.json` changed.","treeHash":"d51457b8161cc42ec0898a4f38c1b8baeb70ea94","usage":{"cachedInputTokens":202112,"inputTokens":40967,"model":"gpt-6-astra","outputTokens":3028,"runtime":"codex","turns":3,"wallClockMs":101595}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d63ea36a2b809080","findings":[{"citation":"resolved","description":"Trust-gap seam (access x economics): sync(token) is open to anyone, a stream starts from any fresh balance with no minimum, and a live stream is never changed. So an unprivileged actor who sends 1 wei of BASK and calls sync(BASK) when no stream is unfinished starts a 7-day stream of 1 wei; every real fee transfer from the vault that arrives during those 7 staked days sits idle and only begins streaming after the dust stream ends. The attacker can repeat this at the end of every stream whenever no fees are waiting at that moment, halving the throughput of fee distribution in the worst case. No funds are lost or misdirected: all waiting amounts start as one stream afterwards and are paid in full. This follows directly from the stated rules ('A live stream is never backdated, restarted or changed; later amounts wait' and 'no feature ... it does not state'), so a fix would add a mechanism the brief forbids (a minimum stream amount or stream merging). Reported for the author's awareness only; no change is proposed.","line":169,"path":"src/ItemStaking.sol","reproduction":"Alice stakes 1e24 ITEM. Attacker: BASK.transfer(staking, 1); staking.sync(BASK) -> StreamStarted(BASK, 1). Vault then sends 1000e18 BASK; anyone calls sync(BASK): rewardInfo(BASK).streamAmount is still 1 and accounted is 1. warp 7 days - 1 s, sync: earned(alice, BASK) == 0. warp +1 s, sync: streamAmount becomes 1000e18 and earned(alice, BASK) == 1. Expected per the brief: exactly this (later amounts wait). Verified with test/scratch/DustDelay.t.sol test_oneWeiDustDelaysVaultFeesSevenDays, which passes on the current code.","severity":"info","snippet":"        bool unfinished = r.streamAmount > 0 && s < STREAM_DURATION;\n        if (unfinished) return (true, balance);","title":"Anyone can delay the vault's BASK fee stream by up to 7 staked days per stream with a 1 wei dust deposit (design consequence of 'later amounts wait')"},{"citation":"resolved","description":"Not a code defect, a launch-configuration gap at the access x economics seam. start() on the two gauges pulls exactly 490,000,000e18 and 210,000,000e18 ITEM from the caller (src/LpGauge.sol:67) and DevVesting.fund() pulls 40,000,000e18 (src/DevVesting.sol:41), 740,000,000 ITEM in total, and none of these amounts is adjustable. The launch policy gives the requester 90% of the 1,000,000,000 supply and seeds the pool with 80% unless they choose otherwise, so the requester's wallet receives 100,000,000 ITEM. With the default share the gauges can never be started and the vesting never funded from the requester's own allocation; the requester must choose a pool share of at most 16% (160,000,000 ITEM) or buy ITEM back from the market. Because start() and fund() are open calls, anyone holding the allocation may fund them, so nothing is bricked; the contracts simply stay idle until someone does. The README should state the required pool share so the manifest step does not pick the default.","line":105,"path":"README.md","reproduction":"Default policy: supply 1e27; requester share 90% = 9e26; pool seed 80% of supply = 8e26; wallet receives 1e26. Required: BaskUsdgGauge.start() 4.9e26 + ItemEthGauge.start() 2.1e26 + DevVesting.fund() 4e25 = 7.4e26 > 1e26. With a wallet balance of 1e26, BaskUsdgGauge.start() reverts with TokenTransfer.TransferFailed (LaunchToken.transferFrom reverts InsufficientBalance) and the gauge stays unstarted: stake() reverts NotStarted. Expected: a pool share that leaves at least 7.4e26 ITEM in the requester's wallet, documented in the README and manifest notes.","severity":"info","snippet":"The ITEM for them comes from the requester's share of the supply, not from the contracts.","title":"Gauge start() and DevVesting.fund() need 740,000,000 ITEM from one wallet, more than the requester's wallet receives under the default 80% pool seed"}],"hash":"4934e6d8f1684499a136f5d2128cda474986a1954d70f5b9178d99f4eec99a6f","nodeId":"7b33e75c-f3a0-4e18-867c-09048ebe3b63","outcome":"completed","summary":"Review complete. The findings file is written at the repository root and validated.\n\n**Outcome: no exploitable defect in the Access Control, Trust Gap or Asymmetry areas.** The permission model is flat: every state-changing entry point is open by design, no constructor hands out a role, and the only privileged party is the fixed DevVesting beneficiary, which is a recipient rather than a caller. Paired surfaces (stake/withdraw, stake/unstake, earned/_update, earned/_sync) mirror each other in checks and storage writes. The slither mulDiv leads are false positives, since the caret is the correct XOR seed of the OpenZeppelin Newton inverse.\n\n**What I verified beyond reading:**\n- The existing 98 tests pass, formatting is clean, and the build has only lint-level warnings.\n- A stateful fuzz harness under test/scratch/ (64 runs by 60 calls, zero reverts) held four invariants: payouts never exceed receipts minus burns, accounted always covers everything owed, paid plus earned never exceeds released in the gauge, and token balances equal total staked.\n- A targeted test confirmed the one trust-gap behavior worth noting: anyone can delay the vault's BASK fee stream by up to 7 staked days with a 1 wei deposit. Nothing is lost, and the brief's rules imply it, so it is recorded as informational.\n\n**Second informational note:** with the default 80% pool seed the requester's wallet receives 100,000,000 ITEM, while the two gauges and DevVesting need 740,000,000 to be started and funded. The contracts are not broken by this, but the README should say which pool share the launch must choose.\n\n**Coverage:** all 17 listed entry points have a row (16 hold, one carries the informational dust-delay note), plus four invariant rows. The one unreached item is on-chain verification of the four constant addresses on chain 4663, for which no RPC was supplied.","treeHash":null,"usage":{"cachedInputTokens":1299336,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":35491,"runtime":"claude","turns":38,"wallClockMs":514551}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9812c5faf226f7c7","findings":[],"hash":"4da172e3ae4f75d2950f2e29a344f72fba6c4a3a9e6dc75eda68f99bbdf77035","nodeId":"14981240-9b72-417c-bd6a-655eb7a29a7b","outcome":"completed","summary":"The review is complete and the findings file is in place with an empty findings list and a full coverage record.\n\n**Outcome: no substantiated defects in the Math Precision, Boundary or Numerical Gap area.** The file `.imd-findings.json` holds an empty findings list and 20 coverage rows, one per listed entry point plus three invariant rows, every row marked `holds` with a reason.\n\n**What I checked, against each guide's failure modes:**\n\n- **Math Precision.** Every division rounds down as the spec requires. The release curve `ALLOCATION * t * (2T - t) / T^2` peaks near 7.8e42, far below overflow, and equals ALLOCATION exactly at t = T. Stream math `F * s / 7 days` is bounded by the 1e30 cap. The index growth `delta * 1e36 / totalStaked` never overflows for the gauges, and the 512-bit path handles ItemStaking products beyond 2^256. The `mulDiv` copy matches OpenZeppelin byte for byte, so slither's `incorrect-exp` and `divide-before-multiply` lines are the algorithm's XOR seed and exact power-of-two factorisation, not defects. `accrue` keeps carry below 1e36 so `remainder + carry` cannot overflow.\n- **Boundary.** The balance read uses a 50,000 gas staticcall copying 32 bytes and treats anything but success with exactly 32 bytes as invalid, so a reverting, gas-burning, huge-data, short-data, zero-reporting or max-reporting token never blocks stake or unstake. `withdraw` and `unstake` call no reward token, and their update math has no revert path. A token with no code fails the read before any transfer. Transfer helpers accept empty or `true` return data and revert on `false` or a revert, which is what the spec asks for a claim.\n- **Numerical Gap.** The telescoping difference of cumulative floors means frequent updates lose nothing against a single update. Sum of outstanding owed never exceeds `accounted`, so the unchecked `accounted -= amount` in `claim` cannot underflow. The issuer-burn path pays first come first served and a later deposit must first cover the shortfall before a new stream starts, exactly as the spec states.\n\n**How I verified it.** Beyond the existing 98 passing tests, I ran scratch stress tests that have since been removed: 400 seeded random sequences of 40 steps on both ItemStaking and a gauge, mixing 1 wei, random and near-1e27 amounts, waits up to 400 days, issuer burns and syncs, asserting paid plus owed never exceeds released or sent and that ITEM balance equals totalStaked. I also checked the T cap and zero rate at the end of the curve, a lone 1 wei staker with a 1e30 stream, a 1 wei stream across 1e27 stake, an index of 3e66 multiplied by a 1e27 stake, and vesting on days 364, 365 and 1460 with exact values.\n\n**Notes that are not defects, for the judge.** A token whose `fresh` ever exceeds 1e30 is blocked from new streams permanently because payments reduce balance and accounted equally; that is the spec's rule and needs 1e12 WETH or BASK. The aderyn reentrancy lead on `start()` is a view call to a constant factory under `nonReentrant`. Missing zero checks on the `item` constructor argument are outside what the spec asks.\n\n**Not reached.** I did not review event emission completeness or the launch manifest, which belong to other specialists.","treeHash":null,"usage":{"cachedInputTokens":1422821,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":31962,"runtime":"claude","turns":32,"wallClockMs":459814}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"764cd99b4c628a47","findings":[{"citation":"resolved","description":"Merged from audit_economics and audit_permissions (same root cause). The constants match the brief exactly (490,000,000e18 in src/BaskUsdgGauge.sol:11, 210,000,000e18 in src/ItemEthGauge.sol:10, 40,000,000e18 in src/DevVesting.sol:12), so this is not a code defect but a launch-configuration gap. The launch policy gives 10% of the 1,000,000,000 ITEM supply to the swarm and seeds the pool with the requester's chosen share (80% by default), leaving the requester's wallet 100,000,000 ITEM. Funding the three contracts needs 740,000,000 ITEM. With the default pool share no party holds enough ITEM to call either start(), so both gauges stay unstartable (stake reverts NotStarted) until ITEM is bought back from the pool. README line 105 says the ITEM 'comes from the requester's share of the supply' without stating the pool share this requires. Because start() and fund() are open calls, nothing is bricked; the contracts stay idle. Resolution is a launch decision (pool share at most 16%, i.e. 160,000,000 ITEM, or changed allocations), to be stated in the README and manifest notes; no code change.","line":67,"path":"src/LpGauge.sol","reproduction":"Reproduced in test/scratch/Review.t.sol test_fundingNeeds740M: deploy LaunchToken, BaskUsdgGauge(item), etch a factory at V2_FACTORY returning a non-zero pair for (BASK, USDG); give requester 100,000,000e18 ITEM (the default post-launch wallet balance) and approve the gauge; requester calls BaskUsdgGauge.start(). Expected per README 'After launch' step 2: start succeeds. Actual: LaunchToken.transferFrom reverts InsufficientBalance, TokenTransfer.pull reverts TransferFailed, gauge stays started == false and stake() reverts NotStarted. 490M + 210M + 40M = 740M > 100M.","severity":"info","snippet":"        TokenTransfer.pull(item, msg.sender, ALLOCATION);","title":"Gauge start() and DevVesting.fund() need 740,000,000 ITEM from one wallet, more than the requester's wallet holds under the default 80% pool seed"},{"citation":"resolved","description":"From audit_permissions; reproduced. sync(token) is open, a stream starts from any fresh balance with no minimum, and a live stream is never changed. An unprivileged actor who transfers 1 wei of BASK and calls sync(BASK) while no stream is unfinished starts a 7-staked-day stream of 1 wei; every vault fee transfer arriving during that window sits idle and only starts streaming once the dust stream finishes, where it then starts as one combined stream. Repeating this at each stream end halves fee throughput at worst. No funds are lost or misdirected; all waiting amounts are paid in full later. This is exactly what the brief's rules produce ('A live stream is never backdated, restarted or changed; later amounts wait' and 'no feature ... it does not state'), so a minimum stream amount or stream merging would add a mechanism the brief forbids. Noted for the README's operational section; no code change proposed.","line":169,"path":"src/ItemStaking.sol","reproduction":"Reproduced in test/scratch/Review.t.sol test_dustDelay: alice stakes 1e24 ITEM. Attacker: BASK.transfer(staking, 1); staking.sync(BASK) -> rewardInfo(BASK) shows accounted 1, streamAmount 1. Vault then sends 1000e18 BASK; sync(BASK): streamAmount still 1, accounted still 1. warp +7 days - 1 s, sync: earned(alice, BASK) == 0 and streamAmount still 1. warp +1 s, sync: streamAmount becomes 1000e18 and earned(alice, BASK) == 1. Expected per the brief: exactly this behaviour; the 1000e18 BASK streams only from day 7 onward.","severity":"info","snippet":"        bool unfinished = r.streamAmount > 0 && s < STREAM_DURATION;\n        if (unfinished) return (true, balance);","title":"Anyone can delay the vault's BASK fee stream by up to 7 staked days per stream with a 1 wei deposit (consequence of 'later amounts wait')"},{"citation":"resolved","description":"From audit_economics; reproduced. The vault transfers BASK fees with no call into ItemStaking, so fees accumulate as undetected balance until someone calls sync, stake, unstake or claim. stake() runs _sync first, which starts the 7-day stream from that moment, then sets the newcomer's user index, so a large holder who stakes just before the detecting sync shares the whole accumulated amount pro rata with stakers who were present while it accrued. There is no capital-free extraction (the newcomer must stay staked across 7 staked days, and anyone can call sync at any time to close the window). This follows the brief's never-backdated rule; a mechanism to backdate would contradict it. Operational note: stakers or a keeper should call sync(token) promptly after fees land. No code change proposed.","line":172,"path":"src/ItemStaking.sol","reproduction":"Reproduced in test/scratch/Review.t.sol test_lateStakerShares: t0: alice stakes 1e18 ITEM (sole staker); 700e18 BASK is transferred to ItemStaking, nobody syncs. t0+10d: bob stakes 999e18 (stake runs _sync(BASK): fresh = 700e18, stream starts now). t0+17d: earned(alice, BASK) == 0.7e18 and earned(bob, BASK) == 699.3e18. Under 'fees go to whoever was staked when they accrued' alice would get ~700e18; under the brief's rule the result above is the specified one.","severity":"info","snippet":"        r.streamAmount = fresh;\n        r.streamSeconds = 0;","title":"Reward amounts that sit unsynced are shared with whoever stakes before the next sync, since a stream starts at detection and is never backdated"},{"citation":"resolved","description":"From audit_flow; reproduced against the compiled ABIs. The brief lists the public views by name ('names exactly as written') and asks for 'no feature, role, setting or safeguard it does not state'. Beyond that list the ABIs expose ItemStaking.rewardInfo(address) (src/ItemStaking.sol:120), ItemStaking.STREAM_DURATION and MAX_FRESH (lines 19-20), LpGauge.T (src/LpGauge.sol:20), DevVesting.CLIFF and DURATION (src/DevVesting.sol:13-14). All are read-only and change no behaviour; the project's own ItemStaking tests read rewardInfo. If the view list is treated as exhaustive, the minimal change is making the constants internal and dropping rewardInfo, at the cost of rewriting those tests. No security impact.","line":120,"path":"src/ItemStaking.sol","reproduction":"Reproduced in test/scratch/Review.t.sol test_extraViews: on fresh deployments, ItemStaking.rewardInfo(BASK) returns (0,0,0,0,0), ItemStaking.STREAM_DURATION() returns 604800, ItemStaking.MAX_FRESH() returns 1e30, BaskUsdgGauge.T() returns 126144000, DevVesting.CLIFF() returns 31536000 and DevVesting.DURATION() returns 126144000, instead of reverting on an unknown selector as a strict reading of the view list would require.","severity":"info","snippet":"    function rewardInfo(address token)","title":"Public surface wider than the brief's view list: rewardInfo, STREAM_DURATION, MAX_FRESH, T, CLIFF and DURATION are exposed"}],"hash":"7cd12891a7667acf3f0e235869d5287e38deeba181e3e8f446ab50f2763da719","nodeId":"a1d1a5d6-8f71-4ed9-a575-283ce9c342b8","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root with 4 findings and 21 coverage rows (all 17 listed entry points plus 4 invariant rows). Snippets were verified against the source lines and the JSON parses.\n\n**Outcome: no code defects found.** The full suite of 182 tests passes, and my own pass with the Pashov and entry-point checklists found nothing the specialists missed.\n\n**Findings kept, all at info level, each reproduced in `test/scratch/Review.t.sol`:**\n\n1. **Funding gap, merged** from the economics and permissions specialists. The two gauges and DevVesting pull 740M ITEM in total, but under the default 80% pool seed the requester's wallet holds 100M. The constants match the brief, so this is a launch decision for the README and manifest notes, not a code change.\n2. **1 wei dust stream delays later BASK fees** by up to 7 staked days. This is exactly what the brief's \"later amounts wait\" rule produces. An operational note only.\n3. **Unsynced fees are shared with a late staker** who joins before the detecting sync. Also mandated by the never-backdated rule.\n4. **Extra read-only ABI surface** beyond the brief's view list (rewardInfo, STREAM_DURATION, MAX_FRESH, T, CLIFF, DURATION). No security impact.\n\n**Leads dropped after reproduction:**\n- All slither and aderyn lines on RewardMath are the intended XOR and Newton steps of OpenZeppelin's mulDiv, matched line for line.\n- The aderyn reentrancy line on start() is a view call under nonReentrant.\n- The deployability floor holds: constructors call no contract, runtime sizes are 1.2 to 4.1 KB, and a scan mirroring the protected test finds no DELEGATECALL, CALLCODE or SELFDESTRUCT in any of the five runtimes.\n\n**Invariants I traced by hand and in scratch tests:** gauge payouts bounded by released and by ALLOCATION through floor-rounded index growth with carry; ItemStaking `accounted` never underflows on claim, including across an issuer burn followed by partial refills; stream time freezes while totalStaked is zero and is never backdated.\n\nThe scratch directory is mine and nothing in it is kept. No file outside it and the findings file was changed.","treeHash":null,"usage":{"cachedInputTokens":894305,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":32681,"runtime":"claude","turns":29,"wallClockMs":524899}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[{"citation":"resolved","description":"Economics / flow gap (periphery x first principles), not a code defect. BaskUsdgGauge.start() pulls exactly 490,000,000e18 ITEM, ItemEthGauge.start() exactly 210,000,000e18 and DevVesting.fund() exactly 40,000,000e18: 740,000,000 ITEM in total, 74% of the fixed 1,000,000,000 supply. The launch policy gives 10% of the supply to the swarm and seeds the pool with the requester's chosen share (80% by default), leaving the requester's wallet 10% = 100,000,000 ITEM. README line 105 says the ITEM for these calls 'comes from the requester's share of the supply'. With the default pool share no party holds enough ITEM to call start() on either gauge, so both gauges stay unstartable (stake reverts NotStarted) and 700M of emissions never exist unless ITEM is bought back from the pool. The constants match the brief, so the fix is a launch decision, not code: the pool share must be at most 16% (10% swarm + 74% contracts + pool <= 100%), or the brief's allocations must change.","line":11,"path":"src/BaskUsdgGauge.sol","reproduction":"State after launch with default policy: requester wallet balance = 100,000,000e18 ITEM; swarm 100,000,000e18; pool 800,000,000e18. Call BaskUsdgGauge.start() from the requester after approving: TokenTransfer.pull(item, msg.sender, 490_000_000e18) hits LaunchToken.transferFrom -> InsufficientBalance, start() reverts with TransferFailed. Expected (per README 'After launch' steps 2-3): both start() calls and fund() succeed from the requester's share. Actual: none of the three can be funded from that share; 490M + 210M + 40M > 100M.","severity":"info","snippet":"    constructor(address item_) LpGauge(item_, BASK, USDG, 490_000_000e18) {}","title":"Funding the gauges and vesting needs 740M ITEM, more than the requester holds under the default 80% pool share"},{"citation":"resolved","description":"Economic note, follows the brief's rule that a stream is never backdated and starts when sync detects fresh balance. Nothing in the contract calls sync when BASK fees arrive (the vault transfers with no call), so fees accumulate as undetected balance until someone calls sync/stake/unstake/claim. A large holder who was not staked while the fees accrued can stake right before (or as) the detecting sync runs; stake() calls _sync first, which starts the 7-day stream from that moment, then sets the newcomer's user index, so the newcomer shares the whole accumulated amount pro rata with the stakers who were present while it accrued. There is no capital-free extraction (the newcomer must remain staked across the 7 staked days and anyone can call sync at any time to close the window), so this is a note for the README's operational section: stakers or a keeper should call sync(token) promptly after fees land. No code change is proposed; a mechanism to backdate would contradict the brief.","line":171,"path":"src/ItemStaking.sol","reproduction":"Verified in a scratch test. t0: alice stakes 1e18 ITEM (only staker). t0: 700e18 BASK is transferred to ItemStaking; nobody calls sync. t0+10d: bob stakes 999e18 (stake runs _sync(BASK): fresh = 700e18, stream starts now). t0+17d: earned(alice,BASK) = 0.7e18, earned(bob,BASK) = 699.3e18. Expected under 'fees go to those staked when they accrued': alice ~700e18. Actual per the brief's never-backdated rule: alice 0.7e18, bob 699.3e18.","severity":"info","snippet":"        r.accounted = accounted + fresh;\n        r.streamAmount = fresh;\n        r.streamSeconds = 0;","title":"Reward amounts that sit unsynced are shared with whoever stakes before the next sync (stream starts at detection, never backdated)"}],"hash":"92835b2f96c64d5f7610f35bba661bcd4316b696fd91d78c97a46392b749de2b","nodeId":"bf76e570-c4c1-4e5b-b3d5-5f4dbdaedfc3","outcome":"completed","summary":"Review complete. The findings file is written at the repository root and validated: both snippets match the tree, and all 17 entry points plus 6 invariant rows are covered.\n\n**Outcome: no exploitable economic defect found.** The reward accounting in the gauges and ItemStaking holds its conservation laws on every path I traced and fuzzed. Two informational notes were recorded.\n\n**What I checked, from the Economic Security, Invariant and Flow Gap guides**\n\n- **Conservation**: a 400-run random-interleaving fuzz over 3 users (stake, withdraw, claim, warps up to 200 days) kept gauge payouts at or below `released()`, with the final full exit within 200 wei of it and the gauge's ITEM balance equal to allocation minus payouts. The same fuzz on ItemStaking, with deposits and issuer burns, kept the sum of owed at or below `accounted`.\n- **View versus write**: `earned()` equalled what `claim()` paid on every fuzzed step in both contracts.\n- **Index monotonicity and overflow**: both cumulative formulas are non-decreasing, so every delta is non-negative. Products stay far below 2^256, and the 512-bit mulDiv covers the accrue path.\n- **Hostile tokens**: reverting, gas-burning, 64 KB, 31-byte, zero and max balance reads all yield an invalid read and never block stake or unstake. Claims revert whole on a bad read or transfer, as specified.\n- **Timing attacks**: flash stakes earn nothing because rewards are per staked second. Partial burns leave claims first come, first served, which the brief accepts.\n- **Static analysis leads**: the XOR in mulDiv is the standard inverse seed, the strict equality is intentional, and the state write after `getPair` sits behind nonReentrant. None are defects.\n\n**Informational findings recorded**\n\n1. **Funding feasibility** (`src/BaskUsdgGauge.sol:11`). Starting both gauges and funding vesting needs 740M ITEM, but the requester's wallet holds only 100M under the default 80% pool share. This is a launch-policy decision, not a code change: the pool share must be at most 16%.\n2. **Unsynced fees are shared with late stakers** (`src/ItemStaking.sol:171`). Because streams start at detection and are never backdated, a holder who stakes before the next sync shares fees that accrued while others were staked. This follows the brief. Operators should call `sync` promptly after fees land.\n\nThe scratch probe lives under `test/scratch/Probe.t.sol` and is not part of the submission.","treeHash":null,"usage":{"cachedInputTokens":1264824,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":33267,"runtime":"claude","turns":27,"wallClockMs":495391}},{"artifacts":[],"attempt":1,"bundleHash":"7c60d1afc08b7e521fab459f448e52282ffe390a4d7944532b44ec78f71cc272","device":"0eca5d6d7ad6ddb4","findings":[],"hash":"d63a722a59ff402e686623cc243ac468bfc6941917770bc6d563640cbb401043","nodeId":"d9c5b04a-4d1e-41e0-9471-ccb2e0c41b85","outcome":"completed","summary":"Done. The project is committed on `main` as a single commit with the token, four application contracts, tests, vendored forge-std and README.\n\n**What was built** (Foundry at the repo root, solc 0.8.26, optimizer 200 runs, cancun, `bytecode_hash = none`):\n\n- `src/LaunchToken.sol`: Item / ITEM, fixed 1e27 supply minted to the deployer, no admin paths.\n- `src/ItemStaking.sol`: stake ITEM, earn BASK, USDG, WETH. Streams of 7 staked days from 50,000-gas staticcall balance reads with the exact validity, `accounted`, 1e30 and \"no unfinished stream\" rules. Stake and unstake never touch a reward token.\n- `src/LpGauge.sol` plus `BaskUsdgGauge` and `ItemEthGauge`: v2 LP staking paying ITEM on the quadratic 4-year curve over staked seconds, one-shot `start()` that pulls exactly the allocation.\n- `src/DevVesting.sol`: 40M ITEM, 365-day cliff, linear to 1460 days, beneficiary as the given literal, zero beneficiary rejected.\n- Shared `RewardMath` (512-bit mulDiv, 1e36 index, carry accrual) and `TokenTransfer` libraries, all internal, and a storage reentrancy guard.\n\n**Verification**, all run locally with the verifier's fuzz seed:\n\n| Check | Result |\n| --- | --- |\n| `forge build` | passes (lint warnings only) |\n| `forge test` offline after `forge clean` | 99 passed, 0 failed |\n| `forge fmt --check` | passes |\n| Scratch replica of the protected floor (empty-chain constructors, supply whole, no DELEGATECALL/CALLCODE/SELFDESTRUCT, size under EIP-170) | passes |\n\nTests cover every rule and its reverts, odd-sized and lone stakers, rounding at 1 wei and 1e27, hostile reward tokens (revert, false, gas burn, huge and short data, reporting 0 and 2^256-1), partial issuer burn with first-come claims, reentrancy through LP and reward tokens, and DevVesting on days 364, 365 and 1460.\n\n**Notes for the reviewer**, also in the README:\n\n- The three accepted behaviours are documented: no lock, the first LP staker earns alone, and claims are first come first served while a burn leaves ItemStaking short.\n- `start()` and `fund()` are open calls funded by whoever holds the ITEM, which comes from the requester's share, not from the contracts.\n- Operational steps after launch: create both v2 pairs, call `start()` on each gauge with its allocation, call `fund()` on DevVesting, and set ItemStaking as the vault's fee recipient.\n- One commit-time detail: git had no author identity on this machine, so the commit was made with an explicit throwaway author on the command line and no config file was changed.","treeHash":"b03bcfa0ea9db58367b5ee8151b307e7d1bf8b08","usage":{"cachedInputTokens":2339255,"inputTokens":770,"model":"claude-fable-5-1","outputTokens":72876,"runtime":"claude","turns":64,"wallClockMs":886566}},{"artifacts":[],"attempt":1,"bundleHash":"1349c0a4a26cbe02f0a08160a245dea5a3e34dfb656af6fc0d0585fca212512d","device":"0256823ae36e7900","findings":[],"hash":"e44b5ea39ffc28a77c117296d6b40c71b58505394a295816e44f39b2659ca068","nodeId":"be43fb8c-98ad-43dd-8211-9abbbbefceea","outcome":"completed","summary":"Added adversarial, fuzz, and invariant tests for all five contracts, covering hostile tokens, reentrancy, rounding, timing, rollback, and conservation.\n\nValidation with the required seed passed: **182 passed, 0 failed, 0 skipped**, including **135,168 invariant handler calls**. `forge build` also passes.\n\nAll changes are under `test/`. No implementation defects were confirmed.","treeHash":"c852db5dfb80c5fcbac8aeaceeb854c93745fb9f","usage":{"cachedInputTokens":3296512,"inputTokens":89072,"model":"gpt-6-astra","outputTokens":16876,"runtime":"codex","turns":9,"wallClockMs":675224}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1a7606be97f168d4","findings":[{"citation":"resolved","description":"The brief says 'VIEWS (public, at the current time, names exactly as written)' and 'no feature, role, setting or safeguard it does not state'. The compiled ABIs expose, beyond that list, ItemStaking.rewardInfo(address), ItemStaking.STREAM_DURATION, ItemStaking.MAX_FRESH, LpGauge.T, DevVesting.CLIFF and DevVesting.DURATION. All are read-only and change no behaviour; the project's own tests rely on rewardInfo. Recorded as a note for the judge on scope, with no fix required from the control-flow side: making the constants internal and dropping rewardInfo would be the minimal change if the judge treats the view list as exhaustive, at the cost of rewriting the ItemStaking tests that read rewardInfo.","line":120,"path":"src/ItemStaking.sol","reproduction":"Call ItemStaking.rewardInfo(BASK) on a fresh deployment: returns (0,0,0,0,0) instead of reverting with an unknown selector. Expected per a strict reading of the view list: no such function. Actual: it exists and is public. No funds or state are affected.","severity":"info","snippet":"    function rewardInfo(address token)","title":"Public surface wider than the brief's view list (extra constants and rewardInfo), not a security defect"}],"hash":"e8adfc5fecef3ee8b04743224d0ecdc8509659fd8fd5894d0739be97930ba035","nodeId":"02c21b12-fc58-4f19-93ab-12a76af36c54","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. The tree is otherwise unchanged: the scratch tests I used were deleted.\n\n**Outcome: no exploitable defect found in the control-flow area.** I traced every state-changing entry point through the Execution Trace, Periphery and First Principles checklists and found the code matching the brief.\n\n**What I verified**\n- `RewardMath.mulDiv` and `accrue` are exact. A 512-bit identity fuzz (result times denominator plus remainder equals the product, overflow revert condition) passed. The slither \"incorrect-exp\" and \"divide-before-multiply\" lines are the intended Newton-inverse steps, so they are false positives.\n- Gauges: index updated before every stake change, release curve monotone and exactly ALLOCATION at T, withdraw makes no reward-token call, claim follows checks-effects-interactions, payouts never exceed released. Randomized 24-step sequences with stakes, withdraws, claims and warps up to 400 days held conservation and `earned()` equal to the claimed amount.\n- ItemStaking: every change to totalStaked syncs all three tokens first, so stream time is always measured over a constant stake. The 50,000-gas staticcall read cannot block stake or unstake, and gas-starved syncs leave either a reverted or a consistent state. Claims pay at most the balance read, and the unchecked subtraction on `accounted` is safe because owed never exceeds it.\n- DevVesting boundaries at days 364, 365 and 1,460, and release before fund, behave as specified.\n- The protected floor: compiled runtimes contain no DELEGATECALL, CALLCODE or SELFDESTRUCT and the largest is well under the size limit.\n\n**Reported**\n- One info-level note only: the ABIs expose read-only views beyond the brief's list (`rewardInfo`, `T`, `STREAM_DURATION`, `MAX_FRESH`, `CLIFF`, `DURATION`). Not a security defect, left for the judge on scope.\n\n**Unreached**\n- Whether the live BASK, USDG and WETH `balanceOf` calls on chain 4663 fit in the brief-mandated 50,000 gas could not be measured without a fork. If one does not, that token's claims and streams would never work, though stake and unstake still would.\n\nThe coverage record answers all 17 entry points as `holds`, plus five invariant and assumption rows.","treeHash":null,"usage":{"cachedInputTokens":1193049,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":42684,"runtime":"claude","turns":40,"wallClockMs":604042}}],"verification":[{"checks":[{"durationMs":2290,"exitCode":0,"name":"build","output":"Compiling 36 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.22s\nCompiler run successful!\n","passed":true},{"durationMs":131,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 119969)\n[PASS] test_metadataAndSupply() (gas: 53307)\n[PASS] test_noMintFunction() (gas: 35707)\n[PASS] test_transfer() (gas: 86319)\n[PASS] test_transferFromWithAllowance() (gas: 170461)\n[PASS] test_transferInsufficientReverts() (gas: 36910)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 50.10ms (819.83µs CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] test_carryKeepsRemainderAcrossClaims() (gas: 3604818)\n[PASS] test_claimDoesNotTouchOtherTokens() (gas: 835538)\n[PASS] test_directTransferIsPickedUpByStakeWithoutSync() (gas: 586012)\n[PASS] test_freshAboveCapStartsNoStream() (gas: 598876)\n[PASS] test_fuzz_paidNeverExceedsStreamed(uint256[3],uint64[3],uint32) (runs: 256, μ: 1539087, ~: 1550945)\nLogs:\n  Bound result 188572854\n  Bound result 9936270839547\n  Bound result 8\n  Bound result 94874478555840879\n  Bound result 292\n  Bound result 8\n  Bound result 54103564481497819011228195\n  Bound result 168751379\n  Bound result 8\n\n[PASS] test_hostileGasBurningBalance() (gas: 2398757)\n[PASS] test_hostileHugeReturnData() (gas: 2049574)\n[PASS] test_hostileReportsMax() (gas: 1952989)\n[PASS] test_hostileReportsZero() (gas: 2398791)\n[PASS] test_hostileRevertingBalance() (gas: 1943741)\n[PASS] test_hostileShortReturnData() (gas: 1944070)\n[PASS] test_hostileTransferRevertsOrReturnsFalseOnlyBlocksItsOwnClaim() (gas: 2735784)\n[PASS] test_laterAmountsWaitUntilTheStreamFinishes() (gas: 952920)\n[PASS] test_loneOneWeiStakerGetsEverything() (gas: 591286)\n[PASS] test_noStreamTimePassesWhileNothingStaked() (gas: 1214512)\n[PASS] test_oddSizedStakersPaidAtMostStreamedAndLastClaimerInFull() (gas: 1524146)\n[PASS] test_partialIssuerBurnClaimsAreFirstComeFirstServed() (gas: 1557799)\n[PASS] test_paymentsReduceAccountedSoNewDepositsStream() (gas: 737439)\n[PASS] test_reentrancyThroughRewardTokenIsBlocked() (gas: 1719841)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 980623)\n[PASS] test_stakeAndUnstakeMoveItemOnly() (gas: 693879)\n[PASS] test_stakeWithoutApprovalReverts() (gas: 214881)\n[PASS] test_streamIsNeverBackdated() (gas: 462014)\n[PASS] test_streamReleasesLinearlyOverSevenStakedDays() (gas: 752985)\n[PASS] test_unknownTokenReverts() (gas: 64939)\n[PASS] test_views() (gas: 99313)\n[PASS] test_zeroAndInsufficientRevert() (gas: 361898)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 50.15ms (74.15ms CPU time)\n\nRan 11 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] test_day1460VestsEverything() (gas: 270373)\n[PASS] test_day364NothingVested() (gas: 165487)\n[PASS] test_day365VestsOneQuarter() (gas: 218959)\n[PASS] test_fundPullsExactlyAllocationOnce() (gas: 162569)\n[PASS] test_fundRevertsWithoutAllowance() (gas: 70956)\n[PASS] test_fundingLateDoesNotChangeTheSchedule() (gas: 195984)\n[PASS] test_fuzz_releasedNeverExceedsVested(uint256,uint256) (runs: 256, μ: 266467, ~: 274260)\nLogs:\n  Bound result 99585871\n  Bound result 157506972\n\n[PASS] test_releaseBeforeFundReverts() (gas: 39168)\n[PASS] test_releasesOnlyTheDifference() (gas: 318174)\n[PASS] test_views() (gas: 66081)\n[PASS] test_zeroBeneficiaryReverts() (gas: 5986)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 50.15ms (13.45ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:ItemEthGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4746548)\n[PASS] test_claimEmitsAndResets() (gas: 559876)\n[PASS] test_constants() (gas: 40707)\n[PASS] test_extraItemSentIsIgnored() (gas: 559748)\n[PASS] test_failedClaimRevertsWhole() (gas: 820708)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1362912, ~: 1368710)\nLogs:\n  Bound result 15142\n  Bound result 20\n  Bound result 27551\n  Bound result 7\n  Bound result 604800\n  Bound result 8779\n  Bound result 24325\n  Bound result 23559\n\n[PASS] test_initialViews() (gas: 145638)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534126)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525820)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333113)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649140)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415963)\n[PASS] test_reentrancyBlocked() (gas: 2137994)\n[PASS] test_releaseCapsAtT() (gas: 683860)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130485)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736543)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366244)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39324)\n[PASS] test_startOnlyOnce() (gas: 229595)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262947)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171718)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774583)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385076)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 747876)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 522948)\n[PASS] test_zeroAmountsRevert() (gas: 259624)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 50.13ms (55.09ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:BaskUsdgGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4859742)\n[PASS] test_claimEmitsAndResets() (gas: 559886)\n[PASS] test_constants() (gas: 52062)\n[PASS] test_extraItemSentIsIgnored() (gas: 559780)\n[PASS] test_failedClaimRevertsWhole() (gas: 780942)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1363574, ~: 1368802)\nLogs:\n  Bound result 1\n  Bound result 1913868\n  Bound result 93916098202052673611603369\n  Bound result 2007597\n  Bound result 7240171180055713989727099\n  Bound result 10305142\n  Bound result 87141509214801448292660946\n  Bound result 3987555\n\n[PASS] test_initialViews() (gas: 145659)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534158)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525763)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333211)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649172)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415973)\n[PASS] test_reentrancyBlocked() (gas: 2138025)\n[PASS] test_releaseCapsAtT() (gas: 683914)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130759)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736597)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366187)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39346)\n[PASS] test_startOnlyOnce() (gas: 229583)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262957)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171706)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774769)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385086)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 727897)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 503070)\n[PASS] test_zeroAmountsRevert() (gas: 259634)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 50.29ms (48.93ms CPU time)\n\nRan 5 test suites in 51.78ms (250.82ms CPU time): 98 tests passed, 0 failed, 0 skipped (98 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BaskUsdgGauge.claim()\",\"BaskUsdgGauge.stake(uint256)\",\"BaskUsdgGauge.start()\",\"BaskUsdgGauge.withdraw(uint256)\",\"DevVesting.fund()\",\"DevVesting.release()\",\"ItemEthGauge.claim()\",\"ItemEthGauge.stake(uint256)\",\"ItemEthGauge.start()\",\"ItemEthGauge.withdraw(uint256)\",\"ItemStaking.claim(address)\",\"ItemStaking.stake(uint256)\",\"ItemStaking.sync(address)\",\"ItemStaking.unstake(uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":150,\"foundry.toml\":17,\"launch.json\":34,\"src/BaskUsdgGauge.sol\":12,\"src/DevVesting.sol\":61,\"src/ItemEthGauge.sol\":11,\"src/ItemStaking.sol\":197,\"src/LaunchToken.sol\":59,\"src/LpGauge.sol\":161,\"src/ReentrancyGuard.sol\":16,\"src/libraries/RewardMath.sol\":67,\"src/libraries/TokenTransfer.sol\":18,\"test/DevVesting.t.sol\":140,\"test/ItemStaking.t.sol\":537,\"test/LaunchToken.t.sol\":61,\"test/LpGauge.t.sol\":477,\"test/mocks/HostileToken.sol\":89,\"test/mocks/MockERC20.sol\":49,\"test/mocks/MockV2Factory.sol\":16,\"test/mocks/ReentrantLp.sol\":38},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1f8be9225e3dd33568badc9ed82a8dbdecb51d05819cb76b7e18aa2fdbe83a4e","verifiedTreeHash":"d51457b8161cc42ec0898a4f38c1b8baeb70ea94","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":5843,"exitCode":0,"name":"build","output":"Compiling 36 files with Solc 0.8.26\nSolc 0.8.26 finished in 5.70s\nCompiler run successful!\n","passed":true},{"durationMs":236,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 119969)\n[PASS] test_metadataAndSupply() (gas: 53307)\n[PASS] test_noMintFunction() (gas: 35707)\n[PASS] test_transfer() (gas: 86319)\n[PASS] test_transferFromWithAllowance() (gas: 170461)\n[PASS] test_transferInsufficientReverts() (gas: 36910)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 75.80ms (8.29ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:ItemEthGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4746548)\n[PASS] test_claimEmitsAndResets() (gas: 559876)\n[PASS] test_constants() (gas: 40707)\n[PASS] test_extraItemSentIsIgnored() (gas: 559748)\n[PASS] test_failedClaimRevertsWhole() (gas: 820708)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1362912, ~: 1368710)\nLogs:\n  Bound result 1\n  Bound result 1913868\n  Bound result 93916098202052673611603369\n  Bound result 2007597\n  Bound result 7240171180055713989727099\n  Bound result 10305142\n  Bound result 87141509214801448292660946\n  Bound result 3987555\n\n[PASS] test_initialViews() (gas: 145638)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534126)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525820)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333113)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649140)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415963)\n[PASS] test_reentrancyBlocked() (gas: 2137994)\n[PASS] test_releaseCapsAtT() (gas: 683860)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130485)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736543)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366244)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39324)\n[PASS] test_startOnlyOnce() (gas: 229595)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262947)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171718)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774583)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385076)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 747876)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 522948)\n[PASS] test_zeroAmountsRevert() (gas: 259624)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 75.89ms (74.79ms CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] test_carryKeepsRemainderAcrossClaims() (gas: 3604818)\n[PASS] test_claimDoesNotTouchOtherTokens() (gas: 835538)\n[PASS] test_directTransferIsPickedUpByStakeWithoutSync() (gas: 586012)\n[PASS] test_freshAboveCapStartsNoStream() (gas: 598876)\n[PASS] test_fuzz_paidNeverExceedsStreamed(uint256[3],uint64[3],uint32) (runs: 256, μ: 1539087, ~: 1550945)\nLogs:\n  Bound result 3850\n  Bound result 128\n  Bound result 251372\n  Bound result 3000000000000000000\n  Bound result 3131\n  Bound result 251372\n  Bound result 67132800\n  Bound result 515845246265065459\n  Bound result 251372\n\n[PASS] test_hostileGasBurningBalance() (gas: 2398757)\n[PASS] test_hostileHugeReturnData() (gas: 2049574)\n[PASS] test_hostileReportsMax() (gas: 1952989)\n[PASS] test_hostileReportsZero() (gas: 2398791)\n[PASS] test_hostileRevertingBalance() (gas: 1943741)\n[PASS] test_hostileShortReturnData() (gas: 1944070)\n[PASS] test_hostileTransferRevertsOrReturnsFalseOnlyBlocksItsOwnClaim() (gas: 2735784)\n[PASS] test_laterAmountsWaitUntilTheStreamFinishes() (gas: 952920)\n[PASS] test_loneOneWeiStakerGetsEverything() (gas: 591286)\n[PASS] test_noStreamTimePassesWhileNothingStaked() (gas: 1214512)\n[PASS] test_oddSizedStakersPaidAtMostStreamedAndLastClaimerInFull() (gas: 1524146)\n[PASS] test_partialIssuerBurnClaimsAreFirstComeFirstServed() (gas: 1557799)\n[PASS] test_paymentsReduceAccountedSoNewDepositsStream() (gas: 737439)\n[PASS] test_reentrancyThroughRewardTokenIsBlocked() (gas: 1719841)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 980623)\n[PASS] test_stakeAndUnstakeMoveItemOnly() (gas: 693879)\n[PASS] test_stakeWithoutApprovalReverts() (gas: 214881)\n[PASS] test_streamIsNeverBackdated() (gas: 462014)\n[PASS] test_streamReleasesLinearlyOverSevenStakedDays() (gas: 752985)\n[PASS] test_unknownTokenReverts() (gas: 64939)\n[PASS] test_views() (gas: 99313)\n[PASS] test_zeroAndInsufficientRevert() (gas: 361898)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 75.97ms (110.94ms CPU time)\n\nRan 11 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] test_day1460VestsEverything() (gas: 270373)\n[PASS] test_day364NothingVested() (gas: 165487)\n[PASS] test_day365VestsOneQuarter() (gas: 218959)\n[PASS] test_fundPullsExactlyAllocationOnce() (gas: 162569)\n[PASS] test_fundRevertsWithoutAllowance() (gas: 70956)\n[PASS] test_fundingLateDoesNotChangeTheSchedule() (gas: 195984)\n[PASS] test_fuzz_releasedNeverExceedsVested(uint256,uint256) (runs: 256, μ: 266467, ~: 274260)\nLogs:\n  Bound result 172800000\n  Bound result 3427\n\n[PASS] test_releaseBeforeFundReverts() (gas: 39168)\n[PASS] test_releasesOnlyTheDifference() (gas: 318174)\n[PASS] test_views() (gas: 66081)\n[PASS] test_zeroBeneficiaryReverts() (gas: 5986)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 78.41ms (19.54ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:BaskUsdgGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4859742)\n[PASS] test_claimEmitsAndResets() (gas: 559886)\n[PASS] test_constants() (gas: 52062)\n[PASS] test_extraItemSentIsIgnored() (gas: 559780)\n[PASS] test_failedClaimRevertsWhole() (gas: 780942)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1363574, ~: 1368802)\nLogs:\n  Bound result 1\n  Bound result 1913868\n  Bound result 93916098202052673611603369\n  Bound result 2007597\n  Bound result 7240171180055713989727099\n  Bound result 10305142\n  Bound result 87141509214801448292660946\n  Bound result 3987555\n\n[PASS] test_initialViews() (gas: 145659)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534158)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525763)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333211)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649172)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415973)\n[PASS] test_reentrancyBlocked() (gas: 2138025)\n[PASS] test_releaseCapsAtT() (gas: 683914)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130759)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736597)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366187)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39346)\n[PASS] test_startOnlyOnce() (gas: 229583)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262957)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171706)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774769)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385086)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 727897)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 503070)\n[PASS] test_zeroAmountsRevert() (gas: 259634)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 78.70ms (95.02ms CPU time)\n\nRan 5 test suites in 79.84ms (384.76ms CPU time): 98 tests passed, 0 failed, 0 skipped (98 total tests)\n","passed":true},{"durationMs":93,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BaskUsdgGauge.claim()\",\"BaskUsdgGauge.stake(uint256)\",\"BaskUsdgGauge.start()\",\"BaskUsdgGauge.withdraw(uint256)\",\"DevVesting.fund()\",\"DevVesting.release()\",\"ItemEthGauge.claim()\",\"ItemEthGauge.stake(uint256)\",\"ItemEthGauge.start()\",\"ItemEthGauge.withdraw(uint256)\",\"ItemStaking.claim(address)\",\"ItemStaking.stake(uint256)\",\"ItemStaking.sync(address)\",\"ItemStaking.unstake(uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":150,\"foundry.toml\":17,\"src/BaskUsdgGauge.sol\":12,\"src/DevVesting.sol\":61,\"src/ItemEthGauge.sol\":11,\"src/ItemStaking.sol\":197,\"src/LaunchToken.sol\":59,\"src/LpGauge.sol\":161,\"src/ReentrancyGuard.sol\":16,\"src/libraries/RewardMath.sol\":67,\"src/libraries/TokenTransfer.sol\":18,\"test/DevVesting.t.sol\":140,\"test/ItemStaking.t.sol\":537,\"test/LaunchToken.t.sol\":61,\"test/LpGauge.t.sol\":477,\"test/mocks/HostileToken.sol\":89,\"test/mocks/MockERC20.sol\":49,\"test/mocks/MockV2Factory.sol\":16,\"test/mocks/ReentrantLp.sol\":38},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1669,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/RewardMath.sol:14: RewardMath.mulDiv(uint256,uint256,uint256) (src/libraries/RewardMath.sol#14-49) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/ItemStaking.sol:150: ItemStaking._sync(address) (src/ItemStaking.sol#150-175) uses a dangerous strict equality:\n[medium/medium] unused-return at src/LpGauge.sol:128: LpGauge.earned(address) (src/LpGauge.sol#128-136) ignores return value by (amount,None) = staked[user].accrue(index - _userIndex[user],_carry[user]) (src/LpGauge.sol#134)\n[medium/medium] unused-return at src/ItemStaking.sol:106: ItemStaking.earned(address,address) (src/ItemStaking.sol#106-117) ignores return value by (amount,None) = staked[user].accrue(index - _userIndex[token][user],_carry[token][user]) (src/ItemStaking.sol#115)\n[low/medium] missing-zero-check at src/ItemStaking.sol:55: ItemStaking.constructor(address).item_ (src/ItemStaking.sol#55) lacks a zero-check on :\n[low/medium] missing-zero-check at src/DevVesting.sol:30: DevVesting.constructor(address,address).item_ (src/DevVesting.sol#30) lacks a zero-check on :\n[low/medium] timestamp at src/LpGauge.sol:107: LpGauge.stakedSeconds() (src/LpGauge.sol#107-111) uses timestamp for comparisons\n[low/medium] timestamp at src/ItemStaking.sol:150: ItemStaking._sync(address) (src/ItemStaking.sol#150-175) uses timestamp for comparisons\n[low/medium] timestamp at src/LpGauge.sol:145: LpGauge._update(address) (src/LpGauge.sol#145-160) uses timestamp for comparisons\n[low/medium] timestamp at src/DevVesting.sol:55: DevVesting.vested() (src/DevVesting.sol#55-60) uses timestamp for comparisons\n[low/medium] timestamp at src/ItemStaking.sol:106: ItemStaking.earned(address,address) (src/ItemStaking.sol#106-117) uses timestamp for comparisons","passed":true},{"durationMs":476,"exitCode":0,"name":"aderyn","output":"[high] incorrect-caret-operator at src/libraries/RewardMath.sol:40: Incorrect use of caret operator\n[high] reentrancy-state-change at src/LpGauge.sol:62: Reentrancy: State change after external call\n[low] unchecked-return at src/ItemStaking.sol:140: Unchecked Return (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d63a722a59ff402e686623cc243ac468bfc6941917770bc6d563640cbb401043","verifiedTreeHash":"b03bcfa0ea9db58367b5ee8151b307e7d1bf8b08","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":6083,"exitCode":0,"name":"build","output":"Compiling 47 files with Solc 0.8.26\nSolc 0.8.26 finished in 6.00s\nCompiler run successful!\n","passed":true},{"durationMs":8926,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 119969)\n[PASS] test_metadataAndSupply() (gas: 53307)\n[PASS] test_noMintFunction() (gas: 35707)\n[PASS] test_transfer() (gas: 86319)\n[PASS] test_transferFromWithAllowance() (gas: 170461)\n[PASS] test_transferInsufficientReverts() (gas: 36910)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 876.15µs (421.32µs CPU time)\n\nRan 2 tests for test/BalanceReadBoundary.t.sol:BalanceReadBoundaryTest\n[PASS] test_balanceReadForwardsOnlyFiftyThousandGas() (gas: 218797)\n[PASS] test_balanceReadIsStaticAndInvalidTokenCannotBlockPrincipal() (gas: 791417)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.09ms (509.33µs CPU time)\n\nRan 5 tests for test/ProjectBoundaries.t.sol:ProjectBoundariesTest\n[PASS] test_allApplicationsUseTheSameRealItemAndConserveTheFixedSupply() (gas: 4738575)\n[PASS] test_applicationConstructorsAcceptAnItemAddressWithNoCode() (gas: 25728)\n[PASS] test_deployedRuntimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 8217356)\n[PASS] test_noAdminPauseUpgradeOrRecoveryEntryPointsForDeployerOrOutsider() (gas: 3943861)\n[PASS] test_singleTransactionConstructorsMakeNoExternalCallsAndPreserveSupply() (gas: 572282)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 32.50ms (28.91ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:BaskUsdgGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4859742)\n[PASS] test_claimEmitsAndResets() (gas: 559886)\n[PASS] test_constants() (gas: 52062)\n[PASS] test_extraItemSentIsIgnored() (gas: 559780)\n[PASS] test_failedClaimRevertsWhole() (gas: 780942)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1363472, ~: 1368508)\nLogs:\n  Bound result 259200000\n  Bound result 28575\n  Bound result 3450289069\n  Bound result 12876\n  Bound result 99999999999999999999999999\n  Bound result 14200\n  Bound result 15552000\n  Bound result 798\n\n[PASS] test_initialViews() (gas: 145659)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534158)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525763)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333211)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649172)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415973)\n[PASS] test_reentrancyBlocked() (gas: 2138025)\n[PASS] test_releaseCapsAtT() (gas: 683914)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130759)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736597)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366187)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39346)\n[PASS] test_startOnlyOnce() (gas: 229583)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262957)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171706)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774769)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385086)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 727897)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 503070)\n[PASS] test_zeroAmountsRevert() (gas: 259634)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 70.33ms (74.36ms CPU time)\n\nRan 7 tests for test/LaunchTokenAdversarial.t.sol:LaunchTokenAdversarialTest\n[PASS] testFuzz_fullBalanceRoundTripHasNoFeeOrSupplyChange(uint256) (runs: 1000, μ: 201398, ~: 201795)\nLogs:\n  Bound result 12715173396371\n\n[PASS] test_approvalReplacementAndRevocationEmitExactValues() (gas: 161488)\n[PASS] test_constructorEmitsTheOnlyMintAndMintsOnlyToDeployer() (gas: 22353)\n[PASS] test_insufficientBalanceRevertsAllowanceConsumption() (gas: 110169)\n[PASS] test_maximumTransferCannotWrapBalanceOrAllowance() (gas: 125798)\n[PASS] test_selfTransfersPreserveBalanceButConsumeFiniteAllowance() (gas: 201589)\n[PASS] test_zeroTransferFromWithoutApprovalSucceedsAndEmits() (gas: 78323)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 80.06ms (80.45ms CPU time)\n\nRan 18 tests for test/GaugeAdversarial.t.sol:ItemEthGaugeAdversarialTest\n[PASS] testFuzz_everyClaimOrderPaysFinalExitingClaimerInFull(uint256,uint256,uint256,uint256,uint8) (runs: 512, μ: 1476851, ~: 1482695)\nLogs:\n  Bound result 467238304009283533340838906\n  Bound result 764452779352581018787909295\n  Bound result 346504384043246743205794102\n  Bound result 157680000\n\n[PASS] test_allHostileBalanceModesLeaveStakeWithdrawAndViewsLive() (gas: 2372010)\n[PASS] test_allHostileTransferModesLeaveStakeAndWithdrawLive() (gas: 2092701)\n[PASS] test_constructorMakesNoDependencyCalls() (gas: 21217)\n[PASS] test_factoryFailureAndMalformedReturnCanBeRetried() (gas: 242846)\n[PASS] test_failedAndGasExhaustingClaimsRevertWholeThenRetry() (gas: 2585305)\n[PASS] test_failedFundingRollsBackPairStartAndTokenMovement() (gas: 433072)\n[PASS] test_failedLpTransfersRollbackPrincipalAndAccrual() (gas: 1118230)\n[PASS] test_flashBorrowedLpCannotCapturePendingRewards() (gas: 1082984)\n[PASS] test_fractionalCarrySurvivesRepeatedCompleteExitClaimAndRestake() (gas: 14235338)\n[PASS] test_insufficientFundingCannotLeaveStartedState() (gas: 341192)\n[PASS] test_itemClaimCallbacksCannotEnterAnyMutator() (gas: 1472572)\n[PASS] test_itemFundingCallbacksCannotEnterAnyMutator() (gas: 1390644)\n[PASS] test_lpCallbacksCannotReenterStart() (gas: 576158)\n[PASS] test_newEntrantCannotDilutePastReleaseOrReceiveIt() (gas: 895191)\n[PASS] test_noReturnTransfersStillMoveExactPrincipalAndRewards() (gas: 656631)\n[PASS] test_stakeWithoutAllowanceOrBalanceLeavesNoPhantomStake() (gas: 423822)\n[PASS] test_startedGaugeDoesNotRequeryFactory() (gas: 573166)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 93.14ms (105.55ms CPU time)\n\nRan 13 tests for test/DevVestingAdversarial.t.sol:DevVestingAdversarialTest\n[PASS] testFuzz_releasePartitionDoesNotLoseDust(uint256,uint256) (runs: 1000, μ: 421471, ~: 421916)\nLogs:\n  Bound result 90130880\n  Bound result 36861762\n\n[PASS] test_anySponsorCanFundAndAnyCallerCanReleaseOnlyToLiteralBeneficiary() (gas: 366400)\n[PASS] test_completionAdjacentSecondsPayTheLastWeiOnlyOnce() (gas: 388630)\n[PASS] test_constructorDoesNotCallItemOrMoveSupply() (gas: 143689)\n[PASS] test_donationsNeitherFundNorIncreaseVestedAllocation() (gas: 378285)\n[PASS] test_exactDay364AndCliffAdjacentSeconds() (gas: 377157)\n[PASS] test_failedAndMalformedFundTransfersRollbackAllChanges() (gas: 4199452)\n[PASS] test_failedAndMalformedReleaseTransfersLeaveTheWholeDebtOwed() (gas: 4536852)\n[PASS] test_fundBlocksBothReentrantMutators() (gas: 2292385)\n[PASS] test_fundWithOneWeiTooLittleAllowanceIsAtomicAndRetryable() (gas: 282127)\n[PASS] test_fundWithOneWeiTooLittleBalanceDoesNotConsumeAllowance() (gas: 337471)\n[PASS] test_noReturnTransfersStillMoveExactlyTheAllocation() (gas: 1000784)\n[PASS] test_releaseBlocksBothReentrantMutators() (gas: 2292366)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 93.27ms (98.10ms CPU time)\n\nRan 11 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] test_day1460VestsEverything() (gas: 270373)\n[PASS] test_day364NothingVested() (gas: 165487)\n[PASS] test_day365VestsOneQuarter() (gas: 218959)\n[PASS] test_fundPullsExactlyAllocationOnce() (gas: 162569)\n[PASS] test_fundRevertsWithoutAllowance() (gas: 70956)\n[PASS] test_fundingLateDoesNotChangeTheSchedule() (gas: 195984)\n[PASS] test_fuzz_releasedNeverExceedsVested(uint256,uint256) (runs: 256, μ: 266248, ~: 272301)\nLogs:\n  Bound result 7282\n  Bound result 11534\n\n[PASS] test_releaseBeforeFundReverts() (gas: 39168)\n[PASS] test_releasesOnlyTheDifference() (gas: 318174)\n[PASS] test_views() (gas: 66081)\n[PASS] test_zeroBeneficiaryReverts() (gas: 5986)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 100.27ms (38.13ms CPU time)\n\nRan 18 tests for test/GaugeAdversarial.t.sol:BaskUsdgGaugeAdversarialTest\n[PASS] testFuzz_everyClaimOrderPaysFinalExitingClaimerInFull(uint256,uint256,uint256,uint256,uint8) (runs: 512, μ: 1478255, ~: 1482899)\nLogs:\n  Bound result 467238304009283533340838906\n  Bound result 764452779352581018787909295\n  Bound result 346504384043246743205794102\n  Bound result 157680000\n\n[PASS] test_allHostileBalanceModesLeaveStakeWithdrawAndViewsLive() (gas: 2372296)\n[PASS] test_allHostileTransferModesLeaveStakeAndWithdrawLive() (gas: 2092855)\n[PASS] test_constructorMakesNoDependencyCalls() (gas: 21239)\n[PASS] test_factoryFailureAndMalformedReturnCanBeRetried() (gas: 242780)\n[PASS] test_failedAndGasExhaustingClaimsRevertWholeThenRetry() (gas: 2585327)\n[PASS] test_failedFundingRollsBackPairStartAndTokenMovement() (gas: 433116)\n[PASS] test_failedLpTransfersRollbackPrincipalAndAccrual() (gas: 1118140)\n[PASS] test_flashBorrowedLpCannotCapturePendingRewards() (gas: 1082934)\n[PASS] test_fractionalCarrySurvivesRepeatedCompleteExitClaimAndRestake() (gas: 14233584)\n[PASS] test_insufficientFundingCannotLeaveStartedState() (gas: 341214)\n[PASS] test_itemClaimCallbacksCannotEnterAnyMutator() (gas: 1472260)\n[PASS] test_itemFundingCallbacksCannotEnterAnyMutator() (gas: 1390762)\n[PASS] test_lpCallbacksCannotReenterStart() (gas: 576180)\n[PASS] test_newEntrantCannotDilutePastReleaseOrReceiveIt() (gas: 895279)\n[PASS] test_noReturnTransfersStillMoveExactPrincipalAndRewards() (gas: 656653)\n[PASS] test_stakeWithoutAllowanceOrBalanceLeavesNoPhantomStake() (gas: 423710)\n[PASS] test_startedGaugeDoesNotRequeryFactory() (gas: 573210)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 100.38ms (113.81ms CPU time)\n\nRan 27 tests for test/LpGauge.t.sol:ItemEthGaugeTest\n[PASS] test_carryAccumulatesAcrossClaims() (gas: 4746548)\n[PASS] test_claimEmitsAndResets() (gas: 559876)\n[PASS] test_constants() (gas: 40707)\n[PASS] test_extraItemSentIsIgnored() (gas: 559748)\n[PASS] test_failedClaimRevertsWhole() (gas: 820708)\n[PASS] test_fuzz_paidNeverExceedsReleased(uint256[4],uint32[4]) (runs: 256, μ: 1363197, ~: 1368484)\nLogs:\n  Bound result 70005341228244304789828995\n  Bound result 61\n  Bound result 88434966359184808206010479\n  Bound result 7894798\n  Bound result 76841265735743\n  Bound result 5\n  Bound result 36887679706177537728311856\n  Bound result 9527169\n\n[PASS] test_initialViews() (gas: 145638)\n[PASS] test_loneOneWeiStakerEarnsEverything() (gas: 534126)\n[PASS] test_noCallTouchesAnotherStake() (gas: 525820)\n[PASS] test_oddSizedStakersPaidAtMostReleasedAndLastClaimerInFull() (gas: 1333113)\n[PASS] test_partialWithdrawKeepsEarningOnRemainder() (gas: 649140)\n[PASS] test_rateIsZeroWhileNothingStaked() (gas: 415963)\n[PASS] test_reentrancyBlocked() (gas: 2137994)\n[PASS] test_releaseCapsAtT() (gas: 683860)\n[PASS] test_releasedFollowsCurveForLoneStaker() (gas: 1130485)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 736543)\n[PASS] test_stakeMovesLpAndEmits() (gas: 366244)\n[PASS] test_stakeRevertsBeforeStart() (gas: 39324)\n[PASS] test_startOnlyOnce() (gas: 229595)\n[PASS] test_startPullsExactlyAllocationAndStoresPair() (gas: 262947)\n[PASS] test_startRevertsWithoutAllowance() (gas: 171718)\n[PASS] test_startRevertsWithoutPair() (gas: 50731)\n[PASS] test_timeWithoutStakersDoesNotCount() (gas: 774583)\n[PASS] test_withdrawMoreThanStakedReverts() (gas: 385076)\n[PASS] test_withdrawMovesOnlyLpAndKeepsRewardsOwed() (gas: 747876)\n[PASS] test_withdrawWorksEvenWhenItemIsGone() (gas: 522948)\n[PASS] test_zeroAmountsRevert() (gas: 259624)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 100.31ms (103.37ms CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] test_carryKeepsRemainderAcrossClaims() (gas: 3604818)\n[PASS] test_claimDoesNotTouchOtherTokens() (gas: 835538)\n[PASS] test_directTransferIsPickedUpByStakeWithoutSync() (gas: 586012)\n[PASS] test_freshAboveCapStartsNoStream() (gas: 598876)\n[PASS] test_fuzz_paidNeverExceedsStreamed(uint256[3],uint64[3],uint32) (runs: 256, μ: 1537848, ~: 1548981)\nLogs:\n  Bound result 227662777663176\n  Bound result 13772195\n  Bound result 190856\n  Bound result 4364771010189232013980869\n  Bound result 28\n  Bound result 190856\n  Bound result 16018004\n  Bound result 2\n  Bound result 190856\n\n[PASS] test_hostileGasBurningBalance() (gas: 2398757)\n[PASS] test_hostileHugeReturnData() (gas: 2049574)\n[PASS] test_hostileReportsMax() (gas: 1952989)\n[PASS] test_hostileReportsZero() (gas: 2398791)\n[PASS] test_hostileRevertingBalance() (gas: 1943741)\n[PASS] test_hostileShortReturnData() (gas: 1944070)\n[PASS] test_hostileTransferRevertsOrReturnsFalseOnlyBlocksItsOwnClaim() (gas: 2735784)\n[PASS] test_laterAmountsWaitUntilTheStreamFinishes() (gas: 952920)\n[PASS] test_loneOneWeiStakerGetsEverything() (gas: 591286)\n[PASS] test_noStreamTimePassesWhileNothingStaked() (gas: 1214512)\n[PASS] test_oddSizedStakersPaidAtMostStreamedAndLastClaimerInFull() (gas: 1524146)\n[PASS] test_partialIssuerBurnClaimsAreFirstComeFirstServed() (gas: 1557799)\n[PASS] test_paymentsReduceAccountedSoNewDepositsStream() (gas: 737439)\n[PASS] test_reentrancyThroughRewardTokenIsBlocked() (gas: 1719841)\n[PASS] test_roundingOneWeiAndOneE27() (gas: 980623)\n[PASS] test_stakeAndUnstakeMoveItemOnly() (gas: 693879)\n[PASS] test_stakeWithoutApprovalReverts() (gas: 214881)\n[PASS] test_streamIsNeverBackdated() (gas: 462014)\n[PASS] test_streamReleasesLinearlyOverSevenStakedDays() (gas: 752985)\n[PASS] test_unknownTokenReverts() (gas: 64939)\n[PASS] test_views() (gas: 99313)\n[PASS] test_zeroAndInsufficientRevert() (gas: 361898)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 100.37ms (114.57ms CPU time)\n\nRan 11 tests for test/ItemStakingAdversarial.t.sol:ItemStakingAdversarialTest\n[PASS] testFuzz_allThreeHostileRewardsCannotBlockPrincipal(uint8[3]) (runs: 256, μ: 1881200, ~: 1837516)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 6\n\n[PASS] test_carrySurvivesFullExitAndRestake() (gas: 1794764)\n[PASS] test_exactly32BytesRequiredIncludingSuccessfulOversizedBalanceReads() (gas: 2587642)\n[PASS] test_failedTransferRollsBackFinishedStreamAndFreshStreamRecognition() (gas: 1292385)\n[PASS] test_invalidReadRollsBackTimeButPublicSyncStillAdvancesStream() (gas: 850638)\n[PASS] test_itemCallbacksGuardAllEntriesAndFailedPullPushAreAtomic() (gas: 2914810)\n[PASS] test_newlyArrivingStakerCannotTakeCompletedStream() (gas: 1046863)\n[PASS] test_rewardCallbackCannotEnterAnyFunctionAndOuterClaimPaysExactlyOnce() (gas: 1507341)\n[PASS] test_rewardTransferGasBombAndHugeDataCannotBlockExitsOrOtherClaims() (gas: 1737740)\n[PASS] test_sameTimestampLargeStakeCannotCaptureEarlierOrFutureRewards() (gas: 1126902)\n[PASS] test_zeroReportedBalancePreservesDebtAndCannotRestartLiveStream() (gas: 989690)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 104.89ms (110.32ms CPU time)\n\nRan 5 tests for test/RewardMathProperties.t.sol:RewardMathPropertiesTest\n[PASS] testFuzz_accrualPreservesEveryFraction(uint256,uint256,uint256) (runs: 1000, μ: 23051, ~: 23121)\nLogs:\n  Bound result 1011784614685277604\n  Bound result 419286450772525378187486899\n  Bound result 9284150956\n\n[PASS] testFuzz_mulDivReconstructsFull512BitProduct(uint256,uint256,uint256) (runs: 1000, μ: 24555, ~: 24260)\nLogs:\n  Bound result 4519126134259327657740855361014497526\n\n[PASS] testFuzz_splittingClaimsDoesNotLoseUserCarry(uint256,uint256,uint256,uint256) (runs: 1000, μ: 45616, ~: 45439)\nLogs:\n  Bound result 157530149\n  Bound result 32085259891575554359285856689221279235818624756754575\n  Bound result 2218556924417404265499183613084691549\n  Bound result 999999999999999999999999999999999999\n\n[PASS] test_mulDivEdgesAndOverflow() (gas: 68058)\n[PASS] test_oneWeiOneE27AndCarryBoundary() (gas: 45103)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 104.84ms (275.01ms CPU time)\n\nRan 1 test for test/DevVestingInvariant.t.sol:DevVestingInvariantTest\n[PASS]\nDevVestingInvariantTest invariants:\n[PASS] invariant_fixedLaunchSupplyIsEntirelyAccountedFor\n[PASS] invariant_receiptsEqualCustodyAndActualBeneficiaryPayments\n[PASS] invariant_scheduleUsesDeploymentTimeWithCliffAndRoundDown\n DevVestingInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭---------------------------+----------+-------+---------+----------╮\n| Contract                  | Selector | Calls | Reverts | Discards |\n+===================================================================+\n| DevVestingSequenceHandler | advance  | 8090  | 0       | 0        |\n|---------------------------+----------+-------+---------+----------|\n| DevVestingSequenceHandler | donate   | 8226  | 0       | 0        |\n|---------------------------+----------+-------+---------+----------|\n| DevVestingSequenceHandler | fund     | 8291  | 0       | 0        |\n|---------------------------+----------+-------+---------+----------|\n| DevVestingSequenceHandler | release  | 8161  | 0       | 0        |\n╰---------------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 999999999999999999999511\n  Bound result 31\n  Bound result 717\n  Bound result 7000000000000000001\n  Bound result 1803208346\n  Bound result 708306\n  Bound result 999999999999999999999997\n  Bound result 365\n  Bound result 1234\n  Bound result 5000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1727992\n  Bound result 7497\n  Bound result 999999999999999999998961\n  Bound result 1178\n  Bound result 801991429390136953205704\n  Bound result 708306\n  Bound result 0\n  Bound result 610\n  Bound result 17332788783271\n  Bound result 100000000000000000000\n  Bound result 7000000000000000000\n  Bound result 432000\n  Bound result 9539454\n  Bound result 599290589\n  Bound result 351\n  Bound result 6301\n  Bound result 12\n  Bound result 999999999999999999999511\n  Bound result 248945593493973083107899\n  Bound result 259200000\n  Bound result 3\n  Bound result 455367\n  Bound result 7000002\n  Bound result 155883292936908628382811\n  Bound result 5036287348335\n  Bound result 13477992\n  Bound result 4924796\n  Bound result 4123992\n  Bound result 35645840829768942879687\n  Bound result 0\n  Bound result 10000000\n  Bound result 50000\n  Bound result 7757\n  Bound result 2\n  Bound result 408\n  Bound result 6124955\n  Bound result 8776251\n  Bound result 50000\n  Bound result 211\n  Bound result 3574\n  Bound result 196\n  Bound result 13000000001803209048\n  Bound result 950400\n  Bound result 10000000\n  Bound result 31828614495415023990039\n  Bound result 1160172\n  Bound result 4819\n  Bound result 49900\n  Bound result 8776251\n  Bound result 599290589\n  Bound result 7000003\n  Bound result 3456000\n  Bound result 1000000\n  Bound result 7613\n  Bound result 1844\n  Bound result 7360\n  Bound result 31\n  Bound result 12463016\n  Bound result 31\n  Bound result 9537381\n  Bound result 3\n  Bound result 2\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.22s (4.21s CPU time)\n\nRan 1 test for test/GaugeInvariant.t.sol:ItemEthGaugeInvariantTest\n[PASS] invariant_principalRewardsAndActiveClockAreConserved() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+------------------------+-------+---------+----------╮\n| Contract             | Selector               | Calls | Reverts | Discards |\n+============================================================================+\n| GaugeSequenceHandler | advanceTime            | 3102  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | claim                  | 3158  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | donateIgnoredItem      | 2927  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | exitEveryone           | 3062  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | instantaneousRoundTrip | 3064  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | overWithdraw           | 3107  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | stake                  | 3057  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | withdraw               | 3099  | 0       | 0        |\n╰----------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 3975\n  Bound result 7777777777777777777\n  Bound result 10608\n  Bound result 7761\n  Bound result 1\n  Bound result 127\n  Bound result 7000003\n  Bound result 7755\n  Bound result 27286022\n  Bound result 1395\n  Bound result 1766\n  Bound result 3726\n  Bound result 261\n  Bound result 7777777777777777777\n  Bound result 4234575725140489\n  Bound result 299999999999999999999999999\n  Bound result 10366791598311763501685\n  Bound result 4004\n  Bound result 123\n  Bound result 1614\n  Bound result 313\n  Bound result 1728000\n  Bound result 11331\n  Bound result 100000000000000000000000000\n  Bound result 49900\n  Bound result 500000000000000000\n  Bound result 3333\n  Bound result 43199997\n  Bound result 5826\n  Bound result 3\n  Bound result 840\n  Bound result 76994731750966702741193732\n  Bound result 602522202993782792835301376\n  Bound result 8\n  Bound result 2195\n  Bound result 1728000\n  Bound result 1\n  Bound result 79\n  Bound result 807410061387924650828759274\n  Bound result 10794570\n  Bound result 356412771400296237544005471\n  Bound result 31536000\n  Bound result 302102409281958904625889280\n  Bound result 7000000\n  Bound result 4663\n  Bound result 8500\n  Bound result 19242270\n  Bound result 336\n  Bound result 900\n  Bound result 137\n  Bound result 23\n  Bound result 19082215881199624168762563\n  Bound result 1038\n  Bound result 33\n  Bound result 1081\n  Bound result 172800000\n  Bound result 326\n  Bound result 8133\n  Bound result 981185832410180269100734149\n  Bound result 8\n  Bound result 5932\n  Bound result 925\n  Bound result 174921413415973971095893067\n  Bound result 450731965721963998608532070\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.50s (6.50s CPU time)\n\nRan 1 test for test/GaugeInvariant.t.sol:BaskUsdgGaugeInvariantTest\n[PASS] invariant_principalRewardsAndActiveClockAreConserved() (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+------------------------+-------+---------+----------╮\n| Contract             | Selector               | Calls | Reverts | Discards |\n+============================================================================+\n| GaugeSequenceHandler | advanceTime            | 3102  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | claim                  | 3158  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | donateIgnoredItem      | 2927  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | exitEveryone           | 3062  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | instantaneousRoundTrip | 3064  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | overWithdraw           | 3107  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | stake                  | 3057  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| GaugeSequenceHandler | withdraw               | 3099  | 0       | 0        |\n╰----------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 4070\n  Bound result 7777777777777777777\n  Bound result 7532\n  Bound result 5644\n  Bound result 563267543709600516527871902\n  Bound result 1\n  Bound result 127\n  Bound result 7000003\n  Bound result 7660\n  Bound result 27286022\n  Bound result 1724\n  Bound result 532538437\n  Bound result 2496\n  Bound result 241\n  Bound result 7777777777777777777\n  Bound result 4234575725140489\n  Bound result 299999999999999999999999999\n  Bound result 10366791598311763501685\n  Bound result 4100\n  Bound result 123\n  Bound result 1794\n  Bound result 461\n  Bound result 1728000\n  Bound result 11375\n  Bound result 100000000000000000000000000\n  Bound result 49900\n  Bound result 500000000000000000\n  Bound result 3416\n  Bound result 43199997\n  Bound result 706887517289120635570895228\n  Bound result 3\n  Bound result 3702\n  Bound result 76994731750966702741193732\n  Bound result 602522202993782792835301376\n  Bound result 8\n  Bound result 11763\n  Bound result 1728000\n  Bound result 1\n  Bound result 1300\n  Bound result 160\n  Bound result 10794570\n  Bound result 356412771400296237544005471\n  Bound result 31536000\n  Bound result 6043\n  Bound result 7000000\n  Bound result 4663\n  Bound result 8647\n  Bound result 19242270\n  Bound result 386\n  Bound result 3915\n  Bound result 137\n  Bound result 23\n  Bound result 19082215881199624168762563\n  Bound result 1038\n  Bound result 33\n  Bound result 1081\n  Bound result 172800000\n  Bound result 478\n  Bound result 8153\n  Bound result 981185832410180269100734149\n  Bound result 8\n  Bound result 5953\n  Bound result 925\n  Bound result 174921413415973971095893067\n  Bound result 450731965721963998608532070\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.51s (6.51s CPU time)\n\nRan 1 test for test/LaunchTokenInvariant.t.sol:LaunchTokenInvariantTest\n[PASS]\nLaunchTokenInvariantTest invariants:\n[PASS] invariant_everyBalanceMatchesTransfersAndNoSupplyAppearsOrDisappears\n[PASS] invariant_onlyAuthorizedSpendingConsumesAllowance\n LaunchTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------------+----------------------------+-------+---------+----------╮\n| Contract                   | Selector                   | Calls | Reverts | Discards |\n+======================================================================================+\n| LaunchTokenSequenceHandler | approve                    | 6553  | 0       | 0        |\n|----------------------------+----------------------------+-------+---------+----------|\n| LaunchTokenSequenceHandler | rejectOverspend            | 6589  | 0       | 0        |\n|----------------------------+----------------------------+-------+---------+----------|\n| LaunchTokenSequenceHandler | rejectUnauthorizedTransfer | 6385  | 0       | 0        |\n|----------------------------+----------------------------+-------+---------+----------|\n| LaunchTokenSequenceHandler | transfer                   | 6674  | 0       | 0        |\n|----------------------------+----------------------------+-------+---------+----------|\n| LaunchTokenSequenceHandler | transferFrom               | 6567  | 0       | 0        |\n╰----------------------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 255\n  Bound result 10520644747766079414376310\n  Bound result 11788747340541194345961\n  Bound result 0\n  Bound result 0\n  Bound result 919\n  Bound result 4898\n  Bound result 6068\n  Bound result 0\n  Bound result 6841\n  Bound result 0\n  Bound result 9999999\n  Bound result 3067\n  Bound result 564294\n  Bound result 3433\n  Bound result 0\n  Bound result 11520\n  Bound result 0\n  Bound result 0\n  Bound result 5960\n  Bound result 4993\n  Bound result 540\n  Bound result 107477464\n  Bound result 33\n  Bound result 81213844668135168232\n  Bound result 6479\n  Bound result 0\n  Bound result 5620\n  Bound result 602522202993782792835301376\n  Bound result 0\n  Bound result 0\n  Bound result 5241\n  Bound result 156511984735375277732969694\n  Bound result 125789658745948019403742255\n  Bound result 5623\n  Bound result 0\n  Bound result 1130\n  Bound result 0\n  Bound result 1468800\n  Bound result 40000000000000000000000000\n  Bound result 0\n  Bound result 999999999000000000000000000\n  Bound result 1027\n  Bound result 0\n  Bound result 27051543069189\n  Bound result 0\n  Bound result 0\n  Bound result 4228666473\n  Bound result 370\n  Bound result 3\n  Bound result 8640000\n  Bound result 117300740\n  Bound result 2226\n  Bound result 0\n  Bound result 500000000000000000\n  Bound result 0\n  Bound result 2291\n  Bound result 0\n  Bound result 47914499408106598361008712\n  Bound result 1564\n  Bound result 0\n  Bound result 333333333333333333333333333\n  Bound result 0\n  Bound result 250000\n  Bound result 0\n  Bound result 500000000000000000\n  Bound result 117\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.44s (8.43s CPU time)\n\nRan 1 test for test/ItemStakingInvariant.t.sol:ItemStakingInvariantTest\n[PASS] invariant_principalAndRewardConservationThroughHostileSequences() (runs: 256, calls: 20480, reverts: 0)\n\n╭----------------------------+------------------------+-------+---------+----------╮\n| Contract                   | Selector               | Calls | Reverts | Discards |\n+==================================================================================+\n| ItemStakingSequenceHandler | claim                  | 2231  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | donate                 | 2350  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | elapse                 | 2306  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | issuerBurn             | 2264  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | sameTimestampRoundTrip | 2255  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | setHostility           | 2233  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | stake                  | 2332  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | sync                   | 2288  | 0       | 0        |\n|----------------------------+------------------------+-------+---------+----------|\n| ItemStakingSequenceHandler | unstake                | 2221  | 0       | 0        |\n╰----------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 17\n  Bound result 100000000000000000000000000\n  Bound result 7000000000000000001\n  Bound result 7000003\n  Bound result 7000000000000000001\n  Bound result 8374\n  Bound result 15507\n  Bound result 14\n  Bound result 114217283520452012\n  Bound result 779\n  Bound result 3120\n  Bound result 300000\n  Bound result 3610\n  Bound result 68264212522427077\n  Bound result 13546908671072538475\n  Bound result 1\n  Bound result 1169591\n  Bound result 59\n  Bound result 886978\n  Bound result 603\n  Bound result 154539175957711424311070030\n  Bound result 7000003\n  Bound result 722319877600118969032837090\n  Bound result 24576\n  Bound result 15287\n  Bound result 1797\n  Bound result 9122\n  Bound result 113712\n  Bound result 7113\n  Bound result 656951\n  Bound result 8640000\n  Bound result 31494\n  Bound result 623184447781875757731978460\n  Bound result 1\n  Bound result 6097\n  Bound result 467096\n  Bound result 5\n  Bound result 1047\n  Bound result 1000001\n  Bound result 169747464417829956133051660\n  Bound result 5398\n  Bound result 9424\n  Bound result 11354\n  Bound result 3041\n  Bound result 303504770\n  Bound result 1213\n  Bound result 8640000\n  Bound result 112000000000000000000\n  Bound result 33\n  Bound result 240\n  Bound result 6000000336728564693\n  Bound result 1000001\n  Bound result 9763\n  Bound result 1000000000000000000000000000\n  Bound result 71471773046\n  Bound result 112871\n  Bound result 232646686781978546907813115\n  Bound result 86400\n  Bound result 113712\n  Bound result 50000\n  Bound result 518400\n  Bound result 2835717307\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.83s (8.83s CPU time)\n\nRan 18 test suites in 8.84s (35.48s CPU time): 182 tests passed, 0 failed, 0 skipped (182 total tests)\n","passed":true},{"durationMs":57,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BaskUsdgGauge.claim()\",\"BaskUsdgGauge.stake(uint256)\",\"BaskUsdgGauge.start()\",\"BaskUsdgGauge.withdraw(uint256)\",\"DevVesting.fund()\",\"DevVesting.release()\",\"ItemEthGauge.claim()\",\"ItemEthGauge.stake(uint256)\",\"ItemEthGauge.start()\",\"ItemEthGauge.withdraw(uint256)\",\"ItemStaking.claim(address)\",\"ItemStaking.stake(uint256)\",\"ItemStaking.sync(address)\",\"ItemStaking.unstake(uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":150,\"foundry.toml\":17,\"src/BaskUsdgGauge.sol\":12,\"src/DevVesting.sol\":61,\"src/ItemEthGauge.sol\":11,\"src/ItemStaking.sol\":197,\"src/LaunchToken.sol\":59,\"src/LpGauge.sol\":161,\"src/ReentrancyGuard.sol\":16,\"src/libraries/RewardMath.sol\":67,\"src/libraries/TokenTransfer.sol\":18,\"test/BalanceReadBoundary.t.sol\":69,\"test/DevVesting.t.sol\":140,\"test/DevVestingAdversarial.t.sol\":344,\"test/DevVestingInvariant.t.sol\":151,\"test/GaugeAdversarial.t.sol\":545,\"test/GaugeInvariant.t.sol\":273,\"test/ItemStaking.t.sol\":537,\"test/ItemStakingAdversarial.t.sol\":460,\"test/ItemStakingInvariant.t.sol\":340,\"test/LaunchToken.t.sol\":61,\"test/LaunchTokenAdversarial.t.sol\":98,\"test/LaunchTokenInvariant.t.sol\":121,\"test/LpGauge.t.sol\":477,\"test/ProjectBoundaries.t.sol\":206,\"test/RewardMathProperties.t.sol\":129,\"test/TESTING.md\":29,\"test/mocks/HostileToken.sol\":89,\"test/mocks/MockERC20.sol\":49,\"test/mocks/MockV2Factory.sol\":16,\"test/mocks/ReentrantLp.sol\":38},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e44b5ea39ffc28a77c117296d6b40c71b58505394a295816e44f39b2659ca068","verifiedTreeHash":"c852db5dfb80c5fcbac8aeaceeb854c93745fb9f","verifierVersion":"0.1.0+a6ee6548"}]}