{"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":"c6e9348a-77a9-4f39-9d4a-595ba0bc2964","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":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","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":"a867646670ed12cd53627b85426a7acea546779cbeec1ca27a58881e17584bd2","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"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":"Build Verdict: parimutuel prediction markets settled by IMD oracle answers, bought and delivered on chain through IMD's Intake. Two contracts with Foundry tests and an independent review; then deploy both on Sepolia (chain 11155111) in the order VerdictOracle, VerdictMarkets. A website follows in a separate job.\n\nIMD facts the code relies on: Intake.request(bytes32 action, bytes body, (address target, bytes4 selector) callback, address asset, uint256 amount) returns (bytes32 requestId) pulls amount after an approve, then later calls target with selector ++ abi.encode(bytes32 intakeRequestId, OracleAttestation a, bytes signature) once, with 200,000 gas, inside a try. No refunds: a refused body or a split panel delivers nothing. The attestation is EIP-712, domain {name: \"IdentityMD Oracle\", version: \"2\", chainId: block.chainid, verifyingContract: the consumer}, struct\nOracleAttestation(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)\nin that field order; callback selector 0x510379c7; bytes answer is hashed with keccak256 in the struct hash; answerType 0 bool, 1 address, 2 bytes32, 3 uint256, 4 address[], 5 bytes32[]; answer is abi.encode of the value.\n\n1. VerdictOracle(address intake, address asset, address signer, bytes32 actionId, uint256 price, address owner, uint256 configDelay): the consumer and requester.\n- request(bytes body) returns (bytes32 intakeRequestId): anyone. Pulls price of asset from the caller, forceApprove(intake, price), calls Intake.request with callback (address(this), onOracleResult selector), stores pending[intakeRequestId] = keccak256(body).\n- onOracleResult(bytes32 intakeRequestId, OracleAttestation a, bytes signature): only the intake, only a pending id (then cleared). Verifies the signature (OpenZeppelin EIP712 + ECDSA, signer only), then stores results[a.requestId] = {attHash: keccak256(abi.encode(a)), bodyHash: the pending body hash} once, and emits Answered(a.requestId, bodyHash, a.questionHash, intakeRequestId). Must use under 150,000 gas.\n- answerOf(OracleAttestation a) view returns the stored bodyHash when attHash matches, else zero.\n- Owner settings (intake, asset, signer, actionId, price) change only by propose, then accept after configDelay; events; Ownable2Step; no other admin power; holds no funds between calls.\n\n2. VerdictMarkets(address oracle, address collateral, address treasury, address burnSink, address guardian, uint16 creatorFeeBps, uint16 burnFeeBps, uint16 treasuryFeeBps, uint256 maxPoolPerMarket): no owner, no upgrade, immutable; reverts if fees total > 500 bps or the cap is 0. Collateral is IMD; credit the balance actually received on every transferFrom.\n- Guardian: pause/unpause createMarket and bet only; add/remove allowlisted creators; turn the creator allowlist off for good; hand over or renounce the role. resolve, escalate, propose, finalize, claim, voidMarket and refunds always work. The guardian never moves funds or changes outcomes.\n- createMarket(Params p, string uri, uint256 agentId): allowlisted creators while the allowlist is on. Params: bytes32 bodyHash; bytes32 escalationBodyHash (0 = none); bytes32 questionHash; uint8 answerType (0, 3, 4 or 5); uint256 dataChainId; uint64 fromBlock; uint64 toBlock; uint16 minPanelSize (>= 5); uint16 minAgreed; uint64 closeAt; uint64 answerFrom; uint64 answerUntil; uint64 disputeWindow (1 hour to 3 days); uint64 voidAfter; uint256[] bounds; bytes32[] keys; uint256 bounty (>= 2x oracle price, pulled from the creator). closeAt <= answerFrom < answerUntil < voidAfter. agentId: optional self-declared ERC-8004 id, emitted only.\n- Outcomes 2 to 8: bool gives 0 false, 1 true; uint256 gives bounds.length + 1 buckets from strictly ascending bounds, bucket i holds bounds[i-1] <= x < bounds[i]; address[]/bytes32[] give keys.length + 1, winner = the list's first element (address as bytes32(uint256(uint160(a)))), last outcome = none of the keys.\n- bet(id, outcome, amount, agentId): before closeAt, not paused, pool stays within maxPoolPerMarket.\n- resolve(id, bytes body): anyone, from answerFrom, while nothing is proposed; keccak256(body) == bodyHash; pays the oracle price from the bounty and calls oracle.request. escalate(id, bytes body): anyone, inside the dispute window; keccak256(body) == escalationBodyHash; same payment. At most 2 paid asks per market, one in flight at a time (a new one 24 hours after an unanswered one).\n- propose(id, OracleAttestation a): oracle.answerOf(a) must be the market's bodyHash or escalationBodyHash; questionHash, answerType, dataChainId, fromBlock, toBlock must match; panelSize >= minPanelSize; agreed >= minAgreed; answerFrom <= issuedAt <= answerUntil; before voidAfter. The first sets a provisional outcome and starts the dispute window; an escalation answer with panelSize at least twice the current one replaces it and restarts the window.\n- finalize(id) after the window: outcome fixed; fees from the whole pool to creator, burnSink and treasury by their bps; unspent bounty back to the creator.\n- claim(id): stake * (pool - fees) / winningPool.\n- voidMarket(id): voidAfter passed with no final outcome, or no stake on the winner: full refunds, no fees, unspent bounty to the creator.\n- ReentrancyGuard, checks-effects-interactions, events for every state change, getters for markets, pools and stakes.\n\nTests must show:\n- Struct hash, domain and selector match the text above; a mock Intake delivers through the callback under 150,000 gas.\n- A wrong signer, another consumer's domain, a callback not from the intake or for an unknown id each revert or store nothing; a requestId is never stored twice.\n- Invariant: per market, claims + refunds + fees + oracle spend + returned bounty never exceed deposits.\n- propose rejects an answer to any other body, and any mismatch in hash, type, chain, window, panel, agreement or issue time; resolve and escalate reject a body with another hash.\n- Paused: bet and createMarket revert; everything else works.\n- Escalation below 2x the panel reverts; at 2x it replaces and restarts the window.\n- Empty winning pool or voidAfter passed: full refunds.\n- Pool cap, allowlist, ask limit and fee cap hold.\n\nSepolia only. GitHub publication is approved. Contracts only: no token, no pool, no proxy. Constructor arguments: VerdictOracle(0x1397434cd35e8a9c8ac312a61d3a285eb31dea56, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a, 0x5598aa9146215bc13eb26f2c692ad1461fd32982, 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000, 500000000000000000, $owner, 0); VerdictMarkets($contract:VerdictOracle, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a, $owner, 0x000000000000000000000000000000000000dEaD, $owner, 100, 50, 50, 500000000000000000000): guardian and treasury = owner, fees 1% / 0.5% burn / 0.5%, pool cap 500 IMD. The owner is 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312. Solidity 0.8.24 or later, OpenZeppelin v5.","parentJobId":null,"planHash":"58ae0a365a962e74818a38caac2ec55b8e2338885f5017e48f2383ed52f3ea1b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"c6e9348a-77a9-4f39-9d4a-595ba0bc2964","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1276-build-verdict-parimutuel-prediction"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51093","feedbackHash":"8ff348ff7ece2e0e1552e2236ed19e06c5544ca52225401cc2d59d69f80a7421","nodeKey":"build_contract_project","submissionHash":"a867646670ed12cd53627b85426a7acea546779cbeec1ca27a58881e17584bd2","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c4c910e2aaf353ef731a71330d9b1247d5659a2b1370d5e0df31b7428e27b6fd","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2122058046fede33","findings":[],"hash":"15e496cbd4045df9627679d38425b925a98bc67f47e35c22c058a078cc937ac3","nodeId":"77db0e1e-1608-4f39-9a1b-d016a66c5cff","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by the execution environment: every shell command fails before running with `bwrap: No permissions to create a new namespace`.\n\nI couldn’t inspect the contracts or implement tests. Both `forge build` and `forge test` were attempted but never started. No files were changed.\n\nPlease repair or restart the sandbox and rerun this assignment.","treeHash":null,"usage":{"cachedInputTokens":104576,"inputTokens":14114,"model":"gpt-6-astra","outputTokens":656,"runtime":"codex","turns":3,"wallClockMs":29793}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"726aa3006eb6a1e1","findings":[],"hash":"a74737393ce18100dc118a18b788b048a380cac757c1d2de316a3374f5029518","nodeId":"44a81261-c168-4589-9842-181c9aa43250","outcome":"failed","summary":"needs input: The approved brief explicitly requires VerdictMarkets burnSink = 0x000000000000000000000000000000000000dEaD, but the reported launch_manifest_failed check rejects that exact address as a stand-in. The accepted contract makes burnSink immutable. Substituting $owner would redirect the 0.5% burn fee and violate the approved constructor arguments; resubmitting the required address would repeat the reported rejection. — Should the launch validator permit the explicitly approved 0x000000000000000000000000000000000000dEaD burn sink, or which replacement burn-sink address do you authorize?","treeHash":null,"usage":{"cachedInputTokens":601856,"inputTokens":47019,"model":"gpt-6-astra","outputTokens":3234,"runtime":"codex","turns":4,"wallClockMs":167361}},{"artifacts":[],"attempt":1,"bundleHash":"ed2351b97057a8f6bb53cfb50f4c0909102d97a0c6132d9405f80dcad64f5c50","device":"575a41a8798743c2","findings":[],"hash":"a867646670ed12cd53627b85426a7acea546779cbeec1ca27a58881e17584bd2","nodeId":"7e7347c1-a2ea-4410-a47b-2ef9aaa6326b","outcome":"completed","summary":"Implemented both contracts, vendored dependencies, tests, and independent review; findings repaired.\n\n`forge build`, all 68 permanent tests, and `forge fmt --check` pass.\n\nSepolia dependencies were verified and the [deployment handoff](README.md) is ready. Live deployment remains with the launch service; no transactions were broadcast.","treeHash":"b372cbb9e44a4bb0801eb7aa23d82b761ca70e72","usage":{"cachedInputTokens":3074944,"inputTokens":136080,"model":"gpt-6-astra","outputTokens":66420,"runtime":"codex","turns":8,"wallClockMs":1766319}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5095407bdf7ee98a","findings":[],"hash":"d03bf57284296adb211c90b941d8772bceb58945befeebdf8cfbdd357eb045b6","nodeId":"44a81261-c168-4589-9842-181c9aa43250","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by workspace tooling: writing `launch.json` failed, and all commands—including `forge build` and `forge test`—failed with `bwrap: No permissions to create a new namespace`. I could not inspect the accepted source or protected checks.\n\nThis manifest matches the supplied brief, but remains unwritten and unverified against the source:\n\n```json\n{\n  \"kind\": \"evm_contracts\",\n  \"contracts\": [\n    {\n      \"contract\": \"VerdictOracle\",\n      \"constructorArgs\": [\n        \"0x1397434cd35e8a9c8ac312a61d3a285eb31dea56\",\n        \"0x44a1cd38474fb1748400e7deb5f8d786cce3f89a\",\n        \"0x5598aa9146215bc13eb26f2c692ad1461fd32982\",\n        \"0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000\",\n        \"500000000000000000\",\n        \"$owner\",\n        \"0\"\n      ]\n    },\n    {\n      \"contract\": \"VerdictMarkets\",\n      \"constructorArgs\": [\n        \"$contract:VerdictOracle\",\n        \"0x44a1cd38474fb1748400e7deb5f8d786cce3f89a\",\n        \"$owner\",\n        \"0x000000000000000000000000000000000000dEaD\",\n        \"$owner\",\n        \"100\",\n        \"50\",\n        \"50\",\n        \"500000000000000000000\"\n      ]\n    }\n  ],\n  \"notes\": \"Sepolia only (chain 11155111). Deploy VerdictOracle before VerdictMarkets. $owner resolves to 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312 and supplies the oracle owner, markets treasury and guardian. Oracle request price: 0.5 IMD; configuration delay: zero. Markets use IMD collateral, with creator, burn and treasury fees of 1%, 0.5% and 0.5%, respectively, and a pool cap of 500 IMD per market.\"\n}\n```","treeHash":null,"usage":{"cachedInputTokens":108672,"inputTokens":11090,"model":"gpt-6-astra","outputTokens":2653,"runtime":"codex","turns":3,"wallClockMs":68431}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6d41a24119881b34","findings":[],"hash":"e9c8e45d88a7a7e67ef69865e84e3cc2203c1fe3f1434e4ed792184be91a6e63","nodeId":"44a81261-c168-4589-9842-181c9aa43250","outcome":"failed","summary":"the launch check failed, so this was not submitted:\nlaunch.json: VerdictMarkets: argument 3 is the burn address (0x000000000000000000000000000000000000000000000000000000000000dead), a stand-in rather than a party. Use $owner for the launch's owner or $factory for the launch factory where the manifest kind has them; if the brief never names the address, report that the brief is missing it instead of filling it in","treeHash":null,"usage":{"cachedInputTokens":685312,"inputTokens":98097,"model":"gpt-6-astra","outputTokens":10541,"runtime":"codex","turns":9,"wallClockMs":361195}}],"verification":[{"checks":[{"durationMs":28077,"exitCode":0,"name":"build","output":"Compiling 60 files with Solc 0.8.26\nSolc 0.8.26 finished in 27.92s\nCompiler run successful!\nwarning[missing-events-access-control]: `intake` is changed without an event but is used for access control\n    ╭▸ src/VerdictOracle.sol:166:9\n    │\n166 │         intake = config.intake;\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/VerdictOracle.sol:97:27\n    │\n 97 │           intakeRequestId = IIntake(target)\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n 98 │ ┃             .request(\n 99 │ ┃                 actionId, body, IIntake.Callback(address(this), this.onOracleResult.selector), address(token), cost\n100 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictOracle.sol:107:9\n    │\n107 │         emit Requested(intakeRequestId, bodyHash, msg.sender, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/VerdictOracle.sol:95:13\n   │\n95 │         if (token.balanceOf(address(this)) - beforeBalance != cost) revert IncorrectPayment();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:102:13\n    │\n102 │         if (token.balanceOf(address(this)) != beforeBalance) revert IncorrectPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:121:13\n    │\n121 │             block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE\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/VerdictOracle.sol:121:46\n    │\n121 │             block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE\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/VerdictOracle.sol:127:9\n    │\n127 │         emit Answered(a.requestId, bodyHash, a.questionHash, intakeRequestId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:140:71\n    │\n140 │     function proposeConfig(Config calldata config) external onlyOwner nonReentrant {\n    │                                                                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:148:48\n    │\n148 │     function acceptConfig() external onlyOwner nonReentrant {\n    │                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:150:13\n    │\n150 │         if (block.timestamp < configReadyAt) revert ConfigNotReady(configReadyAt);\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/VerdictMarkets.sol:205:13\n    │\n205 │         if (block.timestamp >= m.params.closeAt) revert WrongTime();\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/VerdictMarkets.sol:219:13\n    │\n219 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:219:54\n    │\n219 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:227:13\n    │\n227 │         if (block.timestamp >= m.disputeEndsAt || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:227:51\n    │\n227 │         if (block.timestamp >= m.disputeEndsAt || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:238:13\n    │\n238 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:238:54\n    │\n238 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:266:13\n    │\n266 │         if (block.timestamp < m.disputeEndsAt || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:266:50\n    │\n266 │         if (block.timestamp < m.disputeEndsAt || block.timestamp >= m.params.voidAfter) revert WrongTime();\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/VerdictMarkets.sol:410:9\n    │\n410 │         emit BountyReturned(id, m.creator, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:275:9\n    │\n275 │         emit MarketFinalized(id, m.outcome, m.netPool);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:276:9\n    │\n276 │         emit FeesPaid(id, creatorFee, burnFee, treasuryFee);\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/VerdictMarkets.sol:287:13\n    │\n287 │             block.timestamp < m.params.voidAfter\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/VerdictMarkets.sol:288:51\n    │\n288 │                 && !(m.state == State.Proposed && block.timestamp >= m.disputeEndsAt && pools[id][m.outcome] == 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/VerdictMarkets.sol:369:28\n    │\n369 │             m.asks != 0 && block.timestamp < m.lastAskedAt + ASK_TIMEOUT\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/VerdictMarkets.sol:385:9\n    │\n385 │         emit OracleRequested(id, requestId, escalation, cost, m.asks);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictMarkets.sol:383:13\n    │\n383 │         if (collateral.balanceOf(address(this)) != beforeBalance - cost) revert IncorrectOracleSpend();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:401:13\n    │\n401 │             emit Claimed(id, msg.sender, 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/VerdictMarkets.sol:420:91\n    │\n420 │                 || p.dataChainId == 0 || p.fromBlock > p.toBlock || p.minPanelSize < 5 || p.closeAt <= block.timestamp\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/VerdictMarkets.sol:431:53\n    │\n431 │                 if (p.bounds[i] <= p.bounds[i - 1]) revert InvalidOutcomes();\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/VerdictMarkets.sol:438:78\n    │\n438 │             if (p.answerType == 4 && uint256(p.keys[i]) > type(uint160).max) revert InvalidOutcomes();\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/VerdictMarkets.sol:440:45\n    │\n440 │                 if (p.keys[i] == p.keys[j]) revert InvalidOutcomes();\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:433:20\n    │\n433 │             return uint8(p.bounds.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:443:16\n    │\n443 │         return uint8(p.keys.length + 1);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:451:49\n    │\n451 │                 if (value < p.bounds[i]) return uint8(i);\n    │                                                 ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:453:20\n    │\n453 │             return uint8(p.bounds.length);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:458:44\n    │\n458 │             if (values.length == 0) return uint8(p.keys.length);\n    │                                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:462:44\n    │\n462 │             if (values.length == 0) return uint8(p.keys.length);\n    │                                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:466:44\n    │\n466 │             if (p.keys[i] == first) return uint8(i);\n    │                                            ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/VerdictMarkets.sol:468:16\n    │\n468 │         return uint8(p.keys.length);\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":3992,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 180561)\n[PASS] test_acceptsTheProtocolSignatureAsDeliveredUnder150k() (gas: 184330)\nLogs:\n  protocol vector callback gas: 74299\n\n[PASS] test_callbackSelectorIsCanonical() (gas: 4055)\n[PASS] test_digestMatchesTheProtocol() (gas: 14274)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.90ms (1.77ms CPU time)\n\nRan 6 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] test_addressListUsesFirstOnlyAndEmptyOrUnlistedMeansOther() (gas: 4613542)\n[PASS] test_bytes32ListUsesFirstOnlyAndZeroKeyWorks() (gas: 4532566)\n[PASS] test_invalidOutcomeDefinitions() (gas: 303239)\n[PASS] test_malformedAnswerCannotSetOutcome() (gas: 1077841)\n[PASS] test_twoToEightOutcomeLimits() (gas: 1389542)\n[PASS] test_uintBucketsAtEveryBoundary() (gas: 8694454)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.92ms (10.65ms CPU time)\n\nRan 14 tests for test/VerdictValidation.t.sol:VerdictValidationTest\n[PASS] test_creatorAllowlistAddRemoveAndPermanentDisable() (gas: 899536)\n[PASS] test_disputeWindowBothBoundsAndCloseEqualsAnswerFromAccepted() (gas: 789092)\n[PASS] test_escalationBodyMaySupplyFirstAnswerButBaseCannotReplace() (gas: 1585422)\n[PASS] test_feeCapAndCapValidation() (gas: 9776)\n[PASS] test_guardianAuthorityAndTwoStepHandover() (gas: 710083)\n[PASS] test_invalidParametersRejectBeforeTakingBounty() (gas: 549354)\n[PASS] test_issueWindowBoundariesAcceptedAndStoredAnswerSurvivesExpiry() (gas: 1944465)\n[PASS] test_minimumPanelAndAgreementAreIndependent() (gas: 1058756)\n[PASS] test_noEscalationBodyCannotEscalate() (gas: 1182378)\n[PASS] test_proposalNotBeforeAnswerFromOrAtVoidAfter() (gas: 618972)\n[PASS] test_proposeRejectsEachPanelAgreementAndQuorumMismatch() (gas: 3628406)\n[PASS] test_proposeRejectsEachQuestionTypeChainBlockAndIssueTimeMismatch() (gas: 4261016)\n[PASS] test_proposeRejectsOtherBodyAndUnknownOrTamperedAnswer() (gas: 1569873)\n[PASS] test_unknownMarketsAndUnsettledClaimsRevert() (gas: 459191)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 6.29ms (16.42ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_givenSepoliaArgumentsDeployFromFactoryWithoutDependencyCode() (gas: 19402327)\n[PASS] test_parameterReferenceMustBeRealDeploymentAddress() (gas: 6337)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 39.76ms (39.50ms CPU time)\n\nRan 21 tests for test/VerdictOracle.t.sol:VerdictOracleTest\n[PASS] test_bodyAndAnswerLimits() (gas: 767733)\n[PASS] test_callbackRequiresIntakeAndPendingId() (gas: 199518)\n[PASS] test_callbackStoresFalseAndExactHashUnder150kGas() (gas: 605036)\nLogs:\n  bool callback gas including call overhead: 74250\n\n[PASS] test_configOnlyOwnerDelayedAndAtomic() (gas: 1950990)\n[PASS] test_configReplacementRestartsDelay() (gas: 261352)\n[PASS] test_donationCannotSubsidizeTaxedPayment() (gas: 180237)\n[PASS] test_duplicateIntakeDeliveryAndOracleRequestIdRejected() (gas: 918341)\n[PASS] test_expiredFutureAndInvertedValidityRejected() (gas: 585122)\n[PASS] test_expiryBoundaryAndClockToleranceAccepted() (gas: 999266)\n[PASS] test_intakeCannotReuseConsumedId() (gas: 731903)\n[PASS] test_malformedSignatureRejected() (gas: 433733)\n[PASS] test_maximumAnswerFitsUnder150kGas() (gas: 741082)\nLogs:\n  16 KiB callback gas including call overhead: 88822\n\n[PASS] test_otherChainDomainRejected() (gas: 453700)\n[PASS] test_otherConsumerDomainRejected() (gas: 470809)\n[PASS] test_ownershipRequiresAcceptance() (gas: 134573)\n[PASS] test_requestPullsOnlyPriceAndRecordsCallback() (gas: 358270)\n[PASS] test_requestReentrancyBlocked() (gas: 507596)\n[PASS] test_rotationDoesNotEraseHistoricalAnswer() (gas: 810182)\n[PASS] test_tamperedSignedFieldsRejected() (gas: 453341)\n[PASS] test_taxedPaymentAndUnspentPriceRevertAtomically() (gas: 515178)\n[PASS] test_wrongSignerStoresNothingAndMockDoesNotRetry() (gas: 577064)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 50.16ms (21.63ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_claimsAndFeesNeverExceedDeposits(uint96,uint96,uint96) (runs: 256, μ: 2136656, ~: 2136931)\nLogs:\n  Bound result 149\n  Bound result 91096486254434010265\n  Bound result 19332809370710418344\n\n[PASS] test_answeredAskAllowsNextWithoutTimeoutAndBaseAskStopsAtProposal() (gas: 1524592)\n[PASS] test_betCloseBoundaryAndOutcomeBounds() (gas: 820591)\n[PASS] test_capUsesNetReceivedAmountAndZeroReceivedReverts() (gas: 714715)\n[PASS] test_emptyWinningPoolRefundsOnlyAfterDisputeWindow() (gas: 1838312)\n[PASS] test_endToEndParimutuelFeesBountyAndClaims() (gas: 2325530)\n[PASS] test_escalateHashTimeAndInflightRestrictions() (gas: 1924139)\n[PASS] test_escalationRequiresDoublePanelAndRestartsWindow() (gas: 3104781)\n[PASS] test_feeOnTransferCreditsReceivedBountyAndStakes() (gas: 1140936)\n[PASS] test_lateEscalationAnswerCanReplaceUntilFinalization() (gas: 2219057)\n[PASS] test_noStakeMarketCanVoid() (gas: 1385554)\n[PASS] test_oldUnansweredAskCanDeliverAfterTimeoutRetry() (gas: 1585081)\n[PASS] test_oraclePriceChangeCannotSpendOtherMarketsOrStakes() (gas: 1256044)\n[PASS] test_pauseRestrictsOnlyEntryAndAllSettlementPathsWork() (gas: 3638704)\n[PASS] test_pendingChallengeDoesNotBlockFinalizationOrChangeFinalOutcome() (gas: 2242160)\n[PASS] test_poolCapIsPerMarketAndExactBoundaryWorks() (gas: 1274505)\n[PASS] test_reentrancyDuringBetFinalizeAndClaimBlocked() (gas: 2251695)\n[PASS] test_resolveHashTimeInflightTimeoutAndAskLimit() (gas: 1568206)\n[PASS] test_timeoutRefundsAllOutcomesAndReturnsUnspentBounty() (gas: 1241511)\n[PASS] test_voidAfterIsHardDeadlineEvenForProposedWinner() (gas: 1578784)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 53.62ms (76.85ms CPU time)\n\nRan 1 test for test/VerdictInvariant.t.sol:VerdictInvariantTest\n[PASS] invariant_perMarketConservationMatchesActualTokenFlows() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| VerdictHandler | advance           | 913   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | ask               | 865   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | bet               | 938   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | claim             | 893   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | closeAll          | 926   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | createMarket      | 961   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | deliverAndPropose | 900   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | pause             | 965   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| VerdictHandler | settle            | 831   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 20000000000000000000\n  Bound result 30000000000000000000\n  Bound result 13429\n  Bound result 500\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.90s (3.90s CPU time)\n\nRan 7 test suites in 3.90s (4.06s CPU time): 68 tests passed, 0 failed, 0 skipped (68 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictMarkets.acceptGuardian()\",\"VerdictMarkets.bet(uint256,uint8,uint256,uint256)\",\"VerdictMarkets.claim(uint256)\",\"VerdictMarkets.createMarket((bytes32,bytes32,bytes32,uint8,uint256,uint64,uint64,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint256[],bytes32[],uint256),string,uint256)\",\"VerdictMarkets.disableCreatorAllowlist()\",\"VerdictMarkets.escalate(uint256,bytes)\",\"VerdictMarkets.finalize(uint256)\",\"VerdictMarkets.propose(uint256,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64))\",\"VerdictMarkets.refund(uint256)\",\"VerdictMarkets.renounceGuardian()\",\"VerdictMarkets.resolve(uint256,bytes)\",\"VerdictMarkets.setCreatorAllowed(address,bool)\",\"VerdictMarkets.setPaused(bool)\",\"VerdictMarkets.transferGuardian(address)\",\"VerdictMarkets.voidMarket(uint256)\",\"VerdictOracle.acceptConfig()\",\"VerdictOracle.acceptOwnership()\",\"VerdictOracle.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"VerdictOracle.proposeConfig((address,address,address,bytes32,uint256))\",\"VerdictOracle.renounceOwnership()\",\"VerdictOracle.request(bytes)\",\"VerdictOracle.transferOwnership(address)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":151,\"deployment/sepolia-parameters.json\":28,\"deployment/sepolia-preflight.json\":22,\"docs/DEPENDENCIES.md\":14,\"docs/INDEPENDENT_REVIEW.md\":54,\"docs/VALIDATION.md\":49,\"foundry.toml\":23,\"remappings.txt\":2,\"script/SepoliaParameters.sol\":24,\"src/OracleAttestation.sol\":97,\"src/VerdictMarkets.sol\":470,\"src/VerdictOracle.sol\":173,\"src/interfaces/IIntake.sol\":14,\"src/interfaces/IVerdictOracle.sol\":12,\"test/Deployment.t.sol\":78,\"test/OracleConsumerConformance.t.sol\":91,\"test/VerdictInvariant.t.sol\":288,\"test/VerdictMarkets.t.sol\":401,\"test/VerdictOracle.t.sol\":295,\"test/VerdictOutcomes.t.sol\":148,\"test/VerdictTestBase.sol\":134,\"test/VerdictValidation.t.sol\":245,\"test/mocks/MockIntake.sol\":69,\"test/mocks/MockToken.sol\":46},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4578,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/VerdictOracle.sol:88: Reentrancy in VerdictOracle.request(bytes) (src/VerdictOracle.sol#88-108):\n[high/medium] reentrancy-balance at src/VerdictMarkets.sol:363: Reentrancy in VerdictMarkets._ask(uint256,VerdictMarkets.Market,bytes,bool) (src/VerdictMarkets.sol#363-386):\n[medium/high] incorrect-equality at src/VerdictMarkets.sol:355: VerdictMarkets._receive(uint256) (src/VerdictMarkets.sol#355-361) uses a dangerous strict equality:\n[low/medium] reentrancy-benign at src/VerdictOracle.sol:88: Reentrancy in VerdictOracle.request(bytes) (src/VerdictOracle.sol#88-108):\n[low/medium] timestamp at src/VerdictMarkets.sol:417: VerdictMarkets._validateParams(VerdictMarkets.Params) (src/VerdictMarkets.sol#417-444) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:202: VerdictMarkets.bet(uint256,uint8,uint256,uint256) (src/VerdictMarkets.sol#202-214) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:224: VerdictMarkets.escalate(uint256,bytes) (src/VerdictMarkets.sol#224-232) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictOracle.sol:148: VerdictOracle.acceptConfig() (src/VerdictOracle.sol#148-156) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:216: VerdictMarkets.resolve(uint256,bytes) (src/VerdictMarkets.sol#216-222) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:283: VerdictMarkets.voidMarket(uint256) (src/VerdictMarkets.sol#283-294) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:363: VerdictMarkets._ask(uint256,VerdictMarkets.Market,bytes,bool) (src/VerdictMarkets.sol#363-386) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:235: VerdictMarkets.propose(uint256,OracleAttestation.Attestation) (src/VerdictMarkets.sol#235-261) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictOracle.sol:111: VerdictOracle.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/VerdictOracle.sol#111-128) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:263: VerdictMarkets.finalize(uint256) (src/VerdictMarkets.sol#263-280) uses timestamp for comparisons","passed":true},{"durationMs":609,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/VerdictMarkets.sol:186: Reentrancy: State change after external call (7 places)\n[low] centralization-risk at src/VerdictOracle.sol:15: Centralization Risk (3 places)\n[low] large-numeric-literal at src/VerdictMarkets.sol:117: Large Numeric Literal\n[low] literal-instead-of-constant at src/VerdictMarkets.sol:420: Literal Instead of Constant (10 places)\n[low] local-variable-shadowing at src/VerdictOracle.sol:20: Local Variable Shadows State Variable (5 places)\n[low] non-reentrant-not-first at src/VerdictOracle.sol:140: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/VerdictMarkets.sol:430: Loop Contains `require`/`revert` (3 places)\n[low] state-no-address-check at src/VerdictOracle.sol:166: Address State Variable Set Without Checks (3 places)\n[low] uninitialized-local-variable at src/VerdictMarkets.sol:437: Uninitialized Local Variable (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a867646670ed12cd53627b85426a7acea546779cbeec1ca27a58881e17584bd2","verifiedTreeHash":"b372cbb9e44a4bb0801eb7aa23d82b761ca70e72","verifierVersion":"0.1.0+0e08a464"}]}