{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"1761697b-d19b-4483-9653-e881ba693417","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests","manifest"],"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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests","manifest"],"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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests","manifest"],"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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests","manifest"],"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":"waiting"},{"acceptedSubmissionHash":"09ec35132865eb30e949f02158184887fba38442466943e5b7c129e52e287286","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","tools":[]},"key":"implement_contract","kind":"code","role":"implement","skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["implement_contract","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":"4d0afafc79d51020643cec499e36e0ad7ddb6ccfe91ccf5c59b16a5cdb86322f","dependsOn":["implement_contract"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Project: SwapADay, a daily-play prize-pot contract. Chain id 11155111. NO launch token, NO pool, NO distributor: application contracts only. The contract holds real user funds, so every rule below is a hard requirement. Do not claim an audit was performed.\n\nGAME. A play costs a buy of IMDO plus a 1 USDC entry. One play per address per UTC day. The whole 1 USDC goes into ONE running pot. Every play gets one verifiable random roll and wins with probability 1 in ODDS (default 2500, an immutable constructor argument, minimum 2). On a win the ENTIRE pot is split 50/50: half to the winner, half to an immutable offsetsRecipient; any odd unit goes to offsetsRecipient; the pot resets to zero. There is no daily payout; the pot only grows until someone wins.\n\nplay(uint256 minTokensOut) external payable nonReentrant:\n1. Revert if the caller already played in the current UTC day (day = block.timestamp / 1 days).\n2. Chainlink VRF v2.5 DIRECT FUNDING, native payment: read the VRF wrapper's calculateRequestPriceNative for the callback gas limit; that fee is taken from msg.value; the remainder is swapEth.\n3. Require swapEth to be worth at least MIN_SWAP_USD (default 5 USD, immutable) using a Chainlink ETH/USD AggregatorV3 feed (immutable address). Reject a stale (older than 1 hour), zero or negative answer. Allow 2% tolerance below the minimum.\n4. Swap swapEth for the game token with the Uniswap v4 PoolManager (unlock/swap/settle/take, native ETH in) through the configured pool key, delivering the tokens straight to msg.sender. Revert if tokens received < minTokensOut. Measure the output by the recipient's balance change, never by a return value alone. The swap is a BUY only.\n5. Pull exactly ENTRY_USDC (1,000,000 units of a 6-decimals USDC, immutable) from msg.sender with transferFrom (the caller approves first) and add it to pot.\n6. Request one random word and store requestId => player. Emit Played(player, requestId, day, swapEth, tokensOut).\n\nfulfillRandomWords(requestId, words): callable ONLY by the VRF wrapper (rawFulfillRandomWords pattern). It must NEVER revert. If words[0] % ODDS == 0: prize = pot / 2; offsets = pot - prize; pot = 0; credit prize to the player and offsets to offsetsRecipient by trying a USDC transfer in a try/catch and, if that transfer fails, recording the amount in claimable[address] so a blacklisted or reverting recipient cannot block the callback. Provide claim() for anyone to withdraw their own claimable balance. Emit Settled(requestId, player, won, prize, offsets). A requestId settles at most once. Out-of-order and concurrent fulfillments must each be evaluated against the pot at that moment.\n\nCONFIG (the ONLY mutable thing): the game token and its v4 pool key (currency0 native ETH, currency1 token, fee, tickSpacing, hooks) may be changed by an owner (a Safe multisig, set in the constructor) through a TIMELOCK: proposeConfig(...) starts a delay of CONFIG_DELAY (default 48 hours, immutable), applyConfig() executes only after the delay, cancelConfig() cancels. Emit events for each. While a proposal is pending, play() keeps using the old config. The owner can do NOTHING else: no pause, no withdraw, no change to the pot, the odds, the entry fee, the minimum, the 50/50 split, offsetsRecipient, USDC, the price feed or the VRF settings, and cannot move user funds or the pot. Say exactly what the owner can call in the README. Immutable constructor arguments: usdc, offsetsRecipient, vrfWrapper, ethUsdFeed, poolManager, odds, minSwapUsd, entryUsdc, configDelay, owner, and the initial token and pool key.\n\nSAFETY. Reentrancy-guard every external entry point; follow checks-effects-interactions; no ERC-777 or fee-on-transfer assumptions for USDC; handle USDC 6 decimals and the ETH/USD feed decimals correctly; use safe-transfer patterns; no unchecked arithmetic on money. The contract must never hold ETH beyond a transaction (refund any excess msg.value after the swap and the VRF fee).\n\nBUILD REPRODUCIBILITY: the repository MUST contain a root foundry.toml setting bytecode_hash = \"none\" under [profile.default]; pin solc, optimizer runs and evm_version. The README must quote foundry.toml verbatim and list every constant and who can call what.\n\nTESTS (Foundry; a different worker writes them). Use mocks for the VRF wrapper, the ETH/USD feed, the PoolManager swap and USDC. Cover: one play per address per UTC day and the rollover at 00:00 UTC; the whole 1 USDC enters the pot; the exact 50/50 split with an odd-unit pot; the pot resets to zero after a win; forced words that do and do not win at ODDS; only the VRF wrapper can fulfill; fulfillment never reverts even when a recipient reverts or is blacklisted (claimable fallback); a request settles once; concurrent pending plays settle against the pot at fulfillment; stale, zero and low-value price feeds are rejected; the 2% tolerance boundary; minTokensOut slippage; excess msg.value refunded and no ETH left in the contract; reentrancy attempts via a malicious token and a malicious recipient; the timelock (apply before the delay reverts, cancel works, old config stays live while pending); the owner cannot move funds or touch any immutable; a fuzz/invariant test that pot plus claimable plus paid out equals USDC received. Keep the contract small and readable.","parentJobId":null,"planHash":"79b635e9e14094d5e0c50172a2e0a8a4978fce4f355d03e23a8d4e497999f0be","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"1761697b-d19b-4483-9653-e881ba693417","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-685-project-swapaday-daily-play-prize-pot"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50971","feedbackHash":"d2df77a25ea8ab0d9d8405dd5b8ddb8ab40f78886f5f9f3586f7da24cce23601","nodeKey":"implement_contract","submissionHash":"09ec35132865eb30e949f02158184887fba38442466943e5b7c129e52e287286","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"a7f97b5473ed02752a1df9c99cd8dc6bd1422d68fcdf3e4d46a2ad798c16aa6f","nodeKey":"manifest","submissionHash":"48629993dfad77967ae467bc8bcf356ed37614efcd9c21a13db80bdf80dfa49b","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"50957","feedbackHash":"3e994770b2a1dc3fba364b85e53ac4a199b47d4fa1be42a7b464a835eee68b3c","nodeKey":"write_foundry_tests","submissionHash":"4d0afafc79d51020643cec499e36e0ad7ddb6ccfe91ccf5c59b16a5cdb86322f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f8712e334f04d9e69917d9cc1401f3120622346383c25891e127b81ce1f1d7b1","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"081f45b97f7b5d38298b41338fd3a12f9d9d69264eb80c73dc40d9aa4b5e597f","nodeId":"d7a9617d-dd4a-40d1-af97-1cf7ae119e47","outcome":"no_change","summary":"Reproduced the finding and recorded `disputed` for the scope conflict in [.imd-responses.json](/home/imd-worker/.identitymd/work/1761697b-d19b-4483-9653-e881ba693417/d7a9617d-dd4a-40d1-af97-1cf7ae119e47/.imd-responses.json).\n\nThe defect remains unresolved because your rules prohibit touching `foundry.toml`. Accepted code is unchanged.\n\n`forge build` succeeded with warnings. `forge test` exited successfully but found no tests.","treeHash":null,"usage":{"cachedInputTokens":299392,"inputTokens":37237,"model":"gpt-6-astra","outputTokens":2615,"runtime":"codex","turns":3,"wallClockMs":148822}},{"artifacts":[],"attempt":1,"bundleHash":"c4f754dc8d988044df96345bb06af3b34af641a5d19213800d4e27a7e3ff6103","device":"35c52a5b502e847c","findings":[],"hash":"09ec35132865eb30e949f02158184887fba38442466943e5b7c129e52e287286","nodeId":"d7a9617d-dd4a-40d1-af97-1cf7ae119e47","outcome":"completed","summary":"Implemented SwapADay, the deployment helper, and README.\n\n`forge build` succeeds. All 30 scratch tests pass, including 1,000 fuzz cases; offline validation also passes.\n\n**Unresolved requirement:** `foundry.toml` is absent, and your rules prohibit creating it. The required build pins and `bytecode_hash = \"none\"` remain unconfigured; this conflict is documented.\n\nNo audit was performed.","treeHash":"61962d29b5f679f7e48325bfd7189ab4757eb24f","usage":{"cachedInputTokens":750336,"inputTokens":80786,"model":"gpt-6-astra","outputTokens":24282,"runtime":"codex","turns":6,"wallClockMs":1020962}},{"artifacts":[],"attempt":1,"bundleHash":"03f3d6ddec89552258d8bda757855623ea5017249eb8bf3d618be7c22c819584","device":"0256823ae36e7900","findings":[{"description":"The repository has no root foundry.toml. The required bytecode_hash = \"none\" and repository-level compiler, optimizer-run and EVM-version pins are therefore absent. The source pins Solidity 0.8.26, but this does not pin the other build settings. The README already acknowledges this unresolved requirement. Configuration creation/modification is expressly outside this test revision's allowed scope, so it cannot be repaired in test/SwapADay.t.sol.","line":1,"path":"foundry.toml","reproduction":"From the repository root, `test -f foundry.toml` exits 1. Run `forge config --json` and inspect solc, optimizer, optimizer_runs, evm_version and bytecode_hash. In this workspace they are null, false, 200, osaka and ipfs respectively. Expected: a committed root foundry.toml with [profile.default], bytecode_hash = \"none\", and explicit solc, optimizer-run and evm_version settings. Actual: no such file; bytecode metadata uses ipfs and build settings fall back to the toolchain defaults. Successful forge build/test does not satisfy this reproducibility requirement.","severity":"medium","title":"Required reproducible Foundry configuration is absent"}],"hash":"3cc813b7a7875b13cf847ca7c6547637e627960aa657dfdc57448ef306a87d70","nodeId":"3a37ba43-67c6-441c-a867-401b7022b4c8","outcome":"completed","summary":"Added claim-failure fuzz coverage in `test/SwapADay.t.sol`, preserving the existing suite.\n\n`forge build` and `forge test` pass: **49 tests**, including 24,576 invariant calls.\n\nReported the missing required `foundry.toml` in `.imd-findings.json`. Configuration changes remain outside this task’s scope.","treeHash":"3c7d4ae2eaae3cb4a4672e7cd566a05ec03ad4f0","usage":{"cachedInputTokens":757760,"inputTokens":66482,"model":"gpt-6-astra","outputTokens":4213,"runtime":"codex","turns":5,"wallClockMs":244231}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"402cda1b78524f7cb98eb82201bc857b886e04a122c289aacdba4aefce139bd4","nodeId":"d7a9617d-dd4a-40d1-af97-1cf7ae119e47","outcome":"no_change","summary":"Reproduced the finding and recorded the scope conflict in [.imd-responses.json](/home/imd-worker/.identitymd/work/1761697b-d19b-4483-9653-e881ba693417/d7a9617d-dd4a-40d1-af97-1cf7ae119e47/.imd-responses.json).\n\nThe fix remains blocked by your explicit prohibition on creating configuration files. Accepted code is unchanged.\n\n- `forge build`: passed.\n- `forge test`: exited successfully; no tests found.","treeHash":null,"usage":{"cachedInputTokens":314240,"inputTokens":33567,"model":"gpt-6-astra","outputTokens":2566,"runtime":"codex","turns":4,"wallClockMs":136449}},{"artifacts":[],"attempt":2,"bundleHash":"42bc85e4d67a85c3d96aaa96eccd447f4c01693a0a292fad08d9196bf04986b7","device":"35c52a5b502e847c","findings":[],"hash":"48629993dfad77967ae467bc8bcf356ed37614efcd9c21a13db80bdf80dfa49b","nodeId":"1171ce6d-5df8-4ebc-b0f5-791f59e37bc8","outcome":"completed","summary":"Created [launch.json](/home/identitymd5/.identitymd/work/1761697b-d19b-4483-9653-e881ba693417/1171ce6d-5df8-4ebc-b0f5-791f59e37bc8/launch.json) as an explicitly **blocked, non-deployable draft** with verified argument ordering, defaults, and `$owner`.\n\nCompletion requires approved dependency addresses, offsetsRecipient, and IMDO pool values. Missing build configuration and ABI-policy compatibility are documented in notes.\n\n`forge build` passed with warnings; all **52 tests passed**. Only `launch.json` changed outside permitted scratch output.","treeHash":"8bfeb2ed8a01559d064733cd5aa742349d729edc","usage":{"cachedInputTokens":543872,"inputTokens":66503,"model":"gpt-6-astra","outputTokens":6894,"runtime":"codex","turns":6,"wallClockMs":307706}},{"artifacts":[],"attempt":1,"bundleHash":"0133fe1a4e3a19d4f4bbac1b22741c8c556cde04114827642259e2d1278203c5","device":"0256823ae36e7900","findings":[{"description":"The repository has no root foundry.toml. Although Solidity sources pin 0.8.26 and forge build succeeds, the required bytecode_hash = \"none\", compiler setting, optimizer runs and evm_version are not pinned in a repository configuration. The README acknowledges the missing file and shows only a proposed configuration. This fails the explicit build-reproducibility requirement and cannot be fixed within the test-only write scope.","line":1,"path":"foundry.toml","reproduction":"From the repository root, run test -f foundry.toml: it exits 1. Run forge config --json: this checkout resolves solc=null, auto_detect_solc=true, optimizer=false, optimizer_runs=200, evm_version=\"osaka\", bytecode_hash=\"ipfs\". Expected: a committed root foundry.toml with [profile.default], bytecode_hash=\"none\" and explicit solc, optimizer runs and EVM version pins, quoted verbatim in README. Actual: the file is absent and Foundry defaults are used. No configuration files were changed by this test revision.","severity":"medium","title":"Required root Foundry configuration is missing"}],"hash":"4d0afafc79d51020643cec499e36e0ad7ddb6ccfe91ccf5c59b16a5cdb86322f","nodeId":"3a37ba43-67c6-441c-a867-401b7022b4c8","outcome":"completed","summary":"Added three regressions in `test/SwapADay.t.sol`: changing VRF fees, one-unit pot rounding, and claims/pending requests surviving configuration changes.\n\n`forge build` passed. `forge test`: **52 passed**, including 24,576 invariant calls.\n\nReported the missing root `foundry.toml` in `.imd-findings.json`. Required build-reproducibility settings remain unresolved; configuration files were untouched.","treeHash":"47e83eb2f173eb6d268d5e04cbd13f4d394e5957","usage":{"cachedInputTokens":874880,"inputTokens":73676,"model":"gpt-6-astra","outputTokens":5272,"runtime":"codex","turns":5,"wallClockMs":332543}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"586ab56bb28eba50c17d29cc7b672074deece6dc58701562e358071b019cc923","nodeId":"1171ce6d-5df8-4ebc-b0f5-791f59e37bc8","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Cannot produce a valid `launch.json` from the supplied inputs:\n\n- Approved Sepolia dependency addresses, `offsetsRecipient`, and IMDO pool key are missing.\n- The accepted constructor uses tuples and signed `int24`, unsupported by the supplied launch recipe.\n- Required root `foundry.toml` is absent and outside this assignment’s write scope.\n\n`forge build` passed; `forge test` passed all 52 tests, including the accounting invariant.\n\nNo deliverable files changed. Completion requires the deployment inputs and upstream constructor/configuration corrections.","treeHash":null,"usage":{"cachedInputTokens":405632,"inputTokens":47342,"model":"gpt-6-astra","outputTokens":2610,"runtime":"codex","turns":4,"wallClockMs":163360}},{"artifacts":[],"attempt":1,"bundleHash":"113f8287414c9f8f095d8be456710ec41c758ba2b7f469521deaf68e8db30320","device":"0256823ae36e7900","findings":[{"description":"The supplied repository has no root foundry.toml. The required [profile.default] settings for bytecode_hash = \"none\", compiler version, optimizer runs and evm_version are therefore not committed. The Solidity pragma pins 0.8.26, but it does not supply the missing build settings, and the README cannot quote an existing configuration verbatim. The tests assignment expressly prohibits creating or modifying configuration files, so this requirement cannot be repaired in its allowed deliverable.","line":1,"path":"foundry.toml","reproduction":"From the repository root, run `test -f foundry.toml` (exits 1) and `forge config --json` to observe settings resolved without a project configuration. Expected: a committed root foundry.toml with [profile.default], bytecode_hash = \"none\", and explicit compiler, optimizer-run and EVM-version pins. Actual: no such file exists; forge build and forge test succeed using externally resolved/default settings. README.md also records the absence instead of quoting an installed file.","severity":"medium","title":"Required root Foundry build configuration is absent"}],"hash":"7d38fd46dda3fa78d3d48c61e7df08721a388103fb0c475230ef369827a3ed7a","nodeId":"3a37ba43-67c6-441c-a867-401b7022b4c8","outcome":"completed","summary":"Added self-contained tests in `test/SwapADay.t.sol`.\n\n`forge build` and `forge test` pass: **48 tests**, including 4,000 fuzz cases and 24,576 invariant calls.\n\nReported the missing required `foundry.toml` in `.imd-findings.json`; configuration changes are outside this assignment’s permitted scope.","treeHash":"4fa9c105f92992e78155fcb1b8c617057853adf8","usage":{"cachedInputTokens":900352,"inputTokens":73934,"model":"gpt-6-astra","outputTokens":15828,"runtime":"codex","turns":6,"wallClockMs":760276}},{"artifacts":[],"attempt":3,"bundleHash":null,"device":"3f6a9bdd601cb99f","findings":[],"hash":"8f82e4e427da7490d2df53687a7bd468755234b78ff3cc2eba8f545da7f20c59","nodeId":"1171ce6d-5df8-4ebc-b0f5-791f59e37bc8","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Cannot produce a valid `launch.json` from this checkout:\n\n- [SwapADay’s constructor](/home/seat/.identitymd/work/1761697b-d19b-4483-9653-e881ba693417/1171ce6d-5df8-4ebc-b0f5-791f59e37bc8/src/SwapADay.sol:139) takes three arguments, including two unsupported tuples. Flattening them repeats the previous rejection.\n- Approved deployment addresses, offsetsRecipient, and IMDO pool configuration are missing.\n- Required root `foundry.toml` is absent and outside the permitted write scope.\n\nCompletion requires corrected accepted source and deployment inputs.\n\n`forge build` passed with warnings; all 52 tests passed, including the accounting invariant. No files changed.","treeHash":null,"usage":{"cachedInputTokens":233216,"inputTokens":43895,"model":"gpt-6-astra","outputTokens":2746,"runtime":"codex","turns":4,"wallClockMs":125234}}],"verification":[{"checks":[{"durationMs":405,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 217.52ms\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwapADay.sol:71:48\n   │\n71 │     bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:139:43\n    │\n139 │     constructor(Settings memory settings, address initialToken, PoolKey memory initialPoolKey) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:201:26\n    │\n201 │             (bool ok,) = msg.sender.call{value: refund}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:210:31\n    │\n210 │         bytes memory result = poolManager.unlock(abi.encode(msg.sender, swapEth));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:352:42\n    │\n352 │         (bool ok, bytes memory result) = address(usdc).call(data);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:172:13\n    │\n172 │         if (lastPlayedDayPlusOne[msg.sender] == day + 1) revert AlreadyPlayed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:196:9\n    │\n196 │         emit Played(msg.sender, requestId, day, swapEth, tokensOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:47\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:55\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:186:13\n    │\n186 │             usdc.balanceOf(address(this)) != balanceBefore + ENTRY_USDC\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:187:20\n    │\n187 │                 || usdc.balanceOf(msg.sender) + ENTRY_USDC != playerBefore\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:204:13\n    │\n204 │         if (address(this).balance != 0) revert RefundFailed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:225:68\n    │\n225 │         int256 delta = poolManager.swap(poolKey, SwapParams(true, -int256(swapEth), MIN_SQRT_PRICE_LIMIT), bytes(\"\"));\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:226:26\n    │\n226 │         int128 amount0 = int128(delta >> 128);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:227:26\n    │\n227 │         int128 amount1 = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:229:25\n    │\n229 │         uint256 spent = uint256(-int256(amount0));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:41\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:49\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                                 ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claimable` is updated\n    ╭▸ src/SwapADay.sol:268:13\n    │\n268 │         try this.transferUsdc{gas: TRANSFER_GAS_LIMIT}(recipient, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:53\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                                     ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:46\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:262:9\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:284:13\n    │\n284 │             usdc.balanceOf(address(this)) + amount != beforeSelf\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:285:20\n    │\n285 │                 || usdc.balanceOf(recipient) != beforeRecipient + amount\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:295:9\n    │\n295 │         this.transferUsdc(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:296:9\n    │\n296 │         emit Claimed(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:299:28\n    │\n299 │     function proposeConfig(address newToken, PoolKey calldata newPoolKey) external nonReentrant onlyOwner {\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:309:43\n    │\n309 │         if (pendingToken == address(0) || block.timestamp < configReadyAt) revert Timelock();\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:45\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:76\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwapADay.sol:339:86\n    │\n339 │         (uint80 roundId, int256 price,, uint256 updatedAt, uint80 answeredInRound) = ethUsdFeed.latestRoundData();\n    │                                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:344:43\n    │\n344 │         return _ceilDiv(minimumScaledUsd, uint256(price));\n    │                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":59,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\nWarning: No tests found in project! Forge looks for functions that start with `test`\n","passed":true},{"durationMs":22,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwapADay.applyConfig()\",\"SwapADay.cancelConfig()\",\"SwapADay.claim()\",\"SwapADay.play(uint256)\",\"SwapADay.proposeConfig(address,(address,address,uint24,int24,address))\",\"SwapADay.rawFulfillRandomWords(uint256,uint256[])\",\"SwapADay.transferUsdc(address,uint256)\",\"SwapADay.unlockCallback(bytes)\"],\"files\":{\"README.md\":85,\"script/Deploy.s.sol\":35,\"src/SwapADay.sol\":357},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":829,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":674,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SwapADay.sol:158: Reentrancy: State change after external call (10 places)\n[high] storage-array-memory-edit at src/SwapADay.sol:310: Storage Array Edited with Memory\n[high] strict-equality-contract-balance at src/SwapADay.sol:204: Dangerous strict equality checks on contract balances\n[low] centralization-risk at src/SwapADay.sol:299: Centralization Risk (3 places)\n[low] internal-function-used-once at src/SwapADay.sol:248: Internal Function Used Only Once\n[low] large-numeric-literal at src/SwapADay.sol:64: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/SwapADay.sol:145: Literal Instead of Constant (4 places)\n[low] local-variable-shadowing at src/SwapADay.sol:52: Local Variable Shadows State Variable (6 places)\n[low] state-change-without-event at src/SwapADay.sol:220: State Change Without Event (2 places)\n[low] state-no-address-check at src/SwapADay.sol:165: Address State Variable Set Without Checks (2 places)\n[low] unsafe-erc20-operation at src/SwapADay.sol:184: Unsafe ERC20 Operation (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"09ec35132865eb30e949f02158184887fba38442466943e5b7c129e52e287286","verifiedTreeHash":"61962d29b5f679f7e48325bfd7189ab4757eb24f","verifierVersion":"0.1.0+6698e07d"},{"checks":[{"durationMs":1679,"exitCode":0,"name":"build","output":"Compiling 3 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.28s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n    --> test/SwapADay.t.sol:1032:5:\n     |\n1032 |     function test_ConstructorSetsEveryImmutableAndExplicitOwner() public {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwapADay.sol:71:48\n   │\n71 │     bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:139:43\n    │\n139 │     constructor(Settings memory settings, address initialToken, PoolKey memory initialPoolKey) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:201:26\n    │\n201 │             (bool ok,) = msg.sender.call{value: refund}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:210:31\n    │\n210 │         bytes memory result = poolManager.unlock(abi.encode(msg.sender, swapEth));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:352:42\n    │\n352 │         (bool ok, bytes memory result) = address(usdc).call(data);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:172:13\n    │\n172 │         if (lastPlayedDayPlusOne[msg.sender] == day + 1) revert AlreadyPlayed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:196:9\n    │\n196 │         emit Played(msg.sender, requestId, day, swapEth, tokensOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:47\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:55\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:186:13\n    │\n186 │             usdc.balanceOf(address(this)) != balanceBefore + ENTRY_USDC\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:187:20\n    │\n187 │                 || usdc.balanceOf(msg.sender) + ENTRY_USDC != playerBefore\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:204:13\n    │\n204 │         if (address(this).balance != 0) revert RefundFailed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:225:68\n    │\n225 │         int256 delta = poolManager.swap(poolKey, SwapParams(true, -int256(swapEth), MIN_SQRT_PRICE_LIMIT), bytes(\"\"));\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:226:26\n    │\n226 │         int128 amount0 = int128(delta >> 128);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:227:26\n    │\n227 │         int128 amount1 = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:229:25\n    │\n229 │         uint256 spent = uint256(-int256(amount0));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:41\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:49\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                                 ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claimable` is updated\n    ╭▸ src/SwapADay.sol:268:13\n    │\n268 │         try this.transferUsdc{gas: TRANSFER_GAS_LIMIT}(recipient, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:46\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:53\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                                     ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:262:9\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:284:13\n    │\n284 │             usdc.balanceOf(address(this)) + amount != beforeSelf\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:285:20\n    │\n285 │                 || usdc.balanceOf(recipient) != beforeRecipient + amount\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:295:9\n    │\n295 │         this.transferUsdc(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:296:9\n    │\n296 │         emit Claimed(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:299:28\n    │\n299 │     function proposeConfig(address newToken, PoolKey calldata newPoolKey) external nonReentrant onlyOwner {\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:309:43\n    │\n309 │         if (pendingToken == address(0) || block.timestamp < configReadyAt) revert Timelock();\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:45\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:76\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwapADay.sol:339:86\n    │\n339 │         (uint80 roundId, int256 price,, uint256 updatedAt, uint80 answeredInRound) = ethUsdFeed.latestRoundData();\n    │                                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:344:43\n    │\n344 │         return _ceilDiv(minimumScaledUsd, uint256(price));\n    │                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n453 │         vm.warp(11 days);\n    │         ──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:945:21\n    │\n945 │             vm.warp(block.timestamp + 1 days);\n    │             ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n945 │             vm.warp(block.timestamp + 1 days);\n    │             ───────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1171:28\n     │\n1171 │         uint256 deadline = block.timestamp + 48 hours;\n     │                            ━━━━━━━━━━━━━━━\n     ‡\n1185 │         vm.warp(deadline - 1);\n     │         ───────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":31900,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 15 tests for test/SwapADay.t.sol:SwapDayPlayFailureTest\n[PASS] testFuzz_FeedDecimalScalingAndUpwardWeiRounding(uint8,uint32,uint96) (runs: 1000, μ: 1080097, ~: 1083926)\n[PASS] test_ExistingTokenBalanceDoesNotSatisfySlippage() (gas: 468722)\n[PASS] test_InexactAndFalseEntryTransfersRollbackTheEntirePlay() (gas: 3126627)\n[PASS] test_InsufficientUsdcBalanceFailsDespiteSufficientAllowance() (gas: 521386)\n[PASS] test_InvalidBoolEntryTransferRollsBackAllFundsAndDailyState() (gas: 547658)\n[PASS] test_LowPriceAndFeeOnlyPaymentCannotBuyARoll() (gas: 537909)\n[PASS] test_PartialFillBelowMinimumAndOverspendingRollBack() (gas: 833612)\n[PASS] test_PartialFillRefundsChangeAndForcedEthAndLeavesNoEth() (gas: 560760)\n[PASS] test_PoolDeltaAndSettlementFailuresRollBack() (gas: 2250835)\n[PASS] test_RequestFailureAndDuplicateIdRollBackAllEntryEffects() (gas: 1453901)\n[PASS] test_SlippageUsesRecipientBalanceEvenWhenPoolReportsMore() (gas: 946152)\n[PASS] test_StaleZeroNegativeFutureAndIncompletePricesRejectAndRollBack() (gas: 1583048)\n[PASS] test_TwoPercentToleranceBoundaryIsInclusiveAndFeeIsExcluded() (gas: 615037)\n[PASS] test_UsdcAllowanceFailureRollsBackTheSwapAndDailyLimit() (gas: 1000363)\n[PASS] test_ZeroActualOutputFailsEvenWithZeroMinimum() (gas: 425471)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 757.97ms (885.55ms CPU time)\n\nRan 10 tests for test/SwapADay.t.sol:SwapDayConfigTest\n[PASS] test_CancelClearsProposalAndReproposalStartsNewDelay() (gas: 1906282)\n[PASS] test_ConstructorAcceptsInclusiveBounds() (gas: 605081)\n[PASS] test_ConstructorRejectsInvalidEconomicsAndDecimals() (gas: 2112238)\n[PASS] test_ConstructorRejectsMissingDependenciesAndRecipients() (gas: 262034)\n[PASS] test_ConstructorSetsEveryImmutableAndExplicitOwner() (gas: 115832)\n[PASS] test_DynamicFeePoolRequiresAnExistingHook() (gas: 245269)\n[PASS] test_InvalidInitialAndProposedPoolKeysRevert() (gas: 1151223)\n[PASS] test_OnlyOwnerCanProposeApplyAndCancel() (gas: 224076)\n[PASS] test_OwnerCannotWithdrawOrChangeEconomicsAndConfigPreservesFunds() (gas: 2693660)\n[PASS] test_TimelockOldConfigRemainsLiveAndAppliesExactlyAtDeadline() (gas: 2662664)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 887.75ms (51.94ms CPU time)\n\nRan 5 tests for test/SwapADay.t.sol:SwapDayReentrancyTest\n[PASS] test_AuthenticatedNestedFulfillmentCannotSettleAnotherRequest() (gas: 1712000)\n[PASS] test_MaliciousGameTokenCannotReenterAnyUserOrOwnerEntryPoint() (gas: 2569646)\n[PASS] test_MaliciousUsdcCannotReenterDuringEntryPayoutOrClaim() (gas: 969276)\n[PASS] test_RefundRecipientCannotReenterAndRejectedRefundRevertsWholePlay() (gas: 2163805)\n[PASS] test_RevertingAndReentrantTokenRecipientCannotBlockFulfillmentOrDoubleClaim() (gas: 1845495)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 964.45ms (59.57ms CPU time)\n\nRan 18 tests for test/SwapADay.t.sol:SwapDayGameTest\n[PASS] testFuzz_EveryWordUsesTheImmutableOdds(uint256,uint16) (runs: 1000, μ: 679260, ~: 671957)\n[PASS] testFuzz_FailedClaimPreservesCreditAndLivePotUntilRetry(uint8,bool) (runs: 1000, μ: 1550623, ~: 1548907)\n[PASS] testFuzz_FailedTransfersBecomeFullyBackedClaims(uint8) (runs: 1000, μ: 977774, ~: 964531)\n[PASS] testFuzz_OddPotRemainderGoesToOffsets(uint128) (runs: 1000, μ: 690785, ~: 690758)\n[PASS] test_BlacklistedOffsetsDoesNotBlockWinner() (gas: 794742)\n[PASS] test_BlacklistedWinnerDoesNotBlockOffsetsAndCanClaimLater() (gas: 952106)\n[PASS] test_ConcurrentOutOfOrderWinsUsePotAtFulfillment() (gas: 1557958)\n[PASS] test_DuplicateLossCannotBecomeWinAndDuplicateWinCannotDrainNewPot() (gas: 1457286)\n[PASS] test_ExistingClaimsAreExcludedFromLaterJackpots() (gas: 1173668)\n[PASS] test_FirstUtcDayIsPlayableOnlyOnce() (gas: 570582)\n[PASS] test_LossThenWinEmitsSettlementAndEmptiesRunningPot() (gas: 1065020)\n[PASS] test_MidnightRolloverDoesNotPayOrResetThePot() (gas: 904829)\n[PASS] test_NoReturnUsdcIsAcceptedOnlyWhenBalancesAreExact() (gas: 682163)\n[PASS] test_OnePlayPerAddressPerUtcDay() (gas: 875022)\n[PASS] test_OnlyWrapperCanFulfillAndInternalTransferCannotBeCalledByOwner() (gas: 591386)\n[PASS] test_PlayBuysDirectlyAndAddsTheEntireUsdcEntry() (gas: 610878)\n[PASS] test_UnknownAndEmptyFulfillmentsAreHarmlessAndEmptyRemainsPending() (gas: 712451)\n[PASS] test_WinnerMayAlsoBeOffsetsRecipientWithoutLosingEitherHalf() (gas: 868911)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 966.24ms (3.55s CPU time)\n\nRan 1 test for test/SwapADay.t.sol:SwapDayInvariantTest\n[PASS] invariant_conservesAllEntriesAndMatchesIndependentModel() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| SwapDayInvariantHandler | advanceTime         | 4877  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | claim               | 4970  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | fulfill             | 4918  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | play                | 5039  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | setRecipientBlocked | 4772  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 31.69s (31.63s CPU time)\n\nRan 5 test suites in 31.70s (35.26s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":133,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwapADay.applyConfig()\",\"SwapADay.cancelConfig()\",\"SwapADay.claim()\",\"SwapADay.play(uint256)\",\"SwapADay.proposeConfig(address,(address,address,uint24,int24,address))\",\"SwapADay.rawFulfillRandomWords(uint256,uint256[])\",\"SwapADay.transferUsdc(address,uint256)\",\"SwapADay.unlockCallback(bytes)\"],\"files\":{\"README.md\":85,\"script/Deploy.s.sol\":35,\"src/SwapADay.sol\":357,\"test/SwapADay.t.sol\":1554},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3cc813b7a7875b13cf847ca7c6547637e627960aa657dfdc57448ef306a87d70","verifiedTreeHash":"3c7d4ae2eaae3cb4a4672e7cd566a05ec03ad4f0","verifierVersion":"0.1.0+6698e07d"},{"checks":[{"durationMs":437,"exitCode":0,"name":"build","output":"Compiling 3 files with Solc 0.8.26\nSolc 0.8.26 finished in 360.59ms\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n    --> test/SwapADay.t.sol:1093:5:\n     |\n1093 |     function test_ConstructorSetsEveryImmutableAndExplicitOwner() public {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwapADay.sol:71:48\n   │\n71 │     bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:139:43\n    │\n139 │     constructor(Settings memory settings, address initialToken, PoolKey memory initialPoolKey) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:201:26\n    │\n201 │             (bool ok,) = msg.sender.call{value: refund}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:210:31\n    │\n210 │         bytes memory result = poolManager.unlock(abi.encode(msg.sender, swapEth));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:352:42\n    │\n352 │         (bool ok, bytes memory result) = address(usdc).call(data);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:172:13\n    │\n172 │         if (lastPlayedDayPlusOne[msg.sender] == day + 1) revert AlreadyPlayed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:196:9\n    │\n196 │         emit Played(msg.sender, requestId, day, swapEth, tokensOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:47\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:55\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:186:13\n    │\n186 │             usdc.balanceOf(address(this)) != balanceBefore + ENTRY_USDC\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:187:20\n    │\n187 │                 || usdc.balanceOf(msg.sender) + ENTRY_USDC != playerBefore\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:204:13\n    │\n204 │         if (address(this).balance != 0) revert RefundFailed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:225:68\n    │\n225 │         int256 delta = poolManager.swap(poolKey, SwapParams(true, -int256(swapEth), MIN_SQRT_PRICE_LIMIT), bytes(\"\"));\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:226:26\n    │\n226 │         int128 amount0 = int128(delta >> 128);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:227:26\n    │\n227 │         int128 amount1 = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:229:25\n    │\n229 │         uint256 spent = uint256(-int256(amount0));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:41\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:49\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                                 ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claimable` is updated\n    ╭▸ src/SwapADay.sol:268:13\n    │\n268 │         try this.transferUsdc{gas: TRANSFER_GAS_LIMIT}(recipient, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:46\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:53\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                                     ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:262:9\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:284:13\n    │\n284 │             usdc.balanceOf(address(this)) + amount != beforeSelf\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:285:20\n    │\n285 │                 || usdc.balanceOf(recipient) != beforeRecipient + amount\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:295:9\n    │\n295 │         this.transferUsdc(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:296:9\n    │\n296 │         emit Claimed(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:299:28\n    │\n299 │     function proposeConfig(address newToken, PoolKey calldata newPoolKey) external nonReentrant onlyOwner {\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:309:43\n    │\n309 │         if (pendingToken == address(0) || block.timestamp < configReadyAt) revert Timelock();\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:45\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:76\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwapADay.sol:339:86\n    │\n339 │         (uint80 roundId, int256 price,, uint256 updatedAt, uint80 answeredInRound) = ethUsdFeed.latestRoundData();\n    │                                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:344:43\n    │\n344 │         return _ceilDiv(minimumScaledUsd, uint256(price));\n    │                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n453 │         vm.warp(11 days);\n    │         ──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1006:21\n     │\n1006 │             vm.warp(block.timestamp + 1 days);\n     │             ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:363:31\n     │\n 363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n     │                               ━━━━━━━━━━━━━━━\n     ‡\n1006 │             vm.warp(block.timestamp + 1 days);\n     │             ───────────────────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1232:28\n     │\n1232 │         uint256 deadline = block.timestamp + 48 hours;\n     │                            ━━━━━━━━━━━━━━━\n     ‡\n1246 │         vm.warp(deadline - 1);\n     │         ───────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":10645,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/SwapADay.t.sol:SwapDayConfigTest\n[PASS] test_CancelClearsProposalAndReproposalStartsNewDelay() (gas: 1906248)\n[PASS] test_ConfigChangePreservesClaimsAndPendingRequests() (gas: 3714368)\n[PASS] test_ConstructorAcceptsInclusiveBounds() (gas: 605057)\n[PASS] test_ConstructorRejectsInvalidEconomicsAndDecimals() (gas: 2112192)\n[PASS] test_ConstructorRejectsMissingDependenciesAndRecipients() (gas: 262079)\n[PASS] test_ConstructorSetsEveryImmutableAndExplicitOwner() (gas: 115810)\n[PASS] test_DynamicFeePoolRequiresAnExistingHook() (gas: 245247)\n[PASS] test_InvalidInitialAndProposedPoolKeysRevert() (gas: 1151246)\n[PASS] test_OnlyOwnerCanProposeApplyAndCancel() (gas: 224076)\n[PASS] test_OwnerCannotWithdrawOrChangeEconomicsAndConfigPreservesFunds() (gas: 2693648)\n[PASS] test_TimelockOldConfigRemainsLiveAndAppliesExactlyAtDeadline() (gas: 2662652)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 185.79ms (13.96ms CPU time)\n\nRan 16 tests for test/SwapADay.t.sol:SwapDayPlayFailureTest\n[PASS] testFuzz_FeedDecimalScalingAndUpwardWeiRounding(uint8,uint32,uint96) (runs: 1000, μ: 1080268, ~: 1083936)\n[PASS] test_ChangedVrfFeesAreRequotedBeforeEachPlay() (gas: 1739809)\n[PASS] test_ExistingTokenBalanceDoesNotSatisfySlippage() (gas: 468722)\n[PASS] test_InexactAndFalseEntryTransfersRollbackTheEntirePlay() (gas: 3126649)\n[PASS] test_InsufficientUsdcBalanceFailsDespiteSufficientAllowance() (gas: 521319)\n[PASS] test_InvalidBoolEntryTransferRollsBackAllFundsAndDailyState() (gas: 547680)\n[PASS] test_LowPriceAndFeeOnlyPaymentCannotBuyARoll() (gas: 537909)\n[PASS] test_PartialFillBelowMinimumAndOverspendingRollBack() (gas: 833546)\n[PASS] test_PartialFillRefundsChangeAndForcedEthAndLeavesNoEth() (gas: 560782)\n[PASS] test_PoolDeltaAndSettlementFailuresRollBack() (gas: 2250835)\n[PASS] test_RequestFailureAndDuplicateIdRollBackAllEntryEffects() (gas: 1453923)\n[PASS] test_SlippageUsesRecipientBalanceEvenWhenPoolReportsMore() (gas: 946174)\n[PASS] test_StaleZeroNegativeFutureAndIncompletePricesRejectAndRollBack() (gas: 1583048)\n[PASS] test_TwoPercentToleranceBoundaryIsInclusiveAndFeeIsExcluded() (gas: 615059)\n[PASS] test_UsdcAllowanceFailureRollsBackTheSwapAndDailyLimit() (gas: 1000385)\n[PASS] test_ZeroActualOutputFailsEvenWithZeroMinimum() (gas: 425493)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 185.82ms (201.49ms CPU time)\n\nRan 5 tests for test/SwapADay.t.sol:SwapDayReentrancyTest\n[PASS] test_AuthenticatedNestedFulfillmentCannotSettleAnotherRequest() (gas: 1712000)\n[PASS] test_MaliciousGameTokenCannotReenterAnyUserOrOwnerEntryPoint() (gas: 2569646)\n[PASS] test_MaliciousUsdcCannotReenterDuringEntryPayoutOrClaim() (gas: 969276)\n[PASS] test_RefundRecipientCannotReenterAndRejectedRefundRevertsWholePlay() (gas: 2163793)\n[PASS] test_RevertingAndReentrantTokenRecipientCannotBlockFulfillmentOrDoubleClaim() (gas: 1845483)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 204.90ms (5.96ms CPU time)\n\nRan 19 tests for test/SwapADay.t.sol:SwapDayGameTest\n[PASS] testFuzz_EveryWordUsesTheImmutableOdds(uint256,uint16) (runs: 1000, μ: 679204, ~: 672022)\n[PASS] testFuzz_FailedClaimPreservesCreditAndLivePotUntilRetry(uint8,bool) (runs: 1000, μ: 1550813, ~: 1548885)\n[PASS] testFuzz_FailedTransfersBecomeFullyBackedClaims(uint8) (runs: 1000, μ: 980802, ~: 964531)\n[PASS] testFuzz_OddPotRemainderGoesToOffsets(uint128) (runs: 1000, μ: 690785, ~: 690758)\n[PASS] test_BlacklistedOffsetsDoesNotBlockWinner() (gas: 794720)\n[PASS] test_BlacklistedWinnerDoesNotBlockOffsetsAndCanClaimLater() (gas: 952106)\n[PASS] test_ConcurrentOutOfOrderWinsUsePotAtFulfillment() (gas: 1557958)\n[PASS] test_DuplicateLossCannotBecomeWinAndDuplicateWinCannotDrainNewPot() (gas: 1457286)\n[PASS] test_ExistingClaimsAreExcludedFromLaterJackpots() (gas: 1173646)\n[PASS] test_FirstUtcDayIsPlayableOnlyOnce() (gas: 570582)\n[PASS] test_LossThenWinEmitsSettlementAndEmptiesRunningPot() (gas: 1064998)\n[PASS] test_MidnightRolloverDoesNotPayOrResetThePot() (gas: 904807)\n[PASS] test_NoReturnUsdcIsAcceptedOnlyWhenBalancesAreExact() (gas: 682141)\n[PASS] test_OnePlayPerAddressPerUtcDay() (gas: 875022)\n[PASS] test_OneUnitPotGoesEntirelyToOffsets() (gas: 755404)\n[PASS] test_OnlyWrapperCanFulfillAndInternalTransferCannotBeCalledByOwner() (gas: 591474)\n[PASS] test_PlayBuysDirectlyAndAddsTheEntireUsdcEntry() (gas: 610856)\n[PASS] test_UnknownAndEmptyFulfillmentsAreHarmlessAndEmptyRemainsPending() (gas: 712451)\n[PASS] test_WinnerMayAlsoBeOffsetsRecipientWithoutLosingEitherHalf() (gas: 868889)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 205.02ms (768.74ms CPU time)\n\nRan 1 test for test/SwapADay.t.sol:SwapDayInvariantTest\n[PASS] invariant_conservesAllEntriesAndMatchesIndependentModel() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| SwapDayInvariantHandler | advanceTime         | 4918  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | claim               | 4937  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | fulfill             | 4965  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | play                | 4867  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | setRecipientBlocked | 4889  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.59s (10.59s CPU time)\n\nRan 5 test suites in 10.59s (11.38s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":28,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwapADay.applyConfig()\",\"SwapADay.cancelConfig()\",\"SwapADay.claim()\",\"SwapADay.play(uint256)\",\"SwapADay.proposeConfig(address,(address,address,uint24,int24,address))\",\"SwapADay.rawFulfillRandomWords(uint256,uint256[])\",\"SwapADay.transferUsdc(address,uint256)\",\"SwapADay.unlockCallback(bytes)\"],\"files\":{\"README.md\":85,\"launch.json\":27,\"script/Deploy.s.sol\":35,\"src/SwapADay.sol\":357,\"test/SwapADay.t.sol\":1665},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"launch.json: SwapADay: expected 3 constructor arguments, got 16","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"48629993dfad77967ae467bc8bcf356ed37614efcd9c21a13db80bdf80dfa49b","verifiedTreeHash":"8bfeb2ed8a01559d064733cd5aa742349d729edc","verifierVersion":"0.1.0+6698e07d"},{"checks":[{"durationMs":1506,"exitCode":0,"name":"build","output":"Compiling 3 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.20s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n    --> test/SwapADay.t.sol:1093:5:\n     |\n1093 |     function test_ConstructorSetsEveryImmutableAndExplicitOwner() public {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwapADay.sol:71:48\n   │\n71 │     bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:139:43\n    │\n139 │     constructor(Settings memory settings, address initialToken, PoolKey memory initialPoolKey) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:201:26\n    │\n201 │             (bool ok,) = msg.sender.call{value: refund}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:210:31\n    │\n210 │         bytes memory result = poolManager.unlock(abi.encode(msg.sender, swapEth));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:352:42\n    │\n352 │         (bool ok, bytes memory result) = address(usdc).call(data);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:172:13\n    │\n172 │         if (lastPlayedDayPlusOne[msg.sender] == day + 1) revert AlreadyPlayed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:196:9\n    │\n196 │         emit Played(msg.sender, requestId, day, swapEth, tokensOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:47\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:55\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:186:13\n    │\n186 │             usdc.balanceOf(address(this)) != balanceBefore + ENTRY_USDC\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:187:20\n    │\n187 │                 || usdc.balanceOf(msg.sender) + ENTRY_USDC != playerBefore\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:204:13\n    │\n204 │         if (address(this).balance != 0) revert RefundFailed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:225:68\n    │\n225 │         int256 delta = poolManager.swap(poolKey, SwapParams(true, -int256(swapEth), MIN_SQRT_PRICE_LIMIT), bytes(\"\"));\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:226:26\n    │\n226 │         int128 amount0 = int128(delta >> 128);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:227:26\n    │\n227 │         int128 amount1 = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:229:25\n    │\n229 │         uint256 spent = uint256(-int256(amount0));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:41\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:49\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                                 ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claimable` is updated\n    ╭▸ src/SwapADay.sol:268:13\n    │\n268 │         try this.transferUsdc{gas: TRANSFER_GAS_LIMIT}(recipient, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:46\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:53\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                                     ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:262:9\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:284:13\n    │\n284 │             usdc.balanceOf(address(this)) + amount != beforeSelf\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:285:20\n    │\n285 │                 || usdc.balanceOf(recipient) != beforeRecipient + amount\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:295:9\n    │\n295 │         this.transferUsdc(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:296:9\n    │\n296 │         emit Claimed(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:299:28\n    │\n299 │     function proposeConfig(address newToken, PoolKey calldata newPoolKey) external nonReentrant onlyOwner {\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:309:43\n    │\n309 │         if (pendingToken == address(0) || block.timestamp < configReadyAt) revert Timelock();\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:45\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:76\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwapADay.sol:339:86\n    │\n339 │         (uint80 roundId, int256 price,, uint256 updatedAt, uint80 answeredInRound) = ethUsdFeed.latestRoundData();\n    │                                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:344:43\n    │\n344 │         return _ceilDiv(minimumScaledUsd, uint256(price));\n    │                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n453 │         vm.warp(11 days);\n    │         ──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1006:21\n     │\n1006 │             vm.warp(block.timestamp + 1 days);\n     │             ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:363:31\n     │\n 363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n     │                               ━━━━━━━━━━━━━━━\n     ‡\n1006 │             vm.warp(block.timestamp + 1 days);\n     │             ───────────────────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1232:28\n     │\n1232 │         uint256 deadline = block.timestamp + 48 hours;\n     │                            ━━━━━━━━━━━━━━━\n     ‡\n1246 │         vm.warp(deadline - 1);\n     │         ───────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":29398,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/SwapADay.t.sol:SwapDayConfigTest\n[PASS] test_CancelClearsProposalAndReproposalStartsNewDelay() (gas: 1906248)\n[PASS] test_ConfigChangePreservesClaimsAndPendingRequests() (gas: 3714368)\n[PASS] test_ConstructorAcceptsInclusiveBounds() (gas: 605057)\n[PASS] test_ConstructorRejectsInvalidEconomicsAndDecimals() (gas: 2112192)\n[PASS] test_ConstructorRejectsMissingDependenciesAndRecipients() (gas: 262079)\n[PASS] test_ConstructorSetsEveryImmutableAndExplicitOwner() (gas: 115810)\n[PASS] test_DynamicFeePoolRequiresAnExistingHook() (gas: 245247)\n[PASS] test_InvalidInitialAndProposedPoolKeysRevert() (gas: 1151246)\n[PASS] test_OnlyOwnerCanProposeApplyAndCancel() (gas: 224076)\n[PASS] test_OwnerCannotWithdrawOrChangeEconomicsAndConfigPreservesFunds() (gas: 2693648)\n[PASS] test_TimelockOldConfigRemainsLiveAndAppliesExactlyAtDeadline() (gas: 2662652)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 324.25ms (52.51ms CPU time)\n\nRan 5 tests for test/SwapADay.t.sol:SwapDayReentrancyTest\n[PASS] test_AuthenticatedNestedFulfillmentCannotSettleAnotherRequest() (gas: 1712000)\n[PASS] test_MaliciousGameTokenCannotReenterAnyUserOrOwnerEntryPoint() (gas: 2569646)\n[PASS] test_MaliciousUsdcCannotReenterDuringEntryPayoutOrClaim() (gas: 969276)\n[PASS] test_RefundRecipientCannotReenterAndRejectedRefundRevertsWholePlay() (gas: 2163793)\n[PASS] test_RevertingAndReentrantTokenRecipientCannotBlockFulfillmentOrDoubleClaim() (gas: 1845483)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 539.39ms (44.96ms CPU time)\n\nRan 19 tests for test/SwapADay.t.sol:SwapDayGameTest\n[PASS] testFuzz_EveryWordUsesTheImmutableOdds(uint256,uint16) (runs: 1000, μ: 679279, ~: 672022)\n[PASS] testFuzz_FailedClaimPreservesCreditAndLivePotUntilRetry(uint8,bool) (runs: 1000, μ: 1550738, ~: 1548885)\n[PASS] testFuzz_FailedTransfersBecomeFullyBackedClaims(uint8) (runs: 1000, μ: 979490, ~: 964531)\n[PASS] testFuzz_OddPotRemainderGoesToOffsets(uint128) (runs: 1000, μ: 690786, ~: 690758)\n[PASS] test_BlacklistedOffsetsDoesNotBlockWinner() (gas: 794720)\n[PASS] test_BlacklistedWinnerDoesNotBlockOffsetsAndCanClaimLater() (gas: 952106)\n[PASS] test_ConcurrentOutOfOrderWinsUsePotAtFulfillment() (gas: 1557958)\n[PASS] test_DuplicateLossCannotBecomeWinAndDuplicateWinCannotDrainNewPot() (gas: 1457286)\n[PASS] test_ExistingClaimsAreExcludedFromLaterJackpots() (gas: 1173646)\n[PASS] test_FirstUtcDayIsPlayableOnlyOnce() (gas: 570582)\n[PASS] test_LossThenWinEmitsSettlementAndEmptiesRunningPot() (gas: 1064998)\n[PASS] test_MidnightRolloverDoesNotPayOrResetThePot() (gas: 904807)\n[PASS] test_NoReturnUsdcIsAcceptedOnlyWhenBalancesAreExact() (gas: 682141)\n[PASS] test_OnePlayPerAddressPerUtcDay() (gas: 875022)\n[PASS] test_OneUnitPotGoesEntirelyToOffsets() (gas: 755404)\n[PASS] test_OnlyWrapperCanFulfillAndInternalTransferCannotBeCalledByOwner() (gas: 591474)\n[PASS] test_PlayBuysDirectlyAndAddsTheEntireUsdcEntry() (gas: 610856)\n[PASS] test_UnknownAndEmptyFulfillmentsAreHarmlessAndEmptyRemainsPending() (gas: 712451)\n[PASS] test_WinnerMayAlsoBeOffsetsRecipientWithoutLosingEitherHalf() (gas: 868889)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 539.69ms (2.21s CPU time)\n\nRan 16 tests for test/SwapADay.t.sol:SwapDayPlayFailureTest\n[PASS] testFuzz_FeedDecimalScalingAndUpwardWeiRounding(uint8,uint32,uint96) (runs: 1000, μ: 1080268, ~: 1083936)\n[PASS] test_ChangedVrfFeesAreRequotedBeforeEachPlay() (gas: 1739809)\n[PASS] test_ExistingTokenBalanceDoesNotSatisfySlippage() (gas: 468722)\n[PASS] test_InexactAndFalseEntryTransfersRollbackTheEntirePlay() (gas: 3126649)\n[PASS] test_InsufficientUsdcBalanceFailsDespiteSufficientAllowance() (gas: 521319)\n[PASS] test_InvalidBoolEntryTransferRollsBackAllFundsAndDailyState() (gas: 547680)\n[PASS] test_LowPriceAndFeeOnlyPaymentCannotBuyARoll() (gas: 537909)\n[PASS] test_PartialFillBelowMinimumAndOverspendingRollBack() (gas: 833546)\n[PASS] test_PartialFillRefundsChangeAndForcedEthAndLeavesNoEth() (gas: 560782)\n[PASS] test_PoolDeltaAndSettlementFailuresRollBack() (gas: 2250835)\n[PASS] test_RequestFailureAndDuplicateIdRollBackAllEntryEffects() (gas: 1453923)\n[PASS] test_SlippageUsesRecipientBalanceEvenWhenPoolReportsMore() (gas: 946174)\n[PASS] test_StaleZeroNegativeFutureAndIncompletePricesRejectAndRollBack() (gas: 1583048)\n[PASS] test_TwoPercentToleranceBoundaryIsInclusiveAndFeeIsExcluded() (gas: 615059)\n[PASS] test_UsdcAllowanceFailureRollsBackTheSwapAndDailyLimit() (gas: 1000385)\n[PASS] test_ZeroActualOutputFailsEvenWithZeroMinimum() (gas: 425493)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 744.96ms (944.38ms CPU time)\n\nRan 1 test for test/SwapADay.t.sol:SwapDayInvariantTest\n[PASS] invariant_conservesAllEntriesAndMatchesIndependentModel() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| SwapDayInvariantHandler | advanceTime         | 4917  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | claim               | 4963  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | fulfill             | 4964  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | play                | 4866  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | setRecipientBlocked | 4866  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 29.17s (29.15s CPU time)\n\nRan 5 test suites in 29.19s (31.32s CPU time): 52 tests passed, 0 failed, 0 skipped (52 total tests)\n","passed":true},{"durationMs":115,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwapADay.applyConfig()\",\"SwapADay.cancelConfig()\",\"SwapADay.claim()\",\"SwapADay.play(uint256)\",\"SwapADay.proposeConfig(address,(address,address,uint24,int24,address))\",\"SwapADay.rawFulfillRandomWords(uint256,uint256[])\",\"SwapADay.transferUsdc(address,uint256)\",\"SwapADay.unlockCallback(bytes)\"],\"files\":{\"README.md\":85,\"script/Deploy.s.sol\":35,\"src/SwapADay.sol\":357,\"test/SwapADay.t.sol\":1665},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4d0afafc79d51020643cec499e36e0ad7ddb6ccfe91ccf5c59b16a5cdb86322f","verifiedTreeHash":"47e83eb2f173eb6d268d5e04cbd13f4d394e5957","verifierVersion":"0.1.0+6698e07d"},{"checks":[{"durationMs":437,"exitCode":0,"name":"build","output":"Compiling 3 files with Solc 0.8.26\nSolc 0.8.26 finished in 371.78ms\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/SwapADay.t.sol:982:5:\n    |\n982 |     function test_ConstructorSetsEveryImmutableAndExplicitOwner() public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwapADay.sol:71:48\n   │\n71 │     bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:139:43\n    │\n139 │     constructor(Settings memory settings, address initialToken, PoolKey memory initialPoolKey) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:201:26\n    │\n201 │             (bool ok,) = msg.sender.call{value: refund}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:210:31\n    │\n210 │         bytes memory result = poolManager.unlock(abi.encode(msg.sender, swapEth));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:352:42\n    │\n352 │         (bool ok, bytes memory result) = address(usdc).call(data);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:172:13\n    │\n172 │         if (lastPlayedDayPlusOne[msg.sender] == day + 1) revert AlreadyPlayed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:196:9\n    │\n196 │         emit Played(msg.sender, requestId, day, swapEth, tokensOut);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:47\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:179:55\n    │\n179 │         if (swapEth < minimumEth || swapEth > uint256(uint128(type(int128).max))) revert InsufficientSwap();\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:186:13\n    │\n186 │             usdc.balanceOf(address(this)) != balanceBefore + ENTRY_USDC\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:187:20\n    │\n187 │                 || usdc.balanceOf(msg.sender) + ENTRY_USDC != playerBefore\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:204:13\n    │\n204 │         if (address(this).balance != 0) revert RefundFailed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:225:68\n    │\n225 │         int256 delta = poolManager.swap(poolKey, SwapParams(true, -int256(swapEth), MIN_SQRT_PRICE_LIMIT), bytes(\"\"));\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:226:26\n    │\n226 │         int128 amount0 = int128(delta >> 128);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:227:26\n    │\n227 │         int128 amount1 = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:229:25\n    │\n229 │         uint256 spent = uint256(-int256(amount0));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:41\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:234:49\n    │\n234 │         poolManager.take(token, player, uint256(uint128(amount1)));\n    │                                                 ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claimable` is updated\n    ╭▸ src/SwapADay.sol:268:13\n    │\n268 │         try this.transferUsdc{gas: TRANSFER_GAS_LIMIT}(recipient, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:46\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwapADay.sol:262:53\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │                                                     ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:262:9\n    │\n262 │         emit Settled(requestId, player, won, prize, offsets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:284:13\n    │\n284 │             usdc.balanceOf(address(this)) + amount != beforeSelf\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwapADay.sol:285:20\n    │\n285 │                 || usdc.balanceOf(recipient) != beforeRecipient + amount\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `guard` is updated\n    ╭▸ src/SwapADay.sol:295:9\n    │\n295 │         this.transferUsdc(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwapADay.sol:296:9\n    │\n296 │         emit Claimed(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwapADay.sol:299:28\n    │\n299 │     function proposeConfig(address newToken, PoolKey calldata newPoolKey) external nonReentrant onlyOwner {\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:309:43\n    │\n309 │         if (pendingToken == address(0) || block.timestamp < configReadyAt) revert Timelock();\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:45\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwapADay.sol:341:76\n    │\n341 │             price <= 0 || updatedAt == 0 || updatedAt > block.timestamp || block.timestamp - updatedAt > MAX_PRICE_AGE\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwapADay.sol:339:86\n    │\n339 │         (uint80 roundId, int256 price,, uint256 updatedAt, uint80 answeredInRound) = ethUsdFeed.latestRoundData();\n    │                                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwapADay.sol:344:43\n    │\n344 │         return _ceilDiv(minimumScaledUsd, uint256(price));\n    │                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n453 │         vm.warp(11 days);\n    │         ──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:895:21\n    │\n895 │             vm.warp(block.timestamp + 1 days);\n    │             ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwapADay.t.sol:363:31\n    │\n363 │         feed.setRound(2000e8, block.timestamp, 1, 1);\n    │                               ━━━━━━━━━━━━━━━\n    ‡\n895 │             vm.warp(block.timestamp + 1 days);\n    │             ───────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n     ╭▸ test/SwapADay.t.sol:1121:28\n     │\n1121 │         uint256 deadline = block.timestamp + 48 hours;\n     │                            ━━━━━━━━━━━━━━━\n     ‡\n1135 │         vm.warp(deadline - 1);\n     │         ───────────────────── `vm.warp` changes this environment here\n     │\n     ├ help: capture it with `vm.getBlockTimestamp()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":10183,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 10 tests for test/SwapADay.t.sol:SwapDayConfigTest\n[PASS] test_CancelClearsProposalAndReproposalStartsNewDelay() (gas: 1906282)\n[PASS] test_ConstructorAcceptsInclusiveBounds() (gas: 605081)\n[PASS] test_ConstructorRejectsInvalidEconomicsAndDecimals() (gas: 2112238)\n[PASS] test_ConstructorRejectsMissingDependenciesAndRecipients() (gas: 262034)\n[PASS] test_ConstructorSetsEveryImmutableAndExplicitOwner() (gas: 115832)\n[PASS] test_DynamicFeePoolRequiresAnExistingHook() (gas: 245269)\n[PASS] test_InvalidInitialAndProposedPoolKeysRevert() (gas: 1151223)\n[PASS] test_OnlyOwnerCanProposeApplyAndCancel() (gas: 224076)\n[PASS] test_OwnerCannotWithdrawOrChangeEconomicsAndConfigPreservesFunds() (gas: 2693660)\n[PASS] test_TimelockOldConfigRemainsLiveAndAppliesExactlyAtDeadline() (gas: 2662664)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 106.76ms (10.16ms CPU time)\n\nRan 5 tests for test/SwapADay.t.sol:SwapDayReentrancyTest\n[PASS] test_AuthenticatedNestedFulfillmentCannotSettleAnotherRequest() (gas: 1712000)\n[PASS] test_MaliciousGameTokenCannotReenterAnyUserOrOwnerEntryPoint() (gas: 2569646)\n[PASS] test_MaliciousUsdcCannotReenterDuringEntryPayoutOrClaim() (gas: 969276)\n[PASS] test_RefundRecipientCannotReenterAndRejectedRefundRevertsWholePlay() (gas: 2163805)\n[PASS] test_RevertingAndReentrantTokenRecipientCannotBlockFulfillmentOrDoubleClaim() (gas: 1845495)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 125.34ms (8.21ms CPU time)\n\nRan 15 tests for test/SwapADay.t.sol:SwapDayPlayFailureTest\n[PASS] testFuzz_FeedDecimalScalingAndUpwardWeiRounding(uint8,uint32,uint96) (runs: 1000, μ: 1080442, ~: 1083926)\n[PASS] test_ExistingTokenBalanceDoesNotSatisfySlippage() (gas: 468722)\n[PASS] test_InexactAndFalseEntryTransfersRollbackTheEntirePlay() (gas: 3126627)\n[PASS] test_InsufficientUsdcBalanceFailsDespiteSufficientAllowance() (gas: 521386)\n[PASS] test_InvalidBoolEntryTransferRollsBackAllFundsAndDailyState() (gas: 547658)\n[PASS] test_LowPriceAndFeeOnlyPaymentCannotBuyARoll() (gas: 537909)\n[PASS] test_PartialFillBelowMinimumAndOverspendingRollBack() (gas: 833612)\n[PASS] test_PartialFillRefundsChangeAndForcedEthAndLeavesNoEth() (gas: 560760)\n[PASS] test_PoolDeltaAndSettlementFailuresRollBack() (gas: 2250835)\n[PASS] test_RequestFailureAndDuplicateIdRollBackAllEntryEffects() (gas: 1453901)\n[PASS] test_SlippageUsesRecipientBalanceEvenWhenPoolReportsMore() (gas: 946152)\n[PASS] test_StaleZeroNegativeFutureAndIncompletePricesRejectAndRollBack() (gas: 1583048)\n[PASS] test_TwoPercentToleranceBoundaryIsInclusiveAndFeeIsExcluded() (gas: 615037)\n[PASS] test_UsdcAllowanceFailureRollsBackTheSwapAndDailyLimit() (gas: 1000363)\n[PASS] test_ZeroActualOutputFailsEvenWithZeroMinimum() (gas: 425471)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 126.32ms (138.11ms CPU time)\n\nRan 17 tests for test/SwapADay.t.sol:SwapDayGameTest\n[PASS] testFuzz_EveryWordUsesTheImmutableOdds(uint256,uint16) (runs: 1000, μ: 679255, ~: 671933)\n[PASS] testFuzz_FailedTransfersBecomeFullyBackedClaims(uint8) (runs: 1000, μ: 981237, ~: 964531)\n[PASS] testFuzz_OddPotRemainderGoesToOffsets(uint128) (runs: 1000, μ: 690784, ~: 690758)\n[PASS] test_BlacklistedOffsetsDoesNotBlockWinner() (gas: 794720)\n[PASS] test_BlacklistedWinnerDoesNotBlockOffsetsAndCanClaimLater() (gas: 952106)\n[PASS] test_ConcurrentOutOfOrderWinsUsePotAtFulfillment() (gas: 1557958)\n[PASS] test_DuplicateLossCannotBecomeWinAndDuplicateWinCannotDrainNewPot() (gas: 1457286)\n[PASS] test_ExistingClaimsAreExcludedFromLaterJackpots() (gas: 1173646)\n[PASS] test_FirstUtcDayIsPlayableOnlyOnce() (gas: 570582)\n[PASS] test_LossThenWinEmitsSettlementAndEmptiesRunningPot() (gas: 1065020)\n[PASS] test_MidnightRolloverDoesNotPayOrResetThePot() (gas: 904829)\n[PASS] test_NoReturnUsdcIsAcceptedOnlyWhenBalancesAreExact() (gas: 682163)\n[PASS] test_OnePlayPerAddressPerUtcDay() (gas: 875022)\n[PASS] test_OnlyWrapperCanFulfillAndInternalTransferCannotBeCalledByOwner() (gas: 591386)\n[PASS] test_PlayBuysDirectlyAndAddsTheEntireUsdcEntry() (gas: 610878)\n[PASS] test_UnknownAndEmptyFulfillmentsAreHarmlessAndEmptyRemainsPending() (gas: 712451)\n[PASS] test_WinnerMayAlsoBeOffsetsRecipientWithoutLosingEitherHalf() (gas: 868889)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 126.40ms (390.65ms CPU time)\n\nRan 1 test for test/SwapADay.t.sol:SwapDayInvariantTest\n[PASS] invariant_conservesAllEntriesAndMatchesIndependentModel() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| SwapDayInvariantHandler | advanceTime         | 4983  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | claim               | 4947  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | fulfill             | 4892  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | play                | 4879  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| SwapDayInvariantHandler | setRecipientBlocked | 4875  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.11s (10.11s CPU time)\n\nRan 5 test suites in 10.11s (10.59s CPU time): 48 tests passed, 0 failed, 0 skipped (48 total tests)\n","passed":true},{"durationMs":29,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwapADay.applyConfig()\",\"SwapADay.cancelConfig()\",\"SwapADay.claim()\",\"SwapADay.play(uint256)\",\"SwapADay.proposeConfig(address,(address,address,uint24,int24,address))\",\"SwapADay.rawFulfillRandomWords(uint256,uint256[])\",\"SwapADay.transferUsdc(address,uint256)\",\"SwapADay.unlockCallback(bytes)\"],\"files\":{\"README.md\":85,\"script/Deploy.s.sol\":35,\"src/SwapADay.sol\":357,\"test/SwapADay.t.sol\":1504},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7d38fd46dda3fa78d3d48c61e7df08721a388103fb0c475230ef369827a3ed7a","verifiedTreeHash":"4fa9c105f92992e78155fcb1b8c617057853adf8","verifierVersion":"0.1.0+6698e07d"}]}