{"assessments":[],"deployments":[{"attestationHash":"b0af4092bcf585ec4b830a250082f5ef1fdf6f366993af5332ab94a3ef3f1b06","chainId":1,"contracts":[{"address":"0xa5ee8a1f2aa98f08755f80bb278528d789f1e8f3","blockNumber":26221596,"name":"IMDPot","role":"other","txHash":"0x3409199f4b2e8faa6a01fa2cada460fe93b6232df5b7b3b0151a3d33c21de738"}],"id":"eb0cc821-2cbd-46ee-a720-014594db03e2","manifestHash":"918d82f910e4fda315cca29d8f1b1dc071d8198b52149f95ca5eea3014995c48","status":"live"}],"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":"5cc31334-d746-4f06-98be-665f9c786c72","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"8fbc66d353228570a35ca52a9aa758cf5ce10707e864045bee97a415984993d3","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":"3cb0996bd3e57be1501d6be5b81bba109dbf1b6f6cd668e8ae14b1213d6c2c6b","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":"9896b575317fad7c97bc2c4e941f71a1747ac1d2c66acec31d9badf9441eff54","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":"a373285a27921981c74e6fda718945c94d5920a2ffdbcbca1947f04f013cd23c","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":"b40811d59ab51582d99abfcf2872f1d9e5c507faddb095bead7dc3c7eb96d0c2","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":"a6e36d3ab22d909a09b00671c8d0f30b9c3162c429addcc26e0e2313398d5e04","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":"33508bb50a8400c51a55dd90500c1d1756a5a5c4a9c0d3e70b9979dfa9040853","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"e0ebd0c523f188e92b1392ffe9f83fb4c886e31944c471461827deb1a636b7d9","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":"I already have an existing IMDPot website here:  \nhttps://imdpot-the-imd-jackpot-room.sites.imd.fun/\n\nIn the previous job, the swarm prepared an updated version of the contract that uses:\n- Future-blockhash randomness (no Chainlink VRF)\n- Privy support\n- Owner panel\n- Correct 15-minute jackpot logic with 70/10/5/15 distribution and loyalty points\n\nPlease deploy a **new** clean contract using that updated logic.\n\nAfter deployment, connect this new contract to the existing website so the game becomes fully playable (players can buy tickets, timer works, and rounds can be finalized).\n\nDo not try to upgrade the old contract — deploy a fresh one.","parentJobId":null,"planHash":"660c2f9d4dff8c529894f4c3cfd1a1182031e6411d10e719ebe88b1336689176","previousHash":"07517147836b42ba333c6338f8af3592013d52a7d0d49de767daf40f30e7c9e8","projectId":"5cc31334-d746-4f06-98be-665f9c786c72","publication":{"commit":"b60026be5455bdeed5a8adc224fe0ef57ffe68f4","deliveredAt":"2026-10-18T19:39:05.947Z","repoUrl":"https://github.com/identity-md-launches/launch-2183-i-already-have-existing"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"f68677e24c2da309c62662ddc9baaefe3c45f920a78de2b12b1eb9e13c48f087","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"5e3ba5347cf38f88da41b49efa071d35e4957b00f6d1de8627778502cc296471","device":"990f3cfeaa0e6c9a","findings":[],"hash":"33508bb50a8400c51a55dd90500c1d1756a5a5c4a9c0d3e70b9979dfa9040853","nodeId":"bdf600e4-b32b-4bbc-8827-0e9eda1a8f85","outcome":"completed","summary":"Created [launch.json](/home/imd6/.identitymd/work/5cc31334-d746-4f06-98be-665f9c786c72/bdf600e4-b32b-4bbc-8827-0e9eda1a8f85/launch.json) for a fresh `IMDPot` deployment with `$owner`, matching the compiled constructor ABI.\n\n`forge build` succeeded; all 42 tests passed with the specified fuzz seed. Only the manifest changed.\n\nDeployment, owner token configuration, and website publication remain subsequent launch steps.","treeHash":"1db9eec2fc86ed22e4395383d3f02989e7bfb40e","usage":{"cachedInputTokens":216412,"inputTokens":50714,"model":"gpt-6.1-sol","outputTokens":2777,"runtime":"codex","turns":3,"wallClockMs":62768}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"06d00e98fbdd1ee9","findings":[{"citation":"resolved","description":"cancelRound() on an Active round requires paused == true (line 340), while the first phase of finalizeRound() on the same round requires paused == false (line 275: `if (paused) revert EnforcedPause();`). The two permissionless recovery paths for an ended round are therefore mutually exclusive on the single owner-controlled `paused` flag, and the owner can flip it at any time at ~30k gas. An owner (or anyone holding the owner key) that unpauses in front of every cancelRound() and pauses in front of every finalizeRound() keeps the round Active forever: tickets stay in `round.pool`, nothing becomes refundable or claimable, and new entries are closed because block.timestamp >= endTime. README.md line 106 and docs/SECURITY.md line 42 state that the 24-hour paused timeout lets active-round participants recover their funds from a malicious or lost owner; for a malicious owner that guarantee does not hold. This is a documented-trust gap rather than a theft path (the owner never receives the tokens), so severity is low. Minimal fix that preserves the pause feature for entries: let the first finalizeRound() phase proceed while paused once block.timestamp >= round.endTime (pause then only blocks purchases, which already cannot happen after the deadline), or alternatively let cancelRound() succeed after endTime + CANCEL_DELAY regardless of `paused`. Either way one of the two paths must be reachable without the owner's cooperation after the delay.","line":340,"path":"src/IMDPot.sol","reproduction":"State: token set, alice buys 10 tickets in round 1 (pool = 1 IMD), owner calls pause(). Warp to endTime + 30 days (far past CANCEL_DELAY). Repeat each block: (1) owner unpause(); keeper cancelRound() -> reverts CancelTooEarly because !paused; (2) owner pause(); keeper finalizeRound() -> reverts EnforcedPause. Expected (per README/SECURITY): after 24 hours paused, participants can recover funds. Actual: getRound(1).status stays Active, getRound(1).pool == 1e18, totalRefundable == 0, totalClaimable == 0, alice.refund(1) reverts RoundNotCancelled, for as long as the owner keeps flipping. Foundry sequence is in test/scratch/OwnerHostage.t.sol (passes on current code, i.e. demonstrates the stall).","severity":"low","snippet":"            if (!paused || block.timestamp < uint256(round.endTime) + CANCEL_DELAY) revert CancelTooEarly();","title":"Owner can keep an ended round's pool hostage indefinitely by toggling pause around cancelRound/finalizeRound"},{"citation":"resolved","description":"setToken() can be called exactly once and there is no replacement path, so the operator's choice is permanent. The address README.md line 114 tells the owner to configure (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) was checked on Ethereum mainnet during this review: it has 22,990 bytes of runtime, symbol() returns \"IMD\", decimals() returns 18, and the Sourcify-verified source is contract `BridgedFP is OFT` (LayerZero oft-evm) with owner-only updateName/updateSymbol/updateNameAndSymbol whose revert strings read \"FPHyperLiquid: ...\". Consequences for this pot: (a) symbol/name are not evidence of identity, since the token owner can rename it at will; (b) supply on Ethereum is minted by the LayerZero endpoint on lzReceive from peers the token owner configures, so the token owner can mint arbitrary IMD, buy up to 1,000,000 tickets per call and dominate every draw; (c) balanceOf is a plain OpenZeppelin ERC20 mapping (balance slot 5), transfers are untaxed and cheap, so the exact-transfer checks at lines 263-265 and 519-527 and the 150,000-gas fee stipend at lines 381/391 are compatible with it. No change to IMDPot is required; this is an operational trust assumption that should be confirmed against the project's authoritative token records before the one-shot setToken(), as the README already advises. Reported as info for the judge's deployment checklist.","line":206,"path":"src/IMDPot.sol","reproduction":"cast call --rpc-url https://ethereum-rpc.publicnode.com 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 'symbol()(string)' -> \"IMD\"; 'decimals()(uint8)' -> 18; curl https://sourcify.dev/server/v2/contract/1/0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7?fields=sources -> src/BridgedFP.sol, `contract BridgedFP is OFT`, `updateSymbol(string) onlyOwner`, require strings 'FPHyperLiquid: symbol cannot be empty'. Expected: an immutable project token whose identity can be read on chain. Actual: an owner-renamable bridged OFT; after setToken() the pot cannot be re-pointed if this turns out not to be the intended asset.","severity":"info","snippet":"        if (token != address(0)) revert TokenAlreadySet();","title":"Irreversible setToken target shown by the site is a re-labelled LayerZero OFT whose name/symbol and cross-chain supply are controlled by the token owner"}],"hash":"3cb0996bd3e57be1501d6be5b81bba109dbf1b6f6cd668e8ae14b1213d6c2c6b","nodeId":"8cbddce2-7412-416c-b536-953b1a97fbe6","outcome":"completed","summary":"Review complete. The findings and the full coverage record are in `.imd-findings.json`; no tracked file was changed, and the only scratch test lives under `test/scratch/`.\n\n**Outcome.** The control flow of `IMDPot` holds up under the Execution Trace, Periphery and First Principles passes. I traced all 16 entry points, the Fenwick tree library, and the conservation invariant, and reran the existing suites. Two findings are recorded, neither critical or high.\n\n- **Low, `cancelRound` at src/IMDPot.sol:340.** An ended round's two permissionless recovery paths are mutually exclusive on the owner-controlled `paused` flag. Cancel needs paused, the first finalize phase needs unpaused. An owner that flips the flag in front of each third-party transaction keeps the round Active forever, with the pool stuck. This contradicts the README and SECURITY.md claim that the 24-hour timeout protects participants from a malicious owner. The sequence is demonstrated in `test/scratch/OwnerHostage.t.sol`. Suggested fix: let the commit phase of `finalizeRound` run while paused once the round has ended, or let the paused-round cancel ignore the pause after the delay.\n- **Info, `setToken` at src/IMDPot.sol:206.** I probed the live address the README tells the owner to configure. It is a Sourcify-verified LayerZero OFT named `BridgedFP`, with owner-renamable name and symbol and revert strings reading \"FPHyperLiquid\". Its supply on Ethereum is mintable through the token owner's bridge peers. Transfers are plain OpenZeppelin ERC20, so the exact-transfer checks and 150k fee stipend are compatible. Since `setToken` is one-shot, this is worth confirming against authoritative records before configuration.\n\n**What I checked and found sound.** Deadline and draw-window boundaries, the 3-block commit, zero-hash rejection, prize and fee rounding with dust to first prize, ticket-level removal in the draw, boost consumption and restoration, the single unsettled loyalty record, reentrancy guarding including the isolated fee self-call, exact transfer checks on both directions, and the obligations-equals-balance invariant. The 42 Foundry tests, 12 Node tests and 4 Python tests all pass. Slither and Aderyn leads were all either guarded by the reentrancy lock or benign strict-equality on enums.\n\n**Not reached.** The end-to-end Anvil and browser run connecting the site to a deployment was not executed here, matching the README's own limitation, so the website wiring row is marked unreached.","treeHash":null,"usage":{"cachedInputTokens":1266336,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":39981,"runtime":"claude","turns":31,"wallClockMs":691420}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"96eeb8eb2acdbbf1","findings":[{"citation":"resolved","description":"Economic Security / randomness. The requested design uses a future blockhash and the README accepts that 'block producers can influence' it. The implementation amplifies that accepted risk from 'a producer who happens to land on the draw block' to 'any producer who wants to': (1) finalizeRound() in the Active branch may be called by anyone at any time after endTime, with no deadline, and it fixes drawBlock = block.number + 3 (line 278; DRAW_DELAY_BLOCKS = 3 at line 19). (2) Ethereum's beacon chain publishes the proposer of every slot in the current and the next epoch, i.e. up to 64 slots ahead, and MEV-Boost builders bid for the right to build any upcoming slot. So a participant who runs a validator, or who acts as a builder for one slot, simply waits until the block three ahead of 'now' is its own slot and only then submits the commit. At the draw slot it builds many candidate blocks (reordering or appending its own transactions changes the block hash at negligible cost), computes keccak256(abi.encode(candidateHash, chainid, pot, roundId)) exactly as line 288 does, and publishes the first candidate whose derived position lands on one of its own tickets. The 256-block settlement window and the permissionless second call then pay it. Who profits / who loses: the attacker with any small ticket share takes the 40% first prize (and can also target second and third); every other ticket holder's expected return falls accordingly. Concrete economics: pool 100 IMD (1,000 tickets), attacker holds 10 tickets (1 IMD stake, 1% share). Per candidate block P(first prize) = 1%; after ~339 candidates (observed in the scratch test) a winning hash is found; the attacker's claimable becomes 40 IMD for a 1 IMD stake, an expected profit of ~+39 IMD per round versus the honest expectation of 0.7 IMD. Grinding 1,000 candidate hashes succeeds with probability 1-(0.99)^1000 > 99.99%, so the outcome is effectively chosen, not random. The only cost is the MEV-Boost bid or the validator's own slot, which the prize funds. Preconditions: the attacker (or a colluding builder) controls block production for one slot it can see coming, which the public lookahead and the builder market make routinely achievable; no privileged role on IMDPot is needed. Design-preserving mitigation: keep future-blockhash randomness but place the target beyond the proposer lookahead so the committer cannot know who will produce the draw block (DRAW_DELAY_BLOCKS >= 65 slots; with missed slots in mind, e.g. 80), and/or derive the random word from several consecutive blockhashes (drawBlock .. drawBlock+k) so one slot is no longer enough. Both keep the no-VRF, no-oracle design; the first adds roughly 13-16 minutes between a round's close and its settlement, which is the trade-off the requester must accept against the 15-minute cadence. A tighter commit deadline alone does not help because the attacker chooses the commit timing inside any window that contains its slot.","line":278,"path":"src/IMDPot.sol","reproduction":"State: token configured; victim buys 990 tickets, attacker buys 10 tickets in round 1 (pool 100 IMD, attacker share 1%). Step 1: at any block N after round.endTime where the attacker knows it produces block N+3 (public lookahead), the attacker calls finalizeRound(); line 278 stores drawBlock = N+3; the test asserts drawBlock - N == 3, far inside the 64-slot lookahead. Step 2: at block N+3 the attacker builds candidate blocks and, for each candidate hash H, computes word = keccak256(abi.encode(H, block.chainid, pot, 1)) and position = keccak256(abi.encode(word, 0)) % totalWeight(1) (== 10,000,000); it publishes the first candidate with position >= 9,900,000 (lands on its tickets). Step 3: anyone calls finalizeRound() at N+4..N+259. Actual: getRound(1).winners[0] == attacker and claimable(attacker) == 40 ether (40% of 100 IMD) for a 1 IMD stake; the honest victim with 99% of tickets loses first prize. Expected: a party with 1% of the weight should win first prize 1% of the time and should not be able to choose the draw block or its hash. Scratch tests under test/scratch/DrawLookahead.t.sol reproduce both steps (test_drawBlockIsCommittedBeyondProposerLookahead fails on the current code with '3 <= 64'; test_grindingTargetHashLetsOnePercentShareWinFirstPrize finds a winning candidate after 339 hashes and shows claimable(attacker) == 40 ether).","severity":"medium","snippet":"            round.drawBlock = block.number + DRAW_DELAY_BLOCKS;","title":"Draw target is only 3 blocks after a permissionless, undeadlined commit, so a validator or block builder can aim the draw at its own slot and grind the blockhash to win"},{"citation":"resolved","description":"Trust assumption recorded as the guides require, not a permission bypass. The constructor sets TREASURY = owner_ once and no function updates it; _flushFees() always pays pendingTreasury to TREASURY. After transferOwnership/acceptOwnership the new owner holds every administrative power (pause, setToken if unset, rescue of foreign tokens) but receives no fees, and the former owner keeps receiving 5% of every pool indefinitely. The README documents this as deliberate, and the owner panel shows the beneficiary, so it is listed here only so the requester confirms it matches the 'owner panel' intent before the irreversible deployment. If the fee is meant to follow control, a design-preserving change is to pay pendingTreasury to the current owner (or to a separately settable beneficiary) rather than to the immutable TREASURY.","line":159,"path":"src/IMDPot.sol","reproduction":"State: pot deployed with owner A (TREASURY == A). A calls transferOwnership(B); B calls acceptOwnership(); owner() == B, TREASURY() == A. Alice buys 10 tickets (1 IMD) and the round settles. Actual: token.balanceOf(A) increases by 0.05 IMD (5% treasury fee), B receives nothing, and no call can redirect future fees to B. Expected (if fees are meant to belong to whoever controls the game): the fee goes to B. The existing test test_twoStepOwnershipAndFixedTreasury asserts the current behavior.","severity":"info","snippet":"        TREASURY = owner_;","title":"House fee beneficiary is frozen to the deployment owner; a two-step ownership transfer leaves all future 5% fees with the previous owner"}],"hash":"8fbc66d353228570a35ca52a9aa758cf5ce10707e864045bee97a415984993d3","nodeId":"f632e182-6375-4852-b991-df8dbea2617f","outcome":"completed","summary":"The review is complete. The findings file at `.imd-findings.json` holds two findings and a coverage row for every one of the sixteen entry points. The working tree is otherwise untouched; the scratch tests live only under the ignored `test/scratch/` directory.\n\n**What I checked**\n\nI ran the three assigned guides (Economic Security, Invariant, Flow Gap) over `src/IMDPot.sol` and the Fenwick tree library, after the Senior Auditor's Mindset section. The existing 42 tests pass. I added scratch probes that fuzz loyalty-boost cap and point crediting across cancel, refund and settle interleavings, settle a round with a million 2x-boosted tickets, binary-search the minimum gas for settlement to see fee deferral behave, and check dust allocation. All invariants held: the token balance always equals the summed obligations, prize shares always sum to the pool, and pending plus live boost never exceeds the cap.\n\nBecause the Economic Security guide turns on how the real asset behaves, I pulled the live IMD token's verified source from Sourcify. It is a plain OpenZeppelin ERC20 inside a LayerZero OFT wrapper with no fee, cap, pause, blocklist or transfer hook, so the fee-on-transfer, max-wallet and gas-starvation vectors do not reach this deployment. I also confirmed the website modules call only functions and events the contract exposes, with matching shapes.\n\n**Findings**\n\n- **Medium, draw targeting.** The commit at `src/IMDPot.sol:278` fixes the draw block only three blocks ahead, and anyone may commit at any time after the round ends. Ethereum publishes proposers up to 64 slots ahead, so a validator or builder waits until the block three ahead is its own, commits, and then grinds candidate block contents until the hash selects its own ticket. In the scratch reproduction a 1% ticket share took the 40 IMD first prize of a 100 IMD pool after 339 candidate hashes. The brief chose blockhash randomness and the README documents producer influence, so I framed this as an amplification of the accepted risk with a design-preserving mitigation: a draw delay beyond the lookahead window, or a word derived from several consecutive hashes. No proof file is attached because the fix is a design decision with a cadence trade-off.\n- **Info, fee beneficiary.** The treasury is frozen to the deployment owner at `src/IMDPot.sol:159`, so after a two-step ownership transfer the former owner keeps every future 5% fee. The README calls this deliberate. It is recorded as a trust assumption for the requester to confirm before the irreversible launch.\n\n**Not covered**\n\nStatic-analysis leads about reentrancy and strict equality were traced and rejected: every value-moving path is guarded, the self-call is restricted to the contract itself, and the equality checks are on enum status values. I did not run the Anvil site integration test, which the README also reports as blocked in the worker. Areas outside economics, such as the frontend bundle internals and Privy login, were only checked to the extent they touch contract calls.","treeHash":null,"usage":{"cachedInputTokens":2094887,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":47515,"runtime":"claude","turns":41,"wallClockMs":753543}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6f41bd9b44d3e708","findings":[{"citation":"resolved","description":"IMDPot.finalizeRound() (src/IMDPot.sol:284, `if (block.number > round.drawBlock + BLOCKHASH_WINDOW) revert DrawExpired(round.drawBlock);`) accepts settlement only in blocks drawBlock+1 .. drawBlock+256. drawState() compares the latest mined head with the same inclusive bound, so when head == target + 256 it returns ready:true and tells players to 'Settle by block target+256'. A transaction submitted at that head can only be included at target+257 or later, where the contract reverts, so the player pays gas for a guaranteed revert (an eth_call simulation at 'latest' runs with block.number == head and passes, so the site's pre-submit simulation does not catch it), and the Cancel/refund path is hidden for that block because expired is false. test/web.test.mjs:63 asserts this wrong boundary (`drawState(drawing, 356n).ready, true`). Reported by the math specialist; reproduced. Fix: treat head >= target + 256n as expired (no transaction sent now can settle) and word the deadline as 'submit before block target+256'.","line":34,"path":"web/game-rules.mjs","reproduction":"drawState({status: 2, drawBlock: 100n}, 356n) returns {ready: true, expired: false, label: 'Settle winners'}. On chain: a round committed with drawBlock = 100; at head 356 the player clicks Settle; the transaction is mined in block 357, where 357 > 100 + 256 and finalizeRound() reverts DrawExpired(100). Expected: ready false / expired true at head 356, since the earliest inclusion block 357 is outside the window. Actual: the UI offers settlement and the transaction reverts. Contrast: at head 355 a transaction mined at 356 succeeds (356 <= 356).","severity":"low","snippet":"  if (head > target + 256n) return {","title":"Website reports 'Settle winners' at head == drawBlock + 256, but any transaction sent then is mined at drawBlock + 257 and reverts DrawExpired"},{"citation":"resolved","description":"The owner-only rescue of unrelated ERC20s reuses _transferExact, which requires the recipient's balance to rise by exactly `amount` (src/IMDPot.sol:523-526). That guard protects game-token accounting, but the pot owes nothing in a foreign asset. For any token that takes a transfer fee or rounds on transfer, the recipient receives less than `amount`, the check fails with TransferAmountMismatch, and because `amount` is always the full balance there is no partial or alternative path: the tokens are stuck permanently. Impact is limited to tokens sent to the pot by mistake, hence low. Reported by the permissions specialist; reproduced by reading the guard. Fix: in rescueForeignToken call _callToken(transfer) and at most check that the pot's own balance did not increase, without requiring the recipient to receive exactly `amount`.","line":411,"path":"src/IMDPot.sol","reproduction":"Deploy IMDPot(owner); owner setToken(standard 18-decimal token). Deploy a foreign ERC20 whose transfer debits the sender `amount` and credits the recipient `amount - amount/100`; mint 100e18 to the pot. owner calls rescueForeignToken(foreign, owner). Line 524 holds (pot balance fell by 100e18), but line 525 sees balanceOf(owner) == beforeTo + 99e18 != beforeTo + 100e18, so the call reverts TransferAmountMismatch. Expected: about 99e18 recovered. Actual: revert, the pot still holds 100e18, and every retry reverts the same way.","severity":"low","snippet":"        _transferExact(foreignToken, to, amount);","title":"rescueForeignToken reverts for every fee-on-transfer or rounding foreign token, so such tokens sent to the pot can never be recovered"}],"hash":"9896b575317fad7c97bc2c4e941f71a1747ac1d2c66acec31d9badf9441eff54","nodeId":"c2f9ed52-0f4c-471a-a2e7-90593034234a","outcome":"completed","summary":"I reviewed the code and kept two low-severity findings. Nothing reaches medium or higher, so no Foundry proof was required. The findings and coverage are in `.imd-findings.json`, and I changed no tracked files.\n\nThe build passes and all 62 project tests pass. The contract fits the size limits: 13,680 bytes deployed (limit 24,576) and 13,938 bytes of creation code (limit 49,152). `launch.json` is valid against the schema, and its one argument (`$owner`) matches `constructor(address owner_)`.\n\n**Kept:**\n1. **Low: the website's settle deadline is one block late** (`web/game-rules.mjs:34`, `if (head > target + 256n) return {`). When the latest block is exactly `drawBlock + 256`, the site still shows \"Settle winners\". A transaction sent then is mined in block `drawBlock + 257`, where `finalizeRound()` reverts with `DrawExpired` (`src/IMDPot.sol:284`). For example, with `drawBlock = 100`, at block 356 the site offers settlement and the player pays gas for a revert. The site's pre-send simulation doesn't catch it, and the cancel button stays hidden for that block. The existing test at `test/web.test.mjs:63` asserts the wrong boundary.\n2. **Low: `rescueForeignToken` can't recover fee-on-transfer tokens** (`src/IMDPot.sol:411`). It reuses the game token's exact-transfer check. If a token sent by mistake delivers 99 when 100 is sent, the rescue reverts every time, and those tokens stay stuck for good.\n\n**Dropped or merged:**\n- **Treasury paid to the owner** (raised by two specialists; medium and info): dropped. The live site's ABI for the updated contract also has only `constructor(address owner_)`, so a fixed owner beneficiary is the agreed design. I did confirm on Ethereum mainnet that the *old* contract paid fees to a separate wallet (`0x0b17…F118`, distinct from owner `0x3428…28EA`). Fees will now go to the owner wallet, so the requester should confirm that's what they want.\n- **Draw block only 3 blocks ahead** (medium): dropped. With future-blockhash randomness, which the requester asked for and the README documents as producer-influenceable, any block builder can buy the target slot however long the delay is. The suggested fix doesn't remove that.\n- **Owner keeps a round stuck by toggling pause** (low): dropped. At any moment either cancel or commit is open, so the owner would have to front-run every single attempt. A private transaction or one call that checks the pause first gets around it.\n- **24-hour pause hold, mismatched weight views, rounding with 1- or 2-decimal tokens, re-labelled bridged token:** dropped. They are either documented trust assumptions or views and token setups that can't change the planned deployment's money flows.\n\n**Coverage:** I answered all 16 entry points. `rescueForeignToken` is marked as having a finding; the other 15 hold. I also added a row for the balance-conservation invariant and one for the manifest.\n\n**Not run:** I didn't execute either finding as a test; both rest on tracing the code. The repo's Anvil end-to-end test (`test/site.integration.mjs`) wasn't run either; the author's README says it couldn't run in their worker.","treeHash":null,"usage":{"cachedInputTokens":868770,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":21142,"runtime":"claude","turns":13,"wallClockMs":332637}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"764cd99b4c628a47","findings":[{"citation":"resolved","description":"Boundary (UI vs chain). IMDPot.finalizeRound() (src/IMDPot.sol:284) accepts settlement only while block.number <= drawBlock + 256. drawState() compares the *latest* block head against the same bound, so at head == target + 256n it returns ready:true with the caption 'Settle by block target+256'. A transaction submitted while head == target + 256 can only be mined at target + 257, where the contract reverts with DrawExpired(drawBlock); the simulation the host runs against the pending block also fails, so the player sees an error although the UI told them it was ready. The practical submission deadline is head <= target + 255. Impact is limited to a confusing failure at the final block (the round then becomes cancellable with full refunds), so low. Fix: treat head >= target + 256n as expired/too late for submission, or word the detail as 'submit before block target+256'.","line":34,"path":"web/game-rules.mjs","reproduction":"Call drawState({status: 2, drawBlock: 100n}, 356n) (the existing web test asserts ready === true at head 356n). On chain: round committed with drawBlock = 100; at block 356 a player clicks Settle; the transaction lands in block 357; finalizeRound() hits `if (block.number > round.drawBlock + BLOCKHASH_WINDOW) revert DrawExpired(round.drawBlock)` (src/IMDPot.sol:284). Expected: the UI should not report 'ready' when no transaction sent now can still succeed. Actual: ready:true, label 'Settle winners'.","severity":"low","snippet":"  if (head > target + 256n) return {","title":"Website marks the last settle block as ready, but a transaction sent at that head is included one block later and reverts DrawExpired"},{"citation":"resolved","description":"Math precision, zero-rounding. ticketPrice = 10**(decimals-1), so with a 1-decimal token a ticket costs 1 base unit and a 1-ticket round has pool = 1. Then burned = 1*1000/10000 = 0, treasuryFee = 1*500/10000 = 0, locked = 1*1500/10000 = 0, prizePool = 1 and the winner receives 100% instead of 70%. Treasury is 0 for any pool < 20 base units, lock is 0 for pool < 7. Conservation still holds (prizes + fees == pool, verified by test/scratch probes across decimals 1..18), nothing is lost and nothing compounds. The IMD token deployed on mainnet (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7, read via public RPC) has 18 decimals, so every pool is a multiple of 1e17 and all four shares divide exactly; this cannot occur in the planned deployment. Recorded so the dust direction (towards the first prize, against treasury/burn/lock) is a documented choice rather than an accident.","line":312,"path":"src/IMDPot.sol","reproduction":"Deploy IMDPot(owner); setToken(token with decimals()==1) -> ticketPrice == 1. Player buys 1 ticket (pool = 1). Warp to endTime, finalizeRound(), roll past drawBlock, finalizeRound(). getRound(1): burned == 0, treasuryFee == 0, locked == 0, prizes[0] == 1. Expected per the 70/10/5/15 rule: 0.7/0.1/0.05/0.15 of the pool; actual: 100% to the winner. With 18 decimals and 1 ticket: burned = 1e16, treasuryFee = 5e15, locked = 1.5e16, prizes[0] = 7e16 (exact).","severity":"info","snippet":"        round.burned = round.pool * BURN_BPS / BPS;\n        round.treasuryFee = round.pool * TREASURY_BPS / BPS;\n        round.locked = round.pool * LOCK_BPS / BPS;","title":"Fee, lock and burn shares floor to zero for pools below 20 base units (only reachable with a 1- or 2-decimal token; exact for the 18-decimal IMD token)"}],"hash":"a373285a27921981c74e6fda718945c94d5920a2ffdbcbca1947f04f013cd23c","nodeId":"62907fec-1f8b-4587-a2cd-18ee8ee6665a","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing in the tracked tree was changed; only the ignored scratch test and `.imd-findings.json` were created.\n\n**Outcome:** the contract's arithmetic holds across my whole area. I found no defect in the Solidity math, one low-severity boundary mismatch in the website, and one info-level rounding note.\n\n**What I checked (Math Precision, Boundary, Numerical Gap guides):**\n- Every division in `_settle`: floor shares for burn, treasury, lock, second and third prize, with dust to first prize. Prizes plus fees always equal the pool, and first prize never underflows since it is at least 40% of the pool.\n- Overflow limits: per-purchase weight is at most 2e10 and amount at most 1e23, so no intermediate can overflow; `uint64` deadline cast is safe.\n- Winner selection: modulo by the tree total is never zero, the Fenwick `find` never returns a zero-weight interval, and `remove` of one unit always succeeds for a found winner.\n- Boundaries: entry closes exactly at `endTime` while finalize opens there; settle is valid through `drawBlock + 256` and cancel from `drawBlock + 257`; paused cancel at exactly `endTime + 1 day`.\n- Loyalty cap: pending boost plus any live restorable boost never exceeds 10,000 bps through any redeem, cancel and restore sequence.\n- Real token: the mainnet IMD token read from the previous contract is an OpenZeppelin v5 ERC20 (LayerZero OFT) with 18 decimals and no transfer tax, so every share divides exactly and the 150k fee-transfer gas budget is ample.\n- Scratch fuzz in `test/scratch/MathProbe.t.sol` ran 256 cases over decimals 1 to 18, up to 1,000,000 tickets per buy and maximum boost weights. All passed, as did the repository's 42 tests and the 12 web unit tests.\n\n**Findings recorded:**\n1. Low, `web/game-rules.mjs:34`. The settle button reads ready at head equal to `drawBlock + 256`, but a transaction sent then is mined one block later and reverts with `DrawExpired`.\n2. Info, `src/IMDPot.sol:312`. With a 1-decimal token a one-ticket pool pays 100% to the winner because all fee shares floor to zero. Not reachable with the 18-decimal IMD token.\n\n**Coverage:** all 16 entry points have rows, 15 `holds` and the web rules module `finding`, plus two invariant rows. No entry point was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1398151,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":34752,"runtime":"claude","turns":31,"wallClockMs":495803}},{"artifacts":[],"attempt":1,"bundleHash":"57521a1f94f45e07a793460ce468a45978f62256df192d0b4e72a28cbd708082","device":"41822d343cdb63ba","findings":[],"hash":"a6e36d3ab22d909a09b00671c8d0f30b9c3162c429addcc26e0e2313398d5e04","nodeId":"3a8f8bb0-6b6b-4899-8554-99ae0e6d0725","outcome":"completed","summary":"Implemented the fresh IMDPot contract and prepared the existing website integration. Deployment parameters and operating steps are in [README.md](/home/imd4/.identitymd/work/5cc31334-d746-4f06-98be-665f9c786c72/3a8f8bb0-6b6b-4899-8554-99ae0e6d0725/README.md).\n\nPassed `forge build`, 42 Solidity checks, `forge fmt --check`, 12 frontend tests, and 4 release-tool tests.\n\nLive deployment and website publication remain pending the launch service’s confirmed address.\n\nAnvil end-to-end validation was blocked by this machine: `Operation not permitted (os error 1)`.","treeHash":"be7bb0a2636af06eb72c65d9b9454f9745982e26","usage":{"cachedInputTokens":4261010,"inputTokens":175378,"model":"gpt-6.1-sol","outputTokens":64518,"runtime":"codex","turns":9,"wallClockMs":1339554}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8af9903f4ad1eed0","findings":[{"citation":"resolved","description":"The constructor takes only owner_ and sets both owner and TREASURY to it. TREASURY has no setter, is not updated by transferOwnership/acceptOwnership, and receives 5% of every settled pool via _flushFees (src/IMDPot.sol:391). The contract this launch replaces (web/deployment.mjs PREVIOUS_CONTRACT 0x37cb0333a2fea358ae057bd85c4437803e5bcbfa, chain 1) was read over a public Ethereum RPC during this review: owner() = 0x34284C5C4c54d5f8e7E14E2D1a3DcD48899928EA and TREASURY() = 0x0b176115c1Bd31a782133100d3aaA6BE2b16F118 (an EOA, distinct from the owner). The live game therefore pays its house fee to a dedicated treasury wallet, not to the owner. The replacement silently changes the beneficiary to the owner wallet 0x34284c5c... (README.md:36,40) and tools/build_site.py:14,75 refuses any release whose TREASURY differs from that owner, so the mismatch cannot be fixed at release time either. This is a constructor-beneficiary gap (access x asymmetry): the privileged beneficiary of in-flight value is chosen by the one constructor argument the manifest fills with $owner, while the requester's existing deployment shows a different intended recipient. If the launch's $owner resolves to the paying wallet rather than 0x34284c5c..., 5% of every pool goes irrevocably to that wallet and the website release is refused. Minimal fix that preserves the agreed design: add an explicit treasury_ constructor argument (written as the static treasury address in launch.json, or $owner if the requester confirms the owner should now receive fees), keep it non-zero-checked and fixed, and make build_site.py compare TREASURY against that confirmed address instead of the owner. The requester must confirm which wallet should receive the house fee before deployment; once deployed it is unchangeable.","line":159,"path":"src/IMDPot.sol","reproduction":"1. Observe the live contract: cast call 0x37cb0333a2fea358ae057bd85c4437803e5bcbfa 'owner()(address)' -> 0x34284C5C4c54d5f8e7E14E2D1a3DcD48899928EA; cast call 0x37cb0333a2fea358ae057bd85c4437803e5bcbfa 'TREASURY()(address)' -> 0x0b176115c1Bd31a782133100d3aaA6BE2b16F118 (chain 1, head block 26221523). 2. Deploy new IMDPot(owner_=0x34284c5c4c54d5f8e7e14e2d1a3dcd48899928ea) as the manifest's $owner implies. TREASURY() returns 0x34284c5c..., not 0x0b1761.... 3. Owner calls setToken(IMD); alice buys 10 tickets (1 IMD); round ends; finalizeRound() twice. Expected (matching the live game): 0.05 IMD to 0x0b1761...; actual: FeeTransferred(0x34284c5c..., 0.05e18) and 0.05 IMD arrives in the owner wallet. 4. There is no function to change TREASURY; transferOwnership(0x0b1761...) + acceptOwnership() leaves TREASURY unchanged (test_twoStepOwnershipAndFixedTreasury asserts exactly this). 5. If instead $owner resolves to any other paying wallet W, TREASURY = W and tools/build_site.py raises 'The fee beneficiary differs from the specified launch owner', so the website can never be connected to that deployment.","severity":"medium","snippet":"    constructor(address owner_) {\n        if (owner_ == address(0)) revert OwnableInvalidOwner(owner_);\n        owner = owner_;\n        TREASURY = owner_;\n        emit OwnershipTransferred(address(0), owner_);\n    }","title":"House fee beneficiary hardwired to the owner wallet; live deployment pays a different treasury and nothing can correct it"},{"citation":"resolved","description":"The owner-only rescue reuses _transferExact, which requires the pot's balance to drop by exactly amount and the recipient's to rise by exactly amount (src/IMDPot.sol:523-526). That check is right for the game token but wrong for an arbitrary foreign token: any token that takes a fee, rebases or rounds on transfer makes the rescue revert with TransferAmountMismatch every time, and since amount is always the full balance there is no partial path. Asymmetry: the rescue path copies the game-token exact-transfer guard without the game-token assumption that justifies it. Impact is limited to accidentally sent third-party tokens. Fix: in rescueForeignToken use _callToken(transfer) and only require the pot's own balance to decrease (or not revert on mismatch), since the pot owes nothing in that asset.","line":411,"path":"src/IMDPot.sol","reproduction":"Deploy IMDPot(admin), setToken(standard 18-dec game token). Deploy a foreign ERC20 whose transfer credits amount - amount/100 (1% fee) and mint 100e18 of it to the pot. admin calls rescueForeignToken(foreign, admin). Expected: ~99e18 recovered. Actual: revert TransferAmountMismatch; the pot still holds 100e18 and every retry reverts. Scratch test test_rescueOfFeeOnTransferForeignTokenReverts (test/scratch/Review.t.sol, run this session) confirms the revert and unchanged balance.","severity":"low","snippet":"    function rescueForeignToken(address foreignToken, address to) external onlyOwner nonReentrant {\n        if (foreignToken == token) revert CannotRescueGameToken();\n        if (to == address(0) || to == address(this)) revert ZeroAddress();\n        if (foreignToken.code.length == 0) revert NotAContract(foreignToken);\n        uint256 amount = IGameToken(foreignToken).balanceOf(address(this));\n        _transferExact(foreignToken, to, amount);\n        emit ForeignTokenRescued(foreignToken, to, amount);\n    }","title":"rescueForeignToken cannot recover fee-on-transfer or rebasing tokens; they are stuck forever"},{"citation":"resolved","description":"Documented privileged power, recorded as a trust assumption rather than a bypass. pause() blocks the commit step of finalizeRound (src/IMDPot.sol:275) but cancelRound for an Active round needs paused AND endTime + 1 day. The owner can therefore keep players' tickets locked for up to 24 hours after the scheduled end, and at any point up to the last second unpause and commit (atomically from a contract wallet), which closes the refund path again because the Drawing branch of cancelRound only triggers after the 256-block window. No funds are lost and the owner gains no randomness advantage (the draw block hash is still unknown at commit), but players have no way to force either outcome during the window. Acceptable per the requested owner panel; the requester should be aware the pause is a 24-hour hold on player funds.","line":340,"path":"src/IMDPot.sol","reproduction":"alice buys 3 tickets; owner pause(); warp to endTime + 1 day - 1: cancelRound() reverts CancelTooEarly. Owner then unpause(), finalizeRound() (commits), pause(). At endTime + 1 day cancelRound() reverts CancelTooEarly again (status Drawing, inside window). Scratch test test_ownerCanUnpauseAndCommitOneSecondBeforeCancelDeadline passes on current code.","severity":"info","snippet":"        } else if (round.status == RoundStatus.Active) {\n            if (!paused || block.timestamp < uint256(round.endTime) + CANCEL_DELAY) revert CancelTooEarly();","title":"Owner can hold a closed round in limbo for 24 hours and then pick settlement over refund (trust assumption)"},{"citation":"resolved","description":"Reader/writer asymmetry between two views. refund() zeroes ticketsOf[id][player] (src/IMDPot.sol:355) so weightOf(id, player) returns 0, but trees[id].total is never reduced on cancellation, so totalWeight(id) still reports the full pre-refund weight. For finalized rounds both views stay consistent (the settle loop re-adds removed weights). Only historical/analytics views are affected; no accounting path reads these for cancelled rounds. The invariant suite only checks the current round, so the divergence is untested. If the frontend shows per-player odds for past cancelled rounds it will show 0 of N instead of N of N.","line":492,"path":"src/IMDPot.sol","reproduction":"alice buys 4 tickets; warp to endTime; finalizeRound() (commit); roll to drawBlock + 257; cancelRound(); alice refund(1). weightOf(1, alice) == 0 while totalWeight(1) == 40_000. Scratch test test_weightViewsDivergeAfterRefund passes on current code.","severity":"info","snippet":"    function weightOf(uint256 id, address account) external view returns (uint256) {\n        return ticketsOf[id][account] * (BPS + roundBoostBps[id][account]);\n    }","title":"weightOf and totalWeight disagree for a cancelled round after refund"}],"hash":"b40811d59ab51582d99abfcf2872f1d9e5c507faddb095bead7dc3c7eb96d0c2","nodeId":"9a3feb54-d137-41ae-81c3-6e1a1c87a587","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds four findings plus a coverage row for all 16 entry points. The working tree is otherwise untouched: the only new files are the findings JSON and the ignored `test/scratch/` probe.\n\n**What I audited**\n\nThe Access Control, Trust Gap and Asymmetry guides against `src/IMDPot.sol`, with the Senior Auditor's Mindset first. I mapped every role and guard, diffed paired paths (buy vs refund, settle vs cancel, user vs owner variants, `getPlayer` vs `_syncPoints`), and checked each privileged setter for in-flight value redirection. The existing 42 tests pass. I also read the live chain over a public RPC to check the trust assumptions the code bakes in.\n\n**Findings, most severe first**\n\n1. **Medium: house fee beneficiary hardwired to the owner wallet.** The constructor takes only `owner_` and sets `TREASURY` to it with no setter. The contract this launch replaces pays its 5% fee to a different treasury wallet than its owner, so the new deployment silently redirects every house fee to the owner wallet, irrevocably. The release tool also refuses any deployment whose treasury differs from that owner, so a `$owner` that resolves to a different payer wallet can never be connected to the website. The fix is an explicit treasury constructor argument. The requester must confirm the intended fee wallet before deploying.\n2. **Low: owner cannot rescue fee-on-transfer foreign tokens.** The rescue path reuses the exact-transfer check meant for the game token, so taxed or rebasing third-party tokens revert forever. Confirmed with a scratch test.\n3. **Info, trust assumption: pause gives the owner a 24-hour hold on a closed round** and the choice between settlement and refund at the deadline. No fund loss and no randomness edge, but players cannot force either outcome.\n4. **Info: `weightOf` and `totalWeight` diverge for cancelled rounds after refund.** View-only, untested by the invariant suite.\n\n**What holds**\n\nOwnership is two-step with zero and self rejected, renounce is disabled, every owner function is guarded, `transferFee` is self-call only, `setToken` is one-shot with decimal checks, and no admin setter alters in-flight value. The live IMD token is a plain OpenZeppelin ERC20 wrapped as a LayerZero OFT, with no tax or blocklist and a 35k-gas transfer, so the exact-transfer and 150k fee-gas assumptions hold on mainnet.\n\n**Not reached**\n\nDeep economic modelling of block-producer randomness bias and the Privy bundle internals under `web/assets-future-v1/` are outside my area and were not reviewed beyond ABI equality.","treeHash":null,"usage":{"cachedInputTokens":1552791,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":40933,"runtime":"claude","turns":39,"wallClockMs":713641}},{"artifacts":[],"attempt":1,"bundleHash":"8b646d3631073c48f0c05c9b1f13bf626789e187077843f54c7951e4edcf2a91","device":"97c4e9eb9244090f","findings":[],"hash":"e0ebd0c523f188e92b1392ffe9f83fb4c886e31944c471461827deb1a636b7d9","nodeId":"88f8b83b-60cd-4a48-886f-4ef592b886ad","outcome":"completed","summary":"Added failure-path, fuzz, winner-selection, and accounting invariant tests. Only `test/` changed.\n\n- `forge build`: passed.\n- `forge test` with the required seed: **62 passed**, zero failures.\n- New invariants exercised **32,768 random calls**.\n\nNo implementation defects reproduced. Live deployment and website integration remain unverified.","treeHash":"cf6f0f1ca4ac55d020b58b98fe372fd7c8a40383","usage":{"cachedInputTokens":3168372,"inputTokens":147644,"model":"gpt-6.1-sol","outputTokens":38062,"runtime":"codex","turns":8,"wallClockMs":774113}}],"verification":[{"checks":[{"durationMs":3596,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.47s\nCompiler run successful!\n","passed":true},{"durationMs":1793,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/IMDPot.t.sol:IMDPotTest\n[PASS] testFuzz_conservationAcrossSettlementsRefundsAndClaims(uint32,uint32,uint32,bytes32) (runs: 256, μ: 2813977, ~: 2846922)\nLogs:\n  Bound result 2\n  Bound result 425\n  Bound result 247\n\n[PASS] testFuzz_priceIsOneTenthForSupportedDecimals(uint8) (runs: 256, μ: 834220, ~: 834009)\nLogs:\n  Bound result 17\n\n[PASS] test_boostCapsAtTwoXAndIsFrozenForEntireRound() (gas: 11244244)\n[PASS] test_boostedSingleTicketStillCannotWinTwice() (gas: 10839771)\n[PASS] test_cancelRestoresBoostWithoutAwardingPointsOrRequiringRefundFirst() (gas: 10507692)\n[PASS] test_claimFailurePreservesCreditAndDoesNotBlockAnotherWinner() (gas: 1828132)\n[PASS] test_contractWalletCanPlayAndCannotReenterClaim() (gas: 1830887)\n[PASS] test_contractWalletCannotReenterRefund() (gas: 1470649)\n[PASS] test_drawCommitsExactlyThreeBlocksAndCannotReroll() (gas: 1199410)\n[PASS] test_entryAtDeadlineAndWhileDrawingRejects() (gas: 813564)\n[PASS] test_entryReentrancyFailsAndOuterEntryRemainsCorrect() (gas: 577281)\n[PASS] test_entryRejectsZeroTooManyAndInsufficientApprovalOrBalance() (gas: 861882)\n[PASS] test_expiredDrawCannotSettleOrBeRecommitted() (gas: 773755)\n[PASS] test_factoryUsesExplicitLaunchOwnerWithoutExternalConstructorCalls() (gas: 331669)\n[PASS] test_failedFeeTransferDoesNotBlockSettlementAndRetryPaysExactlyOnce() (gas: 1600803)\n[PASS] test_falseReturnAfterMovingTokensRollsBackFeeSubcall() (gas: 1352578)\n[PASS] test_feeReentrancyAndUnauthorizedSelfCallCannotDrain() (gas: 1202506)\n[PASS] test_finalizeBeforeEntryOrBeforeEndRejects() (gas: 436644)\n[PASS] test_lastBlockhashBoundarySettlesAndCannotCancel() (gas: 992649)\n[PASS] test_loyaltyThresholdsInsufficientRoundsAndPoints() (gas: 9382946)\n[PASS] test_noReturnERC20Supported() (gas: 1155966)\n[PASS] test_oddBaseUnitRoundingAssignedToFirstPrize() (gas: 1915296)\n[PASS] test_oneTicketReceivesAllSeventyPercentAndNoEmptyPrizes() (gas: 1016419)\n[PASS] test_onlyOwnerCanConfigureAndOnlyOnce() (gas: 1762051)\n[PASS] test_ownerCannotCancelAnUnpausedRoundEvenAfterOneDay() (gas: 449750)\n[PASS] test_ownerCannotRescueGameTokenIncludingLockedShareOrDonations() (gas: 2011957)\n[PASS] test_pauseBlocksEntriesAndCommitButCommittedDrawSettlesAndClaimsWork() (gas: 1198815)\n[PASS] test_pausedActiveRoundCancelsOnlyAfterOneDayAndRefundsInFull() (gas: 1086549)\n[PASS] test_pointsCreditOncePerSettledTicketAndRound() (gas: 2157982)\n[PASS] test_redemptionDuringRoundAppliesOnlyToNextRound() (gas: 10681907)\n[PASS] test_refundFailurePreservesTicketAndRefundObligation() (gas: 859189)\n[PASS] test_repeatedPurchasesDoNotDuplicateParticipants() (gas: 799552)\n[PASS] test_reviewedPurchaseCannotEnterAnotherRound() (gas: 1399838)\n[PASS] test_settlementConservesSharesAndPullClaims() (gas: 1868212)\n[PASS] test_taxedEntryAndFalseReturnRejectWithoutRecordingTickets() (gas: 862124)\n[PASS] test_taxedPayoutCannotSilentlyUnderpay() (gas: 1258135)\n[PASS] test_timerStartsOnFirstTicketAndDoesNotExtend() (gas: 780021)\n[PASS] test_twoStepOwnershipAndFixedTreasury() (gas: 392651)\n[PASS] test_twoTicketsCanGiveSameWalletTwoPrizesAndRollThirdIntoFirst() (gas: 1041633)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 93.35ms (181.63ms CPU time)\n\nRan 2 tests for test/WeightedTree.t.sol:WeightedTreeTest\n[PASS] testFuzz_dynamicGrowthAndUpdatesMatchLinearOracle(uint256,uint8) (runs: 256, μ: 3999572, ~: 1763977)\nLogs:\n  Bound result 6\n\n[PASS] test_zeroWeightNodesAndInvalidActions() (gas: 433600)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 153.68ms (153.75ms CPU time)\n\nRan 1 test for test/IMDPot.invariant.t.sol:IMDPotInvariantTest\n[PASS]\nIMDPotInvariantTest invariants:\n[PASS] invariant_balanceCoversExactlyEveryObligation\n[PASS] invariant_refundsAndLockedSharesMatchHistoricalRounds\n IMDPotInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭------------+-------------+-------+---------+----------╮\n| Contract   | Selector    | Calls | Reverts | Discards |\n+=======================================================+\n| PotHandler | buy         | 604   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | claim       | 590   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | redeem      | 662   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | refund      | 566   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | resolve     | 551   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | sync        | 537   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | togglePause | 586   | 0       | 0        |\n╰------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 15\n  Bound result 34\n  Bound result 100\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 28\n  Bound result 39\n  Bound result 100\n  Bound result 67\n  Bound result 2\n  Bound result 28\n  Bound result 5\n  Bound result 42\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.66s (1.66s CPU time)\n\nRan 3 test suites in 1.67s (1.91s CPU time): 42 tests passed, 0 failed, 0 skipped (42 total tests)\n","passed":true},{"durationMs":161,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDPot.acceptOwnership()\",\"IMDPot.buyTickets(uint256)\",\"IMDPot.buyTicketsForRound(uint256,uint256)\",\"IMDPot.cancelRound()\",\"IMDPot.claim()\",\"IMDPot.finalizeRound()\",\"IMDPot.flushPendingFees()\",\"IMDPot.pause()\",\"IMDPot.redeemMultiplier()\",\"IMDPot.refund(uint256)\",\"IMDPot.rescueForeignToken(address,address)\",\"IMDPot.setToken(address)\",\"IMDPot.syncPoints(address)\",\"IMDPot.transferFee(address,uint256)\",\"IMDPot.transferOwnership(address)\",\"IMDPot.unpause()\"],\"files\":{\".gitignore\":6,\"README.md\":133,\"docs/SECURITY.md\":58,\"docs/site-capture.json\":319,\"foundry.toml\":18,\"launch.json\":12,\"remappings.txt\":1,\"src/IMDPot.sol\":528,\"src/libraries/WeightedTree.sol\":63,\"test/IMDPot.invariant.t.sol\":148,\"test/IMDPot.t.sol\":802,\"test/MockToken.sol\":71,\"test/WeightedTree.t.sol\":92,\"test/site.integration.mjs\":136,\"test/test_release.py\":67,\"test/web.test.mjs\":153,\"tools/build_site.py\":110,\"tools/sync_abi.py\":18,\"web/assets-future-v1/AccountNotFoundScreen-DmCu584z-BCSQbn_H.js\":1,\"web/assets-future-v1/AddFundsSelectionScreen-CvdQ9APw-Cw9tbqpj.js\":7,\"web/assets-future-v1/Address-D-hKSBMc-BEHFET5A.js\":17,\"web/assets-future-v1/AffirmativeConsentScreen-Cm3ilbFM-Z0mIroYr.js\":6,\"web/assets-future-v1/AllowlistRejectionScreen-94CrH44E-Cl2FR9wd.js\":1,\"web/assets-future-v1/ApiController-BPNSsbA_.js\":5,\"web/assets-future-v1/ArrowsRightLeftIcon-B-VpvMMr.js\":1,\"web/assets-future-v1/AuthenticateWithWalletScreen-DOlqqtwf-DhRHb5Ow.js\":1,\"web/assets-future-v1/AwaitingEvmToSolBridgingScreen-BAwgpv6z-Bz46Au8f.js\":1,\"web/assets-future-v1/AwaitingExternalEthereumTransferScreen-CrmoLkyM-B_J6BkJf.js\":1,\"web/assets-future-v1/AwaitingPasswordlessCodeScreen-PG8R_qZ7-Dc8cYtMB.js\":103,\"web/assets-future-v1/AwaitingSolToEvmBridgingScreen-CfxbsY2V-DSEHmrXb.js\":1,\"web/assets-future-v1/BridgeNetworkSelectionView-CyWjJLLL-yzzqv0fN.js\":68,\"web/assets-future-v1/CaptchaScreen-Di6DawY1-DP8zS0O2.js\":1,\"web/assets-future-v1/CheckCircleIcon-C5-JLm-a.js\":1,\"web/assets-future-v1/CheckCircleIcon-L7pHUk8b.js\":1,\"web/assets-future-v1/Checkbox-D1EDeo41-CBza6Itl.js\":52,\"web/assets-future-v1/ChevronDownIcon-Cix9gOo-.js\":1,\"web/assets-future-v1/Chip-CZKIKt9K-B5giFS9U.js\":26,\"web/assets-future-v1/CoinbaseOnrampStatusScreen-CQ5wJdhR-CHKXE9Zg.js\":16,\"web/assets-future-v1/ConnectEmailForm-VvzLeAu_-DeLfSKaI.js\":3,\"web/assets-future-v1/ConnectLedgerScreen-PcSk3bj3-CJP5ouV6.js\":10,\"web/assets-future-v1/ConnectOnlyLandingScreen-CzsS1KUE-D5Jjd8mA.js\":1,\"web/assets-future-v1/ConnectOnlyStatusScreen-DAnXdxMc-QrdGKZfF.js\":1,\"web/assets-future-v1/ConnectOrCreateScreen-B13RFu4y-qpxGvC-g.js\":1,\"web/assets-future-v1/ConnectPhoneForm-CgvF9lfY-Bjq8zAeP.js\":95,\"web/assets-future-v1/ConnectWalletView-CVcmCUWx-DcVjm0-R.js\":74,\"web/assets-future-v1/ConnectionStatusScreen-CkZB3A-v-BwQJgTpC.js\":7,\"web/assets-future-v1/ConnectorUtil-9-QqcAdN.js\":21,\"web/assets-future-v1/ConstantsUtil-DmLsRHAl.js\":198,\"web/assets-future-v1/CopyToClipboard-i_OQSBJr-D_GDYkRo.js\":39,\"web/assets-future-v1/CopyableText-CQapvaMr-D2qfp0B5.js\":28,\"web/assets-future-v1/CrossAppAuthScreen-55ctQxf7-CuN9ly_E.js\":1,\"web/assets-future-v1/CustomLandingScreenView-DCKHF9M9-dIVgxpQv.js\":22,\"web/assets-future-v1/DelegatedActionsConsentScreen-B-NoZ7KR-C94P_M8G.js\":1,\"web/assets-future-v1/DelegatedActionsRevokeScreen-HnrbzfZN-CmRrY8e8.js\":1,\"web/assets-future-v1/DepositAddressAddressStepView-BBRl-QpO-DZMf5-lM.js\":187,\"web/assets-future-v1/DepositAddressScreen-BB3v4rHj-BPe6KJ8S.js\":8,\"web/assets-future-v1/DepositAddressV3Screen-DvnJDngM-D04YsV25.js\":1,\"web/assets-future-v1/EmailInputForm-Cqo1mda8-D3fhsbzl.js\":124,\"web/assets-future-v1/EmbeddedWalletConnectingScreen-DVkAbpWM-CRMyVUgO.js\":1,\"web/assets-future-v1/EmbeddedWalletCreatedScreen-Dh97ZcWk-CS1KQENE.js\":1,\"web/assets-future-v1/EmbeddedWalletKeyExportScreen-Dfd_ipkl-DA55wlws.js\":23,\"web/assets-future-v1/EmbeddedWalletOnAccountCreateScreen-JY3xQL2B-B0He8Sfj.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateScreen-CiseufAK-C03IA1x1.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateSplashScreen-CaQbsSTp-BCWKi3PM.js\":1,\"web/assets-future-v1/EnrollTotp-CTpF3OWX-BKgTMBK5.js\":66,\"web/assets-future-v1/EnvelopeIcon-DMvqes7d.js\":1,\"web/assets-future-v1/ErrorBanner-BcpGRt0h-Bfj743IN.js\":21,\"web/assets-future-v1/ErrorMessage-D8VaAP5m-CS06WdNK.js\":8,\"web/assets-future-v1/ErrorScreen-f2o266cj-BQKHBU3d.js\":4,\"web/assets-future-v1/ExclamationCircleIcon-BfN0y50L.js\":1,\"web/assets-future-v1/ExclamationTriangleIcon-JkGdtDha.js\":1,\"web/assets-future-v1/FarcasterConnectStatusScreen-2-_iV769-BmPFtxjg.js\":75,\"web/assets-future-v1/FarcasterSignerStatusScreen-YTSx8zuE-Dk-G_7O0.js\":28,\"web/assets-future-v1/FiatOnrampScreen-Cn4FmpB5-Ce2LeFWV.js\":578,\"web/assets-future-v1/FingerPrintIcon-DDtL5c0C.js\":1,\"web/assets-future-v1/FundSolWalletWithExternalSolanaWallet-dK67dE7B-DSR7bBXI.js\":1,\"web/assets-future-v1/FundWalletMethodHeader-CZzBi5cW-DP5Svv96.js\":1,\"web/assets-future-v1/FundWithBankDepositScreen-BKg4LaM0-DtkB4hUD.js\":58,\"web/assets-future-v1/FundingEditAmountScreen-gVCDz2hc-CrI8YJuv.js\":1,\"web/assets-future-v1/FundingMethodSelectionScreen-Dwg5HAn9-gpV-rB8t.js\":1,\"web/assets-future-v1/GlobeAltIcon-CnkwyQwD.js\":1,\"web/assets-future-v1/GooglePay-B53WnudL-BC9WrAhV.js\":1,\"web/assets-future-v1/HCaptchaWrapper-CUi9LJsp-8QsMGzaG.js\":4,\"web/assets-future-v1/InAppBrowserLoginNotPossible-D4EeEdze-CsByAdfj.js\":1,\"web/assets-future-v1/InfoBanner-Cb3p1z12-DWrD6YP1.js\":22,\"web/assets-future-v1/InjectedWalletIcon-DLcYOGDj-CpngehNK.js\":1,\"web/assets-future-v1/InstallWalletScreen-B1yxNHgg-UrKFUBcT.js\":1,\"web/assets-future-v1/JsonTree-BHzNC-ic-BD2CORNN.js\":34,\"web/assets-future-v1/LabelXs-oqZNqbm_-DLlwZvt7.js\":6,\"web/assets-future-v1/LandingScreen-zRwMN0po-dGRSsZND.js\":1,\"web/assets-future-v1/Layouts-BMRfo5hw-BXZv4R83.js\":77,\"web/assets-future-v1/Link-BdDilT2T-CO0WtnUV.js\":40,\"web/assets-future-v1/LinkConflictScreen-YklPsTUx-Bc1DufFz.js\":77,\"web/assets-future-v1/LinkEmailScreen-Bqb5fKMB-Dy7oNbdZ.js\":1,\"web/assets-future-v1/LinkPasskeyScreen-DCzXkdBR-D20BqIic.js\":117,\"web/assets-future-v1/LinkPhoneScreen-WC5uerRR-CDHXLRw1.js\":1,\"web/assets-future-v1/Loader-UAZqxsnw-BjnvLK0W.js\":62,\"web/assets-future-v1/LoadingSkeleton-BMsgO5PV-sKfjGViu.js\":17,\"web/assets-future-v1/LockClosedIcon-tMHvyrzR.js\":1,\"web/assets-future-v1/LoginFailedScreen-DtjHCXGc-CcMTlOwV.js\":1,\"web/assets-future-v1/ManualTransferScreen-CXxMG6Ri-xNGhrs7E.js\":1,\"web/assets-future-v1/MfaAuthEnrollmentFlowScreen-D5JeOLgJ-CoeKTb-o.js\":1,\"web/assets-future-v1/MfaAuthVerifyFlowScreen--aCJotEK-UMgUWUIA.js\":1,\"web/assets-future-v1/MfaEnrollmentFlowScreen-DaOfZDQL-ByTQ5-Hp.js\":1,\"web/assets-future-v1/MfaVerifyFlowScreen-8VhJP8xn-DLz-woKv.js\":1,\"web/assets-future-v1/ModalFooter-CmGY3GN5-D-y9DoW2.js\":403,\"web/assets-future-v1/MoonpayStatusScreen-B-JeyK9J-BnW4KduS.js\":16,\"web/assets-future-v1/OAuthStatusScreen-zos_nuFY-BQUDzPth.js\":1,\"web/assets-future-v1/OpenLink-CUpJ1mOr-CcpZRXEy.js\":39,\"web/assets-future-v1/PasskeySelectSignupOrLogin-CQaGUKP3-CtpFNSST.js\":1,\"web/assets-future-v1/PasskeyStatusScreen-CgVPBiep-ZT7U88v8.js\":6,\"web/assets-future-v1/PasswordRecoveryScreen-D45ttCfH-DD3WwGl-.js\":20,\"web/assets-future-v1/PhArrowCircleDown-D97G-BOA.js\":14,\"web/assets-future-v1/PhArrowClockwise-DVgyFuez.js\":14,\"web/assets-future-v1/PhArrowDown-87b1BizM.js\":14,\"web/assets-future-v1/PhArrowLeft-Da0MfnbK.js\":14,\"web/assets-future-v1/PhArrowRight-AdrIL4DW.js\":14,\"web/assets-future-v1/PhArrowSquareOut-Bk2CMG3I.js\":14,\"web/assets-future-v1/PhArrowUp-4sgyKPGx.js\":14,\"web/assets-future-v1/PhArrowUpRight-BNghD2zq.js\":14,\"web/assets-future-v1/PhArrowsClockwise-BXRn1GEl.js\":14,\"web/assets-future-v1/PhArrowsDownUp-DM09Jo_3.js\":14,\"web/assets-future-v1/PhArrowsLeftRight-MuKBLUoF.js\":14,\"web/assets-future-v1/PhBank-fHbgCqqZ.js\":14,\"web/assets-future-v1/PhBrowser-2-9m-AkM.js\":14,\"web/assets-future-v1/PhCaretDown-BDNabFuL.js\":14,\"web/assets-future-v1/PhCaretLeft-CI460R-A.js\":14,\"web/assets-future-v1/PhCaretRight-D7ZS3Ls8.js\":14,\"web/assets-future-v1/PhCaretUp-C-iIfyvO.js\":14,\"web/assets-future-v1/PhCheck-DxQXn57r.js\":14,\"web/assets-future-v1/PhCircleHalf-MJZeRBGF.js\":14,\"web/assets-future-v1/PhClock-x3MS3Mwi.js\":14,\"web/assets-future-v1/PhCompass-hYn3HhGN.js\":14,\"web/assets-future-v1/PhCopy-CWNYcABI.js\":14,\"web/assets-future-v1/PhCreditCard-Fy4pzwtt.js\":14,\"web/assets-future-v1/PhCurrencyDollar-BgiaenCi.js\":14,\"web/assets-future-v1/PhDesktop-CxrzCSv5.js\":14,\"web/assets-future-v1/PhDeviceMobile-CsyA5Goi.js\":14,\"web/assets-future-v1/PhDotsThree-D-k1BiYg.js\":14,\"web/assets-future-v1/PhEnvelope-D8kzeNox.js\":14,\"web/assets-future-v1/PhFunnelSimple-CfQs5DAW.js\":14,\"web/assets-future-v1/PhGlobe-DvmSc9_A.js\":14,\"web/assets-future-v1/PhIdentificationCard-CfkZm-5K.js\":14,\"web/assets-future-v1/PhImage-Cf0J2ZfJ.js\":14,\"web/assets-future-v1/PhInfo-Bwi51-2X.js\":14,\"web/assets-future-v1/PhLightbulb-C4FZV7Es.js\":14,\"web/assets-future-v1/PhMagnifyingGlass-C9u8jSCJ.js\":14,\"web/assets-future-v1/PhPaperPlaneRight-zxQVvPLX.js\":14,\"web/assets-future-v1/PhPlus-C4UoW-2n.js\":14,\"web/assets-future-v1/PhPower-CFyWDmgD.js\":14,\"web/assets-future-v1/PhPuzzlePiece-BjoNVfST.js\":14,\"web/assets-future-v1/PhQrCode-CP3tFauY.js\":14,\"web/assets-future-v1/PhQuestion-wOWJBd3G.js\":14,\"web/assets-future-v1/PhQuestionMark-CV0k9C0Y.js\":14,\"web/assets-future-v1/PhSealCheck-vIKzREuN.js\":14,\"web/assets-future-v1/PhSignOut-CxELV-i0.js\":14,\"web/assets-future-v1/PhSpinner-CGDmbzUd.js\":14,\"web/assets-future-v1/PhTrash-C9PD0SAt.js\":14,\"web/assets-future-v1/PhUser-0sWNXQeZ.js\":14,\"web/assets-future-v1/PhVault-6JTskUcC.js\":14,\"web/assets-future-v1/PhWarning-CoKs3gz6.js\":14,\"web/assets-future-v1/PhWarningCircle-BXHw1fCt.js\":14,\"web/assets-future-v1/PhX-DX0SFIqC.js\":14,\"web/assets-future-v1/PhoneIcon-DD2_wj_e.js\":1,\"web/assets-future-v1/PinInput-DbZ0b1i1-DmA5bgal.js\":247,\"web/assets-future-v1/PrivyPluginContext-DA-yS5vO-DLogqAK_.js\":1,\"web/assets-future-v1/PrivySession-CJcUIFVa.js\":1,\"web/assets-future-v1/QrCode-HPSrpHat-CtMKDCor.js\":22,\"web/assets-future-v1/RecoveryOAuthStatusScreen-Cyp2Aysv-y6c69pK1.js\":1,\"web/assets-future-v1/RecoveryPasswordCreateScreen-u_ReAEBk-DlTWAL0n.js\":1,\"web/assets-future-v1/RecoverySelectionScreen-cIVUHy8G-cegENsi5.js\":7,\"web/assets-future-v1/SIWXUtil-B-Qbig7-.js\":1,\"web/assets-future-v1/Screen-DZNhZC2N-qpvtz8l2.js\":175,\"web/assets-future-v1/ScreenHeader-CHmc4-Lu-DKEjpUJn.js\":31,\"web/assets-future-v1/ScreenLayout-nGD4p5K0-CHY5CldX.js\":1,\"web/assets-future-v1/SelectSourceAsset-BsJpnIhX-DHKD1UVZ.js\":140,\"web/assets-future-v1/SetAutomaticRecoveryScreen-qsezmY6k-BahST7k6.js\":14,\"web/assets-future-v1/SetWalletPasswordForm-4DYPfyfF-C5wv1U2G.js\":11,\"web/assets-future-v1/ShieldCheckIcon-DGN1Pl73.js\":1,\"web/assets-future-v1/SignRequestScreen-Dxq0VV3k-B4u-7Xys.js\":26,\"web/assets-future-v1/SolanaWalletConnector-CtU87Bd6-DciLLQR1.js\":1,\"web/assets-future-v1/StackedContainer-B2vaEl56-DfBALLa1.js\":24,\"web/assets-future-v1/StandardSignAndSendTransactionScreen-Ctm2LJ6Q-Cl3l3JMS.js\":20,\"web/assets-future-v1/Subtitle-CV-2yKE4-G0IX-WCN.js\":13,\"web/assets-future-v1/TelegramAuthScreen-DR6Kx8-e-Db8b48rO.js\":1,\"web/assets-future-v1/Title-BnzYV3Is-CNtNBwmi.js\":7,\"web/assets-future-v1/TodoList-DnyULl18-Bh_qRpf2.js\":36,\"web/assets-future-v1/TransactionDetails-VWpLHxjh-B1jQI2sQ.js\":109,\"web/assets-future-v1/TransactionErrorView-il1lrcrS-DWk9seZr.js\":178,\"web/assets-future-v1/TransferFromWalletScreen-Bmo-zEL9-D7ajbAZ8.js\":31,\"web/assets-future-v1/TransferOrBridgeLoadingScreen-P3MtaLJD-3vdgA61G.js\":6,\"web/assets-future-v1/TurnstileWrapper-2aABXboj-Bgu55Cj3.js\":1,\"web/assets-future-v1/UpdateEmailScreen-06S1peZD-Fqfovftp.js\":1,\"web/assets-future-v1/UpdatePhoneScreen-DaD_xBHP-Cu5pmdXO.js\":1,\"web/assets-future-v1/UserLimitReachedScreen-BZwtgVqf-DYEkJSHo.js\":1,\"web/assets-future-v1/Value-DTgR824E-BaIf7H0V.js\":27,\"web/assets-future-v1/WalletCards-DH1rqayz-DdZXQqEj.js\":1,\"web/assets-future-v1/WalletIcon-CfaltKuw.js\":1,\"web/assets-future-v1/WalletInfoCard-C92pgPpt-BUtsvtpy.js\":29,\"web/assets-future-v1/WalletInterstitialScreen-BCI6eGCA-Bfo0lN_M.js\":1,\"web/assets-future-v1/WalletLink-BK7xQj-S-DPNrvhSf.js\":20,\"web/assets-future-v1/WalletOverflowButton-D56qnL73-CTDCDVg4.js\":1,\"web/assets-future-v1/WarningBanner-ZZqCEtZK-DD_CsJ_I.js\":21,\"web/assets-future-v1/_esm-5FcxR2A7.js\":3,\"web/assets-future-v1/accessKey-DllOtB7X.js\":3,\"web/assets-future-v1/analytics-mkkvFRju-BRBcadka.js\":1,\"web/assets-future-v1/basic-BR1DATDt.js\":1575,\"web/assets-future-v1/call-Bm9w5nme.js\":33,\"web/assets-future-v1/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js\":1,\"web/assets-future-v1/ccip-DBV77i5G.js\":1,\"web/assets-future-v1/check-B8o8ZNpi.js\":1,\"web/assets-future-v1/chevron-down-Bie_7Zqx.js\":1,\"web/assets-future-v1/circle-alert-BuHuWUR1.js\":1,\"web/assets-future-v1/circle-check-big-lAOiCYlt.js\":1,\"web/assets-future-v1/circle-x-CL_U3n9V.js\":1,\"web/assets-future-v1/coinbase-CEeA7Gup-CGYnv7-_.js\":1,\"web/assets-future-v1/copy-HVDRzuYa.js\":1,\"web/assets-future-v1/core-B9N-w82C.js\":12,\"web/assets-future-v1/createLucideIcon-Cp5gDHSp.js\":1,\"web/assets-future-v1/custom-BKvn-pdL.js\":1,\"web/assets-future-v1/dijkstra-BmnL05hg.js\":1,\"web/assets-future-v1/dist-CloxERI8.js\":3,\"web/assets-future-v1/dist-CoS6E-3x.js\":1,\"web/assets-future-v1/dist-Cp6IXeJd.js\":1,\"web/assets-future-v1/dist-CrNxmdZj.js\":1,\"web/assets-future-v1/dist-l991CqgT.js\":16,\"web/assets-future-v1/errors-BQ3N-RVt-CZPAWCgC.js\":1,\"web/assets-future-v1/esm-C3DslVJx.js\":1,\"web/assets-future-v1/esm-CG_aiq74.js\":1,\"web/assets-future-v1/esm-Ci1ogKuK.js\":1,\"web/assets-future-v1/esm-DsxEYfBg.js\":36,\"web/assets-future-v1/esm-n2lWo7kz.js\":1,\"web/assets-future-v1/ethers-zTjbodk5-DKstyThm.js\":1,\"web/assets-future-v1/eventemitter3-CXX68V5S.js\":1,\"web/assets-future-v1/external-link-CKWzC_Pw.js\":1,\"web/assets-future-v1/fallback-Cn-hieGx.js\":1,\"web/assets-future-v1/farcaster-DPlSjvF5-hDHFwtNI.js\":1,\"web/assets-future-v1/features-CcoH24QO.js\":2,\"web/assets-future-v1/fingerprint-pattern-tfkID5VF.js\":1,\"web/assets-future-v1/floating-ui.react-C2iB3jgH.js\":1,\"web/assets-future-v1/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js\":1,\"web/assets-future-v1/get-entropy-details-for-user-BNFL8oGV-DHS_iE9g.js\":1,\"web/assets-future-v1/getAddress-yOC5k4Wk.js\":2,\"web/assets-future-v1/getChainName-DjpPdUSc-DUyKDrnp.js\":1,\"web/assets-future-v1/getErc20Balance-jXNpFf0N-BaftNkPI.js\":1,\"web/assets-future-v1/getErc20TokenInfo-BNTrzLMP-KT3srM5w.js\":1,\"web/assets-future-v1/getFormattedUsdFromLamports-CQLJQZzJ-Gx4_wxON.js\":1,\"web/assets-future-v1/getUsdcMintAddress-C28SljRU-DjI2gJgr.js\":1,\"web/assets-future-v1/guards-B2s3KemH-B_nGQ6iA.js\":1,\"web/assets-future-v1/hooks.module-BYZGfwDl.js\":1,\"web/assets-future-v1/hourglass-D308JFDA.js\":1,\"web/assets-future-v1/id-UqEwL2BI-DBaJPjJB.js\":1,\"web/assets-future-v1/index-AF7PM1lf-vZv48rrT.js\":1,\"web/assets-future-v1/index-BcQq0_SC-CmJW_v-p.js\":12,\"web/assets-future-v1/index-CWARkn2w-DYI2V413.js\":61,\"web/assets-future-v1/index-CqvyXQur-DV07a8Dd.js\":437,\"web/assets-future-v1/index-DdqXwvQ8.css\":1,\"web/assets-future-v1/index-IgEJPNDv.js\":24,\"web/assets-future-v1/index.browser-DlyOLjk4.js\":1,\"web/assets-future-v1/index.es-CXUqFyhV.js\":2,\"web/assets-future-v1/index.es-qazbOS24.js\":3,\"web/assets-future-v1/internal-FVhHi1fy.js\":6,\"web/assets-future-v1/jsx-runtime-CvftCknt.js\":1,\"web/assets-future-v1/landmark-2oih4QJq.js\":1,\"web/assets-future-v1/lib-CB0iRLqZ.js\":1,\"web/assets-future-v1/lock-bHMfAp0N.js\":1,\"web/assets-future-v1/logger-CsXm3oIv-B0UYpNFI.js\":1,\"web/assets-future-v1/mail-fTYx7nzS.js\":1,\"web/assets-future-v1/modal-context-CzyPCE1h-CI6R4GsA.js\":1,\"web/assets-future-v1/ofetch.CWycOUEr-Duby3iHT.js\":1,\"web/assets-future-v1/parseEther-C5Bp3ihU.js\":1,\"web/assets-future-v1/pkce-DOaTOlfX-sqWf_RtP.js\":1,\"web/assets-future-v1/privy-context-Bxv3Wh-5-Cuby72dr.js\":1,\"web/assets-future-v1/property-DuZ9DLP4.js\":3,\"web/assets-future-v1/react-C-d6KpeX.js\":1,\"web/assets-future-v1/react-auth-sHnipzbS.js\":1,\"web/assets-future-v1/react-dom-BZdSsEcb.js\":1,\"web/assets-future-v1/reservoir-x-nGuZkT-DMTb3hrr.js\":1,\"web/assets-future-v1/resolveError-CC6tIaRh.js\":1,\"web/assets-future-v1/rolldown-runtime-DLMaRju-.js\":1,\"web/assets-future-v1/safe-url-D7SRPu33-CkMedGro.js\":1,\"web/assets-future-v1/secp256k1-Csu6Qa0Z.js\":1,\"web/assets-future-v1/secp256k1-DsxXqbXv.js\":1,\"web/assets-future-v1/sendTransaction-B8tTM2wb.js\":1,\"web/assets-future-v1/shared-CFJrjgWW-BBuMbVpb.js\":193,\"web/assets-future-v1/shared-FM0rljBt-D-wAu1V6.js\":21,\"web/assets-future-v1/shouldProceedtoEmbeddedWalletCreationFlow-C1J2jbcH-Bo75Fs0b.js\":1,\"web/assets-future-v1/simulateTransaction-B_Cn6cXf-Z8QgoQCc.js\":1,\"web/assets-future-v1/smartphone-CVPOGXzf.js\":1,\"web/assets-future-v1/storage-Ufl800Ne-BglSpeAE.js\":1,\"web/assets-future-v1/store-BlXVHZKu.js\":1,\"web/assets-future-v1/stripe.esm-DeCnSmRn.js\":2,\"web/assets-future-v1/styles-BRWlD4eG-iJY95DM4.js\":191,\"web/assets-future-v1/styles-BsotlekN-FqRRXKJE.js\":9,\"web/assets-future-v1/styles-DVyDvTdj-CxcgKlnC.js\":74,\"web/assets-future-v1/styles-SlRcHdFL-hkWeYOGu.js\":92,\"web/assets-future-v1/telegram-B-JqnkqZ-1MuQuslm.js\":1,\"web/assets-future-v1/tempoModerato-Bl7un_UG.js\":1,\"web/assets-future-v1/to-ui-error-n8KhkP0u-ByI9v8zV.js\":4,\"web/assets-future-v1/toViemAccount-CxoAwoGG-DdyNKBkc.js\":2,\"web/assets-future-v1/transaction-CLaic3AD-B5RiCLId.js\":1,\"web/assets-future-v1/transfer-6YztDh-t-BVQkTvG-.js\":1,\"web/assets-future-v1/triangle-alert-BpmH-1xT.js\":1,\"web/assets-future-v1/twitch-5IOe4sIQ-HPXy1gIL.js\":1,\"web/assets-future-v1/use-headless-crypto-deposit-DXuA2PzO-CUueyR-6.js\":1,\"web/assets-future-v1/use-sign-with-user-signer-aF_Sckfb-pmb6nKye.js\":1,\"web/assets-future-v1/use-text-value-AaRkZLvG.js\":1,\"web/assets-future-v1/use-unlink-wallet-DlfnbLSB-DCYmm3lg.js\":1,\"web/assets-future-v1/useActiveWallet-B5NoYzzn-BjyojJ0o.js\":123,\"web/assets-future-v1/useAsyncValue-sCQ_EAT9-Bu99E0Gl.js\":1,\"web/assets-future-v1/useGetSolPrice-x7gfUIHJ-Dc3JCTkb.js\":1,\"web/assets-future-v1/useGetTokenPrice-D8Cb3tFH-BhMWadxD.js\":1,\"web/assets-future-v1/useI18n-BIWeTVK5-DwMROAvg.js\":1,\"web/assets-future-v1/useWalletBalance-CZnP5f_f-soyczUlz.js\":1,\"web/assets-future-v1/useWallets-Cy8VgsCY-DGh3BGP9.js\":2,\"web/assets-future-v1/utils-BXiNjgTj.js\":1,\"web/assets-future-v1/utils-DdckVfQr.js\":1,\"web/assets-future-v1/utils-oVEYY1QK.js\":1,\"web/assets-future-v1/w3m-modal-DH7DRXUG.js\":1174,\"web/assets-future-v1/waitForCallsStatus-DtgDh1wq.js\":1,\"web/assets-future-v1/wallet-ADUDuYRA.js\":1,\"web/assets-future-v1/wallet-connect-DasLtN-l-B45FDjMQ.js\":1,\"web/assets-future-v1/walletconnect-registry-xxG8XLCb-ClGB_THV.js\":1,\"web/assets-future-v1/walletconnect-v2-miav_NoG-DyACuoy2.js\":12,\"web/assets-future-v1/writeContract-69NWgzsH.js\":1,\"web/assets-future-v1/wui-ux-by-reown-DeKMwgIw.js\":1147,\"web/assets-future-v1/x-BjLgYP_C.js\":1,\"web/boot.mjs\":16,\"web/config-schema.mjs\":33,\"web/contract-verification.mjs\":9,\"web/deployment.mjs\":4,\"web/favicon.svg\":1,\"web/game-abi.mjs\":1580,\"web/game-rules.mjs\":42,\"web/index.html\":40,\"web/purchase.mjs\":26,\"web/site-config.json\":3,\"web/social-card.png\":300},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"33508bb50a8400c51a55dd90500c1d1756a5a5c4a9c0d3e70b9979dfa9040853","verifiedTreeHash":"1db9eec2fc86ed22e4395383d3f02989e7bfb40e","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":3811,"exitCode":0,"name":"build","output":"Compiling 25 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.68s\nCompiler run successful!\n","passed":true},{"durationMs":1970,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 39 tests for test/IMDPot.t.sol:IMDPotTest\n[PASS] testFuzz_conservationAcrossSettlementsRefundsAndClaims(uint32,uint32,uint32,bytes32) (runs: 256, μ: 2813977, ~: 2846922)\nLogs:\n  Bound result 2\n  Bound result 425\n  Bound result 247\n\n[PASS] testFuzz_priceIsOneTenthForSupportedDecimals(uint8) (runs: 256, μ: 834220, ~: 834009)\nLogs:\n  Bound result 5\n\n[PASS] test_boostCapsAtTwoXAndIsFrozenForEntireRound() (gas: 11244244)\n[PASS] test_boostedSingleTicketStillCannotWinTwice() (gas: 10839771)\n[PASS] test_cancelRestoresBoostWithoutAwardingPointsOrRequiringRefundFirst() (gas: 10507692)\n[PASS] test_claimFailurePreservesCreditAndDoesNotBlockAnotherWinner() (gas: 1828132)\n[PASS] test_contractWalletCanPlayAndCannotReenterClaim() (gas: 1830887)\n[PASS] test_contractWalletCannotReenterRefund() (gas: 1470649)\n[PASS] test_drawCommitsExactlyThreeBlocksAndCannotReroll() (gas: 1199410)\n[PASS] test_entryAtDeadlineAndWhileDrawingRejects() (gas: 813564)\n[PASS] test_entryReentrancyFailsAndOuterEntryRemainsCorrect() (gas: 577281)\n[PASS] test_entryRejectsZeroTooManyAndInsufficientApprovalOrBalance() (gas: 861882)\n[PASS] test_expiredDrawCannotSettleOrBeRecommitted() (gas: 773755)\n[PASS] test_factoryUsesExplicitLaunchOwnerWithoutExternalConstructorCalls() (gas: 331669)\n[PASS] test_failedFeeTransferDoesNotBlockSettlementAndRetryPaysExactlyOnce() (gas: 1600803)\n[PASS] test_falseReturnAfterMovingTokensRollsBackFeeSubcall() (gas: 1352578)\n[PASS] test_feeReentrancyAndUnauthorizedSelfCallCannotDrain() (gas: 1202506)\n[PASS] test_finalizeBeforeEntryOrBeforeEndRejects() (gas: 436644)\n[PASS] test_lastBlockhashBoundarySettlesAndCannotCancel() (gas: 992649)\n[PASS] test_loyaltyThresholdsInsufficientRoundsAndPoints() (gas: 9382946)\n[PASS] test_noReturnERC20Supported() (gas: 1155966)\n[PASS] test_oddBaseUnitRoundingAssignedToFirstPrize() (gas: 1915296)\n[PASS] test_oneTicketReceivesAllSeventyPercentAndNoEmptyPrizes() (gas: 1016419)\n[PASS] test_onlyOwnerCanConfigureAndOnlyOnce() (gas: 1762051)\n[PASS] test_ownerCannotCancelAnUnpausedRoundEvenAfterOneDay() (gas: 449750)\n[PASS] test_ownerCannotRescueGameTokenIncludingLockedShareOrDonations() (gas: 2011957)\n[PASS] test_pauseBlocksEntriesAndCommitButCommittedDrawSettlesAndClaimsWork() (gas: 1198815)\n[PASS] test_pausedActiveRoundCancelsOnlyAfterOneDayAndRefundsInFull() (gas: 1086549)\n[PASS] test_pointsCreditOncePerSettledTicketAndRound() (gas: 2157982)\n[PASS] test_redemptionDuringRoundAppliesOnlyToNextRound() (gas: 10681907)\n[PASS] test_refundFailurePreservesTicketAndRefundObligation() (gas: 859189)\n[PASS] test_repeatedPurchasesDoNotDuplicateParticipants() (gas: 799552)\n[PASS] test_reviewedPurchaseCannotEnterAnotherRound() (gas: 1399838)\n[PASS] test_settlementConservesSharesAndPullClaims() (gas: 1868212)\n[PASS] test_taxedEntryAndFalseReturnRejectWithoutRecordingTickets() (gas: 862124)\n[PASS] test_taxedPayoutCannotSilentlyUnderpay() (gas: 1258135)\n[PASS] test_timerStartsOnFirstTicketAndDoesNotExtend() (gas: 780021)\n[PASS] test_twoStepOwnershipAndFixedTreasury() (gas: 392651)\n[PASS] test_twoTicketsCanGiveSameWalletTwoPrizesAndRollThirdIntoFirst() (gas: 1041633)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 116.05ms (233.29ms CPU time)\n\nRan 2 tests for test/WeightedTree.t.sol:WeightedTreeTest\n[PASS] testFuzz_dynamicGrowthAndUpdatesMatchLinearOracle(uint256,uint8) (runs: 256, μ: 3999572, ~: 1763977)\nLogs:\n  Bound result 6\n\n[PASS] test_zeroWeightNodesAndInvalidActions() (gas: 433600)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 230.10ms (230.14ms CPU time)\n\nRan 1 test for test/IMDPot.invariant.t.sol:IMDPotInvariantTest\n[PASS]\nIMDPotInvariantTest invariants:\n[PASS] invariant_balanceCoversExactlyEveryObligation\n[PASS] invariant_refundsAndLockedSharesMatchHistoricalRounds\n IMDPotInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭------------+-------------+-------+---------+----------╮\n| Contract   | Selector    | Calls | Reverts | Discards |\n+=======================================================+\n| PotHandler | buy         | 604   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | claim       | 590   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | redeem      | 662   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | refund      | 566   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | resolve     | 551   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | sync        | 537   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | togglePause | 586   | 0       | 0        |\n╰------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 15\n  Bound result 34\n  Bound result 100\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 28\n  Bound result 39\n  Bound result 100\n  Bound result 11\n  Bound result 2\n  Bound result 28\n  Bound result 5\n  Bound result 42\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.81s (1.81s CPU time)\n\nRan 3 test suites in 1.82s (2.16s CPU time): 42 tests passed, 0 failed, 0 skipped (42 total tests)\n","passed":true},{"durationMs":177,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDPot.acceptOwnership()\",\"IMDPot.buyTickets(uint256)\",\"IMDPot.buyTicketsForRound(uint256,uint256)\",\"IMDPot.cancelRound()\",\"IMDPot.claim()\",\"IMDPot.finalizeRound()\",\"IMDPot.flushPendingFees()\",\"IMDPot.pause()\",\"IMDPot.redeemMultiplier()\",\"IMDPot.refund(uint256)\",\"IMDPot.rescueForeignToken(address,address)\",\"IMDPot.setToken(address)\",\"IMDPot.syncPoints(address)\",\"IMDPot.transferFee(address,uint256)\",\"IMDPot.transferOwnership(address)\",\"IMDPot.unpause()\"],\"files\":{\".gitignore\":6,\"README.md\":133,\"docs/SECURITY.md\":58,\"docs/site-capture.json\":319,\"foundry.toml\":18,\"remappings.txt\":1,\"src/IMDPot.sol\":528,\"src/libraries/WeightedTree.sol\":63,\"test/IMDPot.invariant.t.sol\":148,\"test/IMDPot.t.sol\":802,\"test/MockToken.sol\":71,\"test/WeightedTree.t.sol\":92,\"test/site.integration.mjs\":136,\"test/test_release.py\":67,\"test/web.test.mjs\":153,\"tools/build_site.py\":110,\"tools/sync_abi.py\":18,\"web/assets-future-v1/AccountNotFoundScreen-DmCu584z-BCSQbn_H.js\":1,\"web/assets-future-v1/AddFundsSelectionScreen-CvdQ9APw-Cw9tbqpj.js\":7,\"web/assets-future-v1/Address-D-hKSBMc-BEHFET5A.js\":17,\"web/assets-future-v1/AffirmativeConsentScreen-Cm3ilbFM-Z0mIroYr.js\":6,\"web/assets-future-v1/AllowlistRejectionScreen-94CrH44E-Cl2FR9wd.js\":1,\"web/assets-future-v1/ApiController-BPNSsbA_.js\":5,\"web/assets-future-v1/ArrowsRightLeftIcon-B-VpvMMr.js\":1,\"web/assets-future-v1/AuthenticateWithWalletScreen-DOlqqtwf-DhRHb5Ow.js\":1,\"web/assets-future-v1/AwaitingEvmToSolBridgingScreen-BAwgpv6z-Bz46Au8f.js\":1,\"web/assets-future-v1/AwaitingExternalEthereumTransferScreen-CrmoLkyM-B_J6BkJf.js\":1,\"web/assets-future-v1/AwaitingPasswordlessCodeScreen-PG8R_qZ7-Dc8cYtMB.js\":103,\"web/assets-future-v1/AwaitingSolToEvmBridgingScreen-CfxbsY2V-DSEHmrXb.js\":1,\"web/assets-future-v1/BridgeNetworkSelectionView-CyWjJLLL-yzzqv0fN.js\":68,\"web/assets-future-v1/CaptchaScreen-Di6DawY1-DP8zS0O2.js\":1,\"web/assets-future-v1/CheckCircleIcon-C5-JLm-a.js\":1,\"web/assets-future-v1/CheckCircleIcon-L7pHUk8b.js\":1,\"web/assets-future-v1/Checkbox-D1EDeo41-CBza6Itl.js\":52,\"web/assets-future-v1/ChevronDownIcon-Cix9gOo-.js\":1,\"web/assets-future-v1/Chip-CZKIKt9K-B5giFS9U.js\":26,\"web/assets-future-v1/CoinbaseOnrampStatusScreen-CQ5wJdhR-CHKXE9Zg.js\":16,\"web/assets-future-v1/ConnectEmailForm-VvzLeAu_-DeLfSKaI.js\":3,\"web/assets-future-v1/ConnectLedgerScreen-PcSk3bj3-CJP5ouV6.js\":10,\"web/assets-future-v1/ConnectOnlyLandingScreen-CzsS1KUE-D5Jjd8mA.js\":1,\"web/assets-future-v1/ConnectOnlyStatusScreen-DAnXdxMc-QrdGKZfF.js\":1,\"web/assets-future-v1/ConnectOrCreateScreen-B13RFu4y-qpxGvC-g.js\":1,\"web/assets-future-v1/ConnectPhoneForm-CgvF9lfY-Bjq8zAeP.js\":95,\"web/assets-future-v1/ConnectWalletView-CVcmCUWx-DcVjm0-R.js\":74,\"web/assets-future-v1/ConnectionStatusScreen-CkZB3A-v-BwQJgTpC.js\":7,\"web/assets-future-v1/ConnectorUtil-9-QqcAdN.js\":21,\"web/assets-future-v1/ConstantsUtil-DmLsRHAl.js\":198,\"web/assets-future-v1/CopyToClipboard-i_OQSBJr-D_GDYkRo.js\":39,\"web/assets-future-v1/CopyableText-CQapvaMr-D2qfp0B5.js\":28,\"web/assets-future-v1/CrossAppAuthScreen-55ctQxf7-CuN9ly_E.js\":1,\"web/assets-future-v1/CustomLandingScreenView-DCKHF9M9-dIVgxpQv.js\":22,\"web/assets-future-v1/DelegatedActionsConsentScreen-B-NoZ7KR-C94P_M8G.js\":1,\"web/assets-future-v1/DelegatedActionsRevokeScreen-HnrbzfZN-CmRrY8e8.js\":1,\"web/assets-future-v1/DepositAddressAddressStepView-BBRl-QpO-DZMf5-lM.js\":187,\"web/assets-future-v1/DepositAddressScreen-BB3v4rHj-BPe6KJ8S.js\":8,\"web/assets-future-v1/DepositAddressV3Screen-DvnJDngM-D04YsV25.js\":1,\"web/assets-future-v1/EmailInputForm-Cqo1mda8-D3fhsbzl.js\":124,\"web/assets-future-v1/EmbeddedWalletConnectingScreen-DVkAbpWM-CRMyVUgO.js\":1,\"web/assets-future-v1/EmbeddedWalletCreatedScreen-Dh97ZcWk-CS1KQENE.js\":1,\"web/assets-future-v1/EmbeddedWalletKeyExportScreen-Dfd_ipkl-DA55wlws.js\":23,\"web/assets-future-v1/EmbeddedWalletOnAccountCreateScreen-JY3xQL2B-B0He8Sfj.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateScreen-CiseufAK-C03IA1x1.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateSplashScreen-CaQbsSTp-BCWKi3PM.js\":1,\"web/assets-future-v1/EnrollTotp-CTpF3OWX-BKgTMBK5.js\":66,\"web/assets-future-v1/EnvelopeIcon-DMvqes7d.js\":1,\"web/assets-future-v1/ErrorBanner-BcpGRt0h-Bfj743IN.js\":21,\"web/assets-future-v1/ErrorMessage-D8VaAP5m-CS06WdNK.js\":8,\"web/assets-future-v1/ErrorScreen-f2o266cj-BQKHBU3d.js\":4,\"web/assets-future-v1/ExclamationCircleIcon-BfN0y50L.js\":1,\"web/assets-future-v1/ExclamationTriangleIcon-JkGdtDha.js\":1,\"web/assets-future-v1/FarcasterConnectStatusScreen-2-_iV769-BmPFtxjg.js\":75,\"web/assets-future-v1/FarcasterSignerStatusScreen-YTSx8zuE-Dk-G_7O0.js\":28,\"web/assets-future-v1/FiatOnrampScreen-Cn4FmpB5-Ce2LeFWV.js\":578,\"web/assets-future-v1/FingerPrintIcon-DDtL5c0C.js\":1,\"web/assets-future-v1/FundSolWalletWithExternalSolanaWallet-dK67dE7B-DSR7bBXI.js\":1,\"web/assets-future-v1/FundWalletMethodHeader-CZzBi5cW-DP5Svv96.js\":1,\"web/assets-future-v1/FundWithBankDepositScreen-BKg4LaM0-DtkB4hUD.js\":58,\"web/assets-future-v1/FundingEditAmountScreen-gVCDz2hc-CrI8YJuv.js\":1,\"web/assets-future-v1/FundingMethodSelectionScreen-Dwg5HAn9-gpV-rB8t.js\":1,\"web/assets-future-v1/GlobeAltIcon-CnkwyQwD.js\":1,\"web/assets-future-v1/GooglePay-B53WnudL-BC9WrAhV.js\":1,\"web/assets-future-v1/HCaptchaWrapper-CUi9LJsp-8QsMGzaG.js\":4,\"web/assets-future-v1/InAppBrowserLoginNotPossible-D4EeEdze-CsByAdfj.js\":1,\"web/assets-future-v1/InfoBanner-Cb3p1z12-DWrD6YP1.js\":22,\"web/assets-future-v1/InjectedWalletIcon-DLcYOGDj-CpngehNK.js\":1,\"web/assets-future-v1/InstallWalletScreen-B1yxNHgg-UrKFUBcT.js\":1,\"web/assets-future-v1/JsonTree-BHzNC-ic-BD2CORNN.js\":34,\"web/assets-future-v1/LabelXs-oqZNqbm_-DLlwZvt7.js\":6,\"web/assets-future-v1/LandingScreen-zRwMN0po-dGRSsZND.js\":1,\"web/assets-future-v1/Layouts-BMRfo5hw-BXZv4R83.js\":77,\"web/assets-future-v1/Link-BdDilT2T-CO0WtnUV.js\":40,\"web/assets-future-v1/LinkConflictScreen-YklPsTUx-Bc1DufFz.js\":77,\"web/assets-future-v1/LinkEmailScreen-Bqb5fKMB-Dy7oNbdZ.js\":1,\"web/assets-future-v1/LinkPasskeyScreen-DCzXkdBR-D20BqIic.js\":117,\"web/assets-future-v1/LinkPhoneScreen-WC5uerRR-CDHXLRw1.js\":1,\"web/assets-future-v1/Loader-UAZqxsnw-BjnvLK0W.js\":62,\"web/assets-future-v1/LoadingSkeleton-BMsgO5PV-sKfjGViu.js\":17,\"web/assets-future-v1/LockClosedIcon-tMHvyrzR.js\":1,\"web/assets-future-v1/LoginFailedScreen-DtjHCXGc-CcMTlOwV.js\":1,\"web/assets-future-v1/ManualTransferScreen-CXxMG6Ri-xNGhrs7E.js\":1,\"web/assets-future-v1/MfaAuthEnrollmentFlowScreen-D5JeOLgJ-CoeKTb-o.js\":1,\"web/assets-future-v1/MfaAuthVerifyFlowScreen--aCJotEK-UMgUWUIA.js\":1,\"web/assets-future-v1/MfaEnrollmentFlowScreen-DaOfZDQL-ByTQ5-Hp.js\":1,\"web/assets-future-v1/MfaVerifyFlowScreen-8VhJP8xn-DLz-woKv.js\":1,\"web/assets-future-v1/ModalFooter-CmGY3GN5-D-y9DoW2.js\":403,\"web/assets-future-v1/MoonpayStatusScreen-B-JeyK9J-BnW4KduS.js\":16,\"web/assets-future-v1/OAuthStatusScreen-zos_nuFY-BQUDzPth.js\":1,\"web/assets-future-v1/OpenLink-CUpJ1mOr-CcpZRXEy.js\":39,\"web/assets-future-v1/PasskeySelectSignupOrLogin-CQaGUKP3-CtpFNSST.js\":1,\"web/assets-future-v1/PasskeyStatusScreen-CgVPBiep-ZT7U88v8.js\":6,\"web/assets-future-v1/PasswordRecoveryScreen-D45ttCfH-DD3WwGl-.js\":20,\"web/assets-future-v1/PhArrowCircleDown-D97G-BOA.js\":14,\"web/assets-future-v1/PhArrowClockwise-DVgyFuez.js\":14,\"web/assets-future-v1/PhArrowDown-87b1BizM.js\":14,\"web/assets-future-v1/PhArrowLeft-Da0MfnbK.js\":14,\"web/assets-future-v1/PhArrowRight-AdrIL4DW.js\":14,\"web/assets-future-v1/PhArrowSquareOut-Bk2CMG3I.js\":14,\"web/assets-future-v1/PhArrowUp-4sgyKPGx.js\":14,\"web/assets-future-v1/PhArrowUpRight-BNghD2zq.js\":14,\"web/assets-future-v1/PhArrowsClockwise-BXRn1GEl.js\":14,\"web/assets-future-v1/PhArrowsDownUp-DM09Jo_3.js\":14,\"web/assets-future-v1/PhArrowsLeftRight-MuKBLUoF.js\":14,\"web/assets-future-v1/PhBank-fHbgCqqZ.js\":14,\"web/assets-future-v1/PhBrowser-2-9m-AkM.js\":14,\"web/assets-future-v1/PhCaretDown-BDNabFuL.js\":14,\"web/assets-future-v1/PhCaretLeft-CI460R-A.js\":14,\"web/assets-future-v1/PhCaretRight-D7ZS3Ls8.js\":14,\"web/assets-future-v1/PhCaretUp-C-iIfyvO.js\":14,\"web/assets-future-v1/PhCheck-DxQXn57r.js\":14,\"web/assets-future-v1/PhCircleHalf-MJZeRBGF.js\":14,\"web/assets-future-v1/PhClock-x3MS3Mwi.js\":14,\"web/assets-future-v1/PhCompass-hYn3HhGN.js\":14,\"web/assets-future-v1/PhCopy-CWNYcABI.js\":14,\"web/assets-future-v1/PhCreditCard-Fy4pzwtt.js\":14,\"web/assets-future-v1/PhCurrencyDollar-BgiaenCi.js\":14,\"web/assets-future-v1/PhDesktop-CxrzCSv5.js\":14,\"web/assets-future-v1/PhDeviceMobile-CsyA5Goi.js\":14,\"web/assets-future-v1/PhDotsThree-D-k1BiYg.js\":14,\"web/assets-future-v1/PhEnvelope-D8kzeNox.js\":14,\"web/assets-future-v1/PhFunnelSimple-CfQs5DAW.js\":14,\"web/assets-future-v1/PhGlobe-DvmSc9_A.js\":14,\"web/assets-future-v1/PhIdentificationCard-CfkZm-5K.js\":14,\"web/assets-future-v1/PhImage-Cf0J2ZfJ.js\":14,\"web/assets-future-v1/PhInfo-Bwi51-2X.js\":14,\"web/assets-future-v1/PhLightbulb-C4FZV7Es.js\":14,\"web/assets-future-v1/PhMagnifyingGlass-C9u8jSCJ.js\":14,\"web/assets-future-v1/PhPaperPlaneRight-zxQVvPLX.js\":14,\"web/assets-future-v1/PhPlus-C4UoW-2n.js\":14,\"web/assets-future-v1/PhPower-CFyWDmgD.js\":14,\"web/assets-future-v1/PhPuzzlePiece-BjoNVfST.js\":14,\"web/assets-future-v1/PhQrCode-CP3tFauY.js\":14,\"web/assets-future-v1/PhQuestion-wOWJBd3G.js\":14,\"web/assets-future-v1/PhQuestionMark-CV0k9C0Y.js\":14,\"web/assets-future-v1/PhSealCheck-vIKzREuN.js\":14,\"web/assets-future-v1/PhSignOut-CxELV-i0.js\":14,\"web/assets-future-v1/PhSpinner-CGDmbzUd.js\":14,\"web/assets-future-v1/PhTrash-C9PD0SAt.js\":14,\"web/assets-future-v1/PhUser-0sWNXQeZ.js\":14,\"web/assets-future-v1/PhVault-6JTskUcC.js\":14,\"web/assets-future-v1/PhWarning-CoKs3gz6.js\":14,\"web/assets-future-v1/PhWarningCircle-BXHw1fCt.js\":14,\"web/assets-future-v1/PhX-DX0SFIqC.js\":14,\"web/assets-future-v1/PhoneIcon-DD2_wj_e.js\":1,\"web/assets-future-v1/PinInput-DbZ0b1i1-DmA5bgal.js\":247,\"web/assets-future-v1/PrivyPluginContext-DA-yS5vO-DLogqAK_.js\":1,\"web/assets-future-v1/PrivySession-CJcUIFVa.js\":1,\"web/assets-future-v1/QrCode-HPSrpHat-CtMKDCor.js\":22,\"web/assets-future-v1/RecoveryOAuthStatusScreen-Cyp2Aysv-y6c69pK1.js\":1,\"web/assets-future-v1/RecoveryPasswordCreateScreen-u_ReAEBk-DlTWAL0n.js\":1,\"web/assets-future-v1/RecoverySelectionScreen-cIVUHy8G-cegENsi5.js\":7,\"web/assets-future-v1/SIWXUtil-B-Qbig7-.js\":1,\"web/assets-future-v1/Screen-DZNhZC2N-qpvtz8l2.js\":175,\"web/assets-future-v1/ScreenHeader-CHmc4-Lu-DKEjpUJn.js\":31,\"web/assets-future-v1/ScreenLayout-nGD4p5K0-CHY5CldX.js\":1,\"web/assets-future-v1/SelectSourceAsset-BsJpnIhX-DHKD1UVZ.js\":140,\"web/assets-future-v1/SetAutomaticRecoveryScreen-qsezmY6k-BahST7k6.js\":14,\"web/assets-future-v1/SetWalletPasswordForm-4DYPfyfF-C5wv1U2G.js\":11,\"web/assets-future-v1/ShieldCheckIcon-DGN1Pl73.js\":1,\"web/assets-future-v1/SignRequestScreen-Dxq0VV3k-B4u-7Xys.js\":26,\"web/assets-future-v1/SolanaWalletConnector-CtU87Bd6-DciLLQR1.js\":1,\"web/assets-future-v1/StackedContainer-B2vaEl56-DfBALLa1.js\":24,\"web/assets-future-v1/StandardSignAndSendTransactionScreen-Ctm2LJ6Q-Cl3l3JMS.js\":20,\"web/assets-future-v1/Subtitle-CV-2yKE4-G0IX-WCN.js\":13,\"web/assets-future-v1/TelegramAuthScreen-DR6Kx8-e-Db8b48rO.js\":1,\"web/assets-future-v1/Title-BnzYV3Is-CNtNBwmi.js\":7,\"web/assets-future-v1/TodoList-DnyULl18-Bh_qRpf2.js\":36,\"web/assets-future-v1/TransactionDetails-VWpLHxjh-B1jQI2sQ.js\":109,\"web/assets-future-v1/TransactionErrorView-il1lrcrS-DWk9seZr.js\":178,\"web/assets-future-v1/TransferFromWalletScreen-Bmo-zEL9-D7ajbAZ8.js\":31,\"web/assets-future-v1/TransferOrBridgeLoadingScreen-P3MtaLJD-3vdgA61G.js\":6,\"web/assets-future-v1/TurnstileWrapper-2aABXboj-Bgu55Cj3.js\":1,\"web/assets-future-v1/UpdateEmailScreen-06S1peZD-Fqfovftp.js\":1,\"web/assets-future-v1/UpdatePhoneScreen-DaD_xBHP-Cu5pmdXO.js\":1,\"web/assets-future-v1/UserLimitReachedScreen-BZwtgVqf-DYEkJSHo.js\":1,\"web/assets-future-v1/Value-DTgR824E-BaIf7H0V.js\":27,\"web/assets-future-v1/WalletCards-DH1rqayz-DdZXQqEj.js\":1,\"web/assets-future-v1/WalletIcon-CfaltKuw.js\":1,\"web/assets-future-v1/WalletInfoCard-C92pgPpt-BUtsvtpy.js\":29,\"web/assets-future-v1/WalletInterstitialScreen-BCI6eGCA-Bfo0lN_M.js\":1,\"web/assets-future-v1/WalletLink-BK7xQj-S-DPNrvhSf.js\":20,\"web/assets-future-v1/WalletOverflowButton-D56qnL73-CTDCDVg4.js\":1,\"web/assets-future-v1/WarningBanner-ZZqCEtZK-DD_CsJ_I.js\":21,\"web/assets-future-v1/_esm-5FcxR2A7.js\":3,\"web/assets-future-v1/accessKey-DllOtB7X.js\":3,\"web/assets-future-v1/analytics-mkkvFRju-BRBcadka.js\":1,\"web/assets-future-v1/basic-BR1DATDt.js\":1575,\"web/assets-future-v1/call-Bm9w5nme.js\":33,\"web/assets-future-v1/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js\":1,\"web/assets-future-v1/ccip-DBV77i5G.js\":1,\"web/assets-future-v1/check-B8o8ZNpi.js\":1,\"web/assets-future-v1/chevron-down-Bie_7Zqx.js\":1,\"web/assets-future-v1/circle-alert-BuHuWUR1.js\":1,\"web/assets-future-v1/circle-check-big-lAOiCYlt.js\":1,\"web/assets-future-v1/circle-x-CL_U3n9V.js\":1,\"web/assets-future-v1/coinbase-CEeA7Gup-CGYnv7-_.js\":1,\"web/assets-future-v1/copy-HVDRzuYa.js\":1,\"web/assets-future-v1/core-B9N-w82C.js\":12,\"web/assets-future-v1/createLucideIcon-Cp5gDHSp.js\":1,\"web/assets-future-v1/custom-BKvn-pdL.js\":1,\"web/assets-future-v1/dijkstra-BmnL05hg.js\":1,\"web/assets-future-v1/dist-CloxERI8.js\":3,\"web/assets-future-v1/dist-CoS6E-3x.js\":1,\"web/assets-future-v1/dist-Cp6IXeJd.js\":1,\"web/assets-future-v1/dist-CrNxmdZj.js\":1,\"web/assets-future-v1/dist-l991CqgT.js\":16,\"web/assets-future-v1/errors-BQ3N-RVt-CZPAWCgC.js\":1,\"web/assets-future-v1/esm-C3DslVJx.js\":1,\"web/assets-future-v1/esm-CG_aiq74.js\":1,\"web/assets-future-v1/esm-Ci1ogKuK.js\":1,\"web/assets-future-v1/esm-DsxEYfBg.js\":36,\"web/assets-future-v1/esm-n2lWo7kz.js\":1,\"web/assets-future-v1/ethers-zTjbodk5-DKstyThm.js\":1,\"web/assets-future-v1/eventemitter3-CXX68V5S.js\":1,\"web/assets-future-v1/external-link-CKWzC_Pw.js\":1,\"web/assets-future-v1/fallback-Cn-hieGx.js\":1,\"web/assets-future-v1/farcaster-DPlSjvF5-hDHFwtNI.js\":1,\"web/assets-future-v1/features-CcoH24QO.js\":2,\"web/assets-future-v1/fingerprint-pattern-tfkID5VF.js\":1,\"web/assets-future-v1/floating-ui.react-C2iB3jgH.js\":1,\"web/assets-future-v1/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js\":1,\"web/assets-future-v1/get-entropy-details-for-user-BNFL8oGV-DHS_iE9g.js\":1,\"web/assets-future-v1/getAddress-yOC5k4Wk.js\":2,\"web/assets-future-v1/getChainName-DjpPdUSc-DUyKDrnp.js\":1,\"web/assets-future-v1/getErc20Balance-jXNpFf0N-BaftNkPI.js\":1,\"web/assets-future-v1/getErc20TokenInfo-BNTrzLMP-KT3srM5w.js\":1,\"web/assets-future-v1/getFormattedUsdFromLamports-CQLJQZzJ-Gx4_wxON.js\":1,\"web/assets-future-v1/getUsdcMintAddress-C28SljRU-DjI2gJgr.js\":1,\"web/assets-future-v1/guards-B2s3KemH-B_nGQ6iA.js\":1,\"web/assets-future-v1/hooks.module-BYZGfwDl.js\":1,\"web/assets-future-v1/hourglass-D308JFDA.js\":1,\"web/assets-future-v1/id-UqEwL2BI-DBaJPjJB.js\":1,\"web/assets-future-v1/index-AF7PM1lf-vZv48rrT.js\":1,\"web/assets-future-v1/index-BcQq0_SC-CmJW_v-p.js\":12,\"web/assets-future-v1/index-CWARkn2w-DYI2V413.js\":61,\"web/assets-future-v1/index-CqvyXQur-DV07a8Dd.js\":437,\"web/assets-future-v1/index-DdqXwvQ8.css\":1,\"web/assets-future-v1/index-IgEJPNDv.js\":24,\"web/assets-future-v1/index.browser-DlyOLjk4.js\":1,\"web/assets-future-v1/index.es-CXUqFyhV.js\":2,\"web/assets-future-v1/index.es-qazbOS24.js\":3,\"web/assets-future-v1/internal-FVhHi1fy.js\":6,\"web/assets-future-v1/jsx-runtime-CvftCknt.js\":1,\"web/assets-future-v1/landmark-2oih4QJq.js\":1,\"web/assets-future-v1/lib-CB0iRLqZ.js\":1,\"web/assets-future-v1/lock-bHMfAp0N.js\":1,\"web/assets-future-v1/logger-CsXm3oIv-B0UYpNFI.js\":1,\"web/assets-future-v1/mail-fTYx7nzS.js\":1,\"web/assets-future-v1/modal-context-CzyPCE1h-CI6R4GsA.js\":1,\"web/assets-future-v1/ofetch.CWycOUEr-Duby3iHT.js\":1,\"web/assets-future-v1/parseEther-C5Bp3ihU.js\":1,\"web/assets-future-v1/pkce-DOaTOlfX-sqWf_RtP.js\":1,\"web/assets-future-v1/privy-context-Bxv3Wh-5-Cuby72dr.js\":1,\"web/assets-future-v1/property-DuZ9DLP4.js\":3,\"web/assets-future-v1/react-C-d6KpeX.js\":1,\"web/assets-future-v1/react-auth-sHnipzbS.js\":1,\"web/assets-future-v1/react-dom-BZdSsEcb.js\":1,\"web/assets-future-v1/reservoir-x-nGuZkT-DMTb3hrr.js\":1,\"web/assets-future-v1/resolveError-CC6tIaRh.js\":1,\"web/assets-future-v1/rolldown-runtime-DLMaRju-.js\":1,\"web/assets-future-v1/safe-url-D7SRPu33-CkMedGro.js\":1,\"web/assets-future-v1/secp256k1-Csu6Qa0Z.js\":1,\"web/assets-future-v1/secp256k1-DsxXqbXv.js\":1,\"web/assets-future-v1/sendTransaction-B8tTM2wb.js\":1,\"web/assets-future-v1/shared-CFJrjgWW-BBuMbVpb.js\":193,\"web/assets-future-v1/shared-FM0rljBt-D-wAu1V6.js\":21,\"web/assets-future-v1/shouldProceedtoEmbeddedWalletCreationFlow-C1J2jbcH-Bo75Fs0b.js\":1,\"web/assets-future-v1/simulateTransaction-B_Cn6cXf-Z8QgoQCc.js\":1,\"web/assets-future-v1/smartphone-CVPOGXzf.js\":1,\"web/assets-future-v1/storage-Ufl800Ne-BglSpeAE.js\":1,\"web/assets-future-v1/store-BlXVHZKu.js\":1,\"web/assets-future-v1/stripe.esm-DeCnSmRn.js\":2,\"web/assets-future-v1/styles-BRWlD4eG-iJY95DM4.js\":191,\"web/assets-future-v1/styles-BsotlekN-FqRRXKJE.js\":9,\"web/assets-future-v1/styles-DVyDvTdj-CxcgKlnC.js\":74,\"web/assets-future-v1/styles-SlRcHdFL-hkWeYOGu.js\":92,\"web/assets-future-v1/telegram-B-JqnkqZ-1MuQuslm.js\":1,\"web/assets-future-v1/tempoModerato-Bl7un_UG.js\":1,\"web/assets-future-v1/to-ui-error-n8KhkP0u-ByI9v8zV.js\":4,\"web/assets-future-v1/toViemAccount-CxoAwoGG-DdyNKBkc.js\":2,\"web/assets-future-v1/transaction-CLaic3AD-B5RiCLId.js\":1,\"web/assets-future-v1/transfer-6YztDh-t-BVQkTvG-.js\":1,\"web/assets-future-v1/triangle-alert-BpmH-1xT.js\":1,\"web/assets-future-v1/twitch-5IOe4sIQ-HPXy1gIL.js\":1,\"web/assets-future-v1/use-headless-crypto-deposit-DXuA2PzO-CUueyR-6.js\":1,\"web/assets-future-v1/use-sign-with-user-signer-aF_Sckfb-pmb6nKye.js\":1,\"web/assets-future-v1/use-text-value-AaRkZLvG.js\":1,\"web/assets-future-v1/use-unlink-wallet-DlfnbLSB-DCYmm3lg.js\":1,\"web/assets-future-v1/useActiveWallet-B5NoYzzn-BjyojJ0o.js\":123,\"web/assets-future-v1/useAsyncValue-sCQ_EAT9-Bu99E0Gl.js\":1,\"web/assets-future-v1/useGetSolPrice-x7gfUIHJ-Dc3JCTkb.js\":1,\"web/assets-future-v1/useGetTokenPrice-D8Cb3tFH-BhMWadxD.js\":1,\"web/assets-future-v1/useI18n-BIWeTVK5-DwMROAvg.js\":1,\"web/assets-future-v1/useWalletBalance-CZnP5f_f-soyczUlz.js\":1,\"web/assets-future-v1/useWallets-Cy8VgsCY-DGh3BGP9.js\":2,\"web/assets-future-v1/utils-BXiNjgTj.js\":1,\"web/assets-future-v1/utils-DdckVfQr.js\":1,\"web/assets-future-v1/utils-oVEYY1QK.js\":1,\"web/assets-future-v1/w3m-modal-DH7DRXUG.js\":1174,\"web/assets-future-v1/waitForCallsStatus-DtgDh1wq.js\":1,\"web/assets-future-v1/wallet-ADUDuYRA.js\":1,\"web/assets-future-v1/wallet-connect-DasLtN-l-B45FDjMQ.js\":1,\"web/assets-future-v1/walletconnect-registry-xxG8XLCb-ClGB_THV.js\":1,\"web/assets-future-v1/walletconnect-v2-miav_NoG-DyACuoy2.js\":12,\"web/assets-future-v1/writeContract-69NWgzsH.js\":1,\"web/assets-future-v1/wui-ux-by-reown-DeKMwgIw.js\":1147,\"web/assets-future-v1/x-BjLgYP_C.js\":1,\"web/boot.mjs\":16,\"web/config-schema.mjs\":33,\"web/contract-verification.mjs\":9,\"web/deployment.mjs\":4,\"web/favicon.svg\":1,\"web/game-abi.mjs\":1580,\"web/game-rules.mjs\":42,\"web/index.html\":40,\"web/purchase.mjs\":26,\"web/site-config.json\":3,\"web/social-card.png\":300},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1543,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/IMDPot.sol:230: Reentrancy in IMDPot._buyTickets(uint256) (src/IMDPot.sol#230-267):\n[high/medium] reentrancy-balance at src/IMDPot.sol:519: Reentrancy in IMDPot._transferExact(address,address,uint256) (src/IMDPot.sol#519-527):\n[high/medium] reentrancy-balance at src/IMDPot.sol:519: Reentrancy in IMDPot._transferExact(address,address,uint256) (src/IMDPot.sol#519-527):\n[medium/high] incorrect-equality at src/IMDPot.sol:419: IMDPot._syncPoints(address) (src/IMDPot.sol#419-434) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IMDPot.sol:419: IMDPot._syncPoints(address) (src/IMDPot.sol#419-434) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IMDPot.sol:459: IMDPot.getPlayer(address) (src/IMDPot.sol#459-477) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IMDPot.sol:459: IMDPot.getPlayer(address) (src/IMDPot.sol#459-477) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IMDPot.sol:452: IMDPot._restorableBoost(address) (src/IMDPot.sol#452-457) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/IMDPot.sol:377: Reentrancy in IMDPot._flushFees() (src/IMDPot.sol#377-398):\n[medium/medium] reentrancy-no-eth at src/IMDPot.sol:377: Reentrancy in IMDPot._flushFees() (src/IMDPot.sol#377-398):\n[medium/medium] uninitialized-local at src/IMDPot.sol:295: IMDPot._settle(uint256,IMDPot.Round).weights (src/IMDPot.sol#295) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IMDPot.sol:294: IMDPot._settle(uint256,IMDPot.Round).indexes (src/IMDPot.sol#294) is a local variable never initialized\n[low/medium] reentrancy-benign at src/IMDPot.sol:377: Reentrancy in IMDPot._flushFees() (src/IMDPot.sol#377-398):\n[low/medium] timestamp at src/IMDPot.sol:495: IMDPot.timeRemaining() (src/IMDPot.sol#495-500) uses timestamp for comparisons\n[low/medium] timestamp at src/IMDPot.sol:335: IMDPot.cancelRound() (src/IMDPot.sol#335-348) uses timestamp for comparisons\n[low/medium] timestamp at src/IMDPot.sol:270: IMDPot.finalizeRound() (src/IMDPot.sol#270-290) uses timestamp for comparisons\n[low/medium] timestamp at src/IMDPot.sol:230: IMDPot._buyTickets(uint256) (src/IMDPot.sol#230-267) uses timestamp for comparisons","passed":true},{"durationMs":433,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/IMDPot.sol:209: Reentrancy: State change after external call\n[low] centralization-risk at src/IMDPot.sol:175: Centralization Risk (6 places)\n[low] costly-loop at src/IMDPot.sol:296: Costly operations inside loop (5 places)\n[low] large-numeric-literal at src/IMDPot.sol:22: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/IMDPot.sol:294: Literal Instead of Constant (2 places)\n[low] non-reentrant-not-first at src/IMDPot.sol:175: `nonReentrant` is Not the First Modifier (5 places)\n[low] require-revert-in-loop at src/IMDPot.sol:296: Loop Contains `require`/`revert` (2 places)\n[low] state-variable-could-be-immutable at src/IMDPot.sol:74: State Variable Could Be Immutable\n[low] uninitialized-local-variable at src/IMDPot.sol:307: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/IMDPot.sol:522: Unsafe ERC20 Operation","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a6e36d3ab22d909a09b00671c8d0f30b9c3162c429addcc26e0e2313398d5e04","verifiedTreeHash":"be7bb0a2636af06eb72c65d9b9454f9745982e26","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":8631,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.45s\nCompiler run successful!\n","passed":true},{"durationMs":88532,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/WeightedTree.t.sol:WeightedTreeTest\n[PASS] testFuzz_dynamicGrowthAndUpdatesMatchLinearOracle(uint256,uint8) (runs: 256, μ: 3973082, ~: 1960368)\nLogs:\n  Bound result 64\n\n[PASS] test_zeroWeightNodesAndInvalidActions() (gas: 433600)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 526.03ms (527.57ms CPU time)\n\nRan 7 tests for test/IMDPot.boundaries.t.sol:IMDPotBoundariesTest\n[PASS] testFuzz_allOwnerMethodsRejectAnUnprivilegedCaller(address,uint8) (runs: 1000, μ: 81384, ~: 81439)\n[PASS] testFuzz_deadlinePurchaseAndCommitAreComplementary(uint32,bool) (runs: 1000, μ: 904878, ~: 988874)\nLogs:\n  Bound result 1\n\n[PASS] test_cancelledReviewedRoundCannotEnterFreshRoundOrChangePause() (gas: 1346432)\n[PASS] test_failedFirstPurchaseDoesNotConsumeQueuedBoostOrCreditPriorRoundTwice() (gas: 10416365)\n[PASS] test_maximumPurchaseIsPerCallAndMaxUintCannotMutateAnActiveRound() (gas: 890003)\n[PASS] test_refundsCanBeClaimedOutOfOrderWhilePrizesAndNewRoundStayIndependent() (gas: 3055434)\n[PASS] test_replacedOwnershipNomineeCannotAcceptAndFeesStillPayOriginalOwner() (gas: 1279845)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 560.23ms (668.60ms CPU time)\n\nRan 3 tests for test/IMDPot.selection.t.sol:IMDPotSelectionTest\n[PASS] testFuzz_boostedSelectionMatchesIndependentLinearIntervals(uint32[6],uint8[6],uint8,bytes32) (runs: 1000, μ: 2167415, ~: 1986709)\nLogs:\n  Bound result 3\n  Bound result 100\n  Bound result 4021\n  Bound result 42\n\n[PASS] testFuzz_splittingAPurchasePreservesBoostWeightPriceAndTimer(uint32,uint32,uint8) (runs: 1000, μ: 1238256, ~: 1225644)\nLogs:\n  Bound result 1800\n  Bound result 15\n\n[PASS] test_drawResultDoesNotDependOnFinalizerTimestampOrPrevrandao() (gas: 1421213)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 573.70ms (992.96ms CPU time)\n\nRan 8 tests for test/IMDPot.token-failures.t.sol:IMDPotTokenFailuresTest\n[PASS] testFuzz_deferredMalformedFeesAccumulateAndCanBeRetriedWhilePaused(uint8) (runs: 1000, μ: 2646436, ~: 2646472)\n[PASS] testFuzz_malformedClaimPreservesTheEntireCredit(uint8) (runs: 1000, μ: 1359063, ~: 1359069)\n[PASS] testFuzz_malformedEntryRevertsEveryEffect(uint8,uint32,bool) (runs: 1000, μ: 1158039, ~: 1204598)\nLogs:\n  Bound result 540531\n\n[PASS] testFuzz_ownerTokenCallbackCannotReenterAnyStateChangingEntrypoint(uint8) (runs: 1000, μ: 1470455, ~: 1488201)\n[PASS] testFuzz_taxOrSenderSurchargeCannotConsumeAClaimOrRefund(uint16,bool,bool) (runs: 1000, μ: 1235927, ~: 1426295)\nLogs:\n  Bound result 279\n\n[PASS] test_feeGasGriefIsIsolatedFromOtherFeesAndWinnerWithdrawals() (gas: 2756983)\n[PASS] test_foreignRescueValidatesDestinationAndRollsBackMalformedTransfer() (gas: 1318659)\n[PASS] test_trueReturnWithoutMovingValueCannotMintTicketsOrErasePrizeCredits() (gas: 1633560)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 573.96ms (2.76s CPU time)\n\nRan 39 tests for test/IMDPot.t.sol:IMDPotTest\n[PASS] testFuzz_conservationAcrossSettlementsRefundsAndClaims(uint32,uint32,uint32,bytes32) (runs: 256, μ: 2813992, ~: 2846916)\nLogs:\n  Bound result 2\n  Bound result 425\n  Bound result 247\n\n[PASS] testFuzz_priceIsOneTenthForSupportedDecimals(uint8) (runs: 256, μ: 834210, ~: 834009)\nLogs:\n  Bound result 2\n\n[PASS] test_boostCapsAtTwoXAndIsFrozenForEntireRound() (gas: 11244244)\n[PASS] test_boostedSingleTicketStillCannotWinTwice() (gas: 10839771)\n[PASS] test_cancelRestoresBoostWithoutAwardingPointsOrRequiringRefundFirst() (gas: 10507692)\n[PASS] test_claimFailurePreservesCreditAndDoesNotBlockAnotherWinner() (gas: 1828132)\n[PASS] test_contractWalletCanPlayAndCannotReenterClaim() (gas: 1830887)\n[PASS] test_contractWalletCannotReenterRefund() (gas: 1470649)\n[PASS] test_drawCommitsExactlyThreeBlocksAndCannotReroll() (gas: 1199410)\n[PASS] test_entryAtDeadlineAndWhileDrawingRejects() (gas: 813564)\n[PASS] test_entryReentrancyFailsAndOuterEntryRemainsCorrect() (gas: 577281)\n[PASS] test_entryRejectsZeroTooManyAndInsufficientApprovalOrBalance() (gas: 861882)\n[PASS] test_expiredDrawCannotSettleOrBeRecommitted() (gas: 773755)\n[PASS] test_factoryUsesExplicitLaunchOwnerWithoutExternalConstructorCalls() (gas: 331669)\n[PASS] test_failedFeeTransferDoesNotBlockSettlementAndRetryPaysExactlyOnce() (gas: 1600803)\n[PASS] test_falseReturnAfterMovingTokensRollsBackFeeSubcall() (gas: 1352578)\n[PASS] test_feeReentrancyAndUnauthorizedSelfCallCannotDrain() (gas: 1202506)\n[PASS] test_finalizeBeforeEntryOrBeforeEndRejects() (gas: 436644)\n[PASS] test_lastBlockhashBoundarySettlesAndCannotCancel() (gas: 992649)\n[PASS] test_loyaltyThresholdsInsufficientRoundsAndPoints() (gas: 9382946)\n[PASS] test_noReturnERC20Supported() (gas: 1155966)\n[PASS] test_oddBaseUnitRoundingAssignedToFirstPrize() (gas: 1915296)\n[PASS] test_oneTicketReceivesAllSeventyPercentAndNoEmptyPrizes() (gas: 1016419)\n[PASS] test_onlyOwnerCanConfigureAndOnlyOnce() (gas: 1762051)\n[PASS] test_ownerCannotCancelAnUnpausedRoundEvenAfterOneDay() (gas: 449750)\n[PASS] test_ownerCannotRescueGameTokenIncludingLockedShareOrDonations() (gas: 2011957)\n[PASS] test_pauseBlocksEntriesAndCommitButCommittedDrawSettlesAndClaimsWork() (gas: 1198815)\n[PASS] test_pausedActiveRoundCancelsOnlyAfterOneDayAndRefundsInFull() (gas: 1086549)\n[PASS] test_pointsCreditOncePerSettledTicketAndRound() (gas: 2157982)\n[PASS] test_redemptionDuringRoundAppliesOnlyToNextRound() (gas: 10681907)\n[PASS] test_refundFailurePreservesTicketAndRefundObligation() (gas: 859189)\n[PASS] test_repeatedPurchasesDoNotDuplicateParticipants() (gas: 799552)\n[PASS] test_reviewedPurchaseCannotEnterAnotherRound() (gas: 1399838)\n[PASS] test_settlementConservesSharesAndPullClaims() (gas: 1868212)\n[PASS] test_taxedEntryAndFalseReturnRejectWithoutRecordingTickets() (gas: 862124)\n[PASS] test_taxedPayoutCannotSilentlyUnderpay() (gas: 1258135)\n[PASS] test_timerStartsOnFirstTicketAndDoesNotExtend() (gas: 780021)\n[PASS] test_twoStepOwnershipAndFixedTreasury() (gas: 392651)\n[PASS] test_twoTicketsCanGiveSameWalletTwoPrizesAndRollThirdIntoFirst() (gas: 1041633)\nSuite result: ok. 39 passed; 0 failed; 0 skipped; finished in 572.71ms (739.88ms CPU time)\n\nRan 1 test for test/IMDPot.invariant.t.sol:IMDPotInvariantTest\n[PASS]\nIMDPotInvariantTest invariants:\n[PASS] invariant_balanceCoversExactlyEveryObligation\n[PASS] invariant_refundsAndLockedSharesMatchHistoricalRounds\n IMDPotInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭------------+-------------+-------+---------+----------╮\n| Contract   | Selector    | Calls | Reverts | Discards |\n+=======================================================+\n| PotHandler | buy         | 604   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | claim       | 590   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | redeem      | 662   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | refund      | 566   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | resolve     | 551   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | sync        | 537   | 0       | 0        |\n|------------+-------------+-------+---------+----------|\n| PotHandler | togglePause | 586   | 0       | 0        |\n╰------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 15\n  Bound result 34\n  Bound result 100\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 28\n  Bound result 39\n  Bound result 5\n  Bound result 42\n  Bound result 2\n  Bound result 26\n  Bound result 100\n  Bound result 99\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.30s (2.29s CPU time)\n\nRan 2 tests for test/IMDPot.model.invariant.t.sol:IMDPotLedgerInvariantTest\n[PASS]\nIMDPotLedgerInvariantTest invariants:\n[PASS] invariant_independentCustodyLedger\n[PASS] invariant_playersAndActiveStateMatchModel\n[PASS] invariant_terminalRoundsStayImmutable\n IMDPotLedgerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+---------------+-------+---------+----------╮\n| Contract         | Selector      | Calls | Reverts | Discards |\n+===============================================================+\n| PotLedgerHandler | buy           | 2770  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | claim         | 2718  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | donate        | 2786  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | failedPayment | 2713  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | feePolicy     | 2643  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | flush         | 2716  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | redeem        | 2635  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | refund        | 2767  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | resolve       | 2754  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | sync          | 2734  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | tick          | 2759  | 0       | 0        |\n|------------------+---------------+-------+---------+----------|\n| PotLedgerHandler | togglePause   | 2773  | 0       | 0        |\n╰------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 1\n  Bound result 104907\n  Bound result 18\n  Bound result 1500\n  Bound result 20\n  Bound result 108575\n  Bound result 7\n  Bound result 7\n  Bound result 6849\n  Bound result 11\n  Bound result 4000\n  Bound result 1\n  Bound result 3\n  Bound result 22102\n  Bound result 2\n  Bound result 3\n  Bound result 4581\n  Bound result 260\n  Bound result 4\n  Bound result 11\n  Bound result 99060\n  Bound result 12\n  Bound result 18913\n  Bound result 20867\n  Bound result 17\n  Bound result 10\n  Bound result 11\n  Bound result 13202\n  Bound result 101482\n  Bound result 6323\n  Bound result 300\n  Bound result 1114\n  Bound result 11\n  Bound result 91\n  Bound result 165\n  Bound result 1017\n  Bound result 15\n  Bound result 86400\n  Bound result 52\n  Bound result 8039\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 13\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 13\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 13\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 13\n\n[PASS] test_modelExercisesBoostRestorationDeferredFeesAndDelayedRefunds() (gas: 11528311)\nLogs:\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 100\n  Bound result 3\n  Bound result 1\n  Bound result 11\n  Bound result 1\n  Bound result 17\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 7\n  Bound result 8\n  Bound result 9\n  Bound result 10\n  Bound result 11\n  Bound result 12\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 88.36s (88.36s CPU time)\n\nRan 7 test suites in 88.37s (93.47s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":194,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDPot.acceptOwnership()\",\"IMDPot.buyTickets(uint256)\",\"IMDPot.buyTicketsForRound(uint256,uint256)\",\"IMDPot.cancelRound()\",\"IMDPot.claim()\",\"IMDPot.finalizeRound()\",\"IMDPot.flushPendingFees()\",\"IMDPot.pause()\",\"IMDPot.redeemMultiplier()\",\"IMDPot.refund(uint256)\",\"IMDPot.rescueForeignToken(address,address)\",\"IMDPot.setToken(address)\",\"IMDPot.syncPoints(address)\",\"IMDPot.transferFee(address,uint256)\",\"IMDPot.transferOwnership(address)\",\"IMDPot.unpause()\"],\"files\":{\".gitignore\":6,\"README.md\":133,\"docs/SECURITY.md\":58,\"docs/site-capture.json\":319,\"foundry.toml\":18,\"remappings.txt\":1,\"src/IMDPot.sol\":528,\"src/libraries/WeightedTree.sol\":63,\"test/ADVERSARIAL_TESTS.md\":59,\"test/IMDPot.boundaries.t.sol\":262,\"test/IMDPot.invariant.t.sol\":148,\"test/IMDPot.model.invariant.t.sol\":624,\"test/IMDPot.selection.t.sol\":203,\"test/IMDPot.t.sol\":802,\"test/IMDPot.token-failures.t.sol\":389,\"test/MockToken.sol\":71,\"test/WeightedTree.t.sol\":92,\"test/site.integration.mjs\":136,\"test/test_release.py\":67,\"test/web.test.mjs\":153,\"tools/build_site.py\":110,\"tools/sync_abi.py\":18,\"web/assets-future-v1/AccountNotFoundScreen-DmCu584z-BCSQbn_H.js\":1,\"web/assets-future-v1/AddFundsSelectionScreen-CvdQ9APw-Cw9tbqpj.js\":7,\"web/assets-future-v1/Address-D-hKSBMc-BEHFET5A.js\":17,\"web/assets-future-v1/AffirmativeConsentScreen-Cm3ilbFM-Z0mIroYr.js\":6,\"web/assets-future-v1/AllowlistRejectionScreen-94CrH44E-Cl2FR9wd.js\":1,\"web/assets-future-v1/ApiController-BPNSsbA_.js\":5,\"web/assets-future-v1/ArrowsRightLeftIcon-B-VpvMMr.js\":1,\"web/assets-future-v1/AuthenticateWithWalletScreen-DOlqqtwf-DhRHb5Ow.js\":1,\"web/assets-future-v1/AwaitingEvmToSolBridgingScreen-BAwgpv6z-Bz46Au8f.js\":1,\"web/assets-future-v1/AwaitingExternalEthereumTransferScreen-CrmoLkyM-B_J6BkJf.js\":1,\"web/assets-future-v1/AwaitingPasswordlessCodeScreen-PG8R_qZ7-Dc8cYtMB.js\":103,\"web/assets-future-v1/AwaitingSolToEvmBridgingScreen-CfxbsY2V-DSEHmrXb.js\":1,\"web/assets-future-v1/BridgeNetworkSelectionView-CyWjJLLL-yzzqv0fN.js\":68,\"web/assets-future-v1/CaptchaScreen-Di6DawY1-DP8zS0O2.js\":1,\"web/assets-future-v1/CheckCircleIcon-C5-JLm-a.js\":1,\"web/assets-future-v1/CheckCircleIcon-L7pHUk8b.js\":1,\"web/assets-future-v1/Checkbox-D1EDeo41-CBza6Itl.js\":52,\"web/assets-future-v1/ChevronDownIcon-Cix9gOo-.js\":1,\"web/assets-future-v1/Chip-CZKIKt9K-B5giFS9U.js\":26,\"web/assets-future-v1/CoinbaseOnrampStatusScreen-CQ5wJdhR-CHKXE9Zg.js\":16,\"web/assets-future-v1/ConnectEmailForm-VvzLeAu_-DeLfSKaI.js\":3,\"web/assets-future-v1/ConnectLedgerScreen-PcSk3bj3-CJP5ouV6.js\":10,\"web/assets-future-v1/ConnectOnlyLandingScreen-CzsS1KUE-D5Jjd8mA.js\":1,\"web/assets-future-v1/ConnectOnlyStatusScreen-DAnXdxMc-QrdGKZfF.js\":1,\"web/assets-future-v1/ConnectOrCreateScreen-B13RFu4y-qpxGvC-g.js\":1,\"web/assets-future-v1/ConnectPhoneForm-CgvF9lfY-Bjq8zAeP.js\":95,\"web/assets-future-v1/ConnectWalletView-CVcmCUWx-DcVjm0-R.js\":74,\"web/assets-future-v1/ConnectionStatusScreen-CkZB3A-v-BwQJgTpC.js\":7,\"web/assets-future-v1/ConnectorUtil-9-QqcAdN.js\":21,\"web/assets-future-v1/ConstantsUtil-DmLsRHAl.js\":198,\"web/assets-future-v1/CopyToClipboard-i_OQSBJr-D_GDYkRo.js\":39,\"web/assets-future-v1/CopyableText-CQapvaMr-D2qfp0B5.js\":28,\"web/assets-future-v1/CrossAppAuthScreen-55ctQxf7-CuN9ly_E.js\":1,\"web/assets-future-v1/CustomLandingScreenView-DCKHF9M9-dIVgxpQv.js\":22,\"web/assets-future-v1/DelegatedActionsConsentScreen-B-NoZ7KR-C94P_M8G.js\":1,\"web/assets-future-v1/DelegatedActionsRevokeScreen-HnrbzfZN-CmRrY8e8.js\":1,\"web/assets-future-v1/DepositAddressAddressStepView-BBRl-QpO-DZMf5-lM.js\":187,\"web/assets-future-v1/DepositAddressScreen-BB3v4rHj-BPe6KJ8S.js\":8,\"web/assets-future-v1/DepositAddressV3Screen-DvnJDngM-D04YsV25.js\":1,\"web/assets-future-v1/EmailInputForm-Cqo1mda8-D3fhsbzl.js\":124,\"web/assets-future-v1/EmbeddedWalletConnectingScreen-DVkAbpWM-CRMyVUgO.js\":1,\"web/assets-future-v1/EmbeddedWalletCreatedScreen-Dh97ZcWk-CS1KQENE.js\":1,\"web/assets-future-v1/EmbeddedWalletKeyExportScreen-Dfd_ipkl-DA55wlws.js\":23,\"web/assets-future-v1/EmbeddedWalletOnAccountCreateScreen-JY3xQL2B-B0He8Sfj.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateScreen-CiseufAK-C03IA1x1.js\":1,\"web/assets-future-v1/EmbeddedWalletPasswordUpdateSplashScreen-CaQbsSTp-BCWKi3PM.js\":1,\"web/assets-future-v1/EnrollTotp-CTpF3OWX-BKgTMBK5.js\":66,\"web/assets-future-v1/EnvelopeIcon-DMvqes7d.js\":1,\"web/assets-future-v1/ErrorBanner-BcpGRt0h-Bfj743IN.js\":21,\"web/assets-future-v1/ErrorMessage-D8VaAP5m-CS06WdNK.js\":8,\"web/assets-future-v1/ErrorScreen-f2o266cj-BQKHBU3d.js\":4,\"web/assets-future-v1/ExclamationCircleIcon-BfN0y50L.js\":1,\"web/assets-future-v1/ExclamationTriangleIcon-JkGdtDha.js\":1,\"web/assets-future-v1/FarcasterConnectStatusScreen-2-_iV769-BmPFtxjg.js\":75,\"web/assets-future-v1/FarcasterSignerStatusScreen-YTSx8zuE-Dk-G_7O0.js\":28,\"web/assets-future-v1/FiatOnrampScreen-Cn4FmpB5-Ce2LeFWV.js\":578,\"web/assets-future-v1/FingerPrintIcon-DDtL5c0C.js\":1,\"web/assets-future-v1/FundSolWalletWithExternalSolanaWallet-dK67dE7B-DSR7bBXI.js\":1,\"web/assets-future-v1/FundWalletMethodHeader-CZzBi5cW-DP5Svv96.js\":1,\"web/assets-future-v1/FundWithBankDepositScreen-BKg4LaM0-DtkB4hUD.js\":58,\"web/assets-future-v1/FundingEditAmountScreen-gVCDz2hc-CrI8YJuv.js\":1,\"web/assets-future-v1/FundingMethodSelectionScreen-Dwg5HAn9-gpV-rB8t.js\":1,\"web/assets-future-v1/GlobeAltIcon-CnkwyQwD.js\":1,\"web/assets-future-v1/GooglePay-B53WnudL-BC9WrAhV.js\":1,\"web/assets-future-v1/HCaptchaWrapper-CUi9LJsp-8QsMGzaG.js\":4,\"web/assets-future-v1/InAppBrowserLoginNotPossible-D4EeEdze-CsByAdfj.js\":1,\"web/assets-future-v1/InfoBanner-Cb3p1z12-DWrD6YP1.js\":22,\"web/assets-future-v1/InjectedWalletIcon-DLcYOGDj-CpngehNK.js\":1,\"web/assets-future-v1/InstallWalletScreen-B1yxNHgg-UrKFUBcT.js\":1,\"web/assets-future-v1/JsonTree-BHzNC-ic-BD2CORNN.js\":34,\"web/assets-future-v1/LabelXs-oqZNqbm_-DLlwZvt7.js\":6,\"web/assets-future-v1/LandingScreen-zRwMN0po-dGRSsZND.js\":1,\"web/assets-future-v1/Layouts-BMRfo5hw-BXZv4R83.js\":77,\"web/assets-future-v1/Link-BdDilT2T-CO0WtnUV.js\":40,\"web/assets-future-v1/LinkConflictScreen-YklPsTUx-Bc1DufFz.js\":77,\"web/assets-future-v1/LinkEmailScreen-Bqb5fKMB-Dy7oNbdZ.js\":1,\"web/assets-future-v1/LinkPasskeyScreen-DCzXkdBR-D20BqIic.js\":117,\"web/assets-future-v1/LinkPhoneScreen-WC5uerRR-CDHXLRw1.js\":1,\"web/assets-future-v1/Loader-UAZqxsnw-BjnvLK0W.js\":62,\"web/assets-future-v1/LoadingSkeleton-BMsgO5PV-sKfjGViu.js\":17,\"web/assets-future-v1/LockClosedIcon-tMHvyrzR.js\":1,\"web/assets-future-v1/LoginFailedScreen-DtjHCXGc-CcMTlOwV.js\":1,\"web/assets-future-v1/ManualTransferScreen-CXxMG6Ri-xNGhrs7E.js\":1,\"web/assets-future-v1/MfaAuthEnrollmentFlowScreen-D5JeOLgJ-CoeKTb-o.js\":1,\"web/assets-future-v1/MfaAuthVerifyFlowScreen--aCJotEK-UMgUWUIA.js\":1,\"web/assets-future-v1/MfaEnrollmentFlowScreen-DaOfZDQL-ByTQ5-Hp.js\":1,\"web/assets-future-v1/MfaVerifyFlowScreen-8VhJP8xn-DLz-woKv.js\":1,\"web/assets-future-v1/ModalFooter-CmGY3GN5-D-y9DoW2.js\":403,\"web/assets-future-v1/MoonpayStatusScreen-B-JeyK9J-BnW4KduS.js\":16,\"web/assets-future-v1/OAuthStatusScreen-zos_nuFY-BQUDzPth.js\":1,\"web/assets-future-v1/OpenLink-CUpJ1mOr-CcpZRXEy.js\":39,\"web/assets-future-v1/PasskeySelectSignupOrLogin-CQaGUKP3-CtpFNSST.js\":1,\"web/assets-future-v1/PasskeyStatusScreen-CgVPBiep-ZT7U88v8.js\":6,\"web/assets-future-v1/PasswordRecoveryScreen-D45ttCfH-DD3WwGl-.js\":20,\"web/assets-future-v1/PhArrowCircleDown-D97G-BOA.js\":14,\"web/assets-future-v1/PhArrowClockwise-DVgyFuez.js\":14,\"web/assets-future-v1/PhArrowDown-87b1BizM.js\":14,\"web/assets-future-v1/PhArrowLeft-Da0MfnbK.js\":14,\"web/assets-future-v1/PhArrowRight-AdrIL4DW.js\":14,\"web/assets-future-v1/PhArrowSquareOut-Bk2CMG3I.js\":14,\"web/assets-future-v1/PhArrowUp-4sgyKPGx.js\":14,\"web/assets-future-v1/PhArrowUpRight-BNghD2zq.js\":14,\"web/assets-future-v1/PhArrowsClockwise-BXRn1GEl.js\":14,\"web/assets-future-v1/PhArrowsDownUp-DM09Jo_3.js\":14,\"web/assets-future-v1/PhArrowsLeftRight-MuKBLUoF.js\":14,\"web/assets-future-v1/PhBank-fHbgCqqZ.js\":14,\"web/assets-future-v1/PhBrowser-2-9m-AkM.js\":14,\"web/assets-future-v1/PhCaretDown-BDNabFuL.js\":14,\"web/assets-future-v1/PhCaretLeft-CI460R-A.js\":14,\"web/assets-future-v1/PhCaretRight-D7ZS3Ls8.js\":14,\"web/assets-future-v1/PhCaretUp-C-iIfyvO.js\":14,\"web/assets-future-v1/PhCheck-DxQXn57r.js\":14,\"web/assets-future-v1/PhCircleHalf-MJZeRBGF.js\":14,\"web/assets-future-v1/PhClock-x3MS3Mwi.js\":14,\"web/assets-future-v1/PhCompass-hYn3HhGN.js\":14,\"web/assets-future-v1/PhCopy-CWNYcABI.js\":14,\"web/assets-future-v1/PhCreditCard-Fy4pzwtt.js\":14,\"web/assets-future-v1/PhCurrencyDollar-BgiaenCi.js\":14,\"web/assets-future-v1/PhDesktop-CxrzCSv5.js\":14,\"web/assets-future-v1/PhDeviceMobile-CsyA5Goi.js\":14,\"web/assets-future-v1/PhDotsThree-D-k1BiYg.js\":14,\"web/assets-future-v1/PhEnvelope-D8kzeNox.js\":14,\"web/assets-future-v1/PhFunnelSimple-CfQs5DAW.js\":14,\"web/assets-future-v1/PhGlobe-DvmSc9_A.js\":14,\"web/assets-future-v1/PhIdentificationCard-CfkZm-5K.js\":14,\"web/assets-future-v1/PhImage-Cf0J2ZfJ.js\":14,\"web/assets-future-v1/PhInfo-Bwi51-2X.js\":14,\"web/assets-future-v1/PhLightbulb-C4FZV7Es.js\":14,\"web/assets-future-v1/PhMagnifyingGlass-C9u8jSCJ.js\":14,\"web/assets-future-v1/PhPaperPlaneRight-zxQVvPLX.js\":14,\"web/assets-future-v1/PhPlus-C4UoW-2n.js\":14,\"web/assets-future-v1/PhPower-CFyWDmgD.js\":14,\"web/assets-future-v1/PhPuzzlePiece-BjoNVfST.js\":14,\"web/assets-future-v1/PhQrCode-CP3tFauY.js\":14,\"web/assets-future-v1/PhQuestion-wOWJBd3G.js\":14,\"web/assets-future-v1/PhQuestionMark-CV0k9C0Y.js\":14,\"web/assets-future-v1/PhSealCheck-vIKzREuN.js\":14,\"web/assets-future-v1/PhSignOut-CxELV-i0.js\":14,\"web/assets-future-v1/PhSpinner-CGDmbzUd.js\":14,\"web/assets-future-v1/PhTrash-C9PD0SAt.js\":14,\"web/assets-future-v1/PhUser-0sWNXQeZ.js\":14,\"web/assets-future-v1/PhVault-6JTskUcC.js\":14,\"web/assets-future-v1/PhWarning-CoKs3gz6.js\":14,\"web/assets-future-v1/PhWarningCircle-BXHw1fCt.js\":14,\"web/assets-future-v1/PhX-DX0SFIqC.js\":14,\"web/assets-future-v1/PhoneIcon-DD2_wj_e.js\":1,\"web/assets-future-v1/PinInput-DbZ0b1i1-DmA5bgal.js\":247,\"web/assets-future-v1/PrivyPluginContext-DA-yS5vO-DLogqAK_.js\":1,\"web/assets-future-v1/PrivySession-CJcUIFVa.js\":1,\"web/assets-future-v1/QrCode-HPSrpHat-CtMKDCor.js\":22,\"web/assets-future-v1/RecoveryOAuthStatusScreen-Cyp2Aysv-y6c69pK1.js\":1,\"web/assets-future-v1/RecoveryPasswordCreateScreen-u_ReAEBk-DlTWAL0n.js\":1,\"web/assets-future-v1/RecoverySelectionScreen-cIVUHy8G-cegENsi5.js\":7,\"web/assets-future-v1/SIWXUtil-B-Qbig7-.js\":1,\"web/assets-future-v1/Screen-DZNhZC2N-qpvtz8l2.js\":175,\"web/assets-future-v1/ScreenHeader-CHmc4-Lu-DKEjpUJn.js\":31,\"web/assets-future-v1/ScreenLayout-nGD4p5K0-CHY5CldX.js\":1,\"web/assets-future-v1/SelectSourceAsset-BsJpnIhX-DHKD1UVZ.js\":140,\"web/assets-future-v1/SetAutomaticRecoveryScreen-qsezmY6k-BahST7k6.js\":14,\"web/assets-future-v1/SetWalletPasswordForm-4DYPfyfF-C5wv1U2G.js\":11,\"web/assets-future-v1/ShieldCheckIcon-DGN1Pl73.js\":1,\"web/assets-future-v1/SignRequestScreen-Dxq0VV3k-B4u-7Xys.js\":26,\"web/assets-future-v1/SolanaWalletConnector-CtU87Bd6-DciLLQR1.js\":1,\"web/assets-future-v1/StackedContainer-B2vaEl56-DfBALLa1.js\":24,\"web/assets-future-v1/StandardSignAndSendTransactionScreen-Ctm2LJ6Q-Cl3l3JMS.js\":20,\"web/assets-future-v1/Subtitle-CV-2yKE4-G0IX-WCN.js\":13,\"web/assets-future-v1/TelegramAuthScreen-DR6Kx8-e-Db8b48rO.js\":1,\"web/assets-future-v1/Title-BnzYV3Is-CNtNBwmi.js\":7,\"web/assets-future-v1/TodoList-DnyULl18-Bh_qRpf2.js\":36,\"web/assets-future-v1/TransactionDetails-VWpLHxjh-B1jQI2sQ.js\":109,\"web/assets-future-v1/TransactionErrorView-il1lrcrS-DWk9seZr.js\":178,\"web/assets-future-v1/TransferFromWalletScreen-Bmo-zEL9-D7ajbAZ8.js\":31,\"web/assets-future-v1/TransferOrBridgeLoadingScreen-P3MtaLJD-3vdgA61G.js\":6,\"web/assets-future-v1/TurnstileWrapper-2aABXboj-Bgu55Cj3.js\":1,\"web/assets-future-v1/UpdateEmailScreen-06S1peZD-Fqfovftp.js\":1,\"web/assets-future-v1/UpdatePhoneScreen-DaD_xBHP-Cu5pmdXO.js\":1,\"web/assets-future-v1/UserLimitReachedScreen-BZwtgVqf-DYEkJSHo.js\":1,\"web/assets-future-v1/Value-DTgR824E-BaIf7H0V.js\":27,\"web/assets-future-v1/WalletCards-DH1rqayz-DdZXQqEj.js\":1,\"web/assets-future-v1/WalletIcon-CfaltKuw.js\":1,\"web/assets-future-v1/WalletInfoCard-C92pgPpt-BUtsvtpy.js\":29,\"web/assets-future-v1/WalletInterstitialScreen-BCI6eGCA-Bfo0lN_M.js\":1,\"web/assets-future-v1/WalletLink-BK7xQj-S-DPNrvhSf.js\":20,\"web/assets-future-v1/WalletOverflowButton-D56qnL73-CTDCDVg4.js\":1,\"web/assets-future-v1/WarningBanner-ZZqCEtZK-DD_CsJ_I.js\":21,\"web/assets-future-v1/_esm-5FcxR2A7.js\":3,\"web/assets-future-v1/accessKey-DllOtB7X.js\":3,\"web/assets-future-v1/analytics-mkkvFRju-BRBcadka.js\":1,\"web/assets-future-v1/basic-BR1DATDt.js\":1575,\"web/assets-future-v1/call-Bm9w5nme.js\":33,\"web/assets-future-v1/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js\":1,\"web/assets-future-v1/ccip-DBV77i5G.js\":1,\"web/assets-future-v1/check-B8o8ZNpi.js\":1,\"web/assets-future-v1/chevron-down-Bie_7Zqx.js\":1,\"web/assets-future-v1/circle-alert-BuHuWUR1.js\":1,\"web/assets-future-v1/circle-check-big-lAOiCYlt.js\":1,\"web/assets-future-v1/circle-x-CL_U3n9V.js\":1,\"web/assets-future-v1/coinbase-CEeA7Gup-CGYnv7-_.js\":1,\"web/assets-future-v1/copy-HVDRzuYa.js\":1,\"web/assets-future-v1/core-B9N-w82C.js\":12,\"web/assets-future-v1/createLucideIcon-Cp5gDHSp.js\":1,\"web/assets-future-v1/custom-BKvn-pdL.js\":1,\"web/assets-future-v1/dijkstra-BmnL05hg.js\":1,\"web/assets-future-v1/dist-CloxERI8.js\":3,\"web/assets-future-v1/dist-CoS6E-3x.js\":1,\"web/assets-future-v1/dist-Cp6IXeJd.js\":1,\"web/assets-future-v1/dist-CrNxmdZj.js\":1,\"web/assets-future-v1/dist-l991CqgT.js\":16,\"web/assets-future-v1/errors-BQ3N-RVt-CZPAWCgC.js\":1,\"web/assets-future-v1/esm-C3DslVJx.js\":1,\"web/assets-future-v1/esm-CG_aiq74.js\":1,\"web/assets-future-v1/esm-Ci1ogKuK.js\":1,\"web/assets-future-v1/esm-DsxEYfBg.js\":36,\"web/assets-future-v1/esm-n2lWo7kz.js\":1,\"web/assets-future-v1/ethers-zTjbodk5-DKstyThm.js\":1,\"web/assets-future-v1/eventemitter3-CXX68V5S.js\":1,\"web/assets-future-v1/external-link-CKWzC_Pw.js\":1,\"web/assets-future-v1/fallback-Cn-hieGx.js\":1,\"web/assets-future-v1/farcaster-DPlSjvF5-hDHFwtNI.js\":1,\"web/assets-future-v1/features-CcoH24QO.js\":2,\"web/assets-future-v1/fingerprint-pattern-tfkID5VF.js\":1,\"web/assets-future-v1/floating-ui.react-C2iB3jgH.js\":1,\"web/assets-future-v1/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js\":1,\"web/assets-future-v1/get-entropy-details-for-user-BNFL8oGV-DHS_iE9g.js\":1,\"web/assets-future-v1/getAddress-yOC5k4Wk.js\":2,\"web/assets-future-v1/getChainName-DjpPdUSc-DUyKDrnp.js\":1,\"web/assets-future-v1/getErc20Balance-jXNpFf0N-BaftNkPI.js\":1,\"web/assets-future-v1/getErc20TokenInfo-BNTrzLMP-KT3srM5w.js\":1,\"web/assets-future-v1/getFormattedUsdFromLamports-CQLJQZzJ-Gx4_wxON.js\":1,\"web/assets-future-v1/getUsdcMintAddress-C28SljRU-DjI2gJgr.js\":1,\"web/assets-future-v1/guards-B2s3KemH-B_nGQ6iA.js\":1,\"web/assets-future-v1/hooks.module-BYZGfwDl.js\":1,\"web/assets-future-v1/hourglass-D308JFDA.js\":1,\"web/assets-future-v1/id-UqEwL2BI-DBaJPjJB.js\":1,\"web/assets-future-v1/index-AF7PM1lf-vZv48rrT.js\":1,\"web/assets-future-v1/index-BcQq0_SC-CmJW_v-p.js\":12,\"web/assets-future-v1/index-CWARkn2w-DYI2V413.js\":61,\"web/assets-future-v1/index-CqvyXQur-DV07a8Dd.js\":437,\"web/assets-future-v1/index-DdqXwvQ8.css\":1,\"web/assets-future-v1/index-IgEJPNDv.js\":24,\"web/assets-future-v1/index.browser-DlyOLjk4.js\":1,\"web/assets-future-v1/index.es-CXUqFyhV.js\":2,\"web/assets-future-v1/index.es-qazbOS24.js\":3,\"web/assets-future-v1/internal-FVhHi1fy.js\":6,\"web/assets-future-v1/jsx-runtime-CvftCknt.js\":1,\"web/assets-future-v1/landmark-2oih4QJq.js\":1,\"web/assets-future-v1/lib-CB0iRLqZ.js\":1,\"web/assets-future-v1/lock-bHMfAp0N.js\":1,\"web/assets-future-v1/logger-CsXm3oIv-B0UYpNFI.js\":1,\"web/assets-future-v1/mail-fTYx7nzS.js\":1,\"web/assets-future-v1/modal-context-CzyPCE1h-CI6R4GsA.js\":1,\"web/assets-future-v1/ofetch.CWycOUEr-Duby3iHT.js\":1,\"web/assets-future-v1/parseEther-C5Bp3ihU.js\":1,\"web/assets-future-v1/pkce-DOaTOlfX-sqWf_RtP.js\":1,\"web/assets-future-v1/privy-context-Bxv3Wh-5-Cuby72dr.js\":1,\"web/assets-future-v1/property-DuZ9DLP4.js\":3,\"web/assets-future-v1/react-C-d6KpeX.js\":1,\"web/assets-future-v1/react-auth-sHnipzbS.js\":1,\"web/assets-future-v1/react-dom-BZdSsEcb.js\":1,\"web/assets-future-v1/reservoir-x-nGuZkT-DMTb3hrr.js\":1,\"web/assets-future-v1/resolveError-CC6tIaRh.js\":1,\"web/assets-future-v1/rolldown-runtime-DLMaRju-.js\":1,\"web/assets-future-v1/safe-url-D7SRPu33-CkMedGro.js\":1,\"web/assets-future-v1/secp256k1-Csu6Qa0Z.js\":1,\"web/assets-future-v1/secp256k1-DsxXqbXv.js\":1,\"web/assets-future-v1/sendTransaction-B8tTM2wb.js\":1,\"web/assets-future-v1/shared-CFJrjgWW-BBuMbVpb.js\":193,\"web/assets-future-v1/shared-FM0rljBt-D-wAu1V6.js\":21,\"web/assets-future-v1/shouldProceedtoEmbeddedWalletCreationFlow-C1J2jbcH-Bo75Fs0b.js\":1,\"web/assets-future-v1/simulateTransaction-B_Cn6cXf-Z8QgoQCc.js\":1,\"web/assets-future-v1/smartphone-CVPOGXzf.js\":1,\"web/assets-future-v1/storage-Ufl800Ne-BglSpeAE.js\":1,\"web/assets-future-v1/store-BlXVHZKu.js\":1,\"web/assets-future-v1/stripe.esm-DeCnSmRn.js\":2,\"web/assets-future-v1/styles-BRWlD4eG-iJY95DM4.js\":191,\"web/assets-future-v1/styles-BsotlekN-FqRRXKJE.js\":9,\"web/assets-future-v1/styles-DVyDvTdj-CxcgKlnC.js\":74,\"web/assets-future-v1/styles-SlRcHdFL-hkWeYOGu.js\":92,\"web/assets-future-v1/telegram-B-JqnkqZ-1MuQuslm.js\":1,\"web/assets-future-v1/tempoModerato-Bl7un_UG.js\":1,\"web/assets-future-v1/to-ui-error-n8KhkP0u-ByI9v8zV.js\":4,\"web/assets-future-v1/toViemAccount-CxoAwoGG-DdyNKBkc.js\":2,\"web/assets-future-v1/transaction-CLaic3AD-B5RiCLId.js\":1,\"web/assets-future-v1/transfer-6YztDh-t-BVQkTvG-.js\":1,\"web/assets-future-v1/triangle-alert-BpmH-1xT.js\":1,\"web/assets-future-v1/twitch-5IOe4sIQ-HPXy1gIL.js\":1,\"web/assets-future-v1/use-headless-crypto-deposit-DXuA2PzO-CUueyR-6.js\":1,\"web/assets-future-v1/use-sign-with-user-signer-aF_Sckfb-pmb6nKye.js\":1,\"web/assets-future-v1/use-text-value-AaRkZLvG.js\":1,\"web/assets-future-v1/use-unlink-wallet-DlfnbLSB-DCYmm3lg.js\":1,\"web/assets-future-v1/useActiveWallet-B5NoYzzn-BjyojJ0o.js\":123,\"web/assets-future-v1/useAsyncValue-sCQ_EAT9-Bu99E0Gl.js\":1,\"web/assets-future-v1/useGetSolPrice-x7gfUIHJ-Dc3JCTkb.js\":1,\"web/assets-future-v1/useGetTokenPrice-D8Cb3tFH-BhMWadxD.js\":1,\"web/assets-future-v1/useI18n-BIWeTVK5-DwMROAvg.js\":1,\"web/assets-future-v1/useWalletBalance-CZnP5f_f-soyczUlz.js\":1,\"web/assets-future-v1/useWallets-Cy8VgsCY-DGh3BGP9.js\":2,\"web/assets-future-v1/utils-BXiNjgTj.js\":1,\"web/assets-future-v1/utils-DdckVfQr.js\":1,\"web/assets-future-v1/utils-oVEYY1QK.js\":1,\"web/assets-future-v1/w3m-modal-DH7DRXUG.js\":1174,\"web/assets-future-v1/waitForCallsStatus-DtgDh1wq.js\":1,\"web/assets-future-v1/wallet-ADUDuYRA.js\":1,\"web/assets-future-v1/wallet-connect-DasLtN-l-B45FDjMQ.js\":1,\"web/assets-future-v1/walletconnect-registry-xxG8XLCb-ClGB_THV.js\":1,\"web/assets-future-v1/walletconnect-v2-miav_NoG-DyACuoy2.js\":12,\"web/assets-future-v1/writeContract-69NWgzsH.js\":1,\"web/assets-future-v1/wui-ux-by-reown-DeKMwgIw.js\":1147,\"web/assets-future-v1/x-BjLgYP_C.js\":1,\"web/boot.mjs\":16,\"web/config-schema.mjs\":33,\"web/contract-verification.mjs\":9,\"web/deployment.mjs\":4,\"web/favicon.svg\":1,\"web/game-abi.mjs\":1580,\"web/game-rules.mjs\":42,\"web/index.html\":40,\"web/purchase.mjs\":26,\"web/site-config.json\":3,\"web/social-card.png\":300},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e0ebd0c523f188e92b1392ffe9f83fb4c886e31944c471461827deb1a636b7d9","verifiedTreeHash":"cf6f0f1ca4ac55d020b58b98fe372fd7c8a40383","verifierVersion":"0.1.0+745c1db4"}]}