{"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":"a9818b4d-a1fe-4ef7-bab0-82509f56b0ac","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"56c4248cc1350bc330486a37d2ea3bcc4535631036378465d2a7d6e213be892c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"a991c4648726d75b3b52b3f4a068c515abb4ca60eef029dd037c0cbd34d05f04","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"deb4effed9bd09980d5f36eed745884b92203e86e8e625bf3ba72117f770f839","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"72e494fca9be09ea9dc2c18d371babca39b36c9d3ae61c5868b2c48f76a50d26","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"de8c2d5e5fe45bf327b95875e0843baa246475cd3823294084234b7e81667508","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"a43ab87091e0e8f1b43339116157657b019f11df458fe3a6a3627067eb5be2ab","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"af314ffc406b3c9c79704fc4508a721cabd4fb7e3e8ea9f0f2c46b71a7ec3347","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"1fe32e97a2854193b8abf98ed9328cebc1f4623fb9f77d4c76ab73454f4777d0","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"What to build: two immutable contracts for The Hooks Store on Ethereum (the first launch deployed the same contracts on Robinhood Chain), HookListingRegistry (a free on-chain listing registry) and FeaturedPlacementsV2 (a paid, refundable 24-hour featured-placement escrow in IMD). Upgrades: none. No proxy, no upgrade path, no DELEGATECALL, no SELFDESTRUCT; both contracts are immutable once deployed and the only owner powers are the ones listed below. Start from the audited source at https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/tree/46e17ea70534e8a7ac2c4ff78501a3c183d32da8/src/store (HookListingRegistry.sol unchanged; FeaturedPlacements.sol becomes FeaturedPlacementsV2 with these changes and nothing else): DURATION is 24 hours instead of 7 days; PRICE stays 0.1 IMD (100000000000000000 base units of the configured 18-decimal token); add boost(uint256 placementId, uint256 amount), callable by anyone while the placement is open, which pulls amount from the caller's deposited balance (deposit stays as in the original), adds it to totalBoost[placementId] and to the escrow, and is never refunded: on cancel the base price refunds pro rata exactly as before and the whole boost goes to the pinned proceeds recipient; on settle both go to the recipient; add rankOf(uint256 placementId) view returning base plus boost, and have featured(cursor, scanLimit) also return each placement's total so the website can sort by total paid, ties by lower id first; keep one live placement per listing, the #ad label on every placement and event, the two-step owner, configureToken once, setProceedsRecipient, withdraw and withdrawProceeds, the reentrancy guards, exact-transfer checks and the conservation rule accountedBalance = totalAvailable + totalEscrowed + totalProceeds with boosts counted in totalEscrowed until closed. Constructors: HookListingRegistry() and FeaturedPlacementsV2($owner, $contract:HookListingRegistry). Owner functions stay owner-only with $owner as the owner; no msg.sender ownership. Keep the existing Foundry tests passing with the new duration, and add tests for boost by a third party, boost forfeiture on cancel, ranking ties, and the invariant with boosts. No token, pool or liquidity is created. Dependencies: only the IMD token on Ethereum (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), set after deployment by the owner through configureToken, never a constructor dependency. Recipient of ad proceeds: set after deployment by the owner through setProceedsRecipient to the owner's own wallet; nothing is paid to anyone at deployment.","parentJobId":null,"planHash":"6d847febc32bc0065e040ffc5df4683e0250bef97141162986aef4531fe8a853","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a9818b4d-a1fe-4ef7-bab0-82509f56b0ac","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2456-what-build-two-immutable"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52232","feedbackHash":"74badb392d171bc7ecb2e4df2325a475b31bb788bf5e88442d08817999939586","nodeKey":"audit_economics","submissionHash":"56c4248cc1350bc330486a37d2ea3bcc4535631036378465d2a7d6e213be892c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52240","feedbackHash":"4388f90b68c413e56747784581f6bd95012507b408e42c4d9eca0c7e4e79af6c","nodeKey":"audit_flow","submissionHash":"a991c4648726d75b3b52b3f4a068c515abb4ca60eef029dd037c0cbd34d05f04","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"09ce0ecd69346b6c1673640b6e8239a7961ec83b469bc14b41d9dd468f230728","nodeKey":"audit_judge","submissionHash":"deb4effed9bd09980d5f36eed745884b92203e86e8e625bf3ba72117f770f839","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52127","feedbackHash":"abe287233e67d306e20e7f4871ccfa4fca33085e5279038315b6c66b783b8bc3","nodeKey":"audit_math","submissionHash":"72e494fca9be09ea9dc2c18d371babca39b36c9d3ae61c5868b2c48f76a50d26","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51367","feedbackHash":"745f2a877f2d877a40681f63783a46ebbba7f89998e8131b870ca34b75480cc9","nodeKey":"audit_permissions","submissionHash":"de8c2d5e5fe45bf327b95875e0843baa246475cd3823294084234b7e81667508","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51242","feedbackHash":"78e5dd60c8b2198ad77cd25472b12be22e406bfe7841fcde7debe21b0303fec5","nodeKey":"build_contract_project","submissionHash":"a43ab87091e0e8f1b43339116157657b019f11df458fe3a6a3627067eb5be2ab","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51726","feedbackHash":"706390be1df8082c8a79459fb6f3a374e4229c28dc742080d006bd9f770a2401","nodeKey":"manifest","submissionHash":"af314ffc406b3c9c79704fc4508a721cabd4fb7e3e8ea9f0f2c46b71a7ec3347","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52250","feedbackHash":"fecb22c38b44018f8c0787b6ac725f1ad32b8d96853120edac0b8d20755b68c4","nodeKey":"write_foundry_tests","submissionHash":"1fe32e97a2854193b8abf98ed9328cebc1f4623fb9f77d4c76ab73454f4777d0","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"58920a96c39e73f4ad8f2a74fc7994a4eda9af2a5600dbe54a1764979a5d2277","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"0383c819df979e83166e2f494b40f71e81175b6dbb3adb1103811aa22d08bba3","device":"fc87c05048aca47d","findings":[],"hash":"1fe32e97a2854193b8abf98ed9328cebc1f4623fb9f77d4c76ab73454f4777d0","nodeId":"62760900-18a0-4a9d-82ff-faf662079062","outcome":"completed","summary":"All 73 tests pass under `forge build` and `forge test` with the verifier's fuzz seed (65 already there plus 8 new). I found no defects, so I did not write `.imd-findings.json`. The new tests are on disk but not committed. Everything I added is under `test/`, and the source, config and earlier tests are unchanged.\n\nThe earlier tests already covered everything the brief asked for: the 24-hour duration, a third party boosting, the boost being lost on cancel, ranking ties, and the balance invariant with boosts. I added three files for what was still missing:\n\n- **`test/FeaturedModelInvariant.t.sol`**: random call sequences against `FeaturedPlacementsV2`. The earlier invariant handlers skip calls that should fail; this one makes every call. That includes callers who should be refused: Carol, who boosts but never owns a listing; Mallory, an outsider who also tries the owner-only functions; and the proceeds recipients. Each call must succeed exactly when a separate model of the contract says it should, so a refused call is shown to change nothing. It also mixes in boosts right at the expiry second, listing transfers, recipient changes and tokens sent directly to the contract. After every sequence it checks that:\n  - the contract's token balance equals `totalAvailable + totalEscrowed + totalProceeds`, plus any tokens sent directly;\n  - each account's balances, each placement's status, refund and boost, and `rankOf` match the model;\n  - a closed placement never reopens, and each listing has at most one live placement;\n  - `featured` returns totals that line up with `rankOf`, in ascending id order;\n  - only proceeds recipients ever earn anything;\n  - at the end, everything still locked can be paid out without the owner.\n\n  To check that this suite can actually fail, I ran a copy with a deliberately wrong cancel rule. It failed straight away.\n- **`test/HookListingRegistryInvariant.t.sol`**: random create, update, hide/show, propose, cancel and accept calls on the registry from any caller, checked against a model. Every listing must stay findable under its current owner, with no stale entries left behind after a transfer. Labels, revisions and search results must match, and `isAudited` must stay false.\n- **`test/FeaturedBoostEdges.t.sol`** (6 tests):\n  - a fuzz test showing a boost can spend exactly the caller's deposited balance and not 1 more;\n  - a fuzz test where a new listing owner cancels a placement Carol boosted, at a random time: the seller gets the pro-rata base refund, Carol gets nothing back, and her whole boost goes to the pinned recipient;\n  - earned proceeds can't pay for a boost, and deposits can't be withdrawn as proceeds;\n  - a booster can't cancel, and nobody can settle early;\n  - an owner who has proposed a transfer, and a former owner, have no owner powers;\n  - an ad stays live and boostable after its listing is hidden, but the listing can't buy another while hidden.\n\nTwo behaviours match the brief as I read it, so I didn't report them as defects; they're worth deciding on deliberately:\n- **Boosting stops at expiry.** Once a placement's 24 hours are up, boosting it is refused, even before anyone settles it. The brief says boosts are allowed \"while the placement is open\", which I took to mean live.\n- **A booster can lose their boost almost immediately.** If the buyer or the listing's current owner cancels one second after a third party boosts, the whole boost goes to the proceeds recipient. That is the \"never refunded\" rule working as written, but the website may want to warn boosters about it.\n\nNo tests were needed against the live IMD token: the contract never calls it at construction, and the earlier tests cover badly behaved tokens with a local mock.","treeHash":"432e0e24ccd94392b69f85c9684233f515c2bccb","usage":{"cachedInputTokens":1136073,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":28273,"runtime":"claude","turns":18,"wallClockMs":332658}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"82692ab5f7f7e54e","findings":[{"citation":"resolved","description":"Unlike purchase(), which takes expectedRevision/expectedRecipient/deadline, boost() takes only (placementId, amount). The brief defines boosts as never refunded and the payer or current listing owner may cancel at any time, so a third party's boost can be back-run by cancel(id) in the same block: the booster's whole amount is credited to the pinned proceeds recipient while the placement stops being featured immediately. The booster has no on-chain way to bound this (no minimum remaining time, no deadline). This is exactly the behaviour the brief requests ('never refunded ... the whole boost goes to the pinned proceeds recipient'), so it is not a defect of the implementation; it is the economic exposure a booster accepts. Conservation holds throughout (totalEscrowed decreases by PRICE + boost, totalAvailable rises by the refund, totalProceeds rises by earned + boost). No fix is required by the brief; if the requester wants boosters protected, a minimum-remaining-time or deadline argument on boost() would be a scope change.","line":180,"path":"src/store/FeaturedPlacementsV2.sol","reproduction":"Existing test test/FeaturedBoost.t.sol::testImmediateCancellationRefundsOnlyBaseAndForfeitsAllBoostToPinnedRecipient reproduces it: alice creates listing 1, deposits 0.1e18 and purchases placement 1 at START; bob deposits 0.2e18 and calls boost(1, 0.2e18); in the same block alice calls cancel(1). Observed: refund = 0.1e18 to available[alice], proceeds[treasury] = 0.2e18, available[bob] = 0, placement 1 inactive. Expected per brief: identical. Economics: bob pays 0.2 IMD, the store owner's wallet receives it, alice loses nothing (0 seconds elapsed -> full base refund).","severity":"info","snippet":"    function boost(uint256 placementId, uint256 amount) external nonReentrant {\n        Placement storage placement = _openPlacement(placementId);\n        if (block.timestamp >= placement.endsAt) revert PlacementExpired();","title":"boost() has no expectation guard: a boost included right before a cancel or expiry is fully forfeited for zero delivered exposure (matches the brief, recorded as a design observation)"},{"citation":"resolved","description":"accountedBalance only counts credits created by deposit/purchase/boost/cancel/settle. Every outflow (withdraw, withdrawProceeds) is bounded by a per-account credit, and the exact-transfer checks in ExactStoreToken.pull/push only compare deltas, so a token.transfer(escrow, X) made outside deposit() raises token.balanceOf(escrow) above accountedBalance() forever. The brief and README state there is no admin sweep, so this is the intended trust boundary rather than a defect; the surplus cannot be stolen either. Recorded so the operator does not expect stray IMD to be recoverable.","line":285,"path":"src/store/FeaturedPlacementsV2.sol","reproduction":"Existing test test/FeaturedPlacements.t.sol::testDirectTransfersAreNotCreditsAndCannotBeSwept reproduces it: after configureToken, bob calls token.transfer(escrow, 0.1e18) directly (no deposit); accountedBalance() stays 0 while token.balanceOf(escrow) = 0.1e18; the owner's withdrawProceeds(0.1e18, owner) reverts with InsufficientBalance; after alice deposits and withdraws 0.1e18 the escrow still holds 0.1e18 with accountedBalance() = 0. Expected per design: the same; the 0.1e18 is stuck for everyone.","severity":"info","snippet":"    function accountedBalance() external view returns (uint256) {\n        return totalAvailable + totalEscrowed + totalProceeds;\n    }","title":"IMD sent directly to the escrow (not via deposit) is unaccounted and permanently unrecoverable by anyone (documented 'no sweep' design)"}],"hash":"56c4248cc1350bc330486a37d2ea3bcc4535631036378465d2a7d6e213be892c","nodeId":"54423acf-2fb0-42f6-8e63-c75654fa1675","outcome":"completed","summary":"The findings file is in place at the repository root (excluded from git by the harness's own exclude rule, as expected), it parses, and both snippets match the tree line for line. No other file was created or changed.\n\n## Scope\n\nFiles read: `src/store/FeaturedPlacementsV2.sol`, `ExactStoreToken.sol`, `StoreAdmin.sol`, `HookListingRegistry.sol`, all eight test suites and both helpers, the README and verification notes, the Pashov Mindset plus the Economic Security, Invariant and Flow Gap guides, and the protected deployment floor. The existing suite runs green at 65 tests including two stateful invariant suites of 128 runs by 128 calls.\n\n**Severity counts:** 0 Critical · 0 High · 0 Medium · 0 Low · 2 Info\n\n**Result: no defect found in the economic area.** The two info entries are design consequences the brief itself mandates, recorded so the judge and operator see them, not fixes the author must make.\n\n- **Boost forfeiture with no expectation guard.** A third party's boost can be back-run by the payer's cancel in the same block, sending the whole boost to the proceeds recipient for zero delivered exposure. The brief requires exactly this (\"never refunded\"), and the existing immediate-cancel test reproduces it. Conservation holds throughout.\n- **Stray IMD sent directly to the escrow is unrecoverable.** Nothing can sweep it, including the owner. The original design states there is no sweep, and the existing direct-transfer test reproduces it.\n\nWhat I verified and concluded holds:\n\n- **Conservation.** Every writer of the three totals was traced. Deposit and withdraw move only available balance behind exact delta checks. Purchase and boost move available into escrow one for one. Cancel removes exactly base plus boost from escrow and splits it into refund and earned. Settle moves base plus boost to proceeds.\n- **One live placement per listing.** A new purchase needs the latest placement to be dead, and earlier placements always end sooner, so none can come back to life. Listing transfers keep the same id and the rule survives.\n- **Pinned terms.** Recipient and revision are captured at purchase. Rotating the recipient or editing the listing cannot redirect existing escrow or boosts.\n- **Live dependency.** I read the IMD token on mainnet. It is \"Identity.md\", 18 decimals, a LayerZero OFT over a standard ERC-20. Its selector set has no pause, fee, or blacklist entry, and the only owner-side token powers are name and symbol updates and messaging configuration, so the dependency cannot freeze deposits or withdrawals.\n- **Static analysis leads.** The strict-equality lines compare an enum to None, the reentrancy line is a staticcall into the immutable registry, and the unused-return line is an intentional ABI probe. None reproduces as a defect.\n\nThe coverage record answers all 18 entry points and adds rows for the conservation, boost-escrow, ranking and rounding invariants. No part of the assigned area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1167657,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":24677,"runtime":"claude","turns":28,"wallClockMs":370821}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fd5402086dce252e","findings":[{"citation":"resolved","description":"Math Precision / Numerical Gap (boundary x precision) check of the only division in the contract. PRICE = 1e17 and DURATION = 86400 are not divisible (1e17 / 86400 = 1157407407407.407...), so `earned` is floored on every cancel whose elapsed time is not a multiple of 27 seconds; the recipient loses strictly less than 1 wei per cancellation and the payer gains it. At the boundary elapsed = 0 (purchase and cancel in the same block) the fee is exactly 0, so the full 0.1 IMD base returns to the payer and a new placement id is consumed at no token cost. This matches the brief ('base price refunds pro rata exactly as before'; the original 7-day contract had the identical formula) and the rounding direction is the user-protective one, so it is not a defect, but it is the one place the fee formula hits an edge: a listing owner can mint arbitrarily many Cancelled placement records for gas only (~400k gas per purchase+cancel pair in the local run), lengthening the `featured` scan for the website (100 ids per page). The recipient-side dust cannot be accumulated profitably because each cancel costs more gas than 1 wei of IMD. Any change (minimum fee, ceil rounding) would alter the agreed economics and is a scope decision, not a fix.","line":201,"path":"src/store/FeaturedPlacementsV2.sol","reproduction":"State: token configured, recipient set, alice owns listing 1 with 0.1 IMD deposited. Call sequence from alice in one block: id = purchase(1, 1, recipient, block.timestamp); cancel(id). Expected (per design) and actual: refund == 100000000000000000, proceeds[recipient] == 0, available[alice] == 100000000000000000, placementCount == 1. Repeat 500 times: available[alice] still 1e17, proceeds[recipient] 0, placementCount 500, featured(1,100) returns 0 ads with nextCursor 101. Rounding: warp 1 second after purchase, cancel: earned == 1157407407407 (exact quotient 1157407407407.407...), refund == 99998842592592593; refund + earned == PRICE exactly, recipient short by 0.407 wei.","severity":"info","snippet":"        uint256 earned = PRICE * (block.timestamp - placement.startsAt) / DURATION;","title":"Pro-rata fee truncates to zero at elapsed = 0 and rounds against the recipient by under 1 wei per cancel; same-block purchase+cancel is free and only inflates placement IDs"},{"citation":"resolved","description":"boost() is open to anyone by design and the whole boost is credited to placement.recipient on cancel or settle. When msg.sender == placement.recipient (the owner's own wallet per the brief), the boost moves from available[recipient] to escrow and then back to proceeds[recipient], so the recipient can raise any placement's total-paid rank by an arbitrary amount for only gas, and withdraw the same tokens afterwards. Conservation (accountedBalance == totalAvailable + totalEscrowed + totalProceeds) holds throughout, nobody else's funds move, and the owner already controls the website, so this is a documented privileged power rather than a permission bypass. Recorded so the ranking guarantee ('sort by total paid') is understood as not enforceable against the recipient; fixing it would require changing the agreed open-boost design.","line":180,"path":"src/store/FeaturedPlacementsV2.sol","reproduction":"State: recipient R set via setProceedsRecipient, alice's placement id 1 open with totalBoost 0, R deposits 5 IMD. R calls boost(1, 5e18): available[R] 5e18 -> 0, totalBoost[1] = 5e18, rankOf(1) = 5.1e18. Warp 24 hours, anyone calls settle(1): proceeds[R] += 5.1e18. R calls withdrawProceeds(5.1e18, R): R ends with its original 5 IMD plus the 0.1 IMD base, having outranked every honestly boosted placement below 5.1 IMD at zero token cost.","severity":"info","snippet":"    function boost(uint256 placementId, uint256 amount) external nonReentrant {","title":"Trust assumption: the pinned proceeds recipient (owner wallet) can boost any placement at zero net cost, so the paid ranking is not binding for the owner"}],"hash":"72e494fca9be09ea9dc2c18d371babca39b36c9d3ae61c5868b2c48f76a50d26","nodeId":"ba5a6ed2-236d-4a6d-b096-b23a02f62d8b","outcome":"completed","summary":"The review is complete and the findings file is in place. No source files were changed, and the scratch tests were removed.\n\n**Outcome:** the math in FeaturedPlacementsV2 holds. I found no defect that loses funds, pays the wrong party, or breaks the conservation rule. The file `.imd-findings.json` holds two info-level notes and a coverage row for all 18 entry points plus three invariant rows.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides**\n\n- **The diff against the audited original** is exactly the briefed change set. The three unchanged files match the provenance hashes byte for byte. The pro-rata formula is identical to the original with only the divisor changed.\n- **The single division** in cancel cannot overflow (product under 9e21) and is bounded by the expiry guard, so refund plus earned always equals the base price exactly. Boosts are added outside the division, so they never round.\n- **Every boundary comparison** is consistent: boost and cancel reject at or after expiry, settle accepts at expiry, purchase allows renewal exactly at expiry, and the one-live-placement check uses the same predicate as the active view.\n- **Escrow accounting** increments and decrements pair exactly across all seven state-changing functions, so the conservation rule holds with boosts counted in escrow until close. The existing invariant suite with boosts passes.\n- **The live IMD token** on Ethereum reports 18 decimals and passed a throwaway fork run of the full deposit, purchase, boost, cancel and proceeds cycle under the exact-transfer checks.\n- **All 65 existing tests pass** on forge 1.8.3, including the required boost, forfeiture, tie and invariant tests.\n- **Static-analysis leads** were all benign: enum strict-equality, an intentional ABI probe, and a view call to the immutable registry.\n\n**The two info notes, with concrete inputs**\n\n- Cancelling in the same block as the purchase earns the recipient zero and returns the full base, and at one second elapsed the recipient is short by under one wei. This is the agreed pro-rata rule, not a defect. The only effect is that a listing owner can inflate the placement ID space for gas alone.\n- The pinned proceeds recipient, which is the owner wallet, can boost any placement and receive the same tokens back as proceeds. The paid ranking is therefore a trust assumption on the owner, not an enforced guarantee.\n\n**Not reached:** nothing in my assigned area. I did not independently audit the access-control or economics areas beyond what the coverage rows state, since other specialists hold those.","treeHash":null,"usage":{"cachedInputTokens":1687445,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":31038,"runtime":"claude","turns":38,"wallClockMs":483170}},{"artifacts":[],"attempt":1,"bundleHash":"20796953224704e8cd9ccda7a00d9afdbee8bf3c29e0dd4a363cfde84ac7bc8b","device":"3f02755d8661ddf1","findings":[],"hash":"a43ab87091e0e8f1b43339116157657b019f11df458fe3a6a3627067eb5be2ab","nodeId":"f9279871-20cc-49e8-8a64-a29faab09e87","outcome":"completed","summary":"Implemented both contracts. The registry remains byte-identical to the pinned source; V2 adds 24-hour placements, nonrefundable boosts, ranking totals, and tested escrow conservation.\n\nPassed `forge build`, all **65 tests** with the supplied fuzz seed, and `forge fmt --check`.\n\nDeployment parameters, owner setup, and ABI changes are documented in [README.md](/home/identitymd3/.identitymd/work/a9818b4d-a1fe-4ef7-bab0-82509f56b0ac/f9279871-20cc-49e8-8a64-a29faab09e87/README.md).","treeHash":"8a7fb8c97169ecd8071bca78e0389d25051cf563","usage":{"cachedInputTokens":1479936,"inputTokens":115396,"model":"gpt-6-astra","outputTokens":24807,"runtime":"codex","turns":7,"wallClockMs":668832}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b0001bc8a5c908cd","findings":[],"hash":"a991c4648726d75b3b52b3f4a068c515abb4ca60eef029dd037c0cbd34d05f04","nodeId":"bc5900b8-4614-41cd-a789-5f59f6ea7027","outcome":"completed","summary":"I found no defects I could back up with a failing input, so `.imd-findings.json` has an empty findings list. Its coverage record has a row for all 18 entry points, each marked `holds`, plus rows for the balance invariant and the source diff. No repository files were changed.\n\n**What I checked:**\n- **Changes against the starting source.** I fetched the original contracts at commit `46e17ea`. `HookListingRegistry`, `StoreAdmin` and `ExactStoreToken` are byte-identical. `FeaturedPlacementsV2` differs only in what was asked for:\n  - `DURATION` is 24 hours.\n  - It adds `totalBoost`, `boost` and `rankOf`.\n  - `featured` also returns each placement's total.\n  - The cancel and settle events now carry the `#ad` label.\n- **Following the money.** `boost` moves the caller's deposited balance into escrow. `cancel` refunds the base price to the payer pro rata exactly as before, and sends the earned base plus the whole boost to the recipient fixed at purchase. `settle` sends price plus boost to that recipient and can't run twice. Every path moves equal amounts between buckets, so the balance rule (available + escrowed + proceeds) always holds. Boosts are refused after a placement closes or expires.\n- **Access.** Owner functions are owner-only with an explicit owner argument. There is no admin sweep. Changing the proceeds recipient affects only future purchases, and existing placements, boosts included, keep theirs.\n- **Static-analysis leads.** None held up:\n  - The reentrancy leads are blocked by the reentrancy guard.\n  - The external call in `purchase` only reads from the fixed registry address.\n  - The flagged \"strict equality\" is a status check, not a balance check.\n  - The registry's loops are capped at 16 labels of 32 bytes.\n- **The IMD token.** Read on Ethereum mainnet, `0xd34a99bc…63b7` reports 18 decimals and symbol `IMD`, and has no proxy. That fits `configureToken`'s checks and the exact-transfer checks.\n- **Tests.** `forge test` passes all 65 tests, including the boost tests and the invariant tests with boosts.\n\nOne behaviour I left out as a finding because the specified `boost(uint256,uint256)` signature doesn't allow for it: a boost has no deadline. A boost waiting in the mempool could land a few seconds before the placement expires and still be kept in full.\n\nA clean review doesn't prove the contracts are free of defects.","treeHash":null,"usage":{"cachedInputTokens":319650,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":7308,"runtime":"claude","turns":10,"wallClockMs":119161}},{"artifacts":[],"attempt":1,"bundleHash":"0aec2de6bc3b81dbb1d6b9cc94425ce21d8fc20e6a0b202435e050190a9687cb","device":"2b4e97bb63195f54","findings":[],"hash":"af314ffc406b3c9c79704fc4508a721cabd4fb7e3e8ea9f0f2c46b71a7ec3347","nodeId":"5b68d33b-26fc-494f-b2f1-f7a82128355b","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd-2/work/a9818b4d-a1fe-4ef7-bab0-82509f56b0ac/5b68d33b-26fc-494f-b2f1-f7a82128355b/launch.json) with both contracts in dependency order and the required `$owner` argument.\n\nManifest checks and compiled ABI comparison passed. `forge build` succeeded; all 65 tests passed with the supplied fuzz seed. Only `launch.json` is changed for submission.","treeHash":"1c154d75cd7a9f1cd3a1b17c92e266fa00e2865c","usage":{"cachedInputTokens":258304,"inputTokens":43588,"model":"gpt-6-astra","outputTokens":2674,"runtime":"codex","turns":3,"wallClockMs":166861}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddfb1efa72fe9a94","findings":[{"citation":"resolved","description":"Not a defect: the brief requires boosts to be non-refundable and the README discloses it. Recorded as the one access-by-economics seam in this design that a reader must know: boost(uint256,uint256) is callable by anyone, but cancel(uint256) is callable by the placement payer or the live listing owner read from the registry, and cancel moves the whole totalBoost[id] to the pinned recipient while refunding the payer pro rata. A booster has no parameter (deadline, expected status, minimum remaining time) to bound that exposure, and the booster's funds leave their control the moment the boost lands even if the ad is cancelled in the next transaction. Nobody extracts value from anybody beyond what the brief specifies (the payer gains nothing from cancelling, the recipient would receive the boost at settlement anyway), the owner has no extra power here, and tests cover the behaviour (testImmediateCancellationRefundsOnlyBaseAndForfeitsAllBoostToPinnedRecipient, testNewListingOwnerCancelsBoostedAdButRefundStillBelongsToOriginalPayer). The website should keep disclosing it next to the boost action. No code change is proposed.","line":203,"path":"src/store/FeaturedPlacementsV2.sol","reproduction":"alice creates listing 1 and purchases placement 1 (0.1 IMD escrowed). bob deposits 0.2 IMD and calls boost(1, 0.2e18). In the next transaction alice (payer) or any later listing owner calls cancel(1). Expected per the brief and actual: available[alice] += 0.1e18 (full base refund, elapsed = 0), proceeds[recipient] += 0.2e18, available[bob] stays 0, totalEscrowed goes to 0. If cancel lands before the boost instead, boost reverts PlacementClosed and bob keeps 0.2e18 available.","severity":"info","snippet":"        earned += totalBoost[id];","title":"Trust assumption, by design: an unprivileged payer or current listing owner can forfeit any third party's entire boost to the proceeds recipient at will"}],"hash":"de8c2d5e5fe45bf327b95875e0843baa246475cd3823294084234b7e81667508","nodeId":"cf1bc3c8-c0c3-4cbd-b0e6-9548eb1e0d3e","outcome":"completed","summary":"The review is complete. The findings file is written and the tree is otherwise unchanged.\n\n**Result: no defect in the permission model.** The Access Control, Trust Gap and Asymmetry checks all hold against the code as it stands. The file `.imd-findings.json` carries one informational trust note and a coverage row for all 18 entry points plus three invariants.\n\n**What I verified**\n\n- Every owner power is exactly what the brief lists: one-time token choice, recipient for future purchases, two-step rotation. The owner has no sweep, cancel, spend or redirect path. A scratch test confirmed the owner's calls to cancel, withdraw, withdrawProceeds, boost and early settle all revert.\n- Recipient rotation cannot touch in-flight value. Each placement pins its recipient at purchase, and purchase takes an expected recipient, so the owner cannot sandwich a buyer or sweep escrowed boosts.\n- Every storage variable written by two or more functions is written only on behalf of msg.sender or the pinned payer and recipient. The deposit and withdraw, purchase and cancel or settle, and boost and close pairs mirror each other exactly.\n- The registry has no administrator. Listing identity includes the creator, so nobody can squat or block another claim. Self-transfer and relist-after-transfer keep the identity index consistent.\n- The vendored sources are byte-identical to the pinned upstream commit, and the V2 diff is confined to the briefed changes.\n- The live Ethereum IMD token is a verified, exact-match OpenZeppelin v5 ERC20 with a LayerZero OFT extension. It has no transfer fee, pause or blacklist. A fork rehearsal of deposit, purchase, boost, cancel and withdraw passed against it.\n- The full suite passes with the README's fuzz seed.\n\n| Check | Result |\n| --- | --- |\n| Foundry tests | 65 passed, 0 failed |\n| Entry points covered | 18 of 18 |\n\n**The one note** is a design-level trust assumption rather than a defect. Anyone may boost a placement, but the payer or the current listing owner may cancel it at any moment and the whole boost then goes to the proceeds recipient. The brief requires this and the README discloses it. The website should keep that disclosure next to the boost action.\n\n**Not covered:** the token owner's LayerZero bridge configuration can mint IMD on Ethereum. That is a property of the token, not of these contracts, and the brief fixes the token address.","treeHash":null,"usage":{"cachedInputTokens":1531983,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":32578,"runtime":"claude","turns":41,"wallClockMs":503031}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[],"hash":"deb4effed9bd09980d5f36eed745884b92203e86e8e625bf3ba72117f770f839","nodeId":"de5b745e-9a9a-4d5f-b025-c495bbfbe004","outcome":"completed","summary":"The review found no defects, so `.imd-findings.json` has an empty findings list and a coverage record of 20 rows. Those rows cover all 18 entry points, each marked `holds`, plus one row for the conservation invariant and one for deployment.\n\n**What I checked against the code**\n- **Changes from the audited original:** I cloned the source at commit `46e17ea`. `HookListingRegistry`, `ExactStoreToken` and `StoreAdmin` are byte-identical to it. `FeaturedPlacementsV2` changes only what the brief asks for: the 24-hour duration, `totalBoost`, `boost`, `rankOf`, and the per-placement totals returned by `featured`. It also adds the `#ad` label to the cancel and settle events, which the brief requires.\n- **Tests:** `forge test` passes all 73 tests. The suite already has the tests the brief asked for: a third-party boost, boost forfeiture on cancel, ranking ties, and invariant tests that include boosts (`FeaturedInvariant` and `FeaturedModelInvariant`).\n- **Deployment:** neither constructor calls another contract. Deployed sizes are 9,108 and 9,035 bytes, well under the 24,576 limit. `launch.json` has only `kind`, `contracts` and `notes`. Its constructor arguments match the declared parameters: none for the registry, and `$owner` then `$contract:HookListingRegistry` for `FeaturedPlacementsV2`. There is no delegatecall, selfdestruct or `tx.origin`, and ownership never comes from `msg.sender` at construction.\n\n**Specialist findings (all 5 were info level)**\nI reproduced each one in a scratch Foundry test, which I deleted afterwards. All four tests passed, and each describes behaviour the brief asks for, so I kept none as defects:\n- **Boost can be lost to an immediate cancel:** the economics and permissions specialists reported the same thing, so I merged them. If the payer or listing owner cancels right after someone boosts, the boost goes to the proceeds recipient. The brief says boosts are never refunded.\n- **Free cancel in the same block, and rounding:** cancelling in the same block refunds the full price. After 1 second, the refund is `99998842592592593` and the recipient's proceeds are `1157407407407`, so rounding favours the payer by under 1 wei. The formula is the same as in the audited original.\n- **The proceeds recipient can boost for free:** boosting then settling returns everything to the recipient, so their ranking costs them only gas. This is an owner trust assumption.\n- **Tokens sent directly to the contract are stuck:** they aren't recorded as anyone's balance, and there is deliberately no admin sweep to recover them.\n\n**Static-analysis leads, all rejected**\n- The \"strict equality\" warnings are enum status checks.\n- The ignored return value in `configureToken` is a deliberate check that the token has a working balance function.\n- The \"reentrancy\" warnings concern code that is already guarded against reentrancy, plus a read-only call to the project's own fixed registry.\n- The timestamp warnings are for the 24-hour expiry checks, which need the timestamp.\n\nThe working tree also has untracked files I didn't create (`.bashrc`, `.claude/`, `.vscode` and others). I left them alone.","treeHash":null,"usage":{"cachedInputTokens":715018,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":10322,"runtime":"claude","turns":16,"wallClockMs":133610}}],"verification":[{"checks":[{"durationMs":11156,"exitCode":0,"name":"build","output":"Compiling 38 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.98s\nCompiler run successful!\n","passed":true},{"durationMs":15907,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/FeaturedAdversarial.t.sol:FeaturedAdversarialTest\n[PASS] testBoostAndCloseNeedNoTransferAndFailedBoostProceedsWithdrawalIsAtomic() (gas: 3424146)\n[PASS] testFalseRevertingMalformedAndNoMovementTokensCannotCreateCredit() (gas: 1202299)\n[PASS] testMissingTokenCodeAfterConfigurationCannotFakeTransfer() (gas: 68265)\n[PASS] testNoReturnTokenWorksForDepositsAndWithdrawals() (gas: 264286)\n[PASS] testProceedsWithdrawalAlsoGuardsReentrancy() (gas: 1623477)\n[PASS] testRecipientCannotBlockCancellationOrSettlementAndFailedClaimRollsBack() (gas: 2098547)\n[PASS] testTaxedOrFailedWithdrawalRollsBackAndRemainsRetryable() (gas: 1194937)\n[PASS] testTokenCallbacksCannotReenterAnyCustodyMutation() (gas: 3495787)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 160.96ms (13.84ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:StoreDeploymentTest\n[PASS] testApplicationBytecodeIsBoundedAndHasNoForbiddenRuntimeOpcodes() (gas: 14503797)\n[PASS] testConstructionRequiresNoRegistryOrTokenCode() (gas: 77639)\n[PASS] testFactoryDeploymentAssignsExplicitOwnerAndMakesNoPayments() (gas: 1370938)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 174.26ms (93.00ms CPU time)\n\nRan 21 tests for test/FeaturedPlacements.t.sol:FeaturedPlacementsV2Test\n[PASS] testAdminRotationIsTwoStepAndDoesNotControlCustody() (gas: 805991)\n[PASS] testBadTokenConfigurationAndConstructorArguments() (gas: 1022370)\n[PASS] testCancelledPlacementCannotSettleOrCancelTwice() (gas: 1589471)\n[PASS] testDepositWithdrawBelongsToDepositorAndCannotBeSwept() (gas: 693554)\n[PASS] testDirectTransfersAreNotCreditsAndCannotBeSwept() (gas: 496842)\n[PASS] testEditingInvalidatesStalePurchaseAndFeeDisclosuresAreSnapshotted() (gas: 1995045)\n[PASS] testExpirySettlementIsPermissionlessAndCannotBeRepeatedOrRefunded() (gas: 1833508)\n[PASS] testFeaturedOrderingPaginationAndLabelsSkipCancelledAndExpired() (gas: 3112072)\n[PASS] testFuzzCancellationConservesFundsAndRoundsInPayersFavor(uint256) (runs: 256, μ: 1593259, ~: 1594792)\nLogs:\n  Bound result 84992\n\n[PASS] testHalfDurationCancellationSplitsFeeAndProceedsArePullBased() (gas: 1745233)\n[PASS] testImmediateCancellationFullyRefundsThenOwnerCanWithdraw() (gas: 1651089)\n[PASS] testOnlyListingOwnerCanBuyAndUnrelatedAccountsCannotCancelIncludingAdmin() (gas: 1766137)\n[PASS] testPurchaseCostsExactlyPointOneImdAndHasTwentyFourHourAdLabel() (gas: 1481770)\n[PASS] testRecipientRotationInvalidatesStalePurchaseBeforeFundsAreLocked() (gas: 1453620)\n[PASS] testRecipientsAreSnapshottedAndChangingThemCannotTakeOldFunds() (gas: 2419926)\n[PASS] testSingleLivePlacementButCanRenewUnsettledExpiredOrCancelledPlacement() (gas: 2502718)\n[PASS] testSnapshotSurvivesEditingArchivingTransferAndRefundStaysWithPayer() (gas: 2402298)\n[PASS] testStaleTermsInactiveListingInsufficientBalanceAndDeadlineFailBeforeDebit() (gas: 1405005)\n[PASS] testUnknownIdsAndInvalidPagesFail() (gas: 229958)\n[PASS] testUnsetConfigurationAndTokenCanOnlyBeChosenOnce() (gas: 703534)\n[PASS] testZeroAmountsInvalidRecipientsAndExcessWithdrawalsFail() (gas: 629719)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 174.04ms (140.36ms CPU time)\n\nRan 6 tests for test/FeaturedBoostEdges.t.sol:FeaturedBoostEdgesTest\n[PASS] testBoostAfterListingArchivedStillCountsAndFeaturedShowsTotal() (gas: 2006777)\n[PASS] testCarolCannotCancelOrSettleEarlyAfterBoostingAndOwnerHasNoPlacementPowers() (gas: 2002794)\n[PASS] testFuzzBoostSpendsUpToExactlyTheAvailableBalance(uint256,uint256) (runs: 1000, μ: 1692875, ~: 1694047)\nLogs:\n  Bound result 418377350959795296853106\n  Bound result 285367534243274511884147\n\n[PASS] testFuzzNewListingOwnerCancelForfeitsThirdPartyBoostAndRefundsSellerBase(uint256,uint256) (runs: 1000, μ: 2026239, ~: 2026224)\nLogs:\n  Bound result 25675\n  Bound result 711048788885997200493779\n\n[PASS] testPendingAndFormerOwnersCannotUseOwnerPowers() (gas: 505036)\n[PASS] testProceedsCannotFundBoostsAndDepositsCannotBeClaimedAsProceeds() (gas: 3023987)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 174.43ms (352.23ms CPU time)\n\nRan 5 tests for test/FeaturedTransfer.t.sol:FeaturedTransferTest\n[PASS] testBuyerCanClearSellersAdAndBuyItsOwnWhileOnlySellerGetsRefund() (gas: 3191852)\n[PASS] testFuzzNewOwnerCancellationConservesAllCredits(uint256) (runs: 256, μ: 1715318, ~: 1716843)\nLogs:\n  Bound result 96\n\n[PASS] testIntermediateOwnerLosesCancellationPowerButOriginalPayerKeepsIt() (gas: 1871955)\n[PASS] testNewOwnerCannotCancelAtExpiryAndCanRenewBeforeOldSettlement() (gas: 2171958)\n[PASS] testProposedOwnerCannotCancelUntilAcceptingAndAdminCannotCancel() (gas: 1841259)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 174.28ms (134.31ms CPU time)\n\nRan 11 tests for test/HookListingRegistry.t.sol:HookListingRegistryTest\n[PASS] testAuditUrlAndAuditLabelNeverConferVerification() (gas: 1866252)\n[PASS] testFreeCreateAndEditPersistAllFieldsAndHistory() (gas: 1618302)\n[PASS] testFuzzUnauthorizedCallerCannotModifyListing(address) (runs: 256, μ: 842645, ~: 842726)\n[PASS] testFuzzValidLabelsRemainSearchable(uint128) (runs: 256, μ: 747153, ~: 746204)\n[PASS] testInvalidIdentityUnknownRecordsAndPagesRevert() (gas: 931804)\n[PASS] testInvalidMetadataIsAtomicAndReferencesMayBeAbsent() (gas: 1106108)\n[PASS] testLabelValidationBoundsAndDuplicates() (gas: 965451)\n[PASS] testSameHookCanHaveIndependentOwnersButNoOwnerDuplicates() (gas: 2284749)\n[PASS] testSearchByLabelChainOwnerAndVisibilityUsesBoundedAscendingCursor() (gas: 2329424)\n[PASS] testTransferCanBeCancelledOrReplaced() (gas: 1022369)\n[PASS] testTwoStepListingTransferAndDuplicateProtection() (gas: 1824321)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 174.32ms (256.40ms CPU time)\n\nRan 15 tests for test/FeaturedBoost.t.sol:FeaturedBoostTest\n[PASS] testBoostLastSecondSucceedsButAtExpiryAndAfterSettlementFails() (gas: 1927719)\n[PASS] testBoostRejectsUnknownZeroAndInsufficientWithoutChangingCredits() (gas: 1877281)\n[PASS] testBoostUsesPurchasedSnapshotAfterListingEditArchiveAndTransfer() (gas: 2345637)\n[PASS] testCancelledBoostCannotBeRepeatedRefundedOrMovedToReplacement() (gas: 2380809)\n[PASS] testEmptyRegistryFeaturedReturnsTwoEmptyArrays() (gas: 13657)\n[PASS] testFeaturedPaginationKeepsTotalsAlignedAcrossGapsAndTerminalPages() (gas: 3004572)\n[PASS] testFuzzCancellationConservesMultipleBoostsAndPreservesBaseRounding(uint256,uint256,uint256) (runs: 256, μ: 2419090, ~: 2419189)\nLogs:\n  Bound result 100000000000000000\n  Bound result 95\n  Bound result 44716\n\n[PASS] testImmediateCancellationRefundsOnlyBaseAndForfeitsAllBoostToPinnedRecipient() (gas: 2131709)\n[PASS] testMaxFundedBoostCanCloseWithoutOverflow() (gas: 1904104)\n[PASS] testNewListingOwnerCancelsBoostedAdButRefundStillBelongsToOriginalPayer() (gas: 1973266)\n[PASS] testPermissionlessSettlementAtExpiryPaysBaseAndBoostToPinnedRecipient() (gas: 2008360)\n[PASS] testRankingTotalsSupportDescendingSortAndLowerIdWinsBothKindsOfTie() (gas: 4377034)\n[PASS] testRenewalBeforeOldSettlementKeepsBoostsAndRecipientsSeparate() (gas: 2642657)\n[PASS] testRepeatedBoostsFromPayerAndThirdPartyAccumulateWithoutExtendingExpiry() (gas: 2072184)\n[PASS] testThirdPartyBoostUsesOnlyItsOwnDepositAndDoesNotChangeTerms() (gas: 1922893)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 174.49ms (167.13ms CPU time)\n\nRan 1 test for test/FeaturedInvariant.t.sol:FeaturedInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-----------------+-----------------+-------+---------+----------╮\n| Contract        | Selector        | Calls | Reverts | Discards |\n+================================================================+\n| FeaturedHandler | advanceTime     | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | boost           | 1671  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | cancel          | 1598  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | claim           | 1634  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | deposit         | 1569  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | purchase        | 1667  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | rotateRecipient | 1691  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | settle          | 1672  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | toggleListing   | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | withdraw        | 1684  | 0       | 0        |\n╰-----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 80688\n  Bound result 1062\n  Bound result 10101\n  Bound result 93924482725083903\n  Bound result 11\n  Bound result 138172\n  Bound result 10052\n  Bound result 2957397981\n  Bound result 3331705070925616\n  Bound result 162255853182841218\n  Bound result 1\n  Bound result 122782\n  Bound result 1379769688819290\n  Bound result 30\n  Bound result 210341119941127360\n  Bound result 8594\n  Bound result 5930487529889678\n  Bound result 77872\n  Bound result 17\n  Bound result 14\n  Bound result 255\n  Bound result 5171\n  Bound result 2393\n  Bound result 1800000000\n  Bound result 11720177322074691\n  Bound result 97\n  Bound result 6\n  Bound result 9\n  Bound result 3239\n  Bound result 8453\n  Bound result 1989\n  Bound result 7266\n  Bound result 5\n  Bound result 341100283938\n  Bound result 91\n  Bound result 10552\n  Bound result 127\n  Bound result 254\n  Bound result 5352\n  Bound result 2926\n  Bound result 14035\n  Bound result 930\n  Bound result 100000000000000000\n  Bound result 172798\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.34s (8.33s CPU time)\n\nRan 1 test for test/FeaturedTransferInvariant.t.sol:FeaturedTransferInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| FeaturedTransferHandler | advanceTime            | 1362  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | boost                  | 1348  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancel                 | 1318  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancelAsCurrentOwner   | 1437  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | claim                  | 1368  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | deposit                | 1363  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | purchaseAsCurrentOwner | 1436  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | rotateRecipient        | 1305  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | settle                 | 1328  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | toggleCurrentListing   | 1345  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | transferListing        | 1410  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | withdraw               | 1364  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 791\n  Bound result 13\n  Bound result 2308\n  Bound result 2735009399\n  Bound result 8453\n  Bound result 97\n  Bound result 8766\n  Bound result 49152\n  Bound result 4102\n  Bound result 8480\n  Bound result 16188175653787\n  Bound result 614\n  Bound result 54849713292493848\n  Bound result 1\n  Bound result 6403\n  Bound result 3106\n  Bound result 7\n  Bound result 16014237686244650\n  Bound result 226449017643745667\n  Bound result 8723\n  Bound result 79083\n  Bound result 5287\n  Bound result 53917\n  Bound result 12868\n  Bound result 27160\n  Bound result 277\n  Bound result 4142\n  Bound result 1272320145310124\n  Bound result 16\n  Bound result 4136\n  Bound result 1682\n  Bound result 94034012890579009\n  Bound result 32\n  Bound result 10878\n  Bound result 267257964406164967\n  Bound result 99151\n  Bound result 3\n  Bound result 97\n  Bound result 179411892021295399\n  Bound result 1\n  Bound result 86400\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.48s (9.48s CPU time)\n\nRan 1 test for test/FeaturedModelInvariant.t.sol:FeaturedModelInvariantTest\n[PASS]\nFeaturedModelInvariantTest invariants:\n[PASS] invariantConservationWithBoostsMatchesModel\n[PASS] invariantFeaturedTotalsAreSortableByTotalThenId\n[PASS] invariantPlacementsMatchModelAndClosedNeverReopen\n FeaturedModelInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭----------------------+--------------------------+-------+---------+----------╮\n| Contract             | Selector                 | Calls | Reverts | Discards |\n+==============================================================================+\n| FeaturedModelHandler | advanceTime              | 1063  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | boost                    | 2134  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | cancel                   | 1104  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | deposit                  | 1044  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | donate                   | 1072  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | outsiderTriesOwnerPowers | 1077  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | purchase                 | 1121  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | rotateRecipient          | 1126  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | settle                   | 1090  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | toggleListing            | 1121  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | transferListing          | 1114  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | warpToExpiryEdge         | 1104  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | withdraw                 | 1086  | 0       | 0        |\n|----------------------+--------------------------+-------+---------+----------|\n| FeaturedModelHandler | withdrawProceeds         | 1128  | 0       | 0        |\n╰----------------------+--------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000000000\n  Bound result 100000000000000000\n  Bound result 300000000000000000\n  Bound result 33333333333333333\n  Bound result 100000000000000000\n  Bound result 2027\n  Bound result 1\n  Bound result 0\n  Bound result 208\n  Bound result 59450\n  Bound result 1657625749590528\n  Bound result 18\n  Bound result 1\n  Bound result 4\n  Bound result 253\n  Bound result 12509\n  Bound result 15\n  Bound result 0\n  Bound result 300000000000000000\n  Bound result 981\n  Bound result 1\n  Bound result 16\n  Bound result 11434\n  Bound result 32\n  Bound result 0\n  Bound result 0\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 98366124046753032\n  Bound result 798020860\n  Bound result 2209\n  Bound result 8453\n  Bound result 38212013\n  Bound result 6125\n  Bound result 4560\n  Bound result 99137305968115101\n  Bound result 3414\n  Bound result 1398\n  Bound result 72975\n  Bound result 1\n  Bound result 3431\n  Bound result 392\n  Bound result 18056843545631751\n  Bound result 253\n  Bound result 495399121\n  Bound result 13\n  Bound result 0\n  Bound result 32\n  Bound result 179123351154321103\n  Bound result 4663\n  Bound result 5\n  Bound result 5215\n  Bound result 1\n  Bound result 0\n  Bound result 530599886\n  Bound result 6400\n  Bound result 581550020771114\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.69s (10.68s CPU time)\n\nRan 1 test for test/HookListingRegistryInvariant.t.sol:HookListingRegistryInvariantTest\n[PASS] invariantListingsAndIdentityIndexMatchModel() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+----------------+-------+---------+----------╮\n| Contract             | Selector       | Calls | Reverts | Discards |\n+====================================================================+\n| RegistryModelHandler | accept         | 1277  | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| RegistryModelHandler | cancelTransfer | 1390  | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| RegistryModelHandler | create         | 1418  | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| RegistryModelHandler | propose        | 1340  | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| RegistryModelHandler | setActive      | 1375  | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| RegistryModelHandler | update         | 1392  | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.72s (15.71s CPU time)\n\nRan 11 test suites in 15.72s (45.43s CPU time): 73 tests passed, 0 failed, 0 skipped (73 total tests)\n","passed":true},{"durationMs":83,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FeaturedPlacementsV2.acceptOwnership()\",\"FeaturedPlacementsV2.boost(uint256,uint256)\",\"FeaturedPlacementsV2.cancel(uint256)\",\"FeaturedPlacementsV2.cancelOwnershipTransfer()\",\"FeaturedPlacementsV2.configureToken(address)\",\"FeaturedPlacementsV2.deposit(uint256)\",\"FeaturedPlacementsV2.purchase(uint256,uint256,address,uint256)\",\"FeaturedPlacementsV2.setProceedsRecipient(address)\",\"FeaturedPlacementsV2.settle(uint256)\",\"FeaturedPlacementsV2.transferOwnership(address)\",\"FeaturedPlacementsV2.withdraw(uint256,address)\",\"FeaturedPlacementsV2.withdrawProceeds(uint256,address)\",\"HookListingRegistry.acceptListingOwnership(uint256)\",\"HookListingRegistry.cancelListingTransfer(uint256)\",\"HookListingRegistry.createListing(uint256,address,(string,string,string,string,string,uint160,string,string,string,string[]))\",\"HookListingRegistry.proposeListingOwner(uint256,address)\",\"HookListingRegistry.setListingActive(uint256,bool)\",\"HookListingRegistry.updateListing(uint256,(string,string,string,string,string,uint160,string,string,string,string[]))\"],\"files\":{\".gitignore\":4,\"LICENSE\":24,\"README.md\":111,\"docs/SOURCE_PROVENANCE.md\":49,\"docs/VERIFICATION.md\":43,\"foundry.toml\":25,\"remappings.txt\":2,\"src/store/ExactStoreToken.sol\":48,\"src/store/FeaturedPlacementsV2.sol\":304,\"src/store/HookListingRegistry.sol\":217,\"src/store/StoreAdmin.sol\":46,\"test/Deployment.t.sol\":93,\"test/FeaturedAdversarial.t.sol\":202,\"test/FeaturedBoost.t.sol\":397,\"test/FeaturedBoostEdges.t.sol\":179,\"test/FeaturedInvariant.t.sol\":237,\"test/FeaturedModelInvariant.t.sol\":425,\"test/FeaturedPlacements.t.sol\":443,\"test/FeaturedTransfer.t.sol\":120,\"test/FeaturedTransferInvariant.t.sol\":82,\"test/HookListingRegistry.t.sol\":265,\"test/HookListingRegistryInvariant.t.sol\":209,\"test/helpers/StoreFixture.sol\":81,\"test/helpers/StoreTokenMock.sol\":82,\"test/helpers/TestToken.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1fe32e97a2854193b8abf98ed9328cebc1f4623fb9f77d4c76ab73454f4777d0","verifiedTreeHash":"432e0e24ccd94392b69f85c9684233f515c2bccb","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":3493,"exitCode":0,"name":"build","output":"Compiling 35 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.41s\nCompiler run successful!\n","passed":true},{"durationMs":5110,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/FeaturedTransfer.t.sol:FeaturedTransferTest\n[PASS] testBuyerCanClearSellersAdAndBuyItsOwnWhileOnlySellerGetsRefund() (gas: 3191852)\n[PASS] testFuzzNewOwnerCancellationConservesAllCredits(uint256) (runs: 256, μ: 1715624, ~: 1716843)\nLogs:\n  Bound result 8664\n\n[PASS] testIntermediateOwnerLosesCancellationPowerButOriginalPayerKeepsIt() (gas: 1871955)\n[PASS] testNewOwnerCannotCancelAtExpiryAndCanRenewBeforeOldSettlement() (gas: 2171958)\n[PASS] testProposedOwnerCannotCancelUntilAcceptingAndAdminCannotCancel() (gas: 1841259)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 37.22ms (35.63ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:StoreDeploymentTest\n[PASS] testApplicationBytecodeIsBoundedAndHasNoForbiddenRuntimeOpcodes() (gas: 14503797)\n[PASS] testConstructionRequiresNoRegistryOrTokenCode() (gas: 77639)\n[PASS] testFactoryDeploymentAssignsExplicitOwnerAndMakesNoPayments() (gas: 1370938)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 31.17ms (31.75ms CPU time)\n\nRan 21 tests for test/FeaturedPlacements.t.sol:FeaturedPlacementsV2Test\n[PASS] testAdminRotationIsTwoStepAndDoesNotControlCustody() (gas: 805991)\n[PASS] testBadTokenConfigurationAndConstructorArguments() (gas: 1022370)\n[PASS] testCancelledPlacementCannotSettleOrCancelTwice() (gas: 1589471)\n[PASS] testDepositWithdrawBelongsToDepositorAndCannotBeSwept() (gas: 693554)\n[PASS] testDirectTransfersAreNotCreditsAndCannotBeSwept() (gas: 496842)\n[PASS] testEditingInvalidatesStalePurchaseAndFeeDisclosuresAreSnapshotted() (gas: 1995045)\n[PASS] testExpirySettlementIsPermissionlessAndCannotBeRepeatedOrRefunded() (gas: 1833508)\n[PASS] testFeaturedOrderingPaginationAndLabelsSkipCancelledAndExpired() (gas: 3112072)\n[PASS] testFuzzCancellationConservesFundsAndRoundsInPayersFavor(uint256) (runs: 256, μ: 1593565, ~: 1594792)\nLogs:\n  Bound result 32\n\n[PASS] testHalfDurationCancellationSplitsFeeAndProceedsArePullBased() (gas: 1745233)\n[PASS] testImmediateCancellationFullyRefundsThenOwnerCanWithdraw() (gas: 1651089)\n[PASS] testOnlyListingOwnerCanBuyAndUnrelatedAccountsCannotCancelIncludingAdmin() (gas: 1766137)\n[PASS] testPurchaseCostsExactlyPointOneImdAndHasTwentyFourHourAdLabel() (gas: 1481770)\n[PASS] testRecipientRotationInvalidatesStalePurchaseBeforeFundsAreLocked() (gas: 1453620)\n[PASS] testRecipientsAreSnapshottedAndChangingThemCannotTakeOldFunds() (gas: 2419926)\n[PASS] testSingleLivePlacementButCanRenewUnsettledExpiredOrCancelledPlacement() (gas: 2502718)\n[PASS] testSnapshotSurvivesEditingArchivingTransferAndRefundStaysWithPayer() (gas: 2402298)\n[PASS] testStaleTermsInactiveListingInsufficientBalanceAndDeadlineFailBeforeDebit() (gas: 1405005)\n[PASS] testUnknownIdsAndInvalidPagesFail() (gas: 229958)\n[PASS] testUnsetConfigurationAndTokenCanOnlyBeChosenOnce() (gas: 703534)\n[PASS] testZeroAmountsInvalidRecipientsAndExcessWithdrawalsFail() (gas: 629719)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 56.72ms (58.92ms CPU time)\n\nRan 8 tests for test/FeaturedAdversarial.t.sol:FeaturedAdversarialTest\n[PASS] testBoostAndCloseNeedNoTransferAndFailedBoostProceedsWithdrawalIsAtomic() (gas: 3424146)\n[PASS] testFalseRevertingMalformedAndNoMovementTokensCannotCreateCredit() (gas: 1202299)\n[PASS] testMissingTokenCodeAfterConfigurationCannotFakeTransfer() (gas: 68265)\n[PASS] testNoReturnTokenWorksForDepositsAndWithdrawals() (gas: 264286)\n[PASS] testProceedsWithdrawalAlsoGuardsReentrancy() (gas: 1623477)\n[PASS] testRecipientCannotBlockCancellationOrSettlementAndFailedClaimRollsBack() (gas: 2098547)\n[PASS] testTaxedOrFailedWithdrawalRollsBackAndRemainsRetryable() (gas: 1194937)\n[PASS] testTokenCallbacksCannotReenterAnyCustodyMutation() (gas: 3495787)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 63.49ms (9.05ms CPU time)\n\nRan 11 tests for test/HookListingRegistry.t.sol:HookListingRegistryTest\n[PASS] testAuditUrlAndAuditLabelNeverConferVerification() (gas: 1866252)\n[PASS] testFreeCreateAndEditPersistAllFieldsAndHistory() (gas: 1618302)\n[PASS] testFuzzUnauthorizedCallerCannotModifyListing(address) (runs: 256, μ: 842645, ~: 842726)\n[PASS] testFuzzValidLabelsRemainSearchable(uint128) (runs: 256, μ: 747207, ~: 746204)\n[PASS] testInvalidIdentityUnknownRecordsAndPagesRevert() (gas: 931804)\n[PASS] testInvalidMetadataIsAtomicAndReferencesMayBeAbsent() (gas: 1106108)\n[PASS] testLabelValidationBoundsAndDuplicates() (gas: 965451)\n[PASS] testSameHookCanHaveIndependentOwnersButNoOwnerDuplicates() (gas: 2284749)\n[PASS] testSearchByLabelChainOwnerAndVisibilityUsesBoundedAscendingCursor() (gas: 2329424)\n[PASS] testTransferCanBeCancelledOrReplaced() (gas: 1022369)\n[PASS] testTwoStepListingTransferAndDuplicateProtection() (gas: 1824321)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 68.20ms (49.66ms CPU time)\n\nRan 15 tests for test/FeaturedBoost.t.sol:FeaturedBoostTest\n[PASS] testBoostLastSecondSucceedsButAtExpiryAndAfterSettlementFails() (gas: 1927719)\n[PASS] testBoostRejectsUnknownZeroAndInsufficientWithoutChangingCredits() (gas: 1877281)\n[PASS] testBoostUsesPurchasedSnapshotAfterListingEditArchiveAndTransfer() (gas: 2345637)\n[PASS] testCancelledBoostCannotBeRepeatedRefundedOrMovedToReplacement() (gas: 2380809)\n[PASS] testEmptyRegistryFeaturedReturnsTwoEmptyArrays() (gas: 13657)\n[PASS] testFeaturedPaginationKeepsTotalsAlignedAcrossGapsAndTerminalPages() (gas: 3004572)\n[PASS] testFuzzCancellationConservesMultipleBoostsAndPreservesBaseRounding(uint256,uint256,uint256) (runs: 256, μ: 2419093, ~: 2419189)\nLogs:\n  Bound result 6013194304912883236568319\n  Bound result 367787868421963501830986308975\n  Bound result 27304\n\n[PASS] testImmediateCancellationRefundsOnlyBaseAndForfeitsAllBoostToPinnedRecipient() (gas: 2131709)\n[PASS] testMaxFundedBoostCanCloseWithoutOverflow() (gas: 1904104)\n[PASS] testNewListingOwnerCancelsBoostedAdButRefundStillBelongsToOriginalPayer() (gas: 1973266)\n[PASS] testPermissionlessSettlementAtExpiryPaysBaseAndBoostToPinnedRecipient() (gas: 2008360)\n[PASS] testRankingTotalsSupportDescendingSortAndLowerIdWinsBothKindsOfTie() (gas: 4377034)\n[PASS] testRenewalBeforeOldSettlementKeepsBoostsAndRecipientsSeparate() (gas: 2642657)\n[PASS] testRepeatedBoostsFromPayerAndThirdPartyAccumulateWithoutExtendingExpiry() (gas: 2072184)\n[PASS] testThirdPartyBoostUsesOnlyItsOwnDepositAndDoesNotChangeTerms() (gas: 1922893)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 70.14ms (85.20ms CPU time)\n\nRan 1 test for test/FeaturedTransferInvariant.t.sol:FeaturedTransferInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| FeaturedTransferHandler | advanceTime            | 1362  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | boost                  | 1348  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancel                 | 1318  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancelAsCurrentOwner   | 1437  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | claim                  | 1368  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | deposit                | 1363  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | purchaseAsCurrentOwner | 1436  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | rotateRecipient        | 1305  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | settle                 | 1328  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | toggleCurrentListing   | 1345  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | transferListing        | 1410  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | withdraw               | 1364  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 791\n  Bound result 4663\n  Bound result 2308\n  Bound result 91\n  Bound result 2735009399\n  Bound result 8453\n  Bound result 513\n  Bound result 313\n  Bound result 4203\n  Bound result 9026\n  Bound result 16188175653787\n  Bound result 70\n  Bound result 27197158679649431\n  Bound result 1\n  Bound result 9032\n  Bound result 10\n  Bound result 16014237686244650\n  Bound result 226449017643745667\n  Bound result 513462040\n  Bound result 79083\n  Bound result 16172\n  Bound result 53917\n  Bound result 11982\n  Bound result 27160\n  Bound result 277\n  Bound result 7\n  Bound result 16\n  Bound result 3889\n  Bound result 144233964931945733\n  Bound result 393893725107251426\n  Bound result 32\n  Bound result 9934\n  Bound result 98553344782083169\n  Bound result 99151\n  Bound result 3\n  Bound result 97\n  Bound result 75027219742004163\n  Bound result 4571\n  Bound result 54857\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.90s (4.89s CPU time)\n\nRan 1 test for test/FeaturedInvariant.t.sol:FeaturedInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-----------------+-----------------+-------+---------+----------╮\n| Contract        | Selector        | Calls | Reverts | Discards |\n+================================================================+\n| FeaturedHandler | advanceTime     | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | boost           | 1671  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | cancel          | 1598  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | claim           | 1634  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | deposit         | 1569  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | purchase        | 1667  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | rotateRecipient | 1691  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | settle          | 1672  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | toggleListing   | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | withdraw        | 1684  | 0       | 0        |\n╰-----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 80688\n  Bound result 1062\n  Bound result 10101\n  Bound result 93924482725083903\n  Bound result 101\n  Bound result 138172\n  Bound result 10401\n  Bound result 292\n  Bound result 3331705070925616\n  Bound result 64027891605588745\n  Bound result 1\n  Bound result 4663\n  Bound result 74091\n  Bound result 1379769688819290\n  Bound result 56745986959625736\n  Bound result 39036421915919409\n  Bound result 8623\n  Bound result 39913457757277120\n  Bound result 77872\n  Bound result 17\n  Bound result 12\n  Bound result 242\n  Bound result 28142141643096\n  Bound result 8046\n  Bound result 2509\n  Bound result 786330611918701\n  Bound result 4394\n  Bound result 2300\n  Bound result 243\n  Bound result 9428091403307\n  Bound result 513\n  Bound result 7\n  Bound result 172800\n  Bound result 3431\n  Bound result 8453\n  Bound result 3268\n  Bound result 65329998992803\n  Bound result 3\n  Bound result 341100283938\n  Bound result 2\n  Bound result 64\n  Bound result 1834\n  Bound result 91\n  Bound result 86\n  Bound result 319\n  Bound result 4388\n  Bound result 14035\n  Bound result 1139790749\n  Bound result 1309\n  Bound result 16383\n  Bound result 172798\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.00s (5.00s CPU time)\n\nRan 8 test suites in 5.00s (10.23s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":58,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FeaturedPlacementsV2.acceptOwnership()\",\"FeaturedPlacementsV2.boost(uint256,uint256)\",\"FeaturedPlacementsV2.cancel(uint256)\",\"FeaturedPlacementsV2.cancelOwnershipTransfer()\",\"FeaturedPlacementsV2.configureToken(address)\",\"FeaturedPlacementsV2.deposit(uint256)\",\"FeaturedPlacementsV2.purchase(uint256,uint256,address,uint256)\",\"FeaturedPlacementsV2.setProceedsRecipient(address)\",\"FeaturedPlacementsV2.settle(uint256)\",\"FeaturedPlacementsV2.transferOwnership(address)\",\"FeaturedPlacementsV2.withdraw(uint256,address)\",\"FeaturedPlacementsV2.withdrawProceeds(uint256,address)\",\"HookListingRegistry.acceptListingOwnership(uint256)\",\"HookListingRegistry.cancelListingTransfer(uint256)\",\"HookListingRegistry.createListing(uint256,address,(string,string,string,string,string,uint160,string,string,string,string[]))\",\"HookListingRegistry.proposeListingOwner(uint256,address)\",\"HookListingRegistry.setListingActive(uint256,bool)\",\"HookListingRegistry.updateListing(uint256,(string,string,string,string,string,uint160,string,string,string,string[]))\"],\"files\":{\".gitignore\":4,\"LICENSE\":24,\"README.md\":111,\"docs/SOURCE_PROVENANCE.md\":49,\"docs/VERIFICATION.md\":43,\"foundry.toml\":25,\"remappings.txt\":2,\"src/store/ExactStoreToken.sol\":48,\"src/store/FeaturedPlacementsV2.sol\":304,\"src/store/HookListingRegistry.sol\":217,\"src/store/StoreAdmin.sol\":46,\"test/Deployment.t.sol\":93,\"test/FeaturedAdversarial.t.sol\":202,\"test/FeaturedBoost.t.sol\":397,\"test/FeaturedInvariant.t.sol\":237,\"test/FeaturedPlacements.t.sol\":443,\"test/FeaturedTransfer.t.sol\":120,\"test/FeaturedTransferInvariant.t.sol\":82,\"test/HookListingRegistry.t.sol\":265,\"test/helpers/StoreFixture.sol\":81,\"test/helpers/StoreTokenMock.sol\":82,\"test/helpers/TestToken.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":980,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/store/FeaturedPlacementsV2.sol:239: FeaturedPlacementsV2.getPlacement(uint256) (src/store/FeaturedPlacementsV2.sol#239-242) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/store/FeaturedPlacementsV2.sol:251: FeaturedPlacementsV2.rankOf(uint256) (src/store/FeaturedPlacementsV2.sol#251-254) uses a dangerous strict equality:\n[medium/medium] unused-return at src/store/FeaturedPlacementsV2.sol:107: FeaturedPlacementsV2.configureToken(address) (src/store/FeaturedPlacementsV2.sol#107-116) ignores return value by ExactStoreToken.balance(token,address(this)) (src/store/FeaturedPlacementsV2.sol#113)\n[low/medium] reentrancy-benign at src/store/FeaturedPlacementsV2.sol:126: Reentrancy in FeaturedPlacementsV2.deposit(uint256) (src/store/FeaturedPlacementsV2.sol#126-134):\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:148: FeaturedPlacementsV2.purchase(uint256,uint256,address,uint256) (src/store/FeaturedPlacementsV2.sol#148-176) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:251: FeaturedPlacementsV2.rankOf(uint256) (src/store/FeaturedPlacementsV2.sol#251-254) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:195: FeaturedPlacementsV2.cancel(uint256) (src/store/FeaturedPlacementsV2.sol#195-213) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:239: FeaturedPlacementsV2.getPlacement(uint256) (src/store/FeaturedPlacementsV2.sol#239-242) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:180: FeaturedPlacementsV2.boost(uint256,uint256) (src/store/FeaturedPlacementsV2.sol#180-190) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:244: FeaturedPlacementsV2.isActive(uint256) (src/store/FeaturedPlacementsV2.sol#244-247) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacementsV2.sol:216: FeaturedPlacementsV2.settle(uint256) (src/store/FeaturedPlacementsV2.sol#216-226) uses timestamp for comparisons","passed":true},{"durationMs":285,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/store/FeaturedPlacementsV2.sol:157: Reentrancy: State change after external call (2 places)\n[low] centralization-risk at src/store/FeaturedPlacementsV2.sol:107: Centralization Risk (4 places)\n[low] costly-loop at src/store/HookListingRegistry.sol:175: Costly operations inside loop (2 places)\n[low] large-numeric-literal at src/store/FeaturedPlacementsV2.sol:32: Large Numeric Literal\n[low] literal-instead-of-constant at src/store/ExactStoreToken.sol:19: Literal Instead of Constant (2 places)\n[low] non-reentrant-not-first at src/store/FeaturedPlacementsV2.sol:107: `nonReentrant` is Not the First Modifier\n[low] require-revert-in-loop at src/store/HookListingRegistry.sol:201: Loop Contains `require`/`revert` (3 places)\n[low] unchecked-return at src/store/FeaturedPlacementsV2.sol:113: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/store/HookListingRegistry.sol:175: Uninitialized Local Variable (5 places)\n[low] unsafe-erc20-operation at src/store/ExactStoreToken.sol:43: Unsafe ERC20 Operation","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a43ab87091e0e8f1b43339116157657b019f11df458fe3a6a3627067eb5be2ab","verifiedTreeHash":"8a7fb8c97169ecd8071bca78e0389d25051cf563","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":4486,"exitCode":0,"name":"build","output":"Compiling 35 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.35s\nCompiler run successful!\n","passed":true},{"durationMs":5848,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/FeaturedTransfer.t.sol:FeaturedTransferTest\n[PASS] testBuyerCanClearSellersAdAndBuyItsOwnWhileOnlySellerGetsRefund() (gas: 3191852)\n[PASS] testFuzzNewOwnerCancellationConservesAllCredits(uint256) (runs: 256, μ: 1715624, ~: 1716843)\nLogs:\n  Bound result 8664\n\n[PASS] testIntermediateOwnerLosesCancellationPowerButOriginalPayerKeepsIt() (gas: 1871955)\n[PASS] testNewOwnerCannotCancelAtExpiryAndCanRenewBeforeOldSettlement() (gas: 2171958)\n[PASS] testProposedOwnerCannotCancelUntilAcceptingAndAdminCannotCancel() (gas: 1841259)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 41.01ms (46.59ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:StoreDeploymentTest\n[PASS] testApplicationBytecodeIsBoundedAndHasNoForbiddenRuntimeOpcodes() (gas: 14503797)\n[PASS] testConstructionRequiresNoRegistryOrTokenCode() (gas: 77639)\n[PASS] testFactoryDeploymentAssignsExplicitOwnerAndMakesNoPayments() (gas: 1370938)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 46.79ms (47.94ms CPU time)\n\nRan 8 tests for test/FeaturedAdversarial.t.sol:FeaturedAdversarialTest\n[PASS] testBoostAndCloseNeedNoTransferAndFailedBoostProceedsWithdrawalIsAtomic() (gas: 3424146)\n[PASS] testFalseRevertingMalformedAndNoMovementTokensCannotCreateCredit() (gas: 1202299)\n[PASS] testMissingTokenCodeAfterConfigurationCannotFakeTransfer() (gas: 68265)\n[PASS] testNoReturnTokenWorksForDepositsAndWithdrawals() (gas: 264286)\n[PASS] testProceedsWithdrawalAlsoGuardsReentrancy() (gas: 1623477)\n[PASS] testRecipientCannotBlockCancellationOrSettlementAndFailedClaimRollsBack() (gas: 2098547)\n[PASS] testTaxedOrFailedWithdrawalRollsBackAndRemainsRetryable() (gas: 1194937)\n[PASS] testTokenCallbacksCannotReenterAnyCustodyMutation() (gas: 3495787)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 83.30ms (21.47ms CPU time)\n\nRan 21 tests for test/FeaturedPlacements.t.sol:FeaturedPlacementsV2Test\n[PASS] testAdminRotationIsTwoStepAndDoesNotControlCustody() (gas: 805991)\n[PASS] testBadTokenConfigurationAndConstructorArguments() (gas: 1022370)\n[PASS] testCancelledPlacementCannotSettleOrCancelTwice() (gas: 1589471)\n[PASS] testDepositWithdrawBelongsToDepositorAndCannotBeSwept() (gas: 693554)\n[PASS] testDirectTransfersAreNotCreditsAndCannotBeSwept() (gas: 496842)\n[PASS] testEditingInvalidatesStalePurchaseAndFeeDisclosuresAreSnapshotted() (gas: 1995045)\n[PASS] testExpirySettlementIsPermissionlessAndCannotBeRepeatedOrRefunded() (gas: 1833508)\n[PASS] testFeaturedOrderingPaginationAndLabelsSkipCancelledAndExpired() (gas: 3112072)\n[PASS] testFuzzCancellationConservesFundsAndRoundsInPayersFavor(uint256) (runs: 256, μ: 1593565, ~: 1594792)\nLogs:\n  Bound result 100\n\n[PASS] testHalfDurationCancellationSplitsFeeAndProceedsArePullBased() (gas: 1745233)\n[PASS] testImmediateCancellationFullyRefundsThenOwnerCanWithdraw() (gas: 1651089)\n[PASS] testOnlyListingOwnerCanBuyAndUnrelatedAccountsCannotCancelIncludingAdmin() (gas: 1766137)\n[PASS] testPurchaseCostsExactlyPointOneImdAndHasTwentyFourHourAdLabel() (gas: 1481770)\n[PASS] testRecipientRotationInvalidatesStalePurchaseBeforeFundsAreLocked() (gas: 1453620)\n[PASS] testRecipientsAreSnapshottedAndChangingThemCannotTakeOldFunds() (gas: 2419926)\n[PASS] testSingleLivePlacementButCanRenewUnsettledExpiredOrCancelledPlacement() (gas: 2502718)\n[PASS] testSnapshotSurvivesEditingArchivingTransferAndRefundStaysWithPayer() (gas: 2402298)\n[PASS] testStaleTermsInactiveListingInsufficientBalanceAndDeadlineFailBeforeDebit() (gas: 1405005)\n[PASS] testUnknownIdsAndInvalidPagesFail() (gas: 229958)\n[PASS] testUnsetConfigurationAndTokenCanOnlyBeChosenOnce() (gas: 703534)\n[PASS] testZeroAmountsInvalidRecipientsAndExcessWithdrawalsFail() (gas: 629719)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 83.21ms (64.22ms CPU time)\n\nRan 15 tests for test/FeaturedBoost.t.sol:FeaturedBoostTest\n[PASS] testBoostLastSecondSucceedsButAtExpiryAndAfterSettlementFails() (gas: 1927719)\n[PASS] testBoostRejectsUnknownZeroAndInsufficientWithoutChangingCredits() (gas: 1877281)\n[PASS] testBoostUsesPurchasedSnapshotAfterListingEditArchiveAndTransfer() (gas: 2345637)\n[PASS] testCancelledBoostCannotBeRepeatedRefundedOrMovedToReplacement() (gas: 2380809)\n[PASS] testEmptyRegistryFeaturedReturnsTwoEmptyArrays() (gas: 13657)\n[PASS] testFeaturedPaginationKeepsTotalsAlignedAcrossGapsAndTerminalPages() (gas: 3004572)\n[PASS] testFuzzCancellationConservesMultipleBoostsAndPreservesBaseRounding(uint256,uint256,uint256) (runs: 256, μ: 2419093, ~: 2419189)\nLogs:\n  Bound result 16383\n  Bound result 91\n  Bound result 44716\n\n[PASS] testImmediateCancellationRefundsOnlyBaseAndForfeitsAllBoostToPinnedRecipient() (gas: 2131709)\n[PASS] testMaxFundedBoostCanCloseWithoutOverflow() (gas: 1904104)\n[PASS] testNewListingOwnerCancelsBoostedAdButRefundStillBelongsToOriginalPayer() (gas: 1973266)\n[PASS] testPermissionlessSettlementAtExpiryPaysBaseAndBoostToPinnedRecipient() (gas: 2008360)\n[PASS] testRankingTotalsSupportDescendingSortAndLowerIdWinsBothKindsOfTie() (gas: 4377034)\n[PASS] testRenewalBeforeOldSettlementKeepsBoostsAndRecipientsSeparate() (gas: 2642657)\n[PASS] testRepeatedBoostsFromPayerAndThirdPartyAccumulateWithoutExtendingExpiry() (gas: 2072184)\n[PASS] testThirdPartyBoostUsesOnlyItsOwnDepositAndDoesNotChangeTerms() (gas: 1922893)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 83.16ms (97.84ms CPU time)\n\nRan 11 tests for test/HookListingRegistry.t.sol:HookListingRegistryTest\n[PASS] testAuditUrlAndAuditLabelNeverConferVerification() (gas: 1866252)\n[PASS] testFreeCreateAndEditPersistAllFieldsAndHistory() (gas: 1618302)\n[PASS] testFuzzUnauthorizedCallerCannotModifyListing(address) (runs: 256, μ: 842645, ~: 842726)\n[PASS] testFuzzValidLabelsRemainSearchable(uint128) (runs: 256, μ: 747207, ~: 746204)\n[PASS] testInvalidIdentityUnknownRecordsAndPagesRevert() (gas: 931804)\n[PASS] testInvalidMetadataIsAtomicAndReferencesMayBeAbsent() (gas: 1106108)\n[PASS] testLabelValidationBoundsAndDuplicates() (gas: 965451)\n[PASS] testSameHookCanHaveIndependentOwnersButNoOwnerDuplicates() (gas: 2284749)\n[PASS] testSearchByLabelChainOwnerAndVisibilityUsesBoundedAscendingCursor() (gas: 2329424)\n[PASS] testTransferCanBeCancelledOrReplaced() (gas: 1022369)\n[PASS] testTwoStepListingTransferAndDuplicateProtection() (gas: 1824321)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 83.26ms (62.24ms CPU time)\n\nRan 1 test for test/FeaturedTransferInvariant.t.sol:FeaturedTransferInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| FeaturedTransferHandler | advanceTime            | 1362  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | boost                  | 1348  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancel                 | 1318  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancelAsCurrentOwner   | 1437  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | claim                  | 1368  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | deposit                | 1363  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | purchaseAsCurrentOwner | 1436  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | rotateRecipient        | 1305  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | settle                 | 1328  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | toggleCurrentListing   | 1345  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | transferListing        | 1410  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | withdraw               | 1364  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 791\n  Bound result 4663\n  Bound result 2308\n  Bound result 91\n  Bound result 2735009399\n  Bound result 8453\n  Bound result 513\n  Bound result 313\n  Bound result 4203\n  Bound result 9026\n  Bound result 16188175653787\n  Bound result 70\n  Bound result 27197158679649431\n  Bound result 1\n  Bound result 9032\n  Bound result 10\n  Bound result 16014237686244650\n  Bound result 226449017643745667\n  Bound result 513462040\n  Bound result 79083\n  Bound result 16172\n  Bound result 53917\n  Bound result 11982\n  Bound result 27160\n  Bound result 277\n  Bound result 7\n  Bound result 16\n  Bound result 3889\n  Bound result 144233964931945733\n  Bound result 393893725107251426\n  Bound result 32\n  Bound result 9934\n  Bound result 98553344782083169\n  Bound result 99151\n  Bound result 3\n  Bound result 97\n  Bound result 75027219742004163\n  Bound result 4571\n  Bound result 54857\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.55s (5.54s CPU time)\n\nRan 1 test for test/FeaturedInvariant.t.sol:FeaturedInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 128, calls: 16384, reverts: 0)\n\n╭-----------------+-----------------+-------+---------+----------╮\n| Contract        | Selector        | Calls | Reverts | Discards |\n+================================================================+\n| FeaturedHandler | advanceTime     | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | boost           | 1671  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | cancel          | 1598  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | claim           | 1634  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | deposit         | 1569  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | purchase        | 1667  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | rotateRecipient | 1691  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | settle          | 1672  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | toggleListing   | 1599  | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | withdraw        | 1684  | 0       | 0        |\n╰-----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 300000000000000000\n  Bound result 50000000000000000\n  Bound result 50000000000000000\n  Bound result 80688\n  Bound result 1062\n  Bound result 10101\n  Bound result 93924482725083903\n  Bound result 101\n  Bound result 138172\n  Bound result 10401\n  Bound result 292\n  Bound result 3331705070925616\n  Bound result 64027891605588745\n  Bound result 1\n  Bound result 4663\n  Bound result 74091\n  Bound result 1379769688819290\n  Bound result 56745986959625736\n  Bound result 39036421915919409\n  Bound result 8623\n  Bound result 39913457757277120\n  Bound result 77872\n  Bound result 17\n  Bound result 12\n  Bound result 242\n  Bound result 28142141643096\n  Bound result 8046\n  Bound result 2509\n  Bound result 786330611918701\n  Bound result 4394\n  Bound result 2300\n  Bound result 243\n  Bound result 9428091403307\n  Bound result 513\n  Bound result 7\n  Bound result 172800\n  Bound result 3431\n  Bound result 8453\n  Bound result 3268\n  Bound result 65329998992803\n  Bound result 3\n  Bound result 341100283938\n  Bound result 2\n  Bound result 64\n  Bound result 1834\n  Bound result 91\n  Bound result 86\n  Bound result 319\n  Bound result 4388\n  Bound result 14035\n  Bound result 1139790749\n  Bound result 1309\n  Bound result 16383\n  Bound result 172798\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.72s (5.72s CPU time)\n\nRan 8 test suites in 5.72s (11.69s CPU time): 65 tests passed, 0 failed, 0 skipped (65 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FeaturedPlacementsV2.acceptOwnership()\",\"FeaturedPlacementsV2.boost(uint256,uint256)\",\"FeaturedPlacementsV2.cancel(uint256)\",\"FeaturedPlacementsV2.cancelOwnershipTransfer()\",\"FeaturedPlacementsV2.configureToken(address)\",\"FeaturedPlacementsV2.deposit(uint256)\",\"FeaturedPlacementsV2.purchase(uint256,uint256,address,uint256)\",\"FeaturedPlacementsV2.setProceedsRecipient(address)\",\"FeaturedPlacementsV2.settle(uint256)\",\"FeaturedPlacementsV2.transferOwnership(address)\",\"FeaturedPlacementsV2.withdraw(uint256,address)\",\"FeaturedPlacementsV2.withdrawProceeds(uint256,address)\",\"HookListingRegistry.acceptListingOwnership(uint256)\",\"HookListingRegistry.cancelListingTransfer(uint256)\",\"HookListingRegistry.createListing(uint256,address,(string,string,string,string,string,uint160,string,string,string,string[]))\",\"HookListingRegistry.proposeListingOwner(uint256,address)\",\"HookListingRegistry.setListingActive(uint256,bool)\",\"HookListingRegistry.updateListing(uint256,(string,string,string,string,string,uint160,string,string,string,string[]))\"],\"files\":{\".gitignore\":4,\"LICENSE\":24,\"README.md\":111,\"docs/SOURCE_PROVENANCE.md\":49,\"docs/VERIFICATION.md\":43,\"foundry.toml\":25,\"launch.json\":17,\"remappings.txt\":2,\"src/store/ExactStoreToken.sol\":48,\"src/store/FeaturedPlacementsV2.sol\":304,\"src/store/HookListingRegistry.sol\":217,\"src/store/StoreAdmin.sol\":46,\"test/Deployment.t.sol\":93,\"test/FeaturedAdversarial.t.sol\":202,\"test/FeaturedBoost.t.sol\":397,\"test/FeaturedInvariant.t.sol\":237,\"test/FeaturedPlacements.t.sol\":443,\"test/FeaturedTransfer.t.sol\":120,\"test/FeaturedTransferInvariant.t.sol\":82,\"test/HookListingRegistry.t.sol\":265,\"test/helpers/StoreFixture.sol\":81,\"test/helpers/StoreTokenMock.sol\":82,\"test/helpers/TestToken.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"af314ffc406b3c9c79704fc4508a721cabd4fb7e3e8ea9f0f2c46b71a7ec3347","verifiedTreeHash":"1c154d75cd7a9f1cd3a1b17c92e266fa00e2865c","verifierVersion":"0.1.0+560ab6a2"}]}