{"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":"9b55be30-3224-4781-b1c7-159127fc178c","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"24cac19531ec0f79dd7a06b9a18fa62ed3ce34b822b8f0becbf8fc86989e0550","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"X: https://x.com/imdplace\nGoblin Gold v3.3: fix every high, medium and low finding of audit 930ea061 (commit 8b769ee), plus info 7 and 8, and add getHookPermissions. Keep the design. Add each auditor proof as a test that now passes.\n\n1. HIGH concentrated liquidity (TwapOracle.sol:236): give GoldHook BEFORE_ADD_LIQUIDITY and revert in beforeAddLiquidity unless tickLower == -887220 && tickUpper == 887220 (full range only). REQUIRED_FLAGS 0x30CC -> 0x38CC; update launch.json hook permissions. ConcentratedDepth tests: the narrow add is refused.\n2. HIGH POL floor (POLManager.sol:122): add TwapOracle.polTokensForEth returning Math.max(short, long) for GOLD (v3.1 behaviour) and use it in POLManager._minOut. GenesisVault keeps Math.min. PolFloorInverted test reverts Slippage.\n3. MEDIUM regular v3 tokens (TwapOracle.sol:261): bound liquidity by min(pool.liquidity(), harmonic-mean active liquidity over 30 min from observe's secondsPerLiquidityCumulativeX128), and bound the ETH side by what that liquidity actually releases within a fixed band around the price (e.g. 10%), scaled to its full-range equivalent, never by the raw WETH balance. Tests: a JIT position in one tx does not move payoutCap; out-of-range WETH does not pass MIN_LIQUIDITY.\n4. MEDIUM spot price (TwapOracle.sol:228): value genesis depth and cap at max(sqrtPrice, sqrtPriceAtTick(longTick)) so the ETH figure can only go down, and also bound L by liquidityAt(4h). seal() refuses the genesis token: GOLD only goes through the Genesis lane. Tests from the audit reproduction (4h pump cap, same-tx gate) pass.\n5. MEDIUM bind lock-out (GoldHook.sol:289): add view bindCheck(address gacha) returns (bytes4 reason), zero when every bindGacha precondition except the review timer passes. Info 7: bindGacha (and bindCheck) also require TwapOracle(gacha.oracle()).goldHook() == address(this), genesisToken() == token, and POLManager(gacha.polManager()).oracle()/hook()/token() to match. Runbook: launch 2 is built only with the launch profile (via_ir = false, bytecode_hash = none); before setLaunchTargets, require bindCheck == 0 and on-chain extcodehash(BagGacha) == GACHA_RUNTIME_CODE_HASH. Document post-bind retarget by the NFT owner as a trust assumption.\n6. LOW cancel race (BagGacha.sol:668): rawFulfillRandomWords ignores a fulfilment once block.timestamp >= requestedAt + CANCEL_DELAY.\n7. Info 8: use path A. The launch remainder goes to the paying wallet; the runbook has that wallet transfer exactly genesisSupply to GenesisVault and verify balanceOf(vault) == genesisSupply before setLaunchTargets.\n8. IMD v4 hook template: add getHookPermissions() public pure to GoldHook returning v4-core Hooks.Permissions (same field order and ABI) matching REQUIRED_FLAGS exactly; test it against the flags.\n9. Re-pin GACHA_RUNTIME_CODE_HASH under the launch profile (FOUNDRY_VIA_IR=false FOUNDRY_BYTECODE_HASH=none). All tests and v4 fork tests pass under that profile;","parentJobId":"4c445e45-c275-4d31-8cb5-086eadb9957a","planHash":"8a6b50c370237113497bc2cd86029c36f66c3c63c2e9bbda4703e9355f513fe3","previousHash":"0992c7f25c31f95f9dfe635e56444a8405d1ca290a6cadd4f7b6c169b5863112","projectId":"9bf411ca-2719-4cab-b2a3-badcf83ed8d4","publication":{"commit":"170070d52968fc43f73cf54c7a535917a31b78da","deliveredAt":"2026-10-14T07:58:07.814Z","repoUrl":"https://github.com/identity-md-launches/launch-1545-goblin-gold"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"2cfdaa67877034afd918b7886498c77702bbea7412773653df10968506083798","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"b88f6cbdbf359dbc51e4e28312c599c5f9245c96fbfada758b4ac0327ba6c1d1","device":"0cd01c5082189cbf","findings":[],"hash":"24cac19531ec0f79dd7a06b9a18fa62ed3ce34b822b8f0becbf8fc86989e0550","nodeId":"e734e80d-c2af-451e-ac97-0d283d4e4be3","outcome":"completed","summary":"Implemented the v3.3 fixes, `getHookPermissions`, auditor regression tests, and launch preflight.\n\nVerified:\n- Both build profiles: 198 tests passed.\n- Mainnet fork: 3 tests passed.\n- `forge fmt --check`: passed.\n\nNo `launch.json` existed; added the permissions fragment and manifest instructions. Protected files remain unchanged. Nothing was deployed.","treeHash":"332e83ad8b67151056a4aaf4d55a7744473761e7","usage":{"cachedInputTokens":7338880,"inputTokens":212974,"model":"gpt-6-astra","outputTokens":50019,"runtime":"codex","turns":11,"wallClockMs":1617990}}],"verification":[{"checks":[{"durationMs":311404,"exitCode":0,"name":"build","output":"Compiling 155 files with Solc 0.8.26\nSolc 0.8.26 finished in 311.22s\nCompiler run successful!\n","passed":true},{"durationMs":16567,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/TickMath.t.sol:TickMathTest\n[PASS] testKnownValues() (gas: 4315)\n[PASS] testOutOfRangeReverts() (gas: 3855)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 419.89µs (137.87µs CPU time)\n\nRan 1 test for test/fork/MainnetFork.t.sol:MainnetForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.87ms (0.00ns CPU time)\n\nRan 1 test for test/fork/MainnetV4Fork.t.sol:MainnetV4ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 430.16µs (0.00ns CPU time)\n\nRan 2 tests for test/BagGachaV2.t.sol:EarlyGachaTest\n[PASS] testDayOneRevenueBeforeSelloutAndMintRemainsRefundable() (gas: 1245333)\n[PASS] testPreReleaseRefundCannotRecycleFreeSpinCoupons() (gas: 332820)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.73ms (862.18µs CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 1179900)\n[PASS] test_acceptsTheProtocolSignature() (gas: 75772)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3894)\n[PASS] test_digestMatchesTheProtocol() (gas: 13545)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.78ms (1.56ms CPU time)\n\nRan 1 test for test/audit930ea061/PolFloorInverted.t.sol:PolFloorInvertedTest\n[PASS] testThirtyMinutePumpLowersThePolFloorAndTheBurnBuysAtThePumpedPrice() (gas: 1508732)\nLogs:\n  floor used by POLManager (GOLD per 0.1 ETH): 88645491483832526\n  floor at the 4-hour TWAP               : 88645491483832526\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.07ms (2.94ms CPU time)\n\nRan 2 tests for test/audit930ea061/ConcentratedDepth.t.sol:ConcentratedDepthTest\n[PASS] testNarrowPositionInflatesGenesisDepthAndPayoutCap() (gas: 1293172)\n[PASS] testNarrowPositionMakesAPoolBelowMinimumDepthPriceable() (gas: 1286175)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.27ms (3.87ms CPU time)\n\nRan 1 test for test/audit930ea061/GenesisAndBinding.t.sol:SameTransactionGenesisGateTest\n[PASS] testTwoBuysCannotOpenThinGenesisGateInTheSameTransaction() (gas: 1404192)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.00ms (3.01ms CPU time)\n\nRan 2 tests for test/audit930ea061/GenesisAndBinding.t.sol:GenesisSpotDepthTest\n[PASS] testAddLiquidityCallbackChecksCallerPoolAndFullRange() (gas: 84790)\n[PASS] testFourHourPumpCapAndRegularGenesisExclusion() (gas: 2472402)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.27ms (4.37ms CPU time)\n\nRan 7 tests for test/audit930ea061/V3Depth.t.sol:V3JitCapTest\n[PASS] testBitmapNegativeTicksAndWordBoundaries() (gas: 240457)\n[PASS] testBothTokenOrdersUseTheEthSideOfTheBand() (gas: 1820892)\n[PASS] testFuzzBandDepthIsBoundedAndNarrowerRangesOnlyReduceIt(int24,uint128,uint16) (runs: 256, μ: 234594, ~: 236524)\nLogs:\n  Bound result -712781\n  Bound result 999999000000000000000301\n  Bound result 82\n\n[PASS] testHarmonicMeanUsesTimeAtEachLiquidityAndHandlesCounterWrap() (gas: 258118)\n[PASS] testLiquidityRemovalAndInsufficientHistoryFailImmediately() (gas: 357031)\n[PASS] testOutOfRangeWethDoesNotPassMinimumLiquidity() (gas: 592136)\n[PASS] testV3JitCapCannotMoveInOneTransaction() (gas: 676686)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 100.08ms (98.98ms CPU time)\n\nRan 15 tests for test/Curator.t.sol:CuratorTest\n[PASS] testApproveStoreThenPermissionlessExecuteAndReplay() (gas: 1510606)\n[PASS] testConsumedOracleUuidCannotApproveSecondRequest() (gas: 1872215)\n[PASS] testCrossContractAndCrossChainSignaturesRejected() (gas: 4446465)\n[PASS] testDirectSettersAndOutsideBoundsRejected() (gas: 185752)\n[PASS] testFuzzDiscountBounds(uint256) (runs: 256, μ: 490615, ~: 44233)\nLogs:\n  Bound result 572\n\n[PASS] testIntakeAndPaymentTokenAreCompiledInConstantsNotConstructorWords() (gas: 76285)\n[PASS] testLiquidityRecheckedAtExecutionAndCanonicalPoolRequired() (gas: 2725861)\n[PASS] testNoAnswerFailureAndTimeoutDoNotChangeSettings() (gas: 2437562)\n[PASS] testOddsRelativeTenPercentAndRollingDay() (gas: 3141165)\n[PASS] testPoolWhitelistDelistPauseAndUnpauseOnlyByApprovedAction() (gas: 4096067)\n[PASS] testProductionPinsTheRequiredSignerAndHasNoOwner() (gas: 93592)\n[PASS] testProposeReentrancyCannotOpenNestedRequest() (gas: 1381532)\n[PASS] testStaleConcurrentApprovalAndExpiredExecutionCannotChangeSettings() (gas: 2651426)\n[PASS] testWeakPanelExpiredFutureAndStaleAnswersRejected() (gas: 1580601)\n[PASS] testWrongSenderUnknownIdWrongQuestionAndTampering() (gas: 1433652)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 105.60ms (97.20ms CPU time)\n\nRan 11 tests for test/TwapOracle.t.sol:TwapOracleTest\n[PASS] testDonationsAndInactiveLiquidityCannotSatisfyTheLiquidityBound() (gas: 337279)\n[PASS] testFuzzFiveEthBoundary(uint128) (runs: 256, μ: 147399, ~: 122924)\nLogs:\n  Bound result 1588100098207370032\n\n[PASS] testFuzzGenesisOneEthBoundary(uint128) (runs: 256, μ: 91063, ~: 83058)\nLogs:\n  Bound result 2588100098207370032\n\n[PASS] testGenesisFourHourLiquidityAndPriceAreIndependentBounds() (gas: 390291)\n[PASS] testGenesisPoolOneEthBoundary() (gas: 519686)\n[PASS] testInsufficientLiquidityAndMissingHistory() (gas: 293676)\n[PASS] testMinOfBothTWAPsAndReverseQuote() (gas: 392109)\n[PASS] testPayoutCapIsFivePercentOfEthSideDepth() (gas: 936173)\n[PASS] testPolAndGenesisUseOppositeQuotesAndBothRespectPauses() (gas: 259324)\n[PASS] testRegularPoolFiveEthBoundary() (gas: 588663)\n[PASS] testStaleDelistedAndPausedValuesRevertWETHMayPause() (gas: 241480)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 116.51ms (120.29ms CPU time)\n\nRan 15 tests for test/GoldHook.t.sol:GoldHookTest\n[PASS] testConstructorRejectsZeroAndFlagsAreTheRequiredSet() (gas: 8696)\n[PASS] testExactInputBuyPaysFeeAndLaunchTaxOnTheEthInput() (gas: 304374)\n[PASS] testExactOutputBuyCapCountsFeeAndTax() (gas: 140294)\n[PASS] testExactOutputBuyChargesFeeAndTaxOnTopOfTheEthConsumed() (gas: 333936)\n[PASS] testFlushBeforeBindPaysHoldersOnlyAndBindRequiresPinnedCode() (gas: 1334804)\n[PASS] testFuzzFeeSplitInvariantOnBuys(uint256,uint256) (runs: 256, μ: 350380, ~: 351195)\nLogs:\n  Bound result 499999999000012343\n  Bound result 689\n\n[PASS] testGenesisOneEthDepthBoundaryAndPayoutCapOnRealPool() (gas: 5512878)\n[PASS] testGenesisPricingStaleAndThinChecks() (gas: 3928287)\n[PASS] testHookPermissionsMatchCoreABIAndEveryFlag() (gas: 22848)\n[PASS] testInitializeOnlyByFactoryOnlyPlatformPoolOnlyOnce() (gas: 3102268)\n[PASS] testObserveTracksTickCumulativeAndTwapOraclePricesGenesisFromHook() (gas: 827590)\n[PASS] testPOLManagerBuyAndBurnAndFullRangeLiquidityHeldForever() (gas: 1187869)\n[PASS] testPinnedGachaRuntimeCodeHash() (gas: 43852)\nLogs:\n  BagGacha runtime code hash (this build): 0xda1536bf0f0bda503d826bee72b6c33c9fb4f55f91cd5ea28b3c3ee8284a9b18\n\n[PASS] testSellsPayOnePercentOfEthOutAndNoTax() (gas: 660120)\n[PASS] testTaxScheduleAndBuyCap() (gas: 945070)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 133.45ms (141.13ms CPU time)\n\nRan 1 test for test/GasBench.t.sol:GasBenchTest\n[PASS] testMaximumInventorySnapshotGas() (gas: 10659452)\nLogs:\n  32 Bags / 128 distinct pools request gas (mock observe): 10001107\n  32 Bag draw gas: 415965\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 674.42ms (84.66ms CPU time)\n\nRan 8 tests for test/Audit85083c05.t.sol:Audit85083c05HookTest\n[PASS] testBindGachaLookalike() (gas: 2796522)\n[PASS] testGenesisDepthIsBoundedByTheEthTheLiquidityHolds() (gas: 35972)\n[PASS] testJitPayoutCap() (gas: 2642687)\n[PASS] testMinOutBpsMatchesTheFeeSchedule() (gas: 14976)\n[PASS] testMinOutFloorBehaviour() (gas: 536500)\n[PASS] testPartialFillFee() (gas: 1981863)\n[PASS] testPolFeeBrick() (gas: 3313799)\n[PASS] testShortWindowPushNoLongerInflatesGenesisBags() (gas: 1987998)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 681.73ms (22.82ms CPU time)\n\nRan 7 tests for test/audit930ea061/GenesisAndBinding.t.sol:BindPreflightTest\n[PASS] testAValidPreflightedSetStillBindsIfReleaseWinsTheRace() (gas: 319254603)\n[PASS] testBindCheckChecksEveryWireWithoutWaitingForReview() (gas: 2491554)\n[PASS] testMalformedDependencyReturnsReasonAndDoesNotBind() (gas: 380623)\n[PASS] testPathAFundingAndPreflightBeforeOwnerNamesTargets() (gas: 1161034)\n[PASS] testPostBindRetargetRemainsAnNFTOwnerTrustAssumption() (gas: 366682)\n[PASS] testPreflightRejectsIncorrectRuntimeAndWiring() (gas: 893606)\n[PASS] testWrongCodeIsDetectedBeforeNamingOrReview() (gas: 102812)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 693.32ms (688.51ms CPU time)\n\nRan 15 tests for test/audit930ea061/CancelRace.t.sol:CancelRaceTest\n[PASS] testAdmissionLimits() (gas: 175563)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1930876)\n[PASS] testExactDeadlineIgnoresFulfilmentBeforeCancelEvenWhenPaused() (gas: 1538832)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1857166)\n[PASS] testFulfilmentOneSecondBeforeDeadlineStillDrawsAfterIt() (gas: 1686876)\n[PASS] testFuzzAtOrAfterDeadlineBothTransactionOrdersCancel(uint256,uint32,bool) (runs: 256, μ: 1488033, ~: 1537850)\n[PASS] testGenesisAndFreeSpins() (gas: 1531284)\n[PASS] testGenesisPaidSpinSplit() (gas: 1195293)\n[PASS] testImmatureBagsNotDrawable() (gas: 567387)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1578901)\n[PASS] testRegularSpinKeep() (gas: 2277251)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154595)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119435)\n[PASS] testSpinRules() (gas: 494145)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1224276)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 727.13ms (116.16ms CPU time)\n\nRan 21 tests for test/BagGachaV2.t.sol:BagGachaV2Test\n[PASS] testAdmissionLimits() (gas: 175641)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1930964)\n[PASS] testCreditTransferFailureRollsBackAndReentryCannotPayTwice() (gas: 2172489)\n[PASS] testFeeOnTransferTokenCannotCreateUnderfundedBag() (gas: 1144626)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1857147)\n[PASS] testFreeSpinAfterRegularSnapshotAlwaysGenesis() (gas: 2616959)\n[PASS] testFreeSpinUnfundedGenesisCannotUseRegularBags() (gas: 2150648)\n[PASS] testFuzzSolventPayoutAndNoDoublePayment(uint256,uint256,bool) (runs: 256, μ: 1877261, ~: 1932366)\nLogs:\n  Bound result 157687198643806127114\n\n[PASS] testGenesisAndFreeSpins() (gas: 1531373)\n[PASS] testGenesisPaidSpinSplit() (gas: 1195365)\n[PASS] testImmatureBagsNotDrawable() (gas: 567465)\n[PASS] testMissingVRFKeepsSnapshotLockedWithoutRefundOrReroll() (gas: 1160893)\n[PASS] testOddsAndOracleChangesDoNotRewritePendingSnapshot() (gas: 2214394)\n[PASS] testOldVRFIdCannotFulfillNewPendingRequest() (gas: 2879632)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1578891)\n[PASS] testRegularSpinKeep() (gas: 2277287)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154607)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119535)\n[PASS] testSpinRules() (gas: 494222)\n[PASS] testUnavailableGenesisDoesNotBlockRegularDrawOrWithdrawal() (gas: 1712089)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1224455)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 727.23ms (149.32ms CPU time)\n\nRan 7 tests for test/GoblinNFT.t.sol:GoblinNFTTest\n[PASS] testMintAndLimits() (gas: 337105)\n[PASS] testRefundBeforeSellout() (gas: 308628)\n[PASS] testRefundsReopenAfter90Days() (gas: 318717096)\n[PASS] testRevealAndTokenURI() (gas: 319704626)\n[PASS] testRevealRearmsAfter256Blocks() (gas: 318772347)\n[PASS] testRevenue() (gas: 319229369)\n[PASS] testSelloutLocksRefundsAndRelease() (gas: 319518707)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 730.73ms (3.26s CPU time)\n\nRan 14 tests for test/Audit85083c05.t.sol:Audit85083c05GachaTest\n[PASS] testAdmissionLimits() (gas: 175541)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1931012)\n[PASS] testCancelledFreeSpinRefundsNothingButReleasesTheGenesisTokens() (gas: 989023)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1857324)\n[PASS] testGenesisAndFreeSpins() (gas: 1531303)\n[PASS] testGenesisPaidSpinSplit() (gas: 1195454)\n[PASS] testImmatureBagsNotDrawable() (gas: 567365)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1578857)\n[PASS] testRegularSpinKeep() (gas: 2277516)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154595)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119413)\n[PASS] testSpinRules() (gas: 494123)\n[PASS] testUnfulfilledRequestCanBeCancelledAfterADay() (gas: 3217421)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1224418)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 757.83ms (48.87ms CPU time)\n\nRan 1 test for test/GoldHook.invariant.t.sol:GoldHookInvariantTest\n[PASS] invariant_chargesEqualClaimsPlusFlushesAndNothingSticksInTheHook() (runs: 24, calls: 960, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| HookHandler | advance  | 161   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | bind     | 219   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | buy      | 191   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | flush    | 208   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | sell     | 181   | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 394\n  Bound result 3000000023999999976\n  Bound result 437152303923804523\n  Bound result 4999999999000002462\n  Bound result 308711225245627\n  Bound result 100000000000000000\n  Bound result 4999999999000000101\n  Bound result 1200\n  Bound result 97259343390522\n  Bound result 41017219905182652\n  Bound result 4999999999000014717\n  Bound result 665\n  Bound result 4999999999000002351\n  Bound result 4999999999000014541\n  Bound result 999999999999998\n  Bound result 499999999000006001\n  Bound result 287\n  Bound result 947\n  Bound result 701\n  Bound result 999999000017932\n  Bound result 1001\n  Bound result 378686212916301\n  Bound result 400\n  Bound result 4999999999000006880\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 770.27ms (754.38ms CPU time)\n\nRan 12 tests for test/BagGacha.t.sol:BagGachaTest\n[PASS] testAdmissionLimits() (gas: 175519)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1930738)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1857072)\n[PASS] testGenesisAndFreeSpins() (gas: 1531222)\n[PASS] testGenesisPaidSpinSplit() (gas: 1195158)\n[PASS] testImmatureBagsNotDrawable() (gas: 567343)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1578857)\n[PASS] testRegularSpinKeep() (gas: 2277096)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154595)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119369)\n[PASS] testSpinRules() (gas: 494079)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1224211)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 770.80ms (33.51ms CPU time)\n\nRan 19 tests for test/PayoutCap.t.sol:PayoutCapTest\n[PASS] testAdmissionLimits() (gas: 175607)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1931085)\n[PASS] testCapAtExactlyTheValueDoesNotSplitAndOneWeiBelowDoes() (gas: 2799456)\n[PASS] testCapBindsAndBuybackRelistsOnlyTheWonPortionWhileTheRemainderStaysDrawable() (gas: 3272017)\n[PASS] testCapBindsSplitsBagAndKeepPaysOnlyTheCappedPortion() (gas: 2521796)\n[PASS] testCapChangesAfterTheRequestDoNotRewriteTheCommittedSplit() (gas: 2739761)\n[PASS] testCapIsPerTokenAndAnUncappedTokenLeavesNothingBehind() (gas: 3306093)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1857256)\n[PASS] testFuzzCappedPayoutNeverExceedsCapAndTokensAreConserved(uint256,uint256,bool) (runs: 256, μ: 2143141, ~: 2118621)\nLogs:\n  Bound result 45236070860763356939\n  Bound result 14158806970882858\n\n[PASS] testGenesisAndFreeSpins() (gas: 1531361)\n[PASS] testGenesisPaidSpinSplit() (gas: 1195434)\n[PASS] testGenesisQuoteIsCappedAndTheSurplusStaysInTheVault() (gas: 2647653)\n[PASS] testImmatureBagsNotDrawable() (gas: 567431)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1578879)\n[PASS] testRegularSpinKeep() (gas: 2277344)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154595)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119501)\n[PASS] testSpinRules() (gas: 494210)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1224426)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 875.10ms (133.18ms CPU time)\n\nRan 10 tests for test/GoblinNFTDeployed.t.sol:GoblinNFTDeployedTest\n[PASS] testFuzzDeferredRevenueConservation(uint256,uint256,uint256) (runs: 256, μ: 882989, ~: 856845)\nLogs:\n  Bound result 3\n  Bound result 3260\n  Bound result 1\n\n[PASS] testMintAndLimits() (gas: 337135)\n[PASS] testPreReleaseRevenueIsDeferredAndNotClaimable() (gas: 457033)\n[PASS] testRefundBeforeSellout() (gas: 308650)\n[PASS] testRefundsReopenAfter90Days() (gas: 318717162)\n[PASS] testReleaseSplitsDeferredPoolAcrossLiveTokensThenAccruesImmediately() (gas: 319317118)\n[PASS] testRevealAndTokenURI() (gas: 319715170)\n[PASS] testRevealRearmsAfter256Blocks() (gas: 318772413)\n[PASS] testRevenue() (gas: 319229443)\n[PASS] testSelloutLocksRefundsAndRelease() (gas: 319518732)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 965.74ms (4.42s CPU time)\n\nRan 12 tests for test/GoblinNFTV2.t.sol:GoblinNFTV2Test\n[PASS] testDeploymentOwnerIsExplicit() (gas: 13478470)\n[PASS] testFuzzMintWalletCap(uint256,uint256) (runs: 256, μ: 624545, ~: 663056)\nLogs:\n  Bound result 20\n  Bound result 5\n\n[PASS] testMintAndLimits() (gas: 337136)\n[PASS] testRefundBeforeSellout() (gas: 308650)\n[PASS] testRefundsReopenAfter90Days() (gas: 318717206)\n[PASS] testRepeatedReviewRestartsFullSevenDaysAndOwnersCanTransfer() (gas: 319084703)\n[PASS] testRevealAndTokenURI() (gas: 319704648)\n[PASS] testRevealRearmsAfter256Blocks() (gas: 318772413)\n[PASS] testRevenue() (gas: 319229391)\n[PASS] testSelloutLocksRefundsAndRelease() (gas: 319518725)\n[PASS] testSharedReleaseTargetAndRevenueExcludedFromSplit() (gas: 319082333)\n[PASS] testTargetsRequireCodeInEverySlotAndRenounceOnlyAfterRelease() (gas: 319075641)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 979.51ms (6.11s CPU time)\n\nRan 5 tests for test/GenesisVault.t.sol:GenesisVaultTest\n[PASS] testDividendsAndGenesisClaimsRemainSolventAndCannotPayTwice() (gas: 583410)\n[PASS] testFuzzCurveBounds(uint256,uint256,uint256,bool) (runs: 256, μ: 248298, ~: 246464)\nLogs:\n  Bound result 797\n  Bound result 300\n  Bound result 962\n\n[PASS] testHugeQuoteCappedAtThreeDaysAndReopensWithSchedule() (gas: 237359)\n[PASS] testNotStartedUnfundedAndProtectedEntryPoints() (gas: 184742)\n[PASS] testScheduleDecayAndDiscountLimits() (gas: 445663)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 979.62ms (980.16ms CPU time)\n\nRan 1 test for test/GoblinEscrow.invariant.t.sol:GoblinEscrowInvariantTest\n[PASS] invariant_reviewsRefundsRevenueReleaseAndPullsRemainSolvent() (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| EscrowHandler | advance  | 1058  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | claim    | 1009  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | deposit  | 1012  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | pull     | 1013  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | refund   | 1011  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | release  | 1019  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | renounce | 1021  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | review   | 1049  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 6400000\n  Bound result 6238\n  Bound result 851\n  Bound result 600000000000000000\n  Bound result 50000000000000000\n  Bound result 2032\n  Bound result 2318\n  Bound result 8543849\n  Bound result 5244\n  Bound result 10000\n  Bound result 8518914\n  Bound result 3\n  Bound result 1000000000000000000\n  Bound result 10000\n  Bound result 6456\n  Bound result 4104\n  Bound result 5\n  Bound result 1000000000000000000\n  Bound result 9531\n  Bound result 203141792408169281\n  Bound result 3775256\n  Bound result 9841\n  Bound result 192\n  Bound result 7377\n  Bound result 7359364\n  Bound result 23473\n  Bound result 340858332164807701\n  Bound result 5183\n  Bound result 10000\n  Bound result 290757192450069016\n  Bound result 255\n  Bound result 62\n  Bound result 4140\n  Bound result 6995507\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.07s (1.82s CPU time)\n\nRan 1 test for test/Curator.invariant.t.sol:CuratorInvariantTest\n[PASS] invariant_onlyFreshApprovedBoundedChangesExecuteOnce() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-----------------+-------+---------+----------╮\n| Contract       | Selector        | Calls | Reverts | Discards |\n+===============================================================+\n| CuratorHandler | advance         | 1666  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | bypass          | 1655  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | discount        | 1662  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | invalidProposal | 1611  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | replay          | 1598  | 0       | 0        |\n╰----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 338\n  Bound result 126\n  Bound result 55633\n  Bound result 7751\n  Bound result 610\n  Bound result 761\n  Bound result 71843\n  Bound result 1097\n  Bound result 0\n  Bound result 5081\n  Bound result 21835\n  Bound result 663\n  Bound result 12965\n  Bound result 966\n  Bound result 9115\n  Bound result 13912\n  Bound result 1766\n  Bound result 724\n  Bound result 76\n  Bound result 13337\n  Bound result 0\n  Bound result 0\n  Bound result 152\n  Bound result 496\n  Bound result 1196\n  Bound result 364\n  Bound result 292\n  Bound result 721\n  Bound result 20640\n  Bound result 1173\n  Bound result 22400\n  Bound result 4966\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.12s (2.10s CPU time)\n\nRan 1 test for test/BagGacha.invariant.t.sol:BagGachaInvariantTest\n[PASS] invariant_allReserveAndTokenLiabilitiesAreBacked() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------------+-------+---------+----------╮\n| Contract     | Selector           | Calls | Reverts | Discards |\n+================================================================+\n| GachaHandler | advance            | 634   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | cancel             | 672   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | changeAvailability | 644   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | changeCap          | 705   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | claim              | 691   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | draw               | 712   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | flush              | 702   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | fulfill            | 651   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | seal               | 672   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | settle             | 689   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | spin               | 709   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | withdrawBag        | 711   | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 72671377883414289385\n  Bound result 1\n  Bound result 1\n  Bound result 26553\n  Bound result 197000000001350182332\n  Bound result 197000000000000887274\n  Bound result 197250000000000000001\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 1\n  Bound result 3\n  Bound result 123331\n  Bound result 4\n  Bound result 197000000000066937763\n  Bound result 197000000000000000014\n  Bound result 130095\n  Bound result 51936\n  Bound result 4\n  Bound result 1\n  Bound result 197102000000000000001\n  Bound result 199000000154234285\n  Bound result 4\n  Bound result 2\n  Bound result 68044\n  Bound result 7374\n  Bound result 197000000000000022229\n  Bound result 3\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.29s (2.29s CPU time)\n\nRan 1 test for test/GoblinNFT.invariant.t.sol:GoblinNFTInvariantTest\n[PASS] invariant_revenueAndRefundBackingMatchIndependentLedger() (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| NFTHandler | claim    | 1621  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | deposit  | 1620  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | mint     | 1705  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | refund   | 1565  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | transfer | 1681  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 137208979349609457\n  Bound result 14\n  Bound result 8\n  Bound result 20\n  Bound result 12644\n  Bound result 29\n  Bound result 1441\n  Bound result 5\n  Bound result 17\n  Bound result 95\n  Bound result 2\n  Bound result 55\n  Bound result 35\n  Bound result 21\n  Bound result 33\n  Bound result 18\n  Bound result 13\n  Bound result 12\n  Bound result 1\n  Bound result 3674\n  Bound result 38\n  Bound result 56\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 66\n  Bound result 2948602870\n  Bound result 14\n  Bound result 5\n  Bound result 67\n  Bound result 25\n  Bound result 46\n  Bound result 88\n  Bound result 19\n  Bound result 17\n  Bound result 763600050\n  Bound result 31\n  Bound result 48\n  Bound result 26\n  Bound result 18145\n  Bound result 36\n  Bound result 1000000000\n  Bound result 678\n  Bound result 75\n  Bound result 14\n  Bound result 22158\n  Bound result 68\n  Bound result 42\n  Bound result 20110\n  Bound result 16735\n  Bound result 69\n  Bound result 89\n  Bound result 14\n  Bound result 20\n  Bound result 26\n  Bound result 104\n  Bound result 112\n  Bound result 1\n  Bound result 11\n  Bound result 60\n  Bound result 44\n  Bound result 1\n  Bound result 5\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.33s (16.33s CPU time)\n\nRan 30 test suites in 16.33s (33.65s CPU time): 198 tests passed, 0 failed, 2 skipped (200 total tests)\n","passed":true},{"durationMs":185,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BagGacha.cancelRequest()\",\"BagGacha.choose(uint256,bool)\",\"BagGacha.claimBag(uint256)\",\"BagGacha.draw()\",\"BagGacha.finalize(uint256)\",\"BagGacha.flush()\",\"BagGacha.freeSpin(uint256)\",\"BagGacha.fundReserve()\",\"BagGacha.fundVRF()\",\"BagGacha.holderSpin(uint256)\",\"BagGacha.pullMintEscrow()\",\"BagGacha.rawFulfillRandomWords(uint256,uint256[])\",\"BagGacha.receive()\",\"BagGacha.seal(address[],uint256[])\",\"BagGacha.setTierOdds(uint256[4])\",\"BagGacha.spin()\",\"BagGacha.withdraw(uint256)\",\"BagGacha.withdrawCredit()\",\"Curator.clear(uint256)\",\"Curator.execute(uint256)\",\"Curator.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Curator.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Curator.propose(uint8,bytes,(uint64,uint64),bytes32,uint256)\",\"GenesisVault.claim()\",\"GenesisVault.claimDividends()\",\"GenesisVault.commit(bool)\",\"GenesisVault.deliver(address,uint256)\",\"GenesisVault.setDiscount(uint256)\",\"GenesisVault.setShares(address,uint256)\",\"GenesisVault.uncommit(uint256)\",\"GoblinNFT.approve(address,uint256)\",\"GoblinNFT.claimRelease()\",\"GoblinNFT.claimRevenue(uint256[])\",\"GoblinNFT.depositRevenue()\",\"GoblinNFT.mint(uint256)\",\"GoblinNFT.refund(uint256)\",\"GoblinNFT.release()\",\"GoblinNFT.renounceOwnership()\",\"GoblinNFT.reveal()\",\"GoblinNFT.safeTransferFrom(address,address,uint256)\",\"GoblinNFT.safeTransferFrom(address,address,uint256,bytes)\",\"GoblinNFT.setApprovalForAll(address,bool)\",\"GoblinNFT.setLaunchTargets(address,address,address)\",\"GoblinNFT.transferFrom(address,address,uint256)\",\"GoblinNFT.transferOwnership(address)\",\"GoldHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"GoldHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"GoldHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"GoldHook.bindGacha(address)\",\"GoldHook.flush()\",\"GoldHook.receive()\",\"GoldHook.unlockCallback(bytes)\",\"POLManager.addLiquidity(uint256)\",\"POLManager.buyAndBurn(uint256)\",\"POLManager.depositBurn()\",\"POLManager.depositPOL()\",\"POLManager.pullMintEscrow()\",\"POLManager.receive()\",\"POLManager.recycle()\",\"POLManager.unlockCallback(bytes)\",\"TwapOracle.setPool(address,address)\",\"TwapOracle.setTokenPaused(address,bool)\"],\"files\":{\".gitignore\":3,\"README.md\":483,\"docs/hook-permissions.json\":16,\"foundry.toml\":14,\"remappings.txt\":2,\"report.md\":74,\"script/CheckLaunch.s.sol\":36,\"script/DeployGoblinNFT.s.sol\":13,\"src/BagGacha.sol\":952,\"src/Curator.sol\":405,\"src/GenesisVault.sol\":225,\"src/GoblinArt.sol\":235,\"src/GoblinNFT.sol\":334,\"src/GoldHook.sol\":542,\"src/IMDProtocol.sol\":19,\"src/OracleAttestation.sol\":221,\"src/POLManager.sol\":239,\"src/TickMath.sol\":77,\"src/TwapOracle.sol\":321,\"src/v3/V3Depth.sol\":79,\"src/v4/Hooks.sol\":23,\"src/v4/V4Minimal.sol\":92,\"test/Audit85083c05.t.sol\":477,\"test/BagGacha.invariant.t.sol\":235,\"test/BagGacha.t.sol\":320,\"test/BagGachaV2.t.sol\":282,\"test/Curator.invariant.t.sol\":125,\"test/Curator.t.sol\":390,\"test/GasBench.t.sol\":92,\"test/GenesisVault.t.sol\":111,\"test/GoblinEscrow.invariant.t.sol\":184,\"test/GoblinNFT.invariant.t.sol\":131,\"test/GoblinNFT.t.sol\":205,\"test/GoblinNFTDeployed.t.sol\":78,\"test/GoblinNFTV2.t.sol\":103,\"test/GoldHook.invariant.t.sol\":116,\"test/GoldHook.t.sol\":427,\"test/OracleConsumerConformance.t.sol\":146,\"test/PayoutCap.t.sol\":279,\"test/TickMath.t.sol\":22,\"test/TwapOracle.t.sol\":233,\"test/audit930ea061/CancelRace.t.sol\":69,\"test/audit930ea061/ConcentratedDepth.t.sol\":139,\"test/audit930ea061/GenesisAndBinding.t.sol\":260,\"test/audit930ea061/PolFloorInverted.t.sol\":151,\"test/audit930ea061/V3Depth.t.sol\":153,\"test/fork/MainnetFork.t.sol\":90,\"test/fork/MainnetV4Fork.t.sol\":160,\"test/mocks/AdversarialMocks.sol\":42,\"test/mocks/CuratorMocks.sol\":183,\"test/mocks/Mocks.sol\":183,\"test/mocks/V4Fixture.sol\":116,\"test/v4-core/BUSL_LICENSE\":63,\"test/v4-core/ERC6909.sol\":90,\"test/v4-core/ERC6909Claims.sol\":23,\"test/v4-core/Extsload.sol\":64,\"test/v4-core/Exttload.sol\":40,\"test/v4-core/MIT_LICENSE\":7,\"test/v4-core/NoDelegateCall.sol\":33,\"test/v4-core/PoolManager.sol\":394,\"test/v4-core/ProtocolFees.sol\":71,\"test/v4-core/interfaces/IExtsload.sol\":21,\"test/v4-core/interfaces/IExttload.sol\":15,\"test/v4-core/interfaces/IHooks.sol\":152,\"test/v4-core/interfaces/IPoolManager.sol\":217,\"test/v4-core/interfaces/IProtocolFees.sol\":52,\"test/v4-core/interfaces/callback/IUnlockCallback.sol\":10,\"test/v4-core/interfaces/external/IERC20Minimal.sol\":48,\"test/v4-core/interfaces/external/IERC6909Claims.sol\":66,\"test/v4-core/libraries/BitMath.sol\":49,\"test/v4-core/libraries/CurrencyDelta.sol\":42,\"test/v4-core/libraries/CurrencyReserves.sol\":39,\"test/v4-core/libraries/CustomRevert.sol\":120,\"test/v4-core/libraries/FixedPoint128.sol\":8,\"test/v4-core/libraries/FixedPoint96.sol\":10,\"test/v4-core/libraries/FullMath.sol\":117,\"test/v4-core/libraries/Hooks.sol\":344,\"test/v4-core/libraries/LPFeeLibrary.sol\":79,\"test/v4-core/libraries/LiquidityMath.sol\":20,\"test/v4-core/libraries/Lock.sol\":28,\"test/v4-core/libraries/NonzeroDeltaCount.sol\":35,\"test/v4-core/libraries/ParseBytes.sol\":29,\"test/v4-core/libraries/Pool.sol\":620,\"test/v4-core/libraries/Position.sol\":103,\"test/v4-core/libraries/ProtocolFeeLibrary.sol\":47,\"test/v4-core/libraries/SafeCast.sol\":60,\"test/v4-core/libraries/SqrtPriceMath.sol\":292,\"test/v4-core/libraries/StateLibrary.sol\":345,\"test/v4-core/libraries/SwapMath.sol\":108,\"test/v4-core/libraries/TickBitmap.sol\":121,\"test/v4-core/libraries/TickMath.sol\":238,\"test/v4-core/libraries/TransientStateLibrary.sol\":48,\"test/v4-core/libraries/UnsafeMath.sol\":29,\"test/v4-core/solmate/Owned.sol\":44,\"test/v4-core/test/PoolModifyLiquidityTest.sol\":96,\"test/v4-core/test/PoolSwapTest.sol\":117,\"test/v4-core/test/PoolTestBase.sol\":31,\"test/v4-core/types/BalanceDelta.sol\":72,\"test/v4-core/types/BeforeSwapDelta.sol\":38,\"test/v4-core/types/Currency.sol\":118,\"test/v4-core/types/PoolId.sol\":17,\"test/v4-core/types/PoolKey.sol\":22,\"test/v4-core/types/PoolOperation.sol\":26,\"test/v4-core/types/Slot0.sol\":95,\"test/v4-core/utils/CurrencySettler.sol\":46},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":22311,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/BagGacha.sol:916: BagGacha.flush() (src/BagGacha.sol#916-927) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/GoldHook.sol:387: GoldHook.flush() (src/GoldHook.sol#387-402) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/BagGacha.sol:515: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560) sends eth to arbitrary user\n[high/medium] reentrancy-eth at src/BagGacha.sol:515: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560):\n[medium/medium] divide-before-multiply at src/GoldHook.sol:463: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#463-479) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/TickMath.sol:10: TickMath.sqrtPriceAtTick(int24) (src/TickMath.sol#10-76) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/GoldHook.sol:280: GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes) (src/GoldHook.sol#280-322) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/GoldHook.sol:463: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#463-479) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:438: GoldHook._write(int24,uint128) (src/GoldHook.sol#438-451) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BagGacha.sol:565: BagGacha._commitGenesis(bool) (src/BagGacha.sol#565-585) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BagGacha.sol:565: BagGacha._commitGenesis(bool) (src/BagGacha.sol#565-585) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BagGacha.sol:515: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/POLManager.sol:199: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#199-225) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:463: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#463-479) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:428: GoldHook.liquidityAt(uint32) (src/GoldHook.sol#428-436) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/POLManager.sol:141: Reentrancy in POLManager.addLiquidity(uint256) (src/POLManager.sol#141-160):\n[medium/medium] reentrancy-no-eth at src/Curator.sol:155: Reentrancy in Curator.propose(Curator.Kind,bytes,Curator.Window,bytes32,uint256) (src/Curator.sol#155-182):\n[medium/medium] reentrancy-no-eth at src/BagGacha.sol:515: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560):\n[medium/medium] uninitialized-local at src/GoldHook.sol:268: GoldHook.beforeSwap(address,PoolKey,SwapParams,bytes).delta (src/GoldHook.sol#268) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Curator.sol:214: Curator._validate(Curator.Kind,bytes).token (src/Curator.sol#214) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BagGacha.sol:293: BagGacha.setTierOdds(uint256[4]).sum (src/BagGacha.sol#293) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GoldHook.sol:287: GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes).tax (src/GoldHook.sol#287) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Curator.sol:229: Curator._validate(Curator.Kind,bytes).sum (src/Curator.sol#229) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BagGacha.sol:566: BagGacha._commitGenesis(bool).quoted (src/BagGacha.sol#566) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GoldHook.sol:288: GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes).unspecified (src/GoldHook.sol#288) is a local variable never initialized\n[medium/medium] unused-return at src/POLManager.sol:199: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#199-225) ignores return value by poolManager.settle{value: ethUsed}() (src/POLManager.sol#216)\n[medium/medium] unused-return at src/POLManager.sol:199: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#199-225) ignores return value by poolManager.settle() (src/POLManager.sol#220)\n[medium/medium] unused-return at src/TwapOracle.sol:235: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#235-257) ignores return value by (sqrtPrice,None) = goldHook.slot0() (src/TwapOracle.sol#238)\n[medium/medium] unused-return at src/GoldHook.sol:387: GoldHook.flush() (src/GoldHook.sol#387-402) ignores return value by poolManager.unlock(abi.encode(total)) (src/GoldHook.sol#397)\n[medium/medium] unused-return at src/POLManager.sol:188: POLManager._buy(uint256,uint256,address) (src/POLManager.sol#188-197) ignores return value by poolManager.settle{value: uint256(uint128(- a0))}() (src/POLManager.sol#195)\n[medium/medium] unused-return at src/POLManager.sol:199: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#199-225) ignores return value by (sqrtPrice,None) = V4Lib.slot0(poolManager,V4Lib.poolId(poolKey())) (src/POLManager.sol#200)\n[medium/medium] unused-return at src/GoldHook.sol:415: GoldHook.observe(uint32[]) (src/GoldHook.sol#415-422) ignores return value by (None,tick) = V4Lib.slot0(poolManager,poolId) (src/GoldHook.sol#417)\n[medium/medium] unused-return at src/GoldHook.sol:260: GoldHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/GoldHook.sol#260-274) ignores return value by (None,tick) = V4Lib.slot0(poolManager,poolId) (src/GoldHook.sol#266)\n[medium/medium] unused-return at src/POLManager.sol:199: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#199-225) ignores return value by (delta,None) = poolManager.modifyLiquidity(poolKey(),ModifyLiquidityParams(TICK_LOWER,TICK_UPPER,int256(uint256(liquidity)),bytes32(0)),) (src/POLManager.sol#203-205)\n[low/medium] missing-zero-check at src/GoldHook.sol:331: GoldHook.bindGacha(address).gacha_ (src/GoldHook.sol#331) lacks a zero-check on :\n[low/medium] calls-loop at src/BagGacha.sol:320: BagGacha.bagValue(uint256) (src/BagGacha.sol#320-325) has external calls inside a loop: v += oracle.valueInEth(b.tokens[i],b.amounts[i]) (src/BagGacha.sol#323)\n[low/medium] calls-loop at src/BagGacha.sol:599: BagGacha._buildSnapshot() (src/BagGacha.sol#599-649) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#608-613)\n[low/medium] calls-loop at src/BagGacha.sol:404: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#404-438) has external calls inside a loop: tokens[i] == genesis.token() || amounts[i] < 1 || ! oracle.isPriced(tokens[i]) (src/BagGacha.sol#410)\n[low/medium] calls-loop at src/BagGacha.sol:404: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#404-438) has external calls inside a loop: beforeBalance = IERC20(tokens[i_scope_0]).balanceOf(address(this)) (src/BagGacha.sol#433)\n[low/medium] calls-loop at src/BagGacha.sol:599: BagGacha._buildSnapshot() (src/BagGacha.sol#599-649) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#608-613)\n[low/medium] calls-loop at src/BagGacha.sol:404: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#404-438) has external calls inside a loop: IERC20(tokens[i_scope_0]).balanceOf(address(this)) - beforeBalance != amounts[i_scope_0] (src/BagGacha.sol#435)\n[low/medium] calls-loop at src/BagGacha.sol:404: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#404-438) has external calls inside a loop: value += oracle.valueInEth(tokens[i],amounts[i]) (src/BagGacha.sol#414)\n[low/medium] calls-loop at src/BagGacha.sol:599: BagGacha._buildSnapshot() (src/BagGacha.sol#599-649) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#608-613)\n[low/medium] calls-loop at src/BagGacha.sol:330: BagGacha.bagPayout(uint256) (src/BagGacha.sol#330-351) has external calls inside a loop: (v,cap) = oracle.valueAndCap(b.tokens[i],full) (src/BagGacha.sol#340)\n[low/medium] reentrancy-benign at src/POLManager.sol:141: Reentrancy in POLManager.addLiquidity(uint256) (src/POLManager.sol#141-160):\n[low/medium] reentrancy-benign at src/POLManager.sol:127: Reentrancy in POLManager.buyAndBurn(uint256) (src/POLManager.sol#127-137):\n[low/medium] reentrancy-benign at src/BagGacha.sol:515: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560):\n[low/medium] reentrancy-benign at src/GoldHook.sol:387: Reentrancy in GoldHook.flush() (src/GoldHook.sol#387-402):\n[low/medium] reentrancy-benign at src/Curator.sol:155: Reentrancy in Curator.propose(Curator.Kind,bytes,Curator.Window,bytes32,uint256) (src/Curator.sol#155-182):\n[low/medium] reentrancy-events at src/GoldHook.sol:280: Reentrancy in GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes) (src/GoldHook.sol#280-322):\n[low/medium] timestamp at src/GoldHook.sol:438: GoldHook._write(int24,uint128) (src/GoldHook.sol#438-451) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:178: GenesisVault._accrue() (src/GenesisVault.sol#178-187) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:331: GoldHook.bindGacha(address) (src/GoldHook.sol#331-345) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:103: GenesisVault.target() (src/GenesisVault.sol#103-108) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:205: GenesisVault.pendingDividends(address) (src/GenesisVault.sol#205-213) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:668: BagGacha.cancelRequest() (src/BagGacha.sol#668-691) uses timestamp for comparisons\n[low/medium] timestamp at src/TwapOracle.sol:211: TwapOracle._checkPool(address,address) (src/TwapOracle.sol#211-227) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:113: GenesisVault.quote(bool) (src/GenesisVault.sol#113-135) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:532: GoldHook._checkBuyCap(uint256) (src/GoldHook.sol#532-536) uses timestamp for comparisons\n[low/medium] timestamp at src/GoblinNFT.sol:129: GoblinNFT.refundsOpen() (src/GoblinNFT.sol#129-134) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:653: BagGacha.rawFulfillRandomWords(uint256,uint256[]) (src/BagGacha.sol#653-662) uses timestamp for comparisons\n[low/medium] timestamp at src/Curator.sol:329: Curator.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/Curator.sol#329-359) uses timestamp for comparisons\n[low/medium] timestamp at src/TwapOracle.sol:235: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#235-257) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:201: GoldHook.buyTaxBps() (src/GoldHook.sol#201-208) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:428: GoldHook.liquidityAt(uint32) (src/GoldHook.sol#428-436) uses timestamp for comparisons\n[low/medium] timestamp at src/Curator.sol:376: Curator.clear(uint256) (src/Curator.sol#376-383) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:479: BagGacha.holderSpin(uint256) (src/BagGacha.sol#479-486) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:290: BagGacha.setTierOdds(uint256[4]) (src/BagGacha.sol#290-304) uses timestamp for comparisons\n[low/medium] timestamp at src/GoblinNFT.sol:221: GoblinNFT.release() (src/GoblinNFT.sol#221-236) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:482: GoldHook._surroundings(uint32) (src/GoldHook.sol#482-506) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:463: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#463-479) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:215: GenesisVault.claimDividends() (src/GenesisVault.sol#215-224) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:442: BagGacha.withdraw(uint256) (src/BagGacha.sol#442-467) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:489: BagGacha.freeSpin(uint256) (src/BagGacha.sol#489-501) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:819: BagGacha.finalize(uint256) (src/BagGacha.sol#819-824) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:810: BagGacha.choose(uint256,bool) (src/BagGacha.sol#810-816) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:515: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#515-560) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:565: BagGacha._commitGenesis(bool) (src/BagGacha.sol#565-585) uses timestamp for comparisons\n[low/medium] timestamp at src/Curator.sol:385: Curator.execute(uint256) (src/Curator.sol#385-404) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:761: BagGacha._select(uint256) (src/BagGacha.sol#761-780) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:157: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#157-165) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:599: BagGacha._buildSnapshot() (src/BagGacha.sol#599-649) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:472: BagGacha.spin() (src/BagGacha.sol#472-476) uses timestamp for comparisons","passed":true},{"durationMs":1328,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/GoldHook.sol:67: Contract locks Ether without a withdraw function (2 places)\n[high] eth-send-unchecked-address at src/BagGacha.sol:893: ETH transferred without address checks\n[high] incorrect-shift-order at src/v4/V4Minimal.sol:76: Incorrect Assembly Shift Parameter Order\n[high] reentrancy-state-change at src/BagGacha.sol:410: Reentrancy: State change after external call (15 places)\n[high] unsafe-casting at src/TickMath.sol:75: Unsafe Casting of integers\n[low] centralization-risk at src/GoblinNFT.sol:20: Centralization Risk (3 places)\n[low] costly-loop at src/BagGacha.sol:604: Costly operations inside loop (4 places)\n[low] empty-require-revert at src/v3/V3Depth.sol:77: Empty `require()` / `revert()` Statement\n[low] internal-function-used-once at src/OracleAttestation.sol:185: Internal Function Used Only Once\n[low] large-numeric-literal at src/BagGacha.sol:85: Large Numeric Literal (12 places)\n[low] literal-instead-of-constant at src/BagGacha.sol:290: Literal Instead of Constant (304 places)\n[low] local-variable-shadowing at src/GoldHook.sol:73: Local Variable Shadows State Variable\n[low] missing-inheritance at src/TwapOracle.sol:48: Missing Inheritance\n[low] require-revert-in-loop at src/BagGacha.sol:294: Loop Contains `require`/`revert` (10 places)\n[low] state-change-without-event at src/POLManager.sol:164: State Change Without Event\n[low] state-no-address-check at src/GoldHook.sol:341: Address State Variable Set Without Checks\n[low] state-variable-could-be-immutable at src/BagGacha.sol:93: State Variable Could Be Immutable (8 places)\n[low] storage-array-length-not-cached at src/BagGacha.sol:604: Storage Array Length not Cached (2 places)\n[low] unchecked-return at src/GoldHook.sol:397: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/BagGacha.sol:294: Uninitialized Local Variable (2 places)\n[low] unsafe-oz-erc721-mint at src/GoblinNFT.sol:124: Unsafe `ERC721::_mint()`\n[low] unused-public-function at src/BagGacha.sol:320: Public Function Not Used Internally (9 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"24cac19531ec0f79dd7a06b9a18fa62ed3ce34b822b8f0becbf8fc86989e0550","verifiedTreeHash":"332e83ad8b67151056a4aaf4d55a7744473761e7","verifierVersion":"0.1.0+67c588fa"}]}