{"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":"af31529b-b15d-44d5-99f6-d6a8701225bd","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"5b78da97292204a0077aaaa027971b3586e788445e5e6004c7d2a074b7dc95f7","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":"Option 1. Change the economics to poolBps 1000 and route the whole remainder (800,000,000 PIC, 80%) to the HolderClaim contract in the launch transaction, so the launch funds it. Keep 10% to the swarm, the FWA pair and everything else in the brief unchanged.","parentJobId":"f84b106e-ad6d-412e-aaaf-01f96ebd67b1","planHash":"76d471b0bf8fc18594da6c499610ec56fa248019df8f3adaae25da03caaa487c","previousHash":"354bf65440c5f6c06c49068ef906041d7c35f163a2a9f079299bc6dcf14dbb87","projectId":"f84b106e-ad6d-412e-aaaf-01f96ebd67b1","publication":{"commit":"a67b8afe34668d90d908a4e097b046853c1927ab","deliveredAt":"2026-10-13T07:29:15.524Z","repoUrl":"https://github.com/identity-md-launches/launch-1525-plushies-in-control"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"4f8d1056aaf2d959be5f94ac50ce9403a3742849cf8c2146ff688f6b5846a259","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"fd866d055b32ffc0c35c3c2896629cfc2fe6e757aef988df3dd85aa1420d2874","device":"2cd7c8e4bd7aedde","findings":[],"hash":"5b78da97292204a0077aaaa027971b3586e788445e5e6004c7d2a074b7dc95f7","nodeId":"4f2b8eb0-316a-4230-83c6-6b11589828cd","outcome":"completed","summary":"The work is complete and verified. Here is the recap.\n\n**What changed**\n\n- **Launch economics in source.** New library `src/LaunchEconomics.sol` fixes the split: pool 1000 bps, swarm 1000 bps, remainder 8000 bps, with a pure `split` that gives all rounding to the remainder and reverts when shares exceed the supply. Every function is internal, so HolderClaim's bytecode has no link placeholders (checked in the artifact).\n- **HolderClaim reads the remainder from it.** `ALLOCATION` is now a public constant taken from the library and `SHARE` derives from it, so the manifest, the contract and the tests cannot drift apart. Two views were added, `fundingShortfall()` and `isFunded()`, so the launch operator and holders can confirm on chain that the launch transaction funded it. They only read state; there is still no owner, funding function or recovery path.\n- **Token untouched.** PICToken is unchanged; a test pins its supply constant to the library's.\n\n**Tests** (63 pass, up from 53; clean `forge build`, `forge fmt --check` clean)\n\n- New `test/LaunchEconomics.t.sol` simulates the launch transaction with a stand-in factory that takes manifest economics as an argument and resolves the remainder to the deployed HolderClaim by name. Success: 100M/100M/800M balances, factory empty, the earlier remainder wallet receives nothing, `isFunded()` true, all 111 shares payable. Failures: the earlier `poolBps = 8800` economics leave a shortfall and full claims revert; a wallet-routed remainder leaves HolderClaim empty until forwarded; shares above 100% revert; a fuzz checks supply conservation.\n- Existing harness and constructor tests now assert the new constant and views.\n\n**Docs**\n\n- `docs/LAUNCH.md` is new: assumptions, the manifest values (`poolBps = 1000`, swarm 10%, `remainderTo` = HolderClaim by name, `initialMarketCapWei` and FWA pair unchanged), what the contracts can and cannot enforce, and before/after-launch responsibilities.\n- README, `docs/SECURITY.md` and `test/TESTING.md` updated accordingly.\n\n**Open items for the launch, not this repo**\n\n- The job's paid economics must actually be set to `poolBps = 1000` with the remainder routed to HolderClaim in the manifest step; the contracts cannot compel the factory to send the PIC, they can only make a wrong split visible through `isFunded()`.\n- Note on semantics: the shortfall counts what is payable (111 shares), which is 23 base units less than the allocation, so a balance of exactly the allocation reads as fully funded with 23 base units of surplus.","treeHash":"148fa61315f81e7f42612749bbfa073f5605d3f2","usage":{"cachedInputTokens":741384,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":29376,"runtime":"claude","turns":39,"wallClockMs":505416}}],"verification":[{"checks":[{"durationMs":5051,"exitCode":0,"name":"build","output":"Compiling 56 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.85s\nCompiler run successful!\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/HolderClaim.sol:64:9\n   │\n64 │         (holder,) = IFWAIRPFP(PFP).tokenLocks(id);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/HolderClaim.sol:56:13\n   │\n56 │         try IFWAIRPFP(PFP).ownerOf(id) returns (address owner) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/HolderClaim.sol:64:21\n   │\n64 │         (holder,) = IFWAIRPFP(PFP).tokenLocks(id);\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/HolderClaim.sol:135:41\n    │\n135 │         if (id < MIN_ID || id > MAX_ID) revert InvalidId(id);\n    │                                         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/HolderClaim.sol:116:63\n    │\n116 │             if (holder == address(0) || holder != msg.sender) revert NotHolder(id);\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/HolderClaim.sol:130:13\n    │\n130 │         if (elapsed >= VESTING) return SHARE;\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":88239,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/LaunchEconomics.t.sol:LaunchEconomicsTest\n[PASS] testFuzz_splitConservesSupplyAndGivesRoundingToRemainder(uint256,uint16,uint16) (runs: 512, μ: 22200, ~: 21897)\nLogs:\n  Bound result 41331340775527155486377374112934927\n  Bound result 1890\n  Bound result 0\n\n[PASS] test_formerEconomicsWithPoolBps8800CannotFundHolderClaim() (gas: 7982789)\n[PASS] test_fundedLaunchPaysEveryShareAndStaysFundedThroughout() (gas: 9030749)\n[PASS] test_fundingViewsHaveNoSideEffectsAndNoAdminPath() (gas: 451662)\n[PASS] test_launchSplitIsTenTenEightyAndMatchesContractConstants() (gas: 14618)\n[PASS] test_launchTransactionFundsHolderClaimWithTheWholeRemainder() (gas: 741918)\n[PASS] test_remainderRoutedToAWalletLeavesHolderClaimEmptyUntilTheWalletForwardsIt() (gas: 5550746)\n[PASS] test_shortfallMovesOnlyWithDepositsNotWithClaims() (gas: 9371101)\n[PASS] test_splitRejectsSharesAboveTheWholeSupply() (gas: 29375)\n[PASS] test_tokenSupplyAndHolderClaimAllocationAreTiedToTheEconomics() (gas: 41066)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 309.09ms (75.43ms CPU time)\n\nRan 8 tests for test/PICToken.t.sol:PICTokenTest\n[PASS] testFuzz_transfersConserveFixedSupply(uint256,uint256) (runs: 512, μ: 163283, ~: 165201)\nLogs:\n  Bound result 51944701872492106053777198\n  Bound result 34164513514229035786795380\n\n[PASS] test_approvalsTransferFromAndRevocation() (gas: 263554)\n[PASS] test_deployerCannotSpendUnapprovedHolderTokens() (gas: 94885)\n[PASS] test_insufficientBalanceAndInvalidReceiverRevert() (gas: 61886)\n[PASS] test_launchAllocationAndAllTransferFlowsArriveWhole() (gas: 1075579)\n[PASS] test_metadataAndWholeSupplyMintedToDeployer() (gas: 73647)\n[PASS] test_noMintBurnPauseSeizureOrUpgradeEntryPoints() (gas: 707655)\n[PASS] test_zeroAndSelfTransfersPreserveSupply() (gas: 83315)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 309.18ms (311.32ms CPU time)\n\nRan 6 tests for test/HolderClaimProperties.t.sol:HolderClaimPropertiesTest\n[PASS] testFuzz_batchOrderAndChunkingPreservePayout(uint8[48],uint8) (runs: 1000, μ: 1503077, ~: 1421265)\nLogs:\n  Bound result 31\n\n[PASS] testFuzz_claimFrequencyDoesNotChangeEntitlement(uint32[12],uint32,uint8) (runs: 1000, μ: 1050894, ~: 1081035)\nLogs:\n  Bound result 8\n  Bound result 24549\n  Bound result 1\n  Bound result 1313\n  Bound result 18685\n  Bound result 2222\n  Bound result 3\n  Bound result 1134\n  Bound result 731\n  Bound result 402\n  Bound result 54\n  Bound result 1\n  Bound result 0\n  Bound result 2\n\n[PASS] testFuzz_vestingSatisfiesFloorBoundsAndDoesNotDependOnOwnership(uint256,uint8) (runs: 1000, μ: 201038, ~: 200742)\nLogs:\n  Bound result 864000\n  Bound result 32\n\n[PASS] test_invalidBoundariesRejectEvenForZeroAccountAndZeroVesting() (gas: 209903)\n[PASS] test_mixedHistoryEventsDescribeOnlyPaidIdsAndOneAggregateTransfer() (gas: 521487)\n[PASS] test_underfundedByOneWeiRollsBackPriorAccountingThenExactFundingWorks() (gas: 486876)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 309.12ms (878.81ms CPU time)\n\nRan 7 tests for test/HolderClaimSecurity.t.sol:HolderClaimSecurityTest\n[PASS] test_falseReturnRollsBackAllAccountingAndTokenState() (gas: 403154)\n[PASS] test_invalidReturnRollsBack() (gas: 241714)\n[PASS] test_noReturnTokenWorksAndOnlyOneTransferIsUsed() (gas: 230996)\n[PASS] test_reentryBlockedAndAllBatchEffectsVisibleBeforeTransfer() (gas: 1194406)\n[PASS] test_revertingTransferBubblesErrorAndRollsBack() (gas: 211114)\n[PASS] test_tokenWithoutCodeCannotConsumeClaim() (gas: 121244)\n[PASS] test_zeroPayoutNeverCallsToken() (gas: 248820)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 309.31ms (1.96ms CPU time)\n\nRan 27 tests for test/HolderClaim.t.sol:HolderClaimTest\n[PASS] testFuzz_duplicateBatchMatchesUniquePreview(uint8[],uint32) (runs: 512, μ: 1578474, ~: 1575377)\nLogs:\n  Bound result 93\n  Bound result 59\n\n[PASS] testFuzz_invalidIdsRevertAcrossViewsAndAtomicClaim(uint256) (runs: 512, μ: 141442, ~: 141395)\n[PASS] testFuzz_splitClaimsAndSaleConserveOneShare(uint32,uint32,uint8) (runs: 512, μ: 327182, ~: 320097)\nLogs:\n  Bound result 1\n  Bound result 107682\n  Bound result 923614\n\n[PASS] test_approvedOperatorCannotClaim() (gas: 158853)\n[PASS] test_batchPaysOnceAndDuplicatesDoNotDoubleCount() (gas: 336035)\n[PASS] test_burnedAndUnclaimedAllocationsStayLockedAfterVestingEnds() (gas: 3214370)\n[PASS] test_burnedIdsHaveNoHolderAndCannotPayEvenWithStaleLock() (gas: 330014)\n[PASS] test_claimAllLeavesOnlyDivisionDustAndExtraDepositsLocked() (gas: 3986369)\n[PASS] test_claimAtStartIsNoop() (gas: 64733)\n[PASS] test_claimableForFiltersOwnersAndBurnsAndDeduplicates() (gas: 486716)\n[PASS] test_claimedAccountingSurvivesSaleAndTransferBack() (gas: 404528)\n[PASS] test_constantsAndConstructor() (gas: 650202)\n[PASS] test_constructorDoesNotCallExternalContractsOrMoveSupply() (gas: 52646)\n[PASS] test_constructorRejectsZeroToken() (gas: 3774)\n[PASS] test_dailyClaimsPayCumulativeDifferenceWithoutLosingRounding() (gas: 1913346)\n[PASS] test_directOwnerTakesPrecedenceOverStaleLockAndFailingLockLookup() (gas: 200118)\n[PASS] test_emptyBatchIsNoop() (gas: 48378)\n[PASS] test_failedLockLookupRevertsWithoutPayingOrUpdatingAccounting() (gas: 219210)\n[PASS] test_fullyClaimedIdsAreSkippedAlongsideNewClaims() (gas: 194319)\n[PASS] test_insufficientFundingRevertsAllAccountingAndCanRetryAfterFunding() (gas: 896237)\n[PASS] test_lockedNftPaysBeneficialHolderThenUnlockedSaleChangesHolder() (gas: 521637)\n[PASS] test_lockedWithoutHolderIsUnclaimable() (gas: 155792)\n[PASS] test_noAdminOrRecoveryEntryPoints() (gas: 203502)\n[PASS] test_unauthorizedLaterIdRevertsWholeBatch() (gas: 193409)\n[PASS] test_unclaimedVestingMovesWithNftWithoutResettingSchedule() (gas: 251092)\n[PASS] test_vestsPerSecondAndCapsAtTwentyDays() (gas: 170919)\n[PASS] test_wrongHolderRevertsIncludingAtStartAndAfterFullClaim() (gas: 184135)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 309.40ms (676.98ms CPU time)\n\nRan 3 tests for test/PICTokenInvariant.t.sol:PICTokenInvariantTest\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger() (runs: 256, calls: 24576, reverts: 0)\n\n╭-----------------+--------------------+-------+---------+----------╮\n| Contract        | Selector           | Calls | Reverts | Discards |\n+===================================================================+\n| PICTokenHandler | approve            | 4889  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| PICTokenHandler | rejectZeroReceiver | 4944  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| PICTokenHandler | revokeThenTrySpend | 4920  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| PICTokenHandler | spend              | 4945  | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| PICTokenHandler | transfer           | 4878  | 0       | 0        |\n╰-----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999999999\n  Bound result 965997159035217130544652930\n  Bound result 0\n  Bound result 0\n  Bound result 2246\n  Bound result 0\n  Bound result 0\n  Bound result 6071\n  Bound result 0\n  Bound result 0\n  Bound result 8376\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1707\n  Bound result 6\n  Bound result 3041\n  Bound result 4\n  Bound result 109\n  Bound result 2050\n  Bound result 5852\n  Bound result 3\n  Bound result 4887\n  Bound result 4608\n  Bound result 1085\n  Bound result 3347\n  Bound result 2\n  Bound result 3\n  Bound result 177535726213277757353616754\n  Bound result 32\n  Bound result 3\n  Bound result 15000000000000000000\n  Bound result 40\n  Bound result 0\n  Bound result 9500\n  Bound result 839166574467099755872978303\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 327\n  Bound result 256414935654451851206191769\n  Bound result 31536000\n  Bound result 716\n  Bound result 8800\n  Bound result 2805\n  Bound result 40\n  Bound result 8566\n  Bound result 32\n  Bound result 129\n  Bound result 64\n  Bound result 18\n\n[PASS] test_finiteAllowanceIsConsumedBySelfTransferAndZeroSpenderCannotBeApproved() (gas: 877535)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_handlerSequencePinsFullSupplyInfiniteAllowanceAndFailedBalanceRollback() (gas: 1327203)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 999999999999999999999999999\n  Bound result 999999999999999999999999999\n  Bound result 999999999999999999999999999\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.13s (7.13s CPU time)\n\nRan 2 tests for test/HolderClaimInvariant.t.sol:HolderClaimInvariantTest\n[PASS] invariant_scheduleOwnershipAndConservation() (runs: 256, calls: 20480, reverts: 0)\n\n╭--------------+------------------------+-------+---------+----------╮\n| Contract     | Selector               | Calls | Reverts | Discards |\n+====================================================================+\n| ClaimHandler | advanceTime            | 2130  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | burnNft                | 2114  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | claimAsNonHolder       | 2040  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | claimBatch             | 2025  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | claimOne               | 2035  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | claimWithForeignSuffix | 2034  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | claimWithInvalidSuffix | 2077  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | donate                 | 2049  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | toggleLock             | 1949  | 0       | 0        |\n|--------------+------------------------+-------+---------+----------|\n| ClaimHandler | transferNft            | 2027  | 0       | 0        |\n╰--------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 37\n  Bound result 1\n  Bound result 1\n  Bound result 3189\n  Bound result 40\n  Bound result 101\n  Bound result 23\n  Bound result 19\n  Bound result 49\n  Bound result 50\n  Bound result 1224\n  Bound result 8800\n  Bound result 7873\n  Bound result 12\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639847\n  Bound result 137076\n  Bound result 1\n  Bound result 19\n  Bound result 23\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639828\n  Bound result 2\n  Bound result 11\n  Bound result 4372\n  Bound result 32\n  Bound result 127525\n  Bound result 40\n  Bound result 48\n  Bound result 49\n  Bound result 8\n  Bound result 69\n  Bound result 2\n  Bound result 32\n  Bound result 24\n  Bound result 74\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n  Bound result 27\n  Bound result 1\n  Bound result 86400\n  Bound result 6\n  Bound result 12138737402912455444132729208904280582761419717166274\n  Bound result 32\n  Bound result 8\n  Bound result 86067\n  Bound result 2795\n  Bound result 5\n\n[PASS] test_handlerSequenceIncludesFailuresDonationsLocksAndBurns() (gas: 26452893)\nLogs:\n  Bound result 86400\n  Bound result 86400\n  Bound result 1\n  Bound result 1\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 88.10s (88.13s CPU time)\n\nRan 7 test suites in 88.10s (96.77s CPU time): 63 tests passed, 0 failed, 0 skipped (63 total tests)\n","passed":true},{"durationMs":123,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"HolderClaim.claim(uint256[])\",\"PICToken.approve(address,uint256)\",\"PICToken.transfer(address,uint256)\",\"PICToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":89,\"docs/FWAIRPFP.abi.json\":45,\"docs/LAUNCH.md\":87,\"docs/PFP-ABI.md\":14,\"docs/SECURITY.md\":32,\"foundry.toml\":21,\"remappings.txt\":2,\"src/HolderClaim.sol\":137,\"src/LaunchEconomics.sol\":46,\"src/PICToken.sol\":14,\"src/interfaces/IFWAIRPFP.sol\":9,\"test/HolderClaim.t.sol\":493,\"test/HolderClaimInvariant.t.sol\":296,\"test/HolderClaimProperties.t.sol\":238,\"test/HolderClaimSecurity.t.sol\":127,\"test/LaunchEconomics.t.sol\":277,\"test/PICToken.t.sol\":158,\"test/PICTokenInvariant.t.sol\":174,\"test/TESTING.md\":30,\"test/mocks/AdversarialToken.sol\":90,\"test/mocks/MockPFP.sol\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1115,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/HolderClaim.sol:111: HolderClaim.claim(uint256[]) (src/HolderClaim.sol#111-126) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/HolderClaim.sol:103: HolderClaim.isFunded() (src/HolderClaim.sol#103-105) uses a dangerous strict equality:\n[medium/medium] unused-return at src/HolderClaim.sol:54: HolderClaim.holderOf(uint256) (src/HolderClaim.sol#54-65) ignores return value by (holder,None) = IFWAIRPFP(PFP).tokenLocks(id) (src/HolderClaim.sol#64)\n[low/medium] calls-loop at src/HolderClaim.sol:54: HolderClaim.holderOf(uint256) (src/HolderClaim.sol#54-65) has external calls inside a loop: (holder,None) = IFWAIRPFP(PFP).tokenLocks(id) (src/HolderClaim.sol#64)\n[low/medium] calls-loop at src/HolderClaim.sol:54: HolderClaim.holderOf(uint256) (src/HolderClaim.sol#54-65) has external calls inside a loop: owner = IFWAIRPFP(PFP).ownerOf(id) (src/HolderClaim.sol#56-60)\n[low/medium] calls-loop at src/HolderClaim.sol:54: HolderClaim.holderOf(uint256) (src/HolderClaim.sol#54-65) has external calls inside a loop: (holder,None) = IFWAIRPFP(PFP).tokenLocks(id) (src/HolderClaim.sol#64)\n[low/medium] calls-loop at src/HolderClaim.sol:54: HolderClaim.holderOf(uint256) (src/HolderClaim.sol#54-65) has external calls inside a loop: owner = IFWAIRPFP(PFP).ownerOf(id) (src/HolderClaim.sol#56-60)\n[low/medium] timestamp at src/HolderClaim.sol:111: HolderClaim.claim(uint256[]) (src/HolderClaim.sol#111-126) uses timestamp for comparisons\n[low/medium] timestamp at src/HolderClaim.sol:128: HolderClaim._vested() (src/HolderClaim.sol#128-132) uses timestamp for comparisons","passed":true},{"durationMs":363,"exitCode":0,"name":"aderyn","output":"[low] costly-loop at src/HolderClaim.sol:113: Costly operations inside loop\n[low] internal-function-used-once at src/LaunchEconomics.sol:31: Internal Function Used Only Once\n[low] large-numeric-literal at src/LaunchEconomics.sol:10: Large Numeric Literal (3 places)\n[low] require-revert-in-loop at src/HolderClaim.sol:78: Loop Contains `require`/`revert` (2 places)\n[low] uninitialized-local-variable at src/HolderClaim.sol:78: Uninitialized Local Variable (2 places)\n[low] unused-public-function at src/HolderClaim.sol:69: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5b78da97292204a0077aaaa027971b3586e788445e5e6004c7d2a074b7dc95f7","verifiedTreeHash":"148fa61315f81e7f42612749bbfa073f5605d3f2","verifierVersion":"0.1.0+327e1e9f"}]}