{"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":"05d83502-4b3e-44ec-8d89-14cf40e464e2","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"0552a28ab85667de594a6bf9469cb9958d18824ff22e9f028310db927f3abaf6","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":"Goblin Gold v3.1 (fixes before audit, nothing else):\n1. Curator: the deploy gate refuses IMD protocol addresses as constructor words. Move the Ethereum IMD Intake v2 (0xa43e6f75ee006411f79ac1c84120606c2330de82) and the IMD payment token (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) into a compiled-in constants library (like the attester), remove them from the Curator constructor, and update every runbook objective so no constructor word is an IMD protocol address. Verify both addresses against the reference before pinning.\n2. Liquidity thresholds are too high for a new project. Use a minimum ETH-side depth of 1 ETH for the genesis token (GOLD/ETH v4 pool) and 5 ETH per side for regular v3 Bags (was 50). To keep thin pools safe against TWAP manipulation, cap any single draw payout, valued at the TWAP, at 5% of that token pool's current ETH-side depth; if a win would exceed the cap, pay the capped value from that Bag and keep the rest in the Bag. Keep the TWAP windows and staleness rules. Add tests at the boundaries (0.99/1 ETH genesis, 4.99/5 ETH regular, payout cap).\nThen re-pin GACHA_RUNTIME_CODE_HASH from the final build, rerun all tests (FOUNDRY_VIA_IR=false FOUNDRY_BYTECODE_HASH=none) and the v4 mainnet fork test, and update the README runbook for both remainder paths. Do not change foundry.toml or src/GoblinNFT.sol.","parentJobId":"2bd6820b-c575-45aa-b63a-d2d1a360eb71","planHash":"df596c3f370ffc629fed9880f64da50b7041a3b0c388e5854b0863c937ebba4d","previousHash":"931398dad75b272f3b65a0fd005f646a679aff52acea58ee03ba83d09ac5689c","projectId":"9bf411ca-2719-4cab-b2a3-badcf83ed8d4","publication":{"commit":"64a3c2ff8518d95299317c89f03a89c3e9381592","deliveredAt":"2026-10-13T20:36:48.218Z","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":"a6b600344d582c8000402089547ad1a833f392fb02d90d28c02c45894d86ea79","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"ee703b460ca398ff9ca23c4a06cd952c3ee0d840b26e9da876779cc3da09c9da","device":"b57ae3a96321a0e1","findings":[],"hash":"0552a28ab85667de594a6bf9469cb9958d18824ff22e9f028310db927f3abaf6","nodeId":"f8f6ff47-ee3f-4387-84a2-803fc71b8264","outcome":"completed","summary":"Goblin Gold v3.1 is done. Both fixes are implemented, verified, and documented. Nothing was deployed and no protected file changed.\n\n**What changed**\n\n- **Curator constants.** New library `src/IMDProtocol.sol` holds the Ethereum IMD Intake v2, the IMD token, the oracle signer and the action id. The Curator constructor is now `Curator(oracle, genesis, gacha)`. Only the compiled-in intake can answer a callback. I verified both addresses against the pinned reference and live on mainnet: the intake quotes 0.5 IMD for the oracle action, and the token reports symbol IMD.\n- **Thresholds.** Regular v3 pools need 5 ETH per side. The GOLD/ETH v4 pool needs a 1 ETH ETH-side depth. TWAP windows and staleness are untouched.\n- **Payout cap.** The oracle's new `valueAndCap` returns the TWAP value plus 5% of the pool's current ETH-side depth. The gacha snapshot commits capped values before randomness. When a cap binds on the drawn Bag, `draw()` splits it: the capped portion becomes a new Bag id the winner keeps or sells back, and the remainder stays listed for the depositor. Genesis quotes are capped the same way, with the surplus returned to the vault in the same transaction.\n- **Hash re-pinned.** `GACHA_RUNTIME_CODE_HASH` in GoldHook now matches the final v3.1 BagGacha under the launch profile.\n- **Docs.** README has a v3.1 summary, a payout cap section, the Curator constants, a runbook whose constructor words contain no IMD protocol address, and both remainder paths spelled out step by step. `report.md` records the checks.\n\n**Verification**\n\n| Check | Result |\n|---|---|\n| Launch profile (`via_ir=false`, `bytecode_hash=none`), verifier fuzz seed | 138 passed, 0 failed |\n| Protected profile (`via_ir=true`), same seed | 138 passed, 0 failed |\n| `forge fmt --check` | pass |\n| Mainnet fork tests via public RPC | 3 passed, including the v4 PoolManager test |\n\nNew tests cover the 4.99/5 ETH and 0.99/1 ETH boundaries on mocks and on the real vendored PoolManager, exact-cap versus one-wei-over splitting, keep and buyback of a split Bag, per-token caps, committed splits surviving later depth changes, the Genesis cap, and a fuzzed conservation check.\n\n**Judgment calls to note**\n\n- The genesis bound is on the ETH side only, as the brief words it. The old token-side check was dropped for the GOLD pool. Regular v3 pools still check both sides.\n- A capped payout that rounds below the 0.3P small-tier floor is skipped in that snapshot rather than paid under the floor.\n- The cap is read at request time, so nothing about a payout is decided after the VRF word is known.","treeHash":"4966018f9373e43ec9e8400b3de1b86e20e7cdae","usage":{"cachedInputTokens":4486808,"inputTokens":770,"model":"claude-fable-5-1","outputTokens":94281,"runtime":"claude","turns":101,"wallClockMs":1448531}}],"verification":[{"checks":[{"durationMs":119144,"exitCode":0,"name":"build","output":"Compiling 146 files with Solc 0.8.26\nSolc 0.8.26 finished in 119.03s\nCompiler run successful!\n","passed":true},{"durationMs":9709,"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 245.59µs (113.38µs 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 314.52µs (0.00ns 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 372.69µs (0.00ns CPU time)\n\nRan 2 tests for test/BagGachaV2.t.sol:EarlyGachaTest\n[PASS] testDayOneRevenueBeforeSelloutAndMintRemainsRefundable() (gas: 1241484)\n[PASS] testPreReleaseRefundCannotRecycleFreeSpinCoupons() (gas: 332644)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.50ms (858.91µs 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: 185664)\n[PASS] testFuzzDiscountBounds(uint256) (runs: 256, μ: 480696, ~: 44233)\nLogs:\n  Bound result 1000\n\n[PASS] testIntakeAndPaymentTokenAreCompiledInConstantsNotConstructorWords() (gas: 76285)\n[PASS] testLiquidityRecheckedAtExecutionAndCanonicalPoolRequired() (gas: 2383559)\n[PASS] testNoAnswerFailureAndTimeoutDoNotChangeSettings() (gas: 2437562)\n[PASS] testOddsRelativeTenPercentAndRollingDay() (gas: 3140681)\n[PASS] testPoolWhitelistDelistPauseAndUnpauseOnlyByApprovedAction() (gas: 4039945)\n[PASS] testProductionPinsTheRequiredSignerAndHasNoOwner() (gas: 93504)\n[PASS] testProposeReentrancyCannotOpenNestedRequest() (gas: 1381531)\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 29.73ms (39.38ms CPU time)\n\nRan 14 tests for test/GoldHook.t.sol:GoldHookTest\n[PASS] testConstructorRejectsZeroAndFlagsAreTheRequiredSet() (gas: 8650)\n[PASS] testExactInputBuyPaysFeeAndLaunchTaxOnTheEthInput() (gas: 302521)\n[PASS] testExactOutputBuyCapCountsFeeAndTax() (gas: 138832)\n[PASS] testExactOutputBuyChargesFeeAndTaxOnTopOfTheEthConsumed() (gas: 313080)\n[PASS] testFlushBeforeBindPaysHoldersOnlyAndBindRequiresPinnedCode() (gas: 1500047)\n[PASS] testFuzzFeeSplitInvariantOnBuys(uint256,uint256) (runs: 256, μ: 348178, ~: 349065)\nLogs:\n  Bound result 186282034403946733\n  Bound result 3018\n\n[PASS] testGenesisOneEthDepthBoundaryAndPayoutCapOnRealPool() (gas: 3862664)\n[PASS] testGenesisPricingStaleAndThinChecks() (gas: 3045788)\n[PASS] testInitializeOnlyByFactoryOnlyPlatformPoolOnlyOnce() (gas: 2493465)\n[PASS] testObserveTracksTickCumulativeAndTwapOraclePricesGenesisFromHook() (gas: 801096)\n[PASS] testPOLManagerBuyAndBurnAndFullRangeLiquidityHeldForever() (gas: 1172431)\n[PASS] testPinnedGachaRuntimeCodeHash() (gas: 20422)\nLogs:\n  BagGacha runtime code hash (this build): 0x874626043763deacdd0579f14ac79a458c8bf3bd6ea4f06f39aaa9a1aa22a765\n  constant differs: expected only outside the FOUNDRY_VIA_IR=false FOUNDRY_BYTECODE_HASH=none profile\n\n[PASS] testSellsPayOnePercentOfEthOutAndNoTax() (gas: 656840)\n[PASS] testTaxScheduleAndBuyCap() (gas: 932619)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 65.19ms (66.62ms CPU time)\n\nRan 1 test for test/GasBench.t.sol:GasBenchTest\n[PASS] testMaximumInventorySnapshotGas() (gas: 8811248)\nLogs:\n  32 Bags / 128 distinct pools request gas (mock observe): 8136091\n  32 Bag draw gas: 415965\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 113.70ms (10.55ms 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  | 195   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | bind     | 190   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | buy      | 194   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | flush    | 191   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | sell     | 190   | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4999999999000001442\n  Bound result 1200\n  Bound result 4\n  Bound result 330\n  Bound result 911\n  Bound result 618\n  Bound result 150\n  Bound result 1200\n  Bound result 499999999000008742\n  Bound result 4999999999000009054\n  Bound result 75\n  Bound result 1141\n  Bound result 1200\n  Bound result 1200\n  Bound result 4999999999000014401\n  Bound result 499999999000015251\n  Bound result 499999999852541544\n  Bound result 1132\n  Bound result 1\n  Bound result 379\n  Bound result 999999000000178\n  Bound result 33502205464904\n  Bound result 1024\n  Bound result 999999000012346\n  Bound result 499999999000001296\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 198.89ms (195.39ms 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 398.74ms (1.26ms CPU time)\n\nRan 12 tests for test/BagGacha.t.sol:BagGachaTest\n[PASS] testAdmissionLimits() (gas: 155059)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1925133)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1851599)\n[PASS] testGenesisAndFreeSpins() (gas: 1529300)\n[PASS] testGenesisPaidSpinSplit() (gas: 1190824)\n[PASS] testImmatureBagsNotDrawable() (gas: 565506)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1573848)\n[PASS] testRegularSpinKeep() (gas: 2271095)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154551)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119325)\n[PASS] testSpinRules() (gas: 492198)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1220203)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 429.76ms (17.05ms CPU time)\n\nRan 10 tests for test/GoblinNFTDeployed.t.sol:GoblinNFTDeployedTest\n[PASS] testFuzzDeferredRevenueConservation(uint256,uint256,uint256) (runs: 256, μ: 911412, ~: 919673)\nLogs:\n  Bound result 1\n  Bound result 150495001\n  Bound result 0\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 571.64ms (2.12s 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 589.28ms (2.14s CPU time)\n\nRan 5 tests for test/GenesisVault.t.sol:GenesisVaultTest\n[PASS] testDividendsAndGenesisClaimsRemainSolventAndCannotPayTwice() (gas: 583256)\n[PASS] testFuzzCurveBounds(uint256,uint256,uint256,bool) (runs: 256, μ: 247866, ~: 246134)\nLogs:\n  Bound result 14142\n  Bound result 64491328\n  Bound result 1116\n\n[PASS] testHugeQuoteCappedAtThreeDaysAndReopensWithSchedule() (gas: 237029)\n[PASS] testNotStartedUnfundedAndProtectedEntryPoints() (gas: 184742)\n[PASS] testScheduleDecayAndDiscountLimits() (gas: 445102)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 589.33ms (589.99ms CPU time)\n\nRan 9 tests for test/TwapOracle.t.sol:TwapOracleTest\n[PASS] testDonationsAndInactiveLiquidityCannotSatisfyTheLiquidityBound() (gas: 288397)\n[PASS] testFuzzFiveEthBoundary(uint256) (runs: 256, μ: 160389, ~: 127633)\nLogs:\n  Bound result 1696927507266758116\n\n[PASS] testFuzzGenesisOneEthBoundary(uint128) (runs: 256, μ: 69792, ~: 61346)\nLogs:\n  Bound result 2271729048484668900\n\n[PASS] testGenesisPoolOneEthBoundary() (gas: 382904)\n[PASS] testInsufficientWETHSideAndTokenSideAndMissingHistory() (gas: 443265)\n[PASS] testMinOfBothTWAPsAndReverseQuote() (gas: 322470)\n[PASS] testPayoutCapIsFivePercentOfEthSideDepth() (gas: 579451)\n[PASS] testRegularPoolFiveEthBoundary() (gas: 607993)\n[PASS] testStaleDelistedAndPausedValuesRevertWETHMayPause() (gas: 226551)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 604.12ms (1.11s CPU time)\n\nRan 19 tests for test/PayoutCap.t.sol:PayoutCapTest\n[PASS] testAdmissionLimits() (gas: 155147)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1925480)\n[PASS] testCapAtExactlyTheValueDoesNotSplitAndOneWeiBelowDoes() (gas: 2805447)\n[PASS] testCapBindsAndBuybackRelistsOnlyTheWonPortionWhileTheRemainderStaysDrawable() (gas: 3278096)\n[PASS] testCapBindsSplitsBagAndKeepPaysOnlyTheCappedPortion() (gas: 2515804)\n[PASS] testCapChangesAfterTheRequestDoNotRewriteTheCommittedSplit() (gas: 2746148)\n[PASS] testCapIsPerTokenAndAnUncappedTokenLeavesNothingBehind() (gas: 3298676)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1851783)\n[PASS] testFuzzCappedPayoutNeverExceedsCapAndTokensAreConserved(uint256,uint256,bool) (runs: 256, μ: 2143684, ~: 2112935)\nLogs:\n  Bound result 3100000000000000003\n  Bound result 3100000000000000\n\n[PASS] testGenesisAndFreeSpins() (gas: 1529439)\n[PASS] testGenesisPaidSpinSplit() (gas: 1191100)\n[PASS] testGenesisQuoteIsCappedAndTheSurplusStaysInTheVault() (gas: 2653355)\n[PASS] testImmatureBagsNotDrawable() (gas: 565594)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1573870)\n[PASS] testRegularSpinKeep() (gas: 2271343)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154551)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119457)\n[PASS] testSpinRules() (gas: 492329)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1220418)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 604.38ms (78.13ms CPU time)\n\nRan 12 tests for test/GoblinNFTV2.t.sol:GoblinNFTV2Test\n[PASS] testDeploymentOwnerIsExplicit() (gas: 13478470)\n[PASS] testFuzzMintWalletCap(uint256,uint256) (runs: 256, μ: 626454, ~: 652584)\nLogs:\n  Bound result 7\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 618.44ms (4.15s CPU time)\n\nRan 21 tests for test/BagGachaV2.t.sol:BagGachaV2Test\n[PASS] testAdmissionLimits() (gas: 155181)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1925359)\n[PASS] testCreditTransferFailureRollsBackAndReentryCannotPayTwice() (gas: 2166588)\n[PASS] testFeeOnTransferTokenCannotCreateUnderfundedBag() (gas: 1138055)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1851674)\n[PASS] testFreeSpinAfterRegularSnapshotAlwaysGenesis() (gas: 2608778)\n[PASS] testFreeSpinUnfundedGenesisCannotUseRegularBags() (gas: 2143294)\n[PASS] testFuzzSolventPayoutAndNoDoublePayment(uint256,uint256,bool) (runs: 256, μ: 1864928, ~: 1791222)\nLogs:\n  Bound result 26260462962377511967\n\n[PASS] testGenesisAndFreeSpins() (gas: 1529451)\n[PASS] testGenesisPaidSpinSplit() (gas: 1191031)\n[PASS] testImmatureBagsNotDrawable() (gas: 565628)\n[PASS] testMissingVRFKeepsSnapshotLockedWithoutRefundOrReroll() (gas: 1138828)\n[PASS] testOddsAndOracleChangesDoNotRewritePendingSnapshot() (gas: 2207128)\n[PASS] testOldVRFIdCannotFulfillNewPendingRequest() (gas: 2884162)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1573882)\n[PASS] testRegularSpinKeep() (gas: 2271286)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154563)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119491)\n[PASS] testSpinRules() (gas: 492341)\n[PASS] testUnavailableGenesisDoesNotBlockRegularDrawOrWithdrawal() (gas: 1706529)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1220447)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 618.53ms (66.83ms 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  | 974   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | claim    | 1041  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | deposit  | 1036  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | pull     | 1023  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | refund   | 1039  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | release  | 1002  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | renounce | 1006  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | review   | 1071  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 432\n  Bound result 7376\n  Bound result 8296\n  Bound result 6517\n  Bound result 10000\n  Bound result 23357\n  Bound result 7680000\n  Bound result 2560000\n  Bound result 591723997781607562\n  Bound result 1104756\n  Bound result 2125\n  Bound result 7220\n  Bound result 6251\n  Bound result 63459301729356075\n  Bound result 264337593543950336\n  Bound result 8325\n  Bound result 8773\n  Bound result 4831\n  Bound result 9304\n  Bound result 1072\n  Bound result 181505480512885668\n  Bound result 10000\n  Bound result 10000\n  Bound result 4412114\n  Bound result 10000\n  Bound result 828807581880953634\n  Bound result 10000\n  Bound result 960000\n  Bound result 5378\n  Bound result 9610\n  Bound result 6518\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.09s (1.02s 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         | 1647  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | bypass          | 1610  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | discount        | 1628  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | invalidProposal | 1631  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | replay          | 1676  | 0       | 0        |\n╰----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 214\n  Bound result 4\n  Bound result 918\n  Bound result 1900\n  Bound result 0\n  Bound result 14938\n  Bound result 2031\n  Bound result 4958\n  Bound result 573\n  Bound result 47104\n  Bound result 1045\n  Bound result 953\n  Bound result 458\n  Bound result 2150\n  Bound result 86397\n  Bound result 707\n  Bound result 3303\n  Bound result 922\n  Bound result 16067\n  Bound result 25\n  Bound result 6383\n  Bound result 1140\n  Bound result 905\n  Bound result 4\n  Bound result 49732\n  Bound result 65536\n  Bound result 811\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.18s (1.17s 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            | 714   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | changeAvailability | 775   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | changeCap          | 726   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | claim              | 745   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | draw               | 728   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | flush              | 759   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | fulfill            | 728   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | seal               | 752   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | settle             | 786   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | spin               | 745   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | withdrawBag        | 734   | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 197000000000000029055\n  Bound result 1391\n  Bound result 1\n  Bound result 197000000000000006340\n  Bound result 96423\n  Bound result 3611\n  Bound result 1\n  Bound result 1000000000000001\n  Bound result 101999999999999498\n  Bound result 23901\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 147490\n  Bound result 1\n  Bound result 1\n  Bound result 197000000000000019693\n  Bound result 15340\n  Bound result 51200\n  Bound result 197001000000000000001\n  Bound result 20673\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 197000000000000018254\n  Bound result 89600\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.47s (1.47s 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    | 1644  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | deposit  | 1657  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | mint     | 1568  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | refund   | 1686  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | transfer | 1637  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 19\n  Bound result 14\n  Bound result 18\n  Bound result 11\n  Bound result 11\n  Bound result 19\n  Bound result 13\n  Bound result 7\n  Bound result 19\n  Bound result 28\n  Bound result 16\n  Bound result 38\n  Bound result 12642\n  Bound result 13\n  Bound result 31\n  Bound result 21281\n  Bound result 26\n  Bound result 990000000000000000\n  Bound result 3\n  Bound result 35\n  Bound result 36\n  Bound result 20\n  Bound result 28\n  Bound result 21\n  Bound result 1\n  Bound result 8\n  Bound result 10\n  Bound result 27\n  Bound result 22\n  Bound result 695152979821493405\n  Bound result 17\n  Bound result 5166\n  Bound result 963543974525580112\n  Bound result 3\n  Bound result 20\n  Bound result 1\n  Bound result 15\n  Bound result 17\n  Bound result 16\n  Bound result 1000000000000000000\n  Bound result 48\n  Bound result 1\n  Bound result 5\n  Bound result 848540914823999692\n  Bound result 16\n  Bound result 52\n  Bound result 19\n  Bound result 1000000000000000000\n  Bound result 54\n  Bound result 64\n  Bound result 55\n  Bound result 2000000000000010\n  Bound result 336471470\n  Bound result 54\n  Bound result 4\n  Bound result 28\n  Bound result 56\n  Bound result 68\n  Bound result 37\n  Bound result 764117861508936441\n  Bound result 28\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.56s (9.55s CPU time)\n\nRan 21 test suites in 9.56s (18.73s CPU time): 138 tests passed, 0 failed, 2 skipped (140 total tests)\n","passed":true},{"durationMs":95,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"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\":381,\"foundry.toml\":14,\"remappings.txt\":2,\"report.md\":54,\"script/DeployGoblinNFT.s.sol\":13,\"src/BagGacha.sol\":906,\"src/Curator.sol\":405,\"src/GenesisVault.sol\":224,\"src/GoblinArt.sol\":235,\"src/GoblinNFT.sol\":334,\"src/GoldHook.sol\":403,\"src/IMDProtocol.sol\":19,\"src/OracleAttestation.sol\":221,\"src/POLManager.sol\":221,\"src/TickMath.sol\":77,\"src/TwapOracle.sol\":262,\"src/v4/V4Minimal.sol\":92,\"test/BagGacha.invariant.t.sol\":215,\"test/BagGacha.t.sol\":319,\"test/BagGachaV2.t.sol\":281,\"test/Curator.invariant.t.sol\":125,\"test/Curator.t.sol\":391,\"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\":113,\"test/GoldHook.t.sol\":387,\"test/OracleConsumerConformance.t.sol\":146,\"test/PayoutCap.t.sol\":279,\"test/TickMath.t.sol\":22,\"test/TwapOracle.t.sol\":191,\"test/fork/MainnetFork.t.sol\":90,\"test/fork/MainnetV4Fork.t.sol\":122,\"test/mocks/AdversarialMocks.sol\":42,\"test/mocks/CuratorMocks.sol\":139,\"test/mocks/Mocks.sol\":143,\"test/mocks/V4Fixture.sol\":104,\"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":15890,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/BagGacha.sol:870: BagGacha.flush() (src/BagGacha.sol#870-881) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/GoldHook.sol:269: GoldHook.flush() (src/GoldHook.sol#269-284) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/BagGacha.sol:504: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548) sends eth to arbitrary user\n[high/medium] reentrancy-eth at src/BagGacha.sol:504: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548):\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:328: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#328-344) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/BagGacha.sol:553: BagGacha._commitGenesis(bool) (src/BagGacha.sol#553-571) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BagGacha.sol:553: BagGacha._commitGenesis(bool) (src/BagGacha.sol#553-571) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:328: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#328-344) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:306: GoldHook._write(int24) (src/GoldHook.sol#306-317) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GoldHook.sol:328: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#328-344) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/POLManager.sol:188: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#188-207) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/BagGacha.sol:504: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548) uses a dangerous strict equality:\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:504: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548):\n[medium/medium] uninitialized-local at src/GoldHook.sol:205: GoldHook.beforeSwap(address,PoolKey,SwapParams,bytes).delta (src/GoldHook.sol#205) 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:282: BagGacha.setTierOdds(uint256[4]).sum (src/BagGacha.sol#282) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GoldHook.sol:221: GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes).tax (src/GoldHook.sol#221) 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:554: BagGacha._commitGenesis(bool).quoted (src/BagGacha.sol#554) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GoldHook.sol:222: GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes).unspecified (src/GoldHook.sol#222) is a local variable never initialized\n[medium/medium] unused-return at src/POLManager.sol:177: POLManager._buy(uint256,uint256,address) (src/POLManager.sol#177-186) ignores return value by poolManager.settle{value: uint256(uint128(- a0))}() (src/POLManager.sol#184)\n[medium/medium] unused-return at src/GoldHook.sol:297: GoldHook.observe(uint32[]) (src/GoldHook.sol#297-304) ignores return value by (None,tick) = V4Lib.slot0(poolManager,poolId) (src/GoldHook.sol#299)\n[medium/medium] unused-return at src/POLManager.sol:188: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#188-207) ignores return value by (sqrtPrice,None) = V4Lib.slot0(poolManager,V4Lib.poolId(poolKey())) (src/POLManager.sol#189)\n[medium/medium] unused-return at src/POLManager.sol:188: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#188-207) ignores return value by (delta,None) = poolManager.modifyLiquidity(poolKey(),ModifyLiquidityParams(TICK_LOWER,TICK_UPPER,int256(uint256(liquidity)),bytes32(0)),) (src/POLManager.sol#192-194)\n[medium/medium] unused-return at src/POLManager.sol:188: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#188-207) ignores return value by poolManager.settle() (src/POLManager.sol#204)\n[medium/medium] unused-return at src/GoldHook.sol:269: GoldHook.flush() (src/GoldHook.sol#269-284) ignores return value by poolManager.unlock(abi.encode(total)) (src/GoldHook.sol#279)\n[medium/medium] unused-return at src/TwapOracle.sol:200: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#200-216) ignores return value by (sqrtPrice,None) = goldHook.slot0() (src/TwapOracle.sol#203)\n[medium/medium] unused-return at src/POLManager.sol:188: POLManager._addFullRange(uint256,uint256) (src/POLManager.sol#188-207) ignores return value by poolManager.settle{value: ethUsed}() (src/POLManager.sol#200)\n[medium/medium] unused-return at src/GoldHook.sol:197: GoldHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/GoldHook.sol#197-211) ignores return value by (None,tick) = V4Lib.slot0(poolManager,poolId) (src/GoldHook.sol#203)\n[low/medium] calls-loop at src/BagGacha.sol:393: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#393-427) has external calls inside a loop: value += oracle.valueInEth(tokens[i],amounts[i]) (src/BagGacha.sol#403)\n[low/medium] calls-loop at src/BagGacha.sol:393: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#393-427) has external calls inside a loop: IERC20(tokens[i_scope_0]).balanceOf(address(this)) - beforeBalance != amounts[i_scope_0] (src/BagGacha.sol#424)\n[low/medium] calls-loop at src/BagGacha.sol:585: BagGacha._buildSnapshot() (src/BagGacha.sol#585-635) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#594-599)\n[low/medium] calls-loop at src/BagGacha.sol:393: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#393-427) has external calls inside a loop: amounts[i] < 1 || ! oracle.isPriced(tokens[i]) (src/BagGacha.sol#399)\n[low/medium] calls-loop at src/BagGacha.sol:319: BagGacha.bagPayout(uint256) (src/BagGacha.sol#319-340) has external calls inside a loop: (v,cap) = oracle.valueAndCap(b.tokens[i],full) (src/BagGacha.sol#329)\n[low/medium] calls-loop at src/BagGacha.sol:309: BagGacha.bagValue(uint256) (src/BagGacha.sol#309-314) has external calls inside a loop: v += oracle.valueInEth(b.tokens[i],b.amounts[i]) (src/BagGacha.sol#312)\n[low/medium] calls-loop at src/BagGacha.sol:585: BagGacha._buildSnapshot() (src/BagGacha.sol#585-635) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#594-599)\n[low/medium] calls-loop at src/BagGacha.sol:585: BagGacha._buildSnapshot() (src/BagGacha.sol#585-635) has external calls inside a loop: (got,full,amounts,capped) = this.bagPayout(id) (src/BagGacha.sol#594-599)\n[low/medium] calls-loop at src/BagGacha.sol:393: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#393-427) has external calls inside a loop: beforeBalance = IERC20(tokens[i_scope_0]).balanceOf(address(this)) (src/BagGacha.sol#422)\n[low/medium] reentrancy-benign at src/BagGacha.sol:504: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548):\n[low/medium] reentrancy-benign at src/POLManager.sol:137: Reentrancy in POLManager.addLiquidity(uint256) (src/POLManager.sol#137-151):\n[low/medium] reentrancy-benign at src/POLManager.sol:123: Reentrancy in POLManager.buyAndBurn(uint256) (src/POLManager.sol#123-133):\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-benign at src/GoldHook.sol:269: Reentrancy in GoldHook.flush() (src/GoldHook.sol#269-284):\n[low/medium] reentrancy-events at src/GoldHook.sol:214: Reentrancy in GoldHook.afterSwap(address,PoolKey,SwapParams,int256,bytes) (src/GoldHook.sol#214-249):\n[low/medium] timestamp at src/BagGacha.sol:468: BagGacha.holderSpin(uint256) (src/BagGacha.sol#468-475) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:347: GoldHook._surroundings(uint32) (src/GoldHook.sol#347-371) 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/BagGacha.sol:431: BagGacha.withdraw(uint256) (src/BagGacha.sol#431-456) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:715: BagGacha._select(uint256) (src/BagGacha.sol#715-734) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:279: BagGacha.setTierOdds(uint256[4]) (src/BagGacha.sol#279-293) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:585: BagGacha._buildSnapshot() (src/BagGacha.sol#585-635) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:112: GenesisVault.quote(bool) (src/GenesisVault.sol#112-134) 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/Curator.sol:329: Curator.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/Curator.sol#329-359) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:478: BagGacha.freeSpin(uint256) (src/BagGacha.sol#478-490) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:504: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#504-548) uses timestamp for comparisons\n[low/medium] timestamp at src/TwapOracle.sol:200: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#200-216) 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/GoldHook.sol:306: GoldHook._write(int24) (src/GoldHook.sol#306-317) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:764: BagGacha.choose(uint256,bool) (src/BagGacha.sol#764-770) 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:150: GoldHook.buyTaxBps() (src/GoldHook.sol#150-157) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:328: GoldHook._observeSingle(uint32,uint32,int24) (src/GoldHook.sol#328-344) uses timestamp for comparisons\n[low/medium] timestamp at src/TwapOracle.sol:181: TwapOracle._checkPool(address,address) (src/TwapOracle.sol#181-196) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:204: GenesisVault.pendingDividends(address) (src/GenesisVault.sol#204-212) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:773: BagGacha.finalize(uint256) (src/BagGacha.sol#773-778) uses timestamp for comparisons\n[low/medium] timestamp at src/GoldHook.sol:393: GoldHook._checkBuyCap(uint256) (src/GoldHook.sol#393-397) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:214: GenesisVault.claimDividends() (src/GenesisVault.sol#214-223) uses timestamp for comparisons\n[low/medium] timestamp at src/GenesisVault.sol:177: GenesisVault._accrue() (src/GenesisVault.sol#177-186) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:553: BagGacha._commitGenesis(bool) (src/BagGacha.sol#553-571) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:639: BagGacha.rawFulfillRandomWords(uint256,uint256[]) (src/BagGacha.sol#639-645) 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:461: BagGacha.spin() (src/BagGacha.sol#461-465) 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","passed":true},{"durationMs":870,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/GoldHook.sol:35: Contract locks Ether without a withdraw function (2 places)\n[high] eth-send-unchecked-address at src/BagGacha.sol:847: 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:399: Reentrancy: State change after external call (16 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:590: Costly operations inside loop (4 places)\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:80: Large Numeric Literal (12 places)\n[low] literal-instead-of-constant at src/BagGacha.sol:279: Literal Instead of Constant (297 places)\n[low] local-variable-shadowing at src/GoldHook.sol:41: Local Variable Shadows State Variable\n[low] missing-inheritance at src/TwapOracle.sol:43: Missing Inheritance\n[low] require-revert-in-loop at src/BagGacha.sol:283: Loop Contains `require`/`revert` (9 places)\n[low] state-change-without-event at src/POLManager.sol:155: State Change Without Event\n[low] state-variable-could-be-immutable at src/BagGacha.sol:86: State Variable Could Be Immutable (8 places)\n[low] storage-array-length-not-cached at src/BagGacha.sol:590: Storage Array Length not Cached (2 places)\n[low] unchecked-return at src/GoldHook.sol:279: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/BagGacha.sol:283: 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:309: Public Function Not Used Internally (8 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0552a28ab85667de594a6bf9469cb9958d18824ff22e9f028310db927f3abaf6","verifiedTreeHash":"4966018f9373e43ec9e8400b3de1b86e20e7cdae","verifierVersion":"0.1.0+7129bf9d"}]}