{"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":"3df1c84d-9cf9-4a1a-9bac-7f31f8824848","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"aa13ed9fa4276087be645f09974739c642c1849c2e5ec315bc1927518fc955eb","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":"5d19c40f5b7b678b0e78db07fce07f0d9f484f4f1509a89260a1109f85bf3176","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":"621e0a50e529c1fd88285619575f82183ba0be86a2f9e151375f799b1c580840","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":"544fce57fcadaaf94d4cccf36944bc277b2e14ad01755d63a632ef2fdc7904c1","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":"2495ec74d601764fc616bbd4eeb8493cd9246a5da7ae66e26bbab55c6daa4d35","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":"936de39d3d408c27a68956dccb44c8a0d874232362c77e1455cb2de7304fbdf9","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":"1d4fb1ebeae22d645f4b5d0d21f0878600ef9b3c4dff0f261c786a8376524e68","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"ccdeaf9a7dc7f405463b56651e1be8229fd2b86d2bc8b80a8b9747c1ea2252ac","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=0xbb85c1b7540d9e7b56f7a595fc1ff7dd07cb0823 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":"42792e42e39cbf109342ac3bcc988eb860b093ccc44090ef7a678933c78fa754","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"3df1c84d-9cf9-4a1a-9bac-7f31f8824848","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2249-item"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52586","feedbackHash":"fe2c8e24af5656be270d5168869b1ebcf6a5f15813c21b7d1c3aac8fadbf32d2","nodeKey":"audit_economics","submissionHash":"aa13ed9fa4276087be645f09974739c642c1849c2e5ec315bc1927518fc955eb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53932","feedbackHash":"079b48030f2a89ddd3be4817f6d2cb34f89dda5d2a022f8a94fab2df70a40cb3","nodeKey":"audit_flow","submissionHash":"5d19c40f5b7b678b0e78db07fce07f0d9f484f4f1509a89260a1109f85bf3176","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52660","feedbackHash":"619f582e9d32eded64aff513edb606392a7ce170ee86b1f8b09e00b627e34265","nodeKey":"audit_judge","submissionHash":"621e0a50e529c1fd88285619575f82183ba0be86a2f9e151375f799b1c580840","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51331","feedbackHash":"edebe3d82e0bb61d86846fea8ed9e41e705a0efbc8e5ba31c3dc54f610149b85","nodeKey":"audit_math","submissionHash":"544fce57fcadaaf94d4cccf36944bc277b2e14ad01755d63a632ef2fdc7904c1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52021","feedbackHash":"57b759abde17e4bad21a55810a365cfe1f25ec51409ef2af73f0e7382b38c2d6","nodeKey":"audit_permissions","submissionHash":"2495ec74d601764fc616bbd4eeb8493cd9246a5da7ae66e26bbab55c6daa4d35","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51734","feedbackHash":"d7fc017592123e4a64534856f62c9225ebb2177005eb16fff0e722cfe7430808","nodeKey":"build_contract_project","submissionHash":"936de39d3d408c27a68956dccb44c8a0d874232362c77e1455cb2de7304fbdf9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52095","feedbackHash":"e7a90f9beb166728b192daa5c562d21b27ead0d50fe321018308ba0dcb752444","nodeKey":"manifest","submissionHash":"1d4fb1ebeae22d645f4b5d0d21f0878600ef9b3c4dff0f261c786a8376524e68","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51232","feedbackHash":"c930ed4d272eb065f840d8b897830058a204769bf00f688665aa00e0e5723ae6","nodeKey":"write_foundry_tests","submissionHash":"ccdeaf9a7dc7f405463b56651e1be8229fd2b86d2bc8b80a8b9747c1ea2252ac","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f2d64f22585ea8363b68ab7e0c0dde0ce3a996eeb119ac000a70a8de50805ed3","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"b073ce3bcd9fb84de9db0462f9afae1a48a8ba4665a51887a51f1c049a903dcd","device":"8310b806f0fcfbea","findings":[],"hash":"1d4fb1ebeae22d645f4b5d0d21f0878600ef9b3c4dff0f261c786a8376524e68","nodeId":"28b42402-f10d-4c62-a137-c969c00cea42","outcome":"completed","summary":"Created `launch.json` with ITEM, all four contracts, the literal vesting beneficiary, and required pool settings. Only the manifest is a submission change.\n\nVerified constructor ABI matches, successful `forge build`, and all 79 tests passing with the supplied fuzz seed.","treeHash":"34a5860964e11b8a66d1bfb2d4483a9deb6da52f","usage":{"cachedInputTokens":236928,"inputTokens":30323,"model":"gpt-6-astra","outputTokens":3012,"runtime":"codex","turns":4,"wallClockMs":81649}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"229c8cb0d9067fbe","findings":[{"citation":"resolved","description":"Trust gap (access x economics x asymmetry). Reward deposits are permissionless ('anyone may send them') and a stream can only start when no stream is unfinished. The first positive fresh amount observed after a stream finishes becomes the next 7-day stream, whatever its size, and every later receipt waits for it. A griefer who sends 1 wei of BASK/USDG/WETH and calls sync(token) right after a stream ends (or before the first fee ever arrives) makes a 1 wei stream the live one; the vault's real fees arriving during that window are not streamed until the 1 wei stream completes 7 staked days, then they all start together. Cost to the griefer is 1 wei plus gas, repeatable every cycle, so fee delivery to ITEM stakers can be held one window behind indefinitely. No funds are lost and the queued fees are never backdated or dropped. This is exactly what the assignment's stream rule prescribes ('A live stream is never backdated, restarted or changed; later amounts wait' and 'Simplest code ... no safeguard it does not state'), so it is recorded as an accepted-behavior note for the requester rather than a defect to fix; a minimum fresh threshold would be a new mechanism and needs a scope decision.","line":118,"path":"src/ItemStaking.sol","reproduction":"Mocks at the fixed addresses as in test/ItemStaking.t.sol. alice.stake(1e27 ITEM). Griefer: bask.transfer(ItemStaking, 1); sync(BASK) -> StreamStarted(BASK, 1). Vault: bask.transfer(ItemStaking, 700e18); sync(BASK) -> no StreamStarted (stream.amount == 1, currentElapsed 0 != D). skip(7 days - 1): earned(alice, BASK) == 0. skip(1); sync(BASK) -> StreamStarted(BASK, 700e18) only now; after another 7 days earned(alice, BASK) == 700e18 + 1. Expected by the assignment text; observed identical (scratch test test_dustStreamDelaysFees passes). Reported so the judge can decide whether the accepted 'later amounts wait' rule covers hostile dust deposits.","severity":"info","snippet":"            if (fresh != 0 && fresh <= MAX_FRESH && (stream.amount == 0 || currentElapsed == D)) {","title":"Anyone can delay real fee streaming by up to 7 staked days per cycle with a 1 wei reward deposit (spec-mandated 'later amounts wait')"},{"citation":"resolved","description":"Trust gap (access x economics), operational not code. start() on each gauge and fund() on DevVesting are permissionless but each pulls its whole ALLOCATION from msg.sender in one transfer: 490,000,000 + 210,000,000 + 40,000,000 = 740,000,000 ITEM, 74% of the fixed 1,000,000,000 supply. The launch factory gives 10% to the swarm and seeds the pool with the requester's chosen share (80% by default), leaving the requester 100,000,000 ITEM. Unless the requester chose a pool share of at most 16%, no wallet can ever satisfy a transferFrom of 490,000,000, so BaskUsdgGauge.start() reverts with TokenTransferFailed forever and the gauge stays unstarted (stake reverts NotStarted). The contracts follow the assignment's numbers exactly and README.md line 51 states the 740,000,000 requirement, so this is a launch-policy note for the requester and judge, not a contract defect; no code change is proposed.","line":59,"path":"src/LpGauge.sol","reproduction":"State after a default launch: requester wallet W holds 100,000,000e18 ITEM, BaskUsdgGauge deployed with ALLOCATION 490,000,000e18, BASK/USDG pair exists. W: item.approve(gauge, 490_000_000e18); gauge.start(). Expected (assignment): gauge starts. Actual: ERC20 transferFrom reverts (ERC20InsufficientBalance) and TokenCalls reverts TokenTransferFailed(item); started stays false; any stake() reverts NotStarted. test/Gauges.t.sol test_missingPairAndUnfundedStartRevertAtomically shows the same revert for an unfunded caller.","severity":"info","snippet":"        TokenCalls.transferFrom(item, msg.sender, address(this), ALLOCATION);","title":"Gauge and vesting funding needs 740,000,000 ITEM from one caller each, more than the requester holds after a default launch split"}],"hash":"2495ec74d601764fc616bbd4eeb8493cd9246a5da7ae66e26bbab55c6daa4d35","nodeId":"c9c43515-617c-4bfc-a68f-486efd949e87","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, both snippets match the tree exactly, and every one of the 17 listed entry points has a coverage row.\n\n**Outcome: no exploitable defect in the Access Control, Trust Gap or Asymmetry area.** The permission model is empty by design: no roles, owners, initializers, proxies or sweeps exist, and every state-changing function is nonReentrant and keyed to msg.sender. Paired surfaces (stake/withdraw, stake/unstake, sync/claim, fund/release) write mirrored state in mirrored order, with the global index and caller account checkpointed before every stake change.\n\n**What I checked, beyond reading:**\n- Ran the existing suite (79 tests pass) and six scratch probes of my own under test/scratch/, covering dust-stream griefing, burn-to-zero then partial repayment, odd stake sizes with repeated claims and exits, a lone 7-wei gauge staker across a 1000-day idle gap plus a same-block flash stake, hostile WETH during principal moves, and the 1e30 fresh cap with a late 1e27 joiner. All pass with at most 2 raw units of dust.\n- Checked the Slither and Aderyn leads: the \"incorrect shift order\" and \"state change after external call\" lines are false positives (Yul `shl` argument order is correct; `start()` is guarded and the factory address is a constant).\n\n**Two notes recorded, both at info severity:**\n1. Anyone can send 1 wei of a reward token and call sync to make it the live stream, delaying real fees by up to 7 staked days per cycle. This follows the assignment's \"later amounts wait\" rule exactly, so it is flagged for the judge as accepted behavior rather than a defect.\n2. Starting both gauges and funding vesting needs 740M ITEM from single callers, while the requester holds 100M after a default 80% pool split. The README already states the requirement. It is a launch-policy gap, not a code defect.\n\nNothing was left unreached. The launch manifest does not exist yet, which is expected at this stage.","treeHash":null,"usage":{"cachedInputTokens":985244,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":34475,"runtime":"claude","turns":38,"wallClockMs":528508}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2d5a117dd72f6b4","findings":[],"hash":"544fce57fcadaaf94d4cccf36944bc277b2e14ad01755d63a632ef2fdc7904c1","nodeId":"f498da42-001d-458d-9122-cc1a9f7d21e3","outcome":"completed","summary":"The review is complete and the findings file is written. The math area came back clean.\n\n**Result: no defects found** in the Math Precision, Boundary, or Numerical Gap areas. The findings file at `.imd-findings.json` holds an empty findings list and 21 coverage rows: all 17 listed entry points marked `holds`, plus four invariant rows. The working tree is clean (scratch tests removed, nothing else touched).\n\n**What I verified, beyond reading the code:**\n- Built the project and ran the existing 79 tests, all passing.\n- Wrote scratch probes for the edges the guides target: a 1-wei staker next to a 1e27 whale entering mid-stream with hourly sync spam, a 1-wei stream against the full ITEM supply, 70 consecutive one-wei streams over stakes of 1/2/4, the gauge at the exact T boundary with a late entrant, pre-start claim and withdraw calls, a stream finishing while idle, a deliberately low-gas stake that invalidates the balance reads, and a weekly vesting walk from day 364 to 1470.\n- Every probe held the spec's invariants. Paid never exceeded released or receipts, dust stayed at a few wei, and the vesting cliff and endpoint are exact. The only surprises were my own assertion mistakes and the expected round-down dust, which the rules mandate.\n\n**Static-analysis leads checked and dismissed:** the Yul shift operand order is correct, the strict equality on stream time is reached exactly because of the min cap, and the external view call before state in `start()` is a guarded view read.\n\n**Notes for the judge, not defects:** index rounding can push a user whose exact share is an integer just below it, so 70 one-wei streams pay 9/19/39 instead of 10/20/40 and leave 3 wei in the contract. This is the specified round-down behavior and the spec's \"paid less dust\" acceptance covers it.","treeHash":null,"usage":{"cachedInputTokens":1320124,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":39540,"runtime":"claude","turns":35,"wallClockMs":609984}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f2101c240e0b52a9","findings":[],"hash":"5633923ac324f596962e740e39ff98103c1990f705eb54afb72514fa208261c2","nodeId":"0c8e93a0-629b-4fdf-9bcc-83b807819861","outcome":"failed","summary":"the local build failed, so this was not submitted:\nforge build exited with 1:\nCompiling 23 files with Solc 0.8.26\nSolc 0.8.26 finished in 40.41ms\nError: Compiler run failed:\nError (6272): Cannot assign to builtin function \"balance\".\n   --> src/ItemStaking.sol:241:25:\n    |\n241 |                 balance := mload(0)\n    |                         ^^","treeHash":null,"usage":{"cachedInputTokens":1869354,"inputTokens":706,"model":"claude-fable-5-1","outputTokens":96784,"runtime":"claude","turns":64,"wallClockMs":1249476}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8109087d965ddf6c","findings":[{"citation":"resolved","description":"Not a code defect: the allocations are the brief's constants and README line 51 already discloses the 740,000,000 ITEM funding requirement. Recorded so the judge has it: start() pulls exactly ALLOCATION in one transferFrom with no partial funding path, so BaskUsdgGauge needs 490,000,000e18, ItemEthGauge 210,000,000e18 and DevVesting.fund() 40,000,000e18 from a single caller. The launch factory keeps 10% for the swarm, seeds the pool with the requester's chosen share (80% by default) and sends the rest (100,000,000e18 by default) to the requester's wallet. With the default split no launch participant holds enough ITEM to call start() on either gauge; the gauges stay unstarted (stake reverts NotStarted) until someone acquires the allocation from the pool. If the requester chose a different pool share, this note does not apply.","line":59,"path":"src/LpGauge.sol","reproduction":"State: LaunchToken supply 1e27 split by the factory with the default policy (requester wallet receives 100,000,000e18). Call: requester approves BaskUsdgGauge and calls start(). Expected by the brief: gauge starts after pulling 490,000,000e18. Actual: LaunchToken.transferFrom reverts ERC20InsufficientBalance(requester, 100000000e18, 490000000e18), so TokenCalls._call reverts TokenTransferFailed(item) and the gauge stays unstarted. Same for ItemEthGauge (210,000,000e18). DevVesting.fund() (40,000,000e18) succeeds with that balance.","severity":"info","snippet":"        TokenCalls.transferFrom(item, msg.sender, address(this), ALLOCATION);","title":"Gauge and vesting funding (740M ITEM) exceeds what the default launch split leaves the requester (100M); start()/fund() cannot be completed from launch inventory alone"}],"hash":"5d19c40f5b7b678b0e78db07fce07f0d9f484f4f1509a89260a1109f85bf3176","nodeId":"6edc8534-7da8-45f1-b4d5-9df40f07e121","outcome":"completed","summary":"Review complete. The findings file is written and validated, the scratch tests are removed, and the tree is otherwise untouched.\n\n**Outcome: no substantiated defects in the Execution Trace, Periphery or First Principles areas.** One info note was recorded, and all 17 entry points plus five checked invariants have coverage rows.\n\n**What I traced**\n\n- **LpGauge control flow.** The global index is advanced from differences of the cumulative release curve, then the caller's account, before any stake change. A same-timestamp stake-and-claim earns nothing. The clock only runs while `totalStaked` is nonzero and clamps at T, so emission never exceeds the allocation. `withdraw` never touches ITEM and its update path has no revert branch, so an LP exit always works.\n- **ItemStaking control flow.** Streams advance by floor(F·s/D) differences, wall time always checkpoints while staked time only passes with stakers present. A new stream starts only on a valid read, balance at or above accounted, fresh in (0, 1e30], and no unfinished stream. Claims pay min(accrued, balance read) and decrement accounted by exactly that amount. Nothing in stake or unstake can be made to revert by any reward-token behaviour. A scratch run confirmed a stream ending exactly as the last staker exits, an idle-period deposit, and burn deficits being repaired before new streams.\n- **Periphery.** The TokenCalls selector shift is the correct Yul operand order, calldata is 36 bytes, the staticcall is gas and copy bounded, and a 0-byte transfer return is accepted only if the token has code. RewardIndex computes the carry formula exactly without a 256-bit product overflow, and the index is monotone.\n- **DevVesting.** Cliff and linear formula match the brief at days 364, 365 and 1,460. Funding is once-only and the release path is effects-before-transfer.\n\n**Static-analysis leads** were all false positives after inspection and are recorded as such in the coverage rows.\n\n**The info note** is that `start()` on either gauge pulls the entire allocation in one call, and the default launch split leaves the requester 100M ITEM against 490M and 210M needed. The README already discloses the 740M requirement and the constants come from the brief, so this is a funding-inventory note for the judge, not a code defect.","treeHash":null,"usage":{"cachedInputTokens":831281,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":33300,"runtime":"claude","turns":27,"wallClockMs":500951}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1ec9f666356a7ad7","findings":[{"citation":"resolved","description":"Reproduced. Reward deposits are permissionless and a new stream can only start when no stream is unfinished, so whoever gets a positive fresh amount observed first after a stream finishes sets the next 7-staked-day stream, whatever its size. A griefer who transfers 1 wei of BASK, USDG or WETH and calls sync(token) makes a 1 wei stream live; vault fees arriving during that window are not streamed until it completes, then start together. Nothing is lost, nothing is backdated, and the queued fees stream in full afterwards. This is exactly what the brief prescribes ('A live stream is never backdated, restarted or changed; later amounts wait' and 'no safeguard it does not state'), so it is an accepted-behaviour note for the requester; a minimum fresh threshold would be a new mechanism and needs a scope decision. Merged from audit_permissions and the related remark in audit_economics.","line":118,"path":"src/ItemStaking.sol","reproduction":"ItemStaking with a plain ERC-20 etched at BASK; alice stakes 1e27 ITEM. Griefer transfers 1 wei BASK to ItemStaking and calls sync(BASK): StreamStarted(BASK, 1). Vault then transfers 700e18 BASK and sync(BASK) is called: no StreamStarted (stream.amount == 1, currentElapsed 0 != D). skip(7 days - 1); sync: earned(alice, BASK) == 0. skip(1); sync: StreamStarted(BASK, 700e18) only now. skip(7 days): earned(alice, BASK) == 700e18 + 1. Expected by the brief; observed identical (scratch test test_dustStreamDelaysFees passed on this tree).","severity":"info","snippet":"            if (fresh != 0 && fresh <= MAX_FRESH && (stream.amount == 0 || currentElapsed == D)) {","title":"Spec-mandated: a 1 wei reward deposit synced right after a stream ends holds real fees back one 7-staked-day window (note, no fix)"},{"citation":"resolved","description":"Reproduced. fresh = balance - accounted is only ever reduced by payouts or issuer burns, and accounted only grows when a stream starts, so once anyone donates more than 1e30 raw units of a reward token beyond accounted, every later receipt of that token is never streamed; running streams and amounts already owed still pay. The brief states this rule ('fresh = balance - accounted above 1e30: no new stream') and says to add no mechanism. Cost is 1e12 whole WETH or BASK (18 decimals) or 1e24 USDG, so it is impractical for WETH and USDG and depends on BASK's supply. Listed from audit_economics so the requester is aware; no change proposed.","line":118,"path":"src/ItemStaking.sol","reproduction":"ItemStaking with a plain ERC-20 etched at BASK; alice stakes 1e27 ITEM. Mint 1e30 + 1 BASK to ItemStaking and call sync(BASK): no stream (fresh > MAX_FRESH). Vault then sends 1000e18 BASK; skip(30 days); sync(BASK). Expected per the brief and actual: earned(alice, BASK) == 0 and no StreamStarted is ever emitted (scratch test test_surplusAbove1e30StopsStreamsForever passed on this tree).","severity":"info","snippet":"            if (fresh != 0 && fresh <= MAX_FRESH && (stream.amount == 0 || currentElapsed == D)) {","title":"Spec-mandated: one unaccounted surplus above 1e30 raw units permanently stops new streams of that reward token (note, no fix)"},{"citation":"resolved","description":"Reproduced. start() on each gauge and fund() on DevVesting are permissionless but each pulls its entire ALLOCATION in a single transferFrom with no partial-funding path: 490,000,000e18 + 210,000,000e18 + 40,000,000e18 = 740,000,000e18 ITEM, 74% of the fixed supply. With the default policy the factory keeps 10% for the swarm, seeds the pool with 80% and sends 100,000,000e18 to the requester, so no launch participant can start either gauge from launch inventory; stake() keeps reverting NotStarted until someone acquires the allocation. The contracts implement the brief's constants exactly and README.md discloses the 740,000,000 requirement, so this is a launch-policy note for the requester and judge, not a contract defect. Merged duplicate of audit_permissions and audit_flow.","line":59,"path":"src/LpGauge.sol","reproduction":"BaskUsdgGauge deployed with item = LaunchToken; a mock factory etched at V2_FACTORY returns a non-zero pair for (BASK, USDG). Wallet W holds 100,000,000e18 ITEM and approves the gauge. W calls start(). Expected by the brief: gauge starts after pulling 490,000,000e18. Actual: LaunchToken.transferFrom reverts ERC20InsufficientBalance, TokenCalls._call reverts TokenTransferFailed(item), started stays false (scratch test test_startNeedsFullAllocationFromOneCaller passed on this tree). The same holds for ItemEthGauge at 210,000,000e18; DevVesting.fund() at 40,000,000e18 succeeds with that balance.","severity":"info","snippet":"        TokenCalls.transferFrom(item, msg.sender, address(this), ALLOCATION);","title":"Operational: gauge start() and DevVesting fund() each pull the whole ALLOCATION from one caller, 740,000,000 ITEM in total, more than the default launch split leaves the requester (note, no fix)"}],"hash":"621e0a50e529c1fd88285619575f82183ba0be86a2f9e151375f799b1c580840","nodeId":"7ccc86f0-ec1c-4764-9c53-56fa83fe422b","outcome":"completed","summary":"Review complete. The findings file is written and validated, and the scratch tests are removed so the tree holds only `.imd-findings.json`.\n\n**Outcome: no contract defects.** All three specialist findings reproduce, but each is behaviour the brief itself mandates, so they stay as info notes rather than defects to fix. The full suite of 95 tests passes, and my own adversarial scratch tests also passed before I removed them.\n\n**Findings kept, all info:**\n- **Dust stream delays fees.** A 1 wei reward deposit synced right after a stream ends becomes the next 7-staked-day stream, so real vault fees wait one window. Reproduced exactly as the brief's \"later amounts wait\" rule prescribes.\n- **Surplus above 1e30 stops streams for good.** Once an unaccounted surplus of a reward token exceeds 1e30 raw units, no later receipt of that token streams. Reproduced, and it is the brief's own cap.\n- **Funding size is operational.** Starting both gauges and funding vesting needs 740,000,000 ITEM from single callers, more than the default launch split leaves the requester. The two specialists' duplicate notes are merged into one. The README already discloses it.\n\n**What I verified myself:**\n- Every one of the 17 entry points traced and marked `holds`, with reasons, plus rows for the two conservation invariants, the static-analysis leads and the manifest.\n- Pre-start calls on a gauge do not backdate its clock, the schedule ends cleanly at four years, and withdraw never touches ITEM.\n- A lying reward token that reports 1e30, then 0, then the maximum value, then turns honest never underflows accounting, never blocks unstake, and only ever blocks its own claim.\n- The static-analysis leads do not hold: the Yul shift order is correct, the factory read is a staticcall to a constant address under the reentrancy guard, and the strict equality against the 7-day cap is reached exactly because elapsed is capped.\n\nNothing is outstanding for the author. The one open item for the requester is operational: arranging the 740,000,000 ITEM needed to start the gauges and fund vesting.","treeHash":null,"usage":{"cachedInputTokens":1347063,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":35265,"runtime":"claude","turns":27,"wallClockMs":496967}},{"artifacts":[],"attempt":2,"bundleHash":"10803691d73cb0f1e9f0a633973f26a3c712b63734193cb132664ac17915f2d1","device":"a68191e8efe5b6e4","findings":[],"hash":"936de39d3d408c27a68956dccb44c8a0d874232362c77e1455cb2de7304fbdf9","nodeId":"0c8e93a0-629b-4fdf-9bcc-83b807819861","outcome":"completed","summary":"Implemented all five contracts, vendored dependencies, and documented deployment parameters, funding, assumptions, and review findings.\n\nVerification passed:\n\n- `forge build`\n- `forge test`: 79 tests passed with the supplied fuzz seed\n- `forge fmt --check`\n\nTests cover hostile tokens, reentrancy, burns, rounding, conservation, withdrawals, and vesting boundaries.","treeHash":"5fb129483bfd8a793b8a61a578e08aa0889cb49d","usage":{"cachedInputTokens":1406720,"inputTokens":90397,"model":"gpt-6-astra","outputTokens":38241,"runtime":"codex","turns":7,"wallClockMs":927994}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"66ceb1fcb4b0b455","findings":[{"citation":"resolved","description":"This is a note, not a defect. The code does what the brief says ('fresh = balance - accounted above 1e30: no new stream'). Nothing in the contract ever makes fresh smaller again (accounted only grows when a stream starts, and the balance only falls through payouts or issuer burns). So once anyone donates more than 1e30 raw units of BASK, USDG or WETH beyond accounted, every later fee in that token stays unstreamed in the contract for good. Streams already running and amounts already owed still pay out. What it costs: 1e30 raw units is 1e12 whole BASK or WETH, or 1e24 USDG. That is out of reach for WETH and USDG and depends on BASK's supply. The brief says to add no mechanism, so nothing needs to change. It is listed so the requester knows about it. One related behaviour, also by design: anyone can call sync right after a stream finishes, which starts a dust-sized stream, so a large fee arriving next waits up to 7 more staked days. This only delays rewards and cannot be repeated to take value.","line":118,"path":"src/ItemStaking.sol","reproduction":"ItemStaking with standard ERC-20 mocks at BASK/USDG/WETH. Alice stakes 1e18 ITEM. Anyone transfers 1e30+1 BASK to staking and calls sync(BASK). The vault then sends 1000e18 BASK. After warp +30 days and sync(BASK), earned(alice, BASK) == 0 (checked locally in a scratch test). This is what the brief specifies; if the requester wants different behaviour, that is a scope decision for them.","severity":"info","snippet":"            if (fresh != 0 && fresh <= MAX_FRESH && (stream.amount == 0 || currentElapsed == D)) {","title":"Spec-mandated: one unaccounted surplus above 1e30 permanently stops all future streams of that reward token"}],"hash":"aa13ed9fa4276087be645f09974739c642c1849c2e5ec315bc1927518fc955eb","nodeId":"0e2cc32b-a3e7-47c7-880a-f44515219c97","outcome":"completed","summary":"I found no real defects in the economics. The review file `.imd-findings.json` has one info-level note and needs no fix, so there are no proof tests (those are only for critical or high findings).\n\nThe full suite (79 tests) passes. I also traced every entry point against the Economic Security, Invariant and Flow Gap guides and ran two throwaway probe tests, which I've since deleted. The tree is unchanged.\n\n**The note (info):** this is what the brief specifies, not a bug. In `ItemStaking`, if anyone donates more than 1e30 raw units of a reward token on top of what's already accounted for (`src/ItemStaking.sol:118`), that token never streams again. Nothing in the contract ever brings the surplus back under the limit, so every later fee in that token sits in the contract for good. Streams already running and amounts already owed still pay out. I confirmed it with a probe: after a donation of 1e30+1 BASK, 1,000 BASK of fees and 30 days, the staker has earned 0. The attack needs 1e12 BASK or WETH, or 1e24 USDG, so it's out of reach for WETH and USDG and depends on BASK's supply. Changing it would mean changing the brief, so it's the requester's call.\n\n**What holds:**\n- **Gauges:** total paid never exceeds what has been released, which never exceeds the allocation. A stake added and removed in the same block earns nothing. `withdraw` only moves LP tokens, so it can't be blocked.\n- **ItemStaking:** for each reward token, `accounted` only grows when a stream starts and only falls by what is actually paid. So payouts can't be counted again as new fees and never exceed what came in. No reward-token behaviour can make `stake` or `unstake` revert, including reverting, returning false, burning gas, returning huge data, or reporting 0 or 2^256-1. Numbers can't overflow even with a 1-wei total stake and a stream at the 1e30 limit.\n- **DevVesting:** it releases nothing before day 365, then vests on the deployment clock up to the full allocation at day 1,460.\n\n**Static-analysis leads:** none of them holds up.\n- Aderyn's shift-order warning is a false positive: the instruction's arguments are in the correct order.\n- Aderyn's reentrancy warning on `start()` doesn't apply: the only call before the state change is to the fixed factory address, and `start()` is guarded against reentry.\n- Slither's strict-equality warning flags the \"previous stream has finished\" check, which is meant to be exact.\n\n**Not checked:** the protected deployment tests need the launch environment's variables and wouldn't run here. Something can also be done on purpose, by design: right after a stream finishes, anyone can start a dust-sized one, which makes the next large fee wait up to 7 more staked days. It only delays rewards and takes no value, so I left it out of the findings.\n\nThe coverage record answers all 17 entry points: 16 hold, and `ItemStaking.sync` is marked against the note. It also has rows for the two accounting invariants and the shift-order lead.","treeHash":null,"usage":{"cachedInputTokens":854749,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":24273,"runtime":"claude","turns":13,"wallClockMs":293334}},{"artifacts":[],"attempt":1,"bundleHash":"6f8bb4421d6fec43ce40d19c07b8cdf56cdc3d12ee2d8b2e28ce55518555d59d","device":"a18a0c6087e1362f","findings":[],"hash":"ccdeaf9a7dc7f405463b56651e1be8229fd2b86d2bc8b80a8b9747c1ea2252ac","nodeId":"eddcdc03-575c-4a98-9c6c-5ef64e790f54","outcome":"completed","summary":"I added invariant tests for every contract that holds value, plus edge-case and event tests. The full suite passes with the verifier's fuzz seed: 92 tests, 0 failed, and `forge build` is clean. I found no defect in the contracts, so I didn't write `.imd-findings.json`. I changed none of the existing files; everything new is under `test/`.\n\n**Invariant tests** (in `test/invariant/`). Each uses a handler that calls the contract in random order with several actors. Run counts are set in the files themselves.\n- **Both gauges** (128 runs × 80 calls each; an earlier run at 256 runs × 500 calls also passed):\n  - Staked LP held equals `totalStaked` and the sum of all stakes.\n  - ITEM is conserved: what the gauge holds plus what was paid equals the allocation plus any ITEM sent to it.\n  - Paid plus still-owed never exceeds `released`, and falls short of it by at most 3 wei (one per actor).\n  - `stakedSeconds` only counts time while something is staked, and `released`, `rate` and `remaining` match their formulas exactly.\n  - `withdraw` never fails, even while ITEM transfers revert, return false or return oversized data.\n  - A failed claim leaves the debt unchanged.\n- **ItemStaking** (128 × 80): the handler mixes stake, unstake, claim, sync, fee deposits, issuer burns, time jumps and hostile reward tokens (all balance-read failure modes, plus transfers that revert, return false or return oversized data).\n  - ITEM held equals `totalStaked` and the sum of stakes.\n  - For each reward token, what it holds plus paid plus burned equals what it received.\n  - Paid plus owed never exceeds what it received, and it can pay everything owed whenever there was no burn.\n  - `stake`/`unstake` never fail, and a claim of a well-behaved token never fails.\n  - A claim never pays more than was owed, and whatever it doesn't pay stays owed.\n- **DevVesting** (128 × 40):\n  - `vested` matches its formula exactly.\n  - `released` ≤ `vested` ≤ the allocation, and `released` never goes down.\n  - The beneficiary's balance equals `released`, and nothing leaves the contract except to the beneficiary.\n  - `fund` can't succeed twice, and `release` never fails once funded.\n\n**Other new tests:**\n- **`test/ItemStakingReadEdges.t.sol`**, using a new mock `test/mocks/OddReadToken.sol`:\n  - A balance read returning 33 or 64 bytes, or needing about 60k gas even when plenty is supplied, counts as invalid: no stream starts, stake and unstake still work, and the claim reverts with `BalanceReadFailed`.\n  - A read needing about 30k gas is valid.\n  - A top-up waits until the live stream reaches exactly 7 days, then starts from that moment.\n  - A 1-wei reward split between a 1-wei staker and a 1e27 staker rounds down and carries the fraction over to the next stream.\n- **`test/Events.t.sol`**: every state-changing function emits its event with the amount actually moved.\n\n**Notes, not defects:**\n- The invariant tests don't check how small the final ItemStaking rounding dust is; the existing fuzz tests already check that the last claimer is paid in full.\n- A transfer that burns all its gas is left out of the random sequences because it only slows them down; the unit tests already cover it.\n- Because of how the EVM forwards gas, a caller who sends very little gas can make the 50k-gas balance read fail. That only delays new fee streams during `stake`/`unstake`, and only reverts the caller's own claim, so it does no harm.\n- The accepted behaviours (no staking lock, the first LP staker earning alone, claims being first come first served after an issuer burn) are already written up in `REVIEW.md`.","treeHash":"88f49eca50d89009c58772aa78268bec27846ff8","usage":{"cachedInputTokens":1144626,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":31507,"runtime":"claude","turns":25,"wallClockMs":518002}}],"verification":[{"checks":[{"durationMs":2558,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.47s\nCompiler run successful!\n","passed":true},{"durationMs":761,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/RewardIndex.t.sol:RewardIndexTest\n[PASS] test_fractionalCarryCombinesBeforeRounding() (gas: 413217)\n[PASS] test_true512BitProductsRoundDownWithoutOverflow() (gas: 330524)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 284.17µs (167.47µs CPU time)\n\nRan 4 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_noMintOrAdminEntrypoint() (gas: 130760)\n[PASS] test_standardFixedSupplyAndMetadata() (gas: 52729)\n[PASS] test_transferAndApproval() (gas: 233100)\n[PASS] test_transferFailures() (gas: 89826)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 668.23µs (548.26µs CPU time)\n\nRan 8 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] testFuzz_vestingFormulaAndConservation(uint256,uint256) (runs: 512, μ: 291979, ~: 302252)\nLogs:\n  Bound result 2262\n  Bound result 5629\n\n[PASS] test_constructorAndFundingOnce() (gas: 248344)\n[PASS] test_days364365And1460AndAnyoneCanRelease() (gas: 500927)\n[PASS] test_failedReleaseIsAtomicAndCanBeRetried() (gas: 502844)\n[PASS] test_fundAndReleaseRejectReentry() (gas: 404674)\n[PASS] test_lateFundingUsesDeploymentClockAndIgnoresDonations() (gas: 259967)\n[PASS] test_unfundedReleaseRevertsAndFailedFundingRollsBack() (gas: 273312)\n[PASS] test_zeroBeneficiaryRejected() (gas: 5983)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 528.05ms (529.36ms CPU time)\n\nRan 18 tests for test/Gauges.t.sol:BaskUsdgGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341505, ~: 4345121)\nLogs:\n  Bound result 13308\n  Bound result 200\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10576440, ~: 10596187)\nLogs:\n  Bound result 0\n  Bound result 4220861\n  Bound result 855769723169820381618979161\n  Bound result 88264956045194995571727701\n  Bound result 35393227547485095106006883\n  Bound result 0\n  Bound result 15001238\n  Bound result 692541083090229344539561859\n  Bound result 5833263\n  Bound result 3089915936548889415676063\n  Bound result 0\n  Bound result 358901236504986395695351159\n  Bound result 4024031\n  Bound result 15672446\n  Bound result 550787189292821725421283799\n  Bound result 22018682225270112014429433\n  Bound result 30020917193860436230600953\n  Bound result 609463270155108762227117076\n  Bound result 10150959\n  Bound result 4733407867348112043345579\n  Bound result 7346473\n  Bound result 681178746641622194191291412\n  Bound result 8423806\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 724084, ~: 727096)\nLogs:\n  Bound result 896488045855827\n  Bound result 924142677351361510538323488\n  Bound result 23728632\n\n[PASS] test_constants() (gas: 25088)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481916)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 959446)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322276)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 528.32ms (1.42s CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_constructorsNeedNoCodeAtItemOrExternalAddresses() (gas: 62190)\n[PASS] test_factoryKeepsEntireSupplyUntilLaunchAllocatesIt() (gas: 5679641)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 636.79ms (16.06ms CPU time)\n\nRan 18 tests for test/Gauges.t.sol:ItemEthGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341625, ~: 4345121)\nLogs:\n  Bound result 95\n  Bound result 9855981\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10571192, ~: 10597131)\nLogs:\n  Bound result 0\n  Bound result 639622133026120844750116611\n  Bound result 298061981205552150870390366\n  Bound result 54242936055842679431817444\n  Bound result 689940465333720706285393\n  Bound result 0\n  Bound result 5082640138886273167980356\n  Bound result 1775099671886699205501019\n  Bound result 4429105\n  Bound result 947915066138350898913846466\n  Bound result 321518438653623592173575922\n  Bound result 11463138\n  Bound result 6356250\n  Bound result 0\n  Bound result 12543606\n  Bound result 0\n  Bound result 273209818228364167413474757\n  Bound result 13353018\n  Bound result 30963930109027355594462350\n  Bound result 401200381780471509538641357\n  Bound result 13253225\n  Bound result 123049823319769151477123313\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 723532, ~: 727060)\nLogs:\n  Bound result 896488045855827\n  Bound result 924142677351361510538323488\n  Bound result 23728632\n\n[PASS] test_constants() (gas: 27206)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481926)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 979346)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322288)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 663.70ms (1.72s CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] testFuzz_mixedDepositsBurnsClaimsAndStakeChanges(uint256) (runs: 512, μ: 14181850, ~: 14170522)\nLogs:\n  Bound result 455120\n  Bound result 497710094738500777878874454\n  Bound result 1725256023343039638388716584\n  Bound result 239231430264561219160654729\n  Bound result 656276921910635314176144879\n  Bound result 71284271858036985163170394\n  Bound result 973839364388089477553535896\n  Bound result 7201298434917292192410309072\n  Bound result 950364673756954820466508926\n  Bound result 1006824250877982250497997071\n  Bound result 511544\n  Bound result 413122\n  Bound result 0\n  Bound result 112939\n  Bound result 53887\n  Bound result 374240137805530665736612179\n  Bound result 358548857553621804560852992\n  Bound result 0\n  Bound result 17009454813773577820799588\n  Bound result 5155343371490728819115579106\n  Bound result 8732040555720036022764465448\n  Bound result 3930022929136728753390626576\n  Bound result 328102553911309837678630677\n  Bound result 2653063221035099700560221945\n  Bound result 4062503081180523211401068306\n  Bound result 141958361418924056229856293\n  Bound result 416573961308456529318271499\n\n[PASS] testFuzz_proRataOddRewardsAndLastClaimer(uint256,uint256,uint256,uint256) (runs: 512, μ: 929079, ~: 962328)\nLogs:\n  Bound result 7000000\n  Bound result 123456\n  Bound result 300000\n  Bound result 300\n\n[PASS] testFuzz_singleUserFrequentClaimsKeepCarry(uint256,uint256,uint256) (runs: 512, μ: 5955159, ~: 5997668)\nLogs:\n  Bound result 400\n  Bound result 650\n  Bound result 12\n\n[PASS] test_allEntrypointsRejectReentryFromPrincipalAndRewards() (gas: 4833419)\n[PASS] test_allThreeGasBurnersAndHugeReturnsHaveBoundedPrincipalGas() (gas: 1278943)\n[PASS] test_burnShortfallIsFirstComeFirstServed() (gas: 1128141)\n[PASS] test_cannotUnstakeAnotherUserOrMoreThanOwnStake() (gas: 337395)\n[PASS] test_carrySurvivesClaimsFullExitsAndLaterStreams() (gas: 3987303)\n[PASS] test_constantsAndSeparateRawTokenUnits() (gas: 983232)\n[PASS] test_emptyPeriodsPauseAllStreamsAndNoRewardTransferOnExit() (gas: 1869668)\n[PASS] test_everyHostileReadModeCannotBlockPrincipalOrOtherRewards() (gas: 4325119)\n[PASS] test_failedPrincipalTransferRollsBackSyncedRewardsAndStake() (gas: 1260486)\n[PASS] test_failedRewardTransferRevertsWholeClaimWithoutBlockingPrincipal() (gas: 2998662)\n[PASS] test_freshAmountLimitInclusiveAndNoOverflowOnMaximumBalance() (gas: 1212363)\n[PASS] test_invalidReadRevertsWholeClaimThenRecovers() (gas: 1619185)\n[PASS] test_issuerBurnDuringLiveStreamDoesNotResetOrHaltAccrual() (gas: 959920)\n[PASS] test_lastClaimAndOddStakesConserveReceipts() (gas: 1339870)\n[PASS] test_lateAndFlashStakersCannotCapturePastRewards() (gas: 1145096)\n[PASS] test_noCodeRewardAddressCannotBlockStakeOrUnstake() (gas: 419774)\n[PASS] test_oneWeiRewardAndLargeStakeDoNotRoundAwayWholeStream() (gas: 668179)\n[PASS] test_paidAmountsAreNotRediscoveredAsNewFees() (gas: 825403)\n[PASS] test_partialIssuerBurnPaysAvailableRetainsDebtAndReplenishmentRepairsFirst() (gas: 1387565)\n[PASS] test_syncWhileIdleStartsStreamButDoesNotSpendStreamTime() (gas: 675211)\n[PASS] test_topUpsWaitAndNeverRestartOrBackdateLiveStream() (gas: 1071186)\n[PASS] test_unobservedFeesStartAtSyncNeverBackdated() (gas: 670162)\n[PASS] test_unsupportedTokensRevert() (gas: 69181)\n[PASS] test_zeroAndMaximumReportedBalancesDoNotCorruptLiveStream() (gas: 912861)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 663.75ms (1.84s CPU time)\n\nRan 7 test suites in 665.23ms (3.02s CPU time): 79 tests passed, 0 failed, 0 skipped (79 total tests)\n","passed":true},{"durationMs":63,"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\":130,\"REVIEW.md\":34,\"foundry.toml\":16,\"launch.json\":37,\"remappings.txt\":2,\"src/BaskUsdgGauge.sol\":15,\"src/DevVesting.sol\":54,\"src/ItemEthGauge.sol\":10,\"src/ItemStaking.sol\":140,\"src/LaunchToken.sol\":11,\"src/LpGauge.sol\":129,\"src/libraries/RewardIndex.sol\":36,\"src/libraries/TokenCalls.sol\":39,\"test/Deployment.t.sol\":95,\"test/DevVesting.t.sol\":148,\"test/Gauges.t.sol\":410,\"test/ItemStaking.t.sol\":594,\"test/LaunchToken.t.sol\":64,\"test/RewardIndex.t.sol\":43,\"test/mocks/MockFactory.sol\":11,\"test/mocks/MockToken.sol\":139},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1d4fb1ebeae22d645f4b5d0d21f0878600ef9b3c4dff0f261c786a8376524e68","verifiedTreeHash":"34a5860964e11b8a66d1bfb2d4483a9deb6da52f","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":2469,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.40s\nCompiler run successful!\n","passed":true},{"durationMs":733,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/RewardIndex.t.sol:RewardIndexTest\n[PASS] test_fractionalCarryCombinesBeforeRounding() (gas: 413217)\n[PASS] test_true512BitProductsRoundDownWithoutOverflow() (gas: 330524)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 383.53µs (181.52µs CPU time)\n\nRan 4 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_noMintOrAdminEntrypoint() (gas: 130760)\n[PASS] test_standardFixedSupplyAndMetadata() (gas: 52729)\n[PASS] test_transferAndApproval() (gas: 233100)\n[PASS] test_transferFailures() (gas: 89826)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.05ms (778.96µs CPU time)\n\nRan 8 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] testFuzz_vestingFormulaAndConservation(uint256,uint256) (runs: 512, μ: 291979, ~: 302252)\nLogs:\n  Bound result 7967\n  Bound result 3016\n\n[PASS] test_constructorAndFundingOnce() (gas: 248344)\n[PASS] test_days364365And1460AndAnyoneCanRelease() (gas: 500927)\n[PASS] test_failedReleaseIsAtomicAndCanBeRetried() (gas: 502844)\n[PASS] test_fundAndReleaseRejectReentry() (gas: 404674)\n[PASS] test_lateFundingUsesDeploymentClockAndIgnoresDonations() (gas: 259967)\n[PASS] test_unfundedReleaseRevertsAndFailedFundingRollsBack() (gas: 273312)\n[PASS] test_zeroBeneficiaryRejected() (gas: 5983)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 556.12ms (557.42ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_constructorsNeedNoCodeAtItemOrExternalAddresses() (gas: 62190)\n[PASS] test_factoryKeepsEntireSupplyUntilLaunchAllocatesIt() (gas: 5679641)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 647.35ms (15.97ms CPU time)\n\nRan 18 tests for test/Gauges.t.sol:BaskUsdgGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341505, ~: 4345121)\nLogs:\n  Bound result 2663969755011235790056\n  Bound result 5230861\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10576440, ~: 10596187)\nLogs:\n  Bound result 0\n  Bound result 525939995291417859734251624\n  Bound result 365576880217450914767149916\n  Bound result 4614482\n  Bound result 0\n  Bound result 441405620380999181180754965\n  Bound result 95459014400766030671224895\n  Bound result 24433079625079362971436839\n  Bound result 4844771\n  Bound result 513318536702323976411492\n  Bound result 228458836243995292431929455\n  Bound result 133299485959442092531945738\n  Bound result 5031257\n  Bound result 30901600289689320875626577\n  Bound result 1009689\n  Bound result 2559685338198463985545447\n  Bound result 591964969610943171113032551\n  Bound result 576935636223084633553371734\n  Bound result 345005887394900218065704269\n  Bound result 11103067\n  Bound result 13458739\n  Bound result 320792411082978262758989723\n  Bound result 712164341300251566810271906\n  Bound result 734014133888960812027718007\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 724084, ~: 727096)\nLogs:\n  Bound result 896488045855827\n  Bound result 924142677351361510538323488\n  Bound result 23728632\n\n[PASS] test_constants() (gas: 25088)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481916)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 959446)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322276)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 647.26ms (1.78s CPU time)\n\nRan 18 tests for test/Gauges.t.sol:ItemEthGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341625, ~: 4345121)\nLogs:\n  Bound result 15006\n  Bound result 9855962\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10571192, ~: 10597131)\nLogs:\n  Bound result 0\n  Bound result 639622133026120844750116611\n  Bound result 298061981205552150870390366\n  Bound result 54242936055842679431817444\n  Bound result 689940465333720706285393\n  Bound result 0\n  Bound result 5082640138886273167980356\n  Bound result 1775099671886699205501019\n  Bound result 4429105\n  Bound result 947915066138350898913846466\n  Bound result 321518438653623592173575922\n  Bound result 11463138\n  Bound result 6356250\n  Bound result 0\n  Bound result 12543606\n  Bound result 0\n  Bound result 273209818228364167413474757\n  Bound result 13353018\n  Bound result 30963930109027355594462350\n  Bound result 401200381780471509538641357\n  Bound result 13253225\n  Bound result 123049823319769151477123313\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 723532, ~: 727060)\nLogs:\n  Bound result 12000\n  Bound result 650\n  Bound result 7384\n\n[PASS] test_constants() (gas: 27206)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481926)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 979346)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322288)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 647.37ms (1.79s CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] testFuzz_mixedDepositsBurnsClaimsAndStakeChanges(uint256) (runs: 512, μ: 14181850, ~: 14170522)\nLogs:\n  Bound result 455120\n  Bound result 497710094738500777878874454\n  Bound result 1725256023343039638388716584\n  Bound result 239231430264561219160654729\n  Bound result 656276921910635314176144879\n  Bound result 71284271858036985163170394\n  Bound result 973839364388089477553535896\n  Bound result 7201298434917292192410309072\n  Bound result 950364673756954820466508926\n  Bound result 1006824250877982250497997071\n  Bound result 511544\n  Bound result 413122\n  Bound result 0\n  Bound result 112939\n  Bound result 53887\n  Bound result 374240137805530665736612179\n  Bound result 358548857553621804560852992\n  Bound result 0\n  Bound result 17009454813773577820799588\n  Bound result 5155343371490728819115579106\n  Bound result 8732040555720036022764465448\n  Bound result 3930022929136728753390626576\n  Bound result 328102553911309837678630677\n  Bound result 2653063221035099700560221945\n  Bound result 4062503081180523211401068306\n  Bound result 141958361418924056229856293\n  Bound result 416573961308456529318271499\n\n[PASS] testFuzz_proRataOddRewardsAndLastClaimer(uint256,uint256,uint256,uint256) (runs: 512, μ: 929079, ~: 962328)\nLogs:\n  Bound result 7000000\n  Bound result 123456\n  Bound result 300000\n  Bound result 300\n\n[PASS] testFuzz_singleUserFrequentClaimsKeepCarry(uint256,uint256,uint256) (runs: 512, μ: 5955159, ~: 5997668)\nLogs:\n  Bound result 896488045855827\n  Bound result 95924142677351361510538323488\n  Bound result 26232\n\n[PASS] test_allEntrypointsRejectReentryFromPrincipalAndRewards() (gas: 4833419)\n[PASS] test_allThreeGasBurnersAndHugeReturnsHaveBoundedPrincipalGas() (gas: 1278943)\n[PASS] test_burnShortfallIsFirstComeFirstServed() (gas: 1128141)\n[PASS] test_cannotUnstakeAnotherUserOrMoreThanOwnStake() (gas: 337395)\n[PASS] test_carrySurvivesClaimsFullExitsAndLaterStreams() (gas: 3987303)\n[PASS] test_constantsAndSeparateRawTokenUnits() (gas: 983232)\n[PASS] test_emptyPeriodsPauseAllStreamsAndNoRewardTransferOnExit() (gas: 1869668)\n[PASS] test_everyHostileReadModeCannotBlockPrincipalOrOtherRewards() (gas: 4325119)\n[PASS] test_failedPrincipalTransferRollsBackSyncedRewardsAndStake() (gas: 1260486)\n[PASS] test_failedRewardTransferRevertsWholeClaimWithoutBlockingPrincipal() (gas: 2998662)\n[PASS] test_freshAmountLimitInclusiveAndNoOverflowOnMaximumBalance() (gas: 1212363)\n[PASS] test_invalidReadRevertsWholeClaimThenRecovers() (gas: 1619185)\n[PASS] test_issuerBurnDuringLiveStreamDoesNotResetOrHaltAccrual() (gas: 959920)\n[PASS] test_lastClaimAndOddStakesConserveReceipts() (gas: 1339870)\n[PASS] test_lateAndFlashStakersCannotCapturePastRewards() (gas: 1145096)\n[PASS] test_noCodeRewardAddressCannotBlockStakeOrUnstake() (gas: 419774)\n[PASS] test_oneWeiRewardAndLargeStakeDoNotRoundAwayWholeStream() (gas: 668179)\n[PASS] test_paidAmountsAreNotRediscoveredAsNewFees() (gas: 825403)\n[PASS] test_partialIssuerBurnPaysAvailableRetainsDebtAndReplenishmentRepairsFirst() (gas: 1387565)\n[PASS] test_syncWhileIdleStartsStreamButDoesNotSpendStreamTime() (gas: 675211)\n[PASS] test_topUpsWaitAndNeverRestartOrBackdateLiveStream() (gas: 1071186)\n[PASS] test_unobservedFeesStartAtSyncNeverBackdated() (gas: 670162)\n[PASS] test_unsupportedTokensRevert() (gas: 69181)\n[PASS] test_zeroAndMaximumReportedBalancesDoNotCorruptLiveStream() (gas: 912861)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 647.76ms (1.61s CPU time)\n\nRan 7 test suites in 648.67ms (3.15s CPU time): 79 tests passed, 0 failed, 0 skipped (79 total tests)\n","passed":true},{"durationMs":48,"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\":130,\"REVIEW.md\":34,\"foundry.toml\":16,\"remappings.txt\":2,\"src/BaskUsdgGauge.sol\":15,\"src/DevVesting.sol\":54,\"src/ItemEthGauge.sol\":10,\"src/ItemStaking.sol\":140,\"src/LaunchToken.sol\":11,\"src/LpGauge.sol\":129,\"src/libraries/RewardIndex.sol\":36,\"src/libraries/TokenCalls.sol\":39,\"test/Deployment.t.sol\":95,\"test/DevVesting.t.sol\":148,\"test/Gauges.t.sol\":410,\"test/ItemStaking.t.sol\":594,\"test/LaunchToken.t.sol\":64,\"test/RewardIndex.t.sol\":43,\"test/mocks/MockFactory.sol\":11,\"test/mocks/MockToken.sol\":139},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":909,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/ItemStaking.sol:105: ItemStaking._sync(address) (src/ItemStaking.sol#105-126) uses a dangerous strict equality:\n[medium/medium] unused-return at src/ItemStaking.sol:84: ItemStaking.earned(address,address) (src/ItemStaking.sol#84-92) ignores return value by (amount,None) = accounts[user][token].pending(staked[user],currentIndex) (src/ItemStaking.sol#91)\n[medium/medium] unused-return at src/LpGauge.sol:108: LpGauge.earned(address) (src/LpGauge.sol#108-114) ignores return value by (amount,None) = accounts[user].pending(staked[user],currentIndex) (src/LpGauge.sol#113)\n[low/medium] missing-zero-check at src/ItemStaking.sol:44: ItemStaking.constructor(address).item_ (src/ItemStaking.sol#44) lacks a zero-check on :\n[low/medium] missing-zero-check at src/DevVesting.sol:27: DevVesting.constructor(address,address).item_ (src/DevVesting.sol#27) lacks a zero-check on :\n[low/medium] timestamp at src/DevVesting.sol:47: DevVesting.release() (src/DevVesting.sol#47-53) uses timestamp for comparisons\n[low/medium] timestamp at src/ItemStaking.sol:105: ItemStaking._sync(address) (src/ItemStaking.sol#105-126) uses timestamp for comparisons\n[low/medium] timestamp at src/DevVesting.sol:41: DevVesting.vested() (src/DevVesting.sol#41-45) uses timestamp for comparisons","passed":true},{"durationMs":302,"exitCode":0,"name":"aderyn","output":"[high] incorrect-shift-order at src/libraries/TokenCalls.sol:11: Incorrect Assembly Shift Parameter Order\n[high] reentrancy-state-change at src/LpGauge.sol:54: Reentrancy: State change after external call\n[low] internal-function-used-once at src/libraries/RewardIndex.sol:21: Internal Function Used Only Once\n[low] unchecked-return at src/ItemStaking.sol:67: Unchecked Return (2 places)\n[low] unsafe-erc20-operation at src/DevVesting.sol:51: Unsafe ERC20 Operation (5 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"936de39d3d408c27a68956dccb44c8a0d874232362c77e1455cb2de7304fbdf9","verifiedTreeHash":"5fb129483bfd8a793b8a61a578e08aa0889cb49d","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":4012,"exitCode":0,"name":"build","output":"Compiling 48 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.93s\nCompiler run successful!\n","passed":true},{"durationMs":3373,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/RewardIndex.t.sol:RewardIndexTest\n[PASS] test_fractionalCarryCombinesBeforeRounding() (gas: 413217)\n[PASS] test_true512BitProductsRoundDownWithoutOverflow() (gas: 330524)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 378.57µs (236.66µs CPU time)\n\nRan 4 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] test_noMintOrAdminEntrypoint() (gas: 130760)\n[PASS] test_standardFixedSupplyAndMetadata() (gas: 52729)\n[PASS] test_transferAndApproval() (gas: 233100)\n[PASS] test_transferFailures() (gas: 89826)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 968.58µs (836.20µs CPU time)\n\nRan 8 tests for test/DevVesting.t.sol:DevVestingTest\n[PASS] testFuzz_vestingFormulaAndConservation(uint256,uint256) (runs: 512, μ: 291785, ~: 302252)\nLogs:\n  Bound result 224337844\n  Bound result 128831609\n\n[PASS] test_constructorAndFundingOnce() (gas: 248344)\n[PASS] test_days364365And1460AndAnyoneCanRelease() (gas: 500927)\n[PASS] test_failedReleaseIsAtomicAndCanBeRetried() (gas: 502844)\n[PASS] test_fundAndReleaseRejectReentry() (gas: 404674)\n[PASS] test_lateFundingUsesDeploymentClockAndIgnoresDonations() (gas: 259967)\n[PASS] test_unfundedReleaseRevertsAndFailedFundingRollsBack() (gas: 273312)\n[PASS] test_zeroBeneficiaryRejected() (gas: 5983)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 99.02ms (100.74ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_constructorsNeedNoCodeAtItemOrExternalAddresses() (gas: 62190)\n[PASS] test_factoryKeepsEntireSupplyUntilLaunchAllocatesIt() (gas: 5679641)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 106.58ms (25.12ms CPU time)\n\nRan 3 tests for test/Events.t.sol:EventsTest\n[PASS] test_gaugeEvents() (gas: 2055162)\n[PASS] test_stakingEvents() (gas: 3963702)\n[PASS] test_vestingEvents() (gas: 347836)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 157.46ms (1.49ms CPU time)\n\nRan 6 tests for test/ItemStakingReadEdges.t.sol:ItemStakingReadEdgesTest\n[PASS] test_freshAmountStartsExactlyWhenLiveStreamFinishes() (gas: 664501)\n[PASS] test_readNeedingMoreThan50kGasIsInvalidEvenWithAmpleGas() (gas: 1065703)\n[PASS] test_readReturning33BytesIsInvalid() (gas: 832399)\n[PASS] test_readReturningMoreThan32BytesIsInvalid() (gas: 1136178)\n[PASS] test_readUnder50kGasIsValid() (gas: 724005)\n[PASS] test_rewardOfOneWeiAgainstOddStakersFloorsAndKeepsCarry() (gas: 1195808)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 451.09ms (7.32ms CPU time)\n\nRan 1 test for test/invariant/DevVestingInvariant.t.sol:DevVestingInvariantTest\n[PASS] invariant_scheduleAndCustody() (runs: 128, calls: 5120, reverts: 0)\n\n╭-------------------+----------+-------+---------+----------╮\n| Contract          | Selector | Calls | Reverts | Discards |\n+===========================================================+\n| DevVestingHandler | donate   | 1242  | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| DevVestingHandler | fund     | 1288  | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| DevVestingHandler | release  | 1241  | 0       | 0        |\n|-------------------+----------+-------+---------+----------|\n| DevVestingHandler | warp     | 1349  | 0       | 0        |\n╰-------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4663\n  Bound result 1717\n  Bound result 1410\n  Bound result 2530\n  Bound result 17000000\n  Bound result 8141701\n  Bound result 3280007\n  Bound result 149\n  Bound result 999999999999999999999791\n  Bound result 31536000\n  Bound result 3867\n  Bound result 33\n  Bound result 5957872\n  Bound result 16711681\n  Bound result 242\n  Bound result 855\n  Bound result 333\n  Bound result 86788602027792\n  Bound result 4709\n  Bound result 138263211465851256781404819500466446622855157609\n  Bound result 124\n  Bound result 4030\n  Bound result 11242338\n  Bound result 6642416\n  Bound result 2655373353\n  Bound result 3\n  Bound result 600000\n  Bound result 5528\n  Bound result 1657\n  Bound result 642360398013362788557786\n  Bound result 3596054\n  Bound result 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 452.17ms (451.06ms CPU time)\n\nRan 18 tests for test/Gauges.t.sol:ItemEthGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341315, ~: 4344911)\nLogs:\n  Bound result 13189\n  Bound result 3952000\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10586219, ~: 10611545)\nLogs:\n  Bound result 0\n  Bound result 735159235156549889374591447\n  Bound result 77621271543076939146377907\n  Bound result 0\n  Bound result 1069634\n  Bound result 0\n  Bound result 966463156436160405989148962\n  Bound result 6889541\n  Bound result 3813552\n  Bound result 895210722459135121297340920\n  Bound result 9507682494381568089383136\n  Bound result 297085749083319792714713760\n  Bound result 1228209\n  Bound result 15040624\n  Bound result 44866598961694021214818330\n  Bound result 5512897116025680527051810\n  Bound result 991119611195668927998473903\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 723680, ~: 727072)\nLogs:\n  Bound result 17000000\n  Bound result 30000\n  Bound result 7000000\n\n[PASS] test_constants() (gas: 27206)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481926)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 979346)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322288)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 831.37ms (2.04s CPU time)\n\nRan 27 tests for test/ItemStaking.t.sol:ItemStakingTest\n[PASS] testFuzz_mixedDepositsBurnsClaimsAndStakeChanges(uint256) (runs: 512, μ: 14168410, ~: 14164852)\nLogs:\n  Bound result 377198777192201894995112480\n  Bound result 0\n  Bound result 2318797713511494322828554415\n  Bound result 252153407337562100471728735\n  Bound result 211610117627682628694456585\n  Bound result 26242\n  Bound result 0\n  Bound result 5146748730368771357085391686\n  Bound result 382730\n  Bound result 6078210720912822606546863910\n  Bound result 6137739238049595779900278494\n  Bound result 0\n  Bound result 295103858563042032779700759\n  Bound result 3575470819649809433682173063\n  Bound result 274166\n  Bound result 3040670873445733207021355884\n  Bound result 9387642057138348723968332\n  Bound result 2935200096846406259374613016\n  Bound result 34248351041067190683455195\n  Bound result 442568\n  Bound result 2541069300923485451297959904\n  Bound result 0\n  Bound result 458480734258815292664903469\n  Bound result 1853442868924519421937495004\n  Bound result 165757532896721159446588949\n  Bound result 9503648790401299345952964196\n  Bound result 56961413382645094696749153\n  Bound result 9039900276687292881740530687\n  Bound result 239836650290093842242946319\n  Bound result 206949163315007111765043386\n  Bound result 675261277305893407116457338\n\n[PASS] testFuzz_proRataOddRewardsAndLastClaimer(uint256,uint256,uint256,uint256) (runs: 512, μ: 932530, ~: 962345)\nLogs:\n  Bound result 518400\n  Bound result 100\n  Bound result 999999999999999999999999981\n  Bound result 300\n\n[PASS] testFuzz_singleUserFrequentClaimsKeepCarry(uint256,uint256,uint256) (runs: 512, μ: 5963081, ~: 5997674)\nLogs:\n  Bound result 896488045855827\n  Bound result 95924142677351361510538323488\n  Bound result 26232\n\n[PASS] test_allEntrypointsRejectReentryFromPrincipalAndRewards() (gas: 4833419)\n[PASS] test_allThreeGasBurnersAndHugeReturnsHaveBoundedPrincipalGas() (gas: 1278943)\n[PASS] test_burnShortfallIsFirstComeFirstServed() (gas: 1128141)\n[PASS] test_cannotUnstakeAnotherUserOrMoreThanOwnStake() (gas: 337395)\n[PASS] test_carrySurvivesClaimsFullExitsAndLaterStreams() (gas: 3987303)\n[PASS] test_constantsAndSeparateRawTokenUnits() (gas: 983232)\n[PASS] test_emptyPeriodsPauseAllStreamsAndNoRewardTransferOnExit() (gas: 1869668)\n[PASS] test_everyHostileReadModeCannotBlockPrincipalOrOtherRewards() (gas: 4325119)\n[PASS] test_failedPrincipalTransferRollsBackSyncedRewardsAndStake() (gas: 1260486)\n[PASS] test_failedRewardTransferRevertsWholeClaimWithoutBlockingPrincipal() (gas: 2998662)\n[PASS] test_freshAmountLimitInclusiveAndNoOverflowOnMaximumBalance() (gas: 1212363)\n[PASS] test_invalidReadRevertsWholeClaimThenRecovers() (gas: 1619185)\n[PASS] test_issuerBurnDuringLiveStreamDoesNotResetOrHaltAccrual() (gas: 959920)\n[PASS] test_lastClaimAndOddStakesConserveReceipts() (gas: 1339870)\n[PASS] test_lateAndFlashStakersCannotCapturePastRewards() (gas: 1145096)\n[PASS] test_noCodeRewardAddressCannotBlockStakeOrUnstake() (gas: 419774)\n[PASS] test_oneWeiRewardAndLargeStakeDoNotRoundAwayWholeStream() (gas: 668179)\n[PASS] test_paidAmountsAreNotRediscoveredAsNewFees() (gas: 825403)\n[PASS] test_partialIssuerBurnPaysAvailableRetainsDebtAndReplenishmentRepairsFirst() (gas: 1387565)\n[PASS] test_syncWhileIdleStartsStreamButDoesNotSpendStreamTime() (gas: 675211)\n[PASS] test_topUpsWaitAndNeverRestartOrBackdateLiveStream() (gas: 1071186)\n[PASS] test_unobservedFeesStartAtSyncNeverBackdated() (gas: 670162)\n[PASS] test_unsupportedTokensRevert() (gas: 69181)\n[PASS] test_zeroAndMaximumReportedBalancesDoNotCorruptLiveStream() (gas: 912861)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 831.91ms (1.72s CPU time)\n\nRan 18 tests for test/Gauges.t.sol:BaskUsdgGaugeTest\n[PASS] testFuzz_checkpointsCarryAcrossClaimsAndExits(uint256,uint256) (runs: 512, μ: 4341269, ~: 4344911)\nLogs:\n  Bound result 2663969755011235790056\n  Bound result 5230861\n\n[PASS] testFuzz_mixedStakeClaimAndIdleSequenceConservesFunds(uint256) (runs: 512, μ: 10591466, ~: 10610805)\nLogs:\n  Bound result 4277687\n  Bound result 858615002767781065389583665\n  Bound result 95643938921072599344110058\n  Bound result 4980550\n  Bound result 0\n  Bound result 300174\n  Bound result 14830122\n  Bound result 957346883864923697619428303\n  Bound result 102012194796304547940687456\n  Bound result 5337418\n  Bound result 89206793367593645392125126\n  Bound result 247143259335253309112746183\n  Bound result 431736940290527898860302954\n  Bound result 2280484\n  Bound result 881118076056134529306613586\n  Bound result 50032259332528191205176028\n  Bound result 35291232698929606751154904\n  Bound result 701216185526688339258338418\n  Bound result 137616242762147558903868849\n  Bound result 554751369159667578080474243\n  Bound result 107381419155836591183001376\n  Bound result 14592905\n  Bound result 11972722\n  Bound result 13627230\n  Bound result 231401132319747434769003579\n  Bound result 475785773113980138165449970\n  Bound result 277982411671526804938267311\n  Bound result 20977338826723684438884474\n  Bound result 389120105770953204586889760\n\n[PASS] testFuzz_proRataPayoutAndLastClaim(uint256,uint256,uint256) (runs: 512, μ: 724318, ~: 727108)\nLogs:\n  Bound result 896488045855827\n  Bound result 924142677351361510538323488\n  Bound result 23728632\n\n[PASS] test_constants() (gas: 25088)\n[PASS] test_eachHostileItemReadCannotBlockLpActions() (gas: 2074154)\n[PASS] test_failedLpTransferRollsBackStakeChange() (gas: 600714)\n[PASS] test_failedRewardTransfersRollbackClaimAndNeverBlockExit() (gas: 1407880)\n[PASS] test_lateStakerAndSameBlockFlashStakeCannotClaimHistory() (gas: 798308)\n[PASS] test_loneLargeStakerClaimsFrequentlyWithoutLosingUserCarry() (gas: 4285985)\n[PASS] test_loneOneWeiStakerGetsWholeAllocationDonationsIgnored() (gas: 774180)\n[PASS] test_missingPairAndUnfundedStartRevertAtomically() (gas: 481916)\n[PASS] test_oddStakesLastClaimerPaidInFullAndDustIsBounded() (gas: 1061708)\n[PASS] test_onlyCallerStakeCanBeWithdrawn() (gas: 327445)\n[PASS] test_stakeBeforeStartReverts() (gas: 36832)\n[PASS] test_stakedClockPausesAndWithdrawNeverPaysRewards() (gas: 959446)\n[PASS] test_startAndAllUserFunctionsRejectReentry() (gas: 1765525)\n[PASS] test_startPullsAllocationOnceAndStoresCanonicalPair() (gas: 322276)\n[PASS] test_viewsBeforeStartAndWhileIdle() (gas: 397946)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 832.00ms (1.78s CPU time)\n\nRan 1 test for test/invariant/GaugeInvariant.t.sol:BaskUsdgGaugeInvariantTest\n[PASS]\nBaskUsdgGaugeInvariantTest invariants:\n[PASS] invariant_itemConservedAndPaidNeverExceedsReleased\n[PASS] invariant_lpCustodyMatchesStakes\n[PASS] invariant_scheduleFollowsStakedTime\n[PASS] invariant_withdrawNeverBlocked\n BaskUsdgGaugeInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭--------------+---------------------+-------+---------+----------╮\n| Contract     | Selector            | Calls | Reverts | Discards |\n+=================================================================+\n| GaugeHandler | claim               | 1660  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | donate              | 1677  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | setItemTransferMode | 1720  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | stake               | 1744  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | warp                | 1756  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | withdraw            | 1683  | 0       | 0        |\n╰--------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 999999999999999999000002\n  Bound result 2849413286051983810988557013\n  Bound result 1168\n  Bound result 12000000000000000000\n  Bound result 3\n  Bound result 906253355254900722188731\n  Bound result 0\n  Bound result 7400226\n  Bound result 999999999999999999000002\n  Bound result 11\n  Bound result 1\n  Bound result 0\n  Bound result 2464\n  Bound result 5355254900716581966\n  Bound result 2828\n  Bound result 407445584755598892224157\n  Bound result 0\n  Bound result 229\n  Bound result 8389\n  Bound result 0\n  Bound result 1000000\n  Bound result 101\n  Bound result 5273\n  Bound result 4735359079153698288\n  Bound result 3573\n  Bound result 2\n  Bound result 711076050838960916153652\n  Bound result 0\n  Bound result 352442509498231027\n  Bound result 600000\n  Bound result 515540809486\n  Bound result 9\n  Bound result 242\n  Bound result 2718090\n  Bound result 330\n  Bound result 2\n  Bound result 60\n  Bound result 2592000\n  Bound result 126144000\n  Bound result 2449012\n  Bound result 0\n  Bound result 7531699\n  Bound result 1550\n  Bound result 1000\n  Bound result 8333995\n  Bound result 667046473047077560\n  Bound result 8971\n  Bound result 9313000\n  Bound result 8388\n  Bound result 998\n  Bound result 9204\n  Bound result 125851850757528677285395\n  Bound result 494024775343291970026806747\n  Bound result 3811742\n  Bound result 298\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.57s (2.57s CPU time)\n\nRan 1 test for test/invariant/GaugeInvariant.t.sol:ItemEthGaugeInvariantTest\n[PASS]\nItemEthGaugeInvariantTest invariants:\n[PASS] invariant_itemConservedAndPaidNeverExceedsReleased\n[PASS] invariant_lpCustodyMatchesStakes\n[PASS] invariant_scheduleFollowsStakedTime\n[PASS] invariant_withdrawNeverBlocked\n ItemEthGaugeInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭--------------+---------------------+-------+---------+----------╮\n| Contract     | Selector            | Calls | Reverts | Discards |\n+=================================================================+\n| GaugeHandler | claim               | 1660  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | donate              | 1677  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | setItemTransferMode | 1720  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | stake               | 1744  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | warp                | 1756  | 0       | 0        |\n|--------------+---------------------+-------+---------+----------|\n| GaugeHandler | withdraw            | 1683  | 0       | 0        |\n╰--------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 999999999999999999000002\n  Bound result 2849413286051983810988557013\n  Bound result 1726\n  Bound result 12000000000000000000\n  Bound result 3\n  Bound result 906253355254900722188731\n  Bound result 2388\n  Bound result 7400226\n  Bound result 999999999999999999000002\n  Bound result 11\n  Bound result 3062\n  Bound result 0\n  Bound result 7191332\n  Bound result 0\n  Bound result 2856\n  Bound result 407445584755598892224157\n  Bound result 509\n  Bound result 1719639409\n  Bound result 14372\n  Bound result 0\n  Bound result 1000000\n  Bound result 101\n  Bound result 5637\n  Bound result 1750000000000032812\n  Bound result 1016\n  Bound result 3183\n  Bound result 711076050838960916153652\n  Bound result 0\n  Bound result 352442509498231027\n  Bound result 600000\n  Bound result 515540809486\n  Bound result 9\n  Bound result 0\n  Bound result 2718090\n  Bound result 3058\n  Bound result 2\n  Bound result 60\n  Bound result 2592000\n  Bound result 126144000\n  Bound result 2449012\n  Bound result 0\n  Bound result 7531699\n  Bound result 7077\n  Bound result 1000\n  Bound result 8333995\n  Bound result 2879278190232887960\n  Bound result 9561\n  Bound result 5800\n  Bound result 8714\n  Bound result 1429\n  Bound result 119\n  Bound result 1799054498\n  Bound result 5432438493867791348\n  Bound result 3811742\n  Bound result 388\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.61s (2.61s CPU time)\n\nRan 1 test for test/invariant/ItemStakingInvariant.t.sol:ItemStakingInvariantTest\n[PASS]\nItemStakingInvariantTest invariants:\n[PASS] invariant_hostileRewardsNeverBlockPrincipalOrHealthyClaims\n[PASS] invariant_principalCustodyMatchesStakes\n[PASS] invariant_rewardsConservedAndNeverAboveReceipts\n ItemStakingInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭--------------------+-----------------+-------+---------+----------╮\n| Contract           | Selector        | Calls | Reverts | Discards |\n+===================================================================+\n| ItemStakingHandler | claim           | 1160  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | deposit         | 1102  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | issuerBurn      | 1170  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | setReadMode     | 1185  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | setTransferMode | 1099  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | stake           | 1165  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | sync            | 1103  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | unstake         | 1136  | 0       | 0        |\n|--------------------+-----------------+-------+---------+----------|\n| ItemStakingHandler | warp            | 1120  | 0       | 0        |\n╰--------------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 8066\n  Bound result 0\n  Bound result 1779\n  Bound result 599290589\n  Bound result 1255\n  Bound result 126144000\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 242\n  Bound result 7455\n  Bound result 0\n  Bound result 0\n  Bound result 6426\n  Bound result 99924380\n  Bound result 33\n  Bound result 255\n  Bound result 1\n  Bound result 3074\n  Bound result 582\n  Bound result 254\n  Bound result 109527611\n  Bound result 37\n  Bound result 259200000\n  Bound result 188\n  Bound result 0\n  Bound result 877136745427606760030429842\n  Bound result 0\n  Bound result 0\n  Bound result 5812\n  Bound result 20878598\n  Bound result 291306\n  Bound result 33\n  Bound result 670379\n  Bound result 0\n  Bound result 5\n  Bound result 0\n  Bound result 1011\n  Bound result 1890\n  Bound result 700\n  Bound result 2000000000000000000998746768\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.27s (3.27s CPU time)\n\nRan 13 test suites in 3.28s (12.22s CPU time): 92 tests passed, 0 failed, 0 skipped (92 total tests)\n","passed":true},{"durationMs":58,"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\":130,\"REVIEW.md\":34,\"foundry.toml\":16,\"remappings.txt\":2,\"src/BaskUsdgGauge.sol\":15,\"src/DevVesting.sol\":54,\"src/ItemEthGauge.sol\":10,\"src/ItemStaking.sol\":140,\"src/LaunchToken.sol\":11,\"src/LpGauge.sol\":129,\"src/libraries/RewardIndex.sol\":36,\"src/libraries/TokenCalls.sol\":39,\"test/Deployment.t.sol\":95,\"test/DevVesting.t.sol\":148,\"test/Events.t.sol\":113,\"test/Gauges.t.sol\":410,\"test/ItemStaking.t.sol\":594,\"test/ItemStakingReadEdges.t.sol\":135,\"test/LaunchToken.t.sol\":64,\"test/RewardIndex.t.sol\":43,\"test/invariant/DevVestingInvariant.t.sol\":87,\"test/invariant/GaugeInvariant.t.sol\":199,\"test/invariant/ItemStakingInvariant.t.sol\":176,\"test/mocks/MockFactory.sol\":11,\"test/mocks/MockToken.sol\":139,\"test/mocks/OddReadToken.sol\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ccdeaf9a7dc7f405463b56651e1be8229fd2b86d2bc8b80a8b9747c1ea2252ac","verifiedTreeHash":"88f49eca50d89009c58772aa78268bec27846ff8","verifierVersion":"0.1.0+a6ee6548"}]}