{"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":"2bd6820b-c575-45aa-b63a-d2d1a360eb71","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"fbadca01bee6bfeddd197473065d0bcf8e3b932afb5902a32c7308b94cdb5448","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: port the gacha to an IMD Uniswap v4 genesis token. GoblinNFT is already deployed on Ethereum at 0xC5d5F314da6d4a433F9BF897a2cC24A537576cB1 from identity-md-launches/launch-1616-goblin-gold-nft-mint commit dbd66796c56c6df8ab9b5d58686b86ef1111ae5d: copy that exact src/GoblinNFT.sol into this repo (deferred revenue until release) and never change it again; every gacha contract uses that address as the NFT.\n\nGenesis token: the project token will be launched later through IMD as univ4_hook, paired with ETH, platform pool fee 12500 and tick spacing 60, constructor placeholders $poolManager, $token, $factory. The paying wallet 0xA7e99BB7155D7477E0C838E201b16E62B9c0b5Ac receives the platform 1% via LaunchFactory.claimFees.\n\nBuild:\n1. GoldHook (the univ4_hook contract): no owner. Records a TWAP observation ring for the GOLD/ETH pool (cumulative tick per block, observe(secondsAgos)); initialized only by $factory in the launch transaction; rejects other pools. Takes a 1% hook fee in ETH on every swap on top of the platform fee: 50% goes to holders through GoblinNFT 0xC5d5F314da6d4a433F9BF897a2cC24A537576cB1 depositRevenue() (pooled there until NFT release), 50% to the BagGacha reward reserve. Because BagGacha does not exist at token launch, the reserve share accrues in the hook until a one-time permissionless bindGacha(gacha) that accepts only a BagGacha whose creation code hash is pinned in the hook and whose genesis token and NFT match; after binding, anyone can flush. Anti-snipe launch tax on buys: 90% for the first 10 minutes, 50% for 10-20, 25% for 20-30 minutes, then 0, 100% to the gacha reward reserve share; max 0.5 ETH per buy in the first hour. Fees are flushed in batches, never inside the swap path beyond accounting.\n2. TwapOracle: two sources. Regular Bags keep canonical Uniswap v3 WETH pools (unchanged rules: 50 ETH per side, both windows). The genesis token is priced only from GoldHook observations with the same min(30m, 4h) windows and a depth check against the v4 pool liquidity.\n3. POLManager: add liquidity, buy and burn through the v4 PoolManager (unlock callback) on the GOLD/ETH pool with GoldHook; full range; positions permanently held; no v3 router or position manager.\n4. Launch order with no owner custody where possible: launch 1 = token + GoldHook (remainder to the paying wallet, which funds GenesisVault in one public transaction right after launch 2); launch 2 = TwapOracle, GenesisVault, BagGacha, Curator, POLManager with $contract references; then the NFT owner calls setLaunchTargets(POLManager, BagGacha, BagGacha). If a safer ordering without wallet custody is possible on IMD (remainderTo a predictable vault), implement and explain it.\n5. Keep everything else from v2: ownerless Curator via the IMD oracle, bounded changes, VRF, free spins only after release, 32 Bags, Genesis schedule and splits.\n\nWrite runbook objectives for launch 1 and launch 2 with exact constructor words, using only $poolManager, $token, $factory, $contract:Name placeholders and never IMD protocol addresses as literal words.\n\nTests: unit, invariant and fork tests (v4 PoolManager on mainnet fork if an archive RPC works); all must pass with FOUNDRY_VIA_IR=false FOUNDRY_BYTECODE_HASH=none. Do not change foundry.toml.","parentJobId":"d4f999f1-e09e-4506-9e6c-d91d0fd25258","planHash":"53d1125632260941f50946566192ec4200273fc8f7a41206d7cdc2655ff4f241","previousHash":"f4c6e759220725b47796fafacd085577bb18829a3ad9c1f816268f7a8498ba91","projectId":"9bf411ca-2719-4cab-b2a3-badcf83ed8d4","publication":{"commit":"c59741e28ff5212a09446bc54a9022cec79d2044","deliveredAt":"2026-10-13T20:04:00.485Z","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":"cee9b937c8c5d8ca7f54f726f06aa1228f72d6924332a2e9d79d46b0a3c0736e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"5b445e93273fb45a8aa02ad091a5539c0122a66260f4cf45dd64bc9fd0f30909","device":"9e51ef2afd7c2af8","findings":[],"hash":"fbadca01bee6bfeddd197473065d0bcf8e3b932afb5902a32c7308b94cdb5448","nodeId":"ce95c7f5-499e-4faa-92dd-4860d6c0251c","outcome":"completed","summary":"Goblin Gold v3 is implemented, tested and documented. Nothing was deployed.\n\n**What was built**\n\n- `src/GoblinNFT.sol` is now the byte-identical file from launch-1616 commit dbd66796. It differs from the v2 source: pre-release revenue is pooled and split at release. All existing NFT and gacha tests were adapted to that deployed behaviour.\n- `src/GoldHook.sol` is the ownerless univ4_hook contract: factory-only initialization of the ETH/GOLD 12500/60 pool, a v3-style observation ring with `observe`, a 1% ETH hook fee split half to GoblinNFT holders and half to the gacha reserve, the 90/50/25% buy tax for 30 minutes with the 0.5 ETH per-buy cap for the first hour, accounting-only swap path through ERC6909 claims, batched permissionless flush, and a one-time `bindGacha` that accepts only a BagGacha with the pinned code hash, the deployed NFT and the genesis token.\n- `src/TwapOracle.sol` prices GOLD only from the hook ring with the same windows, staleness and a 50 ETH depth bound on v4 active liquidity, and refuses any v3 pool for it. Regular Bags are unchanged.\n- `src/POLManager.sol` now works through the v4 PoolManager unlock callback with fee-aware slippage limits and full-range positions that no function can remove.\n- `src/BagGacha.sol` keeps its logic but stores wiring in constructor-set storage instead of immutables, so every deployment shares one runtime code hash. The pinned hash in the hook matches the launch-profile build and is checked by a test.\n- Uniswap v4-core is vendored for tests only under `test/v4-core/`. The `src/` tree compiles against a small ABI-identical shim and has no new dependency.\n\n**Checks**\n\n| Check | Result |\n|---|---|\n| Launch profile build and tests (via_ir false, bytecode_hash none) | 113 passed, 2 fork tests skipped offline |\n| Default foundry.toml profile build and tests | 113 passed |\n| Verifier fuzz seed run | passed |\n| forge fmt --check | passed |\n| Fork tests on the live Ethereum PoolManager and deployed GoblinNFT via a public RPC | all 3 passed |\n\n**Documentation**\n\nThe README has the runbook for launch 1 and launch 2 with exact constructor words using only the allowed placeholders, the safer remainder-to-hook variant with its rationale, after-launch steps, operational duties, assumptions and open items. The report records the checks and design decisions.\n\n**Two things to decide before launch**\n\n- The Curator still takes the IMD Intake and payment asset as constructor words because no placeholder exists for them. If the manifest refuses literal protocol addresses, those two become constants in a small follow-up.\n- Whether IMD accepts the remainder going to the GoldHook contract. If it does, no wallet ever holds the genesis supply.","treeHash":"988bda3d879173cf5a61cba159dc2867bb0899c2","usage":{"cachedInputTokens":6377102,"inputTokens":1410,"model":"claude-fable-5-1","outputTokens":96403,"runtime":"claude","turns":59,"wallClockMs":1577836}}],"verification":[{"checks":[{"durationMs":104099,"exitCode":0,"name":"build","output":"Compiling 144 files with Solc 0.8.26\nSolc 0.8.26 finished in 103.98s\nCompiler run successful!\n","passed":true},{"durationMs":10165,"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 213.20µs (85.78µ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 335.63µ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 296.15µs (0.00ns CPU time)\n\nRan 2 tests for test/BagGachaV2.t.sol:EarlyGachaTest\n[PASS] testDayOneRevenueBeforeSelloutAndMintRemainsRefundable() (gas: 1216613)\n[PASS] testPreReleaseRefundCannotRecycleFreeSpinCoupons() (gas: 332626)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.60ms (740.26µs CPU time)\n\nRan 13 tests for test/GoldHook.t.sol:GoldHookTest\n[PASS] testConstructorRejectsZeroAndFlagsAreTheRequiredSet() (gas: 8650)\n[PASS] testExactInputBuyPaysFeeAndLaunchTaxOnTheEthInput() (gas: 302507)\n[PASS] testExactOutputBuyCapCountsFeeAndTax() (gas: 138793)\n[PASS] testExactOutputBuyChargesFeeAndTaxOnTopOfTheEthConsumed() (gas: 313053)\n[PASS] testFlushBeforeBindPaysHoldersOnlyAndBindRequiresPinnedCode() (gas: 1500033)\n[PASS] testFuzzFeeSplitInvariantOnBuys(uint256,uint256) (runs: 256, μ: 348233, ~: 349023)\nLogs:\n  Bound result 380254467596404505\n  Bound result 1683\n\n[PASS] testGenesisPricingStaleAndThinChecks() (gas: 3047888)\n[PASS] testInitializeOnlyByFactoryOnlyPlatformPoolOnlyOnce() (gas: 2493507)\n[PASS] testObserveTracksTickCumulativeAndTwapOraclePricesGenesisFromHook() (gas: 806080)\n[PASS] testPOLManagerBuyAndBurnAndFullRangeLiquidityHeldForever() (gas: 1172367)\n[PASS] testPinnedGachaRuntimeCodeHash() (gas: 19771)\nLogs:\n  BagGacha runtime code hash (this build): 0x413823414078d2de9f35b39b7c35cb41fec304466f7acd28a593450bbf37a316\n  constant differs: expected only outside the FOUNDRY_VIA_IR=false FOUNDRY_BYTECODE_HASH=none profile\n\n[PASS] testSellsPayOnePercentOfEthOutAndNoTax() (gas: 656780)\n[PASS] testTaxScheduleAndBuyCap() (gas: 932549)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 61.91ms (67.63ms CPU time)\n\nRan 1 test for test/GasBench.t.sol:GasBenchTest\n[PASS] testMaximumInventorySnapshotGas() (gas: 8597784)\nLogs:\n  32 Bags / 128 distinct pools request gas (mock observe): 7927055\n  32 Bag draw gas: 411579\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 169.77ms (12.74ms 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  | 200   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | bind     | 175   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | buy      | 195   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | flush    | 180   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| HookHandler | sell     | 210   | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4999999999000006089\n  Bound result 999999000008190\n  Bound result 470000000000000000\n  Bound result 665\n  Bound result 1936155307300819042\n  Bound result 1096\n  Bound result 847\n  Bound result 499999999000012485\n  Bound result 49999999950001\n  Bound result 256\n  Bound result 999999004194305\n  Bound result 4999999999000008854\n  Bound result 1095216660481\n  Bound result 1655999998344\n  Bound result 999999000018966\n  Bound result 4999999999000000545\n  Bound result 4999999999046656001\n  Bound result 499999999000016422\n  Bound result 999999000000391\n  Bound result 610\n  Bound result 408134099380907742\n  Bound result 459\n  Bound result 800\n  Bound result 4342132545616798759\n  Bound result 667190476217404\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 218.47ms (213.29ms CPU time)\n\nRan 14 tests for test/Curator.t.sol:CuratorTest\n[PASS] testApproveStoreThenPermissionlessExecuteAndReplay() (gas: 1510459)\n[PASS] testConsumedOracleUuidCannotApproveSecondRequest() (gas: 1872009)\n[PASS] testCrossContractAndCrossChainSignaturesRejected() (gas: 4405853)\n[PASS] testDirectSettersAndOutsideBoundsRejected() (gas: 185588)\n[PASS] testFuzzDiscountBounds(uint256) (runs: 256, μ: 465737, ~: 44189)\nLogs:\n  Bound result 1899\n\n[PASS] testLiquidityRecheckedAtExecutionAndCanonicalPoolRequired() (gas: 2382849)\n[PASS] testNoAnswerFailureAndTimeoutDoNotChangeSettings() (gas: 2437128)\n[PASS] testOddsRelativeTenPercentAndRollingDay() (gas: 3140173)\n[PASS] testPoolWhitelistDelistPauseAndUnpauseOnlyByApprovedAction() (gas: 4038254)\n[PASS] testProductionPinsTheRequiredSignerAndHasNoOwner() (gas: 97668)\n[PASS] testProposeReentrancyCannotOpenNestedRequest() (gas: 1381359)\n[PASS] testStaleConcurrentApprovalAndExpiredExecutionCannotChangeSettings() (gas: 2650932)\n[PASS] testWeakPanelExpiredFutureAndStaleAnswersRejected() (gas: 1580611)\n[PASS] testWrongSenderUnknownIdWrongQuestionAndTampering() (gas: 1433712)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 229.95ms (51.15ms CPU time)\n\nRan 21 tests for test/BagGachaV2.t.sol:BagGachaV2Test\n[PASS] testAdmissionLimits() (gas: 154896)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1888836)\n[PASS] testCreditTransferFailureRollsBackAndReentryCannotPayTwice() (gas: 2135274)\n[PASS] testFeeOnTransferTokenCannotCreateUnderfundedBag() (gas: 1137911)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1820448)\n[PASS] testFreeSpinAfterRegularSnapshotAlwaysGenesis() (gas: 2568936)\n[PASS] testFreeSpinUnfundedGenesisCannotUseRegularBags() (gas: 2104468)\n[PASS] testFuzzSolventPayoutAndNoDoublePayment(uint256,uint256,bool) (runs: 256, μ: 1846578, ~: 1897689)\nLogs:\n  Bound result 197000000000000001801\n\n[PASS] testGenesisAndFreeSpins() (gas: 1496915)\n[PASS] testGenesisPaidSpinSplit() (gas: 1166050)\n[PASS] testImmatureBagsNotDrawable() (gas: 543142)\n[PASS] testMissingVRFKeepsSnapshotLockedWithoutRefundOrReroll() (gas: 1112052)\n[PASS] testOddsAndOracleChangesDoNotRewritePendingSnapshot() (gas: 2173475)\n[PASS] testOldVRFIdCannotFulfillNewPendingRequest() (gas: 2836537)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1542634)\n[PASS] testRegularSpinKeep() (gas: 2239604)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154563)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119475)\n[PASS] testSpinRules() (gas: 492163)\n[PASS] testUnavailableGenesisDoesNotBlockRegularDrawOrWithdrawal() (gas: 1675259)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1219574)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 305.93ms (93.19ms CPU time)\n\nRan 12 tests for test/BagGacha.t.sol:BagGachaTest\n[PASS] testAdmissionLimits() (gas: 154774)\n[PASS] testBuybackReturnsBagAndRematures() (gas: 1888610)\n[PASS] testFinalizeAfterWindowIsKeep() (gas: 1820373)\n[PASS] testGenesisAndFreeSpins() (gas: 1496764)\n[PASS] testGenesisPaidSpinSplit() (gas: 1165843)\n[PASS] testImmatureBagsNotDrawable() (gas: 543020)\n[PASS] testOneOutstandingDrawAndCallbackRules() (gas: 1542600)\n[PASS] testRegularSpinKeep() (gas: 2239413)\n[PASS] testRejectsUnexpectedEthAndEmptyCredit() (gas: 154551)\n[PASS] testReserveTooLowBlocksSpins() (gas: 119309)\n[PASS] testSpinRules() (gas: 492020)\n[PASS] testWithdrawExitFeeAndUnpricedExitFree() (gas: 1219330)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 382.16ms (24.12ms CPU time)\n\nRan 5 tests for test/TwapOracle.t.sol:TwapOracleTest\n[PASS] testDonationsAndInactiveLiquidityCannotSatisfyTheLiquidityBound() (gas: 288725)\n[PASS] testFuzzFiftyEthBoundary(uint256) (runs: 256, μ: 145877, ~: 127085)\nLogs:\n  Bound result 8922951310847997020\n\n[PASS] testInsufficientWETHSideAndTokenSideAndMissingHistory() (gas: 443370)\n[PASS] testMinOfBothTWAPsAndReverseQuote() (gas: 321231)\n[PASS] testStaleDelistedAndPausedValuesRevertWETHMayPause() (gas: 226182)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 466.73ms (230.71ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 1179802)\n[PASS] test_acceptsTheProtocolSignature() (gas: 75750)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3894)\n[PASS] test_digestMatchesTheProtocol() (gas: 13545)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 487.27ms (8.62ms 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 505.50ms (1.93s CPU time)\n\nRan 10 tests for test/GoblinNFTDeployed.t.sol:GoblinNFTDeployedTest\n[PASS] testFuzzDeferredRevenueConservation(uint256,uint256,uint256) (runs: 256, μ: 900980, ~: 907580)\nLogs:\n  Bound result 20\n  Bound result 3\n  Bound result 15\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 528.07ms (2.63s CPU time)\n\nRan 12 tests for test/GoblinNFTV2.t.sol:GoblinNFTV2Test\n[PASS] testDeploymentOwnerIsExplicit() (gas: 13478470)\n[PASS] testFuzzMintWalletCap(uint256,uint256) (runs: 256, μ: 622477, ~: 663180)\nLogs:\n  Bound result 19\n  Bound result 12\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 535.06ms (3.59s CPU time)\n\nRan 5 tests for test/GenesisVault.t.sol:GenesisVaultTest\n[PASS] testDividendsAndGenesisClaimsRemainSolventAndCannotPayTwice() (gas: 583212)\n[PASS] testFuzzCurveBounds(uint256,uint256,uint256,bool) (runs: 256, μ: 247989, ~: 246046)\nLogs:\n  Bound result 179\n  Bound result 17775110\n  Bound result 703\n\n[PASS] testHugeQuoteCappedAtThreeDaysAndReopensWithSchedule() (gas: 236941)\n[PASS] testNotStartedUnfundedAndProtectedEntryPoints() (gas: 184742)\n[PASS] testScheduleDecayAndDiscountLimits() (gas: 444948)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 534.96ms (35.24ms 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  | 1078  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | claim    | 1017  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | deposit  | 1054  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | pull     | 1014  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | refund   | 1073  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | release  | 945   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | renounce | 1002  | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| EscrowHandler | review   | 1009  | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000\n  Bound result 9999\n  Bound result 1627\n  Bound result 5962\n  Bound result 529035837012967424\n  Bound result 5943\n  Bound result 300000000000000\n  Bound result 2622975\n  Bound result 14168265001\n  Bound result 2583\n  Bound result 716999909707453369\n  Bound result 2307\n  Bound result 8272295\n  Bound result 1536\n  Bound result 8143354\n  Bound result 5000\n  Bound result 365635243856090616\n  Bound result 8265727\n  Bound result 3626188\n  Bound result 450781044056362328\n  Bound result 102000000000000000\n  Bound result 8639998\n  Bound result 2345\n  Bound result 7296\n  Bound result 3\n  Bound result 8020128\n  Bound result 1000\n  Bound result 457641377852805220\n  Bound result 1\n  Bound result 3\n  Bound result 81\n  Bound result 3600\n  Bound result 6000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 990.68ms (931.20ms 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         | 1610  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | bypass          | 1718  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | discount        | 1645  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | invalidProposal | 1586  | 0       | 0        |\n|----------------+-----------------+-------+---------+----------|\n| CuratorHandler | replay          | 1633  | 0       | 0        |\n╰----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1202\n  Bound result 0\n  Bound result 754\n  Bound result 931\n  Bound result 2305\n  Bound result 22872\n  Bound result 0\n  Bound result 5645\n  Bound result 1091\n  Bound result 456\n  Bound result 63646\n  Bound result 346\n  Bound result 695\n  Bound result 0\n  Bound result 2500\n  Bound result 60\n  Bound result 6153\n  Bound result 0\n  Bound result 48\n  Bound result 545\n  Bound result 1014\n  Bound result 19200\n  Bound result 833\n  Bound result 1088\n  Bound result 100\n  Bound result 7063\n  Bound result 1156\n  Bound result 3973\n  Bound result 27503\n  Bound result 64000\n  Bound result 1109\n  Bound result 30\n  Bound result 898\n  Bound result 653\n  Bound result 372\n  Bound result 0\n  Bound result 260\n  Bound result 1197\n  Bound result 2657\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.20s (1.19s 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            | 797   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | changeAvailability | 788   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | claim              | 822   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | draw               | 823   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | flush              | 811   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | fulfill            | 850   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | seal               | 829   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | settle             | 817   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | spin               | 858   | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| GachaHandler | withdrawBag        | 797   | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 197000000000000002692\n  Bound result 197000000000000009289\n  Bound result 91\n  Bound result 197000000000000017428\n  Bound result 1100\n  Bound result 32958999603826345843\n  Bound result 61663772217934100130\n  Bound result 1\n  Bound result 197000000000000003293\n  Bound result 49000000000000000000\n  Bound result 1\n  Bound result 170918762781520890593\n  Bound result 2\n  Bound result 96000\n  Bound result 197000000000000019611\n  Bound result 1\n  Bound result 145862\n  Bound result 7082\n  Bound result 3\n  Bound result 20194\n  Bound result 19200\n  Bound result 1\n  Bound result 3\n  Bound result 120621\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.50s (1.50s 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    | 1655  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | deposit  | 1623  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | mint     | 1639  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | refund   | 1657  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| NFTHandler | transfer | 1618  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4194304\n  Bound result 247067953537247501\n  Bound result 1\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 15\n  Bound result 16\n  Bound result 14\n  Bound result 15\n  Bound result 1000000000000000000\n  Bound result 14\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 816517032075149313\n  Bound result 12\n  Bound result 21\n  Bound result 44\n  Bound result 4\n  Bound result 50\n  Bound result 1\n  Bound result 47\n  Bound result 13\n  Bound result 794768859126392431\n  Bound result 303504770\n  Bound result 20\n  Bound result 14\n  Bound result 24\n  Bound result 2000000000000000\n  Bound result 5\n  Bound result 25\n  Bound result 17\n  Bound result 9000\n  Bound result 40\n  Bound result 24\n  Bound result 44\n  Bound result 19\n  Bound result 12488\n  Bound result 86400\n  Bound result 38\n  Bound result 33\n  Bound result 60\n  Bound result 1725540767\n  Bound result 1\n  Bound result 26\n  Bound result 12000000\n  Bound result 58\n  Bound result 59\n  Bound result 20\n  Bound result 19\n  Bound result 171512101879684304\n  Bound result 64\n  Bound result 65\n  Bound result 66\n  Bound result 9\n  Bound result 76\n  Bound result 4\n  Bound result 96\n  Bound result 6\n  Bound result 15\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.01s (10.01s CPU time)\n\nRan 20 test suites in 10.01s (18.13s CPU time): 113 tests passed, 0 failed, 2 skipped (115 total tests)\n","passed":true},{"durationMs":128,"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\":319,\"foundry.toml\":14,\"remappings.txt\":2,\"report.md\":57,\"script/DeployGoblinNFT.s.sol\":13,\"src/BagGacha.sol\":825,\"src/Curator.sol\":393,\"src/GenesisVault.sol\":224,\"src/GoblinArt.sol\":235,\"src/GoblinNFT.sol\":334,\"src/GoldHook.sol\":403,\"src/OracleAttestation.sol\":221,\"src/POLManager.sol\":221,\"src/TickMath.sol\":77,\"src/TwapOracle.sol\":226,\"src/v4/V4Minimal.sol\":92,\"test/BagGacha.invariant.t.sol\":209,\"test/BagGacha.t.sol\":319,\"test/BagGachaV2.t.sol\":281,\"test/Curator.invariant.t.sol\":125,\"test/Curator.t.sol\":359,\"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\":347,\"test/OracleConsumerConformance.t.sol\":140,\"test/TickMath.t.sol\":22,\"test/TwapOracle.t.sol\":93,\"test/fork/MainnetFork.t.sol\":90,\"test/fork/MainnetV4Fork.t.sol\":122,\"test/mocks/AdversarialMocks.sol\":42,\"test/mocks/CuratorMocks.sol\":138,\"test/mocks/Mocks.sol\":132,\"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":14575,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/BagGacha.sol:460: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#460-517) 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:790: BagGacha.flush() (src/BagGacha.sol#790-801) sends eth to arbitrary user\n[high/medium] reentrancy-eth at src/BagGacha.sol:460: Reentrancy in BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#460-517):\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:460: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#460-517) 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/medium] reentrancy-no-eth at src/Curator.sol:145: Reentrancy in Curator.propose(Curator.Kind,bytes,Curator.Window,bytes32,uint256) (src/Curator.sol#145-172):\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:202: Curator._validate(Curator.Kind,bytes).token (src/Curator.sol#202) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BagGacha.sol:264: BagGacha.setTierOdds(uint256[4]).sum (src/BagGacha.sol#264) 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/BagGacha.sol:470: BagGacha._request(address,uint256,uint256,bool,bool).gTokens (src/BagGacha.sol#470) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Curator.sol:217: Curator._validate(Curator.Kind,bytes).sum (src/Curator.sol#217) 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:164: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#164-184) ignores return value by (sqrtPrice,None) = goldHook.slot0() (src/TwapOracle.sol#167)\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:529: BagGacha._buildSnapshot() (src/BagGacha.sol#529-577) has external calls inside a loop: got = this.bagValue(id) (src/BagGacha.sol#537-541)\n[low/medium] calls-loop at src/BagGacha.sol:529: BagGacha._buildSnapshot() (src/BagGacha.sol#529-577) has external calls inside a loop: got = this.bagValue(id) (src/BagGacha.sol#537-541)\n[low/medium] calls-loop at src/BagGacha.sol:349: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#349-383) has external calls inside a loop: IERC20(tokens[i_scope_0]).balanceOf(address(this)) - beforeBalance != amounts[i_scope_0] (src/BagGacha.sol#380)\n[low/medium] calls-loop at src/BagGacha.sol:349: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#349-383) has external calls inside a loop: value += oracle.valueInEth(tokens[i],amounts[i]) (src/BagGacha.sol#359)\n[low/medium] calls-loop at src/BagGacha.sol:349: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#349-383) has external calls inside a loop: beforeBalance = IERC20(tokens[i_scope_0]).balanceOf(address(this)) (src/BagGacha.sol#378)\n[low/medium] calls-loop at src/BagGacha.sol:349: BagGacha.seal(address[],uint256[]) (src/BagGacha.sol#349-383) has external calls inside a loop: amounts[i] < 1 || ! oracle.isPriced(tokens[i]) (src/BagGacha.sol#355)\n[low/medium] calls-loop at src/BagGacha.sol:291: BagGacha.bagValue(uint256) (src/BagGacha.sol#291-296) has external calls inside a loop: v += oracle.valueInEth(b.tokens[i],b.amounts[i]) (src/BagGacha.sol#294)\n[low/medium] calls-loop at src/BagGacha.sol:529: BagGacha._buildSnapshot() (src/BagGacha.sol#529-577) has external calls inside a loop: got = this.bagValue(id) (src/BagGacha.sol#537-541)\n[low/medium] reentrancy-benign at src/Curator.sol:145: Reentrancy in Curator.propose(Curator.Kind,bytes,Curator.Window,bytes32,uint256) (src/Curator.sol#145-172):\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/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:693: BagGacha.finalize(uint256) (src/BagGacha.sol#693-698) 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/BagGacha.sol:684: BagGacha.choose(uint256,bool) (src/BagGacha.sol#684-690) 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:112: GenesisVault.quote(bool) (src/GenesisVault.sol#112-134) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:529: BagGacha._buildSnapshot() (src/BagGacha.sol#529-577) 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/TwapOracle.sol:150: TwapOracle._checkPool(address,address) (src/TwapOracle.sol#150-160) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:581: BagGacha.rawFulfillRandomWords(uint256,uint256[]) (src/BagGacha.sol#581-587) uses timestamp for comparisons\n[low/medium] timestamp at src/Curator.sol:317: Curator.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/Curator.sol#317-347) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:261: BagGacha.setTierOdds(uint256[4]) (src/BagGacha.sol#261-275) 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:417: BagGacha.spin() (src/BagGacha.sol#417-421) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:635: BagGacha._select(uint256) (src/BagGacha.sol#635-654) uses timestamp for comparisons\n[low/medium] timestamp at src/TwapOracle.sol:164: TwapOracle._checkGenesisPool() (src/TwapOracle.sol#164-184) 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/Curator.sol:373: Curator.execute(uint256) (src/Curator.sol#373-392) 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/GenesisVault.sol:204: GenesisVault.pendingDividends(address) (src/GenesisVault.sol#204-212) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:387: BagGacha.withdraw(uint256) (src/BagGacha.sol#387-412) 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:434: BagGacha.freeSpin(uint256) (src/BagGacha.sol#434-446) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:424: BagGacha.holderSpin(uint256) (src/BagGacha.sol#424-431) uses timestamp for comparisons\n[low/medium] timestamp at src/Curator.sol:364: Curator.clear(uint256) (src/Curator.sol#364-371) uses timestamp for comparisons\n[low/medium] timestamp at src/BagGacha.sol:460: BagGacha._request(address,uint256,uint256,bool,bool) (src/BagGacha.sol#460-517) 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":903,"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:767: 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:355: 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:533: Costly operations inside loop (3 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:74: Large Numeric Literal (11 places)\n[low] literal-instead-of-constant at src/BagGacha.sol:261: Literal Instead of Constant (298 places)\n[low] local-variable-shadowing at src/GoldHook.sol:41: Local Variable Shadows State Variable\n[low] missing-inheritance at src/TwapOracle.sol:41: Missing Inheritance\n[low] require-revert-in-loop at src/BagGacha.sol:265: 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:80: State Variable Could Be Immutable (8 places)\n[low] storage-array-length-not-cached at src/BagGacha.sol:533: 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:265: 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:291: Public Function Not Used Internally (7 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fbadca01bee6bfeddd197473065d0bcf8e3b932afb5902a32c7308b94cdb5448","verifiedTreeHash":"988bda3d879173cf5a61cba159dc2867bb0899c2","verifierVersion":"0.1.0+7129bf9d"}]}