{"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":"ba544bd2-b182-44df-ad6f-57a6fc0b15bf","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"379a5a31482eb262bb5e37ba52066352d6ba7a5c51543feb94880faf22fa4b00","dependsOn":["build_contract_project","build_contract_project_2"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"edaac55fb4e496915dd0792d965b6c75452e784675364fb94bf145abd9ee4d48","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":"c89510c486c6fbb23550185c17e1ed3b4d4180a4472a00738bfb9bdfb1d9b05c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project_2","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"Apply the review findings of the first chaintraits job (seven listed changes) and re-review. The registry (src/Registry.sol, src/Composer.sol, src/Renderer.sol; README.md, CONCEPT.md, CATALOG.md, TEMPLATES.md, INTEGRATION.md are the specification) is an ownerless, non-upgradeable ERC-721 registry of verifiable wallet traits on Ethereum mainnet: no admin, no setter, no pause, no owner; every function is callable by anyone except onResult and onFailure, which only the IMD Intake v2 may call. Nothing is deployed yet; no launch in this job.","parentJobId":"27391f0e-0419-4d15-a5d5-bb182f137bd9","planHash":"8d0e761a5c689bc203be5640f13fc261e5e897ffad11ea1bc536d8ce2c3053ca","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"27391f0e-0419-4d15-a5d5-bb182f137bd9","publication":{"commit":null,"deliveredAt":null,"repoUrl":null},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52145","feedbackHash":"8fbd8fd01f72ad4eb63f7955a12721222b18c7b9bbe3bb3be15748171a88e6b9","nodeKey":"adversarial_review","submissionHash":"379a5a31482eb262bb5e37ba52066352d6ba7a5c51543feb94880faf22fa4b00","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52335","feedbackHash":"216718b6d70faec7f9a0478a6f5ffe5613f3639fde3e269bc5dc042207f66412","nodeKey":"build_contract_project","submissionHash":"edaac55fb4e496915dd0792d965b6c75452e784675364fb94bf145abd9ee4d48","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52214","feedbackHash":"9b08ea3d5772a68d656b7d1773042c4987a0026e9301fce0879e855563f564b6","nodeKey":"build_contract_project_2","submissionHash":"c89510c486c6fbb23550185c17e1ed3b4d4180a4472a00738bfb9bdfb1d9b05c","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d4b6457e0cfca0d1b64c1cff8348b0314969ce3bb0fcd566b63af63a6f6ebcee","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e02bec63aa9dcaa5","findings":[{"citation":"resolved","description":"Change (o) of the tests-and-docs step corrected README.md and CONCEPT.md invariant 7 to say that `questionHashOf` takes the canonical question document, not the request body, and test/Templates.t.sol:98-100 passes `.canonicalDocument` from reference/plane/questionHashes.json. INTEGRATION.md section 4, check 7, last sentence was left unchanged and still describes `questionHashOf(body)`. A reader following INTEGRATION.md (the document that says it wins over the skill where they disagree) will hash the body and conclude the registry disagrees with the plane. test/NOTES.md records this as an observation; it is a defect in the specification text the registry is judged against.","line":223,"path":"INTEGRATION.md","reproduction":"For any fixture in templates/fixtures/, call Registry.questionHashOf(bytes(body)) with the fixture body as written to the Intake. Expected per INTEGRATION.md:223: equals reference/plane/questionHashes.json for that fixture. Actual: keccak256(body) differs from the plane's value; only questionHashOf(bytes(canonicalDocument)) matches, which is what test/Templates.t.sol:100 asserts. Fix: change the sentence to `questionHashOf(canonicalDocument)` as README.md:189 and CONCEPT.md invariant 7 already say.","severity":"low","snippet":"   The golden test asserts the registry's `questionHashOf(body)` equals the plane's value for all ten fixtures","title":"INTEGRATION.md check 7 still says the golden test asserts questionHashOf(body); the test and change (o) use the canonical document"},{"citation":"resolved","description":"Composer.validateSpec (src/Composer.sol:237, `if (s.target != address(0)) revert BadSpec(\"target\");`) requires a T5 spec's target to be exactly zero, which the Spec struct comments in CATALOG.md:168 and src/Types.sol:8 state (\"zero for T5\"). The guard table one screen above says only \"unused\", which a registrant can read as \"any value is ignored\". The code is the stricter, documented-elsewhere behaviour; the guard table is the imprecise one. No value is at risk: a refused registration pulls no fee and leaves nextSpecId unchanged.","line":152,"path":"CATALOG.md","reproduction":"registerSpec(Spec{kind:5, target:0xCAFE, item:\"\", arg:\"\", fixedArg:\"\", fixedVal:0, sumArg:\"\", op:0, threshold:1, fromBlock:0x189378e, toBlock:0x189378e, name:\"T5\"}) at block 26,200,000. Expected from CATALOG.md:152 (\"unused\"): accepted. Actual: reverts BadSpec(\"target\"). Fix: write \"must be zero for T5\" in the guard table, matching the struct comment.","severity":"info","snippet":"| `target` | address | nonzero for T1 to T4; unused for T5 |","title":"CATALOG.md section 5 says `target` is \"unused for T5\" but validateSpec refuses any nonzero T5 target"},{"citation":"resolved","description":"The catalog's shared fact 1201 is an oracle trait (class 3, requestSharedFact/applySharedFact); CATALOG.md:183 says `upgrade` rejects T3 ids because they go through the shared-fact path. For a registered T3 spec the code says so (`revert NotASharedFact(id)` at src/Registry.sol:379), but for 1201 it reports NotAnOracleTrait(1201), the error reserved for ids that are not oracle traits at all (direct reads, unknown ids). A front end mapping errors to guidance sends a 1201 claimant to the wrong message. Both paths revert before any IMD moves, so this is naming only.","line":375,"path":"src/Registry.sol","reproduction":"fund a wallet with 0.5 IMD and approve the registry; call upgrade([1201], 0.5e18). Actual revert data: 0xcc9f0db3...04b1 = NotAnOracleTrait(1201). Call upgrade([<id of a registered kind-3 spec>], 0.5e18): revert NotASharedFact(id). Expected: the same error for both shared-fact ids (NotASharedFact(1201)).","severity":"info","snippet":"            if (_isDirect(id) || id == 1201) revert NotAnOracleTrait(id);","title":"upgrade([1201]) reverts NotAnOracleTrait while a community T3 id reverts NotASharedFact for the same reason"}],"hash":"379a5a31482eb262bb5e37ba52066352d6ba7a5c51543feb94880faf22fa4b00","nodeId":"a5ce5b7d-b5c1-442c-8479-1db64bfa10f6","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root, the scratch probe is removed, and no source, test, or configuration file was changed.\n\n**Outcome: no high or medium defect.** Every listed change does what its step says, and I found no regression in the areas named by the assignment.\n\nWhat I verified, change by change:\n\n- **(a) Callback bounds and precedence.** `Registry._check` returns reason 2 for a signature not exactly 65 bytes, then reason 9 for an answer over 2112 bytes or not exactly 32 bytes for a non-T3 pending kind, before any hash or copy. The order chainId, signer, type, panel, window, expiry, questionHash, decode, rule matches INTEGRATION.md section 4 and CATALOG.md section 4. The 262,144-byte envelopes finish as a `Missed` under the mock Intake's real 200,000-gas call, with cold storage.\n- **(b) Ordinal.** `cardOf` keeps the first ascending family-11 id and the highest id for tier families. Covered by a fuzz over all 32 ordinal subsets acquired in descending order.\n- **(c), (d) Attributes and metadata keys.** One standard attribute per shown community id with the escaped spec name, `community_count` with the full count, and `minPanelSize` and `minQuorum` keys. Generator, goldens and Solidity agree byte for byte.\n- **(e) Spec guards.** Every CATALOG.md section 5 guard is enforced, including the new `fixedVal` rule. A scratch probe composed the longest legal spec of each kind, with a 78-digit `fixedVal` and threshold, without hitting the 1000 or 512 character limits. The largest body was 2,041 bytes.\n- **(f) Settled check.** The constructor reads `isSettled` through the view interface, so a writing, false, reverting or no-code Curator fails deployment. No immutables, and two deployments produce identical runtime code.\n- **(g) Move into Composer.** `hasTrait(address,uint16)` and `traitsOf(address)` keep their ABI on the registry. The moved functions are view-only, reached by static call, and never run inside `onResult`.\n- **(i) to (q).** The handler fix, cold-gas tests, re-entrancy and high-s tests, and the documentation edits match the code, with one exception reported below.\n\nFindings, ranked:\n\n1. **Low, INTEGRATION.md line 223.** Check 7 still says the golden test asserts `questionHashOf(body)`. The test and the (o) edits to README and CONCEPT use the canonical document. Hashing the body gives a value the plane never signs.\n2. **Info, CATALOG.md line 152.** The guard table says `target` is \"unused for T5\", but `validateSpec` refuses any nonzero T5 target, as the struct comments elsewhere say.\n3. **Info, Registry.sol line 375.** `upgrade([1201])` reverts `NotAnOracleTrait(1201)` while a community T3 id reverts `NotASharedFact`. Both revert before any IMD moves.\n\nThe coverage record answers all 16 entry points, 15 as holding and `upgrade` tied to the info finding, plus three invariant rows for the settled check, the Composer ABI, and the card rendering.","treeHash":null,"usage":{"cachedInputTokens":1846238,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":38166,"runtime":"claude","turns":35,"wallClockMs":639895}},{"artifacts":[],"attempt":1,"bundleHash":"ae8b148bf82158043af186a5f3be68212d99114fb57b19b8837d6580b714b9d7","device":"6b47d1bf92391c22","findings":[],"hash":"c89510c486c6fbb23550185c17e1ed3b4d4180a4472a00738bfb9bdfb1d9b05c","nodeId":"35ae782a-bed9-4f04-8d1a-af7b39c096a3","outcome":"completed","summary":"I've applied changes (i) to (q) and recorded each one in `test/NOTES.md`. `forge build`, `forge test` with no network (101 passed, 0 failed; the 11 fork tests skip), `forge fmt --check` and `python3 tools/gen_template.py --check` all pass. Nothing under `src/` changed, and nothing was deployed or committed.\n\n**Cold `onResult` gas.** I prepared the request and the signature, then called `vm.cool` on the registry, then delivered through the mock Intake's real 200,000-gas call. Each test checks the callback was delivered and logs the gas:\n\n| path | gas now | independent reviewer, before the contract changes |\n|---|---:|---:|\n| first community verification, with a card | 133,356 | 135,193 |\n| 64-address shared fact, catalog id 1201 | 164,087 | 170,779 |\n| 64-address shared fact, community spec (head 32, the maximum) | 170,445 | 177,134 |\n\nThe mock now records the gas used around its own call, including the cold access to the registry.\n\n**Tests**\n- **(i) Invariants:** the `which`-modulo fix was already in the tree from the previous step. `replayConsumed` is now one of the targeted selectors, and a new unit test confirms a replay reaches the registry and changes nothing. All five extended campaigns pass with `fail_on_revert` on.\n- **(k) Reentrancy:** the attacking token now holds IMD and has approved the registry. I wired in an Intake that sells in that token, so only the guard can refuse a re-entered call. The test asserts the exact `ReentrancyGuardReentrantCall()` error for five functions: `upgrade`, `sponsor`, `registerSpec`, `requestSharedFact` and `mintCard`. As a positive control, the same payloads sent from outside the guard succeed and take effect.\n- **(k) High-s:** every bad signature, including the high-s twin, is now built from the exact envelope it is delivered with. Plain `ecrecover` still recovers the attester from the twin, and the low-s original then verifies.\n- **New tests** in `test/ReReview.t.sol`:\n  - (a) oversized signatures on community requests;\n  - (b) the lowest ordinal wins;\n  - (c) community attributes only for verified specs;\n  - (e) an unused `fixedVal` is refused and an empty filter is never written into the question;\n  - (f) a Curator whose `isSettled` writes storage cannot be deployed against;\n  - (n) the same signed evidence satisfies a later request with the identical question;\n  - (p) spec id 65534 registers and the next one reverts.\n\n**Docs**\n- **(l)** README \"How to verify a card\" now derives `topic0` from the canonical event signature and the topic positions from the indexed-argument order of the stored item.\n- **(m)** README says how to run the fork tests with `CHAINTRAITS_FORK_RPC`, and the \"not delivered\" text is gone.\n- **(n), (o)** CONCEPT.md invariants 4 and 7 are updated, and README now says `questionHashOf` takes the canonical document, not the body.\n- **(p)** CATALOG.md section 5 states the 55,534-spec limit.\n- **(q)** CONCEPT.md section 6 and INTEGRATION.md section 1 now describe three contracts and seven constructor arguments. CATALOG.md section 8 carries the open question about signatures with `agreed` below quorum.\n\nOne inconsistency is left: INTEGRATION.md section 4, check 7 still says `questionHashOf(body)`. It wasn't in the list of changes, so I didn't touch it and noted it in `test/NOTES.md`; it's a one-word fix if you want it.\n\nThis round was a local re-review, not an independent audit.","treeHash":"5a4fbfd34fd4a3a077ee459c6f0cf87e222c88f7","usage":{"cachedInputTokens":3771147,"inputTokens":78,"model":"claude-opus-5-5","outputTokens":31256,"runtime":"claude","turns":41,"wallClockMs":509137}},{"artifacts":[],"attempt":1,"bundleHash":"44fc5f3439b8fd1878d3c159efa9d6acae216526dcdedc45a60923c08bb18b86","device":"4da6f73105193824","findings":[],"hash":"edaac55fb4e496915dd0792d965b6c75452e784675364fb94bf145abd9ee4d48","nodeId":"d4837dfc-76b5-4107-a677-7e0709e40da7","outcome":"completed","summary":"Implemented (a)–(h) and re-reviewed; changes and evidence are in [test/NOTES.md](/home/imd/.identitymd/work/ba544bd2-b182-44df-ad6f-57a6fc0b15bf/d4837dfc-76b5-4107-a677-7e0709e40da7/test/NOTES.md).\n\n- Offline build/tests pass: **90 passed**, 11 RPC-dependent skips.\n- Formatting and template checks pass.\n- Registry runtime: **23,027 bytes**, leaving **1,549 bytes** headroom.\n- Existing ABIs preserved; no immutable references.\n- Repaired one existing invariant-harness overflow.\n\nNothing deployed.","treeHash":"3394d36e52202f539e817b89a6712ee56ed69032","usage":{"cachedInputTokens":4885632,"inputTokens":182116,"model":"gpt-6-astra","outputTokens":29821,"runtime":"codex","turns":10,"wallClockMs":914658}}],"verification":[{"checks":[{"durationMs":12016,"exitCode":0,"name":"build","output":"Compiling 73 files with Solc 0.8.24\nSolc 0.8.24 finished in 11.60s\nCompiler run successful!\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/Renderer.sol:63:43\n   │\n63 │                 mcopy(add(add(out, 0x20), off), add(add(tpl, 0x20), start), len)\n   │                                           ━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Composer.sol:189:74\n    │\n189 │             if (ICatalogRegistry(registry).hasTrait(wallet, all[i])) tmp[n++] = all[i];\n    │                                                                          ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Composer.sol:189:17\n    │\n189 │             if (ICatalogRegistry(registry).hasTrait(wallet, all[i])) tmp[n++] = all[i];\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Renderer.sol:185:42\n    │\n185 │             if (ch == '\"' || ch == \"\\\\\") extra += 1;\n    │                                          ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Renderer.sol:194:21\n    │\n194 │                 out[o++] = \"\\\\\";\n    │                     ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Registry.sol:58:38\n   │\n58 │     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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Composer.sol:245:43\n    │\n245 │                 if (item[i] != prefix[i]) revert BadSpec(\"item\");\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/Composer.sol:289:22\n    │\n289 │             if (!ok) revert BadSpec(\"name\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:187:22\n    │\n187 │         deployedAt = 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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Composer.sol:327:61\n    │\n327 │             if (bytes(q.values[i]).length > MAX_DEFINITION) revert DefinitionTooLong(bytes(q.values[i]).length);\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Composer.sol:615:13\n    │\n615 │             n++;\n    │             ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-oz-erc721-mint]: `ERC721._mint` does not check that the recipient can receive the token; use `_safeMint`\n    ╭▸ src/Registry.sol:201:9\n    │\n201 │         _mint(msg.sender, tokenId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-oz-erc721-mint\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:200:34\n    │\n200 │         mintedAtBlock[tokenId] = uint64(block.number);\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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:235:37\n    │\n235 │             if (c.traits[i] >= 701) n++;\n    │                                     ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:240:46\n    │\n240 │             if (c.traits[i] >= 701) c.oracle[k++] = _meta(claimant, c.traits[i]);\n    │                                              ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:347:16\n    │\n347 │         return composer.catalogSpec(traitId, address(curator));\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:343:30\n    │\n343 │             if (s.kind == 0) revert NotAnOracleTrait(traitId);\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/Registry.sol:346:78\n    │\n346 │         if (!_isCatalogChain(traitId) && traitId != 1201 && traitId != 1301) revert NotAnOracleTrait(traitId);\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `pendingOf` is updated\n    ╭▸ src/Registry.sol:422:21\n    │\n422 │           requestId = intake.requestWithFailure(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n423 │ ┃             ACTION,\n424 │ ┃             body,\n425 │ ┃             IIntake.Callback(address(this), this.onResult.selector),\n    ‡ ┃\n428 │ ┃             price\n429 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:357:16\n    │\n357 │         return composer.compose(s, claimant, address(this), traitId == 1301, address(curator));\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:422:21\n    │\n422 │           requestId = intake.requestWithFailure(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n423 │ ┃             ACTION,\n424 │ ┃             body,\n425 │ ┃             IIntake.Callback(address(this), this.onResult.selector),\n    ‡ ┃\n428 │ ┃             price\n429 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:433:9\n    │\n433 │         emit TraitRequested(claimant, traitId, requestId, qh);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:375:46\n    │\n375 │             if (_isDirect(id) || id == 1201) revert NotAnOracleTrait(id);\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/Registry.sol:378:32\n    │\n378 │                 if (kind == 0) revert NotAnOracleTrait(id);\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/Registry.sol:379:32\n    │\n379 │                 if (kind == 3) revert NotASharedFact(id);\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/Registry.sol:381:17\n    │\n381 │                 revert NotAnOracleTrait(id);\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/Registry.sol:414:62\n    │\n414 │             if (_verified[claimant][traitId].requestId != 0) revert AlreadyVerified(claimant, traitId);\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/Registry.sol:415:52\n    │\n415 │             if (pendingOf[claimant][traitId] != 0) revert AlreadyPending(claimant, traitId);\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/Registry.sol:417:50\n    │\n417 │             if (_shared[traitId].requestId != 0) revert FactAlreadyStored(traitId);\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/Registry.sol:418:46\n    │\n418 │             if (sharedPending[traitId] != 0) revert AlreadyPending(claimant, traitId);\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/Registry.sol:391:13\n    │\n391 │         if (block.timestamp < uint256(p.requestedAt) + ABANDON_AFTER) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:430:58\n    │\n430 │         _pending[requestId] = Pending(claimant, traitId, uint64(block.timestamp), qh);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:462:13\n    │\n462 │             emit Missed(requestId, p.traitId, reason);\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/Registry.sol:468:13\n    │\n468 │             emit SharedFactStored(p.traitId, requestId, n);\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/Registry.sol:565:9\n    │\n565 │         emit Verified(claimant, traitId, requestId, oracleRequestId);\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/Registry.sol:567:27\n    │\n567 │         if (tokenId != 0) emit MetadataUpdate(tokenId);\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/Registry.sol:532:13\n    │\n532 │         if (block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) return 7;\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/Registry.sol:532:46\n    │\n532 │         if (block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) return 7;\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:632:14\n    │\n632 │         if (!found) revert NotInList();\n    │              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:693:9\n    │\n693 │         emit PoolSpent(msg.sender, traitId, requestId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:689:40\n    │\n689 │         if (!_isCatalogChain(traitId)) revert NotACatalogChainTrait(traitId);\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/Registry.sol:690:44\n    │\n690 │         if (poolUsed[msg.sender][traitId]) revert PoolAlreadyUsed(msg.sender, traitId);\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/Registry.sol:679:13\n    │\n679 │         if (block.timestamp < uint256(deployedAt) + POOL_OPENS_AFTER) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/Registry.sol:680:27\n    │\n680 │         (, bool joined) = curator.firstHourOf(msg.sender);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:460:17\n    │\n460 │         vm.warp(block.timestamp + 14 days);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:680:17\n    │\n680 │         vm.warp(block.timestamp + 1 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/Attestations.t.sol:134:17\n    │\n112 │             vm.chainId(4663);\n    │             ──────────────── `vm.chainId` changes this environment here\n    ‡\n134 │                 block.chainid,\n    │                 ━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/Attestations.t.sol:134:17\n    │\n114 │             vm.chainId(1);\n    │             ───────────── `vm.chainId` changes this environment here\n    ‡\n134 │                 block.chainid,\n    │                 ━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/Registry.t.sol:24:52\n   │\n24 │         assertEq(registry.mintedAtBlock(1), uint64(block.number));\n   │                                                    ━━━━━━━━━━━━\n   ‡\n31 │         vm.roll(block.number + 10);\n   │         ────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/Registry.t.sol:31:17\n   │\n31 │         vm.roll(block.number + 10);\n   │         ────────━━━━━━━━━━━━────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` 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:395:17\n    │\n395 │         vm.warp(block.timestamp + 14 days - 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:398:17\n    │\n398 │         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":12843,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Templates.t.sol:TemplatesTest\n[PASS] test_allTenBodiesAreByteExact() (gas: 1449630)\n[PASS] test_allTenQuestionHashesEqualThePlanes() (gas: 2178094)\n[PASS] test_bodyIsDeterministicInClaimantAndDiffersAcrossClaimants() (gas: 461117)\n[PASS] test_directAndUnknownIdsHaveNoBody() (gas: 60757)\n[PASS] test_hexMinAndCatalogWindows() (gas: 147064)\n[PASS] test_traitNamesAndClasses() (gas: 112555)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 11.06ms (9.02ms CPU time)\n\nRan 6 tests for test/Artifacts.t.sol:ArtifactsTest\n[PASS] test_constructorRejectsUnsettledOrUnavailableCurator() (gas: 260692)\n[PASS] test_constructorRejectsZeroAddressesAndStoresTheRest() (gas: 5746)\n[PASS] test_deployScriptUsesTheFiveStaticAddresses() (gas: 25444736)\n[PASS] test_noForbiddenOpcodesInRuntime() (gas: 38798332)\n[PASS] test_noImmutableReferencesInAnyArtifact() (gas: 68976489)\n[PASS] test_twoDeploymentsHaveIdenticalRuntimeCode() (gas: 1055878)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 171.55ms (97.01ms CPU time)\n\nRan 5 tests for test/Goldens.t.sol:GoldensTest\n[PASS] test_escapeJsonNeutralisesMarkup() (gas: 42667)\n[PASS] test_goldenSyntheticDirect() (gas: 2885150)\n[PASS] test_goldenSyntheticOracle() (gas: 7516638)\n[PASS] test_goldenSyntheticWidthThroughTheRenderer() (gas: 17745124)\n[PASS] test_templateArtifactsMatchTheCompiledConstants() (gas: 532258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 197.77ms (79.53ms CPU time)\n\nRan 10 tests for test/ReviewChanges.t.sol:ReviewChangesTest\n[PASS] test_fuzz_emptyFixedArgRequiresZeroValueForT1AndT2(uint256) (runs: 256, μ: 2956413, ~: 2956285)\nLogs:\n  Bound result 274194223023662351769645886551908\n\n[PASS] test_fuzz_ordinalShowsLowestVerifiedId(uint8) (runs: 256, μ: 4307289, ~: 4310016)\nLogs:\n  Bound result 1\n\n[PASS] test_hugeAnswerClearsUintBoolAndSharedRequestsUnderStipend() (gas: 26374539)\n[PASS] test_hugeSignatureClearsPendingAndAllowsImmediateRetry() (gas: 6836433)\n[PASS] test_metadataReportsMinimaEvenWhenSignedPanelIsLarger() (gas: 5354879)\n[PASS] test_scalarAnswerLengthPrecedesChainSignerAndClaimedType() (gas: 17758909)\n[PASS] test_sharedAnswerUpperBoundPrecedesChainAndSigner() (gas: 4501005)\n[PASS] test_signatureLengthPrecedesAnswerLengthAndChain() (gas: 37648575)\n[PASS] test_unknownRequestStillPrecedesDynamicSizeChecks() (gas: 12869694)\n[PASS] test_validationPrecedenceAfterSizes() (gas: 18078180)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 207.09ms (473.21ms CPU time)\n\nRan 25 tests for test/Registry.t.sol:RegistryTest\n[PASS] test_abandonOnlyAfterFourteenDaysAndStaleCallbackLeavesSuccessor() (gas: 3290583)\n[PASS] test_anyoneReadsAnyWalletAndNothingUsesTxOrigin() (gas: 1220735)\n[PASS] test_attestationForAnotherConsumerOrChainIsNeverAccepted() (gas: 3212156)\n[PASS] test_callbacksRejectEveryoneButTheIntake() (gas: 1629482)\n[PASS] test_claimSponsoredRules() (gas: 5273488)\n[PASS] test_directTraitsAreLiveAndNeedNoCard() (gas: 604852)\n[PASS] test_fuzz_tiersAreMonotone(uint8,bool,uint32,uint128,uint32,uint8) (runs: 256, μ: 699649, ~: 694987)\n[PASS] test_malformedEnvelopeIsNotDeliveredAndStaysPending() (gas: 1560317)\n[PASS] test_mintOncePerWalletAndTransfersKeepClaimant() (gas: 956553)\n[PASS] test_mintWithoutFeeReverts() (gas: 47096)\n[PASS] test_missReasons() (gas: 29425064)\n[PASS] test_noReceiveOrFallback() (gas: 57797)\n[PASS] test_nonMemberIsNeverAnEarlyBird() (gas: 231583)\n[PASS] test_onFailureClearsAndAllowsRetry() (gas: 3004600)\n[PASS] test_onResultGasWorstCase() (gas: 2319312)\nLogs:\n  onResult worst-case gas: 164954\n\n[PASS] test_poolIsTheBalanceAndOnlyLeavesThroughSponsoredRequests() (gas: 5220535)\n[PASS] test_reentrantTokenCannotReenterMint() (gas: 1250303)\n[PASS] test_registerSpecAssignsSequentialIdsAndIsImmutable() (gas: 1212776)\n[PASS] test_sharedFactBadEnvelopeIsAMissAndCanBeRequestedAgain() (gas: 6921280)\n[PASS] test_sharedFactFlow() (gas: 2477230)\n[PASS] test_specGuards() (gas: 1336670)\n[PASS] test_supportsERC4906AndERC721() (gas: 25952)\n[PASS] test_upgradeGuards() (gas: 6031775)\n[PASS] test_upgradeHappyPathMarksTraitAndRefreshesCard() (gas: 2535856)\n[PASS] test_upgradeWithoutCardAttachesToClaimant() (gas: 1894340)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 217.08ms (200.45ms CPU time)\n\nRan 11 tests for test/fork/Mainnet.fork.t.sol:MainnetForkTest\n[SKIP] test_fork_attestationSignedForAnotherConsumerMissesOnTheRealIntake() (gas: 0)\n[SKIP] test_fork_curatorIsSettledWithTheBriefsConstants() (gas: 0)\n[SKIP] test_fork_firstContributorIsAnHourZeroEarlyBird() (gas: 0)\n[SKIP] test_fork_intakeV2SellsTheActionAsTheBriefRecords() (gas: 0)\n[SKIP] test_fork_lastContributorIsNoEarlyBird() (gas: 0)\n[SKIP] test_fork_memberMintsAndRendersAgainstTheRealCurator() (gas: 0)\n[SKIP] test_fork_nonMemberReadsZeroFalseAndHasNoCuratorTrait() (gas: 0)\n[SKIP] test_fork_operatorTraitReadsTheRealCollectionAndGuardsZero() (gas: 0)\n[SKIP] test_fork_pinnedBlockIsTheOneRecorded() (gas: 0)\n[SKIP] test_fork_thousandthContributorJoinedInsideTheFirstThousandWindow() (gas: 0)\n[SKIP] test_fork_upgradeThroughTheRealIntakeThenCompleteFromTheWriter() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 11 skipped; finished in 237.98ms (676.81µs CPU time)\n\nRan 3 tests for test/Attestations.t.sol:AttestationsTest\n[PASS] test_allFiveRecoverTheAttesterUnderTheirOwnDomainOnly() (gas: 2557239)\n[PASS] test_loaderRejectsUnknownAnswerTypeNames() (gas: 4845)\n[PASS] test_protocolVectorDigestAndSelector() (gas: 811215)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 237.95ms (7.58ms CPU time)\n\nRan 10 tests for test/ReReview.t.sol:ReReviewTest\n[PASS] test_coldGas_firstCommunityVerificationWithACard() (gas: 2400602)\nLogs:\n  cold onResult gas, first community verification with a card: 133356\n\n[PASS] test_coldGas_sharedFact64Catalog() (gas: 1739406)\nLogs:\n  cold onResult gas, 64-address shared fact (catalog 1201): 164087\n\n[PASS] test_coldGas_sharedFact64Community() (gas: 2100980)\nLogs:\n  cold onResult gas, 64-address shared fact (community T3): 170445\n\n[PASS] test_communityAttributesAppearOnlyForVerifiedSpecs() (gas: 3799250)\n[PASS] test_constructorReadsIsSettledWithoutWriting() (gas: 137184)\n[PASS] test_hugeSignatureOnCommunitySharedFactAndCardRequestClearsUnderStipend() (gas: 12212719)\n[PASS] test_lowerOrdinalAcquiredLaterReplacesTheHigherOne() (gas: 7462043)\n[PASS] test_sameSignedEvidenceSatisfiesAnotherRequestWithTheSameQuestion() (gas: 3260613)\n[PASS] test_specIdsEndAt65534() (gas: 894575)\n[PASS] test_unusedFixedValIsRefusedAndAnEmptyFilterIsNotSerialised() (gas: 1301526)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 237.98ms (28.60ms CPU time)\n\nRan 32 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_abandonedPoolRequestKeepsPoolUsedAndLateCallbackIsIgnored() (gas: 1738180)\n[PASS] test_abandonedSharedFactCanBeRequestedAgainAndTheLateAnswerIsIgnored() (gas: 3059049)\n[PASS] test_attestationForAnotherClaimantIsAMissForThisRequest() (gas: 3242455)\n[PASS] test_attestationForAnotherTraitWithTheSameWindowIsAMiss() (gas: 3245436)\n[PASS] test_callbackStarvedOfGasIsNotDeliveredAndStaysPending() (gas: 1692065)\n[PASS] test_cardShowsAtMostThirtyTwoCommunityIdsAndCountsThemAll() (gas: 82794592)\n[PASS] test_claimSponsoredWhilePendingOrVerifiedReverts() (gas: 2063672)\n[PASS] test_communityT3SpecIsASharedFactWithItsOwnHead() (gas: 2416997)\n[PASS] test_everyTemplateVerifiesUnderTheStipendWithACard() (gas: 11682933)\n[PASS] test_expiryAtTheExactSecondStillPassesAndOneLaterDoesNot() (gas: 3239713)\n[PASS] test_fuzz_anyFieldAlteredAfterSigningIsASignatureMiss(uint8,uint256) (runs: 512, μ: 1651815, ~: 1653325)\nLogs:\n  Bound result 12\n\n[PASS] test_fuzz_applySharedFactOnlyWithinTheHead(uint8,uint8) (runs: 256, μ: 1776839, ~: 1760774)\nLogs:\n  Bound result 36\n  Bound result 3\n\n[PASS] test_fuzz_boolAnswerMustBeExactlyZeroOrOne(uint256) (runs: 512, μ: 2075591, ~: 2074903)\n[PASS] test_fuzz_countAnswerAgainstTheThreshold(uint256,bytes1,bool) (runs: 512, μ: 1652615, ~: 1625083)\n[PASS] test_fuzz_expiryAndClockSkewBoundaries(uint64,uint64) (runs: 512, μ: 1650333, ~: 1640547)\n[PASS] test_fuzz_hasTraitAndTraitsOfNeverRevert(address,uint16,uint8,bool,uint8) (runs: 512, μ: 325401, ~: 333439)\n[PASS] test_fuzz_maximalSpecRegistersComposesAndFitsTheBody(uint8,uint256,uint256) (runs: 64, μ: 2474940, ~: 2712007)\nLogs:\n  Bound result 1\n  Bound result 80558067\n\n[PASS] test_fuzz_panelAndQuorumBoundaries(uint16,uint16,uint16) (runs: 512, μ: 1652655, ~: 1639527)\n[PASS] test_fuzz_panelTraitNeedsElevenAndSeven(uint16,uint16,uint16) (runs: 512, μ: 2081348, ~: 2068509)\n[PASS] test_fuzz_specBodyIsDeterministicAndClaimantBound(address,address) (runs: 256, μ: 857041, ~: 857041)\n[PASS] test_fuzz_upgradeChargesExactlyKTimesPriceAndLeavesThePoolAlone(uint8,uint256) (runs: 256, μ: 4987147, ~: 4215519)\nLogs:\n  Bound result 9\n  Bound result 9839\n\n[PASS] test_fuzz_upgradeRejectsEveryIdThatIsNotAnOracleTrait(uint16) (runs: 256, μ: 209727, ~: 209234)\n[PASS] test_fuzz_windowMustEqualTheCanonicalOne(uint64,uint64) (runs: 512, μ: 1640088, ~: 1640078)\n[PASS] test_onFailureRecordsWhatItIsToldAndStoresNothing() (gas: 3062608)\n[PASS] test_questionHashIsBoundToTheClaimantAndTheTrait() (gas: 685421)\n[PASS] test_reentrantTokenCannotReenterAnyIMDMovingFunction() (gas: 7515159)\n[PASS] test_sharedFactWorstCaseEnvelopeUnderTheStipend() (gas: 3967964)\n[PASS] test_signatureShapesThatDoNotRecover() (gas: 9332627)\n[PASS] test_tokenURIDependsOnlyOnTheClaimantsFacts() (gas: 8730239)\n[PASS] test_traitClassForEveryCatalogIdAndRevertsForUnknown() (gas: 703191)\n[PASS] test_upgradeSponsoredDrawsAllNineAndRefusesDuplicates() (gas: 12969772)\n[PASS] test_verifiedWindowIsTheCanonicalWindowForEveryOracleId() (gas: 16454904)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 238.08ms (2.19s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariant_oneCardPerClaimantWithImmutableClaimant\n[PASS] invariant_poolOnlyLeavesThroughSponsoredRequests\n InvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------+-------------------+-------+---------+----------╮\n| Contract | Selector          | Calls | Reverts | Discards |\n+===========================================================+\n| Handler  | claimSponsored    | 3315  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | mintCard          | 3321  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | sponsor           | 3263  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | transfer          | 3256  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | upgradeAndDeliver | 3229  | 0       | 0        |\n╰----------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1814885056875805722\n  Bound result 606418699938549108\n  Bound result 1992817119764461367\n  Bound result 15782\n  Bound result 517353454109079378\n  Bound result 11552\n  Bound result 1746\n  Bound result 216489206269741511\n  Bound result 1083544602872529393\n  Bound result 885243032502314759\n  Bound result 20986\n  Bound result 1748354769275862186\n  Bound result 1420651875236614120\n  Bound result 1473876781168701788\n  Bound result 11044084134299\n  Bound result 453924277140253777\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.95s (4.95s CPU time)\n\nRan 3 tests for test/InvariantsExtended.t.sol:InvariantsExtendedTest\n[PASS]\nInvariantsExtendedTest invariants:\n[PASS] invariant_markedExactlyWhenAPassingAttestationWasDelivered\n[PASS] invariant_oneCardPerClaimant\n[PASS] invariant_poolIsFeesPlusDonationsMinusSponsoredRequests\n[PASS] invariant_sharedFactsAreHashesStoredOnlyOnDelivery\n[PASS] invariant_specsAreImmutable\n InvariantsExtendedTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭-------------+-------------------+-------+---------+----------╮\n| Contract    | Selector          | Calls | Reverts | Discards |\n+==============================================================+\n| FullHandler | abandonLate       | 243   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | applyShared       | 268   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | claimSponsored    | 315   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverFalse      | 277   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTampered   | 281   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTrue       | 278   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | donate            | 284   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | failRequest       | 296   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | mintCard          | 304   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | registerSpec      | 307   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | replayConsumed    | 306   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | requestSharedFact | 289   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | sponsor           | 288   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | transfer          | 303   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradePaid       | 287   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradeSponsored  | 282   | 0       | 0        |\n╰-------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 884573073634546777\n  Bound result 12\n  Bound result 4\n  Bound result 3\n  Bound result 1183\n  Bound result 20575\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 16\n  Bound result 1127189976595617416\n  Bound result 5\n  Bound result 300000003597847425\n  Bound result 2\n  Bound result 2\n  Bound result 2452037512764515276\n\n[PASS] test_handlerReplayOfAConsumedIdChangesNothing() (gas: 1919671)\n[PASS] test_handlerSponsoredSelectionAcceptsMaxSeed() (gas: 4069668)\nLogs:\n  Bound result 3000000000000000000\n  Bound result 3\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.65s (12.65s CPU time)\n\nRan 11 test suites in 12.65s (19.36s CPU time): 101 tests passed, 0 failed, 11 skipped (112 total tests)\n","passed":true},{"durationMs":190,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Registry.abandon(bytes32)\",\"Registry.applySharedFact(uint16,address[])\",\"Registry.approve(address,uint256)\",\"Registry.claimSponsored(uint16)\",\"Registry.mintCard()\",\"Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Registry.onResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Registry.registerSpec((uint8,address,string,string,string,uint256,string,uint8,uint256,uint64,uint64,string))\",\"Registry.requestSharedFact(uint16,uint256)\",\"Registry.safeTransferFrom(address,address,uint256)\",\"Registry.safeTransferFrom(address,address,uint256,bytes)\",\"Registry.setApprovalForAll(address,bool)\",\"Registry.sponsor(uint256)\",\"Registry.transferFrom(address,address,uint256)\",\"Registry.upgrade(uint16[],uint256)\",\"Registry.upgradeSponsored(uint256,uint16[])\"],\"files\":{\".gitignore\":8,\".gitmodules\":6,\"CATALOG.md\":250,\"CONCEPT.md\":196,\"DISCLOSURE.md\":12,\"INTEGRATION.md\":305,\"LICENSE\":21,\"README.md\":258,\"TEMPLATES.md\":154,\"foundry.toml\":44,\"reference/Intake.sol\":5175,\"reference/IntakeV2.sol\":5240,\"reference/PROVENANCE.md\":44,\"reference/abi/IMD.json\":1684,\"reference/abi/IdentityMD.json\":894,\"reference/abi/Intake.json\":955,\"reference/abi/IntakeV2.json\":1070,\"reference/abi/WhitelistCurator.json\":794,\"reference/anchors/headers.json\":61,\"reference/attestations/2026-10-10-link-pilot.json\":92,\"reference/attestations/2026-10-10-meatbag-consumer.json\":104,\"reference/attestations/2026-10-11-feed-consumer-v2.json\":105,\"reference/attestations/2026-10-11-nonce-false.json\":92,\"reference/attestations/2026-10-11-nonce-true.json\":92,\"reference/attestations/README.md\":29,\"reference/intake/completions.json\":147,\"reference/list-record/src/ListRecord.sol\":169,\"reference/list-record/src/ListRecordRenderer.sol\":126,\"reference/list-record/src/interfaces/IListRecordRenderer.sol\":29,\"reference/list-record/src/lib/SSTORE2.sol\":39,\"reference/list-record/src/lib/Str.sol\":54,\"reference/list-record/test/Renderer.t.sol\":165,\"reference/list-record/test/RendererMechanism.t.sol\":203,\"reference/list-record/test/Template.t.sol\":293,\"reference/list-record/test/fixtures/golden_synthetic_held_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_held_uri.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_transferred_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_transferred_uri.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_width_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_width_uri.txt\":1,\"reference/plane/checks/1001-hour-savior.json\":81,\"reference/plane/checks/1102-ordinal-1000.json\":81,\"reference/plane/checks/1105-first-thousand.json\":81,\"reference/plane/checks/1201-top-32.json\":82,\"reference/plane/checks/1301-not-born-yesterday.json\":86,\"reference/plane/checks/701-still-here.json\":81,\"reference/plane/checks/801-last-stand.json\":81,\"reference/plane/checks/T2-log-sum-composed.json\":81,\"reference/plane/checks/T4-call-compare-reference.json\":81,\"reference/plane/checks/T5-community-composed.json\":86,\"reference/plane/questionHashes.json\":92,\"reference/plane/quotes/1001-hour-savior.json\":20,\"reference/plane/quotes/1102-ordinal-1000.json\":20,\"reference/plane/quotes/1105-first-thousand.json\":20,\"reference/plane/quotes/1201-top-32.json\":20,\"reference/plane/quotes/1301-not-born-yesterday.json\":20,\"reference/plane/quotes/701-still-here.json\":20,\"reference/plane/quotes/801-last-stand.json\":20,\"reference/plane/quotes/T2-log-sum-composed.json\":20,\"reference/plane/quotes/T4-call-compare-reference.json\":20,\"reference/plane/quotes/T5-community-composed.json\":20,\"remappings.txt\":2,\"script/Deploy.s.sol\":35,\"src/Composer.sol\":627,\"src/Registry.sol\":695,\"src/Renderer.sol\":210,\"src/TemplateData.sol\":15,\"src/Types.sol\":41,\"src/interfaces/IIDMD.sol\":8,\"src/interfaces/IIntake.sol\":29,\"src/interfaces/IOracleConsumer.sol\":38,\"src/interfaces/IWhitelistCurator.sol\":53,\"template/blob.hex\":1,\"template/card.svg\":1,\"template/offsets.txt\":1,\"templates/fixtures/1001-hour-savior.json\":22,\"templates/fixtures/1102-ordinal-1000.json\":22,\"templates/fixtures/1105-first-thousand.json\":22,\"templates/fixtures/1201-top-32.json\":22,\"templates/fixtures/1301-not-born-yesterday.json\":24,\"templates/fixtures/701-still-here.json\":22,\"templates/fixtures/801-last-stand.json\":22,\"templates/fixtures/T2-log-sum-composed.json\":23,\"templates/fixtures/T4-call-compare-reference.json\":21,\"templates/fixtures/T5-community-composed.json\":24,\"test/.gitkeep\":0,\"test/Adversarial.t.sol\":813,\"test/Artifacts.t.sol\":124,\"test/Attestations.t.sol\":195,\"test/Base.t.sol\":157,\"test/Goldens.t.sol\":157,\"test/Invariants.t.sol\":124,\"test/InvariantsExtended.t.sol\":504,\"test/NOTES.md\":148,\"test/ReReview.t.sol\":248,\"test/Registry.t.sol\":762,\"test/ReviewChanges.t.sol\":212,\"test/Templates.t.sol\":149,\"test/fixtures/golden_synthetic_direct_preimage.txt\":1,\"test/fixtures/golden_synthetic_direct_svg.txt\":1,\"test/fixtures/golden_synthetic_direct_uri.txt\":1,\"test/fixtures/golden_synthetic_oracle_preimage.txt\":1,\"test/fixtures/golden_synthetic_oracle_svg.txt\":1,\"test/fixtures/golden_synthetic_oracle_uri.txt\":1,\"test/fixtures/golden_synthetic_width_preimage.txt\":1,\"test/fixtures/golden_synthetic_width_svg.txt\":1,\"test/fixtures/golden_synthetic_width_uri.txt\":1,\"test/fork/Mainnet.fork.t.sol\":330,\"test/mocks/Mocks.sol\":231,\"tools/gen_template.py\":466,\"tools/test_gen_template.py\":104},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c89510c486c6fbb23550185c17e1ed3b4d4180a4472a00738bfb9bdfb1d9b05c","verifiedTreeHash":"5a4fbfd34fd4a3a077ee459c6f0cf87e222c88f7","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":11255,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.24\nSolc 0.8.24 finished in 10.83s\nCompiler run successful!\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/Renderer.sol:63:43\n   │\n63 │                 mcopy(add(add(out, 0x20), off), add(add(tpl, 0x20), start), len)\n   │                                           ━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Composer.sol:189:74\n    │\n189 │             if (ICatalogRegistry(registry).hasTrait(wallet, all[i])) tmp[n++] = all[i];\n    │                                                                          ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Composer.sol:189:17\n    │\n189 │             if (ICatalogRegistry(registry).hasTrait(wallet, all[i])) tmp[n++] = all[i];\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Renderer.sol:194:21\n    │\n194 │                 out[o++] = \"\\\\\";\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/Composer.sol:245:43\n    │\n245 │                 if (item[i] != prefix[i]) revert BadSpec(\"item\");\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/Composer.sol:289:22\n    │\n289 │             if (!ok) revert BadSpec(\"name\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Renderer.sol:185:42\n    │\n185 │             if (ch == '\"' || ch == \"\\\\\") extra += 1;\n    │                                          ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Registry.sol:58:38\n   │\n58 │     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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Composer.sol:327:61\n    │\n327 │             if (bytes(q.values[i]).length > MAX_DEFINITION) revert DefinitionTooLong(bytes(q.values[i]).length);\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:187:22\n    │\n187 │         deployedAt = 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Composer.sol:615:13\n    │\n615 │             n++;\n    │             ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-oz-erc721-mint]: `ERC721._mint` does not check that the recipient can receive the token; use `_safeMint`\n    ╭▸ src/Registry.sol:201:9\n    │\n201 │         _mint(msg.sender, tokenId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-oz-erc721-mint\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:200:34\n    │\n200 │         mintedAtBlock[tokenId] = uint64(block.number);\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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:235:37\n    │\n235 │             if (c.traits[i] >= 701) n++;\n    │                                     ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:240:46\n    │\n240 │             if (c.traits[i] >= 701) c.oracle[k++] = _meta(claimant, c.traits[i]);\n    │                                              ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:347:16\n    │\n347 │         return composer.catalogSpec(traitId, address(curator));\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:343:30\n    │\n343 │             if (s.kind == 0) revert NotAnOracleTrait(traitId);\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/Registry.sol:346:78\n    │\n346 │         if (!_isCatalogChain(traitId) && traitId != 1201 && traitId != 1301) revert NotAnOracleTrait(traitId);\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `pendingOf` is updated\n    ╭▸ src/Registry.sol:422:21\n    │\n422 │           requestId = intake.requestWithFailure(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n423 │ ┃             ACTION,\n424 │ ┃             body,\n425 │ ┃             IIntake.Callback(address(this), this.onResult.selector),\n    ‡ ┃\n428 │ ┃             price\n429 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:357:16\n    │\n357 │         return composer.compose(s, claimant, address(this), traitId == 1301, address(curator));\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Registry.sol:422:21\n    │\n422 │           requestId = intake.requestWithFailure(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n423 │ ┃             ACTION,\n424 │ ┃             body,\n425 │ ┃             IIntake.Callback(address(this), this.onResult.selector),\n    ‡ ┃\n428 │ ┃             price\n429 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:433:9\n    │\n433 │         emit TraitRequested(claimant, traitId, requestId, qh);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:375:46\n    │\n375 │             if (_isDirect(id) || id == 1201) revert NotAnOracleTrait(id);\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/Registry.sol:378:32\n    │\n378 │                 if (kind == 0) revert NotAnOracleTrait(id);\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/Registry.sol:379:32\n    │\n379 │                 if (kind == 3) revert NotASharedFact(id);\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/Registry.sol:381:17\n    │\n381 │                 revert NotAnOracleTrait(id);\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/Registry.sol:414:62\n    │\n414 │             if (_verified[claimant][traitId].requestId != 0) revert AlreadyVerified(claimant, traitId);\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/Registry.sol:415:52\n    │\n415 │             if (pendingOf[claimant][traitId] != 0) revert AlreadyPending(claimant, traitId);\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/Registry.sol:417:50\n    │\n417 │             if (_shared[traitId].requestId != 0) revert FactAlreadyStored(traitId);\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/Registry.sol:418:46\n    │\n418 │             if (sharedPending[traitId] != 0) revert AlreadyPending(claimant, traitId);\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/Registry.sol:391:13\n    │\n391 │         if (block.timestamp < uint256(p.requestedAt) + ABANDON_AFTER) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Registry.sol:430:58\n    │\n430 │         _pending[requestId] = Pending(claimant, traitId, uint64(block.timestamp), qh);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:462:13\n    │\n462 │             emit Missed(requestId, p.traitId, reason);\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/Registry.sol:468:13\n    │\n468 │             emit SharedFactStored(p.traitId, requestId, n);\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/Registry.sol:565:9\n    │\n565 │         emit Verified(claimant, traitId, requestId, oracleRequestId);\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/Registry.sol:567:27\n    │\n567 │         if (tokenId != 0) emit MetadataUpdate(tokenId);\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/Registry.sol:532:13\n    │\n532 │         if (block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) return 7;\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/Registry.sol:532:46\n    │\n532 │         if (block.timestamp > a.expiresAt || a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) return 7;\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Registry.sol:632:14\n    │\n632 │         if (!found) revert NotInList();\n    │              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Registry.sol:693:9\n    │\n693 │         emit PoolSpent(msg.sender, traitId, requestId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/Registry.sol:689:40\n    │\n689 │         if (!_isCatalogChain(traitId)) revert NotACatalogChainTrait(traitId);\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/Registry.sol:690:44\n    │\n690 │         if (poolUsed[msg.sender][traitId]) revert PoolAlreadyUsed(msg.sender, traitId);\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/Registry.sol:679:13\n    │\n679 │         if (block.timestamp < uint256(deployedAt) + POOL_OPENS_AFTER) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/Registry.sol:680:27\n    │\n680 │         (, bool joined) = curator.firstHourOf(msg.sender);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:446:17\n    │\n446 │         vm.warp(block.timestamp + 14 days);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:666:17\n    │\n666 │         vm.warp(block.timestamp + 1 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/Attestations.t.sol:134:17\n    │\n112 │             vm.chainId(4663);\n    │             ──────────────── `vm.chainId` changes this environment here\n    ‡\n134 │                 block.chainid,\n    │                 ━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/Attestations.t.sol:134:17\n    │\n114 │             vm.chainId(1);\n    │             ───────────── `vm.chainId` changes this environment here\n    ‡\n134 │                 block.chainid,\n    │                 ━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/Registry.t.sol:24:52\n   │\n24 │         assertEq(registry.mintedAtBlock(1), uint64(block.number));\n   │                                                    ━━━━━━━━━━━━\n   ‡\n31 │         vm.roll(block.number + 10);\n   │         ────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/Registry.t.sol:31:17\n   │\n31 │         vm.roll(block.number + 10);\n   │         ────────━━━━━━━━━━━━────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` 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:395:17\n    │\n395 │         vm.warp(block.timestamp + 14 days - 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:398:17\n    │\n398 │         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":13263,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Templates.t.sol:TemplatesTest\n[PASS] test_allTenBodiesAreByteExact() (gas: 1449630)\n[PASS] test_allTenQuestionHashesEqualThePlanes() (gas: 2178094)\n[PASS] test_bodyIsDeterministicInClaimantAndDiffersAcrossClaimants() (gas: 461117)\n[PASS] test_directAndUnknownIdsHaveNoBody() (gas: 60757)\n[PASS] test_hexMinAndCatalogWindows() (gas: 147064)\n[PASS] test_traitNamesAndClasses() (gas: 112555)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.67ms (9.15ms CPU time)\n\nRan 11 tests for test/fork/Mainnet.fork.t.sol:MainnetForkTest\n[SKIP] test_fork_attestationSignedForAnotherConsumerMissesOnTheRealIntake() (gas: 0)\n[SKIP] test_fork_curatorIsSettledWithTheBriefsConstants() (gas: 0)\n[SKIP] test_fork_firstContributorIsAnHourZeroEarlyBird() (gas: 0)\n[SKIP] test_fork_intakeV2SellsTheActionAsTheBriefRecords() (gas: 0)\n[SKIP] test_fork_lastContributorIsNoEarlyBird() (gas: 0)\n[SKIP] test_fork_memberMintsAndRendersAgainstTheRealCurator() (gas: 0)\n[SKIP] test_fork_nonMemberReadsZeroFalseAndHasNoCuratorTrait() (gas: 0)\n[SKIP] test_fork_operatorTraitReadsTheRealCollectionAndGuardsZero() (gas: 0)\n[SKIP] test_fork_pinnedBlockIsTheOneRecorded() (gas: 0)\n[SKIP] test_fork_thousandthContributorJoinedInsideTheFirstThousandWindow() (gas: 0)\n[SKIP] test_fork_upgradeThroughTheRealIntakeThenCompleteFromTheWriter() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 11 skipped; finished in 109.16ms (764.27µs CPU time)\n\nRan 3 tests for test/Attestations.t.sol:AttestationsTest\n[PASS] test_allFiveRecoverTheAttesterUnderTheirOwnDomainOnly() (gas: 2557239)\n[PASS] test_loaderRejectsUnknownAnswerTypeNames() (gas: 4845)\n[PASS] test_protocolVectorDigestAndSelector() (gas: 811215)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 193.73ms (6.57ms CPU time)\n\nRan 6 tests for test/Artifacts.t.sol:ArtifactsTest\n[PASS] test_constructorRejectsUnsettledOrUnavailableCurator() (gas: 260692)\n[PASS] test_constructorRejectsZeroAddressesAndStoresTheRest() (gas: 5746)\n[PASS] test_deployScriptUsesTheFiveStaticAddresses() (gas: 25444736)\n[PASS] test_noForbiddenOpcodesInRuntime() (gas: 38798332)\n[PASS] test_noImmutableReferencesInAnyArtifact() (gas: 68976489)\n[PASS] test_twoDeploymentsHaveIdenticalRuntimeCode() (gas: 1055878)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 206.78ms (168.24ms CPU time)\n\nRan 25 tests for test/Registry.t.sol:RegistryTest\n[PASS] test_abandonOnlyAfterFourteenDaysAndStaleCallbackLeavesSuccessor() (gas: 3263301)\n[PASS] test_anyoneReadsAnyWalletAndNothingUsesTxOrigin() (gas: 1220735)\n[PASS] test_attestationForAnotherConsumerOrChainIsNeverAccepted() (gas: 3187674)\n[PASS] test_callbacksRejectEveryoneButTheIntake() (gas: 1629482)\n[PASS] test_claimSponsoredRules() (gas: 5246206)\n[PASS] test_directTraitsAreLiveAndNeedNoCard() (gas: 604852)\n[PASS] test_fuzz_tiersAreMonotone(uint8,bool,uint32,uint128,uint32,uint8) (runs: 256, μ: 709663, ~: 697992)\n[PASS] test_malformedEnvelopeIsNotDeliveredAndStaysPending() (gas: 1538126)\n[PASS] test_mintOncePerWalletAndTransfersKeepClaimant() (gas: 956553)\n[PASS] test_mintWithoutFeeReverts() (gas: 47096)\n[PASS] test_missReasons() (gas: 29319126)\n[PASS] test_noReceiveOrFallback() (gas: 57797)\n[PASS] test_nonMemberIsNeverAnEarlyBird() (gas: 231583)\n[PASS] test_onFailureClearsAndAllowsRetry() (gas: 2982409)\n[PASS] test_onResultGasWorstCase() (gas: 2319312)\nLogs:\n  onResult worst-case gas: 164954\n\n[PASS] test_poolIsTheBalanceAndOnlyLeavesThroughSponsoredRequests() (gas: 5220535)\n[PASS] test_reentrantTokenCannotReenterMint() (gas: 1166283)\n[PASS] test_registerSpecAssignsSequentialIdsAndIsImmutable() (gas: 1212776)\n[PASS] test_sharedFactBadEnvelopeIsAMissAndCanBeRequestedAgain() (gas: 6878725)\n[PASS] test_sharedFactFlow() (gas: 2455039)\n[PASS] test_specGuards() (gas: 1336670)\n[PASS] test_supportsERC4906AndERC721() (gas: 25952)\n[PASS] test_upgradeGuards() (gas: 6031775)\n[PASS] test_upgradeHappyPathMarksTraitAndRefreshesCard() (gas: 2513687)\n[PASS] test_upgradeWithoutCardAttachesToClaimant() (gas: 1872149)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 223.92ms (107.49ms CPU time)\n\nRan 10 tests for test/ReviewChanges.t.sol:ReviewChangesTest\n[PASS] test_fuzz_emptyFixedArgRequiresZeroValueForT1AndT2(uint256) (runs: 256, μ: 2956421, ~: 2956189)\nLogs:\n  Bound result 15\n\n[PASS] test_fuzz_ordinalShowsLowestVerifiedId(uint8) (runs: 256, μ: 4163357, ~: 4261079)\nLogs:\n  Bound result 0\n\n[PASS] test_hugeAnswerClearsUintBoolAndSharedRequestsUnderStipend() (gas: 26326893)\n[PASS] test_hugeSignatureClearsPendingAndAllowsImmediateRetry() (gas: 6809151)\n[PASS] test_metadataReportsMinimaEvenWhenSignedPanelIsLarger() (gas: 5327597)\n[PASS] test_scalarAnswerLengthPrecedesChainSignerAndClaimedType() (gas: 17690899)\n[PASS] test_sharedAnswerUpperBoundPrecedesChainAndSigner() (gas: 4468632)\n[PASS] test_signatureLengthPrecedesAnswerLengthAndChain() (gas: 37619511)\n[PASS] test_unknownRequestStillPrecedesDynamicSizeChecks() (gas: 12847503)\n[PASS] test_validationPrecedenceAfterSizes() (gas: 18015261)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 228.53ms (524.00ms CPU time)\n\nRan 5 tests for test/Goldens.t.sol:GoldensTest\n[PASS] test_escapeJsonNeutralisesMarkup() (gas: 42667)\n[PASS] test_goldenSyntheticDirect() (gas: 2885150)\n[PASS] test_goldenSyntheticOracle() (gas: 7489356)\n[PASS] test_goldenSyntheticWidthThroughTheRenderer() (gas: 17745124)\n[PASS] test_templateArtifactsMatchTheCompiledConstants() (gas: 532258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 235.85ms (68.26ms CPU time)\n\nRan 32 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_abandonedPoolRequestKeepsPoolUsedAndLateCallbackIsIgnored() (gas: 1715989)\n[PASS] test_abandonedSharedFactCanBeRequestedAgainAndTheLateAnswerIsIgnored() (gas: 3031767)\n[PASS] test_attestationForAnotherClaimantIsAMissForThisRequest() (gas: 3215173)\n[PASS] test_attestationForAnotherTraitWithTheSameWindowIsAMiss() (gas: 3218154)\n[PASS] test_callbackStarvedOfGasIsNotDeliveredAndStaysPending() (gas: 1669874)\n[PASS] test_cardShowsAtMostThirtyTwoCommunityIdsAndCountsThemAll() (gas: 82682798)\n[PASS] test_claimSponsoredWhilePendingOrVerifiedReverts() (gas: 2041481)\n[PASS] test_communityT3SpecIsASharedFactWithItsOwnHead() (gas: 2394806)\n[PASS] test_everyTemplateVerifiesUnderTheStipendWithACard() (gas: 11635287)\n[PASS] test_expiryAtTheExactSecondStillPassesAndOneLaterDoesNot() (gas: 3212431)\n[PASS] test_fuzz_anyFieldAlteredAfterSigningIsASignatureMiss(uint8,uint256) (runs: 512, μ: 1629924, ~: 1631326)\nLogs:\n  Bound result 9\n\n[PASS] test_fuzz_applySharedFactOnlyWithinTheHead(uint8,uint8) (runs: 256, μ: 1755266, ~: 1737267)\nLogs:\n  Bound result 9\n  Bound result 0\n\n[PASS] test_fuzz_boolAnswerMustBeExactlyZeroOrOne(uint256) (runs: 512, μ: 2053639, ~: 2052676)\n[PASS] test_fuzz_countAnswerAgainstTheThreshold(uint256,bytes1,bool) (runs: 512, μ: 1631807, ~: 1602922)\n[PASS] test_fuzz_expiryAndClockSkewBoundaries(uint64,uint64) (runs: 512, μ: 1627207, ~: 1618356)\n[PASS] test_fuzz_hasTraitAndTraitsOfNeverRevert(address,uint16,uint8,bool,uint8) (runs: 512, μ: 322482, ~: 332632)\n[PASS] test_fuzz_maximalSpecRegistersComposesAndFitsTheBody(uint8,uint256,uint256) (runs: 64, μ: 2430839, ~: 2687339)\nLogs:\n  Bound result 2\n  Bound result 7719472615821079694904732333912527190217998977709370935963838933860875309329\n\n[PASS] test_fuzz_panelAndQuorumBoundaries(uint16,uint16,uint16) (runs: 512, μ: 1632299, ~: 1617489)\n[PASS] test_fuzz_panelTraitNeedsElevenAndSeven(uint16,uint16,uint16) (runs: 512, μ: 2060319, ~: 2046471)\n[PASS] test_fuzz_specBodyIsDeterministicAndClaimantBound(address,address) (runs: 256, μ: 857041, ~: 857041)\n[PASS] test_fuzz_upgradeChargesExactlyKTimesPriceAndLeavesThePoolAlone(uint8,uint256) (runs: 256, μ: 4946874, ~: 4215338)\nLogs:\n  Bound result 9\n  Bound result 27707003\n\n[PASS] test_fuzz_upgradeRejectsEveryIdThatIsNotAnOracleTrait(uint16) (runs: 256, μ: 209718, ~: 209264)\n[PASS] test_fuzz_windowMustEqualTheCanonicalOne(uint64,uint64) (runs: 512, μ: 1617898, ~: 1617899)\n[PASS] test_onFailureRecordsWhatItIsToldAndStoresNothing() (gas: 3062608)\n[PASS] test_questionHashIsBoundToTheClaimantAndTheTrait() (gas: 685421)\n[PASS] test_reentrantTokenCannotReenterAnyIMDMovingFunction() (gas: 1988454)\n[PASS] test_sharedFactWorstCaseEnvelopeUnderTheStipend() (gas: 3940682)\n[PASS] test_signatureShapesThatDoNotRecover() (gas: 7694597)\n[PASS] test_tokenURIDependsOnlyOnTheClaimantsFacts() (gas: 8708048)\n[PASS] test_traitClassForEveryCatalogIdAndRevertsForUnknown() (gas: 703191)\n[PASS] test_upgradeSponsoredDrawsAllNineAndRefusesDuplicates() (gas: 12969772)\n[PASS] test_verifiedWindowIsTheCanonicalWindowForEveryOracleId() (gas: 16403694)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 236.02ms (2.46s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariant_oneCardPerClaimantWithImmutableClaimant\n[PASS] invariant_poolOnlyLeavesThroughSponsoredRequests\n InvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------+-------------------+-------+---------+----------╮\n| Contract | Selector          | Calls | Reverts | Discards |\n+===========================================================+\n| Handler  | claimSponsored    | 3260  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | mintCard          | 3303  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | sponsor           | 3299  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | transfer          | 3206  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | upgradeAndDeliver | 3316  | 0       | 0        |\n╰----------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 932573689259965805\n  Bound result 1311044537460173945\n  Bound result 8856\n  Bound result 624154548061921153\n  Bound result 1606102873531158957\n  Bound result 919229783406121988\n  Bound result 1584436005730184329\n  Bound result 1369\n  Bound result 250\n  Bound result 145386255930678988\n  Bound result 1743410521584009414\n  Bound result 13872\n  Bound result 7557\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.13s (5.12s CPU time)\n\nRan 2 tests for test/InvariantsExtended.t.sol:InvariantsExtendedTest\n[PASS]\nInvariantsExtendedTest invariants:\n[PASS] invariant_markedExactlyWhenAPassingAttestationWasDelivered\n[PASS] invariant_oneCardPerClaimant\n[PASS] invariant_poolIsFeesPlusDonationsMinusSponsoredRequests\n[PASS] invariant_sharedFactsAreHashesStoredOnlyOnDelivery\n[PASS] invariant_specsAreImmutable\n InvariantsExtendedTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭-------------+-------------------+-------+---------+----------╮\n| Contract    | Selector          | Calls | Reverts | Discards |\n+==============================================================+\n| FullHandler | abandonLate       | 298   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | applyShared       | 307   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | claimSponsored    | 310   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverFalse      | 297   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTampered   | 302   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTrue       | 279   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | donate            | 300   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | failRequest       | 326   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | mintCard          | 307   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | registerSpec      | 328   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | requestSharedFact | 320   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | sponsor           | 303   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | transfer          | 281   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradePaid       | 312   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradeSponsored  | 338   | 0       | 0        |\n╰-------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 6684\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 3\n  Bound result 4\n  Bound result 1777093348565456866\n  Bound result 1\n  Bound result 23287\n  Bound result 15676\n\n[PASS] test_handlerSponsoredSelectionAcceptsMaxSeed() (gas: 4069601)\nLogs:\n  Bound result 3000000000000000000\n  Bound result 3\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.02s (13.02s CPU time)\n\nRan 10 test suites in 13.02s (19.59s CPU time): 90 tests passed, 0 failed, 11 skipped (101 total tests)\n","passed":true},{"durationMs":203,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Registry.abandon(bytes32)\",\"Registry.applySharedFact(uint16,address[])\",\"Registry.approve(address,uint256)\",\"Registry.claimSponsored(uint16)\",\"Registry.mintCard()\",\"Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Registry.onResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Registry.registerSpec((uint8,address,string,string,string,uint256,string,uint8,uint256,uint64,uint64,string))\",\"Registry.requestSharedFact(uint16,uint256)\",\"Registry.safeTransferFrom(address,address,uint256)\",\"Registry.safeTransferFrom(address,address,uint256,bytes)\",\"Registry.setApprovalForAll(address,bool)\",\"Registry.sponsor(uint256)\",\"Registry.transferFrom(address,address,uint256)\",\"Registry.upgrade(uint16[],uint256)\",\"Registry.upgradeSponsored(uint256,uint16[])\"],\"files\":{\".gitignore\":8,\".gitmodules\":6,\"CATALOG.md\":243,\"CONCEPT.md\":188,\"DISCLOSURE.md\":12,\"INTEGRATION.md\":301,\"LICENSE\":21,\"README.md\":242,\"TEMPLATES.md\":154,\"foundry.toml\":44,\"reference/Intake.sol\":5175,\"reference/IntakeV2.sol\":5240,\"reference/PROVENANCE.md\":44,\"reference/abi/IMD.json\":1684,\"reference/abi/IdentityMD.json\":894,\"reference/abi/Intake.json\":955,\"reference/abi/IntakeV2.json\":1070,\"reference/abi/WhitelistCurator.json\":794,\"reference/anchors/headers.json\":61,\"reference/attestations/2026-10-10-link-pilot.json\":92,\"reference/attestations/2026-10-10-meatbag-consumer.json\":104,\"reference/attestations/2026-10-11-feed-consumer-v2.json\":105,\"reference/attestations/2026-10-11-nonce-false.json\":92,\"reference/attestations/2026-10-11-nonce-true.json\":92,\"reference/attestations/README.md\":29,\"reference/intake/completions.json\":147,\"reference/list-record/src/ListRecord.sol\":169,\"reference/list-record/src/ListRecordRenderer.sol\":126,\"reference/list-record/src/interfaces/IListRecordRenderer.sol\":29,\"reference/list-record/src/lib/SSTORE2.sol\":39,\"reference/list-record/src/lib/Str.sol\":54,\"reference/list-record/test/Renderer.t.sol\":165,\"reference/list-record/test/RendererMechanism.t.sol\":203,\"reference/list-record/test/Template.t.sol\":293,\"reference/list-record/test/fixtures/golden_synthetic_held_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_held_uri.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_transferred_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_transferred_uri.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_width_svg.txt\":1,\"reference/list-record/test/fixtures/golden_synthetic_width_uri.txt\":1,\"reference/plane/checks/1001-hour-savior.json\":81,\"reference/plane/checks/1102-ordinal-1000.json\":81,\"reference/plane/checks/1105-first-thousand.json\":81,\"reference/plane/checks/1201-top-32.json\":82,\"reference/plane/checks/1301-not-born-yesterday.json\":86,\"reference/plane/checks/701-still-here.json\":81,\"reference/plane/checks/801-last-stand.json\":81,\"reference/plane/checks/T2-log-sum-composed.json\":81,\"reference/plane/checks/T4-call-compare-reference.json\":81,\"reference/plane/checks/T5-community-composed.json\":86,\"reference/plane/questionHashes.json\":92,\"reference/plane/quotes/1001-hour-savior.json\":20,\"reference/plane/quotes/1102-ordinal-1000.json\":20,\"reference/plane/quotes/1105-first-thousand.json\":20,\"reference/plane/quotes/1201-top-32.json\":20,\"reference/plane/quotes/1301-not-born-yesterday.json\":20,\"reference/plane/quotes/701-still-here.json\":20,\"reference/plane/quotes/801-last-stand.json\":20,\"reference/plane/quotes/T2-log-sum-composed.json\":20,\"reference/plane/quotes/T4-call-compare-reference.json\":20,\"reference/plane/quotes/T5-community-composed.json\":20,\"remappings.txt\":2,\"script/Deploy.s.sol\":35,\"src/Composer.sol\":627,\"src/Registry.sol\":695,\"src/Renderer.sol\":210,\"src/TemplateData.sol\":15,\"src/Types.sol\":41,\"src/interfaces/IIDMD.sol\":8,\"src/interfaces/IIntake.sol\":29,\"src/interfaces/IOracleConsumer.sol\":38,\"src/interfaces/IWhitelistCurator.sol\":53,\"template/blob.hex\":1,\"template/card.svg\":1,\"template/offsets.txt\":1,\"templates/fixtures/1001-hour-savior.json\":22,\"templates/fixtures/1102-ordinal-1000.json\":22,\"templates/fixtures/1105-first-thousand.json\":22,\"templates/fixtures/1201-top-32.json\":22,\"templates/fixtures/1301-not-born-yesterday.json\":24,\"templates/fixtures/701-still-here.json\":22,\"templates/fixtures/801-last-stand.json\":22,\"templates/fixtures/T2-log-sum-composed.json\":23,\"templates/fixtures/T4-call-compare-reference.json\":21,\"templates/fixtures/T5-community-composed.json\":24,\"test/.gitkeep\":0,\"test/Adversarial.t.sol\":762,\"test/Artifacts.t.sol\":124,\"test/Attestations.t.sol\":195,\"test/Base.t.sol\":157,\"test/Goldens.t.sol\":157,\"test/Invariants.t.sol\":124,\"test/InvariantsExtended.t.sol\":487,\"test/NOTES.md\":122,\"test/Registry.t.sol\":762,\"test/ReviewChanges.t.sol\":212,\"test/Templates.t.sol\":149,\"test/fixtures/golden_synthetic_direct_preimage.txt\":1,\"test/fixtures/golden_synthetic_direct_svg.txt\":1,\"test/fixtures/golden_synthetic_direct_uri.txt\":1,\"test/fixtures/golden_synthetic_oracle_preimage.txt\":1,\"test/fixtures/golden_synthetic_oracle_svg.txt\":1,\"test/fixtures/golden_synthetic_oracle_uri.txt\":1,\"test/fixtures/golden_synthetic_width_preimage.txt\":1,\"test/fixtures/golden_synthetic_width_svg.txt\":1,\"test/fixtures/golden_synthetic_width_uri.txt\":1,\"test/fork/Mainnet.fork.t.sol\":330,\"test/mocks/Mocks.sol\":225,\"tools/gen_template.py\":466,\"tools/test_gen_template.py\":104},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4561,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/Registry.sol:450: Registry.onResult(bytes32,OracleAttestation,bytes) (src/Registry.sol#450-472) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:490: Registry._rule(uint16) (src/Registry.sol#490-504) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:490: Registry._rule(uint16) (src/Registry.sol#490-504) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:490: Registry._rule(uint16) (src/Registry.sol#490-504) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:475: Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes) (src/Registry.sol#475-487) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:490: Registry._rule(uint16) (src/Registry.sol#490-504) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:388: Registry.abandon(bytes32) (src/Registry.sol#388-394) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/Registry.sol:412: Reentrancy in Registry._request(address,uint16,uint256) (src/Registry.sol#412-434):\n[medium/medium] uninitialized-local at src/Composer.sol:543: Composer.encodeBody(Composer.Question,address).defs (src/Composer.sol#543) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Registry.sol:238: Registry.cardOf(uint256).k (src/Registry.sol#238) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Renderer.sol:190: Renderer.escapeJson(bytes).o (src/Renderer.sol#190) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Registry.sol:625: Registry.applySharedFact(uint16,address[]).found (src/Registry.sol#625) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Composer.sol:613: Composer.hexMin(uint256).n (src/Composer.sol#613) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Composer.sol:187: Composer.traitsOf(address,address).n (src/Composer.sol#187) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Renderer.sol:101: Renderer._communityAttributes(Card).name (src/Renderer.sol#101) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Registry.sol:233: Registry.cardOf(uint256).n (src/Registry.sol#233) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Composer.sol:586: Composer.canonical(Composer.Question).defs (src/Composer.sol#586) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Renderer.sol:182: Renderer.escapeJson(bytes).extra (src/Renderer.sol#182) is a local variable never initialized\n[medium/medium] unused-return at src/Registry.sol:507: Registry._check(Registry.Pending,OracleAttestation,bytes,uint8,uint64,uint64) (src/Registry.sol#507-535) ignores return value by (signer,err,None) = ECDSA.tryRecover(attestationDigest(a),v,r,s) (src/Registry.sol#526)\n[medium/medium] unused-return at src/Registry.sol:678: Registry.claimSponsored(uint16) (src/Registry.sol#678-686) ignores return value by (None,joined) = curator.firstHourOf(msg.sender) (src/Registry.sol#680)\n[low/medium] calls-loop at src/Composer.sol:158: Composer.traitsOf(address,address) (src/Composer.sol#158-195) has external calls inside a loop: ICatalogRegistry(registry).hasTrait(wallet,all[i]) (src/Composer.sol#189)\n[low/medium] calls-loop at src/Registry.sol:340: Registry.specOf(uint16) (src/Registry.sol#340-348) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#347)\n[low/medium] calls-loop at src/Registry.sol:340: Registry.specOf(uint16) (src/Registry.sol#340-348) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#347)\n[low/medium] calls-loop at src/Registry.sol:412: Registry._request(address,uint16,uint256) (src/Registry.sol#412-434) has external calls inside a loop: requestId = intake.requestWithFailure(ACTION,body,IIntake.Callback(address(this),this.onResult.selector),this.onFailure.selector,address(imd),price) (src/Registry.sol#422-429)\n[low/medium] calls-loop at src/Registry.sol:340: Registry.specOf(uint16) (src/Registry.sol#340-348) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#347)\n[low/medium] calls-loop at src/Registry.sol:351: Registry.composeBody(uint16,address) (src/Registry.sol#351-358) has external calls inside a loop: composer.compose(s,claimant,address(this),traitId == 1301,address(curator)) (src/Registry.sol#357)\n[low/medium] calls-loop at src/Registry.sol:412: Registry._request(address,uint16,uint256) (src/Registry.sol#412-434) has external calls inside a loop: requestId = intake.requestWithFailure(ACTION,body,IIntake.Callback(address(this),this.onResult.selector),this.onFailure.selector,address(imd),price) (src/Registry.sol#422-429)\n[low/medium] calls-loop at src/Registry.sol:351: Registry.composeBody(uint16,address) (src/Registry.sol#351-358) has external calls inside a loop: composer.compose(s,claimant,address(this),traitId == 1301,address(curator)) (src/Registry.sol#357)\n[low/medium] calls-loop at src/Registry.sol:340: Registry.specOf(uint16) (src/Registry.sol#340-348) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#347)\n[low/medium] reentrancy-benign at src/Registry.sol:412: Reentrancy in Registry._request(address,uint16,uint256) (src/Registry.sol#412-434):\n[low/medium] timestamp at src/Registry.sol:562: Registry._mark(address,uint16,bytes32,bytes32) (src/Registry.sol#562-568) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:490: Registry._rule(uint16) (src/Registry.sol#490-504) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:507: Registry._check(Registry.Pending,OracleAttestation,bytes,uint8,uint64,uint64) (src/Registry.sol#507-535) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:475: Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes) (src/Registry.sol#475-487) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:437: Registry._clear(bytes32,Registry.Pending) (src/Registry.sol#437-444) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:450: Registry.onResult(bytes32,OracleAttestation,bytes) (src/Registry.sol#450-472) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:388: Registry.abandon(bytes32) (src/Registry.sol#388-394) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:678: Registry.claimSponsored(uint16) (src/Registry.sol#678-686) uses timestamp for comparisons","passed":true},{"durationMs":883,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/Renderer.sol:45: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/Registry.sol:180: Reentrancy: State change after external call (3 places)\n[low] costly-loop at src/Registry.sol:373: Costly operations inside loop (2 places)\n[low] internal-function-used-once at src/Composer.sol:335: Internal Function Used Only Once (4 places)\n[low] large-numeric-literal at src/Composer.sol:99: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/Composer.sol:76: Literal Instead of Constant (212 places)\n[low] require-revert-in-loop at src/Composer.sol:244: Loop Contains `require`/`revert` (8 places)\n[low] state-variable-could-be-immutable at src/Registry.sol:87: State Variable Could Be Immutable (8 places)\n[low] unchecked-return at src/Registry.sol:383: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/Composer.sol:613: Uninitialized Local Variable (3 places)\n[low] unsafe-oz-erc721-mint at src/Registry.sol:201: Unsafe `ERC721::_mint()`\n[low] unused-public-function at src/Composer.sol:307: Public Function Not Used Internally (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"edaac55fb4e496915dd0792d965b6c75452e784675364fb94bf145abd9ee4d48","verifiedTreeHash":"3394d36e52202f539e817b89a6712ee56ed69032","verifierVersion":"0.1.0+fb8278c5"}]}