{"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":"46c695fa-7061-4e9f-a06a-659e1f72ee3b","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","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":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":"88eb13467209315434218c2a8999c40107c0aecfc8c5031752f54a61631e9dba","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"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":"working"}],"objective":"pray: a token where selling is a prayer to the swarm. Buy freely; to sell cheaply you file a plea and a panel of IMD agents judges it through the IMD oracle. Approved sinners pay 1%, everyone else pays 50%, and the sinners' tax buys back and burns PRAY. Launch kind univ4_hook on Ethereum mainnet, paired with FWA (0xa0df17b5ac76ababa36e1450e2cbcd18a620c845): the launch's standard token and pool with our hook, plus our plea registry. Deploy in the launch, then host a site on the live addresses. No owner, admin, upgrade or pause in our contracts.\n\nToken name: pray. Symbol: PRAY.\n\nWhen the hook acts: on every swap in this pool. beforeSwap reads hookData and checks the blessing for sells; the fee is taken in the swap (buys and sells); filePlea is a separate call on our registry.\n\nFEES (hook, on top of the launch's pool fee; taken from the FWA side and kept in FWA, do not sell for ETH)\n- Buys: 1%. First 30 minutes after launch the buy fee decays linearly from 50% to 1%.\n- Sells with a valid blessing: 1%. Sells without one: 50%.\n- Every hook fee: 90% to the burn vault, 10% to 0xd01122bBfFd00fc96252c8b29867a5359a3bca13.\n- Burn vault: buyback() is callable by anyone, at most once per 60 s, up to 50,000 FWA per call; it swaps vault FWA for PRAY through the pool and burns it. Caller gets 0.5% of the FWA spent.\n\nPLEAS (the registry asks the IMD oracle on chain through the IMD Intake; no HTTP API is needed by the contracts)\n- IMD oracle on Ethereum: Intake 0x1397434cd35e8a9c8ac312a61d3a285eb31dea56, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, action id bytes32(\"oracle.request@oracle-1\"), price 0.5 IMD, attestation signer 0x5598aa9146215bc13eb26f2c692ad1461fd32982, EIP-712 domain {name \"IdentityMD Oracle\", version \"2\", chainId 1, verifyingContract = our registry}, OracleAttestation(bytes32 requestId,uint256 chainId,bytes32 questionHash,uint8 answerType,bytes answer,uint256 figure,uint64 fromBlock,uint64 toBlock,bytes32 blockHash,bytes32 panelJobId,uint16 panelSize,uint16 quorum,uint16 agreed,uint64 issuedAt,uint64 expiresAt). Docs: https://imd.fun/docs/ (\"Pay on chain\", \"Ask the oracle\").\n- filePlea(amount, text): the pleader approves 0.5 IMD to the registry first. The registry pulls 0.5 IMD, builds the oracle body on chain from a fixed template (v 1, chainId 1, window 1 hour, answerType bool, evidence panel, panelSize 7, quorum 5, validForSeconds 900, consumer = the registry; the question names the plea id, seller, PRAY amount and the plea text, JSON-escaped, text max 600 bytes; definitions pin the rubric: approve only if the plea is at least 20 words, specific and sincere, not abusive, not spam, not copied from an earlier plea), calls Intake.request with callback (registry, onOracleResult), and stores intake requestId -> plea. Max amount: 10% of the seller's PRAY balance. One open plea per wallet; one blessing per wallet per 24 h. Emits PleaFiled with the text.\n- onOracleResult(requestId, attestation, signature): only from the Intake, only for a pending plea; verify the EIP-712 signature against the signer above in the registry's domain, answerType bool, not expired; if the answer is true, the plea's seller is blessed for its amount for 15 minutes. Keep it under 200k gas (store, act later). A public submit() takes the same arguments for a missed callback, with the same checks.\n- Blessing: a sell through our pool names the seller in hookData via our router (else tx.origin); the hook asks the registry, and up to the blessed amount sells at 1% within the 15 minutes, then the blessing is spent.\n- The swarm sleeps: if no oracle answer reaches the registry for 24 h, every sell pays 1% until the next answer, so holders are never stuck if the oracle goes quiet.\n\nSITE\nBuy/sell PRAY vs FWA through our router; the plea form (approve 0.5 IMD, file the plea on chain, watch the panel vote live via https://api.imd.fun/oracle/requests, then sell with the blessing); a public feed of every plea with its text, verdict and the panel's votes; the sinners' tax collected and PRAY burned; swarm awake/asleep countdown; buyback button. Dark, candle-lit, minimal.\n\nTESTS\nFee per path (buy, blessed sell, unblessed sell, sleeping swarm) and the launch decay; 90/10 split exact; callbacks not from the Intake, unknown request ids, wrong signer or domain, expired, false answers, reused, wrong-seller or over-amount blessings all fail; plea text is escaped into valid JSON; one blessing per 24 h; sleep after 24 h without an oracle answer and wake on the next; buyback limits and burns; no function moves FWA or PRAY anywhere else. Mainnet fork: buy, blessed sell and unblessed sell through the real PoolManager with the hook, and verify a real attestation from the IMD oracle signer. Independent review.","parentJobId":null,"planHash":"50857cc99fa98bb2e82aa59ec7e057d0d3f1d7a663fb5d0fd65037305bd8f1e9","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"46c695fa-7061-4e9f-a06a-659e1f72ee3b","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1024-pray-symbol-pray"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51187","feedbackHash":"40ba2425c1f06ccdf3635b1bdec124bfacd4e049016f6a6c420dead86f02077e","nodeKey":"build_contract_project","submissionHash":"88eb13467209315434218c2a8999c40107c0aecfc8c5031752f54a61631e9dba","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51191","feedbackHash":"7088b3bd5234764915ea846fc644ae255671eeba1436be3bd5919f8db1fe0eaa","nodeKey":"build_contract_project","submissionHash":"27ff85e7466d223540d24f5ff505e393d63113d055613ab2c6d6cd069785c054","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"1e46a05f9a0b28c38ba64f556a1352194a39089e579bcd17941f94696ab78204","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e8f1969b1b8ff9d4","findings":[],"hash":"004da0efb22b61e0efe1e4dd2ce6194952885710978bea65e2ac84885ea70109","nodeId":"d13b60bb-37a1-4198-862a-6ade70f3621b","outcome":"failed","summary":"needs input: The required pool.initialPrice (decimal sqrtPriceX96) is not specified. deployment-parameters.json leaves it to launch policy, but no policy price is supplied. The hook accepts any valid initial price; the 1:1 price in tests is only a fixture. The manifest schema permits no price placeholder, and choosing a launch valuation would require guessing. — What decimal sqrtPriceX96 should pool.initialPrice use for the Ethereum PRAY/FWA launch?","treeHash":null,"usage":{"cachedInputTokens":479104,"inputTokens":58468,"model":"gpt-6-astra","outputTokens":2143,"runtime":"codex","turns":3,"wallClockMs":106978}},{"artifacts":[],"attempt":1,"bundleHash":"9370f0a4f9c5fb1ac767d46b3a7daa7445414f8749be5b497f52678992924a23","device":"96f910d48c47b222","findings":[],"hash":"27ff85e7466d223540d24f5ff505e393d63113d055613ab2c6d6cd069785c054","nodeId":"796a64a2-be19-4d86-a1f1-e1b9c778288a","outcome":"completed","summary":"Implemented PRAY’s contracts, site, launch tooling, vendored dependencies, and documentation. Independent review completed; all findings repaired.\n\nPassed: `forge build`, `forge test`, `forge fmt --check`, 39 delivered Solidity tests, two mainnet-fork tests, six site tests, and browser flows.\n\nMainnet deployment and public hosting remain pending the launch service’s live addresses.\n\n[Documentation](/home/imd-worker/.identitymd/work/46c695fa-7061-4e9f-a06a-659e1f72ee3b/796a64a2-be19-4d86-a1f1-e1b9c778288a/README.md) · [Independent review](/home/imd-worker/.identitymd/work/46c695fa-7061-4e9f-a06a-659e1f72ee3b/796a64a2-be19-4d86-a1f1-e1b9c778288a/docs/INDEPENDENT_REVIEW.md)","treeHash":"eebbc18665bcc6311de1a93d700123646c67ccc9","usage":{"cachedInputTokens":9230464,"inputTokens":283968,"model":"gpt-6-astra","outputTokens":87245,"runtime":"codex","turns":14,"wallClockMs":4388720}},{"artifacts":[],"attempt":2,"bundleHash":"70515e16b0da47ef709886f1414bb2e96c25e94eac7940d9f4771b7fb7e37be8","device":"61794f1d37e04d2f","findings":[],"hash":"88eb13467209315434218c2a8999c40107c0aecfc8c5031752f54a61631e9dba","nodeId":"796a64a2-be19-4d86-a1f1-e1b9c778288a","outcome":"completed","summary":"Implemented the contracts, site, tests, vendored dependencies, and launch handoff. Fixed the arbitrary-payer router flaw.\n\nPassed: `forge build`, `forge fmt --check`, 71 local tests, and 3 mainnet fork tests. Real oracle-signature verification and independent review are documented.\n\nDeployment and hosting remain with the launch workflow; no live addresses were fabricated.\n\nDetails: [README.md](/home/imd-worker/.identitymd/work/46c695fa-7061-4e9f-a06a-659e1f72ee3b/796a64a2-be19-4d86-a1f1-e1b9c778288a/README.md).","treeHash":"3f6ffaa2026687e23bfd98a156f6ae13f603412d","usage":{"cachedInputTokens":8841856,"inputTokens":179393,"model":"gpt-6-astra","outputTokens":61102,"runtime":"codex","turns":16,"wallClockMs":2476196}}],"verification":[{"checks":[{"durationMs":4215,"exitCode":0,"name":"build","output":"Compiling 119 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.04s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/PrayRouter.sol:40:57\n   │\n40 │     constructor(IPoolManager manager_, IPrayPool hook_, address fwa_) {\n   │                                                         ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-events-arithmetic]: `lastAnswerAt` is changed without an event but is used in arithmetic\n    ╭▸ src/PleaRegistry.sol:105:9\n    │\n105 │         lastAnswerAt = uint64(block.timestamp);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PrayRouter.sol:47:54\n   │\n47 │         if (trade.amount == 0 || trade.limit == 0 || block.timestamp > trade.deadline) revert InvalidTrade();\n   │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n   ╭▸ src/PrayRouter.sol:80:9\n   │\n80 │         IERC20(Currency.unwrap(inputCurrency)).safeTransferFrom(payer, address(manager), paid);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PleaRegistry.sol:28:38\n   │\n28 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/PrayRouter.sol:72:24\n   │\n72 │         uint256 paid = uint256(-int256(input));\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/PrayRouter.sol:73:28\n   │\n73 │         uint256 received = uint128(output);\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[unused-return]: return value of an external call is not used\n   ╭▸ src/PrayRouter.sol:81:9\n   │\n81 │         manager.settle();\n   │         ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/PleaText.sol:14:25\n   │\n14 │         for (uint256 i; i < s.length;) {\n   │                         ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:32:17\n   │\n32 │                 revert InvalidText();\n   │                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:34:35\n   │\n34 │             if (i + n > s.length) revert InvalidText();\n   │                                   ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:37:42\n   │\n37 │                 if (next & 0xc0 != 0x80) revert InvalidText();\n   │                                          ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:43:15\n   │\n43 │             ) revert InvalidText();\n   │               ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:105:24\n    │\n105 │         lastAnswerAt = uint64(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:109:27\n    │\n109 │         return started && block.timestamp >= uint256(lastAnswerAt) + 24 hours;\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/PleaRegistry.sol:114:16\n    │\n114 │         return block.timestamp < b.expiresAt ? b.remaining : 0;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/PleaText.sol:54:13\n   │\n54 │         out[k++] = '\"';\n   │             ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PleaText.sol:63:23\n   │\n63 │                     ? bytes1(\"b\")\n   │                       ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:64:32\n   │\n64 │                     : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:64:56\n   │\n64 │                     : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                        ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:64:80\n   │\n64 │                     : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                                                ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:64:94\n   │\n64 │                     : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                                                              ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:128:29\n    │\n128 │         if (granted != 0 && block.timestamp < uint256(granted) + 24 hours) revert DailyLimit();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:101:16\n    │\n101 │           return abi.encodePacked(\n    │ ┏━━━━━━━━━━━━━━━━┛\n102 │ ┃             '{\"answerType\":\"bool\",\"chainId\":1,\"definitions\":{\"rubric\":',\n103 │ ┃             quote(RUBRIC),\n104 │ ┃             '},\"evidence\":\"panel\",\"question\":',\n105 │ ┃             quote(q),\n106 │ ┃             ',\"v\":1,\"window\":{\"fromBlock\":'\n107 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PleaRegistry.sol:149:9\n    │\n149 │         emit PleaFiled(id, requestId, msg.sender, amount, text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:113:17\n    │\n113 │                 abi.encodePacked(pre, Strings.toString(from), ',\"toBlock\":', Strings.toString(to), \"}}\")\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:118:16\n    │\n118 │           return abi.encodePacked(\n    │ ┏━━━━━━━━━━━━━━━━┛\n119 │ ┃             '{\"v\":1,\"chainId\":1,\"window\":{\"hours\":1},\"answerType\":\"bool\",',\n120 │ ┃             '\"evidence\":\"panel\",\"panelSize\":7,\"quorum\":5,\"validForSeconds\":900,\"consumer\":{\"chainId\":1,\"verifyingContract\":\"',\n121 │ ┃             Strings.toHexString(registry),\n    ‡ ┃\n126 │ ┃             \"}\"\n127 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:148:30\n    │\n148 │             Plea(msg.sender, uint64(block.timestamp), Verdict.Pending, uint128(amount), document, requestId);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/PleaRegistry.sol:148:72\n    │\n148 │             Plea(msg.sender, uint64(block.timestamp), Verdict.Pending, uint128(amount), document, requestId);\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/BurnVault.sol:57:35\n   │\n57 │         if (lastBuybackAt != 0 && block.timestamp < uint256(lastBuybackAt) + 60) revert Cooldown();\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/BurnVault.sol:68:9\n   │\n68 │         emit BoughtAndBurned(msg.sender, spend, reward, burned);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BurnVault.sol:62:25\n   │\n62 │         lastBuybackAt = uint64(block.timestamp);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' 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/BurnVault.sol:81:18\n   │\n81 │                 -int256(spend),\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/BurnVault.sol:88:23\n   │\n88 │         if (input != -int256(spend) || output <= 0 || uint128(output) < minimumPray) revert Slippage();\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/BurnVault.sol:88:55\n   │\n88 │         if (input != -int256(spend) || output <= 0 || uint128(output) < minimumPray) revert Slippage();\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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BurnVault.sol:91:67\n   │\n91 │         manager.take(Currency.wrap(address(pray)), address(this), uint128(output));\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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BurnVault.sol:92:19\n   │\n92 │         pray.burn(uint128(output));\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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BurnVault.sol:93:27\n   │\n93 │         return abi.encode(uint256(uint128(output)));\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/BurnVault.sol:93:35\n   │\n93 │         return abi.encode(uint256(uint128(output)));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:187:13\n    │\n187 │         if (block.timestamp >= uint256(p.filedAt) + PENDING_LIFETIME) revert NotExpired();\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/PleaRegistry.sol:202:33\n    │\n202 │             if (granted != 0 && block.timestamp < uint256(granted) + 24 hours) revert DailyLimit();\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/PleaRegistry.sol:206:9\n    │\n206 │         emit PleaJudged(id, a.requestId, approved, a.panelJobId, a.agreed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:199:24\n    │\n199 │         lastAnswerAt = uint64(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/PleaRegistry.sol:204:36\n    │\n204 │                 Blessing(p.amount, uint64(block.timestamp + 15 minutes), uint64(block.timestamp));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/PleaRegistry.sol:204:74\n    │\n204 │                 Blessing(p.amount, uint64(block.timestamp + 15 minutes), uint64(block.timestamp));\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:211:45\n    │\n211 │         if (p.verdict != Verdict.Pending || block.timestamp < uint256(p.filedAt) + PENDING_LIFETIME) {\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:223:24\n    │\n223 │         b.remaining -= uint128(amount);\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[missing-events-arithmetic]: `cumulativeTick` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:266:9\n    │\n266 │         cumulativeTick += int128(lastTick) * int128(uint128(time - lastTime));\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTime` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:267:9\n    │\n267 │         lastTime = time;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:222:9\n    │\n222 │         (, lastTick,,) = poolManager.getSlot0(poolId);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/Hook.sol:71:40\n   │\n71 │     constructor(IPoolManager manager_, address token_, address factory_) BaseHook(manager_) {\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Hook.sol:123:9\n    │\n123 │         emit Launched(PoolId.unwrap(poolId), address(registry), address(router), address(vault));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:117:22\n    │\n117 │         launchedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/Hook.sol:118:20\n    │\n118 │         lastTime = uint64(block.timestamp);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Hook.sol:129:16\n    │\n129 │         return elapsed >= 30 minutes ? 100 : uint16(5000 - 4900 * elapsed / 30 minutes);\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:129:46\n    │\n129 │         return elapsed >= 30 minutes ? 100 : uint16(5000 - 4900 * elapsed / 30 minutes);\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Hook.sol:186:24\n    │\n186 │         _setContext(3, blessed ? 1 : 0);\n    │                        ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Hook.sol:187:24\n    │\n187 │         _setContext(4, fee);\n    │                        ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:154:68\n    │\n154 │             p.amountSpecified == 0 || p.amountSpecified <= -int256(uint256(uint128(type(int128).max)))\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/Hook.sol:154:76\n    │\n154 │             p.amountSpecified == 0 || p.amountSpecified <= -int256(uint256(uint128(type(int128).max)))\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:155:47\n    │\n155 │                 || p.amountSpecified > int256(uint256(uint128(type(int128).max)))\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/Hook.sol:155:55\n    │\n155 │                 || p.amountSpecified > int256(uint256(uint128(type(int128).max)))\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:169:65\n    │\n169 │                     allowance != 0 && (p.amountSpecified > 0 || uint256(-p.amountSpecified) <= allowance);\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/Hook.sol:177:30\n    │\n177 │             uint256 amount = uint256(p.amountSpecified < 0 ? -p.amountSpecified : p.amountSpecified);\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/Hook.sol:179:23\n    │\n179 │             if (fee > uint128(type(int128).max) || (p.amountSpecified < 0 && fee >= amount)) {\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:189:63\n    │\n189 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Hook.sol:189:70\n    │\n189 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Hook.sol:245:9\n    │\n245 │         emit HookFee(seller, buy, fee, burnShare, treasury, rate);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:208:47\n    │\n208 │         int256 expected = p.amountSpecified + int256(beforeFee);\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/Hook.sol:212:23\n    │\n212 │         uint16 rate = uint16(_context(2));\n    │                       ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' 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/Hook.sol:213:34\n    │\n213 │         address seller = address(uint160(_context(1)));\n    │                                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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/Hook.sol:217:32\n    │\n217 │                 buy ? _ceilFee(uint256(-int256(fd)), rate, 10000 - rate) : _ceilFee(uint128(fd), rate, 10000);\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/Hook.sol:217:85\n    │\n217 │                 buy ? _ceilFee(uint256(-int256(fd)), rate, 10000 - rate) : _ceilFee(uint128(fd), rate, 10000);\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:219:19\n    │\n219 │         if (fee > uint128(type(int128).max)) revert InvalidSwap();\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:220:56\n    │\n220 │         if (_context(3) != 0) registry.consume(seller, uint256(-int256(td)));\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/Hook.sol:224:71\n    │\n224 │         return (IHooks.afterSwap.selector, fwaSpecified ? int128(0) : int128(int256(fee)));\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/Hook.sol:224:78\n    │\n224 │         return (IHooks.afterSwap.selector, fwaSpecified ? int128(0) : int128(int256(fee)));\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[reentrancy-no-eth]: external call can be reentered before `redeeming` is updated\n    ╭▸ src/Hook.sol:251:9\n    │\n251 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/Hook.sol:251:9\n    │\n251 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:265:23\n    │\n265 │         uint64 time = uint64(block.timestamp);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/Hook.sol:290:17\n    │\n290 │         input = input * 9875 / 10000; // The immutable 1.25% LP fee.\n    │                 ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Hook.sol:280:17\n    │\n280 │             if (block.timestamp >= uint256(o.time) + 30 minutes && o.time > old.time) old = o;\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:284:57\n    │\n284 │             int256(cumulativeTick) + int256(lastTick) * int256(block.timestamp - lastTime) - old.cumulative;\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/Hook.sol:285:26\n    │\n285 │         int256 elapsed = int256(block.timestamp - old.time);\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/Hook.sol:286:26\n    │\n286 │         int24 meanTick = int24(sum / elapsed);\n    │                          ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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/PrayBase.t.sol:128:20\n    │\n128 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:51:9\n    │\n 51 │         vm.warp(initialTime + 1800);\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/PrayBase.t.sol:158:29\n    │\n158 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:83:9\n    │\n 83 │         vm.warp(block.timestamp + 15 minutes);\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/PrayBase.t.sol:159:30\n    │\n159 │         a.expiresAt = uint64(block.timestamp + 900);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:83:9\n    │\n 83 │         vm.warp(block.timestamp + 15 minutes);\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/Hook.t.sol:83:17\n   │\n83 │         vm.warp(block.timestamp + 15 minutes);\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/PrayBase.t.sol:128:20\n    │\n128 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:223:9\n    │\n223 │         vm.warp(initialTime + 1800);\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/PrayBase.t.sol:128:20\n    │\n128 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:249:9\n    │\n249 │         vm.warp(initialTime + 1800);\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/PrayBase.t.sol:158:29\n    │\n158 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:63:9\n    │\n 63 │         vm.warp(block.timestamp + 30);\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/PrayBase.t.sol:159:30\n    │\n159 │         a.expiresAt = uint64(block.timestamp + 900);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:63:9\n    │\n 63 │         vm.warp(block.timestamp + 30);\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/Registry.t.sol:63:17\n   │\n63 │         vm.warp(block.timestamp + 30);\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/Registry.t.sol:177:17\n    │\n177 │         vm.warp(block.timestamp + 1 hours);\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/PrayBase.t.sol:158:29\n    │\n158 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:192:9\n    │\n192 │         vm.warp(block.timestamp + 24 hours - 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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/PrayBase.t.sol:159:30\n    │\n159 │         a.expiresAt = uint64(block.timestamp + 900);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:192:9\n    │\n192 │         vm.warp(block.timestamp + 24 hours - 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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Registry.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 24 hours - 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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Registry.t.sol:195:17\n    │\n195 │         vm.warp(block.timestamp + 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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Registry.t.sol:203:17\n    │\n203 │         vm.warp(block.timestamp + 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":753,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Token.t.sol:TokenTest\n[PASS] test_standardSupplyTransferAndBurn() (gas: 172875)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 447.02µs (317.39µs CPU time)\n\nRan 3 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_questionHashMatchesLiveOracleCanonicalDocument() (gas: 4555)\n[PASS] test_realMainnetOracleSignerAndWrongDomain() (gas: 901289)\n[PASS] test_registryDigestAndSelectorMatchProtocolVector() (gas: 751571)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 708.12µs (983.68µs CPU time)\n\nRan 1 test for test/Ordering.t.sol:FwaCurrencyOneTest\n[PASS] test_fourSwapModesBlessingAndBuybackForThisCurrencyOrder() (gas: 3657703)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.31ms (3.34ms CPU time)\n\nRan 1 test for test/FreshManager.t.sol:FreshManagerTest\n[PASS] test_feeClaimFallbackOnManagerWithNoFwaThenPermissionlessRedemption() (gas: 478577)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 20.86ms (327.19µs CPU time)\n\nRan 1 test for test/Ordering.t.sol:FwaCurrencyZeroTest\n[PASS] test_fourSwapModesBlessingAndBuybackForThisCurrencyOrder() (gas: 3657595)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 22.82ms (4.66ms CPU time)\n\nRan 13 tests for test/Registry.t.sol:RegistryTest\n[PASS] test_amountTextAndBalanceGuards() (gas: 4890426)\n[PASS] test_approvalCallbackUnder200kAndSeparatePublicSubmit() (gas: 3817379)\n[PASS] test_crossPleaSubstitutionAndUnrelatedQuestionFail() (gas: 3598511)\n[PASS] test_expiryTypeChainAndQuorumGuards() (gas: 2658278)\n[PASS] test_falseAnswerIsStoredAndCannotBless() (gas: 3599318)\n[PASS] test_maxEscapedPleaCallbackFitsStipend() (gas: 5904690)\n[PASS] test_oneBlessingPer24HoursNotCalendarDay() (gas: 3818718)\n[PASS] test_oneOpenPleaAndTimeoutWithoutRefund() (gas: 3599641)\n[PASS] test_onlyHookConsumesBlessingAndStartsClock() (gas: 2353460)\n[PASS] test_paysExactlyHalfImdAndBuildsValidEscapedJson() (gas: 2157682)\n[PASS] test_sleepExactlyAfter24HoursAndWakeOnNextFalseAnswer() (gas: 2225672)\n[PASS] test_unknownSettledAndReusedRequestIdsFail() (gas: 3748890)\n[PASS] test_wrongSignerDomainAndTamperedAnswerFail() (gas: 2276739)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 27.94ms (52.56ms CPU time)\n\nRan 1 test for test/Runtime.t.sol:RuntimeTest\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 5251635)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 29.34ms (7.19ms CPU time)\n\nRan 17 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_feeAndConservation(uint96,bool,bool,uint16) (runs: 256, μ: 354819, ~: 358525)\n[PASS] test_blessedSellBothModesAndSpent() (gas: 3484638)\n[PASS] test_blessingExpiresAtBoundary() (gas: 2633087)\n[PASS] test_buyAtLaunchBothModes() (gas: 672604)\n[PASS] test_buybackCannotIgnoreHistoricalPriceFloor() (gas: 891109)\n[PASS] test_buybackCapCooldownRewardAndTrueBurn() (gas: 963797)\n[PASS] test_callbacksAndInitializationAccess() (gas: 18737068)\n[PASS] test_fwaRejectsWalletTransfersButSwapSettles() (gas: 404308)\n[PASS] test_linearDecayHalfwayAndEnd() (gas: 1052256)\n[PASS] test_noAdministrativeOrRescueFunctions() (gas: 378722)\n[PASS] test_partialFillsAndSlippageRevertAtomically() (gas: 406046)\n[PASS] test_routerDeadlineAndCannotSpendAnotherWallet() (gas: 282492)\n[PASS] test_sleepingSellsBothModes() (gas: 727237)\n[PASS] test_unblessedSellBothModes() (gas: 697458)\n[PASS] test_untrustedRouterCannotSpoofSeller() (gas: 3951483)\n[PASS] test_untrustedRouterUsesOriginBlessing() (gas: 3928282)\n[PASS] test_wrongSellerAndOverAmountCannotUseCheapRate() (gas: 2856015)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 45.19ms (69.34ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_allFeesHaveExactlyOneDestination() (runs: 64, calls: 2048, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| SwapHandler | trade    | 2048  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 660.97ms (620.31ms CPU time)\n\nRan 9 test suites in 662.36ms (815.58ms CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BurnVault.buyback()\",\"BurnVault.buyback(uint256)\",\"BurnVault.unlockCallback(bytes)\",\"Hook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"Hook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"Hook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"Hook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"Hook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Hook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"Hook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"Hook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"Hook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"Hook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"Hook.redeemTreasury()\",\"Hook.unlockCallback(bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.burn(uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"PleaRegistry.consume(address,uint256)\",\"PleaRegistry.expire(uint256)\",\"PleaRegistry.filePlea(uint256,string)\",\"PleaRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"PleaRegistry.start()\",\"PleaRegistry.submit(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"PrayRouter.swap((bool,bool,uint128,uint128,uint160,uint64,uint16))\",\"PrayRouter.unlockCallback(bytes)\"],\"files\":{\".gitignore\":5,\"LICENSE\":23,\"README.md\":123,\"deployment/launch-spec.json\":15,\"docs/DEPENDENCIES.md\":21,\"docs/INDEPENDENT_REVIEW.md\":66,\"docs/VERIFICATION.md\":61,\"foundry.toml\":23,\"integration/Mainnet.t.sol\":101,\"remappings.txt\":6,\"scripts/configure-site.cjs\":66,\"scripts/prepare-launch.cjs\":29,\"scripts/site.test.mjs\":40,\"site/abi.json\":1,\"site/app.mjs\":168,\"site/deployment.json\":1,\"site/index.html\":76,\"site/logic.mjs\":15,\"site/style.css\":4,\"site/vendor/ETHERS-LICENSE.md\":21,\"site/vendor/ethers.umd.min.js\":1,\"src/BurnVault.sol\":95,\"src/Hook.sol\":304,\"src/HookFlags.sol\":30,\"src/LaunchToken.sol\":16,\"src/OracleAttestation.sol\":239,\"src/PleaRegistry.sol\":226,\"src/PleaText.sol\":137,\"src/PrayRouter.sol\":85,\"test/Conservation.t.sol\":61,\"test/FreshManager.t.sol\":36,\"test/Hook.t.sol\":287,\"test/OracleConformance.t.sol\":98,\"test/Ordering.t.sol\":41,\"test/PrayBase.t.sol\":176,\"test/Registry.t.sol\":273,\"test/Runtime.t.sol\":24,\"test/Token.t.sol\":24,\"test/fixtures/LiveOracleFixture.sol\":48,\"test/fixtures/live-attestation.json\":1,\"test/fixtures/live-question.json\":18,\"test/fixtures/second-live-question.json\":25,\"test/mocks/MockERC20.sol\":13,\"test/mocks/MockFWA.sol\":19,\"test/mocks/MockIntake.sol\":34,\"test/mocks/MockSigner.sol\":16},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4131,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/PrayRouter.sol:54: PrayRouter.unlockCallback(bytes) (src/PrayRouter.sol#54-84) uses arbitrary from in transferFrom: IERC20(Currency.unwrap(inputCurrency)).safeTransferFrom(payer,address(manager),paid) (src/PrayRouter.sol#80)\n[high/medium] weak-prng at src/Hook.sol:276: Hook.buybackFloor(uint256) (src/Hook.sol#276-303) uses a weak PRNG: \"sum < 0 && sum % elapsed != 0 (src/Hook.sol#287)\"\n[medium/medium] divide-before-multiply at src/Hook.sol:276: Hook.buybackFloor(uint256) (src/Hook.sol#276-303) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/Hook.sol:276: Hook.buybackFloor(uint256) (src/Hook.sol#276-303) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Hook.sol:146: Hook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/Hook.sol#146-190) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/Hook.sol:248: Reentrancy in Hook.redeemTreasury() (src/Hook.sol#248-253):\n[medium/medium] uninitialized-local at src/Hook.sol:277: Hook.buybackFloor(uint256).old (src/Hook.sol#277) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PleaText.sol:20: PleaText.validate(bytes).n (src/PleaText.sol#20) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Hook.sol:161: Hook._beforeSwap(address,PoolKey,SwapParams,bytes).blessed (src/Hook.sol#161) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Hook.sol:175: Hook._beforeSwap(address,PoolKey,SwapParams,bytes).fee (src/Hook.sol#175) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PleaText.sol:21: PleaText.validate(bytes).code (src/PleaText.sol#21) is a local variable never initialized\n[medium/medium] unused-return at src/Hook.sol:248: Hook.redeemTreasury() (src/Hook.sol#248-253) ignores return value by poolManager.unlock() (src/Hook.sol#251)\n[medium/medium] unused-return at src/PrayRouter.sol:54: PrayRouter.unlockCallback(bytes) (src/PrayRouter.sol#54-84) ignores return value by manager.settle() (src/PrayRouter.sol#81)\n[medium/medium] unused-return at src/Hook.sol:192: Hook._afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#192-225) ignores return value by (None,lastTick,None,None) = poolManager.getSlot0(poolId) (src/Hook.sol#222)\n[medium/high] write-after-write at src/PrayRouter.sol:25: PrayRouter.active (src/PrayRouter.sol#25) is written in both\n[low/medium] missing-zero-check at src/PrayRouter.sol:40: PrayRouter.constructor(IPoolManager,IPrayPool,address).fwa_ (src/PrayRouter.sol#40) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/BurnVault.sol:56: Reentrancy in BurnVault.buyback(uint256) (src/BurnVault.sol#56-69):\n[low/medium] reentrancy-benign at src/Hook.sol:231: Reentrancy in Hook._collect(uint256,address,bool,uint16) (src/Hook.sol#231-246):\n[low/medium] reentrancy-benign at src/PrayRouter.sol:46: Reentrancy in PrayRouter.swap(PrayRouter.Trade) (src/PrayRouter.sol#46-52):\n[low/medium] reentrancy-benign at src/Hook.sol:192: Reentrancy in Hook._afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#192-225):\n[low/medium] reentrancy-benign at src/Hook.sol:231: Reentrancy in Hook._collect(uint256,address,bool,uint16) (src/Hook.sol#231-246):\n[low/medium] reentrancy-benign at src/PleaRegistry.sol:117: Reentrancy in PleaRegistry.filePlea(uint256,string) (src/PleaRegistry.sol#117-150):\n[low/medium] reentrancy-events at src/Hook.sol:103: Reentrancy in Hook._beforeInitialize(address,PoolKey,uint160) (src/Hook.sol#103-125):\n[low/medium] reentrancy-events at src/Hook.sol:192: Reentrancy in Hook._afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#192-225):\n[low/medium] reentrancy-events at src/Hook.sol:231: Reentrancy in Hook._collect(uint256,address,bool,uint16) (src/Hook.sol#231-246):\n[low/medium] timestamp at src/Hook.sol:127: Hook.buyFeeBps() (src/Hook.sol#127-130) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:112: PleaRegistry.available(address) (src/PleaRegistry.sol#112-115) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:117: PleaRegistry.filePlea(uint256,string) (src/PleaRegistry.sol#117-150) uses timestamp for comparisons\n[low/medium] timestamp at src/PrayRouter.sol:46: PrayRouter.swap(PrayRouter.Trade) (src/PrayRouter.sol#46-52) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:209: PleaRegistry.expire(uint256) (src/PleaRegistry.sol#209-217) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:264: Hook._observe() (src/Hook.sol#264-273) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:181: PleaRegistry._answer(bytes32,OracleAttestation.Attestation,bytes) (src/PleaRegistry.sol#181-207) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:146: Hook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/Hook.sol#146-190) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:152: PleaRegistry.expectedQuestionHash(uint256,uint64,uint64) (src/PleaRegistry.sol#152-162) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:108: PleaRegistry.sleeping() (src/PleaRegistry.sol#108-110) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:103: Hook._beforeInitialize(address,PoolKey,uint160) (src/Hook.sol#103-125) uses timestamp for comparisons\n[low/medium] timestamp at src/BurnVault.sol:56: BurnVault.buyback(uint256) (src/BurnVault.sol#56-69) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:276: Hook.buybackFloor(uint256) (src/Hook.sol#276-303) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:164: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#164-175) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/PrayRouter.sol:54: PrayRouter.unlockCallback(bytes) (src/PrayRouter.sol#54-84) uses arbitrary from in transferFrom: IERC20(Currency.unwrap(inputCurrency)).safeTransferFrom(payer,address(manager),paid) (src/PrayRouter.sol#80)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"27ff85e7466d223540d24f5ff505e393d63113d055613ab2c6d6cd069785c054","verifiedTreeHash":"eebbc18665bcc6311de1a93d700123646c67ccc9","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":32322,"exitCode":0,"name":"build","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 32.14s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/Registry.t.sol:224:5:\n    |\n224 |     function testFuzzJsonEscapeRoundTrip(bytes calldata raw) public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-events-access-control]: `active` is changed without an event but is used for access control\n   ╭▸ src/PrayRouter.sol:64:16\n   │\n64 │         delete active;\n   │                ━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:31:17\n   │\n31 │                 revert InvalidText();\n   │                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:33:36\n   │\n33 │             if (i + n >= s.length) revert InvalidText();\n   │                                    ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:36:43\n   │\n36 │                 if (d < 0x80 || d > 0xbf) revert InvalidText();\n   │                                           ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PrayRouter.sol:42:13\n   │\n42 │             block.timestamp > trade.deadline || trade.maxInput == 0\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PleaText.sol:42:15\n   │\n42 │             ) revert InvalidText();\n   │               ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[missing-events-access-control]: `active` is changed without an event but is used for access control\n   ╭▸ src/BurnVault.sol:58:16\n   │\n58 │         delete active;\n   │                ━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/PrayRouter.sol:56:9\n   │\n56 │         emit Traded(msg.sender, trade.buy, paid, received);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PrayRouter.sol:43:37\n   │\n43 │                 || trade.maxInput > uint256(uint128(type(int128).max)) || trade.minOutput == 0\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/PrayRouter.sol:43:45\n   │\n43 │                 || trade.maxInput > uint256(uint128(type(int128).max)) || trade.minOutput == 0\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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PleaText.sol:62:27\n   │\n62 │                         ? bytes1(\"b\")\n   │                           ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:63:36\n   │\n63 │                         : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                    ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:63:60\n   │\n63 │                         : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                            ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:63:84\n   │\n63 │                         : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                                                    ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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/PleaText.sol:63:98\n   │\n63 │                         : c == 9 ? bytes1(\"t\") : c == 10 ? bytes1(\"n\") : c == 12 ? bytes1(\"f\") : bytes1(\"r\");\n   │                                                                                                  ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/BurnVault.sol:39:50\n   │\n39 │         if (budget == 0 || budget > MAX_SPEND || block.timestamp < lastBuyback + 60) revert InvalidBuyback();\n   │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PrayRouter.sol:74:24\n   │\n74 │         uint256 paid = uint256(-int256(inputDelta));\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/PrayRouter.sol:75:28\n   │\n75 │         uint256 received = uint256(int256(outputDelta));\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/BurnVault.sol:51:9\n   │\n51 │         emit BoughtAndBurned(msg.sender, spend, reward, burned);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PrayRouter.sol:78:58\n   │\n78 │                 || (t.amountSpecified > 0 && received != uint256(t.amountSpecified))\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[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:107:16\n    │\n107 │           return abi.encodePacked(\n    │ ┏━━━━━━━━━━━━━━━━┛\n108 │ ┃             '{\"answerType\":\"bool\",\"chainId\":1,\"definitions\":{\"rubric\":\"',\n109 │ ┃             RUBRIC,\n110 │ ┃             '\"},\"evidence\":\"panel\",\"question\":\"',\n111 │ ┃             escape(q),\n112 │ ┃             '\",\"v\":1,\"window\":'\n113 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:117:16\n    │\n117 │           return abi.encodePacked(\n    │ ┏━━━━━━━━━━━━━━━━┛\n118 │ ┃             p,\n119 │ ┃             '{\"hours\":1},\"panelSize\":7,\"quorum\":5,\"validForSeconds\":900,\"consumer\":{\"chainId\":1,\"verifyingContract\":\"',\n120 │ ┃             Strings.toHexString(registry),\n121 │ ┃             '\"}}'\n122 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PleaText.sol:127:13\n    │\n127 │ ┏             abi.encodePacked(\n128 │ ┃                 p,\n129 │ ┃                 '{\"fromBlock\":',\n130 │ ┃                 Strings.toString(fromBlock),\n    ‡ ┃\n133 │ ┃                 \"}}\"\n134 │ ┃             )\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/BurnVault.sol:67:18\n   │\n67 │                 -int256(spend),\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/BurnVault.sol:74:23\n   │\n74 │         if (input != -int256(spend) || output <= 0 || uint256(int256(output)) < floor) {\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/BurnVault.sol:74:55\n   │\n74 │         if (input != -int256(spend) || output <= 0 || uint256(int256(output)) < floor) {\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/BurnVault.sol:79:26\n   │\n79 │         uint256 burned = uint256(int256(output));\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/PleaRegistry.sol:29:38\n   │\n29 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PleaRegistry.sol:83:16\n   │\n83 │         return block.timestamp >= lastAnswer + 24 hours;\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/PleaRegistry.sol:88:16\n   │\n88 │         return block.timestamp < b.until ? b.remaining : 0;\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/PleaRegistry.sol:96:43\n   │\n96 │                 || (b.lastGranted != 0 && block.timestamp < uint256(b.lastGranted) + 24 hours)\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/PleaRegistry.sol:122:9\n    │\n122 │         emit PleaFiled(id, msg.sender, requestId, amount, text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:103:13\n    │\n103 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:162:43\n    │\n162 │         if (p.status != Status.Pending || block.timestamp >= uint256(p.filedAt) + PENDING_LIFETIME) {\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/PleaRegistry.sol:180:39\n    │\n180 │             if (b.lastGranted != 0 && block.timestamp < uint256(b.lastGranted) + 24 hours) {\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/PleaRegistry.sol:187:9\n    │\n187 │ ┏         emit PleaAnswered(\n188 │ ┃             id, a.requestId, approved, a.agreed, uint64(block.timestamp + (approved ? 15 minutes : 0))\n189 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PleaRegistry.sol:184:23\n    │\n184 │             b.until = uint64(block.timestamp + 15 minutes);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/PleaRegistry.sol:185:29\n    │\n185 │             b.lastGranted = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/PleaRegistry.sol:188:50\n    │\n188 │             id, a.requestId, approved, a.agreed, uint64(block.timestamp + (approved ? 15 minutes : 0))\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PleaRegistry.sol:194:43\n    │\n194 │         if (p.status != Status.Pending || block.timestamp < uint256(p.filedAt) + PENDING_LIFETIME) {\n    │                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-arithmetic]: `cumulative` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:246:9\n    │\n246 │         cumulative += int128(int256(lastTick) * int256(elapsed));\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observedAt` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:247:9\n    │\n247 │         observedAt = uint64(block.timestamp);\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/Hook.sol:210:9\n    │\n210 │         lastTick = tick;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/Hook.sol:69:40\n   │\n69 │     constructor(IPoolManager manager_, address token_, address factory_) {\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Hook.sol:118:9\n    │\n118 │         emit PoolOpened(PoolId.unwrap(poolId), address(registry), address(router), address(vault));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:115:22\n    │\n115 │         observedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/Hook.sol:117:39\n    │\n117 │         observations[0] = Observation(uint64(block.timestamp), 0);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Hook.sol:124:16\n    │\n124 │         return elapsed >= 30 minutes ? 100 : 5000 - 4900 * elapsed / 30 minutes;\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/Hook.sol:222:9\n    │\n222 │         emit FeeCollected(seller, buy, fee, vaultPart, treasuryPart, rate);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:154:66\n    │\n154 │             blessed = available > 0 && (p.amountSpecified > 0 || uint256(-p.amountSpecified) <= available);\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/Hook.sol:166:54\n    │\n166 │             uint256 amount = p.amountSpecified < 0 ? uint256(-p.amountSpecified) : uint256(p.amountSpecified);\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/Hook.sol:166:84\n    │\n166 │             uint256 amount = p.amountSpecified < 0 ? uint256(-p.amountSpecified) : uint256(p.amountSpecified);\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/Hook.sol:170:23\n    │\n170 │             if (fee > uint256(uint128(type(int128).max))) revert InvalidSwap();\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/Hook.sol:170:31\n    │\n170 │             if (fee > uint256(uint128(type(int128).max))) revert InvalidSwap();\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:176:63\n    │\n176 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Hook.sol:176:70\n    │\n176 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Hook.sol:191:34\n    │\n191 │         address seller = address(uint160(_load(SELLER)));\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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/Hook.sol:193:67\n    │\n193 │         if (!buy && _load(BLESSED) != 0) registry.consume(seller, uint256(-int256(prayDelta)));\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/Hook.sol:198:51\n    │\n198 │             int256 expected = p.amountSpecified + int256(_load(UPFRONT));\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/Hook.sol:201:36\n    │\n201 │             uint256 amount = buy ? uint256(-int256(fwaDelta)) : uint256(int256(fwaDelta));\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/Hook.sol:201:65\n    │\n201 │             uint256 amount = buy ? uint256(-int256(fwaDelta)) : uint256(int256(fwaDelta));\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/Hook.sol:205:23\n    │\n205 │             if (fee > uint256(uint128(type(int128).max))) revert InvalidSwap();\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/Hook.sol:205:31\n    │\n205 │             if (fee > uint256(uint128(type(int128).max))) revert InvalidSwap();\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:212:44\n    │\n212 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Hook.sol:212:51\n    │\n212 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Hook.sol:240:9\n    │\n240 │         emit TreasuryPaid(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Hook.sol:248:13\n    │\n248 │         if (block.timestamp >= uint256(observations[observationIndex].time) + 60) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:246:23\n    │\n246 │         cumulative += int128(int256(lastTick) * int256(elapsed));\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/Hook.sol:246:49\n    │\n246 │         cumulative += int128(int256(lastTick) * int256(elapsed));\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/Hook.sol:247:22\n    │\n247 │         observedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/Hook.sol:250:58\n    │\n250 │             observations[observationIndex] = Observation(uint64(block.timestamp), cumulative);\n    │                                                          ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Hook.sol:255:29\n    │\n255 │         if (!initialized || block.timestamp < launchedAt + 30 minutes) revert HistoryTooShort();\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/Hook.sol:259:38\n    │\n259 │             if (o.time > old.time && uint256(o.time) + 30 minutes <= block.timestamp) old = o;\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Hook.sol:262:66\n    │\n262 │         int256 current = int256(cumulative) + int256(lastTick) * int256(block.timestamp - observedAt);\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/Hook.sol:265:37\n    │\n265 │         int256 average = sum < 0 ? -int256((uint256(-sum) + elapsed - 1) / elapsed) : sum / int256(elapsed);\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/Hook.sol:265:45\n    │\n265 │         int256 average = sum < 0 ? -int256((uint256(-sum) + elapsed - 1) / elapsed) : sum / int256(elapsed);\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/Hook.sol:265:93\n    │\n265 │         int256 average = sum < 0 ? -int256((uint256(-sum) + elapsed - 1) / elapsed) : sum / int256(elapsed);\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/Hook.sol:266:52\n    │\n266 │         uint160 sqrt = TickMath.getSqrtPriceAtTick(int24(average));\n    │                                                    ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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/TestBase.sol:205:78\n    │\n205 │         return router.swap(PrayRouter.Trade(buy, amount, max, 1, limit(buy), block.timestamp));\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:86:9\n    │\n 86 │         vm.warp(hook.launchedAt() + 900);\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/TestBase.sol:205:78\n    │\n205 │         return router.swap(PrayRouter.Trade(buy, amount, max, 1, limit(buy), block.timestamp));\n    │                                                                              ━━━━━━━━━━━━━━━\n    ‡\n250 │         vm.warp(hook.launchedAt() + 1800);\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/TestBase.sol:233:20\n    │\n233 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:174:9\n    │\n174 │         vm.warp(block.timestamp + 900);\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/TestBase.sol:234:20\n    │\n234 │             uint64(block.timestamp + 900)\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:174:9\n    │\n174 │         vm.warp(block.timestamp + 900);\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/Hook.t.sol:174:17\n    │\n174 │         vm.warp(block.timestamp + 900);\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/TestBase.sol:205:78\n    │\n205 │         return router.swap(PrayRouter.Trade(buy, amount, max, 1, limit(buy), block.timestamp));\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Hook.t.sol:178:9\n    │\n178 │         vm.warp(registry.lastAnswer() + 86400);\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/TestBase.sol:233:20\n    │\n233 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:94:9\n    │\n 94 │         vm.warp(block.timestamp + 901);\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/TestBase.sol:234:20\n    │\n234 │             uint64(block.timestamp + 900)\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:94:9\n    │\n 94 │         vm.warp(block.timestamp + 901);\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/Registry.t.sol:94:17\n   │\n94 │         vm.warp(block.timestamp + 901);\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/TestBase.sol:233:20\n    │\n233 │             uint64(block.timestamp),\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:178:9\n    │\n178 │         vm.warp(block.timestamp + 86399);\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/TestBase.sol:234:20\n    │\n234 │             uint64(block.timestamp + 900)\n    │                    ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Registry.t.sol:178:9\n    │\n178 │         vm.warp(block.timestamp + 86399);\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/Registry.t.sol:178:17\n    │\n178 │         vm.warp(block.timestamp + 86399);\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/Registry.t.sol:238:17\n    │\n238 │         vm.warp(block.timestamp + 86400);\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":340,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] testProtocolDigestSignatureAndSelector() (gas: 715841)\n[PASS] testRealMainnetSignerAttestation() (gas: 3355590)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 853.63µs (1.08ms CPU time)\n\nRan 27 tests for test/Hook.t.sol:ReverseOrderingHookTest\n[PASS] testBlessedExactOutput() (gas: 1931582)\n[PASS] testBlessedSellConsumesOnlyActualAmount() (gas: 2364991)\n[PASS] testBlessingWrongSellerDoesNotDiscount() (gas: 1923883)\n[PASS] testBuyDecayAndFreshManagerHasNoETH() (gas: 817391)\n[PASS] testBuyExactOutputAndRefund() (gas: 374951)\n[PASS] testBuybackBurnsAndPaysFromManager() (gas: 1240533)\n[PASS] testBuybackCapsHistoryAndBalance() (gas: 461553)\n[PASS] testBuybackMaximumBudgetIncludesReward() (gas: 817220)\n[PASS] testBuybackResistsSameBlockSpotManipulation() (gas: 1263573)\n[PASS] testExpiredBlessingAndSleeping() (gas: 2190648)\n[PASS] testForeignRouterCannotSpoofHookData() (gas: 1918036)\n[PASS] testFuzzSequenceConservesClaimShares(uint256) (runs: 128, μ: 3352146, ~: 3353468)\n[PASS] testFuzzSplitConservation(uint96) (runs: 128, μ: 377660, ~: 377770)\nLogs:\n  Bound result 9821025405724163615322\n\n[PASS] testFwaWalletToRouterReallyReverts() (gas: 33214)\n[PASS] testInitializationAndFlags() (gas: 16800)\n[PASS] testOneSidedPoolNoFwaCashBeforeSwap() (gas: 705179)\n[PASS] testOverAmountExactInputPaysHighAndKeepsBlessing() (gas: 1922913)\n[PASS] testOverAmountExactOutputRevertsAtomically() (gas: 1906020)\n[PASS] testPartialBuyRevertsNoUpfrontTaxLost() (gas: 326836)\n[PASS] testRejectOtherPoolAndReinitialize() (gas: 78493)\n[PASS] testRouterCannotPullVictimAllowance() (gas: 396870)\n[PASS] testRouterSlippageDeadlineAndFailedRefundAtomicity() (gas: 401262)\n[PASS] testSplitAndTreasuryOnlyFixedRecipient() (gas: 539911)\n[PASS] testSupplyTransferAndBurn() (gas: 134096)\n[PASS] testUnauthorizedCallbacks() (gas: 180808)\n[PASS] testUnblessedSellExactInput() (gas: 354959)\n[PASS] testUnblessedSellExactOutput() (gas: 357808)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 211.61ms (226.46ms CPU time)\n\nRan 15 tests for test/Registry.t.sol:RegistryTest\n[PASS] testCallbackUnknownRequestAndUnauthorized() (gas: 1498545)\n[PASS] testCallbackWithinStipendAndPublicFallback() (gas: 2551650)\n[PASS] testEscapedTextIsValidJson() (gas: 1397628)\n[PASS] testExpirePendingNoRefundAndWakeOnNextAnswer() (gas: 2813848)\n[PASS] testExpiredAndFutureAttestations() (gas: 1516777)\n[PASS] testFalseAnswerStoresVerdictAndDoesNotBless() (gas: 1540623)\n[PASS] testFilePleaPaysAndPinsTemplate() (gas: 1506099)\n[PASS] testFuzzJsonEscapeRoundTrip(bytes) (runs: 128, μ: 49053, ~: 53873)\n[PASS] testMaxEscapedTextCallbackUnder200k() (gas: 5787991)\n[PASS] testOneOpenAndOneBlessingPer24Hours() (gas: 2535656)\n[PASS] testOnlyHookCanConsume() (gas: 1681728)\n[PASS] testPleaSizeLimitBalanceAndUtf8() (gas: 1567901)\n[PASS] testReplayAndWrongPleaCannotBorrowApproval() (gas: 2534474)\n[PASS] testWrongSignerAndDomain() (gas: 1603694)\n[PASS] testWrongTypeChainPanelAndWindow() (gas: 1808081)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 211.61ms (194.42ms CPU time)\n\nRan 27 tests for test/Hook.t.sol:HookTest\n[PASS] testBlessedExactOutput() (gas: 1931570)\n[PASS] testBlessedSellConsumesOnlyActualAmount() (gas: 2364979)\n[PASS] testBlessingWrongSellerDoesNotDiscount() (gas: 1923871)\n[PASS] testBuyDecayAndFreshManagerHasNoETH() (gas: 817391)\n[PASS] testBuyExactOutputAndRefund() (gas: 374951)\n[PASS] testBuybackBurnsAndPaysFromManager() (gas: 1240533)\n[PASS] testBuybackCapsHistoryAndBalance() (gas: 461553)\n[PASS] testBuybackMaximumBudgetIncludesReward() (gas: 817220)\n[PASS] testBuybackResistsSameBlockSpotManipulation() (gas: 1263573)\n[PASS] testExpiredBlessingAndSleeping() (gas: 2190636)\n[PASS] testForeignRouterCannotSpoofHookData() (gas: 1918036)\n[PASS] testFuzzSequenceConservesClaimShares(uint256) (runs: 128, μ: 3352229, ~: 3353879)\n[PASS] testFuzzSplitConservation(uint96) (runs: 128, μ: 377643, ~: 377752)\nLogs:\n  Bound result 7507626885104787109663\n\n[PASS] testFwaWalletToRouterReallyReverts() (gas: 33214)\n[PASS] testInitializationAndFlags() (gas: 16800)\n[PASS] testOneSidedPoolNoFwaCashBeforeSwap() (gas: 705179)\n[PASS] testOverAmountExactInputPaysHighAndKeepsBlessing() (gas: 1922925)\n[PASS] testOverAmountExactOutputRevertsAtomically() (gas: 1906032)\n[PASS] testPartialBuyRevertsNoUpfrontTaxLost() (gas: 326836)\n[PASS] testRejectOtherPoolAndReinitialize() (gas: 78493)\n[PASS] testRouterCannotPullVictimAllowance() (gas: 396870)\n[PASS] testRouterSlippageDeadlineAndFailedRefundAtomicity() (gas: 401262)\n[PASS] testSplitAndTreasuryOnlyFixedRecipient() (gas: 539911)\n[PASS] testSupplyTransferAndBurn() (gas: 134096)\n[PASS] testUnauthorizedCallbacks() (gas: 180808)\n[PASS] testUnblessedSellExactInput() (gas: 354959)\n[PASS] testUnblessedSellExactOutput() (gas: 357808)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 211.65ms (207.48ms CPU time)\n\nRan 4 test suites in 213.02ms (635.73ms CPU time): 71 tests passed, 0 failed, 0 skipped (71 total tests)\n","passed":true},{"durationMs":56,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BurnVault.buyback(uint256)\",\"BurnVault.unlockCallback(bytes)\",\"Hook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Hook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"Hook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"Hook.redeemTreasury()\",\"Hook.unlockCallback(bytes)\",\"PleaRegistry.consume(address,uint256)\",\"PleaRegistry.expire(uint256)\",\"PleaRegistry.filePlea(uint256,string)\",\"PleaRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"PleaRegistry.submit(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"PrayRouter.swap((bool,int256,uint256,uint256,uint160,uint256))\",\"PrayRouter.unlockCallback(bytes)\",\"Token.approve(address,uint256)\",\"Token.burn(uint256)\",\"Token.transfer(address,uint256)\",\"Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":15,\"README.md\":110,\"deployment-parameters.json\":10,\"docs/REVIEW.md\":54,\"docs/VALIDATION.md\":42,\"fork/Mainnet.t.sol\":51,\"foundry.toml\":19,\"remappings.txt\":4,\"scripts/check-build.mjs\":15,\"scripts/check-oracle.mjs\":11,\"scripts/configure-site.mjs\":18,\"scripts/mine-hook.mjs\":9,\"site/app.js\":61,\"site/deployment.json\":7,\"site/index.html\":23,\"site/style.css\":1,\"site/vendor/ethers.LICENSE.md\":21,\"site/vendor/ethers.js\":1,\"src/BurnVault.sol\":84,\"src/Hook.sol\":281,\"src/HookFlags.sol\":30,\"src/IPrayPool.sol\":10,\"src/OracleAttestation.sol\":239,\"src/PleaRegistry.sol\":208,\"src/PleaText.sol\":146,\"src/PrayRouter.sol\":84,\"src/Token.sol\":14,\"test/Hook.t.sol\":365,\"test/OracleConformance.t.sol\":100,\"test/Registry.t.sol\":271,\"test/TestBase.sol\":252,\"test/fixtures/live-attestation.json\":1,\"test/fixtures/live-request.json\":1,\"test/mocks/MockERC20.sol\":29,\"test/mocks/MockIntake.sol\":36,\"test/site/quote-race.mjs\":30},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8228,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/PleaRegistry.sol:125: PleaRegistry.questionPrefix(uint256) (src/PleaRegistry.sol#125-131) uses a dangerous strict equality:\n[medium/medium] unused-return at src/Hook.sol:179: Hook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#179-213) ignores return value by (None,tick,None,None) = poolManager.getSlot0(poolId) (src/Hook.sol#209)\n[low/medium] reentrancy-benign at src/BurnVault.sol:38: Reentrancy in BurnVault.buyback(uint256) (src/BurnVault.sol#38-52):\n[low/medium] reentrancy-benign at src/PleaRegistry.sol:91: Reentrancy in PleaRegistry.filePlea(uint256,string) (src/PleaRegistry.sol#91-123):\n[low/medium] reentrancy-benign at src/Hook.sol:179: Reentrancy in Hook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#179-213):\n[low/medium] reentrancy-benign at src/Hook.sol:228: Reentrancy in Hook.redeemTreasury() (src/Hook.sol#228-232):\n[low/medium] reentrancy-benign at src/PrayRouter.sol:40: Reentrancy in PrayRouter.swap(PrayRouter.Trade) (src/PrayRouter.sol#40-57):\n[low/medium] reentrancy-events at src/Hook.sol:179: Reentrancy in Hook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Hook.sol#179-213):\n[low/medium] reentrancy-events at src/Hook.sol:234: Reentrancy in Hook.unlockCallback(bytes) (src/Hook.sol#234-242):\n[low/medium] timestamp at src/PleaRegistry.sol:82: PleaRegistry.sleeping() (src/PleaRegistry.sol#82-84) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:157: PleaRegistry._answer(bytes32,OracleAttestation.Attestation,bytes) (src/PleaRegistry.sol#157-190) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:254: Hook.buybackFloor(uint256) (src/Hook.sol#254-280) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:125: PleaRegistry.questionPrefix(uint256) (src/PleaRegistry.sol#125-131) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:122: Hook.buyFeeBps() (src/Hook.sol#122-125) uses timestamp for comparisons\n[low/medium] timestamp at src/PrayRouter.sol:40: PrayRouter.swap(PrayRouter.Trade) (src/PrayRouter.sol#40-57) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:91: PleaRegistry.filePlea(uint256,string) (src/PleaRegistry.sol#91-123) uses timestamp for comparisons\n[low/medium] timestamp at src/Hook.sol:244: Hook._observe() (src/Hook.sol#244-252) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:86: PleaRegistry.available(address) (src/PleaRegistry.sol#86-89) uses timestamp for comparisons\n[low/medium] timestamp at src/PleaRegistry.sol:192: PleaRegistry.expire(uint256) (src/PleaRegistry.sol#192-200) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:164: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#164-175) uses timestamp for comparisons\n[low/medium] timestamp at src/BurnVault.sol:38: BurnVault.buyback(uint256) (src/BurnVault.sol#38-52) uses timestamp for comparisons","passed":true},{"durationMs":730,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PleaText.sol:107: `abi.encodePacked()` Hash Collision (3 places)\n[high] reentrancy-state-change at src/BurnVault.sol:43: Reentrancy: State change after external call (10 places)\n[high] unsafe-casting at src/Hook.sol:266: Unsafe Casting of integers\n[high] yul-return at src/PleaText.sol:144: Yul block contains `return`\n[low] internal-function-used-once at src/HookFlags.sol:23: Internal Function Used Only Once (3 places)\n[low] large-numeric-literal at src/BurnVault.sol:20: Large Numeric Literal (9 places)\n[low] literal-instead-of-constant at src/BurnVault.sol:40: Literal Instead of Constant (51 places)\n[low] local-variable-shadowing at src/Hook.sol:45: Local Variable Shadows State Variable\n[low] require-revert-in-loop at src/PleaText.sol:13: Loop Contains `require`/`revert` (2 places)\n[low] state-change-without-event at src/BurnVault.sol:54: State Change Without Event (3 places)\n[low] unused-public-function at src/Hook.sol:88: Public Function Not Used Internally (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"88eb13467209315434218c2a8999c40107c0aecfc8c5031752f54a61631e9dba","verifiedTreeHash":"3f6ffaa2026687e23bfd98a156f6ae13f603412d","verifierVersion":"0.1.0+ad90ce4c"}]}